Merge release 0.9.3 into master

Change-Id: I9ff693c4b3c8101557e555c266f68c91714d1742
diff --git a/README.md b/README.md
index 4a737cc..bf05c6e 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,7 @@
 ## Documentation
 
 * [master](https://ci.apache.org/projects/asterixdb/index.html) |
+  [0.9.2](http://asterixdb.apache.org/docs/0.9.2/index.html) |
   [0.9.1](http://asterixdb.apache.org/docs/0.9.1/index.html) |
   [0.9.0](http://asterixdb.apache.org/docs/0.9.0/index.html)
 
diff --git a/asterixdb/AsterixCodeFormatProfile.xml b/asterixdb/AsterixCodeFormatProfile.xml
new file mode 100644
index 0000000..4205bb6
--- /dev/null
+++ b/asterixdb/AsterixCodeFormatProfile.xml
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+
+<profiles version="12">
+<profile kind="CodeFormatterProfile" name="AsterixCodeFormatProfile" version="12">
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="48"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="9999"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="49"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+</profile>
+</profiles>
diff --git a/asterixdb/LICENSE b/asterixdb/LICENSE
index 7936803..b3ec64e 100644
--- a/asterixdb/LICENSE
+++ b/asterixdb/LICENSE
@@ -851,51 +851,4 @@
    such warranty or additional liability.
    END OF TERMS AND CONDITIONS
 ---
-   Portions of the AsterixDB Experimental Tests
-       located at:
-         asterix-experiments/src/main/resources/gantt/gantt.py
 
-   are available under a Modified BSD License:
----
-   Copyright (c) 2013, Los Alamos National Security, LLC
-   All rights reserved.
-
-   Copyright 2013. Los Alamos National Security, LLC. This software
-   was produced under U.S. Government contract DE-AC52-06NA25396 for
-   Los Alamos National Laboratory (LANL), which is operated by Los
-   Alamos National Security, LLC for the U.S. Department of Energy.
-   The U.S. Government has rights to use, reproduce, and distribute
-   this software.  NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL
-   SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
-   ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
-   to produce derivative works, such modified software should be clearly
-   marked, so as not to confuse it with the version available from LANL.
-
-
-   Additionally, redistribution and use in source and binary forms,
-   with or without modification, are permitted provided that the
-   following conditions are met:
-
-    *  Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-
-    *  Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-
-    *  Neither the name of Los Alamos National Security, LLC, Los Alamos
-       National Laboratory, LANL, the U.S. Government, nor the names of
-       its contributors may be used to endorse or promote products derived
-       from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-   ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----
diff --git a/asterixdb/asterix-active/pom.xml b/asterixdb/asterix-active/pom.xml
index f5e0abd..a6f6a38 100644
--- a/asterixdb/asterix-active/pom.xml
+++ b/asterixdb/asterix-active/pom.xml
@@ -24,6 +24,9 @@
     <version>0.9.4-SNAPSHOT</version>
   </parent>
   <artifactId>asterix-active</artifactId>
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.apache.asterix</groupId>
@@ -46,5 +49,9 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveManager.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveManager.java
index 264e9bc..f9aef4c 100644
--- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveManager.java
+++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveManager.java
@@ -29,12 +29,10 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.message.ActiveManagerMessage;
-import org.apache.asterix.active.message.ActiveStatsResponse;
 import org.apache.asterix.active.message.ActiveStatsRequestMessage;
+import org.apache.asterix.active.message.ActiveStatsResponse;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.memory.ConcurrentFramePool;
@@ -42,10 +40,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.util.JavaSerializationUtils;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ActiveManager {
 
-    private static final Logger LOGGER = Logger.getLogger(ActiveManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int SHUTDOWN_TIMEOUT_SECS = 60;
 
     private final ExecutorService executor;
@@ -56,7 +57,7 @@
     private volatile boolean shutdown;
 
     public ActiveManager(ExecutorService executor, String nodeId, long activeMemoryBudget, int frameSize,
-                         INCServiceContext serviceCtx) throws HyracksDataException {
+            INCServiceContext serviceCtx) throws HyracksDataException {
         this.executor = executor;
         this.nodeId = nodeId;
         this.activeFramePool = new ConcurrentFramePool(nodeId, activeMemoryBudget, frameSize);
@@ -102,7 +103,7 @@
                 requestStats((ActiveStatsRequestMessage) message);
                 break;
             default:
-                LOGGER.warning("Unknown message type received: " + message.getKind());
+                LOGGER.warn("Unknown message type received: " + message.getKind());
         }
     }
 
@@ -112,27 +113,26 @@
             IActiveRuntime runtime = runtimes.get(runtimeId);
             long reqId = message.getReqId();
             if (runtime == null) {
-                LOGGER.warning("Request stats of a runtime that is not registered " + runtimeId);
+                LOGGER.warn("Request stats of a runtime that is not registered " + runtimeId);
                 // Send a failure message
-                ((NodeControllerService) serviceCtx.getControllerService())
-                        .sendApplicationMessageToCC(
-                                JavaSerializationUtils
-                                        .serialize(new ActiveStatsResponse(reqId, null,
-                                                new RuntimeDataException(ErrorCode.ACTIVE_MANAGER_INVALID_RUNTIME,
-                                                        runtimeId.toString()))), null);
+                ((NodeControllerService) serviceCtx.getControllerService()).sendApplicationMessageToCC(
+                        message.getCcId(),
+                        JavaSerializationUtils.serialize(new ActiveStatsResponse(reqId, null, new RuntimeDataException(
+                                ErrorCode.ACTIVE_MANAGER_INVALID_RUNTIME, runtimeId.toString()))),
+                        null);
                 return;
             }
             String stats = runtime.getStats();
             ActiveStatsResponse response = new ActiveStatsResponse(reqId, stats, null);
-            ((NodeControllerService) serviceCtx.getControllerService())
-                    .sendApplicationMessageToCC(JavaSerializationUtils.serialize(response), null);
+            ((NodeControllerService) serviceCtx.getControllerService()).sendApplicationMessageToCC(message.getCcId(),
+                    JavaSerializationUtils.serialize(response), null);
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
     }
 
     public void shutdown() {
-        LOGGER.warning("Shutting down ActiveManager on node " + nodeId);
+        LOGGER.warn("Shutting down ActiveManager on node " + nodeId);
         Map<ActiveRuntimeId, Future<Void>> stopFutures = new HashMap<>();
         shutdown = true;
         runtimes.forEach((runtimeId, runtime) -> stopFutures.put(runtimeId, executor.submit(() -> {
@@ -144,22 +144,22 @@
             try {
                 entry.getValue().get(SHUTDOWN_TIMEOUT_SECS, TimeUnit.SECONDS);
             } catch (InterruptedException e) {
-                LOGGER.warning("Interrupted waiting to stop runtime: " + entry.getKey());
+                LOGGER.warn("Interrupted waiting to stop runtime: " + entry.getKey());
                 Thread.currentThread().interrupt();
             } catch (ExecutionException e) {
-                LOGGER.log(Level.WARNING, "Exception while stopping runtime: " + entry.getKey(), e);
+                LOGGER.log(Level.WARN, "Exception while stopping runtime: " + entry.getKey(), e);
             } catch (TimeoutException e) {
-                LOGGER.log(Level.WARNING, "Timed out waiting to stop runtime: " + entry.getKey(), e);
+                LOGGER.log(Level.WARN, "Timed out waiting to stop runtime: " + entry.getKey(), e);
             }
         });
-        LOGGER.warning("Shutdown ActiveManager on node " + nodeId + " complete");
+        LOGGER.warn("Shutdown ActiveManager on node " + nodeId + " complete");
     }
 
     private void stopRuntime(ActiveManagerMessage message) {
         ActiveRuntimeId runtimeId = (ActiveRuntimeId) message.getPayload();
         IActiveRuntime runtime = runtimes.get(runtimeId);
         if (runtime == null) {
-            LOGGER.warning("Request to stop runtime: " + runtimeId
+            LOGGER.warn("Request to stop runtime: " + runtimeId
                     + " that is not registered. Could be that the runtime completed execution on"
                     + " this node before the cluster controller sent the stop request");
         } else {
@@ -168,7 +168,7 @@
                     stopIfRunning(runtimeId, runtime);
                 } catch (Exception e) {
                     // TODO(till) Figure out a better way to handle failure to stop a runtime
-                    LOGGER.log(Level.WARNING, "Failed to stop runtime: " + runtimeId, e);
+                    LOGGER.log(Level.WARN, "Failed to stop runtime: " + runtimeId, e);
                 }
             });
         }
diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveSourceOperatorNodePushable.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveSourceOperatorNodePushable.java
index 27ecb52..1df9020 100644
--- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveSourceOperatorNodePushable.java
+++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/ActiveSourceOperatorNodePushable.java
@@ -18,9 +18,6 @@
  */
 package org.apache.asterix.active;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.asterix.active.message.ActivePartitionMessage;
 import org.apache.asterix.active.message.ActivePartitionMessage.Event;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -29,11 +26,14 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryOutputSourceOperatorNodePushable;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class ActiveSourceOperatorNodePushable extends AbstractUnaryOutputSourceOperatorNodePushable
         implements IActiveRuntime {
 
-    private static final Logger LOGGER = Logger.getLogger(ActiveSourceOperatorNodePushable.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final IHyracksTaskContext ctx;
     protected final ActiveManager activeManager;
     /** A unique identifier for the runtime **/
diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/DeployedJobService.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/DeployedJobService.java
new file mode 100644
index 0000000..bc6f1b1
--- /dev/null
+++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/DeployedJobService.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.active;
+
+import java.time.Instant;
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.common.transactions.ITxnIdFactory;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Provides functionality for running DeployedJobSpecs
+ */
+public class DeployedJobService {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    //To enable new Asterix TxnId for separate deployed job spec invocations
+    private static final byte[] TRANSACTION_ID_PARAMETER_NAME = "TxnIdParameter".getBytes();
+
+    //pool size one (only running one thread at a time)
+    private static final int POOL_SIZE = 1;
+
+    //Starts running a deployed job specification periodically with an interval of "duration" seconds
+    public static ScheduledExecutorService startRepetitiveDeployedJobSpec(DeployedJobSpecId distributedId,
+            IHyracksClientConnection hcc, long duration, Map<byte[], byte[]> jobParameters, EntityId entityId,
+            ITxnIdFactory txnIdFactory) {
+        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(POOL_SIZE);
+        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if (!runRepetitiveDeployedJobSpec(distributedId, hcc, jobParameters, duration, entityId,
+                            txnIdFactory)) {
+                        scheduledExecutorService.shutdown();
+                    }
+                } catch (Exception e) {
+                    LOGGER.log(Level.ERROR, "Job Failed to run for " + entityId.getExtensionName() + " "
+                            + entityId.getDataverse() + "." + entityId.getEntityName() + ".", e);
+                }
+            }
+        }, duration, duration, TimeUnit.MILLISECONDS);
+        return scheduledExecutorService;
+    }
+
+    public static boolean runRepetitiveDeployedJobSpec(DeployedJobSpecId distributedId, IHyracksClientConnection hcc,
+            Map<byte[], byte[]> jobParameters, long duration, EntityId entityId, ITxnIdFactory txnIdFactory)
+            throws Exception {
+        long executionMilliseconds = runDeployedJobSpec(distributedId, hcc, jobParameters, entityId, txnIdFactory);
+        if (executionMilliseconds > duration && LOGGER.isErrorEnabled()) {
+            LOGGER.log(Level.ERROR,
+                    "Periodic job for " + entityId.getExtensionName() + " " + entityId.getDataverse() + "."
+                            + entityId.getEntityName() + " was unable to meet the required period of " + duration
+                            + " milliseconds. Actually took " + executionMilliseconds + " execution will shutdown"
+                            + new Date());
+            return false;
+        }
+        return true;
+    }
+
+    public synchronized static long runDeployedJobSpec(DeployedJobSpecId distributedId, IHyracksClientConnection hcc,
+            Map<byte[], byte[]> jobParameters, EntityId entityId, ITxnIdFactory txnIdFactory) throws Exception {
+        JobId jobId;
+        long startTime = Instant.now().toEpochMilli();
+
+        //Add the Asterix Transaction Id to the map
+        jobParameters.put(TRANSACTION_ID_PARAMETER_NAME, String.valueOf(txnIdFactory.create().getId()).getBytes());
+        jobId = hcc.startJob(distributedId, jobParameters);
+
+        hcc.waitForCompletion(jobId);
+        long executionMilliseconds = Instant.now().toEpochMilli() - startTime;
+
+        LOGGER.log(Level.INFO,
+                "Deployed Job execution completed for " + entityId.getExtensionName() + " " + entityId.getDataverse()
+                        + "." + entityId.getEntityName() + ". Took " + executionMilliseconds + " milliseconds ");
+
+        return executionMilliseconds;
+
+    }
+
+    @Override
+    public String toString() {
+        return "DeployedJobSpecService";
+    }
+
+}
diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/EntityId.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/EntityId.java
index 9e20e2f..5fe26bf 100644
--- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/EntityId.java
+++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/EntityId.java
@@ -55,8 +55,8 @@
             return true;
         }
         EntityId other = (EntityId) o;
-        return Objects.equals(other.dataverse, dataverse) && Objects.equals(other.entityName, entityName) &&
-                Objects.equals(other.extensionName, extensionName);
+        return Objects.equals(other.dataverse, dataverse) && Objects.equals(other.entityName, entityName)
+                && Objects.equals(other.extensionName, extensionName);
     }
 
     @Override
diff --git a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/message/ActiveManagerMessage.java b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/message/ActiveManagerMessage.java
index bef418b..b8c44a6 100644
--- a/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/message/ActiveManagerMessage.java
+++ b/asterixdb/asterix-active/src/main/java/org/apache/asterix/active/message/ActiveManagerMessage.java
@@ -22,10 +22,11 @@
 
 import org.apache.asterix.active.ActiveManager;
 import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.messaging.CcIdentifiedMessage;
 import org.apache.asterix.common.messaging.api.INcAddressedMessage;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public class ActiveManagerMessage implements INcAddressedMessage {
+public class ActiveManagerMessage extends CcIdentifiedMessage implements INcAddressedMessage {
     public enum Kind {
         STOP_ACTIVITY,
         REQUEST_STATS
diff --git a/asterixdb/asterix-algebra/pom.xml b/asterixdb/asterix-algebra/pom.xml
index 61187e5..5a61c96 100644
--- a/asterixdb/asterix-algebra/pom.xml
+++ b/asterixdb/asterix-algebra/pom.xml
@@ -26,7 +26,7 @@
   <artifactId>asterix-algebra</artifactId>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <licenses>
@@ -238,5 +238,9 @@
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExpressionToPlanTranslator.java
index ca6710f..8e0214a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/base/ILangExpressionToPlanTranslator.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.algebra.base;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.statement.Query;
 import org.apache.asterix.translator.CompiledStatements.ICompiledDmlStatement;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -40,10 +39,9 @@
      *            the compiled dml statement (only for insert/delete).
      * @return a logical query plan for the query.
      * @throws AlgebricksException
-     * @throws AsterixException
      */
     public ILogicalPlan translate(Query query, String outputDatasetName, ICompiledDmlStatement stmt)
-            throws AlgebricksException, AsterixException;
+            throws AlgebricksException;
 
     /**
      * Translates a load statement.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IAlgebraExtensionManager.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IAlgebraExtensionManager.java
deleted file mode 100644
index d9641df..0000000
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/extension/IAlgebraExtensionManager.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.algebra.extension;
-
-public interface IAlgebraExtensionManager {
-
-}
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/BTreeSearchPOperator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/BTreeSearchPOperator.java
index 2fd9079..11b86cb 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/BTreeSearchPOperator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/BTreeSearchPOperator.java
@@ -123,8 +123,8 @@
         // By nature, LEFT_OUTER_UNNEST_MAP should generate null values for non-matching tuples.
         boolean retainMissing = op.getOperatorTag() == LogicalOperatorTag.LEFT_OUTER_UNNEST_MAP;
         Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> btreeSearch = metadataProvider.buildBtreeRuntime(
-                builder.getJobSpec(), opSchema, typeEnv, context, jobGenParams.getRetainInput(), retainMissing,
-                dataset, jobGenParams.getIndexName(), lowKeyIndexes, highKeyIndexes, jobGenParams.isLowKeyInclusive(),
+                builder.getJobSpec(), opSchema, typeEnv, context, jobGenParams.getRetainInput(), retainMissing, dataset,
+                jobGenParams.getIndexName(), lowKeyIndexes, highKeyIndexes, jobGenParams.isLowKeyInclusive(),
                 jobGenParams.isHighKeyInclusive(), propagateFilter, minFilterFieldIndexes, maxFilterFieldIndexes);
 
         builder.contributeHyracksOperator(unnestMap, btreeSearch.first);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/CommitPOperator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/CommitPOperator.java
index 2dd4c3d..f06fe45 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/CommitPOperator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/CommitPOperator.java
@@ -21,7 +21,6 @@
 
 import java.util.List;
 
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -39,17 +38,14 @@
 import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenHelper;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
-import org.apache.hyracks.api.io.FileSplit;
 
 public class CommitPOperator extends AbstractPhysicalOperator {
 
     private final List<LogicalVariable> primaryKeyLogicalVars;
-    private final JobId jobId;
     private final Dataset dataset;
     private final boolean isSink;
 
-    public CommitPOperator(JobId jobId, Dataset dataset, List<LogicalVariable> primaryKeyLogicalVars, boolean isSink) {
-        this.jobId = jobId;
+    public CommitPOperator(Dataset dataset, List<LogicalVariable> primaryKeyLogicalVars, boolean isSink) {
         this.dataset = dataset;
         this.primaryKeyLogicalVars = primaryKeyLogicalVars;
         this.isSink = isSink;
@@ -88,8 +84,7 @@
         int[] primaryKeyFields = JobGenHelper.variablesToFieldIndexes(primaryKeyLogicalVars, inputSchemas[0]);
 
         //get dataset splits
-        IPushRuntimeFactory runtime = dataset.getCommitRuntimeFactory(metadataProvider, jobId, primaryKeyFields,
-                isSink);
+        IPushRuntimeFactory runtime = dataset.getCommitRuntimeFactory(metadataProvider, primaryKeyFields, isSink);
         builder.contributeMicroOperator(op, runtime, recDesc);
         ILogicalOperator src = op.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/InvertedIndexPOperator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/InvertedIndexPOperator.java
index cd0a63c..c3cc0ae 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/InvertedIndexPOperator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/algebra/operators/physical/InvertedIndexPOperator.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.algebra.operators.physical;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.declared.DataSourceId;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -31,7 +30,6 @@
 import org.apache.asterix.optimizer.rules.am.InvertedIndexAccessMethod;
 import org.apache.asterix.optimizer.rules.am.InvertedIndexAccessMethod.SearchModifierType;
 import org.apache.asterix.optimizer.rules.am.InvertedIndexJobGenParams;
-import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
@@ -100,19 +98,15 @@
         jobGenParams.readFromFuncArgs(unnestFuncExpr.getArguments());
 
         MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-        Dataset dataset;
-        try {
-            dataset = metadataProvider.findDataset(jobGenParams.getDataverseName(), jobGenParams.getDatasetName());
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        Dataset dataset = metadataProvider.findDataset(jobGenParams.getDataverseName(), jobGenParams.getDatasetName());
         int[] keyIndexes = getKeyIndexes(jobGenParams.getKeyVarList(), inputSchemas);
 
         int[] minFilterFieldIndexes = getKeyIndexes(unnestMapOp.getMinFilterVars(), inputSchemas);
         int[] maxFilterFieldIndexes = getKeyIndexes(unnestMapOp.getMaxFilterVars(), inputSchemas);
         boolean retainNull = false;
         if (op.getOperatorTag() == LogicalOperatorTag.LEFT_OUTER_UNNEST_MAP) {
-            // By nature, LEFT_OUTER_UNNEST_MAP should generate null values for non-matching tuples.
+            // By nature, LEFT_OUTER_UNNEST_MAP should generate null values for non-matching
+            // tuples.
             retainNull = true;
         }
         // Build runtime.
@@ -135,46 +129,37 @@
             AbstractUnnestMapOperator unnestMap, IOperatorSchema opSchema, boolean retainInput, boolean retainMissing,
             String datasetName, Dataset dataset, String indexName, ATypeTag searchKeyType, int[] keyFields,
             SearchModifierType searchModifierType, IAlgebricksConstantValue similarityThreshold,
-            int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes,
-            boolean isFullTextSearchQuery) throws AlgebricksException {
-        try {
-
-            boolean propagateIndexFilter = unnestMap.propagateIndexFilter();
-            IAObject simThresh = ((AsterixConstantValue) similarityThreshold).getObject();
-            int numPrimaryKeys = dataset.getPrimaryKeys().size();
-            Index secondaryIndex = MetadataManager.INSTANCE
-                    .getIndex(metadataProvider.getMetadataTxnContext(), dataset.getDataverseName(),
-                            dataset.getDatasetName(), indexName);
-            if (secondaryIndex == null) {
-                throw new AlgebricksException(
-                        "Code generation error: no index " + indexName + " for dataset " + datasetName);
-            }
-            IVariableTypeEnvironment typeEnv = context.getTypeEnvironment(unnestMap);
-            RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> secondarySplitsAndConstraint =
-                    metadataProvider.getSplitProviderAndConstraints(dataset, indexName);
-            // TODO: Here we assume there is only one search key field.
-            int queryField = keyFields[0];
-            // Get tokenizer and search modifier factories.
-            IInvertedIndexSearchModifierFactory searchModifierFactory =
-                    InvertedIndexAccessMethod.getSearchModifierFactory(searchModifierType, simThresh, secondaryIndex);
-            IBinaryTokenizerFactory queryTokenizerFactory = InvertedIndexAccessMethod
-                    .getBinaryTokenizerFactory(searchModifierType, searchKeyType, secondaryIndex);
-            IIndexDataflowHelperFactory dataflowHelperFactory =
-                    new IndexDataflowHelperFactory(metadataProvider.getStorageComponentProvider().getStorageManager(),
-                            secondarySplitsAndConstraint.first);
-            LSMInvertedIndexSearchOperatorDescriptor invIndexSearchOp =
-                    new LSMInvertedIndexSearchOperatorDescriptor(jobSpec, outputRecDesc, queryField,
-                            dataflowHelperFactory, queryTokenizerFactory, searchModifierFactory, retainInput,
-                            retainMissing, context.getMissingWriterFactory(),
-                            dataset.getSearchCallbackFactory(metadataProvider.getStorageComponentProvider(),
-                                    secondaryIndex,
-                                    ((JobEventListenerFactory) jobSpec.getJobletEventListenerFactory()).getJobId(),
-                                    IndexOperation.SEARCH, null), minFilterFieldIndexes, maxFilterFieldIndexes,
-                            isFullTextSearchQuery, numPrimaryKeys, propagateIndexFilter);
-            return new Pair<>(invIndexSearchOp, secondarySplitsAndConstraint.second);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
+            int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes, boolean isFullTextSearchQuery)
+            throws AlgebricksException {
+        boolean propagateIndexFilter = unnestMap.propagateIndexFilter();
+        IAObject simThresh = ((AsterixConstantValue) similarityThreshold).getObject();
+        int numPrimaryKeys = dataset.getPrimaryKeys().size();
+        Index secondaryIndex = MetadataManager.INSTANCE.getIndex(metadataProvider.getMetadataTxnContext(),
+                dataset.getDataverseName(), dataset.getDatasetName(), indexName);
+        if (secondaryIndex == null) {
+            throw new AlgebricksException(
+                    "Code generation error: no index " + indexName + " for dataset " + datasetName);
         }
+        IVariableTypeEnvironment typeEnv = context.getTypeEnvironment(unnestMap);
+        RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> secondarySplitsAndConstraint =
+                metadataProvider.getSplitProviderAndConstraints(dataset, indexName);
+        // TODO: Here we assume there is only one search key field.
+        int queryField = keyFields[0];
+        // Get tokenizer and search modifier factories.
+        IInvertedIndexSearchModifierFactory searchModifierFactory =
+                InvertedIndexAccessMethod.getSearchModifierFactory(searchModifierType, simThresh, secondaryIndex);
+        IBinaryTokenizerFactory queryTokenizerFactory =
+                InvertedIndexAccessMethod.getBinaryTokenizerFactory(searchModifierType, searchKeyType, secondaryIndex);
+        IIndexDataflowHelperFactory dataflowHelperFactory = new IndexDataflowHelperFactory(
+                metadataProvider.getStorageComponentProvider().getStorageManager(), secondarySplitsAndConstraint.first);
+        LSMInvertedIndexSearchOperatorDescriptor invIndexSearchOp = new LSMInvertedIndexSearchOperatorDescriptor(
+                jobSpec, outputRecDesc, queryField, dataflowHelperFactory, queryTokenizerFactory, searchModifierFactory,
+                retainInput, retainMissing, context.getMissingWriterFactory(),
+                dataset.getSearchCallbackFactory(metadataProvider.getStorageComponentProvider(), secondaryIndex,
+                        IndexOperation.SEARCH, null),
+                minFilterFieldIndexes, maxFilterFieldIndexes, isFullTextSearchQuery, numPrimaryKeys,
+                propagateIndexFilter);
+        return new Pair<>(invIndexSearchOp, secondarySplitsAndConstraint.second);
     }
 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/IRuleSetFactory.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/IRuleSetFactory.java
index dabac3d..2300e4a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/IRuleSetFactory.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/compiler/provider/IRuleSetFactory.java
@@ -33,14 +33,12 @@
      * @throws AlgebricksException
      */
     public List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> getLogicalRewrites(
-            ICcApplicationContext appCtx)
-            throws AlgebricksException;
+            ICcApplicationContext appCtx) throws AlgebricksException;
 
     /**
      * @return the physical rewrites
      */
     public List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> getPhysicalRewrites(
-            ICcApplicationContext appCtx)
-            throws AlgebricksException;
+            ICcApplicationContext appCtx) throws AlgebricksException;
 
 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java
index 812f3c9..02d79c4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/jobgen/QueryLogicalExpressionJobGen.java
@@ -20,6 +20,8 @@
 
 import java.util.List;
 
+import org.apache.asterix.common.api.IApplicationContext;
+import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.functions.FunctionDescriptorTag;
 import org.apache.asterix.external.library.ExternalFunctionDescriptorProvider;
@@ -64,7 +66,7 @@
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
             throws AlgebricksException {
         IScalarEvaluatorFactory[] args = codegenArguments(expr, env, inputSchemas, context);
-        IFunctionDescriptor fd = resolveFunction(expr, env);
+        IFunctionDescriptor fd = resolveFunction(expr, env, context);
         switch (fd.getFunctionDescriptorTag()) {
             case SERIALAGGREGATE:
                 return null;
@@ -82,7 +84,7 @@
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
             throws AlgebricksException {
         IScalarEvaluatorFactory[] args = codegenArguments(expr, env, inputSchemas, context);
-        return resolveFunction(expr, env).createRunningAggregateEvaluatorFactory(args);
+        return resolveFunction(expr, env, context).createRunningAggregateEvaluatorFactory(args);
     }
 
     @Override
@@ -90,7 +92,7 @@
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
             throws AlgebricksException {
         IScalarEvaluatorFactory[] args = codegenArguments(expr, env, inputSchemas, context);
-        return resolveFunction(expr, env).createUnnestingEvaluatorFactory(args);
+        return resolveFunction(expr, env, context).createUnnestingEvaluatorFactory(args);
     }
 
     @Override
@@ -138,7 +140,7 @@
         IFunctionDescriptor fd = expr.getFunctionInfo() instanceof IExternalFunctionInfo
                 ? ExternalFunctionDescriptorProvider.getExternalFunctionDescriptor(
                         (IExternalFunctionInfo) expr.getFunctionInfo(), (ICcApplicationContext) context.getAppContext())
-                : resolveFunction(expr, env);
+                : resolveFunction(expr, env, context);
         return fd.createEvaluatorFactory(args);
     }
 
@@ -166,14 +168,14 @@
             AggregateFunctionCallExpression expr, IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas,
             JobGenContext context) throws AlgebricksException {
         IScalarEvaluatorFactory[] args = codegenArguments(expr, env, inputSchemas, context);
-        IFunctionDescriptor fd = resolveFunction(expr, env);
+        IFunctionDescriptor fd = resolveFunction(expr, env, context);
 
         switch (fd.getFunctionDescriptorTag()) {
             case AGGREGATE: {
                 if (BuiltinFunctions.isAggregateFunctionSerializable(fd.getIdentifier())) {
                     AggregateFunctionCallExpression serialAggExpr = BuiltinFunctions
                             .makeSerializableAggregateFunctionExpression(fd.getIdentifier(), expr.getArguments());
-                    IFunctionDescriptor afdd = resolveFunction(serialAggExpr, env);
+                    IFunctionDescriptor afdd = resolveFunction(serialAggExpr, env, context);
                     return afdd.createSerializableAggregateEvaluatorFactory(args);
                 } else {
                     throw new AlgebricksException(
@@ -192,13 +194,14 @@
         }
     }
 
-    private IFunctionDescriptor resolveFunction(ILogicalExpression expr, IVariableTypeEnvironment env)
-            throws AlgebricksException {
+    private IFunctionDescriptor resolveFunction(ILogicalExpression expr, IVariableTypeEnvironment env,
+            JobGenContext context) throws AlgebricksException {
         FunctionIdentifier fnId = ((AbstractFunctionCallExpression) expr).getFunctionIdentifier();
         IFunctionDescriptor fd = functionManager.lookupFunction(fnId);
         IFunctionTypeInferer fnTypeInfer = functionManager.lookupFunctionTypeInferer(fnId);
         if (fnTypeInfer != null) {
-            fnTypeInfer.infer(expr, fd, env);
+            CompilerProperties compilerProps = ((IApplicationContext) context.getAppContext()).getCompilerProperties();
+            fnTypeInfer.infer(expr, fd, env, compilerProps);
         }
         return fd;
     }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AnalysisUtil.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AnalysisUtil.java
index 24fe8e78..93c7d79 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AnalysisUtil.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/AnalysisUtil.java
@@ -84,14 +84,6 @@
         return fieldAccessFunctions.contains(fid);
     }
 
-    public static boolean isDataSetCall(ILogicalExpression e) {
-        if (((AbstractLogicalExpression) e).getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-            return false;
-        }
-        AbstractFunctionCallExpression fe = (AbstractFunctionCallExpression) e;
-        return BuiltinFunctions.isDatasetFunction(fe.getFunctionIdentifier());
-    }
-
     public static boolean isRunnableAccessToFieldRecord(ILogicalExpression expr) {
         if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
             AbstractFunctionCallExpression fc = (AbstractFunctionCallExpression) expr;
@@ -118,8 +110,7 @@
         if (expr.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
             AbstractFunctionCallExpression fc = (AbstractFunctionCallExpression) expr;
             FunctionIdentifier fid = fc.getFunctionIdentifier();
-            if (fid.equals(BuiltinFunctions.FIELD_ACCESS_BY_INDEX)
-                    || fid.equals(BuiltinFunctions.FIELD_ACCESS_BY_NAME)
+            if (fid.equals(BuiltinFunctions.FIELD_ACCESS_BY_INDEX) || fid.equals(BuiltinFunctions.FIELD_ACCESS_BY_NAME)
                     || fid.equals(BuiltinFunctions.FIELD_ACCESS_NESTED)) {
                 return true;
             }
@@ -129,17 +120,17 @@
 
     public static Pair<String, String> getDatasetInfo(AbstractDataSourceOperator op) throws AlgebricksException {
         DataSourceId srcId = (DataSourceId) op.getDataSource().getId();
-        return new Pair<String, String>(srcId.getDataverseName(), srcId.getDatasourceName());
+        return new Pair<>(srcId.getDataverseName(), srcId.getDatasourceName());
     }
 
     public static Pair<String, String> getExternalDatasetInfo(UnnestMapOperator op) throws AlgebricksException {
         AbstractFunctionCallExpression unnestExpr = (AbstractFunctionCallExpression) op.getExpressionRef().getValue();
         String dataverseName = AccessMethodUtils.getStringConstant(unnestExpr.getArguments().get(0));
         String datasetName = AccessMethodUtils.getStringConstant(unnestExpr.getArguments().get(1));
-        return new Pair<String, String>(dataverseName, datasetName);
+        return new Pair<>(dataverseName, datasetName);
     }
 
-    private static List<FunctionIdentifier> fieldAccessFunctions = new ArrayList<FunctionIdentifier>();
+    private static List<FunctionIdentifier> fieldAccessFunctions = new ArrayList<>();
 
     static {
         fieldAccessFunctions.add(BuiltinFunctions.GET_DATA);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
index a8d9ec0..bd67ed4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/base/RuleCollections.java
@@ -70,7 +70,6 @@
 import org.apache.asterix.optimizer.rules.RemoveRedundantSelectRule;
 import org.apache.asterix.optimizer.rules.RemoveSortInFeedIngestionRule;
 import org.apache.asterix.optimizer.rules.RemoveUnusedOneToOneEquiJoinRule;
-import org.apache.asterix.optimizer.rules.ResolveVariableRule;
 import org.apache.asterix.optimizer.rules.SetAsterixPhysicalOperatorsRule;
 import org.apache.asterix.optimizer.rules.SetClosedRecordConstructorsRule;
 import org.apache.asterix.optimizer.rules.SetupCommitExtensionOpRule;
@@ -79,6 +78,7 @@
 import org.apache.asterix.optimizer.rules.UnnestToDataScanRule;
 import org.apache.asterix.optimizer.rules.am.IntroduceJoinAccessMethodRule;
 import org.apache.asterix.optimizer.rules.am.IntroduceLSMComponentFilterRule;
+import org.apache.asterix.optimizer.rules.am.IntroducePrimaryIndexForAggregationRule;
 import org.apache.asterix.optimizer.rules.am.IntroduceSelectAccessMethodRule;
 import org.apache.asterix.optimizer.rules.subplan.AsterixMoveFreeVariableOperatorOutOfSubplanRule;
 import org.apache.asterix.optimizer.rules.subplan.InlineSubplanInputForNestedTupleSourceRule;
@@ -165,7 +165,6 @@
 
     public static final List<IAlgebraicRewriteRule> buildNormalizationRuleCollection(ICcApplicationContext appCtx) {
         List<IAlgebraicRewriteRule> normalization = new LinkedList<>();
-        normalization.add(new ResolveVariableRule());
         normalization.add(new CheckInsertUpsertReturningRule());
         normalization.add(new IntroduceUnnestForCollectionToSequenceRule());
         normalization.add(new EliminateSubplanRule());
@@ -284,6 +283,7 @@
         accessMethod.add(new IntroduceSelectAccessMethodRule());
         accessMethod.add(new IntroduceJoinAccessMethodRule());
         accessMethod.add(new IntroduceLSMComponentFilterRule());
+        accessMethod.add(new IntroducePrimaryIndexForAggregationRule());
         accessMethod.add(new IntroduceSecondaryIndexInsertDeleteRule());
         accessMethod.add(new RemoveUnusedOneToOneEquiJoinRule());
         accessMethod.add(new PushSimilarityFunctionsBelowJoin());
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/AsterixIntroduceGroupByCombinerRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/AsterixIntroduceGroupByCombinerRule.java
index ca54904..5a70d3c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/AsterixIntroduceGroupByCombinerRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/AsterixIntroduceGroupByCombinerRule.java
@@ -47,14 +47,14 @@
         SelectOperator selectNonSystemNull;
 
         if (aggregateVarsProducedByCombiner.size() == 1) {
-            ILogicalExpression isSystemNullTest = new ScalarFunctionCallExpression(finfoEq,
-                    new MutableObject<ILogicalExpression>(new VariableReferenceExpression(
-                            aggregateVarsProducedByCombiner.get(0))));
+            ILogicalExpression isSystemNullTest =
+                    new ScalarFunctionCallExpression(finfoEq, new MutableObject<ILogicalExpression>(
+                            new VariableReferenceExpression(aggregateVarsProducedByCombiner.get(0))));
             IFunctionInfo finfoNot = context.getMetadataProvider().lookupFunction(AlgebricksBuiltinFunctions.NOT);
-            ScalarFunctionCallExpression nonSystemNullTest = new ScalarFunctionCallExpression(finfoNot,
-                    new MutableObject<ILogicalExpression>(isSystemNullTest));
-            selectNonSystemNull = new SelectOperator(new MutableObject<ILogicalExpression>(nonSystemNullTest), false,
-                    null);
+            ScalarFunctionCallExpression nonSystemNullTest =
+                    new ScalarFunctionCallExpression(finfoNot, new MutableObject<ILogicalExpression>(isSystemNullTest));
+            selectNonSystemNull =
+                    new SelectOperator(new MutableObject<ILogicalExpression>(nonSystemNullTest), false, null);
         } else {
             List<Mutable<ILogicalExpression>> isSystemNullTestList = new ArrayList<Mutable<ILogicalExpression>>();
             for (LogicalVariable aggVar : aggregateVarsProducedByCombiner) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByHandleFieldAccessRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByHandleFieldAccessRule.java
index 957e164..5cf6769 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByHandleFieldAccessRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByHandleFieldAccessRule.java
@@ -62,8 +62,8 @@
 
     private static void byNameToByHandle(AssignOperator fieldAccessOp, IOptimizationContext context) {
         Mutable<ILogicalOperator> opUnder = fieldAccessOp.getInputs().get(0);
-        AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) fieldAccessOp.getExpressions().get(0)
-                .getValue();
+        AbstractFunctionCallExpression fce =
+                (AbstractFunctionCallExpression) fieldAccessOp.getExpressions().get(0).getValue();
         ILogicalExpression a1 = fce.getArguments().get(0).getValue();
 
         VariableReferenceExpression x;
@@ -84,16 +84,16 @@
         // let $t := type-of(x)
         LogicalVariable t = context.newVar();
 
-        AbstractFunctionCallExpression typeOf = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.TYPE_OF));
+        AbstractFunctionCallExpression typeOf =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.TYPE_OF));
         typeOf.getArguments().add(new MutableObject<ILogicalExpression>(x));
         AssignOperator typAssign = new AssignOperator(t, new MutableObject<ILogicalExpression>(typeOf));
         typAssign.getInputs().add(opUnder);
 
         // let $w := get-handle($t, path-expression)
         LogicalVariable w = context.newVar();
-        AbstractFunctionCallExpression getHandle = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.GET_HANDLE));
+        AbstractFunctionCallExpression getHandle =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.GET_HANDLE));
         getHandle.getArguments().add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(t)));
         // the accessed field
         getHandle.getArguments().add(new MutableObject<ILogicalExpression>(fce.getArguments().get(1).getValue()));
@@ -101,8 +101,8 @@
         handleAssign.getInputs().add(new MutableObject<ILogicalOperator>(typAssign));
 
         // let $y := get-data(x, $w)
-        AbstractFunctionCallExpression getData = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.GET_DATA));
+        AbstractFunctionCallExpression getData =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.GET_DATA));
         VariableReferenceExpression ref2 = new VariableReferenceExpression(x.getVariableReference());
         getData.getArguments().add(new MutableObject<ILogicalExpression>(ref2));
         getData.getArguments().add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(w)));
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
index b3b0ad7..19cd4b6 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ByNameToByIndexFieldAccessRule.java
@@ -87,7 +87,7 @@
             return changed;
         }
         changed |= extractFirstArg(fce, op, context);
-        IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op);
+        IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op.getInputs().get(0).getValue());
         IAType t = (IAType) env.getType(fce.getArguments().get(0).getValue());
         changed |= rewriteFieldAccess(exprRef, fce, getActualType(t));
         return changed;
@@ -148,8 +148,8 @@
         if (k < 0) {
             return null;
         }
-        return new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX), fce.getArguments().get(0),
+        return new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX),
+                fce.getArguments().get(0),
                 new MutableObject<>(new ConstantExpression(new AsterixConstantValue(new AInt32(k)))));
     }
 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CancelUnnestWithNestedListifyRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CancelUnnestWithNestedListifyRule.java
index cf926d1..6cc87ad 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CancelUnnestWithNestedListifyRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CancelUnnestWithNestedListifyRule.java
@@ -186,8 +186,8 @@
             return false;
         }
 
-        AbstractLogicalOperator nestedPlanRoot = (AbstractLogicalOperator) gby.getNestedPlans().get(0).getRoots().get(0)
-                .getValue();
+        AbstractLogicalOperator nestedPlanRoot =
+                (AbstractLogicalOperator) gby.getNestedPlans().get(0).getRoots().get(0).getValue();
         if (nestedPlanRoot.getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
             return false;
         }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CountVarToCountOneRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CountVarToCountOneRule.java
index 9c90b7c..46c441a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CountVarToCountOneRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/CountVarToCountOneRule.java
@@ -40,7 +40,8 @@
 public class CountVarToCountOneRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -80,7 +81,8 @@
         if (exp3.getExpressionTag() != LogicalExpressionTag.VARIABLE) {
             return false;
         }
-        if (((AbstractLogicalOperator) agg.getInputs().get(0).getValue()).getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
+        if (((AbstractLogicalOperator) agg.getInputs().get(0).getValue())
+                .getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
             return false;
         }
         fun.getArguments().get(0).setValue(new ConstantExpression(new AsterixConstantValue(new AInt64(1L))));
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/DisjunctivePredicateToJoinRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/DisjunctivePredicateToJoinRule.java
index 7b84e98..85ee0ef 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/DisjunctivePredicateToJoinRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/DisjunctivePredicateToJoinRule.java
@@ -127,8 +127,7 @@
 
         ILogicalExpression cExp = new ConstantExpression(new AsterixConstantValue(list));
         Mutable<ILogicalExpression> mutCExp = new MutableObject<>(cExp);
-        IFunctionInfo scanFctInfo = BuiltinFunctions
-                .getAsterixFunctionInfo(BuiltinFunctions.SCAN_COLLECTION);
+        IFunctionInfo scanFctInfo = BuiltinFunctions.getAsterixFunctionInfo(BuiltinFunctions.SCAN_COLLECTION);
         UnnestingFunctionCallExpression scanExp = new UnnestingFunctionCallExpression(scanFctInfo, mutCExp);
         LogicalVariable scanVar = context.newVar();
         UnnestOperator unn = new UnnestOperator(scanVar, new MutableObject<>(scanExp));
@@ -186,9 +185,10 @@
         return asSelectOperator(op.getValue());
     }
 
-    private static AbstractFunctionCallExpression asFunctionCallExpression(ILogicalExpression ex, FunctionIdentifier fi) {
-        AbstractFunctionCallExpression fctCall = (ex.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL ? (AbstractFunctionCallExpression) ex
-                : null);
+    private static AbstractFunctionCallExpression asFunctionCallExpression(ILogicalExpression ex,
+            FunctionIdentifier fi) {
+        AbstractFunctionCallExpression fctCall = (ex.getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL
+                ? (AbstractFunctionCallExpression) ex : null);
         if (fctCall != null && (fi == null || fctCall.getFunctionIdentifier().equals(fi)))
             return fctCall;
         return null;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FeedScanCollectionToUnnest.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FeedScanCollectionToUnnest.java
index 6c97858..fef2323 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FeedScanCollectionToUnnest.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FeedScanCollectionToUnnest.java
@@ -63,9 +63,9 @@
         UnnestOperator unnest = (UnnestOperator) op;
         ILogicalExpression unnestExpr = unnest.getExpressionRef().getValue();
         if (needsScanCollection(unnestExpr, op)) {
-            ILogicalExpression newExpr = new UnnestingFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION),
-                    new MutableObject<ILogicalExpression>(unnestExpr));
+            ILogicalExpression newExpr =
+                    new UnnestingFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION),
+                            new MutableObject<ILogicalExpression>(unnestExpr));
             unnest.getExpressionRef().setValue(newExpr);
             context.addToDontApplySet(this, op);
             return true;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FixReplicateOperatorOutputsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FixReplicateOperatorOutputsRule.java
index d9e58f3..c594ff8 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FixReplicateOperatorOutputsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FixReplicateOperatorOutputsRule.java
@@ -96,10 +96,10 @@
 
         // when done with the whole plan, check that all replicate operators have been fixed
         // if there is one that has not been completely fixed, it indicates that one "old" parent couldn't be found
-        if (op.getOperatorTag() == LogicalOperatorTag.DISTRIBUTE_RESULT ||
-                op.getOperatorTag() == LogicalOperatorTag.SINK ||
-                (op.getOperatorTag() == LogicalOperatorTag.DELEGATE_OPERATOR &&
-                        ((DelegateOperator) op).getDelegate() instanceof CommitOperator)) {
+        if (op.getOperatorTag() == LogicalOperatorTag.DISTRIBUTE_RESULT
+                || op.getOperatorTag() == LogicalOperatorTag.SINK
+                || (op.getOperatorTag() == LogicalOperatorTag.DELEGATE_OPERATOR
+                        && ((DelegateOperator) op).getDelegate() instanceof CommitOperator)) {
             for (Map.Entry<AbstractReplicateOperator, MutableInt> entry : replicateOperators.entrySet()) {
                 if (entry.getKey().getOutputs().size() != entry.getValue().getValue()) {
                     throw new AlgebricksException(ErrorCode.ASTERIX, ErrorCode.COMPILATION_FAILED_DUE_TO_REPLICATE_OP);
@@ -109,8 +109,8 @@
         }
 
         // rewrite/fix only replicate operators
-        if ((op.getOperatorTag() != LogicalOperatorTag.REPLICATE && op.getOperatorTag() != LogicalOperatorTag.SPLIT) ||
-                context.checkIfInDontApplySet(this, opRef.getValue())) {
+        if ((op.getOperatorTag() != LogicalOperatorTag.REPLICATE && op.getOperatorTag() != LogicalOperatorTag.SPLIT)
+                || context.checkIfInDontApplySet(this, opRef.getValue())) {
             return false;
         }
         AbstractReplicateOperator replicateOperator = (AbstractReplicateOperator) op;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckRule.java
index 42cea34..a93b732 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FullTextContainsParameterCheckRule.java
@@ -19,9 +19,10 @@
 package org.apache.asterix.optimizer.rules;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.BuiltinFunctions;
@@ -36,12 +37,12 @@
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractLogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractBinaryJoinOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
 import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
+import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionReferenceTransform;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
 /**
@@ -49,38 +50,16 @@
  */
 public class FullTextContainsParameterCheckRule implements IAlgebraicRewriteRule {
 
-    // parameter name and its value
-    HashMap<MutableObject<ILogicalExpression>, MutableObject<ILogicalExpression>> paramValueMap;
-
-    // the last expression position before the option argument in the arguments array
-    private static final int LAST_EXPRESSION_POS_BEFORE_OPTION = 1;
-    // The number of anticipated arguments for a full-text query when a user doesn't provide any option.
-    private static final int FULLTEXT_QUERY_WITHOUT_OPTION_NO_OF_ARGUMENTS = 2;
-    // The number of anticipated arguments for a full-text query when a user provide option(s) as a record.
-    private static final int FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS = 3;
+    // Visitor for checking and transforming ftcontains() expression
+    protected FullTextContainsExpressionVisitor ftcontainsExprVisitor = new FullTextContainsExpressionVisitor();
 
     @Override
-    public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
             throws AlgebricksException {
-        AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
-        Mutable<ILogicalExpression> exprRef;
-        switch (op.getOperatorTag()) {
-            case SELECT:
-                exprRef = ((SelectOperator) op).getCondition();
-                break;
-            case INNERJOIN:
-            case LEFTOUTERJOIN:
-                exprRef = ((AbstractBinaryJoinOperator) op).getCondition();
-                break;
-            default:
-                return false;
-        }
-
-        if (context.checkIfInDontApplySet(this, op)) {
+        if (context.checkIfInDontApplySet(this, opRef.getValue())) {
             return false;
         }
-
-        if (checkParamter(op, exprRef, context)) {
+        if (checkParameter(opRef, context)) {
             OperatorPropertiesUtil.typeOpRec(opRef, context);
             return true;
         }
@@ -91,199 +70,233 @@
      * Check the correctness of the parameters of the ftcontains(). Also rearrange options as arguments.
      * The expected form of ftcontains() is ftcontains(expression1, expression2, parameters as a record).
      */
-    private boolean checkParamter(ILogicalOperator op, Mutable<ILogicalExpression> exprRef,
-            IOptimizationContext context) throws AlgebricksException {
-        ILogicalExpression expr = exprRef.getValue();
+    private boolean checkParameter(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
+        AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
+        boolean modified = op.acceptExpressionTransform(ftcontainsExprVisitor);
+        if (modified) {
+            context.addToDontApplySet(this, op);
+        }
+        return modified;
+    }
 
-        if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
+    /**
+     * This visitor class handles actual checking and transformation.
+     */
+    protected class FullTextContainsExpressionVisitor implements ILogicalExpressionReferenceTransform {
+
+        // the last expression position before the option argument in the arguments array
+        private static final int LAST_EXPRESSION_POS_BEFORE_OPTION = 1;
+        // The number of anticipated arguments for a full-text query when a user doesn't provide any option.
+        private static final int FULLTEXT_QUERY_WITHOUT_OPTION_NO_OF_ARGUMENTS = 2;
+        // The number of anticipated arguments for a full-text query when a user provide option(s) as a record.
+        private static final int FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS = 3;
+
+        public FullTextContainsExpressionVisitor() {
+            // no parameter is needed.
+        }
+
+        @Override
+        public boolean transform(Mutable<ILogicalExpression> exprRef) throws AlgebricksException {
+            ILogicalExpression e = exprRef.getValue();
+            switch (((AbstractLogicalExpression) e).getExpressionTag()) {
+                case FUNCTION_CALL:
+                    return transformFunctionCallExpression((AbstractFunctionCallExpression) e);
+                default:
+                    return false;
+            }
+        }
+
+        private boolean transformFunctionCallExpression(AbstractFunctionCallExpression fce) throws AlgebricksException {
+            boolean modified = false;
+            FunctionIdentifier fi = fce.getFunctionIdentifier();
+            if (fi != BuiltinFunctions.FULLTEXT_CONTAINS && fi != BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION) {
+                for (Mutable<ILogicalExpression> arg : fce.getArguments()) {
+                    if (transform(arg)) {
+                        modified = true;
+                    }
+                }
+            } else {
+                modified = checkParameterForFuncExpr(fce, fi);
+            }
+
+            return modified;
+        }
+
+        private boolean checkParameterForFuncExpr(AbstractFunctionCallExpression funcExpr, FunctionIdentifier fi)
+                throws AlgebricksException {
+            // Collects the correct number of arguments - it can be 2 if a user doesn't provide any option.
+            int numberOfCorrectArguments = 0;
+            String functionName = "";
+            if (fi == BuiltinFunctions.FULLTEXT_CONTAINS) {
+                numberOfCorrectArguments = FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS;
+                functionName = BuiltinFunctions.FULLTEXT_CONTAINS.getName();
+            } else if (fi == BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION) {
+                numberOfCorrectArguments = FULLTEXT_QUERY_WITHOUT_OPTION_NO_OF_ARGUMENTS;
+                functionName = BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION.getName();
+            }
+
+            // If numberOfCorrectArguments is greater than zero, then this is a full-text search query.
+            if (numberOfCorrectArguments > 0) {
+
+                List<Mutable<ILogicalExpression>> oldExprs = funcExpr.getArguments();
+                List<Mutable<ILogicalExpression>> newExprs = new ArrayList<>();
+
+                // The number of parameters should be three: exp1, exp2, and the option
+                if (oldExprs.size() != numberOfCorrectArguments) {
+                    throw CompilationException.create(ErrorCode.COMPILATION_INVALID_PARAMETER_NUMBER, fi,
+                            oldExprs.size());
+                }
+
+                // The last expression before the option needs to be copied first.
+                for (int i = 0; i <= LAST_EXPRESSION_POS_BEFORE_OPTION; i++) {
+                    newExprs.add(new MutableObject<ILogicalExpression>(oldExprs.get(i).getValue()));
+                }
+
+                // Sanity check for the types of the first two parameters
+                checkFirstAndSecondParamter(oldExprs, functionName);
+
+                // Checks and transforms the actual full-text parameters.
+                if (numberOfCorrectArguments == FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS) {
+                    checkValueForThirdParameter(oldExprs.get(2), newExprs, functionName);
+                } else {
+                    // no option provided case: sets the default option here.
+                    setDefaultValueForThirdParameter(newExprs);
+                }
+
+                // Resets the last argument.
+                funcExpr.getArguments().clear();
+                funcExpr.getArguments().addAll(newExprs);
+
+                return true;
+            }
+
             return false;
         }
 
-        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-        FunctionIdentifier fi = funcExpr.getFunctionIdentifier();
-
-        // Collects the correct number of arguments - it can be 2 if a user doesn't provide any option.
-        int numberOfCorrectArguments = 0;
-        String functionName = "";
-        if (fi == BuiltinFunctions.FULLTEXT_CONTAINS) {
-            numberOfCorrectArguments = FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS;
-            functionName = BuiltinFunctions.FULLTEXT_CONTAINS.getName();
-        } else if (fi == BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION) {
-            numberOfCorrectArguments = FULLTEXT_QUERY_WITHOUT_OPTION_NO_OF_ARGUMENTS;
-            functionName = BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION.getName();
-        }
-
-        // If numberOfCorrectArguments is greater than zero, then this is a full-text search query.
-        if (numberOfCorrectArguments > 0) {
-            // Don't need to check this operator again.
-            context.addToDontApplySet(this, op);
-
-            List<Mutable<ILogicalExpression>> oldExprs = funcExpr.getArguments();
-            List<Mutable<ILogicalExpression>> newExprs = new ArrayList<>();
-
-            // The number of parameters should be three: exp1, exp2, and the option
-            if (oldExprs.size() != numberOfCorrectArguments) {
-                throw new AlgebricksException(
-                        functionName + " should have " + numberOfCorrectArguments + " parameters.");
+        /**
+         * Checks the correctness of the first and second argument. If the argument is a constant, we can check
+         * it now. If the argument is not a constant, we will defer the checking until run-time.
+         */
+        private void checkFirstAndSecondParamter(List<Mutable<ILogicalExpression>> exprs, String functionName)
+                throws AlgebricksException {
+            // Check the first parameter - Expression1. If it's a constant, then we can check the type here.
+            ILogicalExpression firstExpr = exprs.get(0).getValue();
+            if (firstExpr.getExpressionTag() == LogicalExpressionTag.CONSTANT
+                    && ConstantExpressionUtil.getConstantIaObjectType(firstExpr) != ATypeTag.STRING) {
+                throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName,
+                        ConstantExpressionUtil.getConstantIaObjectType(firstExpr));
             }
 
-            // The last expression before the option needs to be copied first.
-            for (int i = 0; i <= LAST_EXPRESSION_POS_BEFORE_OPTION; i++) {
-                newExprs.add(new MutableObject<ILogicalExpression>((ILogicalExpression) oldExprs.get(i).getValue()));
-            }
-
-            // Sanity check for the types of the first two parameters
-            checkFirstAndSecondParamter(oldExprs, functionName);
-
-            // Checks and transforms the actual full-text parameters.
-            if (numberOfCorrectArguments == FULLTEXT_QUERY_WITH_OPTION_NO_OF_ARGUMENTS) {
-                checkValueForThirdParameter(oldExprs.get(2), newExprs);
-            } else {
-                // no option provided case: sets the default option here.
-                setDefaultValueForThirdParameter(newExprs);
-            }
-
-            // Resets the last argument.
-            funcExpr.getArguments().clear();
-            funcExpr.getArguments().addAll(newExprs);
-
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks the correctness of the first and second argument. If the argument is a constant, we can check
-     * it now. If the argument is not a constant, we will defer the checking until run-time.
-     */
-    void checkFirstAndSecondParamter(List<Mutable<ILogicalExpression>> exprs, String functionName)
-            throws AlgebricksException {
-        // Check the first parameter - Expression1. If it's a constant, then we can check the type here.
-        ILogicalExpression firstExpr = exprs.get(0).getValue();
-        if (firstExpr.getExpressionTag() == LogicalExpressionTag.CONSTANT
-                && ConstantExpressionUtil.getConstantIaObjectType(firstExpr) != ATypeTag.STRING) {
-            throw new AlgebricksException("The first expression of " + functionName + " should be a string.");
-        }
-
-        // Check the second parameter - Expression2. If it's a constant, then we can check the type here.
-        ILogicalExpression secondExpr = exprs.get(1).getValue();
-        if (secondExpr.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-            ATypeTag exprTypeTag = ConstantExpressionUtil.getConstantIaObjectType(secondExpr);
-            switch (exprTypeTag) {
-                case STRING:
-                case MULTISET:
-                case ARRAY:
-                    break;
-                default:
-                    throw new AlgebricksException("The second expression of " + functionName
-                            + "should be a string, an unordered list, or an ordered list.");
-            }
-        }
-    }
-
-    /**
-     * Checks the option of the given ftcontains() function. Also, sets default value.
-     *
-     * @param expr
-     * @throws AlgebricksException
-     */
-    void checkValueForThirdParameter(Mutable<ILogicalExpression> expr,
-            List<Mutable<ILogicalExpression>> newArgs) throws AlgebricksException {
-        // Get the last parameter - this should be a record-constructor.
-        AbstractFunctionCallExpression openRecConsExpr = (AbstractFunctionCallExpression) expr.getValue();
-        FunctionIdentifier openRecConsFi = openRecConsExpr.getFunctionIdentifier();
-        if (openRecConsFi != BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR
-                && openRecConsFi != BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR) {
-            throw new AlgebricksException("ftcontains() option should be the form of a record { }.");
-        }
-
-        // We multiply 2 because the layout of the arguments are: [expr, val, expr1, val1, ...]
-        if (openRecConsExpr.getArguments().size() > FullTextContainsDescriptor.getParamTypeMap().size() * 2) {
-            throw new AlgebricksException("Too many options were specified.");
-        }
-
-        for (int i = 0; i < openRecConsExpr.getArguments().size(); i = i + 2) {
-            ILogicalExpression optionExpr = openRecConsExpr.getArguments().get(i).getValue();
-            ILogicalExpression optionExprVal = openRecConsExpr.getArguments().get(i + 1).getValue();
-
-            if (optionExpr.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
-                throw new AlgebricksException(
-                        "Options must be in the form of constant strings. Check that the option at " + (i % 2 + 1)
-                                + " is indeed a constant string");
-            }
-
-            String option = ConstantExpressionUtil.getStringArgument(openRecConsExpr, i).toLowerCase();
-            if (!FullTextContainsDescriptor.getParamTypeMap().containsKey(option)) {
-                throw new AlgebricksException(
-                        "The given option " + option + " is not a valid argument to ftcontains()");
-            }
-
-            boolean typeError = false;
-            String optionTypeStringVal = null;
-
-            // If the option value is a constant, then we can check here.
-            if (optionExprVal.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-                switch (FullTextContainsDescriptor.getParamTypeMap().get(option)) {
+            // Check the second parameter - Expression2. If it's a constant, then we can check the type here.
+            ILogicalExpression secondExpr = exprs.get(1).getValue();
+            if (secondExpr.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
+                ATypeTag exprTypeTag = ConstantExpressionUtil.getConstantIaObjectType(secondExpr);
+                switch (exprTypeTag) {
                     case STRING:
-                        optionTypeStringVal = ConstantExpressionUtil.getStringArgument(openRecConsExpr, i + 1)
-                                .toLowerCase();
-                        if (optionTypeStringVal == null) {
-                            typeError = true;
-                        }
+                    case MULTISET:
+                    case ARRAY:
                         break;
                     default:
-                        // Currently, we only have a string parameter. So, the flow doesn't reach here.
-                        typeError = true;
-                        break;
+                        throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, exprTypeTag);
                 }
             }
+        }
 
-            if (typeError) {
-                throw new AlgebricksException(
-                        "The given value for option " + option + " was not of the expected type");
+        /**
+         * Checks the option of the given ftcontains() function. Also, sets default value.
+         *
+         * @param expr
+         * @throws AlgebricksException
+         */
+        private void checkValueForThirdParameter(Mutable<ILogicalExpression> expr,
+                List<Mutable<ILogicalExpression>> newArgs, String functionName) throws AlgebricksException {
+            // Get the last parameter - this should be a record-constructor.
+            AbstractFunctionCallExpression openRecConsExpr = (AbstractFunctionCallExpression) expr.getValue();
+            FunctionIdentifier openRecConsFi = openRecConsExpr.getFunctionIdentifier();
+            if (openRecConsFi != BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR
+                    && openRecConsFi != BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR) {
+                throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, openRecConsFi);
             }
 
-            // Check the validity of option value
-            switch (option) {
-                case FullTextContainsDescriptor.SEARCH_MODE_OPTION:
-                    checkSearchModeOption(optionTypeStringVal);
-                    break;
-                default:
-                    break;
+            // We multiply 2 because the layout of the arguments are: [expr, val, expr1, val1, ...]
+            if (openRecConsExpr.getArguments().size() > FullTextContainsDescriptor.getParamTypeMap().size() * 2) {
+                throw CompilationException.create(ErrorCode.TOO_MANY_OPTIONS_FOR_FUNCTION, functionName);
             }
 
+            for (int i = 0; i < openRecConsExpr.getArguments().size(); i = i + 2) {
+                ILogicalExpression optionExpr = openRecConsExpr.getArguments().get(i).getValue();
+                ILogicalExpression optionExprVal = openRecConsExpr.getArguments().get(i + 1).getValue();
+
+                String option = ConstantExpressionUtil.getStringConstant(optionExpr);
+
+                if (optionExpr.getExpressionTag() != LogicalExpressionTag.CONSTANT || option == null) {
+                    throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName,
+                            optionExpr.getExpressionTag());
+                }
+
+                option = option.toLowerCase();
+                if (!FullTextContainsDescriptor.getParamTypeMap().containsKey(option)) {
+                    throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, option);
+                }
+
+                String optionTypeStringVal = null;
+
+                // If the option value is a constant, then we can check here.
+                if (optionExprVal.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
+                    switch (FullTextContainsDescriptor.getParamTypeMap().get(option)) {
+                        case STRING:
+                            optionTypeStringVal = ConstantExpressionUtil.getStringConstant(optionExprVal);
+                            if (optionTypeStringVal == null) {
+                                throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, option);
+                            }
+                            optionTypeStringVal = optionTypeStringVal.toLowerCase();
+                            break;
+                        default:
+                            // Currently, we only have a string parameter. So, the flow doesn't reach here.
+                            throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, option);
+                    }
+
+                    // Check the validity of option value
+                    switch (option) {
+                        case FullTextContainsDescriptor.SEARCH_MODE_OPTION:
+                            checkSearchModeOption(optionTypeStringVal, functionName);
+                            break;
+                        default:
+                            throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, option);
+                    }
+                }
+
+                // Add this option as arguments to the ftcontains().
+                newArgs.add(new MutableObject<ILogicalExpression>(optionExpr));
+                newArgs.add(new MutableObject<ILogicalExpression>(optionExprVal));
+            }
+        }
+
+        private void checkSearchModeOption(String optionVal, String functionName) throws AlgebricksException {
+            if (optionVal.equals(FullTextContainsDescriptor.CONJUNCTIVE_SEARCH_MODE_OPTION)
+                    || optionVal.equals(FullTextContainsDescriptor.DISJUNCTIVE_SEARCH_MODE_OPTION)) {
+                return;
+            } else {
+                throw CompilationException.create(ErrorCode.TYPE_UNSUPPORTED, functionName, optionVal);
+            }
+        }
+
+        /**
+         * Sets the default option value(s) when a user doesn't provide any option.
+         */
+        void setDefaultValueForThirdParameter(List<Mutable<ILogicalExpression>> newArgs) throws AlgebricksException {
+            // Sets the search mode option: the default option is conjunctive search.
+            ILogicalExpression searchModeOptionExpr = new ConstantExpression(
+                    new AsterixConstantValue(new AString(FullTextContainsDescriptor.SEARCH_MODE_OPTION)));
+            ILogicalExpression searchModeValExpr = new ConstantExpression(
+                    new AsterixConstantValue(new AString(FullTextContainsDescriptor.CONJUNCTIVE_SEARCH_MODE_OPTION)));
+
             // Add this option as arguments to the ftcontains().
-            newArgs.add(new MutableObject<ILogicalExpression>(optionExpr));
-            newArgs.add(new MutableObject<ILogicalExpression>(optionExprVal));
+            newArgs.add(new MutableObject<ILogicalExpression>(searchModeOptionExpr));
+            newArgs.add(new MutableObject<ILogicalExpression>(searchModeValExpr));
         }
-    }
 
-    void checkSearchModeOption(String optionVal) throws AlgebricksException {
-        if (optionVal.equals(FullTextContainsDescriptor.CONJUNCTIVE_SEARCH_MODE_OPTION)
-                || optionVal.equals(FullTextContainsDescriptor.DISJUNCTIVE_SEARCH_MODE_OPTION)) {
-            return;
-        } else {
-            throw new AlgebricksException("The given value for the search mode (" + optionVal
-                    + ") is not valid. Valid modes are " + FullTextContainsDescriptor.CONJUNCTIVE_SEARCH_MODE_OPTION
-                    + " or " + FullTextContainsDescriptor.DISJUNCTIVE_SEARCH_MODE_OPTION + ".");
-        }
-    }
-
-    /**
-     * Sets the default option value(s) when a user doesn't provide any option.
-     */
-    void setDefaultValueForThirdParameter(List<Mutable<ILogicalExpression>> newArgs)
-            throws AlgebricksException {
-        // Sets the search mode option: the default option is conjunctive search.
-        ILogicalExpression searchModeOptionExpr = new ConstantExpression(
-                new AsterixConstantValue(new AString(FullTextContainsDescriptor.SEARCH_MODE_OPTION)));
-        ILogicalExpression searchModeValExpr = new ConstantExpression(
-                new AsterixConstantValue(new AString(FullTextContainsDescriptor.CONJUNCTIVE_SEARCH_MODE_OPTION)));
-
-        // Add this option as arguments to the ftcontains().
-        newArgs.add(new MutableObject<ILogicalExpression>(searchModeOptionExpr));
-        newArgs.add(new MutableObject<ILogicalExpression>(searchModeValExpr));
     }
 
 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
index f3f5581..003cff0 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/FuzzyJoinRule.java
@@ -26,7 +26,6 @@
 
 import org.apache.asterix.aqlplus.parser.AQLPlusParser;
 import org.apache.asterix.aqlplus.parser.ParseException;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -264,8 +263,8 @@
         AqlPlusExpressionToPlanTranslator translator = new AqlPlusExpressionToPlanTranslator(metadataProvider, counter);
         context.setVarCounter(counter.get());
 
-        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(
-                context, context);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(context, context);
 
         translator.addOperatorToMetaScope(new Identifier("#LEFT"), leftInputOp);
         translator.addVariableToMetaScope(new Identifier("$$LEFT"), leftInputVar);
@@ -318,12 +317,7 @@
         deepCopyVisitor.updatePrimaryKeys(context);
         deepCopyVisitor.reset();
 
-        ILogicalPlan plan;
-        try {
-            plan = translator.translate(clauses);
-        } catch (AsterixException e) {
-            throw new AlgebricksException(e);
-        }
+        ILogicalPlan plan = translator.translate(clauses);
         context.setVarCounter(counter.get());
 
         ILogicalOperator outputOp = plan.getRoots().get(0).getValue();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForSwitchCaseRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForSwitchCaseRule.java
index bb529d4..27b2712 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForSwitchCaseRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InjectTypeCastForSwitchCaseRule.java
@@ -100,9 +100,9 @@
             if (TypeResolverUtil.needsCast(producedType, type)) {
                 ILogicalExpression argExpr = argRef.getValue();
                 // Injects a cast call to cast the data type to the produced type of the switch-case function call.
-                ScalarFunctionCallExpression castFunc = new ScalarFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.CAST_TYPE),
-                        new ArrayList<>(Collections.singletonList(new MutableObject<>(argExpr))));
+                ScalarFunctionCallExpression castFunc =
+                        new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CAST_TYPE),
+                                new ArrayList<>(Collections.singletonList(new MutableObject<>(argExpr))));
                 TypeCastUtils.setRequiredAndInputTypes(castFunc, producedType, type);
                 argRef.setValue(castFunc);
                 rewritten = true;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InlineUnnestFunctionRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InlineUnnestFunctionRule.java
index 09c98dd..9f1b968 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InlineUnnestFunctionRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/InlineUnnestFunctionRule.java
@@ -65,8 +65,8 @@
             return false;
         }
         UnnestOperator unnestOperator = (UnnestOperator) op1;
-        AbstractFunctionCallExpression expr = (AbstractFunctionCallExpression) unnestOperator.getExpressionRef()
-                .getValue();
+        AbstractFunctionCallExpression expr =
+                (AbstractFunctionCallExpression) unnestOperator.getExpressionRef().getValue();
         //we only inline for the scan-collection function
         if (expr.getFunctionIdentifier() != BuiltinFunctions.SCAN_COLLECTION) {
             return false;
@@ -96,10 +96,11 @@
      */
     private void inlineVariable(LogicalVariable usedVar, UnnestOperator unnestOp) throws AlgebricksException {
         AbstractFunctionCallExpression expr = (AbstractFunctionCallExpression) unnestOp.getExpressionRef().getValue();
-        List<Pair<AbstractFunctionCallExpression, Integer>> parentAndIndexList = new ArrayList<Pair<AbstractFunctionCallExpression, Integer>>();
+        List<Pair<AbstractFunctionCallExpression, Integer>> parentAndIndexList =
+                new ArrayList<Pair<AbstractFunctionCallExpression, Integer>>();
         getParentFunctionExpression(usedVar, expr, parentAndIndexList);
-        ILogicalExpression usedVarOrginExpr = findUsedVarOrigin(usedVar, unnestOp,
-                (AbstractLogicalOperator) unnestOp.getInputs().get(0).getValue());
+        ILogicalExpression usedVarOrginExpr =
+                findUsedVarOrigin(usedVar, unnestOp, (AbstractLogicalOperator) unnestOp.getInputs().get(0).getValue());
         if (usedVarOrginExpr != null) {
             for (Pair<AbstractFunctionCallExpression, Integer> parentAndIndex : parentAndIndexList) {
                 //we only rewrite the top scan-collection function
@@ -160,8 +161,8 @@
             }
         } else {
             for (Mutable<ILogicalOperator> child : currentOp.getInputs()) {
-                ILogicalExpression expr = findUsedVarOrigin(usedVar, currentOp,
-                        (AbstractLogicalOperator) child.getValue());
+                ILogicalExpression expr =
+                        findUsedVarOrigin(usedVar, currentOp, (AbstractLogicalOperator) child.getValue());
                 if (expr != null) {
                     ret = expr;
                 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java
index a24c6e0..c3e036e 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceAutogenerateIDRule.java
@@ -133,8 +133,8 @@
             return false;
         }
 
-        List<String> pkFieldName = ((InternalDatasetDetails) dds.getDataset().getDatasetDetails()).getPrimaryKey()
-                .get(0);
+        List<String> pkFieldName =
+                ((InternalDatasetDetails) dds.getDataset().getDatasetDetails()).getPrimaryKey().get(0);
         ILogicalExpression rec0 = new VariableReferenceExpression(inputRecord);
         ILogicalExpression rec1 = createPrimaryKeyRecordExpression(pkFieldName);
         ILogicalExpression mergedRec = createRecordMergeFunction(rec0, rec1);
@@ -160,15 +160,15 @@
     private ILogicalExpression createNotNullFunction(ILogicalExpression mergedRec) {
         List<Mutable<ILogicalExpression>> args = new ArrayList<>();
         args.add(new MutableObject<ILogicalExpression>(mergedRec));
-        AbstractFunctionCallExpression notNullFn = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.CHECK_UNKNOWN), args);
+        AbstractFunctionCallExpression notNullFn =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CHECK_UNKNOWN), args);
         return notNullFn;
     }
 
     private AbstractFunctionCallExpression createPrimaryKeyRecordExpression(List<String> pkFieldName) {
         //Create lowest level of nested uuid
-        AbstractFunctionCallExpression uuidFn = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_UUID));
+        AbstractFunctionCallExpression uuidFn =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_UUID));
         List<Mutable<ILogicalExpression>> openRecordConsArgs = new ArrayList<>();
         Mutable<ILogicalExpression> pkFieldNameExpression = new MutableObject<ILogicalExpression>(
                 new ConstantExpression(new AsterixConstantValue(new AString(pkFieldName.get(pkFieldName.size() - 1)))));
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastForExternalFunctionRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastForExternalFunctionRule.java
index bb39993..5644a6c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastForExternalFunctionRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastForExternalFunctionRule.java
@@ -94,8 +94,8 @@
             }
             boolean castFlag = !IntroduceDynamicTypeCastRule.compatible(requiredRecordType, inputRecordType);
             if (castFlag || checkUnknown) {
-                AbstractFunctionCallExpression castFunc = new ScalarFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.CAST_TYPE));
+                AbstractFunctionCallExpression castFunc =
+                        new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CAST_TYPE));
                 castFunc.getArguments().add(funcCallExpr.getArguments().get(iter1));
                 TypeCastUtils.setRequiredAndInputTypes(castFunc, requiredRecordType, inputRecordType);
                 funcCallExpr.getArguments().set(iter1, new MutableObject<>(castFunc));
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
index 075a65c..2695337 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceDynamicTypeCastRule.java
@@ -167,8 +167,7 @@
         boolean cast = !compatible(requiredRecordType, inputRecordType);
 
         if (checkUnknown) {
-            recordVar = addWrapperFunction(requiredRecordType, recordVar, op, context,
-                    BuiltinFunctions.CHECK_UNKNOWN);
+            recordVar = addWrapperFunction(requiredRecordType, recordVar, op, context, BuiltinFunctions.CHECK_UNKNOWN);
         }
         if (cast) {
             addWrapperFunction(requiredRecordType, recordVar, op, context, BuiltinFunctions.CAST_TYPE);
@@ -208,15 +207,15 @@
                 if (var.equals(recordVar)) {
                     /** insert an assign operator to call the function on-top-of the variable */
                     IAType actualType = (IAType) env.getVarType(var);
-                    AbstractFunctionCallExpression cast = new ScalarFunctionCallExpression(
-                            FunctionUtil.getFunctionInfo(fd));
+                    AbstractFunctionCallExpression cast =
+                            new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(fd));
                     cast.getArguments()
                             .add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(var)));
                     /** enforce the required record type */
                     TypeCastUtils.setRequiredAndInputTypes(cast, requiredRecordType, actualType);
                     LogicalVariable newAssignVar = context.newVar();
-                    AssignOperator newAssignOperator = new AssignOperator(newAssignVar,
-                            new MutableObject<ILogicalExpression>(cast));
+                    AssignOperator newAssignOperator =
+                            new AssignOperator(newAssignVar, new MutableObject<ILogicalExpression>(cast));
                     newAssignOperator.getInputs().add(new MutableObject<ILogicalOperator>(op));
                     opRef.setValue(newAssignOperator);
                     context.computeAndSetTypeEnvironmentForOperator(newAssignOperator);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceEnforcedListTypeRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceEnforcedListTypeRule.java
index 3ff2a1b..0c44ba0 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceEnforcedListTypeRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceEnforcedListTypeRule.java
@@ -48,7 +48,8 @@
 public class IntroduceEnforcedListTypeRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceMaterializationForInsertWithSelfScanRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceMaterializationForInsertWithSelfScanRule.java
index 5518325..0fa4d30 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceMaterializationForInsertWithSelfScanRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceMaterializationForInsertWithSelfScanRule.java
@@ -58,16 +58,16 @@
         }
 
         InsertDeleteUpsertOperator insertOp = (InsertDeleteUpsertOperator) op;
-        boolean sameDataset = checkIfInsertAndScanDatasetsSame(op, ((DatasetDataSource) insertOp.getDataSource())
-                .getDataset().getDatasetName());
+        boolean sameDataset = checkIfInsertAndScanDatasetsSame(op,
+                ((DatasetDataSource) insertOp.getDataSource()).getDataset().getDatasetName());
 
         if (sameDataset) {
             MaterializeOperator materializeOperator = new MaterializeOperator();
             MaterializePOperator materializePOperator = new MaterializePOperator(true);
             materializeOperator.setPhysicalOperator(materializePOperator);
 
-            materializeOperator.getInputs().add(
-                    new MutableObject<ILogicalOperator>(insertOp.getInputs().get(0).getValue()));
+            materializeOperator.getInputs()
+                    .add(new MutableObject<ILogicalOperator>(insertOp.getInputs().get(0).getValue()));
             context.computeAndSetTypeEnvironmentForOperator(materializeOperator);
 
             insertOp.getInputs().clear();
@@ -105,8 +105,7 @@
             } else if (descendantOp.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) {
                 DataSourceScanOperator dataSourceScanOp = (DataSourceScanOperator) descendantOp;
                 DataSource ds = (DataSource) dataSourceScanOp.getDataSource();
-                if ((ds.getDatasourceType() == Type.INTERNAL_DATASET
-                        || ds.getDatasourceType() == Type.EXTERNAL_DATASET)
+                if ((ds.getDatasourceType() == Type.INTERNAL_DATASET || ds.getDatasourceType() == Type.EXTERNAL_DATASET)
                         && ((DatasetDataSource) ds).getDataset().getDatasetName().compareTo(insertDatasetName) == 0) {
                     return true;
                 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectAssignRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectAssignRule.java
index f655b24..1097d25 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectAssignRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceRapidFrameFlushProjectAssignRule.java
@@ -45,7 +45,8 @@
 public class IntroduceRapidFrameFlushProjectAssignRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
index 95dfceb..6d53c13 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
@@ -27,7 +27,6 @@
 import org.apache.asterix.algebra.operators.CommitOperator;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.util.FunctionUtil;
 import org.apache.asterix.metadata.declared.DataSource;
 import org.apache.asterix.metadata.declared.DataSourceIndex;
@@ -108,12 +107,12 @@
             return false;
         }
         /** find the record variable */
-        InsertDeleteUpsertOperator primaryIndexModificationOp = (InsertDeleteUpsertOperator) op0.getInputs().get(0)
-                .getValue();
+        InsertDeleteUpsertOperator primaryIndexModificationOp =
+                (InsertDeleteUpsertOperator) op0.getInputs().get(0).getValue();
         boolean isBulkload = primaryIndexModificationOp.isBulkload();
         ILogicalExpression newRecordExpr = primaryIndexModificationOp.getPayloadExpression().getValue();
-        List<Mutable<ILogicalExpression>> newMetaExprs = primaryIndexModificationOp
-                .getAdditionalNonFilteringExpressions();
+        List<Mutable<ILogicalExpression>> newMetaExprs =
+                primaryIndexModificationOp.getAdditionalNonFilteringExpressions();
         LogicalVariable newRecordVar;
         LogicalVariable newMetaVar = null;
 
@@ -121,8 +120,8 @@
          * inputOp is the assign operator which extracts primary keys from the input
          * variables (record or meta)
          */
-        AbstractLogicalOperator inputOp = (AbstractLogicalOperator) primaryIndexModificationOp.getInputs().get(0)
-                .getValue();
+        AbstractLogicalOperator inputOp =
+                (AbstractLogicalOperator) primaryIndexModificationOp.getInputs().get(0).getValue();
         newRecordVar = getRecordVar(context, inputOp, newRecordExpr, 0);
         if (newMetaExprs != null && !newMetaExprs.isEmpty()) {
             if (newMetaExprs.size() > 1) {
@@ -227,34 +226,28 @@
          * if the index is enforcing field types (For open indexes), We add a cast
          * operator to ensure type safety
          */
-        try {
-            if (primaryIndexModificationOp.getOperation() == Kind.INSERT
-                    || primaryIndexModificationOp.getOperation() == Kind.UPSERT
-                    /* Actually, delete should not be here but it is now until issue
-                     * https://issues.apache.org/jira/browse/ASTERIXDB-1507
-                     * is solved
-                     */
-                    || primaryIndexModificationOp.getOperation() == Kind.DELETE) {
-                injectFieldAccessesForIndexes(context, dataset, indexes, fieldVarsForNewRecord, recType, metaType,
-                        newRecordVar, newMetaVar, primaryIndexModificationOp, false);
-                if (replicateOp != null) {
-                    context.computeAndSetTypeEnvironmentForOperator(replicateOp);
-                }
+        if (primaryIndexModificationOp.getOperation() == Kind.INSERT
+                || primaryIndexModificationOp.getOperation() == Kind.UPSERT
+                /* Actually, delete should not be here but it is now until issue
+                 * https://issues.apache.org/jira/browse/ASTERIXDB-1507
+                 * is solved
+                 */
+                || primaryIndexModificationOp.getOperation() == Kind.DELETE) {
+            injectFieldAccessesForIndexes(context, dataset, indexes, fieldVarsForNewRecord, recType, metaType,
+                    newRecordVar, newMetaVar, primaryIndexModificationOp, false);
+            if (replicateOp != null) {
+                context.computeAndSetTypeEnvironmentForOperator(replicateOp);
             }
-            if (primaryIndexModificationOp.getOperation() == Kind.UPSERT
-            /* Actually, delete should be here but it is not until issue
-             * https://issues.apache.org/jira/browse/ASTERIXDB-1507
-             * is solved
-             */) {
-                List<LogicalVariable> beforeOpMetaVars = primaryIndexModificationOp
-                        .getBeforeOpAdditionalNonFilteringVars();
-                LogicalVariable beforeOpMetaVar = beforeOpMetaVars == null ? null : beforeOpMetaVars.get(0);
-                currentTop = injectFieldAccessesForIndexes(context, dataset, indexes, fieldVarsForBeforeOperation,
-                        recType, metaType, primaryIndexModificationOp.getBeforeOpRecordVar(), beforeOpMetaVar,
-                        currentTop, true);
-            }
-        } catch (AsterixException e) {
-            throw new AlgebricksException(e);
+        }
+        if (primaryIndexModificationOp.getOperation() == Kind.UPSERT
+        /* Actually, delete should be here but it is not until issue
+         * https://issues.apache.org/jira/browse/ASTERIXDB-1507
+         * is solved
+         */) {
+            List<LogicalVariable> beforeOpMetaVars = primaryIndexModificationOp.getBeforeOpAdditionalNonFilteringVars();
+            LogicalVariable beforeOpMetaVar = beforeOpMetaVars == null ? null : beforeOpMetaVars.get(0);
+            currentTop = injectFieldAccessesForIndexes(context, dataset, indexes, fieldVarsForBeforeOperation, recType,
+                    metaType, primaryIndexModificationOp.getBeforeOpRecordVar(), beforeOpMetaVar, currentTop, true);
         }
 
         // Iterate each secondary index and applying Index Update operations.
@@ -287,8 +280,8 @@
             IndexInsertDeleteUpsertOperator indexUpdate;
             if (index.getIndexType() != IndexType.RTREE) {
                 // Create an expression per key
-                Mutable<ILogicalExpression> filterExpression = (primaryIndexModificationOp
-                        .getOperation() == Kind.UPSERT) ? null
+                Mutable<ILogicalExpression> filterExpression =
+                        (primaryIndexModificationOp.getOperation() == Kind.UPSERT) ? null
                                 : createFilterExpression(secondaryKeyVars, context.getOutputTypeEnvironment(currentTop),
                                         index.isOverridingKeyFieldTypes());
                 DataSourceIndex dataSourceIndex = new DataSourceIndex(index, dataverseName, datasetName, mp);
@@ -378,8 +371,8 @@
                 Pair<IAType, Boolean> keyPairType = Index.getNonNullableOpenFieldType(index.getKeyFieldTypes().get(0),
                         secondaryKeyFields.get(0), recType);
                 IAType spatialType = keyPairType.first;
-                boolean isPointMBR = spatialType.getTypeTag() == ATypeTag.POINT
-                        || spatialType.getTypeTag() == ATypeTag.POINT3D;
+                boolean isPointMBR =
+                        spatialType.getTypeTag() == ATypeTag.POINT || spatialType.getTypeTag() == ATypeTag.POINT3D;
                 int dimension = NonTaggedFormatUtil.getNumDimensions(spatialType.getTypeTag());
                 int numKeys = (isPointMBR && isBulkload) ? dimension : dimension * 2;
                 // Get variables and expressions
@@ -388,8 +381,8 @@
                 for (int i = 0; i < numKeys; i++) {
                     LogicalVariable keyVar = context.newVar();
                     keyVarList.add(keyVar);
-                    AbstractFunctionCallExpression createMBR = new ScalarFunctionCallExpression(
-                            FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_MBR));
+                    AbstractFunctionCallExpression createMBR =
+                            new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_MBR));
                     createMBR.getArguments().add(new MutableObject<ILogicalExpression>(
                             new VariableReferenceExpression(secondaryKeyVars.get(0))));
                     createMBR.getArguments().add(new MutableObject<ILogicalExpression>(
@@ -581,8 +574,8 @@
                     // make handling of records with incorrect value type for this field easier and cleaner
                     context.addNotToBeInlinedVar(fieldVar);
                     // create field access
-                    AbstractFunctionCallExpression fieldAccessFunc = getOpenOrNestedFieldAccessFunction(varRef,
-                            indexFieldId.fieldName);
+                    AbstractFunctionCallExpression fieldAccessFunc =
+                            getOpenOrNestedFieldAccessFunction(varRef, indexFieldId.fieldName);
                     // create cast
                     theFieldAccessFunc = new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(
                             index.isEnforced() ? BuiltinFunctions.CAST_TYPE : BuiltinFunctions.CAST_TYPE_LAX));
@@ -594,9 +587,9 @@
                     int pos = indexFieldId.fieldName.size() > 1 ? -1
                             : sourceType.getFieldIndex(indexFieldId.fieldName.get(0));
                     // Field not found --> This is either an open field or a nested field. it can't be accessed by index
-                    theFieldAccessFunc = (pos == -1)
-                            ? getOpenOrNestedFieldAccessFunction(varRef, indexFieldId.fieldName)
-                            : getClosedFieldAccessFunction(varRef, pos);
+                    theFieldAccessFunc =
+                            (pos == -1) ? getOpenOrNestedFieldAccessFunction(varRef, indexFieldId.fieldName)
+                                    : getClosedFieldAccessFunction(varRef, pos);
                 }
                 vars.add(fieldVar);
                 exprs.add(new MutableObject<ILogicalExpression>(theFieldAccessFunc));
@@ -626,10 +619,10 @@
 
     private static AbstractFunctionCallExpression getClosedFieldAccessFunction(Mutable<ILogicalExpression> varRef,
             int position) {
-        Mutable<ILogicalExpression> indexRef = new MutableObject<>(
-                new ConstantExpression(new AsterixConstantValue(new AInt32(position))));
-        return new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX), varRef, indexRef);
+        Mutable<ILogicalExpression> indexRef =
+                new MutableObject<>(new ConstantExpression(new AsterixConstantValue(new AInt32(position))));
+        return new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_INDEX),
+                varRef, indexRef);
     }
 
     private static AbstractFunctionCallExpression getOpenOrNestedFieldAccessFunction(Mutable<ILogicalExpression> varRef,
@@ -639,14 +632,14 @@
             IAObject fieldList = stringListToAOrderedList(fields);
             Mutable<ILogicalExpression> fieldRef = constantToMutableLogicalExpression(fieldList);
             // Create an expression for the nested case
-            func = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_NESTED), varRef, fieldRef);
+            func = new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_NESTED),
+                    varRef, fieldRef);
         } else {
             IAObject fieldList = new AString(fields.get(0));
             Mutable<ILogicalExpression> fieldRef = constantToMutableLogicalExpression(fieldList);
             // Create an expression for the open field case (By name)
-            func = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME), varRef, fieldRef);
+            func = new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME),
+                    varRef, fieldRef);
         }
         return func;
     }
@@ -673,12 +666,12 @@
             if (!NonTaggedFormatUtil.isOptional(secondaryKeyType) && !forceFilter) {
                 continue;
             }
-            ScalarFunctionCallExpression isUnknownFuncExpr = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_UNKOWN),
-                    new MutableObject<ILogicalExpression>(new VariableReferenceExpression(secondaryKeyVar)));
-            ScalarFunctionCallExpression notFuncExpr = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT),
-                    new MutableObject<ILogicalExpression>(isUnknownFuncExpr));
+            ScalarFunctionCallExpression isUnknownFuncExpr =
+                    new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_UNKNOWN),
+                            new MutableObject<ILogicalExpression>(new VariableReferenceExpression(secondaryKeyVar)));
+            ScalarFunctionCallExpression notFuncExpr =
+                    new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT),
+                            new MutableObject<ILogicalExpression>(isUnknownFuncExpr));
             filterExpressions.add(new MutableObject<ILogicalExpression>(notFuncExpr));
         }
         // No nullable secondary keys.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
index 0c23ace..c5cb6ae 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
@@ -36,7 +36,8 @@
 public class IntroduceTransactionCommitByAssignOpRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -61,8 +62,8 @@
 
         //create an assignOp with a variable and the condition of the select-operator.
         LogicalVariable v = context.newVar();
-        AssignOperator assignOperator = new AssignOperator(v, new MutableObject<ILogicalExpression>(selectOperator
-                .getCondition().getValue()));
+        AssignOperator assignOperator =
+                new AssignOperator(v, new MutableObject<ILogicalExpression>(selectOperator.getCondition().getValue()));
 
         //set the input of the new assign-operator to the input of the select-operator.
         assignOperator.getInputs().add(childOfSelect);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ListifyUnnestingFunctionRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ListifyUnnestingFunctionRule.java
index 8e35ffb..2fe6460 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ListifyUnnestingFunctionRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ListifyUnnestingFunctionRule.java
@@ -118,14 +118,13 @@
         // Listify the dataset into one collection.
         LogicalVariable aggVar = context.newVar();
         Mutable<ILogicalExpression> aggArgExprRef = new MutableObject<>(new VariableReferenceExpression(unnestVar));
-        ILogicalExpression aggExpr = new AggregateFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.LISTIFY), false, new ArrayList<>(
-                        Collections.singletonList(aggArgExprRef)));
+        ILogicalExpression aggExpr =
+                new AggregateFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.LISTIFY), false,
+                        new ArrayList<>(Collections.singletonList(aggArgExprRef)));
         AggregateOperator aggregateOperator = new AggregateOperator(new ArrayList<>(Collections.singletonList(aggVar)),
                 new ArrayList<>(Collections.singletonList(new MutableObject<>(aggExpr))));
         aggregateOperator.getInputs().add(new MutableObject<>(unnestOperator));
 
-
         // Adds the aggregate operator as the root of the subplan.
         subplanOperator.setRootOp(new MutableObject<>(aggregateOperator));
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java
index 7336181..d6581a2 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/LoadRecordFieldsRule.java
@@ -310,16 +310,16 @@
                 AssignOperator op2 = (AssignOperator) opChild;
                 int i = op2.getVariables().indexOf(recordVar);
                 if (i >= 0) {
-                    AbstractLogicalExpression constr = (AbstractLogicalExpression) op2.getExpressions().get(i)
-                            .getValue();
+                    AbstractLogicalExpression constr =
+                            (AbstractLogicalExpression) op2.getExpressions().get(i).getValue();
                     return resolveFieldExpression(constr, accessKey, typeEnvironment, resolver);
                 }
             } else if (opChild.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE) {
                 NestedTupleSourceOperator nts = (NestedTupleSourceOperator) opChild;
-                AbstractLogicalOperator opBelowNestedPlan = (AbstractLogicalOperator) nts.getDataSourceReference()
-                        .getValue().getInputs().get(0).getValue();
-                ILogicalExpression expr1 = findFieldExpression(opBelowNestedPlan, recordVar, accessKey, typeEnvironment,
-                        resolver);
+                AbstractLogicalOperator opBelowNestedPlan =
+                        (AbstractLogicalOperator) nts.getDataSourceReference().getValue().getInputs().get(0).getValue();
+                ILogicalExpression expr1 =
+                        findFieldExpression(opBelowNestedPlan, recordVar, accessKey, typeEnvironment, resolver);
                 if (expr1 != null) {
                     return expr1;
                 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/MetaFunctionToMetaVariableRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/MetaFunctionToMetaVariableRule.java
index f0917af..13ff0ee 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/MetaFunctionToMetaVariableRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/MetaFunctionToMetaVariableRule.java
@@ -87,7 +87,8 @@
             // https://issues.apache.org/jira/browse/ASTERIXDB-1618
             if (dataSource.getDatasourceType() != DataSource.Type.EXTERNAL_DATASET
                     && dataSource.getDatasourceType() != DataSource.Type.INTERNAL_DATASET
-                    && dataSource.getDatasourceType() != DataSource.Type.LOADABLE) {
+                    && dataSource.getDatasourceType() != DataSource.Type.LOADABLE
+                    && dataSource.getDatasourceType() != DataSource.Type.FUNCTION) {
                 IMutationDataSource mds = (IMutationDataSource) dataSource;
                 if (mds.isChange()) {
                     transformers = new ArrayList<>();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/NestGroupByRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/NestGroupByRule.java
index 84567d7..78399a8 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/NestGroupByRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/NestGroupByRule.java
@@ -47,7 +47,8 @@
 public class NestGroupByRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggFuncIntoStandaloneAggregateRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggFuncIntoStandaloneAggregateRule.java
index abb87757..cf5088b 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggFuncIntoStandaloneAggregateRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggFuncIntoStandaloneAggregateRule.java
@@ -54,7 +54,8 @@
 public class PushAggFuncIntoStandaloneAggregateRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -98,8 +99,7 @@
                 continue;
             }
             AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-            FunctionIdentifier funcIdent = BuiltinFunctions.getAggregateFunction(funcExpr
-                    .getFunctionIdentifier());
+            FunctionIdentifier funcIdent = BuiltinFunctions.getAggregateFunction(funcExpr.getFunctionIdentifier());
             if (funcIdent == null) {
                 // Recursively look in func args.
                 if (containsAggregate(funcExpr.getArguments())) {
@@ -169,8 +169,8 @@
         return applied;
     }
 
-    private boolean pushAggregateFunction(AggregateOperator aggOp, AssignOperator assignOp, IOptimizationContext context)
-            throws AlgebricksException {
+    private boolean pushAggregateFunction(AggregateOperator aggOp, AssignOperator assignOp,
+            IOptimizationContext context) throws AlgebricksException {
         Mutable<ILogicalOperator> opRef3 = aggOp.getInputs().get(0);
         AbstractLogicalOperator op3 = (AbstractLogicalOperator) opRef3.getValue();
         // If there's a group by below the agg, then we want to have the agg pushed into the group by
@@ -204,23 +204,23 @@
             return false;
         }
 
-        AbstractFunctionCallExpression aggOpExpr = (AbstractFunctionCallExpression) aggOp.getExpressions().get(0)
-                .getValue();
+        AbstractFunctionCallExpression aggOpExpr =
+                (AbstractFunctionCallExpression) aggOp.getExpressions().get(0).getValue();
         aggOp.getExpressions().clear();
         aggOp.getVariables().clear();
 
         for (Mutable<ILogicalExpression> srcAssignExprRef : srcAssignExprRefs) {
-            AbstractFunctionCallExpression assignFuncExpr = (AbstractFunctionCallExpression) srcAssignExprRef
-                    .getValue();
-            FunctionIdentifier aggFuncIdent = BuiltinFunctions.getAggregateFunction(assignFuncExpr
-                    .getFunctionIdentifier());
+            AbstractFunctionCallExpression assignFuncExpr =
+                    (AbstractFunctionCallExpression) srcAssignExprRef.getValue();
+            FunctionIdentifier aggFuncIdent =
+                    BuiltinFunctions.getAggregateFunction(assignFuncExpr.getFunctionIdentifier());
 
             // Push the agg func into the agg op.
 
             List<Mutable<ILogicalExpression>> aggArgs = new ArrayList<Mutable<ILogicalExpression>>();
             aggArgs.add(aggOpExpr.getArguments().get(0));
-            AggregateFunctionCallExpression aggFuncExpr = BuiltinFunctions.makeAggregateFunctionExpression(
-                    aggFuncIdent, aggArgs);
+            AggregateFunctionCallExpression aggFuncExpr =
+                    BuiltinFunctions.makeAggregateFunctionExpression(aggFuncIdent, aggArgs);
             LogicalVariable newVar = context.newVar();
             aggOp.getVariables().add(newVar);
             aggOp.getExpressions().add(new MutableObject<ILogicalExpression>(aggFuncExpr));
@@ -249,8 +249,7 @@
                 continue;
             }
             AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-            FunctionIdentifier funcIdent = BuiltinFunctions.getAggregateFunction(funcExpr
-                    .getFunctionIdentifier());
+            FunctionIdentifier funcIdent = BuiltinFunctions.getAggregateFunction(funcExpr.getFunctionIdentifier());
             if (funcIdent == null) {
                 // Recursively look in func args.
                 if (fingAggFuncExprRef(funcExpr.getArguments(), aggVar, srcAssignExprRefs) == false) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
index 2b98762..ccf7ccb 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushAggregateIntoNestedSubplanRule.java
@@ -64,8 +64,8 @@
         Map<LogicalVariable, AbstractOperatorWithNestedPlans> nspWithAgg = new HashMap<>();
         Map<ILogicalExpression, ILogicalExpression> aggExprToVarExpr = new HashMap<>();
         // first collect vars. referring to listified sequences
-        boolean changed = collectVarsBottomUp(opRef, context, nspAggVars, nspWithAgg, nspAggVarToPlanIndex,
-                aggExprToVarExpr);
+        boolean changed =
+                collectVarsBottomUp(opRef, context, nspAggVars, nspWithAgg, nspAggVarToPlanIndex, aggExprToVarExpr);
         if (changed) {
             removeRedundantListifies(nspAggVars, nspWithAgg, nspAggVarToPlanIndex);
         }
@@ -147,8 +147,8 @@
                 if (op1.getOperatorTag() == LogicalOperatorTag.ASSIGN) {
                     AssignOperator assign = (AssignOperator) op1;
                     for (Mutable<ILogicalExpression> exprRef : assign.getExpressions()) {
-                        Pair<Boolean, ILogicalExpression> p = extractAggFunctionsFromExpression(exprRef, nspWithAgg,
-                                aggregateExprToVarExpr, context);
+                        Pair<Boolean, ILogicalExpression> p =
+                                extractAggFunctionsFromExpression(exprRef, nspWithAgg, aggregateExprToVarExpr, context);
                         if (p.first) {
                             change = true;
                             exprRef.setValue(p.second);
@@ -158,8 +158,8 @@
                 if (op1.getOperatorTag() == LogicalOperatorTag.SELECT) {
                     SelectOperator select = (SelectOperator) op1;
                     Mutable<ILogicalExpression> exprRef = select.getCondition();
-                    Pair<Boolean, ILogicalExpression> p = extractAggFunctionsFromExpression(exprRef, nspWithAgg,
-                            aggregateExprToVarExpr, context);
+                    Pair<Boolean, ILogicalExpression> p =
+                            extractAggFunctionsFromExpression(exprRef, nspWithAgg, aggregateExprToVarExpr, context);
                     if (p.first) {
                         change = true;
                         exprRef.setValue(p.second);
@@ -283,8 +283,8 @@
                         if (nspOp != null) {
                             if (!aggregateExprToVarExpr.containsKey(expr)) {
                                 LogicalVariable newVar = context.newVar();
-                                AggregateFunctionCallExpression aggFun = BuiltinFunctions
-                                        .makeAggregateFunctionExpression(fi, fce.getArguments());
+                                AggregateFunctionCallExpression aggFun =
+                                        BuiltinFunctions.makeAggregateFunctionExpression(fi, fce.getArguments());
                                 rewriteAggregateInNestedSubplan(argVar, nspOp, aggFun, newVar, context);
                                 ILogicalExpression newVarExpr = new VariableReferenceExpression(newVar);
                                 aggregateExprToVarExpr.put(expr, newVarExpr);
@@ -299,8 +299,8 @@
 
                 boolean change = false;
                 for (Mutable<ILogicalExpression> a : fce.getArguments()) {
-                    Pair<Boolean, ILogicalExpression> aggArg = extractAggFunctionsFromExpression(a, nspWithAgg,
-                            aggregateExprToVarExpr, context);
+                    Pair<Boolean, ILogicalExpression> aggArg =
+                            extractAggFunctionsFromExpression(a, nspWithAgg, aggregateExprToVarExpr, context);
                     if (aggArg.first.booleanValue()) {
                         a.setValue(aggArg.second);
                         change = true;
@@ -324,8 +324,8 @@
             for (int i = 0; i < n; i++) {
                 LogicalVariable v = aggOp.getVariables().get(i);
                 if (v.equals(oldAggVar)) {
-                    AbstractFunctionCallExpression oldAggExpr = (AbstractFunctionCallExpression) aggOp.getExpressions()
-                            .get(i).getValue();
+                    AbstractFunctionCallExpression oldAggExpr =
+                            (AbstractFunctionCallExpression) aggOp.getExpressions().get(i).getValue();
                     AggregateFunctionCallExpression newAggFun = BuiltinFunctions
                             .makeAggregateFunctionExpression(aggFun.getFunctionIdentifier(), new ArrayList<>());
                     for (Mutable<ILogicalExpression> arg : oldAggExpr.getArguments()) {
@@ -421,55 +421,55 @@
             AggregateOperator nspAgg = (AggregateOperator) nspAggRef.getValue();
             Mutable<ILogicalOperator> nspAggChildRef = nspAgg.getInputs().get(0);
             LogicalVariable listifyVar = findListifiedVariable(nspAgg, varFromNestedAgg);
-            if (listifyVar == null) {
-                    continue;
-            }
-            OperatorManipulationUtil.substituteVarRec(aggInSubplanOp, unnestVar, listifyVar, true, context);
-            nspAgg.getVariables().addAll(aggInSubplanOp.getVariables());
-            nspAgg.getExpressions().addAll(aggInSubplanOp.getExpressions());
-            for (LogicalVariable v : aggInSubplanOp.getVariables()) {
-                nspWithAgg.put(v, nspOp);
-                nspAggVars.put(v, 0);
-                nspAggVarToPlanIndex.put(v, i);
-            }
+            if (listifyVar != null) {
+                OperatorManipulationUtil.substituteVarRec(aggInSubplanOp, unnestVar, listifyVar, true, context);
+                nspAgg.getVariables().addAll(aggInSubplanOp.getVariables());
+                nspAgg.getExpressions().addAll(aggInSubplanOp.getExpressions());
+                for (LogicalVariable v : aggInSubplanOp.getVariables()) {
+                    nspWithAgg.put(v, nspOp);
+                    nspAggVars.put(v, 0);
+                    nspAggVarToPlanIndex.put(v, i);
+                }
 
-            Mutable<ILogicalOperator> opRef1InSubplan = aggInSubplanOp.getInputs().get(0);
-            if (!opRef1InSubplan.getValue().getInputs().isEmpty()) {
-                Mutable<ILogicalOperator> opRef2InSubplan = opRef1InSubplan.getValue().getInputs().get(0);
-                AbstractLogicalOperator op2InSubplan = (AbstractLogicalOperator) opRef2InSubplan.getValue();
-                if (op2InSubplan.getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
-                    List<Mutable<ILogicalOperator>> nspInpList = nspAgg.getInputs();
-                    nspInpList.clear();
-                    nspInpList.add(opRef1InSubplan);
-                    while (true) {
-                        opRef2InSubplan = opRef1InSubplan.getValue().getInputs().get(0);
-                        op2InSubplan = (AbstractLogicalOperator) opRef2InSubplan.getValue();
-                        if (op2InSubplan.getOperatorTag() == LogicalOperatorTag.UNNEST) {
-                            List<Mutable<ILogicalOperator>> opInpList = opRef1InSubplan.getValue().getInputs();
-                            opInpList.clear();
-                            opInpList.add(nspAggChildRef);
-                            break;
-                        }
-                        opRef1InSubplan = opRef2InSubplan;
-                        if (opRef1InSubplan.getValue().getInputs().isEmpty()) {
-                            throw new IllegalStateException(
+                Mutable<ILogicalOperator> opRef1InSubplan = aggInSubplanOp.getInputs().get(0);
+                if (!opRef1InSubplan.getValue().getInputs().isEmpty()) {
+                    Mutable<ILogicalOperator> opRef2InSubplan = opRef1InSubplan.getValue().getInputs().get(0);
+                    AbstractLogicalOperator op2InSubplan = (AbstractLogicalOperator) opRef2InSubplan.getValue();
+                    if (op2InSubplan.getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
+                        List<Mutable<ILogicalOperator>> nspInpList = nspAgg.getInputs();
+                        nspInpList.clear();
+                        nspInpList.add(opRef1InSubplan);
+                        while (true) {
+                            opRef2InSubplan = opRef1InSubplan.getValue().getInputs().get(0);
+                            op2InSubplan = (AbstractLogicalOperator) opRef2InSubplan.getValue();
+                            if (op2InSubplan.getOperatorTag() == LogicalOperatorTag.UNNEST) {
+                                List<Mutable<ILogicalOperator>> opInpList = opRef1InSubplan.getValue().getInputs();
+                                opInpList.clear();
+                                opInpList.add(nspAggChildRef);
+                                break;
+                            }
+                            opRef1InSubplan = opRef2InSubplan;
+                            if (opRef1InSubplan.getValue().getInputs().isEmpty()) {
+                                throw new IllegalStateException(
                                         "PushAggregateIntoNestedSubplanRule: could not find UNNEST.");
+                            }
                         }
                     }
                 }
+                subplanOpRef.setValue(subplan.getInputs().get(0).getValue());
+                OperatorPropertiesUtil.typeOpRec(nspAggRef, context);
+                return true;
             }
-            subplanOpRef.setValue(subplan.getInputs().get(0).getValue());
-            OperatorPropertiesUtil.typeOpRec(nspAggRef, context);
         }
-        return true;
+        return false;
     }
 
     private LogicalVariable findListifiedVariable(AggregateOperator nspAgg, LogicalVariable varFromNestedAgg) {
         int n = nspAgg.getVariables().size();
         for (int i = 0; i < n; i++) {
             if (nspAgg.getVariables().get(i).equals(varFromNestedAgg)) {
-                AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) nspAgg.getExpressions().get(i)
-                        .getValue();
+                AbstractFunctionCallExpression fce =
+                        (AbstractFunctionCallExpression) nspAgg.getExpressions().get(i).getValue();
                 if (fce.getFunctionIdentifier().equals(BuiltinFunctions.LISTIFY)) {
                     ILogicalExpression argExpr = fce.getArguments().get(0).getValue();
                     if (argExpr.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
index e0fb1db..769894d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushFieldAccessRule.java
@@ -62,12 +62,11 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
+import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
 public class PushFieldAccessRule implements IAlgebraicRewriteRule {
 
-    private static final String IS_MOVABLE = "isMovable";
-
     @Override
     public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) {
         return false;
@@ -96,11 +95,10 @@
         return propagateFieldAccessRec(opRef, context, finalAnnot);
     }
 
-    @SuppressWarnings("unchecked")
     private boolean isAccessToIndexedField(AssignOperator assign, IOptimizationContext context)
             throws AlgebricksException {
-        AbstractFunctionCallExpression accessFun = (AbstractFunctionCallExpression) assign.getExpressions().get(0)
-                .getValue();
+        AbstractFunctionCallExpression accessFun =
+                (AbstractFunctionCallExpression) assign.getExpressions().get(0).getValue();
         ILogicalExpression e0 = accessFun.getArguments().get(0).getValue();
         if (e0.getExpressionTag() != LogicalExpressionTag.VARIABLE) {
             return false;
@@ -161,8 +159,7 @@
         if (op2.getOperatorTag() != LogicalOperatorTag.SELECT) {
             return false;
         }
-        ILogicalExpression e1 = (ILogicalExpression) access.getAnnotations()
-                .get(OperatorAnnotation.FIELD_ACCESS);
+        ILogicalExpression e1 = (ILogicalExpression) access.getAnnotations().get(OperatorAnnotation.FIELD_ACCESS);
         if (e1 == null) {
             return false;
         }
@@ -173,7 +170,6 @@
         return e1.equals(e2);
     }
 
-    @SuppressWarnings("unchecked")
     private boolean propagateFieldAccessRec(Mutable<ILogicalOperator> opRef, IOptimizationContext context,
             String finalAnnot) throws AlgebricksException {
         AssignOperator access = (AssignOperator) opRef.getValue();
@@ -185,7 +181,7 @@
                 && !(op2.getOperatorTag() == LogicalOperatorTag.SELECT && isAccessToIndexedField(access, context))) {
             return false;
         }
-        Object annotation = op2.getAnnotations().get(IS_MOVABLE);
+        Object annotation = op2.getAnnotations().get(OperatorPropertiesUtil.MOVABLE);
         if (annotation != null && !((Boolean) annotation)) {
             return false;
         }
@@ -215,8 +211,7 @@
             pushItDown = true;
         } else if (op2.getOperatorTag() == LogicalOperatorTag.GROUP) {
             GroupByOperator g = (GroupByOperator) op2;
-            List<Pair<LogicalVariable, LogicalVariable>> varMappings =
-                    new ArrayList<>();
+            List<Pair<LogicalVariable, LogicalVariable>> varMappings = new ArrayList<>();
             for (Pair<LogicalVariable, Mutable<ILogicalExpression>> p : g.getDecorList()) {
                 ILogicalExpression e = p.second.getValue();
                 if (e.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
@@ -249,8 +244,8 @@
         }
         if (pushItDown) {
             if (op2.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE) {
-                Mutable<ILogicalOperator> childOfSubplan = ((NestedTupleSourceOperator) op2).getDataSourceReference()
-                        .getValue().getInputs().get(0);
+                Mutable<ILogicalOperator> childOfSubplan =
+                        ((NestedTupleSourceOperator) op2).getDataSourceReference().getValue().getInputs().get(0);
                 pushAccessDown(opRef, op2, childOfSubplan, context, finalAnnot);
                 return true;
             }
@@ -289,58 +284,44 @@
                 DataSourceScanOperator scan = (DataSourceScanOperator) op2;
                 int n = scan.getVariables().size();
                 LogicalVariable scanRecordVar = scan.getVariables().get(n - 1);
-                AbstractFunctionCallExpression accessFun = (AbstractFunctionCallExpression) access.getExpressions()
-                        .get(0).getValue();
-                ILogicalExpression e0 = accessFun.getArguments().get(0).getValue();
+
+                IDataSource<DataSourceId> dataSource = (IDataSource<DataSourceId>) scan.getDataSource();
+                byte dsType = ((DataSource) dataSource).getDatasourceType();
+                if (dsType != DataSource.Type.INTERNAL_DATASET && dsType != DataSource.Type.EXTERNAL_DATASET) {
+                    return false;
+                }
+                DataSourceId asid = dataSource.getId();
+                MetadataProvider mp = (MetadataProvider) context.getMetadataProvider();
+                Dataset dataset = mp.findDataset(asid.getDataverseName(), asid.getDatasourceName());
+                if (dataset == null) {
+                    throw new AlgebricksException("Dataset " + asid.getDatasourceName() + " not found.");
+                }
+                if (dataset.getDatasetType() != DatasetType.INTERNAL) {
+                    setAsFinal(access, context, finalAnnot);
+                    return false;
+                }
+
+                String tName = dataset.getItemTypeName();
+                IAType t = mp.findType(dataset.getItemTypeDataverseName(), tName);
+                if (t.getTypeTag() != ATypeTag.OBJECT) {
+                    return false;
+                }
+                ARecordType rt = (ARecordType) t;
+                Pair<ILogicalExpression, List<String>> fieldPathAndVar = getFieldExpression(access, rt);
+                ILogicalExpression e0 = fieldPathAndVar.first;
                 LogicalExpressionTag tag = e0.getExpressionTag();
                 if (tag == LogicalExpressionTag.VARIABLE) {
                     VariableReferenceExpression varRef = (VariableReferenceExpression) e0;
                     if (varRef.getVariableReference() == scanRecordVar) {
-                        ILogicalExpression e1 = accessFun.getArguments().get(1).getValue();
-                        if (e1.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-                            IDataSource<DataSourceId> dataSource = (IDataSource<DataSourceId>) scan.getDataSource();
-                            byte dsType = ((DataSource) dataSource).getDatasourceType();
-                            if (dsType == DataSource.Type.FEED || dsType == DataSource.Type.LOADABLE) {
-                                return false;
-                            }
-                            DataSourceId asid = dataSource.getId();
-                            MetadataProvider mp = (MetadataProvider) context.getMetadataProvider();
-                            Dataset dataset = mp.findDataset(asid.getDataverseName(), asid.getDatasourceName());
-                            if (dataset == null) {
-                                throw new AlgebricksException("Dataset " + asid.getDatasourceName() + " not found.");
-                            }
-                            if (dataset.getDatasetType() != DatasetType.INTERNAL) {
-                                setAsFinal(access, context, finalAnnot);
-                                return false;
-                            }
-                            ConstantExpression ce = (ConstantExpression) e1;
-                            IAObject obj = ((AsterixConstantValue) ce.getValue()).getObject();
-                            String fldName;
-                            if (obj.getType().getTypeTag() == ATypeTag.STRING) {
-                                fldName = ((AString) obj).getStringValue();
-                            } else {
-                                int pos = ((AInt32) obj).getIntegerValue();
-                                String tName = dataset.getItemTypeName();
-                                IAType t = mp.findType(dataset.getItemTypeDataverseName(), tName);
-                                if (t.getTypeTag() != ATypeTag.OBJECT) {
-                                    return false;
-                                }
-                                ARecordType rt = (ARecordType) t;
-                                if (pos >= rt.getFieldNames().length) {
-                                    setAsFinal(access, context, finalAnnot);
-                                    return false;
-                                }
-                                fldName = rt.getFieldNames()[pos];
-                            }
-                            int p = DatasetUtil.getPositionOfPartitioningKeyField(dataset, fldName);
-                            if (p < 0) { // not one of the partitioning fields
-                                setAsFinal(access, context, finalAnnot);
-                                return false;
-                            }
-                            LogicalVariable keyVar = scan.getVariables().get(p);
-                            access.getExpressions().get(0).setValue(new VariableReferenceExpression(keyVar));
-                            return true;
+                        int p = DatasetUtil.getPositionOfPartitioningKeyField(dataset, fieldPathAndVar.second);
+                        if (p < 0) { // not one of the partitioning fields
+                            setAsFinal(access, context, finalAnnot);
+                            return false;
                         }
+                        LogicalVariable keyVar = scan.getVariables().get(p);
+                        access.getExpressions().get(0).setValue(new VariableReferenceExpression(keyVar));
+                        return true;
+
                     }
                 }
             }
@@ -349,6 +330,34 @@
         }
     }
 
+    private Pair<ILogicalExpression, List<String>> getFieldExpression(AssignOperator access, ARecordType rt)
+            throws AlgebricksException {
+        LinkedList<String> fieldPath = new LinkedList<>();
+        ILogicalExpression e0 = access.getExpressions().get(0).getValue();
+        while (AnalysisUtil.isAccessToFieldRecord(e0)) {
+            ILogicalExpression e1 = ((AbstractFunctionCallExpression) e0).getArguments().get(1).getValue();
+            if (e1.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+                return new Pair<>(null, null);
+            }
+            ConstantExpression ce = (ConstantExpression) e1;
+            IAObject obj = ((AsterixConstantValue) ce.getValue()).getObject();
+            String fldName;
+            if (obj.getType().getTypeTag() == ATypeTag.STRING) {
+                fldName = ((AString) obj).getStringValue();
+            } else {
+                int pos = ((AInt32) obj).getIntegerValue();
+                if (pos >= rt.getFieldNames().length) {
+                    return new Pair<>(null, null);
+                }
+                fldName = rt.getFieldNames()[pos];
+            }
+            fieldPath.addFirst(fldName);
+            e0 = ((AbstractFunctionCallExpression) e0).getArguments().get(0).getValue();
+
+        }
+        return new Pair<>(e0, fieldPath);
+    }
+
     private void setAsFinal(ILogicalOperator access, IOptimizationContext context, String finalAnnot) {
         access.getAnnotations().put(finalAnnot, true);
         context.addToDontApplySet(this, access);
@@ -375,7 +384,7 @@
         fldAccessOpRef.setValue(op2);
         List<Mutable<ILogicalOperator>> faInpList = fieldAccessOp.getInputs();
         faInpList.clear();
-        faInpList.add(new MutableObject<ILogicalOperator>(inputOfOp2.getValue()));
+        faInpList.add(new MutableObject<>(inputOfOp2.getValue()));
         inputOfOp2.setValue(fieldAccessOp);
         // typing
         context.computeAndSetTypeEnvironmentForOperator(fieldAccessOp);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
index 903f49e..48c4324 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushGroupByThroughProduct.java
@@ -77,8 +77,10 @@
         }
         GroupByOperator gby = (GroupByOperator) op1;
 
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorToPush = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorNotToPush = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorToPush =
+                new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorNotToPush =
+                new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
 
         Mutable<ILogicalOperator> opLeftRef = join.getInputs().get(0);
         ILogicalOperator opLeft = opLeftRef.getValue();
@@ -110,7 +112,7 @@
     private void push(Mutable<ILogicalOperator> opRefGby, Mutable<ILogicalOperator> opRefJoin, int branch,
             List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorToPush,
             List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorNotToPush, IOptimizationContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         GroupByOperator gby = (GroupByOperator) opRefGby.getValue();
         AbstractBinaryJoinOperator join = (AbstractBinaryJoinOperator) opRefJoin.getValue();
         gby.getDecorList().clear();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushProperJoinThroughProduct.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushProperJoinThroughProduct.java
index ada4a57..1734f34 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushProperJoinThroughProduct.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/PushProperJoinThroughProduct.java
@@ -42,7 +42,8 @@
     private List<LogicalVariable> productLeftBranchVars = new ArrayList<LogicalVariable>();
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveLeftOuterUnnestForLeftOuterJoinRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveLeftOuterUnnestForLeftOuterJoinRule.java
index b720714..1d7a61a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveLeftOuterUnnestForLeftOuterJoinRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveLeftOuterUnnestForLeftOuterJoinRule.java
@@ -88,8 +88,8 @@
         LeftOuterJoinOperator lojOperator = (LeftOuterJoinOperator) gbyOperator.getInputs().get(0).getValue();
 
         // Checks whether the left outer unnest and the group-by operator are qualified for rewriting.
-        Triple<Boolean, ILogicalExpression, ILogicalExpression> checkGbyResult = checkUnnestAndGby(outerUnnest,
-                gbyOperator);
+        Triple<Boolean, ILogicalExpression, ILogicalExpression> checkGbyResult =
+                checkUnnestAndGby(outerUnnest, gbyOperator);
         // The argument for listify and not(is-missing(...)) check should be variables.
         if (!isVariableReference(checkGbyResult.second) || !isVariableReference(checkGbyResult.third)) {
             return false;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantListifyRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantListifyRule.java
index 334b966..7b46b39 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantListifyRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantListifyRule.java
@@ -142,8 +142,7 @@
         if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
             return false;
         }
-        if (((AbstractFunctionCallExpression) expr)
-                .getFunctionIdentifier() != BuiltinFunctions.SCAN_COLLECTION) {
+        if (((AbstractFunctionCallExpression) expr).getFunctionIdentifier() != BuiltinFunctions.SCAN_COLLECTION) {
             return false;
         }
         AbstractFunctionCallExpression functionCall = (AbstractFunctionCallExpression) expr;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantSelectRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantSelectRule.java
index fe9e49e..53eb33a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantSelectRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/RemoveRedundantSelectRule.java
@@ -44,7 +44,8 @@
 public class RemoveRedundantSelectRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ResolveVariableRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ResolveVariableRule.java
deleted file mode 100644
index 2d7695f..0000000
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/ResolveVariableRule.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.optimizer.rules;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.asterix.lang.common.util.FunctionUtil;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.constants.AsterixConstantValue;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.AUnionType;
-import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.utils.ConstantExpressionUtil;
-import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.common.utils.Triple;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
-import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
-import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
-
-/**
- * This rule resolves references to undefined identifiers with the following priority:
- * 1. field-access
- * 2. datasets
- * based on the available type and metadata information.
- *
- *
- * Note that undefined variable references that are FROM/JOIN/UNNEST/Quantifier binding expressions
- * are resolved to dataset only, which has been done in
- *
- * @see org.apache.asterix.lang.sqlpp.rewrites.visitor.VariableCheckAndRewriteVisitor
- *
- */
-public class ResolveVariableRule implements IAlgebraicRewriteRule {
-
-    @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
-            throws AlgebricksException {
-        return false;
-    }
-
-    @Override
-    public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
-            throws AlgebricksException {
-        ILogicalOperator op = opRef.getValue();
-        if (op.getInputs().isEmpty()) {
-            return false;
-        }
-        // Populates the latest type information, e.g., resolved path sugars.
-        context.computeAndSetTypeEnvironmentForOperator(op);
-        if (op.acceptExpressionTransform(
-                exprRef -> rewriteExpressionReference(op, exprRef, new Triple<>(false, null, null), null, context))) {
-            // Generates the up-to-date type information.
-            context.computeAndSetTypeEnvironmentForOperator(op);
-            return true;
-        }
-        return false;
-    }
-
-    // Recursively rewrites for an expression within an operator.
-    private boolean rewriteExpressionReference(ILogicalOperator op, Mutable<ILogicalExpression> exprRef,
-            Triple<Boolean, String, String> fullyQualifiedDatasetPathCandidateFromParent,
-            Mutable<ILogicalExpression> parentFuncRef, IOptimizationContext context) throws AlgebricksException {
-        ILogicalExpression expr = exprRef.getValue();
-        if (expr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-            return false;
-        }
-        boolean changed = false;
-        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
-        Triple<Boolean, String, String> fullyQualifiedDatasetPathCandidate = resolveFullyQualifiedPath(funcExpr,
-                context);
-        for (Mutable<ILogicalExpression> funcArgRef : funcExpr.getArguments()) {
-            if (rewriteExpressionReference(op, funcArgRef, fullyQualifiedDatasetPathCandidate, exprRef, context)) {
-                changed = true;
-            }
-        }
-
-        // Cleans up extra scan-collections if there is.
-        if (changed) {
-            cleanupScanCollectionForDataset(funcExpr);
-        }
-
-        // Does the actual resolution.
-        return changed || resolve(op, context, exprRef, fullyQualifiedDatasetPathCandidateFromParent, parentFuncRef);
-    }
-
-    // Resolves a "resolve" function call expression to a fully qualified variable/field-access path or
-    // a dataset.
-    private boolean resolve(ILogicalOperator op, IOptimizationContext context, Mutable<ILogicalExpression> exprRef,
-            Triple<Boolean, String, String> fullyQualifiedDatasetPathCandidateFromParent,
-            Mutable<ILogicalExpression> parentFuncRef) throws AlgebricksException {
-        AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) exprRef.getValue();
-        if (funcExpr.getFunctionIdentifier() != BuiltinFunctions.RESOLVE) {
-            return false;
-        }
-        ILogicalExpression arg = funcExpr.getArguments().get(0).getValue();
-        String unresolvedVarName = extractConstantString(arg);
-        return resolveInternal(exprRef, hasMatchedDatasetForVariableName(unresolvedVarName, context),
-                findCandidatePaths(op, extractExprs(funcExpr.getArguments()), unresolvedVarName, context),
-                unresolvedVarName, fullyQualifiedDatasetPathCandidateFromParent, parentFuncRef, context);
-    }
-
-    // Extracts all possible expressions from the arguments of the "resolve" function.
-    private List<ILogicalExpression> extractExprs(List<Mutable<ILogicalExpression>> args) throws AlgebricksException {
-        List<ILogicalExpression> exprs = new ArrayList<>();
-        // The first arg is is the name of the undefined variable.
-        for (int index = 1; index < args.size(); ++index) {
-            ILogicalExpression argExpr = args.get(index).getValue();
-            exprs.add(argExpr);
-        }
-        return exprs;
-    }
-
-    // Resolves an undefined name to a dataset or a fully qualified variable/field-access path
-    // based on the given information of dataset matches and candidate paths.
-    private boolean resolveInternal(Mutable<ILogicalExpression> funcRef, boolean hasMatchedDataset,
-            Collection<Pair<ILogicalExpression, List<String>>> varAccessCandidates, String unresolvedVarName,
-            Triple<Boolean, String, String> fullyQualifiedDatasetPathCandidateFromParent,
-            Mutable<ILogicalExpression> parentFuncRef, IOptimizationContext context) throws AlgebricksException {
-        AbstractFunctionCallExpression func = (AbstractFunctionCallExpression) funcRef.getValue();
-        int numVarCandidates = varAccessCandidates.size();
-
-        // The resolution order: 1. field-access 2. datasets (standalone-name or fully-qualified)
-        if (numVarCandidates > 0) {
-            if (numVarCandidates == 1) {
-                resolveAsFieldAccess(funcRef, varAccessCandidates.iterator().next());
-            } else {
-                // More than one possibilities.
-                throw new AlgebricksException(
-                        "Cannot resolve ambiguous alias reference for undefined identifier " + unresolvedVarName);
-            }
-        } else if (hasMatchedDataset) {
-            // Rewrites the "resolve" function to a "dataset" function and only keep the dataset name argument.
-            func.setFunctionInfo(FunctionUtil.getFunctionInfo(BuiltinFunctions.DATASET));
-            Mutable<ILogicalExpression> datasetNameExpression = func.getArguments().get(0);
-            func.getArguments().clear();
-            func.getArguments().add(datasetNameExpression);
-        } else if (fullyQualifiedDatasetPathCandidateFromParent.first) {
-            // Rewrites the parent "field-access" function to a "dataset" function.
-            AbstractFunctionCallExpression parentFunc = (AbstractFunctionCallExpression) parentFuncRef.getValue();
-            parentFunc.setFunctionInfo(FunctionUtil.getFunctionInfo(BuiltinFunctions.DATASET));
-            parentFunc.getArguments().clear();
-            parentFunc.getArguments().add(
-                    new MutableObject<>(new ConstantExpression(
-                            new AsterixConstantValue(new AString(fullyQualifiedDatasetPathCandidateFromParent.second
-                                    + "." + fullyQualifiedDatasetPathCandidateFromParent.third)))));
-        } else {
-            MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-            // Cannot find any resolution.
-            throw new AlgebricksException("Cannot find dataset " + unresolvedVarName + " in dataverse "
-                    + metadataProvider.getDefaultDataverseName() + " nor an alias with name " + unresolvedVarName);
-        }
-        return true;
-    }
-
-    // Resolves a "resolve" function call as a field access.
-    private void resolveAsFieldAccess(Mutable<ILogicalExpression> funcRef,
-            Pair<ILogicalExpression, List<String>> varAndPath) {
-        // Rewrites to field-access-by-names.
-        ILogicalExpression expr = varAndPath.first;
-        List<String> path = varAndPath.second;
-        Mutable<ILogicalExpression> firstArgRef = new MutableObject<>(expr);
-        ILogicalExpression newFunc = null;
-        for (String fieldName : path) {
-            List<Mutable<ILogicalExpression>> args = new ArrayList<>();
-            args.add(firstArgRef);
-            args.add(new MutableObject<>(new ConstantExpression(new AsterixConstantValue(new AString(fieldName)))));
-            newFunc = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.FIELD_ACCESS_BY_NAME), args);
-            firstArgRef = new MutableObject<>(newFunc);
-        }
-        funcRef.setValue(newFunc);
-    }
-
-    // Finds all candidate fully qualified expression/field-access paths.
-    private Set<Pair<ILogicalExpression, List<String>>> findCandidatePaths(ILogicalOperator op,
-            Collection<ILogicalExpression> referenceExprs, String unresolvedVarName, IOptimizationContext context)
-            throws AlgebricksException {
-        Set<Pair<ILogicalExpression, List<String>>> candidates = new HashSet<>();
-        IVariableTypeEnvironment env = context.getOutputTypeEnvironment(op.getInputs().get(0).getValue());
-        for (ILogicalExpression referenceExpr : referenceExprs) {
-            IAType type = (IAType) env.getType(referenceExpr);
-            candidates.addAll(findCandidatePathsForExpr(unresolvedVarName, type, referenceExpr, new ArrayList<>()));
-        }
-        return candidates;
-    }
-
-    // Recursively finds candidate paths under an expression.
-    private Set<Pair<ILogicalExpression, List<String>>> findCandidatePathsForExpr(String unresolvedVarName,
-            IAType pathType, ILogicalExpression expr, List<String> parentPath) throws AlgebricksException {
-        Set<Pair<ILogicalExpression, List<String>>> varAccessCandidates = new HashSet<>();
-        IAType type = pathType;
-        if (type.getTypeTag() == ATypeTag.UNION) {
-            type = ((AUnionType) type).getActualType();
-        }
-        ATypeTag tag = type.getTypeTag();
-        if (tag == ATypeTag.ANY) {
-            List<String> path = new ArrayList<>(parentPath);
-            path.add(unresolvedVarName);
-            varAccessCandidates.add(new Pair<>(expr, path));
-        }
-        if (tag == ATypeTag.OBJECT) {
-            ARecordType recordType = (ARecordType) type;
-            if (recordType.canContainField(unresolvedVarName)) {
-                // If the field name is possible.
-                List<String> path = new ArrayList<>(parentPath);
-                path.add(unresolvedVarName);
-                varAccessCandidates.add(new Pair<>(expr, path));
-            } else {
-                // Recursively identified possible paths.
-                String[] fieldNames = recordType.getFieldNames();
-                IAType[] fieldTypes = recordType.getFieldTypes();
-                for (int index = 0; index < fieldNames.length; ++index) {
-                    List<String> path = new ArrayList<>(parentPath);
-                    path.add(fieldNames[index]);
-                    varAccessCandidates.addAll(findCandidatePathsForExpr(unresolvedVarName, fieldTypes[index], expr,
-                            path));
-                }
-            }
-        }
-        return varAccessCandidates;
-    }
-
-    // Try to resolve the expression like resolve("x").foo as x.foo.
-    private Triple<Boolean, String, String> resolveFullyQualifiedPath(AbstractFunctionCallExpression funcExpr,
-            IOptimizationContext context) throws AlgebricksException {
-        if (!funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.FIELD_ACCESS_BY_NAME)) {
-            return new Triple<>(false, null, null);
-        }
-        List<Mutable<ILogicalExpression>> args = funcExpr.getArguments();
-        ILogicalExpression firstExpr = args.get(0).getValue();
-        ILogicalExpression secondExpr = args.get(1).getValue();
-        if (firstExpr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-            return new Triple<>(false, null, null);
-        }
-        if (secondExpr.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
-            return new Triple<>(false, null, null);
-        }
-        AbstractFunctionCallExpression firstFuncExpr = (AbstractFunctionCallExpression) firstExpr;
-        if (!firstFuncExpr.getFunctionIdentifier().equals(BuiltinFunctions.RESOLVE)) {
-            return new Triple<>(false, null, null);
-        }
-        ILogicalExpression dataverseNameExpr = firstFuncExpr.getArguments().get(0).getValue();
-        String dataverseName = extractConstantString(dataverseNameExpr);
-        String datasetName = extractConstantString(secondExpr);
-        return new Triple<>(hasMatchedDataverseDataset(dataverseName, datasetName, context), dataverseName,
-                datasetName);
-    }
-
-    // Checks whether the dataverse name and dataset name matche a dataset.
-    private boolean hasMatchedDataverseDataset(String dataverseName, String datasetName, IOptimizationContext context)
-            throws AlgebricksException {
-        MetadataProvider mdp = (MetadataProvider) context.getMetadataProvider();
-        return mdp.findDataset(dataverseName, datasetName) != null;
-    }
-
-    // Checks whether the name matches a dataset.
-    private boolean hasMatchedDatasetForVariableName(String varName, IOptimizationContext context)
-            throws AlgebricksException {
-        MetadataProvider mdp = (MetadataProvider) context.getMetadataProvider();
-        if (mdp.findDataset(mdp.getDefaultDataverseName(), varName) != null) {
-            return true;
-        }
-        if (varName.contains(".")) {
-            String[] path = varName.split("\\.");
-            if (path.length != 2) {
-                return false;
-            }
-            if (mdp.findDataset(path[0], path[1]) != null) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    // Cleans up scan collections on top of a "dataset" function call since "dataset"
-    // is an unnest function.
-    private void cleanupScanCollectionForDataset(AbstractFunctionCallExpression funcExpr) {
-        if (funcExpr.getFunctionIdentifier() != BuiltinFunctions.SCAN_COLLECTION) {
-            return;
-        }
-        ILogicalExpression arg = funcExpr.getArguments().get(0).getValue();
-        if (arg.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-            return;
-        }
-        AbstractFunctionCallExpression argFuncExpr = (AbstractFunctionCallExpression) arg;
-        if (argFuncExpr.getFunctionIdentifier() != BuiltinFunctions.DATASET) {
-            return;
-        }
-        funcExpr.setFunctionInfo(argFuncExpr.getFunctionInfo());
-        funcExpr.getArguments().clear();
-        funcExpr.getArguments().addAll(argFuncExpr.getArguments());
-    }
-
-    // Extracts the name of an undefined variable.
-    private String extractConstantString(ILogicalExpression arg) throws AlgebricksException {
-        final String str = ConstantExpressionUtil.getStringConstant(arg);
-        if (str == null) {
-            throw new AlgebricksException("The argument is expected to be a string constant value.");
-        }
-        return str;
-    }
-}
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
index d22ec54..4afccb0 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetAsterixPhysicalOperatorsRule.java
@@ -80,20 +80,20 @@
             return false;
         }
 
-        computeDefaultPhysicalOp(op, context);
+        computeDefaultPhysicalOp(op, true, context);
         context.addToDontApplySet(this, op);
         return true;
     }
 
-    private static void setPhysicalOperators(ILogicalPlan plan, IOptimizationContext context)
+    private static void setPhysicalOperators(ILogicalPlan plan, boolean topLevelOp, IOptimizationContext context)
             throws AlgebricksException {
         for (Mutable<ILogicalOperator> root : plan.getRoots()) {
-            computeDefaultPhysicalOp((AbstractLogicalOperator) root.getValue(), context);
+            computeDefaultPhysicalOp((AbstractLogicalOperator) root.getValue(), topLevelOp, context);
         }
     }
 
-    private static void computeDefaultPhysicalOp(AbstractLogicalOperator op, IOptimizationContext context)
-            throws AlgebricksException {
+    private static void computeDefaultPhysicalOp(AbstractLogicalOperator op, boolean topLevelOp,
+            IOptimizationContext context) throws AlgebricksException {
         PhysicalOptimizationConfig physicalOptimizationConfig = context.getPhysicalOptimizationConfig();
         if (op.getOperatorTag().equals(LogicalOperatorTag.GROUP)) {
             GroupByOperator gby = (GroupByOperator) op;
@@ -107,8 +107,7 @@
                         boolean serializable = true;
                         for (Mutable<ILogicalExpression> exprRef : aggOp.getExpressions()) {
                             AbstractFunctionCallExpression expr = (AbstractFunctionCallExpression) exprRef.getValue();
-                            if (!BuiltinFunctions
-                                    .isAggregateFunctionSerializable(expr.getFunctionIdentifier())) {
+                            if (!BuiltinFunctions.isAggregateFunctionSerializable(expr.getFunctionIdentifier())) {
                                 serializable = false;
                                 break;
                             }
@@ -121,17 +120,17 @@
                                 // if serializable, use external group-by
                                 // now check whether the serialized version aggregation function has corresponding intermediate agg
                                 boolean hasIntermediateAgg = true;
-                                IMergeAggregationExpressionFactory mergeAggregationExpressionFactory = context
-                                        .getMergeAggregationExpressionFactory();
+                                IMergeAggregationExpressionFactory mergeAggregationExpressionFactory =
+                                        context.getMergeAggregationExpressionFactory();
                                 List<LogicalVariable> originalVariables = aggOp.getVariables();
                                 List<Mutable<ILogicalExpression>> aggExprs = aggOp.getExpressions();
                                 int aggNum = aggExprs.size();
                                 for (int i = 0; i < aggNum; i++) {
-                                    AbstractFunctionCallExpression expr = (AbstractFunctionCallExpression) aggExprs
-                                            .get(i).getValue();
-                                    AggregateFunctionCallExpression serialAggExpr = BuiltinFunctions
-                                            .makeSerializableAggregateFunctionExpression(expr.getFunctionIdentifier(),
-                                                    expr.getArguments());
+                                    AbstractFunctionCallExpression expr =
+                                            (AbstractFunctionCallExpression) aggExprs.get(i).getValue();
+                                    AggregateFunctionCallExpression serialAggExpr =
+                                            BuiltinFunctions.makeSerializableAggregateFunctionExpression(
+                                                    expr.getFunctionIdentifier(), expr.getArguments());
                                     if (mergeAggregationExpressionFactory.createMergeAggregation(
                                             originalVariables.get(i), serialAggExpr, context) == null) {
                                         hasIntermediateAgg = false;
@@ -153,16 +152,15 @@
 
                                 if (hasIntermediateAgg && !multipleAggOpsFound) {
                                     for (int i = 0; i < aggNum; i++) {
-                                        AbstractFunctionCallExpression expr = (AbstractFunctionCallExpression) aggExprs
-                                                .get(i).getValue();
-                                        AggregateFunctionCallExpression serialAggExpr = BuiltinFunctions
-                                                .makeSerializableAggregateFunctionExpression(
+                                        AbstractFunctionCallExpression expr =
+                                                (AbstractFunctionCallExpression) aggExprs.get(i).getValue();
+                                        AggregateFunctionCallExpression serialAggExpr =
+                                                BuiltinFunctions.makeSerializableAggregateFunctionExpression(
                                                         expr.getFunctionIdentifier(), expr.getArguments());
                                         aggOp.getExpressions().get(i).setValue(serialAggExpr);
                                     }
                                     ExternalGroupByPOperator externalGby = new ExternalGroupByPOperator(
-                                            gby.getGroupByList(),
-                                            physicalOptimizationConfig.getMaxFramesForGroupBy(),
+                                            gby.getGroupByList(), physicalOptimizationConfig.getMaxFramesForGroupBy(),
                                             (long) physicalOptimizationConfig.getMaxFramesForGroupBy()
                                                     * physicalOptimizationConfig.getFrameSize());
                                     generateMergeAggregationExpressions(gby, context);
@@ -209,11 +207,11 @@
         if (op.getPhysicalOperator() == null) {
             switch (op.getOperatorTag()) {
                 case INNERJOIN: {
-                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((InnerJoinOperator) op, context);
+                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((InnerJoinOperator) op, topLevelOp, context);
                     break;
                 }
                 case LEFTOUTERJOIN: {
-                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((LeftOuterJoinOperator) op, context);
+                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((LeftOuterJoinOperator) op, topLevelOp, context);
                     break;
                 }
                 case UNNEST_MAP:
@@ -229,12 +227,12 @@
                         AccessMethodJobGenParams jobGenParams = new AccessMethodJobGenParams();
                         jobGenParams.readFromFuncArgs(f.getArguments());
                         MetadataProvider mp = (MetadataProvider) context.getMetadataProvider();
-                        DataSourceId dataSourceId = new DataSourceId(jobGenParams.getDataverseName(),
-                                jobGenParams.getDatasetName());
-                        Dataset dataset = mp.findDataset(jobGenParams.getDataverseName(),
-                                jobGenParams.getDatasetName());
-                        IDataSourceIndex<String, DataSourceId> dsi = mp.findDataSourceIndex(jobGenParams.getIndexName(),
-                                dataSourceId);
+                        DataSourceId dataSourceId =
+                                new DataSourceId(jobGenParams.getDataverseName(), jobGenParams.getDatasetName());
+                        Dataset dataset =
+                                mp.findDataset(jobGenParams.getDataverseName(), jobGenParams.getDatasetName());
+                        IDataSourceIndex<String, DataSourceId> dsi =
+                                mp.findDataSourceIndex(jobGenParams.getIndexName(), dataSourceId);
                         INodeDomain storageDomain = mp.findNodeDomain(dataset.getNodeGroupName());
                         if (dsi == null) {
                             throw new AlgebricksException("Could not find index " + jobGenParams.getIndexName()
@@ -279,11 +277,11 @@
         if (op.hasNestedPlans()) {
             AbstractOperatorWithNestedPlans nested = (AbstractOperatorWithNestedPlans) op;
             for (ILogicalPlan p : nested.getNestedPlans()) {
-                setPhysicalOperators(p, context);
+                setPhysicalOperators(p, false, context);
             }
         }
         for (Mutable<ILogicalOperator> opRef : op.getInputs()) {
-            computeDefaultPhysicalOp((AbstractLogicalOperator) opRef.getValue(), context);
+            computeDefaultPhysicalOp((AbstractLogicalOperator) opRef.getValue(), topLevelOp, context);
         }
     }
 
@@ -300,8 +298,8 @@
                     "External group-by currently works only for one nested plan with one root containing"
                             + "an aggregate and a nested-tuple-source.");
         }
-        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory = context
-                .getMergeAggregationExpressionFactory();
+        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory =
+                context.getMergeAggregationExpressionFactory();
         Mutable<ILogicalOperator> r0 = p0.getRoots().get(0);
         AbstractLogicalOperator r0Logical = (AbstractLogicalOperator) r0.getValue();
         if (r0Logical.getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetClosedRecordConstructorsRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetClosedRecordConstructorsRule.java
index f676bff..48a744d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetClosedRecordConstructorsRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetClosedRecordConstructorsRule.java
@@ -130,9 +130,8 @@
                         }
                     }
                     if (allClosed) {
-                        expr.setFunctionInfo(
-                                FunctionUtil.getFunctionInfo(BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR));
-                        GlobalConfig.ASTERIX_LOGGER.finest("Switching to CLOSED record constructor in " + expr + ".\n");
+                        expr.setFunctionInfo(FunctionUtil.getFunctionInfo(BuiltinFunctions.CLOSED_RECORD_CONSTRUCTOR));
+                        GlobalConfig.ASTERIX_LOGGER.trace("Switching to CLOSED record constructor in " + expr + ".\n");
                         changed = true;
                     }
                 }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetupCommitExtensionOpRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetupCommitExtensionOpRule.java
index 18e5f5e..90491d3 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetupCommitExtensionOpRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SetupCommitExtensionOpRule.java
@@ -23,9 +23,7 @@
 
 import org.apache.asterix.algebra.operators.CommitOperator;
 import org.apache.asterix.algebra.operators.physical.CommitPOperator;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.metadata.declared.DatasetDataSource;
-import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -99,14 +97,9 @@
             primaryKeyLogicalVars.add(new LogicalVariable(varRefExpr.getVariableReference().getId()));
         }
 
-        //get JobId(TransactorId)
-        MetadataProvider mp = (MetadataProvider) context.getMetadataProvider();
-        JobId jobId = mp.getJobId();
-
         //create the logical and physical operator
         CommitOperator commitOperator = new CommitOperator(primaryKeyLogicalVars, isSink);
-        CommitPOperator commitPOperator =
-                new CommitPOperator(jobId, dataset, primaryKeyLogicalVars, isSink);
+        CommitPOperator commitPOperator = new CommitPOperator(dataset, primaryKeyLogicalVars, isSink);
         commitOperator.setPhysicalOperator(commitPOperator);
 
         //create ExtensionOperator and put the commitOperator in it.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
index 1e445e5..0c3de91 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/SimilarityCheckRule.java
@@ -183,8 +183,8 @@
         if (simCheckFuncExpr != null) {
             // Create a new assign under matchingAssign which assigns the result of our similarity-check function to a variable.
             LogicalVariable newVar = context.newVar();
-            AssignOperator newAssign = new AssignOperator(newVar,
-                    new MutableObject<ILogicalExpression>(simCheckFuncExpr));
+            AssignOperator newAssign =
+                    new AssignOperator(newVar, new MutableObject<ILogicalExpression>(simCheckFuncExpr));
             // Hook up inputs.
             newAssign.getInputs()
                     .add(new MutableObject<ILogicalOperator>(matchingAssign.getInputs().get(0).getValue()));
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
index 4550ba6..0d02385 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/UnnestToDataScanRule.java
@@ -18,52 +18,17 @@
  */
 package org.apache.asterix.optimizer.rules;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.asterix.common.config.DatasetConfig.DatasetType;
-import org.apache.asterix.external.feed.watch.FeedActivityDetails;
-import org.apache.asterix.external.util.ExternalDataUtils;
-import org.apache.asterix.external.util.FeedUtils;
-import org.apache.asterix.external.util.FeedUtils.FeedRuntimeType;
-import org.apache.asterix.metadata.declared.DataSource;
-import org.apache.asterix.metadata.declared.DataSourceId;
-import org.apache.asterix.metadata.declared.FeedDataSource;
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.metadata.entities.Dataset;
-import org.apache.asterix.metadata.entities.Dataverse;
-import org.apache.asterix.metadata.entities.Feed;
-import org.apache.asterix.metadata.entities.FeedConnection;
-import org.apache.asterix.metadata.entities.FeedPolicyEntity;
-import org.apache.asterix.metadata.entities.InternalDatasetDetails;
-import org.apache.asterix.metadata.feeds.BuiltinFeedPolicies;
-import org.apache.asterix.om.base.AString;
-import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.utils.ConstantExpressionUtil;
-import org.apache.asterix.optimizer.rules.util.EquivalenceClassUtils;
-import org.apache.asterix.translator.util.PlanTranslationUtil;
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
-import org.apache.hyracks.algebricks.core.algebra.properties.FunctionalDependency;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
 public class UnnestToDataScanRule implements IAlgebraicRewriteRule {
@@ -77,213 +42,24 @@
     @Override
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
             throws AlgebricksException {
+        AbstractFunctionCallExpression f = getFunctionCall(opRef);
+        if (f == null) {
+            return false;
+        }
+        return BuiltinFunctions.getDatasourceTransformer(f.getFunctionIdentifier()).rewrite(opRef, context);
+    }
+
+    public static AbstractFunctionCallExpression getFunctionCall(Mutable<ILogicalOperator> opRef) {
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
         if (op.getOperatorTag() != LogicalOperatorTag.UNNEST) {
-            return false;
+            return null;
         }
         UnnestOperator unnest = (UnnestOperator) op;
         ILogicalExpression unnestExpr = unnest.getExpressionRef().getValue();
         if (unnestExpr.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
-            return false;
-        }
-        return handleFunction(opRef, context, unnest, (AbstractFunctionCallExpression) unnestExpr);
-    }
-
-    protected boolean handleFunction(Mutable<ILogicalOperator> opRef, IOptimizationContext context,
-            UnnestOperator unnest, AbstractFunctionCallExpression f) throws AlgebricksException {
-        FunctionIdentifier fid = f.getFunctionIdentifier();
-        if (fid.equals(BuiltinFunctions.DATASET)) {
-            if (unnest.getPositionalVariable() != null) {
-                // TODO remove this after enabling the support of positional variables in data scan
-                throw new AlgebricksException("No positional variables are allowed over datasets.");
-            }
-            ILogicalExpression expr = f.getArguments().get(0).getValue();
-            if (expr.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
-                return false;
-            }
-            ConstantExpression ce = (ConstantExpression) expr;
-            IAlgebricksConstantValue acv = ce.getValue();
-            if (!(acv instanceof AsterixConstantValue)) {
-                return false;
-            }
-            AsterixConstantValue acv2 = (AsterixConstantValue) acv;
-            if (acv2.getObject().getType().getTypeTag() != ATypeTag.STRING) {
-                return false;
-            }
-            String datasetArg = ((AString) acv2.getObject()).getStringValue();
-            MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-            Pair<String, String> datasetReference = parseDatasetReference(metadataProvider, datasetArg);
-            String dataverseName = datasetReference.first;
-            String datasetName = datasetReference.second;
-            Dataset dataset = metadataProvider.findDataset(dataverseName, datasetName);
-            if (dataset == null) {
-                throw new AlgebricksException(
-                        "Could not find dataset " + datasetName + " in dataverse " + dataverseName);
-            }
-            DataSourceId asid = new DataSourceId(dataverseName, datasetName);
-            List<LogicalVariable> variables = new ArrayList<>();
-            if (dataset.getDatasetType() == DatasetType.INTERNAL) {
-                int numPrimaryKeys = dataset.getPrimaryKeys().size();
-                for (int i = 0; i < numPrimaryKeys; i++) {
-                    variables.add(context.newVar());
-                }
-            }
-            variables.add(unnest.getVariable());
-            DataSource dataSource = metadataProvider.findDataSource(asid);
-            boolean hasMeta = dataSource.hasMeta();
-            if (hasMeta) {
-                variables.add(context.newVar());
-            }
-            DataSourceScanOperator scan = new DataSourceScanOperator(variables, dataSource);
-            List<Mutable<ILogicalOperator>> scanInpList = scan.getInputs();
-            scanInpList.addAll(unnest.getInputs());
-            opRef.setValue(scan);
-            addPrimaryKey(variables, dataSource, context);
-            context.computeAndSetTypeEnvironmentForOperator(scan);
-            // Adds equivalence classes --- one equivalent class between a primary key
-            // variable and a record field-access expression.
-            IAType[] schemaTypes = dataSource.getSchemaTypes();
-            ARecordType recordType =
-                    (ARecordType) (hasMeta ? schemaTypes[schemaTypes.length - 2] : schemaTypes[schemaTypes.length - 1]);
-            ARecordType metaRecordType = (ARecordType) (hasMeta ? schemaTypes[schemaTypes.length - 1] : null);
-            EquivalenceClassUtils.addEquivalenceClassesForPrimaryIndexAccess(scan, variables, recordType,
-                    metaRecordType, dataset, context);
-            return true;
-        } else if (fid.equals(BuiltinFunctions.FEED_COLLECT)) {
-            if (unnest.getPositionalVariable() != null) {
-                throw new AlgebricksException("No positional variables are allowed over feeds.");
-            }
-            String dataverse = ConstantExpressionUtil.getStringArgument(f, 0);
-            String sourceFeedName = ConstantExpressionUtil.getStringArgument(f, 1);
-            String getTargetFeed = ConstantExpressionUtil.getStringArgument(f, 2);
-            String subscriptionLocation = ConstantExpressionUtil.getStringArgument(f, 3);
-            String targetDataset = ConstantExpressionUtil.getStringArgument(f, 4);
-            String outputType = ConstantExpressionUtil.getStringArgument(f, 5);
-            MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
-            DataSourceId asid = new DataSourceId(dataverse, getTargetFeed);
-            String policyName = metadataProvider.getConfig().get(FeedActivityDetails.FEED_POLICY_NAME);
-            FeedPolicyEntity policy = metadataProvider.findFeedPolicy(dataverse, policyName);
-            if (policy == null) {
-                policy = BuiltinFeedPolicies.getFeedPolicy(policyName);
-                if (policy == null) {
-                    throw new AlgebricksException("Unknown feed policy:" + policyName);
-                }
-            }
-            ArrayList<LogicalVariable> feedDataScanOutputVariables = new ArrayList<>();
-            String csLocations = metadataProvider.getConfig().get(FeedActivityDetails.COLLECT_LOCATIONS);
-            List<LogicalVariable> pkVars = new ArrayList<>();
-            FeedDataSource ds = createFeedDataSource(asid, targetDataset, sourceFeedName, subscriptionLocation,
-                    metadataProvider, policy, outputType, csLocations, unnest.getVariable(), context, pkVars);
-            // The order for feeds is <Record-Meta-PK>
-            feedDataScanOutputVariables.add(unnest.getVariable());
-            // Does it produce meta?
-            if (ds.hasMeta()) {
-                feedDataScanOutputVariables.add(context.newVar());
-            }
-            // Does it produce pk?
-            if (ds.isChange()) {
-                feedDataScanOutputVariables.addAll(pkVars);
-            }
-            DataSourceScanOperator scan = new DataSourceScanOperator(feedDataScanOutputVariables, ds);
-            List<Mutable<ILogicalOperator>> scanInpList = scan.getInputs();
-            scanInpList.addAll(unnest.getInputs());
-            opRef.setValue(scan);
-            context.computeAndSetTypeEnvironmentForOperator(scan);
-            return true;
-        }
-        return false;
-    }
-
-    private void addPrimaryKey(List<LogicalVariable> scanVariables, DataSource dataSource,
-            IOptimizationContext context) {
-        List<LogicalVariable> primaryKey = dataSource.getPrimaryKeyVariables(scanVariables);
-        List<LogicalVariable> tail = new ArrayList<>();
-        tail.addAll(scanVariables);
-        FunctionalDependency pk = new FunctionalDependency(primaryKey, tail);
-        context.addPrimaryKey(pk);
-    }
-
-    private FeedDataSource createFeedDataSource(DataSourceId aqlId, String targetDataset, String sourceFeedName,
-            String subscriptionLocation, MetadataProvider metadataProvider, FeedPolicyEntity feedPolicy,
-            String outputType, String locations, LogicalVariable recordVar, IOptimizationContext context,
-            List<LogicalVariable> pkVars) throws AlgebricksException {
-        if (!aqlId.getDataverseName().equals(metadataProvider.getDefaultDataverse() == null ? null
-                : metadataProvider.getDefaultDataverse().getDataverseName())) {
             return null;
         }
-        Dataset dataset = metadataProvider.findDataset(aqlId.getDataverseName(), targetDataset);
-        ARecordType feedOutputType = (ARecordType) metadataProvider.findType(aqlId.getDataverseName(), outputType);
-        Feed sourceFeed = metadataProvider.findFeed(aqlId.getDataverseName(), sourceFeedName);
-        FeedConnection feedConnection =
-                metadataProvider.findFeedConnection(aqlId.getDataverseName(), sourceFeedName, targetDataset);
-        ARecordType metaType = null;
-        // Does dataset have meta?
-        if (dataset.hasMetaPart()) {
-            String metaTypeName = FeedUtils.getFeedMetaTypeName(sourceFeed.getAdapterConfiguration());
-            if (metaTypeName == null) {
-                throw new AlgebricksException("Feed to a dataset with metadata doesn't have meta type specified");
-            }
-            String dataverseName = aqlId.getDataverseName();
-            if (metaTypeName.contains(".")) {
-                dataverseName = metaTypeName.substring(0, metaTypeName.indexOf('.'));
-                metaTypeName = metaTypeName.substring(metaTypeName.indexOf('.') + 1);
-            }
-            metaType = (ARecordType) metadataProvider.findType(dataverseName, metaTypeName);
-        }
-        // Is a change feed?
-        List<IAType> pkTypes = null;
-        List<List<String>> partitioningKeys = null;
-        List<Integer> keySourceIndicator = null;
-        List<Mutable<ILogicalExpression>> keyAccessExpression = null;
-        List<ScalarFunctionCallExpression> keyAccessScalarFunctionCallExpression;
-        if (ExternalDataUtils.isChangeFeed(sourceFeed.getAdapterConfiguration())) {
-            keyAccessExpression = new ArrayList<>();
-            keyAccessScalarFunctionCallExpression = new ArrayList<>();
-            pkTypes = ((InternalDatasetDetails) dataset.getDatasetDetails()).getPrimaryKeyType();
-            partitioningKeys = ((InternalDatasetDetails) dataset.getDatasetDetails()).getPartitioningKey();
-            if (dataset.hasMetaPart()) {
-                keySourceIndicator = ((InternalDatasetDetails) dataset.getDatasetDetails()).getKeySourceIndicator();
-            }
-            for (int i = 0; i < partitioningKeys.size(); i++) {
-                List<String> key = partitioningKeys.get(i);
-                if (keySourceIndicator == null || keySourceIndicator.get(i).intValue() == 0) {
-                    PlanTranslationUtil.prepareVarAndExpression(key, recordVar, pkVars, keyAccessExpression, null,
-                            context);
-                } else {
-                    PlanTranslationUtil.prepareMetaKeyAccessExpression(key, recordVar, keyAccessExpression, pkVars,
-                            null, context);
-                }
-            }
-            keyAccessExpression.forEach(
-                    expr -> keyAccessScalarFunctionCallExpression.add((ScalarFunctionCallExpression) expr.getValue()));
-        } else {
-            keyAccessExpression = null;
-            keyAccessScalarFunctionCallExpression = null;
-        }
-        FeedDataSource feedDataSource = new FeedDataSource((MetadataProvider) context.getMetadataProvider(), sourceFeed,
-                aqlId, targetDataset, feedOutputType, metaType, pkTypes, keyAccessScalarFunctionCallExpression,
-                sourceFeed.getFeedId(), FeedRuntimeType.valueOf(subscriptionLocation), locations.split(","),
-                context.getComputationNodeDomain(), feedConnection);
-        feedDataSource.getProperties().put(BuiltinFeedPolicies.CONFIG_FEED_POLICY_KEY, feedPolicy);
-        return feedDataSource;
+        return (AbstractFunctionCallExpression) unnestExpr;
     }
 
-    private Pair<String, String> parseDatasetReference(MetadataProvider metadataProvider, String datasetArg)
-            throws AlgebricksException {
-        String[] datasetNameComponents = datasetArg.split("\\.");
-        String dataverseName;
-        String datasetName;
-        if (datasetNameComponents.length == 1) {
-            Dataverse defaultDataverse = metadataProvider.getDefaultDataverse();
-            if (defaultDataverse == null) {
-                throw new AlgebricksException("Unresolved dataset " + datasetArg + " Dataverse not specified.");
-            }
-            dataverseName = defaultDataverse.getDataverseName();
-            datasetName = datasetNameComponents[0];
-        } else {
-            dataverseName = datasetNameComponents[0];
-            datasetName = datasetNameComponents[1];
-        }
-        return new Pair<>(dataverseName, datasetName);
-    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
index bed5c7f..e0c6249 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AbstractIntroduceAccessMethodRule.java
@@ -22,9 +22,11 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.dataflow.data.common.ExpressionTypeComputer;
@@ -62,6 +64,8 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
+import org.apache.hyracks.algebricks.core.algebra.typing.ITypingContext;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
 import com.google.common.collect.ImmutableSet;
@@ -111,6 +115,25 @@
     protected void fillSubTreeIndexExprs(OptimizableOperatorSubTree subTree,
             Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs, IOptimizationContext context)
             throws AlgebricksException {
+        fillSubTreeIndexExprs(subTree, analyzedAMs, context, false);
+    }
+
+    /**
+     * Fills the information about the given optimizable function expressions using the subtree.
+     *
+     * @param subTree
+     * @param analyzedAMs
+     * @param context
+     * @param isArbitraryFormOfSubtree
+     *            if the given subtree is in an arbitrary form that OptimizableSubTree class can't initialize, we try
+     *            to fill the field type of each variable that is used in the optimizable function expressions.
+     *            This way, an index-nested-loop-join transformation can be conducted properly since the transformation
+     *            process skips an optimzable function expression if the field type of one of its variable is unknown.
+     * @throws AlgebricksException
+     */
+    protected void fillSubTreeIndexExprs(OptimizableOperatorSubTree subTree,
+            Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs, IOptimizationContext context,
+            boolean isArbitraryFormOfSubtree) throws AlgebricksException {
         Iterator<Map.Entry<IAccessMethod, AccessMethodAnalysisContext>> amIt = analyzedAMs.entrySet().iterator();
         // Check applicability of indexes by access method type.
         while (amIt.hasNext()) {
@@ -118,7 +141,36 @@
             AccessMethodAnalysisContext amCtx = entry.getValue();
             // For the current access method type, map variables to applicable
             // indexes.
-            fillAllIndexExprs(subTree, amCtx, context);
+            if (!isArbitraryFormOfSubtree) {
+                fillAllIndexExprs(subTree, amCtx, context);
+            } else {
+                fillVarFieldTypeForOptFuncExprs(subTree, amCtx, context);
+            }
+        }
+    }
+
+    /**
+     * Sets the subtree and the field type for the variables in the given function expression.
+     * This method is only used for an arbitrary form of the probe-subtree in a join.
+     */
+    protected void fillVarFieldTypeForOptFuncExprs(OptimizableOperatorSubTree subTree,
+            AccessMethodAnalysisContext analysisCtx, ITypingContext context) throws AlgebricksException {
+        ILogicalOperator rootOp = subTree.getRoot();
+        IVariableTypeEnvironment envSubtree = context.getOutputTypeEnvironment(rootOp);
+        Set<LogicalVariable> liveVarsAtRootOp = new HashSet<LogicalVariable>();
+        VariableUtilities.getLiveVariables(rootOp, liveVarsAtRootOp);
+
+        // For each optimizable function expression, applies the field type of each variable.
+        for (IOptimizableFuncExpr optFuncExpr : analysisCtx.getMatchedFuncExprs()) {
+            for (LogicalVariable var : liveVarsAtRootOp) {
+                int optVarIndex = optFuncExpr.findLogicalVar(var);
+                if (optVarIndex < 0) {
+                    continue;
+                }
+                optFuncExpr.setOptimizableSubTree(optVarIndex, subTree);
+                IAType fieldType = (IAType) envSubtree.getVarType(var);
+                optFuncExpr.setFieldType(optVarIndex, fieldType);
+            }
         }
     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
index fcc2d8b..10630a5 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/AccessMethodUtils.java
@@ -27,7 +27,6 @@
 import org.apache.asterix.algebra.operators.physical.ExternalDataLookupPOperator;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.external.indexing.IndexingConstants;
@@ -313,11 +312,7 @@
         // Primary keys.
         if (dataset.getDatasetType() == DatasetType.EXTERNAL) {
             //add primary keys
-            try {
-                appendExternalRecPrimaryKeys(dataset, dest);
-            } catch (AsterixException e) {
-                throw new AlgebricksException(e);
-            }
+            appendExternalRecPrimaryKeys(dataset, dest);
         } else {
             dest.addAll(KeyFieldTypeUtil.getPartitoningKeyTypes(dataset, recordType, metaRecordType));
         }
@@ -675,7 +670,7 @@
         target.add(itemType);
     }
 
-    private static void appendExternalRecPrimaryKeys(Dataset dataset, List<Object> target) throws AsterixException {
+    private static void appendExternalRecPrimaryKeys(Dataset dataset, List<Object> target) throws AlgebricksException {
         int numPrimaryKeys =
                 IndexingConstants.getRIDSize(((ExternalDatasetDetails) dataset.getDatasetDetails()).getProperties());
         for (int i = 0; i < numPrimaryKeys; i++) {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
index ddc93f8..1f4676c 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -87,12 +87,8 @@
     }
 
     private static final List<FunctionIdentifier> FUNC_IDENTIFIERS =
-            Collections.unmodifiableList(Arrays.asList(
-                    AlgebricksBuiltinFunctions.EQ,
-                    AlgebricksBuiltinFunctions.LE,
-                    AlgebricksBuiltinFunctions.GE,
-                    AlgebricksBuiltinFunctions.LT,
-                    AlgebricksBuiltinFunctions.GT));
+            Collections.unmodifiableList(Arrays.asList(AlgebricksBuiltinFunctions.EQ, AlgebricksBuiltinFunctions.LE,
+                    AlgebricksBuiltinFunctions.GE, AlgebricksBuiltinFunctions.LT, AlgebricksBuiltinFunctions.GT));
 
     public static final BTreeAccessMethod INSTANCE = new BTreeAccessMethod();
 
@@ -105,9 +101,8 @@
     public boolean analyzeFuncExprArgsAndUpdateAnalysisCtx(AbstractFunctionCallExpression funcExpr,
             List<AbstractLogicalOperator> assignsAndUnnests, AccessMethodAnalysisContext analysisCtx,
             IOptimizationContext context, IVariableTypeEnvironment typeEnvironment) throws AlgebricksException {
-        boolean matches =
-                AccessMethodUtils.analyzeFuncExprArgsForOneConstAndVarAndUpdateAnalysisCtx(
-                        funcExpr, analysisCtx, context, typeEnvironment);
+        boolean matches = AccessMethodUtils.analyzeFuncExprArgsForOneConstAndVarAndUpdateAnalysisCtx(funcExpr,
+                analysisCtx, context, typeEnvironment);
         if (!matches) {
             matches = AccessMethodUtils.analyzeFuncExprArgsForTwoVarsAndUpdateAnalysisCtx(funcExpr, analysisCtx);
         }
@@ -131,13 +126,13 @@
         SelectOperator select = (SelectOperator) selectRef.getValue();
         Mutable<ILogicalExpression> conditionRef = select.getCondition();
 
-        ILogicalOperator primaryIndexUnnestOp = createSecondaryToPrimaryPlan(conditionRef, subTree, null, chosenIndex,
-                analysisCtx,
-                AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(), subTree.getDataSourceRef().getValue(),
-                        afterSelectRefs),
-                false, subTree.getDataSourceRef().getValue().getInputs().get(0).getValue()
-                        .getExecutionMode() == ExecutionMode.UNPARTITIONED,
-                context);
+        ILogicalOperator primaryIndexUnnestOp =
+                createSecondaryToPrimaryPlan(conditionRef, subTree, null, chosenIndex, analysisCtx,
+                        AccessMethodUtils.retainInputs(subTree.getDataSourceVariables(),
+                                subTree.getDataSourceRef().getValue(), afterSelectRefs),
+                        false, subTree.getDataSourceRef().getValue().getInputs().get(0).getValue()
+                                .getExecutionMode() == ExecutionMode.UNPARTITIONED,
+                        context);
 
         if (primaryIndexUnnestOp == null) {
             return false;
@@ -416,22 +411,21 @@
             return null;
         }
 
-        // If the select condition contains mixed open/closed intervals on multiple keys, then we make all intervals
-        // closed to obtain a superset of answers and leave the original selection in place.
+        // if we have composite search keys, we should always need a post-processing to ensure the correctness
+        // of search results because of the way a BTree is searched, unless only the last key is a range search.
+        // During a BTree search, we iterate from the start index
+        // (based on the low keys) to the end index (based on the high keys). During the iteration,
+        // we can encounter a lot of false positives
         boolean primaryIndexPostProccessingIsNeeded = false;
-        for (int i = 1; i < numSecondaryKeys; ++i) {
-            if (lowKeyInclusive[i] != lowKeyInclusive[0]) {
-                Arrays.fill(lowKeyInclusive, true);
+        for (int i = 0; i < numSecondaryKeys - 1; i++) {
+            if (!LimitType.EQUAL.equals(lowKeyLimits[i]) || !LimitType.EQUAL.equals(highKeyLimits[i])) {
                 primaryIndexPostProccessingIsNeeded = true;
-                break;
             }
         }
-        for (int i = 1; i < numSecondaryKeys; ++i) {
-            if (highKeyInclusive[i] != highKeyInclusive[0]) {
-                Arrays.fill(highKeyInclusive, true);
-                primaryIndexPostProccessingIsNeeded = true;
-                break;
-            }
+
+        if (primaryIndexPostProccessingIsNeeded) {
+            Arrays.fill(lowKeyInclusive, true);
+            Arrays.fill(highKeyInclusive, true);
         }
 
         // determine cases when prefix search could be applied
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
index 1a7ccbd..1171ae5 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceJoinAccessMethodRule.java
@@ -241,6 +241,15 @@
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
         boolean joinFoundAndOptimizationApplied;
 
+        // Recursively check the plan and try to optimize it. We first check the children of the given operator
+        // to make sure an earlier join in the path is optimized first.
+        for (Mutable<ILogicalOperator> inputOpRef : op.getInputs()) {
+            joinFoundAndOptimizationApplied = checkAndApplyJoinTransformation(inputOpRef, context);
+            if (joinFoundAndOptimizationApplied) {
+                return true;
+            }
+        }
+
         // Check the current operator pattern to see whether it is a JOIN or not.
         boolean isThisOpInnerJoin = isInnerJoin(op);
         boolean isThisOpLeftOuterJoin = isLeftOuterJoin(op);
@@ -264,15 +273,6 @@
             joinOpFromThisOp = (LeftOuterJoinOperator) joinRefFromThisOp.getValue();
         }
 
-        // Recursively check the plan and try to optimize it. We first check the children of the given operator
-        // to make sure an earlier join in the path is optimized first.
-        for (Mutable<ILogicalOperator> inputOpRef : op.getInputs()) {
-            joinFoundAndOptimizationApplied = checkAndApplyJoinTransformation(inputOpRef, context);
-            if (joinFoundAndOptimizationApplied) {
-                return true;
-            }
-        }
-
         // For a JOIN case, try to transform the given plan.
         if (isThisOpInnerJoin || isThisOpLeftOuterJoin) {
             // Restore the information from this operator since it might have been be set to null
@@ -333,6 +333,8 @@
                 // Then find the applicable indexes for the variables used in the JOIN condition.
                 if (checkLeftSubTreeMetadata) {
                     fillSubTreeIndexExprs(leftSubTree, analyzedAMs, context);
+                } else {
+                    fillSubTreeIndexExprs(leftSubTree, analyzedAMs, context, true);
                 }
                 fillSubTreeIndexExprs(rightSubTree, analyzedAMs, context);
 
@@ -359,8 +361,8 @@
                     // in GroupByOp.
                     if (isThisOpLeftOuterJoin && isParentOpGroupBy) {
                         analysisCtx.setLOJGroupbyOpRef(opRef);
-                        ScalarFunctionCallExpression isNullFuncExpr = AccessMethodUtils
-                                .findLOJIsMissingFuncInGroupBy((GroupByOperator) opRef.getValue());
+                        ScalarFunctionCallExpression isNullFuncExpr =
+                                AccessMethodUtils.findLOJIsMissingFuncInGroupBy((GroupByOperator) opRef.getValue());
                         analysisCtx.setLOJIsNullFuncInGroupBy(isNullFuncExpr);
                     }
 
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
index 95f0de9..546652b 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceLSMComponentFilterRule.java
@@ -24,7 +24,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Queue;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.exceptions.CompilationException;
@@ -69,8 +68,6 @@
 
 public class IntroduceLSMComponentFilterRule implements IAlgebraicRewriteRule {
 
-    static final Logger LOGGER = Logger.getLogger(IntroduceLSMComponentFilterRule.class.getName());
-
     protected IVariableTypeEnvironment typeEnvironment = null;
 
     @Override
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroducePrimaryIndexForAggregationRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroducePrimaryIndexForAggregationRule.java
new file mode 100644
index 0000000..7b8b906
--- /dev/null
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroducePrimaryIndexForAggregationRule.java
@@ -0,0 +1,324 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.optimizer.rules.am;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.asterix.common.config.DatasetConfig;
+import org.apache.asterix.metadata.declared.DataSource;
+import org.apache.asterix.metadata.declared.DatasetDataSource;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.utils.ConstantExpressionUtil;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.commons.lang3.mutable.MutableObject;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractUnnestMapOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
+import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
+import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
+
+/**
+ * Pattern to match in the plan:
+ * ...
+ * ^
+ * |
+ * aggregate operator (local)
+ * ^
+ * |
+ * (assign operator)?
+ * ^
+ * |
+ * datasource scan operator OR unnest map operator using the dataset (when WHERE exists on PK)
+ * ^
+ * |
+ * ...
+ *
+ *
+ * The plan is transformed into:
+ * ...
+ * ^
+ * |
+ * aggregate operator (local)
+ * ^
+ * |
+ * (assign operator)?
+ * ^
+ * |
+ * unnest map operator over the primary index
+ * ^
+ * |
+ * ...
+ * This rule optimizes aggregation queries involving only PKs. It uses the primary index, if present.
+ * The primary index is a BTree index that only stores PKs. Therefore, if an aggregation query can be answered by
+ * only the PKs, this rule will be fired to use the primary index instead of doing a scan/range search over the dataset.
+ */
+public class IntroducePrimaryIndexForAggregationRule implements IAlgebraicRewriteRule {
+    private final List<Mutable<ILogicalOperator>> parents;
+
+    public IntroducePrimaryIndexForAggregationRule() {
+        parents = new ArrayList<>();
+    }
+
+    @Override
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
+        parents.add(opRef);
+        return false;
+    }
+
+    @Override
+    public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
+        // remove yourself
+        parents.remove(parents.size() - 1);
+        // already fired this rule on this operator?
+        if (context.checkIfInDontApplySet(this, opRef.getValue())) {
+            return false;
+        }
+        /* only interested in local aggregate operator */
+        if (opRef.getValue().getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
+            return false;
+        }
+        AggregateOperator localAggregateOperator = (AggregateOperator) opRef.getValue();
+        if (localAggregateOperator.isGlobal()) {
+            return false;
+        }
+        context.addToDontApplySet(this, opRef.getValue());
+        // find the data scan or unnest map
+        Pair<Mutable<ILogicalOperator>, Mutable<ILogicalOperator>> scanAndAssignOpRef =
+                findScanAndAssignOperator(localAggregateOperator, context.getMetadataProvider());
+        if (scanAndAssignOpRef == null) {
+            return false;
+        }
+        // find its primary index and replace datascan
+        boolean transformed = replaceDatascan(localAggregateOperator, scanAndAssignOpRef, context);
+        if (transformed) {
+            OperatorPropertiesUtil.typeOpRec(opRef, context);
+        }
+        return transformed;
+    }
+
+    private Pair<Mutable<ILogicalOperator>, Mutable<ILogicalOperator>> findScanAndAssignOperator(
+            ILogicalOperator localAggregateOperator, IMetadataProvider metadataProvider) throws AlgebricksException {
+        Mutable<ILogicalOperator> scanOpRef = localAggregateOperator.getInputs().get(0);
+        Mutable<ILogicalOperator> assignOpRef = null;
+        // assign operator may or may not exist
+        if (scanOpRef.getValue().getOperatorTag() == LogicalOperatorTag.ASSIGN) {
+            AssignOperator assignOperator = (AssignOperator) scanOpRef.getValue();
+            assignOpRef = new MutableObject<>(assignOperator);
+            scanOpRef = scanOpRef.getValue().getInputs().get(0);
+        }
+        // next operator must be datascan or unnest map using the dataset
+        if (scanOpRef.getValue().getOperatorTag() != LogicalOperatorTag.DATASOURCESCAN
+                && scanOpRef.getValue().getOperatorTag() != LogicalOperatorTag.UNNEST_MAP) {
+            return null;
+        }
+        if (scanOpRef.getValue().getOperatorTag() == LogicalOperatorTag.UNNEST_MAP) {
+            // for unnest_map, check the index used is the primary index
+            UnnestMapOperator unnestMapOperator = (UnnestMapOperator) scanOpRef.getValue();
+            ILogicalExpression logicalExpression = unnestMapOperator.getExpressionRef().getValue();
+            if (logicalExpression.getExpressionTag() != LogicalExpressionTag.FUNCTION_CALL) {
+                return null;
+            }
+            AbstractFunctionCallExpression functionCallExpression = (AbstractFunctionCallExpression) logicalExpression;
+            if (functionCallExpression.getFunctionIdentifier() != BuiltinFunctions.INDEX_SEARCH) {
+                return null;
+            }
+            String indexName = ConstantExpressionUtil.getStringArgument(functionCallExpression, 0);
+            String dataverseName = ConstantExpressionUtil.getStringArgument(functionCallExpression, 2);
+            String datasetName = ConstantExpressionUtil.getStringArgument(functionCallExpression, 3);
+            Index index = ((MetadataProvider) metadataProvider).getIndex(dataverseName, datasetName, indexName);
+            if (!index.isPrimaryIndex()) {
+                return null;
+            }
+        }
+        return Pair.of(scanOpRef, assignOpRef);
+    }
+
+    private boolean replaceDatascan(AggregateOperator localAggregateOperator,
+            Pair<Mutable<ILogicalOperator>, Mutable<ILogicalOperator>> scanAndAssignOpRef, IOptimizationContext context)
+            throws AlgebricksException {
+        /* find the primary index */
+        Mutable<ILogicalOperator> scanOperatorRef = scanAndAssignOpRef.getLeft();
+        Mutable<ILogicalOperator> assignOperatorRef = scanAndAssignOpRef.getRight();
+        AbstractScanOperator scanOperator = (AbstractScanOperator) scanOperatorRef.getValue();
+        BTreeJobGenParams originalBTreeParameters = new BTreeJobGenParams();
+        Pair<Dataset, Index> datasetAndIndex =
+                findDatasetAndSecondaryPrimaryIndex(scanOperator, originalBTreeParameters, context);
+        if (datasetAndIndex == null) {
+            return false;
+        }
+        Dataset dataset = datasetAndIndex.getLeft();
+        Index primaryIndex = datasetAndIndex.getRight();
+        /////// replace the operator. prepare the parameters of the BTree of the new unnestmap operator ///////
+        if (dataset.getDatasetType() == DatasetConfig.DatasetType.INTERNAL) {
+            /////// check usage of variables produced by scan operator in parents ///////
+            Set<LogicalVariable> variablesProducedByScanOp = getVariablesProducedByScanOp(scanOperator,
+                    dataset.getPrimaryKeys().size(), scanOperator.getVariables().size());
+            boolean variablesAreUsed =
+                    scanOperatorVariablesAreUsed(localAggregateOperator, assignOperatorRef, variablesProducedByScanOp);
+            if (variablesAreUsed) {
+                return false;
+            }
+            /////// initialize the secondary primary BTree parameters ///////
+            boolean retainInput;
+            BTreeJobGenParams newBTreeParameters;
+            if (scanOperator.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) {
+                retainInput = AccessMethodUtils.retainInputs(scanOperator.getVariables(), scanOperator, parents);
+                newBTreeParameters = new BTreeJobGenParams(primaryIndex.getIndexName(), DatasetConfig.IndexType.BTREE,
+                        dataset.getDataverseName(), dataset.getDatasetName(), retainInput,
+                        scanOperator.getInputs().get(0).getValue()
+                                .getExecutionMode() == AbstractLogicalOperator.ExecutionMode.UNPARTITIONED);
+                List<LogicalVariable> empty = new ArrayList<>();
+                newBTreeParameters.setLowKeyInclusive(true);
+                newBTreeParameters.setHighKeyInclusive(true);
+                newBTreeParameters.setIsEqCondition(false);
+                newBTreeParameters.setLowKeyVarList(empty, 0, 0);
+                newBTreeParameters.setHighKeyVarList(empty, 0, 0);
+            } else {
+                retainInput = originalBTreeParameters.getRetainInput();
+                newBTreeParameters = new BTreeJobGenParams(primaryIndex.getIndexName(), DatasetConfig.IndexType.BTREE,
+                        dataset.getDataverseName(), dataset.getDatasetName(), retainInput,
+                        originalBTreeParameters.getRequiresBroadcast());
+                newBTreeParameters.setLowKeyInclusive(originalBTreeParameters.isLowKeyInclusive());
+                newBTreeParameters.setHighKeyInclusive(originalBTreeParameters.isHighKeyInclusive());
+                newBTreeParameters.setIsEqCondition(originalBTreeParameters.isEqCondition());
+                newBTreeParameters.setLowKeyVarList(originalBTreeParameters.getLowKeyVarList(), 0,
+                        originalBTreeParameters.getLowKeyVarList().size());
+                newBTreeParameters.setHighKeyVarList(originalBTreeParameters.getHighKeyVarList(), 0,
+                        originalBTreeParameters.getHighKeyVarList().size());
+            }
+            ARecordType recordType = (ARecordType) ((MetadataProvider) context.getMetadataProvider()).findType(dataset);
+            ARecordType metaRecordType =
+                    (ARecordType) ((MetadataProvider) context.getMetadataProvider()).findMetaType(dataset);
+            // create the operator that will replace the dataset scan/search
+            AbstractUnnestMapOperator primaryIndexUnnestOperator =
+                    (AbstractUnnestMapOperator) AccessMethodUtils.createSecondaryIndexUnnestMap(dataset, recordType,
+                            metaRecordType, primaryIndex, scanOperator.getInputs().get(0).getValue(),
+                            newBTreeParameters, context, true, retainInput, false);
+
+            // re-use the PK variables of the original scan operator
+            primaryIndexUnnestOperator.getVariables().clear();
+            for (int i = 0; i < dataset.getPrimaryKeys().size(); i++) {
+                primaryIndexUnnestOperator.getVariables().add(scanOperator.getVariables().get(i));
+            }
+            // now replace
+            scanOperatorRef.setValue(primaryIndexUnnestOperator);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns null if there is no primary index defined on the dataset
+     * @param scanOperator Scan or unnest-map operator
+     * @param originalBTreeParameters The BTree parameters if the operator is unnest-map
+     * @param context Needed to get the metadata provider and ask for the index
+     * @return The dataset and its primary index
+     * @throws AlgebricksException when there is a problem getting the dataset or its indexes from the metadata
+     */
+    private Pair<Dataset, Index> findDatasetAndSecondaryPrimaryIndex(AbstractScanOperator scanOperator,
+            BTreeJobGenParams originalBTreeParameters, IOptimizationContext context) throws AlgebricksException {
+        // #1. get the dataset
+        Dataset dataset;
+        // case 1: dataset scan
+        if (scanOperator.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) {
+            DataSourceScanOperator dss = (DataSourceScanOperator) scanOperator;
+            DataSource ds = (DataSource) dss.getDataSource();
+            if (ds.getDatasourceType() != DataSource.Type.INTERNAL_DATASET) {
+                return null;
+            }
+            dataset = ((DatasetDataSource) ds).getDataset();
+        } else {
+            // case 2: dataset range search
+            AbstractFunctionCallExpression primaryIndexFunctionCall =
+                    (AbstractFunctionCallExpression) ((UnnestMapOperator) scanOperator).getExpressionRef().getValue();
+            originalBTreeParameters.readFromFuncArgs(primaryIndexFunctionCall.getArguments());
+            if (originalBTreeParameters.isEqCondition()) {
+                return null;
+            }
+            dataset = ((MetadataProvider) context.getMetadataProvider())
+                    .findDataset(originalBTreeParameters.getDataverseName(), originalBTreeParameters.getDatasetName());
+        }
+        // #2. get all indexes and look for the primary one
+        List<Index> indexes = ((MetadataProvider) context.getMetadataProvider())
+                .getDatasetIndexes(dataset.getDataverseName(), dataset.getDatasetName());
+        for (Index index : indexes) {
+            if (index.getKeyFieldNames().isEmpty()) {
+                return Pair.of(dataset, index);
+            }
+        }
+        return null;
+    }
+
+    private Set<LogicalVariable> getVariablesProducedByScanOp(AbstractScanOperator scanOperator, int startPosition,
+            int endPosition) {
+        Set<LogicalVariable> variableSet = new HashSet<>();
+        // starting after PK, collect the produced variables
+        for (int i = startPosition; i < endPosition; i++) {
+            variableSet.add(scanOperator.getVariables().get(i));
+        }
+        return variableSet;
+    }
+
+    private boolean scanOperatorVariablesAreUsed(AggregateOperator localAggregateOperator,
+            Mutable<ILogicalOperator> assignOperatorRef, Set<LogicalVariable> variablesProducedByScanOp)
+            throws AlgebricksException {
+        // collect variables used by parents operators
+        Set<LogicalVariable> variablesUsedByParents = new HashSet<>();
+        for (Mutable<ILogicalOperator> parent : parents) {
+            VariableUtilities.getUsedVariables(parent.getValue(), variablesUsedByParents);
+        }
+        // collect variables used by local aggregate operator
+        VariableUtilities.getUsedVariables(localAggregateOperator, variablesUsedByParents);
+        // collect variables used by assign operator, if exists
+        if (assignOperatorRef != null) {
+            VariableUtilities.getUsedVariables(assignOperatorRef.getValue(), variablesUsedByParents);
+        }
+        // checking...
+        for (LogicalVariable producedVariable : variablesProducedByScanOp) {
+            if (variablesUsedByParents.contains(producedVariable)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
index d95b278..d0e973f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/IntroduceSelectAccessMethodRule.java
@@ -177,8 +177,8 @@
             Map<IAccessMethod, AccessMethodAnalysisContext> analyzedAMs, IOptimizationContext context)
             throws AlgebricksException {
         Pair<IAccessMethod, Index> chosenIndex = null;
-        Optional<Pair<IAccessMethod, Index>> primaryIndex = chosenIndexes.stream()
-                .filter(pair -> pair.second.isPrimaryIndex()).findFirst();
+        Optional<Pair<IAccessMethod, Index>> primaryIndex =
+                chosenIndexes.stream().filter(pair -> pair.second.isPrimaryIndex()).findFirst();
         if (chosenIndexes.size() == 1) {
             chosenIndex = chosenIndexes.get(0);
         } else if (primaryIndex.isPresent()) {
@@ -235,8 +235,8 @@
                     throw new AlgebricksException(
                             "The order by expression should be variables, but they aren't variables.");
                 }
-                VariableReferenceExpression orderedVar = (VariableReferenceExpression) orderExpression.second
-                        .getValue();
+                VariableReferenceExpression orderedVar =
+                        (VariableReferenceExpression) orderExpression.second.getValue();
                 orderedColumn.add(orderedVar.getVariableReference());
             }
             inputVars.add(orderedColumn);
@@ -373,7 +373,6 @@
 
     }
 
-
     @Override
     public Map<FunctionIdentifier, List<IAccessMethod>> getAccessMethods() {
         return accessMethods;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
index 8e09164..1c7330a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/InvertedIndexAccessMethod.java
@@ -156,7 +156,7 @@
 
     public boolean analyzeGetItemFuncExpr(AbstractFunctionCallExpression funcExpr,
             List<AbstractLogicalOperator> assignsAndUnnests, AccessMethodAnalysisContext analysisCtx)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         if (funcExpr.getFunctionIdentifier() != BuiltinFunctions.GET_ITEM) {
             return false;
         }
@@ -213,8 +213,8 @@
                         if (unnestFuncExpr.getFunctionIdentifier() != BuiltinFunctions.SCAN_COLLECTION) {
                             return false;
                         }
-                        matchedFuncExpr = (AbstractFunctionCallExpression) unnestFuncExpr.getArguments().get(0)
-                                .getValue();
+                        matchedFuncExpr =
+                                (AbstractFunctionCallExpression) unnestFuncExpr.getArguments().get(0).getValue();
                     }
                 }
                 // We've already found a match.
@@ -254,13 +254,13 @@
                 || arg2.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
             return false;
         }
-        LogicalVariable fieldVarExpr1 = getNonConstArgFieldExprPair(arg1, funcExpr, assignsAndUnnests,
-                matchedAssignOrUnnestIndex);
+        LogicalVariable fieldVarExpr1 =
+                getNonConstArgFieldExprPair(arg1, funcExpr, assignsAndUnnests, matchedAssignOrUnnestIndex);
         if (fieldVarExpr1 == null) {
             return false;
         }
-        LogicalVariable fieldVarExpr2 = getNonConstArgFieldExprPair(arg2, funcExpr, assignsAndUnnests,
-                matchedAssignOrUnnestIndex);
+        LogicalVariable fieldVarExpr2 =
+                getNonConstArgFieldExprPair(arg2, funcExpr, assignsAndUnnests, matchedAssignOrUnnestIndex);
         if (fieldVarExpr2 == null) {
             return false;
         }
@@ -307,8 +307,8 @@
         } else {
             return false;
         }
-        LogicalVariable fieldVarExpr = getNonConstArgFieldExprPair(nonConstArg, funcExpr, assignsAndUnnests,
-                matchedAssignOrUnnestIndex);
+        LogicalVariable fieldVarExpr =
+                getNonConstArgFieldExprPair(nonConstArg, funcExpr, assignsAndUnnests, matchedAssignOrUnnestIndex);
         if (fieldVarExpr == null) {
             return false;
         }
@@ -388,9 +388,9 @@
         // we made sure indexSubTree has datasource scan
         DataSourceScanOperator dataSourceScan = (DataSourceScanOperator) indexSubTree.getDataSourceRef().getValue();
 
-        InvertedIndexJobGenParams jobGenParams = new InvertedIndexJobGenParams(chosenIndex.getIndexName(),
-                chosenIndex.getIndexType(), dataset.getDataverseName(), dataset.getDatasetName(), retainInput,
-                requiresBroadcast);
+        InvertedIndexJobGenParams jobGenParams =
+                new InvertedIndexJobGenParams(chosenIndex.getIndexName(), chosenIndex.getIndexType(),
+                        dataset.getDataverseName(), dataset.getDatasetName(), retainInput, requiresBroadcast);
         // Add function-specific args such as search modifier, and possibly a similarity threshold.
         addFunctionSpecificArgs(optFuncExpr, jobGenParams);
         // Add the type of search key from the optFuncExpr.
@@ -424,9 +424,9 @@
                 metaRecordType, chosenIndex, inputOp, jobGenParams, context, true, retainInput, retainNull);
 
         // Generate the rest of the upstream plan which feeds the search results into the primary index.
-        AbstractUnnestMapOperator primaryIndexUnnestOp = AccessMethodUtils.createPrimaryIndexUnnestMap(dataSourceScan,
-                dataset, recordType, metaRecordType, secondaryIndexUnnestOp, context, true, retainInput, retainNull,
-                false);
+        AbstractUnnestMapOperator primaryIndexUnnestOp =
+                AccessMethodUtils.createPrimaryIndexUnnestMap(dataSourceScan, dataset, recordType, metaRecordType,
+                        secondaryIndexUnnestOp, context, true, retainInput, retainNull, false);
 
         return primaryIndexUnnestOp;
     }
@@ -526,8 +526,7 @@
         Mutable<ILogicalOperator> panicJoinRef = null;
         Map<LogicalVariable, LogicalVariable> panicVarMap = null;
         if (optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CHECK
-                || optFuncExpr.getFuncExpr()
-                        .getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
+                || optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
             panicJoinRef = new MutableObject<>(joinRef.getValue());
             panicVarMap = new HashMap<>();
             Mutable<ILogicalOperator> newProbeRootRef = createPanicNestedLoopJoinPlan(panicJoinRef, indexSubTree,
@@ -577,8 +576,8 @@
         // Place a top-level equi-join on top to retrieve the missing variables from the original probe subtree.
         // The inner (build) branch of the join is the subtree with the data scan, since the result of the similarity join could potentially be big.
         // This choice may not always be the most efficient, but it seems more robust than the alternative.
-        Mutable<ILogicalExpression> eqJoinConditionRef = createPrimaryKeysEqJoinCondition(originalSubTreePKs,
-                surrogateSubTreePKs);
+        Mutable<ILogicalExpression> eqJoinConditionRef =
+                createPrimaryKeysEqJoinCondition(originalSubTreePKs, surrogateSubTreePKs);
         InnerJoinOperator topEqJoin = new InnerJoinOperator(eqJoinConditionRef, originalProbeSubTreeRootRef,
                 new MutableObject<ILogicalOperator>(topOp));
         topEqJoin.setExecutionMode(ExecutionMode.PARTITIONED);
@@ -628,14 +627,14 @@
         }
 
         // Create first copy.
-        LogicalOperatorDeepCopyWithNewVariablesVisitor firstDeepCopyVisitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(
-                context, context, newProbeSubTreeVarMap, true);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor firstDeepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(context, context, newProbeSubTreeVarMap, true);
         ILogicalOperator newProbeSubTree = firstDeepCopyVisitor.deepCopy(probeSubTree.getRoot());
         inferTypes(newProbeSubTree, context);
         Mutable<ILogicalOperator> newProbeSubTreeRootRef = new MutableObject<ILogicalOperator>(newProbeSubTree);
         // Create second copy.
-        LogicalOperatorDeepCopyWithNewVariablesVisitor secondDeepCopyVisitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(
-                context, context, joinInputSubTreeVarMap, true);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor secondDeepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(context, context, joinInputSubTreeVarMap, true);
         ILogicalOperator joinInputSubTree = secondDeepCopyVisitor.deepCopy(probeSubTree.getRoot());
         inferTypes(joinInputSubTree, context);
         probeSubTree.getRootRef().setValue(joinInputSubTree);
@@ -670,8 +669,8 @@
             args.add(
                     new MutableObject<ILogicalExpression>(new VariableReferenceExpression(surrogateSubTreePKs.get(i))));
             args.add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(originalSubTreePKs.get(i))));
-            ILogicalExpression eqFunc = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(AlgebricksBuiltinFunctions.EQ), args);
+            ILogicalExpression eqFunc =
+                    new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(AlgebricksBuiltinFunctions.EQ), args);
             eqExprs.add(new MutableObject<ILogicalExpression>(eqFunc));
         }
         if (eqExprs.size() == 1) {
@@ -712,8 +711,8 @@
         VariableUtilities.getLiveVariables(indexSubTree.getRoot(), originalLiveVars);
 
         // Copy the scan subtree in indexSubTree.
-        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(
-                context, context);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(context, context);
         ILogicalOperator scanSubTree = deepCopyVisitor.deepCopy(indexSubTree.getRoot());
 
         Map<LogicalVariable, LogicalVariable> copyVarMap = deepCopyVisitor.getInputToOutputVariableMapping();
@@ -777,8 +776,8 @@
                 throw CompilationException.create(ErrorCode.NO_SUPPORTED_TYPE);
         }
 
-        SelectOperator isFilterableSelectOp = new SelectOperator(
-                new MutableObject<ILogicalExpression>(isFilterableExpr), false, null);
+        SelectOperator isFilterableSelectOp =
+                new SelectOperator(new MutableObject<ILogicalExpression>(isFilterableExpr), false, null);
         isFilterableSelectOp.getInputs().add(new MutableObject<ILogicalOperator>(inputOp));
         isFilterableSelectOp.setExecutionMode(ExecutionMode.LOCAL);
         context.computeAndSetTypeEnvironmentForOperator(isFilterableSelectOp);
@@ -788,8 +787,8 @@
         isNotFilterableArgs.add(new MutableObject<ILogicalExpression>(isFilterableExpr));
         ILogicalExpression isNotFilterableExpr = new ScalarFunctionCallExpression(
                 FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT), isNotFilterableArgs);
-        SelectOperator isNotFilterableSelectOp = new SelectOperator(
-                new MutableObject<ILogicalExpression>(isNotFilterableExpr), false, null);
+        SelectOperator isNotFilterableSelectOp =
+                new SelectOperator(new MutableObject<ILogicalExpression>(isNotFilterableExpr), false, null);
         isNotFilterableSelectOp.getInputs().add(new MutableObject<ILogicalOperator>(inputOp));
         isNotFilterableSelectOp.setExecutionMode(ExecutionMode.LOCAL);
         context.computeAndSetTypeEnvironmentForOperator(isNotFilterableSelectOp);
@@ -847,8 +846,7 @@
             return;
         }
         if (optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CHECK
-                || optFuncExpr.getFuncExpr()
-                        .getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
+                || optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
             if (optFuncExpr.containsPartialField()) {
                 jobGenParams.setSearchModifierType(SearchModifierType.CONJUNCTIVE_EDIT_DISTANCE);
             } else {
@@ -877,7 +875,7 @@
     private static SearchModifierType getFullTextOption(AbstractFunctionCallExpression funcExpr) {
         if (funcExpr.getArguments().size() < 3 || funcExpr.getArguments().size() % 2 != 0) {
             // If no parameters or incorrect number of parameters are given, the default search type is returned.
-            return SearchModifierType.DISJUNCTIVE;
+            return SearchModifierType.CONJUNCTIVE;
         }
         // From the third argument, it contains full-text search options.
         for (int i = 2; i < funcExpr.getArguments().size(); i = i + 2) {
@@ -896,7 +894,7 @@
 
     private void addKeyVarsAndExprs(IOptimizableFuncExpr optFuncExpr, ArrayList<LogicalVariable> keyVarList,
             ArrayList<Mutable<ILogicalExpression>> keyExprList, IOptimizationContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         // For now we are assuming a single secondary index key.
         // Add a variable and its expr to the lists which will be passed into an assign op.
         LogicalVariable keyVar = context.newVar();
@@ -913,8 +911,7 @@
         }
 
         if (optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CHECK
-                || optFuncExpr.getFuncExpr()
-                        .getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
+                || optFuncExpr.getFuncExpr().getFunctionIdentifier() == BuiltinFunctions.EDIT_DISTANCE_CONTAINS) {
             return isEditDistanceFuncOptimizable(index, optFuncExpr);
         }
 
@@ -970,8 +967,8 @@
 
         // Check for panic in selection query.
         // TODO: Panic also depends on prePost which is currently hardcoded to be true.
-        AsterixConstantValue listOrStrConstVal = (AsterixConstantValue) ((ConstantExpression) optFuncExpr
-                .getConstantExpr(0)).getValue();
+        AsterixConstantValue listOrStrConstVal =
+                (AsterixConstantValue) ((ConstantExpression) optFuncExpr.getConstantExpr(0)).getValue();
         IAObject listOrStrObj = listOrStrConstVal.getObject();
         ATypeTag typeTag = listOrStrObj.getType().getTypeTag();
 
@@ -979,8 +976,8 @@
             return false;
         }
 
-        AsterixConstantValue intConstVal = (AsterixConstantValue) ((ConstantExpression) optFuncExpr.getConstantExpr(1))
-                .getValue();
+        AsterixConstantValue intConstVal =
+                (AsterixConstantValue) ((ConstantExpression) optFuncExpr.getConstantExpr(1)).getValue();
         IAObject intObj = intConstVal.getObject();
 
         AInt32 edThresh = null;
@@ -1168,8 +1165,8 @@
     }
 
     private boolean isContainsFuncSelectOptimizable(Index index, IOptimizableFuncExpr optFuncExpr) {
-        AsterixConstantValue strConstVal = (AsterixConstantValue) ((ConstantExpression) optFuncExpr.getConstantExpr(0))
-                .getValue();
+        AsterixConstantValue strConstVal =
+                (AsterixConstantValue) ((ConstantExpression) optFuncExpr.getConstantExpr(0)).getValue();
         IAObject strObj = strConstVal.getObject();
         ATypeTag typeTag = strObj.getType().getTypeTag();
 
@@ -1265,8 +1262,8 @@
                         }
                     }
                     default: {
-                        throw CompilationException.create(ErrorCode.INCOMPATIBLE_SEARCH_MODIFIER,
-                                searchModifierType, index.getIndexType());
+                        throw CompilationException.create(ErrorCode.INCOMPATIBLE_SEARCH_MODIFIER, searchModifierType,
+                                index.getIndexType());
                     }
                 }
             default:
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
index b66a663..fd46194 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/RTreeAccessMethod.java
@@ -196,8 +196,8 @@
         int numDimensions = NonTaggedFormatUtil.getNumDimensions(spatialType.getTypeTag());
         int numSecondaryKeys = numDimensions * 2;
         // we made sure indexSubTree has datasource scan
-        AbstractDataSourceOperator dataSourceOp = (AbstractDataSourceOperator) indexSubTree.getDataSourceRef()
-                .getValue();
+        AbstractDataSourceOperator dataSourceOp =
+                (AbstractDataSourceOperator) indexSubTree.getDataSourceRef().getValue();
         RTreeJobGenParams jobGenParams = new RTreeJobGenParams(chosenIndex.getIndexName(), IndexType.RTREE,
                 dataset.getDataverseName(), dataset.getDatasetName(), retainInput, requiresBroadcast);
         // A spatial object is serialized in the constant of the func expr we are optimizing.
@@ -214,8 +214,8 @@
 
         for (int i = 0; i < numSecondaryKeys; i++) {
             // The create MBR function "extracts" one field of an MBR around the given spatial object.
-            AbstractFunctionCallExpression createMBR = new ScalarFunctionCallExpression(
-                    FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_MBR));
+            AbstractFunctionCallExpression createMBR =
+                    new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.CREATE_MBR));
             // Spatial object is the constant from the func expr we are optimizing.
             createMBR.getArguments().add(new MutableObject<>(searchKeyExpr));
             // The number of dimensions.
@@ -236,8 +236,8 @@
         if (probeSubTree == null) {
             // We are optimizing a selection query.
             // Input to this assign is the EmptyTupleSource (which the dataSourceScan also must have had as input).
-            assignSearchKeys.getInputs().add(new MutableObject<>(
-                    OperatorManipulationUtil.deepCopy(dataSourceOp.getInputs().get(0).getValue())));
+            assignSearchKeys.getInputs().add(
+                    new MutableObject<>(OperatorManipulationUtil.deepCopy(dataSourceOp.getInputs().get(0).getValue())));
             assignSearchKeys.setExecutionMode(dataSourceOp.getExecutionMode());
         } else {
             // We are optimizing a join, place the assign op top of the probe subtree.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
index 9a49472..8bfa53a 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java
@@ -136,8 +136,8 @@
 
     // Maps live variables at <code>subplanInputOperator</code> to variables in
     // the flattened nested plan.
-    private final LinkedHashMap<LogicalVariable, LogicalVariable> subplanInputVarToCurrentVarMap = new
-            LinkedHashMap<>();
+    private final LinkedHashMap<LogicalVariable, LogicalVariable> subplanInputVarToCurrentVarMap =
+            new LinkedHashMap<>();
 
     // Maps variables in the flattened nested plan to live variables at
     // <code>subplannputOperator</code>.
@@ -288,15 +288,13 @@
             if (!correlatedKeyVars.contains(inputLiveVar)) {
                 recordConstructorArgs.add(new MutableObject<>(new ConstantExpression(
                         new AsterixConstantValue(new AString(Integer.toString(inputLiveVar.getId()))))));
-                recordConstructorArgs
-                        .add(new MutableObject<>(new VariableReferenceExpression(inputLiveVar)));
+                recordConstructorArgs.add(new MutableObject<>(new VariableReferenceExpression(inputLiveVar)));
             }
         }
         LogicalVariable recordVar = context.newVar();
-        Mutable<ILogicalExpression> recordExprRef = new MutableObject<ILogicalExpression>(
-                new ScalarFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR),
-                        recordConstructorArgs));
+        Mutable<ILogicalExpression> recordExprRef =
+                new MutableObject<ILogicalExpression>(new ScalarFunctionCallExpression(
+                        FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR), recordConstructorArgs));
         AssignOperator assignOp = new AssignOperator(recordVar, recordExprRef);
         return new Pair<>(assignOp, recordVar);
     }
@@ -363,13 +361,11 @@
     private Pair<ILogicalOperator, LogicalVariable> createUnnestForAggregatedList(LogicalVariable aggVar) {
         LogicalVariable unnestVar = context.newVar();
         // Creates an unnest function expression.
-        Mutable<ILogicalExpression> unnestArg = new MutableObject<>(
-                new VariableReferenceExpression(aggVar));
+        Mutable<ILogicalExpression> unnestArg = new MutableObject<>(new VariableReferenceExpression(aggVar));
         List<Mutable<ILogicalExpression>> unnestArgList = new ArrayList<>();
         unnestArgList.add(unnestArg);
-        Mutable<ILogicalExpression> unnestExpr = new MutableObject<>(
-                new UnnestingFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION), unnestArgList));
+        Mutable<ILogicalExpression> unnestExpr = new MutableObject<>(new UnnestingFunctionCallExpression(
+                FunctionUtil.getFunctionInfo(BuiltinFunctions.SCAN_COLLECTION), unnestArgList));
         ILogicalOperator unnestOp = new UnnestOperator(unnestVar, unnestExpr);
         return new Pair<>(unnestOp, unnestVar);
     }
@@ -414,15 +410,15 @@
         if (op.getDataSourceReference().getValue() != subplanOperator) {
             return op;
         }
-        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(
-                context, context);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(context, context);
         ILogicalOperator copiedInputOperator = deepCopyVisitor.deepCopy(subplanInputOperator);
 
         // Updates the primary key info in the copied plan segment.
         Map<LogicalVariable, LogicalVariable> varMap = deepCopyVisitor.getInputToOutputVariableMapping();
         addPrimaryKeys(varMap);
-        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars = EquivalenceClassUtils
-                .findOrCreatePrimaryKeyOpAndVariables(copiedInputOperator, true, context);
+        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars =
+                EquivalenceClassUtils.findOrCreatePrimaryKeyOpAndVariables(copiedInputOperator, true, context);
         correlatedKeyVars.clear();
         correlatedKeyVars.addAll(primaryOpAndVars.second);
         // Update key variables and input-output-var mapping.
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
index 6a318d6..4a28344 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineLeftNtsInSubplanJoinFlatteningVisitor.java
@@ -399,8 +399,8 @@
      */
     private void injectNullCheckVars(AbstractBinaryJoinOperator joinOp) {
         LogicalVariable assignVar = context.newVar();
-        ILogicalOperator assignOp = new AssignOperator(assignVar,
-                new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
+        ILogicalOperator assignOp =
+                new AssignOperator(assignVar, new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
         assignOp.getInputs().add(joinOp.getInputs().get(1));
         joinOp.getInputs().set(1, new MutableObject<ILogicalOperator>(assignOp));
         nullCheckVars.add(assignVar);
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
index 8ab8b1d..3edccec 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.optimizer.rules.subplan;
 
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -56,21 +57,21 @@
 import org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil;
 import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
 
-import com.google.common.collect.ImmutableSet;
-
 /*
-This rule  is to remove SubplanOperators containing DataScan, InnerJoin, LeftOuterJoin, UnionAll or Distinct. Given a qualified Subplan operator called S1,
-Let's call its input operator O1.
+This rule  is to remove SubplanOperators containing DataScan, InnerJoin, LeftOuterJoin.
+Given a qualified Subplan operator called S1, Let's call its input operator O1.
 
 General Cases
 We have the following rewritings for general cases:
 R1. Replace all NestedTupleSourceOperators in S1 with deep-copies (with new variables) of the query plan rooted at O1;
-R2. Add a LeftOuterOperatorJoinOperator (let's call it LJ) between O1 and the SubplanOperator's root operator's input (let's call it SO1),
-    where O1 is the left branch and SO1 is the right branch;
-R3. The deep copy of the primary key variables in O1 should be preserved from an inlined NestedTupleSourceOperator to SO1.
-    The join condition of LJ is the equality between the primary key variables in O1 and its deep copied version at SO1;
+R2. Add a LeftOuterOperatorJoinOperator (let's call it LJ) between O1 and the SubplanOperator's root operator's input
+    (let's call it SO1),where O1 is the left branch and SO1 is the right branch;
+R3. The deep copy of the primary key variables in O1 should be preserved from an inlined NestedTupleSourceOperator
+    to SO1. The join condition of LJ is the equality between the primary key variables in O1 and its deep copied
+    version at SO1;
 R4. A variable v indicating non-match tuples is assigned to TRUE between LJ and SO1;
-R5. On top of the LJ, add a GroupByOperaptor in which the nested plan consists of the S1's root operator, i.e., an aggregate operator.
+R5. On top of the LJ, add a GroupByOperaptor in which the nested plan consists of the S1's root operator,
+    i.e., an aggregate operator.
     Below the aggregate, there is a not-null-filter on variable v. The group key is the primary key variables in O1.
 
 This is an abstract example for the rewriting mechanism described above:
@@ -102,10 +103,12 @@
              .....
                --Deepcopy_The_Plan_Rooted_At_InputOp_With_New_Variables(InputOp)
 
-In the plan, v_lc_1, ..., v_lc_n are live "covering" variables at InputOp, while v_rc_1, ..., v_rc_n are their corresponding variables populated from the deepcopy of InputOp.
-"Covering" variables form a set of variables that can imply all live variables. v_l1, ....v_ln in the decoration part of the added group-by operator are all live variables
-at InputOp except the covering variables v_lc_1, ..., v_lc_n.  In the current implementation, we use "covering" variables as primary key variables. In the next version, we
-will use the real primary key variables, which will fix ASTERIXDB-1168.
+In the plan, v_lc_1, ..., v_lc_n are live "covering" variables at InputOp, while v_rc_1, ..., v_rc_n are their
+corresponding variables populated from the deepcopy of InputOp.
+"Covering" variables form a set of variables that can imply all live variables. v_l1, ....v_ln in the decoration part
+of the added group-by operator are all live variables at InputOp except the covering variables v_lc_1, ..., v_lc_n.
+In the current implementation, we use "covering" variables as primary key variables.
+In the next version, we will use the real primary key variables, which will fix ASTERIXDB-1168.
 
 Here is a concrete example of the general case rewriting (optimizerts/queries/nested_loj4.aql).
 Before plan:
@@ -157,14 +160,19 @@
 c. if J1 is a left outer join, the left branch of J1 has a NestedTupleSource descendant (let's call it N1),
 d. there is no tuple dropping from N1 to J1
 
-Rewriting R2 is not necessary since before J1, all tuples from N1 are preserved. But the following rewritings are needed:
+Rewriting R2 is not necessary since before J1, all tuples from N1 are preserved. But the following rewritings are
+needed:
 R1'. Replace N1 by the O1 (no additional deep copy);
 R2'. All inner joins on the path from N1 to J1 (including J1) become left-outer joins with the same join conditions;
-R3'. If N1 resides in the right branch of an inner join (let's call it J2) in the path from N1 to J1, switch the left and right branches of J2;
-R4'. For every left join from N1 to J1 transformed from an inner join, a variable vi indicating non-match tuples is assigned to TRUE in its right branch;
-R5'. On top of J1, a GroupByOperaptor G1 is added where the group-by key is the primary key of O1 and the nested query plan for aggregation is the nested pipeline
-     on top of J1 with an added not-null-filter to check all vi are not null.
-R6'. All other NestedTupleSourceOperators in the subplan is inlined with deep copies (with new variables) of the query plan rooted at O1.
+R3'. If N1 resides in the right branch of an inner join (let's call it J2) in the path from N1 to J1,
+     switch the left and right branches of J2;
+R4'. For every left join from N1 to J1 transformed from an inner join, a variable vi indicating non-match tuples
+     is assigned to TRUE in its right branch;
+R5'. On top of J1, a GroupByOperaptor G1 is added where the group-by key is the primary key of O1 and
+     the nested query plan for aggregation is the nested pipeline on top of J1 with an added not-null-filter
+     to check all vi are not null.
+R6'. All other NestedTupleSourceOperators in the subplan is inlined with deep copies (with new variables)
+     of the query plan rooted at O1.
 
 This is an abstract example for the special rewriting mechanism described above:
 Before rewriting:
@@ -197,9 +205,10 @@
              – Assign v_new=TRUE
                 – ..... (L1)
 
-In the plan, v_lc_1, ..., v_lc_n are live "covering" variables at InputOp and v_l1, ....v_ln in the decoration part of the added group-by operator are all live variables
-at InputOp except the covering variables v_lc_1, ..., v_lc_n.  In the current implementation, we use "covering" variables as primary key variables. In the next version,
-we will use the real primary key variables, which will fix ASTERIXDB-1168.
+In the plan, v_lc_1, ..., v_lc_n are live "covering" variables at InputOp and v_l1, ....v_ln in the decoration part
+of the added group-by operator are all live variables at InputOp except the covering variables v_lc_1, ..., v_lc_n.
+In the current implementation, we use "covering" variables as primary key variables.
+In the next version, we will use the real primary key variables, which will fix ASTERIXDB-1168.
 
 Here is a concrete example (optimizerts/queries/nested_loj2.aql). .
 Before plan:
@@ -273,12 +282,11 @@
     }
 
     private Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> rewriteSubplanOperator(
-            Mutable<ILogicalOperator> opRef,
-            IOptimizationContext context) throws AlgebricksException {
+            Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
         // Recursively traverses input operators as if the current operator before rewriting the current operator.
-        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> changedAndVarMap = traverseNonSubplanOperator(op,
-                context);
+        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> changedAndVarMap =
+                traverseNonSubplanOperator(op, context);
         if (op.getOperatorTag() != LogicalOperatorTag.SUBPLAN) {
             return changedAndVarMap;
         }
@@ -312,17 +320,15 @@
      * @throws AlgebricksException
      */
     private Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> traverseNonSubplanOperator(
-            ILogicalOperator op,
-            IOptimizationContext context) throws AlgebricksException {
+            ILogicalOperator op, IOptimizationContext context) throws AlgebricksException {
         Set<LogicalVariable> liveVars = new HashSet<>();
         VariableUtilities.getLiveVariables(op, liveVars);
         LinkedHashMap<LogicalVariable, LogicalVariable> replacedVarMap = new LinkedHashMap<>();
         LinkedHashMap<LogicalVariable, LogicalVariable> replacedVarMapForAncestor = new LinkedHashMap<>();
         boolean changed = false;
         for (Mutable<ILogicalOperator> childrenRef : op.getInputs()) {
-            Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> resultFromChild = rewriteSubplanOperator(
-                    childrenRef,
-                    context);
+            Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> resultFromChild =
+                    rewriteSubplanOperator(childrenRef, context);
             changed = changed || resultFromChild.first;
             resultFromChild.second.forEach((oldVar, newVar) -> {
                 if (liveVars.contains(oldVar)) {
@@ -344,36 +350,33 @@
     }
 
     private Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> applyGeneralFlattening(
-            Mutable<ILogicalOperator> opRef,
-            IOptimizationContext context) throws AlgebricksException {
+            Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
         SubplanOperator subplanOp = (SubplanOperator) opRef.getValue();
-        if (!SubplanFlatteningUtil.containsOperators(subplanOp,
-                ImmutableSet.of(LogicalOperatorTag.DATASOURCESCAN, LogicalOperatorTag.INNERJOIN,
-                        // We don't have nested runtime for union-all and distinct hence we have to include them here.
-                        LogicalOperatorTag.LEFTOUTERJOIN, LogicalOperatorTag.UNIONALL, LogicalOperatorTag.DISTINCT))) {
+        if (!SubplanFlatteningUtil.containsOperators(subplanOp, EnumSet.of(LogicalOperatorTag.DATASOURCESCAN,
+                LogicalOperatorTag.INNERJOIN, LogicalOperatorTag.LEFTOUTERJOIN))) {
             return new Pair<>(false, new LinkedHashMap<>());
         }
         Mutable<ILogicalOperator> inputOpRef = subplanOp.getInputs().get(0);
         ILogicalOperator inputOpBackup = inputOpRef.getValue();
         // Creates parameters for the left outer join operator.
-        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars = EquivalenceClassUtils
-                .findOrCreatePrimaryKeyOpAndVariables(inputOpBackup, true, context);
+        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars =
+                EquivalenceClassUtils.findOrCreatePrimaryKeyOpAndVariables(inputOpBackup, true, context);
         ILogicalOperator inputOp = primaryOpAndVars.first;
         Set<LogicalVariable> primaryKeyVars = primaryOpAndVars.second;
         inputOpRef.setValue(inputOp);
         Set<LogicalVariable> inputLiveVars = new HashSet<>();
         VariableUtilities.getLiveVariables(inputOp, inputLiveVars);
 
-        Pair<Map<LogicalVariable, LogicalVariable>, List<Pair<IOrder, Mutable<ILogicalExpression>>>> varMapAndOrderExprs = SubplanFlatteningUtil
-                .inlineAllNestedTupleSource(subplanOp, context);
+        Pair<Map<LogicalVariable, LogicalVariable>, List<Pair<IOrder, Mutable<ILogicalExpression>>>> varMapAndOrderExprs =
+                SubplanFlatteningUtil.inlineAllNestedTupleSource(subplanOp, context);
         Map<LogicalVariable, LogicalVariable> varMap = varMapAndOrderExprs.first;
         if (varMap == null) {
             inputOpRef.setValue(inputOpBackup);
             return new Pair<>(false, new LinkedHashMap<>());
         }
 
-        Mutable<ILogicalOperator> lowestAggregateRefInSubplan = SubplanFlatteningUtil
-                .findLowestAggregate(subplanOp.getNestedPlans().get(0).getRoots().get(0));
+        Mutable<ILogicalOperator> lowestAggregateRefInSubplan =
+                SubplanFlatteningUtil.findLowestAggregate(subplanOp.getNestedPlans().get(0).getRoots().get(0));
         Mutable<ILogicalOperator> rightInputOpRef = lowestAggregateRefInSubplan.getValue().getInputs().get(0);
         ILogicalOperator rightInputOp = rightInputOpRef.getValue();
 
@@ -400,14 +403,14 @@
                 ? new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(AlgebricksBuiltinFunctions.AND),
                         joinPredicates)
                 : joinPredicates.size() > 0 ? joinPredicates.get(0).getValue() : ConstantExpression.TRUE;
-        LeftOuterJoinOperator leftOuterJoinOp = new LeftOuterJoinOperator(
-                new MutableObject<>(joinExpr), inputOpRef, rightInputOpRef);
+        LeftOuterJoinOperator leftOuterJoinOp =
+                new LeftOuterJoinOperator(new MutableObject<>(joinExpr), inputOpRef, rightInputOpRef);
         OperatorManipulationUtil.computeTypeEnvironmentBottomUp(rightInputOp, context);
         context.computeAndSetTypeEnvironmentForOperator(leftOuterJoinOp);
 
         // Creates group-by operator.
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByDecorList = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = new ArrayList<>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByDecorList = new ArrayList<>();
         List<ILogicalPlan> nestedPlans = new ArrayList<>();
         GroupByOperator groupbyOp = new GroupByOperator(groupByList, groupByDecorList, nestedPlans);
 
@@ -437,19 +440,16 @@
             lowestAggregateRefInSubplan.getValue().getInputs().add(currentOpRef);
         }
 
-        // Adds a select operator into the nested plan for group-by to remove tuples with NULL on {@code assignVar}, i.e.,
-        // subplan input tuples that are filtered out within a subplan.
-        Mutable<ILogicalExpression> filterVarExpr = new MutableObject<>(
-                new VariableReferenceExpression(assignVar));
+        // Adds a select operator into the nested plan for group-by to remove tuples with NULL on {@code assignVar},
+        // i.e., subplan input tuples that are filtered out within a subplan.
+        Mutable<ILogicalExpression> filterVarExpr = new MutableObject<>(new VariableReferenceExpression(assignVar));
         List<Mutable<ILogicalExpression>> args = new ArrayList<>();
         args.add(filterVarExpr);
         List<Mutable<ILogicalExpression>> argsForNotFunction = new ArrayList<>();
-        argsForNotFunction.add(new MutableObject<>(new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_MISSING), args)));
-        SelectOperator selectOp = new SelectOperator(
-                new MutableObject<>(new ScalarFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT), argsForNotFunction)),
-                false, null);
+        argsForNotFunction.add(new MutableObject<>(
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_MISSING), args)));
+        SelectOperator selectOp = new SelectOperator(new MutableObject<>(new ScalarFunctionCallExpression(
+                FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT), argsForNotFunction)), false, null);
         currentOpRef.getValue().getInputs().add(new MutableObject<>(selectOp));
 
         selectOp.getInputs().add(new MutableObject<>(new NestedTupleSourceOperator(new MutableObject<>(groupbyOp))));
@@ -464,8 +464,8 @@
 
         // Recursively applys this rule to the nested plan of the subplan operator,
         // for the case where there are nested subplan operators within {@code subplanOp}.
-        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> result = rewriteSubplanOperator(rightInputOpRef,
-                context);
+        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> result =
+                rewriteSubplanOperator(rightInputOpRef, context);
         VariableUtilities.substituteVariables(leftOuterJoinOp, result.second, context);
         VariableUtilities.substituteVariables(groupbyOp, result.second, context);
 
@@ -474,29 +474,28 @@
     }
 
     private Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> applySpecialFlattening(
-            Mutable<ILogicalOperator> opRef,
-            IOptimizationContext context) throws AlgebricksException {
+            Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
         SubplanOperator subplanOp = (SubplanOperator) opRef.getValue();
         Mutable<ILogicalOperator> inputOpRef = subplanOp.getInputs().get(0);
         LinkedHashMap<LogicalVariable, LogicalVariable> replacedVarMap = new LinkedHashMap<>();
 
         // Recursively applies this rule to the nested plan of the subplan operator,
         // for the case where there are nested subplan operators within {@code subplanOp}.
-        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> result = rewriteSubplanOperator(
-                subplanOp.getNestedPlans().get(0).getRoots().get(0), context);
+        Pair<Boolean, LinkedHashMap<LogicalVariable, LogicalVariable>> result =
+                rewriteSubplanOperator(subplanOp.getNestedPlans().get(0).getRoots().get(0), context);
 
         ILogicalOperator inputOpBackup = inputOpRef.getValue();
         // Gets live variables and covering variables from the subplan's input operator.
-        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars = EquivalenceClassUtils
-                .findOrCreatePrimaryKeyOpAndVariables(inputOpBackup, false, context);
+        Pair<ILogicalOperator, Set<LogicalVariable>> primaryOpAndVars =
+                EquivalenceClassUtils.findOrCreatePrimaryKeyOpAndVariables(inputOpBackup, false, context);
         ILogicalOperator inputOp = primaryOpAndVars.first;
         Set<LogicalVariable> primaryKeyVars = primaryOpAndVars.second;
         inputOpRef.setValue(inputOp);
         Set<LogicalVariable> liveVars = new HashSet<>();
         VariableUtilities.getLiveVariables(inputOp, liveVars);
 
-        Pair<Set<LogicalVariable>, Mutable<ILogicalOperator>> notNullVarsAndTopJoinRef = SubplanFlatteningUtil
-                .inlineLeftNtsInSubplanJoin(subplanOp, context);
+        Pair<Set<LogicalVariable>, Mutable<ILogicalOperator>> notNullVarsAndTopJoinRef =
+                SubplanFlatteningUtil.inlineLeftNtsInSubplanJoin(subplanOp, context);
         if (notNullVarsAndTopJoinRef.first == null) {
             inputOpRef.setValue(inputOpBackup);
             return new Pair<>(false, replacedVarMap);
@@ -506,8 +505,8 @@
         Mutable<ILogicalOperator> topJoinRef = notNullVarsAndTopJoinRef.second;
 
         // Creates a group-by operator.
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByDecorList = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = new ArrayList<>();
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByDecorList = new ArrayList<>();
         GroupByOperator groupbyOp = new GroupByOperator(groupByList, groupByDecorList, subplanOp.getNestedPlans());
 
         for (LogicalVariable coverVar : primaryKeyVars) {
@@ -525,12 +524,12 @@
         groupbyOp.getInputs().add(new MutableObject<>(topJoinRef.getValue()));
 
         if (!notNullVars.isEmpty()) {
-            // Adds a select operator into the nested plan for group-by to remove tuples with NULL on {@code assignVar}, i.e.,
-            // subplan input tuples that are filtered out within a subplan.
+            // Adds a select operator into the nested plan for group-by to remove tuples with NULL on {@code assignVar},
+            // i.e., subplan input tuples that are filtered out within a subplan.
             List<Mutable<ILogicalExpression>> nullCheckExprRefs = new ArrayList<>();
             for (LogicalVariable notNullVar : notNullVars) {
-                Mutable<ILogicalExpression> filterVarExpr = new MutableObject<>(
-                        new VariableReferenceExpression(notNullVar));
+                Mutable<ILogicalExpression> filterVarExpr =
+                        new MutableObject<>(new VariableReferenceExpression(notNullVar));
                 List<Mutable<ILogicalExpression>> args = new ArrayList<>();
                 args.add(filterVarExpr);
                 List<Mutable<ILogicalExpression>> argsForNotFunction = new ArrayList<>();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java
index 377e96d..894097d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.optimizer.rules.subplan;
 
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -91,16 +92,16 @@
      */
     public static Pair<Set<LogicalVariable>, Mutable<ILogicalOperator>> inlineLeftNtsInSubplanJoin(
             SubplanOperator subplanOp, IOptimizationContext context) throws AlgebricksException {
-        Pair<Boolean, ILogicalOperator> applicableAndNtsToRewrite = SubplanFlatteningUtil
-                .isQualifiedForSpecialFlattening(subplanOp);
+        Pair<Boolean, ILogicalOperator> applicableAndNtsToRewrite =
+                SubplanFlatteningUtil.isQualifiedForSpecialFlattening(subplanOp);
         if (!applicableAndNtsToRewrite.first) {
             return new Pair<Set<LogicalVariable>, Mutable<ILogicalOperator>>(null, null);
         }
 
         ILogicalOperator qualifiedNts = applicableAndNtsToRewrite.second;
         ILogicalOperator subplanInputOp = subplanOp.getInputs().get(0).getValue();
-        InlineLeftNtsInSubplanJoinFlatteningVisitor specialVisitor = new InlineLeftNtsInSubplanJoinFlatteningVisitor(
-                context, subplanInputOp, qualifiedNts);
+        InlineLeftNtsInSubplanJoinFlatteningVisitor specialVisitor =
+                new InlineLeftNtsInSubplanJoinFlatteningVisitor(context, subplanInputOp, qualifiedNts);
 
         // Rewrites the query plan.
         Mutable<ILogicalOperator> topRef = subplanOp.getNestedPlans().get(0).getRoots().get(0);
@@ -157,7 +158,7 @@
         }
         if (currentOp.getOperatorTag() == LogicalOperatorTag.SUBPLAN
                 && containsOperators((SubplanOperator) currentOp, interestedOperatorTags)) {
-                return true;
+            return true;
         }
         for (Mutable<ILogicalOperator> childRef : currentOp.getInputs()) {
             if (containsOperatorsInternal(childRef.getValue(), interestedOperatorTags)) {
@@ -208,7 +209,7 @@
         if (!OperatorManipulationUtil.ancestorOfOperators(
                 subplanOp.getNestedPlans().get(0).getRoots().get(0).getValue(),
                 // we don't need to check recursively for this special rewriting.
-                ImmutableSet.of(LogicalOperatorTag.INNERJOIN, LogicalOperatorTag.LEFTOUTERJOIN))) {
+                EnumSet.of(LogicalOperatorTag.INNERJOIN, LogicalOperatorTag.LEFTOUTERJOIN))) {
             return new Pair<Boolean, ILogicalOperator>(false, null);
         }
         SubplanSpecialFlatteningCheckVisitor visitor = new SubplanSpecialFlatteningCheckVisitor();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/temporal/TranslateIntervalExpressionRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/temporal/TranslateIntervalExpressionRule.java
index c7ceefd..0d53a19 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/temporal/TranslateIntervalExpressionRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/temporal/TranslateIntervalExpressionRule.java
@@ -106,66 +106,66 @@
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_MET_BY)) {
             exprRef.setValue(getEqualExpr(getIntervalStartExpr(interval1), getIntervalEndExpr(interval2)));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_STARTS)) {
-            ILogicalExpression startExpr = getEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalStartExpr(interval2));
-            ILogicalExpression endExpr = getLessThanOrEqualExpr(getIntervalEndExpr(interval1),
-                    getIntervalEndExpr(interval2));
+            ILogicalExpression startExpr =
+                    getEqualExpr(getIntervalStartExpr(interval1), getIntervalStartExpr(interval2));
+            ILogicalExpression endExpr =
+                    getLessThanOrEqualExpr(getIntervalEndExpr(interval1), getIntervalEndExpr(interval2));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_STARTED_BY)) {
-            ILogicalExpression startExpr = getEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalStartExpr(interval2));
-            ILogicalExpression endExpr = getLessThanOrEqualExpr(getIntervalEndExpr(interval2),
-                    getIntervalEndExpr(interval1));
+            ILogicalExpression startExpr =
+                    getEqualExpr(getIntervalStartExpr(interval1), getIntervalStartExpr(interval2));
+            ILogicalExpression endExpr =
+                    getLessThanOrEqualExpr(getIntervalEndExpr(interval2), getIntervalEndExpr(interval1));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_ENDS)) {
             ILogicalExpression endExpr = getEqualExpr(getIntervalEndExpr(interval1), getIntervalEndExpr(interval2));
-            ILogicalExpression startExpr = getLessThanOrEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalStartExpr(interval2));
+            ILogicalExpression startExpr =
+                    getLessThanOrEqualExpr(getIntervalStartExpr(interval1), getIntervalStartExpr(interval2));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_ENDED_BY)) {
             ILogicalExpression endExpr = getEqualExpr(getIntervalEndExpr(interval1), getIntervalEndExpr(interval2));
-            ILogicalExpression startExpr = getLessThanOrEqualExpr(getIntervalStartExpr(interval2),
-                    getIntervalStartExpr(interval1));
+            ILogicalExpression startExpr =
+                    getLessThanOrEqualExpr(getIntervalStartExpr(interval2), getIntervalStartExpr(interval1));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_BEFORE)) {
             exprRef.setValue(getLessThanExpr(getIntervalEndExpr(interval1), getIntervalStartExpr(interval2)));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_AFTER)) {
             exprRef.setValue(getGreaterThanExpr(getIntervalStartExpr(interval1), getIntervalEndExpr(interval2)));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_OVERLAPS)) {
-            ILogicalExpression expr1 = getLessThanExpr(getIntervalStartExpr(interval1),
-                    getIntervalStartExpr(interval2));
+            ILogicalExpression expr1 =
+                    getLessThanExpr(getIntervalStartExpr(interval1), getIntervalStartExpr(interval2));
             ILogicalExpression expr2 = getGreaterThanExpr(getIntervalEndExpr(interval2), getIntervalEndExpr(interval1));
-            ILogicalExpression expr3 = getGreaterThanExpr(getIntervalEndExpr(interval1),
-                    getIntervalStartExpr(interval2));
+            ILogicalExpression expr3 =
+                    getGreaterThanExpr(getIntervalEndExpr(interval1), getIntervalStartExpr(interval2));
             exprRef.setValue(getAndExpr(getAndExpr(expr1, expr2), expr3));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_OVERLAPPED_BY)) {
-            ILogicalExpression expr1 = getLessThanExpr(getIntervalStartExpr(interval2),
-                    getIntervalStartExpr(interval1));
+            ILogicalExpression expr1 =
+                    getLessThanExpr(getIntervalStartExpr(interval2), getIntervalStartExpr(interval1));
             ILogicalExpression expr2 = getGreaterThanExpr(getIntervalEndExpr(interval1), getIntervalEndExpr(interval2));
-            ILogicalExpression expr3 = getGreaterThanExpr(getIntervalEndExpr(interval2),
-                    getIntervalStartExpr(interval1));
+            ILogicalExpression expr3 =
+                    getGreaterThanExpr(getIntervalEndExpr(interval2), getIntervalStartExpr(interval1));
             exprRef.setValue(getAndExpr(getAndExpr(expr1, expr2), expr3));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_OVERLAPPING)) {
-            ILogicalExpression startExpr = getLessThanOrEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalEndExpr(interval2));
-            ILogicalExpression endExpr = getGreaterThanOrEqualExpr(getIntervalEndExpr(interval1),
-                    getIntervalStartExpr(interval2));
-            ILogicalExpression startPointExpr = getNotEqualExpr(getIntervalEndExpr(interval1),
-                    getIntervalStartExpr(interval2));
-            ILogicalExpression endPointExpr = getNotEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalEndExpr(interval2));
+            ILogicalExpression startExpr =
+                    getLessThanOrEqualExpr(getIntervalStartExpr(interval1), getIntervalEndExpr(interval2));
+            ILogicalExpression endExpr =
+                    getGreaterThanOrEqualExpr(getIntervalEndExpr(interval1), getIntervalStartExpr(interval2));
+            ILogicalExpression startPointExpr =
+                    getNotEqualExpr(getIntervalEndExpr(interval1), getIntervalStartExpr(interval2));
+            ILogicalExpression endPointExpr =
+                    getNotEqualExpr(getIntervalStartExpr(interval1), getIntervalEndExpr(interval2));
             exprRef.setValue(getAndExpr(getAndExpr(startExpr, endExpr), getAndExpr(startPointExpr, endPointExpr)));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_COVERS)) {
-            ILogicalExpression startExpr = getLessThanOrEqualExpr(getIntervalStartExpr(interval1),
-                    getIntervalStartExpr(interval2));
-            ILogicalExpression endExpr = getGreaterThanOrEqualExpr(getIntervalEndExpr(interval1),
-                    getIntervalEndExpr(interval2));
+            ILogicalExpression startExpr =
+                    getLessThanOrEqualExpr(getIntervalStartExpr(interval1), getIntervalStartExpr(interval2));
+            ILogicalExpression endExpr =
+                    getGreaterThanOrEqualExpr(getIntervalEndExpr(interval1), getIntervalEndExpr(interval2));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else if (funcExpr.getFunctionIdentifier().equals(BuiltinFunctions.INTERVAL_COVERED_BY)) {
-            ILogicalExpression startExpr = getLessThanOrEqualExpr(getIntervalStartExpr(interval2),
-                    getIntervalStartExpr(interval1));
-            ILogicalExpression endExpr = getGreaterThanOrEqualExpr(getIntervalEndExpr(interval2),
-                    getIntervalEndExpr(interval1));
+            ILogicalExpression startExpr =
+                    getLessThanOrEqualExpr(getIntervalStartExpr(interval2), getIntervalStartExpr(interval1));
+            ILogicalExpression endExpr =
+                    getGreaterThanOrEqualExpr(getIntervalEndExpr(interval2), getIntervalEndExpr(interval1));
             exprRef.setValue(getAndExpr(startExpr, endExpr));
         } else {
             return false;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/EquivalenceClassUtils.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/EquivalenceClassUtils.java
index 9b5654a..82d963d 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/EquivalenceClassUtils.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/util/EquivalenceClassUtils.java
@@ -121,8 +121,8 @@
                     new MutableObject<ILogicalExpression>(new VariableReferenceExpression(referredRecordVar)),
                     new MutableObject<ILogicalExpression>(
                             new ConstantExpression(new AsterixConstantValue(new AInt32(fieldIndexInRecord)))));
-            EquivalenceClass equivClass = new EquivalenceClass(Collections.singletonList(var), var,
-                    Collections.singletonList(expr));
+            EquivalenceClass equivClass =
+                    new EquivalenceClass(Collections.singletonList(var), var, Collections.singletonList(expr));
             Map<LogicalVariable, EquivalenceClass> equivalenceMap = context.getEquivalenceClassMap(operator);
             if (equivalenceMap == null) {
                 equivalenceMap = new HashMap<LogicalVariable, EquivalenceClass>();
@@ -148,7 +148,7 @@
      */
     public static Pair<ILogicalOperator, Set<LogicalVariable>> findOrCreatePrimaryKeyOpAndVariables(
             ILogicalOperator operator, boolean usedForCorrelationJoin, IOptimizationContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         computePrimaryKeys(operator, context);
 
         Set<LogicalVariable> liveVars = new HashSet<>();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
index db6f985..acf2908 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AbstractLangTranslator.java
@@ -21,8 +21,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
 import org.apache.asterix.common.cluster.IClusterStateManager;
@@ -38,8 +36,11 @@
 import org.apache.asterix.metadata.dataset.hints.DatasetHints;
 import org.apache.asterix.metadata.entities.Dataverse;
 import org.apache.asterix.metadata.utils.MetadataConstants;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Base class for language translators. Contains the common validation logic for language
@@ -47,10 +48,10 @@
  */
 public abstract class AbstractLangTranslator {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractLangTranslator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public void validateOperation(ICcApplicationContext appCtx, Dataverse defaultDataverse, Statement stmt)
-            throws AsterixException {
+            throws AlgebricksException {
 
         final IClusterStateManager clusterStateManager = appCtx.getClusterStateManager();
         final IGlobalRecoveryManager globalRecoveryManager = appCtx.getGlobalRecoveryManager();
@@ -62,8 +63,8 @@
             } catch (HyracksDataException e) {
                 throw new AsterixException(e);
             } catch (InterruptedException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Thread interrupted while waiting for cluster to be " + ClusterState.ACTIVE);
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.warn("Thread interrupted while waiting for cluster to be " + ClusterState.ACTIVE);
                 }
                 Thread.currentThread().interrupt();
             }
@@ -71,7 +72,7 @@
                 throw new AsterixException("Cluster is in " + ClusterState.UNUSABLE + " state."
                         + "\n One or more Node Controllers have left or haven't joined yet.\n");
             } else {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Cluster is now " + ClusterState.ACTIVE);
                 }
             }
@@ -91,8 +92,8 @@
                     waitCycleCount++;
                 }
             } catch (InterruptedException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Thread interrupted while waiting for cluster to complete global recovery ");
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.warn("Thread interrupted while waiting for cluster to complete global recovery ");
                 }
                 Thread.currentThread().interrupt();
             }
@@ -156,8 +157,8 @@
                 if (hints != null && !hints.isEmpty()) {
                     StringBuilder errorMsgBuffer = new StringBuilder();
                     for (Entry<String, String> hint : hints.entrySet()) {
-                        Pair<Boolean, String> validationResult = DatasetHints.validate(appCtx, hint.getKey(),
-                                hint.getValue());
+                        Pair<Boolean, String> validationResult =
+                                DatasetHints.validate(appCtx, hint.getKey(), hint.getValue());
                         if (!validationResult.first) {
                             errorMsgBuffer.append("Dataset: ").append(datasetStmt.getName().getValue())
                                     .append(" error in processing hint: ").append(hint.getKey()).append(" ")
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlPlusExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlPlusExpressionToPlanTranslator.java
index 18304b3..531de59 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlPlusExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/AqlPlusExpressionToPlanTranslator.java
@@ -144,7 +144,6 @@
         return new Pair<ILogicalOperator, LogicalVariable>(a, var);
     }
 
-
     public void addVariableToMetaScope(Identifier id, LogicalVariable var) {
         metaScopeExp.put(id, var);
     }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
index 8d0f20b..a1fbac6 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/IRequestParameters.java
@@ -31,9 +31,11 @@
     IHyracksDataset getHyracksDataset();
 
     /**
-     * @return The {@code ResultDelivery} kind required for queries in the list of statements
+     * Gets the required result properties of the request.
+     *
+     * @return the result properties
      */
-    IStatementExecutor.ResultDelivery getResultDelivery();
+    ResultProperties getResultProperties();
 
     /**
      * @return a reference to write the stats of executed queries
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index d5f41df..a3d3ac9 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -173,8 +173,7 @@
 
     public LangExpressionToPlanTranslator(MetadataProvider metadataProvider, int currentVarCounterValue)
             throws AlgebricksException {
-        this.context = new TranslationContext(new Counter(currentVarCounterValue));
-        this.metadataProvider = metadataProvider;
+        this(metadataProvider, new Counter(currentVarCounterValue));
     }
 
     // Keeps the given Counter if one is provided instead of a value.
@@ -245,7 +244,8 @@
         AssignOperator assign = new AssignOperator(pkVars, pkExprs);
         assign.getInputs().add(new MutableObject<>(dssOp));
 
-        // If the input is pre-sorted, we set the ordering property explicitly in the assign
+        // If the input is pre-sorted, we set the ordering property explicitly in the
+        // assign
         if (clffs.alreadySorted()) {
             List<OrderColumn> orderColumns = new ArrayList<>();
             for (int i = 0; i < pkVars.size(); ++i) {
@@ -328,13 +328,13 @@
             }
         } else {
             /**
-             * add the collection-to-sequence right before the project,
-             * because dataset only accept non-collection records
+             * add the collection-to-sequence right before the project, because dataset only
+             * accept non-collection records
              */
             LogicalVariable seqVar = context.newVar();
             /**
-             * This assign adds a marker function collection-to-sequence: if the input is a singleton collection, unnest
-             * it; otherwise do nothing.
+             * This assign adds a marker function collection-to-sequence: if the input is a
+             * singleton collection, unnest it; otherwise do nothing.
              */
             AssignOperator assignCollectionToSequence = new AssignOperator(seqVar,
                     new MutableObject<>(new ScalarFunctionCallExpression(
@@ -557,7 +557,8 @@
         return processReturningExpression(rootOperator, insertOp, compiledInsert);
     }
 
-    // Stitches the translated operators for the returning expression into the query plan.
+    // Stitches the translated operators for the returning expression into the query
+    // plan.
     private ILogicalOperator processReturningExpression(ILogicalOperator inputOperator,
             InsertDeleteUpsertOperator insertOp, CompiledInsertStatement compiledInsert) throws AlgebricksException {
         Expression returnExpression = compiledInsert.getReturnExpression();
@@ -566,7 +567,7 @@
         }
         ILogicalOperator rootOperator = inputOperator;
 
-        //Makes the id of the insert var point to the record variable.
+        // Makes the id of the insert var point to the record variable.
         context.newVarFromExpression(compiledInsert.getVar());
         context.setVar(compiledInsert.getVar(),
                 ((VariableReferenceExpression) insertOp.getPayloadExpression().getValue()).getVariableReference());
@@ -606,7 +607,7 @@
                 dataset.getDatasetDetails(), domain);
     }
 
-    private FileSplit getDefaultOutputFileLocation(ICcApplicationContext appCtx) throws MetadataException {
+    private FileSplit getDefaultOutputFileLocation(ICcApplicationContext appCtx) throws AlgebricksException {
         String outputDir = System.getProperty("java.io.tmpDir");
         String filePath =
                 outputDir + System.getProperty("file.separator") + OUTPUT_FILE_PREFIX + outputFileID.incrementAndGet();
@@ -702,8 +703,12 @@
         }
 
         AbstractFunctionCallExpression f;
-        if ((f = lookupUserDefinedFunction(signature, args)) == null) {
-            f = lookupBuiltinFunction(signature.getName(), signature.getArity(), args);
+        try {
+            if ((f = lookupUserDefinedFunction(signature, args)) == null) {
+                f = lookupBuiltinFunction(signature.getName(), signature.getArity(), args);
+            }
+        } catch (AlgebricksException e) {
+            throw new CompilationException(e);
         }
 
         if (f == null) {
@@ -726,7 +731,7 @@
     }
 
     private AbstractFunctionCallExpression lookupUserDefinedFunction(FunctionSignature signature,
-            List<Mutable<ILogicalExpression>> args) throws MetadataException {
+            List<Mutable<ILogicalExpression>> args) throws AlgebricksException {
         if (signature.getNamespace() == null) {
             return null;
         }
@@ -788,6 +793,8 @@
     public Pair<ILogicalOperator, LogicalVariable> visit(GroupbyClause gc, Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
         Mutable<ILogicalOperator> topOp = tupSource;
+
+        LogicalVariable groupRecordVar = null;
         if (gc.hasGroupVar()) {
             List<Pair<Expression, Identifier>> groupFieldList = gc.getGroupFieldList();
             List<Mutable<ILogicalExpression>> groupRecordConstructorArgList = new ArrayList<>();
@@ -799,13 +806,14 @@
                 ILogicalExpression groupFieldExpr = langExprToAlgExpression(groupField.first, topOp).first;
                 groupRecordConstructorArgList.add(new MutableObject<>(groupFieldExpr));
             }
-            LogicalVariable groupVar = context.newVarFromExpression(gc.getGroupVar());
-            AssignOperator groupVarAssignOp = new AssignOperator(groupVar,
-                    new MutableObject<>(new ScalarFunctionCallExpression(
-                            FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR),
-                            groupRecordConstructorArgList)));
-            groupVarAssignOp.getInputs().add(topOp);
-            topOp = new MutableObject<>(groupVarAssignOp);
+            MutableObject<ILogicalExpression> groupRecordConstr = new MutableObject<>(new ScalarFunctionCallExpression(
+                    FunctionUtil.getFunctionInfo(BuiltinFunctions.OPEN_RECORD_CONSTRUCTOR),
+                    groupRecordConstructorArgList));
+
+            groupRecordVar = context.newVar();
+            AssignOperator groupRecordVarAssignOp = new AssignOperator(groupRecordVar, groupRecordConstr);
+            groupRecordVarAssignOp.getInputs().add(topOp);
+            topOp = new MutableObject<>(groupRecordVarAssignOp);
         }
 
         GroupByOperator gOp = new GroupByOperator();
@@ -825,30 +833,46 @@
         }
 
         gOp.getInputs().add(topOp);
-        for (Entry<Expression, VariableExpr> entry : gc.getWithVarMap().entrySet()) {
-            Pair<ILogicalExpression, Mutable<ILogicalOperator>> listifyInput = langExprToAlgExpression(entry.getKey(),
+
+        if (gc.hasGroupVar()) {
+            VariableExpr groupVar = gc.getGroupVar();
+            LogicalVariable groupLogicalVar = context.newVar();
+            ILogicalPlan nestedPlan = createNestedPlanWithAggregate(groupLogicalVar, BuiltinFunctions.LISTIFY,
+                    new VariableReferenceExpression(groupRecordVar),
                     new MutableObject<>(new NestedTupleSourceOperator(new MutableObject<>(gOp))));
-            List<Mutable<ILogicalExpression>> flArgs = new ArrayList<>(1);
-            flArgs.add(new MutableObject<>(listifyInput.first));
-            AggregateFunctionCallExpression fListify =
-                    BuiltinFunctions.makeAggregateFunctionExpression(BuiltinFunctions.LISTIFY, flArgs);
-            LogicalVariable aggVar = context.newVar();
-            AggregateOperator agg = new AggregateOperator(mkSingletonArrayList(aggVar),
-                    mkSingletonArrayList(new MutableObject<>(fListify)));
-
-            agg.getInputs().add(listifyInput.second);
-
-            ILogicalPlan plan = new ALogicalPlanImpl(new MutableObject<>(agg));
-            gOp.getNestedPlans().add(plan);
-            // Hide the variable that was part of the "with", replacing it with
-            // the one bound by the aggregation op.
-            context.setVar(entry.getValue(), aggVar);
+            gOp.getNestedPlans().add(nestedPlan);
+            context.setVar(groupVar, groupLogicalVar);
         }
+
+        if (gc.hasWithMap()) {
+            for (Entry<Expression, VariableExpr> entry : gc.getWithVarMap().entrySet()) {
+                VariableExpr withVar = entry.getValue();
+                Expression withExpr = entry.getKey();
+                Pair<ILogicalExpression, Mutable<ILogicalOperator>> listifyInput = langExprToAlgExpression(withExpr,
+                        new MutableObject<>(new NestedTupleSourceOperator(new MutableObject<>(gOp))));
+                LogicalVariable withLogicalVar = context.newVar();
+                ILogicalPlan nestedPlan = createNestedPlanWithAggregate(withLogicalVar, BuiltinFunctions.LISTIFY,
+                        listifyInput.first, listifyInput.second);
+                gOp.getNestedPlans().add(nestedPlan);
+                context.setVar(withVar, withLogicalVar);
+            }
+        }
+
         gOp.setGroupAll(gc.isGroupAll());
         gOp.getAnnotations().put(OperatorAnnotations.USE_HASH_GROUP_BY, gc.hasHashGroupByHint());
         return new Pair<>(gOp, null);
     }
 
+    private ILogicalPlan createNestedPlanWithAggregate(LogicalVariable aggOutputVar, FunctionIdentifier aggFunc,
+            ILogicalExpression aggFnInput, Mutable<ILogicalOperator> aggOpInput) {
+        AggregateFunctionCallExpression aggFnCall = BuiltinFunctions.makeAggregateFunctionExpression(aggFunc,
+                mkSingletonArrayList(new MutableObject<>(aggFnInput)));
+        AggregateOperator aggOp = new AggregateOperator(mkSingletonArrayList(aggOutputVar),
+                mkSingletonArrayList(new MutableObject<>(aggFnCall)));
+        aggOp.getInputs().add(aggOpInput);
+        return new ALogicalPlanImpl(new MutableObject<>(aggOp));
+    }
+
     @Override
     public Pair<ILogicalOperator, LogicalVariable> visit(IfExpr ifexpr, Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
@@ -1264,8 +1288,11 @@
             Mutable<ILogicalOperator> topOpRef) throws CompilationException {
         switch (expr.getKind()) {
             case VARIABLE_EXPRESSION:
-                VariableReferenceExpression ve =
-                        new VariableReferenceExpression(context.getVar(((VariableExpr) expr).getVar().getId()));
+                LogicalVariable var = context.getVar(((VariableExpr) expr).getVar().getId());
+                if (var == null) {
+                    throw new IllegalStateException(String.valueOf(expr));
+                }
+                VariableReferenceExpression ve = new VariableReferenceExpression(var);
                 return new Pair<>(ve, topOpRef);
             case LITERAL_EXPRESSION:
                 LiteralExpr val = (LiteralExpr) expr;
@@ -1360,7 +1387,7 @@
                 || k == Kind.FIELD_ACCESSOR_EXPRESSION;
         noNesting = noNesting || k == Kind.INDEX_ACCESSOR_EXPRESSION || k == Kind.UNARY_EXPRESSION
                 || k == Kind.IF_EXPRESSION;
-        return noNesting || k == Kind.INDEPENDENT_SUBQUERY || k == Kind.CASE_EXPRESSION;
+        return noNesting || k == Kind.CASE_EXPRESSION;
 
     }
 
@@ -1406,8 +1433,8 @@
     }
 
     /**
-     * Eliminate shared operator references in a query plan.
-     * Deep copy a new query plan subtree whenever there is a shared operator reference.
+     * Eliminate shared operator references in a query plan. Deep copy a new query
+     * plan subtree whenever there is a shared operator reference.
      *
      * @param plan,
      *            the query plan.
@@ -1421,15 +1448,16 @@
     }
 
     /**
-     * Eliminate shared operator references in a query plan rooted at <code>currentOpRef.getValue()</code>.
-     * Deep copy a new query plan subtree whenever there is a shared operator reference.
+     * Eliminate shared operator references in a query plan rooted at
+     * <code>currentOpRef.getValue()</code>. Deep copy a new query plan subtree
+     * whenever there is a shared operator reference.
      *
      * @param currentOpRef,
      *            the operator reference to consider
      * @param opRefSet,
      *            the set storing seen operator references so far.
-     * @return a mapping that maps old variables to new variables, for the ancestors of
-     *         <code>currentOpRef</code> to replace variables properly.
+     * @return a mapping that maps old variables to new variables, for the ancestors
+     *         of <code>currentOpRef</code> to replace variables properly.
      * @throws CompilationException
      */
     private LinkedHashMap<LogicalVariable, LogicalVariable> eliminateSharedOperatorReference(
@@ -1441,9 +1469,12 @@
 
             // Recursively eliminates shared references in nested plans.
             if (currentOperator.hasNestedPlans()) {
-                // Since a nested plan tree itself can never be shared with another nested plan tree in
-                // another operator, the operation called in the if block does not need to replace
-                // any variables further for <code>currentOpRef.getValue()</code> nor its ancestor.
+                // Since a nested plan tree itself can never be shared with another nested plan
+                // tree in
+                // another operator, the operation called in the if block does not need to
+                // replace
+                // any variables further for <code>currentOpRef.getValue()</code> nor its
+                // ancestor.
                 AbstractOperatorWithNestedPlans opWithNestedPlan = (AbstractOperatorWithNestedPlans) currentOperator;
                 for (ILogicalPlan plan : opWithNestedPlan.getNestedPlans()) {
                     for (Mutable<ILogicalOperator> rootRef : plan.getRoots()) {
@@ -1465,7 +1496,8 @@
                     LinkedHashMap<LogicalVariable, LogicalVariable> cloneVarMap =
                             visitor.getInputToOutputVariableMapping();
 
-                    // Substitute variables according to the deep copy which generates new variables.
+                    // Substitute variables according to the deep copy which generates new
+                    // variables.
                     VariableUtilities.substituteVariables(currentOperator, cloneVarMap, null);
                     varMap.putAll(cloneVarMap);
 
@@ -1481,7 +1513,8 @@
                 // Substitute variables according to the new subtree.
                 VariableUtilities.substituteVariables(currentOperator, childVarMap, null);
 
-                // Updates mapping like <$a, $b> in varMap to <$a, $c>, where there is a mapping <$b, $c>
+                // Updates mapping like <$a, $b> in varMap to <$a, $c>, where there is a mapping
+                // <$b, $c>
                 // in childVarMap.
                 varMap.entrySet().forEach(entry -> {
                     LogicalVariable newVar = childVarMap.get(entry.getValue());
@@ -1512,7 +1545,8 @@
      *            the expression to select tuples that are processed by this branch.
      * @param branchExpression,
      *            the expression to be evaluated in this branch.
-     * @return a pair of the constructed subplan operator and the output variable for the branch.
+     * @return a pair of the constructed subplan operator and the output variable
+     *         for the branch.
      * @throws CompilationException
      */
     protected Pair<ILogicalOperator, LogicalVariable> constructSubplanOperatorForBranch(ILogicalOperator inputOp,
@@ -1523,7 +1557,8 @@
         Mutable<ILogicalOperator> nestedSource =
                 new MutableObject<>(new NestedTupleSourceOperator(new MutableObject<>(subplanOp)));
         SelectOperator select = new SelectOperator(selectExpr, false, null);
-        // The select operator cannot be moved up and down, otherwise it will cause typing issues (ASTERIXDB-1203).
+        // The select operator cannot be moved up and down, otherwise it will cause
+        // typing issues (ASTERIXDB-1203).
         OperatorPropertiesUtil.markMovable(select, false);
         select.getInputs().add(nestedSource);
         Pair<ILogicalOperator, LogicalVariable> pBranch = branchExpression.accept(this, new MutableObject<>(select));
@@ -1552,12 +1587,14 @@
         return new AssignOperator(v1, new MutableObject<>(comparison));
     }
 
-    // Generates the filter condition for whether a conditional branch should be executed.
+    // Generates the filter condition for whether a conditional branch should be
+    // executed.
     protected Mutable<ILogicalExpression> generateNoMatchedPrecedingWhenBranchesFilter(
             List<ILogicalExpression> inputBooleanExprs) {
         List<Mutable<ILogicalExpression>> arguments = new ArrayList<>();
         for (ILogicalExpression inputBooleanExpr : inputBooleanExprs) {
-            // A NULL/MISSING valued WHEN expression does not lead to the corresponding THEN execution.
+            // A NULL/MISSING valued WHEN expression does not lead to the corresponding THEN
+            // execution.
             // Therefore, we should check a previous WHEN boolean condition is not unknown.
             arguments.add(generateAndNotIsUnknownWrap(inputBooleanExpr));
         }
@@ -1572,7 +1609,7 @@
         List<Mutable<ILogicalExpression>> arguments = new ArrayList<>();
         arguments.add(new MutableObject<>(logicalExpr));
         Mutable<ILogicalExpression> expr = new MutableObject<>(
-                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_UNKOWN),
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.IS_UNKNOWN),
                         new ArrayList<>(Collections.singletonList(new MutableObject<>(logicalExpr)))));
         arguments.add(new MutableObject<>(new ScalarFunctionCallExpression(
                 FunctionUtil.getFunctionInfo(BuiltinFunctions.NOT), new ArrayList<>(Collections.singletonList(expr)))));
@@ -1580,7 +1617,8 @@
                 new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.AND), arguments));
     }
 
-    // Generates the plan for "UNION ALL" or union expression from its input expressions.
+    // Generates the plan for "UNION ALL" or union expression from its input
+    // expressions.
     protected Pair<ILogicalOperator, LogicalVariable> translateUnionAllFromInputExprs(List<ILangExpression> inputExprs,
             Mutable<ILogicalOperator> tupSource) throws CompilationException {
         List<Mutable<ILogicalOperator>> inputOpRefsToUnion = new ArrayList<>();
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
new file mode 100644
index 0000000..4866c6d
--- /dev/null
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/ResultProperties.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.translator;
+
+import java.io.Serializable;
+
+public class ResultProperties implements Serializable {
+
+    public static final long DEFAULT_MAX_READS = 1;
+    private final IStatementExecutor.ResultDelivery delivery;
+    private final long maxReads;
+
+    public ResultProperties(IStatementExecutor.ResultDelivery delivery) {
+        this(delivery, DEFAULT_MAX_READS);
+    }
+
+    public ResultProperties(IStatementExecutor.ResultDelivery delivery, long maxReads) {
+        this.delivery = delivery;
+        this.maxReads = maxReads;
+    }
+
+    public IStatementExecutor.ResultDelivery getDelivery() {
+        return delivery;
+    }
+
+    public long getMaxReads() {
+        return maxReads;
+    }
+
+    public ResultProperties getNcToCcResultProperties() {
+        if (delivery != IStatementExecutor.ResultDelivery.IMMEDIATE) {
+            return this;
+        }
+        // switch IMMEDIATE to DEFERRED since the result will be severed by the NC
+        return new ResultProperties(IStatementExecutor.ResultDelivery.DEFERRED, maxReads);
+    }
+}
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionConfig.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionConfig.java
index 6e67612..cb6d8e5 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionConfig.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionConfig.java
@@ -21,9 +21,9 @@
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 
 /**
  * SessionConfig captures several different parameters for controlling
@@ -61,10 +61,8 @@
         public static PlanFormat get(String fmtString, String label, PlanFormat defaultFmt, Logger logger) {
             try {
                 if (fmtString != null) {
-                    String format =
-                            ("JSON".equalsIgnoreCase(fmtString) || "CLEAN_JSON".equalsIgnoreCase(fmtString))
-                                    ? "JSON"
-                                    : fmtString;
+                    String format = ("JSON".equalsIgnoreCase(fmtString) || "CLEAN_JSON".equalsIgnoreCase(fmtString))
+                            ? "JSON" : fmtString;
                     return PlanFormat.valueOf(format);
                 }
             } catch (IllegalArgumentException e) {
@@ -168,6 +166,7 @@
     public SessionConfig(OutputFormat fmt, boolean optimize, boolean executeQuery, boolean generateJobSpec) {
         this(fmt, optimize, executeQuery, generateJobSpec, PlanFormat.STRING);
     }
+
     public SessionConfig(OutputFormat fmt, boolean optimize, boolean executeQuery, boolean generateJobSpec,
             PlanFormat lpfmt) {
         this.fmt = fmt;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionOutput.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionOutput.java
index b559df8..f7031a4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionOutput.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SessionOutput.java
@@ -20,6 +20,7 @@
 package org.apache.asterix.translator;
 
 import java.io.PrintWriter;
+import java.io.StringWriter;
 
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.prettyprint.AlgebricksAppendable;
@@ -29,6 +30,8 @@
 
     // Output path for primary execution.
     private final PrintWriter out;
+    private StringWriter buffer;
+    private PrintWriter bufferedOut;
 
     private final SessionOutput.ResultDecorator preResultDecorator;
     private final SessionOutput.ResultDecorator postResultDecorator;
@@ -53,7 +56,31 @@
      * Retrieve the PrintWriter to produce output to.
      */
     public PrintWriter out() {
-        return this.out;
+        return this.bufferedOut != null ? this.bufferedOut : this.out;
+    }
+
+    /**
+     * buffer the data provided to the PrintWriter returned by out() to be able to set the status of the response
+     * message when it can be determined. This is a no-op, if data is already buffered.
+     */
+    public void hold() {
+        if (this.bufferedOut == null) {
+            this.buffer = new StringWriter();
+            this.bufferedOut = new PrintWriter(this.buffer);
+        }
+    }
+
+    /**
+     * release the data that was buffered by calling hold() and remove the buffer from the pipeline.
+     * This is a no-op, if data is not buffered.
+     */
+    public void release() {
+        if (this.bufferedOut != null) {
+            this.bufferedOut.flush();
+            this.out.write(buffer.toString());
+            this.bufferedOut = null;
+            this.buffer = null;
+        }
     }
 
     public AlgebricksAppendable resultPrefix(AlgebricksAppendable app) throws AlgebricksException {
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
index d37c7af..200cc6f 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/SqlppExpressionToPlanTranslator.java
@@ -54,7 +54,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.optype.JoinType;
 import org.apache.asterix.lang.sqlpp.optype.SetOpType;
@@ -169,17 +168,6 @@
     }
 
     @Override
-    public Pair<ILogicalOperator, LogicalVariable> visit(IndependentSubquery independentSubquery,
-            Mutable<ILogicalOperator> tupleSource) throws CompilationException {
-        Pair<ILogicalExpression, Mutable<ILogicalOperator>> eo =
-                langExprToAlgExpression(independentSubquery.getExpr(), tupleSource);
-        LogicalVariable var = context.newVar();
-        AssignOperator assignOp = new AssignOperator(var, new MutableObject<ILogicalExpression>(eo.first));
-        assignOp.getInputs().add(eo.second);
-        return new Pair<>(assignOp, var);
-    }
-
-    @Override
     public Pair<ILogicalOperator, LogicalVariable> visit(SelectSetOperation selectSetOperation,
             Mutable<ILogicalOperator> tupSource) throws CompilationException {
         SetOperationInput leftInput = selectSetOperation.getLeftInput();
@@ -357,8 +345,8 @@
             }
 
             // Adds an aggregate operator to listfy unnest variables.
-            AggregateFunctionCallExpression fListify = BuiltinFunctions
-                    .makeAggregateFunctionExpression(BuiltinFunctions.LISTIFY, mkSingletonArrayList(
+            AggregateFunctionCallExpression fListify =
+                    BuiltinFunctions.makeAggregateFunctionExpression(BuiltinFunctions.LISTIFY, mkSingletonArrayList(
                             new MutableObject<ILogicalExpression>(new VariableReferenceExpression(varToListify))));
 
             LogicalVariable aggVar = context.newSubplanOutputVar();
@@ -522,8 +510,8 @@
 
                 // A "THEN" branch can be entered only when the tuple has not enter any other preceding
                 // branches and the current "WHEN" condition is TRUE.
-                branchEntraceConditionExprRef = new MutableObject<>(new ScalarFunctionCallExpression(
-                        FunctionUtil.getFunctionInfo(BuiltinFunctions.AND), andArgs));
+                branchEntraceConditionExprRef = new MutableObject<>(
+                        new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.AND), andArgs));
             }
 
             // Translates the corresponding "THEN" expression.
@@ -551,8 +539,8 @@
             arguments.add(new MutableObject<>(argVar));
         }
         arguments.add(new MutableObject<>(new VariableReferenceExpression(opAndVarForElse.second)));
-        AbstractFunctionCallExpression swithCaseExpr = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.SWITCH_CASE), arguments);
+        AbstractFunctionCallExpression swithCaseExpr =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.SWITCH_CASE), arguments);
         AssignOperator assignOp = new AssignOperator(selectVar, new MutableObject<>(swithCaseExpr));
         assignOp.getInputs().add(new MutableObject<>(opAndVarForElse.first));
 
@@ -674,9 +662,11 @@
         for (GbyVariableExpressionPair pair : groupbyClause.getGbyPairList()) {
             fieldBindings.add(getFieldBinding(pair.getVar()));
         }
-        if (groupbyClause.hasWithMap() && groupbyClause.hasGroupVar()) {
-            // Makes sure that we add the re-mapped group variable which refers to a collection.
-            fieldBindings.add(getFieldBinding(groupbyClause.getWithVarMap().get(groupbyClause.getGroupVar())));
+        if (groupbyClause.hasGroupVar()) {
+            fieldBindings.add(getFieldBinding(groupbyClause.getGroupVar()));
+        }
+        if (groupbyClause.hasWithMap()) {
+            throw new IllegalStateException(groupbyClause.getWithVarMap().values().toString()); // no WITH in SQLPP
         }
         return fieldBindings;
     }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
index 1344e0c..33653ad 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TranslationContext.java
@@ -97,7 +97,6 @@
         return var;
     }
 
-
     public void setVar(VariableExpr v, LogicalVariable var) {
         currentVarMap.put(v.getVar().getId(), var);
     }
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
index e50c7ca..9edfddb 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/TypeTranslator.java
@@ -27,13 +27,12 @@
 
 import org.apache.asterix.common.annotations.IRecordFieldDataGen;
 import org.apache.asterix.common.annotations.RecordDataGenAnnotation;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
+import org.apache.asterix.lang.common.expression.RecordTypeDefinition.RecordKind;
 import org.apache.asterix.lang.common.expression.TypeExpression;
 import org.apache.asterix.lang.common.expression.TypeReferenceExpression;
 import org.apache.asterix.lang.common.expression.UnorderedListTypeDefinition;
-import org.apache.asterix.lang.common.expression.RecordTypeDefinition.RecordKind;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.entities.BuiltinTypeMap;
@@ -61,8 +60,7 @@
     }
 
     public static Map<TypeSignature, IAType> computeTypes(MetadataTransactionContext mdTxnCtx, TypeExpression typeExpr,
-            String typeName, String typeDataverse, Map<TypeSignature, IAType> typeMap)
-            throws AlgebricksException {
+            String typeName, String typeDataverse, Map<TypeSignature, IAType> typeMap) throws AlgebricksException {
         Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes = new HashMap<>();
         Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes = new HashMap<>();
         Map<TypeSignature, List<TypeSignature>> incompleteTopLevelTypeReferences = new HashMap<>();
@@ -89,48 +87,43 @@
             throw new AlgebricksException("Cannot redefine builtin type " + typeName + " .");
         }
         TypeSignature typeSignature = new TypeSignature(typeDataverse, typeName);
-        try {
-            switch (typeExpr.getTypeKind()) {
-                case TYPEREFERENCE: {
-                    TypeReferenceExpression tre = (TypeReferenceExpression) typeExpr;
-                    IAType t = solveTypeReference(new TypeSignature(
-                            tre.getIdent().first == null ? typeDataverse : tre.getIdent().first.getValue(),
-                            tre.getIdent().second.getValue()), typeMap);
-                    if (t != null) {
-                        typeMap.put(typeSignature, t);
-                    } else {
-                        addIncompleteTopLevelTypeReference(tre, incompleteTopLevelTypeReferences,
-                                typeDataverse);
-                    }
-                    break;
+        switch (typeExpr.getTypeKind()) {
+            case TYPEREFERENCE: {
+                TypeReferenceExpression tre = (TypeReferenceExpression) typeExpr;
+                IAType t = solveTypeReference(new TypeSignature(
+                        tre.getIdent().first == null ? typeDataverse : tre.getIdent().first.getValue(),
+                        tre.getIdent().second.getValue()), typeMap);
+                if (t != null) {
+                    typeMap.put(typeSignature, t);
+                } else {
+                    addIncompleteTopLevelTypeReference(tre, incompleteTopLevelTypeReferences, typeDataverse);
                 }
-                case RECORD: {
-                    RecordTypeDefinition rtd = (RecordTypeDefinition) typeExpr;
-                    ARecordType recType = computeRecordType(typeSignature, rtd, typeMap, incompleteFieldTypes,
-                            incompleteItemTypes, typeDataverse);
-                    typeMap.put(typeSignature, recType);
-                    break;
-                }
-                case ORDEREDLIST: {
-                    OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) typeExpr;
-                    AOrderedListType olType = computeOrderedListType(typeSignature, oltd, typeMap, incompleteItemTypes,
-                            incompleteFieldTypes, typeDataverse);
-                    typeMap.put(typeSignature, olType);
-                    break;
-                }
-                case UNORDEREDLIST: {
-                    UnorderedListTypeDefinition ultd = (UnorderedListTypeDefinition) typeExpr;
-                    AUnorderedListType ulType = computeUnorderedListType(typeSignature, ultd, typeMap,
-                            incompleteItemTypes, incompleteFieldTypes, typeDataverse);
-                    typeMap.put(typeSignature, ulType);
-                    break;
-                }
-                default: {
-                    throw new IllegalStateException();
-                }
+                break;
             }
-        } catch (AsterixException e) {
-            throw new AlgebricksException(e);
+            case RECORD: {
+                RecordTypeDefinition rtd = (RecordTypeDefinition) typeExpr;
+                ARecordType recType = computeRecordType(typeSignature, rtd, typeMap, incompleteFieldTypes,
+                        incompleteItemTypes, typeDataverse);
+                typeMap.put(typeSignature, recType);
+                break;
+            }
+            case ORDEREDLIST: {
+                OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) typeExpr;
+                AOrderedListType olType = computeOrderedListType(typeSignature, oltd, typeMap, incompleteItemTypes,
+                        incompleteFieldTypes, typeDataverse);
+                typeMap.put(typeSignature, olType);
+                break;
+            }
+            case UNORDEREDLIST: {
+                UnorderedListTypeDefinition ultd = (UnorderedListTypeDefinition) typeExpr;
+                AUnorderedListType ulType = computeUnorderedListType(typeSignature, ultd, typeMap, incompleteItemTypes,
+                        incompleteFieldTypes, typeDataverse);
+                typeMap.put(typeSignature, ulType);
+                break;
+            }
+            default: {
+                throw new IllegalStateException();
+            }
         }
     }
 
@@ -204,7 +197,7 @@
     private static AOrderedListType computeOrderedListType(TypeSignature typeSignature, OrderedListTypeDefinition oltd,
             Map<TypeSignature, IAType> typeMap, Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
             Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, String defaultDataverse)
-            throws AsterixException {
+            throws AlgebricksException {
         TypeExpression tExpr = oltd.getItemTypeExpression();
         String typeName = typeSignature != null ? typeSignature.getName() : null;
         AOrderedListType aolt = new AOrderedListType(null, typeName);
@@ -216,7 +209,7 @@
             UnorderedListTypeDefinition ultd, Map<TypeSignature, IAType> typeMap,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
             Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, String defaulDataverse)
-            throws AsterixException {
+            throws AlgebricksException {
         TypeExpression tExpr = ultd.getItemTypeExpression();
         String typeName = typeSignature != null ? typeSignature.getName() : null;
         AUnorderedListType ault = new AUnorderedListType(null, typeName);
@@ -227,7 +220,7 @@
     private static void setCollectionItemType(TypeExpression tExpr, Map<TypeSignature, IAType> typeMap,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes,
             Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes, AbstractCollectionType act,
-            String defaultDataverse) throws AsterixException {
+            String defaultDataverse) throws AlgebricksException {
         switch (tExpr.getTypeKind()) {
             case ORDEREDLIST: {
                 OrderedListTypeDefinition oltd = (OrderedListTypeDefinition) tExpr;
@@ -327,7 +320,7 @@
     private static ARecordType computeRecordType(TypeSignature typeSignature, RecordTypeDefinition rtd,
             Map<TypeSignature, IAType> typeMap, Map<String, Map<ARecordType, List<Integer>>> incompleteFieldTypes,
             Map<TypeSignature, List<AbstractCollectionType>> incompleteItemTypes, String defaultDataverse)
-            throws AsterixException {
+            throws AlgebricksException {
         List<String> names = rtd.getFieldNames();
         int n = names.size();
         String[] fldNames = new String[n];
@@ -337,8 +330,8 @@
             fldNames[i++] = s;
         }
         boolean isOpen = rtd.getRecordKind() == RecordKind.OPEN;
-        ARecordType recType = new ARecordType(typeSignature == null ? null : typeSignature.getName(), fldNames,
-                fldTypes, isOpen);
+        ARecordType recType =
+                new ARecordType(typeSignature == null ? null : typeSignature.getName(), fldNames, fldTypes, isOpen);
         List<IRecordFieldDataGen> fieldDataGen = rtd.getFieldDataGen();
         if (fieldDataGen.size() == n) {
             IRecordFieldDataGen[] rfdg = new IRecordFieldDataGen[n];
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/PlanTranslationUtil.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/PlanTranslationUtil.java
index 5e70baf..919bdf2 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/PlanTranslationUtil.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/PlanTranslationUtil.java
@@ -44,8 +44,8 @@
             List<Mutable<ILogicalExpression>> assignExpressions, List<LogicalVariable> vars,
             List<Mutable<ILogicalExpression>> varRefs, IVariableContext context) {
         IAObject value = (field.size() > 1) ? new AOrderedList(field) : new AString(field.get(0));
-        ScalarFunctionCallExpression metaKeyFunction = new ScalarFunctionCallExpression(
-                FunctionUtil.getFunctionInfo(BuiltinFunctions.META_KEY));
+        ScalarFunctionCallExpression metaKeyFunction =
+                new ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.META_KEY));
         metaKeyFunction.getArguments()
                 .add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(resVar)));
         metaKeyFunction.getArguments()
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/ValidateUtil.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/ValidateUtil.java
index d262bb8..4b4b2b0 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/ValidateUtil.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/util/ValidateUtil.java
@@ -118,6 +118,10 @@
             }
             List<String> fieldName = partitioningExprs.get(0);
             IAType fieldType = recType.getSubFieldType(fieldName);
+            if (fieldType == null) {
+                String unTypeField = fieldName.get(0) == null ? "" : fieldName.get(0);
+                throw new CompilationException(ErrorCode.COMPILATION_FIELD_NOT_FOUND, unTypeField);
+            }
             partitioningExprTypes.add(fieldType);
             ATypeTag pkTypeTag = fieldType.getTypeTag();
             if (pkTypeTag != ATypeTag.UUID) {
@@ -174,9 +178,9 @@
      *            the type of the index that its key fields is being validated
      * @throws AlgebricksException
      */
-    public static void validateKeyFields(ARecordType recType, ARecordType metaRecType,
-            List<List<String>> keyFieldNames, List<Integer> keySourceIndicators, List<IAType> keyFieldTypes,
-            IndexType indexType) throws AlgebricksException {
+    public static void validateKeyFields(ARecordType recType, ARecordType metaRecType, List<List<String>> keyFieldNames,
+            List<Integer> keySourceIndicators, List<IAType> keyFieldTypes, IndexType indexType)
+            throws AlgebricksException {
         List<IAType> fieldTypes =
                 KeyFieldTypeUtil.getKeyTypes(recType, metaRecType, keyFieldNames, keySourceIndicators);
         int pos = 0;
diff --git a/asterixdb/asterix-app/data/json/double-150-11.json b/asterixdb/asterix-app/data/json/double-150-11.json
new file mode 100644
index 0000000..c1f3de5
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/double-150-11.json
@@ -0,0 +1 @@
+{"double_value" : 150.11}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/duplicate-fields.json b/asterixdb/asterix-app/data/json/duplicate-fields.json
new file mode 100644
index 0000000..ce9fa4e
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/duplicate-fields.json
@@ -0,0 +1 @@
+{"field": 1, "field": 2}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/geometry.json b/asterixdb/asterix-app/data/json/geometry.json
new file mode 100644
index 0000000..bbdf1e0
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/geometry.json
@@ -0,0 +1,5 @@
+{
+"point_value": {"coordinates":[10.0, 10.0], "type":"Point"},
+"line_value": {"coordinates":[[10.0, 10.0], [11.0, 11.0]], "type":"LineString"},
+"polygon_value": {"coordinates":[[[10.0, 10.0], [11.0, 11.0], [10.0, 10.0]]], "type":"Polygon"}
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/int-100.json b/asterixdb/asterix-app/data/json/int-100.json
new file mode 100644
index 0000000..608a839
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/int-100.json
@@ -0,0 +1 @@
+{"int_value" : 100}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/int-1000.json b/asterixdb/asterix-app/data/json/int-1000.json
new file mode 100644
index 0000000..04305be
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/int-1000.json
@@ -0,0 +1 @@
+{"int_value" : 1000}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/line-3-points.json b/asterixdb/asterix-app/data/json/line-3-points.json
new file mode 100644
index 0000000..5c18d9f
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/line-3-points.json
@@ -0,0 +1,3 @@
+{
+"line_value": {"coordinates":[[30.0, 10.0], [10.0, 30.0], [40.0, 40.0]], "type":"LineString"}
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/malformed-json.json b/asterixdb/asterix-app/data/json/malformed-json.json
new file mode 100644
index 0000000..d03a85f
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/malformed-json.json
@@ -0,0 +1 @@
+{"field": 1,}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/null-missing.json b/asterixdb/asterix-app/data/json/null-missing.json
new file mode 100644
index 0000000..74f48ca
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/null-missing.json
@@ -0,0 +1 @@
+{"int_value" : 1000, "null_value":null}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/polygon-with-hole.json b/asterixdb/asterix-app/data/json/polygon-with-hole.json
new file mode 100644
index 0000000..58687b9
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/polygon-with-hole.json
@@ -0,0 +1 @@
+{"polygon_with_hole" : { "type": "Polygon", "coordinates": [[[35.0, 10.0], [45.0, 45.0], [15.0, 40.0], [10.0, 20.0], [35.0, 10.0]], [[20.0, 30.0], [35.0, 35.0], [30.0, 20.0], [20.0, 30.0]]]}}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/temporal.json b/asterixdb/asterix-app/data/json/temporal.json
new file mode 100644
index 0000000..39b3a81
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/temporal.json
@@ -0,0 +1 @@
+{"datefield":"-2012-12-12", "dateFieldPlus": "0990-01-01", "timeField": "23:49:12.39Z", "timeFieldPlus": "03:23:12.2", "datetimeField": "2012-12-12T00:00:00.001", "datetimeFieldPlus": "-00130810T221015398"}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/data/json/unclosed-polygon.json b/asterixdb/asterix-app/data/json/unclosed-polygon.json
new file mode 100644
index 0000000..caacb5d
--- /dev/null
+++ b/asterixdb/asterix-app/data/json/unclosed-polygon.json
@@ -0,0 +1,3 @@
+{
+"polygon_value": {"coordinates":[[[10.0, 10.0], [11.0, 11.0], [10.0, 11.0]]], "type":"Polygon"}
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/pom.xml b/asterixdb/asterix-app/pom.xml
index 6625cc3..e75ad42 100644
--- a/asterixdb/asterix-app/pom.xml
+++ b/asterixdb/asterix-app/pom.xml
@@ -34,6 +34,7 @@
     </license>
   </licenses>
   <properties>
+    <root.dir>${basedir}/..</root.dir>
     <appendedResourcesDirectory>${basedir}/src/main/appended-resources</appendedResourcesDirectory>
     <sonar.sources>pom.xml,src/main/java,src/main/resources</sonar.sources>
   </properties>
@@ -121,6 +122,7 @@
                 </includes>
               </inputFiles>
               <outputDir>target/data</outputDir>
+              <skip>${skip.testResources}</skip>
             </configuration>
           </execution>
         </executions>
@@ -176,10 +178,13 @@
                 <exclude>src/test/resources/**/results/**</exclude>
                 <exclude>src/test/resources/fuzzyjoin/pub/fuzzy-join-aql*.dot</exclude>
                 <exclude>src/test/resources/fuzzyjoin/pub/fuzzy-join-aql*.json</exclude>
-                <exclude>data/**</exclude>
+                <exclude>**/data/**</exclude>
+                <exclude>src/test//resources/**/data/**</exclude>
                 <exclude>src/main/resources/queryui/**</exclude>
                 <exclude>src/main/resources/webui/**</exclude>
                 <exclude>src/test/resources/**/only*.xml</exclude>
+                <exclude>src/main/resources/sdk/**</exclude>
+                <exclude>src/main/resources/dashboard/**</exclude>
               </excludes>
             </configuration>
           </execution>
@@ -276,13 +281,66 @@
         </plugins>
       </build>
     </profile>
+    <profile>
+      <id>asterix-gerrit-asterix-app</id>
+      <properties>
+        <test.excludes>**/SqlppExecutionWithCancellationTest.java,**/DmlTest.java,**/RepeatedTest.java,**/SqlppExecutionTest.java</test.excludes>
+      </properties>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>SqlppExecutionTest</id>
+                <configuration>
+                  <includes combine.self="override">
+                    <include>**/SqlppExecutionTest.java</include>
+                  </includes>
+                  <excludes combine.self="override"/>
+                  <argLine>
+                    -enableassertions -Xmx${test.heap.size}m
+                    -Dfile.encoding=UTF-8
+                    -Xdebug
+                    -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=${debug.suspend.flag}
+                    -Xloggc:"${project.build.directory}/surefire-reports/SqlppExecutionTest-%p-gc.log" -XX:+PrintGC -XX:+PrintGCDateStamps -XX:GCLogFileSize=10M
+                  </argLine>
+                </configuration>
+                <goals>
+                  <goal>test</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>asterix-gerrit-asterix-app-sql-execution</id>
+      <properties>
+        <test.includes/>
+        <itest.includes>**/SqlppExecution*IT.java</itest.includes>
+        <failIfNoTests>false</failIfNoTests>
+      </properties>
+    </profile>
+    <profile>
+      <id>asterix-gerrit-verify-asterix-app</id>
+      <properties>
+        <test.includes/>
+        <itest.excludes>**/SqlppExecution*IT.java,**/RebalanceWithCancellationIT.java</itest.excludes>
+        <failIfNoTests>false</failIfNoTests>
+      </properties>
+    </profile>
+    <profile>
+      <id>asterix-gerrit-rebalance-cancellation</id>
+      <properties>
+        <test.includes>**/RebalanceWithCancellationIT.java</test.includes>
+      </properties>
+    </profile>
   </profiles>
   <dependencies>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-control-cc</artifactId>
     </dependency>
@@ -328,6 +386,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.asterix</groupId>
+      <artifactId>asterix-dashboard</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.asterix</groupId>
       <artifactId>asterix-common</artifactId>
       <version>${project.version}</version>
       <type>test-jar</type>
@@ -410,15 +473,6 @@
       <artifactId>hyracks-storage-am-lsm-btree</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-events</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-hdfs</artifactId>
       <classifier>tests</classifier>
@@ -448,8 +502,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-compress</artifactId>
-      <version>1.4.1</version>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
@@ -577,5 +629,19 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-comm</artifactId>
+      <version>${hyracks.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-jul</artifactId>
+      <version>2.10.0</version>
+    </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE b/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
index 68b143c..4ad6d94 100644
--- a/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
+++ b/asterixdb/asterix-app/src/main/appended-resources/META-INF/LICENSE
@@ -73,183 +73,6 @@
    even a nice Tweet is enough. Of course if you want, you can say thank you and
    support me by buying more icons on GLYPHICONS.com.
 ---
-   Portions of the AsterixDB QueryUI
-       located at:
-         queryui/js/json-formatter.min.js,
-       and
-         queryui/css/json-formatter.min.css
-
-   are available under the following license:
----
-   Copyright 2014 Mohsen Azimi
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
----
-   Portions of the AsterixDB QueryUI
-       located at:
-         queryui/js/bootstrap.min.js,
-         queryui/css/bootstrap.min.css,
-         queryui/css/bootstrap-theme.min.css,
-         queryui/fonts/glyphicons-halflings-regular.eot,
-         queryui/fonts/glyphicons-halflings-regular.svg,
-         queryui/fonts/glyphicons-halflings-regular.ttf,
-         queryui/fonts/glyphicons-halflings-regular.woff,
-       and
-         queryui/fonts/glyphicons-halflings-regular.woff2
-
-   are available under the following license:
----
-   The MIT License (MIT)
-
-   Copyright (c) 2011-2015 Twitter, Inc
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is
-   furnished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-   THE SOFTWARE.
-
-   queryui/css/bootstrap.min.css also contains normalize.css v3.0.3
-   (http://github.com/necolas/normalize.css), having the following copyright:
-   --
-   Copyright © Nicolas Gallagher and Jonathan Neal
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy of
-   this software and associated documentation files (the "Software"), to deal in
-   the Software without restriction, including without limitation the rights to
-   use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-   the Software, and to permit persons to whom the Software is furnished to do so,
-   subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in all
-   copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-   --
-
-   Credit for font files: queryui/fonts/glyphicons-halflings-regular.eot,
-                          queryui/fonts/glyphicons-halflings-regular.svg,
-                          queryui/fonts/glyphicons-halflings-regular.ttf,
-                          queryui/fonts/glyphicons-halflings-regular.woff,
-                        and
-                          queryui/fonts/glyphicons-halflings-regular.woff2
-
-   GLYPHICONS Halflings font is also released as an extension of a Bootstrap
-   (www.getbootstrap.com) for free and it is released under the same license as
-   Bootstrap. While you are not required to include attribution on your
-   Bootstrap-based projects, I would certainly appreciate any form of support,
-   even a nice Tweet is enough. Of course if you want, you can say thank you and
-   support me by buying more icons on GLYPHICONS.com.
----
-
-   Portions of the AsterixDB QueryUI
-       located at:
-         queryui/js/angular.min.js
-
-   are available under The MIT License:
----
-   Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is
-   furnished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-   THE SOFTWARE.
----
-   Portions of the AsterixDB QueryUI
-       located at:
-         queryui/js/codemirror.js,
-         queryui/js/javascript.js,
-       and
-         queryui/css/codemirror.css
-
-   are available under The MIT License:
----
-   Copyright (C) 2016 by Marijn Haverbeke <marijnh@gmail.com> and others
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is
-   furnished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-   THE SOFTWARE.
----
-   Portions of the AsterixDB QueryUI
-       located at:
-         queryui/js/ui-codemirror.js
-
-   are available under The MIT License:
----
-   Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
-
-   Permission is hereby granted, free of charge, to any person obtaining a copy
-   of this software and associated documentation files (the "Software"), to deal
-   in the Software without restriction, including without limitation the rights
-   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-   copies of the Software, and to permit persons to whom the Software is
-   furnished to do so, subject to the following conditions:
-
-   The above copyright notice and this permission notice shall be included in
-   all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-   THE SOFTWARE.
----
     Portions of the AsterixDB WebUI
        located at:
          webui/static/js/jquery.json-viewer.js
@@ -278,4 +101,373 @@
     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     SOFTWARE.
+---
+  File Saver Portions of the AsterixDB Dashboard
+    located at:
+      dashboard/src/app/dashboard/query/ouput.component.ts
+      dashboard/static/main.37b7b7cad656490b195a.bundle.js
+      dashboard/static/styles.9f50282210bba5318775.bundle
+      dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+      dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+      dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+      dashboard/static/index.html
+
+    are available under The MIT License:
+---
+The MIT License
+
+Copyright © 2016 Eli Grey.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---
+ReactiveX/rxjs 
+    located at:
+        dashboard/src/app/dashboard/metadata/*.ts
+        dashboard/src/app/dashboard/metadata/datasets-collection/*.ts
+        dashboard/src/app/dashboard/metadata/datatypes-collection/*.ts
+        dashboard/src/app/dashboard/metadata/dataverses-collection/*.ts
+        dashboard/src/app/dashboard/query/*.ts
+        dashboard/src/app/dashboard/*.ts
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+is licensed under the Apache License 2.0
+---
+PrimeNG Portions of the AsterixDB Dashboard
+    located at:
+        dashboard/src/app/dashboard/query/output.component.ts
+        dashboard/src/app/dashboard/query/output.component.html
+        dashboard/src/app/dashboard/query/output.component.scss
+        dashboard/src/app/dashboard/query/metadata.component.ts
+        dashboard/src/app/dashboard/query/metadata.component.html
+        dashboard/src/app/dashboard/query/metadata.component.scss
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+are available under The MIT License:
+---
+The MIT License (MIT)
+
+Copyright (c) 2016-2017 PrimeTek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+---
+
+NGRX Portions of the AsterixDB Dashboard
+    located at:
+        dashboard/src/app/dashboard/metadata/*.ts
+        dashboard/src/app/dashboard/metadata/datasets-collection/*.ts
+        dashboard/src/app/dashboard/metadata/datatypes-collection/*.ts
+        dashboard/src/app/dashboard/metadata/dataverses-collection/*.ts
+        dashboard/src/app/dashboard/query/*.ts
+        dashboard/src/app/dashboard/*.ts
+        dashboard/src/app/dashboard/*.ts
+        dashboard/src/app/*.ts
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+are available under The MIT License:
+---
+The MIT License (MIT)
+
+Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+---
+Codemirror Portions of the AsterixDB Dashboard
+       located at:
+        dashboard/src/app/dashboard/query/input.component.ts
+        dashboard/src/app/dashboard/query/input.component.html
+        dashboard/src/app/dashboard/query/input.component.scss
+        dashboard/src/app/dashboard/query/codemirror.component.ts
+        dashboard/src/app/dashboard/query/codemirror.component.scss
+        dashboard/src/app/dashboard/metadata/input-metadata.component.ts
+        dashboard/src/app/dashboard/metadata/input-metadata.component.html
+        dashboard/src/app/dashboard/metadata/input-metadata.component.scss
+        dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
+        dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+   are available under The MIT License:
+---
+   MIT License
+
+Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---
+Angular Portions of the AsterixDB Dashboard
+       located at:
+        dashboard/src/
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+   are available under The MIT License:
+---
+The MIT License
+
+Copyright (c) 2014-2017 Google, Inc. http://angular.io
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---
+Angular Material, hammerjs Portions of the AsterixDB Dashboard
+       located at:
+   dashboard/src/app/dashboard/metadata/datasets-collection/
+   dashboard/src/app/material.module.ts
+   dashboard/src/main.ts
+   dashboard/static/main.37b7b7cad656490b195a.bundle.js
+   dashboard/static/styles.9f50282210bba5318775.bundle
+   dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+   dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+   dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+   dashboard/static/index.html
+
+    are available under The MIT License:
+- --
+    The MIT License
+
+C opyright (c) 2017 Google LLC.
+
+P ermission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+---
+Core JS Material Portions of the AsterixDB Dashboard
+       located at:
+        dashboard/src/
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+
+   are available under following License:
+   https://github.com/zloirock/core-js/blob/master/LICENSE
+---
+
+Copyright (c) 2014-2017 Denis Pushkarev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+---
+Roboto Font Portions of the AsterixDB Dashboard
+       located at:
+          dashboard/src/index.html
+          dashboard/static/roboto-v15-latin-regular.3d3a53586bd78d1069ae.svg
+          dashboard/static/roboto-v15-latin-regular.7e367be02cd17a96d513.woff2
+          dashboard/static/roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot
+          dashboard/static/roboto-v15-latin-regular.16e1d930cf13fb7a9563.woff
+          dashboard/static/roboto-v15-latin-regular.38861cba61c66739c145.ttf
+          dashboard/static/index.html
+   are available under following License: Apache2.0
+   https://github.com/google/roboto/blob/master/LICENSE
+---
+Font Awesome Portions of the AsterixDB Dashboard, used in primeng components
+        located at:
+          dashboard/src/index.html
+          dashboard/static/index.html
+
+    http://fontawesome.io/license/
+    Applies to all CSS and LESS files in the following directories if exist:
+    font-awesome/css/, font-awesome/less/, and font-awesome/scss/.
+    and downloaded from CDN network services and loaded in index.html
+    License: MIT License
+    URL: http://opensource.org/licenses/mit-license.html
+---
+webpack@3.8.1 portions of the AsterixDB Dashboard
+       located at:
+        dashboard/
+   are available under The MIT License:
+---
+MIT
+Copyright JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+---
+zone.js@0.8.18 Portions of the AsterixDB Dashboard
+       located at:
+        dashboard/src/
+        dashboard/static/main.37b7b7cad656490b195a.bundle.js
+        dashboard/static/styles.9f50282210bba5318775.bundle
+        dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
+        dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
+        dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
+        dashboard/static/index.html
+        
+   are available under The MIT License:
+---
+MIT
+The MIT License
+
+Copyright (c) 2016 Google, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
 ---
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
index 2078288..189a7e1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/APIFramework.java
@@ -20,8 +20,8 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.rmi.RemoteException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -32,12 +32,14 @@
 import org.apache.asterix.algebra.base.ILangExpressionToPlanTranslator;
 import org.apache.asterix.algebra.base.ILangExpressionToPlanTranslatorFactory;
 import org.apache.asterix.api.http.server.ResultUtil;
+import org.apache.asterix.common.api.INodeJobTracker;
 import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.common.config.OptimizationConfUtil;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.Job;
 import org.apache.asterix.common.utils.Job.SubmissionMode;
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
@@ -63,7 +65,6 @@
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.optimizer.base.FuzzyUtils;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
-import org.apache.asterix.transaction.management.service.transaction.JobIdFactory;
 import org.apache.asterix.translator.CompiledStatements.ICompiledDmlStatement;
 import org.apache.asterix.translator.IStatementExecutor.Stats;
 import org.apache.asterix.translator.SessionConfig;
@@ -92,6 +93,7 @@
 import org.apache.hyracks.algebricks.core.rewriter.base.AlgebricksOptimizationContext;
 import org.apache.hyracks.algebricks.core.rewriter.base.IOptimizationContextFactory;
 import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig;
+import org.apache.hyracks.algebricks.data.IPrinterFactoryProvider;
 import org.apache.hyracks.api.client.IClusterInfoCollector;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.client.NodeControllerInfo;
@@ -99,9 +101,11 @@
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.api.job.resource.IClusterCapacity;
 import org.apache.hyracks.control.common.config.OptionTypes;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
 import com.google.common.collect.ImmutableSet;
 
 /**
@@ -179,7 +183,7 @@
     }
 
     public Pair<IReturningStatement, Integer> reWriteQuery(List<FunctionDecl> declaredFunctions,
-            MetadataProvider metadataProvider, IReturningStatement q, SessionOutput output)
+            MetadataProvider metadataProvider, IReturningStatement q, SessionOutput output, boolean inlineUdfs)
             throws CompilationException {
         if (q == null) {
             return null;
@@ -192,75 +196,53 @@
             printPlanPostfix(output);
         }
         IQueryRewriter rw = rewriterFactory.createQueryRewriter();
-        rw.rewrite(declaredFunctions, q, metadataProvider, new LangRewritingContext(q.getVarCounter()));
+        rw.rewrite(declaredFunctions, q, metadataProvider, new LangRewritingContext(q.getVarCounter()), inlineUdfs);
         return new Pair<>(q, q.getVarCounter());
     }
 
     public JobSpecification compileQuery(IClusterInfoCollector clusterInfoCollector, MetadataProvider metadataProvider,
-            Query rwQ, int varCounter, String outputDatasetName, SessionOutput output, ICompiledDmlStatement statement)
-            throws AlgebricksException, RemoteException, ACIDException {
+            Query query, int varCounter, String outputDatasetName, SessionOutput output,
+            ICompiledDmlStatement statement) throws AlgebricksException, ACIDException {
+
+        // establish facts
+        final boolean isQuery = query != null;
+        final boolean isLoad = statement != null && statement.getKind() == Statement.Kind.LOAD;
 
         SessionConfig conf = output.config();
         if (!conf.is(SessionConfig.FORMAT_ONLY_PHYSICAL_OPS) && conf.is(SessionConfig.OOB_REWRITTEN_EXPR_TREE)) {
             output.out().println();
 
             printPlanPrefix(output, "Rewritten expression tree");
-            if (rwQ != null) {
-                rwQ.accept(astPrintVisitorFactory.createLangVisitor(output.out()), 0);
+            if (isQuery) {
+                query.accept(astPrintVisitorFactory.createLangVisitor(output.out()), 0);
             }
             printPlanPostfix(output);
         }
 
-        org.apache.asterix.common.transactions.JobId asterixJobId = JobIdFactory.generateJobId();
-        metadataProvider.setJobId(asterixJobId);
+        final TxnId txnId = metadataProvider.getTxnIdFactory().create();
+        metadataProvider.setTxnId(txnId);
         ILangExpressionToPlanTranslator t =
                 translatorFactory.createExpressionToPlanTranslator(metadataProvider, varCounter);
 
-        ILogicalPlan plan;
-        // statement = null when it's a query
-        if (statement == null || statement.getKind() != Statement.Kind.LOAD) {
-            plan = t.translate(rwQ, outputDatasetName, statement);
-        } else {
-            plan = t.translateLoad(statement);
-        }
+        ILogicalPlan plan = isLoad ? t.translateLoad(statement) : t.translate(query, outputDatasetName, statement);
 
         if (!conf.is(SessionConfig.FORMAT_ONLY_PHYSICAL_OPS) && conf.is(SessionConfig.OOB_LOGICAL_PLAN)) {
             output.out().println();
 
             printPlanPrefix(output, "Logical plan");
-            if (rwQ != null || (statement != null && statement.getKind() == Statement.Kind.LOAD)) {
-                AbstractLogicalOperatorPrettyPrintVisitor pvisitor;
-                if (output.config().getLpfmt().equals(SessionConfig.PlanFormat.JSON)) {
-                    pvisitor = new LogicalOperatorPrettyPrintVisitorJson(output.out());
-                } else {
-                    pvisitor = new LogicalOperatorPrettyPrintVisitor(output.out());
-
-                }
-                PlanPrettyPrinter.printPlan(plan, pvisitor, 0);
+            if (isQuery || isLoad) {
+                PlanPrettyPrinter.printPlan(plan, getPrettyPrintVisitor(output.config().getLpfmt(), output.out()), 0);
             }
             printPlanPostfix(output);
         }
         CompilerProperties compilerProperties = metadataProvider.getApplicationContext().getCompilerProperties();
-        int frameSize = compilerProperties.getFrameSize();
-        Map<String, String> querySpecificConfig = metadataProvider.getConfig();
-        validateConfig(querySpecificConfig); // Validates the user-overridden query parameters.
-        int sortFrameLimit = getFrameLimit(CompilerProperties.COMPILER_SORTMEMORY_KEY,
-                querySpecificConfig.get(CompilerProperties.COMPILER_SORTMEMORY_KEY),
-                compilerProperties.getSortMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_SORT);
-        int groupFrameLimit = getFrameLimit(CompilerProperties.COMPILER_GROUPMEMORY_KEY,
-                querySpecificConfig.get(CompilerProperties.COMPILER_GROUPMEMORY_KEY),
-                compilerProperties.getGroupMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_GROUP_BY);
-        int joinFrameLimit = getFrameLimit(CompilerProperties.COMPILER_JOINMEMORY_KEY,
-                querySpecificConfig.get(CompilerProperties.COMPILER_JOINMEMORY_KEY),
-                compilerProperties.getJoinMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_JOIN);
-        OptimizationConfUtil.getPhysicalOptimizationConfig().setFrameSize(frameSize);
-        OptimizationConfUtil.getPhysicalOptimizationConfig().setMaxFramesExternalSort(sortFrameLimit);
-        OptimizationConfUtil.getPhysicalOptimizationConfig().setMaxFramesExternalGroupBy(groupFrameLimit);
-        OptimizationConfUtil.getPhysicalOptimizationConfig().setMaxFramesForJoin(joinFrameLimit);
+        Map<String, String> querySpecificConfig = validateConfig(metadataProvider.getConfig());
+        final PhysicalOptimizationConfig physOptConf =
+                getPhysicalOptimizationConfig(compilerProperties, querySpecificConfig);
 
         HeuristicCompilerFactoryBuilder builder =
                 new HeuristicCompilerFactoryBuilder(OptimizationContextFactory.INSTANCE);
-        builder.setPhysicalOptimizationConfig(OptimizationConfUtil.getPhysicalOptimizationConfig());
+        builder.setPhysicalOptimizationConfig(physOptConf);
         builder.setLogicalRewrites(ruleSetFactory.getLogicalRewrites(metadataProvider.getApplicationContext()));
         builder.setPhysicalRewrites(ruleSetFactory.getPhysicalRewrites(metadataProvider.getApplicationContext()));
         IDataFormat format = metadataProvider.getDataFormat();
@@ -288,21 +270,15 @@
                     PlanPrettyPrinter.printPhysicalOps(plan, buffer, 0);
                 } else {
                     printPlanPrefix(output, "Optimized logical plan");
-                    if (rwQ != null || (statement != null && statement.getKind() == Statement.Kind.LOAD)) {
-                        AbstractLogicalOperatorPrettyPrintVisitor pvisitor;
-                        if (output.config().getLpfmt().equals(SessionConfig.PlanFormat.JSON)) {
-                            pvisitor = new LogicalOperatorPrettyPrintVisitorJson(output.out());
-
-                        } else {
-                            pvisitor = new LogicalOperatorPrettyPrintVisitor(output.out());
-                        }
-                        PlanPrettyPrinter.printPlan(plan, pvisitor, 0);
+                    if (isQuery || isLoad) {
+                        PlanPrettyPrinter.printPlan(plan,
+                                getPrettyPrintVisitor(output.config().getLpfmt(), output.out()), 0);
                     }
                     printPlanPostfix(output);
                 }
             }
         }
-        if (rwQ != null && rwQ.isExplain()) {
+        if (isQuery && query.isExplain()) {
             try {
                 LogicalOperatorPrettyPrintVisitor pvisitor = new LogicalOperatorPrettyPrintVisitor();
                 PlanPrettyPrinter.printPlan(plan, pvisitor, 0);
@@ -327,47 +303,75 @@
         builder.setHashFunctionFamilyProvider(format.getBinaryHashFunctionFamilyProvider());
         builder.setMissingWriterFactory(format.getMissingWriterFactory());
         builder.setPredicateEvaluatorFactoryProvider(format.getPredicateEvaluatorFactoryProvider());
-
-        final SessionConfig.OutputFormat outputFormat = conf.fmt();
-        switch (outputFormat) {
-            case LOSSLESS_JSON:
-                builder.setPrinterProvider(format.getLosslessJSONPrinterFactoryProvider());
-                break;
-            case CSV:
-                builder.setPrinterProvider(format.getCSVPrinterFactoryProvider());
-                break;
-            case ADM:
-                builder.setPrinterProvider(format.getADMPrinterFactoryProvider());
-                break;
-            case CLEAN_JSON:
-                builder.setPrinterProvider(format.getCleanJSONPrinterFactoryProvider());
-                break;
-            default:
-                throw new AlgebricksException("Unexpected OutputFormat: " + outputFormat);
-        }
-
+        builder.setPrinterProvider(getPrinterFactoryProvider(format, conf.fmt()));
         builder.setSerializerDeserializerProvider(format.getSerdeProvider());
         builder.setTypeTraitProvider(format.getTypeTraitProvider());
         builder.setNormalizedKeyComputerFactoryProvider(format.getNormalizedKeyComputerFactoryProvider());
 
         JobEventListenerFactory jobEventListenerFactory =
-                new JobEventListenerFactory(asterixJobId, metadataProvider.isWriteTransaction());
+                new JobEventListenerFactory(txnId, metadataProvider.isWriteTransaction());
         JobSpecification spec = compiler.createJob(metadataProvider.getApplicationContext(), jobEventListenerFactory);
 
-        // When the top-level statement is a query, the statement parameter is null.
-        if (statement == null) {
+        if (isQuery) {
             // Sets a required capacity, only for read-only queries.
             // DDLs and DMLs are considered not that frequent.
-            spec.setRequiredClusterCapacity(ResourceUtils.getRequiredCompacity(plan, computationLocations,
-                    sortFrameLimit, groupFrameLimit, joinFrameLimit, frameSize));
+            // limit the computation locations to the locations that will be used in the query
+            final INodeJobTracker nodeJobTracker = metadataProvider.getApplicationContext().getNodeJobTracker();
+            final AlgebricksAbsolutePartitionConstraint jobLocations =
+                    getJobLocations(spec, nodeJobTracker, computationLocations);
+            final IClusterCapacity jobRequiredCapacity =
+                    ResourceUtils.getRequiredCapacity(plan, jobLocations, physOptConf);
+            spec.setRequiredClusterCapacity(jobRequiredCapacity);
         }
 
+        printJobSpec(query, spec, conf, output);
+        return spec;
+    }
+
+    protected PhysicalOptimizationConfig getPhysicalOptimizationConfig(CompilerProperties compilerProperties,
+            Map<String, String> querySpecificConfig) throws AlgebricksException {
+        int frameSize = compilerProperties.getFrameSize();
+        int sortFrameLimit = getFrameLimit(CompilerProperties.COMPILER_SORTMEMORY_KEY,
+                querySpecificConfig.get(CompilerProperties.COMPILER_SORTMEMORY_KEY),
+                compilerProperties.getSortMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_SORT);
+        int groupFrameLimit = getFrameLimit(CompilerProperties.COMPILER_GROUPMEMORY_KEY,
+                querySpecificConfig.get(CompilerProperties.COMPILER_GROUPMEMORY_KEY),
+                compilerProperties.getGroupMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_GROUP_BY);
+        int joinFrameLimit = getFrameLimit(CompilerProperties.COMPILER_JOINMEMORY_KEY,
+                querySpecificConfig.get(CompilerProperties.COMPILER_JOINMEMORY_KEY),
+                compilerProperties.getJoinMemorySize(), frameSize, MIN_FRAME_LIMIT_FOR_JOIN);
+        final PhysicalOptimizationConfig physOptConf = OptimizationConfUtil.getPhysicalOptimizationConfig();
+        physOptConf.setFrameSize(frameSize);
+        physOptConf.setMaxFramesExternalSort(sortFrameLimit);
+        physOptConf.setMaxFramesExternalGroupBy(groupFrameLimit);
+        physOptConf.setMaxFramesForJoin(joinFrameLimit);
+        return physOptConf;
+    }
+
+    protected IPrinterFactoryProvider getPrinterFactoryProvider(IDataFormat format,
+            SessionConfig.OutputFormat outputFormat) throws AlgebricksException {
+        switch (outputFormat) {
+            case LOSSLESS_JSON:
+                return format.getLosslessJSONPrinterFactoryProvider();
+            case CSV:
+                return format.getCSVPrinterFactoryProvider();
+            case ADM:
+                return format.getADMPrinterFactoryProvider();
+            case CLEAN_JSON:
+                return format.getCleanJSONPrinterFactoryProvider();
+            default:
+                throw new AlgebricksException("Unexpected OutputFormat: " + outputFormat);
+        }
+    }
+
+    protected void printJobSpec(Query rwQ, JobSpecification spec, SessionConfig conf, SessionOutput output)
+            throws AlgebricksException {
         if (conf.is(SessionConfig.OOB_HYRACKS_JOB)) {
             printPlanPrefix(output, "Hyracks job");
             if (rwQ != null) {
                 try {
-                    output.out().println(
-                            new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(spec.toJSON()));
+                    final ObjectWriter objectWriter = new ObjectMapper().writerWithDefaultPrettyPrinter();
+                    output.out().println(objectWriter.writeValueAsString(spec.toJSON()));
                 } catch (IOException e) {
                     throw new AlgebricksException(e);
                 }
@@ -375,7 +379,12 @@
             }
             printPlanPostfix(output);
         }
-        return spec;
+    }
+
+    private AbstractLogicalOperatorPrettyPrintVisitor getPrettyPrintVisitor(SessionConfig.PlanFormat planFormat,
+            PrintWriter out) {
+        return planFormat.equals(SessionConfig.PlanFormat.JSON) ? new LogicalOperatorPrettyPrintVisitorJson(out)
+                : new LogicalOperatorPrettyPrintVisitor(out);
     }
 
     public void executeJobArray(IHyracksClientConnection hcc, JobSpecification[] specs, PrintWriter out)
@@ -389,7 +398,6 @@
             double duration = (endTime - startTime) / 1000.00;
             out.println("<pre>Duration: " + duration + " sec</pre>");
         }
-
     }
 
     public void executeJobArray(IHyracksClientConnection hcc, Job[] jobs, PrintWriter out) throws Exception {
@@ -498,11 +506,19 @@
     }
 
     // Validates if the query contains unsupported query parameters.
-    private static void validateConfig(Map<String, String> config) throws AlgebricksException {
+    private static Map<String, String> validateConfig(Map<String, String> config) throws AlgebricksException {
         for (String parameterName : config.keySet()) {
             if (!CONFIGURABLE_PARAMETER_NAMES.contains(parameterName)) {
                 throw AsterixException.create(ErrorCode.COMPILATION_UNSUPPORTED_QUERY_PARAMETER, parameterName);
             }
         }
+        return config;
+    }
+
+    public static AlgebricksAbsolutePartitionConstraint getJobLocations(JobSpecification spec,
+            INodeJobTracker jobTracker, AlgebricksAbsolutePartitionConstraint clusterLocations) {
+        final Set<String> jobParticipatingNodes = jobTracker.getJobParticipatingNodes(spec);
+        return new AlgebricksAbsolutePartitionConstraint(Arrays.stream(clusterLocations.getLocations())
+                .filter(jobParticipatingNodes::contains).toArray(String[]::new));
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AppRuntimeContextProviderForRecovery.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AppRuntimeContextProviderForRecovery.java
deleted file mode 100644
index 18ef143..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AppRuntimeContextProviderForRecovery.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.api.common;
-
-import java.util.concurrent.ExecutorService;
-
-import org.apache.asterix.app.nc.NCAppRuntimeContext;
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
-import org.apache.hyracks.storage.common.ILocalResourceRepository;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
-
-public class AppRuntimeContextProviderForRecovery implements IAppRuntimeContextProvider {
-
-    private final NCAppRuntimeContext asterixAppRuntimeContext;
-
-    public AppRuntimeContextProviderForRecovery(NCAppRuntimeContext asterixAppRuntimeContext) {
-        this.asterixAppRuntimeContext = asterixAppRuntimeContext;
-    }
-
-    @Override
-    public IBufferCache getBufferCache() {
-        return asterixAppRuntimeContext.getBufferCache();
-    }
-
-    @Override
-    public ITransactionSubsystem getTransactionSubsystem() {
-        return asterixAppRuntimeContext.getTransactionSubsystem();
-    }
-
-    @Override
-    public IDatasetLifecycleManager getDatasetLifecycleManager() {
-        return asterixAppRuntimeContext.getDatasetLifecycleManager();
-    }
-
-    @Override
-    public double getBloomFilterFalsePositiveRate() {
-        return asterixAppRuntimeContext.getBloomFilterFalsePositiveRate();
-    }
-
-    @Override
-    public ILSMIOOperationScheduler getLSMIOScheduler() {
-        return asterixAppRuntimeContext.getLSMIOScheduler();
-    }
-
-    @Override
-    public ILocalResourceRepository getLocalResourceRepository() {
-        return asterixAppRuntimeContext.getLocalResourceRepository();
-    }
-
-    @Override
-    public IIOManager getIOManager() {
-        return asterixAppRuntimeContext.getIoManager();
-    }
-
-    @Override
-    public ILSMOperationTracker getLSMBTreeOperationTracker(int datasetID) {
-        return asterixAppRuntimeContext.getLSMBTreeOperationTracker(datasetID);
-    }
-
-    @Override
-    public INcApplicationContext getAppContext() {
-        return asterixAppRuntimeContext;
-    }
-
-    @Override
-    public ExecutorService getThreadExecutor() {
-        return asterixAppRuntimeContext.getThreadExecutor();
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixClientConfig.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixClientConfig.java
index 9db71d1..b464781 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixClientConfig.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixClientConfig.java
@@ -37,8 +37,8 @@
     @Option(name = "-hyracks-job", usage = "Generates and prints the Hyracks job. It is false by default.")
     public String hyracksJob = "false";
 
-    @Option(name = "-hyracks-port", usage = "The port used to connect to the Hyracks server.")
-    public int hyracksPort = AsterixHyracksIntegrationUtil.DEFAULT_HYRACKS_CC_CLIENT_PORT;
+    @Option(name = "-hyracks-port", usage = "The port used to connect to the Hyracks server. (default: 1098)")
+    public int hyracksPort = 1098;
 
     @Argument
     private List<String> arguments = new ArrayList<String>();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
deleted file mode 100644
index 50c3ff6..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.api.common;
-
-import static org.apache.asterix.api.common.AsterixHyracksIntegrationUtil.LoggerHolder.LOGGER;
-import static org.apache.hyracks.util.file.FileUtil.joinPath;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.Inet4Address;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.config.PropertiesAccessor;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.hyracks.bootstrap.CCApplication;
-import org.apache.asterix.hyracks.bootstrap.NCApplication;
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.api.application.ICCApplication;
-import org.apache.hyracks.api.application.INCApplication;
-import org.apache.hyracks.api.client.HyracksConnection;
-import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.hyracks.control.common.config.ConfigManager;
-import org.apache.hyracks.control.common.controllers.CCConfig;
-import org.apache.hyracks.control.common.controllers.ControllerConfig;
-import org.apache.hyracks.control.common.controllers.NCConfig;
-import org.apache.hyracks.control.nc.NodeControllerService;
-import org.kohsuke.args4j.CmdLineException;
-
-public class AsterixHyracksIntegrationUtil {
-    static class LoggerHolder {
-        static final Logger LOGGER = Logger.getLogger(AsterixHyracksIntegrationUtil.class.getName());
-
-        private LoggerHolder() {
-        }
-    }
-
-    public static final int DEFAULT_HYRACKS_CC_CLIENT_PORT = 1098;
-    public static final int DEFAULT_HYRACKS_CC_CLUSTER_PORT = 1099;
-
-    public ClusterControllerService cc;
-    public NodeControllerService[] ncs = new NodeControllerService[0];
-    public IHyracksClientConnection hcc;
-    protected boolean gracefulShutdown = true;
-
-    private static final String DEFAULT_STORAGE_PATH = joinPath("target", "io", "dir");
-    private static String storagePath = DEFAULT_STORAGE_PATH;
-    private ConfigManager configManager;
-    private List<String> nodeNames;
-
-    public void init(boolean deleteOldInstanceData) throws Exception {
-        final ICCApplication ccApplication = createCCApplication();
-        configManager = new ConfigManager();
-        ccApplication.registerConfig(configManager);
-        final CCConfig ccConfig = createCCConfig(configManager);
-        cc = new ClusterControllerService(ccConfig, ccApplication);
-
-        nodeNames = ccConfig.getConfigManager().getNodeNames();
-        if (deleteOldInstanceData) {
-            deleteTransactionLogs();
-            removeTestStorageFiles();
-        }
-        final List<NodeControllerService> nodeControllers = new ArrayList<>();
-        for (String nodeId : nodeNames) {
-            // mark this NC as virtual in the CC's config manager, so he doesn't try to contact NCService...
-            configManager.set(nodeId, NCConfig.Option.NCSERVICE_PORT, NCConfig.NCSERVICE_PORT_DISABLED);
-            final INCApplication ncApplication = createNCApplication();
-            ConfigManager ncConfigManager = new ConfigManager();
-            ncApplication.registerConfig(ncConfigManager);
-            nodeControllers.add(
-                    new NodeControllerService(fixupIODevices(createNCConfig(nodeId, ncConfigManager)), ncApplication));
-        } ;
-
-        cc.start();
-
-        // Starts ncs.
-        nodeNames = ccConfig.getConfigManager().getNodeNames();
-        List<Thread> startupThreads = new ArrayList<>();
-        for (NodeControllerService nc : nodeControllers) {
-            Thread ncStartThread = new Thread("IntegrationUtil-" + nc.getId()) {
-                @Override
-                public void run() {
-                    try {
-                        nc.start();
-                    } catch (Exception e) {
-                        LOGGER.log(Level.SEVERE, e.getMessage(), e);
-                    }
-                }
-            };
-            ncStartThread.start();
-            startupThreads.add(ncStartThread);
-        }
-        //wait until all NCs complete their startup
-        for (Thread thread : startupThreads) {
-            thread.join();
-        }
-        // Wait until cluster becomes active
-        ((ICcApplicationContext) cc.getApplicationContext()).getClusterStateManager().waitForState(ClusterState.ACTIVE);
-        hcc = new HyracksConnection(cc.getConfig().getClientListenAddress(), cc.getConfig().getClientListenPort());
-        this.ncs = nodeControllers.toArray(new NodeControllerService[nodeControllers.size()]);
-    }
-
-    public ClusterControllerService getClusterControllerService() {
-        return cc;
-    }
-
-    protected CCConfig createCCConfig(ConfigManager configManager) throws IOException {
-        CCConfig ccConfig = new CCConfig(configManager);
-        ccConfig.setClusterListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ccConfig.setClientListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ccConfig.setClientListenPort(DEFAULT_HYRACKS_CC_CLIENT_PORT);
-        ccConfig.setClusterListenPort(DEFAULT_HYRACKS_CC_CLUSTER_PORT);
-        ccConfig.setResultTTL(120000L);
-        ccConfig.setResultSweepThreshold(1000L);
-        ccConfig.setEnforceFrameWriterProtocol(true);
-        configManager.set(ControllerConfig.Option.DEFAULT_DIR, joinPath(getDefaultStoragePath(), "asterixdb"));
-        return ccConfig;
-    }
-
-    protected ICCApplication createCCApplication() {
-        return new CCApplication();
-    }
-
-    protected NCConfig createNCConfig(String ncName, ConfigManager configManager) {
-        NCConfig ncConfig = new NCConfig(ncName, configManager);
-        ncConfig.setClusterAddress("localhost");
-        ncConfig.setClusterPort(DEFAULT_HYRACKS_CC_CLUSTER_PORT);
-        ncConfig.setClusterListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ncConfig.setDataListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ncConfig.setResultListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ncConfig.setMessagingListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
-        ncConfig.setResultTTL(120000L);
-        ncConfig.setResultSweepThreshold(1000L);
-        ncConfig.setVirtualNC();
-        configManager.set(ControllerConfig.Option.DEFAULT_DIR, joinPath(getDefaultStoragePath(), "asterixdb", ncName));
-        return ncConfig;
-    }
-
-    protected INCApplication createNCApplication() {
-        if (!gracefulShutdown) {
-            return new UngracefulShutdownNCApplication();
-        }
-        return new NCApplication();
-    }
-
-    private NCConfig fixupIODevices(NCConfig ncConfig) throws IOException, AsterixException, CmdLineException {
-        // we have to first process the config
-        ncConfig.getConfigManager().processConfig();
-
-        // get initial partitions from config
-        String[] nodeStores = ncConfig.getNodeScopedAppConfig().getStringArray(NCConfig.Option.IODEVICES);
-        if (nodeStores == null) {
-            throw new IllegalStateException("Couldn't find stores for NC: " + ncConfig.getNodeId());
-        }
-        LOGGER.info("Using the path: " + getDefaultStoragePath());
-        for (int i = 0; i < nodeStores.length; i++) {
-            // create IO devices based on stores
-            nodeStores[i] = joinPath(getDefaultStoragePath(), ncConfig.getNodeId(), nodeStores[i]);
-        }
-        ncConfig.getConfigManager().set(ncConfig.getNodeId(), NCConfig.Option.IODEVICES, nodeStores);
-        return ncConfig;
-    }
-
-    public IHyracksClientConnection getHyracksClientConnection() {
-        return hcc;
-    }
-
-    public void deinit(boolean deleteOldInstanceData) throws Exception {
-        //stop NCs
-        ArrayList<Thread> stopNCThreads = new ArrayList<>();
-        for (NodeControllerService nodeControllerService : ncs) {
-            if (nodeControllerService != null) {
-                Thread ncStopThread = new Thread() {
-                    @Override
-                    public void run() {
-                        try {
-                            nodeControllerService.stop();
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                };
-                stopNCThreads.add(ncStopThread);
-                ncStopThread.start();
-            }
-        }
-
-        //make sure all NCs stopped
-        for (Thread stopNcTheard : stopNCThreads) {
-            stopNcTheard.join();
-        }
-
-        stopCC(false);
-
-        if (deleteOldInstanceData) {
-            deleteTransactionLogs();
-            removeTestStorageFiles();
-        }
-    }
-
-    public void stopCC(boolean terminateNCService) throws Exception {
-        if (cc != null) {
-            cc.stop(terminateNCService);
-            cc = null;
-        }
-    }
-
-    public static void setStoragePath(String path) {
-        storagePath = path;
-    }
-
-    public void setGracefulShutdown(boolean gracefulShutdown) {
-        this.gracefulShutdown = gracefulShutdown;
-    }
-
-    public static void restoreDefaultStoragePath() {
-        storagePath = DEFAULT_STORAGE_PATH;
-    }
-
-    protected String getDefaultStoragePath() {
-        return storagePath;
-    }
-
-    public void removeTestStorageFiles() {
-        File dir = new File(getDefaultStoragePath());
-        for (String ncName : nodeNames) {
-            File ncDir = new File(dir, ncName);
-            FileUtils.deleteQuietly(ncDir);
-        }
-    }
-
-    private void deleteTransactionLogs() throws IOException, AsterixException {
-        for (String ncId : nodeNames) {
-            File log = new File(
-                    PropertiesAccessor.getInstance(configManager.getAppConfig()).getTransactionLogDirs().get(ncId));
-            if (log.exists()) {
-                FileUtils.deleteDirectory(log);
-            }
-        }
-    }
-
-    /**
-     * main method to run a simple 2 node cluster in-process
-     * suggested VM arguments: <code>-enableassertions -Xmx2048m -Dfile.encoding=UTF-8</code>
-     *
-     * @param args
-     *            unused
-     */
-    public static void main(String[] args) throws Exception {
-        AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
-        try {
-            integrationUtil.run(Boolean.getBoolean("cleanup.start"), Boolean.getBoolean("cleanup.shutdown"));
-        } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Unexpected exception", e);
-            System.exit(1);
-        }
-    }
-
-    protected void run(boolean cleanupOnStart, boolean cleanupOnShutdown) throws Exception {
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                try {
-                    deinit(cleanupOnShutdown);
-                } catch (Exception e) {
-                    LOGGER.log(Level.WARNING, "Unexpected exception on shutdown", e);
-                }
-            }
-        });
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, "asterix-build-configuration.xml");
-
-        init(cleanupOnStart);
-        while (true) {
-            Thread.sleep(10000);
-        }
-    }
-
-    private class UngracefulShutdownNCApplication extends NCApplication {
-        @Override
-        public void stop() throws Exception {
-            // ungraceful shutdown
-        }
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractQueryApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractQueryApiServlet.java
index 3912bd5..b8c737d 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractQueryApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/AbstractQueryApiServlet.java
@@ -24,8 +24,6 @@
 import java.io.PrintWriter;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.result.ResultReader;
 import org.apache.asterix.common.api.IApplicationContext;
@@ -36,9 +34,12 @@
 import org.apache.hyracks.client.dataset.HyracksDataset;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class AbstractQueryApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(AbstractQueryApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final IApplicationContext appCtx;
 
     public enum ResultFields {
@@ -106,7 +107,7 @@
         try {
             return doGetHyracksDataset();
         } catch (IPCException e) {
-            LOGGER.log(Level.WARNING, "Failed getting hyracks dataset connection. Resetting hyracks connection.", e);
+            LOGGER.log(Level.WARN, "Failed getting hyracks dataset connection. Resetting hyracks connection.", e);
             ctx.put(HYRACKS_CONNECTION_ATTR, appCtx.getHcc());
             return doGetHyracksDataset();
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
index a4889ce..eb22c28 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ActiveStatsApiServlet.java
@@ -20,8 +20,6 @@
 
 import java.io.PrintWriter;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.IActiveEntityEventsListener;
 import org.apache.asterix.app.active.ActiveNotificationHandler;
@@ -30,6 +28,9 @@
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -38,7 +39,7 @@
 
 public class ActiveStatsApiServlet extends AbstractServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(ActiveStatsApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int DEFAULT_EXPIRE_TIME = 2000;
     private final ActiveNotificationHandler activeNotificationHandler;
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
index a29d869..63896f2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ApiServlet.java
@@ -30,8 +30,6 @@
 import java.io.PrintWriter;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.imageio.ImageIO;
 
@@ -50,6 +48,7 @@
 import org.apache.asterix.translator.IRequestParameters;
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionConfig.OutputFormat;
 import org.apache.asterix.translator.SessionConfig.PlanFormat;
@@ -64,11 +63,14 @@
 import org.apache.hyracks.http.server.utils.HttpUtil;
 import org.apache.hyracks.http.server.utils.HttpUtil.ContentType;
 import org.apache.hyracks.http.server.utils.HttpUtil.Encoding;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class ApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(ApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final String HTML_STATEMENT_SEPARATOR = "<!-- BEGIN -->";
 
     private final ICcApplicationContext appCtx;
@@ -88,11 +90,11 @@
         this.componentProvider = componentProvider;
     }
 
-    @Override protected void post(IServletRequest request, IServletResponse response) {
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) {
         // Query language
-        ILangCompilationProvider compilationProvider = "AQL".equals(request.getParameter("query-language")) ?
-                aqlCompilationProvider :
-                sqlppCompilationProvider;
+        ILangCompilationProvider compilationProvider = "AQL".equals(request.getParameter("query-language"))
+                ? aqlCompilationProvider : sqlppCompilationProvider;
         IParserFactory parserFactory = compilationProvider.getParserFactory();
 
         // Output format.
@@ -129,7 +131,7 @@
             response.setStatus(HttpResponseStatus.OK);
             HttpUtil.setContentType(response, ContentType.TEXT_HTML, Encoding.UTF8);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failure setting content type", e);
+            LOGGER.log(Level.WARN, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             return;
         }
@@ -148,14 +150,12 @@
             }
             IParser parser = parserFactory.createParser(query);
             List<Statement> aqlStatements = parser.parse();
-            SessionConfig sessionConfig =
-                    new SessionConfig(format, true, isSet(executeQuery), true, planFormat);
+            SessionConfig sessionConfig = new SessionConfig(format, true, isSet(executeQuery), true, planFormat);
             sessionConfig.set(SessionConfig.FORMAT_HTML, true);
             sessionConfig.set(SessionConfig.FORMAT_CSV_HEADER, csvAndHeader);
             sessionConfig.set(SessionConfig.FORMAT_WRAPPER_ARRAY, isSet(wrapperArray));
-            sessionConfig
-                    .setOOBData(isSet(printExprParam), isSet(printRewrittenExprParam), isSet(printLogicalPlanParam),
-                            isSet(printOptimizedLogicalPlanParam), isSet(printJob));
+            sessionConfig.setOOBData(isSet(printExprParam), isSet(printRewrittenExprParam),
+                    isSet(printLogicalPlanParam), isSet(printOptimizedLogicalPlanParam), isSet(printJob));
             SessionOutput sessionOutput = new SessionOutput(sessionConfig, out);
             MetadataManager.INSTANCE.init();
             IStatementExecutor translator = statementExectorFactory.create(appCtx, aqlStatements, sessionOutput,
@@ -163,7 +163,7 @@
             double duration;
             long startTime = System.currentTimeMillis();
             final IRequestParameters requestParameters =
-                    new RequestParameters(hds, IStatementExecutor.ResultDelivery.IMMEDIATE,
+                    new RequestParameters(hds, new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE),
                             new IStatementExecutor.Stats(), null, null, null);
             translator.compileAndExecute(hcc, null, requestParameters);
             long endTime = System.currentTimeMillis();
@@ -174,7 +174,7 @@
             GlobalConfig.ASTERIX_LOGGER.log(Level.INFO, pe.toString(), pe);
             ResultUtil.webUIParseExceptionHandler(out, pe, query);
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
             ResultUtil.webUIErrorHandler(out, e);
         }
     }
@@ -188,7 +188,7 @@
             try {
                 HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
             } catch (IOException e) {
-                LOGGER.log(Level.WARNING, "Failure setting content type", e);
+                LOGGER.log(Level.WARN, "Failure setting content type", e);
                 response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
                 return;
             }
@@ -217,7 +217,7 @@
                     HttpUtil.Encoding.UTF8);
             writeOutput(response, is, resourcePath);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failure handling request", e);
+            LOGGER.log(Level.WARN, "Failure handling request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             return;
         }
@@ -230,8 +230,8 @@
             try {
                 line = br.readLine();
             } catch (NullPointerException e) {
-                LOGGER.log(Level.WARNING,
-                        "NPE reading resource " + resourcePath + ", assuming JDK-8080094; returning 404", e);
+                LOGGER.log(Level.WARN, "NPE reading resource " + resourcePath + ", assuming JDK-8080094; returning 404",
+                        e);
                 // workaround lame JDK bug where a broken InputStream is returned in case the resourcePath is a
                 // directory; see https://bugs.openjdk.java.net/browse/JDK-8080094
                 response.setStatus(HttpResponseStatus.NOT_FOUND);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
index 165c104..d239038 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterApiServlet.java
@@ -24,13 +24,11 @@
 import java.io.PrintWriter;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.control.common.config.ConfigUtils;
 import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.http.api.IServletRequest;
@@ -38,6 +36,9 @@
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -47,7 +48,7 @@
 
 public class ClusterApiServlet extends AbstractServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(ClusterApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected static final String NODE_ID_KEY = "node_id";
     protected static final String CONFIG_URI_KEY = "configUri";
     protected static final String STATS_URI_KEY = "statsUri";
@@ -91,13 +92,28 @@
         responseWriter.flush();
     }
 
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) throws Exception {
+        switch (localPath(request)) {
+            case "/partition/master":
+                processPartitionMaster(request, response);
+                break;
+            case "/metadataNode":
+                processMetadataNode(request, response);
+                break;
+            default:
+                sendError(response, HttpResponseStatus.NOT_FOUND);
+                break;
+        }
+    }
+
     protected ObjectNode getClusterStateSummaryJSON() {
         return appCtx.getClusterStateManager().getClusterStateSummary();
     }
 
     protected ObjectNode getClusterStateJSON(IServletRequest request, String pathToNode) {
         ObjectNode json = appCtx.getClusterStateManager().getClusterStateDescription();
-        CcApplicationContext appConfig = (CcApplicationContext) ctx.get(ASTERIX_APP_CONTEXT_INFO_ATTR);
+        ICcApplicationContext appConfig = (ICcApplicationContext) ctx.get(ASTERIX_APP_CONTEXT_INFO_ATTR);
         json.putPOJO("config", ConfigUtils.getSectionOptionsForJSON(appConfig.getServiceContext().getAppConfig(),
                 Section.COMMON, getConfigSelector()));
 
@@ -144,4 +160,16 @@
                 && option != ControllerConfig.Option.CONFIG_FILE_URL;
     }
 
+    private void processPartitionMaster(IServletRequest request, IServletResponse response) {
+        final String partition = request.getParameter("partition");
+        final String node = request.getParameter("node");
+        appCtx.getClusterStateManager().updateClusterPartition(Integer.valueOf(partition), node, true);
+        response.setStatus(HttpResponseStatus.OK);
+    }
+
+    private void processMetadataNode(IServletRequest request, IServletResponse response) throws HyracksDataException {
+        final String node = request.getParameter("node");
+        appCtx.getNcLifecycleCoordinator().notifyMetadataNodeChange(node);
+        response.setStatus(HttpResponseStatus.OK);
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
index dcd43cb..82ade81 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ClusterControllerDetailsApiServlet.java
@@ -23,14 +23,15 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -38,7 +39,7 @@
 
 public class ClusterControllerDetailsApiServlet extends ClusterApiServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(ClusterControllerDetailsApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public ClusterControllerDetailsApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx,
             String... paths) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
index b51187c..5fe88f0 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ConnectorApiServlet.java
@@ -25,8 +25,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.metadata.MetadataManager;
@@ -42,6 +40,9 @@
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -56,7 +57,7 @@
  * in parallel from existing AsterixDB datasets.
  */
 public class ConnectorApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(ConnectorApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private ICcApplicationContext appCtx;
 
     public ConnectorApiServlet(ConcurrentMap<String, Object> ctx, String[] paths, ICcApplicationContext appCtx) {
@@ -70,7 +71,7 @@
         try {
             HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failure setting content type", e);
+            LOGGER.log(Level.WARN, "Failure setting content type", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             response.writer().write(e.toString());
             return;
@@ -102,7 +103,6 @@
                     out.flush();
                     return;
                 }
-                boolean temp = dataset.getDatasetDetails().isTemp();
                 FileSplit[] fileSplits = metadataProvider.splitsForIndex(mdTxnCtx, dataset, datasetName);
                 ARecordType recordType = (ARecordType) metadataProvider.findType(dataset.getItemTypeDataverseName(),
                         dataset.getItemTypeName());
@@ -115,7 +115,7 @@
                 }
                 pkStrBuf.delete(pkStrBuf.length() - 1, pkStrBuf.length());
                 // Constructs the returned json object.
-                formResponseObject(jsonResponse, fileSplits, recordType, pkStrBuf.toString(), temp,
+                formResponseObject(jsonResponse, fileSplits, recordType, pkStrBuf.toString(),
                         hcc.getNodeControllerInfos());
 
                 // Flush the cached contents of the dataset to file system.
@@ -129,7 +129,7 @@
                 metadataProvider.getLocks().unlock();
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failure handling a request", e);
+            LOGGER.log(Level.WARN, "Failure handling a request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             out.write(e.toString());
         } finally {
@@ -138,10 +138,8 @@
     }
 
     private void formResponseObject(ObjectNode jsonResponse, FileSplit[] fileSplits, ARecordType recordType,
-            String primaryKeys, boolean temp, Map<String, NodeControllerInfo> nodeMap) {
+            String primaryKeys, Map<String, NodeControllerInfo> nodeMap) {
         ArrayNode partititons = OBJECT_MAPPER.createArrayNode();
-        // Whether the dataset is temp or not
-        jsonResponse.put("temp", temp);
         // Adds a primary key.
         jsonResponse.put("keys", primaryKeys);
         // Adds record type.
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
index a79b137..0f08a22 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/DiagnosticsApiServlet.java
@@ -31,8 +31,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
@@ -41,6 +39,9 @@
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -49,7 +50,7 @@
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class DiagnosticsApiServlet extends NodeControllerDetailsApiServlet {
-    private static final Logger LOGGER = Logger.getLogger(DiagnosticsApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final IHyracksClientConnection hcc;
     protected final ExecutorService executor;
 
@@ -118,10 +119,10 @@
         ccFutureData = new HashMap<>();
         ccFutureData.put("threaddump",
                 executor.submit(() -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(processThreadDump(null)))));
-        ccFutureData.put("config", executor.submit(
-                () -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(processNodeDetails(null, false, true)))));
-        ccFutureData.put("stats", executor.submit(
-                () -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(processNodeDetails(null, true, false)))));
+        ccFutureData.put("config", executor
+                .submit(() -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(processNodeDetails(null, false, true)))));
+        ccFutureData.put("stats", executor
+                .submit(() -> fixupKeys((ObjectNode) OBJECT_MAPPER.readTree(processNodeDetails(null, true, false)))));
         return ccFutureData;
     }
 
@@ -138,7 +139,7 @@
             try {
                 outputMap.put(entry.getKey(), entry.getValue().get());
             } catch (ExecutionException e) {
-                LOGGER.log(Level.WARNING, "unexpected exception obtaining value for " + entry.getKey(), e);
+                LOGGER.log(Level.WARN, "unexpected exception obtaining value for " + entry.getKey(), e);
                 errorMap.put(entry.getKey(), new TextNode(String.valueOf(e)));
             }
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryCancellationServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryCancellationServlet.java
index 637c492..c3e02af 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryCancellationServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryCancellationServlet.java
@@ -23,8 +23,6 @@
 import java.io.IOException;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.message.CancelQueryRequest;
 import org.apache.asterix.common.messaging.api.INCMessageBroker;
@@ -32,6 +30,9 @@
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
@@ -39,7 +40,7 @@
  * The servlet provides a REST API on an NC for cancelling an on-going query.
  */
 public class NCQueryCancellationServlet extends QueryCancellationServlet {
-    private static final Logger LOGGER = Logger.getLogger(NCQueryCancellationServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final INCServiceContext serviceCtx;
     private final INCMessageBroker messageBroker;
 
@@ -61,13 +62,12 @@
         try {
             CancelQueryRequest cancelQueryMessage =
                     new CancelQueryRequest(serviceCtx.getNodeId(), cancelQueryFuture.getFutureId(), clientContextId);
-            messageBroker.sendMessageToCC(cancelQueryMessage);
+            // TODO(mblow): multicc -- need to send cancellation to the correct cc
+            messageBroker.sendMessageToPrimaryCC(cancelQueryMessage);
             cancelQueryFuture.get(DEFAULT_NC_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
             response.setStatus(HttpResponseStatus.OK);
         } catch (Exception e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "Unexpected exception while canceling query", e);
-            }
+            LOGGER.log(Level.ERROR, "Unexpected exception while canceling query", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         } finally {
             messageBroker.deregisterMessageFuture(cancelQueryFuture.getFutureId());
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
index 616c22e..5cbac64 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NCQueryServiceServlet.java
@@ -25,7 +25,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.function.Function;
-import java.util.logging.Level;
 
 import org.apache.asterix.algebra.base.ILangExtension;
 import org.apache.asterix.app.message.CancelQueryRequest;
@@ -42,14 +41,15 @@
 import org.apache.asterix.common.messaging.api.MessageFuture;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.translator.IStatementExecutor;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.dataset.ResultSetId;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.Level;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
@@ -67,13 +67,12 @@
 
     @Override
     protected void executeStatement(String statementsText, SessionOutput sessionOutput,
-            IStatementExecutor.ResultDelivery delivery, IStatementExecutor.Stats stats, RequestParameters param,
-            long[] outExecStartEnd, Map<String, String> optionalParameters) throws Exception {
+            ResultProperties resultProperties, IStatementExecutor.Stats stats, RequestParameters param,
+            RequestExecutionState execution, Map<String, String> optionalParameters) throws Exception {
         // Running on NC -> send 'execute' message to CC
         INCServiceContext ncCtx = (INCServiceContext) serviceCtx;
         INCMessageBroker ncMb = (INCMessageBroker) ncCtx.getMessageBroker();
-        IStatementExecutor.ResultDelivery ccDelivery = delivery == IStatementExecutor.ResultDelivery.IMMEDIATE
-                ? IStatementExecutor.ResultDelivery.DEFERRED : delivery;
+        final IStatementExecutor.ResultDelivery delivery = resultProperties.getDelivery();
         ExecuteStatementResponseMessage responseMsg;
         MessageFuture responseFuture = ncMb.registerMessageFuture();
         final String handleUrl = getHandleUrl(param.host, param.path, delivery);
@@ -82,26 +81,27 @@
                 param.clientContextID = UUID.randomUUID().toString();
             }
             long timeout = ExecuteStatementRequestMessage.DEFAULT_NC_TIMEOUT_MILLIS;
-            if (param.timeout != null) {
+            if (param.timeout != null && !param.timeout.trim().isEmpty()) {
                 timeout = TimeUnit.NANOSECONDS.toMillis(Duration.parseDurationStringToNanos(param.timeout));
             }
             ExecuteStatementRequestMessage requestMsg = new ExecuteStatementRequestMessage(ncCtx.getNodeId(),
-                    responseFuture.getFutureId(), queryLanguage, statementsText, sessionOutput.config(), ccDelivery,
-                    param.clientContextID, handleUrl, optionalParameters);
-            outExecStartEnd[0] = System.nanoTime();
-            ncMb.sendMessageToCC(requestMsg);
+                    responseFuture.getFutureId(), queryLanguage, statementsText, sessionOutput.config(),
+                    resultProperties.getNcToCcResultProperties(), param.clientContextID, handleUrl, optionalParameters);
+            execution.start();
+            ncMb.sendMessageToPrimaryCC(requestMsg);
             try {
                 responseMsg = (ExecuteStatementResponseMessage) responseFuture.get(timeout, TimeUnit.MILLISECONDS);
             } catch (InterruptedException e) {
                 cancelQuery(ncMb, ncCtx.getNodeId(), param.clientContextID, e, false);
                 throw e;
             } catch (TimeoutException exception) {
-                RuntimeDataException hde = new RuntimeDataException(ErrorCode.QUERY_TIMEOUT, exception);
+                RuntimeDataException hde = new RuntimeDataException(ErrorCode.QUERY_TIMEOUT);
+                hde.addSuppressed(exception);
                 // cancel query
                 cancelQuery(ncMb, ncCtx.getNodeId(), param.clientContextID, hde, true);
                 throw hde;
             }
-            outExecStartEnd[1] = System.nanoTime();
+            execution.end();
         } finally {
             ncMb.deregisterMessageFuture(responseFuture.getFutureId());
         }
@@ -116,6 +116,8 @@
                 throw new Exception(err.toString(), err);
             }
         }
+        // no errors - stop buffering and allow for streaming result delivery
+        sessionOutput.release();
 
         IStatementExecutor.ResultMetadata resultMetadata = responseMsg.getMetadata();
         if (delivery == IStatementExecutor.ResultDelivery.IMMEDIATE && !resultMetadata.getResultSets().isEmpty()) {
@@ -129,13 +131,14 @@
         }
     }
 
-    private void cancelQuery(INCMessageBroker messageBroker, String nodeId, String clientContextID,
-            Exception exception, boolean wait) {
+    private void cancelQuery(INCMessageBroker messageBroker, String nodeId, String clientContextID, Exception exception,
+            boolean wait) {
         MessageFuture cancelQueryFuture = messageBroker.registerMessageFuture();
         try {
             CancelQueryRequest cancelQueryMessage =
                     new CancelQueryRequest(nodeId, cancelQueryFuture.getFutureId(), clientContextID);
-            messageBroker.sendMessageToCC(cancelQueryMessage);
+            // TODO(mblow): multicc -- need to send cancellation to the correct cc
+            messageBroker.sendMessageToPrimaryCC(cancelQueryMessage);
             if (wait) {
                 cancelQueryFuture.get(ExecuteStatementRequestMessage.DEFAULT_QUERY_CANCELLATION_WAIT_MILLIS,
                         TimeUnit.MILLISECONDS);
@@ -148,13 +151,13 @@
     }
 
     @Override
-    protected HttpResponseStatus handleExecuteStatementException(Throwable t) {
+    protected void handleExecuteStatementException(Throwable t, RequestExecutionState execution) {
         if (t instanceof TimeoutException
-                || (t instanceof HyracksDataException && ExceptionUtils.getRootCause(t) instanceof IPCException)) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.WARNING, t.toString(), t);
-            return HttpResponseStatus.SERVICE_UNAVAILABLE;
+                || ExceptionUtils.matchingCause(t, candidate -> candidate instanceof IPCException)) {
+            GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, t.toString(), t);
+            execution.setStatus(ResultStatus.FAILED, HttpResponseStatus.SERVICE_UNAVAILABLE);
         } else {
-            return super.handleExecuteStatementException(t);
+            super.handleExecuteStatementException(t, execution);
         }
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
index f443d09..8ca0947 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/NodeControllerDetailsApiServlet.java
@@ -26,8 +26,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IClusterStateManager;
@@ -36,6 +34,9 @@
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -45,7 +46,7 @@
 
 public class NodeControllerDetailsApiServlet extends ClusterApiServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(NodeControllerDetailsApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public NodeControllerDetailsApiServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx,
             String... paths) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryCancellationServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryCancellationServlet.java
index 96ff71c..8fd40b3 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryCancellationServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryCancellationServlet.java
@@ -20,8 +20,6 @@
 
 import java.io.IOException;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.translator.IStatementExecutorContext;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
@@ -29,6 +27,9 @@
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
@@ -36,7 +37,7 @@
  * The servlet provides a REST API for cancelling an on-going query.
  */
 public class QueryCancellationServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(QueryCancellationServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected static final String CLIENT_CONTEXT_ID = "client_context_id";
 
     public QueryCancellationServlet(ConcurrentMap<String, Object> ctx, String... paths) {
@@ -53,8 +54,8 @@
         }
 
         // Retrieves the corresponding Hyracks job id.
-        IStatementExecutorContext runningQueries = (IStatementExecutorContext) ctx
-                .get(ServletConstants.RUNNING_QUERIES_ATTR);
+        IStatementExecutorContext runningQueries =
+                (IStatementExecutorContext) ctx.get(ServletConstants.RUNNING_QUERIES_ATTR);
         IHyracksClientConnection hcc = (IHyracksClientConnection) ctx.get(ServletConstants.HYRACKS_CONNECTION_ATTR);
         JobId jobId = runningQueries.getJobIdFromClientContextId(clientContextId);
 
@@ -71,7 +72,7 @@
             // response: OK
             response.setStatus(HttpResponseStatus.OK);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "unexpected exception thrown from cancel", e);
+            LOGGER.log(Level.WARN, "unexpected exception thrown from cancel", e);
             // response: INTERNAL SERVER ERROR
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
index cce5099..de96d54 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryResultApiServlet.java
@@ -20,8 +20,6 @@
 
 import java.io.PrintWriter;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.result.ResultHandle;
 import org.apache.asterix.app.result.ResultReader;
@@ -35,11 +33,14 @@
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class QueryResultApiServlet extends AbstractQueryApiServlet {
-    private static final Logger LOGGER = Logger.getLogger(QueryResultApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public QueryResultApiServlet(ConcurrentMap<String, Object> ctx, IApplicationContext appCtx, String... paths) {
         super(appCtx, ctx, paths);
@@ -104,13 +105,13 @@
             }
             response.setStatus(HttpResponseStatus.BAD_REQUEST);
             out.println(e.getMessage());
-            LOGGER.log(Level.WARNING, "Error retrieving result for \"" + strHandle + "\"", e);
+            LOGGER.log(Level.WARN, "Error retrieving result for \"" + strHandle + "\"", e);
         } catch (Exception e) {
             response.setStatus(HttpResponseStatus.BAD_REQUEST);
-            LOGGER.log(Level.WARNING, "Error retrieving result for \"" + strHandle + "\"", e);
+            LOGGER.log(Level.WARN, "Error retrieving result for \"" + strHandle + "\"", e);
         }
         if (out.checkError()) {
-            LOGGER.warning("Error flushing output writer for \"" + strHandle + "\"");
+            LOGGER.warn("Error flushing output writer for \"" + strHandle + "\"");
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
index f8f5c18..1057a73 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryServiceServlet.java
@@ -20,13 +20,12 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.io.StringWriter;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Function;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.algebra.base.ILangExtension;
 import org.apache.asterix.common.api.Duration;
@@ -36,6 +35,7 @@
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
 import org.apache.asterix.lang.aql.parser.TokenMgrError;
 import org.apache.asterix.lang.common.base.IParser;
@@ -47,15 +47,20 @@
 import org.apache.asterix.translator.IStatementExecutor.Stats;
 import org.apache.asterix.translator.IStatementExecutorContext;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.IServiceContext;
 import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -68,7 +73,7 @@
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class QueryServiceServlet extends AbstractQueryApiServlet {
-    private static final Logger LOGGER = Logger.getLogger(QueryServiceServlet.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
     protected final ILangExtension.Language queryLanguage;
     private final ILangCompilationProvider compilationProvider;
     private final IStatementExecutorFactory statementExecutorFactory;
@@ -76,6 +81,7 @@
     private final IStatementExecutorContext queryCtx;
     protected final IServiceContext serviceCtx;
     protected final Function<IServletRequest, Map<String, String>> optionalParamProvider;
+    protected String hostName;
 
     public QueryServiceServlet(ConcurrentMap<String, Object> ctx, String[] paths, IApplicationContext appCtx,
             ILangExtension.Language queryLanguage, ILangCompilationProvider compilationProvider,
@@ -89,6 +95,14 @@
         this.queryCtx = (IStatementExecutorContext) ctx.get(ServletConstants.RUNNING_QUERIES_ATTR);
         this.serviceCtx = (IServiceContext) ctx.get(ServletConstants.SERVICE_CONTEXT_ATTR);
         this.optionalParamProvider = optionalParamProvider;
+        try {
+            this.hostName =
+                    InetAddress.getByName(serviceCtx.getAppConfig().getString(CCConfig.Option.CLUSTER_PUBLIC_ADDRESS))
+                            .getHostName();
+        } catch (UnknownHostException e) {
+            LOGGER.warn("Reverse DNS not properly configured, CORS defaulting to localhost", e);
+            this.hostName = "localhost";
+        }
     }
 
     @Override
@@ -98,16 +112,24 @@
         } catch (IOException e) {
             // Servlet methods should not throw exceptions
             // http://cwe.mitre.org/data/definitions/600.html
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
         } catch (Throwable th) {// NOSONAR: Logging and re-throwing
             try {
-                GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, th.getMessage(), th);
+                GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, th.getMessage(), th);
             } catch (Throwable ignored) { // NOSONAR: Logging failure
             }
             throw th;
         }
     }
 
+    @Override
+    protected void options(IServletRequest request, IServletResponse response) throws Exception {
+        response.setHeader("Access-Control-Allow-Origin",
+                "http://" + hostName + ":" + appCtx.getExternalProperties().getQueryWebInterfacePort());
+        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+        response.setStatus(HttpResponseStatus.OK);
+    }
+
     public enum Parameter {
         STATEMENT("statement"),
         FORMAT("format"),
@@ -115,7 +137,8 @@
         PRETTY("pretty"),
         MODE("mode"),
         TIMEOUT("timeout"),
-        PLAN_FORMAT("plan-format");
+        PLAN_FORMAT("plan-format"),
+        MAX_RESULT_READS("max-result-reads");
 
         private final String str;
 
@@ -171,6 +194,7 @@
         boolean pretty;
         String clientContextID;
         String mode;
+        String maxResultReads;
 
         @Override
         public String toString() {
@@ -184,6 +208,8 @@
                 on.put("mode", mode);
                 on.put("clientContextID", clientContextID);
                 on.put("format", format);
+                on.put("timeout", timeout);
+                on.put("maxResultReads", maxResultReads);
                 return om.writer(new MinimalPrettyPrinter()).writeValueAsString(on);
             } catch (JsonProcessingException e) { // NOSONAR
                 return e.getMessage();
@@ -191,6 +217,46 @@
         }
     }
 
+    static final class RequestExecutionState {
+        private long execStart = -1;
+        private long execEnd = -1;
+        private ResultStatus resultStatus = ResultStatus.SUCCESS;
+        private HttpResponseStatus httpResponseStatus = HttpResponseStatus.OK;
+
+        void setStatus(ResultStatus resultStatus, HttpResponseStatus httpResponseStatus) {
+            this.resultStatus = resultStatus;
+            this.httpResponseStatus = httpResponseStatus;
+        }
+
+        ResultStatus getResultStatus() {
+            return resultStatus;
+        }
+
+        HttpResponseStatus getHttpStatus() {
+            return httpResponseStatus;
+        }
+
+        void start() {
+            execStart = System.nanoTime();
+        }
+
+        void end() {
+            execEnd = System.nanoTime();
+        }
+
+        void finish() {
+            if (execStart == -1) {
+                execEnd = -1;
+            } else if (execEnd == -1) {
+                execEnd = System.nanoTime();
+            }
+        }
+
+        long duration() {
+            return execEnd - execStart;
+        }
+    }
+
     private static String getParameterValue(String content, String attribute) {
         if (content == null || attribute == null) {
             return null;
@@ -289,7 +355,6 @@
         ResultUtil.printField(pw, Metrics.RESULT_SIZE.str(), resultSize, true);
         pw.print("\t");
         ResultUtil.printField(pw, Metrics.PROCESSED_OBJECTS_COUNT.str(), processedObjects, hasErrors);
-        pw.print("\t");
         if (hasErrors) {
             pw.print("\t");
             ResultUtil.printField(pw, Metrics.ERROR_COUNT.str(), errorCount, false);
@@ -321,9 +386,10 @@
                 param.mode = toLower(getOptText(jsonRequest, Parameter.MODE.str()));
                 param.clientContextID = getOptText(jsonRequest, Parameter.CLIENT_ID.str());
                 param.timeout = getOptText(jsonRequest, Parameter.TIMEOUT.str());
+                param.maxResultReads = getOptText(jsonRequest, Parameter.MAX_RESULT_READS.str());
             } catch (JsonParseException | JsonMappingException e) {
                 // if the JSON parsing fails, the statement is empty and we get an empty statement error
-                GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
             }
         } else {
             param.statement = request.getParameter(Parameter.STATEMENT.str());
@@ -334,6 +400,8 @@
             param.pretty = Boolean.parseBoolean(request.getParameter(Parameter.PRETTY.str()));
             param.mode = toLower(request.getParameter(Parameter.MODE.str()));
             param.clientContextID = request.getParameter(Parameter.CLIENT_ID.str());
+            param.timeout = request.getParameter(Parameter.TIMEOUT.str());
+            param.maxResultReads = request.getParameter(Parameter.MAX_RESULT_READS.str());
         }
         return param;
     }
@@ -381,25 +449,28 @@
         RequestParameters param = getRequestParameters(request);
         LOGGER.info(param.toString());
         long elapsedStart = System.nanoTime();
-        final StringWriter stringWriter = new StringWriter();
-        final PrintWriter resultWriter = new PrintWriter(stringWriter);
+        final PrintWriter httpWriter = response.writer();
 
         ResultDelivery delivery = parseResultDelivery(param.mode);
 
+        final ResultProperties resultProperties = param.maxResultReads == null ? new ResultProperties(delivery)
+                : new ResultProperties(delivery, Long.parseLong(param.maxResultReads));
+
         String handleUrl = getHandleUrl(param.host, param.path, delivery);
-        SessionOutput sessionOutput = createSessionOutput(param, handleUrl, resultWriter);
+        SessionOutput sessionOutput = createSessionOutput(param, handleUrl, httpWriter);
         SessionConfig sessionConfig = sessionOutput.config();
         HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
 
-        HttpResponseStatus status = HttpResponseStatus.OK;
         Stats stats = new Stats();
-        long[] execStartEnd = new long[] { -1, -1 };
+        RequestExecutionState execution = new RequestExecutionState();
 
-        resultWriter.print("{\n");
-        printRequestId(resultWriter);
-        printClientContextID(resultWriter, param);
-        printSignature(resultWriter);
-        printType(resultWriter, sessionConfig);
+        // buffer the output until we are ready to set the status of the response message correctly
+        sessionOutput.hold();
+        sessionOutput.out().print("{\n");
+        printRequestId(sessionOutput.out());
+        printClientContextID(sessionOutput.out(), param);
+        printSignature(sessionOutput.out());
+        printType(sessionOutput.out(), sessionConfig);
         long errorCount = 1; // so far we just return 1 error
         try {
             if (param.statement == null || param.statement.isEmpty()) {
@@ -410,40 +481,38 @@
             if (optionalParamProvider != null) {
                 optionalParams = optionalParamProvider.apply(request);
             }
-            executeStatement(statementsText, sessionOutput, delivery, stats, param, execStartEnd, optionalParams);
+            // CORS
+            response.setHeader("Access-Control-Allow-Origin",
+                    "http://" + hostName + ":" + appCtx.getExternalProperties().getQueryWebInterfacePort());
+            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
+            response.setStatus(execution.getHttpStatus());
+            executeStatement(statementsText, sessionOutput, resultProperties, stats, param, execution, optionalParams);
             if (ResultDelivery.IMMEDIATE == delivery || ResultDelivery.DEFERRED == delivery) {
-                ResultUtil.printStatus(sessionOutput, ResultStatus.SUCCESS);
+                ResultUtil.printStatus(sessionOutput, execution.getResultStatus());
             }
             errorCount = 0;
         } catch (Exception | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError e) {
-            status = handleExecuteStatementException(e);
-            ResultUtil.printError(resultWriter, e);
-            ResultUtil.printStatus(sessionOutput, ResultStatus.FATAL);
+            handleExecuteStatementException(e, execution);
+            response.setStatus(execution.getHttpStatus());
+            ResultUtil.printError(sessionOutput.out(), e);
+            ResultUtil.printStatus(sessionOutput, execution.getResultStatus());
         } finally {
-            if (execStartEnd[0] == -1) {
-                execStartEnd[1] = -1;
-            } else if (execStartEnd[1] == -1) {
-                execStartEnd[1] = System.nanoTime();
-            }
+            // make sure that we stop buffering and return the result to the http response
+            sessionOutput.release();
+            execution.finish();
         }
-        printMetrics(resultWriter, System.nanoTime() - elapsedStart, execStartEnd[1] - execStartEnd[0],
-                stats.getCount(), stats.getSize(), stats.getProcessedObjects(), errorCount);
-        resultWriter.print("}\n");
-        resultWriter.flush();
-        String result = stringWriter.toString();
-
-        GlobalConfig.ASTERIX_LOGGER.log(Level.FINE, result);
-
-        response.setStatus(status);
-        response.writer().print(result);
-        if (response.writer().checkError()) {
-            LOGGER.warning("Error flushing output writer");
+        printMetrics(sessionOutput.out(), System.nanoTime() - elapsedStart, execution.duration(), stats.getCount(),
+                stats.getSize(), stats.getProcessedObjects(), errorCount);
+        sessionOutput.out().print("}\n");
+        sessionOutput.out().flush();
+        if (sessionOutput.out().checkError()) {
+            LOGGER.warn("Error flushing output writer");
         }
     }
 
-    protected void executeStatement(String statementsText, SessionOutput sessionOutput, ResultDelivery delivery,
-            IStatementExecutor.Stats stats, RequestParameters param, long[] outExecStartEnd,
-            Map<String, String> optionalParameters) throws Exception {
+    protected void executeStatement(String statementsText, SessionOutput sessionOutput,
+            ResultProperties resultProperties, IStatementExecutor.Stats stats, RequestParameters param,
+            RequestExecutionState execution, Map<String, String> optionalParameters) throws Exception {
         IClusterManagementWork.ClusterState clusterState =
                 ((ICcApplicationContext) appCtx).getClusterStateManager().getState();
         if (clusterState != IClusterManagementWork.ClusterState.ACTIVE) {
@@ -455,25 +524,28 @@
         MetadataManager.INSTANCE.init();
         IStatementExecutor translator = statementExecutorFactory.create((ICcApplicationContext) appCtx, statements,
                 sessionOutput, compilationProvider, componentProvider);
-        outExecStartEnd[0] = System.nanoTime();
-        final IRequestParameters requestParameters =
-                new org.apache.asterix.app.translator.RequestParameters(getHyracksDataset(), delivery, stats, null,
-                        param.clientContextID, optionalParameters);
+        execution.start();
+        final IRequestParameters requestParameters = new org.apache.asterix.app.translator.RequestParameters(
+                getHyracksDataset(), resultProperties, stats, null, param.clientContextID, optionalParameters);
         translator.compileAndExecute(getHyracksClientConnection(), queryCtx, requestParameters);
-        outExecStartEnd[1] = System.nanoTime();
+        execution.end();
     }
 
-    protected HttpResponseStatus handleExecuteStatementException(Throwable t) {
+    protected void handleExecuteStatementException(Throwable t, RequestExecutionState execution) {
         if (t instanceof org.apache.asterix.aqlplus.parser.TokenMgrError || t instanceof TokenMgrError
                 || t instanceof AlgebricksException) {
             GlobalConfig.ASTERIX_LOGGER.log(Level.INFO, t.getMessage(), t);
-            return HttpResponseStatus.BAD_REQUEST;
+            execution.setStatus(ResultStatus.FATAL, HttpResponseStatus.BAD_REQUEST);
         } else if (t instanceof HyracksException) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.WARNING, t.getMessage(), t);
-            return HttpResponseStatus.INTERNAL_SERVER_ERROR;
+            GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, t.getMessage(), t);
+            if (((HyracksException) t).getErrorCode() == ErrorCode.QUERY_TIMEOUT) {
+                execution.setStatus(ResultStatus.TIMEOUT, HttpResponseStatus.OK);
+            } else {
+                execution.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
+            }
         } else {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, "Unexpected exception", t);
-            return HttpResponseStatus.INTERNAL_SERVER_ERROR;
+            GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, "Unexpected exception", t);
+            execution.setStatus(ResultStatus.FATAL, HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
index cec65f7..e55d82a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryStatusApiServlet.java
@@ -24,8 +24,6 @@
 import java.io.StringWriter;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.result.ResultHandle;
 import org.apache.asterix.app.result.ResultReader;
@@ -35,11 +33,14 @@
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class QueryStatusApiServlet extends AbstractQueryApiServlet {
-    private static final Logger LOGGER = Logger.getLogger(QueryStatusApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public QueryStatusApiServlet(ConcurrentMap<String, Object> ctx, IApplicationContext appCtx, String... paths) {
         super(appCtx, ctx, paths);
@@ -91,7 +92,7 @@
         response.setStatus(httpStatus);
         response.writer().print(result);
         if (response.writer().checkError()) {
-            LOGGER.warning("Error flushing output writer");
+            LOGGER.warn("Error flushing output writer");
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
deleted file mode 100644
index db39c5e..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.api.http.server;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.config.ExternalProperties;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.hyracks.http.api.IServletRequest;
-import org.apache.hyracks.http.api.IServletResponse;
-import org.apache.hyracks.http.server.StaticResourceServlet;
-import org.apache.hyracks.http.server.utils.HttpUtil;
-
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import io.netty.handler.codec.http.HttpResponseStatus;
-
-public class QueryWebInterfaceServlet extends StaticResourceServlet {
-    private static final Logger LOGGER = Logger.getLogger(QueryWebInterfaceServlet.class.getName());
-    private ICcApplicationContext appCtx;
-
-    public QueryWebInterfaceServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String[] paths) {
-        super(ctx, paths);
-        this.appCtx = appCtx;
-    }
-
-    @Override
-    protected void get(IServletRequest request, IServletResponse response) throws IOException {
-        String requestURI = request.getHttpRequest().uri();
-        if ("/".equals(requestURI)) {
-            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML);
-            deliverResource("/queryui/queryui.html", response);
-        } else {
-            deliverResource(requestURI, response);
-        }
-    }
-
-    @Override
-    protected void post(IServletRequest request, IServletResponse response) throws IOException {
-        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
-        ExternalProperties externalProperties = appCtx.getExternalProperties();
-        response.setStatus(HttpResponseStatus.OK);
-        ObjectNode obj = OBJECT_MAPPER.createObjectNode();
-        try {
-            PrintWriter out = response.writer();
-            obj.put("api_port", String.valueOf(externalProperties.getAPIServerPort()));
-            out.println(obj.toString());
-            return;
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failure writing response", e);
-        }
-        try {
-            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failure setting response status", e);
-        }
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
index 5bd3d3c..51f420c 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RebalanceApiServlet.java
@@ -33,8 +33,6 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.active.ActiveNotificationHandler;
 import org.apache.asterix.common.api.IMetadataLockManager;
@@ -52,6 +50,9 @@
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -64,7 +65,7 @@
  * - rebalance all non-metadata datasets.
  */
 public class RebalanceApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(RebalanceApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final String METADATA = "Metadata";
     private final ICcApplicationContext appCtx;
 
@@ -266,9 +267,9 @@
     private void sendResponse(IServletResponse response, HttpResponseStatus status, String message, Exception e) {
         if (status != HttpResponseStatus.OK) {
             if (e != null) {
-                LOGGER.log(Level.WARNING, message, e);
+                LOGGER.log(Level.WARN, message, e);
             } else {
-                LOGGER.log(Level.WARNING, message);
+                LOGGER.log(Level.WARN, message);
             }
         }
         PrintWriter out = response.writer();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java
index 117d7fb..428a4e0 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/RestApiServlet.java
@@ -24,8 +24,6 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.app.result.ResultReader;
 import org.apache.asterix.app.translator.QueryTranslator;
@@ -44,6 +42,7 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.IStatementExecutor.ResultDelivery;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionConfig.OutputFormat;
 import org.apache.asterix.translator.SessionConfig.PlanFormat;
@@ -55,6 +54,9 @@
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -63,7 +65,7 @@
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public abstract class RestApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(RestApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ICcApplicationContext appCtx;
     private final ILangCompilationProvider compilationProvider;
     private final IParserFactory parserFactory;
@@ -180,7 +182,7 @@
             doHandle(response, query, sessionOutput, resultDelivery);
         } catch (Exception e) {
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-            LOGGER.log(Level.WARNING, "Failure handling request", e);
+            LOGGER.log(Level.WARN, "Failure handling request", e);
             return;
         }
     }
@@ -207,18 +209,18 @@
             MetadataManager.INSTANCE.init();
             IStatementExecutor translator = statementExecutorFactory.create(appCtx, aqlStatements, sessionOutput,
                     compilationProvider, componentProvider);
-            final IRequestParameters requestParameters =
-                    new RequestParameters(hds, resultDelivery, new IStatementExecutor.Stats(), null, null, null);
+            final IRequestParameters requestParameters = new RequestParameters(hds,
+                    new ResultProperties(resultDelivery), new IStatementExecutor.Stats(), null, null, null);
             translator.compileAndExecute(hcc, null, requestParameters);
         } catch (AsterixException | TokenMgrError | org.apache.asterix.aqlplus.parser.TokenMgrError pe) {
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, pe.getMessage(), pe);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, pe.getMessage(), pe);
             String errorMessage = ResultUtil.buildParseExceptionMessage(pe, query);
             ObjectNode errorResp =
                     ResultUtil.getErrorResponse(2, errorMessage, "", ResultUtil.extractFullStackTrace(pe));
             sessionOutput.out().write(OBJECT_MAPPER.writeValueAsString(errorResp));
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             ResultUtil.apiErrorHandler(sessionOutput.out(), e);
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
index 72d82e0..ec128c2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
@@ -45,17 +45,18 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.util.JSONUtil;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class ResultUtil {
-    private static final Logger LOGGER = Logger.getLogger(ResultUtil.class.getName());
-    public static final List<Pair<Character, String>> HTML_ENTITIES = Collections.unmodifiableList(
-            Arrays.asList(Pair.of('&', "&amp;"), Pair.of('"', "&quot;"), Pair.of('<', "&lt;"), Pair.of('>', "&gt;"),
-                    Pair.of('\'', "&apos;")));
+    private static final Logger LOGGER = LogManager.getLogger();
+    public static final List<Pair<Character, String>> HTML_ENTITIES =
+            Collections.unmodifiableList(Arrays.asList(Pair.of('&', "&amp;"), Pair.of('"', "&quot;"),
+                    Pair.of('<', "&lt;"), Pair.of('>', "&gt;"), Pair.of('\'', "&apos;")));
 
     private ResultUtil() {
     }
@@ -130,8 +131,9 @@
     public static void printError(PrintWriter pw, String msg, int code, boolean comma) {
         pw.print("\t\"");
         pw.print(AbstractQueryApiServlet.ResultFields.ERRORS.str());
-        pw.print("\": [{ \n");
+        pw.print("\": [{ \n\t");
         printField(pw, QueryServiceServlet.ErrorField.CODE.str(), code);
+        pw.print("\t");
         printField(pw, QueryServiceServlet.ErrorField.MSG.str(), JSONUtil.escape(msg), false);
         pw.print(comma ? "\t}],\n" : "\t}]\n");
     }
@@ -206,8 +208,8 @@
             errorCode = 4;
         }
 
-        ObjectNode errorResp = ResultUtil
-                .getErrorResponse(errorCode, extractErrorMessage(e), extractErrorSummary(e), extractFullStackTrace(e));
+        ObjectNode errorResp = ResultUtil.getErrorResponse(errorCode, extractErrorMessage(e), extractErrorSummary(e),
+                extractFullStackTrace(e));
         out.write(errorResp.toString());
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
index ac31e24..8c4f22d 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ShutdownApiServlet.java
@@ -25,8 +25,6 @@
 import java.io.PrintWriter;
 import java.util.Date;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.config.GlobalConfig;
@@ -37,6 +35,9 @@
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
 import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -44,7 +45,7 @@
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class ShutdownApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(ShutdownApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final String NODE_ID_KEY = "node_id";
     public static final String NCSERVICE_PID = "ncservice_pid";
     public static final String INI = "ini";
@@ -65,14 +66,14 @@
             try {
                 hcc.stopCluster(terminateNCServices);
             } catch (Exception e) {
-                GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, "Exception stopping cluster", e);
+                GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, "Exception stopping cluster", e);
             }
         }, "Shutdown Servlet Worker");
 
         try {
             HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failure handling request", e);
+            LOGGER.log(Level.WARN, "Failure handling request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             return;
         }
@@ -94,7 +95,7 @@
                         nc.put(NCSERVICE_PID, details.get(INI).get(NCSERVICE_PID).asInt());
                     }
                 } else {
-                    LOGGER.warning("Unable to get node details for " + node + " from hcc");
+                    LOGGER.warn("Unable to get node details for " + node + " from hcc");
                 }
             }
             jsonObject.set("cluster", clusterState);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/StorageApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/StorageApiServlet.java
new file mode 100644
index 0000000..142b99b
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/StorageApiServlet.java
@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.api.http.server;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.InetSocketAddress;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.storage.IReplicaManager;
+import org.apache.asterix.common.storage.ReplicaIdentifier;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.http.api.IServletRequest;
+import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.hyracks.http.server.AbstractServlet;
+import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import io.netty.handler.codec.http.HttpResponseStatus;
+
+public class StorageApiServlet extends AbstractServlet {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final INcApplicationContext appCtx;
+
+    public StorageApiServlet(ConcurrentMap<String, Object> ctx, INcApplicationContext appCtx, String... paths) {
+        super(ctx, paths);
+        this.appCtx = appCtx;
+    }
+
+    @Override
+    protected void get(IServletRequest request, IServletResponse response) throws IOException {
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
+        PrintWriter responseWriter = response.writer();
+        try {
+            JsonNode json;
+            response.setStatus(HttpResponseStatus.OK);
+            final String path = localPath(request);
+            if ("".equals(path)) {
+                json = getStatus(p -> true);
+            } else if (path.startsWith("/partition")) {
+                json = getPartitionStatus(path);
+            } else {
+                throw new IllegalArgumentException();
+            }
+            JSONUtil.writeNode(responseWriter, json);
+        } catch (IllegalArgumentException e) {
+            LOGGER.log(Level.INFO, "Unrecognized path: " + request, e);
+            response.setStatus(HttpResponseStatus.NOT_FOUND);
+        } catch (Exception e) {
+            LOGGER.log(Level.INFO, "exception thrown for " + request, e);
+            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
+            responseWriter.write(e.toString());
+        }
+        responseWriter.flush();
+    }
+
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) throws Exception {
+        switch (localPath(request)) {
+            case "/addReplica":
+                processAddReplica(request, response);
+                break;
+            case "/removeReplica":
+                processRemoveReplica(request, response);
+                break;
+            case "/promote":
+                processPromote(request, response);
+                break;
+            case "/release":
+                processRelease(request, response);
+                break;
+            default:
+                sendError(response, HttpResponseStatus.NOT_FOUND);
+                break;
+        }
+    }
+
+    private JsonNode getPartitionStatus(String path) {
+        String[] token = path.split("/");
+        if (token.length != 3) {
+            throw new IllegalArgumentException();
+        }
+        // get the partition number from the path
+        final Integer partition = Integer.valueOf(token[2]);
+        return getStatus(partition::equals);
+    }
+
+    private JsonNode getStatus(Predicate<Integer> predicate) {
+        final ArrayNode status = OBJECT_MAPPER.createArrayNode();
+        final IReplicaManager storageSubsystem = appCtx.getReplicaManager();
+        final Set<Integer> partitions =
+                storageSubsystem.getPartitions().stream().filter(predicate).collect(Collectors.toSet());
+        for (Integer partition : partitions) {
+            final ObjectNode partitionJson = OBJECT_MAPPER.createObjectNode();
+            partitionJson.put("partition", partition);
+            final List<IPartitionReplica> replicas = storageSubsystem.getReplicas(partition);
+            ArrayNode replicasArray = OBJECT_MAPPER.createArrayNode();
+            for (IPartitionReplica replica : replicas) {
+                final ObjectNode replicaJson = OBJECT_MAPPER.createObjectNode();
+                final InetSocketAddress location = replica.getIdentifier().getLocation();
+                replicaJson.put("location", location.getHostString() + ":" + location.getPort());
+                replicaJson.put("status", replica.getStatus().toString());
+                replicasArray.add(replicaJson);
+            }
+            partitionJson.set("replicas", replicasArray);
+            status.add(partitionJson);
+        }
+        return status;
+    }
+
+    private void processAddReplica(IServletRequest request, IServletResponse response) {
+        final ReplicaIdentifier replicaIdentifier = getReplicaIdentifier(request);
+        if (replicaIdentifier == null) {
+            response.setStatus(HttpResponseStatus.BAD_REQUEST);
+            return;
+        }
+        appCtx.getReplicaManager().addReplica(replicaIdentifier);
+        response.setStatus(HttpResponseStatus.OK);
+    }
+
+    private void processRemoveReplica(IServletRequest request, IServletResponse response) {
+        final ReplicaIdentifier replicaIdentifier = getReplicaIdentifier(request);
+        if (replicaIdentifier == null) {
+            response.setStatus(HttpResponseStatus.BAD_REQUEST);
+            return;
+        }
+        appCtx.getReplicaManager().removeReplica(replicaIdentifier);
+        response.setStatus(HttpResponseStatus.OK);
+    }
+
+    private ReplicaIdentifier getReplicaIdentifier(IServletRequest request) {
+        final String partition = request.getParameter("partition");
+        final String host = request.getParameter("host");
+        final String port = request.getParameter("port");
+        if (partition == null || host == null || port == null) {
+            return null;
+        }
+        final InetSocketAddress replicaAddress = new InetSocketAddress(host, Integer.valueOf(port));
+        return ReplicaIdentifier.of(Integer.valueOf(partition), replicaAddress);
+    }
+
+    private void processPromote(IServletRequest request, IServletResponse response) throws HyracksDataException {
+        final String partition = request.getParameter("partition");
+        if (partition == null) {
+            response.setStatus(HttpResponseStatus.BAD_REQUEST);
+            return;
+        }
+        appCtx.getReplicaManager().promote(Integer.valueOf(partition));
+        response.setStatus(HttpResponseStatus.OK);
+    }
+
+    private void processRelease(IServletRequest request, IServletResponse response) throws HyracksDataException {
+        final String partition = request.getParameter("partition");
+        if (partition == null) {
+            response.setStatus(HttpResponseStatus.BAD_REQUEST);
+            return;
+        }
+        appCtx.getReplicaManager().release(Integer.valueOf(partition));
+        response.setStatus(HttpResponseStatus.OK);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
index 8d028a5..8b615cf 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/VersionApiServlet.java
@@ -24,21 +24,22 @@
 import java.io.PrintWriter;
 import java.util.Map;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class VersionApiServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(VersionApiServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public VersionApiServlet(ConcurrentMap<String, Object> ctx, String[] paths) {
         super(ctx, paths);
@@ -54,7 +55,7 @@
         try {
             HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_PLAIN, HttpUtil.Encoding.UTF8);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failure handling request", e);
+            LOGGER.log(Level.WARN, "Failure handling request", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             return;
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
index 58a7f09..0e51953 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/java/AsterixJavaClient.java
@@ -35,6 +35,7 @@
 import org.apache.asterix.translator.IRequestParameters;
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionConfig.OutputFormat;
 import org.apache.asterix.translator.SessionConfig.PlanFormat;
@@ -93,8 +94,7 @@
 
     public void compile(boolean optimize, boolean printRewrittenExpressions, boolean printLogicalPlan,
             boolean printOptimizedPlan, boolean printPhysicalOpsOnly, boolean generateBinaryRuntime, boolean printJob,
-            PlanFormat pformat)
-            throws Exception {
+            PlanFormat pformat) throws Exception {
         queryJobSpec = null;
         dmlJobs = null;
 
@@ -120,8 +120,8 @@
         IStatementExecutor translator = statementExecutorFactory.create(appCtx, statements, output, compilationProvider,
                 storageComponentProvider);
         final IRequestParameters requestParameters =
-                new RequestParameters(null, IStatementExecutor.ResultDelivery.IMMEDIATE, new IStatementExecutor.Stats(),
-                        null, null, null);
+                new RequestParameters(null, new ResultProperties(IStatementExecutor.ResultDelivery.IMMEDIATE),
+                        new IStatementExecutor.Stats(), null, null, null);
         translator.compileAndExecute(hcc, null, requestParameters);
         writer.flush();
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
index bae04d5..12bcc0d2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java
@@ -25,8 +25,6 @@
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveEvent;
 import org.apache.asterix.active.ActiveEvent.Kind;
@@ -57,10 +55,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class ActiveEntityEventsListener implements IActiveEntityController {
 
-    private static final Logger LOGGER = Logger.getLogger(ActiveEntityEventsListener.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final Level level = Level.INFO;
     private static final ActiveEvent STATE_CHANGED = new ActiveEvent(null, Kind.STATE_CHANGED, null, null);
     private static final EnumSet<ActivityState> TRANSITION_STATES = EnumSet.of(ActivityState.RESUMING,
@@ -153,12 +154,12 @@
                     handle((ActivePartitionMessage) event.getEventObject());
                     break;
                 default:
-                    LOGGER.log(Level.FINE, "Unhandled feed event notification: " + event);
+                    LOGGER.log(Level.DEBUG, "Unhandled feed event notification: " + event);
                     break;
             }
             notifySubscribers(event);
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Unhandled Exception", e);
+            LOGGER.log(Level.ERROR, "Unhandled Exception", e);
         }
     }
 
@@ -181,7 +182,7 @@
     protected void finish(ActiveEvent event) throws HyracksDataException {
         LOGGER.log(level, "the job " + jobId + " finished");
         if (numRegistered != numDeRegistered) {
-            LOGGER.log(Level.WARNING, "the job " + jobId + " finished with reported runtime registrations = "
+            LOGGER.log(Level.WARN, "the job " + jobId + " finished with reported runtime registrations = "
                     + numRegistered + " and deregistrations = " + numDeRegistered + " on node controllers");
         }
         jobId = null;
@@ -192,9 +193,9 @@
         if (jobStatus.equals(JobStatus.FAILURE)) {
             jobFailure = exceptions.isEmpty() ? new RuntimeDataException(ErrorCode.UNREPORTED_TASK_FAILURE_EXCEPTION)
                     : exceptions.get(0);
-            setState(ActivityState.TEMPORARILY_FAILED);
+            setState((state == ActivityState.STOPPING) ? ActivityState.STOPPED : ActivityState.TEMPORARILY_FAILED);
             if (prevState != ActivityState.SUSPENDING && prevState != ActivityState.RECOVERING
-                    && prevState != ActivityState.RESUMING) {
+                    && prevState != ActivityState.RESUMING && prevState != ActivityState.STOPPING) {
                 recover();
             }
         } else {
@@ -317,7 +318,7 @@
                 try {
                     subscriber.notify(event);
                 } catch (HyracksDataException e) {
-                    LOGGER.log(Level.WARNING, "Failed to notify subscriber", e);
+                    LOGGER.log(Level.WARN, "Failed to notify subscriber", e);
                 }
                 if (subscriber.isDone()) {
                     it.remove();
@@ -379,7 +380,7 @@
             setRunning(metadataProvider, true);
         } catch (Exception e) {
             setState(ActivityState.PERMANENTLY_FAILED);
-            LOGGER.log(Level.SEVERE, "Failed to start the entity " + entityId, e);
+            LOGGER.log(Level.ERROR, "Failed to start the entity " + entityId, e);
             throw HyracksDataException.create(e);
         }
     }
@@ -411,7 +412,7 @@
             try {
                 setRunning(metadataProvider, false);
             } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Failed to set the entity state as not running " + entityId, e);
+                LOGGER.log(Level.ERROR, "Failed to set the entity state as not running " + entityId, e);
                 throw HyracksDataException.create(e);
             }
         } else if (state == ActivityState.RUNNING) {
@@ -421,7 +422,7 @@
                 setRunning(metadataProvider, false);
             } catch (Exception e) {
                 setState(ActivityState.PERMANENTLY_FAILED);
-                LOGGER.log(Level.SEVERE, "Failed to stop the entity " + entityId, e);
+                LOGGER.log(Level.ERROR, "Failed to stop the entity " + entityId, e);
                 throw HyracksDataException.create(e);
             }
         } else {
@@ -470,7 +471,7 @@
             subscriber.sync();
         } catch (Exception e) {
             synchronized (this) {
-                LOGGER.log(Level.SEVERE, "Failure while waiting for " + entityId + " to become suspended", e);
+                LOGGER.log(Level.ERROR, "Failure while waiting for " + entityId + " to become suspended", e);
                 // failed to suspend
                 if (state == ActivityState.SUSPENDING) {
                     if (jobId != null) {
@@ -506,7 +507,7 @@
             try {
                 rt.resumeOrRecover(metadataProvider);
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Failure while attempting to resume " + entityId, e);
+                LOGGER.log(Level.WARN, "Failure while attempting to resume " + entityId, e);
             }
         } finally {
             suspended = false;
@@ -550,4 +551,10 @@
     public String getDisplayName() throws HyracksDataException {
         return this.getEntityId().toString();
     }
+
+    @Override
+    public String toString() {
+        return "{\"class\":\"" + getClass().getSimpleName() + "\"" + "\"entityId\":\"" + entityId + "\""
+                + "\"state\":\"" + state + "\"" + "}";
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveNotificationHandler.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveNotificationHandler.java
index d13a15d..b8ed03f 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveNotificationHandler.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveNotificationHandler.java
@@ -22,8 +22,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveEvent;
 import org.apache.asterix.active.ActiveEvent.Kind;
@@ -33,7 +31,6 @@
 import org.apache.asterix.active.IActiveNotificationHandler;
 import org.apache.asterix.active.message.ActivePartitionMessage;
 import org.apache.asterix.common.api.IMetadataLockManager;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.metadata.api.IActiveEntityController;
@@ -41,6 +38,7 @@
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.utils.DatasetUtil;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.IJobLifecycleListener;
@@ -48,11 +46,14 @@
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.api.job.JobStatus;
 import org.apache.hyracks.api.util.SingleThreadEventProcessor;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ActiveNotificationHandler extends SingleThreadEventProcessor<ActiveEvent>
         implements IActiveNotificationHandler, IJobLifecycleListener {
 
-    private static final Logger LOGGER = Logger.getLogger(ActiveNotificationHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final Level level = Level.INFO;
     public static final String ACTIVE_ENTITY_PROPERTY_NAME = "ActiveJob";
     private final Map<EntityId, IActiveEntityEventsListener> entityEventListeners;
@@ -83,7 +84,7 @@
                 listener.notify(event);
             }
         } else {
-            LOGGER.log(Level.SEVERE, "Entity not found for received message for job " + event.getJobId());
+            LOGGER.log(Level.ERROR, "Entity not found for received message for job " + event.getJobId());
         }
     }
 
@@ -111,7 +112,7 @@
         LOGGER.log(level, "Job was found to be: " + (found ? "Active" : "Inactive"));
         if (entityEventListeners.containsKey(entityId)) {
             if (jobId2EntityId.containsKey(jobId)) {
-                LOGGER.severe("Job is already being monitored for job: " + jobId);
+                LOGGER.error("Job is already being monitored for job: " + jobId);
                 return;
             }
             LOGGER.log(level, "monitoring started for job id: " + jobId);
@@ -226,7 +227,7 @@
     }
 
     public void suspend(MetadataProvider mdProvider)
-            throws AsterixException, HyracksDataException, InterruptedException {
+            throws AlgebricksException, HyracksDataException, InterruptedException {
         synchronized (this) {
             if (suspended) {
                 throw new RuntimeDataException(ErrorCode.ACTIVE_EVENT_HANDLER_ALREADY_SUSPENDED);
@@ -255,8 +256,7 @@
         }
     }
 
-    public void resume(MetadataProvider mdProvider)
-            throws AsterixException, HyracksDataException, InterruptedException {
+    public void resume(MetadataProvider mdProvider) throws HyracksDataException, InterruptedException {
         LOGGER.log(level, "Resuming active events handler");
         for (IActiveEntityEventsListener listener : entityEventListeners.values()) {
             LOGGER.log(level, "Resuming " + listener.getEntityId());
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
index c0ce6ec..fbf644f 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/FeedEventsListener.java
@@ -67,8 +67,8 @@
     @Override
     public synchronized void remove(Dataset dataset) throws HyracksDataException {
         super.remove(dataset);
-        feedConnections.removeIf(o -> o.getDataverseName().equals(dataset.getDataverseName()) && o.getDatasetName()
-                .equals(dataset.getDatasetName()));
+        feedConnections.removeIf(o -> o.getDataverseName().equals(dataset.getDataverseName())
+                && o.getDatasetName().equals(dataset.getDatasetName()));
     }
 
     public synchronized void addFeedConnection(FeedConnection feedConnection) {
@@ -115,8 +115,8 @@
             // Construct ActiveMessage
             for (int i = 0; i < getLocations().getLocations().length; i++) {
                 String intakeLocation = getLocations().getLocations()[i];
-                FeedOperations
-                        .SendStopMessageToNode(metadataProvider.getApplicationContext(), entityId, intakeLocation, i);
+                FeedOperations.SendStopMessageToNode(metadataProvider.getApplicationContext(), entityId, intakeLocation,
+                        i);
             }
             eventSubscriber.sync();
         } catch (Exception e) {
@@ -126,8 +126,7 @@
     }
 
     @Override
-    protected void setRunning(MetadataProvider metadataProvider, boolean running)
-            throws HyracksDataException {
+    protected void setRunning(MetadataProvider metadataProvider, boolean running) throws HyracksDataException {
         // No op
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
index 0321ae4..ffef251 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/RecoveryTask.java
@@ -19,8 +19,6 @@
 package org.apache.asterix.app.active;
 
 import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActivityState;
 import org.apache.asterix.active.IRetryPolicy;
@@ -36,10 +34,13 @@
 import org.apache.asterix.metadata.utils.MetadataLockUtil;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RecoveryTask {
 
-    private static final Logger LOGGER = Logger.getLogger(RecoveryTask.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final Level level = Level.INFO;
     private final ActiveEntityEventsListener listener;
     private volatile boolean cancelRecovery = false;
@@ -86,7 +87,7 @@
                 listener.setState(ActivityState.RUNNING);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Attempt to resume " + listener.getEntityId() + " Failed", e);
+            LOGGER.log(Level.WARN, "Attempt to resume " + listener.getEntityId() + " Failed", e);
             synchronized (listener) {
                 if (listener.getState() == ActivityState.RESUMING) {
                     // This will be the case if compilation failure
@@ -102,7 +103,7 @@
                     }
                 }
             } else {
-                LOGGER.log(Level.WARNING, "Submitting recovery task for " + listener.getEntityId());
+                LOGGER.log(Level.WARN, "Submitting recovery task for " + listener.getEntityId());
                 metadataProvider.getApplicationContext().getServiceContext().getControllerService().getExecutor()
                         .submit(() -> doRecover(retryPolicyFactory.create(listener)));
             }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
index 768416d..1ba418a 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/cc/CCExtensionManager.java
@@ -25,7 +25,6 @@
 
 import org.apache.asterix.algebra.base.ILangExtension;
 import org.apache.asterix.algebra.base.ILangExtension.Language;
-import org.apache.asterix.algebra.extension.IAlgebraExtensionManager;
 import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
 import org.apache.asterix.common.api.ExtensionId;
 import org.apache.asterix.common.api.IExtension;
@@ -48,7 +47,7 @@
  * AsterixDB's implementation of {@code IAlgebraExtensionManager} and {@code IFunctionExtensionManager}
  * which takes care of initializing extensions for App and Compilation purposes
  */
-public class CCExtensionManager implements IAlgebraExtensionManager, IFunctionExtensionManager {
+public class CCExtensionManager implements IFunctionExtensionManager {
 
     private final IStatementExecutorExtension statementExecutorExtension;
     private final ILangCompilationProvider aqlCompilationProvider;
@@ -110,18 +109,21 @@
 
     public IStatementExecutorFactory getStatementExecutorFactory(ExecutorService executorService) {
         if (statementExecutorFactory == null) {
-            statementExecutorFactory = statementExecutorExtension == null
-                    ? new DefaultStatementExecutorFactory(executorService)
-                    : statementExecutorExtension.getStatementExecutorFactory(executorService);
+            statementExecutorFactory =
+                    statementExecutorExtension == null ? new DefaultStatementExecutorFactory(executorService)
+                            : statementExecutorExtension.getStatementExecutorFactory(executorService);
         }
         return statementExecutorFactory;
     }
 
     public ILangCompilationProvider getCompilationProvider(Language lang) {
         switch (lang) {
-            case AQL: return aqlCompilationProvider;
-            case SQLPP: return sqlppCompilationProvider;
-            default: throw new IllegalArgumentException(String.valueOf(lang));
+            case AQL:
+                return aqlCompilationProvider;
+            case SQLPP:
+                return sqlppCompilationProvider;
+            default:
+                throw new IllegalArgumentException(String.valueOf(lang));
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryClassLoader.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryClassLoader.java
index 711ac6d..9cf7584 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryClassLoader.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryClassLoader.java
@@ -23,7 +23,8 @@
 
 public class ExternalLibraryClassLoader extends URLClassLoader {
 
-    private static final ClassLoader bootClassLoader = new ClassLoader(null){};
+    private static final ClassLoader bootClassLoader = new ClassLoader(null) {
+    };
 
     public ExternalLibraryClassLoader(URL[] urls, ClassLoader parentClassLoader) {
         super(urls, parentClassLoader);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
index 5f86c28..c9f777d 100755
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalLibraryUtils.java
@@ -27,8 +27,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
@@ -50,10 +48,13 @@
 import org.apache.asterix.metadata.entities.Library;
 import org.apache.asterix.metadata.utils.MetadataUtil;
 import org.apache.asterix.runtime.formats.NonTaggedDataFormat;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalLibraryUtils {
 
-    private static final Logger LOGGER = Logger.getLogger(ExternalLibraryUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final FilenameFilter nonHiddenFileNameFilter = (dir, name) -> !name.startsWith(".");
 
     private ExternalLibraryUtils() {
@@ -170,8 +171,7 @@
                 // belong to the library?
                 if (adapter.getAdapterIdentifier().getName().startsWith(libraryName + "#")) {
                     // remove adapter <! we didn't check if there are feeds which use this adapter>
-                    MetadataManager.INSTANCE.dropAdapter(mdTxnCtx, dataverse,
-                            adapter.getAdapterIdentifier().getName());
+                    MetadataManager.INSTANCE.dropAdapter(mdTxnCtx, dataverse, adapter.getAdapterIdentifier().getName());
                 }
             }
             // drop the library itself
@@ -210,7 +210,7 @@
 
             // Add library
             MetadataManager.INSTANCE.addLibrary(mdTxnCtx, new Library(dataverse, libraryName));
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Added library " + libraryName + " to Metadata");
             }
 
@@ -247,15 +247,15 @@
                     }
                     Function f = new Function(dataverse, libraryName + "#" + function.getName().trim(), args.size(),
                             args, function.getReturnType().trim(), function.getDefinition().trim(),
-                            library.getLanguage().trim(), function.getFunctionType().trim());
+                            library.getLanguage().trim(), function.getFunctionType().trim(), null);
                     MetadataManager.INSTANCE.addFunction(mdTxnCtx, f);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Installed function: " + libraryName + "#" + function.getName().trim());
                     }
                 }
             }
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Installed functions in library :" + libraryName);
             }
 
@@ -268,19 +268,19 @@
                     DatasourceAdapter dsa =
                             new DatasourceAdapter(aid, adapterFactoryClass, IDataSourceAdapter.AdapterType.EXTERNAL);
                     MetadataManager.INSTANCE.addAdapter(mdTxnCtx, dsa);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Installed adapter: " + adapterName);
                     }
                 }
             }
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Installed adapters in library :" + libraryName);
             }
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "Exception in installing library " + libraryName, e);
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.log(Level.ERROR, "Exception in installing library " + libraryName, e);
             }
             MetadataManager.INSTANCE.abortTransaction(mdTxnCtx);
         }
@@ -326,7 +326,7 @@
     private static ClassLoader getLibraryClassLoader(String dataverse, String libraryName) throws Exception {
         // Get a reference to the library directory
         File installDir = getLibraryInstallDir();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Installing lirbary " + libraryName + " in dataverse " + dataverse + "."
                     + " Install Directory: " + installDir.getAbsolutePath());
         }
@@ -346,7 +346,7 @@
         if (jarsInLibDir.length > 1) {
             throw new Exception("Incorrect library structure: found multiple library jars");
         }
-        if (jarsInLibDir.length < 0) {
+        if (jarsInLibDir.length <= 0) {
             throw new Exception("Incorrect library structure: could not find library jar");
         }
 
@@ -374,7 +374,7 @@
             }
         }
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             StringBuilder logMesg = new StringBuilder("Classpath for library " + libraryName + "\n");
             for (URL url : urls) {
                 logMesg.append(url.getFile() + "\n");
@@ -393,8 +393,8 @@
         // Check managix directory first. If not exists, check app home.
         File installDir = new File(System.getProperty("user.dir"), "library");
         if (!installDir.exists()) {
-            installDir = new File(System.getProperty("app.home", System.getProperty("user.home"))
-                    + File.separator + "lib" + File.separator + "udfs");
+            installDir = new File(System.getProperty("app.home", System.getProperty("user.home")) + File.separator
+                    + "lib" + File.separator + "udfs");
         }
         return installDir;
     }
@@ -406,8 +406,8 @@
         // Check managix directory first. If not exists, check app home.
         File uninstallDir = new File(System.getProperty("user.dir"), "uninstall");
         if (!uninstallDir.exists()) {
-            uninstallDir = new File(System.getProperty("app.home", System.getProperty("user.home"))
-                    + File.separator + "lib" + File.separator + "udfs" + File.separator + "uninstall");
+            uninstallDir = new File(System.getProperty("app.home", System.getProperty("user.home")) + File.separator
+                    + "lib" + File.separator + "udfs" + File.separator + "uninstall");
         }
         return uninstallDir;
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalUDFLibrarian.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalUDFLibrarian.java
new file mode 100644
index 0000000..29a4b36
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/ExternalUDFLibrarian.java
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.external;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.rmi.RemoteException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+@SuppressWarnings("squid:S134")
+public class ExternalUDFLibrarian implements IExternalUDFLibrarian {
+
+    // The following list includes a library manager for the CC
+    // and library managers for NCs (one-per-NC).
+    private final List<ILibraryManager> libraryManagers;
+
+    public ExternalUDFLibrarian(List<ILibraryManager> libraryManagers) {
+        this.libraryManagers = libraryManagers;
+    }
+
+    public static void removeLibraryDir() throws IOException {
+        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
+        FileUtils.deleteQuietly(installLibDir);
+    }
+
+    public static void unzip(String sourceFile, String outputDir) throws IOException {
+        if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
+            try (ZipFile zipFile = new ZipFile(sourceFile)) {
+                Enumeration<? extends ZipEntry> entries = zipFile.entries();
+                while (entries.hasMoreElements()) {
+                    ZipEntry entry = entries.nextElement();
+                    File entryDestination = new File(outputDir, entry.getName());
+                    if (!entry.isDirectory()) {
+                        entryDestination.getParentFile().mkdirs();
+                        try (InputStream in = zipFile.getInputStream(entry);
+                                OutputStream out = new FileOutputStream(entryDestination)) {
+                            IOUtils.copy(in, out);
+                        }
+                    }
+                }
+            }
+        } else {
+            Process process = new ProcessBuilder("unzip", "-d", outputDir, sourceFile).start();
+            try {
+                process.waitFor();
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                throw new IOException(e);
+            }
+        }
+    }
+
+    @Override
+    public void install(String dvName, String libName, String libPath) throws Exception {
+        // get the directory of the to be installed libraries
+        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
+        // directory exists?
+        if (!installLibDir.exists()) {
+            installLibDir.mkdir();
+        }
+        // copy the library file into the directory
+        File destinationDir =
+                new File(installLibDir.getAbsolutePath() + File.separator + dvName + File.separator + libName);
+        FileUtils.deleteQuietly(destinationDir);
+        destinationDir.mkdirs();
+        try {
+            unzip(libPath, destinationDir.getAbsolutePath());
+        } catch (Exception e) {
+
+            throw new Exception("Couldn't unzip the file: " + libPath, e);
+        }
+
+        for (ILibraryManager libraryManager : libraryManagers) {
+            ExternalLibraryUtils.registerLibrary(libraryManager, dvName, libName);
+        }
+        // get library file
+        // install if needed (add functions, adapters, datasources, parsers to the metadata)
+        // <Not required for use>
+        ExternalLibraryUtils.installLibraryIfNeeded(dvName, destinationDir, new HashMap<>());
+    }
+
+    @Override
+    public void uninstall(String dvName, String libName) throws RemoteException, AsterixException, ACIDException {
+        ExternalLibraryUtils.uninstallLibrary(dvName, libName);
+        for (ILibraryManager libraryManager : libraryManagers) {
+            libraryManager.deregisterLibraryClassLoader(dvName, libName);
+        }
+    }
+
+    public void cleanup() throws AsterixException, RemoteException, ACIDException {
+        for (ILibraryManager libraryManager : libraryManagers) {
+            List<Pair<String, String>> libs = libraryManager.getAllLibraries();
+            for (Pair<String, String> dvAndLib : libs) {
+                ExternalLibraryUtils.uninstallLibrary(dvAndLib.first, dvAndLib.second);
+                libraryManager.deregisterLibraryClassLoader(dvAndLib.first, dvAndLib.second);
+            }
+        }
+        // get the directory of the to be installed libraries
+        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
+        FileUtils.deleteQuietly(installLibDir);
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/IExternalUDFLibrarian.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/IExternalUDFLibrarian.java
new file mode 100644
index 0000000..9a17444
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/external/IExternalUDFLibrarian.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.external;
+
+import java.io.IOException;
+import java.rmi.RemoteException;
+
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.exceptions.AsterixException;
+
+public interface IExternalUDFLibrarian {
+    public void install(String dvName, String libName, String libPath) throws IOException, Exception;
+
+    public void uninstall(String dvName, String libName) throws RemoteException, AsterixException, ACIDException;
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesDatasource.java
new file mode 100644
index 0000000..e6b025a
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesDatasource.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.metadata.api.IDatasourceFunction;
+import org.apache.asterix.metadata.declared.DataSourceId;
+import org.apache.asterix.metadata.declared.FunctionDataSource;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.properties.INodeDomain;
+
+public class DatasetResourcesDatasource extends FunctionDataSource {
+    private final int datasetId;
+
+    public DatasetResourcesDatasource(INodeDomain domain, int datasetId) throws AlgebricksException {
+        super(new DataSourceId(DatasetResourcesRewriter.DATASET_RESOURCES.getNamespace(),
+                DatasetResourcesRewriter.DATASET_RESOURCES.getName()), domain);
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    protected IDatasourceFunction createFunction(MetadataProvider metadataProvider,
+            AlgebricksAbsolutePartitionConstraint locations) {
+        return new DatasetResourcesFunction(locations, datasetId);
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesFunction.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesFunction.java
new file mode 100644
index 0000000..05d192e
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesFunction.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.context.DatasetLifecycleManager;
+import org.apache.asterix.common.context.DatasetResource;
+import org.apache.asterix.external.api.IRecordReader;
+import org.apache.asterix.metadata.declared.AbstractDatasourceFunction;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+
+public class DatasetResourcesFunction extends AbstractDatasourceFunction {
+
+    private static final long serialVersionUID = 1L;
+    private final int datasetId;
+
+    public DatasetResourcesFunction(AlgebricksAbsolutePartitionConstraint locations, int datasetId) {
+        super(locations);
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    public IRecordReader<char[]> createRecordReader(IHyracksTaskContext ctx, int partition) {
+        INCServiceContext serviceCtx = ctx.getJobletContext().getServiceContext();
+        INcApplicationContext appCtx = (INcApplicationContext) serviceCtx.getApplicationContext();
+        DatasetLifecycleManager dsLifecycleMgr = (DatasetLifecycleManager) appCtx.getDatasetLifecycleManager();
+        DatasetResource dsr = dsLifecycleMgr.getDatasetLifecycle(datasetId);
+        return new DatasetResourcesReader(dsr);
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesReader.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesReader.java
new file mode 100644
index 0000000..bce2002
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesReader.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.asterix.common.context.DatasetResource;
+import org.apache.asterix.common.context.IndexInfo;
+import org.apache.asterix.external.api.IRawRecord;
+import org.apache.asterix.external.input.record.CharArrayRecord;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+
+public class DatasetResourcesReader extends FunctionReader {
+
+    private final List<String> components;
+    private final Iterator<String> it;
+    private final CharArrayRecord record;
+
+    public DatasetResourcesReader(DatasetResource dsr) {
+        components = new ArrayList<>();
+        if (dsr != null && dsr.isOpen()) {
+            Map<Long, IndexInfo> indexes = dsr.getIndexes();
+            for (Entry<Long, IndexInfo> entry : indexes.entrySet()) {
+                IndexInfo value = entry.getValue();
+                ILSMIndex index = value.getIndex();
+                components.add(index.toString());
+            }
+            record = new CharArrayRecord();
+        } else {
+            record = null;
+        }
+        it = components.iterator();
+    }
+
+    @Override
+    public boolean hasNext() throws Exception {
+        return it.hasNext();
+    }
+
+    @Override
+    public IRawRecord<char[]> next() throws IOException, InterruptedException {
+        record.reset();
+        record.append(it.next().toCharArray());
+        record.endRecord();
+        return record;
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
new file mode 100644
index 0000000..a575ba4
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetResourcesRewriter.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.common.functions.FunctionConstants;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+
+public class DatasetResourcesRewriter extends FunctionRewriter {
+
+    // Parameters are dataverse name, and dataset name
+    public static final FunctionIdentifier DATASET_RESOURCES =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "dataset-resources", 2);
+    public static final DatasetResourcesRewriter INSTANCE = new DatasetResourcesRewriter(DATASET_RESOURCES);
+
+    private DatasetResourcesRewriter(FunctionIdentifier functionId) {
+        super(functionId);
+    }
+
+    @Override
+    public DatasetResourcesDatasource toDatasource(IOptimizationContext context, AbstractFunctionCallExpression f)
+            throws AlgebricksException {
+        String dataverseName = getString(f.getArguments(), 0);
+        String datasetName = getString(f.getArguments(), 1);
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        Dataset dataset = metadataProvider.findDataset(dataverseName, datasetName);
+        if (dataset == null) {
+            throw new AlgebricksException("Could not find dataset " + datasetName + " in dataverse " + dataverseName);
+        }
+        return new DatasetResourcesDatasource(context.getComputationNodeDomain(), dataset.getDatasetId());
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
new file mode 100644
index 0000000..c857ce0
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DatasetRewriter.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.common.config.DatasetConfig.DatasetType;
+import org.apache.asterix.metadata.declared.DataSource;
+import org.apache.asterix.metadata.declared.DataSourceId;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Dataverse;
+import org.apache.asterix.metadata.utils.DatasetUtil;
+import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.constants.AsterixConstantValue;
+import org.apache.asterix.om.functions.IFunctionToDataSourceRewriter;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.utils.ConstantExpressionUtil;
+import org.apache.asterix.optimizer.rules.UnnestToDataScanRule;
+import org.apache.asterix.optimizer.rules.util.EquivalenceClassUtils;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
+import org.apache.hyracks.algebricks.core.algebra.properties.FunctionalDependency;
+
+public class DatasetRewriter implements IFunctionToDataSourceRewriter, IResultTypeComputer {
+    public static final DatasetRewriter INSTANCE = new DatasetRewriter();
+
+    private DatasetRewriter() {
+    }
+
+    @Override
+    public boolean rewrite(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+        AbstractFunctionCallExpression f = UnnestToDataScanRule.getFunctionCall(opRef);
+        UnnestOperator unnest = (UnnestOperator) opRef.getValue();
+        if (unnest.getPositionalVariable() != null) {
+            // TODO remove this after enabling the support of positional variables in data scan
+            throw new AlgebricksException("No positional variables are allowed over datasets.");
+        }
+        ILogicalExpression expr = f.getArguments().get(0).getValue();
+        if (expr.getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+            return false;
+        }
+        ConstantExpression ce = (ConstantExpression) expr;
+        IAlgebricksConstantValue acv = ce.getValue();
+        if (!(acv instanceof AsterixConstantValue)) {
+            return false;
+        }
+        AsterixConstantValue acv2 = (AsterixConstantValue) acv;
+        if (acv2.getObject().getType().getTypeTag() != ATypeTag.STRING) {
+            return false;
+        }
+        String datasetArg = ((AString) acv2.getObject()).getStringValue();
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        Pair<String, String> datasetReference = parseDatasetReference(metadataProvider, datasetArg);
+        String dataverseName = datasetReference.first;
+        String datasetName = datasetReference.second;
+        Dataset dataset = metadataProvider.findDataset(dataverseName, datasetName);
+        if (dataset == null) {
+            throw new AlgebricksException("Could not find dataset " + datasetName + " in dataverse " + dataverseName);
+        }
+        DataSourceId asid = new DataSourceId(dataverseName, datasetName);
+        List<LogicalVariable> variables = new ArrayList<>();
+        if (dataset.getDatasetType() == DatasetType.INTERNAL) {
+            int numPrimaryKeys = dataset.getPrimaryKeys().size();
+            for (int i = 0; i < numPrimaryKeys; i++) {
+                variables.add(context.newVar());
+            }
+        }
+        variables.add(unnest.getVariable());
+        DataSource dataSource = metadataProvider.findDataSource(asid);
+        boolean hasMeta = dataSource.hasMeta();
+        if (hasMeta) {
+            variables.add(context.newVar());
+        }
+        DataSourceScanOperator scan = new DataSourceScanOperator(variables, dataSource);
+        List<Mutable<ILogicalOperator>> scanInpList = scan.getInputs();
+        scanInpList.addAll(unnest.getInputs());
+        opRef.setValue(scan);
+        addPrimaryKey(variables, dataSource, context);
+        context.computeAndSetTypeEnvironmentForOperator(scan);
+        // Adds equivalence classes --- one equivalent class between a primary key
+        // variable and a record field-access expression.
+        IAType[] schemaTypes = dataSource.getSchemaTypes();
+        ARecordType recordType =
+                (ARecordType) (hasMeta ? schemaTypes[schemaTypes.length - 2] : schemaTypes[schemaTypes.length - 1]);
+        ARecordType metaRecordType = (ARecordType) (hasMeta ? schemaTypes[schemaTypes.length - 1] : null);
+        EquivalenceClassUtils.addEquivalenceClassesForPrimaryIndexAccess(scan, variables, recordType, metaRecordType,
+                dataset, context);
+        return true;
+    }
+
+    private Pair<String, String> parseDatasetReference(MetadataProvider metadataProvider, String datasetArg)
+            throws AlgebricksException {
+        String[] datasetNameComponents = datasetArg.split("\\.");
+        String dataverseName;
+        String datasetName;
+        if (datasetNameComponents.length == 1) {
+            Dataverse defaultDataverse = metadataProvider.getDefaultDataverse();
+            if (defaultDataverse == null) {
+                throw new AlgebricksException("Unresolved dataset " + datasetArg + " Dataverse not specified.");
+            }
+            dataverseName = defaultDataverse.getDataverseName();
+            datasetName = datasetNameComponents[0];
+        } else {
+            dataverseName = datasetNameComponents[0];
+            datasetName = datasetNameComponents[1];
+        }
+        return new Pair<>(dataverseName, datasetName);
+    }
+
+    private void addPrimaryKey(List<LogicalVariable> scanVariables, DataSource dataSource,
+            IOptimizationContext context) {
+        List<LogicalVariable> primaryKey = dataSource.getPrimaryKeyVariables(scanVariables);
+        List<LogicalVariable> tail = new ArrayList<>();
+        tail.addAll(scanVariables);
+        FunctionalDependency pk = new FunctionalDependency(primaryKey, tail);
+        context.addPrimaryKey(pk);
+    }
+
+    @Override
+    public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env, IMetadataProvider<?, ?> mp)
+            throws AlgebricksException {
+        AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
+        if (f.getArguments().size() != 1) {
+            throw new AlgebricksException("dataset arity is 1, not " + f.getArguments().size());
+        }
+        ILogicalExpression a1 = f.getArguments().get(0).getValue();
+        IAType t1 = (IAType) env.getType(a1);
+        if (t1.getTypeTag() == ATypeTag.ANY) {
+            return BuiltinType.ANY;
+        }
+        if (t1.getTypeTag() != ATypeTag.STRING) {
+            throw new AlgebricksException("Illegal type " + t1 + " for dataset() argument.");
+        }
+        String datasetArg = ConstantExpressionUtil.getStringConstant(a1);
+        if (datasetArg == null) {
+            return BuiltinType.ANY;
+        }
+        MetadataProvider metadata = (MetadataProvider) mp;
+        Pair<String, String> datasetInfo = DatasetUtil.getDatasetInfo(metadata, datasetArg);
+        String dataverseName = datasetInfo.first;
+        String datasetName = datasetInfo.second;
+        if (dataverseName == null) {
+            throw new AlgebricksException("Unspecified dataverse!");
+        }
+        Dataset dataset = metadata.findDataset(dataverseName, datasetName);
+        if (dataset == null) {
+            throw new AlgebricksException("Could not find dataset " + datasetName + " in dataverse " + dataverseName);
+        }
+        String tn = dataset.getItemTypeName();
+        IAType t2 = metadata.findType(dataset.getItemTypeDataverseName(), tn);
+        if (t2 == null) {
+            throw new AlgebricksException("No type for dataset " + datasetName);
+        }
+        return t2;
+
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java
new file mode 100644
index 0000000..05dd53e
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FeedRewriter.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.external.feed.watch.FeedActivityDetails;
+import org.apache.asterix.external.util.ExternalDataUtils;
+import org.apache.asterix.external.util.FeedUtils;
+import org.apache.asterix.external.util.FeedUtils.FeedRuntimeType;
+import org.apache.asterix.metadata.declared.DataSourceId;
+import org.apache.asterix.metadata.declared.FeedDataSource;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Feed;
+import org.apache.asterix.metadata.entities.FeedConnection;
+import org.apache.asterix.metadata.entities.FeedPolicyEntity;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.feeds.BuiltinFeedPolicies;
+import org.apache.asterix.metadata.utils.DatasetUtil;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionToDataSourceRewriter;
+import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.utils.ConstantExpressionUtil;
+import org.apache.asterix.optimizer.rules.UnnestToDataScanRule;
+import org.apache.asterix.translator.util.PlanTranslationUtil;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
+
+public class FeedRewriter implements IFunctionToDataSourceRewriter, IResultTypeComputer {
+    public static final FeedRewriter INSTANCE = new FeedRewriter();
+
+    private FeedRewriter() {
+    }
+
+    @Override
+    public boolean rewrite(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+        AbstractFunctionCallExpression f = UnnestToDataScanRule.getFunctionCall(opRef);
+        UnnestOperator unnest = (UnnestOperator) opRef.getValue();
+        if (unnest.getPositionalVariable() != null) {
+            throw new AlgebricksException("No positional variables are allowed over feeds.");
+        }
+        String dataverse = ConstantExpressionUtil.getStringArgument(f, 0);
+        String sourceFeedName = ConstantExpressionUtil.getStringArgument(f, 1);
+        String getTargetFeed = ConstantExpressionUtil.getStringArgument(f, 2);
+        String subscriptionLocation = ConstantExpressionUtil.getStringArgument(f, 3);
+        String targetDataset = ConstantExpressionUtil.getStringArgument(f, 4);
+        String outputType = ConstantExpressionUtil.getStringArgument(f, 5);
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        DataSourceId asid = new DataSourceId(dataverse, getTargetFeed);
+        String policyName = metadataProvider.getConfig().get(FeedActivityDetails.FEED_POLICY_NAME);
+        FeedPolicyEntity policy = metadataProvider.findFeedPolicy(dataverse, policyName);
+        if (policy == null) {
+            policy = BuiltinFeedPolicies.getFeedPolicy(policyName);
+            if (policy == null) {
+                throw new AlgebricksException("Unknown feed policy:" + policyName);
+            }
+        }
+        ArrayList<LogicalVariable> feedDataScanOutputVariables = new ArrayList<>();
+        String csLocations = metadataProvider.getConfig().get(FeedActivityDetails.COLLECT_LOCATIONS);
+        List<LogicalVariable> pkVars = new ArrayList<>();
+        FeedDataSource ds = createFeedDataSource(asid, targetDataset, sourceFeedName, subscriptionLocation,
+                metadataProvider, policy, outputType, csLocations, unnest.getVariable(), context, pkVars);
+        // The order for feeds is <Record-Meta-PK>
+        feedDataScanOutputVariables.add(unnest.getVariable());
+        // Does it produce meta?
+        if (ds.hasMeta()) {
+            feedDataScanOutputVariables.add(context.newVar());
+        }
+        // Does it produce pk?
+        if (ds.isChange()) {
+            feedDataScanOutputVariables.addAll(pkVars);
+        }
+        DataSourceScanOperator scan = new DataSourceScanOperator(feedDataScanOutputVariables, ds);
+        List<Mutable<ILogicalOperator>> scanInpList = scan.getInputs();
+        scanInpList.addAll(unnest.getInputs());
+        opRef.setValue(scan);
+        context.computeAndSetTypeEnvironmentForOperator(scan);
+        return true;
+    }
+
+    private FeedDataSource createFeedDataSource(DataSourceId aqlId, String targetDataset, String sourceFeedName,
+            String subscriptionLocation, MetadataProvider metadataProvider, FeedPolicyEntity feedPolicy,
+            String outputType, String locations, LogicalVariable recordVar, IOptimizationContext context,
+            List<LogicalVariable> pkVars) throws AlgebricksException {
+        Dataset dataset = metadataProvider.findDataset(aqlId.getDataverseName(), targetDataset);
+        ARecordType feedOutputType = (ARecordType) metadataProvider.findType(aqlId.getDataverseName(), outputType);
+        Feed sourceFeed = metadataProvider.findFeed(aqlId.getDataverseName(), sourceFeedName);
+        FeedConnection feedConnection =
+                metadataProvider.findFeedConnection(aqlId.getDataverseName(), sourceFeedName, targetDataset);
+        ARecordType metaType = null;
+        // Does dataset have meta?
+        if (dataset.hasMetaPart()) {
+            String metaTypeName = FeedUtils.getFeedMetaTypeName(sourceFeed.getConfiguration());
+            if (metaTypeName == null) {
+                throw new AlgebricksException("Feed to a dataset with metadata doesn't have meta type specified");
+            }
+            String dataverseName = aqlId.getDataverseName();
+            if (metaTypeName.contains(".")) {
+                dataverseName = metaTypeName.substring(0, metaTypeName.indexOf('.'));
+                metaTypeName = metaTypeName.substring(metaTypeName.indexOf('.') + 1);
+            }
+            metaType = (ARecordType) metadataProvider.findType(dataverseName, metaTypeName);
+        }
+        // Is a change feed?
+        List<IAType> pkTypes = null;
+        List<List<String>> partitioningKeys = null;
+        List<Integer> keySourceIndicator = null;
+
+        List<ScalarFunctionCallExpression> keyAccessScalarFunctionCallExpression;
+        if (ExternalDataUtils.isChangeFeed(sourceFeed.getConfiguration())) {
+            List<Mutable<ILogicalExpression>> keyAccessExpression = new ArrayList<>();
+            keyAccessScalarFunctionCallExpression = new ArrayList<>();
+            pkTypes = ((InternalDatasetDetails) dataset.getDatasetDetails()).getPrimaryKeyType();
+            partitioningKeys = ((InternalDatasetDetails) dataset.getDatasetDetails()).getPartitioningKey();
+            if (dataset.hasMetaPart()) {
+                keySourceIndicator = ((InternalDatasetDetails) dataset.getDatasetDetails()).getKeySourceIndicator();
+            }
+            for (int i = 0; i < partitioningKeys.size(); i++) {
+                List<String> key = partitioningKeys.get(i);
+                if (keySourceIndicator == null || keySourceIndicator.get(i).intValue() == 0) {
+                    PlanTranslationUtil.prepareVarAndExpression(key, recordVar, pkVars, keyAccessExpression, null,
+                            context);
+                } else {
+                    PlanTranslationUtil.prepareMetaKeyAccessExpression(key, recordVar, keyAccessExpression, pkVars,
+                            null, context);
+                }
+            }
+            keyAccessExpression.forEach(
+                    expr -> keyAccessScalarFunctionCallExpression.add((ScalarFunctionCallExpression) expr.getValue()));
+        } else {
+            keyAccessScalarFunctionCallExpression = null;
+        }
+        FeedDataSource feedDataSource = new FeedDataSource((MetadataProvider) context.getMetadataProvider(), sourceFeed,
+                aqlId, targetDataset, feedOutputType, metaType, pkTypes, keyAccessScalarFunctionCallExpression,
+                sourceFeed.getFeedId(), FeedRuntimeType.valueOf(subscriptionLocation), locations.split(","),
+                context.getComputationNodeDomain(), feedConnection);
+        feedDataSource.getProperties().put(BuiltinFeedPolicies.CONFIG_FEED_POLICY_KEY, feedPolicy);
+        return feedDataSource;
+    }
+
+    @Override
+    public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env, IMetadataProvider<?, ?> mp)
+            throws AlgebricksException {
+        AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
+        if (f.getArguments().size() != BuiltinFunctions.FEED_COLLECT.getArity()) {
+            throw new AlgebricksException("Incorrect number of arguments -> arity is "
+                    + BuiltinFunctions.FEED_COLLECT.getArity() + ", not " + f.getArguments().size());
+        }
+        ILogicalExpression a1 = f.getArguments().get(5).getValue();
+        IAType t1 = (IAType) env.getType(a1);
+        if (t1.getTypeTag() == ATypeTag.ANY) {
+            return BuiltinType.ANY;
+        }
+        if (t1.getTypeTag() != ATypeTag.STRING) {
+            throw new AlgebricksException("Illegal type " + t1 + " for feed-ingest argument.");
+        }
+        String typeArg = ConstantExpressionUtil.getStringConstant(a1);
+        if (typeArg == null) {
+            return BuiltinType.ANY;
+        }
+        MetadataProvider metadata = (MetadataProvider) mp;
+        Pair<String, String> argInfo = DatasetUtil.getDatasetInfo(metadata, typeArg);
+        String dataverseName = argInfo.first;
+        String typeName = argInfo.second;
+        if (dataverseName == null) {
+            throw new AlgebricksException("Unspecified dataverse!");
+        }
+        IAType t2 = metadata.findType(dataverseName, typeName);
+        if (t2 == null) {
+            throw new AlgebricksException("Unknown type  " + typeName);
+        }
+        return t2;
+
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionReader.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionReader.java
new file mode 100644
index 0000000..c73f8e8
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionReader.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.io.IOException;
+
+import org.apache.asterix.external.api.IRecordReader;
+import org.apache.asterix.external.dataflow.AbstractFeedDataFlowController;
+import org.apache.asterix.external.util.FeedLogManager;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public abstract class FunctionReader implements IRecordReader<char[]> {
+
+    @Override
+    public void close() throws IOException {
+        // No Op for function reader
+    }
+
+    @Override
+    public boolean stop() {
+        return true;
+    }
+
+    @Override
+    public void setController(AbstractFeedDataFlowController controller) {
+        // No Op for function reader
+    }
+
+    @Override
+    public void setFeedLogManager(FeedLogManager feedLogManager) throws HyracksDataException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean handleException(Throwable th) {
+        return false;
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionRewriter.java
new file mode 100644
index 0000000..2ff9282
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/FunctionRewriter.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.metadata.declared.FunctionDataSource;
+import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.constants.AsterixConstantValue;
+import org.apache.asterix.om.functions.IFunctionToDataSourceRewriter;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.optimizer.rules.UnnestToDataScanRule;
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalExpressionTag;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
+
+public abstract class FunctionRewriter implements IFunctionToDataSourceRewriter {
+
+    private FunctionIdentifier functionId;
+
+    public FunctionRewriter(FunctionIdentifier functionId) {
+        this.functionId = functionId;
+    }
+
+    @Override
+    public final boolean rewrite(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
+        AbstractFunctionCallExpression f = UnnestToDataScanRule.getFunctionCall(opRef);
+        List<Mutable<ILogicalExpression>> args = f.getArguments();
+        if (args.size() != functionId.getArity()) {
+            throw new AlgebricksException("Function " + functionId.getNamespace() + "." + functionId.getName()
+                    + " expects " + functionId.getArity() + " arguments");
+        }
+        for (int i = 0; i < args.size(); i++) {
+            if (args.get(i).getValue().getExpressionTag() != LogicalExpressionTag.CONSTANT) {
+                throw new AlgebricksException("Function " + functionId.getNamespace() + "." + functionId.getName()
+                        + " expects constant arguments while arg[" + i + "] is of type "
+                        + args.get(i).getValue().getExpressionTag());
+            }
+        }
+        UnnestOperator unnest = (UnnestOperator) opRef.getValue();
+        if (unnest.getPositionalVariable() != null) {
+            throw new AlgebricksException("No positional variables are allowed over datasource functions");
+        }
+        FunctionDataSource datasource = toDatasource(context, f);
+        List<LogicalVariable> variables = new ArrayList<>();
+        variables.add(unnest.getVariable());
+        DataSourceScanOperator scan = new DataSourceScanOperator(variables, datasource);
+        List<Mutable<ILogicalOperator>> scanInpList = scan.getInputs();
+        scanInpList.addAll(unnest.getInputs());
+        opRef.setValue(scan);
+        context.computeAndSetTypeEnvironmentForOperator(scan);
+        return true;
+    }
+
+    protected abstract FunctionDataSource toDatasource(IOptimizationContext context, AbstractFunctionCallExpression f)
+            throws AlgebricksException;
+
+    protected String getString(List<Mutable<ILogicalExpression>> args, int i) throws AlgebricksException {
+        ConstantExpression ce = (ConstantExpression) args.get(i).getValue();
+        IAlgebricksConstantValue acv = ce.getValue();
+        if (!(acv instanceof AsterixConstantValue)) {
+            throw new AlgebricksException("Expected arg[" + i + "] to be of type String");
+        }
+        AsterixConstantValue acv2 = (AsterixConstantValue) acv;
+        if (acv2.getObject().getType().getTypeTag() != ATypeTag.STRING) {
+            throw new AlgebricksException("Expected arg[" + i + "] to be of type String");
+        }
+        return ((AString) acv2.getObject()).getStringValue();
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsDatasource.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsDatasource.java
new file mode 100644
index 0000000..7245b88
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsDatasource.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.metadata.api.IDatasourceFunction;
+import org.apache.asterix.metadata.declared.DataSourceId;
+import org.apache.asterix.metadata.declared.FunctionDataSource;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.properties.INodeDomain;
+
+public class StorageComponentsDatasource extends FunctionDataSource {
+    private final int datasetId;
+
+    public StorageComponentsDatasource(INodeDomain domain, int datasetId) throws AlgebricksException {
+        super(new DataSourceId(StorageComponentsRewriter.STORAGE_COMPONENTS.getNamespace(),
+                StorageComponentsRewriter.STORAGE_COMPONENTS.getName()), domain);
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    protected IDatasourceFunction createFunction(MetadataProvider metadataProvider,
+            AlgebricksAbsolutePartitionConstraint locations) {
+        return new StorageComponentsFunction(locations, datasetId);
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsFunction.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsFunction.java
new file mode 100644
index 0000000..1a461a5
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsFunction.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.context.DatasetLifecycleManager;
+import org.apache.asterix.common.context.DatasetResource;
+import org.apache.asterix.external.api.IRecordReader;
+import org.apache.asterix.metadata.declared.AbstractDatasourceFunction;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class StorageComponentsFunction extends AbstractDatasourceFunction {
+
+    private static final long serialVersionUID = 1L;
+    private final int datasetId;
+
+    public StorageComponentsFunction(AlgebricksAbsolutePartitionConstraint locations, int datasetId) {
+        super(locations);
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    public IRecordReader<char[]> createRecordReader(IHyracksTaskContext ctx, int partition)
+            throws HyracksDataException {
+        INCServiceContext serviceCtx = ctx.getJobletContext().getServiceContext();
+        INcApplicationContext appCtx = (INcApplicationContext) serviceCtx.getApplicationContext();
+        DatasetLifecycleManager dsLifecycleMgr = (DatasetLifecycleManager) appCtx.getDatasetLifecycleManager();
+        DatasetResource dsr = dsLifecycleMgr.getDatasetLifecycle(datasetId);
+        return new StorageComponentsReader(ctx.getJobletContext().getServiceContext().getNodeId(), dsr);
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsReader.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsReader.java
new file mode 100644
index 0000000..81f680d
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsReader.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.asterix.common.context.DatasetResource;
+import org.apache.asterix.common.context.IndexInfo;
+import org.apache.asterix.external.api.IRawRecord;
+import org.apache.asterix.external.input.record.CharArrayRecord;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentId;
+
+public class StorageComponentsReader extends FunctionReader {
+
+    private final List<String> components;
+    private final Iterator<String> it;
+    private final CharArrayRecord record;
+
+    public StorageComponentsReader(String nodeId, DatasetResource dsr) throws HyracksDataException {
+        components = new ArrayList<>();
+        if (dsr != null && dsr.isOpen()) {
+            Map<Long, IndexInfo> indexes = dsr.getIndexes();
+            StringBuilder strBuilder = new StringBuilder();
+            for (Entry<Long, IndexInfo> entry : indexes.entrySet()) {
+                strBuilder.setLength(0);
+                IndexInfo value = entry.getValue();
+                ILSMIndex index = value.getIndex();
+                String path = value.getLocalResource().getPath();
+                strBuilder.append('{');
+                strBuilder.append("\"node\":\"");
+                strBuilder.append(nodeId);
+                strBuilder.append("\", \"path\":\"");
+                strBuilder.append(path);
+                strBuilder.append("\", \"components\":[");
+                // syncronize over the opTracker
+                synchronized (index.getOperationTracker()) {
+                    List<ILSMDiskComponent> diskComponents = index.getDiskComponents();
+                    for (int i = diskComponents.size() - 1; i >= 0; i--) {
+                        if (i < diskComponents.size() - 1) {
+                            strBuilder.append(',');
+                        }
+                        ILSMDiskComponent c = diskComponents.get(i);
+                        LSMComponentId id = (LSMComponentId) c.getId();
+                        strBuilder.append('{');
+                        strBuilder.append("\"min\":");
+                        strBuilder.append(id.getMinId());
+                        strBuilder.append(",\"max\":");
+                        strBuilder.append(id.getMaxId());
+                        strBuilder.append('}');
+                    }
+                }
+                strBuilder.append("]}");
+                components.add(strBuilder.toString());
+            }
+            record = new CharArrayRecord();
+        } else {
+            record = null;
+        }
+        it = components.iterator();
+    }
+
+    @Override
+    public boolean hasNext() throws Exception {
+        return it.hasNext();
+    }
+
+    @Override
+    public IRawRecord<char[]> next() throws IOException, InterruptedException {
+        record.reset();
+        record.append(it.next().toCharArray());
+        record.endRecord();
+        return record;
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
new file mode 100644
index 0000000..89bd115
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/StorageComponentsRewriter.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.function;
+
+import org.apache.asterix.common.functions.FunctionConstants;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+
+public class StorageComponentsRewriter extends FunctionRewriter {
+
+    // Parameters are dataverse name, and dataset name
+    public static final FunctionIdentifier STORAGE_COMPONENTS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "storage-components", 2);
+    public static final StorageComponentsRewriter INSTANCE = new StorageComponentsRewriter(STORAGE_COMPONENTS);
+
+    private StorageComponentsRewriter(FunctionIdentifier functionId) {
+        super(functionId);
+    }
+
+    @Override
+    public StorageComponentsDatasource toDatasource(IOptimizationContext context, AbstractFunctionCallExpression f)
+            throws AlgebricksException {
+        String dataverseName = getString(f.getArguments(), 0);
+        String datasetName = getString(f.getArguments(), 1);
+        MetadataProvider metadataProvider = (MetadataProvider) context.getMetadataProvider();
+        Dataset dataset = metadataProvider.findDataset(dataverseName, datasetName);
+        if (dataset == null) {
+            throw new AlgebricksException("Could not find dataset " + datasetName + " in dataverse " + dataverseName);
+        }
+        return new StorageComponentsDatasource(context.getComputationNodeDomain(), dataset.getDatasetId());
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
index fb6ec37..7e76fc1 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/CancelQueryRequest.java
@@ -27,12 +27,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CancelQueryRequest implements ICcAddressedMessage {
 
-    private static final Logger LOGGER = Logger.getLogger(CancelQueryRequest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final long serialVersionUID = 1L;
     private final String nodeId;
     private final long reqId;
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
index ed683dc..31b213e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/message/ExecuteStatementRequestMessage.java
@@ -24,8 +24,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.algebra.base.ILangExtension;
 import org.apache.asterix.api.http.server.ResultUtil;
@@ -48,6 +46,7 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.IStatementExecutorContext;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.asterix.translator.SessionConfig;
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -55,10 +54,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public final class ExecuteStatementRequestMessage implements ICcAddressedMessage {
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(ExecuteStatementRequestMessage.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     //TODO: Make configurable: https://issues.apache.org/jira/browse/ASTERIXDB-2062
     public static final long DEFAULT_NC_TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(5);
     //TODO: Make configurable: https://issues.apache.org/jira/browse/ASTERIXDB-2063
@@ -68,20 +70,20 @@
     private final ILangExtension.Language lang;
     private final String statementsText;
     private final SessionConfig sessionConfig;
-    private final IStatementExecutor.ResultDelivery delivery;
+    private final ResultProperties resultProperties;
     private final String clientContextID;
     private final String handleUrl;
     private final Map<String, String> optionalParameters;
 
     public ExecuteStatementRequestMessage(String requestNodeId, long requestMessageId, ILangExtension.Language lang,
-            String statementsText, SessionConfig sessionConfig, IStatementExecutor.ResultDelivery delivery,
+            String statementsText, SessionConfig sessionConfig, ResultProperties resultProperties,
             String clientContextID, String handleUrl, Map<String, String> optionalParameters) {
         this.requestNodeId = requestNodeId;
         this.requestMessageId = requestMessageId;
         this.lang = lang;
         this.statementsText = statementsText;
         this.sessionConfig = sessionConfig;
-        this.delivery = delivery;
+        this.resultProperties = resultProperties;
         this.clientContextID = clientContextID;
         this.handleUrl = handleUrl;
         this.optionalParameters = optionalParameters;
@@ -120,8 +122,8 @@
             IStatementExecutor translator = statementExecutorFactory.create(ccAppCtx, statements, sessionOutput,
                     compilationProvider, storageComponentProvider);
             final IStatementExecutor.Stats stats = new IStatementExecutor.Stats();
-            final IRequestParameters requestParameters =
-                    new RequestParameters(null, delivery, stats, outMetadata, clientContextID, optionalParameters);
+            final IRequestParameters requestParameters = new RequestParameters(null, resultProperties, stats,
+                    outMetadata, clientContextID, optionalParameters);
             translator.compileAndExecute(ccApp.getHcc(), statementExecutorContext, requestParameters);
             outPrinter.close();
             responseMsg.setResult(outWriter.toString());
@@ -130,16 +132,16 @@
         } catch (AlgebricksException | HyracksException | TokenMgrError
                 | org.apache.asterix.aqlplus.parser.TokenMgrError pe) {
             // we trust that "our" exceptions are serializable and have a comprehensible error message
-            GlobalConfig.ASTERIX_LOGGER.log(Level.WARNING, pe.getMessage(), pe);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, pe.getMessage(), pe);
             responseMsg.setError(pe);
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, "Unexpected exception", e);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, "Unexpected exception", e);
             responseMsg.setError(new Exception(e.toString()));
         }
         try {
             messageBroker.sendApplicationMessageToNC(responseMsg, requestNodeId);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, e.toString(), e);
+            LOGGER.log(Level.WARN, e.toString(), e);
         }
     }
 
@@ -162,7 +164,7 @@
         try {
             messageBroker.sendApplicationMessageToNC(responseMsg, requestNodeId);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, e.toString(), e);
+            LOGGER.log(Level.WARN, e.toString(), e);
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManager.java
new file mode 100644
index 0000000..d3ef028
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManager.java
@@ -0,0 +1,199 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.nc;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IndexCheckpoint;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+@ThreadSafe
+public class IndexCheckpointManager implements IIndexCheckpointManager {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final int HISTORY_CHECKPOINTS = 1;
+    private static final int MAX_CHECKPOINT_WRITE_ATTEMPTS = 5;
+    private static final FilenameFilter CHECKPOINT_FILE_FILTER =
+            (file, name) -> name.startsWith(StorageConstants.INDEX_CHECKPOINT_FILE_PREFIX);
+    private static final long BULKLOAD_LSN = 0;
+    private final Path indexPath;
+
+    public IndexCheckpointManager(Path indexPath) {
+        this.indexPath = indexPath;
+    }
+
+    @Override
+    public synchronized void init(long lsn) throws HyracksDataException {
+        final List<IndexCheckpoint> checkpoints = getCheckpoints();
+        if (!checkpoints.isEmpty()) {
+            LOGGER.warn(() -> "Checkpoints found on initializing: " + indexPath);
+            delete();
+        }
+        IndexCheckpoint firstCheckpoint = IndexCheckpoint.first(lsn);
+        persist(firstCheckpoint);
+    }
+
+    @Override
+    public synchronized void replicated(String componentTimestamp, long masterLsn) throws HyracksDataException {
+        final Long localLsn = getLatest().getMasterNodeFlushMap().get(masterLsn);
+        if (localLsn == null) {
+            throw new IllegalStateException("Component flushed before lsn mapping was received");
+        }
+        flushed(componentTimestamp, localLsn);
+    }
+
+    @Override
+    public synchronized void flushed(String componentTimestamp, long lsn) throws HyracksDataException {
+        final IndexCheckpoint latest = getLatest();
+        IndexCheckpoint nextCheckpoint = IndexCheckpoint.next(latest, lsn, componentTimestamp);
+        persist(nextCheckpoint);
+        deleteHistory(nextCheckpoint.getId(), HISTORY_CHECKPOINTS);
+    }
+
+    @Override
+    public synchronized void masterFlush(long masterLsn, long localLsn) throws HyracksDataException {
+        final IndexCheckpoint latest = getLatest();
+        latest.getMasterNodeFlushMap().put(masterLsn, localLsn);
+        final IndexCheckpoint next =
+                IndexCheckpoint.next(latest, latest.getLowWatermark(), latest.getValidComponentTimestamp());
+        persist(next);
+        notifyAll();
+    }
+
+    @Override
+    public synchronized long getLowWatermark() {
+        return getLatest().getLowWatermark();
+    }
+
+    @Override
+    public synchronized boolean isFlushed(long masterLsn) {
+        if (masterLsn == BULKLOAD_LSN) {
+            return true;
+        }
+        return getLatest().getMasterNodeFlushMap().containsKey(masterLsn);
+    }
+
+    @Override
+    public synchronized void delete() {
+        deleteHistory(Long.MAX_VALUE, 0);
+    }
+
+    @Override
+    public Optional<String> getValidComponentTimestamp() {
+        final String validComponentTimestamp = getLatest().getValidComponentTimestamp();
+        return validComponentTimestamp != null ? Optional.of(validComponentTimestamp) : Optional.empty();
+    }
+
+    @Override
+    public int getCheckpointCount() {
+        return getCheckpoints().size();
+    }
+
+    private IndexCheckpoint getLatest() {
+        final List<IndexCheckpoint> checkpoints = getCheckpoints();
+        if (checkpoints.isEmpty()) {
+            throw new IllegalStateException("Couldn't find any checkpoints for resource: " + indexPath);
+        }
+        checkpoints.sort(Comparator.comparingLong(IndexCheckpoint::getId).reversed());
+        return checkpoints.get(0);
+    }
+
+    private List<IndexCheckpoint> getCheckpoints() {
+        List<IndexCheckpoint> checkpoints = new ArrayList<>();
+        final File[] checkpointFiles = indexPath.toFile().listFiles(CHECKPOINT_FILE_FILTER);
+        if (checkpointFiles != null) {
+            for (File checkpointFile : checkpointFiles) {
+                try {
+                    checkpoints.add(read(checkpointFile.toPath()));
+                } catch (IOException e) {
+                    LOGGER.warn(() -> "Couldn't read index checkpoint file: " + checkpointFile, e);
+                }
+            }
+        }
+        return checkpoints;
+    }
+
+    private void persist(IndexCheckpoint checkpoint) throws HyracksDataException {
+        final Path checkpointPath = getCheckpointPath(checkpoint);
+        for (int i = 1; i <= MAX_CHECKPOINT_WRITE_ATTEMPTS; i++) {
+            try {
+                // clean up from previous write failure
+                if (checkpointPath.toFile().exists()) {
+                    Files.delete(checkpointPath);
+                }
+                try (BufferedWriter writer = Files.newBufferedWriter(checkpointPath)) {
+                    writer.write(checkpoint.asJson());
+                }
+                // ensure it was written correctly by reading it
+                read(checkpointPath);
+            } catch (IOException e) {
+                if (i == MAX_CHECKPOINT_WRITE_ATTEMPTS) {
+                    throw HyracksDataException.create(e);
+                }
+                LOGGER.warn(() -> "Filed to write checkpoint at: " + indexPath, e);
+                int nextAttempt = i + 1;
+                LOGGER.info(() -> "Checkpoint write attempt " + nextAttempt + "/" + MAX_CHECKPOINT_WRITE_ATTEMPTS);
+            }
+        }
+    }
+
+    private IndexCheckpoint read(Path checkpointPath) throws IOException {
+        return IndexCheckpoint.fromJson(new String(Files.readAllBytes(checkpointPath)));
+    }
+
+    private void deleteHistory(long latestId, int historyToKeep) {
+        try {
+            final File[] checkpointFiles = indexPath.toFile().listFiles(CHECKPOINT_FILE_FILTER);
+            if (checkpointFiles != null) {
+                for (File checkpointFile : checkpointFiles) {
+                    if (getCheckpointIdFromFileName(checkpointFile.toPath()) < (latestId - historyToKeep)) {
+                        Files.delete(checkpointFile.toPath());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.warn(() -> "Couldn't delete history checkpoints at " + indexPath, e);
+        }
+    }
+
+    private Path getCheckpointPath(IndexCheckpoint checkpoint) {
+        return Paths.get(indexPath.toString(),
+                StorageConstants.INDEX_CHECKPOINT_FILE_PREFIX + String.valueOf(checkpoint.getId()));
+    }
+
+    private long getCheckpointIdFromFileName(Path checkpointPath) {
+        return Long.valueOf(checkpointPath.getFileName().toString()
+                .substring(StorageConstants.INDEX_CHECKPOINT_FILE_PREFIX.length()));
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManagerProvider.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManagerProvider.java
new file mode 100644
index 0000000..19ad8f6
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/IndexCheckpointManagerProvider.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.nc;
+
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.ResourceReference;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.IIOManager;
+
+public class IndexCheckpointManagerProvider implements IIndexCheckpointManagerProvider {
+
+    private final Map<ResourceReference, IndexCheckpointManager> indexCheckpointManagerMap = new HashMap<>();
+    private final IIOManager ioManager;
+
+    public IndexCheckpointManagerProvider(IIOManager ioManager) {
+        this.ioManager = ioManager;
+    }
+
+    @Override
+    public IIndexCheckpointManager get(ResourceReference ref) throws HyracksDataException {
+        synchronized (indexCheckpointManagerMap) {
+            return indexCheckpointManagerMap.computeIfAbsent(ref, this::create);
+        }
+    }
+
+    @Override
+    public void close(ResourceReference ref) {
+        synchronized (indexCheckpointManagerMap) {
+            indexCheckpointManagerMap.remove(ref);
+        }
+    }
+
+    private IndexCheckpointManager create(ResourceReference ref) {
+        try {
+            final Path indexPath = getIndexPath(ref);
+            return new IndexCheckpointManager(indexPath);
+        } catch (HyracksDataException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private Path getIndexPath(ResourceReference indexRef) throws HyracksDataException {
+        return ioManager.resolve(indexRef.getRelativePath().toString()).getFile().toPath();
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
index 7b08f68..6e25856 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/NCAppRuntimeContext.java
@@ -22,15 +22,17 @@
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.active.ActiveManager;
-import org.apache.asterix.api.common.AppRuntimeContextProviderForRecovery;
+import org.apache.asterix.common.api.ICoordinationService;
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.IDatasetMemoryManager;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -39,7 +41,6 @@
 import org.apache.asterix.common.config.AsterixExtension;
 import org.apache.asterix.common.config.BuildProperties;
 import org.apache.asterix.common.config.CompilerProperties;
-import org.apache.asterix.common.config.ExtensionProperties;
 import org.apache.asterix.common.config.ExternalProperties;
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.config.MetadataProperties;
@@ -54,11 +55,10 @@
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.library.ILibraryManager;
-import org.apache.asterix.common.replication.IRemoteRecoveryManager;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
 import org.apache.asterix.common.replication.IReplicationChannel;
 import org.apache.asterix.common.replication.IReplicationManager;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.IReplicaManager;
 import org.apache.asterix.common.transactions.IRecoveryManager;
 import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
@@ -71,15 +71,15 @@
 import org.apache.asterix.metadata.bootstrap.MetadataBootstrap;
 import org.apache.asterix.replication.management.ReplicationChannel;
 import org.apache.asterix.replication.management.ReplicationManager;
-import org.apache.asterix.replication.recovery.RemoteRecoveryManager;
-import org.apache.asterix.replication.storage.ReplicaResourcesManager;
 import org.apache.asterix.runtime.transaction.GlobalResourceIdFactoryProvider;
+import org.apache.asterix.runtime.utils.NoOpCoordinationService;
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepositoryFactory;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.client.ClusterControllerInfo;
 import org.apache.hyracks.api.client.HyracksConnection;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.IIOManager;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
@@ -102,22 +102,25 @@
 import org.apache.hyracks.storage.common.file.FileMapManager;
 import org.apache.hyracks.storage.common.file.ILocalResourceRepositoryFactory;
 import org.apache.hyracks.storage.common.file.IResourceIdFactory;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NCAppRuntimeContext implements INcApplicationContext {
-    private static final Logger LOGGER = Logger.getLogger(NCAppRuntimeContext.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private ILSMMergePolicyFactory metadataMergePolicyFactory;
     private final INCServiceContext ncServiceContext;
     private final IResourceIdFactory resourceIdFactory;
-    private CompilerProperties compilerProperties;
-    private ExternalProperties externalProperties;
-    private MetadataProperties metadataProperties;
-    private StorageProperties storageProperties;
-    private TransactionProperties txnProperties;
-    private ActiveProperties activeProperties;
-    private BuildProperties buildProperties;
-    private ReplicationProperties replicationProperties;
-    private MessagingProperties messagingProperties;
+    private final CompilerProperties compilerProperties;
+    private final ExternalProperties externalProperties;
+    private final MetadataProperties metadataProperties;
+    private final StorageProperties storageProperties;
+    private final TransactionProperties txnProperties;
+    private final ActiveProperties activeProperties;
+    private final BuildProperties buildProperties;
+    private final ReplicationProperties replicationProperties;
+    private final MessagingProperties messagingProperties;
     private final NodeProperties nodeProperties;
     private ExecutorService threadExecutor;
     private IDatasetMemoryManager datasetMemoryManager;
@@ -132,12 +135,12 @@
     private ActiveManager activeManager;
     private IReplicationChannel replicationChannel;
     private IReplicationManager replicationManager;
-    private IRemoteRecoveryManager remoteRecoveryManager;
-    private IReplicaResourcesManager replicaResourcesManager;
     private final ILibraryManager libraryManager;
     private final NCExtensionManager ncExtensionManager;
     private final IStorageComponentProvider componentProvider;
     private IHyracksClientConnection hcc;
+    private IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
+    private IReplicaManager replicaManager;
 
     public NCAppRuntimeContext(INCServiceContext ncServiceContext, List<AsterixExtension> extensions)
             throws AsterixException, InstantiationException, IllegalAccessException, ClassNotFoundException,
@@ -159,7 +162,7 @@
         if (extensions != null) {
             allExtensions.addAll(extensions);
         }
-        allExtensions.addAll(new ExtensionProperties(propertiesAccessor).getExtensions());
+        allExtensions.addAll(propertiesAccessor.getExtensions());
         ncExtensionManager = new NCExtensionManager(allExtensions);
         componentProvider = new StorageComponentProvider();
         resourceIdFactory = new GlobalResourceIdFactoryProvider(ncServiceContext).createResourceIdFactory();
@@ -178,46 +181,41 @@
         lsmIOScheduler = AsynchronousScheduler.INSTANCE;
 
         metadataMergePolicyFactory = new PrefixMergePolicyFactory();
+        indexCheckpointManagerProvider = new IndexCheckpointManagerProvider(ioManager);
 
         ILocalResourceRepositoryFactory persistentLocalResourceRepositoryFactory =
-                new PersistentLocalResourceRepositoryFactory(ioManager, getServiceContext().getNodeId(),
-                        metadataProperties);
+                new PersistentLocalResourceRepositoryFactory(ioManager, indexCheckpointManagerProvider);
 
         localResourceRepository =
                 (PersistentLocalResourceRepository) persistentLocalResourceRepositoryFactory.createRepository();
 
-        IAppRuntimeContextProvider asterixAppRuntimeContextProvider = new AppRuntimeContextProviderForRecovery(this);
-        txnSubsystem = new TransactionSubsystem(getServiceContext(), getServiceContext().getNodeId(),
-                asterixAppRuntimeContextProvider, txnProperties);
+        txnSubsystem = new TransactionSubsystem(this);
         IRecoveryManager recoveryMgr = txnSubsystem.getRecoveryManager();
         SystemState systemState = recoveryMgr.getSystemState();
         if (initialRun || systemState == SystemState.PERMANENT_DATA_LOSS) {
             //delete any storage data before the resource factory is initialized
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.log(Level.WARNING,
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.log(Level.WARN,
                         "Deleting the storage dir. initialRun = " + initialRun + ", systemState = " + systemState);
             }
-            localResourceRepository.deleteStorageData(true);
+            localResourceRepository.deleteStorageData();
         }
-
         datasetMemoryManager = new DatasetMemoryManager(storageProperties);
         datasetLifecycleManager =
                 new DatasetLifecycleManager(storageProperties, localResourceRepository, txnSubsystem.getLogManager(),
-                        datasetMemoryManager, ioManager.getIODevices().size());
-
+                        datasetMemoryManager, indexCheckpointManagerProvider, ioManager.getIODevices().size());
+        final String nodeId = getServiceContext().getNodeId();
+        final ClusterPartition[] nodePartitions = metadataProperties.getNodePartitions().get(nodeId);
+        final Set<Integer> nodePartitionsIds =
+                Arrays.stream(nodePartitions).map(ClusterPartition::getPartitionId).collect(Collectors.toSet());
+        replicaManager = new ReplicaManager(this, nodePartitionsIds);
         isShuttingdown = false;
-
         activeManager = new ActiveManager(threadExecutor, getServiceContext().getNodeId(),
                 activeProperties.getMemoryComponentGlobalBudget(), compilerProperties.getFrameSize(),
                 this.ncServiceContext);
 
-        if (replicationProperties.isParticipant(getServiceContext().getNodeId())) {
-            String nodeId = getServiceContext().getNodeId();
-
-            replicaResourcesManager = new ReplicaResourcesManager(localResourceRepository, metadataProperties);
-
-            replicationManager = new ReplicationManager(nodeId, replicationProperties, replicaResourcesManager,
-                    txnSubsystem.getLogManager(), asterixAppRuntimeContextProvider);
+        if (replicationProperties.isReplicationEnabled()) {
+            replicationManager = new ReplicationManager(this, replicationProperties);
 
             //pass replication manager to replication required object
             //LogManager to replicate logs
@@ -226,24 +224,8 @@
             //PersistentLocalResourceRepository to replicate metadata files and delete backups on drop index
             localResourceRepository.setReplicationManager(replicationManager);
 
-            /*
-             * add the partitions that will be replicated in this node as inactive partitions
-             */
-            //get nodes which replicate to this node
-            Set<String> remotePrimaryReplicas = replicationProperties.getRemotePrimaryReplicasIds(nodeId);
-            for (String clientId : remotePrimaryReplicas) {
-                //get the partitions of each client
-                ClusterPartition[] clientPartitions = metadataProperties.getNodePartitions().get(clientId);
-                for (ClusterPartition partition : clientPartitions) {
-                    localResourceRepository.addInactivePartition(partition.getPartitionId());
-                }
-            }
-
             //initialize replication channel
-            replicationChannel = new ReplicationChannel(nodeId, replicationProperties, txnSubsystem.getLogManager(),
-                    replicaResourcesManager, replicationManager, getServiceContext(), asterixAppRuntimeContextProvider);
-
-            remoteRecoveryManager = new RemoteRecoveryManager(replicationManager, this, replicationProperties);
+            replicationChannel = new ReplicationChannel(this);
 
             bufferCache = new BufferCache(ioManager, prs, pcp, new FileMapManager(),
                     storageProperties.getBufferCacheMaxOpenFiles(), getServiceContext().getThreadFactory(),
@@ -394,8 +376,8 @@
     }
 
     @Override
-    public ILSMOperationTracker getLSMBTreeOperationTracker(int datasetID) {
-        return datasetLifecycleManager.getOperationTracker(datasetID);
+    public ILSMOperationTracker getPrimaryOperationTracker(int datasetID, int partition) {
+        return datasetLifecycleManager.getOperationTracker(datasetID, partition);
     }
 
     @Override
@@ -424,16 +406,6 @@
     }
 
     @Override
-    public IReplicaResourcesManager getReplicaResourcesManager() {
-        return replicaResourcesManager;
-    }
-
-    @Override
-    public IRemoteRecoveryManager getRemoteRecoveryManager() {
-        return remoteRecoveryManager;
-    }
-
-    @Override
     public IReplicationManager getReplicationManager() {
         return replicationManager;
     }
@@ -444,30 +416,26 @@
     }
 
     @Override
-    public void initializeMetadata(boolean newUniverse) throws Exception {
-        IAsterixStateProxy proxy;
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Bootstrapping metadata");
-        }
+    public void initializeMetadata(boolean newUniverse, int partitionId) throws Exception {
+        LOGGER.info("Bootstrapping metadata");
         MetadataNode.INSTANCE.initialize(this, ncExtensionManager.getMetadataTupleTranslatorProvider(),
-                ncExtensionManager.getMetadataExtensions());
+                ncExtensionManager.getMetadataExtensions(), partitionId);
 
-        proxy = (IAsterixStateProxy) getServiceContext().getDistributedState();
-        if (proxy == null) {
+        //noinspection unchecked
+        ConcurrentHashMap<CcId, IAsterixStateProxy> proxyMap =
+                (ConcurrentHashMap<CcId, IAsterixStateProxy>) getServiceContext().getDistributedState();
+        if (proxyMap == null) {
             throw new IllegalStateException("Metadata node cannot access distributed state");
         }
 
         // This is a special case, we just give the metadataNode directly.
         // This way we can delay the registration of the metadataNode until
         // it is completely initialized.
-        MetadataManager.initialize(proxy, MetadataNode.INSTANCE);
+        MetadataManager.initialize(proxyMap.values(), MetadataNode.INSTANCE);
         MetadataBootstrap.startUniverse(getServiceContext(), newUniverse);
         MetadataBootstrap.startDDLRecovery();
         ncExtensionManager.initializeMetadata(getServiceContext());
-
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Metadata node bound");
-        }
+        LOGGER.info("Metadata node bound");
     }
 
     @Override
@@ -476,15 +444,27 @@
             metadataNodeStub = (IMetadataNode) UnicastRemoteObject.exportObject(MetadataNode.INSTANCE,
                     getMetadataProperties().getMetadataPort());
         }
-        ((IAsterixStateProxy) getServiceContext().getDistributedState()).setMetadataNode(metadataNodeStub);
     }
 
     @Override
     public synchronized void unexportMetadataNodeStub() throws RemoteException {
-        UnicastRemoteObject.unexportObject(MetadataNode.INSTANCE, false);
+        if (metadataNodeStub != null) {
+            UnicastRemoteObject.unexportObject(MetadataNode.INSTANCE, false);
+        }
         metadataNodeStub = null;
     }
 
+    @Override
+    public synchronized void bindMetadataNodeStub(CcId ccId) throws RemoteException {
+        if (metadataNodeStub == null) {
+            throw new IllegalStateException("Metadata node not exported");
+
+        }
+        //noinspection unchecked
+        ((ConcurrentMap<CcId, IAsterixStateProxy>) getServiceContext().getDistributedState()).get(ccId)
+                .setMetadataNode(metadataNodeStub);
+    }
+
     public NCExtensionManager getNcExtensionManager() {
         return ncExtensionManager;
     }
@@ -506,7 +486,9 @@
                 if (hcc == null || !hcc.isConnected()) {
                     try {
                         NodeControllerService ncSrv = (NodeControllerService) ncServiceContext.getControllerService();
-                        ClusterControllerInfo ccInfo = ncSrv.getNodeParameters().getClusterControllerInfo();
+                        // TODO(mblow): multicc
+                        CcId primaryCcId = ncSrv.getPrimaryCcId();
+                        ClusterControllerInfo ccInfo = ncSrv.getNodeParameters(primaryCcId).getClusterControllerInfo();
                         hcc = new HyracksConnection(ccInfo.getClientNetAddress(), ccInfo.getClientNetPort());
                     } catch (Exception e) {
                         throw HyracksDataException.create(e);
@@ -516,4 +498,29 @@
         }
         return hcc;
     }
+
+    @Override
+    public IReplicaManager getReplicaManager() {
+        return replicaManager;
+    }
+
+    @Override
+    public IIndexCheckpointManagerProvider getIndexCheckpointManagerProvider() {
+        return indexCheckpointManagerProvider;
+    }
+
+    @Override
+    public ICoordinationService getCoordinationService() {
+        return NoOpCoordinationService.INSTANCE;
+    }
+
+    @Override
+    public long getMaxTxnId() {
+        if (txnSubsystem == null) {
+            throw new IllegalStateException("cannot determine max txn id before txnSubsystem is initialized!");
+        }
+
+        return Math.max(MetadataManager.INSTANCE == null ? 0 : MetadataManager.INSTANCE.getMaxTxnId(),
+                txnSubsystem.getTransactionManager().getMaxTxnId());
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
index a502de9..de3c691 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/RecoveryManager.java
@@ -39,17 +39,17 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.ReplicationProperties;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
 import org.apache.asterix.common.transactions.Checkpoint;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
 import org.apache.asterix.common.transactions.ICheckpointManager;
 import org.apache.asterix.common.transactions.ILogReader;
 import org.apache.asterix.common.transactions.ILogRecord;
@@ -61,19 +61,21 @@
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
 import org.apache.asterix.transaction.management.service.logging.LogManager;
 import org.apache.asterix.transaction.management.service.recovery.AbstractCheckpointManager;
-import org.apache.asterix.transaction.management.service.recovery.TxnId;
+import org.apache.asterix.transaction.management.service.recovery.TxnEntityId;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants;
 import org.apache.commons.io.FileUtils;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 
 /**
  * This is the Recovery Manager and is responsible for rolling back a
@@ -82,27 +84,27 @@
 public class RecoveryManager implements IRecoveryManager, ILifeCycleComponent {
 
     public static final boolean IS_DEBUG_MODE = false;
-    private static final Logger LOGGER = Logger.getLogger(RecoveryManager.class.getName());
+    private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
     private final ITransactionSubsystem txnSubsystem;
     private final LogManager logMgr;
     private final boolean replicationEnabled;
     private static final String RECOVERY_FILES_DIR_NAME = "recovery_temp";
-    private Map<Integer, JobEntityCommits> jobId2WinnerEntitiesMap = null;
+    private Map<Long, JobEntityCommits> jobId2WinnerEntitiesMap = null;
     private final long cachedEntityCommitsPerJobSize;
     private final PersistentLocalResourceRepository localResourceRepository;
     private final ICheckpointManager checkpointManager;
     private SystemState state;
     private final INCServiceContext serviceCtx;
+    private final INcApplicationContext appCtx;
 
     public RecoveryManager(ITransactionSubsystem txnSubsystem, INCServiceContext serviceCtx) {
         this.serviceCtx = serviceCtx;
         this.txnSubsystem = txnSubsystem;
+        this.appCtx = txnSubsystem.getApplicationContext();
         logMgr = (LogManager) txnSubsystem.getLogManager();
-        ReplicationProperties repProperties =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext().getReplicationProperties();
-        replicationEnabled = repProperties.isParticipant(txnSubsystem.getId());
-        localResourceRepository = (PersistentLocalResourceRepository) txnSubsystem.getAsterixAppRuntimeContextProvider()
-                .getLocalResourceRepository();
+        ReplicationProperties repProperties = appCtx.getReplicationProperties();
+        replicationEnabled = repProperties.isReplicationEnabled();
+        localResourceRepository = (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
         cachedEntityCommitsPerJobSize = txnSubsystem.getTransactionProperties().getJobRecoveryMemorySize();
         checkpointManager = txnSubsystem.getCheckpointManager();
     }
@@ -123,37 +125,21 @@
             //The checkpoint file doesn't exist => Failure happened during NC initialization.
             //Retry to initialize the NC by setting the state to PERMANENT_DATA_LOSS
             state = SystemState.PERMANENT_DATA_LOSS;
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("The checkpoint file doesn't exist: systemState = PERMANENT_DATA_LOSS");
-            }
+            LOGGER.info("The checkpoint file doesn't exist: systemState = PERMANENT_DATA_LOSS");
             return state;
         }
-
-        if (replicationEnabled) {
-            if (checkpointObject.getMinMCTFirstLsn() == AbstractCheckpointManager.SHARP_CHECKPOINT_LSN) {
-                //no logs exist
-                state = SystemState.HEALTHY;
-            } else if (checkpointObject.getCheckpointLsn() == logMgr.getAppendLSN() && checkpointObject.isSharp()) {
-                //only remote logs exist
-                state = SystemState.HEALTHY;
-            } else {
-                //need to perform remote recovery
-                state = SystemState.CORRUPTED;
+        long readableSmallestLSN = logMgr.getReadableSmallestLSN();
+        if (logMgr.getAppendLSN() == readableSmallestLSN) {
+            if (checkpointObject.getMinMCTFirstLsn() != AbstractCheckpointManager.SHARP_CHECKPOINT_LSN) {
+                LOGGER.warn("Some(or all) of transaction log files are lost.");
+                //No choice but continuing when the log files are lost.
             }
+            state = SystemState.HEALTHY;
+        } else if (checkpointObject.getCheckpointLsn() == logMgr.getAppendLSN()
+                && checkpointObject.getMinMCTFirstLsn() == AbstractCheckpointManager.SHARP_CHECKPOINT_LSN) {
+            state = SystemState.HEALTHY;
         } else {
-            long readableSmallestLSN = logMgr.getReadableSmallestLSN();
-            if (logMgr.getAppendLSN() == readableSmallestLSN) {
-                if (checkpointObject.getMinMCTFirstLsn() != AbstractCheckpointManager.SHARP_CHECKPOINT_LSN) {
-                    LOGGER.warning("Some(or all) of transaction log files are lost.");
-                    //No choice but continuing when the log files are lost.
-                }
-                state = SystemState.HEALTHY;
-            } else if (checkpointObject.getCheckpointLsn() == logMgr.getAppendLSN()
-                    && checkpointObject.getMinMCTFirstLsn() == AbstractCheckpointManager.SHARP_CHECKPOINT_LSN) {
-                state = SystemState.HEALTHY;
-            } else {
-                state = SystemState.CORRUPTED;
-            }
+            state = SystemState.CORRUPTED;
         }
         return state;
     }
@@ -161,9 +147,7 @@
     @Override
     public void startLocalRecovery(Set<Integer> partitions) throws IOException, ACIDException {
         state = SystemState.RECOVERING;
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("starting recovery ...");
-        }
+        LOGGER.info("starting recovery ...");
 
         long readableSmallestLSN = logMgr.getReadableSmallestLSN();
         Checkpoint checkpointObject = checkpointManager.getLatest();
@@ -183,7 +167,7 @@
     public synchronized void replayPartitionsLogs(Set<Integer> partitions, ILogReader logReader, long lowWaterMarkLSN)
             throws IOException, ACIDException {
         try {
-            Set<Integer> winnerJobSet = startRecoverysAnalysisPhase(partitions, logReader, lowWaterMarkLSN);
+            Set<Long> winnerJobSet = startRecoverysAnalysisPhase(partitions, logReader, lowWaterMarkLSN);
             startRecoveryRedoPhase(partitions, logReader, lowWaterMarkLSN, winnerJobSet);
         } finally {
             logReader.close();
@@ -191,17 +175,17 @@
         }
     }
 
-    private synchronized Set<Integer> startRecoverysAnalysisPhase(Set<Integer> partitions, ILogReader logReader,
+    private synchronized Set<Long> startRecoverysAnalysisPhase(Set<Integer> partitions, ILogReader logReader,
             long lowWaterMarkLSN) throws IOException, ACIDException {
         int updateLogCount = 0;
         int entityCommitLogCount = 0;
         int jobCommitLogCount = 0;
         int abortLogCount = 0;
-        Set<Integer> winnerJobSet = new HashSet<>();
+        Set<Long> winnerJobSet = new HashSet<>();
         jobId2WinnerEntitiesMap = new HashMap<>();
         //set log reader to the lowWaterMarkLsn
         ILogRecord logRecord;
-        logReader.initializeScan(lowWaterMarkLSN);
+        logReader.setPosition(lowWaterMarkLSN);
         logRecord = logReader.next();
         while (logRecord != null) {
             if (IS_DEBUG_MODE) {
@@ -214,8 +198,8 @@
                     }
                     break;
                 case LogType.JOB_COMMIT:
-                    winnerJobSet.add(logRecord.getJobId());
-                    cleanupJobCommits(logRecord.getJobId());
+                    winnerJobSet.add(logRecord.getTxnId());
+                    cleanupTxnCommits(logRecord.getTxnId());
                     jobCommitLogCount++;
                     break;
                 case LogType.ENTITY_COMMIT:
@@ -249,38 +233,38 @@
         return winnerJobSet;
     }
 
-    private void cleanupJobCommits(int jobId) {
-        if (jobId2WinnerEntitiesMap.containsKey(jobId)) {
-            JobEntityCommits jobEntityWinners = jobId2WinnerEntitiesMap.get(jobId);
+    private void cleanupTxnCommits(long txnId) {
+        if (jobId2WinnerEntitiesMap.containsKey(txnId)) {
+            JobEntityCommits jobEntityWinners = jobId2WinnerEntitiesMap.get(txnId);
             //to delete any spilled files as well
             jobEntityWinners.clear();
-            jobId2WinnerEntitiesMap.remove(jobId);
+            jobId2WinnerEntitiesMap.remove(txnId);
         }
     }
 
     private void analyzeEntityCommitLog(ILogRecord logRecord) throws IOException {
-        int jobId = logRecord.getJobId();
+        long txnId = logRecord.getTxnId();
         JobEntityCommits jobEntityWinners;
-        if (!jobId2WinnerEntitiesMap.containsKey(jobId)) {
-            jobEntityWinners = new JobEntityCommits(jobId);
+        if (!jobId2WinnerEntitiesMap.containsKey(txnId)) {
+            jobEntityWinners = new JobEntityCommits(txnId);
             if (needToFreeMemory()) {
                 // If we don't have enough memory for one more job,
                 // we will force all jobs to spill their cached entities to disk.
                 // This could happen only when we have many jobs with small
                 // number of records and none of them have job commit.
-                freeJobsCachedEntities(jobId);
+                freeJobsCachedEntities(txnId);
             }
-            jobId2WinnerEntitiesMap.put(jobId, jobEntityWinners);
+            jobId2WinnerEntitiesMap.put(txnId, jobEntityWinners);
         } else {
-            jobEntityWinners = jobId2WinnerEntitiesMap.get(jobId);
+            jobEntityWinners = jobId2WinnerEntitiesMap.get(txnId);
         }
         jobEntityWinners.add(logRecord);
     }
 
     private synchronized void startRecoveryRedoPhase(Set<Integer> partitions, ILogReader logReader,
-            long lowWaterMarkLSN, Set<Integer> winnerJobSet) throws IOException, ACIDException {
+            long lowWaterMarkLSN, Set<Long> winnerTxnSet) throws IOException, ACIDException {
         int redoCount = 0;
-        int jobId = -1;
+        long txnId = 0;
 
         long resourceId;
         long maxDiskLastLsn;
@@ -291,34 +275,35 @@
         boolean foundWinner = false;
         JobEntityCommits jobEntityWinners = null;
 
-        IAppRuntimeContextProvider appRuntimeContext = txnSubsystem.getAsterixAppRuntimeContextProvider();
-        IDatasetLifecycleManager datasetLifecycleManager = appRuntimeContext.getDatasetLifecycleManager();
+        IDatasetLifecycleManager datasetLifecycleManager = appCtx.getDatasetLifecycleManager();
+        final IIndexCheckpointManagerProvider indexCheckpointManagerProvider =
+                ((INcApplicationContext) (serviceCtx.getApplicationContext())).getIndexCheckpointManagerProvider();
 
         Map<Long, LocalResource> resourcesMap = localResourceRepository.loadAndGetAllResources();
         Map<Long, Long> resourceId2MaxLSNMap = new HashMap<>();
-        TxnId tempKeyTxnId = new TxnId(-1, -1, -1, null, -1, false);
+        TxnEntityId tempKeyTxnEntityId = new TxnEntityId(-1, -1, -1, null, -1, false);
 
         ILogRecord logRecord = null;
         try {
-            logReader.initializeScan(lowWaterMarkLSN);
+            logReader.setPosition(lowWaterMarkLSN);
             logRecord = logReader.next();
             while (logRecord != null) {
                 if (IS_DEBUG_MODE) {
                     LOGGER.info(logRecord.getLogRecordForDisplay());
                 }
                 lsn = logRecord.getLSN();
-                jobId = logRecord.getJobId();
+                txnId = logRecord.getTxnId();
                 foundWinner = false;
                 switch (logRecord.getLogType()) {
                     case LogType.UPDATE:
                         if (partitions.contains(logRecord.getResourcePartition())) {
-                            if (winnerJobSet.contains(jobId)) {
+                            if (winnerTxnSet.contains(txnId)) {
                                 foundWinner = true;
-                            } else if (jobId2WinnerEntitiesMap.containsKey(jobId)) {
-                                jobEntityWinners = jobId2WinnerEntitiesMap.get(jobId);
-                                tempKeyTxnId.setTxnId(jobId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
+                            } else if (jobId2WinnerEntitiesMap.containsKey(txnId)) {
+                                jobEntityWinners = jobId2WinnerEntitiesMap.get(txnId);
+                                tempKeyTxnEntityId.setTxnId(txnId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
                                         logRecord.getPKValue(), logRecord.getPKValueSize());
-                                if (jobEntityWinners.containsEntityCommitForTxnId(lsn, tempKeyTxnId)) {
+                                if (jobEntityWinners.containsEntityCommitForTxnId(lsn, tempKeyTxnEntityId)) {
                                     foundWinner = true;
                                 }
                             }
@@ -339,7 +324,7 @@
                                  * log record.
                                  *******************************************************************/
                                 if (localResource == null) {
-                                    LOGGER.log(Level.WARNING, "resource was not found for resource id " + resourceId);
+                                    LOGGER.log(Level.WARN, "resource was not found for resource id " + resourceId);
                                     logRecord = logReader.next();
                                     continue;
                                 }
@@ -356,25 +341,22 @@
                                     index = (ILSMIndex) localResourceMetadata.createInstance(serviceCtx);
                                     datasetLifecycleManager.register(localResource.getPath(), index);
                                     datasetLifecycleManager.open(localResource.getPath());
-
-                                    //#. get maxDiskLastLSN
-                                    ILSMIndex lsmIndex = index;
                                     try {
+                                        final DatasetResourceReference resourceReference =
+                                                DatasetResourceReference.of(localResource);
                                         maxDiskLastLsn =
-                                                ((AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback())
-                                                        .getComponentLSN(lsmIndex.getDiskComponents());
+                                                indexCheckpointManagerProvider.get(resourceReference).getLowWatermark();
                                     } catch (HyracksDataException e) {
                                         datasetLifecycleManager.close(localResource.getPath());
                                         throw e;
                                     }
-
                                     //#. set resourceId and maxDiskLastLSN to the map
                                     resourceId2MaxLSNMap.put(resourceId, maxDiskLastLsn);
                                 } else {
                                     maxDiskLastLsn = resourceId2MaxLSNMap.get(resourceId);
                                 }
-
-                                if (lsn > maxDiskLastLsn) {
+                                // lsn @ maxDiskLastLsn is either a flush log or a master replica log
+                                if (lsn >= maxDiskLastLsn) {
                                     redo(logRecord, datasetLifecycleManager);
                                     redoCount++;
                                 }
@@ -396,6 +378,7 @@
             }
             LOGGER.info("Logs REDO phase completed. Redo logs count: " + redoCount);
         } finally {
+            txnSubsystem.getTransactionManager().ensureMaxTxnId(txnId);
             //close all indexes
             Set<Long> resourceIdList = resourceId2MaxLSNMap.keySet();
             for (long r : resourceIdList) {
@@ -423,8 +406,7 @@
 
     @Override
     public long getLocalMinFirstLSN() throws HyracksDataException {
-        IDatasetLifecycleManager datasetLifecycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
+        final IDatasetLifecycleManager datasetLifecycleManager = appCtx.getDatasetLifecycleManager();
         List<IIndex> openIndexList = datasetLifecycleManager.getOpenResources();
         long firstLSN;
         //the min first lsn can only be the current append or smaller
@@ -442,16 +424,53 @@
         return minFirstLSN;
     }
 
-    private long getRemoteMinFirstLSN() {
-        IReplicaResourcesManager remoteResourcesManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext().getReplicaResourcesManager();
-        return remoteResourcesManager.getPartitionsMinLSN(localResourceRepository.getInactivePartitions());
+    private long getRemoteMinFirstLSN() throws HyracksDataException {
+        // find the min first lsn of partitions that are replicated on this node
+        final Set<Integer> allPartitions = localResourceRepository.getAllPartitions();
+        final Set<Integer> masterPartitions = appCtx.getReplicaManager().getPartitions();
+        allPartitions.removeAll(masterPartitions);
+        return getPartitionsMinLSN(allPartitions);
+    }
+
+    private long getPartitionsMinLSN(Set<Integer> partitions) throws HyracksDataException {
+        final IIndexCheckpointManagerProvider idxCheckpointMgrProvider = appCtx.getIndexCheckpointManagerProvider();
+        long minRemoteLSN = Long.MAX_VALUE;
+        for (Integer partition : partitions) {
+            final List<DatasetResourceReference> partitionResources = localResourceRepository.getResources(resource -> {
+                DatasetLocalResource dsResource = (DatasetLocalResource) resource.getResource();
+                return dsResource.getPartition() == partition;
+            }).values().stream().map(DatasetResourceReference::of).collect(Collectors.toList());
+            for (DatasetResourceReference indexRef : partitionResources) {
+                long remoteIndexMaxLSN = idxCheckpointMgrProvider.get(indexRef).getLowWatermark();
+                minRemoteLSN = Math.min(minRemoteLSN, remoteIndexMaxLSN);
+            }
+        }
+        return minRemoteLSN;
     }
 
     @Override
-    public File createJobRecoveryFile(int jobId, String fileName) throws IOException {
+    public void replayReplicaPartitionLogs(Set<Integer> partitions, boolean flush) throws HyracksDataException {
+        long minLSN = getPartitionsMinLSN(partitions);
+        long readableSmallestLSN = logMgr.getReadableSmallestLSN();
+        if (minLSN < readableSmallestLSN) {
+            minLSN = readableSmallestLSN;
+        }
+
+        //replay logs > minLSN that belong to these partitions
+        try {
+            replayPartitionsLogs(partitions, logMgr.getLogReader(true), minLSN);
+            if (flush) {
+                appCtx.getDatasetLifecycleManager().flushAllDatasets();
+            }
+        } catch (IOException | ACIDException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    @Override
+    public File createJobRecoveryFile(long txnId, String fileName) throws IOException {
         String recoveryDirPath = getRecoveryDirPath();
-        Path jobRecoveryFolder = Paths.get(recoveryDirPath + File.separator + jobId);
+        Path jobRecoveryFolder = Paths.get(recoveryDirPath + File.separator + txnId);
         if (!Files.exists(jobRecoveryFolder)) {
             Files.createDirectories(jobRecoveryFolder);
         }
@@ -459,10 +478,10 @@
         File jobRecoveryFile = new File(jobRecoveryFolder.toString() + File.separator + fileName);
         if (!jobRecoveryFile.exists()) {
             if (!jobRecoveryFile.createNewFile()) {
-                throw new IOException("Failed to create file: " + fileName + " for job id(" + jobId + ")");
+                throw new IOException("Failed to create file: " + fileName + " for txn id(" + txnId + ")");
             }
         } else {
-            throw new IOException("File: " + fileName + " for job id(" + jobId + ") already exists");
+            throw new IOException("File: " + fileName + " for txn id(" + txnId + ") already exists");
         }
         return jobRecoveryFile;
     }
@@ -483,11 +502,11 @@
         return logDir + RECOVERY_FILES_DIR_NAME;
     }
 
-    private void freeJobsCachedEntities(int requestingJobId) throws IOException {
+    private void freeJobsCachedEntities(long requestingTxnId) throws IOException {
         if (jobId2WinnerEntitiesMap != null) {
-            for (Entry<Integer, JobEntityCommits> jobEntityCommits : jobId2WinnerEntitiesMap.entrySet()) {
+            for (Entry<Long, JobEntityCommits> jobEntityCommits : jobId2WinnerEntitiesMap.entrySet()) {
                 //if the job is not the requester, free its memory
-                if (jobEntityCommits.getKey() != requestingJobId) {
+                if (jobEntityCommits.getKey() != requestingTxnId) {
                     jobEntityCommits.getValue().spillToDiskAndfreeMemory();
                 }
             }
@@ -496,7 +515,7 @@
 
     @Override
     public void rollbackTransaction(ITransactionContext txnContext) throws ACIDException {
-        int abortedJobId = txnContext.getJobId().getId();
+        long abortedTxnId = txnContext.getTxnId().getId();
         // Obtain the first/last log record LSNs written by the Job
         long firstLSN = txnContext.getFirstLSN();
         /*
@@ -511,35 +530,35 @@
             throw new ACIDException(e);
         }
         long lastLSN = txnContext.getLastLSN();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("rollbacking transaction log records from " + firstLSN + " to " + lastLSN);
         }
         // check if the transaction actually wrote some logs.
         if (firstLSN == TransactionManagementConstants.LogManagerConstants.TERMINAL_LSN || firstLSN > lastLSN) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("no need to roll back as there were no operations by the job " + txnContext.getJobId());
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("no need to roll back as there were no operations by the txn " + txnContext.getTxnId());
             }
             return;
         }
 
         // While reading log records from firstLsn to lastLsn, collect uncommitted txn's Lsns
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("collecting loser transaction's LSNs from " + firstLSN + " to " + lastLSN);
         }
 
-        Map<TxnId, List<Long>> jobLoserEntity2LSNsMap = new HashMap<>();
-        TxnId tempKeyTxnId = new TxnId(-1, -1, -1, null, -1, false);
+        Map<TxnEntityId, List<Long>> jobLoserEntity2LSNsMap = new HashMap<>();
+        TxnEntityId tempKeyTxnEntityId = new TxnEntityId(-1, -1, -1, null, -1, false);
         int updateLogCount = 0;
         int entityCommitLogCount = 0;
-        int logJobId = -1;
+        long logTxnId;
         long currentLSN = -1;
-        TxnId loserEntity = null;
+        TxnEntityId loserEntity;
         List<Long> undoLSNSet = null;
         //get active partitions on this node
-        Set<Integer> activePartitions = localResourceRepository.getActivePartitions();
+        Set<Integer> activePartitions = appCtx.getReplicaManager().getPartitions();
         ILogReader logReader = logMgr.getLogReader(false);
         try {
-            logReader.initializeScan(firstLSN);
+            logReader.setPosition(firstLSN);
             ILogRecord logRecord = null;
             while (currentLSN < lastLSN) {
                 logRecord = logReader.next();
@@ -552,19 +571,20 @@
                         LOGGER.info(logRecord.getLogRecordForDisplay());
                     }
                 }
-                logJobId = logRecord.getJobId();
-                if (logJobId != abortedJobId) {
+                logTxnId = logRecord.getTxnId();
+                if (logTxnId != abortedTxnId) {
                     continue;
                 }
-                tempKeyTxnId.setTxnId(logJobId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
+                tempKeyTxnEntityId.setTxnId(logTxnId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
                         logRecord.getPKValue(), logRecord.getPKValueSize());
                 switch (logRecord.getLogType()) {
                     case LogType.UPDATE:
                         if (activePartitions.contains(logRecord.getResourcePartition())) {
-                            undoLSNSet = jobLoserEntity2LSNsMap.get(tempKeyTxnId);
+                            undoLSNSet = jobLoserEntity2LSNsMap.get(tempKeyTxnEntityId);
                             if (undoLSNSet == null) {
-                                loserEntity = new TxnId(logJobId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
-                                        logRecord.getPKValue(), logRecord.getPKValueSize(), true);
+                                loserEntity =
+                                        new TxnEntityId(logTxnId, logRecord.getDatasetId(), logRecord.getPKHashValue(),
+                                                logRecord.getPKValue(), logRecord.getPKValueSize(), true);
                                 undoLSNSet = new LinkedList<>();
                                 jobLoserEntity2LSNsMap.put(loserEntity, undoLSNSet);
                             }
@@ -572,17 +592,17 @@
                             updateLogCount++;
                             if (IS_DEBUG_MODE) {
                                 LOGGER.info(Thread.currentThread().getId() + "======> update[" + currentLSN + "]:"
-                                        + tempKeyTxnId);
+                                        + tempKeyTxnEntityId);
                             }
                         }
                         break;
                     case LogType.ENTITY_COMMIT:
                         if (activePartitions.contains(logRecord.getResourcePartition())) {
-                            jobLoserEntity2LSNsMap.remove(tempKeyTxnId);
+                            jobLoserEntity2LSNsMap.remove(tempKeyTxnEntityId);
                             entityCommitLogCount++;
                             if (IS_DEBUG_MODE) {
                                 LOGGER.info(Thread.currentThread().getId() + "======> entity_commit[" + currentLSN + "]"
-                                        + tempKeyTxnId);
+                                        + tempKeyTxnEntityId);
                             }
                         }
                         break;
@@ -601,19 +621,18 @@
 
             if (currentLSN != lastLSN) {
                 throw new ACIDException("LastLSN mismatch: lastLSN(" + lastLSN + ") vs currentLSN(" + currentLSN
-                        + ") during abort( " + txnContext.getJobId() + ")");
+                        + ") during abort( " + txnContext.getTxnId() + ")");
             }
 
             //undo loserTxn's effect
             LOGGER.log(Level.INFO, "undoing loser transaction's effect");
 
-            IDatasetLifecycleManager datasetLifecycleManager =
-                    txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
+            final IDatasetLifecycleManager datasetLifecycleManager = appCtx.getDatasetLifecycleManager();
             //TODO sort loser entities by smallest LSN to undo in one pass.
-            Iterator<Entry<TxnId, List<Long>>> iter = jobLoserEntity2LSNsMap.entrySet().iterator();
+            Iterator<Entry<TxnEntityId, List<Long>>> iter = jobLoserEntity2LSNsMap.entrySet().iterator();
             int undoCount = 0;
             while (iter.hasNext()) {
-                Map.Entry<TxnId, List<Long>> loserEntity2LSNsMap = iter.next();
+                Map.Entry<TxnEntityId, List<Long>> loserEntity2LSNsMap = iter.next();
                 undoLSNSet = loserEntity2LSNsMap.getValue();
                 // The step below is important since the upsert operations must be done in reverse order.
                 Collections.reverse(undoLSNSet);
@@ -622,7 +641,7 @@
                     //read the corresponding log record to be undone.
                     logRecord = logReader.read(undoLSN);
                     if (logRecord == null) {
-                        throw new ACIDException("IllegalState exception during abort( " + txnContext.getJobId() + ")");
+                        throw new ACIDException("IllegalState exception during abort( " + txnContext.getTxnId() + ")");
                     }
                     if (IS_DEBUG_MODE) {
                         LOGGER.info(logRecord.getLogRecordForDisplay());
@@ -632,7 +651,7 @@
                 }
             }
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("undone loser transaction's effect");
                 LOGGER.info("[RecoveryManager's rollback log count] update/entityCommit/undo:" + updateLogCount + "/"
                         + entityCommitLogCount + "/" + undoCount);
@@ -649,8 +668,6 @@
 
     @Override
     public void stop(boolean dumpState, OutputStream os) throws IOException {
-        // Shutdown checkpoint
-        checkpointManager.doSharpCheckpoint();
     }
 
     @Override
@@ -662,8 +679,7 @@
         try {
             ILSMIndex index =
                     (ILSMIndex) datasetLifecycleManager.getIndex(logRecord.getDatasetId(), logRecord.getResourceId());
-            ILSMIndexAccessor indexAccessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor indexAccessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             if (logRecord.getNewOp() == AbstractIndexModificationOperationCallback.INSERT_BYTE) {
                 indexAccessor.forceDelete(logRecord.getNewValue());
             } else if (logRecord.getNewOp() == AbstractIndexModificationOperationCallback.DELETE_BYTE) {
@@ -696,8 +712,7 @@
             int datasetId = logRecord.getDatasetId();
             long resourceId = logRecord.getResourceId();
             ILSMIndex index = (ILSMIndex) datasetLifecycleManager.getIndex(datasetId, resourceId);
-            ILSMIndexAccessor indexAccessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor indexAccessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             if (logRecord.getNewOp() == AbstractIndexModificationOperationCallback.INSERT_BYTE) {
                 indexAccessor.forceInsert(logRecord.getNewValue());
             } else if (logRecord.getNewOp() == AbstractIndexModificationOperationCallback.DELETE_BYTE) {
@@ -715,25 +730,25 @@
 
     private class JobEntityCommits {
         private static final String PARTITION_FILE_NAME_SEPARATOR = "_";
-        private final int jobId;
-        private final Set<TxnId> cachedEntityCommitTxns = new HashSet<>();
+        private final long txnId;
+        private final Set<TxnEntityId> cachedEntityCommitTxns = new HashSet<>();
         private final List<File> jobEntitCommitOnDiskPartitionsFiles = new ArrayList<>();
         //a flag indicating whether all the the commits for this jobs have been added.
         private boolean preparedForSearch = false;
-        private TxnId winnerEntity = null;
+        private TxnEntityId winnerEntity = null;
         private int currentPartitionSize = 0;
         private long partitionMaxLSN = 0;
         private String currentPartitonName;
 
-        public JobEntityCommits(int jobId) {
-            this.jobId = jobId;
+        public JobEntityCommits(long txnId) {
+            this.txnId = txnId;
         }
 
         public void add(ILogRecord logRecord) throws IOException {
             if (preparedForSearch) {
                 throw new IOException("Cannot add new entity commits after preparing for search.");
             }
-            winnerEntity = new TxnId(logRecord.getJobId(), logRecord.getDatasetId(), logRecord.getPKHashValue(),
+            winnerEntity = new TxnEntityId(logRecord.getTxnId(), logRecord.getDatasetId(), logRecord.getPKHashValue(),
                     logRecord.getPKValue(), logRecord.getPKValueSize(), true);
             cachedEntityCommitTxns.add(winnerEntity);
             //since log file is read sequentially, LSNs are always increasing
@@ -774,15 +789,15 @@
             preparedForSearch = true;
         }
 
-        public boolean containsEntityCommitForTxnId(long logLSN, TxnId txnId) throws IOException {
+        public boolean containsEntityCommitForTxnId(long logLSN, TxnEntityId txnEntityId) throws IOException {
             //if we don't have any partitions on disk, search only from memory
             if (jobEntitCommitOnDiskPartitionsFiles.size() == 0) {
-                return cachedEntityCommitTxns.contains(txnId);
+                return cachedEntityCommitTxns.contains(txnEntityId);
             } else {
                 //get candidate partitions from disk
                 ArrayList<File> candidatePartitions = getCandidiatePartitions(logLSN);
                 for (File partition : candidatePartitions) {
-                    if (serachPartition(partition, txnId)) {
+                    if (serachPartition(partition, txnEntityId)) {
                         return true;
                     }
                 }
@@ -816,17 +831,17 @@
             jobEntitCommitOnDiskPartitionsFiles.clear();
         }
 
-        private boolean serachPartition(File partition, TxnId txnId) throws IOException {
+        private boolean serachPartition(File partition, TxnEntityId txnEntityId) throws IOException {
             //load partition from disk if it is not  already in memory
             if (!partition.getName().equals(currentPartitonName)) {
                 loadPartitionToMemory(partition, cachedEntityCommitTxns);
                 currentPartitonName = partition.getName();
             }
-            return cachedEntityCommitTxns.contains(txnId);
+            return cachedEntityCommitTxns.contains(txnEntityId);
         }
 
         private String getPartitionName(long maxLSN) {
-            return jobId + PARTITION_FILE_NAME_SEPARATOR + maxLSN;
+            return txnId + PARTITION_FILE_NAME_SEPARATOR + maxLSN;
         }
 
         private long getPartitionMaxLSNFromName(String partitionName) {
@@ -837,18 +852,18 @@
             //if we don't have enough memory to allocate for this partition,
             // we will ask recovery manager to free memory
             if (needToFreeMemory()) {
-                freeJobsCachedEntities(jobId);
+                freeJobsCachedEntities(txnId);
             }
             //allocate a buffer that can hold the current partition
             ByteBuffer buffer = ByteBuffer.allocate(currentPartitionSize);
-            for (Iterator<TxnId> iterator = cachedEntityCommitTxns.iterator(); iterator.hasNext();) {
-                TxnId txnId = iterator.next();
+            for (Iterator<TxnEntityId> iterator = cachedEntityCommitTxns.iterator(); iterator.hasNext();) {
+                TxnEntityId txnEntityId = iterator.next();
                 //serialize the object and remove it from memory
-                txnId.serialize(buffer);
+                txnEntityId.serialize(buffer);
                 iterator.remove();
             }
             //name partition file based on job id and max lsn
-            File partitionFile = createJobRecoveryFile(jobId, getPartitionName(partitionMaxLSN));
+            File partitionFile = createJobRecoveryFile(txnId, getPartitionName(partitionMaxLSN));
             //write file to disk
             try (FileOutputStream fileOutputstream = new FileOutputStream(partitionFile, false);
                     FileChannel fileChannel = fileOutputstream.getChannel()) {
@@ -860,11 +875,11 @@
             jobEntitCommitOnDiskPartitionsFiles.add(partitionFile);
         }
 
-        private void loadPartitionToMemory(File partition, Set<TxnId> partitionTxn) throws IOException {
+        private void loadPartitionToMemory(File partition, Set<TxnEntityId> partitionTxn) throws IOException {
             partitionTxn.clear();
             //if we don't have enough memory to a load partition, we will ask recovery manager to free memory
             if (needToFreeMemory()) {
-                freeJobsCachedEntities(jobId);
+                freeJobsCachedEntities(txnId);
             }
             ByteBuffer buffer = ByteBuffer.allocateDirect((int) partition.length());
             //load partition to memory
@@ -875,9 +890,9 @@
                 }
             }
             buffer.flip();
-            TxnId temp = null;
+            TxnEntityId temp;
             while (buffer.remaining() != 0) {
-                temp = TxnId.deserialize(buffer);
+                temp = TxnEntityId.deserialize(buffer);
                 partitionTxn.add(temp);
             }
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java
new file mode 100644
index 0000000..30416a3
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/ReplicaManager.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.nc;
+
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.storage.IReplicaManager;
+import org.apache.asterix.common.storage.ReplicaIdentifier;
+import org.apache.asterix.common.transactions.IRecoveryManager;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.config.IApplicationConfig;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ReplicaManager implements IReplicaManager {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private final INcApplicationContext appCtx;
+    /**
+     * the partitions to which the current node is master
+     */
+    private final Set<Integer> partitions = new HashSet<>();
+    /**
+     * current replicas
+     */
+    private final Map<ReplicaIdentifier, PartitionReplica> replicas = new HashMap<>();
+
+    public ReplicaManager(INcApplicationContext appCtx, Set<Integer> partitions) {
+        this.appCtx = appCtx;
+        this.partitions.addAll(partitions);
+    }
+
+    @Override
+    public synchronized void addReplica(ReplicaIdentifier id) {
+        if (!partitions.contains(id.getPartition())) {
+            throw new IllegalStateException(
+                    "This node is not the current master of partition(" + id.getPartition() + ")");
+        }
+        if (isSelf(id)) {
+            LOGGER.info("ignoring request to add replica to ourselves");
+            return;
+        }
+        replicas.computeIfAbsent(id, k -> new PartitionReplica(k, appCtx));
+        replicas.get(id).sync();
+    }
+
+    @Override
+    public synchronized void removeReplica(ReplicaIdentifier id) {
+        if (!replicas.containsKey(id)) {
+            throw new IllegalStateException("replica with id(" + id + ") does not exist");
+        }
+        PartitionReplica replica = replicas.remove(id);
+        appCtx.getReplicationManager().unregister(replica);
+
+    }
+
+    @Override
+    public List<IPartitionReplica> getReplicas(int partition) {
+        return replicas.entrySet().stream().filter(e -> e.getKey().getPartition() == partition).map(Map.Entry::getValue)
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public Set<Integer> getPartitions() {
+        return Collections.unmodifiableSet(partitions);
+    }
+
+    @Override
+    public synchronized void promote(int partition) throws HyracksDataException {
+        if (partitions.contains(partition)) {
+            return;
+        }
+        final PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        localResourceRepository.cleanup(partition);
+        final IRecoveryManager recoveryManager = appCtx.getTransactionSubsystem().getRecoveryManager();
+        recoveryManager.replayReplicaPartitionLogs(Stream.of(partition).collect(Collectors.toSet()), true);
+        partitions.add(partition);
+    }
+
+    @Override
+    public void release(int partition) throws HyracksDataException {
+        if (!partitions.contains(partition)) {
+            return;
+        }
+        final IDatasetLifecycleManager datasetLifecycleManager = appCtx.getDatasetLifecycleManager();
+        datasetLifecycleManager.flushDataset(appCtx.getReplicationManager().getReplicationStrategy());
+        closePartitionResources(partition);
+        final List<IPartitionReplica> partitionReplicas = getReplicas(partition);
+        for (IPartitionReplica replica : partitionReplicas) {
+            appCtx.getReplicationManager().unregister(replica);
+        }
+        partitions.remove(partition);
+    }
+
+    private void closePartitionResources(int partition) throws HyracksDataException {
+        final PersistentLocalResourceRepository resourceRepository =
+                (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        final Map<Long, LocalResource> partitionResources = resourceRepository.getPartitionResources(partition);
+        final IDatasetLifecycleManager datasetLifecycleManager = appCtx.getDatasetLifecycleManager();
+        for (LocalResource resource : partitionResources.values()) {
+            datasetLifecycleManager.close(resource.getPath());
+        }
+    }
+
+    private boolean isSelf(ReplicaIdentifier id) {
+        IApplicationConfig appConfig = appCtx.getServiceContext().getAppConfig();
+        String host = appConfig.getString(NCConfig.Option.REPLICATION_LISTEN_ADDRESS);
+        int port = appConfig.getInt(NCConfig.Option.REPLICATION_LISTEN_PORT);
+
+        final InetSocketAddress replicaAddress = new InetSocketAddress(host, port);
+        return id.equals(ReplicaIdentifier.of(id.getPartition(), replicaAddress));
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/TransactionSubsystem.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/TransactionSubsystem.java
index 4752481..8158096 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/TransactionSubsystem.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/TransactionSubsystem.java
@@ -19,82 +19,69 @@
 package org.apache.asterix.app.nc;
 
 import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.concurrent.ExecutorService;
 
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.ReplicationProperties;
 import org.apache.asterix.common.config.TransactionProperties;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.replication.IReplicationStrategy;
 import org.apache.asterix.common.transactions.Checkpoint;
 import org.apache.asterix.common.transactions.CheckpointProperties;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
 import org.apache.asterix.common.transactions.ICheckpointManager;
 import org.apache.asterix.common.transactions.ILockManager;
 import org.apache.asterix.common.transactions.ILogManager;
 import org.apache.asterix.common.transactions.IRecoveryManager;
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.transaction.management.service.locking.ConcurrentLockManager;
 import org.apache.asterix.transaction.management.service.logging.LogManager;
 import org.apache.asterix.transaction.management.service.logging.LogManagerWithReplication;
 import org.apache.asterix.transaction.management.service.recovery.CheckpointManagerFactory;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManager;
-import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Provider for all the sub-systems (transaction/lock/log/recovery) managers.
  * Users of transaction sub-systems must obtain them from the provider.
  */
 public class TransactionSubsystem implements ITransactionSubsystem {
-    private static final Logger LOGGER = Logger.getLogger(TransactionSubsystem.class.getName());
+    private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
     private final String id;
     private final ILogManager logManager;
     private final ILockManager lockManager;
     private final ITransactionManager transactionManager;
     private final IRecoveryManager recoveryManager;
-    private final IAppRuntimeContextProvider asterixAppRuntimeContextProvider;
     private final TransactionProperties txnProperties;
     private final ICheckpointManager checkpointManager;
+    private final INcApplicationContext appCtx;
 
     //for profiling purpose
     private long profilerEntityCommitLogCount = 0;
     private EntityCommitProfiler ecp;
 
-    public TransactionSubsystem(INCServiceContext serviceCtx, String id,
-            IAppRuntimeContextProvider asterixAppRuntimeContextProvider, TransactionProperties txnProperties)
-            throws ACIDException {
-        this.asterixAppRuntimeContextProvider = asterixAppRuntimeContextProvider;
-        this.id = id;
-        this.txnProperties = txnProperties;
+    public TransactionSubsystem(INcApplicationContext appCtx) {
+        this.appCtx = appCtx;
+        this.id = appCtx.getServiceContext().getNodeId();
+        this.txnProperties = appCtx.getTransactionProperties();
         this.transactionManager = new TransactionManager(this);
         this.lockManager = new ConcurrentLockManager(txnProperties.getLockManagerShrinkTimer());
-        ReplicationProperties repProperties =
-                asterixAppRuntimeContextProvider.getAppContext().getReplicationProperties();
-        IReplicationStrategy replicationStrategy = repProperties.getReplicationStrategy();
-        final boolean replicationEnabled = repProperties.isParticipant(id);
+        final ReplicationProperties repProperties = appCtx.getReplicationProperties();
+        final boolean replicationEnabled = repProperties.isReplicationEnabled();
         final CheckpointProperties checkpointProperties = new CheckpointProperties(txnProperties, id);
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO, "Checkpoint Properties: " + checkpointProperties);
         }
-        checkpointManager = CheckpointManagerFactory.create(this, checkpointProperties, replicationEnabled);
+        checkpointManager = CheckpointManagerFactory.create(this, checkpointProperties);
         final Checkpoint latestCheckpoint = checkpointManager.getLatest();
-        if (latestCheckpoint != null && latestCheckpoint.getStorageVersion() != StorageConstants.VERSION) {
-            throw new IllegalStateException(
-                    String.format("Storage version mismatch. Current version (%s). On disk version: (%s)",
-                            StorageConstants.VERSION, latestCheckpoint.getStorageVersion()));
+        if (latestCheckpoint != null) {
+            transactionManager.ensureMaxTxnId(latestCheckpoint.getMaxTxnId());
         }
 
-        if (replicationEnabled) {
-            this.logManager = new LogManagerWithReplication(this, replicationStrategy);
-        } else {
-            this.logManager = new LogManager(this);
-        }
-        this.recoveryManager = new RecoveryManager(this, serviceCtx);
-        if (this.txnProperties.isCommitProfilerEnabled()) {
+        this.logManager = replicationEnabled ? new LogManagerWithReplication(this) : new LogManager(this);
+        this.recoveryManager = new RecoveryManager(this, appCtx.getServiceContext());
+        if (txnProperties.isCommitProfilerEnabled()) {
             ecp = new EntityCommitProfiler(this, this.txnProperties.getCommitProfilerReportInterval());
-            getAsterixAppRuntimeContextProvider().getThreadExecutor().submit(ecp);
+            ((ExecutorService) appCtx.getThreadExecutor()).submit(ecp);
         }
     }
 
@@ -119,8 +106,8 @@
     }
 
     @Override
-    public IAppRuntimeContextProvider getAsterixAppRuntimeContextProvider() {
-        return asterixAppRuntimeContextProvider;
+    public INcApplicationContext getApplicationContext() {
+        return appCtx;
     }
 
     @Override
@@ -151,7 +138,7 @@
      * However, the thread doesn't start reporting the count until the entityCommitCount > 0.
      */
     static class EntityCommitProfiler implements Callable<Boolean> {
-        private static final Logger LOGGER = Logger.getLogger(EntityCommitProfiler.class.getName());
+        private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
         private final long reportIntervalInMillisec;
         private long lastEntityCommitCount;
         private int reportIntervalInSeconds;
@@ -186,7 +173,7 @@
             long currentTimeStamp = System.currentTimeMillis();
             long currentEntityCommitCount = txnSubsystem.profilerEntityCommitLogCount;
 
-            LOGGER.severe("EntityCommitProfiler ReportRound[" + reportRound + "], AbsoluteTimeStamp[" + currentTimeStamp
+            LOGGER.error("EntityCommitProfiler ReportRound[" + reportRound + "], AbsoluteTimeStamp[" + currentTimeStamp
                     + "], ActualRelativeTimeStamp[" + (currentTimeStamp - startTimeStamp)
                     + "], ExpectedRelativeTimeStamp[" + (reportIntervalInSeconds * reportRound) + "], IIPS["
                     + ((currentEntityCommitCount - lastEntityCommitCount) / reportIntervalInSeconds) + "], IPS["
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/BindMetadataNodeTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/BindMetadataNodeTask.java
index 49a84e1..701cb96 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/BindMetadataNodeTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/BindMetadataNodeTask.java
@@ -20,27 +20,19 @@
 
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
 public class BindMetadataNodeTask implements INCLifecycleTask {
 
     private static final long serialVersionUID = 1L;
-    private final boolean exportStub;
-
-    public BindMetadataNodeTask(boolean exportStub) {
-        this.exportStub = exportStub;
-    }
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         try {
-            if (exportStub) {
-                appContext.exportMetadataNodeStub();
-            } else {
-                appContext.unexportMetadataNodeStub();
-            }
+            appContext.bindMetadataNodeStub(ccId);
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
@@ -48,6 +40,6 @@
 
     @Override
     public String toString() {
-        return "{ \"class\" : \"" + getClass().getSimpleName() + "\", \"export-stub\" : " + exportStub + " }";
+        return "{ \"class\" : \"" + getClass().getSimpleName() + "\" }";
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/CheckpointTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/CheckpointTask.java
index 02c377a..6f1775e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/CheckpointTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/CheckpointTask.java
@@ -21,6 +21,7 @@
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.transactions.ICheckpointManager;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
@@ -29,7 +30,7 @@
     private static final long serialVersionUID = 1L;
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         ICheckpointManager checkpointMgr = appContext.getTransactionSubsystem().getCheckpointManager();
         checkpointMgr.doSharpCheckpoint();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExportMetadataNodeTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExportMetadataNodeTask.java
new file mode 100644
index 0000000..c833850
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExportMetadataNodeTask.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.nc.task;
+
+import org.apache.asterix.common.api.INCLifecycleTask;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.service.IControllerService;
+
+public class ExportMetadataNodeTask implements INCLifecycleTask {
+
+    private static final long serialVersionUID = 1L;
+    private final boolean exportStub;
+
+    public ExportMetadataNodeTask(boolean exportStub) {
+        this.exportStub = exportStub;
+    }
+
+    @Override
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
+        INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
+        try {
+            if (exportStub) {
+                appContext.exportMetadataNodeStub();
+            } else {
+                appContext.unexportMetadataNodeStub();
+            }
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "{ \"class\" : \"" + getClass().getSimpleName() + "\", \"export-stub\" : " + exportStub + " }";
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExternalLibrarySetupTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExternalLibrarySetupTask.java
index 4e330c6..8cfeb12 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExternalLibrarySetupTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ExternalLibrarySetupTask.java
@@ -21,6 +21,7 @@
 import org.apache.asterix.app.external.ExternalLibraryUtils;
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
@@ -34,7 +35,7 @@
     }
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         try {
             ExternalLibraryUtils.setUpExternaLibraries(appContext.getLibraryManager(), metadataNode);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/LocalRecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/LocalRecoveryTask.java
index eb19ad6..d0a8dcc 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/LocalRecoveryTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/LocalRecoveryTask.java
@@ -25,6 +25,7 @@
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
@@ -38,7 +39,7 @@
     }
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         try {
             appContext.getTransactionSubsystem().getRecoveryManager().startLocalRecovery(partitions);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/MetadataBootstrapTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/MetadataBootstrapTask.java
index 784f3b0..c18b967 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/MetadataBootstrapTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/MetadataBootstrapTask.java
@@ -21,19 +21,26 @@
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
 public class MetadataBootstrapTask implements INCLifecycleTask {
 
     private static final long serialVersionUID = 1L;
+    private final int partitionId;
+
+    public MetadataBootstrapTask(int partitionId) {
+        this.partitionId = partitionId;
+    }
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         try {
+            appContext.getReplicaManager().promote(partitionId);
             SystemState state = appContext.getTransactionSubsystem().getRecoveryManager().getSystemState();
-            appContext.initializeMetadata(state == SystemState.PERMANENT_DATA_LOSS);
+            appContext.initializeMetadata(state == SystemState.PERMANENT_DATA_LOSS, partitionId);
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/RemoteRecoveryTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/RemoteRecoveryTask.java
deleted file mode 100644
index d330684..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/RemoteRecoveryTask.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.nc.task;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.service.IControllerService;
-
-public class RemoteRecoveryTask implements INCLifecycleTask {
-
-    private static final long serialVersionUID = 1L;
-    private final Map<String, Set<Integer>> recoveryPlan;
-
-    public RemoteRecoveryTask(Map<String, Set<Integer>> recoveryPlan) {
-        this.recoveryPlan = recoveryPlan;
-    }
-
-    @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
-        INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
-        appContext.getRemoteRecoveryManager().doRemoteRecoveryPlan(recoveryPlan);
-    }
-
-    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
-        out.defaultWriteObject();
-    }
-
-    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
-        in.defaultReadObject();
-    }
-
-    @Override
-    public String toString() {
-        return "{ \"class\" : \"" + getClass().getSimpleName() + "\", \"recovery-plan\" : " + recoveryPlan + " }";
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportLocalCountersTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportLocalCountersTask.java
new file mode 100644
index 0000000..53b13e8
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportLocalCountersTask.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.nc.task;
+
+import org.apache.asterix.common.api.INCLifecycleTask;
+import org.apache.asterix.runtime.message.ReportLocalCountersMessage;
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.service.IControllerService;
+import org.apache.hyracks.control.nc.NodeControllerService;
+
+public class ReportLocalCountersTask implements INCLifecycleTask {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
+        ReportLocalCountersMessage.send(ccId, (NodeControllerService) cs);
+    }
+
+    @Override
+    public String toString() {
+        return "{ \"class\" : \"" + getClass().getSimpleName() + "\" }";
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportMaxResourceIdTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportMaxResourceIdTask.java
deleted file mode 100644
index 22d3cde..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/ReportMaxResourceIdTask.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.nc.task;
-
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.runtime.message.ReportMaxResourceIdMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.service.IControllerService;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-public class ReportMaxResourceIdTask implements INCLifecycleTask {
-
-    private static final long serialVersionUID = 1L;
-
-    @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
-        ReportMaxResourceIdMessage.send((NodeControllerService) cs);
-    }
-
-    @Override
-    public String toString() {
-        return "{ \"class\" : \"" + getClass().getSimpleName() + "\" }";
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartFailbackTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartFailbackTask.java
deleted file mode 100644
index ecd93a3..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartFailbackTask.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.nc.task;
-
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.service.IControllerService;
-
-public class StartFailbackTask implements INCLifecycleTask {
-
-    private static final long serialVersionUID = 1L;
-
-    @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
-        INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
-        appContext.getRemoteRecoveryManager().startFailbackProcess();
-    }
-
-    @Override
-    public String toString() {
-        return "{ \"class\" : \"" + getClass().getSimpleName() + "\" }";
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartLifecycleComponentsTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartLifecycleComponentsTask.java
index 87d3414..7ecc669 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartLifecycleComponentsTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartLifecycleComponentsTask.java
@@ -20,42 +20,41 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.hyracks.bootstrap.AsterixStateDumpHandler;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponentManager;
 import org.apache.hyracks.api.lifecycle.LifeCycleComponentManager;
 import org.apache.hyracks.api.service.IControllerService;
 import org.apache.hyracks.control.nc.application.NCServiceContext;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class StartLifecycleComponentsTask implements INCLifecycleTask {
 
-    private static final Logger LOGGER = Logger.getLogger(StartLifecycleComponentsTask.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final long serialVersionUID = 1L;
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext applicationContext = (INcApplicationContext) cs.getApplicationContext();
         NCServiceContext serviceCtx = (NCServiceContext) cs.getContext();
         MetadataProperties metadataProperties = applicationContext.getMetadataProperties();
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting lifecycle components");
-        }
+        LOGGER.info("Starting lifecycle components");
         Map<String, String> lifecycleMgmtConfiguration = new HashMap<>();
         String dumpPathKey = LifeCycleComponentManager.Config.DUMP_PATH_KEY;
         String dumpPath = metadataProperties.getCoredumpPath(serviceCtx.getNodeId());
         lifecycleMgmtConfiguration.put(dumpPathKey, dumpPath);
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Coredump directory for NC is: " + dumpPath);
         }
         ILifeCycleComponentManager lccm = serviceCtx.getLifeCycleComponentManager();
         lccm.configure(lifecycleMgmtConfiguration);
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Configured:" + lccm);
         }
         serviceCtx.setStateDumpHandler(new AsterixStateDumpHandler(serviceCtx.getNodeId(), lccm.getDumpPath(), lccm));
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartReplicationServiceTask.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartReplicationServiceTask.java
index 253f121..0cfb6b9 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartReplicationServiceTask.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/nc/task/StartReplicationServiceTask.java
@@ -20,7 +20,7 @@
 
 import org.apache.asterix.common.api.INCLifecycleTask;
 import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.replication.IReplicationManager;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
@@ -29,16 +29,11 @@
     private static final long serialVersionUID = 1L;
 
     @Override
-    public void perform(IControllerService cs) throws HyracksDataException {
+    public void perform(CcId ccId, IControllerService cs) throws HyracksDataException {
         INcApplicationContext appContext = (INcApplicationContext) cs.getApplicationContext();
         try {
-            //Open replication channel
+            // open replication channel
             appContext.getReplicationChannel().start();
-            final IReplicationManager replicationManager = appContext.getReplicationManager();
-            //Check the state of remote replicas
-            replicationManager.initializeReplicasState();
-            //Start replication after the state of remote replicas has been initialized.
-            replicationManager.startReplicationThreads();
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/AutoFaultToleranceStrategy.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/AutoFaultToleranceStrategy.java
deleted file mode 100644
index 4ac1305..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/AutoFaultToleranceStrategy.java
+++ /dev/null
@@ -1,528 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.app.nc.task.BindMetadataNodeTask;
-import org.apache.asterix.app.nc.task.CheckpointTask;
-import org.apache.asterix.app.nc.task.ExternalLibrarySetupTask;
-import org.apache.asterix.app.nc.task.MetadataBootstrapTask;
-import org.apache.asterix.app.nc.task.ReportMaxResourceIdTask;
-import org.apache.asterix.app.nc.task.StartFailbackTask;
-import org.apache.asterix.app.nc.task.StartLifecycleComponentsTask;
-import org.apache.asterix.app.nc.task.StartReplicationServiceTask;
-import org.apache.asterix.app.replication.NodeFailbackPlan.FailbackPlanState;
-import org.apache.asterix.app.replication.message.CompleteFailbackRequestMessage;
-import org.apache.asterix.app.replication.message.CompleteFailbackResponseMessage;
-import org.apache.asterix.app.replication.message.NCLifecycleTaskReportMessage;
-import org.apache.asterix.app.replication.message.PreparePartitionsFailbackRequestMessage;
-import org.apache.asterix.app.replication.message.PreparePartitionsFailbackResponseMessage;
-import org.apache.asterix.app.replication.message.StartupTaskRequestMessage;
-import org.apache.asterix.app.replication.message.StartupTaskResponseMessage;
-import org.apache.asterix.app.replication.message.TakeoverMetadataNodeRequestMessage;
-import org.apache.asterix.app.replication.message.TakeoverMetadataNodeResponseMessage;
-import org.apache.asterix.app.replication.message.TakeoverPartitionsRequestMessage;
-import org.apache.asterix.app.replication.message.TakeoverPartitionsResponseMessage;
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.common.messaging.api.ICCMessageBroker;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
-import org.apache.asterix.metadata.MetadataManager;
-import org.apache.asterix.util.FaultToleranceUtil;
-import org.apache.hyracks.api.application.ICCServiceContext;
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class AutoFaultToleranceStrategy implements IFaultToleranceStrategy {
-
-    private static final Logger LOGGER = Logger.getLogger(AutoFaultToleranceStrategy.class.getName());
-    private long clusterRequestId = 0;
-
-    private Set<String> failedNodes = new HashSet<>();
-    private LinkedList<NodeFailbackPlan> pendingProcessingFailbackPlans = new LinkedList<>();
-    private Map<Long, NodeFailbackPlan> planId2FailbackPlanMap = new HashMap<>();
-    private Map<Long, TakeoverPartitionsRequestMessage> pendingTakeoverRequests = new HashMap<>();;
-    private String currentMetadataNode;
-    private boolean metadataNodeActive = false;
-    private IClusterStateManager clusterManager;
-    private ICCMessageBroker messageBroker;
-    private IReplicationStrategy replicationStrategy;
-    private ICCServiceContext serviceCtx;
-    private Set<String> pendingStartupCompletionNodes = new HashSet<>();
-
-    @Override
-    public void notifyNodeJoin(String nodeId) throws HyracksDataException {
-        pendingStartupCompletionNodes.add(nodeId);
-    }
-
-    @Override
-    public void notifyNodeFailure(String nodeId) throws HyracksDataException {
-        //if this node was waiting for failback and failed before it completed
-        if (failedNodes.contains(nodeId)) {
-            notifyFailbackPlansNodeFailure(nodeId);
-            revertFailedFailbackPlanEffects();
-            return;
-        }
-        //an active node failed
-        failedNodes.add(nodeId);
-        clusterManager.updateNodePartitions(nodeId, false);
-        if (nodeId.equals(currentMetadataNode)) {
-            metadataNodeActive = false;
-            clusterManager.updateMetadataNode(nodeId, metadataNodeActive);
-        }
-        validateClusterState();
-        FaultToleranceUtil.notifyImpactedReplicas(nodeId, ClusterEventType.NODE_FAILURE, clusterManager, messageBroker,
-                replicationStrategy);
-        notifyFailbackPlansNodeFailure(nodeId);
-        requestPartitionsTakeover(nodeId);
-    }
-
-    private synchronized void notifyFailbackPlansNodeFailure(String nodeId) {
-        for (NodeFailbackPlan plan : planId2FailbackPlanMap.values()) {
-            plan.notifyNodeFailure(nodeId);
-        }
-    }
-
-    private synchronized void revertFailedFailbackPlanEffects() {
-        Iterator<NodeFailbackPlan> iterator = planId2FailbackPlanMap.values().iterator();
-        while (iterator.hasNext()) {
-            NodeFailbackPlan plan = iterator.next();
-            if (plan.getState() == FailbackPlanState.PENDING_ROLLBACK) {
-                //TODO if the failing back node is still active, notify it to construct a new plan for it
-                iterator.remove();
-
-                //reassign the partitions that were supposed to be failed back to an active replica
-                requestPartitionsTakeover(plan.getNodeId());
-            }
-        }
-    }
-
-    private synchronized void requestPartitionsTakeover(String failedNodeId) {
-        //replica -> list of partitions to takeover
-        Map<String, List<Integer>> partitionRecoveryPlan = new HashMap<>();
-        ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-        ReplicationProperties replicationProperties = appCtx.getReplicationProperties();
-        //collect the partitions of the failed NC
-        List<ClusterPartition> lostPartitions = getNodeAssignedPartitions(failedNodeId);
-        if (!lostPartitions.isEmpty()) {
-            for (ClusterPartition partition : lostPartitions) {
-                //find replicas for this partitions
-                Set<String> partitionReplicas = replicationProperties.getNodeReplicasIds(partition.getNodeId());
-                //find a replica that is still active
-                for (String replica : partitionReplicas) {
-                    //TODO (mhubail) currently this assigns the partition to the first found active replica.
-                    //It needs to be modified to consider load balancing.
-                    if (addActiveReplica(replica, partition, partitionRecoveryPlan)) {
-                        break;
-                    }
-                }
-            }
-
-            if (partitionRecoveryPlan.size() == 0) {
-                //no active replicas were found for the failed node
-                LOGGER.severe("Could not find active replicas for the partitions " + lostPartitions);
-                return;
-            } else {
-                LOGGER.info("Partitions to recover: " + lostPartitions);
-            }
-            //For each replica, send a request to takeover the assigned partitions
-            partitionRecoveryPlan.forEach((replica, value) -> {
-                Integer[] partitionsToTakeover = value.toArray(new Integer[value.size()]);
-                long requestId = clusterRequestId++;
-                TakeoverPartitionsRequestMessage takeoverRequest = new TakeoverPartitionsRequestMessage(requestId,
-                        replica, partitionsToTakeover);
-                pendingTakeoverRequests.put(requestId, takeoverRequest);
-                try {
-                    messageBroker.sendApplicationMessageToNC(takeoverRequest, replica);
-                } catch (Exception e) {
-                    /*
-                     * if we fail to send the request, it means the NC we tried to send the request to
-                     * has failed. When the failure notification arrives, we will send any pending request
-                     * that belongs to the failed NC to a different active replica.
-                     */
-                    LOGGER.log(Level.WARNING, "Failed to send takeover request: " + takeoverRequest, e);
-                }
-            });
-        }
-    }
-
-    private boolean addActiveReplica(String replica, ClusterPartition partition,
-            Map<String, List<Integer>> partitionRecoveryPlan) {
-        final Set<String> participantNodes = clusterManager.getParticipantNodes();
-        if (participantNodes.contains(replica) && !failedNodes.contains(replica)) {
-            if (!partitionRecoveryPlan.containsKey(replica)) {
-                List<Integer> replicaPartitions = new ArrayList<>();
-                replicaPartitions.add(partition.getPartitionId());
-                partitionRecoveryPlan.put(replica, replicaPartitions);
-            } else {
-                partitionRecoveryPlan.get(replica).add(partition.getPartitionId());
-            }
-            return true;
-        }
-        return false;
-    }
-
-    private synchronized void prepareFailbackPlan(String failingBackNodeId) {
-        NodeFailbackPlan plan = NodeFailbackPlan.createPlan(failingBackNodeId);
-        pendingProcessingFailbackPlans.add(plan);
-        planId2FailbackPlanMap.put(plan.getPlanId(), plan);
-
-        //get all partitions this node requires to resync
-        ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-        ReplicationProperties replicationProperties = appCtx.getReplicationProperties();
-        Set<String> nodeReplicas = replicationProperties.getNodeReplicasIds(failingBackNodeId);
-        clusterManager.getClusterPartitons();
-        for (String replicaId : nodeReplicas) {
-            ClusterPartition[] nodePartitions = clusterManager.getNodePartitions(replicaId);
-            for (ClusterPartition partition : nodePartitions) {
-                plan.addParticipant(partition.getActiveNodeId());
-                /*
-                 * if the partition original node is the returning node,
-                 * add it to the list of the partitions which will be failed back
-                 */
-                if (partition.getNodeId().equals(failingBackNodeId)) {
-                    plan.addPartitionToFailback(partition.getPartitionId(), partition.getActiveNodeId());
-                }
-            }
-        }
-
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Prepared Failback plan: " + plan.toString());
-        }
-
-        processPendingFailbackPlans();
-    }
-
-    private synchronized void processPendingFailbackPlans() {
-        ClusterState state = clusterManager.getState();
-        /*
-         * if the cluster state is not ACTIVE, then failbacks should not be processed
-         * since some partitions are not active
-         */
-        if (state == ClusterState.ACTIVE) {
-            while (!pendingProcessingFailbackPlans.isEmpty()) {
-                //take the first pending failback plan
-                NodeFailbackPlan plan = pendingProcessingFailbackPlans.pop();
-                /*
-                 * A plan at this stage will be in one of two states:
-                 * 1. PREPARING -> the participants were selected but we haven't sent any request.
-                 * 2. PENDING_ROLLBACK -> a participant failed before we send any requests
-                 */
-                if (plan.getState() == FailbackPlanState.PREPARING) {
-                    //set the partitions that will be failed back as inactive
-                    String failbackNode = plan.getNodeId();
-                    for (Integer partitionId : plan.getPartitionsToFailback()) {
-                        //partition expected to be returned to the failing back node
-                        clusterManager.updateClusterPartition(partitionId, failbackNode, false);
-                    }
-
-                    /*
-                     * if the returning node is the original metadata node,
-                     * then metadata node will change after the failback completes
-                     */
-                    ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-                    String originalMetadataNode = appCtx.getMetadataProperties().getMetadataNodeName();
-                    if (originalMetadataNode.equals(failbackNode)) {
-                        plan.setNodeToReleaseMetadataManager(currentMetadataNode);
-                        currentMetadataNode = "";
-                        metadataNodeActive = false;
-                        clusterManager.updateMetadataNode(currentMetadataNode, metadataNodeActive);
-                    }
-
-                    //force new jobs to wait
-                    clusterManager.setState(ClusterState.REBALANCING);
-                    handleFailbackRequests(plan, messageBroker);
-                    /*
-                     * wait until the current plan is completed before processing the next plan.
-                     * when the current one completes or is reverted, the cluster state will be
-                     * ACTIVE again, and the next failback plan (if any) will be processed.
-                     */
-                    break;
-                } else if (plan.getState() == FailbackPlanState.PENDING_ROLLBACK) {
-                    //this plan failed before sending any requests -> nothing to rollback
-                    planId2FailbackPlanMap.remove(plan.getPlanId());
-                }
-            }
-        }
-    }
-
-    private void handleFailbackRequests(NodeFailbackPlan plan, ICCMessageBroker messageBroker) {
-        //send requests to other nodes to complete on-going jobs and prepare partitions for failback
-        for (PreparePartitionsFailbackRequestMessage request : plan.getPlanFailbackRequests()) {
-            try {
-                messageBroker.sendApplicationMessageToNC(request, request.getNodeID());
-                plan.addPendingRequest(request);
-            } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Failed to send failback request to: " + request.getNodeID(), e);
-                plan.notifyNodeFailure(request.getNodeID());
-                revertFailedFailbackPlanEffects();
-                break;
-            }
-        }
-    }
-
-    public synchronized List<ClusterPartition> getNodeAssignedPartitions(String nodeId) {
-        List<ClusterPartition> nodePartitions = new ArrayList<>();
-        ClusterPartition[] clusterPartitons = clusterManager.getClusterPartitons();
-        Map<Integer, ClusterPartition> clusterPartitionsMap = new HashMap<>();
-        for (ClusterPartition partition : clusterPartitons) {
-            clusterPartitionsMap.put(partition.getPartitionId(), partition);
-        }
-        for (ClusterPartition partition : clusterPartitons) {
-            if (nodeId.equals(partition.getActiveNodeId())) {
-                nodePartitions.add(partition);
-            }
-        }
-        /*
-         * if there is any pending takeover request this node was supposed to handle,
-         * it needs to be sent to a different replica
-         */
-        List<Long> failedTakeoverRequests = new ArrayList<>();
-        for (TakeoverPartitionsRequestMessage request : pendingTakeoverRequests.values()) {
-            if (request.getNodeId().equals(nodeId)) {
-                for (Integer partitionId : request.getPartitions()) {
-                    nodePartitions.add(clusterPartitionsMap.get(partitionId));
-                }
-                failedTakeoverRequests.add(request.getRequestId());
-            }
-        }
-
-        //remove failed requests
-        for (Long requestId : failedTakeoverRequests) {
-            pendingTakeoverRequests.remove(requestId);
-        }
-        return nodePartitions;
-    }
-
-    public synchronized void process(TakeoverPartitionsResponseMessage response) throws HyracksDataException {
-        for (Integer partitonId : response.getPartitions()) {
-            clusterManager.updateClusterPartition(partitonId, response.getNodeId(), true);
-        }
-        pendingTakeoverRequests.remove(response.getRequestId());
-        validateClusterState();
-    }
-
-    public synchronized void process(TakeoverMetadataNodeResponseMessage response) throws HyracksDataException {
-        currentMetadataNode = response.getNodeId();
-        metadataNodeActive = true;
-        clusterManager.updateMetadataNode(currentMetadataNode, metadataNodeActive);
-        validateClusterState();
-    }
-
-    private void validateClusterState() throws HyracksDataException {
-        clusterManager.refreshState();
-        ClusterState newState = clusterManager.getState();
-        // PENDING: all partitions are active but metadata node is not
-        if (newState == ClusterState.PENDING) {
-            requestMetadataNodeTakeover();
-        } else if (newState == ClusterState.ACTIVE) {
-            processPendingFailbackPlans();
-        }
-    }
-
-    public synchronized void process(PreparePartitionsFailbackResponseMessage msg) {
-        NodeFailbackPlan plan = planId2FailbackPlanMap.get(msg.getPlanId());
-        plan.markRequestCompleted(msg.getRequestId());
-        /*
-         * A plan at this stage will be in one of three states:
-         * 1. PENDING_PARTICIPANT_REPONSE -> one or more responses are still expected (wait).
-         * 2. PENDING_COMPLETION -> all responses received (time to send completion request).
-         * 3. PENDING_ROLLBACK -> the plan failed and we just received the final pending response (revert).
-         */
-        if (plan.getState() == FailbackPlanState.PENDING_COMPLETION) {
-            CompleteFailbackRequestMessage request = plan.getCompleteFailbackRequestMessage();
-
-            //send complete resync and takeover partitions to the failing back node
-            try {
-                messageBroker.sendApplicationMessageToNC(request, request.getNodeId());
-            } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Failed to send complete failback request to: " + request.getNodeId(), e);
-                notifyFailbackPlansNodeFailure(request.getNodeId());
-                revertFailedFailbackPlanEffects();
-            }
-        } else if (plan.getState() == FailbackPlanState.PENDING_ROLLBACK) {
-            revertFailedFailbackPlanEffects();
-        }
-    }
-
-    public synchronized void process(CompleteFailbackResponseMessage response) throws HyracksDataException {
-        /*
-         * the failback plan completed successfully:
-         * Remove all references to it.
-         * Remove the the failing back node from the failed nodes list.
-         * Notify its replicas to reconnect to it.
-         * Set the failing back node partitions as active.
-         */
-        NodeFailbackPlan plan = planId2FailbackPlanMap.remove(response.getPlanId());
-        String nodeId = plan.getNodeId();
-        failedNodes.remove(nodeId);
-        //notify impacted replicas they can reconnect to this node
-        FaultToleranceUtil.notifyImpactedReplicas(nodeId, ClusterEventType.NODE_JOIN, clusterManager, messageBroker,
-                replicationStrategy);
-        clusterManager.updateNodePartitions(nodeId, true);
-        validateClusterState();
-    }
-
-    private synchronized void requestMetadataNodeTakeover() {
-        //need a new node to takeover metadata node
-        ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-        ClusterPartition metadataPartiton = appCtx.getMetadataProperties().getMetadataPartition();
-        //request the metadataPartition node to register itself as the metadata node
-        TakeoverMetadataNodeRequestMessage takeoverRequest = new TakeoverMetadataNodeRequestMessage();
-        try {
-            messageBroker.sendApplicationMessageToNC(takeoverRequest, metadataPartiton.getActiveNodeId());
-            // Since the metadata node will be changed, we need to rebind the proxy object
-            MetadataManager.INSTANCE.rebindMetadataNode();
-        } catch (Exception e) {
-            /*
-             * if we fail to send the request, it means the NC we tried to send the request to
-             * has failed. When the failure notification arrives, a new NC will be assigned to
-             * the metadata partition and a new metadata node takeover request will be sent to it.
-             */
-            LOGGER.log(Level.WARNING,
-                    "Failed to send metadata node takeover request to: " + metadataPartiton.getActiveNodeId(), e);
-        }
-    }
-
-    @Override
-    public IFaultToleranceStrategy from(ICCServiceContext serviceCtx, IReplicationStrategy replicationStrategy) {
-        AutoFaultToleranceStrategy ft = new AutoFaultToleranceStrategy();
-        ft.messageBroker = (ICCMessageBroker) serviceCtx.getMessageBroker();
-        ft.replicationStrategy = replicationStrategy;
-        ft.serviceCtx = serviceCtx;
-        return ft;
-    }
-
-    @Override
-    public synchronized void process(INCLifecycleMessage message) throws HyracksDataException {
-        switch (message.getType()) {
-            case STARTUP_TASK_REQUEST:
-                process((StartupTaskRequestMessage) message);
-                break;
-            case STARTUP_TASK_RESULT:
-                process((NCLifecycleTaskReportMessage) message);
-                break;
-            case TAKEOVER_PARTITION_RESPONSE:
-                process((TakeoverPartitionsResponseMessage) message);
-                break;
-            case TAKEOVER_METADATA_NODE_RESPONSE:
-                process((TakeoverMetadataNodeResponseMessage) message);
-                break;
-            case PREPARE_FAILBACK_RESPONSE:
-                process((PreparePartitionsFailbackResponseMessage) message);
-                break;
-            case COMPLETE_FAILBACK_RESPONSE:
-                process((CompleteFailbackResponseMessage) message);
-                break;
-            default:
-                throw new RuntimeDataException(ErrorCode.UNSUPPORTED_MESSAGE_TYPE, message.getType().name());
-        }
-    }
-
-    private synchronized void process(NCLifecycleTaskReportMessage msg) throws HyracksDataException {
-        final String nodeId = msg.getNodeId();
-        pendingStartupCompletionNodes.remove(nodeId);
-        if (msg.isSuccess()) {
-            if (failedNodes.contains(nodeId)) {
-                prepareFailbackPlan(nodeId);
-                return;
-            }
-            // If this node failed and recovered, notify impacted replicas to reconnect to it
-            if (replicationStrategy.isParticipant(nodeId) && failedNodes.remove(nodeId)) {
-                FaultToleranceUtil.notifyImpactedReplicas(nodeId, ClusterEventType.NODE_JOIN, clusterManager,
-                        messageBroker, replicationStrategy);
-            }
-            clusterManager.updateNodePartitions(nodeId, true);
-            if (msg.getNodeId().equals(currentMetadataNode)) {
-                clusterManager.updateMetadataNode(currentMetadataNode, true);
-            }
-            clusterManager.refreshState();
-        } else {
-            LOGGER.log(Level.SEVERE, msg.getNodeId() + " failed to complete startup. ", msg.getException());
-        }
-    }
-
-    @Override
-    public void bindTo(IClusterStateManager clusterManager) {
-        this.clusterManager = clusterManager;
-        currentMetadataNode = clusterManager.getCurrentMetadataNodeId();
-    }
-
-    private synchronized void process(StartupTaskRequestMessage msg) throws HyracksDataException {
-        final String nodeId = msg.getNodeId();
-        final SystemState state = msg.getState();
-        List<INCLifecycleTask> tasks;
-        if (state == SystemState.BOOTSTRAPPING || state == SystemState.HEALTHY) {
-            tasks = buildStartupSequence(nodeId);
-        } else {
-            // failed node returned. Need to start failback process
-            tasks = buildFailbackStartupSequence();
-        }
-        StartupTaskResponseMessage response = new StartupTaskResponseMessage(nodeId, tasks);
-        try {
-            messageBroker.sendApplicationMessageToNC(response, msg.getNodeId());
-        } catch (Exception e) {
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    private List<INCLifecycleTask> buildFailbackStartupSequence() {
-        final List<INCLifecycleTask> tasks = new ArrayList<>();
-        tasks.add(new StartFailbackTask());
-        tasks.add(new ReportMaxResourceIdTask());
-        tasks.add(new StartLifecycleComponentsTask());
-        return tasks;
-    }
-
-    private List<INCLifecycleTask> buildStartupSequence(String nodeId) {
-        final List<INCLifecycleTask> tasks = new ArrayList<>();
-        tasks.add(new StartReplicationServiceTask());
-        final boolean isMetadataNode = nodeId.equals(currentMetadataNode);
-        if (isMetadataNode) {
-            tasks.add(new MetadataBootstrapTask());
-        }
-        tasks.add(new ExternalLibrarySetupTask(isMetadataNode));
-        tasks.add(new ReportMaxResourceIdTask());
-        tasks.add(new CheckpointTask());
-        tasks.add(new StartLifecycleComponentsTask());
-        if (isMetadataNode) {
-            tasks.add(new BindMetadataNodeTask(true));
-        }
-        return tasks;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/FaultToleranceStrategyFactory.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/FaultToleranceStrategyFactory.java
deleted file mode 100644
index 4e8ecd9..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/FaultToleranceStrategyFactory.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.hyracks.api.application.ICCServiceContext;
-
-public class FaultToleranceStrategyFactory {
-
-    private static final Map<String, Class<? extends IFaultToleranceStrategy>> BUILT_IN_FAULT_TOLERANCE_STRATEGY =
-            new HashMap<>();
-
-    static {
-        BUILT_IN_FAULT_TOLERANCE_STRATEGY.put("no_fault_tolerance", NoFaultToleranceStrategy.class);
-        BUILT_IN_FAULT_TOLERANCE_STRATEGY.put("metadata_node", MetadataNodeFaultToleranceStrategy.class);
-        BUILT_IN_FAULT_TOLERANCE_STRATEGY.put("auto", AutoFaultToleranceStrategy.class);
-    }
-
-    private FaultToleranceStrategyFactory() {
-        throw new AssertionError();
-    }
-
-    public static IFaultToleranceStrategy create(Cluster cluster, IReplicationStrategy repStrategy,
-            ICCServiceContext serviceCtx) {
-        boolean highAvailabilityEnabled =
-                cluster.getHighAvailability() != null && cluster.getHighAvailability().getEnabled() != null
-                        && Boolean.valueOf(cluster.getHighAvailability().getEnabled());
-
-        if (!highAvailabilityEnabled || cluster.getHighAvailability().getFaultTolerance() == null
-                || cluster.getHighAvailability().getFaultTolerance().getStrategy() == null) {
-            return new NoFaultToleranceStrategy().from(serviceCtx, repStrategy);
-        }
-        String strategyName = cluster.getHighAvailability().getFaultTolerance().getStrategy().toLowerCase();
-        if (!BUILT_IN_FAULT_TOLERANCE_STRATEGY.containsKey(strategyName)) {
-            throw new IllegalArgumentException(String.format("Unsupported Replication Strategy. Available types: %s",
-                    BUILT_IN_FAULT_TOLERANCE_STRATEGY.keySet().toString()));
-        }
-        Class<? extends IFaultToleranceStrategy> clazz = BUILT_IN_FAULT_TOLERANCE_STRATEGY.get(strategyName);
-        try {
-            return clazz.newInstance().from(serviceCtx, repStrategy);
-        } catch (InstantiationException | IllegalAccessException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/MetadataNodeFaultToleranceStrategy.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/MetadataNodeFaultToleranceStrategy.java
deleted file mode 100644
index 1b57403..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/MetadataNodeFaultToleranceStrategy.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.app.nc.task.BindMetadataNodeTask;
-import org.apache.asterix.app.nc.task.CheckpointTask;
-import org.apache.asterix.app.nc.task.ExternalLibrarySetupTask;
-import org.apache.asterix.app.nc.task.LocalRecoveryTask;
-import org.apache.asterix.app.nc.task.MetadataBootstrapTask;
-import org.apache.asterix.app.nc.task.RemoteRecoveryTask;
-import org.apache.asterix.app.nc.task.ReportMaxResourceIdTask;
-import org.apache.asterix.app.nc.task.StartLifecycleComponentsTask;
-import org.apache.asterix.app.nc.task.StartReplicationServiceTask;
-import org.apache.asterix.app.replication.message.NCLifecycleTaskReportMessage;
-import org.apache.asterix.app.replication.message.ReplayPartitionLogsRequestMessage;
-import org.apache.asterix.app.replication.message.ReplayPartitionLogsResponseMessage;
-import org.apache.asterix.app.replication.message.StartupTaskRequestMessage;
-import org.apache.asterix.app.replication.message.StartupTaskResponseMessage;
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.common.messaging.api.ICCMessageBroker;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
-import org.apache.asterix.util.FaultToleranceUtil;
-import org.apache.hyracks.api.application.ICCServiceContext;
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class MetadataNodeFaultToleranceStrategy implements IFaultToleranceStrategy {
-
-    private static final Logger LOGGER = Logger.getLogger(MetadataNodeFaultToleranceStrategy.class.getName());
-    private IClusterStateManager clusterManager;
-    private String metadataNodeId;
-    private IReplicationStrategy replicationStrategy;
-    private ICCMessageBroker messageBroker;
-    private ICCServiceContext serviceCtx;
-    private final Set<String> hotStandbyMetadataReplica = new HashSet<>();
-    private final Set<String> failedNodes = new HashSet<>();
-    private Set<String> pendingStartupCompletionNodes = new HashSet<>();
-
-    @Override
-    public synchronized void notifyNodeJoin(String nodeId) throws HyracksDataException {
-        pendingStartupCompletionNodes.add(nodeId);
-    }
-
-    @Override
-    public synchronized void notifyNodeFailure(String nodeId) throws HyracksDataException {
-        failedNodes.add(nodeId);
-        hotStandbyMetadataReplica.remove(nodeId);
-        clusterManager.updateNodePartitions(nodeId, false);
-        if (nodeId.equals(metadataNodeId)) {
-            clusterManager.updateMetadataNode(metadataNodeId, false);
-        }
-        clusterManager.refreshState();
-        if (replicationStrategy.isParticipant(nodeId)) {
-            // Notify impacted replica
-            FaultToleranceUtil.notifyImpactedReplicas(nodeId, ClusterEventType.NODE_FAILURE, clusterManager,
-                    messageBroker, replicationStrategy);
-        }
-        // If the failed node is the metadata node, ask its replicas to replay any committed jobs
-        if (nodeId.equals(metadataNodeId)) {
-            ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-            int metadataPartitionId = appCtx.getMetadataProperties().getMetadataPartition().getPartitionId();
-            Set<Integer> metadataPartition = new HashSet<>(Arrays.asList(metadataPartitionId));
-            Set<Replica> activeRemoteReplicas = replicationStrategy.getRemoteReplicas(metadataNodeId).stream()
-                    .filter(replica -> !failedNodes.contains(replica.getId())).collect(Collectors.toSet());
-            //TODO Do election to identity the node with latest state
-            for (Replica replica : activeRemoteReplicas) {
-                ReplayPartitionLogsRequestMessage msg = new ReplayPartitionLogsRequestMessage(metadataPartition);
-                try {
-                    messageBroker.sendApplicationMessageToNC(msg, replica.getId());
-                } catch (Exception e) {
-                    LOGGER.log(Level.WARNING, "Failed sending an application message to an NC", e);
-                    continue;
-                }
-            }
-        }
-    }
-
-    @Override
-    public IFaultToleranceStrategy from(ICCServiceContext serviceCtx, IReplicationStrategy replicationStrategy) {
-        MetadataNodeFaultToleranceStrategy ft = new MetadataNodeFaultToleranceStrategy();
-        ft.replicationStrategy = replicationStrategy;
-        ft.messageBroker = (ICCMessageBroker) serviceCtx.getMessageBroker();
-        ft.serviceCtx = serviceCtx;
-        return ft;
-    }
-
-    @Override
-    public synchronized void process(INCLifecycleMessage message) throws HyracksDataException {
-        switch (message.getType()) {
-            case STARTUP_TASK_REQUEST:
-                process((StartupTaskRequestMessage) message);
-                break;
-            case STARTUP_TASK_RESULT:
-                process((NCLifecycleTaskReportMessage) message);
-                break;
-            case REPLAY_LOGS_RESPONSE:
-                process((ReplayPartitionLogsResponseMessage) message);
-                break;
-            default:
-                throw new RuntimeDataException(ErrorCode.UNSUPPORTED_MESSAGE_TYPE, message.getType().name());
-        }
-    }
-
-    @Override
-    public synchronized void bindTo(IClusterStateManager clusterManager) {
-        this.clusterManager = clusterManager;
-        this.metadataNodeId = clusterManager.getCurrentMetadataNodeId();
-    }
-
-    private synchronized void process(ReplayPartitionLogsResponseMessage msg) {
-        hotStandbyMetadataReplica.add(msg.getNodeId());
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Hot Standby Metadata Replicas: " + hotStandbyMetadataReplica);
-        }
-    }
-
-    private synchronized void process(StartupTaskRequestMessage msg) throws HyracksDataException {
-        final String nodeId = msg.getNodeId();
-        final SystemState state = msg.getState();
-        final boolean isParticipant = replicationStrategy.isParticipant(nodeId);
-        List<INCLifecycleTask> tasks;
-        if (!isParticipant) {
-            tasks = buildNonParticipantStartupSequence(nodeId, state);
-        } else {
-            tasks = buildParticipantStartupSequence(nodeId, state);
-        }
-        StartupTaskResponseMessage response = new StartupTaskResponseMessage(nodeId, tasks);
-        try {
-            messageBroker.sendApplicationMessageToNC(response, msg.getNodeId());
-        } catch (Exception e) {
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    private synchronized void process(NCLifecycleTaskReportMessage msg) throws HyracksDataException {
-        final String nodeId = msg.getNodeId();
-        pendingStartupCompletionNodes.remove(nodeId);
-        if (msg.isSuccess()) {
-            // If this node failed and recovered, notify impacted replicas to reconnect to it
-            if (replicationStrategy.isParticipant(nodeId) && failedNodes.remove(nodeId)) {
-                FaultToleranceUtil.notifyImpactedReplicas(nodeId, ClusterEventType.NODE_JOIN, clusterManager,
-                        messageBroker, replicationStrategy);
-            }
-            clusterManager.updateNodePartitions(msg.getNodeId(), true);
-            if (msg.getNodeId().equals(metadataNodeId)) {
-                clusterManager.updateMetadataNode(metadataNodeId, true);
-                // When metadata node is active, it is the only hot standby replica
-                hotStandbyMetadataReplica.clear();
-                hotStandbyMetadataReplica.add(metadataNodeId);
-            }
-            clusterManager.refreshState();
-        } else {
-            LOGGER.log(Level.SEVERE, msg.getNodeId() + " failed to complete startup. ", msg.getException());
-        }
-    }
-
-    private List<INCLifecycleTask> buildNonParticipantStartupSequence(String nodeId, SystemState state) {
-        final List<INCLifecycleTask> tasks = new ArrayList<>();
-        if (state == SystemState.CORRUPTED) {
-            //need to perform local recovery for node partitions
-            LocalRecoveryTask rt = new LocalRecoveryTask(Arrays.asList(clusterManager.getNodePartitions(nodeId))
-                    .stream().map(ClusterPartition::getPartitionId).collect(Collectors.toSet()));
-            tasks.add(rt);
-        }
-        tasks.add(new ExternalLibrarySetupTask(false));
-        tasks.add(new ReportMaxResourceIdTask());
-        tasks.add(new CheckpointTask());
-        tasks.add(new StartLifecycleComponentsTask());
-        return tasks;
-    }
-
-    private List<INCLifecycleTask> buildParticipantStartupSequence(String nodeId, SystemState state) {
-        final List<INCLifecycleTask> tasks = new ArrayList<>();
-        switch (state) {
-            case PERMANENT_DATA_LOSS:
-                // If the metadata node (or replica) failed and lost its data
-                // => Metadata Remote Recovery from standby replica
-                tasks.add(getMetadataPartitionRecoveryPlan());
-                // Checkpoint after remote recovery to move node to HEALTHY state
-                tasks.add(new CheckpointTask());
-                break;
-            case CORRUPTED:
-                // If the metadata node (or replica) failed and started again without losing data => Local Recovery
-                LocalRecoveryTask rt = new LocalRecoveryTask(Arrays.asList(clusterManager.getNodePartitions(nodeId))
-                        .stream().map(ClusterPartition::getPartitionId).collect(Collectors.toSet()));
-                tasks.add(rt);
-                break;
-            case BOOTSTRAPPING:
-            case HEALTHY:
-            case RECOVERING:
-                break;
-            default:
-                break;
-        }
-        tasks.add(new StartReplicationServiceTask());
-        final boolean isMetadataNode = nodeId.equals(metadataNodeId);
-        if (isMetadataNode) {
-            tasks.add(new MetadataBootstrapTask());
-        }
-        tasks.add(new ExternalLibrarySetupTask(isMetadataNode));
-        tasks.add(new ReportMaxResourceIdTask());
-        tasks.add(new CheckpointTask());
-        tasks.add(new StartLifecycleComponentsTask());
-        if (isMetadataNode) {
-            tasks.add(new BindMetadataNodeTask(true));
-        }
-        return tasks;
-    }
-
-    private RemoteRecoveryTask getMetadataPartitionRecoveryPlan() {
-        if (hotStandbyMetadataReplica.isEmpty()) {
-            throw new IllegalStateException("No metadata replicas to recover from");
-        }
-        // Construct recovery plan: Node => Set of partitions to recover from it
-        Map<String, Set<Integer>> recoveryPlan = new HashMap<>();
-        // Recover metadata partition from any metadata hot standby replica
-        ICcApplicationContext appCtx = (ICcApplicationContext) serviceCtx.getApplicationContext();
-        int metadataPartitionId = appCtx.getMetadataProperties().getMetadataPartition().getPartitionId();
-        Set<Integer> metadataPartition = new HashSet<>(Arrays.asList(metadataPartitionId));
-        recoveryPlan.put(hotStandbyMetadataReplica.iterator().next(), metadataPartition);
-        return new RemoteRecoveryTask(recoveryPlan);
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java
new file mode 100644
index 0000000..25e768d
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NcLifecycleCoordinator.java
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.replication;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.app.nc.task.BindMetadataNodeTask;
+import org.apache.asterix.app.nc.task.CheckpointTask;
+import org.apache.asterix.app.nc.task.ExportMetadataNodeTask;
+import org.apache.asterix.app.nc.task.ExternalLibrarySetupTask;
+import org.apache.asterix.app.nc.task.LocalRecoveryTask;
+import org.apache.asterix.app.nc.task.MetadataBootstrapTask;
+import org.apache.asterix.app.nc.task.ReportLocalCountersTask;
+import org.apache.asterix.app.nc.task.StartLifecycleComponentsTask;
+import org.apache.asterix.app.nc.task.StartReplicationServiceTask;
+import org.apache.asterix.app.replication.message.MetadataNodeRequestMessage;
+import org.apache.asterix.app.replication.message.MetadataNodeResponseMessage;
+import org.apache.asterix.app.replication.message.NCLifecycleTaskReportMessage;
+import org.apache.asterix.app.replication.message.RegistrationTasksRequestMessage;
+import org.apache.asterix.app.replication.message.RegistrationTasksResponseMessage;
+import org.apache.asterix.common.api.INCLifecycleTask;
+import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.asterix.common.cluster.IClusterStateManager;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.exceptions.RuntimeDataException;
+import org.apache.asterix.common.messaging.api.ICCMessageBroker;
+import org.apache.asterix.common.replication.INCLifecycleMessage;
+import org.apache.asterix.common.replication.INcLifecycleCoordinator;
+import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.hyracks.api.application.ICCServiceContext;
+import org.apache.hyracks.api.client.NodeStatus;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class NcLifecycleCoordinator implements INcLifecycleCoordinator {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    protected IClusterStateManager clusterManager;
+    protected String metadataNodeId;
+    protected Set<String> pendingStartupCompletionNodes = new HashSet<>();
+    protected final ICCMessageBroker messageBroker;
+    private final boolean replicationEnabled;
+
+    public NcLifecycleCoordinator(ICCServiceContext serviceCtx, boolean replicationEnabled) {
+        this.messageBroker = (ICCMessageBroker) serviceCtx.getMessageBroker();
+        this.replicationEnabled = replicationEnabled;
+    }
+
+    @Override
+    public void notifyNodeJoin(String nodeId) {
+        pendingStartupCompletionNodes.add(nodeId);
+    }
+
+    @Override
+    public void notifyNodeFailure(String nodeId) throws HyracksDataException {
+        pendingStartupCompletionNodes.remove(nodeId);
+        clusterManager.updateNodePartitions(nodeId, false);
+        if (nodeId.equals(metadataNodeId)) {
+            clusterManager.updateMetadataNode(metadataNodeId, false);
+        }
+        clusterManager.refreshState();
+    }
+
+    @Override
+    public void process(INCLifecycleMessage message) throws HyracksDataException {
+        switch (message.getType()) {
+            case REGISTRATION_TASKS_REQUEST:
+                process((RegistrationTasksRequestMessage) message);
+                break;
+            case REGISTRATION_TASKS_RESULT:
+                process((NCLifecycleTaskReportMessage) message);
+                break;
+            case METADATA_NODE_RESPONSE:
+                process((MetadataNodeResponseMessage) message);
+                break;
+            default:
+                throw new RuntimeDataException(ErrorCode.UNSUPPORTED_MESSAGE_TYPE, message.getType().name());
+        }
+    }
+
+    @Override
+    public void bindTo(IClusterStateManager clusterManager) {
+        this.clusterManager = clusterManager;
+        metadataNodeId = clusterManager.getCurrentMetadataNodeId();
+    }
+
+    private void process(RegistrationTasksRequestMessage msg) throws HyracksDataException {
+        final String nodeId = msg.getNodeId();
+        List<INCLifecycleTask> tasks = buildNCRegTasks(msg.getNodeId(), msg.getNodeStatus(), msg.getState());
+        RegistrationTasksResponseMessage response = new RegistrationTasksResponseMessage(nodeId, tasks);
+        try {
+            messageBroker.sendApplicationMessageToNC(response, msg.getNodeId());
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    private void process(NCLifecycleTaskReportMessage msg) throws HyracksDataException {
+        pendingStartupCompletionNodes.remove(msg.getNodeId());
+        if (msg.isSuccess()) {
+            clusterManager.updateNodePartitions(msg.getNodeId(), true);
+            if (msg.getNodeId().equals(metadataNodeId)) {
+                clusterManager.updateMetadataNode(metadataNodeId, true);
+            }
+            clusterManager.refreshState();
+        } else {
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.log(Level.ERROR, msg.getNodeId() + " failed to complete startup. ", msg.getException());
+            }
+        }
+    }
+
+    protected List<INCLifecycleTask> buildNCRegTasks(String nodeId, NodeStatus nodeStatus, SystemState state) {
+        LOGGER.log(Level.INFO, () -> "Building registration tasks for node: " + nodeId + " with state: " + state);
+        final boolean isMetadataNode = nodeId.equals(metadataNodeId);
+        if (nodeStatus == NodeStatus.ACTIVE) {
+            /*
+             * if the node state is already ACTIVE then it completed
+             * booting and just re-registering with a new/failed CC.
+             */
+            return buildActiveNCRegTasks(isMetadataNode);
+        }
+        final List<INCLifecycleTask> tasks = new ArrayList<>();
+        if (state == SystemState.CORRUPTED) {
+            //need to perform local recovery for node partitions
+            LocalRecoveryTask rt = new LocalRecoveryTask(Arrays.asList(clusterManager.getNodePartitions(nodeId))
+                    .stream().map(ClusterPartition::getPartitionId).collect(Collectors.toSet()));
+            tasks.add(rt);
+        }
+        if (replicationEnabled) {
+            tasks.add(new StartReplicationServiceTask());
+        }
+        if (isMetadataNode) {
+            tasks.add(new MetadataBootstrapTask(clusterManager.getMetadataPartition().getPartitionId()));
+        }
+        tasks.add(new ExternalLibrarySetupTask(isMetadataNode));
+        tasks.add(new CheckpointTask());
+        tasks.add(new StartLifecycleComponentsTask());
+        if (isMetadataNode) {
+            tasks.add(new ExportMetadataNodeTask(true));
+            tasks.add(new BindMetadataNodeTask());
+        }
+        tasks.add(new ReportLocalCountersTask());
+        return tasks;
+    }
+
+    protected List<INCLifecycleTask> buildActiveNCRegTasks(boolean metadataNode) {
+        final List<INCLifecycleTask> tasks = new ArrayList<>();
+        if (metadataNode) {
+            tasks.add(new BindMetadataNodeTask());
+        }
+        tasks.add(new ReportLocalCountersTask());
+        return tasks;
+    }
+
+    @Override
+    public void notifyMetadataNodeChange(String node) throws HyracksDataException {
+        if (metadataNodeId.equals(node)) {
+            return;
+        }
+        // if current metadata node is active, we need to unbind its metadata proxy objects
+        if (clusterManager.isMetadataNodeActive()) {
+            MetadataNodeRequestMessage msg =
+                    new MetadataNodeRequestMessage(false, clusterManager.getMetadataPartition().getPartitionId());
+            try {
+                messageBroker.sendApplicationMessageToNC(msg, metadataNodeId);
+                // when the current node responses, we will bind to the new one
+                metadataNodeId = node;
+            } catch (Exception e) {
+                throw HyracksDataException.create(e);
+            }
+        } else {
+            requestMetadataNodeTakeover(node);
+        }
+    }
+
+    private void process(MetadataNodeResponseMessage response) throws HyracksDataException {
+        // rebind metadata node since it might be changing
+        MetadataManager.INSTANCE.rebindMetadataNode();
+        clusterManager.updateMetadataNode(response.getNodeId(), response.isExported());
+        if (!response.isExported()) {
+            requestMetadataNodeTakeover(metadataNodeId);
+        }
+    }
+
+    private void requestMetadataNodeTakeover(String node) throws HyracksDataException {
+        MetadataNodeRequestMessage msg =
+                new MetadataNodeRequestMessage(true, clusterManager.getMetadataPartition().getPartitionId());
+        try {
+            messageBroker.sendApplicationMessageToNC(msg, node);
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NoFaultToleranceStrategy.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NoFaultToleranceStrategy.java
deleted file mode 100644
index b9ea135..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NoFaultToleranceStrategy.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.app.nc.task.BindMetadataNodeTask;
-import org.apache.asterix.app.nc.task.CheckpointTask;
-import org.apache.asterix.app.nc.task.ExternalLibrarySetupTask;
-import org.apache.asterix.app.nc.task.LocalRecoveryTask;
-import org.apache.asterix.app.nc.task.MetadataBootstrapTask;
-import org.apache.asterix.app.nc.task.ReportMaxResourceIdTask;
-import org.apache.asterix.app.nc.task.StartLifecycleComponentsTask;
-import org.apache.asterix.app.replication.message.NCLifecycleTaskReportMessage;
-import org.apache.asterix.app.replication.message.StartupTaskRequestMessage;
-import org.apache.asterix.app.replication.message.StartupTaskResponseMessage;
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.common.messaging.api.ICCMessageBroker;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
-import org.apache.hyracks.api.application.ICCServiceContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class NoFaultToleranceStrategy implements IFaultToleranceStrategy {
-
-    private static final Logger LOGGER = Logger.getLogger(NoFaultToleranceStrategy.class.getName());
-    IClusterStateManager clusterManager;
-    private String metadataNodeId;
-    private Set<String> pendingStartupCompletionNodes = new HashSet<>();
-    private ICCMessageBroker messageBroker;
-
-    @Override
-    public void notifyNodeJoin(String nodeId) throws HyracksDataException {
-        pendingStartupCompletionNodes.add(nodeId);
-    }
-
-    @Override
-    public void notifyNodeFailure(String nodeId) throws HyracksDataException {
-        pendingStartupCompletionNodes.remove(nodeId);
-        clusterManager.updateNodePartitions(nodeId, false);
-        if (nodeId.equals(metadataNodeId)) {
-            clusterManager.updateMetadataNode(metadataNodeId, false);
-        }
-        clusterManager.refreshState();
-    }
-
-    @Override
-    public void process(INCLifecycleMessage message) throws HyracksDataException {
-        switch (message.getType()) {
-            case STARTUP_TASK_REQUEST:
-                process((StartupTaskRequestMessage) message);
-                break;
-            case STARTUP_TASK_RESULT:
-                process((NCLifecycleTaskReportMessage) message);
-                break;
-            default:
-                throw new RuntimeDataException(ErrorCode.UNSUPPORTED_MESSAGE_TYPE, message.getType().name());
-        }
-    }
-
-    @Override
-    public IFaultToleranceStrategy from(ICCServiceContext serviceCtx, IReplicationStrategy replicationStrategy) {
-        NoFaultToleranceStrategy ft = new NoFaultToleranceStrategy();
-        ft.messageBroker = (ICCMessageBroker) serviceCtx.getMessageBroker();
-        return ft;
-    }
-
-    @Override
-    public void bindTo(IClusterStateManager clusterManager) {
-        this.clusterManager = clusterManager;
-        metadataNodeId = clusterManager.getCurrentMetadataNodeId();
-    }
-
-    private void process(StartupTaskRequestMessage msg) throws HyracksDataException {
-        final String nodeId = msg.getNodeId();
-        List<INCLifecycleTask> tasks = buildNCStartupSequence(msg.getNodeId(), msg.getState());
-        StartupTaskResponseMessage response = new StartupTaskResponseMessage(nodeId, tasks);
-        try {
-            messageBroker.sendApplicationMessageToNC(response, msg.getNodeId());
-        } catch (Exception e) {
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    private void process(NCLifecycleTaskReportMessage msg) throws HyracksDataException {
-        pendingStartupCompletionNodes.remove(msg.getNodeId());
-        if (msg.isSuccess()) {
-            clusterManager.updateNodePartitions(msg.getNodeId(), true);
-            if (msg.getNodeId().equals(metadataNodeId)) {
-                clusterManager.updateMetadataNode(metadataNodeId, true);
-            }
-            clusterManager.refreshState();
-        } else {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, msg.getNodeId() + " failed to complete startup. ", msg.getException());
-            }
-        }
-    }
-
-    private List<INCLifecycleTask> buildNCStartupSequence(String nodeId, SystemState state) {
-        final List<INCLifecycleTask> tasks = new ArrayList<>();
-        if (state == SystemState.CORRUPTED) {
-            //need to perform local recovery for node partitions
-            LocalRecoveryTask rt = new LocalRecoveryTask(Arrays.asList(clusterManager.getNodePartitions(nodeId))
-                    .stream().map(ClusterPartition::getPartitionId).collect(Collectors.toSet()));
-            tasks.add(rt);
-        }
-        final boolean isMetadataNode = nodeId.equals(metadataNodeId);
-        if (isMetadataNode) {
-            tasks.add(new MetadataBootstrapTask());
-        }
-        tasks.add(new ExternalLibrarySetupTask(isMetadataNode));
-        tasks.add(new ReportMaxResourceIdTask());
-        tasks.add(new CheckpointTask());
-        tasks.add(new StartLifecycleComponentsTask());
-        if (isMetadataNode) {
-            tasks.add(new BindMetadataNodeTask(true));
-        }
-        return tasks;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NodeFailbackPlan.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NodeFailbackPlan.java
deleted file mode 100644
index ab938d2..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/NodeFailbackPlan.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.app.replication.message.CompleteFailbackRequestMessage;
-import org.apache.asterix.app.replication.message.PreparePartitionsFailbackRequestMessage;
-import org.apache.asterix.app.replication.message.PreparePartitionsFailbackResponseMessage;
-
-public class NodeFailbackPlan {
-
-    public enum FailbackPlanState {
-        /**
-         * Initial state while selecting the nodes that will participate
-         * in the node failback plan.
-         */
-        PREPARING,
-        /**
-         * Once a pending {@link PreparePartitionsFailbackRequestMessage} request is added,
-         * the state is changed from PREPARING to PENDING_PARTICIPANT_REPONSE to indicate
-         * a response is expected and need to wait for it.
-         */
-        PENDING_PARTICIPANT_REPONSE,
-        /**
-         * Upon receiving the last {@link PreparePartitionsFailbackResponseMessage} response,
-         * the state changes from PENDING_PARTICIPANT_REPONSE to PENDING_COMPLETION to indicate
-         * the need to send {@link CompleteFailbackRequestMessage} to the failing back node.
-         */
-        PENDING_COMPLETION,
-        /**
-         * if any of the participants fail or the failing back node itself fails during
-         * and of these states (PREPARING, PENDING_PARTICIPANT_REPONSE, PENDING_COMPLETION),
-         * the state is changed to FAILED.
-         */
-        FAILED,
-        /**
-         * if the state is FAILED, and all pending responses (if any) have been received,
-         * the state changes from FAILED to PENDING_ROLLBACK to indicate the need to revert
-         * the effects of this plan (if any).
-         */
-        PENDING_ROLLBACK
-    }
-
-    private static long planIdGenerator = 0;
-    private long planId;
-    private final String nodeId;
-    private final Set<String> participants;
-    private final Map<Integer, String> partition2nodeMap;
-    private String nodeToReleaseMetadataManager;
-    private int requestId;
-    private Map<Integer, PreparePartitionsFailbackRequestMessage> pendingRequests;
-    private FailbackPlanState state;
-
-    public static NodeFailbackPlan createPlan(String nodeId) {
-        return new NodeFailbackPlan(planIdGenerator++, nodeId);
-    }
-
-    private NodeFailbackPlan(long planId, String nodeId) {
-        this.planId = planId;
-        this.nodeId = nodeId;
-        participants = new HashSet<>();
-        partition2nodeMap = new HashMap<>();
-        pendingRequests = new HashMap<>();
-        state = FailbackPlanState.PREPARING;
-    }
-
-    public synchronized void addPartitionToFailback(int partitionId, String currentActiveNode) {
-        partition2nodeMap.put(partitionId, currentActiveNode);
-    }
-
-    public synchronized void addParticipant(String nodeId) {
-        participants.add(nodeId);
-    }
-
-    public synchronized void notifyNodeFailure(String failedNode) {
-        if (participants.contains(failedNode)) {
-            if (state == FailbackPlanState.PREPARING) {
-                state = FailbackPlanState.FAILED;
-            } else if (state == FailbackPlanState.PENDING_PARTICIPANT_REPONSE) {
-                /**
-                 * if there is any pending request from this failed node,
-                 * it should be marked as completed and the plan should be marked as failed
-                 */
-                Set<Integer> failedRequests = new HashSet<>();
-                for (PreparePartitionsFailbackRequestMessage request : pendingRequests.values()) {
-                    if (request.getNodeID().equals(failedNode)) {
-                        failedRequests.add(request.getRequestId());
-                    }
-                }
-
-                if (!failedRequests.isEmpty()) {
-                    state = FailbackPlanState.FAILED;
-                    for (Integer failedRequestId : failedRequests) {
-                        markRequestCompleted(failedRequestId);
-                    }
-                }
-            }
-        } else if (nodeId.equals(failedNode)) {
-            //if the failing back node is the failed node itself
-            state = FailbackPlanState.FAILED;
-            updateState();
-        }
-    }
-
-    public synchronized Set<Integer> getPartitionsToFailback() {
-        return new HashSet<>(partition2nodeMap.keySet());
-    }
-
-    public synchronized void addPendingRequest(PreparePartitionsFailbackRequestMessage msg) {
-        //if this is the first request
-        if (pendingRequests.size() == 0) {
-            state = FailbackPlanState.PENDING_PARTICIPANT_REPONSE;
-        }
-        pendingRequests.put(msg.getRequestId(), msg);
-    }
-
-    public synchronized void markRequestCompleted(int requestId) {
-        pendingRequests.remove(requestId);
-        updateState();
-    }
-
-    private void updateState() {
-        if (pendingRequests.size() == 0) {
-            switch (state) {
-                case PREPARING:
-                case FAILED:
-                    state = FailbackPlanState.PENDING_ROLLBACK;
-                    break;
-                case PENDING_PARTICIPANT_REPONSE:
-                    state = FailbackPlanState.PENDING_COMPLETION;
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-
-    public synchronized Set<PreparePartitionsFailbackRequestMessage> getPlanFailbackRequests() {
-        Set<PreparePartitionsFailbackRequestMessage> node2Partitions = new HashSet<>();
-        /**
-         * for each participant, construct a request with the partitions
-         * that will be failed back or flushed.
-         */
-        for (String participant : participants) {
-            Set<Integer> partitionToPrepareForFailback = new HashSet<>();
-            partition2nodeMap.forEach((key, value) -> {
-                if (value.equals(participant)) {
-                    partitionToPrepareForFailback.add(key);
-                }
-            });
-            PreparePartitionsFailbackRequestMessage msg = new PreparePartitionsFailbackRequestMessage(planId,
-                    requestId++, participant, partitionToPrepareForFailback);
-            if (participant.equals(nodeToReleaseMetadataManager)) {
-                msg.setReleaseMetadataNode(true);
-            }
-            node2Partitions.add(msg);
-        }
-        return node2Partitions;
-    }
-
-    public synchronized CompleteFailbackRequestMessage getCompleteFailbackRequestMessage() {
-        return new CompleteFailbackRequestMessage(planId, requestId++, nodeId, getPartitionsToFailback());
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public long getPlanId() {
-        return planId;
-    }
-
-    public void setNodeToReleaseMetadataManager(String nodeToReleaseMetadataManager) {
-        this.nodeToReleaseMetadataManager = nodeToReleaseMetadataManager;
-    }
-
-    public synchronized FailbackPlanState getState() {
-        return state;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Plan ID: " + planId);
-        sb.append(" Failing back node: " + nodeId);
-        sb.append(" Participants: " + participants);
-        sb.append(" Partitions to Failback: " + partition2nodeMap.keySet());
-        return sb.toString();
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackRequestMessage.java
deleted file mode 100644
index feca7e8..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackRequestMessage.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.io.IOException;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.IRemoteRecoveryManager;
-import org.apache.asterix.runtime.message.AbstractFailbackPlanMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class CompleteFailbackRequestMessage extends AbstractFailbackPlanMessage implements INcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(CompleteFailbackRequestMessage.class.getName());
-    private final Set<Integer> partitions;
-    private final String nodeId;
-
-    public CompleteFailbackRequestMessage(long planId, int requestId, String nodeId, Set<Integer> partitions) {
-        super(planId, requestId);
-        this.nodeId = nodeId;
-        this.partitions = partitions;
-    }
-
-    public Set<Integer> getPartitions() {
-        return partitions;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(CompleteFailbackRequestMessage.class.getSimpleName());
-        sb.append(" Plan ID: " + planId);
-        sb.append(" Node ID: " + nodeId);
-        sb.append(" Partitions: " + partitions);
-        return sb.toString();
-    }
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        INCMessageBroker broker = (INCMessageBroker) appContext.getServiceContext().getMessageBroker();
-        HyracksDataException hde = null;
-        try {
-            IRemoteRecoveryManager remoteRecoeryManager = appContext.getRemoteRecoveryManager();
-            remoteRecoeryManager.completeFailbackProcess();
-        } catch (IOException | InterruptedException e) {
-            LOGGER.log(Level.SEVERE, "Failure during completion of failback process", e);
-            hde = HyracksDataException.create(e);
-        } finally {
-            CompleteFailbackResponseMessage reponse =
-                    new CompleteFailbackResponseMessage(planId, requestId, partitions);
-            try {
-                broker.sendMessageToCC(reponse);
-            } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Failure sending message to CC", e);
-                hde = HyracksDataException.suppress(hde, e);
-            }
-        }
-        if (hde != null) {
-            throw hde;
-        }
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.COMPLETE_FAILBACK_REQUEST;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackResponseMessage.java
deleted file mode 100644
index 0c5678f..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/CompleteFailbackResponseMessage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.Set;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.runtime.message.AbstractFailbackPlanMessage;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class CompleteFailbackResponseMessage extends AbstractFailbackPlanMessage implements ICcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final Set<Integer> partitions;
-
-    public CompleteFailbackResponseMessage(long planId, int requestId, Set<Integer> partitions) {
-        super(planId, requestId);
-        this.partitions = partitions;
-    }
-
-    public Set<Integer> getPartitions() {
-        return partitions;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(CompleteFailbackResponseMessage.class.getSimpleName());
-        sb.append(" Plan ID: " + planId);
-        sb.append(" Partitions: " + partitions);
-        return sb.toString();
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ((CcApplicationContext) appCtx).getFaultToleranceStrategy().process(this);
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.COMPLETE_FAILBACK_RESPONSE;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeRequestMessage.java
new file mode 100644
index 0000000..817bbe6
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeRequestMessage.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.replication.message;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.messaging.CcIdentifiedMessage;
+import org.apache.asterix.common.messaging.api.INCMessageBroker;
+import org.apache.asterix.common.messaging.api.INcAddressedMessage;
+import org.apache.asterix.common.replication.INCLifecycleMessage;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class MetadataNodeRequestMessage extends CcIdentifiedMessage
+        implements INCLifecycleMessage, INcAddressedMessage {
+
+    private static final long serialVersionUID = 1L;
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final boolean export;
+    private final int partitionId;
+
+    public MetadataNodeRequestMessage(boolean export, int partitionId) {
+        this.export = export;
+        this.partitionId = partitionId;
+    }
+
+    @Override
+    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
+        INCMessageBroker broker = (INCMessageBroker) appContext.getServiceContext().getMessageBroker();
+        HyracksDataException hde = null;
+        try {
+            if (export) {
+                appContext.initializeMetadata(false, partitionId);
+                appContext.exportMetadataNodeStub();
+                appContext.bindMetadataNodeStub(getCcId());
+            } else {
+                appContext.unexportMetadataNodeStub();
+            }
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Failed taking over metadata", e);
+            hde = HyracksDataException.create(e);
+        } finally {
+            MetadataNodeResponseMessage reponse =
+                    new MetadataNodeResponseMessage(appContext.getTransactionSubsystem().getId(), export);
+            try {
+                broker.sendMessageToCC(getCcId(), reponse);
+            } catch (Exception e) {
+                LOGGER.log(Level.ERROR, "Failed taking over metadata", e);
+                hde = HyracksDataException.suppress(hde, e);
+            }
+        }
+        if (hde != null) {
+            throw hde;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return MetadataNodeRequestMessage.class.getSimpleName();
+    }
+
+    @Override
+    public MessageType getType() {
+        return MessageType.METADATA_NODE_REQUEST;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeResponseMessage.java
new file mode 100644
index 0000000..815d878
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/MetadataNodeResponseMessage.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.replication.message;
+
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
+import org.apache.asterix.common.replication.INCLifecycleMessage;
+import org.apache.asterix.runtime.utils.CcApplicationContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class MetadataNodeResponseMessage implements INCLifecycleMessage, ICcAddressedMessage {
+
+    private static final long serialVersionUID = 1L;
+    private final String nodeId;
+    private final boolean exported;
+
+    public MetadataNodeResponseMessage(String nodeId, boolean exported) {
+        this.nodeId = nodeId;
+        this.exported = exported;
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    @Override
+    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        ((CcApplicationContext) appCtx).getNcLifecycleCoordinator().process(this);
+    }
+
+    @Override
+    public String toString() {
+        return MetadataNodeResponseMessage.class.getSimpleName();
+    }
+
+    @Override
+    public MessageType getType() {
+        return MessageType.METADATA_NODE_RESPONSE;
+    }
+
+    public boolean isExported() {
+        return exported;
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/NCLifecycleTaskReportMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/NCLifecycleTaskReportMessage.java
index 2b32e1f..5ac3a0c 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/NCLifecycleTaskReportMessage.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/NCLifecycleTaskReportMessage.java
@@ -37,7 +37,7 @@
 
     @Override
     public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        appCtx.getFaultToleranceStrategy().process(this);
+        appCtx.getNcLifecycleCoordinator().process(this);
     }
 
     public String getNodeId() {
@@ -58,6 +58,6 @@
 
     @Override
     public MessageType getType() {
-        return MessageType.STARTUP_TASK_RESULT;
+        return MessageType.REGISTRATION_TASKS_RESULT;
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackRequestMessage.java
deleted file mode 100644
index cefcf49..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackRequestMessage.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.rmi.RemoteException;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.runtime.message.AbstractFailbackPlanMessage;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class PreparePartitionsFailbackRequestMessage extends AbstractFailbackPlanMessage
-        implements INcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(PreparePartitionsFailbackRequestMessage.class.getName());
-    private final Set<Integer> partitions;
-    private boolean releaseMetadataNode = false;
-    private final String nodeID;
-
-    public PreparePartitionsFailbackRequestMessage(long planId, int requestId, String nodeId, Set<Integer> partitions) {
-        super(planId, requestId);
-        this.nodeID = nodeId;
-        this.partitions = partitions;
-    }
-
-    public Set<Integer> getPartitions() {
-        return partitions;
-    }
-
-    public boolean isReleaseMetadataNode() {
-        return releaseMetadataNode;
-    }
-
-    public void setReleaseMetadataNode(boolean releaseMetadataNode) {
-        this.releaseMetadataNode = releaseMetadataNode;
-    }
-
-    public String getNodeID() {
-        return nodeID;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(PreparePartitionsFailbackRequestMessage.class.getSimpleName());
-        sb.append(" Plan ID: " + planId);
-        sb.append(" Partitions: " + partitions);
-        sb.append(" releaseMetadataNode: " + releaseMetadataNode);
-        return sb.toString();
-    }
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        INCMessageBroker broker = (INCMessageBroker) appContext.getServiceContext().getMessageBroker();
-        /**
-         * if the metadata partition will be failed back
-         * we need to flush and close all datasets including metadata datasets
-         * otherwise we need to close all non-metadata datasets and flush metadata datasets
-         * so that their memory components will be copied to the failing back node
-         */
-        if (releaseMetadataNode) {
-            appContext.getDatasetLifecycleManager().closeAllDatasets();
-            //remove the metadata node stub from RMI registry
-            try {
-                appContext.unexportMetadataNodeStub();
-            } catch (RemoteException e) {
-                LOGGER.log(Level.SEVERE, "Failed unexporting metadata stub", e);
-                throw HyracksDataException.create(e);
-            }
-        } else {
-            //close all non-metadata datasets
-            appContext.getDatasetLifecycleManager().closeUserDatasets();
-            //flush the remaining metadata datasets that were not closed
-            appContext.getDatasetLifecycleManager().flushAllDatasets();
-        }
-
-        //mark the partitions to be closed as inactive
-        PersistentLocalResourceRepository localResourceRepo =
-                (PersistentLocalResourceRepository) appContext.getLocalResourceRepository();
-        for (Integer partitionId : partitions) {
-            localResourceRepo.addInactivePartition(partitionId);
-        }
-
-        //send response after partitions prepared for failback
-        PreparePartitionsFailbackResponseMessage reponse =
-                new PreparePartitionsFailbackResponseMessage(planId, requestId, partitions);
-        try {
-            broker.sendMessageToCC(reponse);
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failed sending message to cc", e);
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.PREPARE_FAILBACK_REQUEST;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackResponseMessage.java
deleted file mode 100644
index bea1039..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/PreparePartitionsFailbackResponseMessage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.Set;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.runtime.message.AbstractFailbackPlanMessage;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class PreparePartitionsFailbackResponseMessage extends AbstractFailbackPlanMessage
-        implements ICcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final Set<Integer> partitions;
-
-    public PreparePartitionsFailbackResponseMessage(long planId, int requestId, Set<Integer> partitions) {
-        super(planId, requestId);
-        this.partitions = partitions;
-    }
-
-    public Set<Integer> getPartitions() {
-        return partitions;
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ((CcApplicationContext) appCtx).getFaultToleranceStrategy().process(this);
-    }
-
-    @Override
-    public String toString() {
-        return PreparePartitionsFailbackResponseMessage.class.getSimpleName() + " " + partitions.toString();
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.PREPARE_FAILBACK_RESPONSE;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksRequestMessage.java
new file mode 100644
index 0000000..3c7182d
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksRequestMessage.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.replication.message;
+
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
+import org.apache.asterix.common.messaging.api.INCMessageBroker;
+import org.apache.asterix.common.replication.INCLifecycleMessage;
+import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
+import org.apache.hyracks.api.client.NodeStatus;
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class RegistrationTasksRequestMessage implements INCLifecycleMessage, ICcAddressedMessage {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final long serialVersionUID = 1L;
+    private final SystemState state;
+    private final String nodeId;
+    private final NodeStatus nodeStatus;
+
+    public RegistrationTasksRequestMessage(String nodeId, NodeStatus nodeStatus, SystemState state) {
+        this.state = state;
+        this.nodeId = nodeId;
+        this.nodeStatus = nodeStatus;
+    }
+
+    public static void send(CcId ccId, NodeControllerService cs, NodeStatus nodeStatus, SystemState systemState)
+            throws HyracksDataException {
+        try {
+            RegistrationTasksRequestMessage msg =
+                    new RegistrationTasksRequestMessage(cs.getId(), nodeStatus, systemState);
+            ((INCMessageBroker) cs.getContext().getMessageBroker()).sendMessageToCC(ccId, msg);
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Unable to send RegistrationTasksRequestMessage to CC", e);
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    @Override
+    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        appCtx.getNcLifecycleCoordinator().process(this);
+    }
+
+    public SystemState getState() {
+        return state;
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public NodeStatus getNodeStatus() {
+        return nodeStatus;
+    }
+
+    @Override
+    public MessageType getType() {
+        return MessageType.REGISTRATION_TASKS_REQUEST;
+    }
+
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksResponseMessage.java
new file mode 100644
index 0000000..a6f10ca
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/RegistrationTasksResponseMessage.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.replication.message;
+
+import java.util.List;
+
+import org.apache.asterix.common.api.INCLifecycleTask;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.messaging.CcIdentifiedMessage;
+import org.apache.asterix.common.messaging.api.INCMessageBroker;
+import org.apache.asterix.common.messaging.api.INcAddressedMessage;
+import org.apache.asterix.common.replication.INCLifecycleMessage;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.service.IControllerService;
+import org.apache.hyracks.control.nc.NCShutdownHook;
+import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class RegistrationTasksResponseMessage extends CcIdentifiedMessage
+        implements INCLifecycleMessage, INcAddressedMessage {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final long serialVersionUID = 1L;
+    private final String nodeId;
+    private final List<INCLifecycleTask> tasks;
+
+    public RegistrationTasksResponseMessage(String nodeId, List<INCLifecycleTask> tasks) {
+        this.nodeId = nodeId;
+        this.tasks = tasks;
+    }
+
+    @Override
+    public void handle(INcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        INCMessageBroker broker = (INCMessageBroker) appCtx.getServiceContext().getMessageBroker();
+        IControllerService cs = appCtx.getServiceContext().getControllerService();
+        boolean success = true;
+        try {
+            Throwable exception = null;
+            try {
+                for (INCLifecycleTask task : tasks) {
+                    if (LOGGER.isInfoEnabled()) {
+                        LOGGER.log(Level.INFO, "Starting startup task: " + task);
+                    }
+                    task.perform(getCcId(), cs);
+                    if (LOGGER.isInfoEnabled()) {
+                        LOGGER.log(Level.INFO, "Completed startup task: " + task);
+                    }
+                }
+            } catch (Throwable e) { //NOSONAR all startup failures should be reported to CC
+                LOGGER.log(Level.ERROR, "Failed during startup task", e);
+                success = false;
+                exception = e;
+            }
+            NCLifecycleTaskReportMessage result = new NCLifecycleTaskReportMessage(nodeId, success);
+            result.setException(exception);
+            try {
+                broker.sendMessageToCC(getCcId(), result);
+            } catch (Exception e) {
+                success = false;
+                LOGGER.log(Level.ERROR, "Failed sending message to cc", e);
+            }
+        } finally {
+            if (!success) {
+                // stop NC so that it can be started again
+                ExitUtil.exit(NCShutdownHook.FAILED_TO_STARTUP_EXIT_CODE);
+            }
+        }
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    @Override
+    public MessageType getType() {
+        return MessageType.REGISTRATION_TASKS_RESPONSE;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsRequestMessage.java
deleted file mode 100644
index c8e2479..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsRequestMessage.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-public class ReplayPartitionLogsRequestMessage implements INCLifecycleMessage, INcAddressedMessage {
-
-    private static final Logger LOGGER = Logger.getLogger(ReplayPartitionLogsRequestMessage.class.getName());
-    private static final long serialVersionUID = 1L;
-    private final Set<Integer> partitions;
-
-    public ReplayPartitionLogsRequestMessage(Set<Integer> partitions) {
-        this.partitions = partitions;
-    }
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        NodeControllerService ncs = (NodeControllerService) appContext.getServiceContext().getControllerService();
-        // Replay the logs for these partitions and flush any impacted dataset
-        appContext.getRemoteRecoveryManager().replayReplicaPartitionLogs(partitions, true);
-
-        INCMessageBroker broker = (INCMessageBroker) ncs.getContext().getMessageBroker();
-        ReplayPartitionLogsResponseMessage reponse = new ReplayPartitionLogsResponseMessage(ncs.getId(), partitions);
-        try {
-            broker.sendMessageToCC(reponse);
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failed sending message to cc", e);
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.REPLAY_LOGS_REQUEST;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsResponseMessage.java
deleted file mode 100644
index e05fd47..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/ReplayPartitionLogsResponseMessage.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.Set;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class ReplayPartitionLogsResponseMessage implements INCLifecycleMessage, ICcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final Set<Integer> partitions;
-    private final String nodeId;
-
-    public ReplayPartitionLogsResponseMessage(String nodeId, Set<Integer> partitions) {
-        this.partitions = partitions;
-        this.nodeId = nodeId;
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ((CcApplicationContext) appCtx).getFaultToleranceStrategy().process(this);
-    }
-
-    public Set<Integer> getPartitions() {
-        return partitions;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.REPLAY_LOGS_RESPONSE;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskRequestMessage.java
deleted file mode 100644
index 21dee9c..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskRequestMessage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-public class StartupTaskRequestMessage implements INCLifecycleMessage, ICcAddressedMessage {
-
-    private static final Logger LOGGER = Logger.getLogger(StartupTaskRequestMessage.class.getName());
-    private static final long serialVersionUID = 1L;
-    private final SystemState state;
-    private final String nodeId;
-
-    public StartupTaskRequestMessage(String nodeId, SystemState state) {
-        this.state = state;
-        this.nodeId = nodeId;
-    }
-
-    public static void send(NodeControllerService cs, SystemState systemState) throws HyracksDataException {
-        try {
-            StartupTaskRequestMessage msg = new StartupTaskRequestMessage(cs.getId(), systemState);
-            ((INCMessageBroker) cs.getContext().getMessageBroker()).sendMessageToCC(msg);
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Unable to send StartupTaskRequestMessage to CC", e);
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        appCtx.getFaultToleranceStrategy().process(this);
-    }
-
-    public SystemState getState() {
-        return state;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.STARTUP_TASK_REQUEST;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskResponseMessage.java
deleted file mode 100644
index b941343..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/StartupTaskResponseMessage.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INCLifecycleTask;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.service.IControllerService;
-import org.apache.hyracks.control.nc.NCShutdownHook;
-import org.apache.hyracks.util.ExitUtil;
-
-public class StartupTaskResponseMessage implements INCLifecycleMessage, INcAddressedMessage {
-
-    private static final Logger LOGGER = Logger.getLogger(StartupTaskResponseMessage.class.getName());
-    private static final long serialVersionUID = 1L;
-    private final String nodeId;
-    private final List<INCLifecycleTask> tasks;
-
-    public StartupTaskResponseMessage(String nodeId, List<INCLifecycleTask> tasks) {
-        this.nodeId = nodeId;
-        this.tasks = tasks;
-    }
-
-    @Override
-    public void handle(INcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        INCMessageBroker broker = (INCMessageBroker) appCtx.getServiceContext().getMessageBroker();
-        IControllerService cs = appCtx.getServiceContext().getControllerService();
-        boolean success = true;
-        try {
-            Throwable exception = null;
-            try {
-                for (INCLifecycleTask task : tasks) {
-                    if (LOGGER.isLoggable(Level.INFO)) {
-                        LOGGER.log(Level.INFO, "Starting startup task: " + task);
-                    }
-                    task.perform(cs);
-                    if (LOGGER.isLoggable(Level.INFO)) {
-                        LOGGER.log(Level.INFO, "Completed startup task: " + task);
-                    }
-                }
-            } catch (Throwable e) { //NOSONAR all startup failures should be reported to CC
-                LOGGER.log(Level.SEVERE, "Failed during startup task", e);
-                success = false;
-                exception = e;
-            }
-            NCLifecycleTaskReportMessage result = new NCLifecycleTaskReportMessage(nodeId, success);
-            result.setException(exception);
-            try {
-                broker.sendMessageToCC(result);
-            } catch (Exception e) {
-                success = false;
-                LOGGER.log(Level.SEVERE, "Failed sending message to cc", e);
-            }
-        } finally {
-            if (!success) {
-                // stop NC so that it can be started again
-                ExitUtil.exit(NCShutdownHook.FAILED_TO_STARTUP_EXIT_CODE);
-            }
-        }
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.STARTUP_TASK_RESPONSE;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeRequestMessage.java
deleted file mode 100644
index 2137924..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeRequestMessage.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class TakeoverMetadataNodeRequestMessage implements INCLifecycleMessage, INcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(TakeoverMetadataNodeRequestMessage.class.getName());
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        INCMessageBroker broker = (INCMessageBroker) appContext.getServiceContext().getMessageBroker();
-        HyracksDataException hde = null;
-        try {
-            appContext.initializeMetadata(false);
-            appContext.exportMetadataNodeStub();
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failed taking over metadata", e);
-            hde = HyracksDataException.create(e);
-        } finally {
-            TakeoverMetadataNodeResponseMessage reponse =
-                    new TakeoverMetadataNodeResponseMessage(appContext.getTransactionSubsystem().getId());
-            try {
-                broker.sendMessageToCC(reponse);
-            } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Failed taking over metadata", e);
-                hde = HyracksDataException.suppress(hde, e);
-            }
-        }
-        if (hde != null) {
-            throw hde;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TakeoverMetadataNodeRequestMessage.class.getSimpleName();
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.TAKEOVER_METADATA_NODE_REQUEST;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeResponseMessage.java
deleted file mode 100644
index ff1b2d2..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverMetadataNodeResponseMessage.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class TakeoverMetadataNodeResponseMessage implements INCLifecycleMessage, ICcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final String nodeId;
-
-    public TakeoverMetadataNodeResponseMessage(String nodeId) {
-        this.nodeId = nodeId;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ((CcApplicationContext) appCtx).getFaultToleranceStrategy().process(this);
-    }
-
-    @Override
-    public String toString() {
-        return TakeoverMetadataNodeResponseMessage.class.getSimpleName();
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.TAKEOVER_METADATA_NODE_RESPONSE;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsRequestMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsRequestMessage.java
deleted file mode 100644
index ea9ac55..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsRequestMessage.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.common.replication.IRemoteRecoveryManager;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class TakeoverPartitionsRequestMessage implements INCLifecycleMessage, INcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(TakeoverPartitionsRequestMessage.class.getName());
-    private final Integer[] partitions;
-    private final long requestId;
-    private final String nodeId;
-
-    public TakeoverPartitionsRequestMessage(long requestId, String nodeId, Integer[] partitionsToTakeover) {
-        this.requestId = requestId;
-        this.nodeId = nodeId;
-        this.partitions = partitionsToTakeover;
-    }
-
-    public Integer[] getPartitions() {
-        return partitions;
-    }
-
-    public long getRequestId() {
-        return requestId;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(TakeoverPartitionsRequestMessage.class.getSimpleName());
-        sb.append(" Request ID: " + requestId);
-        sb.append(" Node ID: " + nodeId);
-        sb.append(" Partitions: ");
-        for (Integer partitionId : partitions) {
-            sb.append(partitionId + ",");
-        }
-        //remove last comma
-        sb.charAt(sb.length() - 1);
-        return sb.toString();
-    }
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        INCMessageBroker broker = (INCMessageBroker) appContext.getServiceContext().getMessageBroker();
-        //if the NC is shutting down, it should ignore takeover partitions request
-        if (!appContext.isShuttingdown()) {
-            HyracksDataException hde = null;
-            try {
-                IRemoteRecoveryManager remoteRecoeryManager = appContext.getRemoteRecoveryManager();
-                remoteRecoeryManager.takeoverPartitons(partitions);
-            } catch (IOException | ACIDException e) {
-                LOGGER.log(Level.SEVERE, "Failure taking over partitions", e);
-                hde = HyracksDataException.suppress(hde, e);
-            } finally {
-                //send response after takeover is completed
-                TakeoverPartitionsResponseMessage reponse = new TakeoverPartitionsResponseMessage(requestId,
-                        appContext.getTransactionSubsystem().getId(), partitions);
-                try {
-                    broker.sendMessageToCC(reponse);
-                } catch (Exception e) {
-                    LOGGER.log(Level.SEVERE, "Failure taking over partitions", e);
-                    hde = HyracksDataException.suppress(hde, e);
-                }
-            }
-            if (hde != null) {
-                throw hde;
-            }
-        }
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.TAKEOVER_PARTITION_REQUEST;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsResponseMessage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsResponseMessage.java
deleted file mode 100644
index d9484f9..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/replication/message/TakeoverPartitionsResponseMessage.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.replication.message;
-
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.common.replication.INCLifecycleMessage;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class TakeoverPartitionsResponseMessage implements INCLifecycleMessage, ICcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final Integer[] partitions;
-    private final String nodeId;
-    private final long requestId;
-
-    public TakeoverPartitionsResponseMessage(long requestId, String nodeId, Integer[] partitionsToTakeover) {
-        this.requestId = requestId;
-        this.nodeId = nodeId;
-        this.partitions = partitionsToTakeover;
-    }
-
-    public Integer[] getPartitions() {
-        return partitions;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public long getRequestId() {
-        return requestId;
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ((CcApplicationContext) appCtx).getFaultToleranceStrategy().process(this);
-    }
-
-    @Override
-    public String toString() {
-        return TakeoverPartitionsResponseMessage.class.getSimpleName();
-    }
-
-    @Override
-    public MessageType getType() {
-        return MessageType.TAKEOVER_PARTITION_RESPONSE;
-    }
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/OperatorResourcesComputer.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/OperatorResourcesComputer.java
new file mode 100644
index 0000000..7eaaa3d
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/OperatorResourcesComputer.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.resource;
+
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IPhysicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator;
+
+public class OperatorResourcesComputer {
+
+    public static final int MIN_OPERATOR_CORES = 1;
+    private static final long MAX_BUFFER_PER_CONNECTION = 1L;
+
+    private final int numComputationPartitions;
+    private final long groupByMemorySize;
+    private final long joinMemorySize;
+    private final long sortMemorySize;
+    private final long frameSize;
+
+    public OperatorResourcesComputer(int numComputationPartitions, int sortFrameLimit, int groupFrameLimit,
+            int joinFrameLimit, long frameSize) {
+        this.numComputationPartitions = numComputationPartitions;
+        this.groupByMemorySize = groupFrameLimit * frameSize;
+        this.joinMemorySize = joinFrameLimit * frameSize;
+        this.sortMemorySize = sortFrameLimit * frameSize;
+        this.frameSize = frameSize;
+    }
+
+    public int getOperatorRequiredCores(ILogicalOperator operator) {
+        if (operator.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.PARTITIONED
+                || operator.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.LOCAL) {
+            return numComputationPartitions;
+        }
+        return MIN_OPERATOR_CORES;
+    }
+
+    public long getOperatorRequiredMemory(ILogicalOperator operator) {
+        switch (operator.getOperatorTag()) {
+            case AGGREGATE:
+            case ASSIGN:
+            case DATASOURCESCAN:
+            case DISTINCT:
+            case DISTRIBUTE_RESULT:
+            case EMPTYTUPLESOURCE:
+            case DELEGATE_OPERATOR:
+            case EXTERNAL_LOOKUP:
+            case LEFT_OUTER_UNNEST_MAP:
+            case LIMIT:
+            case MATERIALIZE:
+            case NESTEDTUPLESOURCE:
+            case PROJECT:
+            case REPLICATE:
+            case RUNNINGAGGREGATE:
+            case SCRIPT:
+            case SELECT:
+            case SINK:
+            case SPLIT:
+            case SUBPLAN:
+            case TOKENIZE:
+            case UNIONALL:
+            case UNNEST:
+            case LEFT_OUTER_UNNEST:
+            case UNNEST_MAP:
+            case UPDATE:
+            case WRITE:
+            case WRITE_RESULT:
+            case INDEX_INSERT_DELETE_UPSERT:
+            case INSERT_DELETE_UPSERT:
+            case INTERSECT:
+                return getOperatorRequiredMemory(operator, frameSize);
+            case EXCHANGE:
+                return getExchangeRequiredMemory((ExchangeOperator) operator);
+            case GROUP:
+                return getOperatorRequiredMemory(operator, groupByMemorySize);
+            case ORDER:
+                return getOperatorRequiredMemory(operator, sortMemorySize);
+            case INNERJOIN:
+            case LEFTOUTERJOIN:
+                return getOperatorRequiredMemory(operator, joinMemorySize);
+            default:
+                throw new IllegalStateException("Unrecognized operator: " + operator.getOperatorTag());
+        }
+    }
+
+    private long getOperatorRequiredMemory(ILogicalOperator op, long memorySize) {
+        if (op.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.PARTITIONED
+                || op.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.LOCAL) {
+            return memorySize * numComputationPartitions;
+        }
+        return memorySize;
+    }
+
+    private long getExchangeRequiredMemory(ExchangeOperator op) {
+        final IPhysicalOperator physicalOperator = op.getPhysicalOperator();
+        final PhysicalOperatorTag physicalOperatorTag = physicalOperator.getOperatorTag();
+        if (physicalOperatorTag == PhysicalOperatorTag.ONE_TO_ONE_EXCHANGE
+                || physicalOperatorTag == PhysicalOperatorTag.SORT_MERGE_EXCHANGE) {
+            return getOperatorRequiredMemory(op, frameSize);
+        }
+        return 2L * MAX_BUFFER_PER_CONNECTION * numComputationPartitions * numComputationPartitions * frameSize;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStage.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStage.java
new file mode 100644
index 0000000..1e623c5
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStage.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.resource;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+
+public class PlanStage {
+
+    private final Set<ILogicalOperator> operators = new HashSet<>();
+    private final int stageId;
+
+    PlanStage(int stageId) {
+        this.stageId = stageId;
+    }
+
+    @Override
+    public String toString() {
+        return "Stage{" + "stageId=" + stageId + ", operators(" + operators.size() + ")" + "=" + operators + '}';
+    }
+
+    public Set<ILogicalOperator> getOperators() {
+        return operators;
+    }
+
+    public long getRequiredMemory(OperatorResourcesComputer resourcesComputer) {
+        return operators.stream().mapToLong(resourcesComputer::getOperatorRequiredMemory).sum();
+    }
+
+    public int getRequiredCores(OperatorResourcesComputer resourcesComputer) {
+        return operators.stream().mapToInt(resourcesComputer::getOperatorRequiredCores).max()
+                .orElse(OperatorResourcesComputer.MIN_OPERATOR_CORES);
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStagesGenerator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStagesGenerator.java
new file mode 100644
index 0000000..8b32375
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/PlanStagesGenerator.java
@@ -0,0 +1,427 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.app.resource;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractReplicateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AggregateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DelegateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DistinctOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DistributeResultOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.EmptyTupleSourceOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IndexInsertDeleteUpsertOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.InsertDeleteUpsertOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IntersectOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestMapOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterUnnestOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.RunningAggregateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ScriptOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.SinkOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.SplitOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.TokenizeOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteResultOperator;
+import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalOperatorVisitor;
+import org.apache.hyracks.util.annotations.NotThreadSafe;
+
+@NotThreadSafe
+public class PlanStagesGenerator implements ILogicalOperatorVisitor<Void, Void> {
+
+    private static final int JOIN_FIRST_INPUT = 1;
+    private static final int JOIN_SECOND_INPUT = 2;
+    private final Set<ILogicalOperator> visitedOperators = new HashSet<>();
+    private final LinkedList<ILogicalOperator> pendingBlockingOperators = new LinkedList<>();
+    private final List<PlanStage> stages = new ArrayList<>();
+    private PlanStage currentStage;
+    private int stageCounter;
+
+    public PlanStagesGenerator() {
+        currentStage = new PlanStage(++stageCounter);
+        stages.add(currentStage);
+    }
+
+    @Override
+    public Void visitAggregateOperator(AggregateOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitRunningAggregateOperator(RunningAggregateOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitEmptyTupleSourceOperator(EmptyTupleSourceOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitGroupByOperator(GroupByOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitLimitOperator(LimitOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitInnerJoinOperator(InnerJoinOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitLeftOuterJoinOperator(LeftOuterJoinOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitNestedTupleSourceOperator(NestedTupleSourceOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitOrderOperator(OrderOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitAssignOperator(AssignOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitSelectOperator(SelectOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitDelegateOperator(DelegateOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitProjectOperator(ProjectOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitReplicateOperator(ReplicateOperator op, Void arg) throws AlgebricksException {
+        // Makes sure that the downstream of a replicate operator is only visited once.
+        if (!visitedOperators.contains(op)) {
+            visitedOperators.add(op);
+            visit(op);
+        } else {
+            merge(op);
+        }
+        return null;
+    }
+
+    @Override
+    public Void visitSplitOperator(SplitOperator op, Void arg) throws AlgebricksException {
+        // Makes sure that the downstream of a split operator is only visited once.
+        if (!visitedOperators.contains(op)) {
+            visitedOperators.add(op);
+            visit(op);
+        } else {
+            merge(op);
+        }
+        return null;
+    }
+
+    @Override
+    public Void visitMaterializeOperator(MaterializeOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitScriptOperator(ScriptOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitSubplanOperator(SubplanOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitSinkOperator(SinkOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitUnionOperator(UnionAllOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitIntersectOperator(IntersectOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitUnnestOperator(UnnestOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitLeftOuterUnnestOperator(LeftOuterUnnestOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitUnnestMapOperator(UnnestMapOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitLeftOuterUnnestMapOperator(LeftOuterUnnestMapOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitDataScanOperator(DataSourceScanOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitDistinctOperator(DistinctOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitExchangeOperator(ExchangeOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitWriteOperator(WriteOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitDistributeResultOperator(DistributeResultOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitWriteResultOperator(WriteResultOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitIndexInsertDeleteUpsertOperator(IndexInsertDeleteUpsertOperator op, Void arg)
+            throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    @Override
+    public Void visitTokenizeOperator(TokenizeOperator op, Void arg) throws AlgebricksException {
+        visit(op);
+        return null;
+    }
+
+    public List<PlanStage> getStages() {
+        return stages;
+    }
+
+    private void visit(ILogicalOperator op) throws AlgebricksException {
+        addToStage(op);
+        if (!pendingBlockingOperators.isEmpty()) {
+            final ILogicalOperator firstPending = pendingBlockingOperators.pop();
+            visitBlocking(firstPending);
+        }
+    }
+
+    private void visitBlocking(ILogicalOperator blockingOp) throws AlgebricksException {
+        final PlanStage blockingOpStage = new PlanStage(++stageCounter);
+        blockingOpStage.getOperators().add(blockingOp);
+        stages.add(blockingOpStage);
+        currentStage = blockingOpStage;
+        switch (blockingOp.getOperatorTag()) {
+            case INNERJOIN:
+            case LEFTOUTERJOIN:
+                // visit only the second input
+                ILogicalOperator joinSecondInput = getJoinOperatorInput(blockingOp, JOIN_SECOND_INPUT);
+                joinSecondInput.accept(this, null);
+                break;
+            case GROUP:
+            case ORDER:
+                visitInputs(blockingOp);
+                break;
+            default:
+                throw new IllegalStateException("Unrecognized blocking operator: " + blockingOp.getOperatorTag());
+        }
+    }
+
+    private void addToStage(ILogicalOperator op) throws AlgebricksException {
+        currentStage.getOperators().add(op);
+        switch (op.getOperatorTag()) {
+            case INNERJOIN:
+            case LEFTOUTERJOIN:
+                pendingBlockingOperators.add(op);
+                // continue on the same stage
+                final ILogicalOperator joinFirstInput = getJoinOperatorInput(op, JOIN_FIRST_INPUT);
+                joinFirstInput.accept(this, null);
+                break;
+            case GROUP:
+                if (isBlockingGroupBy((GroupByOperator) op)) {
+                    pendingBlockingOperators.add(op);
+                    return;
+                }
+                // continue on the same stage
+                visitInputs(op);
+                break;
+            case ORDER:
+                pendingBlockingOperators.add(op);
+                break;
+            default:
+                visitInputs(op);
+                break;
+        }
+    }
+
+    private void visitInputs(ILogicalOperator op) throws AlgebricksException {
+        if (isMaterialized(op)) {
+            // don't visit the inputs of this operator since it is supposed to be blocking due to materialization.
+            // some other non-blocking operator will visit those inputs when reached.
+            return;
+        }
+        for (Mutable<ILogicalOperator> inputOpRef : op.getInputs()) {
+            inputOpRef.getValue().accept(this, null);
+        }
+    }
+
+    private boolean isBlockingGroupBy(GroupByOperator op) {
+        return op.getPhysicalOperator().getOperatorTag() == PhysicalOperatorTag.EXTERNAL_GROUP_BY
+                || op.getPhysicalOperator().getOperatorTag() == PhysicalOperatorTag.SORT_GROUP_BY;
+    }
+
+    /**
+     * Checks whether the operator {@code op} is supposed to be materialized
+     * due to a replicate/split operators.
+     *
+     * @param op
+     * @return true if the operator will be materialized. Otherwise false
+     */
+    private boolean isMaterialized(ILogicalOperator op) {
+        for (Mutable<ILogicalOperator> inputOpRef : op.getInputs()) {
+            final ILogicalOperator inputOp = inputOpRef.getValue();
+            final LogicalOperatorTag inputOpTag = inputOp.getOperatorTag();
+            if (inputOpTag == LogicalOperatorTag.REPLICATE || inputOpTag == LogicalOperatorTag.SPLIT) {
+                final AbstractReplicateOperator replicateOperator = (AbstractReplicateOperator) inputOp;
+                if (replicateOperator.isMaterialized(op)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private ILogicalOperator getJoinOperatorInput(ILogicalOperator op, int inputNum) {
+        if (inputNum != JOIN_FIRST_INPUT && inputNum != JOIN_SECOND_INPUT) {
+            throw new IllegalArgumentException("invalid input number for join operator");
+        }
+        final List<Mutable<ILogicalOperator>> inputs = op.getInputs();
+        if (inputs.size() != 2) {
+            throw new IllegalStateException("Join must have exactly two inputs. Current inputs: " + inputs.size());
+        }
+        return op.getInputs().get(inputNum - 1).getValue();
+    }
+
+    /**
+     * Merges all operators on the current stage to the stage on which {@code op} appeared.
+     *
+     * @param op
+     */
+    private void merge(ILogicalOperator op) {
+        // all operators in this stage belong to the stage of the already visited op
+        for (PlanStage stage : stages) {
+            if (stage != currentStage && stage.getOperators().contains(op)) {
+                stage.getOperators().addAll(currentStage.getOperators());
+                stages.remove(currentStage);
+                currentStage = stage;
+                break;
+            }
+        }
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/RequiredCapacityVisitor.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/RequiredCapacityVisitor.java
index 3a6bfee..89fbcb2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/RequiredCapacityVisitor.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/resource/RequiredCapacityVisitor.java
@@ -314,8 +314,8 @@
             addOutputBuffer(op);
             return;
         }
-        stageMemorySoFar += 2L * MAX_BUFFER_PER_CONNECTION * numComputationPartitions * numComputationPartitions
-                * frameSize;
+        stageMemorySoFar +=
+                2L * MAX_BUFFER_PER_CONNECTION * numComputationPartitions * numComputationPartitions * frameSize;
         clusterCapacity.setAggregatedMemoryByteSize(stageMemorySoFar);
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
index e45df8b..335899c 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/QueryTranslator.java
@@ -36,11 +36,11 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActivityState;
 import org.apache.asterix.active.EntityId;
@@ -58,7 +58,6 @@
 import org.apache.asterix.app.result.ResultReader;
 import org.apache.asterix.common.api.IMetadataLockManager;
 import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.ExternalFilePendingOp;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
@@ -85,7 +84,11 @@
 import org.apache.asterix.lang.common.base.IRewriterFactory;
 import org.apache.asterix.lang.common.base.IStatementRewriter;
 import org.apache.asterix.lang.common.base.Statement;
+import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.IndexedTypeExpression;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.lang.common.literal.StringLiteral;
 import org.apache.asterix.lang.common.statement.CompactStatement;
 import org.apache.asterix.lang.common.statement.ConnectFeedStatement;
 import org.apache.asterix.lang.common.statement.CreateDataverseStatement;
@@ -121,6 +124,9 @@
 import org.apache.asterix.lang.common.statement.TypeDropStatement;
 import org.apache.asterix.lang.common.statement.WriteStatement;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.common.util.FunctionUtil;
+import org.apache.asterix.lang.common.util.MergePolicyUtils;
 import org.apache.asterix.lang.sqlpp.rewrites.SqlppRewriterFactory;
 import org.apache.asterix.metadata.IDatasetDetails;
 import org.apache.asterix.metadata.MetadataManager;
@@ -205,6 +211,9 @@
 import org.apache.hyracks.control.common.job.profiling.om.JobletProfile;
 import org.apache.hyracks.control.common.job.profiling.om.TaskProfile;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /*
  * Provides functionality for executing a batch of Query statements (queries included)
@@ -212,7 +221,7 @@
  */
 public class QueryTranslator extends AbstractLangTranslator implements IStatementExecutor {
 
-    private static final Logger LOGGER = Logger.getLogger(QueryTranslator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final boolean IS_DEBUG_MODE = false;// true
     protected final List<Statement> statements;
@@ -265,15 +274,18 @@
         FileSplit outputFile = null;
         IAWriterFactory writerFactory = PrinterBasedWriterFactory.INSTANCE;
         IResultSerializerFactoryProvider resultSerializerFactoryProvider = ResultSerializerFactoryProvider.INSTANCE;
-        /* Since the system runs a large number of threads, when HTTP requests don't return, it becomes difficult to
-         * find the thread running the request to determine where it has stopped.
-         * Setting the thread name helps make that easier
+        /*
+         * Since the system runs a large number of threads, when HTTP requests don't
+         * return, it becomes difficult to find the thread running the request to
+         * determine where it has stopped. Setting the thread name helps make that
+         * easier
          */
         String threadName = Thread.currentThread().getName();
         Thread.currentThread().setName(QueryTranslator.class.getSimpleName());
         Map<String, String> config = new HashMap<>();
         final IHyracksDataset hdc = requestParameters.getHyracksDataset();
-        final ResultDelivery resultDelivery = requestParameters.getResultDelivery();
+        final ResultDelivery resultDelivery = requestParameters.getResultProperties().getDelivery();
+        final long maxResultReads = requestParameters.getResultProperties().getMaxReads();
         final Stats stats = requestParameters.getStats();
         final ResultMetadata outMetadata = requestParameters.getOutMetadata();
         final String clientContextId = requestParameters.getClientContextId();
@@ -341,6 +353,7 @@
                             metadataProvider.setResultSetId(new ResultSetId(resultSetIdCounter++));
                             metadataProvider.setResultAsyncMode(resultDelivery == ResultDelivery.ASYNC
                                     || resultDelivery == ResultDelivery.DEFERRED);
+                            metadataProvider.setMaxResultReads(maxResultReads);
                         }
                         handleInsertUpsertStatement(metadataProvider, stmt, hcc, hdc, resultDelivery, outMetadata,
                                 stats, false, clientContextId);
@@ -376,6 +389,7 @@
                         metadataProvider.setResultSetId(new ResultSetId(resultSetIdCounter++));
                         metadataProvider.setResultAsyncMode(
                                 resultDelivery == ResultDelivery.ASYNC || resultDelivery == ResultDelivery.DEFERRED);
+                        metadataProvider.setMaxResultReads(maxResultReads);
                         handleQuery(metadataProvider, (Query) stmt, hcc, hdc, resultDelivery, outMetadata, stats,
                                 clientContextId, ctx);
                         break;
@@ -397,8 +411,8 @@
                         // No op
                         break;
                     case Statement.Kind.EXTENSION:
-                        ((IExtensionStatement) stmt)
-                                .handle(hcc, this, requestParameters, metadataProvider, resultSetIdCounter);
+                        ((IExtensionStatement) stmt).handle(hcc, this, requestParameters, metadataProvider,
+                                resultSetIdCounter);
                         break;
                     default:
                         throw new CompilationException("Unknown function");
@@ -527,8 +541,6 @@
         String compactionPolicy = dd.getCompactionPolicy();
         Map<String, String> compactionPolicyProperties = dd.getCompactionPolicyProperties();
         boolean defaultCompactionPolicy = compactionPolicy == null;
-        boolean temp = dd.getDatasetDetailsDecl().isTemp();
-
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         boolean bActiveTxn = true;
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
@@ -600,7 +612,7 @@
                     }
                     datasetDetails = new InternalDatasetDetails(InternalDatasetDetails.FileStructure.BTREE,
                             InternalDatasetDetails.PartitioningStrategy.HASH, partitioningExprs, partitioningExprs,
-                            keySourceIndicators, partitioningTypes, autogenerated, filterField, temp);
+                            keySourceIndicators, partitioningTypes, autogenerated, filterField);
                     break;
                 case EXTERNAL:
                     String adapter = ((ExternalDetailsDecl) dd.getDatasetDetailsDecl()).getAdapter();
@@ -641,7 +653,8 @@
                 metadataProvider.setMetadataTxnContext(mdTxnCtx);
             }
 
-            // #. add a new dataset with PendingNoOp after deleting the dataset with PendingAddOp
+            // #. add a new dataset with PendingNoOp after deleting the dataset with
+            // PendingAddOp
             MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(), dataverseName, datasetName);
             dataset.setPendingOp(MetadataUtil.PENDING_NO_OP);
             MetadataManager.INSTANCE.addDataset(metadataProvider.getMetadataTxnContext(), dataset);
@@ -656,7 +669,8 @@
                 // #. execute compensation operations
                 // remove the index in NC
                 // [Notice]
-                // As long as we updated(and committed) metadata, we should remove any effect of the job
+                // As long as we updated(and committed) metadata, we should remove any effect of
+                // the job
                 // because an exception occurs during runJob.
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 bActiveTxn = true;
@@ -740,7 +754,7 @@
         return DatasetUtil.createNodeGroupForNewDataset(dataverseName, datasetName, selectedNodes, metadataProvider);
     }
 
-    protected void handleCreateIndexStatement(MetadataProvider metadataProvider, Statement stmt,
+    public void handleCreateIndexStatement(MetadataProvider metadataProvider, Statement stmt,
             IHyracksClientConnection hcc, IRequestParameters requestParameters) throws Exception {
         CreateIndexStatement stmtCreateIndex = (CreateIndexStatement) stmt;
         String dataverseName = getActiveDataverse(stmtCreateIndex.getDataverseName());
@@ -790,9 +804,11 @@
             int keyIndex = 0;
             boolean overridesFieldTypes = false;
 
-            // this set is used to detect duplicates in the specified keys in the create index statement
+            // this set is used to detect duplicates in the specified keys in the create
+            // index statement
             // e.g. CREATE INDEX someIdx on dataset(id,id).
-            // checking only the names is not enough. Need also to check the source indicators for cases like:
+            // checking only the names is not enough. Need also to check the source
+            // indicators for cases like:
             // CREATE INDEX someIdx on dataset(meta().id, id)
             Set<Pair<List<String>, Integer>> indexKeysSet = new HashSet<>();
 
@@ -820,10 +836,11 @@
                         throw new AsterixException(ErrorCode.INDEX_ILLEGAL_ENFORCED_NON_OPTIONAL,
                                 String.valueOf(fieldExpr.first));
                     }
-                    // don't allow creating an enforced index on a closed-type field, fields that are part of schema.
+                    // don't allow creating an enforced index on a closed-type field, fields that
+                    // are part of schema.
                     // get the field type, if it's not null, then the field is closed-type
-                    if (stmtCreateIndex.isEnforced() &&
-                            subType.getSubFieldType(fieldExpr.first.subList(i, fieldExpr.first.size())) != null) {
+                    if (stmtCreateIndex.isEnforced()
+                            && subType.getSubFieldType(fieldExpr.first.subList(i, fieldExpr.first.size())) != null) {
                         throw new AsterixException(ErrorCode.INDEX_ILLEGAL_ENFORCED_ON_CLOSED_FIELD,
                                 String.valueOf(fieldExpr.first));
                     }
@@ -845,9 +862,10 @@
                             "Unknown type " + (fieldExpr.second == null ? fieldExpr.first : fieldExpr.second));
                 }
 
-                // try to add the key & its source to the set of keys, if key couldn't be added, there is a duplicate
-                if (!indexKeysSet.add(new Pair<>(fieldExpr.first,
-                        stmtCreateIndex.getFieldSourceIndicators().get(keyIndex)))) {
+                // try to add the key & its source to the set of keys, if key couldn't be added,
+                // there is a duplicate
+                if (!indexKeysSet
+                        .add(new Pair<>(fieldExpr.first, stmtCreateIndex.getFieldSourceIndicators().get(keyIndex)))) {
                     throw new AsterixException(ErrorCode.INDEX_ILLEGAL_REPETITIVE_FIELD,
                             String.valueOf(fieldExpr.first));
                 }
@@ -859,9 +877,11 @@
 
             validateIndexKeyFields(stmtCreateIndex, keySourceIndicators, aRecordType, metaRecordType, indexFields,
                     indexFieldTypes);
-            // Checks whether a user is trying to create an inverted secondary index on a dataset
+            // Checks whether a user is trying to create an inverted secondary index on a
+            // dataset
             // with a variable-length primary key.
-            // Currently, we do not support this. Therefore, as a temporary solution, we print an
+            // Currently, we do not support this. Therefore, as a temporary solution, we
+            // print an
             // error message and stop.
             if (stmtCreateIndex.getIndexType() == IndexType.SINGLE_PARTITION_WORD_INVIX
                     || stmtCreateIndex.getIndexType() == IndexType.SINGLE_PARTITION_NGRAM_INVIX
@@ -993,8 +1013,13 @@
             // #. create the index artifact in NC.
             runJob(hcc, spec, jobFlags);
 
-            // #. flush the internal dataset for correlated policy
-            if (ds.isCorrelated() && ds.getDatasetType() == DatasetType.INTERNAL) {
+            // #. flush the internal dataset
+            // We need this to guarantee the correctness of component Id acceleration for
+            // secondary-to-primary index.
+            // Otherwise, the new secondary index component would corresponding to a partial
+            // memory component
+            // of the primary index, which is incorrect.
+            if (ds.getDatasetType() == DatasetType.INTERNAL) {
                 FlushDatasetUtil.flushDataset(hcc, metadataProvider, index.getDataverseName(), index.getDatasetName());
             }
 
@@ -1014,7 +1039,8 @@
             bActiveTxn = true;
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
 
-            // #. add another new index with PendingNoOp after deleting the index with PendingAddOp
+            // #. add another new index with PendingNoOp after deleting the index with
+            // PendingAddOp
             MetadataManager.INSTANCE.dropIndex(metadataProvider.getMetadataTxnContext(), index.getDataverseName(),
                     index.getDatasetName(), index.getIndexName());
             index.setPendingOp(MetadataUtil.PENDING_NO_OP);
@@ -1035,7 +1061,8 @@
             if (bActiveTxn) {
                 abort(e, e, mdTxnCtx);
             }
-            // If files index was replicated for external dataset, it should be cleaned up on NC side
+            // If files index was replicated for external dataset, it should be cleaned up
+            // on NC side
             if (filesIndexReplicated) {
                 mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                 bActiveTxn = true;
@@ -1655,9 +1682,9 @@
 
     protected void handleCreateFunctionStatement(MetadataProvider metadataProvider, Statement stmt) throws Exception {
         CreateFunctionStatement cfs = (CreateFunctionStatement) stmt;
-        String dataverse = getActiveDataverseName(cfs.getSignature().getNamespace());
-        cfs.getSignature().setNamespace(dataverse);
-        String functionName = cfs.getaAterixFunction().getName();
+        String dataverse = getActiveDataverseName(cfs.getFunctionSignature().getNamespace());
+        cfs.getFunctionSignature().setNamespace(dataverse);
+        String functionName = cfs.getFunctionSignature().getName();
 
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
@@ -1668,10 +1695,26 @@
             if (dv == null) {
                 throw new AlgebricksException("There is no dataverse with this name " + dataverse + ".");
             }
-            Function function = new Function(dataverse, functionName, cfs.getaAterixFunction().getArity(),
+
+            //Check whether the function is use-able
+            metadataProvider.setDefaultDataverse(dv);
+            Query wrappedQuery = new Query(false);
+            wrappedQuery.setBody(cfs.getFunctionBodyExpression());
+            wrappedQuery.setTopLevel(false);
+            List<VarIdentifier> varIds = new ArrayList<>();
+            for (String v : cfs.getParamList()) {
+                varIds.add(new VarIdentifier(v));
+            }
+            wrappedQuery.setExternalVars(varIds);
+            apiFramework.reWriteQuery(declaredFunctions, metadataProvider, wrappedQuery, sessionOutput, false);
+
+            List<List<List<String>>> dependencies = FunctionUtil.getFunctionDependencies(
+                    rewriterFactory.createQueryRewriter(), cfs.getFunctionBodyExpression(), metadataProvider);
+
+            Function function = new Function(dataverse, functionName, cfs.getFunctionSignature().getArity(),
                     cfs.getParamList(), Function.RETURNTYPE_VOID, cfs.getFunctionBody(),
                     rewriterFactory instanceof SqlppRewriterFactory ? Function.LANGUAGE_SQLPP : Function.LANGUAGE_AQL,
-                    FunctionKind.SCALAR.toString());
+                    FunctionKind.SCALAR.toString(), dependencies);
             MetadataManager.INSTANCE.addFunction(mdTxnCtx, function);
 
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1680,11 +1723,12 @@
             throw e;
         } finally {
             metadataProvider.getLocks().unlock();
+            metadataProvider.setDefaultDataverse(activeDataverse);
         }
     }
 
     protected boolean checkWhetherFunctionIsBeingUsed(MetadataTransactionContext ctx, String dataverseName,
-            String functionName, int arity, String currentDataverse) throws MetadataException {
+            String functionName, int arity, String currentDataverse) throws AlgebricksException {
         List<Dataverse> allDataverses = MetadataManager.INSTANCE.getDataverses(ctx);
         for (Dataverse dataverse : allDataverses) {
             if (currentDataverse != null && dataverse.getDataverseName().equals(currentDataverse)) {
@@ -1768,7 +1812,7 @@
         String dataverseName = getActiveDataverse(stmtInsertUpsert.getDataverseName());
         final IMetadataLocker locker = new IMetadataLocker() {
             @Override
-            public void lock() throws AsterixException {
+            public void lock() throws AlgebricksException {
                 MetadataLockUtil.insertDeleteUpsertBegin(lockManager, metadataProvider.getLocks(),
                         dataverseName + "." + stmtInsertUpsert.getDatasetName());
             }
@@ -1862,7 +1906,7 @@
 
         // Query Rewriting (happens under the same ongoing metadata transaction)
         Pair<IReturningStatement, Integer> rewrittenResult =
-                apiFramework.reWriteQuery(declaredFunctions, metadataProvider, query, sessionOutput);
+                apiFramework.reWriteQuery(declaredFunctions, metadataProvider, query, sessionOutput, true);
 
         // Query Compilation (happens under the same ongoing metadata transaction)
         return apiFramework.compileQuery(clusterInfoCollector, metadataProvider, (Query) rewrittenResult.first,
@@ -1873,9 +1917,10 @@
             MetadataProvider metadataProvider, InsertStatement insertUpsert)
             throws RemoteException, AlgebricksException, ACIDException {
 
-        // Insert/upsert statement rewriting (happens under the same ongoing metadata transaction)
+        // Insert/upsert statement rewriting (happens under the same ongoing metadata
+        // transaction)
         Pair<IReturningStatement, Integer> rewrittenResult =
-                apiFramework.reWriteQuery(declaredFunctions, metadataProvider, insertUpsert, sessionOutput);
+                apiFramework.reWriteQuery(declaredFunctions, metadataProvider, insertUpsert, sessionOutput, true);
 
         InsertStatement rewrittenInsertUpsert = (InsertStatement) rewrittenResult.first;
         String dataverseName = getActiveDataverse(rewrittenInsertUpsert.getDataverseName());
@@ -1895,7 +1940,8 @@
             default:
                 throw new AlgebricksException("Unsupported statement type " + rewrittenInsertUpsert.getKind());
         }
-        // Insert/upsert statement compilation (happens under the same ongoing metadata transaction)
+        // Insert/upsert statement compilation (happens under the same ongoing metadata
+        // transaction)
         return apiFramework.compileQuery(clusterInfoCollector, metadataProvider, rewrittenInsertUpsert.getQuery(),
                 rewrittenResult.second, datasetName, sessionOutput, clfrqs);
     }
@@ -1908,9 +1954,9 @@
         metadataProvider.setMetadataTxnContext(mdTxnCtx);
         MetadataLockUtil.createFeedBegin(lockManager, metadataProvider.getLocks(), dataverseName,
                 dataverseName + "." + feedName);
-        Feed feed = null;
         try {
-            feed = MetadataManager.INSTANCE.getFeed(metadataProvider.getMetadataTxnContext(), dataverseName, feedName);
+            Feed feed =
+                    MetadataManager.INSTANCE.getFeed(metadataProvider.getMetadataTxnContext(), dataverseName, feedName);
             if (feed != null) {
                 if (cfs.getIfNotExists()) {
                     MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -1919,8 +1965,7 @@
                     throw new AlgebricksException("A feed with this name " + feedName + " already exists.");
                 }
             }
-            String adaptorName = cfs.getAdaptorName();
-            feed = new Feed(dataverseName, feedName, adaptorName, cfs.getAdaptorConfiguration());
+            feed = new Feed(dataverseName, feedName, cfs.getConfiguration());
             FeedMetadataUtil.validateFeed(feed, mdTxnCtx, appCtx);
             MetadataManager.INSTANCE.addFeed(metadataProvider.getMetadataTxnContext(), feed);
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
@@ -2039,7 +2084,7 @@
                 MetadataManager.INSTANCE.getFeed(mdTxnCtx, feedId.getDataverse(), feedId.getEntityName()));
         runJob(hcc, spec);
         MetadataManager.INSTANCE.dropFeed(mdTxnCtx, feed.getDataverseName(), feed.getFeedName());
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Removed feed " + feedId);
         }
     }
@@ -2171,8 +2216,8 @@
             if (listener != null && listener.isActive()) {
                 throw new CompilationException(ErrorCode.FEED_CHANGE_FEED_CONNECTIVITY_ON_ALIVE_FEED, feedName);
             }
-            ARecordType outputType = FeedMetadataUtil.getOutputType(feed, feed.getAdapterConfiguration(),
-                    ExternalDataConstants.KEY_TYPE_NAME);
+            ARecordType outputType = FeedMetadataUtil.getOutputType(feed,
+                    feed.getConfiguration().get(ExternalDataConstants.KEY_TYPE_NAME));
             List<FunctionSignature> appliedFunctions = cfs.getAppliedFunctions();
             for (FunctionSignature func : appliedFunctions) {
                 if (MetadataManager.INSTANCE.getFunction(mdTxnCtx, func) == null) {
@@ -2307,9 +2352,9 @@
     }
 
     private interface IMetadataLocker {
-        void lock() throws AsterixException;
+        void lock() throws AlgebricksException;
 
-        void unlock() throws AsterixException;
+        void unlock() throws AlgebricksException;
     }
 
     private interface IResultPrinter {
@@ -2376,6 +2421,8 @@
                 createAndRunJob(hcc, jobFlags, null, compiler, locker, resultDelivery, id -> {
                     final ResultReader resultReader = new ResultReader(hdc, id, resultSetId);
                     updateJobStats(id, stats);
+                    // stop buffering and allow for streaming result delivery
+                    sessionOutput.release();
                     ResultUtil.printResults(appCtx, resultReader, sessionOutput, stats,
                             metadataProvider.findOutputRecordType());
                 }, clientContextId, ctx);
@@ -2429,12 +2476,12 @@
                 }
             }, clientContextId, ctx);
         } catch (Exception e) {
-            if (JobId.INVALID.equals(jobId.getValue())) {
+            if (Objects.equals(JobId.INVALID, jobId.getValue())) {
                 // compilation failed
                 ResultUtil.printStatus(sessionOutput, AbstractQueryApiServlet.ResultStatus.FAILED);
                 ResultUtil.printError(sessionOutput.out(), e);
             } else {
-                GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE,
+                GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR,
                         resultDelivery.name() + " job with id " + jobId.getValue() + " " + "failed", e);
             }
         } finally {
@@ -2624,7 +2671,8 @@
             // all index updates has completed successfully, record transaction state
             spec = ExternalIndexingOperations.buildCommitJob(ds, indexes, metadataProvider);
 
-            // Aquire write latch again -> start a transaction and record the decision to commit
+            // Aquire write latch again -> start a transaction and record the decision to
+            // commit
             mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
             metadataProvider.setMetadataTxnContext(mdTxnCtx);
             bActiveTxn = true;
@@ -2852,17 +2900,17 @@
                     new DropDatasetStatement(new Identifier(dataverseNameTo), pregelixStmt.getDatasetNameTo(), true);
             this.handleDatasetDropStatement(metadataProvider, dropStmt, hcc, null);
             IDatasetDetailsDecl idd = new InternalDetailsDecl(toIndex.getKeyFieldNames(),
-                    toIndex.getKeyFieldSourceIndicators(), false, null, toDataset.getDatasetDetails().isTemp());
+                    toIndex.getKeyFieldSourceIndicators(), false, null);
+            RecordConstructor withRecord = getWithRecord(toDataset);
             DatasetDecl createToDataset = new DatasetDecl(new Identifier(dataverseNameTo),
                     pregelixStmt.getDatasetNameTo(), new Identifier(toDataset.getItemTypeDataverseName()),
                     new Identifier(toDataset.getItemTypeName()),
                     new Identifier(toDataset.getMetaItemTypeDataverseName()),
                     new Identifier(toDataset.getMetaItemTypeName()), new Identifier(toDataset.getNodeGroupName()),
-                    toDataset.getCompactionPolicy(), toDataset.getCompactionPolicyProperties(), toDataset.getHints(),
-                    toDataset.getDatasetType(), idd, false);
+                    toDataset.getHints(), toDataset.getDatasetType(), idd, withRecord, false);
             this.handleCreateDatasetStatement(metadataProvider, createToDataset, hcc, null);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, e.getMessage(), e);
+            LOGGER.log(Level.WARN, e.getMessage(), e);
             throw new AlgebricksException("Error cleaning the result dataset. This should not happen.");
         }
 
@@ -2870,6 +2918,43 @@
         FlushDatasetUtil.flushDataset(hcc, metadataProvider, dataverseNameFrom, datasetNameFrom);
     }
 
+    private static RecordConstructor getWithRecord(Dataset dataset) {
+        String mergePolicy = dataset.getCompactionPolicy();
+        Map<String, String> mergePolicyProperties = dataset.getCompactionPolicyProperties();
+        if (mergePolicy.equals(GlobalConfig.DEFAULT_COMPACTION_POLICY_NAME)
+                && mergePolicyProperties.equals(GlobalConfig.DEFAULT_COMPACTION_POLICY_PROPERTIES)) {
+            return null;
+        }
+        List<FieldBinding> mergePolicyRecordFields = new ArrayList<>(mergePolicyProperties == null ? 1 : 2);
+        mergePolicyRecordFields.add(toFieldBinding(MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME, mergePolicy));
+        if (mergePolicyProperties != null) {
+            mergePolicyRecordFields.add(
+                    toFieldBinding(MergePolicyUtils.MERGE_POLICY_PARAMETERS_PARAMETER_NAME, mergePolicyProperties));
+        }
+        FieldBinding mergePolicyBinding = toFieldBinding(MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME,
+                new RecordConstructor(mergePolicyRecordFields));
+        List<FieldBinding> withRecordFields = new ArrayList<>(1);
+        withRecordFields.add(mergePolicyBinding);
+        return new RecordConstructor(withRecordFields);
+    }
+
+    private static FieldBinding toFieldBinding(String key, Map<String, String> value) {
+        List<FieldBinding> fields = new ArrayList<>(value.size());
+        for (Entry<String, String> entry : value.entrySet()) {
+            fields.add(toFieldBinding(entry.getKey(), entry.getValue()));
+        }
+        RecordConstructor record = new RecordConstructor(fields);
+        return toFieldBinding(key, record);
+    }
+
+    private static FieldBinding toFieldBinding(String key, RecordConstructor value) {
+        return new FieldBinding(new LiteralExpr(new StringLiteral(key)), value);
+    }
+
+    private static FieldBinding toFieldBinding(String key, String value) {
+        return new FieldBinding(new LiteralExpr(new StringLiteral(key)), new LiteralExpr(new StringLiteral(value)));
+    }
+
     // Executes external shell commands.
     protected int executeExternalShellProgram(ProcessBuilder pb)
             throws IOException, AlgebricksException, InterruptedException {
@@ -2879,7 +2964,7 @@
             while ((line = in.readLine()) != null) {
                 LOGGER.info(line);
                 if (line.contains("Exception") || line.contains("Error")) {
-                    LOGGER.severe(line);
+                    LOGGER.error(line);
                     if (line.contains("Connection refused")) {
                         throw new AlgebricksException(
                                 "The connection to your Pregelix cluster was refused. Is it running? "
@@ -2906,7 +2991,7 @@
             String fromDatasetName, String toDataverseName, String toDatasetName) {
         // Constructs AsterixDB parameters, e.g., URL, source dataset and sink dataset.
         ExternalProperties externalProperties = appCtx.getExternalProperties();
-        String clientIP = ClusterProperties.INSTANCE.getCluster().getMasterNode().getClientIp();
+        String clientIP = appCtx.getServiceContext().getCCContext().getClusterControllerInfo().getClientNetAddress();
         StringBuilder asterixdbParameterBuilder = new StringBuilder();
         asterixdbParameterBuilder.append(
                 "pregelix.asterixdb.url=" + "http://" + clientIP + ":" + externalProperties.getAPIServerPort() + ",");
@@ -2981,9 +3066,10 @@
      * @param mdTxnCtx
      */
     public static void abort(Exception rootE, Exception parentE, MetadataTransactionContext mdTxnCtx) {
+        boolean interrupted = Thread.interrupted();
         try {
             if (IS_DEBUG_MODE) {
-                LOGGER.log(Level.SEVERE, rootE.getMessage(), rootE);
+                LOGGER.log(Level.ERROR, rootE.getMessage(), rootE);
             }
             if (mdTxnCtx != null) {
                 MetadataManager.INSTANCE.abortTransaction(mdTxnCtx);
@@ -2991,6 +3077,10 @@
         } catch (Exception e2) {
             parentE.addSuppressed(e2);
             throw new IllegalStateException(rootE);
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
index 5b8da8b..9592492 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/translator/RequestParameters.java
@@ -22,24 +22,24 @@
 
 import org.apache.asterix.translator.IRequestParameters;
 import org.apache.asterix.translator.IStatementExecutor;
-import org.apache.asterix.translator.IStatementExecutor.ResultDelivery;
 import org.apache.asterix.translator.IStatementExecutor.Stats;
+import org.apache.asterix.translator.ResultProperties;
 import org.apache.hyracks.api.dataset.IHyracksDataset;
 
 public class RequestParameters implements IRequestParameters {
 
     private final IHyracksDataset hdc;
-    private final ResultDelivery resultDelivery;
+    private final ResultProperties resultProperties;
     private final Stats stats;
     private final Map<String, String> optionalParameters;
     private final IStatementExecutor.ResultMetadata outMetadata;
     private final String clientContextId;
 
-    public RequestParameters(IHyracksDataset hdc, ResultDelivery resultDelivery, Stats stats,
+    public RequestParameters(IHyracksDataset hdc, ResultProperties resultProperties, Stats stats,
             IStatementExecutor.ResultMetadata outMetadata, String clientContextId,
             Map<String, String> optionalParameters) {
         this.hdc = hdc;
-        this.resultDelivery = resultDelivery;
+        this.resultProperties = resultProperties;
         this.stats = stats;
         this.outMetadata = outMetadata;
         this.clientContextId = clientContextId;
@@ -52,8 +52,8 @@
     }
 
     @Override
-    public IStatementExecutor.ResultDelivery getResultDelivery() {
-        return resultDelivery;
+    public ResultProperties getResultProperties() {
+        return resultProperties;
     }
 
     @Override
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixCLI.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixCLI.java
deleted file mode 100644
index c9b3565..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixCLI.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.drivers;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.Reader;
-import java.util.List;
-
-import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
-import org.apache.asterix.api.java.AsterixJavaClient;
-import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
-import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.compiler.provider.AqlCompilationProvider;
-import org.apache.asterix.compiler.provider.ILangCompilationProvider;
-import org.apache.asterix.file.StorageComponentProvider;
-import org.apache.commons.io.FileUtils;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-public class AsterixCLI {
-    private static class Options {
-        @Option(name = "-properties", usage = "Name of properties file", required = true)
-        public String properties;
-
-        @Option(name = "-output", usage = "Output folder to place results", required = true)
-        public String outputFolder;
-
-        @Argument(usage = "AQL Files to run", multiValued = true, required = true)
-        public List<String> args;
-    }
-
-    private static AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
-
-    public static void main(String args[]) throws Exception {
-        Options options = new Options();
-        CmdLineParser parser = new CmdLineParser(options);
-        parser.parseArgument(args);
-        ILangCompilationProvider compilationProvider = new AqlCompilationProvider();
-        setUp(options);
-        try {
-            for (String queryFile : options.args) {
-                Reader in = new FileReader(queryFile);
-                AsterixJavaClient ajc =
-                        new AsterixJavaClient((ICcApplicationContext) integrationUtil.cc.getApplicationContext(),
-                        integrationUtil.getHyracksClientConnection(), in,
-                        compilationProvider, new DefaultStatementExecutorFactory(), new StorageComponentProvider());
-                try {
-                    ajc.compile(true, false, false, false, false, true, false);
-                } finally {
-                    in.close();
-                }
-                ajc.execute();
-            }
-        } finally {
-            tearDown();
-        }
-        System.exit(0);
-    }
-
-    public static void setUp(Options options) throws Exception {
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, options.properties);
-        File outdir = new File(options.outputFolder);
-        outdir.mkdirs();
-
-        File log = new File("asterix_logs");
-        if (log.exists()) {
-            FileUtils.deleteDirectory(log);
-        }
-        File lsn = new File("last_checkpoint_lsn");
-        lsn.deleteOnExit();
-
-        integrationUtil.init(false);
-    }
-
-    public static void tearDown() throws Exception {
-        integrationUtil.deinit(false);
-    }
-
-}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
index 14a5fe0..aa6bbdd 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/drivers/AsterixClientDriver.java
@@ -64,9 +64,8 @@
             boolean onlyPhysical, boolean createBinaryRuntime) throws Exception {
         ILangCompilationProvider compilationProvider = new AqlCompilationProvider();
         FileReader reader = new FileReader(filename);
-        AsterixJavaClient q =
-                new AsterixJavaClient(null, hcc, reader, compilationProvider, new DefaultStatementExecutorFactory(),
-                        new StorageComponentProvider());
+        AsterixJavaClient q = new AsterixJavaClient(null, hcc, reader, compilationProvider,
+                new DefaultStatementExecutorFactory(), new StorageComponentProvider());
         q.compile(optimize, true, true, true, onlyPhysical, createBinaryRuntime, createBinaryRuntime);
         return q;
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
index 96cfe91..699892e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/CCApplication.java
@@ -25,11 +25,11 @@
 import static org.apache.asterix.api.http.server.ServletConstants.HYRACKS_CONNECTION_ATTR;
 import static org.apache.asterix.common.api.IClusterManagementWork.ClusterState.SHUTTING_DOWN;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.api.http.ctx.StatementExecutorContext;
 import org.apache.asterix.api.http.server.ActiveStatsApiServlet;
@@ -55,18 +55,19 @@
 import org.apache.asterix.app.active.ActiveNotificationHandler;
 import org.apache.asterix.app.cc.CCExtensionManager;
 import org.apache.asterix.app.external.ExternalLibraryUtils;
-import org.apache.asterix.app.replication.FaultToleranceStrategyFactory;
+import org.apache.asterix.app.replication.NcLifecycleCoordinator;
 import org.apache.asterix.common.api.AsterixThreadFactory;
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
+import org.apache.asterix.common.api.INodeJobTracker;
 import org.apache.asterix.common.config.AsterixExtension;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.ExternalProperties;
+import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.config.MetadataProperties;
+import org.apache.asterix.common.config.PropertiesAccessor;
+import org.apache.asterix.common.config.ReplicationProperties;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.library.ILibraryManager;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
-import org.apache.asterix.common.replication.IReplicationStrategy;
+import org.apache.asterix.common.replication.INcLifecycleCoordinator;
 import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.external.library.ExternalLibraryManager;
 import org.apache.asterix.file.StorageComponentProvider;
@@ -74,12 +75,13 @@
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.api.IAsterixStateProxy;
 import org.apache.asterix.metadata.bootstrap.AsterixStateProxy;
-import org.apache.asterix.metadata.cluster.ClusterManagerProvider;
 import org.apache.asterix.metadata.lock.MetadataLockManager;
 import org.apache.asterix.runtime.job.resource.JobCapacityController;
 import org.apache.asterix.runtime.utils.CcApplicationContext;
 import org.apache.asterix.translator.IStatementExecutorContext;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.util.MetadataBuiltinFunctions;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.ICCServiceContext;
 import org.apache.hyracks.api.application.IServiceContext;
 import org.apache.hyracks.api.client.HyracksConnection;
@@ -93,17 +95,21 @@
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.server.HttpServer;
 import org.apache.hyracks.http.server.WebManager;
+import org.apache.hyracks.util.LoggingConfigUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CCApplication extends BaseCCApplication {
 
-    private static final Logger LOGGER = Logger.getLogger(CCApplication.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static IAsterixStateProxy proxy;
     protected ICCServiceContext ccServiceCtx;
     protected CCExtensionManager ccExtensionManager;
     protected IStorageComponentProvider componentProvider;
     protected StatementExecutorContext statementExecutorCtx;
     protected WebManager webManager;
-    protected CcApplicationContext appCtx;
+    protected ICcApplicationContext appCtx;
     private IJobCapacityController jobCapacityController;
     private IHyracksClientConnection hcc;
 
@@ -119,63 +125,74 @@
         if (args.length > 0) {
             throw new IllegalArgumentException("Unrecognized argument(s): " + Arrays.toString(args));
         }
-        final ClusterControllerService controllerService = (ClusterControllerService) ccServiceCtx
-                .getControllerService();
+        final ClusterControllerService controllerService =
+                (ClusterControllerService) ccServiceCtx.getControllerService();
         ccServiceCtx.setMessageBroker(new CCMessageBroker(controllerService));
 
         configureLoggingLevel(ccServiceCtx.getAppConfig().getLoggingLevel(ExternalProperties.Option.LOG_LEVEL));
 
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting Asterix cluster controller");
-        }
+        LOGGER.info("Starting Asterix cluster controller");
 
         String strIP = ccServiceCtx.getCCContext().getClusterControllerInfo().getClientNetAddress();
         int port = ccServiceCtx.getCCContext().getClusterControllerInfo().getClientNetPort();
         hcc = new HyracksConnection(strIP, port);
+        MetadataBuiltinFunctions.init();
         ILibraryManager libraryManager = new ExternalLibraryManager();
-
-        IReplicationStrategy repStrategy = ClusterProperties.INSTANCE.getReplicationStrategy();
-        IFaultToleranceStrategy ftStrategy = FaultToleranceStrategyFactory
-                .create(ClusterProperties.INSTANCE.getCluster(), repStrategy, ccServiceCtx);
+        ReplicationProperties repProp =
+                new ReplicationProperties(PropertiesAccessor.getInstance(ccServiceCtx.getAppConfig()));
+        INcLifecycleCoordinator lifecycleCoordinator = createNcLifeCycleCoordinator(repProp.isReplicationEnabled());
         ExternalLibraryUtils.setUpExternaLibraries(libraryManager, false);
         componentProvider = new StorageComponentProvider();
         GlobalRecoveryManager globalRecoveryManager = createGlobalRecoveryManager();
         statementExecutorCtx = new StatementExecutorContext();
-        appCtx = new CcApplicationContext(ccServiceCtx, getHcc(), libraryManager, () -> MetadataManager.INSTANCE,
-                globalRecoveryManager, ftStrategy, new ActiveNotificationHandler(), componentProvider,
-                new MetadataLockManager());
-        ccExtensionManager = new CCExtensionManager(getExtensions());
+        appCtx = createApplicationContext(libraryManager, globalRecoveryManager, lifecycleCoordinator);
+        List<AsterixExtension> extensions = new ArrayList<>();
+        extensions.addAll(this.getExtensions());
+        ccExtensionManager = new CCExtensionManager(extensions);
         appCtx.setExtensionManager(ccExtensionManager);
         final CCConfig ccConfig = controllerService.getCCConfig();
         if (System.getProperty("java.rmi.server.hostname") == null) {
-            System.setProperty("java.rmi.server.hostname", ccConfig.getClusterListenAddress());
+            System.setProperty("java.rmi.server.hostname", ccConfig.getClusterPublicAddress());
         }
         MetadataProperties metadataProperties = appCtx.getMetadataProperties();
 
         setAsterixStateProxy(AsterixStateProxy.registerRemoteObject(metadataProperties.getMetadataCallbackPort()));
         ccServiceCtx.setDistributedState(proxy);
-        MetadataManager.initialize(proxy, metadataProperties);
+        MetadataManager.initialize(proxy, metadataProperties, appCtx);
         ccServiceCtx.addJobLifecycleListener(appCtx.getActiveNotificationHandler());
 
         // create event loop groups
         webManager = new WebManager();
         configureServers();
         webManager.start();
-        ClusterManagerProvider.getClusterManager().registerSubscriber(globalRecoveryManager);
         ccServiceCtx.addClusterLifecycleListener(new ClusterLifecycleListener(appCtx));
+        final INodeJobTracker nodeJobTracker = appCtx.getNodeJobTracker();
+        ccServiceCtx.addJobLifecycleListener(nodeJobTracker);
+        ccServiceCtx.addClusterLifecycleListener(nodeJobTracker);
 
         jobCapacityController = new JobCapacityController(controllerService.getResourceManager());
     }
 
+    protected ICcApplicationContext createApplicationContext(ILibraryManager libraryManager,
+            GlobalRecoveryManager globalRecoveryManager, INcLifecycleCoordinator lifecycleCoordinator)
+            throws AlgebricksException, IOException {
+        return new CcApplicationContext(ccServiceCtx, getHcc(), libraryManager, () -> MetadataManager.INSTANCE,
+                globalRecoveryManager, lifecycleCoordinator, new ActiveNotificationHandler(), componentProvider,
+                new MetadataLockManager());
+    }
+
     protected GlobalRecoveryManager createGlobalRecoveryManager() throws Exception {
         return new GlobalRecoveryManager(ccServiceCtx, getHcc(), componentProvider);
     }
 
+    protected INcLifecycleCoordinator createNcLifeCycleCoordinator(boolean replicationEnabled) {
+        return new NcLifecycleCoordinator(ccServiceCtx, replicationEnabled);
+    }
+
     @Override
     protected void configureLoggingLevel(Level level) {
         super.configureLoggingLevel(level);
-        LOGGER.info("Setting Asterix log level to " + level);
-        Logger.getLogger("org.apache.asterix").setLevel(level);
+        LoggingConfigUtil.defaultIfMissing(GlobalConfig.ASTERIX_LOGGER_NAME, level);
     }
 
     protected List<AsterixExtension> getExtensions() {
@@ -190,13 +207,9 @@
 
     @Override
     public void stop() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Stopping Asterix cluster controller");
-        }
+        LOGGER.info("Stopping Asterix cluster controller");
         appCtx.getClusterStateManager().setState(SHUTTING_DOWN);
-        if (appCtx != null) {
-            ((ActiveNotificationHandler) appCtx.getActiveNotificationHandler()).stop();
-        }
+        ((ActiveNotificationHandler) appCtx.getActiveNotificationHandler()).stop();
         AsterixStateProxy.unregisterRemoteObject();
         webManager.stop();
     }
@@ -212,8 +225,8 @@
     }
 
     protected HttpServer setupJSONAPIServer(ExternalProperties externalProperties) throws Exception {
-        HttpServer jsonAPIServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(),
-                externalProperties.getAPIServerPort());
+        HttpServer jsonAPIServer =
+                new HttpServer(webManager.getBosses(), webManager.getWorkers(), externalProperties.getAPIServerPort());
         jsonAPIServer.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
         jsonAPIServer.setAttribute(ASTERIX_APP_CONTEXT_INFO_ATTR, appCtx);
         jsonAPIServer.setAttribute(ServletConstants.EXECUTOR_SERVICE_ATTR,
@@ -334,15 +347,6 @@
     }
 
     @Override
-    public void startupCompleted() throws Exception {
-        ccServiceCtx.getControllerService().getExecutor().submit(() -> {
-            appCtx.getClusterStateManager().waitForState(ClusterState.ACTIVE);
-            ClusterManagerProvider.getClusterManager().notifyStartupCompleted();
-            return null;
-        });
-    }
-
-    @Override
     public IJobCapacityController getJobCapacityController() {
         return jobCapacityController;
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterLifecycleListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterLifecycleListener.java
index 84f841c..22c89c5 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterLifecycleListener.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterLifecycleListener.java
@@ -25,51 +25,42 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import org.apache.asterix.common.api.IClusterEventsSubscriber;
 import org.apache.asterix.common.api.IClusterManagementWork;
 import org.apache.asterix.common.api.IClusterManagementWorkResponse;
 import org.apache.asterix.common.api.IClusterManagementWorkResponse.Status;
 import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.schema.cluster.Node;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.cluster.AddNodeWork;
 import org.apache.asterix.metadata.cluster.AddNodeWorkResponse;
-import org.apache.asterix.metadata.cluster.ClusterManagerProvider;
 import org.apache.asterix.metadata.cluster.RemoveNodeWork;
 import org.apache.asterix.metadata.cluster.RemoveNodeWorkResponse;
-import org.apache.asterix.runtime.utils.CcApplicationContext;
 import org.apache.hyracks.api.application.IClusterLifecycleListener;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ClusterLifecycleListener implements IClusterLifecycleListener {
 
-    private static final Logger LOGGER = Logger.getLogger(ClusterLifecycleListener.class.getName());
-    private final CcApplicationContext appCtx;
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final ICcApplicationContext appCtx;
     private final LinkedBlockingQueue<Set<IClusterManagementWork>> workRequestQueue = new LinkedBlockingQueue<>();
     private final ClusterWorkExecutor eventHandler;
     private final List<IClusterManagementWorkResponse> pendingWorkResponses = new ArrayList<>();
 
-    public ClusterLifecycleListener(CcApplicationContext appCtx) {
+    public ClusterLifecycleListener(ICcApplicationContext appCtx) {
         this.appCtx = appCtx;
-        eventHandler = new ClusterWorkExecutor(appCtx, workRequestQueue);
+        eventHandler = new ClusterWorkExecutor(workRequestQueue);
         Thread t = new Thread(eventHandler);
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting cluster event handler");
-        }
+        LOGGER.info("Starting cluster event handler");
         t.start();
     }
 
     @Override
     public void notifyNodeJoin(String nodeId, Map<IOption, Object> ncConfiguration) throws HyracksException {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("NC: " + nodeId + " joined");
-        }
+        LOGGER.info("NC: {} joined", nodeId);
         IClusterStateManager csm = appCtx.getClusterStateManager();
         csm.notifyNodeJoin(nodeId, ncConfiguration);
 
@@ -81,25 +72,12 @@
         Set<String> nodeAddition = new HashSet<>();
         nodeAddition.add(nodeId);
         updateProgress(ClusterEventType.NODE_JOIN, nodeAddition);
-        Set<IClusterEventsSubscriber> subscribers =
-                ClusterManagerProvider.getClusterManager().getRegisteredClusterEventSubscribers();
-        Set<IClusterManagementWork> work = new HashSet<>();
-        for (IClusterEventsSubscriber sub : subscribers) {
-            Set<IClusterManagementWork> workRequest = sub.notifyNodeJoin(nodeId);
-            work.addAll(workRequest);
-        }
-        if (!work.isEmpty()) {
-            executeWorkSet(work);
-        }
-
     }
 
     @Override
     public void notifyNodeFailure(Collection<String> deadNodeIds) throws HyracksException {
         for (String deadNode : deadNodeIds) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("NC: " + deadNode + " left");
-            }
+            LOGGER.info("NC: {} left", deadNode);
             IClusterStateManager csm = appCtx.getClusterStateManager();
             csm.notifyNodeFailure(deadNode);
 
@@ -109,13 +87,7 @@
             }
         }
         updateProgress(ClusterEventType.NODE_FAILURE, deadNodeIds);
-        Set<IClusterEventsSubscriber> subscribers =
-                ClusterManagerProvider.getClusterManager().getRegisteredClusterEventSubscribers();
         Set<IClusterManagementWork> work = new HashSet<>();
-        for (IClusterEventsSubscriber sub : subscribers) {
-            Set<IClusterManagementWork> workRequest = sub.notifyNodeFailure(deadNodeIds);
-            work.addAll(workRequest);
-        }
         if (!work.isEmpty()) {
             executeWorkSet(work);
         }
@@ -172,30 +144,6 @@
         }
 
         List<String> addedNodes = new ArrayList<>();
-        String asterixInstanceName = ClusterProperties.INSTANCE.getCluster().getInstanceName();
-        IClusterStateManager csm = appCtx.getClusterStateManager();
-        for (int i = 0; i < nodesToAdd; i++) {
-            Node node = csm.getAvailableSubstitutionNode();
-            if (node != null) {
-                try {
-                    ClusterManagerProvider.getClusterManager().addNode(appCtx, node);
-                    addedNodes.add(asterixInstanceName + "_" + node.getId());
-                    if (LOGGER.isLoggable(Level.INFO)) {
-                        LOGGER.info("Added NC at:" + node.getId());
-                    }
-                } catch (AsterixException e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.warning("Unable to add NC at:" + node.getId());
-                    }
-                    e.printStackTrace();
-                }
-            } else {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Unable to add NC: no more available nodes");
-                }
-
-            }
-        }
 
         for (AddNodeWork w : nodeAdditionRequests) {
             int n = w.getNumberOfNodesRequested();
@@ -204,7 +152,7 @@
                 nodesToBeAddedForWork.add(addedNodes.get(i));
             }
             if (nodesToBeAddedForWork.isEmpty()) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Unable to satisfy request by " + w);
                 }
                 AddNodeWorkResponse response = new AddNodeWorkResponse(w, nodesToBeAddedForWork);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterWorkExecutor.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterWorkExecutor.java
index 2977a58..f227730 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterWorkExecutor.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/ClusterWorkExecutor.java
@@ -21,27 +21,20 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IClusterManagementWork;
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.schema.cluster.Node;
 import org.apache.asterix.metadata.cluster.AddNodeWork;
-import org.apache.asterix.metadata.cluster.ClusterManagerProvider;
 import org.apache.asterix.metadata.cluster.RemoveNodeWork;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ClusterWorkExecutor implements Runnable {
 
-    private static final Logger LOGGER = Logger.getLogger(ClusterWorkExecutor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
-    private final ICcApplicationContext appCtx;
     private final LinkedBlockingQueue<Set<IClusterManagementWork>> inbox;
 
-    public ClusterWorkExecutor(ICcApplicationContext appCtx, LinkedBlockingQueue<Set<IClusterManagementWork>> inbox) {
-        this.appCtx = appCtx;
+    public ClusterWorkExecutor(LinkedBlockingQueue<Set<IClusterManagementWork>> inbox) {
         this.inbox = inbox;
     }
 
@@ -69,38 +62,14 @@
                     }
                 }
 
-                IClusterStateManager csm = appCtx.getClusterStateManager();
-                Set<Node> addedNodes = new HashSet<>();
-                for (int i = 0; i < nodesToAdd; i++) {
-                    Node node = csm.getAvailableSubstitutionNode();
-                    if (node != null) {
-                        try {
-                            ClusterManagerProvider.getClusterManager().addNode(appCtx, node);
-                            addedNodes.add(node);
-                            if (LOGGER.isLoggable(Level.INFO)) {
-                                LOGGER.info("Added NC at:" + node.getId());
-                            }
-                        } catch (AsterixException e) {
-                            if (LOGGER.isLoggable(Level.WARNING)) {
-                                LOGGER.warning("Unable to add NC at:" + node.getId());
-                            }
-                            e.printStackTrace();
-                        }
-                    } else {
-                        if (LOGGER.isLoggable(Level.WARNING)) {
-                            LOGGER.warning("Unable to add NC: no more available nodes");
-                        }
-                    }
-                }
-
             } catch (InterruptedException e) {
-                if (LOGGER.isLoggable(Level.SEVERE)) {
-                    LOGGER.severe("interruped" + e.getMessage());
+                if (LOGGER.isErrorEnabled()) {
+                    LOGGER.error("interruped" + e.getMessage());
                 }
                 throw new IllegalStateException(e);
             } catch (Exception e) {
-                if (LOGGER.isLoggable(Level.SEVERE)) {
-                    LOGGER.severe("Unexpected exception in handling cluster event" + e.getMessage());
+                if (LOGGER.isErrorEnabled()) {
+                    LOGGER.error("Unexpected exception in handling cluster event" + e.getMessage());
                 }
             }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/GlobalRecoveryManager.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/GlobalRecoveryManager.java
index d6854b12..e2f1eaf 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/GlobalRecoveryManager.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/GlobalRecoveryManager.java
@@ -22,8 +22,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IClusterManagementWork;
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
@@ -50,10 +48,13 @@
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.control.nc.NCShutdownHook;
 import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class GlobalRecoveryManager implements IGlobalRecoveryManager {
 
-    private static final Logger LOGGER = Logger.getLogger(GlobalRecoveryManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final IStorageComponentProvider componentProvider;
     protected final ICCServiceContext serviceCtx;
     protected IHyracksClientConnection hcc;
@@ -97,7 +98,7 @@
                         try {
                             recover(appCtx);
                         } catch (HyracksDataException e) {
-                            LOGGER.log(Level.SEVERE, "Global recovery failed. Shutting down...", e);
+                            LOGGER.log(Level.ERROR, "Global recovery failed. Shutting down...", e);
                             ExitUtil.exit(NCShutdownHook.FAILED_TO_RECOVER_EXIT_CODE);
                         }
                     });
@@ -143,8 +144,8 @@
         if (!dataverse.getDataverseName().equals(MetadataConstants.METADATA_DATAVERSE_NAME)) {
             MetadataProvider metadataProvider = new MetadataProvider(appCtx, dataverse);
             try {
-                List<Dataset> datasets = MetadataManager.INSTANCE.getDataverseDatasets(mdTxnCtx,
-                        dataverse.getDataverseName());
+                List<Dataset> datasets =
+                        MetadataManager.INSTANCE.getDataverseDatasets(mdTxnCtx, dataverse.getDataverseName());
                 for (Dataset dataset : datasets) {
                     if (dataset.getDatasetType() == DatasetType.EXTERNAL) {
                         // External dataset
@@ -156,8 +157,8 @@
                         TransactionState datasetState = dsd.getState();
                         if (!indexes.isEmpty()) {
                             if (datasetState == TransactionState.BEGIN) {
-                                List<ExternalFile> files = MetadataManager.INSTANCE.getDatasetExternalFiles(mdTxnCtx,
-                                        dataset);
+                                List<ExternalFile> files =
+                                        MetadataManager.INSTANCE.getDatasetExternalFiles(mdTxnCtx, dataset);
                                 // if persumed abort, roll backward
                                 // 1. delete all pending files
                                 for (ExternalFile file : files) {
@@ -168,8 +169,8 @@
                             }
                             // 2. clean artifacts in NCs
                             metadataProvider.setMetadataTxnContext(mdTxnCtx);
-                            JobSpecification jobSpec = ExternalIndexingOperations.buildAbortOp(dataset, indexes,
-                                    metadataProvider);
+                            JobSpecification jobSpec =
+                                    ExternalIndexingOperations.buildAbortOp(dataset, indexes, metadataProvider);
                             executeHyracksJob(jobSpec);
                             // 3. correct the dataset state
                             ((ExternalDatasetDetails) dataset.getDatasetDetails()).setState(TransactionState.COMMIT);
@@ -177,13 +178,13 @@
                             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
                             mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
                         } else if (datasetState == TransactionState.READY_TO_COMMIT) {
-                            List<ExternalFile> files = MetadataManager.INSTANCE.getDatasetExternalFiles(mdTxnCtx,
-                                    dataset);
+                            List<ExternalFile> files =
+                                    MetadataManager.INSTANCE.getDatasetExternalFiles(mdTxnCtx, dataset);
                             // if ready to commit, roll forward
                             // 1. commit indexes in NCs
                             metadataProvider.setMetadataTxnContext(mdTxnCtx);
-                            JobSpecification jobSpec = ExternalIndexingOperations.buildRecoverOp(dataset, indexes,
-                                    metadataProvider);
+                            JobSpecification jobSpec =
+                                    ExternalIndexingOperations.buildRecoverOp(dataset, indexes, metadataProvider);
                             executeHyracksJob(jobSpec);
                             // 2. add pending files in metadata
                             for (ExternalFile file : files) {
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
index 3d7f870..b0382f7 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/hyracks/bootstrap/NCApplication.java
@@ -18,56 +18,62 @@
  */
 package org.apache.asterix.hyracks.bootstrap;
 
-import java.io.File;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Set;
 
+import org.apache.asterix.api.http.server.ServletConstants;
+import org.apache.asterix.api.http.server.StorageApiServlet;
 import org.apache.asterix.app.nc.NCAppRuntimeContext;
-import org.apache.asterix.app.replication.message.StartupTaskRequestMessage;
+import org.apache.asterix.app.replication.message.RegistrationTasksRequestMessage;
 import org.apache.asterix.common.api.AsterixThreadFactory;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.AsterixExtension;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.ExternalProperties;
+import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.config.NodeProperties;
 import org.apache.asterix.common.config.StorageProperties;
-import org.apache.asterix.common.config.TransactionProperties;
+import org.apache.asterix.common.transactions.Checkpoint;
 import org.apache.asterix.common.transactions.IRecoveryManager;
 import org.apache.asterix.common.transactions.IRecoveryManager.SystemState;
 import org.apache.asterix.common.utils.PrintUtil;
+import org.apache.asterix.common.utils.Servlets;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.common.utils.StoragePathUtil;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
 import org.apache.asterix.messaging.MessagingChannelInterfaceFactory;
 import org.apache.asterix.messaging.NCMessageBroker;
 import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.asterix.util.MetadataBuiltinFunctions;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.application.IServiceContext;
+import org.apache.hyracks.api.client.NodeStatus;
 import org.apache.hyracks.api.config.IConfigManager;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.IFileDeviceResolver;
 import org.apache.hyracks.api.job.resource.NodeCapacity;
 import org.apache.hyracks.api.messages.IMessageBroker;
-import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.control.nc.BaseNCApplication;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.hyracks.http.server.HttpServer;
 import org.apache.hyracks.http.server.WebManager;
+import org.apache.hyracks.util.LoggingConfigUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NCApplication extends BaseNCApplication {
-    private static final Logger LOGGER = Logger.getLogger(NCApplication.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     protected INCServiceContext ncServiceCtx;
     private INcApplicationContext runtimeContext;
     private String nodeId;
     private boolean stopInitiated;
     private boolean startupCompleted;
-    private SystemState systemState;
     protected WebManager webManager;
 
     @Override
@@ -89,7 +95,7 @@
             throw new IllegalArgumentException("Unrecognized argument(s): " + Arrays.toString(args));
         }
         nodeId = this.ncServiceCtx.getNodeId();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Starting Asterix node controller: " + nodeId);
         }
         configureLoggingLevel(ncServiceCtx.getAppConfig().getLoggingLevel(ExternalProperties.Option.LOG_LEVEL));
@@ -100,10 +106,11 @@
             System.setProperty("java.rmi.server.hostname",
                     (controllerService).getConfiguration().getClusterPublicAddress());
         }
+        MetadataBuiltinFunctions.init();
         runtimeContext = new NCAppRuntimeContext(ncServiceCtx, getExtensions());
         MetadataProperties metadataProperties = runtimeContext.getMetadataProperties();
         if (!metadataProperties.getNodeNames().contains(this.ncServiceCtx.getNodeId())) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Substitute node joining : " + this.ncServiceCtx.getNodeId());
             }
             updateOnNodeJoin();
@@ -115,35 +122,34 @@
         MessagingChannelInterfaceFactory interfaceFactory =
                 new MessagingChannelInterfaceFactory((NCMessageBroker) messageBroker, messagingProperties);
         this.ncServiceCtx.setMessagingChannelInterfaceFactory(interfaceFactory);
-
-        IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager();
-        systemState = recoveryMgr.getSystemState();
-
-        if (systemState == SystemState.PERMANENT_DATA_LOSS) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("System state: " + SystemState.PERMANENT_DATA_LOSS);
-                LOGGER.info("Node ID: " + nodeId);
-                LOGGER.info("Stores: " + PrintUtil.toString(metadataProperties.getStores()));
-                LOGGER.info("Root Metadata Store: " + metadataProperties.getStores().get(nodeId)[0]);
-            }
-            PersistentLocalResourceRepository localResourceRepository =
-                    (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
-            localResourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
+        final Checkpoint latestCheckpoint = runtimeContext.getTransactionSubsystem().getCheckpointManager().getLatest();
+        if (latestCheckpoint != null && latestCheckpoint.getStorageVersion() != StorageConstants.VERSION) {
+            throw new IllegalStateException(
+                    String.format("Storage version mismatch.. Current version (%s). On disk version: (%s)",
+                            StorageConstants.VERSION, latestCheckpoint.getStorageVersion()));
         }
-
+        if (LOGGER.isInfoEnabled()) {
+            IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager();
+            LOGGER.info("System state: " + recoveryMgr.getSystemState());
+            LOGGER.info("Node ID: " + nodeId);
+            LOGGER.info("Stores: " + PrintUtil.toString(metadataProperties.getStores()));
+        }
         webManager = new WebManager();
-
         performLocalCleanUp();
     }
 
     @Override
     protected void configureLoggingLevel(Level level) {
         super.configureLoggingLevel(level);
-        Logger.getLogger("org.apache.asterix").setLevel(level);
+        LoggingConfigUtil.defaultIfMissing(GlobalConfig.ASTERIX_LOGGER_NAME, level);
     }
 
     protected void configureServers() throws Exception {
-        // override to start web services on NC nodes
+        HttpServer apiServer = new HttpServer(webManager.getBosses(), webManager.getWorkers(),
+                getApplicationContext().getExternalProperties().getNcApiPort());
+        apiServer.setAttribute(ServletConstants.SERVICE_CONTEXT_ATTR, ncServiceCtx);
+        apiServer.addServlet(new StorageApiServlet(apiServer.ctx(), getApplicationContext(), Servlets.STORAGE));
+        webManager.add(apiServer);
     }
 
     protected List<AsterixExtension> getExtensions() {
@@ -155,7 +161,7 @@
         if (!stopInitiated) {
             runtimeContext.setShuttingdown(true);
             stopInitiated = true;
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Stopping Asterix node controller: " + nodeId);
             }
 
@@ -168,7 +174,7 @@
             ncServiceCtx.getLifeCycleComponentManager().stopAll(false);
             runtimeContext.deinitialize();
         } else {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Duplicate attempt to stop ignored: " + nodeId);
             }
         }
@@ -187,108 +193,57 @@
 
         // Since we don't pass initial run flag in AsterixHyracksIntegrationUtil, we use the virtualNC flag
         final NodeProperties nodeProperties = runtimeContext.getNodeProperties();
-        if (systemState == SystemState.PERMANENT_DATA_LOSS
+        IRecoveryManager recoveryMgr = runtimeContext.getTransactionSubsystem().getRecoveryManager();
+        SystemState state = recoveryMgr.getSystemState();
+        if (state == SystemState.PERMANENT_DATA_LOSS
                 && (nodeProperties.isInitialRun() || nodeProperties.isVirtualNc())) {
-            systemState = SystemState.BOOTSTRAPPING;
+            state = SystemState.BOOTSTRAPPING;
         }
-        // Request startup tasks from CC
-        StartupTaskRequestMessage.send((NodeControllerService) ncServiceCtx.getControllerService(), systemState);
+        // Request registration tasks from CC (we only do this from our primary CC, in the case of multiple CCs)
+        final NodeControllerService ncControllerService = (NodeControllerService) ncServiceCtx.getControllerService();
+        RegistrationTasksRequestMessage.send(ncControllerService.getPrimaryCcId(), ncControllerService,
+                NodeStatus.BOOTING, state);
         startupCompleted = true;
     }
 
     @Override
-    public void onRegisterNode() throws Exception {
+    public void onRegisterNode(CcId ccId) throws Exception {
         if (startupCompleted) {
-            // Request startup tasks from CC
-            StartupTaskRequestMessage.send((NodeControllerService) ncServiceCtx.getControllerService(), systemState);
+            /*
+             * If the node completed its startup before, then this is a re-registration with
+             * the primary (or supplemental) CC and therefore the system state should be HEALTHY and the node status
+             * is ACTIVE
+             */
+            RegistrationTasksRequestMessage.send(ccId, (NodeControllerService) ncServiceCtx.getControllerService(),
+                    NodeStatus.ACTIVE, SystemState.HEALTHY);
         }
     }
 
     @Override
     public NodeCapacity getCapacity() {
         StorageProperties storageProperties = runtimeContext.getStorageProperties();
-        // Deducts the reserved buffer cache size and memory component size from the maxium heap size,
-        // and deducts one core for processing heartbeats.
-        long memorySize = Runtime.getRuntime().maxMemory() - storageProperties.getBufferCacheSize()
-                - storageProperties.getMemoryComponentGlobalBudget();
+        final long memorySize = storageProperties.getJobExecutionMemoryBudget();
         int allCores = Runtime.getRuntime().availableProcessors();
-        int maximumCoresForComputation = allCores > 1 ? allCores - 1 : allCores;
-        return new NodeCapacity(memorySize, maximumCoresForComputation);
+        return new NodeCapacity(memorySize, allCores);
     }
 
     private void performLocalCleanUp() throws HyracksDataException {
         //Delete working area files from failed jobs
         runtimeContext.getIoManager().deleteWorkspaceFiles();
-
-        //Reclaim storage for temporary datasets.
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        String[] ioDevices = ((PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository())
-                .getStorageMountingPoints();
-        for (String ioDevice : ioDevices) {
-            String tempDatasetsDir =
-                    ioDevice + storageDirName + File.separator + StoragePathUtil.TEMP_DATASETS_STORAGE_FOLDER;
-            File tmpDsDir = new File(tempDatasetsDir);
-            if (tmpDsDir.exists()) {
-                IoUtil.delete(tmpDsDir);
-            }
+        // Reclaim storage for orphaned index artifacts in NCs.
+        final Set<Integer> nodePartitions = runtimeContext.getReplicaManager().getPartitions();
+        final PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
+        for (Integer partition : nodePartitions) {
+            localResourceRepository.cleanup(partition);
         }
-
-        //TODO
-        //Reclaim storage for orphaned index artifacts in NCs.
-        //Note: currently LSM indexes invalid components are deleted when an index is activated.
     }
 
     private void updateOnNodeJoin() {
         MetadataProperties metadataProperties = runtimeContext.getMetadataProperties();
         if (!metadataProperties.getNodeNames().contains(nodeId)) {
-            Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-            if (cluster == null) {
-                throw new IllegalStateException("No cluster configuration found for this instance");
-            }
             NCConfig ncConfig = ((NodeControllerService) ncServiceCtx.getControllerService()).getConfiguration();
             ncConfig.getConfigManager().ensureNode(nodeId);
-            String asterixInstanceName = metadataProperties.getInstanceName();
-            TransactionProperties txnProperties = runtimeContext.getTransactionProperties();
-            Node self = null;
-            List<Node> nodes;
-            if (cluster.getSubstituteNodes() != null) {
-                nodes = cluster.getSubstituteNodes().getNode();
-            } else {
-                throw new IllegalStateException("Unknown node joining the cluster");
-            }
-            for (Node node : nodes) {
-                String ncId = asterixInstanceName + "_" + node.getId();
-                if (ncId.equalsIgnoreCase(nodeId)) {
-                    String storeDir = ClusterProperties.INSTANCE.getStorageDirectoryName();
-                    String nodeIoDevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-                    String[] ioDevicePaths = nodeIoDevices.trim().split(",");
-                    for (int i = 0; i < ioDevicePaths.length; i++) {
-                        // construct full store path
-                        ioDevicePaths[i] += File.separator + storeDir;
-                    }
-                    metadataProperties.getStores().put(nodeId, ioDevicePaths);
-
-                    String coredumpPath = node.getLogDir() == null ? cluster.getLogDir() : node.getLogDir();
-                    metadataProperties.getCoredumpPaths().put(nodeId, coredumpPath);
-
-                    String txnLogDir = node.getTxnLogDir() == null ? cluster.getTxnLogDir() : node.getTxnLogDir();
-                    txnProperties.getLogDirectories().put(nodeId, txnLogDir);
-
-                    if (LOGGER.isLoggable(Level.INFO)) {
-                        LOGGER.info("Store set to : " + storeDir);
-                        LOGGER.info("Coredump dir set to : " + coredumpPath);
-                        LOGGER.info("Transaction log dir set to :" + txnLogDir);
-                    }
-                    self = node;
-                    break;
-                }
-            }
-            if (self != null) {
-                cluster.getSubstituteNodes().getNode().remove(self);
-                cluster.getNode().add(self);
-            } else {
-                throw new IllegalStateException("Unknown node joining the cluster");
-            }
         }
     }
 
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/CCMessageBroker.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/CCMessageBroker.java
index 0eade41..80e0b33 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/CCMessageBroker.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/CCMessageBroker.java
@@ -22,14 +22,13 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.messaging.api.ICCMessageBroker;
 import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
+import org.apache.asterix.common.messaging.api.ICcIdentifiedMessage;
 import org.apache.asterix.common.messaging.api.INcAddressedMessage;
 import org.apache.asterix.common.messaging.api.INcResponse;
 import org.apache.commons.lang3.mutable.MutableInt;
@@ -41,10 +40,12 @@
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.cc.NodeControllerState;
 import org.apache.hyracks.control.cc.cluster.INodeManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CCMessageBroker implements ICCMessageBroker {
 
-    private static final Logger LOGGER = Logger.getLogger(CCMessageBroker.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ClusterControllerService ccs;
     private final Map<Long, MutablePair<MutableInt, MutablePair<ResponseState, Object>>> handles =
             new ConcurrentHashMap<>();
@@ -58,7 +59,7 @@
     @Override
     public void receivedMessage(IMessage message, String nodeId) throws Exception {
         ICcAddressedMessage msg = (ICcAddressedMessage) message;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Received message: " + msg);
         }
         ICcApplicationContext appCtx = (ICcApplicationContext) ccs.getApplicationContext();
@@ -69,11 +70,14 @@
     public void sendApplicationMessageToNC(INcAddressedMessage msg, String nodeId) throws Exception {
         INodeManager nodeManager = ccs.getNodeManager();
         NodeControllerState state = nodeManager.getNodeControllerState(nodeId);
+        if (msg instanceof ICcIdentifiedMessage) {
+            ((ICcIdentifiedMessage) msg).setCcId(ccs.getCcId());
+        }
         if (state != null) {
             state.getNodeController().sendApplicationMessageToNC(JavaSerializationUtils.serialize(msg), null, nodeId);
         } else {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Couldn't send message to unregistered node (" + nodeId + ")");
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Couldn't send message to unregistered node (" + nodeId + ")");
             }
         }
     }
@@ -96,6 +100,9 @@
                 for (int i = 0; i < ncs.size(); i++) {
                     String nc = ncs.get(i);
                     INcAddressedMessage message = requests.get(i);
+                    if (!(message instanceof ICcIdentifiedMessage)) {
+                        throw new IllegalStateException("sync request message not cc identified: " + message);
+                    }
                     sendApplicationMessageToNC(message, nc);
                 }
                 long time = System.currentTimeMillis();
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/MessagingChannelInterfaceFactory.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/MessagingChannelInterfaceFactory.java
index a2a3460..dc006b7 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/MessagingChannelInterfaceFactory.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/MessagingChannelInterfaceFactory.java
@@ -20,8 +20,6 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.config.MessagingProperties;
 import org.apache.asterix.common.memory.ConcurrentFramePool;
@@ -36,10 +34,13 @@
 import org.apache.hyracks.api.comm.ICloseableBufferAcceptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.util.JavaSerializationUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MessagingChannelInterfaceFactory implements IChannelInterfaceFactory {
 
-    private static final Logger LOGGER = Logger.getLogger(MessagingChannelInterfaceFactory.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NCMessageBroker messageBroker;
     private final ConcurrentFramePool messagingFramePool;
@@ -113,8 +114,8 @@
                 // Queue the received message and free the network IO thread
                 messageBroker.queueReceivedMessage(receivedMsg);
             } catch (ClassNotFoundException | IOException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, e.getMessage(), e);
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, e.getMessage(), e);
                 }
             } finally {
                 recycle.accept(buffer);
@@ -143,8 +144,8 @@
             try {
                 messagingFramePool.release(buffer);
             } catch (HyracksDataException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, e.getMessage(), e);
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, e.getMessage(), e);
                 }
             }
         }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/NCMessageBroker.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/NCMessageBroker.java
index 33e89f0..e4fe4f3 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/NCMessageBroker.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/messaging/NCMessageBroker.java
@@ -22,8 +22,6 @@
 import java.nio.ByteBuffer;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.MessagingProperties;
@@ -33,16 +31,20 @@
 import org.apache.asterix.common.messaging.api.INcAddressedMessage;
 import org.apache.asterix.common.messaging.api.MessageFuture;
 import org.apache.hyracks.api.comm.IChannelControlBlock;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.messages.IMessage;
 import org.apache.hyracks.api.util.JavaSerializationUtils;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.util.collection.LongObjectHashMap;
 import io.netty.util.collection.LongObjectMap;
 
 public class NCMessageBroker implements INCMessageBroker {
-    private static final Logger LOGGER = Logger.getLogger(NCMessageBroker.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService ncs;
     private final INcApplicationContext appContext;
@@ -57,8 +59,8 @@
         appContext = (INcApplicationContext) ncs.getApplicationContext();
         maxMsgSize = messagingProperties.getFrameSize();
         int messagingMemoryBudget = messagingProperties.getFrameSize() * messagingProperties.getFrameCount();
-        messagingFramePool = new ConcurrentFramePool(ncs.getId(), messagingMemoryBudget,
-                messagingProperties.getFrameSize());
+        messagingFramePool =
+                new ConcurrentFramePool(ncs.getId(), messagingMemoryBudget, messagingProperties.getFrameSize());
         receivedMsgsQ = new LinkedBlockingQueue<>();
         futureIdGenerator = new AtomicLong();
         futureMap = new LongObjectHashMap<>();
@@ -67,13 +69,17 @@
     }
 
     @Override
-    public void sendMessageToCC(ICcAddressedMessage message) throws Exception {
-        ncs.sendApplicationMessageToCC(JavaSerializationUtils.serialize(message), null);
+    public void sendMessageToCC(CcId ccId, ICcAddressedMessage message) throws Exception {
+        ncs.sendApplicationMessageToCC(ccId, JavaSerializationUtils.serialize(message), null);
     }
 
     @Override
-    public void sendMessageToNC(String nodeId, INcAddressedMessage message)
-            throws Exception {
+    public void sendMessageToPrimaryCC(ICcAddressedMessage message) throws Exception {
+        sendMessageToCC(ncs.getPrimaryCcId(), message);
+    }
+
+    @Override
+    public void sendMessageToNC(String nodeId, INcAddressedMessage message) throws Exception {
         IChannelControlBlock messagingChannel = ncs.getMessagingNetworkManager().getMessagingChannel(nodeId);
         sendMessageToChannel(messagingChannel, message);
     }
@@ -86,10 +92,16 @@
     @Override
     public void receivedMessage(IMessage message, String nodeId) throws Exception {
         INcAddressedMessage absMessage = (INcAddressedMessage) message;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Received message: " + absMessage);
         }
-        absMessage.handle(appContext);
+        ncs.getExecutor().submit(() -> {
+            try {
+                absMessage.handle(appContext);
+            } catch (Exception e) {
+                LOGGER.log(Level.WARN, "Could not process message: {}", message, e);
+            }
+        });
     }
 
     public ConcurrentFramePool getMessagingFramePool() {
@@ -99,7 +111,7 @@
     private void sendMessageToChannel(IChannelControlBlock ccb, INcAddressedMessage msg) throws IOException {
         byte[] serializedMsg = JavaSerializationUtils.serialize(msg);
         if (serializedMsg.length > maxMsgSize) {
-            throw new HyracksDataException("Message exceded maximum size");
+            throw new HyracksDataException("Message exceeded maximum size");
         }
         // Prepare the message buffer
         ByteBuffer msgBuffer = messagingFramePool.get();
@@ -144,7 +156,7 @@
          */
         @Override
         public void run() {
-            while (true) {
+            while (!Thread.currentThread().isInterrupted()) {
                 INcAddressedMessage msg = null;
                 try {
                     msg = receivedMsgsQ.take();
@@ -153,12 +165,11 @@
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                 } catch (Exception e) {
-                    if (LOGGER.isLoggable(Level.WARNING) && msg != null) {
-                        LOGGER.log(Level.WARNING, "Could not process message : "
-                                + msg, e);
+                    if (LOGGER.isWarnEnabled() && msg != null) {
+                        LOGGER.log(Level.WARN, "Could not process message : " + msg, e);
                     } else {
-                        if (LOGGER.isLoggable(Level.WARNING)) {
-                            LOGGER.log(Level.WARNING, "Could not process message", e);
+                        if (LOGGER.isWarnEnabled()) {
+                            LOGGER.log(Level.WARN, "Could not process message", e);
                         }
                     }
                 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/FaultToleranceUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/FaultToleranceUtil.java
deleted file mode 100644
index 9887c57..0000000
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/FaultToleranceUtil.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.util;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.messaging.api.ICCMessageBroker;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.runtime.message.ReplicaEventMessage;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-import org.apache.hyracks.api.config.IOption;
-import org.apache.hyracks.control.common.controllers.NCConfig;
-
-public class FaultToleranceUtil {
-
-    private static final Logger LOGGER = Logger.getLogger(FaultToleranceUtil.class.getName());
-
-    private FaultToleranceUtil() {
-        throw new AssertionError();
-    }
-
-    public static void notifyImpactedReplicas(String nodeId, ClusterEventType event,
-            IClusterStateManager clusterManager, ICCMessageBroker messageBroker,
-            IReplicationStrategy replicationStrategy) {
-        List<String> primaryRemoteReplicas = replicationStrategy.getRemotePrimaryReplicas(nodeId).stream()
-                .map(Replica::getId).collect(Collectors.toList());
-        String nodeIdAddress = StringUtils.EMPTY;
-        Map<String, Map<IOption, Object>> ncConfiguration = clusterManager.getNcConfiguration();
-        // In case the node joined with a new IP address, we need to send it to the other replicas
-        if (event == ClusterEventType.NODE_JOIN) {
-            nodeIdAddress = (String) ncConfiguration.get(nodeId).get(NCConfig.Option.CLUSTER_PUBLIC_ADDRESS);
-        }
-        final Set<String> participantNodes = clusterManager.getParticipantNodes();
-        ReplicaEventMessage msg = new ReplicaEventMessage(nodeId, nodeIdAddress, event);
-        for (String replica : primaryRemoteReplicas) {
-            // If the remote replica is alive, send the event
-            if (participantNodes.contains(replica)) {
-                try {
-                    messageBroker.sendApplicationMessageToNC(msg, replica);
-                } catch (Exception e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Failed sending an application message to an NC", e);
-                    }
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/MetadataBuiltinFunctions.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/MetadataBuiltinFunctions.java
new file mode 100644
index 0000000..c143a63
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/util/MetadataBuiltinFunctions.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.util;
+
+import org.apache.asterix.app.function.DatasetResourcesRewriter;
+import org.apache.asterix.app.function.DatasetRewriter;
+import org.apache.asterix.app.function.FeedRewriter;
+import org.apache.asterix.app.function.StorageComponentsRewriter;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.utils.RecordUtil;
+
+public class MetadataBuiltinFunctions {
+
+    static {
+        // Dataset function
+        BuiltinFunctions.addFunction(BuiltinFunctions.DATASET, DatasetRewriter.INSTANCE, true);
+        BuiltinFunctions.addUnnestFun(BuiltinFunctions.DATASET, false);
+        BuiltinFunctions.addDatasourceFunction(BuiltinFunctions.DATASET, DatasetRewriter.INSTANCE);
+        // Feed collect function
+        BuiltinFunctions.addPrivateFunction(BuiltinFunctions.FEED_COLLECT, FeedRewriter.INSTANCE, true);
+        BuiltinFunctions.addUnnestFun(BuiltinFunctions.FEED_COLLECT, false);
+        BuiltinFunctions.addDatasourceFunction(BuiltinFunctions.FEED_COLLECT, FeedRewriter.INSTANCE);
+        // Dataset resources function
+        BuiltinFunctions.addPrivateFunction(DatasetResourcesRewriter.DATASET_RESOURCES,
+                (expression, env, mp) -> RecordUtil.FULLY_OPEN_RECORD_TYPE, true);
+        BuiltinFunctions.addUnnestFun(DatasetResourcesRewriter.DATASET_RESOURCES, false);
+        BuiltinFunctions.addDatasourceFunction(DatasetResourcesRewriter.DATASET_RESOURCES,
+                DatasetResourcesRewriter.INSTANCE);
+        // Dataset components function
+        BuiltinFunctions.addPrivateFunction(StorageComponentsRewriter.STORAGE_COMPONENTS,
+                (expression, env, mp) -> RecordUtil.FULLY_OPEN_RECORD_TYPE, true);
+        BuiltinFunctions.addUnnestFun(StorageComponentsRewriter.STORAGE_COMPONENTS, false);
+        BuiltinFunctions.addDatasourceFunction(StorageComponentsRewriter.STORAGE_COMPONENTS,
+                StorageComponentsRewriter.INSTANCE);
+
+    }
+
+    private MetadataBuiltinFunctions() {
+    }
+
+    public static void init() {
+        // Only execute the static block
+    }
+}
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
index 73c841e..f470949 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/DataverseUtil.java
@@ -35,8 +35,8 @@
 
     public static JobSpecification dropDataverseJobSpec(Dataverse dataverse, MetadataProvider metadata) {
         JobSpecification jobSpec = RuntimeUtils.createJobSpecification(metadata.getApplicationContext());
-        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint = metadata
-                .splitAndConstraints(dataverse.getDataverseName());
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
+                metadata.splitAndConstraints(dataverse.getDataverseName());
         FileRemoveOperatorDescriptor frod = new FileRemoveOperatorDescriptor(jobSpec, splitsAndConstraint.first, false);
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(jobSpec, frod, splitsAndConstraint.second);
         jobSpec.addRoot(frod);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
index 9cce91b..b6371dc 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FeedOperations.java
@@ -42,7 +42,7 @@
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.messaging.api.ICCMessageBroker;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
 import org.apache.asterix.external.api.IAdapterFactory;
@@ -54,7 +54,6 @@
 import org.apache.asterix.external.operators.FeedIntakeOperatorNodePushable;
 import org.apache.asterix.external.operators.FeedMetaOperatorDescriptor;
 import org.apache.asterix.external.util.ExternalDataUtils;
-import org.apache.asterix.external.util.FeedConstants;
 import org.apache.asterix.external.util.FeedUtils;
 import org.apache.asterix.external.util.FeedUtils.FeedRuntimeType;
 import org.apache.asterix.file.StorageComponentProvider;
@@ -87,6 +86,7 @@
 import org.apache.asterix.metadata.entities.FeedPolicyEntity;
 import org.apache.asterix.metadata.feeds.FeedMetadataUtil;
 import org.apache.asterix.metadata.feeds.LocationConstraint;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.asterix.runtime.job.listener.MultiTransactionJobletEventListenerFactory;
 import org.apache.asterix.runtime.utils.RuntimeUtils;
@@ -198,11 +198,10 @@
         VariableExpr fromTermLeftExpr = new VariableExpr(fromVarId);
         // TODO: remove target feedid from args list (xikui)
         // TODO: Get rid of this INTAKE
-        List<Expression> exprList =
-                addArgs(feedConnection.getDataverseName(), feedConnection.getFeedId().getEntityName(),
-                        feedConnection.getFeedId().getEntityName(), FeedRuntimeType.INTAKE.toString(),
-                        feedConnection.getDatasetName(), feedConnection.getOutputType());
-        CallExpr datasrouceCallFunction = new CallExpr(FeedConstants.FEED_COLLECT_FUN_SIGNATURE, exprList);
+        List<Expression> exprList = addArgs(feedConnection.getDataverseName(),
+                feedConnection.getFeedId().getEntityName(), feedConnection.getFeedId().getEntityName(),
+                FeedRuntimeType.INTAKE.toString(), feedConnection.getDatasetName(), feedConnection.getOutputType());
+        CallExpr datasrouceCallFunction = new CallExpr(new FunctionSignature(BuiltinFunctions.FEED_COLLECT), exprList);
         FromTerm fromterm = new FromTerm(datasrouceCallFunction, fromTermLeftExpr, null, null);
         FromClause fromClause = new FromClause(Arrays.asList(fromterm));
         // TODO: This can be the place to add select predicate for ingestion
@@ -279,7 +278,7 @@
         Map<ConnectorDescriptorId, ConnectorDescriptorId> connectorIdMapping = new HashMap<>();
         Map<OperatorDescriptorId, List<LocationConstraint>> operatorLocations = new HashMap<>();
         Map<OperatorDescriptorId, Integer> operatorCounts = new HashMap<>();
-        List<JobId> jobIds = new ArrayList<>();
+        Map<Integer, TxnId> txnIdMap = new HashMap<>();
         FeedMetaOperatorDescriptor metaOp;
 
         for (int iter1 = 0; iter1 < jobsList.size(); iter1++) {
@@ -290,9 +289,9 @@
             String datasetName = feedConnections.get(iter1).getDatasetName();
             FeedConnectionId feedConnectionId = new FeedConnectionId(ingestionOp.getEntityId(), datasetName);
 
-            FeedPolicyEntity feedPolicyEntity = FeedMetadataUtil
-                    .validateIfPolicyExists(curFeedConnection.getDataverseName(), curFeedConnection.getPolicyName(),
-                            metadataProvider.getMetadataTxnContext());
+            FeedPolicyEntity feedPolicyEntity =
+                    FeedMetadataUtil.validateIfPolicyExists(curFeedConnection.getDataverseName(),
+                            curFeedConnection.getPolicyName(), metadataProvider.getMetadataTxnContext());
 
             for (Map.Entry<OperatorDescriptorId, IOperatorDescriptor> entry : operatorsMap.entrySet()) {
                 IOperatorDescriptor opDesc = entry.getValue();
@@ -344,8 +343,8 @@
             });
 
             // make connections between operators
-            for (Entry<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>,
-                    Pair<IOperatorDescriptor, Integer>>> entry : subJob.getConnectorOperatorMap().entrySet()) {
+            for (Entry<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> entry : subJob
+                    .getConnectorOperatorMap().entrySet()) {
                 ConnectorDescriptorId newId = connectorIdMapping.get(entry.getKey());
                 IConnectorDescriptor connDesc = jobSpec.getConnectorMap().get(newId);
                 Pair<IOperatorDescriptor, Integer> leftOp = entry.getValue().getLeft();
@@ -415,11 +414,15 @@
             for (OperatorDescriptorId root : subJob.getRoots()) {
                 jobSpec.addRoot(jobSpec.getOperatorMap().get(operatorIdMapping.get(root)));
             }
-            jobIds.add(((JobEventListenerFactory) subJob.getJobletEventListenerFactory()).getJobId());
+            int datasetId = metadataProvider
+                    .findDataset(curFeedConnection.getDataverseName(), curFeedConnection.getDatasetName())
+                    .getDatasetId();
+            TxnId txnId = ((JobEventListenerFactory) subJob.getJobletEventListenerFactory()).getTxnId(datasetId);
+            txnIdMap.put(datasetId, txnId);
         }
 
         // jobEventListenerFactory
-        jobSpec.setJobletEventListenerFactory(new MultiTransactionJobletEventListenerFactory(jobIds, true));
+        jobSpec.setJobletEventListenerFactory(new MultiTransactionJobletEventListenerFactory(txnIdMap, true));
         // useConnectorSchedulingPolicy
         jobSpec.setUseConnectorPolicyForScheduling(jobsList.get(0).isUseConnectorPolicyForScheduling());
         // connectorAssignmentPolicy
@@ -431,9 +434,8 @@
             SessionOutput sessionOutput) {
         List<Statement> stmts = new ArrayList<>();
         DefaultStatementExecutorFactory qtFactory = new DefaultStatementExecutorFactory();
-        IStatementExecutor translator = qtFactory
-                .create(metadataProvider.getApplicationContext(), stmts, sessionOutput, new SqlppCompilationProvider(),
-                        new StorageComponentProvider());
+        IStatementExecutor translator = qtFactory.create(metadataProvider.getApplicationContext(), stmts, sessionOutput,
+                new SqlppCompilationProvider(), new StorageComponentProvider());
         return translator;
     }
 
@@ -444,22 +446,22 @@
         Pair<JobSpecification, IAdapterFactory> intakeInfo = buildFeedIntakeJobSpec(feed, metadataProvider, fpa);
         List<JobSpecification> jobsList = new ArrayList<>();
         // TODO: Figure out a better way to handle insert/upsert per conn instead of per feed
-        Boolean insertFeed = ExternalDataUtils.isInsertFeed(feed.getAdapterConfiguration());
+        Boolean insertFeed = ExternalDataUtils.isInsertFeed(feed.getConfiguration());
         // Construct the ingestion Job
         JobSpecification intakeJob = intakeInfo.getLeft();
         IAdapterFactory ingestionAdaptorFactory = intakeInfo.getRight();
         String[] ingestionLocations = ingestionAdaptorFactory.getPartitionConstraint().getLocations();
         // Add metadata configs
         metadataProvider.getConfig().put(FunctionUtil.IMPORT_PRIVATE_FUNCTIONS, Boolean.TRUE.toString());
-        metadataProvider.getConfig()
-                .put(FeedActivityDetails.COLLECT_LOCATIONS, StringUtils.join(ingestionLocations, ','));
+        metadataProvider.getConfig().put(FeedActivityDetails.COLLECT_LOCATIONS,
+                StringUtils.join(ingestionLocations, ','));
         // TODO: Once we deprecated AQL, this extra queryTranslator can be removed.
         IStatementExecutor translator =
                 getSQLPPTranslator(metadataProvider, ((QueryTranslator) statementExecutor).getSessionOutput());
         // Add connection job
         for (FeedConnection feedConnection : feedConnections) {
-            JobSpecification connectionJob = getConnectionJob(metadataProvider, feedConnection, translator, hcc,
-                    insertFeed);
+            JobSpecification connectionJob =
+                    getConnectionJob(metadataProvider, feedConnection, translator, hcc, insertFeed);
             jobsList.add(connectionJob);
         }
         return Pair.of(combineIntakeCollectJobs(metadataProvider, feed, intakeJob, jobsList, feedConnections,
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FlushDatasetUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FlushDatasetUtil.java
index 958444c..c37d8cc 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FlushDatasetUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/FlushDatasetUtil.java
@@ -20,12 +20,12 @@
 package org.apache.asterix.utils;
 
 import org.apache.asterix.common.config.CompilerProperties;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.JobUtils;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.asterix.runtime.operators.std.FlushDatasetOperatorDescriptor;
-import org.apache.asterix.transaction.management.service.transaction.JobIdFactory;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraintHelper;
 import org.apache.hyracks.algebricks.common.utils.Pair;
@@ -59,20 +59,20 @@
         AlgebricksMetaOperatorDescriptor emptySource = new AlgebricksMetaOperatorDescriptor(spec, 0, 1,
                 new IPushRuntimeFactory[] { new EmptyTupleSourceRuntimeFactory() }, rDescs);
 
-        org.apache.asterix.common.transactions.JobId jobId = JobIdFactory.generateJobId();
-        FlushDatasetOperatorDescriptor flushOperator = new FlushDatasetOperatorDescriptor(spec, jobId,
-                dataset.getDatasetId());
+        TxnId txnId = metadataProvider.getTxnIdFactory().create();
+        FlushDatasetOperatorDescriptor flushOperator =
+                new FlushDatasetOperatorDescriptor(spec, txnId, dataset.getDatasetId());
 
         spec.connect(new OneToOneConnectorDescriptor(spec), emptySource, 0, flushOperator, 0);
 
-        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> primarySplitsAndConstraint = metadataProvider
-                .getSplitProviderAndConstraints(dataset, dataset.getDatasetName());
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> primarySplitsAndConstraint =
+                metadataProvider.getSplitProviderAndConstraints(dataset, dataset.getDatasetName());
         AlgebricksPartitionConstraint primaryPartitionConstraint = primarySplitsAndConstraint.second;
 
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, emptySource,
                 primaryPartitionConstraint);
 
-        JobEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(jobId, true);
+        JobEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(txnId, true);
         spec.setJobletEventListenerFactory(jobEventListenerFactory);
         JobUtils.runJob(hcc, spec, true);
     }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
index 9e34d70..7bb917f 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/RebalanceUtil.java
@@ -21,20 +21,20 @@
 import static org.apache.asterix.app.translator.QueryTranslator.abort;
 import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
 
+import java.rmi.RemoteException;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.IntStream;
 
 import org.apache.asterix.active.IActiveEntityEventsListener;
 import org.apache.asterix.app.active.ActiveNotificationHandler;
 import org.apache.asterix.common.api.IMetadataLockManager;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.exceptions.ExceptionUtils;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.JobUtils;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.metadata.MetadataManager;
@@ -47,7 +47,6 @@
 import org.apache.asterix.metadata.utils.IndexUtil;
 import org.apache.asterix.rebalance.IDatasetRebalanceCallback;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
-import org.apache.asterix.transaction.management.service.transaction.JobIdFactory;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraintHelper;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -62,12 +61,15 @@
 import org.apache.hyracks.dataflow.common.data.partition.FieldHashPartitionComputerFactory;
 import org.apache.hyracks.dataflow.std.connectors.MToNPartitioningConnectorDescriptor;
 import org.apache.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A utility class for the rebalance operation.
  */
 public class RebalanceUtil {
-    private static final Logger LOGGER = Logger.getLogger(RebalanceUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private RebalanceUtil() {
 
@@ -116,9 +118,9 @@
 
             if (!targetNcNames.isEmpty()) {
                 // Creates a node group for rebalance.
-                String nodeGroupName = DatasetUtil
-                        .createNodeGroupForNewDataset(sourceDataset.getDataverseName(), sourceDataset.getDatasetName(),
-                                sourceDataset.getRebalanceCount() + 1, targetNcNames, metadataProvider);
+                String nodeGroupName = DatasetUtil.createNodeGroupForNewDataset(sourceDataset.getDataverseName(),
+                        sourceDataset.getDatasetName(), sourceDataset.getRebalanceCount() + 1, targetNcNames,
+                        metadataProvider);
                 // The target dataset for rebalance.
                 targetDataset = sourceDataset.getTargetDatasetForRebalance(nodeGroupName);
 
@@ -151,7 +153,7 @@
             // Executes the 2nd Metadata transaction for switching the metadata entity.
             // It detaches the source dataset and attaches the target dataset to metadata's point of view.
             runMetadataTransaction(metadataProvider,
-                    () -> rebalanceSwitch(sourceDataset, targetDataset, metadataProvider, hcc));
+                    () -> rebalanceSwitch(sourceDataset, targetDataset, metadataProvider));
             // Executes the 3rd Metadata transaction to drop the source dataset files and the node group for
             // the source dataset.
             runMetadataTransaction(metadataProvider, () -> dropSourceDataset(sourceDataset, metadataProvider, hcc));
@@ -172,9 +174,16 @@
             try {
                 work.run();
                 done = true;
-            } catch (InterruptedException e) {
-                LOGGER.log(Level.WARNING, "Retry with attempt " + (++retryCount), e);
-                interruptedException = e;
+            } catch (Exception e) {
+                Throwable rootCause = ExceptionUtils.getRootCause(e);
+                if (rootCause instanceof java.lang.InterruptedException) {
+                    interruptedException = (InterruptedException) rootCause;
+                    // clear the interrupted state from the thread
+                    Thread.interrupted();
+                    LOGGER.log(Level.WARN, "Retry with attempt " + (++retryCount), e);
+                    continue;
+                }
+                throw e;
             }
         } while (!done);
 
@@ -191,8 +200,6 @@
         try {
             // Performs the actual work.
             work.run();
-            // Complete the metadata transaction.
-            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } catch (Exception e) {
             abort(e, e, mdTxnCtx);
             throw e;
@@ -222,15 +229,15 @@
     }
 
     // Switches the metadata entity from the source dataset to the target dataset.
-    private static void rebalanceSwitch(Dataset source, Dataset target, MetadataProvider metadataProvider,
-            IHyracksClientConnection hcc) throws Exception {
+    private static void rebalanceSwitch(Dataset source, Dataset target, MetadataProvider metadataProvider)
+            throws AlgebricksException, RemoteException {
         MetadataTransactionContext mdTxnCtx = metadataProvider.getMetadataTxnContext();
         // upgrade lock
         ICcApplicationContext appCtx = metadataProvider.getApplicationContext();
         ActiveNotificationHandler activeNotificationHandler =
                 (ActiveNotificationHandler) appCtx.getActiveNotificationHandler();
         IMetadataLockManager lockManager = appCtx.getMetadataLockManager();
-        lockManager.upgradeDatasetLockToWrite(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(target));
+        lockManager.upgradeDatasetLockToWrite(metadataProvider.getLocks(), DatasetUtil.getFullyQualifiedName(source));
         try {
             // Updates the dataset entry in the metadata storage
             MetadataManager.INSTANCE.updateDataset(mdTxnCtx, target);
@@ -240,6 +247,7 @@
                     controller.replace(target);
                 }
             }
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
         } finally {
             lockManager.downgradeDatasetLockToExclusiveModify(metadataProvider.getLocks(),
                     DatasetUtil.getFullyQualifiedName(target));
@@ -252,8 +260,8 @@
         // Drops the source dataset files. No need to lock the dataset entity here because the source dataset has
         // been detached at this point.
         dropDatasetFiles(source, metadataProvider, hcc);
-
         tryDropDatasetNodegroup(source, metadataProvider);
+        MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext());
     }
 
     // Drops the metadata entry of source dataset's node group.
@@ -275,21 +283,21 @@
     private static void populateDataToRebalanceTarget(Dataset source, Dataset target, MetadataProvider metadataProvider,
             IHyracksClientConnection hcc) throws Exception {
         JobSpecification spec = new JobSpecification();
-        JobId jobId = JobIdFactory.generateJobId();
-        JobEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(jobId, true);
+        TxnId txnId = metadataProvider.getTxnIdFactory().create();
+        JobEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(txnId, true);
         spec.setJobletEventListenerFactory(jobEventListenerFactory);
 
         // The pipeline starter.
         IOperatorDescriptor starter = DatasetUtil.createDummyKeyProviderOp(spec, source, metadataProvider);
 
         // Creates primary index scan op.
-        IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, source, jobId);
+        IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, source);
 
         // Creates secondary BTree upsert op.
         IOperatorDescriptor upsertOp = createPrimaryIndexUpsertOp(spec, metadataProvider, source, target);
 
         // The final commit operator.
-        IOperatorDescriptor commitOp = createUpsertCommitOp(spec, metadataProvider, jobId, target);
+        IOperatorDescriptor commitOp = createUpsertCommitOp(spec, metadataProvider, target);
 
         // Connects empty-tuple-source and scan.
         spec.connect(new OneToOneConnectorDescriptor(spec), starter, 0, primaryScanOp, 0);
@@ -326,11 +334,10 @@
 
     // Creates the commit operator for populating the target dataset.
     private static IOperatorDescriptor createUpsertCommitOp(JobSpecification spec, MetadataProvider metadataProvider,
-            JobId jobId, Dataset target) throws AlgebricksException {
+            Dataset target) throws AlgebricksException {
         int[] primaryKeyFields = getPrimaryKeyPermutationForUpsert(target);
         return new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
-                new IPushRuntimeFactory[] {
-                        target.getCommitRuntimeFactory(metadataProvider, jobId, primaryKeyFields, true) },
+                new IPushRuntimeFactory[] { target.getCommitRuntimeFactory(metadataProvider, primaryKeyFields, true) },
                 new RecordDescriptor[] { target.getPrimaryRecordDescriptor(metadataProvider) });
     }
 
@@ -396,11 +403,13 @@
             dropDatasetFiles(dataset, metadataProvider, hcc);
 
             // drop dataset entry from metadata
-            runMetadataTransaction(metadataProvider, () -> MetadataManager.INSTANCE
-                    .dropDataset(metadataProvider.getMetadataTxnContext(), dataset.getDataverseName(),
-                            dataset.getDatasetName()));
+            runMetadataTransaction(metadataProvider,
+                    () -> MetadataManager.INSTANCE.dropDataset(metadataProvider.getMetadataTxnContext(),
+                            dataset.getDataverseName(), dataset.getDatasetName()));
+            MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext());
             // try to drop the dataset's node group
             runMetadataTransaction(metadataProvider, () -> tryDropDatasetNodegroup(dataset, metadataProvider));
+            MetadataManager.INSTANCE.commitTransaction(metadataProvider.getMetadataTxnContext());
         });
     }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ResourceUtils.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ResourceUtils.java
index 61c1dfe..0149ffa 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ResourceUtils.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/utils/ResourceUtils.java
@@ -19,11 +19,16 @@
 
 package org.apache.asterix.utils;
 
-import org.apache.asterix.app.resource.RequiredCapacityVisitor;
+import java.util.List;
+
+import org.apache.asterix.app.resource.OperatorResourcesComputer;
+import org.apache.asterix.app.resource.PlanStage;
+import org.apache.asterix.app.resource.PlanStagesGenerator;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan;
+import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig;
 import org.apache.hyracks.api.job.resource.ClusterCapacity;
 import org.apache.hyracks.api.job.resource.IClusterCapacity;
 
@@ -40,31 +45,43 @@
      *            a given query plan.
      * @param computationLocations,
      *            the partitions for computation.
-     * @param sortFrameLimit,
-     *            the frame limit for one sorter partition.
-     * @param groupFrameLimit,
-     *            the frame limit for one group-by partition.
-     * @param joinFrameLimit
-     *            the frame limit for one joiner partition.
-     * @param frameSize
-     *            the frame size used in query execution.
+     * @param physicalOptimizationConfig,
+     *            a PhysicalOptimizationConfig.
      * @return the required cluster capacity for executing the query.
      * @throws AlgebricksException
      *             if the query plan is malformed.
      */
-    public static IClusterCapacity getRequiredCompacity(ILogicalPlan plan,
-            AlgebricksAbsolutePartitionConstraint computationLocations, int sortFrameLimit, int groupFrameLimit,
-            int joinFrameLimit, int frameSize)
-            throws AlgebricksException {
-        // Creates a cluster capacity visitor.
-        IClusterCapacity clusterCapacity = new ClusterCapacity();
-        RequiredCapacityVisitor visitor = new RequiredCapacityVisitor(computationLocations.getLocations().length,
-                sortFrameLimit, groupFrameLimit, joinFrameLimit, frameSize, clusterCapacity);
-
-        // There could be only one root operator for a top-level query plan.
-        ILogicalOperator rootOp = plan.getRoots().get(0).getValue();
-        rootOp.accept(visitor, null);
-        return clusterCapacity;
+    public static IClusterCapacity getRequiredCapacity(ILogicalPlan plan,
+            AlgebricksAbsolutePartitionConstraint computationLocations,
+            PhysicalOptimizationConfig physicalOptimizationConfig) throws AlgebricksException {
+        final int frameSize = physicalOptimizationConfig.getFrameSize();
+        final int sortFrameLimit = physicalOptimizationConfig.getMaxFramesExternalSort();
+        final int groupFrameLimit = physicalOptimizationConfig.getMaxFramesForGroupBy();
+        final int joinFrameLimit = physicalOptimizationConfig.getMaxFramesForJoin();
+        final List<PlanStage> planStages = getStages(plan);
+        return getStageBasedRequiredCapacity(planStages, computationLocations.getLocations().length, sortFrameLimit,
+                groupFrameLimit, joinFrameLimit, frameSize);
     }
 
+    public static List<PlanStage> getStages(ILogicalPlan plan) throws AlgebricksException {
+        // There could be only one root operator for a top-level query plan.
+        final ILogicalOperator rootOp = plan.getRoots().get(0).getValue();
+        final PlanStagesGenerator stagesGenerator = new PlanStagesGenerator();
+        rootOp.accept(stagesGenerator, null);
+        return stagesGenerator.getStages();
+    }
+
+    public static IClusterCapacity getStageBasedRequiredCapacity(List<PlanStage> stages, int computationLocations,
+            int sortFrameLimit, int groupFrameLimit, int joinFrameLimit, int frameSize) {
+        final OperatorResourcesComputer computer = new OperatorResourcesComputer(computationLocations, sortFrameLimit,
+                groupFrameLimit, joinFrameLimit, frameSize);
+        final IClusterCapacity clusterCapacity = new ClusterCapacity();
+        final Long maxRequiredMemory = stages.stream().mapToLong(stage -> stage.getRequiredMemory(computer)).max()
+                .orElseThrow(IllegalStateException::new);
+        clusterCapacity.setAggregatedMemoryByteSize(maxRequiredMemory);
+        final Integer maxRequireCores = stages.stream().mapToInt(stage -> stage.getRequiredCores(computer)).max()
+                .orElseThrow(IllegalStateException::new);
+        clusterCapacity.setAggregatedCores(maxRequireCores);
+        return clusterCapacity;
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
deleted file mode 100644
index 7eba9eb..0000000
--- a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-  <metadataNode>asterix_nc1</metadataNode>
-  <store>
-    <ncId>asterix_nc1</ncId>
-    <storeDirs>iodevice0,iodevice1</storeDirs>
-  </store>
-  <store>
-    <ncId>asterix_nc2</ncId>
-    <storeDirs>iodevice0,iodevice1</storeDirs>
-  </store>
-  <transactionLogDir>
-    <ncId>asterix_nc1</ncId>
-    <txnLogDirPath>target/txnLogDir/asterix_nc1</txnLogDirPath>
-  </transactionLogDir>
-  <transactionLogDir>
-    <ncId>asterix_nc2</ncId>
-    <txnLogDirPath>target/txnLogDir/asterix_nc2</txnLogDirPath>
-  </transactionLogDir>
-
-  <property>
-    <name>max.wait.active.cluster</name>
-    <value>60</value>
-    <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all
-      nodes are available)
-      before a submitted query/statement can be
-      executed. (Default = 60 seconds)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.framesize</name>
-    <value>32KB</value>
-  </property>
-  <property>
-    <name>compiler.sortmemory</name>
-    <value>320KB</value>
-  </property>
-  <property>
-    <name>compiler.groupmemory</name>
-    <value>160KB</value>
-  </property>
-  <property>
-    <name>compiler.joinmemory</name>
-    <value>256KB</value>
-  </property>
-  <property>
-    <name>storage.buffercache.pagesize</name>
-    <value>32KB</value>
-    <description>The page size in bytes for pages in the buffer cache.
-      (Default = "128KB")
-    </description>
-  </property>
-  <property>
-    <name>storage.buffercache.size</name>
-    <value>48MB</value>
-    <description>The size of memory allocated to the disk buffer cache.
-      The value should be a multiple of the buffer cache page size.
-    </description>
-  </property>
-  <property>
-    <name>storage.memorycomponent.numpages</name>
-    <value>16</value>
-    <description>The number of pages to allocate for a memory component.
-      This budget is shared by all the memory components of the primary
-      index and all its secondary indexes across all I/O devices on a node.
-      Note: in-memory components usually has fill factor of 75% since
-      the pages are 75% full and the remaining 25% is un-utilized.
-    </description>
-  </property>
-  <property>
-    <name>storage.memorycomponent.globalbudget</name>
-    <value>512MB</value>
-    <description>The size of memory allocated to the memory components.
-      The value should be a multiple of the memory component page size.
-    </description>
-  </property>
-  <property>
-    <name>messaging.frame.size</name>
-    <value>4096</value>
-    <description>The frame size to be used for NC to NC messaging. (Default = 4kb)
-    </description>
-  </property>
-  <property>
-    <name>messaging.frame.count</name>
-    <value>512</value>
-    <description>Number of reusable frames for NC to NC messaging. (Default = 512)
-    </description>
-  </property>
-  <property>
-    <name>log.level</name>
-    <value>INFO</value>
-    <description>foo</description>
-  </property>
-</asterixConfiguration>
diff --git a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration2.xml b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration2.xml
deleted file mode 100644
index af17901..0000000
--- a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration2.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-    <metadataNode>asterix_nc1</metadataNode>
-    <store>
-        <ncId>asterix_nc1</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <store>
-        <ncId>asterix_nc2</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <transactionLogDir>
-        <ncId>asterix_nc1</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc1</txnLogDirPath>
-    </transactionLogDir>
-    <transactionLogDir>
-        <ncId>asterix_nc2</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc2</txnLogDirPath>
-    </transactionLogDir>
-
-    <property>
-        <name>max.wait.active.cluster</name>
-        <value>60</value>
-        <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all
-            nodes are available)
-            before a submitted query/statement can be
-            executed. (Default = 60 seconds)
-        </description>
-    </property>
-
-    <property>
-        <name>compiler.framesize</name>
-        <value>32KB</value>
-    </property>
-    <property>
-        <name>compiler.sortmemory</name>
-        <value>320KB</value>
-    </property>
-    <property>
-        <name>compiler.groupmemory</name>
-        <value>160KB</value>
-    </property>
-    <property>
-        <name>compiler.joinmemory</name>
-        <value>256KB</value>
-    </property>
-    <property>
-        <name>compiler.parallelism</name>
-        <value>-1</value>
-    </property>
-    <property>
-        <name>storage.buffercache.pagesize</name>
-        <value>32KB</value>
-        <description>The page size in bytes for pages in the buffer cache.
-            (Default = "128KB")
-        </description>
-    </property>
-    <property>
-        <name>storage.buffercache.size</name>
-        <value>48MB</value>
-        <description>The size of memory allocated to the disk buffer cache.
-            The value should be a multiple of the buffer cache page size.
-        </description>
-    </property>
-    <property>
-        <name>storage.memorycomponent.numpages</name>
-        <value>8</value>
-        <description>The number of pages to allocate for a memory component.
-            This budget is shared by all the memory components of the primary
-            index and all its secondary indexes across all I/O devices on a node.
-            Note: in-memory components usually has fill factor of 75% since
-            the pages are 75% full and the remaining 25% is un-utilized.
-        </description>
-    </property>
-    <property>
-        <name>storage.memorycomponent.globalbudget</name>
-        <value>512MB</value>
-        <description>The size of memory allocated to the memory components.
-            The value should be a multiple of the memory component page size.
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.size</name>
-        <value>4096</value>
-        <description>The frame size to be used for NC to NC messaging. (Default = 4kb)
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.count</name>
-        <value>512</value>
-        <description>Number of reusable frames for NC to NC messaging. (Default = 512)
-        </description>
-    </property>
-</asterixConfiguration>
diff --git a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration3.xml b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration3.xml
deleted file mode 100644
index 06ac7b5..0000000
--- a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration3.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-    <metadataNode>asterix_nc1</metadataNode>
-    <store>
-        <ncId>asterix_nc1</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <store>
-        <ncId>asterix_nc2</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <transactionLogDir>
-        <ncId>asterix_nc1</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc1</txnLogDirPath>
-    </transactionLogDir>
-    <transactionLogDir>
-        <ncId>asterix_nc2</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc2</txnLogDirPath>
-    </transactionLogDir>
-
-    <property>
-        <name>max.wait.active.cluster</name>
-        <value>60</value>
-        <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all
-            nodes are available)
-            before a submitted query/statement can be
-            executed. (Default = 60 seconds)
-        </description>
-    </property>
-
-    <property>
-        <name>compiler.framesize</name>
-        <value>32KB</value>
-    </property>
-    <property>
-        <name>compiler.sortmemory</name>
-        <value>320KB</value>
-    </property>
-    <property>
-        <name>compiler.groupmemory</name>
-        <value>160KB</value>
-    </property>
-    <property>
-        <name>compiler.joinmemory</name>
-        <value>256KB</value>
-    </property>
-    <property>
-        <name>compiler.parallelism</name>
-        <value>3</value>
-    </property>
-    <property>
-        <name>storage.buffercache.pagesize</name>
-        <value>32KB</value>
-        <description>The page size in bytes for pages in the buffer cache.
-            (Default = "128KB")
-        </description>
-    </property>
-    <property>
-        <name>storage.buffercache.size</name>
-        <value>48MB</value>
-        <description>The size of memory allocated to the disk buffer cache.
-            The value should be a multiple of the buffer cache page size.
-        </description>
-    </property>
-    <property>
-        <name>storage.memorycomponent.numpages</name>
-        <value>8</value>
-        <description>The number of pages to allocate for a memory component.
-            This budget is shared by all the memory components of the primary
-            index and all its secondary indexes across all I/O devices on a node.
-            Note: in-memory components usually has fill factor of 75% since
-            the pages are 75% full and the remaining 25% is un-utilized.
-        </description>
-    </property>
-    <property>
-        <name>storage.memorycomponent.globalbudget</name>
-        <value>512MB</value>
-        <description>The size of memory allocated to the memory components.
-            The value should be a multiple of the memory component page size.
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.size</name>
-        <value>4096</value>
-        <description>The frame size to be used for NC to NC messaging. (Default = 4kb)
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.count</name>
-        <value>512</value>
-        <description>Number of reusable frames for NC to NC messaging. (Default = 512)
-        </description>
-    </property>
-</asterixConfiguration>
diff --git a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration4.xml b/asterixdb/asterix-app/src/main/resources/asterix-build-configuration4.xml
deleted file mode 100644
index bfa51dd..0000000
--- a/asterixdb/asterix-app/src/main/resources/asterix-build-configuration4.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-    <metadataNode>asterix_nc1</metadataNode>
-    <store>
-        <ncId>asterix_nc1</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <store>
-        <ncId>asterix_nc2</ncId>
-        <storeDirs>iodevice0,iodevice1</storeDirs>
-    </store>
-    <transactionLogDir>
-        <ncId>asterix_nc1</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc1</txnLogDirPath>
-    </transactionLogDir>
-    <transactionLogDir>
-        <ncId>asterix_nc2</ncId>
-        <txnLogDirPath>target/txnLogDir/asterix_nc2</txnLogDirPath>
-    </transactionLogDir>
-
-    <property>
-        <name>max.wait.active.cluster</name>
-        <value>60</value>
-        <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all
-            nodes are available)
-            before a submitted query/statement can be
-            executed. (Default = 60 seconds)
-        </description>
-    </property>
-
-    <property>
-        <name>compiler.framesize</name>
-        <value>32KB</value>
-    </property>
-    <property>
-        <name>compiler.sortmemory</name>
-        <value>320KB</value>
-    </property>
-    <property>
-        <name>compiler.groupmemory</name>
-        <value>160KB</value>
-    </property>
-    <property>
-        <name>compiler.joinmemory</name>
-        <value>256KB</value>
-    </property>
-    <property>
-        <name>compiler.parallelism</name>
-        <value>-1</value>
-    </property>
-    <property>
-        <name>storage.buffercache.pagesize</name>
-        <value>32KB</value>
-        <description>The page size in bytes for pages in the buffer cache.
-            (Default = "128KB")
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.size</name>
-        <value>4096</value>
-        <description>The frame size to be used for NC to NC messaging. (Default = 4kb)
-        </description>
-    </property>
-    <property>
-        <name>messaging.frame.count</name>
-        <value>512</value>
-        <description>Number of reusable frames for NC to NC messaging. (Default = 512)
-        </description>
-    </property>
-</asterixConfiguration>
diff --git a/asterixdb/asterix-app/src/main/resources/cc-rep.conf b/asterixdb/asterix-app/src/main/resources/cc-rep.conf
new file mode 100644
index 0000000..1f4e5a5
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/cc-rep.conf
@@ -0,0 +1,52 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=../asterix-server/target/tmp/asterix_nc1/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc1/coredump
+iodevices=asterix_nc1/iodevice1,asterix_nc1/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006
+replication.listen.port=2001
+nc.api.port=19004
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=../asterix-server/target/tmp/asterix_nc2/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc2/coredump
+iodevices=asterix_nc2/iodevice1,asterix_nc2/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007
+replication.listen.port=2002
+nc.api.port=19005
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.subdir=test_storage
+storage.memorycomponent.globalbudget = 1073741824
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+replication.enabled=true
+replication.strategy=all
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/cc.conf b/asterixdb/asterix-app/src/main/resources/cc.conf
new file mode 100644
index 0000000..fe6cf64
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/cc.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=asterix_nc1/iodevice1,asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=asterix_nc2/iodevice1,asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+messaging.frame.size=4096
+messaging.frame.count=512
+
diff --git a/asterixdb/asterix-app/src/main/resources/cc2.conf b/asterixdb/asterix-app/src/main/resources/cc2.conf
new file mode 100644
index 0000000..113497d
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/cc2.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=asterix_nc1/iodevice1,asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=asterix_nc2/iodevice1,asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = WARN
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+compiler.parallelism=-1
+messaging.frame.size=4096
+messaging.frame.count=512
diff --git a/asterixdb/asterix-app/src/main/resources/cc3.conf b/asterixdb/asterix-app/src/main/resources/cc3.conf
new file mode 100644
index 0000000..e210bf62
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/cc3.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=asterix_nc1/iodevice1,asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=asterix_nc2/iodevice1,asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = WARN
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+compiler.parallelism=3
+messaging.frame.size=4096
+messaging.frame.count=512
diff --git a/asterixdb/asterix-app/src/main/resources/cc4.conf b/asterixdb/asterix-app/src/main/resources/cc4.conf
new file mode 100644
index 0000000..3b7a993
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/cc4.conf
@@ -0,0 +1,54 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=asterix_nc1/iodevice1,asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=asterix_nc2/iodevice1,asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+messaging.frame.size=4096
+messaging.frame.count=512
+compiler.parallelism=-1
diff --git a/asterixdb/asterix-app/src/main/resources/cluster.xml b/asterixdb/asterix-app/src/main/resources/cluster.xml
deleted file mode 100644
index 7f78b26..0000000
--- a/asterixdb/asterix-app/src/main/resources/cluster.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <instance_name>asterix</instance_name>
-  <store>storage</store>
-  <metadata_node>nc1</metadata_node>
-
-  <high_availability>
-    <enabled>false</enabled>
-    <data_replication>
-      <strategy>metadata_only</strategy>
-      <replication_port>2016</replication_port>
-      <replication_time_out>30</replication_time_out>
-    </data_replication>
-    <fault_tolerance>
-       <strategy>metadata_node</strategy>
-       <replica>
-         <node_id>nc2</node_id>
-       </replica>
-    </fault_tolerance>
-  </high_availability>
-
-  <master_node>
-    <id>master</id>
-    <client_ip>127.0.0.1</client_ip>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <replication_port>2016</replication_port>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <replication_port>2017</replication_port>
-  </node>
-</cluster>
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/log4j2.xml b/asterixdb/asterix-app/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..1debf82
--- /dev/null
+++ b/asterixdb/asterix-app/src/main/resources/log4j2.xml
@@ -0,0 +1,31 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in complianceo
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="WARN">
+      <AppenderRef ref="Console"/>
+    </Root>
+    <Logger name="org.apache.hyracks.control.nc.service" level="INFO"/>
+  </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap-theme.min.css b/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap-theme.min.css
deleted file mode 100644
index 0d35c4a..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap-theme.min.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! Bootstrap v3.3.6 (http://getbootstrap.com) | Copyright 2011-2015 Twitter, Inc. | Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
-/*# sourceMappingURL=bootstrap-theme.min.css.map */
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap.min.css b/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap.min.css
deleted file mode 100644
index 4cf729e..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/css/bootstrap.min.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v3.3.6 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
-/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/css/codemirror.css b/asterixdb/asterix-app/src/main/resources/queryui/css/codemirror.css
deleted file mode 100644
index 04f2561..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/css/codemirror.css
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
- * Copyright (C) 2016 by Marijn Haverbeke <marijnh@gmail.com> and others
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-/* BASICS */
-
-.CodeMirror {
-  /* Set height, width, borders, and global font properties here */
-  font-family: monospace;
-  height: 300px;
-  color: black;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
-  padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
-  padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
-  background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
-  background-color: #FFF;
-  white-space: nowrap;
-}
-.CodeMirror-linenumbers {}
-.CodeMirror-linenumber {
-  padding: 0 3px 0 5px;
-  min-width: 20px;
-  text-align: right;
-  color: #999;
-  white-space: nowrap;
-}
-
-.CodeMirror-guttermarker { color: black; }
-.CodeMirror-guttermarker-subtle { color: #999; }
-
-/* CURSOR */
-
-.CodeMirror-cursor {
-  border-left: 1px solid black;
-  border-right: none;
-  width: 0;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
-  border-left: 1px solid silver;
-}
-.cm-fat-cursor .CodeMirror-cursor {
-  width: auto;
-  border: 0 !important;
-  background: #7e7;
-}
-.cm-fat-cursor div.CodeMirror-cursors {
-  z-index: 1;
-}
-
-.cm-animate-fat-cursor {
-  width: auto;
-  border: 0;
-  -webkit-animation: blink 1.06s steps(1) infinite;
-  -moz-animation: blink 1.06s steps(1) infinite;
-  animation: blink 1.06s steps(1) infinite;
-  background-color: #7e7;
-}
-@-moz-keyframes blink {
-  0% {}
-  50% { background-color: transparent; }
-  100% {}
-}
-@-webkit-keyframes blink {
-  0% {}
-  50% { background-color: transparent; }
-  100% {}
-}
-@keyframes blink {
-  0% {}
-  50% { background-color: transparent; }
-  100% {}
-}
-
-/* Can style cursor different in overwrite (non-insert) mode */
-.CodeMirror-overwrite .CodeMirror-cursor {}
-
-.cm-tab { display: inline-block; text-decoration: inherit; }
-
-.CodeMirror-ruler {
-  border-left: 1px solid #ccc;
-  position: absolute;
-}
-
-/* DEFAULT THEME */
-
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-link {text-decoration: underline;}
-.cm-strikethrough {text-decoration: line-through;}
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable,
-.cm-s-default .cm-punctuation,
-.cm-s-default .cm-property,
-.cm-s-default .cm-operator {}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-s-default .cm-error {color: #f00;}
-.cm-invalidchar {color: #f00;}
-
-.CodeMirror-composing { border-bottom: 2px solid; }
-
-/* Default styles for common addons */
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
-.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
-.CodeMirror-activeline-background {background: #e8f2ff;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
-   the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
-  position: relative;
-  overflow: hidden;
-  background: white;
-}
-
-.CodeMirror-scroll {
-  overflow: scroll !important; /* Things will break if this is overridden */
-  /* 30px is the magic margin used to hide the element's real scrollbars */
-  /* See overflow: hidden in .CodeMirror */
-  margin-bottom: -30px; margin-right: -30px;
-  padding-bottom: 30px;
-  height: 100%;
-  outline: none; /* Prevent dragging from highlighting the element */
-  position: relative;
-}
-.CodeMirror-sizer {
-  position: relative;
-  border-right: 30px solid transparent;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
-   before actual scrolling happens, thus preventing shaking and
-   flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
-  position: absolute;
-  z-index: 6;
-  display: none;
-}
-.CodeMirror-vscrollbar {
-  right: 0; top: 0;
-  overflow-x: hidden;
-  overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
-  bottom: 0; left: 0;
-  overflow-y: hidden;
-  overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
-  right: 0; bottom: 0;
-}
-.CodeMirror-gutter-filler {
-  left: 0; bottom: 0;
-}
-
-.CodeMirror-gutters {
-  position: absolute; left: 0; top: 0;
-  min-height: 100%;
-  z-index: 3;
-}
-.CodeMirror-gutter {
-  white-space: normal;
-  height: 100%;
-  display: inline-block;
-  vertical-align: top;
-  margin-bottom: -30px;
-  /* Hack to make IE7 behave */
-  *zoom:1;
-  *display:inline;
-}
-.CodeMirror-gutter-wrapper {
-  position: absolute;
-  z-index: 4;
-  background: none !important;
-  border: none !important;
-}
-.CodeMirror-gutter-background {
-  position: absolute;
-  top: 0; bottom: 0;
-  z-index: 4;
-}
-.CodeMirror-gutter-elt {
-  position: absolute;
-  cursor: default;
-  z-index: 4;
-}
-.CodeMirror-gutter-wrapper {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-}
-
-.CodeMirror-lines {
-  cursor: text;
-  min-height: 1px; /* prevents collapsing before first draw */
-}
-.CodeMirror pre {
-  /* Reset some styles that the rest of the page might have set */
-  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
-  border-width: 0;
-  background: transparent;
-  font-family: inherit;
-  font-size: inherit;
-  margin: 0;
-  white-space: pre;
-  word-wrap: normal;
-  line-height: inherit;
-  color: inherit;
-  z-index: 2;
-  position: relative;
-  overflow: visible;
-  -webkit-tap-highlight-color: transparent;
-  -webkit-font-variant-ligatures: none;
-  font-variant-ligatures: none;
-}
-.CodeMirror-wrap pre {
-  word-wrap: break-word;
-  white-space: pre-wrap;
-  word-break: normal;
-}
-
-.CodeMirror-linebackground {
-  position: absolute;
-  left: 0; right: 0; top: 0; bottom: 0;
-  z-index: 0;
-}
-
-.CodeMirror-linewidget {
-  position: relative;
-  z-index: 2;
-  overflow: auto;
-}
-
-.CodeMirror-widget {}
-
-.CodeMirror-code {
-  outline: none;
-}
-
-/* Force content-box sizing for the elements where we expect it */
-.CodeMirror-scroll,
-.CodeMirror-sizer,
-.CodeMirror-gutter,
-.CodeMirror-gutters,
-.CodeMirror-linenumber {
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-.CodeMirror-measure {
-  position: absolute;
-  width: 100%;
-  height: 0;
-  overflow: hidden;
-  visibility: hidden;
-}
-
-.CodeMirror-cursor { position: absolute; }
-.CodeMirror-measure pre { position: static; }
-
-div.CodeMirror-cursors {
-  visibility: hidden;
-  position: relative;
-  z-index: 3;
-}
-div.CodeMirror-dragcursors {
-  visibility: visible;
-}
-
-.CodeMirror-focused div.CodeMirror-cursors {
-  visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-.CodeMirror-crosshair { cursor: crosshair; }
-.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
-.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
-
-.cm-searching {
-  background: #ffa;
-  background: rgba(255, 255, 0, .4);
-}
-
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
-/* Used to force a border model for a node */
-.cm-force-border { padding-right: .1px; }
-
-@media print {
-  /* Hide the cursor when printing */
-  .CodeMirror div.CodeMirror-cursors {
-    visibility: hidden;
-  }
-}
-
-/* See issue #2901 */
-.cm-tab-wrap-hack:after { content: ''; }
-
-/* Help users use markselection to safely style text background */
-span.CodeMirror-selectedtext { background: none; }
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/css/json-formatter.min.css b/asterixdb/asterix-app/src/main/resources/queryui/css/json-formatter.min.css
deleted file mode 100644
index 4e69a40..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/css/json-formatter.min.css
+++ /dev/null
@@ -1 +0,0 @@
-/*! jsonformatter 0.6.0 - 2016-04-29T03:24:40.680Z | (c) 2014 Mohsen Azimi | http://www.apache.org/licenses/LICENSE-2.0 */.json-formatter-dark.json-formatter-row,.json-formatter-row{font-family:monospace}.json-formatter-dark.json-formatter-row .toggler.open:after,.json-formatter-row .toggler.open:after{transform:rotate(90deg)}.json-formatter-row,.json-formatter-row a,.json-formatter-row a:hover{color:#000;text-decoration:none}.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-row .children.empty.array:after{content:"[]"}.json-formatter-row .string{color:green;white-space:pre;word-wrap:break-word}.json-formatter-row .number{color:#00f}.json-formatter-row .boolean{color:red}.json-formatter-row .null{color:#855A00}.json-formatter-row .undefined{color:#ca0b69}.json-formatter-row .function{color:#FF20ED}.json-formatter-row .date{background-color:rgba(0,0,0,.05)}.json-formatter-row .url{text-decoration:underline;color:#00f;cursor:pointer}.json-formatter-row .bracket{color:#00f}.json-formatter-row .key{color:#00008B;cursor:pointer}.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-row .toggler:after{display:inline-block;transition:transform .1s ease-in;content:"►"}.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}.json-formatter-dark.json-formatter-row,.json-formatter-dark.json-formatter-row a,.json-formatter-dark.json-formatter-row a:hover{color:#fff;text-decoration:none}.json-formatter-dark.json-formatter-row .json-formatter-row{margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty{opacity:.5;margin-left:1em}.json-formatter-dark.json-formatter-row .children.empty.object:after{content:"No properties"}.json-formatter-dark.json-formatter-row .children.empty.array:after{content:"[]"}.json-formatter-dark.json-formatter-row .string{color:#31F031;white-space:pre;word-wrap:break-word}.json-formatter-dark.json-formatter-row .number{color:#66C2FF}.json-formatter-dark.json-formatter-row .boolean{color:#EC4242}.json-formatter-dark.json-formatter-row .null{color:#EEC97D}.json-formatter-dark.json-formatter-row .undefined{color:#ef8fbe}.json-formatter-dark.json-formatter-row .function{color:#FD48CB}.json-formatter-dark.json-formatter-row .date{background-color:rgba(255,255,255,.05)}.json-formatter-dark.json-formatter-row .url{text-decoration:underline;color:#027BFF;cursor:pointer}.json-formatter-dark.json-formatter-row .bracket{color:#9494FF}.json-formatter-dark.json-formatter-row .key{color:#23A0DB;cursor:pointer}.json-formatter-dark.json-formatter-row .constructor-name{cursor:pointer}.json-formatter-dark.json-formatter-row .toggler{font-size:.8em;line-height:1.2em;vertical-align:middle;opacity:.6;cursor:pointer}.json-formatter-dark.json-formatter-row .toggler:after{display:inline-block;transition:transform .1s ease-in;content:"►"}.json-formatter-dark.json-formatter-row>a>.thumbnail-text{opacity:0;transition:opacity .15s ease-in;font-style:italic}.json-formatter-dark.json-formatter-row:hover>a>.thumbnail-text{opacity:.6}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/css/master.css b/asterixdb/asterix-app/src/main/resources/queryui/css/master.css
deleted file mode 100644
index d174e9d..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/css/master.css
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-html,body{
-  height:100%;
-  padding: 0px;
-  margin: 0px;
-  overflow: hidden;
-}
-.main-container {
-  height:100%;
-  overflow-x:hidden;
-}
-
-.left-container{
-  transition:width .3s ease-out;
-  height:100%;
-  padding: 25px;
-  padding-left : 35px;
-  background-color: #ffffff;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.right-container{
-  transition:width .3s ease-out;
-  height:100%;
-  padding: 25px;
-  padding-left: 50px !important;
-  padding-right: 50px !important;
-  background-color: #fafafa;
-  background: linear-gradient(to right, #e9e9e9, #fafafa 3%);
-  overflow-y: scroll;
-}
-
-.right-toolbar{
-  margin-top: 20px;
-  margin-bottom: 20px;
-}
-
-.left-using-container{
-  margin-top: 5vh;
-}
-
-.asterix-nav{
-  box-shadow: 0 0px 5px 0 rgba(0, 0, 0, 0.2), 0 0px 20px 0 rgba(0, 0, 0, 0.19);
-  border-bottom: 1px solid #5687e4;
-}
-
-.asterix-nav > li{
-  background-color: #FFF;
-}
-
-.asterix-nav > li > a{
-  color: #cacaca;
-}
-
-.asterix-nav > li:first-child{
-  border-top-left-radius: 5px !important;
-}
-
-.asterix-nav > li:last-child{
-  border-top-right-radius: 5px !important;
-}
-
-.asterix-nav > li > a:hover, a:focus{
-  color: #000 !important;
-  background-color: inherit !important;
-  border-top-left-radius: inherit !important;
-  border-top-right-radius: inherit !important;
-  transition: 500ms;
-}
-
-.asterix-tabpage {
-  background-color: #FFF;
-  box-shadow: 0 0px 5px 0 rgba(0, 0, 0, 0.2), 0 0px 20px 0 rgba(0, 0, 0, 0.19);
-  padding : 15px;
-}
-
-.asterix-tabpage-scroll{
-  height: 45vh;
-  overflow-y: scroll;
-  overflow-x:hidden;
-  margin-bottom: 15px;
-  padding-right: 10px;
-}
-
-.asterix-nav-active {
-  background-color: #5687e4 !important;
-  color: #FFF !important;
-}
-
-.asterix-nav-active > a{
-  color: #FFF !important;
-}
-
-.input-container{
-  padding-top: 30px;
-}
-
-.input-container-code{
-  border: none !important;
-  box-shadow: none !important;
-  resize: none;
-  overflow-y : auto;
-}
-
-.logo {
-  width: 15vh;
-}
-
-.logo-collapsed{
-  width : 90%;
-  max-width : 15vh;
-  transition: .8s ease;
-}
-
-.icon-maximize{
-  text-align: right;
-  margin-top:15px;
-}
-
-.asterix-button{
-  cursor: pointer;
-  font-size: 1.4em;
-  text-decoration: none;
-  color: #AAA;
-  margin-right: 8px;
-}
-
-.asterix-button-selected{
-  color: #5687e4;
-}
-
-.asterix-button:only-of-type{
-  margin-right: 0px;
-}
-
-.asterix-button:hover{
-  color: #DDD;
-  transition-duration: 200ms;
-}
-
-.asterix-status{
-  color: #d7d0cb;
-  font-size: 1.3em;
-  text-emphasis: none;
-}
-
-.asterix-small{
-  color: #d7d0cb !important;
-  display: inline-block;
-  margin-right: 0.5em;
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-
-.asterix-nested{
-  color: #f5bd5b !important;
-}
-
-.asterix-inline-item{
-  padding: 0px;
-  margin: 0px;
-  text-decoration: none;
-  color: #000;
-}
-
-.asterix-list-view{
-  background-color: #FFF;
-}
-
-.asterix-list-wells{
-  width: 100%;
-  overflow: hidden;
-  padding: 10px;
-  background-color: #EEE;
-  display: flex;
-  flex-wrap: wrap;
-}
-
-.asterix-well{
-  background-color: #FFF;
-  padding: 10px;
-  border: 2px solid #d7d0cb;
-  border-radius: 5px;
-}
-
-.flex-well{
-  flex : 1 1 auto;
-  flex-basis: 1;
-  margin: 10px;
-}
-
-.margin-bottom{
-  margin-bottom: 10px;
-}
-
-.asterix-well:hover{
-  background-color: #f6f6f6;
-  transition: 200ms;
-}
-
-.asterix-well-right{
-  text-align: right;
-}
-
-.asterix-well-row{
-  margin-bottom: 10px;
-}
-
-.asterix-table {
-  border-bottom: 3px solid #EEE;
-  border-left: 3px solid #EEE;
-  border-right: 3px solid #EEE;
-}
-.asterix-table tr{
-  border-top: 3px solid #EEE !important;
-}
-
-.btn-asterix {
-  background-color: #5687e4;
-  color: #FFF;
-  padding-top: 5px;
-  padding-bottom: 5px;
-  width: 30%;
-  box-shadow: 0 0px 5px 0 rgba(0, 0, 0, 0.2), 0 0px 20px 0 rgba(0, 0, 0, 0.19);
-}
-
-.vh-spacer{
-  margin-top: 35px;
-}
-
-::-webkit-scrollbar {
-    width: 12px;
-}
-::-webkit-scrollbar-track {
-    background-color: #EEE;
-}
-::-webkit-scrollbar-thumb {
-    background-color: #CCC;
-}
-::-webkit-scrollbar-thumb:hover {
-    background-color: #AAA;
-}
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.eot b/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index b93a495..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.eot
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.svg b/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index 94fb549..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="400" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
-<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
-<glyph unicode="&#x2000;" horiz-adv-x="650" />
-<glyph unicode="&#x2001;" horiz-adv-x="1300" />
-<glyph unicode="&#x2002;" horiz-adv-x="650" />
-<glyph unicode="&#x2003;" horiz-adv-x="1300" />
-<glyph unicode="&#x2004;" horiz-adv-x="433" />
-<glyph unicode="&#x2005;" horiz-adv-x="325" />
-<glyph unicode="&#x2006;" horiz-adv-x="216" />
-<glyph unicode="&#x2007;" horiz-adv-x="216" />
-<glyph unicode="&#x2008;" horiz-adv-x="162" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="325" />
-<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
-<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
-<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
-<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
-<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
-<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
-<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
-<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
-<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
-<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
-<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
-<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
-<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
-<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
-<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
-<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
-<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
-<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
-<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
-<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
-<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
-<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
-<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
-<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
-<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
-<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
-<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
-<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
-<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
-<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
-<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
-<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
-<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
-<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
-<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
-<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
-<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
-<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
-<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
-<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
-<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
-<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
-<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
-<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
-<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
-<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
-<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
-<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
-<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
-<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
-<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
-<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
-<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
-<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
-<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
-<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
-<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
-<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
-<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
-<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
-<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
-<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
-<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
-<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
-<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
-<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
-<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
-<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
-<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
-<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
-<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
-<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
-<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
-<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
-<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
-<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
-<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
-<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
-<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
-<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
-<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
-<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
-<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
-<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
-<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
-<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
-<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
-<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
-<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
-<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
-<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
-<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
-<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
-<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
-<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
-<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
-<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
-<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
-<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
-<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
-<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
-<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
-<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
-<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
-<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
-<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
-<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
-<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
-<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
-<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
-<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
-<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
-<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
-<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
-<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
-<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
-<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
-<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
-<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
-<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
-<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
-<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
-<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
-<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
-<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
-<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
-<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
-<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
-<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
-<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
-<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
-<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
-<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
-<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
-<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
-<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
-<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
-<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
-<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
-<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
-<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
-<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
-<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
-<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
-<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
-<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
-<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
-<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
-<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
-<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
-<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
-<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
-<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
-<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
-<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
-<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
-<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
-<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
-<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
-<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
-<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
-<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
-<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
-<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
-<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
-<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
-<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
-<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
-<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
-<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
-<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
-</font>
-</defs></svg> 
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.ttf b/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 1413fc6..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.ttf
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff b/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 9e61285..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff2 b/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff2
deleted file mode 100644
index 64539b5..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/fonts/glyphicons-halflings-regular.woff2
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/img/asterixlogo-collapsed.png b/asterixdb/asterix-app/src/main/resources/queryui/img/asterixlogo-collapsed.png
deleted file mode 100644
index aa9d127..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/img/asterixlogo-collapsed.png
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/img/finalasterixlogo.png b/asterixdb/asterix-app/src/main/resources/queryui/img/finalasterixlogo.png
deleted file mode 100644
index 10ce431..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/img/finalasterixlogo.png
+++ /dev/null
Binary files differ
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/angular.min.js b/asterixdb/asterix-app/src/main/resources/queryui/js/angular.min.js
deleted file mode 100644
index 734260c..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/angular.min.js
+++ /dev/null
@@ -1,310 +0,0 @@
-/* AngularJS v1.5.5 http://angularjs.org | (c) 2010-2016 Google, Inc. | License: MIT */
-(function(v){'use strict';function O(a){return function(){var b=arguments[0],d;d="["+(a?a+":":"")+b+"] http://errors.angularjs.org/1.5.5/"+(a?a+"/":"")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?"?":"&")+"p"+(b-1)+"=";var c=encodeURIComponent,e;e=arguments[b];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function ya(a){if(null==a||Va(a))return!1;if(K(a)||F(a)||B&&a instanceof B)return!0;
-var b="length"in Object(a)&&a.length;return Q(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"==typeof a.item)}function q(a,b,d){var c,e;if(a)if(E(a))for(c in a)"prototype"==c||"length"==c||"name"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(K(a)||ya(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(oc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&
-b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function pc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function qc(a){return function(b,d){a(d,b)}}function Xd(){return++nb}function Nb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(G(g)||E(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var n=h[k],m=g[n];d&&G(m)?fa(m)?a[n]=new Date(m.valueOf()):Wa(m)?a[n]=new RegExp(m):m.nodeName?a[n]=m.cloneNode(!0):
-Ob(m)?a[n]=m.clone():(G(a[n])||(a[n]=K(m)?[]:{}),Nb(a[n],[m],!0)):a[n]=m}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function R(a){return Nb(a,za.call(arguments,1),!1)}function Yd(a){return Nb(a,za.call(arguments,1),!0)}function X(a){return parseInt(a,10)}function Pb(a,b){return R(Object.create(a),b)}function C(){}function Xa(a){return a}function da(a){return function(){return a}}function rc(a){return E(a.toString)&&a.toString!==ma}function y(a){return"undefined"===typeof a}function x(a){return"undefined"!==
-typeof a}function G(a){return null!==a&&"object"===typeof a}function oc(a){return null!==a&&"object"===typeof a&&!sc(a)}function F(a){return"string"===typeof a}function Q(a){return"number"===typeof a}function fa(a){return"[object Date]"===ma.call(a)}function E(a){return"function"===typeof a}function Wa(a){return"[object RegExp]"===ma.call(a)}function Va(a){return a&&a.window===a}function Ya(a){return a&&a.$evalAsync&&a.$watch}function Da(a){return"boolean"===typeof a}function Zd(a){return a&&Q(a.length)&&
-$d.test(ma.call(a))}function Ob(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function ae(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function va(a){return P(a.nodeName||a[0]&&a[0].nodeName)}function Za(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function qa(a,b){function d(a,b){var d=b.$$hashKey,e;if(K(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(oc(a))for(e in a)b[e]=c(a[e]);else if(a&&"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&
-(b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!G(a))return a;var b=f.indexOf(a);if(-1!==b)return g[b];if(Va(a)||Ya(a))throw Aa("cpws");var b=!1,c=e(a);void 0===c&&(c=K(a)?[]:Object.create(sc(a)),b=!0);f.push(a);g.push(c);return b?d(a,c):c}function e(a){switch(ma.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(c(a.buffer));
-case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^\/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(E(a.cloneNode))return a.cloneNode(!0)}var f=[],
-g=[];if(b){if(Zd(b)||"[object ArrayBuffer]"===ma.call(b))throw Aa("cpta");if(a===b)throw Aa("cpi");K(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]});f.push(a);g.push(b);return d(a,b)}return c(a)}function ha(a,b){if(K(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(G(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function pa(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&&
-"object"==d)if(K(a)){if(!K(b))return!1;if((d=a.length)==b.length){for(c=0;c<d;c++)if(!pa(a[c],b[c]))return!1;return!0}}else{if(fa(a))return fa(b)?pa(a.getTime(),b.getTime()):!1;if(Wa(a))return Wa(b)?a.toString()==b.toString():!1;if(Ya(a)||Ya(b)||Va(a)||Va(b)||K(b)||fa(b)||Wa(b))return!1;d=T();for(c in a)if("$"!==c.charAt(0)&&!E(a[c])){if(!pa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&x(b[c])&&!E(b[c]))return!1;return!0}return!1}function $a(a,b,d){return a.concat(za.call(b,
-d))}function tc(a,b){var d=2<arguments.length?za.call(arguments,2):[];return!E(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,$a(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function be(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Va(b)?d="$WINDOW":b&&v.document===b?d="$DOCUMENT":Ya(b)&&(d="$SCOPE");return d}function ab(a,b){if(!y(a))return Q(b)||(b=b?2:null),JSON.stringify(a,be,
-b)}function uc(a){return F(a)?JSON.parse(a):a}function vc(a,b){a=a.replace(ce,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return isNaN(d)?b:d}function Qb(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=vc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function wa(a){a=B(a).clone();try{a.empty()}catch(b){}var d=B("<div>").append(a).html();try{return a[0].nodeType===Ma?P(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+P(b)})}catch(c){return P(d)}}
-function wc(a){try{return decodeURIComponent(a)}catch(b){}}function xc(a){var b={};q((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),x(e)&&(f=x(f)?wc(f):!0,ua.call(b,e)?K(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Rb(a){var b=[];q(a,function(a,c){K(a)?q(a,function(a){b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?"":"="+ja(a,!0)))});return b.length?b.join("&"):""}
-function ob(a){return ja(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function de(a,b){var d,c,e=Na.length;for(c=0;c<e;++c)if(d=Na[c]+b,F(d=a.getAttribute(d)))return d;return null}function ee(a,b){var d,c,e={};q(Na,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});
-q(Na,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==de(d,"strict-di"),b(d,c?[c]:[],e))}function yc(a,b,d){G(d)||(d={});d=R({strictDi:!1},d);var c=function(){a=B(a);if(a.injector()){var c=a[0]===v.document?"document":wa(a);throw Aa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);
-b.unshift("ng");c=bb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;v&&e.test(v.name)&&(d.debugInfoEnabled=!0,v.name=v.name.replace(e,""));if(v&&!f.test(v.name))return c();v.name=v.name.replace(f,"");ea.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};E(ea.resumeDeferredBootstrap)&&ea.resumeDeferredBootstrap()}function fe(){v.name=
-"NG_ENABLE_DEBUG_INFO!"+v.name;v.location.reload()}function ge(a){a=ea.element(a).injector();if(!a)throw Aa("test");return a.get("$$testability")}function zc(a,b){b=b||"_";return a.replace(he,function(a,c){return(c?b:"")+a.toLowerCase()})}function ie(){var a;if(!Ac){var b=pb();(Z=y(b)?v.jQuery:b?v[b]:void 0)&&Z.fn.on?(B=Z,R(Z.fn,{scope:Oa.scope,isolateScope:Oa.isolateScope,controller:Oa.controller,injector:Oa.injector,inheritedData:Oa.inheritedData}),a=Z.cleanData,Z.cleanData=function(b){for(var c,
-e=0,f;null!=(f=b[e]);e++)(c=Z._data(f,"events"))&&c.$destroy&&Z(f).triggerHandler("$destroy");a(b)}):B=U;ea.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa("areq",b||"?",d||"required");return a}function Pa(a,b,d){d&&K(a)&&(a=a[a.length-1]);qb(E(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Qa(a,b){if("hasOwnProperty"===a)throw Aa("badname",b);}function Bc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=
-b[g],a&&(a=(e=a)[c]);return!d&&E(a)?tc(e,a):a}function rb(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=B(za.call(a,0,e))),c.push(b);return c||a}function T(){return Object.create(null)}function je(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=O("$injector"),c=O("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||O;return b(a,"module",function(){var a={};return function(f,g,h){if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&
-(a[f]=null);return b(a,f,function(){function a(b,d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return M}}function b(a,d){return function(b,e){e&&E(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return M}}if(!g)throw d("nomod",f);var c=[],e=[],r=[],N=a("$injector","invoke","push",e),M={_invokeQueue:c,_configBlocks:e,_runBlocks:r,requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide",
-"constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:N,run:function(a){r.push(a);return this}};h&&N(h);return M})}})}function ke(a){R(a,{bootstrap:yc,copy:qa,extend:R,merge:Yd,equals:pa,element:B,forEach:q,injector:bb,noop:C,bind:tc,toJson:ab,fromJson:uc,identity:Xa,isUndefined:y,
-isDefined:x,isString:F,isFunction:E,isObject:G,isNumber:Q,isElement:Ob,isArray:K,version:le,isDate:fa,lowercase:P,uppercase:sb,callbacks:{counter:0},getTestability:ge,$$minErr:O,$$csp:Ea,reloadWithDebugInfo:fe});Sb=je(v);Sb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:me});a.provider("$compile",Cc).directive({a:ne,input:Dc,textarea:Dc,form:oe,script:pe,select:qe,style:re,option:se,ngBind:te,ngBindHtml:ue,ngBindTemplate:ve,ngClass:we,ngClassEven:xe,ngClassOdd:ye,ngCloak:ze,ngController:Ae,
-ngForm:Be,ngHide:Ce,ngIf:De,ngInclude:Ee,ngInit:Fe,ngNonBindable:Ge,ngPluralize:He,ngRepeat:Ie,ngShow:Je,ngStyle:Ke,ngSwitch:Le,ngSwitchWhen:Me,ngSwitchDefault:Ne,ngOptions:Oe,ngTransclude:Pe,ngModel:Qe,ngList:Re,ngChange:Se,pattern:Ec,ngPattern:Ec,required:Fc,ngRequired:Fc,minlength:Gc,ngMinlength:Gc,maxlength:Hc,ngMaxlength:Hc,ngValue:Te,ngModelOptions:Ue}).directive({ngInclude:Ve}).directive(tb).directive(Ic);a.provider({$anchorScroll:We,$animate:Xe,$animateCss:Ye,$$animateJs:Ze,$$animateQueue:$e,
-$$AnimateRunner:af,$$animateAsyncRun:bf,$browser:cf,$cacheFactory:df,$controller:ef,$document:ff,$exceptionHandler:gf,$filter:Jc,$$forceReflow:hf,$interpolate:jf,$interval:kf,$http:lf,$httpParamSerializer:mf,$httpParamSerializerJQLike:nf,$httpBackend:of,$xhrFactory:pf,$location:qf,$log:rf,$parse:sf,$rootScope:tf,$q:uf,$$q:vf,$sce:wf,$sceDelegate:xf,$sniffer:yf,$templateCache:zf,$templateRequest:Af,$$testability:Bf,$timeout:Cf,$window:Df,$$rAF:Ef,$$jqLite:Ff,$$HashMap:Gf,$$cookieReader:Hf})}])}function cb(a){return a.replace(If,
-function(a,d,c,e){return e?c.toUpperCase():c}).replace(Jf,"Moz$1")}function Kc(a){a=a.nodeType;return 1===a||!a||9===a}function Lc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Tb.test(a)){d=d||e.appendChild(b.createElement("div"));c=(Kf.exec(a)||["",""])[1].toLowerCase();c=ia[c]||ia._default;d.innerHTML=c[1]+a.replace(Lf,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=$a(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";q(f,function(a){e.appendChild(a)});
-return e}function Mc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function U(a){if(a instanceof U)return a;var b;F(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!=a.charAt(0))throw Ub("nosel");return new U(a)}if(b){b=v.document;var d;a=(d=Mf.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Nc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||db(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,e=d.length;c<e;c++)db(d[c])}function Oc(a,
-b,d,c){if(x(c))throw Ub("offargs");var e=(c=vb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];x(d)&&Za(c||[],d);x(d)&&c&&0<c.length||(a.removeEventListener(b,f,!1),delete e[b])};q(b.split(" "),function(a){g(a);wb[a]&&g(wb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function db(a,b){var d=a.ng339,c=d&&eb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Oc(a)),delete eb[d],a.ng339=void 0))}function vb(a,b){var d=
-a.ng339,d=d&&eb[d];b&&!d&&(a.ng339=d=++Nf,d=eb[d]={events:{},data:{},handle:void 0});return d}function Wb(a,b,d){if(Kc(a)){var c=x(d),e=!c&&b&&!G(b),f=!b;a=(a=vb(a,!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];R(a,b)}}}function xb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function yb(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",V((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g,
-" ").replace(" "+V(b)+" "," ")))})}function zb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=V(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",V(d))}}function Nc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Pc(a,b){return Ab(a,"$"+(b||"ngController")+"Controller")}function Ab(a,
-b,d){9==a.nodeType&&(a=a.documentElement);for(b=K(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(x(d=B.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Qc(a){for(ub(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Bb(a,b){b||ub(a);var d=a.parentNode;d&&d.removeChild(a)}function Of(a,b){b=b||v;if("complete"===b.document.readyState)b.setTimeout(a);else B(b).on("load",a)}function Rc(a,b){var d=Cb[b.toLowerCase()];return d&&Sc[va(a)]&&d}function Pf(a,b){var d=function(c,
-d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(y(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||Qf;1<g&&(f=ha(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem=
-a;return d}function Qf(a,b,d){d.call(a,b)}function Rf(a,b,d){var c=b.relatedTarget;c&&(c===a||Sf.call(a,c))||d.call(a,b)}function Ff(){this.$get=function(){return R(U,{hasClass:function(a,b){a.attr&&(a=a[0]);return xb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return yb(a,b)}})}}function Fa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"==d||"object"==d&&null!==a?a.$$hashKey=
-d+":"+(b||Xd)():d+":"+a}function Ra(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function Tc(a){a=Function.prototype.toString.call(a).replace(Tf,"");return a.match(Uf)||a.match(Vf)}function Wf(a){return(a=Tc(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function bb(a,b){function d(a){return function(b,c){if(G(b))q(b,qc(a));else return a(b,c)}}function c(a,b){Qa(a,"service");if(E(b)||K(b))b=r.instantiate(b);if(!b.$get)throw Ga("pget",a);return m[a+"Provider"]=
-b}function e(a,b){return function(){var c=w.invoke(b,this);if(y(c))throw Ga("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){qb(y(a)||K(a),"modulesToLoad","not an array");var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=r.get(e[0]);f[e[1]].apply(f,e[2])}}if(!n.get(a)){n.put(a,!0);try{F(a)?(c=Sb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):E(a)?b.push(r.invoke(a)):K(a)?b.push(r.invoke(a)):
-Pa(a,"module")}catch(e){throw K(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ga("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ga("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=bb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];
-if("string"!==typeof l)throw Ga("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);K(a)&&(a=a[a.length-1]);d=11>=Ca?!1:"function"===typeof a&&/^(?:class\s|constructor\()/.test(Function.prototype.toString.call(a));return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=K(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,
-a))},get:d,annotate:bb.$$annotate,has:function(b){return m.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],n=new Ra([],!0),m={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,da(b),!1)}),constant:d(function(a,b){Qa(a,"constant");m[a]=b;N[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=w.invoke(d,c);return w.invoke(b,null,
-{$delegate:a})}}}},r=m.$injector=h(m,function(a,b){ea.isString(b)&&l.push(b);throw Ga("unpr",l.join(" <- "));}),N={},M=h(N,function(a,b){var c=r.get(a+"Provider",b);return w.invoke(c.$get,c,void 0,a)}),w=M;m.$injectorProvider={$get:da(M)};var p=g(a),w=M.get("$injector");w.strictDi=b;q(p,function(a){a&&w.invoke(a)});return w}function We(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,
-function(a){if("a"===va(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;E(c)?c=c():Ob(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Q(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=F(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===
-b&&""===a||Of(function(){c.$evalAsync(g)})});return g}]}function fb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;K(a)&&(a=a.join(" "));K(b)&&(b=b.join(" "));return a+" "+b}function Xf(a){F(a)&&(a=a.split(" "));var b=T();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ha(a){return G(a)?a:{}}function Yf(a,b,d,c){function e(a){try{a.apply(null,za.call(arguments,1))}finally{if(M--,0===M)for(;w.length;)try{w.pop()()}catch(b){d.error(b)}}}function f(){u=null;g();h()}function g(){p=I();
-p=y(p)?null:p;pa(p,L)&&(p=L);L=p}function h(){if(t!==k.url()||H!==p)t=k.url(),H=p,q(J,function(a){a(k.url(),p)})}var k=this,l=a.location,n=a.history,m=a.setTimeout,r=a.clearTimeout,N={};k.isMock=!1;var M=0,w=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){M++};k.notifyWhenNoOutstandingRequests=function(a){0===M?a():w.push(a)};var p,H,t=l.href,z=b.find("base"),u=null,I=c.history?function(){try{return n.state}catch(a){}}:C;g();H=p;k.url=function(b,d,e){y(e)&&(e=null);l!==
-a.location&&(l=a.location);n!==a.history&&(n=a.history);if(b){var f=H===e;if(t===b&&(!c.history||f))return k;var h=t&&Ia(t)===Ia(b);t=b;H=e;if(!c.history||h&&f){if(!h||u)u=b;d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(u=b)}else n[d?"replaceState":"pushState"](e,"",b),g(),H=p;return k}return u||l.href.replace(/%27/g,"'")};k.state=function(){return p};var J=[],D=!1,L=null;k.onUrlChange=function(b){if(!D){if(c.history)B(a).on("popstate",f);B(a).on("hashchange",
-f);D=!0}J.push(b);return b};k.$$applicationDestroyed=function(){B(a).off("hashchange popstate",f)};k.$$checkUrlChange=h;k.baseHref=function(){var a=z.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};k.defer=function(a,b){var c;M++;c=m(function(){delete N[c];e(a)},b||0);N[c]=!0;return c};k.defer.cancel=function(a){return N[a]?(delete N[a],r(a),e(C),!0):!1}}function cf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new Yf(a,c,b,d)}]}function df(){this.$get=
-function(){function a(a,c){function e(a){a!=m&&(r?r==a&&(r=a.n):r=a,f(a.n,a.p),f(a,m),m=a,m.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw O("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=T(),l=c&&c.capacity||Number.MAX_VALUE,n=T(),m=null,r=null;return b[a]={put:function(a,b){if(!y(b)){if(l<Number.MAX_VALUE){var c=n[a]||(n[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(r.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;e(b)}return k[a]},
-remove:function(a){if(l<Number.MAX_VALUE){var b=n[a];if(!b)return;b==m&&(m=b.p);b==r&&(r=b.n);f(b.n,b.p);delete n[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=T();g=0;n=T();m=r=null},destroy:function(){n=h=k=null;delete b[a]},info:function(){return R({},h,{size:g})}}}var b={};a.info=function(){var a={};q(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function zf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Cc(a,b){function d(a,
-b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/,e=T();q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw ga("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f};g[4]&&(n[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==P(b))throw ga("baddir",a);if(a!==a.trim())throw ga("baddir",a);}var e={},f=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,g=/(([\w\-]+)(?:\:([^;]+))?;?)/,
-h=ae("ngSrc,ngSrcset,src,srcset"),k=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,l=/^(on[a-z]+|formaction)$/,n=T();this.directive=function M(b,d){Qa(b,"directive");F(b)?(c(b),qb(d,"directiveFactory"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];q(e[b],function(e,f){try{var g=a.invoke(e);E(g)?g={compile:da(g)}:!g.compile&&g.link&&(g.compile=da(g.link));g.priority=g.priority||0;g.index=f;g.name=g.name||b;g.require=g.require||g.controller&&g.name;g.restrict=
-g.restrict||"EA";g.$$moduleName=e.$$moduleName;d.push(g)}catch(h){c(h)}});return d}])),e[b].push(d)):q(b,qc(M));return this};this.component=function(a,b){function c(a){function e(b){return E(b)||K(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Uc(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",
-require:b.require};q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}var d=b.controller||function(){};q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,E(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return x(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled=
-function(a){return x(a)?(m=a,this):m};var r=10;this.onChangesTtl=function(a){return arguments.length?(r=a,this):r};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,n,t,z,u,I,J,D){function L(){try{if(!--qa)throw Z=void 0,ga("infchng",r);u.$apply(function(){for(var a=0,b=Z.length;a<b;++a)Z[a]();Z=void 0})}finally{qa++}}function S(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<
-e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function $(a,b,c){na.innerHTML="<span "+b+">";b=na.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function A(a,b){try{a.addClass(b)}catch(c){}}function ba(a,b,c,d,e){a instanceof B||(a=B(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===Ma&&k.nodeValue.match(f)&&Mc(k,a[g]=v.document.createElement("span"))}var l=s(a,b,a,c,d,e);ba.$$addScopeClass(a);var m=null;return function(b,
-c,d){qb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&(f=f.$$boundTransclude);m||(m=(d=d&&d[0])?"foreignobject"!==va(d)&&ma.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?B(ca(m,B("<div>").append(a).html())):c?Oa.clone.call(a):a;if(g)for(var h in g)d.data("$"+h+"Controller",g[h].instance);ba.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function s(a,b,c,d,e,f){function g(a,
-c,d,e){var f,k,l,m,n,t,p;if(r)for(p=Array(c.length),m=0;m<h.length;m+=3)f=h[m],p[f]=c[f];else p=c;m=0;for(n=h.length;m<n;)k=p[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),ba.$$addScopeInfo(B(k),l)):l=a,t=c.transcludeOnThisElement?ka(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?ka(a,b):null,c(f,l,k,d,t)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k,l,m,n,r,t=0;t<a.length;t++){k=new S;l=x(a[t],[],k,0===t?d:void 0,e);(f=l.length?Ba(l,a[t],k,b,c,null,[],[],f):null)&&f.scope&&ba.$$addScopeClass(k.$$element);
-k=f&&f.terminal||!(m=a[t].childNodes)||!m.length?null:s(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(t,f,k),n=!0,r=r||f;f=null}return n?g:null}function ka(a,b,c){function d(e,f,g,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=T(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?ka(a,b.$$slots[f],c):null;return d}function x(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:la(b,
-xa(va(a)),"E",d,e);for(var l,m,n,t=a.attributes,r=0,p=t&&t.length;r<p;r++){var I=!1,D=!1;l=t[r];k=l.name;m=V(l.value);l=xa(k);if(n=ya.test(l))k=k.replace(Vc,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(Aa))&&Q(l[1])&&(I=k,D=k.substr(0,k.length-5)+"end",k=k.substr(0,k.length-6));l=xa(k.toLowerCase());h[l]=k;if(n||!c.hasOwnProperty(l))c[l]=m,Rc(a,l)&&(c[l]=!0);fa(a,b,m,l,n);la(b,l,"A",d,e,I,D)}a=a.className;G(a)&&(a=a.animVal);if(F(a)&&""!==a)for(;k=g.exec(a);)l=xa(k[2]),
-la(b,l,"C",d,e)&&(c[l]=V(k[3])),a=a.substr(k.index+k[0].length);break;case Ma:if(11===Ca)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Ma;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);X(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=xa(k[1]),la(b,l,"M",d,e)&&(c[l]=V(k[2]))}catch(J){}}b.sort(Y);return b}function Wc(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ga("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&
-e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function Xc(a,b,c){return function(d,e,f,g,h){e=Wc(e[0],b,c);return a(d,e,f,g,h)}}function Yb(a,b,c,d,e,f){var g;return a?ba(b,c,d,e,f):function(){g||(g=ba(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function Ba(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=Xc(a,c,d));a.require=A.require;a.directiveName=M;if(D===A||A.$$isolateScope)a=ha(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=Xc(b,c,d));
-b.require=A.require;b.directiveName=M;if(D===A||A.$$isolateScope)b=ha(b,{isolateScope:!0});k.push(b)}}function n(a,c,e,f,g){function l(a,b,c,d){var e;Ya(a)||(d=c,c=b,b=a,a=void 0);H&&(e=u);c||(c=H?z.parent():z);if(d){var f=g.$$slots[d];if(f)return f(a,b,e,c,$);if(y(f))throw ga("noslot",d,wa(z));}else return g(a,b,e,c,$)}var m,t,p,A,w,u,L,z;b===e?(f=d,z=d.$$element):(z=B(e),f=new S(z,d));w=c;D?A=c.$new(!0):r&&(w=c.$parent);g&&(L=l,L.$$boundTransclude=g,L.isSlotFilled=function(a){return!!g.$$slots[a]});
-I&&(u=O(z,f,L,I,A,c,D));D&&(ba.$$addScopeInfo(z,A,!0,!(J&&(J===D||J===D.$$originalDirective))),ba.$$addScopeClass(z,!0),A.$$isolateBindings=D.$$isolateBindings,t=ia(c,f,A,A.$$isolateBindings,D),t.removeWatches&&A.$on("$destroy",t.removeWatches));for(m in u){t=I[m];p=u[m];var Xb=t.$$bindings.bindToController;p.bindingInfo=p.identifier&&Xb?ia(w,f,p.instance,Xb,t):{};var M=p();M!==p.instance&&(p.instance=M,z.data("$"+t.name+"Controller",M),p.bindingInfo.removeWatches&&p.bindingInfo.removeWatches(),p.bindingInfo=
-ia(w,f,p.instance,Xb,t))}q(I,function(a,b){var c=a.require;a.bindToController&&!K(c)&&G(c)&&R(u[b].instance,gb(b,c,z,u))});q(u,function(a){var b=a.instance;E(b.$onChanges)&&b.$onChanges(a.bindingInfo.initialChanges);E(b.$onInit)&&b.$onInit();E(b.$onDestroy)&&w.$on("$destroy",function(){b.$onDestroy()})});m=0;for(t=h.length;m<t;m++)p=h[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);var $=c;D&&(D.template||null===D.templateUrl)&&($=A);a&&a($,e.childNodes,void 0,g);for(m=
-k.length-1;0<=m;m--)p=k[m],ja(p,p.isolateScope?A:c,z,f,p.require&&gb(p.directiveName,p.require,z,u),L);q(u,function(a){a=a.instance;E(a.$postLink)&&a.$postLink()})}l=l||{};for(var t=-Number.MAX_VALUE,r=l.newScopeDirective,I=l.controllerDirectives,D=l.newIsolateScopeDirective,J=l.templateDirective,w=l.nonTlbTranscludeDirective,u=!1,L=!1,H=l.hasElementTranscludeDirective,z=d.$$element=B(b),A,M,$,s=e,Sa,ka=!1,C=!1,v,F=0,Ba=a.length;F<Ba;F++){A=a[F];var P=A.$$start,Q=A.$$end;P&&(z=Wc(b,P,Q));$=void 0;
-if(t>A.priority)break;if(v=A.scope)A.templateUrl||(G(v)?(W("new/isolated scope",D||r,A,z),D=A):W("new/isolated scope",D,A,z)),r=r||A;M=A.name;if(!ka&&(A.replace&&(A.templateUrl||A.template)||A.transclude&&!A.$$tlb)){for(v=F+1;ka=a[v++];)if(ka.transclude&&!ka.$$tlb||ka.replace&&(ka.templateUrl||ka.template)){C=!0;break}ka=!0}!A.templateUrl&&A.controller&&(v=A.controller,I=I||T(),W("'"+M+"' controller",I[M],A,z),I[M]=A);if(v=A.transclude)if(u=!0,A.$$tlb||(W("transclusion",w,A,z),w=A),"element"==v)H=
-!0,t=A.priority,$=z,z=d.$$element=B(ba.$$createComment(M,d[M])),b=z[0],da(f,za.call($,0),b),$[0].$$parentNode=$[0].parentNode,s=Yb(C,$,e,t,g&&g.name,{nonTlbTranscludeDirective:w});else{var la=T();$=B(Vb(b)).contents();if(G(v)){$=[];var Y=T(),X=T();q(v,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Y[a]=b;la[b]=null;X[b]=c});q(z.contents(),function(a){var b=Y[xa(va(a))];b?(X[b]=!0,la[b]=la[b]||[],la[b].push(a)):$.push(a)});q(X,function(a,b){if(!a)throw ga("reqslot",b);});for(var Z in la)la[Z]&&
-(la[Z]=Yb(C,la[Z],e))}z.empty();s=Yb(C,$,e,void 0,void 0,{needsNewScope:A.$$isolateScope||A.$$newScope});s.$$slots=la}if(A.template)if(L=!0,W("template",J,A,z),J=A,v=E(A.template)?A.template(z,d):A.template,v=ta(v),A.replace){g=A;$=Tb.test(v)?Yc(ca(A.templateNamespace,V(v))):[];b=$[0];if(1!=$.length||1!==b.nodeType)throw ga("tplrt",M,"");da(f,z,b);Ba={$attr:{}};v=x(b,[],Ba);var ea=a.splice(F+1,a.length-(F+1));(D||r)&&Zc(v,D,r);a=a.concat(v).concat(ea);U(d,Ba);Ba=a.length}else z.html(v);if(A.templateUrl)L=
-!0,W("template",J,A,z),J=A,A.replace&&(g=A),n=aa(a.splice(F,a.length-F),z,d,f,u&&s,h,k,{controllerDirectives:I,newScopeDirective:r!==A&&r,newIsolateScopeDirective:D,templateDirective:J,nonTlbTranscludeDirective:w}),Ba=a.length;else if(A.compile)try{Sa=A.compile(z,d,s),E(Sa)?m(null,Sa,P,Q):Sa&&m(Sa.pre,Sa.post,P,Q)}catch(fa){c(fa,wa(z))}A.terminal&&(n.terminal=!0,t=Math.max(t,A.priority))}n.scope=r&&!0===r.scope;n.transcludeOnThisElement=u;n.templateOnThisElement=L;n.transclude=s;l.hasElementTranscludeDirective=
-H;return n}function gb(a,b,c,d){var e;if(F(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw ga("ctreq",b,a);}else if(K(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=gb(a,b[g],c,d);else G(b)&&(e={},q(b,function(b,f){e[f]=gb(a,b,c,d)}));return e||null}function O(a,b,c,d,e,f,g){var h=T(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,
-$element:a,$attrs:b,$transclude:c},n=l.controller;"@"==n&&(n=b[l.name]);m=z(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function Zc(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Pb(a[d],{$$isolateScope:b,$$newScope:c})}function la(b,f,g,h,k,l,m){if(f===k)return null;k=null;if(e.hasOwnProperty(f)){var n;f=a.get(f+"Directive");for(var t=0,r=f.length;t<r;t++)try{if(n=f[t],(y(h)||h>n.priority)&&-1!=n.restrict.indexOf(g)){l&&(n=Pb(n,{$$start:l,$$end:m}));if(!n.$$bindings){var I=
-n,D=n,A=n.name,J={isolateScope:null,bindToController:null};G(D.scope)&&(!0===D.bindToController?(J.bindToController=d(D.scope,A,!0),J.isolateScope={}):J.isolateScope=d(D.scope,A,!1));G(D.bindToController)&&(J.bindToController=d(D.bindToController,A,!0));if(G(J.bindToController)){var w=D.controller,z=D.controllerAs;if(!w)throw ga("noctrl",A);if(!Uc(w,z))throw ga("noident",A);}var u=I.$$bindings=J;G(u.isolateScope)&&(n.$$isolateBindings=u.isolateScope)}b.push(n);k=n}}catch(L){c(L)}}return k}function Q(b){if(e.hasOwnProperty(b))for(var c=
-a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=c[d],b.multiElement)return!0;return!1}function U(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;q(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,f){"class"==f?(A(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function aa(a,b,c,d,e,f,
-g,h){var k=[],l,m,t=b[0],p=a.shift(),r=Pb(p,{templateUrl:null,transclude:null,replace:null,$$originalDirective:p}),I=E(p.templateUrl)?p.templateUrl(b,c):p.templateUrl,D=p.templateNamespace;b.empty();n(I).then(function(n){var J,w;n=ta(n);if(p.replace){n=Tb.test(n)?Yc(ca(D,V(n))):[];J=n[0];if(1!=n.length||1!==J.nodeType)throw ga("tplrt",p.name,I);n={$attr:{}};da(d,b,J);var z=x(J,[],n);G(p.scope)&&Zc(z,!0);a=z.concat(a);U(c,n)}else J=t,b.html(n);a.unshift(r);l=Ba(a,J,c,e,b,p,f,g,h);q(d,function(a,c){a==
-J&&(d[c]=b[0])});for(m=s(b[0].childNodes,e);k.length;){n=k.shift();w=k.shift();var u=k.shift(),L=k.shift(),z=b[0];if(!n.$$destroyed){if(w!==t){var S=w.className;h.hasElementTranscludeDirective&&p.replace||(z=Vb(J));da(u,B(w),z);A(B(z),S)}w=l.transcludeOnThisElement?ka(n,l.transclude,L):L;l(m,n,z,d,w)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?k.push(b,c,d,a):(l.transcludeOnThisElement&&(a=ka(b,l.transclude,e)),l(m,b,c,d,a)))}}function Y(a,b){var c=b.priority-a.priority;return 0!==
-c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function W(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ga("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,wa(d));}function X(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ba.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ba.$$addBindingClass(e);ba.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ca(a,b){a=
-P(a||"html");switch(a){case "svg":case "math":var c=v.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function ea(a,b){if("srcdoc"==b)return I.HTML;var c=va(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return I.RESOURCE_URL}function fa(a,c,d,e,f){var g=ea(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if("multiple"===e&&"select"===va(a))throw ga("selmulti",wa(a));c.push({priority:100,compile:function(){return{pre:function(a,
-c,h){c=h.$$observers||(h.$$observers=T());if(l.test(e))throw ga("nodomevents");var m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){"class"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function da(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=
-c);break}f&&f.replaceChild(c,d);a=v.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);B.hasData(d)&&(B.data(c,B.data(d)),B(d).off("$destroy"));B.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ha(a,b){return R(function(){return a.apply(null,arguments)},a,b)}function ja(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,wa(d))}}function ia(a,c,d,e,f){function g(b,c,e){E(d.$onChanges)&&c!==e&&(Z||(a.$$postDigest(L),Z=[]),m||(m={},Z.push(h)),m[b]&&
-(e=m[b].previousValue),m[b]=new Db(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;q(e,function(e,h){var m=e.attrName,n=e.optional,p,r,I,D;switch(e.mode){case "@":n||ua.call(c,m)||(d[h]=c[m]=void 0);c.$observe(m,function(a){if(F(a)||Da(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;p=c[m];F(p)?d[h]=b(p)(a):Da(p)&&(d[h]=p);l[h]=new Db(Zb,d[h]);break;case "=":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);D=r.literal?pa:function(a,b){return a===b||a!==a&&b!==b};
-I=r.assign||function(){p=d[h]=r(a);throw ga("nonassign",c[m],m,f.name);};p=d[h]=r(a);n=function(b){D(b,d[h])||(D(b,p)?I(a,b=d[h]):d[h]=b);return p=b};n.$stateful=!0;n=e.collection?a.$watchCollection(c[m],n):a.$watch(t(c[m],n),null,r.literal);k.push(n);break;case "<":if(!ua.call(c,m)){if(n)break;c[m]=void 0}if(n&&!c[m])break;r=t(c[m]);d[h]=r(a);l[h]=new Db(Zb,d[h]);n=a.$watch(r,function(a,b){a===b&&(b=d[h]);g(h,a,b);d[h]=a},r.literal);k.push(n);break;case "&":r=c.hasOwnProperty(m)?t(c[m]):C;if(r===
-C&&n)break;d[h]=function(b){return r(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var oa=/^\w/,na=v.document.createElement("div"),qa=r,Z;S.prototype={$normalize:xa,$addClass:function(a){a&&0<a.length&&J.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&J.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=$c(a,b);c&&c.length&&J.addClass(this.$$element,c);(c=$c(b,a))&&c.length&&J.removeClass(this.$$element,
-c)},$set:function(a,b,d,e){var f=Rc(this.$$element[0],a),g=ad[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=zc(a,"-"));f=va(this.$$element);if("a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=D(b,"src"===a);else if("img"===f&&"srcset"===a){for(var f="",g=V(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+D(V(g[m]),!0),f=
-f+(" "+V(g[m+1]));g=V(g[2*l]).split(/\s/);f+=D(V(g[0]),!0);2===g.length&&(f+=" "+V(g[1]));this[a]=b=f}!1!==d&&(null===b||y(b)?this.$$element.removeAttr(e):oa.test(e)?this.$$element.attr(e,b):$(this.$$element[0],e,b));(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=T()),e=d[a]||(d[a]=[]);e.push(b);u.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||y(c[a])||b(c[a])});return function(){Za(e,b)}}};var ra=b.startSymbol(),
-sa=b.endSymbol(),ta="{{"==ra&&"}}"==sa?Xa:function(a){return a.replace(/\{\{/g,ra).replace(/}}/g,sa)},ya=/^ngAttr[A-Z]/,Aa=/^(.+)Start$/;ba.$$addBindingInfo=m?function(a,b){var c=a.data("$binding")||[];K(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:C;ba.$$addBindingClass=m?function(a){A(a,"ng-binding")}:C;ba.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:C;ba.$$addScopeClass=m?function(a,b){A(a,b?"ng-isolate-scope":"ng-scope")}:C;ba.$$createComment=
-function(a,b){var c="";m&&(c=" "+(a||"")+": "+(b||"")+" ");return v.document.createComment(c)};return ba}]}function Db(a,b){this.previousValue=a;this.currentValue=b}function xa(a){return cb(a.replace(Vc,""))}function $c(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?" ":"")+g}return d}function Yc(a){a=B(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&Zf.call(a,b,1);return a}function Uc(a,
-b){if(b&&F(b))return b;if(F(a)){var d=bd.exec(a);if(d)return d[3]}}function ef(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Qa(b,"controller");G(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!G(a.$scope))throw O("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,h,k){var l,n,m;h=!0===h;k&&F(k)&&(m=k);if(F(f)){k=f.match(bd);if(!k)throw $f("ctrlfmt",f);n=k[1];m=
-m||k[3];f=a.hasOwnProperty(n)?a[n]:Bc(g.$scope,n,!0)||(b?Bc(c,n,!0):void 0);Pa(f,n,!0)}if(h)return h=(K(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),m&&e(g,m,l,n||f.name),R(function(){var a=d.invoke(f,l,g,n);a!==l&&(G(a)||E(a))&&(l=a,m&&e(g,m,l,n||f.name));return l},{instance:l,identifier:m});l=d.instantiate(f,g,n);m&&e(g,m,l,n||f.name);return l}}]}function ff(){this.$get=["$window",function(a){return B(a.document)}]}function gf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,
-arguments)}}]}function $b(a){return G(a)?fa(a)?a.toISOString():ab(a):a}function mf(){this.$get=function(){return function(a){if(!a)return"";var b=[];pc(a,function(a,c){null===a||y(a)||(K(a)?q(a,function(a){b.push(ja(c)+"="+ja($b(a)))}):b.push(ja(c)+"="+ja($b(a))))});return b.join("&")}}}function nf(){this.$get=function(){return function(a){function b(a,e,f){null===a||y(a)||(K(a)?q(a,function(a,c){b(a,e+"["+(G(a)?c:"")+"]")}):G(a)&&!fa(a)?pc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ja(e)+
-"="+ja($b(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function ac(a,b){if(F(a)){var d=a.replace(ag,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(cd))||(c=(c=d.match(bg))&&cg[c[0]].test(d));c&&(a=uc(d))}}return a}function dd(a){var b=T(),d;F(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var e=P(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):G(a)&&q(a,function(a,d){var f=P(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function ed(a){var b;
-return function(d){b||(b=dd(a));return d?(d=b[P(d)],void 0===d&&(d=null),d):b}}function fd(a,b,d,c){if(E(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function lf(){var a=this.defaults={transformResponse:[ac],transformRequest:[function(a){return G(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?ab(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ha(bc),put:ha(bc),patch:ha(bc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",
-paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(e,f,g,h,k,l){function n(b){function c(a){var b=R({},a);b.data=fd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};q(a,function(a,
-e){E(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!G(b))throw O("$http")("badreq",b);if(!F(b.url))throw O("$http")("badreq",b.url);var f=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=R({},b.headers),f,g,h,c=R({},c.common,c[P(b.method)]);a:for(f in c){g=P(f);for(h in d)if(P(h)===g)continue a;d[f]=c[f]}return e(d,ha(b))}(b);f.method=sb(f.method);f.paramSerializer=F(f.paramSerializer)?
-l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=fd(b.data,ed(d),void 0,b.transformRequest);y(e)&&q(d,function(a,b){"content-type"===P(b)&&delete d[b]});y(b.withCredentials)&&!y(a.withCredentials)&&(b.withCredentials=a.withCredentials);return m(b,e).then(c,c)},void 0],h=k.when(f);for(q(M,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=g.shift();var n=g.shift(),
-h=h.then(b,n)}d?(h.success=function(a){Pa(a,"fn");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Pa(a,"fn");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=gd("success"),h.error=gd("error"));return h}function m(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){m(c,a,d,e)}L&&(200<=a&&300>a?L.put(A,[a,c,dd(d),
-e]):L.remove(A));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function m(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?J.resolve:J.reject)({data:a,status:b,headers:ed(d),config:c,statusText:e})}function u(a){m(a.data,a.status,ha(a.headers()),a.statusText)}function I(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var J=k.defer(),D=J.promise,L,S,M=c.headers,A=r(c.url,c.paramSerializer(c.params));n.pendingRequests.push(c);D.then(I,I);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&
-"JSONP"!==c.method||(L=G(c.cache)?c.cache:G(a.cache)?a.cache:N);L&&(S=L.get(A),x(S)?S&&E(S.then)?S.then(u,u):K(S)?m(S[1],S[0],ha(S[2]),S[3]):m(S,200,{},"OK"):L.put(A,D));y(S)&&((S=hd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(M[c.xsrfHeaderName||a.xsrfHeaderName]=S),e(c.method,A,d,l,M,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return D}function r(a,b){0<b.length&&(a+=(-1==a.indexOf("?")?"?":"&")+b);return a}var N=g("$http");a.paramSerializer=
-F(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var M=[];q(c,function(a){M.unshift(F(a)?l.get(a):l.invoke(a))});n.pendingRequests=[];(function(a){q(arguments,function(a){n[a]=function(b,c){return n(R({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){n[a]=function(b,c,d){return n(R({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function pf(){this.$get=function(){return function(){return new v.XMLHttpRequest}}}
-function of(){this.$get=["$browser","$window","$document","$xhrFactory",function(a,b,d,c){return dg(a,c,a.defer,b.angular.callbacks,d[0])}]}function dg(a,b,d,c,e){function f(a,b,d){var f=e.createElement("script"),n=null;f.type="text/javascript";f.src=a;f.async=!0;n=function(a){f.removeEventListener("load",n,!1);f.removeEventListener("error",n,!1);e.body.removeChild(f);f=null;var g=-1,N="unknown";a&&("load"!==a.type||c[b].called||(a={type:"error"}),N=a.type,g="error"===a.type?404:200);d&&d(g,N)};f.addEventListener("load",
-n,!1);f.addEventListener("error",n,!1);e.body.appendChild(f);return n}return function(e,h,k,l,n,m,r,N,M,w){function p(){z&&z();u&&u.abort()}function H(b,c,e,f,g){x(J)&&d.cancel(J);z=u=null;b(c,e,f,g);a.$$completeOutstandingRequest(C)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"==P(e)){var t="_"+(c.counter++).toString(36);c[t]=function(a){c[t].data=a;c[t].called=!0};var z=f(h.replace("JSON_CALLBACK","angular.callbacks."+t),t,function(a,b){H(l,a,c[t].data,"",b);c[t]=C})}else{var u=b(e,h);
-u.open(e,h,!0);q(n,function(a,b){x(a)&&u.setRequestHeader(b,a)});u.onload=function(){var a=u.statusText||"",b="response"in u?u.response:u.responseText,c=1223===u.status?204:u.status;0===c&&(c=b?200:"file"==ra(h).protocol?404:0);H(l,c,b,u.getAllResponseHeaders(),a)};e=function(){H(l,-1,null,null,"")};u.onerror=e;u.onabort=e;q(M,function(a,b){u.addEventListener(b,a)});q(w,function(a,b){u.upload.addEventListener(b,a)});r&&(u.withCredentials=!0);if(N)try{u.responseType=N}catch(I){if("json"!==N)throw I;
-}u.send(y(k)?null:k)}if(0<m)var J=d(p,m);else m&&E(m.then)&&m.then(p)}}function jf(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(m,a).replace(r,b)}function h(a,b,c,d){var e;return e=a.$watch(function(a){e();return d(a)},b,c)}function k(f,k,m,r){function H(a){try{var b=a;a=m?e.getTrusted(m,b):e.valueOf(b);
-var d;if(r&&!x(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=ab(a)}d=a}return d}catch(g){c(Ja.interr(f,g))}}if(!f.length||-1===f.indexOf(a)){var t;k||(k=g(f),t=da(k),t.exp=f,t.expressions=[],t.$$watchDelegate=h);return t}r=!!r;var z,u,I=0,J=[],D=[];t=f.length;for(var L=[],S=[];I<t;)if(-1!=(z=f.indexOf(a,I))&&-1!=(u=f.indexOf(b,z+l)))I!==z&&L.push(g(f.substring(I,z))),I=f.substring(z+l,u),J.push(I),D.push(d(I,H)),I=u+n,S.push(L.length),L.push("");
-else{I!==t&&L.push(g(f.substring(I)));break}m&&1<L.length&&Ja.throwNoconcat(f);if(!k||J.length){var q=function(a){for(var b=0,c=J.length;b<c;b++){if(r&&y(a[b]))return;L[S[b]]=a[b]}return L.join("")};return R(function(a){var b=0,d=J.length,e=Array(d);try{for(;b<d;b++)e[b]=D[b](a);return q(e)}catch(g){c(Ja.interr(f,g))}},{exp:f,expressions:J,$$watchDelegate:function(a,b){var c;return a.$watchGroup(D,function(d,e){var f=q(d);E(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,n=b.length,m=new RegExp(a.replace(/./g,
-f),"g"),r=new RegExp(b.replace(/./g,f),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function kf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,k,l,n){function m(){r?f.apply(null,N):f(p)}var r=4<arguments.length,N=r?za.call(arguments,4):[],q=b.setInterval,w=b.clearInterval,p=0,H=x(n)&&!n,t=(H?c:d).defer(),z=t.promise;l=x(l)?l:0;z.$$intervalId=q(function(){H?e.defer(m):a.$evalAsync(m);t.notify(p++);0<l&&p>=l&&(t.resolve(p),
-w(z.$$intervalId),delete g[z.$$intervalId]);H||a.$apply()},k);g[z.$$intervalId]=t;return z}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function cc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join("/")}function id(a,b){var d=ra(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=X(d.port)||eg[d.protocol]||null}function jd(a,b){var d="/"!==a.charAt(0);
-d&&(a="/"+a);var c=ra(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!=b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function na(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Ia(a){var b=a.indexOf("#");return-1==b?a:a.substr(0,b)}function hb(a){return a.replace(/(#.+)|#$/,"$1")}function dc(a,b,d){this.$$html5=!0;d=d||"";id(a,this);this.$$parse=function(a){var d=na(b,
-a);if(!F(d))throw Eb("ipthprfx",a,b);jd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Rb(this.$$search),d=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;x(f=na(a,c))?(g=f,g=x(f=na(d,f))?b+(na("/",f)||f):a+g):x(f=na(b,c))?g=b+f:b==c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function ec(a,b,d){id(a,this);
-this.$$parse=function(c){var e=na(a,c)||na(b,c),f;y(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",y(e)&&(a=c,this.replace())):(f=na(d,e),y(f)&&(f=e));jd(f,this);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=
-function(b,d){return Ia(a)==Ia(b)?(this.$$parse(b),!0):!1}}function kd(a,b,d){this.$$html5=!0;ec.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Ia(c)?f=c:(g=na(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Rb(this.$$search),e=this.$$hash?"#"+ob(this.$$hash):"";this.$$url=cc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url}}function Fb(a){return function(){return this[a]}}function ld(a,
-b){return function(d){if(y(d))return this[a];this[a]=b(d);this.$$compose();return this}}function qf(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){return Da(a)?(b.enabled=a,this):G(a)?(Da(a.enabled)&&(b.enabled=a.enabled),Da(a.requireBase)&&(b.requireBase=a.requireBase),Da(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,
-c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,n;n=c.baseHref();var m=c.url(),r;if(b.enabled){if(!n&&b.requireBase)throw Eb("nobase");r=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(n||"/");n=e.history?dc:kd}else r=Ia(m),n=ec;var N=r.substr(0,Ia(r).lastIndexOf("/")+1);l=new n(r,N,"#"+a);l.$$parseLinkUrl(m,m);l.$$state=c.state();
-var q=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);"a"!==va(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop("href"),k=e.attr("href")||e.attr("xlink:href");G(h)&&"[object SVGAnimatedString]"===h.toString()&&(h=ra(h.animVal).href);q.test(h)||!h||e.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=
-!0))}});hb(l.absUrl())!=hb(m)&&c.url(l.absUrl(),!0);var w=!0;c.onUrlChange(function(a,b){y(na(N,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=hb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(w=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=hb(c.url()),b=hb(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(w||
-m)w=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function rf(){var a=!0,b=this;this.debugEnabled=function(b){return x(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&
-(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||C;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ta(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===
-a||"__proto__"===a)throw ca("isecfld",b);return a}function fg(a){return a+""}function sa(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a.window===a)throw ca("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ca("isecdom",b);if(a===Object)throw ca("isecobj",b);}return a}function md(a,b){if(a){if(a.constructor===a)throw ca("isecfn",b);if(a===gg||a===hg||a===ig)throw ca("isecff",b);}}function Gb(a,b){if(a&&(a===(0).constructor||a===(!1).constructor||a==="".constructor||
-a==={}.constructor||a===[].constructor||a===Function.constructor))throw ca("isecaf",b);}function jg(a,b){return"undefined"!==typeof a?a:b}function nd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function aa(a,b){var d,c;switch(a.type){case s.Program:d=!0;q(a.body,function(a){aa(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:aa(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;
-break;case s.BinaryExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:aa(a.test,b);aa(a.alternate,b);aa(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=
-!1;a.toWatch=[a];break;case s.MemberExpression:aa(a.object,b);a.computed&&aa(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:aa(a.left,b);aa(a.right,b);a.constant=a.left.constant&&a.right.constant;
-a.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];q(a.elements,function(a){aa(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];q(a.properties,function(a){aa(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1;a.toWatch=[];break;case s.LocalsExpression:a.constant=!1,a.toWatch=[]}}function od(a){if(1==a.length){a=a[0].expression;
-var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function pd(a){return a.type===s.Identifier||a.type===s.MemberExpression}function qd(a){if(1===a.body.length&&pd(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:"="}}function rd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function sd(a,
-b){this.astBuilder=a;this.$filter=b}function td(a,b){this.astBuilder=a;this.$filter=b}function Hb(a){return"constructor"==a}function fc(a){return E(a.valueOf)?a.valueOf():kg.call(a)}function sf(){var a=T(),b=T(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,e;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;e=b;return this};this.$get=["$filter",function(f){function g(c,d,e){var g,k,D;e=e||H;switch(typeof c){case "string":D=c=c.trim();var q=e?b:a;g=q[D];if(!g){":"===
-c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=e?p:w;var S=new gc(g);g=(new hc(S,f,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?m:n:g.inputs&&(g.$$watchDelegate=l);e&&(g=h(g));q[D]=g}return N(g,d);case "function":return N(c,d);default:return N(C,d)}}function h(a){function b(c,d,e,f){var g=H;H=!0;try{return a(c,d,e,f)}finally{H=g}}if(!a)return a;b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&
-c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);b.inputs=a.inputs;return b}function k(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=fc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function l(a,b,c,d,e){var f=d.inputs,g;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&fc(b));return g},b,c,e)}for(var l=[],m=[],n=0,r=f.length;n<r;n++)l[n]=k,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);
-if(b||(b=!k(h,l[c])))m[c]=h,l[c]=h&&fc(h)}b&&(g=d(a,void 0,void 0,m));return g},b,c,e)}function n(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;E(b)&&b.apply(this,arguments);x(a)&&d.$$postDigest(function(){x(f)&&e()})},c)}function m(a,b,c,d){function e(a){var b=!0;q(a,function(a){x(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;E(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function r(a,b,c,d){var e;
-return e=a.$watch(function(a){e();return d(a)},b,c)}function N(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==m&&c!==n?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return x(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var M=Ea().noUnsafeEval,w={csp:M,expensiveChecks:!1,literals:qa(d),isIdentifierStart:E(c)&&c,
-isIdentifierContinue:E(e)&&e},p={csp:M,expensiveChecks:!0,literals:qa(d),isIdentifierStart:E(c)&&c,isIdentifierContinue:E(e)&&e},H=!1;g.$$runningExpensiveChecks=function(){return H};return g}]}function uf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return ud(function(b){a.$evalAsync(b)},b)}]}function vf(){this.$get=["$browser","$exceptionHandler",function(a,b){return ud(function(b){a.defer(b)},b)}]}function ud(a,b){function d(){this.$$state={status:0}}function c(a,b){return function(c){b.call(a,
-c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending;c.processScheduled=!1;c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{E(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function f(){this.promise=new d}var g=O("$q",TypeError);R(d.prototype,{then:function(a,b,c){if(y(a)&&y(b)&&y(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,
-a,b,c]);0<this.$$state.status&&e(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return k(b,!0,a)},function(b){return k(b,!1,a)},b)}});R(f.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(g("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){function d(a){k||(k=!0,h.$$resolve(a))}function f(a){k||(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(G(a)||E(a))g=a&&a.then;E(g)?
-(this.promise.$$state.status=-1,g.call(a,d,f,c(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){f(l),b(l)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;e(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];
-a=d[f][3];try{e.notify(E(a)?a(c):c)}catch(h){b(h)}}})}});var h=function(a,b){var c=new f;b?c.resolve(a):c.reject(a);return c.promise},k=function(a,b,c){var d=null;try{E(c)&&(d=c())}catch(e){return h(e,!1)}return d&&E(d.then)?d.then(function(){return h(a,b)},function(a){return h(a,!1)}):h(a,b)},l=function(a,b,c,d){var e=new f;e.resolve(a);return e.promise.then(b,c,d)},n=function(a){if(!E(a))throw g("norslvr",a);var b=new f;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};n.prototype=
-d.prototype;n.defer=function(){var a=new f;a.resolve=c(a,a.resolve);a.reject=c(a,a.reject);a.notify=c(a,a.notify);return a};n.reject=function(a){var b=new f;b.reject(a);return b.promise};n.when=l;n.resolve=l;n.all=function(a){var b=new f,c=0,d=K(a)?[]:{};q(a,function(a,e){c++;l(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return n}function Ef(){this.$get=["$window","$timeout",function(a,
-b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function tf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++nb;this.$$ChildScope=
-null}b.prototype=a;return b}var b=10,d=O("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===Ca&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function n(){this.$id=++nb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=
-this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function m(a){if(H.$$phase)throw d("inprog",H.$$phase);H.$$phase=a}function r(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function N(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function s(){}function w(){for(;u.length;)try{u.shift()()}catch(a){f(a)}e=
-null}function p(){null===e&&(e=h.defer(function(){H.$apply(w)}))}n.prototype={constructor:n,$new:function(b,c){var d;c=c||this;b?(d=new n,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on("$destroy",k);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,
-a);var h=this,k=h.$$watchers,l={fn:b,last:s,get:f,exp:e||a,eq:!!d};c=null;E(b)||(l.fn=C);k||(k=h.$$watchers=[]);k.unshift(l);r(this,1);return function(){0<=Za(k,l)&&r(h,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});q(a,function(a,
-b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!y(e)){if(G(e))if(ya(e))for(f!==m&&(f=m,t=f.length=0,l++),a=e.length,t!==a&&(l++,f.length=t=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==r&&(f=r={},t=0,l++);a=0;for(b in e)ua.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(t++,f[b]=g,l++));if(t>
-a)for(b in l++,f)ua.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,n=g(a,c),m=[],r={},p=!0,t=0;return this.$watch(n,function(){p?(p=!1,b(e,e,d)):b(e,h,d);if(k)if(G(e))if(ya(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ua.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,n,r,p,q,N=b,u,x=[],y,v;m("$digest");h.$$checkUrlChange();this===H&&null!==e&&(h.defer.cancel(e),w());c=null;do{q=!1;
-for(u=this;t.length;){try{v=t.shift(),v.scope.$eval(v.expression,v.locals)}catch(C){f(C)}c=null}a:do{if(r=u.$$watchers)for(p=r.length;p--;)try{if(a=r[p])if(n=a.get,(g=n(u))!==(k=a.last)&&!(a.eq?pa(g,k):"number"===typeof g&&"number"===typeof k&&isNaN(g)&&isNaN(k)))q=!0,c=a,a.last=a.eq?qa(g,null):g,l=a.fn,l(g,k===s?g:k,u),5>N&&(y=4-N,x[y]||(x[y]=[]),x[y].push({msg:E(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:k}));else if(a===c){q=!1;break a}}catch(F){f(F)}if(!(r=u.$$watchersCount&&
-u.$$childHead||u!==this&&u.$$nextSibling))for(;u!==this&&!(r=u.$$nextSibling);)u=u.$parent}while(u=r);if((q||t.length)&&!N--)throw H.$$phase=null,d("infdig",b,x);}while(q||t.length);for(H.$$phase=null;z.length;)try{z.shift()()}catch(B){f(B)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===H&&h.$$applicationDestroyed();r(this,-this.$$watchersCount);for(var b in this.$$listenerCount)N(this,this.$$listenerCount[b],b);a&&a.$$childHead==
-this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=C;this.$on=this.$watch=this.$watchGroup=function(){return C};this.$$listeners={};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){H.$$phase||
-t.length||h.defer(function(){t.length&&H.$digest()});t.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){z.push(a)},$apply:function(a){try{m("$apply");try{return this.$eval(a)}finally{H.$$phase=null}}catch(b){f(b)}finally{try{H.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&u.push(b);a=g(a);p()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=
-0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,N(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=$a([h],arguments,1),l,n;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(n=d.length;l<n;l++)if(d[l])try{d[l].apply(null,k)}catch(m){f(m)}else d.splice(l,1),l--,n--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);
-h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=$a([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=
-null;return e}};var H=new n,t=H.$$asyncQueue=[],z=H.$$postDigestQueue=[],u=H.$$applyAsyncQueue=[];return H}]}function me(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return x(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f;f=ra(d).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function lg(a){if("self"===a)return a;
-if(F(a)){if(-1<a.indexOf("***"))throw ta("iwcard",a);a=vd(a).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+a+"$")}if(Wa(a))return new RegExp("^"+a.source+"$");throw ta("imatcher");}function wd(a){var b=[];x(a)&&q(a,function(a){b.push(lg(a))});return b}function xf(){this.SCE_CONTEXTS=oa;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=wd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=wd(a));return b};this.$get=["$injector",
-function(d){function c(a,b){return"self"===a?hd(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw ta("unsafe");};d.has("$sanitize")&&(f=d.get("$sanitize"));var g=e(),h={};h[oa.HTML]=e(g);h[oa.CSS]=e(g);h[oa.URL]=e(g);h[oa.JS]=e(g);h[oa.RESOURCE_URL]=
-e(h[oa.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw ta("icontext",a,b);if(null===b||y(b)||""===b)return b;if("string"!==typeof b)throw ta("itype",a);return new c(b)},getTrusted:function(d,e){if(null===e||y(e)||""===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===oa.RESOURCE_URL){var g=ra(e.toString()),m,r,q=!1;m=0;for(r=a.length;m<r;m++)if(c(a[m],g)){q=!0;break}if(q)for(m=0,r=b.length;m<r;m++)if(c(b[m],
-g)){q=!1;break}if(q)return e;throw ta("insecurl",e.toString());}if(d===oa.HTML)return f(e);throw ta("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function wf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ca)throw ta("iequirks");var c=ha(oa);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},
-c.valueOf=Xa);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;q(oa,function(a,b){var d=P(b);c[cb("parse_as_"+d)]=function(b){return e(a,b)};c[cb("get_trusted_"+d)]=function(b){return f(a,b)};c[cb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function yf(){this.$get=["$window","$document",function(a,b){var d={},c=!(a.chrome&&a.chrome.app&&a.chrome.app.runtime)&&a.history&&a.history.pushState,
-e=X((/android (\d+)/.exec(P((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,n=!1,m=!1;if(l){for(var r in l)if(n=k.exec(r)){h=n[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");n=!!("transition"in l||h+"Transition"in l);m=!!("animation"in l||h+"Animation"in l);!e||n&&m||(n=F(l.webkitTransition),m=F(l.webkitAnimation))}return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===
-a&&11>=Ca)return!1;if(y(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ea(),vendorPrefix:h,transitions:n,animations:m,android:e}}]}function Af(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,e){function f(g,h){f.totalPendingRequests++;F(g)&&b.get(g)||(g=e.getTrustedResourceUrl(g));var k=d.defaults&&d.defaults.transformResponse;K(k)?k=k.filter(function(a){return a!==ac}):k===ac&&(k=null);return d.get(g,
-R({cache:b,transformResponse:k},a))["finally"](function(){f.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw mg("tpload",g,a.status,a.statusText);return c.reject(a)})}f.totalPendingRequests=0;return f}]}function Bf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=ea.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+
-vd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Cf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",
-function(a,b,d,c,e){function f(f,k,l){E(f)||(l=k,k=f,f=C);var n=za.call(arguments,3),m=x(l)&&!l,r=(m?c:d).defer(),q=r.promise,s;s=b.defer(function(){try{r.resolve(f.apply(null,n))}catch(b){r.reject(b),e(b)}finally{delete g[q.$$timeoutId]}m||a.$apply()},k);q.$$timeoutId=s;g[s]=r;return q}var g={};f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function ra(a){Ca&&(Y.setAttribute("href",a),a=
-Y.href);Y.setAttribute("href",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function hd(a){a=F(a)?ra(a):a;return a.protocol===xd.protocol&&a.host===xd.host}function Df(){this.$get=da(v)}function yd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},
-c={},e="";return function(){var a,g,h,k,l;a=d.cookie||"";if(a!==e)for(e=a,a=e.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),y(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function Hf(){this.$get=yd}function Jc(a){function b(d,c){if(G(d)){var e={};q(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",zd);b("date",Ad);b("filter",ng);
-b("json",og);b("limitTo",pg);b("lowercase",qg);b("number",Bd);b("orderBy",Cd);b("uppercase",rg)}function ng(){return function(a,b,d){if(!ya(a)){if(null==a)return a;throw O("filter")("notarray",a);}var c;switch(ic(b)){case "function":break;case "boolean":case "null":case "number":case "string":c=!0;case "object":b=sg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function sg(a,b,d){var c=G(a)&&"$"in a;!0===b?b=pa:E(b)||(b=function(a,b){if(y(a))return!1;if(null===a||null===b)return a===
-b;if(G(b)||G(a)&&!rc(a))return!1;a=P(""+a);b=P(""+b);return-1!==a.indexOf(b)});return function(e){return c&&!G(e)?Ka(e,a.$,b,!1):Ka(e,a,b,d)}}function Ka(a,b,d,c,e){var f=ic(a),g=ic(b);if("string"===g&&"!"===b.charAt(0))return!Ka(a,b.substring(1),d,c);if(K(a))return a.some(function(a){return Ka(a,b,d,c)});switch(f){case "object":var h;if(c){for(h in a)if("$"!==h.charAt(0)&&Ka(a[h],b,d,!0))return!0;return e?!1:Ka(a,b,d,!1)}if("object"===g){for(h in b)if(e=b[h],!E(e)&&!y(e)&&(f="$"===h,!Ka(f?a:a[h],
-e,d,f,f)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function ic(a){return null===a?"null":typeof a}function zd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){y(c)&&(c=b.CURRENCY_SYM);y(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Dd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(/\u00A4/g,c)}}function Bd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Dd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function tg(a){var b=0,d,c,e,f,g;-1<
-(c=a.indexOf(Ed))&&(a=a.replace(Ed,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)==jc;e++);if(e==(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)==jc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Fd&&(d=d.splice(0,Fd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ug(a,b,d,c){var e=a.d,f=e.length-a.i;b=y(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d){e.splice(Math.max(a.i,d));for(var g=d;g<e.length;g++)e[g]=0}else for(f=
-Math.max(0,f),a.i=1,e.length=Math.max(1,d=b+1),e[0]=0,g=1;g<d;g++)e[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;f<Math.max(0,b);f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Dd(a,b,d,c,e){if(!F(a)&&!Q(a)||isNaN(a))return"";var f=!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(f)k="\u221e";else{g=tg(h);ug(g,e,b.minFrac,b.maxFrac);k=g.d;h=g.i;e=g.e;f=[];for(g=k.reduce(function(a,
-b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?f=k.splice(h):(f=k,k=[0]);h=[];for(k.length>=b.lgSize&&h.unshift(k.splice(-b.lgSize).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);f.length&&(k+=c+f.join(""));e&&(k+="e+"+e)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+k+b.posSuf}function Ib(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length<b;)a=jc+a;d&&(a=a.substr(a.length-b));return e+a}function W(a,b,d,c,e){d=
-d||0;return function(f){f=f["get"+a]();if(0<d||f>-d)f+=d;0===f&&-12==d&&(f=12);return Ib(f,b,c,e)}}function ib(a,b,d){return function(c,e){var f=c["get"+a](),g=sb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Gd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Hd(a){return function(b){var d=Gd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Ib(b,a)}}function kc(a,b){return 0>=a.getFullYear()?
-b.ERAS[0]:b.ERAS[1]}function Ad(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=X(b[9]+b[10]),g=X(b[9]+b[11]));h.call(a,X(b[1]),X(b[2])-1,X(b[3]));f=X(b[4]||0)-f;g=X(b[5]||0)-g;h=X(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",h=
-[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;F(c)&&(c=vg.test(c)?X(c):b(c));Q(c)&&(c=new Date(c));if(!fa(c)||!isFinite(c.getTime()))return c;for(;d;)(l=wg.exec(d))?(h=$a(h,l,1),d=h.pop()):(h.push(d),d=null);var n=c.getTimezoneOffset();f&&(n=vc(f,n),c=Qb(c,f,!0));q(h,function(b){k=xg[b];g+=k?k(c,a.DATETIME_FORMATS,n):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function og(){return function(a,b){y(b)&&(b=2);return ab(a,b)}}function pg(){return function(a,b,d){b=Infinity===
-Math.abs(Number(b))?Number(b):X(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!K(a)&&!F(a))return a;d=!d||isNaN(d)?0:X(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Cd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Xa;if(E(b))h=b;else if(F(b)){if("+"==b.charAt(0)||"-"==b.charAt(0))c="-"==b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,
-descending:c*d}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}return function(a,e,f){if(null==a)return a;if(!ya(a))throw O("orderBy")("notarray",a);K(e)||(e=[e]);0===e.length&&(e=["+"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("string"===c)e=e.toLowerCase();else if("object"===
-c)a:{if("function"===typeof e.valueOf&&(e=e.valueOf(),d(e)))break a;if(rc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],f=b.predicateValues[d],q=0;c.type===f.type?c.value!==f.value&&(q=c.value<f.value?-1:1):q=c.type<f.type?-1:1;if(c=q*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function La(a){E(a)&&(a={link:a});a.restrict=a.restrict||"AC";return da(a)}function Id(a,
-b,d,c,e){var f=this,g=[];f.$error={};f.$$success={};f.$pending=void 0;f.$name=e(b.name||b.ngForm||"")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Jb;f.$rollbackViewValue=function(){q(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){q(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Qa(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];
-f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];q(f.$pending,function(b,c){f.$setValidity(c,null,a)});q(f.$error,function(b,c){f.$setValidity(c,null,a)});q(f.$$success,function(b,c){f.$setValidity(c,null,a)});Za(g,a);a.$$parentForm=Jb};Jd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Za(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Ua);
-c.addClass(a,Kb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};f.$setPristine=function(){c.setClass(a,Ua,Kb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;q(g,function(a){a.$setPristine()})};f.$setUntouched=function(){q(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,"ng-submitted");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function lc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function jb(a,b,d,c,e,f){var g=P(b[0].type);
-if(!e.android){var h=!1;b.on("compositionstart",function(){h=!0});b.on("compositionend",function(){h=!1;l()})}var k,l=function(a){k&&(f.defer.cancel(k),k=null);if(!h){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=V(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",l);else{var n=function(a,b,c){k||(k=f.defer(function(){k=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<
-b&&19>b||37<=b&&40>=b||n(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",n)}b.on("change",l);if(Kd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=this.validity,c=b.badInput,d=b.typeMismatch;k=f.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Lb(a,b){return function(d,c){var e,f;if(fa(d))return d;if(F(d)){'"'==d.charAt(0)&&
-'"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(yg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function kb(a,b,d,c){return function(e,f,g,h,k,l,n){function m(a){return a&&
-!(a.getTime&&a.getTime()!==a.getTime())}function r(a){return x(a)&&!fa(a)?d(a)||void 0:a}Ld(e,f,g,h);jb(e,f,g,h,k,l);var q=h&&h.$options&&h.$options.timezone,s;h.$$parserName=a;h.$parsers.push(function(a){if(h.$isEmpty(a))return null;if(b.test(a))return a=d(a,s),q&&(a=Qb(a,q)),a});h.$formatters.push(function(a){if(a&&!fa(a))throw lb("datefmt",a);if(m(a))return(s=a)&&q&&(s=Qb(s,q,!0)),n("date")(a,c,q);s=null;return""});if(x(g.min)||g.ngMin){var w;h.$validators.min=function(a){return!m(a)||y(w)||d(a)>=
-w};g.$observe("min",function(a){w=r(a);h.$validate()})}if(x(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!m(a)||y(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function Ld(a,b,d,c){(c.$$hasNativeValidators=G(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Md(a,b,d,c,e){if(x(c)){a=a(c);if(!a.constant)throw lb("constexpr",d,c);return a(b)}return e}function mc(a,b){a="ngClass"+a;return["$animate",
-function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],n=0;n<b.length;n++)if(e==b[n])continue a;c.push(e)}return c}function e(a){var b=[];return K(a)?(q(a,function(a){b=b.concat(e(a))}),b):F(a)?a.split(" "):G(a)?(q(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",link:function(f,g,h){function k(a){a=l(a,1);h.$addClass(a)}function l(a,b){var c=g.data("$classCounts")||T(),d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",
-c);return d.join(" ")}function n(a,b){var e=c(b,a),f=c(a,b),e=l(e,1),f=l(f,-1);e&&e.length&&d.addClass(g,e);f&&f.length&&d.removeClass(g,f)}function m(a){if(!0===b||f.$index%2===b){var c=e(a||[]);if(!r)k(c);else if(!pa(a,r)){var d=e(r);n(d,c)}}r=K(a)?a.map(function(a){return ha(a)}):ha(a)}var r;f.$watch(h[a],m,!0);h.$observe("class",function(b){m(f.$eval(h[a]))});"ngClass"!==a&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var m=e(f.$eval(h[a]));g===b?k(m):(g=l(m,-1),h.$removeClass(g))}})}}}]}
-function Jd(a){function b(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?"-"+zc(a,"-"):"";b(mb+a,!0===c);b(Nd+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Nd]=!(f[mb]=e.hasClass(mb));c.$setValidity=function(a,e,f){y(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),Od(c.$pending)&&(c.$pending=void 0));Da(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,
-a,f),h(c.$$success,a,f));c.$pending?(b(Pd,!0),c.$valid=c.$invalid=void 0,d("",null)):(b(Pd,!1),c.$valid=Od(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?void 0:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Od(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var zg=/^\/(.+)\/([a-z]*)$/,ua=Object.prototype.hasOwnProperty,P=function(a){return F(a)?a.toLowerCase():a},sb=function(a){return F(a)?a.toUpperCase():a},Ca,
-B,Z,za=[].slice,Zf=[].splice,Ag=[].push,ma=Object.prototype.toString,sc=Object.getPrototypeOf,Aa=O("ng"),ea=v.angular||(v.angular={}),Sb,nb=0;Ca=v.document.documentMode;C.$inject=[];Xa.$inject=[];var K=Array.isArray,$d=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\]$/,V=function(a){return F(a)?a.trim():a},vd=function(a){return a.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ea=function(){if(!x(Ea.rules)){var a=v.document.querySelector("[ng-csp]")||
-v.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ea.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ea;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ea.rules},pb=function(){if(x(pb.name_))return pb.name_;var a,b,d=Na.length,c,e;for(b=0;b<d;++b)if(c=Na[b],a=v.document.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+
-"jq");break}return pb.name_=e},ce=/:/g,Na=["ng-","data-ng-","ng:","x-ng-"],he=/[A-Z]/g,Ac=!1,Ma=3,le={full:"1.5.5",major:1,minor:5,dot:5,codeName:"material-conspiration"};U.expando="ng339";var eb=U.cache={},Nf=1;U._data=function(a){return this.cache[a[this.expando]]||{}};var If=/([\:\-\_]+(.))/g,Jf=/^moz([A-Z])/,wb={mouseleave:"mouseout",mouseenter:"mouseover"},Ub=O("jqLite"),Mf=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Tb=/<|&#?\w+;/,Kf=/<([\w:-]+)/,Lf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-ia={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option;ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead;ia.th=ia.td;var Sf=v.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Oa=U.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===
-v.document.readyState?v.setTimeout(b):(this.on("DOMContentLoaded",b),U(v).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:Ag,sort:[].sort,splice:[].splice},Cb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Cb[P(a)]=a});var Sc={};q("input select option textarea button form details".split(" "),function(a){Sc[a]=!0});var ad={ngMinlength:"minlength",
-ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:Wb,removeData:db,hasData:function(a){for(var b in eb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)db(a[b])}},function(a,b){U[b]=a});q({data:Wb,inheritedData:Ab,scope:function(a){return B.data(a,"$scope")||Ab(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return B.data(a,"$isolateScope")||B.data(a,"$isolateScopeNoTemplate")},controller:Pc,injector:function(a){return Ab(a,
-"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:xb,css:function(a,b,d){b=cb(b);if(x(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Ma&&2!==c&&8!==c)if(c=P(b),Cb[c])if(x(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||C).specified?c:void 0;else if(x(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?void 0:a},prop:function(a,b,d){if(x(d))a[b]=
-d;else return a[b]},text:function(){function a(a,d){if(y(d)){var c=a.nodeType;return 1===c||c===Ma?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(y(b)){if(a.multiple&&"select"===va(a)){var d=[];q(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(y(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Qc},function(a,b){U.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Qc&&y(2==a.length&&
-a!==xb&&a!==Pc?b:c)){if(G(b)){for(e=0;e<g;e++)if(a===Wb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=y(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});q({removeData:db,on:function(a,b,d,c){if(x(c))throw Ub("onargs");if(Kc(a)){c=vb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Pf(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper=
-c,"$destroy"===b||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],wb[b]?(h(wb[b],Rf),h(b,void 0,!0)):h(b)}},off:Oc,one:function(a,b,d){a=B(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;ub(a);q(new U(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];q(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,
-b){var d=a.nodeType;if(1===d||11===d){b=new U(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;q(new U(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Mc(a,B(b).eq(0).clone()[0])},remove:Bb,detach:function(a){Bb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new U(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:zb,removeClass:yb,toggleClass:function(a,b,d){b&&q(b.split(" "),
-function(b){var e=d;y(e)&&(e=!xb(a,b));(e?zb:yb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Vb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=vb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
-!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:C,type:f,target:a},b.type&&(c=R(c,b)),b=ha(g),e=d?[c].concat(d):[c],q(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){U.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)y(f)?(f=a(this[g],b,c,e),x(f)&&(f=B(f))):Nc(f,a(this[g],b,c,e));return x(f)?f:this};U.prototype.bind=U.prototype.on;U.prototype.unbind=U.prototype.off});Ra.prototype={put:function(a,
-b){this[Fa(a,this.nextUid)]=b},get:function(a){return this[Fa(a,this.nextUid)]},remove:function(a){var b=this[a=Fa(a,this.nextUid)];delete this[a];return b}};var Gf=[function(){this.$get=[function(){return Ra}]}],Uf=/^([^\(]+?)=>/,Vf=/^[^\(]*\(\s*([^\)]*)\)/m,Bg=/,/,Cg=/^\s*(_?)(\S+?)\1\s*$/,Tf=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ga=O("$injector");bb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw F(d)&&d||(d=a.name||Wf(a)),Ga("strictdi",d);
-b=Tc(a);q(b[1].split(Bg),function(a){a.replace(Cg,function(a,b,d){c.push(d)})})}a.$inject=c}}else K(a)?(b=a.length-1,Pa(a[b],"fn"),c=a.slice(0,b)):Pa(a,"fn",!0);return c};var Qd=O("$animate"),Ze=function(){this.$get=C},$e=function(){var a=new Ra,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=F(b)?b.split(" "):K(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){q(b,function(b){var c=a.get(b);if(c){var d=Xf(b.attr("class")),e="",f="";q(c,
-function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&zb(a,e);f&&yb(a,f)});a.remove(b)}});b.length=0}return{enabled:C,on:C,off:C,pin:C,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Xe=["$provide",function(a){var b=this;this.$$registeredAnimations=
-Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw Qd("notcsel",d);var e=d+"-animation";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw Qd("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=
-d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"enter",Ha(h))},move:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,"move",Ha(h))},leave:function(b,c){return a.push(b,"leave",Ha(c),function(){b.remove()})},addClass:function(b,
-c,g){g=Ha(g);g.addClass=fb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,c,g){g=Ha(g);g.removeClass=fb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ha(h);h.addClass=fb(h.addClass,c);h.removeClass=fb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ha(k);k.from=k.from?R(k.from,c):c;k.to=k.to?R(k.to,g):g;k.tempClasses=fb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],bf=function(){this.$get=
-["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},af=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0);
-else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;q(a,function(a){a.done(c)})};f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:C,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},
-"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=
-0,this._state=2)}};return f}]},Ye=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);h||k.complete();h=!0});return k}var g=e||{};g.$$prepared||(g=qa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:f,end:f}}}]},ga=O("$compile"),Zb=new function(){};
-Cc.$inject=["$provide","$$sanitizeUriProvider"];Db.prototype.isFirstChange=function(){return this.previousValue===Zb};var Vc=/^((?:x|data)[\:\-_])/i,$f=O("$controller"),bd=/^(\S+)(\s+as\s+([\w$]+))?$/,hf=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof B&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},cd="application/json",bc={"Content-Type":cd+";charset=utf-8"},bg=/^\[|^\{(?!\{)/,cg={"[":/]$/,"{":/}$/},ag=/^\)\]\}',?\n/,Dg=O("$http"),gd=function(a){return function(){throw Dg("legacy",
-a);}},Ja=ea.$interpolateMinErr=O("$interpolate");Ja.throwNoconcat=function(a){throw Ja("noconcat",a);};Ja.interr=function(a,b){return Ja("interr",a,b.toString())};var Eg=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,eg={http:80,https:443,ftp:21},Eb=O("$location"),Fg={$$html5:!1,$$replace:!1,absUrl:Fb("$$absUrl"),url:function(a){if(y(a))return this.$$url;var b=Eg.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Fb("$$protocol"),
-host:Fb("$$host"),port:Fb("$$port"),path:ld("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(F(a)||Q(a))a=a.toString(),this.$$search=xc(a);else if(G(a))a=qa(a,{}),q(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Eb("isrcharg");break;default:y(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:ld("$$hash",function(a){return null!==
-a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};q([kd,ec,dc],function(a){a.prototype=Object.create(Fg);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==dc||!this.$$html5)throw Eb("nostate");this.$$state=y(b)?null:b;return this}});var ca=O("$parse"),gg=Function.prototype.call,hg=Function.prototype.apply,ig=Function.prototype.bind,Mb=T();q("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Mb[a]=!0});var Gg={n:"\n",f:"\f",r:"\r",
-t:"\t",v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;
-else{var b=a+this.peek(),d=b+this.peek(2),c=Mb[b],e=Mb[d];Mb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||
-"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,
-b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ca("lexerr",
-a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=P(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},
-readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)||
-this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=Gg[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var s=function(a,b){this.lexer=a;this.options=b};s.Program="Program";s.ExpressionStatement="ExpressionStatement";s.AssignmentExpression="AssignmentExpression";s.ConditionalExpression="ConditionalExpression";
-s.LogicalExpression="LogicalExpression";s.BinaryExpression="BinaryExpression";s.UnaryExpression="UnaryExpression";s.CallExpression="CallExpression";s.MemberExpression="MemberExpression";s.Identifier="Identifier";s.Literal="Literal";s.ArrayExpression="ArrayExpression";s.Property="Property";s.ObjectExpression="ObjectExpression";s.ThisExpression="ThisExpression";s.LocalsExpression="LocalsExpression";s.NGValueParameter="NGValueParameter";s.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);
-a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:s.Program,body:a}},expressionStatement:function(){return{type:s.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()},
-assignment:function(){var a=this.ternary();this.expect("=")&&(a={type:s.AssignmentExpression,left:a,right:this.assignment(),operator:"="});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:s.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:s.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=
-this.equality();this.expect("&&");)a={type:s.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),
-b;b=this.expect("+","-");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):
-this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=qa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:s.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:s.CallExpression,
-callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==
-this.peekToken().text){do a.push(this.expression());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:s.ArrayExpression,elements:a}},
-object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:s.Property,kind:"init"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError("invalid key",this.peek());this.consume(":");b.value=this.expression();a.push(b)}while(this.expect(","))}this.consume("}");return{type:s.ObjectExpression,properties:a}},throwError:function(a,b){throw ca("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===
-this.tokens.length)throw ca("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ca("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?
-(this.tokens.shift(),a):!1},selfReferential:{"this":{type:s.ThisExpression},$locals:{type:s.LocalsExpression}}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};aa(c,d.$filter);var e="",f;this.stage="assign";if(f=qd(c))this.state.computing="assign",e=this.nextId(),this.recurse(f,e),this.return_(e),e="fn.assign="+this.generateFunction("assign","s,v,l");f=od(c.body);
-d.stage="inputs";q(f,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing="fn";this.stage="main";this.recurse(c);e='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+e+this.watchFns()+"return fn;";e=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext",
-"ifDefined","plus","text",e))(this.$filter,Ta,sa,md,fg,Gb,jg,nd,a);this.state=this.stage=void 0;e.literal=rd(c);e.constant=c.constant;return e},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters,
-function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,h,k=this,l,n;c=c||C;if(!f&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:q(a.body,function(b,c){k.recurse(b.expression,
-void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case s.Literal:n=this.escape(a.value);this.assign(b,n);c(n);break;case s.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});n=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,n);c(n);break;case s.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});n="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,
-0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,n);c(n);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",
-a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ta(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||"s",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Hb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||
-this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){e&&1!==e&&k.addEnsureSafeAssignContext(g);if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),n=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,n),d&&(d.computed=!0,d.name=h);else{Ta(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),
-k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));n=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Hb(a.property.name))n=k.ensureSafeObject(n);k.assign(b,n);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),n=h+"("+l.join(",")+")",k.assign(b,n),c(b)):(h=k.nextId(),g={},l=
-[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),n=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):n=h+"("+l.join(",")+")";n=k.ensureSafeObject(n);k.assign(b,n)},function(){k.assign(b,"undefined")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!pd(a.left))throw ca("lval");
-this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);n=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,n);c(b||n)})},1);break;case s.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});n="["+l.join(",")+"]";this.assign(b,n);c(n);break;case s.ObjectExpression:l=[];q(a.properties,function(a){k.recurse(a.value,
-k.nextId(),void 0,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:""+a.key.value)+":"+b)})});n="{"+l.join(",")+"}";this.assign(b,n);c(n);break;case s.ThisExpression:this.assign(b,"s");c("s");break;case s.LocalsExpression:this.assign(b,"l");c("l");break;case s.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,
-"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+
-"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/[$_a-zA-Z][$_a-zA-Z0-9]*/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),
-";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,e,f){var g=
-this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(F(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(Q(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ca("esc");},nextId:function(a,
-b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};td.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;aa(c,d.$filter);var e,f;if(e=qd(c))f=this.recurse(e);e=od(c.body);var g;e&&(g=[],q(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});e=0===c.body.length?C:1===
-c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=rd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),
-this["binary"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case s.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Ta(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Hb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ta(a.property.name,f.expression),
-e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],q(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var m=[],r=0;r<g.length;++r)m.push(g[r](a,c,d,f));a=e.apply(void 0,m,f);return b?{context:void 0,name:void 0,value:a}:a}:function(a,
-c,d,n){var m=e(a,c,d,n),r;if(null!=m.value){sa(m.context,f.expression);md(m.value,f.expression);r=[];for(var q=0;q<g.length;++q)r.push(sa(g[q](a,c,d,n),f.expression));r=sa(m.value.apply(m.context,r),f.expression)}return b?{value:r}:r};case s.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,n){var m=c(a,d,g,n);a=e(a,d,g,n);sa(m.value,f.expression);Gb(m.context);m.context[m.name]=a;return b?{value:a}:a};case s.ArrayExpression:return g=[],q(a.elements,function(a){g.push(f.recurse(a))}),
-function(a,c,d,e){for(var f=[],r=0;r<g.length;++r)f.push(g[r](a,c,d,e));return b?{value:f}:f};case s.ObjectExpression:return g=[],q(a.properties,function(a){g.push({key:a.key.type===s.Identifier?a.key.name:""+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},r=0;r<g.length;++r)f[g[r].key]=g[r].value(a,c,d,e);return b?{value:f}:f};case s.ThisExpression:return function(a){return b?{value:a}:a};case s.LocalsExpression:return function(a,c){return b?{value:c}:c};case s.NGValueParameter:return function(a,
-c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=x(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=nd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);
-h=(x(h)?h:0)-(x(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,
-e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,
-g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,
-name:void 0,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=g&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:void 0;b&&sa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),n,m;null!=l&&(n=b(f,g,h,k),n+="",Ta(n,e),c&&1!==c&&(Gb(l),l&&!l[n]&&(l[n]={})),m=l[n],sa(m,e));return d?{context:l,name:n,value:m}:m}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&(Gb(g),
-g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Hb(b))&&sa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var hc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(a,d);this.astCompiler=d.csp?new td(this.ast,b):new sd(this.ast,b)};hc.prototype={constructor:hc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var kg=Object.prototype.valueOf,ta=O("$sce"),oa={HTML:"html",CSS:"css",
-URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},mg=O("$compile"),Y=v.document.createElement("a"),xd=ra(v.location.href);yd.$inject=["$document"];Jc.$inject=["$provide"];var Fd=22,Ed=".",jc="0";zd.$inject=["$locale"];Bd.$inject=["$locale"];var xg={yyyy:W("FullYear",4,0,!1,!0),yy:W("FullYear",2,0,!0,!0),y:W("FullYear",1,0,!1,!0),MMMM:ib("Month"),MMM:ib("Month",!0),MM:W("Month",2,1),M:W("Month",1,1),LLLL:ib("Month",!1,!0),dd:W("Date",2),d:W("Date",1),HH:W("Hours",2),H:W("Hours",1),hh:W("Hours",2,-12),
-h:W("Hours",1,-12),mm:W("Minutes",2),m:W("Minutes",1),ss:W("Seconds",2),s:W("Seconds",1),sss:W("Milliseconds",3),EEEE:ib("Day"),EEE:ib("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Ib(Math[0<a?"floor":"ceil"](a/60),2)+Ib(Math.abs(a%60),2))},ww:Hd(2),w:Hd(1),G:kc,GG:kc,GGG:kc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},wg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,
-vg=/^\-?\d+$/;Ad.$inject=["$locale"];var qg=da(P),rg=da(sb);Cd.$inject=["$parse"];var ne=da({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ma.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};q(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!=a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,
-b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:"A",priority:100,link:e}}}});q(ad,function(a,b){tb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(zg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=xa("ng-"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===
-ma.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ca&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Jb={$addControl:C,$$renameControl:function(a,b){a.$name=b},$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C,$setSubmitted:C};Id.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var Rd=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||C}return{name:"form",
-restrict:a?"EAC":"E",require:["form","^^?form"],controller:Id,compile:function(d,f){d.addClass(Ua).addClass(mb);var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var m=f[0];if(!("action"in e)){var r=function(b){a.$apply(function(){m.$commitViewValue();m.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||m.$$parentForm).$addControl(m);var q=g?c(m.$name):C;g&&
-(q(a,m),e.$observe(g,function(b){m.$name!==b&&(q(a,void 0),m.$$parentForm.$$renameControl(m,b),q=c(m.$name),q(a,m))}));d.on("$destroy",function(){m.$$parentForm.$removeControl(m);q(a,void 0);R(m,Jb)})}}}}}]},oe=Rd(),Be=Rd(!0),yg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,Hg=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+\])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,Ig=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
-Jg=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,Sd=/^(\d{4,})-(\d{2})-(\d{2})$/,Td=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,nc=/^(\d{4,})-W(\d\d)$/,Ud=/^(\d{4,})-(\d\d)$/,Vd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Kd=T();q(["date","datetime-local","month","time","week"],function(a){Kd[a]=!0});var Wd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c)},date:kb("date",Sd,Lb(Sd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":kb("datetimelocal",Td,Lb(Td,"yyyy MM dd HH mm ss sss".split(" ")),
-"yyyy-MM-ddTHH:mm:ss.sss"),time:kb("time",Vd,Lb(Vd,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:kb("week",nc,function(a,b){if(fa(a))return a;if(F(a)){nc.lastIndex=0;var d=nc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Gd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},"yyyy-Www"),month:kb("month",Ud,Lb(Ud,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Ld(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName=
-"number";c.$parsers.push(function(a){if(c.$isEmpty(a))return null;if(Jg.test(a))return parseFloat(a)});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb("numfmt",a);a=a.toString()}return a});if(x(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||y(g)||a>=g};d.$observe("min",function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}if(x(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||y(h)||a<=h};d.$observe("max",
-function(a){x(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:void 0;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||Hg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);lc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||Ig.test(d)}},radio:function(a,b,d,c){y(d.name)&&b.attr("name",++nb);b.on("click",function(a){b[0].checked&&c.$setViewValue(d.value,
-a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Md(h,a,"ngTrueValue",d.ngTrueValue,!0),l=Md(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return pa(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:C,button:C,submit:C,reset:C,
-file:C},Dc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,h){h[0]&&(Wd[P(g.type)]||Wd.text)(e,f,g,h[0],b,a,d,c)}}}}],Kg=/^(true|false|\d+)$/,Te=function(){return{restrict:"A",priority:100,compile:function(a,b){return Kg.test(b.ngValue)?function(a,b,e){e.$set("value",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set("value",a)})}}}},te=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);
-return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=y(a)?"":a})}}}}],ve=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=y(a)?"":a})}}}}],ue=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=
-b(e.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||"")})}}}}],Se=da({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),we=mc("",!0),ye=mc("Odd",0),xe=mc("Even",1),ze=La({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Ae=[function(){return{restrict:"A",scope:!0,controller:"@",
-priority:500}}],Ic={},Lg={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);Ic[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};Lg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var De=["$animate","$compile",function(a,
-b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var h,k,l;d.$watch(e.ngIf,function(d){d?k||g(function(d,f){k=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=rb(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],Ee=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,
-transclude:"element",controller:ea.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",h=e.autoscroll;return function(c,e,n,m,r){var q=0,s,w,p,y=function(){w&&(w.remove(),w=null);s&&(s.$destroy(),s=null);p&&(d.leave(p).then(function(){w=null}),w=p,p=null)};c.$watch(f,function(f){var n=function(){!x(h)||h&&!c.$eval(h)||b()},u=++q;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&u===q){var b=c.$new();m.template=a;a=r(b,function(a){y();d.enter(a,null,e).then(n)});s=b;p=a;s.$emit("$includeContentLoaded",
-f);c.$eval(g)}},function(){c.$$destroyed||u!==q||(y(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(y(),m.template=null)})}}}}],Ve=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ma.call(d[0]).match(/SVG/)?(d.empty(),a(Lc(e.template,v.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Fe=La({priority:450,compile:function(){return{pre:function(a,
-b,d){a.$eval(d.ngInit)}}}}),Re=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!y(a)){var b=[];a&&q(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(K(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},mb="ng-valid",Nd="ng-invalid",Ua="ng-pristine",Kb="ng-dirty",Pd="ng-pending",lb=O("ngModel"),Mg=["$scope",
-"$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a);
-this.$$parentForm=Jb;var n=e(d.ngModel),m=n.assign,r=n,s=m,v=null,w,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+"()"),f=e(d.ngModel+"($$$p)");r=function(a){var c=n(a);E(c)&&(c=b(a));return c};s=function(a,b){E(n(a))?f(a,{$$$p:b}):m(a,b)}}else if(!n.assign)throw lb("nonassign",d.ngModel,wa(c));};this.$render=C;this.$isEmpty=function(a){return y(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(f.removeClass(c,"ng-not-empty"),
-f.addClass(c,"ng-empty")):(f.removeClass(c,"ng-empty"),f.addClass(c,"ng-not-empty"))};var H=0;Jd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Kb);f.addClass(c,Ua)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Ua);f.addClass(c,Kb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,"ng-untouched","ng-touched")};
-this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;f.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}};
-this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!E(h.then))throw lb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},C):g(!0)}function f(a,b){h===H&&p.$setValidity(a,b)}function g(a){h===H&&c(a)}H++;var h=
-H;(function(){var a=p.$$parserName||"parse";if(y(w))f(a,null);else return w||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,w),w;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;
-if(w=y(b)?void 0:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),y(b)){w=!1;break}Q(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=r(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:void 0,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);q(p.$viewChangeListeners,
-function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&x(d.debounce)&&(d=d.debounce,Q(d)?c=d:Q(d[b])?c=d[b]:Q(d["default"])&&(c=d["default"]));g.cancel(v);c?v=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=r(a);if(b!==p.$modelValue&&(p.$modelValue===
-p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;w=void 0;for(var c=p.$formatters,d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$$updateEmptyClasses(e),p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,C))}return b})}],Qe=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Mg,priority:1,compile:function(b){b.addClass(Ua).addClass("ng-untouched").addClass(mb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||
-g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],Ng=/(\s+|^)default(\s+|$)/,Ue=function(){return{restrict:"A",
-controller:["$scope","$attrs",function(a,b){var d=this;this.$options=qa(a.$eval(b.ngModelOptions));x(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=V(this.$options.updateOn.replace(Ng,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Ge=La({terminal:!0,priority:1E3}),Og=O("ngOptions"),Pg=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
-Oe=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!q&&ya(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Pg);if(!m)throw Og("iexp",a,wa(b));var r=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var s=m[9];b=d(m[2]?m[1]:r);var w=a&&d(a)||b,p=s&&d(s),v=s?function(a,b){return p(c,b)}:function(a){return Fa(a)},
-t=function(a,b){return v(a,L(a,b))},z=d(m[2]||m[1]),u=d(m[3]||""),y=d(m[4]||""),x=d(m[8]),D={},L=q?function(a,b){D[q]=b;D[r]=a;return D}:function(a){D[r]=a;return D};return{trackBy:s,getTrackByValue:t,getWatchables:d(x,function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var h=a===d?g:d[g],l=a[h],h=L(l,h),l=v(l,h);b.push(l);if(m[2]||m[1])l=z(c,h),b.push(l);m[4]&&(h=y(c,h),b.push(h))}return b}),getOptions:function(){for(var a=[],b={},d=x(c)||[],g=f(d),h=g.length,m=0;m<h;m++){var p=d===
-g?m:g[m],q=L(d[p],p),r=w(c,q),p=v(r,q),D=z(c,q),N=u(c,q),q=y(c,q),r=new e(p,r,D,N,q);a.push(r);b[p]=r}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[t(a)]},getViewValueFromOption:function(a){return s?ea.copy(a.viewValue):a.viewValue}}}}}var e=v.document.createElement("option"),f=v.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=C},post:function(d,h,k,l){function n(a,b){a.element=
-b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(){var a=u&&r.readValue();if(u)for(var b=u.items.length-1;0<=b;b--){var c=u.items[b];c.group?Bb(c.element.parentNode):Bb(c.element)}u=I.getOptions();var d={};t&&h.prepend(w);u.items.forEach(function(a){var b;if(x(a.group)){b=d[a.group];b||(b=f.cloneNode(!1),E.appendChild(b),b.label=a.group,d[a.group]=b);var c=e.cloneNode(!1)}else b=E,c=e.cloneNode(!1);b.appendChild(c);
-n(a,c)});h[0].appendChild(E);s.$render();s.$isEmpty(a)||(b=r.readValue(),(I.trackBy||v?pa(a,b):a===b)||(s.$setViewValue(b),s.$render()))}var r=l[0],s=l[1],v=k.multiple,w;l=0;for(var p=h.children(),y=p.length;l<y;l++)if(""===p[l].value){w=p.eq(l);break}var t=!!w,z=B(e.cloneNode(!1));z.val("?");var u,I=c(k.ngOptions,h,d),E=b[0].createDocumentFragment();v?(s.$isEmpty=function(a){return!a||0===a.length},r.writeValue=function(a){u.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){if(a=
-u.getOptionFromViewValue(a))a.element.selected=!0})},r.readValue=function(){var a=h.val()||[],b=[];q(a,function(a){(a=u.selectValueMap[a])&&!a.disabled&&b.push(u.getViewValueFromOption(a))});return b},I.trackBy&&d.$watchCollection(function(){if(K(s.$viewValue))return s.$viewValue.map(function(a){return I.getTrackByValue(a)})},function(){s.$render()})):(r.writeValue=function(a){var b=u.getOptionFromViewValue(a);b?(h[0].value!==b.selectValue&&(z.remove(),t||w.remove(),h[0].value=b.selectValue,b.element.selected=
-!0),b.element.setAttribute("selected","selected")):null===a||t?(z.remove(),t||h.prepend(w),h.val(""),w.prop("selected",!0),w.attr("selected",!0)):(t||w.remove(),h.prepend(z),h.val("?"),z.prop("selected",!0),z.attr("selected",!0))},r.readValue=function(){var a=u.selectValueMap[h.val()];return a&&!a.disabled?(t||w.remove(),z.remove(),u.getViewValueFromOption(a)):null},I.trackBy&&d.$watch(function(){return I.getTrackByValue(s.$viewValue)},function(){s.$render()}));t?(w.remove(),a(w)(d),w.removeClass("ng-scope")):
-w=B(e.cloneNode(!1));h.empty();m();d.$watchCollection(I.getWatchables,m)}}}}],He=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,h){function k(a){g.text(a||"")}var l=h.count,n=h.$attr.when&&g.attr(h.$attr.when),m=h.offset||0,r=f.$eval(n)||{},s={},v=b.startSymbol(),w=b.endSymbol(),p=v+l+"-"+m+w,x=ea.noop,t;q(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+P(c[2]),r[c]=g.attr(h.$attr[b]))});q(r,function(a,d){s[d]=b(a.replace(c,p))});f.$watch(l,
-function(b){var c=parseFloat(b),e=isNaN(c);e||c in r||(c=a.pluralCat(c-m));c===t||e&&Q(t)&&isNaN(t)||(x(),e=s[c],y(e)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+n),x=C,k()):x=f.$watch(e,k),t=c)})}}}],Ie=["$parse","$animate","$compile",function(a,b,d){var c=O("ngRepeat"),e=function(a,b,c,d,e,n,m){a[c]=d;e&&(a[e]=n);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,
-terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,k=d.$$createComment("end ngRepeat",h),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw c("iexp",h);var n=l[1],m=l[2],r=l[3],s=l[4],l=n.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);if(!l)throw c("iidexp",n);var v=l[3]||l[1],w=l[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw c("badident",
-r);var p,y,t,z,u={$id:Fa};s?p=a(s):(t=function(a,b){return Fa(b)},z=function(a){return a});return function(a,d,f,g,l){p&&(y=function(b,c,d){w&&(u[w]=b);u[v]=c;u.$index=d;return p(a,u)});var n=T();a.$watchCollection(m,function(f){var g,m,p=d[0],s,u=T(),x,D,E,C,F,B,G;r&&(a[r]=f);if(ya(f))F=f,m=y||t;else for(G in m=y||z,F=[],f)ua.call(f,G)&&"$"!==G.charAt(0)&&F.push(G);x=F.length;G=Array(x);for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],C=m(D,E,g),n[C])B=n[C],delete n[C],u[C]=B,G[g]=B;else{if(u[C])throw q(G,
-function(a){a&&a.scope&&(n[a.id]=a)}),c("dupes",h,C,E);G[g]={id:C,scope:void 0,clone:void 0};u[C]=!0}for(s in n){B=n[s];C=rb(B.clone);b.leave(C);if(C[0].parentNode)for(g=0,m=C.length;g<m;g++)C[g].$$NG_REMOVED=!0;B.scope.$destroy()}for(g=0;g<x;g++)if(D=f===F?g:F[g],E=f[D],B=G[g],B.scope){s=p;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);B.clone[0]!=s&&b.move(rb(B.clone),null,p);p=B.clone[B.clone.length-1];e(B.scope,g,v,E,w,D,x)}else l(function(a,c){B.scope=c;var d=k.cloneNode(!1);a[a.length++]=d;b.enter(a,
-null,p);p=d;B.clone=a;u[B.id]=B;e(B.scope,g,v,E,w,D,x)});n=u})}}}}],Je=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ce=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ke=La(function(a,b,d){a.$watch(d.ngStyle,function(a,
-d){d&&a!==d&&q(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Le=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,e,f){var g=[],h=[],k=[],l=[],n=function(a,b){return function(){a.splice(b,1)}};d.$watch(e.ngSwitch||e.on,function(c){var d,e;d=0;for(e=k.length;d<e;++d)a.cancel(k[d]);d=k.length=0;for(e=l.length;d<e;++d){var s=rb(h[d].clone);l[d].$destroy();(k[d]=a.leave(s)).then(n(k,d))}h.length=0;l.length=0;(g=f.cases["!"+
-c]||f.cases["?"])&&q(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],Me=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["!"+d.ngSwitchWhen]=c.cases["!"+d.ngSwitchWhen]||[];c.cases["!"+d.ngSwitchWhen].push({transclude:e,element:b})}}),Ne=La({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,
-b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),Qg=O("ngTransclude"),Pe=La({restrict:"EAC",link:function(a,b,d,c,e){d.ngTransclude===d.$attr.ngTransclude&&(d.ngTransclude="");if(!e)throw Qg("orphan",wa(b));e(function(a){a.length&&(b.empty(),b.append(a))},null,d.ngTransclude||d.ngTranscludeSlot)}}),pe=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"==d.type&&a.put(d.id,b[0].text)}}}],Rg={$setViewValue:C,$render:C},
-Sg=["$element","$scope",function(a,b){var d=this,c=new Ra;d.ngModelCtrl=Rg;d.unknownOption=B(v.document.createElement("option"));d.renderUnknownOption=function(b){b="? "+Fa(b)+" ?";d.unknownOption.val(b);a.prepend(d.unknownOption);a.val(b)};b.$on("$destroy",function(){d.renderUnknownOption=C});d.removeUnknownOption=function(){d.unknownOption.parent()&&d.unknownOption.remove()};d.readValue=function(){d.removeUnknownOption();return a.val()};d.writeValue=function(b){d.hasOption(b)?(d.removeUnknownOption(),
-a.val(b),""===b&&d.emptyOption.prop("selected",!0)):null==b&&d.emptyOption?(d.removeUnknownOption(),a.val("")):d.renderUnknownOption(b)};d.addOption=function(a,b){if(8!==b[0].nodeType){Qa(a,'"option value"');""===a&&(d.emptyOption=b);var g=c.get(a)||0;c.put(a,g+1);d.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=!0)}};d.removeOption=function(a){var b=c.get(a);b&&(1===b?(c.remove(a),""===a&&(d.emptyOption=void 0)):c.put(a,b-1))};d.hasOption=function(a){return!!c.get(a)};d.registerOption=
-function(a,b,c,h,k){if(h){var l;c.$observe("value",function(a){x(l)&&d.removeOption(l);l=a;d.addOption(a,b)})}else k?a.$watch(k,function(a,e){c.$set("value",a);e!==a&&d.removeOption(e);d.addOption(a,b)}):d.addOption(c.value,b);b.on("$destroy",function(){d.removeOption(c.value);d.ngModelCtrl.$render()})}}],qe=function(){return{restrict:"E",require:["select","?ngModel"],controller:Sg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;b.on("change",function(){a.$apply(function(){e.$setViewValue(f.readValue())})});
-if(d.multiple){f.readValue=function(){var a=[];q(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Ra(a);q(b.find("option"),function(a){a.selected=x(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==e.$viewValue||pa(g,e.$viewValue)||(g=ha(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var e=c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},se=["$interpolate",
-function(a){return{restrict:"E",priority:100,compile:function(b,d){if(x(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set("value",b.text())}return function(a,b,d){var k=b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,b,d,c,e)}}}}],re=da({restrict:"E",terminal:!1}),Fc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",
-function(){c.$validate()}))}}},Ec=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){F(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw O("ngPattern")("noregexp",f,a,wa(b));e=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||y(e)||e.test(b)}}}}},Hc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a=
-X(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=X(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};v.angular.bootstrap?v.console&&console.log("WARNING: Tried to load angular more than once."):(ie(),ke(ea),ea.module("ngLocale",[],["$provide",function(a){function b(a){a+=
-"";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),
-WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,
-c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),B(v.document).ready(function(){ee(v.document,yc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
-//# sourceMappingURL=angular.min.js.map
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/aql-mode.js b/asterixdb/asterix-app/src/main/resources/queryui/js/aql-mode.js
deleted file mode 100644
index 861a507..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/aql-mode.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-CodeMirror.defineMode("aql", function() {
-
-  var KEYWORD_MATCH = ["return","select","for","from","at","in","let","with","where","order","by","asc","desc","group",
-                        "keeping","limit","offset","distinct","dataset","or","and"];
-  var VAR_MATCH = /[$][a-zA-Z]+(\d*)/;
-  var DOT_MATCH = /[.](\S)*/;
-  var DOUBLE_QUOTE_MATCH = /["].*["]/;
-  var SINGLE_QUOTE_MATCH = /['].*[']/;
-  var BREAK_POINT = /(\s)/;
-  return {
-    startState: function() {return {inString: false};},
-    token: function(stream, state) {
-
-          if (state.newLine == undefined)state.newLine = true;
-
-          //match variable reference
-          if (stream.match(VAR_MATCH)) {
-            return "variable-2";
-          }
-
-          if (stream.match(DOT_MATCH)) {
-            return "variable-3";
-          }
-
-          //string variable match
-          if (stream.match(DOUBLE_QUOTE_MATCH)) {
-            return "string";
-          }
-          if (stream.match(SINGLE_QUOTE_MATCH)) {
-            return "string";
-          }
-
-          //keyword match
-          for (i in KEYWORD_MATCH){
-            if (state.newLine && stream.match(KEYWORD_MATCH[i])){
-                return "keyword";
-             }
-          }
-          if (stream.peek() === " " || stream.peek() === null){
-            state.newLine = true;
-          }else{
-            state.newLine = false;
-          }
-          stream.next();
-
-      }
-  };
-});
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/bootstrap.min.js b/asterixdb/asterix-app/src/main/resources/queryui/js/bootstrap.min.js
deleted file mode 100644
index a74bb45..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/bootstrap.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
- /*! Bootstrap v3.3.6 (http://getbootstrap.com) | Copyright 2011-2015 Twitter, Inc. | Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
-d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/codemirror.js b/asterixdb/asterix-app/src/main/resources/queryui/js/codemirror.js
deleted file mode 100644
index b27c2d6..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/codemirror.js
+++ /dev/null
@@ -1,8927 +0,0 @@
-/*
- * Copyright (C) 2016 by Marijn Haverbeke <marijnh@gmail.com> and others
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-// This is CodeMirror (http://codemirror.net), a code editor
-// implemented in JavaScript on top of the browser's DOM.
-//
-// You can find some technical background for some of the code below
-// at http://marijnhaverbeke.nl/blog/#cm-internals .
-
-(function(mod) {
-  if (typeof exports == "object" && typeof module == "object") // CommonJS
-    module.exports = mod();
-  else if (typeof define == "function" && define.amd) // AMD
-    return define([], mod);
-  else // Plain browser env
-    (this || window).CodeMirror = mod();
-})(function() {
-  "use strict";
-
-  // BROWSER SNIFFING
-
-  // Kludges for bugs and behavior differences that can't be feature
-  // detected are enabled based on userAgent etc sniffing.
-  var userAgent = navigator.userAgent;
-  var platform = navigator.platform;
-
-  var gecko = /gecko\/\d/i.test(userAgent);
-  var ie_upto10 = /MSIE \d/.test(userAgent);
-  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
-  var ie = ie_upto10 || ie_11up;
-  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);
-  var webkit = /WebKit\//.test(userAgent);
-  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
-  var chrome = /Chrome\//.test(userAgent);
-  var presto = /Opera\//.test(userAgent);
-  var safari = /Apple Computer/.test(navigator.vendor);
-  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
-  var phantom = /PhantomJS/.test(userAgent);
-
-  var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent);
-  // This is woefully incomplete. Suggestions for alternative methods welcome.
-  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
-  var mac = ios || /Mac/.test(platform);
-  var chromeOS = /\bCrOS\b/.test(userAgent);
-  var windows = /win/i.test(platform);
-
-  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
-  if (presto_version) presto_version = Number(presto_version[1]);
-  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
-  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
-  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
-  var captureRightClick = gecko || (ie && ie_version >= 9);
-
-  // Optimize some code when these features are not used.
-  var sawReadOnlySpans = false, sawCollapsedSpans = false;
-
-  // EDITOR CONSTRUCTOR
-
-  // A CodeMirror instance represents an editor. This is the object
-  // that user code is usually dealing with.
-
-  function CodeMirror(place, options) {
-    if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
-
-    this.options = options = options ? copyObj(options) : {};
-    // Determine effective options based on given values and defaults.
-    copyObj(defaults, options, false);
-    setGuttersForLineNumbers(options);
-
-    var doc = options.value;
-    if (typeof doc == "string") doc = new Doc(doc, options.mode, null, options.lineSeparator);
-    this.doc = doc;
-
-    var input = new CodeMirror.inputStyles[options.inputStyle](this);
-    var display = this.display = new Display(place, doc, input);
-    display.wrapper.CodeMirror = this;
-    updateGutters(this);
-    themeChanged(this);
-    if (options.lineWrapping)
-      this.display.wrapper.className += " CodeMirror-wrap";
-    if (options.autofocus && !mobile) display.input.focus();
-    initScrollbars(this);
-
-    this.state = {
-      keyMaps: [],  // stores maps added by addKeyMap
-      overlays: [], // highlighting overlays, as added by addOverlay
-      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
-      overwrite: false,
-      delayingBlurEvent: false,
-      focused: false,
-      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
-      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll
-      selectingText: false,
-      draggingText: false,
-      highlight: new Delayed(), // stores highlight worker timeout
-      keySeq: null,  // Unfinished key sequence
-      specialChars: null
-    };
-
-    var cm = this;
-
-    // Override magic textarea content restore that IE sometimes does
-    // on our hidden textarea on reload
-    if (ie && ie_version < 11) setTimeout(function() { cm.display.input.reset(true); }, 20);
-
-    registerEventHandlers(this);
-    ensureGlobalHandlers();
-
-    startOperation(this);
-    this.curOp.forceUpdate = true;
-    attachDoc(this, doc);
-
-    if ((options.autofocus && !mobile) || cm.hasFocus())
-      setTimeout(bind(onFocus, this), 20);
-    else
-      onBlur(this);
-
-    for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
-      optionHandlers[opt](this, options[opt], Init);
-    maybeUpdateLineNumberWidth(this);
-    if (options.finishInit) options.finishInit(this);
-    for (var i = 0; i < initHooks.length; ++i) initHooks[i](this);
-    endOperation(this);
-    // Suppress optimizelegibility in Webkit, since it breaks text
-    // measuring on line wrapping boundaries.
-    if (webkit && options.lineWrapping &&
-        getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
-      display.lineDiv.style.textRendering = "auto";
-  }
-
-  // DISPLAY CONSTRUCTOR
-
-  // The display handles the DOM integration, both for input reading
-  // and content drawing. It holds references to DOM nodes and
-  // display-related state.
-
-  function Display(place, doc, input) {
-    var d = this;
-    this.input = input;
-
-    // Covers bottom-right square when both scrollbars are present.
-    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
-    d.scrollbarFiller.setAttribute("cm-not-content", "true");
-    // Covers bottom of gutter when coverGutterNextToScrollbar is on
-    // and h scrollbar is present.
-    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
-    d.gutterFiller.setAttribute("cm-not-content", "true");
-    // Will contain the actual code, positioned to cover the viewport.
-    d.lineDiv = elt("div", null, "CodeMirror-code");
-    // Elements are added to these to represent selection and cursors.
-    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
-    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
-    // A visibility: hidden element used to find the size of things.
-    d.measure = elt("div", null, "CodeMirror-measure");
-    // When lines outside of the viewport are measured, they are drawn in this.
-    d.lineMeasure = elt("div", null, "CodeMirror-measure");
-    // Wraps everything that needs to exist inside the vertically-padded coordinate system
-    d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
-                      null, "position: relative; outline: none");
-    // Moved around its parent to cover visible view.
-    d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
-    // Set to the height of the document, allowing scrolling.
-    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
-    d.sizerWidth = null;
-    // Behavior of elts with overflow: auto and padding is
-    // inconsistent across browsers. This is used to ensure the
-    // scrollable area is big enough.
-    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
-    // Will contain the gutters, if any.
-    d.gutters = elt("div", null, "CodeMirror-gutters");
-    d.lineGutter = null;
-    // Actual scrollable element.
-    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
-    d.scroller.setAttribute("tabIndex", "-1");
-    // The element in which the editor lives.
-    d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
-
-    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
-    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
-    if (!webkit && !(gecko && mobile)) d.scroller.draggable = true;
-
-    if (place) {
-      if (place.appendChild) place.appendChild(d.wrapper);
-      else place(d.wrapper);
-    }
-
-    // Current rendered range (may be bigger than the view window).
-    d.viewFrom = d.viewTo = doc.first;
-    d.reportedViewFrom = d.reportedViewTo = doc.first;
-    // Information about the rendered lines.
-    d.view = [];
-    d.renderedView = null;
-    // Holds info about a single rendered line when it was rendered
-    // for measurement, while not in view.
-    d.externalMeasured = null;
-    // Empty space (in pixels) above the view
-    d.viewOffset = 0;
-    d.lastWrapHeight = d.lastWrapWidth = 0;
-    d.updateLineNumbers = null;
-
-    d.nativeBarWidth = d.barHeight = d.barWidth = 0;
-    d.scrollbarsClipped = false;
-
-    // Used to only resize the line number gutter when necessary (when
-    // the amount of lines crosses a boundary that makes its width change)
-    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
-    // Set to true when a non-horizontal-scrolling line widget is
-    // added. As an optimization, line widget aligning is skipped when
-    // this is false.
-    d.alignWidgets = false;
-
-    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
-
-    // Tracks the maximum line length so that the horizontal scrollbar
-    // can be kept static when scrolling.
-    d.maxLine = null;
-    d.maxLineLength = 0;
-    d.maxLineChanged = false;
-
-    // Used for measuring wheel scrolling granularity
-    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
-
-    // True when shift is held down.
-    d.shift = false;
-
-    // Used to track whether anything happened since the context menu
-    // was opened.
-    d.selForContextMenu = null;
-
-    d.activeTouch = null;
-
-    input.init(d);
-  }
-
-  // STATE UPDATES
-
-  // Used to get the editor into a consistent state again when options change.
-
-  function loadMode(cm) {
-    cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
-    resetModeState(cm);
-  }
-
-  function resetModeState(cm) {
-    cm.doc.iter(function(line) {
-      if (line.stateAfter) line.stateAfter = null;
-      if (line.styles) line.styles = null;
-    });
-    cm.doc.frontier = cm.doc.first;
-    startWorker(cm, 100);
-    cm.state.modeGen++;
-    if (cm.curOp) regChange(cm);
-  }
-
-  function wrappingChanged(cm) {
-    if (cm.options.lineWrapping) {
-      addClass(cm.display.wrapper, "CodeMirror-wrap");
-      cm.display.sizer.style.minWidth = "";
-      cm.display.sizerWidth = null;
-    } else {
-      rmClass(cm.display.wrapper, "CodeMirror-wrap");
-      findMaxLine(cm);
-    }
-    estimateLineHeights(cm);
-    regChange(cm);
-    clearCaches(cm);
-    setTimeout(function(){updateScrollbars(cm);}, 100);
-  }
-
-  // Returns a function that estimates the height of a line, to use as
-  // first approximation until the line becomes visible (and is thus
-  // properly measurable).
-  function estimateHeight(cm) {
-    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
-    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
-    return function(line) {
-      if (lineIsHidden(cm.doc, line)) return 0;
-
-      var widgetsHeight = 0;
-      if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {
-        if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;
-      }
-
-      if (wrapping)
-        return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;
-      else
-        return widgetsHeight + th;
-    };
-  }
-
-  function estimateLineHeights(cm) {
-    var doc = cm.doc, est = estimateHeight(cm);
-    doc.iter(function(line) {
-      var estHeight = est(line);
-      if (estHeight != line.height) updateLineHeight(line, estHeight);
-    });
-  }
-
-  function themeChanged(cm) {
-    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
-      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
-    clearCaches(cm);
-  }
-
-  function guttersChanged(cm) {
-    updateGutters(cm);
-    regChange(cm);
-    setTimeout(function(){alignHorizontally(cm);}, 20);
-  }
-
-  // Rebuild the gutter elements, ensure the margin to the left of the
-  // code matches their width.
-  function updateGutters(cm) {
-    var gutters = cm.display.gutters, specs = cm.options.gutters;
-    removeChildren(gutters);
-    for (var i = 0; i < specs.length; ++i) {
-      var gutterClass = specs[i];
-      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
-      if (gutterClass == "CodeMirror-linenumbers") {
-        cm.display.lineGutter = gElt;
-        gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
-      }
-    }
-    gutters.style.display = i ? "" : "none";
-    updateGutterSpace(cm);
-  }
-
-  function updateGutterSpace(cm) {
-    var width = cm.display.gutters.offsetWidth;
-    cm.display.sizer.style.marginLeft = width + "px";
-  }
-
-  // Compute the character length of a line, taking into account
-  // collapsed ranges (see markText) that might hide parts, and join
-  // other lines onto it.
-  function lineLength(line) {
-    if (line.height == 0) return 0;
-    var len = line.text.length, merged, cur = line;
-    while (merged = collapsedSpanAtStart(cur)) {
-      var found = merged.find(0, true);
-      cur = found.from.line;
-      len += found.from.ch - found.to.ch;
-    }
-    cur = line;
-    while (merged = collapsedSpanAtEnd(cur)) {
-      var found = merged.find(0, true);
-      len -= cur.text.length - found.from.ch;
-      cur = found.to.line;
-      len += cur.text.length - found.to.ch;
-    }
-    return len;
-  }
-
-  // Find the longest line in the document.
-  function findMaxLine(cm) {
-    var d = cm.display, doc = cm.doc;
-    d.maxLine = getLine(doc, doc.first);
-    d.maxLineLength = lineLength(d.maxLine);
-    d.maxLineChanged = true;
-    doc.iter(function(line) {
-      var len = lineLength(line);
-      if (len > d.maxLineLength) {
-        d.maxLineLength = len;
-        d.maxLine = line;
-      }
-    });
-  }
-
-  // Make sure the gutters options contains the element
-  // "CodeMirror-linenumbers" when the lineNumbers option is true.
-  function setGuttersForLineNumbers(options) {
-    var found = indexOf(options.gutters, "CodeMirror-linenumbers");
-    if (found == -1 && options.lineNumbers) {
-      options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
-    } else if (found > -1 && !options.lineNumbers) {
-      options.gutters = options.gutters.slice(0);
-      options.gutters.splice(found, 1);
-    }
-  }
-
-  // SCROLLBARS
-
-  // Prepare DOM reads needed to update the scrollbars. Done in one
-  // shot to minimize update/measure roundtrips.
-  function measureForScrollbars(cm) {
-    var d = cm.display, gutterW = d.gutters.offsetWidth;
-    var docH = Math.round(cm.doc.height + paddingVert(cm.display));
-    return {
-      clientHeight: d.scroller.clientHeight,
-      viewHeight: d.wrapper.clientHeight,
-      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
-      viewWidth: d.wrapper.clientWidth,
-      barLeft: cm.options.fixedGutter ? gutterW : 0,
-      docHeight: docH,
-      scrollHeight: docH + scrollGap(cm) + d.barHeight,
-      nativeBarWidth: d.nativeBarWidth,
-      gutterWidth: gutterW
-    };
-  }
-
-  function NativeScrollbars(place, scroll, cm) {
-    this.cm = cm;
-    var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
-    var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
-    place(vert); place(horiz);
-
-    on(vert, "scroll", function() {
-      if (vert.clientHeight) scroll(vert.scrollTop, "vertical");
-    });
-    on(horiz, "scroll", function() {
-      if (horiz.clientWidth) scroll(horiz.scrollLeft, "horizontal");
-    });
-
-    this.checkedZeroWidth = false;
-    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
-    if (ie && ie_version < 8) this.horiz.style.minHeight = this.vert.style.minWidth = "18px";
-  }
-
-  NativeScrollbars.prototype = copyObj({
-    update: function(measure) {
-      var needsH = measure.scrollWidth > measure.clientWidth + 1;
-      var needsV = measure.scrollHeight > measure.clientHeight + 1;
-      var sWidth = measure.nativeBarWidth;
-
-      if (needsV) {
-        this.vert.style.display = "block";
-        this.vert.style.bottom = needsH ? sWidth + "px" : "0";
-        var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
-        // A bug in IE8 can cause this value to be negative, so guard it.
-        this.vert.firstChild.style.height =
-          Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
-      } else {
-        this.vert.style.display = "";
-        this.vert.firstChild.style.height = "0";
-      }
-
-      if (needsH) {
-        this.horiz.style.display = "block";
-        this.horiz.style.right = needsV ? sWidth + "px" : "0";
-        this.horiz.style.left = measure.barLeft + "px";
-        var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
-        this.horiz.firstChild.style.width =
-          (measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
-      } else {
-        this.horiz.style.display = "";
-        this.horiz.firstChild.style.width = "0";
-      }
-
-      if (!this.checkedZeroWidth && measure.clientHeight > 0) {
-        if (sWidth == 0) this.zeroWidthHack();
-        this.checkedZeroWidth = true;
-      }
-
-      return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0};
-    },
-    setScrollLeft: function(pos) {
-      if (this.horiz.scrollLeft != pos) this.horiz.scrollLeft = pos;
-      if (this.disableHoriz) this.enableZeroWidthBar(this.horiz, this.disableHoriz);
-    },
-    setScrollTop: function(pos) {
-      if (this.vert.scrollTop != pos) this.vert.scrollTop = pos;
-      if (this.disableVert) this.enableZeroWidthBar(this.vert, this.disableVert);
-    },
-    zeroWidthHack: function() {
-      var w = mac && !mac_geMountainLion ? "12px" : "18px";
-      this.horiz.style.height = this.vert.style.width = w;
-      this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
-      this.disableHoriz = new Delayed;
-      this.disableVert = new Delayed;
-    },
-    enableZeroWidthBar: function(bar, delay) {
-      bar.style.pointerEvents = "auto";
-      function maybeDisable() {
-        // To find out whether the scrollbar is still visible, we
-        // check whether the element under the pixel in the bottom
-        // left corner of the scrollbar box is the scrollbar box
-        // itself (when the bar is still visible) or its filler child
-        // (when the bar is hidden). If it is still visible, we keep
-        // it enabled, if it's hidden, we disable pointer events.
-        var box = bar.getBoundingClientRect();
-        var elt = document.elementFromPoint(box.left + 1, box.bottom - 1);
-        if (elt != bar) bar.style.pointerEvents = "none";
-        else delay.set(1000, maybeDisable);
-      }
-      delay.set(1000, maybeDisable);
-    },
-    clear: function() {
-      var parent = this.horiz.parentNode;
-      parent.removeChild(this.horiz);
-      parent.removeChild(this.vert);
-    }
-  }, NativeScrollbars.prototype);
-
-  function NullScrollbars() {}
-
-  NullScrollbars.prototype = copyObj({
-    update: function() { return {bottom: 0, right: 0}; },
-    setScrollLeft: function() {},
-    setScrollTop: function() {},
-    clear: function() {}
-  }, NullScrollbars.prototype);
-
-  CodeMirror.scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
-
-  function initScrollbars(cm) {
-    if (cm.display.scrollbars) {
-      cm.display.scrollbars.clear();
-      if (cm.display.scrollbars.addClass)
-        rmClass(cm.display.wrapper, cm.display.scrollbars.addClass);
-    }
-
-    cm.display.scrollbars = new CodeMirror.scrollbarModel[cm.options.scrollbarStyle](function(node) {
-      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
-      // Prevent clicks in the scrollbars from killing focus
-      on(node, "mousedown", function() {
-        if (cm.state.focused) setTimeout(function() { cm.display.input.focus(); }, 0);
-      });
-      node.setAttribute("cm-not-content", "true");
-    }, function(pos, axis) {
-      if (axis == "horizontal") setScrollLeft(cm, pos);
-      else setScrollTop(cm, pos);
-    }, cm);
-    if (cm.display.scrollbars.addClass)
-      addClass(cm.display.wrapper, cm.display.scrollbars.addClass);
-  }
-
-  function updateScrollbars(cm, measure) {
-    if (!measure) measure = measureForScrollbars(cm);
-    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
-    updateScrollbarsInner(cm, measure);
-    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
-      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
-        updateHeightsInViewport(cm);
-      updateScrollbarsInner(cm, measureForScrollbars(cm));
-      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
-    }
-  }
-
-  // Re-synchronize the fake scrollbars with the actual size of the
-  // content.
-  function updateScrollbarsInner(cm, measure) {
-    var d = cm.display;
-    var sizes = d.scrollbars.update(measure);
-
-    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
-    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
-    d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"
-
-    if (sizes.right && sizes.bottom) {
-      d.scrollbarFiller.style.display = "block";
-      d.scrollbarFiller.style.height = sizes.bottom + "px";
-      d.scrollbarFiller.style.width = sizes.right + "px";
-    } else d.scrollbarFiller.style.display = "";
-    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
-      d.gutterFiller.style.display = "block";
-      d.gutterFiller.style.height = sizes.bottom + "px";
-      d.gutterFiller.style.width = measure.gutterWidth + "px";
-    } else d.gutterFiller.style.display = "";
-  }
-
-  // Compute the lines that are visible in a given viewport (defaults
-  // the the current scroll position). viewport may contain top,
-  // height, and ensure (see op.scrollToPos) properties.
-  function visibleLines(display, doc, viewport) {
-    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
-    top = Math.floor(top - paddingTop(display));
-    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
-
-    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
-    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
-    // forces those lines into the viewport (if possible).
-    if (viewport && viewport.ensure) {
-      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
-      if (ensureFrom < from) {
-        from = ensureFrom;
-        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
-      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
-        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
-        to = ensureTo;
-      }
-    }
-    return {from: from, to: Math.max(to, from + 1)};
-  }
-
-  // LINE NUMBERS
-
-  // Re-align line numbers and gutter marks to compensate for
-  // horizontal scrolling.
-  function alignHorizontally(cm) {
-    var display = cm.display, view = display.view;
-    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
-    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
-    var gutterW = display.gutters.offsetWidth, left = comp + "px";
-    for (var i = 0; i < view.length; i++) if (!view[i].hidden) {
-      if (cm.options.fixedGutter && view[i].gutter)
-        view[i].gutter.style.left = left;
-      var align = view[i].alignable;
-      if (align) for (var j = 0; j < align.length; j++)
-        align[j].style.left = left;
-    }
-    if (cm.options.fixedGutter)
-      display.gutters.style.left = (comp + gutterW) + "px";
-  }
-
-  // Used to ensure that the line number gutter is still the right
-  // size for the current document size. Returns true when an update
-  // is needed.
-  function maybeUpdateLineNumberWidth(cm) {
-    if (!cm.options.lineNumbers) return false;
-    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
-    if (last.length != display.lineNumChars) {
-      var test = display.measure.appendChild(elt("div", [elt("div", last)],
-                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
-      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
-      display.lineGutter.style.width = "";
-      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
-      display.lineNumWidth = display.lineNumInnerWidth + padding;
-      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
-      display.lineGutter.style.width = display.lineNumWidth + "px";
-      updateGutterSpace(cm);
-      return true;
-    }
-    return false;
-  }
-
-  function lineNumberFor(options, i) {
-    return String(options.lineNumberFormatter(i + options.firstLineNumber));
-  }
-
-  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
-  // but using getBoundingClientRect to get a sub-pixel-accurate
-  // result.
-  function compensateForHScroll(display) {
-    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;
-  }
-
-  // DISPLAY DRAWING
-
-  function DisplayUpdate(cm, viewport, force) {
-    var display = cm.display;
-
-    this.viewport = viewport;
-    // Store some values that we'll need later (but don't want to force a relayout for)
-    this.visible = visibleLines(display, cm.doc, viewport);
-    this.editorIsHidden = !display.wrapper.offsetWidth;
-    this.wrapperHeight = display.wrapper.clientHeight;
-    this.wrapperWidth = display.wrapper.clientWidth;
-    this.oldDisplayWidth = displayWidth(cm);
-    this.force = force;
-    this.dims = getDimensions(cm);
-    this.events = [];
-  }
-
-  DisplayUpdate.prototype.signal = function(emitter, type) {
-    if (hasHandler(emitter, type))
-      this.events.push(arguments);
-  };
-  DisplayUpdate.prototype.finish = function() {
-    for (var i = 0; i < this.events.length; i++)
-      signal.apply(null, this.events[i]);
-  };
-
-  function maybeClipScrollbars(cm) {
-    var display = cm.display;
-    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
-      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
-      display.heightForcer.style.height = scrollGap(cm) + "px";
-      display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
-      display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
-      display.scrollbarsClipped = true;
-    }
-  }
-
-  // Does the actual updating of the line display. Bails out
-  // (returning false) when there is nothing to be done and forced is
-  // false.
-  function updateDisplayIfNeeded(cm, update) {
-    var display = cm.display, doc = cm.doc;
-
-    if (update.editorIsHidden) {
-      resetView(cm);
-      return false;
-    }
-
-    // Bail out if the visible area is already rendered and nothing changed.
-    if (!update.force &&
-        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
-        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
-        display.renderedView == display.view && countDirtyView(cm) == 0)
-      return false;
-
-    if (maybeUpdateLineNumberWidth(cm)) {
-      resetView(cm);
-      update.dims = getDimensions(cm);
-    }
-
-    // Compute a suitable new viewport (from & to)
-    var end = doc.first + doc.size;
-    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
-    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
-    if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
-    if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
-    if (sawCollapsedSpans) {
-      from = visualLineNo(cm.doc, from);
-      to = visualLineEndNo(cm.doc, to);
-    }
-
-    var different = from != display.viewFrom || to != display.viewTo ||
-      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
-    adjustView(cm, from, to);
-
-    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
-    // Position the mover div to align with the current scroll position
-    cm.display.mover.style.top = display.viewOffset + "px";
-
-    var toUpdate = countDirtyView(cm);
-    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
-        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
-      return false;
-
-    // For big changes, we hide the enclosing element during the
-    // update, since that speeds up the operations on most browsers.
-    var focused = activeElt();
-    if (toUpdate > 4) display.lineDiv.style.display = "none";
-    patchDisplay(cm, display.updateLineNumbers, update.dims);
-    if (toUpdate > 4) display.lineDiv.style.display = "";
-    display.renderedView = display.view;
-    // There might have been a widget with a focused element that got
-    // hidden or updated, if so re-focus it.
-    if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();
-
-    // Prevent selection and cursors from interfering with the scroll
-    // width and height.
-    removeChildren(display.cursorDiv);
-    removeChildren(display.selectionDiv);
-    display.gutters.style.height = display.sizer.style.minHeight = 0;
-
-    if (different) {
-      display.lastWrapHeight = update.wrapperHeight;
-      display.lastWrapWidth = update.wrapperWidth;
-      startWorker(cm, 400);
-    }
-
-    display.updateLineNumbers = null;
-
-    return true;
-  }
-
-  function postUpdateDisplay(cm, update) {
-    var viewport = update.viewport;
-
-    for (var first = true;; first = false) {
-      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
-        // Clip forced viewport to actual scrollable area.
-        if (viewport && viewport.top != null)
-          viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)};
-        // Updated line heights might result in the drawn area not
-        // actually covering the viewport. Keep looping until it does.
-        update.visible = visibleLines(cm.display, cm.doc, viewport);
-        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
-          break;
-      }
-      if (!updateDisplayIfNeeded(cm, update)) break;
-      updateHeightsInViewport(cm);
-      var barMeasure = measureForScrollbars(cm);
-      updateSelection(cm);
-      updateScrollbars(cm, barMeasure);
-      setDocumentHeight(cm, barMeasure);
-    }
-
-    update.signal(cm, "update", cm);
-    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
-      update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
-      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
-    }
-  }
-
-  function updateDisplaySimple(cm, viewport) {
-    var update = new DisplayUpdate(cm, viewport);
-    if (updateDisplayIfNeeded(cm, update)) {
-      updateHeightsInViewport(cm);
-      postUpdateDisplay(cm, update);
-      var barMeasure = measureForScrollbars(cm);
-      updateSelection(cm);
-      updateScrollbars(cm, barMeasure);
-      setDocumentHeight(cm, barMeasure);
-      update.finish();
-    }
-  }
-
-  function setDocumentHeight(cm, measure) {
-    cm.display.sizer.style.minHeight = measure.docHeight + "px";
-    cm.display.heightForcer.style.top = measure.docHeight + "px";
-    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
-  }
-
-  // Read the actual heights of the rendered lines, and update their
-  // stored heights to match.
-  function updateHeightsInViewport(cm) {
-    var display = cm.display;
-    var prevBottom = display.lineDiv.offsetTop;
-    for (var i = 0; i < display.view.length; i++) {
-      var cur = display.view[i], height;
-      if (cur.hidden) continue;
-      if (ie && ie_version < 8) {
-        var bot = cur.node.offsetTop + cur.node.offsetHeight;
-        height = bot - prevBottom;
-        prevBottom = bot;
-      } else {
-        var box = cur.node.getBoundingClientRect();
-        height = box.bottom - box.top;
-      }
-      var diff = cur.line.height - height;
-      if (height < 2) height = textHeight(display);
-      if (diff > .001 || diff < -.001) {
-        updateLineHeight(cur.line, height);
-        updateWidgetHeight(cur.line);
-        if (cur.rest) for (var j = 0; j < cur.rest.length; j++)
-          updateWidgetHeight(cur.rest[j]);
-      }
-    }
-  }
-
-  // Read and store the height of line widgets associated with the
-  // given line.
-  function updateWidgetHeight(line) {
-    if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)
-      line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight;
-  }
-
-  // Do a bulk-read of the DOM positions and sizes needed to draw the
-  // view, so that we don't interleave reading and writing to the DOM.
-  function getDimensions(cm) {
-    var d = cm.display, left = {}, width = {};
-    var gutterLeft = d.gutters.clientLeft;
-    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
-      left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft;
-      width[cm.options.gutters[i]] = n.clientWidth;
-    }
-    return {fixedPos: compensateForHScroll(d),
-            gutterTotalWidth: d.gutters.offsetWidth,
-            gutterLeft: left,
-            gutterWidth: width,
-            wrapperWidth: d.wrapper.clientWidth};
-  }
-
-  // Sync the actual display DOM structure with display.view, removing
-  // nodes for lines that are no longer in view, and creating the ones
-  // that are not there yet, and updating the ones that are out of
-  // date.
-  function patchDisplay(cm, updateNumbersFrom, dims) {
-    var display = cm.display, lineNumbers = cm.options.lineNumbers;
-    var container = display.lineDiv, cur = container.firstChild;
-
-    function rm(node) {
-      var next = node.nextSibling;
-      // Works around a throw-scroll bug in OS X Webkit
-      if (webkit && mac && cm.display.currentWheelTarget == node)
-        node.style.display = "none";
-      else
-        node.parentNode.removeChild(node);
-      return next;
-    }
-
-    var view = display.view, lineN = display.viewFrom;
-    // Loop over the elements in the view, syncing cur (the DOM nodes
-    // in display.lineDiv) with the view as we go.
-    for (var i = 0; i < view.length; i++) {
-      var lineView = view[i];
-      if (lineView.hidden) {
-      } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
-        var node = buildLineElement(cm, lineView, lineN, dims);
-        container.insertBefore(node, cur);
-      } else { // Already drawn
-        while (cur != lineView.node) cur = rm(cur);
-        var updateNumber = lineNumbers && updateNumbersFrom != null &&
-          updateNumbersFrom <= lineN && lineView.lineNumber;
-        if (lineView.changes) {
-          if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;
-          updateLineForChanges(cm, lineView, lineN, dims);
-        }
-        if (updateNumber) {
-          removeChildren(lineView.lineNumber);
-          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
-        }
-        cur = lineView.node.nextSibling;
-      }
-      lineN += lineView.size;
-    }
-    while (cur) cur = rm(cur);
-  }
-
-  // When an aspect of a line changes, a string is added to
-  // lineView.changes. This updates the relevant part of the line's
-  // DOM structure.
-  function updateLineForChanges(cm, lineView, lineN, dims) {
-    for (var j = 0; j < lineView.changes.length; j++) {
-      var type = lineView.changes[j];
-      if (type == "text") updateLineText(cm, lineView);
-      else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);
-      else if (type == "class") updateLineClasses(lineView);
-      else if (type == "widget") updateLineWidgets(cm, lineView, dims);
-    }
-    lineView.changes = null;
-  }
-
-  // Lines with gutter elements, widgets or a background class need to
-  // be wrapped, and have the extra elements added to the wrapper div
-  function ensureLineWrapped(lineView) {
-    if (lineView.node == lineView.text) {
-      lineView.node = elt("div", null, null, "position: relative");
-      if (lineView.text.parentNode)
-        lineView.text.parentNode.replaceChild(lineView.node, lineView.text);
-      lineView.node.appendChild(lineView.text);
-      if (ie && ie_version < 8) lineView.node.style.zIndex = 2;
-    }
-    return lineView.node;
-  }
-
-  function updateLineBackground(lineView) {
-    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
-    if (cls) cls += " CodeMirror-linebackground";
-    if (lineView.background) {
-      if (cls) lineView.background.className = cls;
-      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
-    } else if (cls) {
-      var wrap = ensureLineWrapped(lineView);
-      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
-    }
-  }
-
-  // Wrapper around buildLineContent which will reuse the structure
-  // in display.externalMeasured when possible.
-  function getLineContent(cm, lineView) {
-    var ext = cm.display.externalMeasured;
-    if (ext && ext.line == lineView.line) {
-      cm.display.externalMeasured = null;
-      lineView.measure = ext.measure;
-      return ext.built;
-    }
-    return buildLineContent(cm, lineView);
-  }
-
-  // Redraw the line's text. Interacts with the background and text
-  // classes because the mode may output tokens that influence these
-  // classes.
-  function updateLineText(cm, lineView) {
-    var cls = lineView.text.className;
-    var built = getLineContent(cm, lineView);
-    if (lineView.text == lineView.node) lineView.node = built.pre;
-    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
-    lineView.text = built.pre;
-    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
-      lineView.bgClass = built.bgClass;
-      lineView.textClass = built.textClass;
-      updateLineClasses(lineView);
-    } else if (cls) {
-      lineView.text.className = cls;
-    }
-  }
-
-  function updateLineClasses(lineView) {
-    updateLineBackground(lineView);
-    if (lineView.line.wrapClass)
-      ensureLineWrapped(lineView).className = lineView.line.wrapClass;
-    else if (lineView.node != lineView.text)
-      lineView.node.className = "";
-    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
-    lineView.text.className = textClass || "";
-  }
-
-  function updateLineGutter(cm, lineView, lineN, dims) {
-    if (lineView.gutter) {
-      lineView.node.removeChild(lineView.gutter);
-      lineView.gutter = null;
-    }
-    if (lineView.gutterBackground) {
-      lineView.node.removeChild(lineView.gutterBackground);
-      lineView.gutterBackground = null;
-    }
-    if (lineView.line.gutterClass) {
-      var wrap = ensureLineWrapped(lineView);
-      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
-                                      "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) +
-                                      "px; width: " + dims.gutterTotalWidth + "px");
-      wrap.insertBefore(lineView.gutterBackground, lineView.text);
-    }
-    var markers = lineView.line.gutterMarkers;
-    if (cm.options.lineNumbers || markers) {
-      var wrap = ensureLineWrapped(lineView);
-      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " +
-                                             (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px");
-      cm.display.input.setUneditable(gutterWrap);
-      wrap.insertBefore(gutterWrap, lineView.text);
-      if (lineView.line.gutterClass)
-        gutterWrap.className += " " + lineView.line.gutterClass;
-      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
-        lineView.lineNumber = gutterWrap.appendChild(
-          elt("div", lineNumberFor(cm.options, lineN),
-              "CodeMirror-linenumber CodeMirror-gutter-elt",
-              "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
-              + cm.display.lineNumInnerWidth + "px"));
-      if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {
-        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
-        if (found)
-          gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
-                                     dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
-      }
-    }
-  }
-
-  function updateLineWidgets(cm, lineView, dims) {
-    if (lineView.alignable) lineView.alignable = null;
-    for (var node = lineView.node.firstChild, next; node; node = next) {
-      var next = node.nextSibling;
-      if (node.className == "CodeMirror-linewidget")
-        lineView.node.removeChild(node);
-    }
-    insertLineWidgets(cm, lineView, dims);
-  }
-
-  // Build a line's DOM representation from scratch
-  function buildLineElement(cm, lineView, lineN, dims) {
-    var built = getLineContent(cm, lineView);
-    lineView.text = lineView.node = built.pre;
-    if (built.bgClass) lineView.bgClass = built.bgClass;
-    if (built.textClass) lineView.textClass = built.textClass;
-
-    updateLineClasses(lineView);
-    updateLineGutter(cm, lineView, lineN, dims);
-    insertLineWidgets(cm, lineView, dims);
-    return lineView.node;
-  }
-
-  // A lineView may contain multiple logical lines (when merged by
-  // collapsed spans). The widgets for all of them need to be drawn.
-  function insertLineWidgets(cm, lineView, dims) {
-    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
-    if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
-      insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false);
-  }
-
-  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
-    if (!line.widgets) return;
-    var wrap = ensureLineWrapped(lineView);
-    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
-      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
-      if (!widget.handleMouseEvents) node.setAttribute("cm-ignore-events", "true");
-      positionLineWidget(widget, node, lineView, dims);
-      cm.display.input.setUneditable(node);
-      if (allowAbove && widget.above)
-        wrap.insertBefore(node, lineView.gutter || lineView.text);
-      else
-        wrap.appendChild(node);
-      signalLater(widget, "redraw");
-    }
-  }
-
-  function positionLineWidget(widget, node, lineView, dims) {
-    if (widget.noHScroll) {
-      (lineView.alignable || (lineView.alignable = [])).push(node);
-      var width = dims.wrapperWidth;
-      node.style.left = dims.fixedPos + "px";
-      if (!widget.coverGutter) {
-        width -= dims.gutterTotalWidth;
-        node.style.paddingLeft = dims.gutterTotalWidth + "px";
-      }
-      node.style.width = width + "px";
-    }
-    if (widget.coverGutter) {
-      node.style.zIndex = 5;
-      node.style.position = "relative";
-      if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
-    }
-  }
-
-  // POSITION OBJECT
-
-  // A Pos instance represents a position within the text.
-  var Pos = CodeMirror.Pos = function(line, ch) {
-    if (!(this instanceof Pos)) return new Pos(line, ch);
-    this.line = line; this.ch = ch;
-  };
-
-  // Compare two positions, return 0 if they are the same, a negative
-  // number when a is less, and a positive number otherwise.
-  var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };
-
-  function copyPos(x) {return Pos(x.line, x.ch);}
-  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
-  function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }
-
-  // INPUT HANDLING
-
-  function ensureFocus(cm) {
-    if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); }
-  }
-
-  // This will be set to a {lineWise: bool, text: [string]} object, so
-  // that, when pasting, we know what kind of selections the copied
-  // text was made out of.
-  var lastCopied = null;
-
-  function applyTextInput(cm, inserted, deleted, sel, origin) {
-    var doc = cm.doc;
-    cm.display.shift = false;
-    if (!sel) sel = doc.sel;
-
-    var paste = cm.state.pasteIncoming || origin == "paste";
-    var textLines = doc.splitLines(inserted), multiPaste = null
-    // When pasing N lines into N selections, insert one line per selection
-    if (paste && sel.ranges.length > 1) {
-      if (lastCopied && lastCopied.text.join("\n") == inserted) {
-        if (sel.ranges.length % lastCopied.text.length == 0) {
-          multiPaste = [];
-          for (var i = 0; i < lastCopied.text.length; i++)
-            multiPaste.push(doc.splitLines(lastCopied.text[i]));
-        }
-      } else if (textLines.length == sel.ranges.length) {
-        multiPaste = map(textLines, function(l) { return [l]; });
-      }
-    }
-
-    // Normal behavior is to insert the new text into every selection
-    for (var i = sel.ranges.length - 1; i >= 0; i--) {
-      var range = sel.ranges[i];
-      var from = range.from(), to = range.to();
-      if (range.empty()) {
-        if (deleted && deleted > 0) // Handle deletion
-          from = Pos(from.line, from.ch - deleted);
-        else if (cm.state.overwrite && !paste) // Handle overwrite
-          to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
-        else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted)
-          from = to = Pos(from.line, 0)
-      }
-      var updateInput = cm.curOp.updateInput;
-      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
-                         origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")};
-      makeChange(cm.doc, changeEvent);
-      signalLater(cm, "inputRead", cm, changeEvent);
-    }
-    if (inserted && !paste)
-      triggerElectric(cm, inserted);
-
-    ensureCursorVisible(cm);
-    cm.curOp.updateInput = updateInput;
-    cm.curOp.typing = true;
-    cm.state.pasteIncoming = cm.state.cutIncoming = false;
-  }
-
-  function handlePaste(e, cm) {
-    var pasted = e.clipboardData && e.clipboardData.getData("text/plain");
-    if (pasted) {
-      e.preventDefault();
-      if (!cm.isReadOnly() && !cm.options.disableInput)
-        runInOp(cm, function() { applyTextInput(cm, pasted, 0, null, "paste"); });
-      return true;
-    }
-  }
-
-  function triggerElectric(cm, inserted) {
-    // When an 'electric' character is inserted, immediately trigger a reindent
-    if (!cm.options.electricChars || !cm.options.smartIndent) return;
-    var sel = cm.doc.sel;
-
-    for (var i = sel.ranges.length - 1; i >= 0; i--) {
-      var range = sel.ranges[i];
-      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) continue;
-      var mode = cm.getModeAt(range.head);
-      var indented = false;
-      if (mode.electricChars) {
-        for (var j = 0; j < mode.electricChars.length; j++)
-          if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
-            indented = indentLine(cm, range.head.line, "smart");
-            break;
-          }
-      } else if (mode.electricInput) {
-        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
-          indented = indentLine(cm, range.head.line, "smart");
-      }
-      if (indented) signalLater(cm, "electricInput", cm, range.head.line);
-    }
-  }
-
-  function copyableRanges(cm) {
-    var text = [], ranges = [];
-    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
-      var line = cm.doc.sel.ranges[i].head.line;
-      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
-      ranges.push(lineRange);
-      text.push(cm.getRange(lineRange.anchor, lineRange.head));
-    }
-    return {text: text, ranges: ranges};
-  }
-
-  function disableBrowserMagic(field) {
-    field.setAttribute("autocorrect", "off");
-    field.setAttribute("autocapitalize", "off");
-    field.setAttribute("spellcheck", "false");
-  }
-
-  // TEXTAREA INPUT STYLE
-
-  function TextareaInput(cm) {
-    this.cm = cm;
-    // See input.poll and input.reset
-    this.prevInput = "";
-
-    // Flag that indicates whether we expect input to appear real soon
-    // now (after some event like 'keypress' or 'input') and are
-    // polling intensively.
-    this.pollingFast = false;
-    // Self-resetting timeout for the poller
-    this.polling = new Delayed();
-    // Tracks when input.reset has punted to just putting a short
-    // string into the textarea instead of the full selection.
-    this.inaccurateSelection = false;
-    // Used to work around IE issue with selection being forgotten when focus moves away from textarea
-    this.hasSelection = false;
-    this.composing = null;
-  };
-
-  function hiddenTextarea() {
-    var te = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
-    var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
-    // The textarea is kept positioned near the cursor to prevent the
-    // fact that it'll be scrolled into view on input from scrolling
-    // our fake cursor out of view. On webkit, when wrap=off, paste is
-    // very slow. So make the area wide instead.
-    if (webkit) te.style.width = "1000px";
-    else te.setAttribute("wrap", "off");
-    // If border: 0; -- iOS fails to open keyboard (issue #1287)
-    if (ios) te.style.border = "1px solid black";
-    disableBrowserMagic(te);
-    return div;
-  }
-
-  TextareaInput.prototype = copyObj({
-    init: function(display) {
-      var input = this, cm = this.cm;
-
-      // Wraps and hides input textarea
-      var div = this.wrapper = hiddenTextarea();
-      // The semihidden textarea that is focused when the editor is
-      // focused, and receives input.
-      var te = this.textarea = div.firstChild;
-      display.wrapper.insertBefore(div, display.wrapper.firstChild);
-
-      // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
-      if (ios) te.style.width = "0px";
-
-      on(te, "input", function() {
-        if (ie && ie_version >= 9 && input.hasSelection) input.hasSelection = null;
-        input.poll();
-      });
-
-      on(te, "paste", function(e) {
-        if (signalDOMEvent(cm, e) || handlePaste(e, cm)) return
-
-        cm.state.pasteIncoming = true;
-        input.fastPoll();
-      });
-
-      function prepareCopyCut(e) {
-        if (signalDOMEvent(cm, e)) return
-        if (cm.somethingSelected()) {
-          lastCopied = {lineWise: false, text: cm.getSelections()};
-          if (input.inaccurateSelection) {
-            input.prevInput = "";
-            input.inaccurateSelection = false;
-            te.value = lastCopied.text.join("\n");
-            selectInput(te);
-          }
-        } else if (!cm.options.lineWiseCopyCut) {
-          return;
-        } else {
-          var ranges = copyableRanges(cm);
-          lastCopied = {lineWise: true, text: ranges.text};
-          if (e.type == "cut") {
-            cm.setSelections(ranges.ranges, null, sel_dontScroll);
-          } else {
-            input.prevInput = "";
-            te.value = ranges.text.join("\n");
-            selectInput(te);
-          }
-        }
-        if (e.type == "cut") cm.state.cutIncoming = true;
-      }
-      on(te, "cut", prepareCopyCut);
-      on(te, "copy", prepareCopyCut);
-
-      on(display.scroller, "paste", function(e) {
-        if (eventInWidget(display, e) || signalDOMEvent(cm, e)) return;
-        cm.state.pasteIncoming = true;
-        input.focus();
-      });
-
-      // Prevent normal selection in the editor (we handle our own)
-      on(display.lineSpace, "selectstart", function(e) {
-        if (!eventInWidget(display, e)) e_preventDefault(e);
-      });
-
-      on(te, "compositionstart", function() {
-        var start = cm.getCursor("from");
-        if (input.composing) input.composing.range.clear()
-        input.composing = {
-          start: start,
-          range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
-        };
-      });
-      on(te, "compositionend", function() {
-        if (input.composing) {
-          input.poll();
-          input.composing.range.clear();
-          input.composing = null;
-        }
-      });
-    },
-
-    prepareSelection: function() {
-      // Redraw the selection and/or cursor
-      var cm = this.cm, display = cm.display, doc = cm.doc;
-      var result = prepareSelection(cm);
-
-      // Move the hidden textarea near the cursor to prevent scrolling artifacts
-      if (cm.options.moveInputWithCursor) {
-        var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
-        var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
-        result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
-                                            headPos.top + lineOff.top - wrapOff.top));
-        result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
-                                             headPos.left + lineOff.left - wrapOff.left));
-      }
-
-      return result;
-    },
-
-    showSelection: function(drawn) {
-      var cm = this.cm, display = cm.display;
-      removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
-      removeChildrenAndAdd(display.selectionDiv, drawn.selection);
-      if (drawn.teTop != null) {
-        this.wrapper.style.top = drawn.teTop + "px";
-        this.wrapper.style.left = drawn.teLeft + "px";
-      }
-    },
-
-    // Reset the input to correspond to the selection (or to be empty,
-    // when not typing and nothing is selected)
-    reset: function(typing) {
-      if (this.contextMenuPending) return;
-      var minimal, selected, cm = this.cm, doc = cm.doc;
-      if (cm.somethingSelected()) {
-        this.prevInput = "";
-        var range = doc.sel.primary();
-        minimal = hasCopyEvent &&
-          (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);
-        var content = minimal ? "-" : selected || cm.getSelection();
-        this.textarea.value = content;
-        if (cm.state.focused) selectInput(this.textarea);
-        if (ie && ie_version >= 9) this.hasSelection = content;
-      } else if (!typing) {
-        this.prevInput = this.textarea.value = "";
-        if (ie && ie_version >= 9) this.hasSelection = null;
-      }
-      this.inaccurateSelection = minimal;
-    },
-
-    getField: function() { return this.textarea; },
-
-    supportsTouch: function() { return false; },
-
-    focus: function() {
-      if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
-        try { this.textarea.focus(); }
-        catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
-      }
-    },
-
-    blur: function() { this.textarea.blur(); },
-
-    resetPosition: function() {
-      this.wrapper.style.top = this.wrapper.style.left = 0;
-    },
-
-    receivedFocus: function() { this.slowPoll(); },
-
-    // Poll for input changes, using the normal rate of polling. This
-    // runs as long as the editor is focused.
-    slowPoll: function() {
-      var input = this;
-      if (input.pollingFast) return;
-      input.polling.set(this.cm.options.pollInterval, function() {
-        input.poll();
-        if (input.cm.state.focused) input.slowPoll();
-      });
-    },
-
-    // When an event has just come in that is likely to add or change
-    // something in the input textarea, we poll faster, to ensure that
-    // the change appears on the screen quickly.
-    fastPoll: function() {
-      var missed = false, input = this;
-      input.pollingFast = true;
-      function p() {
-        var changed = input.poll();
-        if (!changed && !missed) {missed = true; input.polling.set(60, p);}
-        else {input.pollingFast = false; input.slowPoll();}
-      }
-      input.polling.set(20, p);
-    },
-
-    // Read input from the textarea, and update the document to match.
-    // When something is selected, it is present in the textarea, and
-    // selected (unless it is huge, in which case a placeholder is
-    // used). When nothing is selected, the cursor sits after previously
-    // seen text (can be empty), which is stored in prevInput (we must
-    // not reset the textarea when typing, because that breaks IME).
-    poll: function() {
-      var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
-      // Since this is called a *lot*, try to bail out as cheaply as
-      // possible when it is clear that nothing happened. hasSelection
-      // will be the case when there is a lot of text in the textarea,
-      // in which case reading its value would be expensive.
-      if (this.contextMenuPending || !cm.state.focused ||
-          (hasSelection(input) && !prevInput && !this.composing) ||
-          cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
-        return false;
-
-      var text = input.value;
-      // If nothing changed, bail.
-      if (text == prevInput && !cm.somethingSelected()) return false;
-      // Work around nonsensical selection resetting in IE9/10, and
-      // inexplicable appearance of private area unicode characters on
-      // some key combos in Mac (#2689).
-      if (ie && ie_version >= 9 && this.hasSelection === text ||
-          mac && /[\uf700-\uf7ff]/.test(text)) {
-        cm.display.input.reset();
-        return false;
-      }
-
-      if (cm.doc.sel == cm.display.selForContextMenu) {
-        var first = text.charCodeAt(0);
-        if (first == 0x200b && !prevInput) prevInput = "\u200b";
-        if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo"); }
-      }
-      // Find the part of the input that is actually new
-      var same = 0, l = Math.min(prevInput.length, text.length);
-      while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
-
-      var self = this;
-      runInOp(cm, function() {
-        applyTextInput(cm, text.slice(same), prevInput.length - same,
-                       null, self.composing ? "*compose" : null);
-
-        // Don't leave long text in the textarea, since it makes further polling slow
-        if (text.length > 1000 || text.indexOf("\n") > -1) input.value = self.prevInput = "";
-        else self.prevInput = text;
-
-        if (self.composing) {
-          self.composing.range.clear();
-          self.composing.range = cm.markText(self.composing.start, cm.getCursor("to"),
-                                             {className: "CodeMirror-composing"});
-        }
-      });
-      return true;
-    },
-
-    ensurePolled: function() {
-      if (this.pollingFast && this.poll()) this.pollingFast = false;
-    },
-
-    onKeyPress: function() {
-      if (ie && ie_version >= 9) this.hasSelection = null;
-      this.fastPoll();
-    },
-
-    onContextMenu: function(e) {
-      var input = this, cm = input.cm, display = cm.display, te = input.textarea;
-      var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
-      if (!pos || presto) return; // Opera is difficult.
-
-      // Reset the current text selection only if the click is done outside of the selection
-      // and 'resetSelectionOnContextMenu' option is true.
-      var reset = cm.options.resetSelectionOnContextMenu;
-      if (reset && cm.doc.sel.contains(pos) == -1)
-        operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);
-
-      var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
-      input.wrapper.style.cssText = "position: absolute"
-      var wrapperBox = input.wrapper.getBoundingClientRect()
-      te.style.cssText = "position: absolute; width: 30px; height: 30px; top: " + (e.clientY - wrapperBox.top - 5) +
-        "px; left: " + (e.clientX - wrapperBox.left - 5) + "px; z-index: 1000; background: " +
-        (ie ? "rgba(255, 255, 255, .05)" : "transparent") +
-        "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
-      if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)
-      display.input.focus();
-      if (webkit) window.scrollTo(null, oldScrollY);
-      display.input.reset();
-      // Adds "Select all" to context menu in FF
-      if (!cm.somethingSelected()) te.value = input.prevInput = " ";
-      input.contextMenuPending = true;
-      display.selForContextMenu = cm.doc.sel;
-      clearTimeout(display.detectingSelectAll);
-
-      // Select-all will be greyed out if there's nothing to select, so
-      // this adds a zero-width space so that we can later check whether
-      // it got selected.
-      function prepareSelectAllHack() {
-        if (te.selectionStart != null) {
-          var selected = cm.somethingSelected();
-          var extval = "\u200b" + (selected ? te.value : "");
-          te.value = "\u21da"; // Used to catch context-menu undo
-          te.value = extval;
-          input.prevInput = selected ? "" : "\u200b";
-          te.selectionStart = 1; te.selectionEnd = extval.length;
-          // Re-set this, in case some other handler touched the
-          // selection in the meantime.
-          display.selForContextMenu = cm.doc.sel;
-        }
-      }
-      function rehide() {
-        input.contextMenuPending = false;
-        input.wrapper.style.cssText = oldWrapperCSS
-        te.style.cssText = oldCSS;
-        if (ie && ie_version < 9) display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos);
-
-        // Try to detect the user choosing select-all
-        if (te.selectionStart != null) {
-          if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
-          var i = 0, poll = function() {
-            if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
-                te.selectionEnd > 0 && input.prevInput == "\u200b")
-              operation(cm, commands.selectAll)(cm);
-            else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
-            else display.input.reset();
-          };
-          display.detectingSelectAll = setTimeout(poll, 200);
-        }
-      }
-
-      if (ie && ie_version >= 9) prepareSelectAllHack();
-      if (captureRightClick) {
-        e_stop(e);
-        var mouseup = function() {
-          off(window, "mouseup", mouseup);
-          setTimeout(rehide, 20);
-        };
-        on(window, "mouseup", mouseup);
-      } else {
-        setTimeout(rehide, 50);
-      }
-    },
-
-    readOnlyChanged: function(val) {
-      if (!val) this.reset();
-    },
-
-    setUneditable: nothing,
-
-    needsContentAttribute: false
-  }, TextareaInput.prototype);
-
-  // CONTENTEDITABLE INPUT STYLE
-
-  function ContentEditableInput(cm) {
-    this.cm = cm;
-    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
-    this.polling = new Delayed();
-    this.gracePeriod = false;
-  }
-
-  ContentEditableInput.prototype = copyObj({
-    init: function(display) {
-      var input = this, cm = input.cm;
-      var div = input.div = display.lineDiv;
-      disableBrowserMagic(div);
-
-      on(div, "paste", function(e) {
-        if (!signalDOMEvent(cm, e)) handlePaste(e, cm);
-      })
-
-      on(div, "compositionstart", function(e) {
-        var data = e.data;
-        input.composing = {sel: cm.doc.sel, data: data, startData: data};
-        if (!data) return;
-        var prim = cm.doc.sel.primary();
-        var line = cm.getLine(prim.head.line);
-        var found = line.indexOf(data, Math.max(0, prim.head.ch - data.length));
-        if (found > -1 && found <= prim.head.ch)
-          input.composing.sel = simpleSelection(Pos(prim.head.line, found),
-                                                Pos(prim.head.line, found + data.length));
-      });
-      on(div, "compositionupdate", function(e) {
-        input.composing.data = e.data;
-      });
-      on(div, "compositionend", function(e) {
-        var ours = input.composing;
-        if (!ours) return;
-        if (e.data != ours.startData && !/\u200b/.test(e.data))
-          ours.data = e.data;
-        // Need a small delay to prevent other code (input event,
-        // selection polling) from doing damage when fired right after
-        // compositionend.
-        setTimeout(function() {
-          if (!ours.handled)
-            input.applyComposition(ours);
-          if (input.composing == ours)
-            input.composing = null;
-        }, 50);
-      });
-
-      on(div, "touchstart", function() {
-        input.forceCompositionEnd();
-      });
-
-      on(div, "input", function() {
-        if (input.composing) return;
-        if (cm.isReadOnly() || !input.pollContent())
-          runInOp(input.cm, function() {regChange(cm);});
-      });
-
-      function onCopyCut(e) {
-        if (signalDOMEvent(cm, e)) return
-        if (cm.somethingSelected()) {
-          lastCopied = {lineWise: false, text: cm.getSelections()};
-          if (e.type == "cut") cm.replaceSelection("", null, "cut");
-        } else if (!cm.options.lineWiseCopyCut) {
-          return;
-        } else {
-          var ranges = copyableRanges(cm);
-          lastCopied = {lineWise: true, text: ranges.text};
-          if (e.type == "cut") {
-            cm.operation(function() {
-              cm.setSelections(ranges.ranges, 0, sel_dontScroll);
-              cm.replaceSelection("", null, "cut");
-            });
-          }
-        }
-        // iOS exposes the clipboard API, but seems to discard content inserted into it
-        if (e.clipboardData && !ios) {
-          e.preventDefault();
-          e.clipboardData.clearData();
-          e.clipboardData.setData("text/plain", lastCopied.text.join("\n"));
-        } else {
-          // Old-fashioned briefly-focus-a-textarea hack
-          var kludge = hiddenTextarea(), te = kludge.firstChild;
-          cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
-          te.value = lastCopied.text.join("\n");
-          var hadFocus = document.activeElement;
-          selectInput(te);
-          setTimeout(function() {
-            cm.display.lineSpace.removeChild(kludge);
-            hadFocus.focus();
-          }, 50);
-        }
-      }
-      on(div, "copy", onCopyCut);
-      on(div, "cut", onCopyCut);
-    },
-
-    prepareSelection: function() {
-      var result = prepareSelection(this.cm, false);
-      result.focus = this.cm.state.focused;
-      return result;
-    },
-
-    showSelection: function(info, takeFocus) {
-      if (!info || !this.cm.display.view.length) return;
-      if (info.focus || takeFocus) this.showPrimarySelection();
-      this.showMultipleSelections(info);
-    },
-
-    showPrimarySelection: function() {
-      var sel = window.getSelection(), prim = this.cm.doc.sel.primary();
-      var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset);
-      var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset);
-      if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
-          cmp(minPos(curAnchor, curFocus), prim.from()) == 0 &&
-          cmp(maxPos(curAnchor, curFocus), prim.to()) == 0)
-        return;
-
-      var start = posToDOM(this.cm, prim.from());
-      var end = posToDOM(this.cm, prim.to());
-      if (!start && !end) return;
-
-      var view = this.cm.display.view;
-      var old = sel.rangeCount && sel.getRangeAt(0);
-      if (!start) {
-        start = {node: view[0].measure.map[2], offset: 0};
-      } else if (!end) { // FIXME dangerously hacky
-        var measure = view[view.length - 1].measure;
-        var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
-        end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
-      }
-
-      try { var rng = range(start.node, start.offset, end.offset, end.node); }
-      catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
-      if (rng) {
-        if (!gecko && this.cm.state.focused) {
-          sel.collapse(start.node, start.offset);
-          if (!rng.collapsed) sel.addRange(rng);
-        } else {
-          sel.removeAllRanges();
-          sel.addRange(rng);
-        }
-        if (old && sel.anchorNode == null) sel.addRange(old);
-        else if (gecko) this.startGracePeriod();
-      }
-      this.rememberSelection();
-    },
-
-    startGracePeriod: function() {
-      var input = this;
-      clearTimeout(this.gracePeriod);
-      this.gracePeriod = setTimeout(function() {
-        input.gracePeriod = false;
-        if (input.selectionChanged())
-          input.cm.operation(function() { input.cm.curOp.selectionChanged = true; });
-      }, 20);
-    },
-
-    showMultipleSelections: function(info) {
-      removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
-      removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
-    },
-
-    rememberSelection: function() {
-      var sel = window.getSelection();
-      this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
-      this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
-    },
-
-    selectionInEditor: function() {
-      var sel = window.getSelection();
-      if (!sel.rangeCount) return false;
-      var node = sel.getRangeAt(0).commonAncestorContainer;
-      return contains(this.div, node);
-    },
-
-    focus: function() {
-      if (this.cm.options.readOnly != "nocursor") this.div.focus();
-    },
-    blur: function() { this.div.blur(); },
-    getField: function() { return this.div; },
-
-    supportsTouch: function() { return true; },
-
-    receivedFocus: function() {
-      var input = this;
-      if (this.selectionInEditor())
-        this.pollSelection();
-      else
-        runInOp(this.cm, function() { input.cm.curOp.selectionChanged = true; });
-
-      function poll() {
-        if (input.cm.state.focused) {
-          input.pollSelection();
-          input.polling.set(input.cm.options.pollInterval, poll);
-        }
-      }
-      this.polling.set(this.cm.options.pollInterval, poll);
-    },
-
-    selectionChanged: function() {
-      var sel = window.getSelection();
-      return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
-        sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset;
-    },
-
-    pollSelection: function() {
-      if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
-        var sel = window.getSelection(), cm = this.cm;
-        this.rememberSelection();
-        var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
-        var head = domToPos(cm, sel.focusNode, sel.focusOffset);
-        if (anchor && head) runInOp(cm, function() {
-          setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
-          if (anchor.bad || head.bad) cm.curOp.selectionChanged = true;
-        });
-      }
-    },
-
-    pollContent: function() {
-      var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
-      var from = sel.from(), to = sel.to();
-      if (from.line < display.viewFrom || to.line > display.viewTo - 1) return false;
-
-      var fromIndex;
-      if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
-        var fromLine = lineNo(display.view[0].line);
-        var fromNode = display.view[0].node;
-      } else {
-        var fromLine = lineNo(display.view[fromIndex].line);
-        var fromNode = display.view[fromIndex - 1].node.nextSibling;
-      }
-      var toIndex = findViewIndex(cm, to.line);
-      if (toIndex == display.view.length - 1) {
-        var toLine = display.viewTo - 1;
-        var toNode = display.lineDiv.lastChild;
-      } else {
-        var toLine = lineNo(display.view[toIndex + 1].line) - 1;
-        var toNode = display.view[toIndex + 1].node.previousSibling;
-      }
-
-      var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
-      var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
-      while (newText.length > 1 && oldText.length > 1) {
-        if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
-        else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
-        else break;
-      }
-
-      var cutFront = 0, cutEnd = 0;
-      var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
-      while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
-        ++cutFront;
-      var newBot = lst(newText), oldBot = lst(oldText);
-      var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
-                               oldBot.length - (oldText.length == 1 ? cutFront : 0));
-      while (cutEnd < maxCutEnd &&
-             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
-        ++cutEnd;
-
-      newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd);
-      newText[0] = newText[0].slice(cutFront);
-
-      var chFrom = Pos(fromLine, cutFront);
-      var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
-      if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
-        replaceRange(cm.doc, newText, chFrom, chTo, "+input");
-        return true;
-      }
-    },
-
-    ensurePolled: function() {
-      this.forceCompositionEnd();
-    },
-    reset: function() {
-      this.forceCompositionEnd();
-    },
-    forceCompositionEnd: function() {
-      if (!this.composing || this.composing.handled) return;
-      this.applyComposition(this.composing);
-      this.composing.handled = true;
-      this.div.blur();
-      this.div.focus();
-    },
-    applyComposition: function(composing) {
-      if (this.cm.isReadOnly())
-        operation(this.cm, regChange)(this.cm)
-      else if (composing.data && composing.data != composing.startData)
-        operation(this.cm, applyTextInput)(this.cm, composing.data, 0, composing.sel);
-    },
-
-    setUneditable: function(node) {
-      node.contentEditable = "false"
-    },
-
-    onKeyPress: function(e) {
-      e.preventDefault();
-      if (!this.cm.isReadOnly())
-        operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0);
-    },
-
-    readOnlyChanged: function(val) {
-      this.div.contentEditable = String(val != "nocursor")
-    },
-
-    onContextMenu: nothing,
-    resetPosition: nothing,
-
-    needsContentAttribute: true
-  }, ContentEditableInput.prototype);
-
-  function posToDOM(cm, pos) {
-    var view = findViewForLine(cm, pos.line);
-    if (!view || view.hidden) return null;
-    var line = getLine(cm.doc, pos.line);
-    var info = mapFromLineView(view, line, pos.line);
-
-    var order = getOrder(line), side = "left";
-    if (order) {
-      var partPos = getBidiPartAt(order, pos.ch);
-      side = partPos % 2 ? "right" : "left";
-    }
-    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
-    result.offset = result.collapse == "right" ? result.end : result.start;
-    return result;
-  }
-
-  function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }
-
-  function domToPos(cm, node, offset) {
-    var lineNode;
-    if (node == cm.display.lineDiv) {
-      lineNode = cm.display.lineDiv.childNodes[offset];
-      if (!lineNode) return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true);
-      node = null; offset = 0;
-    } else {
-      for (lineNode = node;; lineNode = lineNode.parentNode) {
-        if (!lineNode || lineNode == cm.display.lineDiv) return null;
-        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) break;
-      }
-    }
-    for (var i = 0; i < cm.display.view.length; i++) {
-      var lineView = cm.display.view[i];
-      if (lineView.node == lineNode)
-        return locateNodeInLineView(lineView, node, offset);
-    }
-  }
-
-  function locateNodeInLineView(lineView, node, offset) {
-    var wrapper = lineView.text.firstChild, bad = false;
-    if (!node || !contains(wrapper, node)) return badPos(Pos(lineNo(lineView.line), 0), true);
-    if (node == wrapper) {
-      bad = true;
-      node = wrapper.childNodes[offset];
-      offset = 0;
-      if (!node) {
-        var line = lineView.rest ? lst(lineView.rest) : lineView.line;
-        return badPos(Pos(lineNo(line), line.text.length), bad);
-      }
-    }
-
-    var textNode = node.nodeType == 3 ? node : null, topNode = node;
-    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
-      textNode = node.firstChild;
-      if (offset) offset = textNode.nodeValue.length;
-    }
-    while (topNode.parentNode != wrapper) topNode = topNode.parentNode;
-    var measure = lineView.measure, maps = measure.maps;
-
-    function find(textNode, topNode, offset) {
-      for (var i = -1; i < (maps ? maps.length : 0); i++) {
-        var map = i < 0 ? measure.map : maps[i];
-        for (var j = 0; j < map.length; j += 3) {
-          var curNode = map[j + 2];
-          if (curNode == textNode || curNode == topNode) {
-            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
-            var ch = map[j] + offset;
-            if (offset < 0 || curNode != textNode) ch = map[j + (offset ? 1 : 0)];
-            return Pos(line, ch);
-          }
-        }
-      }
-    }
-    var found = find(textNode, topNode, offset);
-    if (found) return badPos(found, bad);
-
-    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
-    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
-      found = find(after, after.firstChild, 0);
-      if (found)
-        return badPos(Pos(found.line, found.ch - dist), bad);
-      else
-        dist += after.textContent.length;
-    }
-    for (var before = topNode.previousSibling, dist = offset; before; before = before.previousSibling) {
-      found = find(before, before.firstChild, -1);
-      if (found)
-        return badPos(Pos(found.line, found.ch + dist), bad);
-      else
-        dist += after.textContent.length;
-    }
-  }
-
-  function domTextBetween(cm, from, to, fromLine, toLine) {
-    var text = "", closing = false, lineSep = cm.doc.lineSeparator();
-    function recognizeMarker(id) { return function(marker) { return marker.id == id; }; }
-    function walk(node) {
-      if (node.nodeType == 1) {
-        var cmText = node.getAttribute("cm-text");
-        if (cmText != null) {
-          if (cmText == "") cmText = node.textContent.replace(/\u200b/g, "");
-          text += cmText;
-          return;
-        }
-        var markerID = node.getAttribute("cm-marker"), range;
-        if (markerID) {
-          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
-          if (found.length && (range = found[0].find()))
-            text += getBetween(cm.doc, range.from, range.to).join(lineSep);
-          return;
-        }
-        if (node.getAttribute("contenteditable") == "false") return;
-        for (var i = 0; i < node.childNodes.length; i++)
-          walk(node.childNodes[i]);
-        if (/^(pre|div|p)$/i.test(node.nodeName))
-          closing = true;
-      } else if (node.nodeType == 3) {
-        var val = node.nodeValue;
-        if (!val) return;
-        if (closing) {
-          text += lineSep;
-          closing = false;
-        }
-        text += val;
-      }
-    }
-    for (;;) {
-      walk(from);
-      if (from == to) break;
-      from = from.nextSibling;
-    }
-    return text;
-  }
-
-  CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
-
-  // SELECTION / CURSOR
-
-  // Selection objects are immutable. A new one is created every time
-  // the selection changes. A selection is one or more non-overlapping
-  // (and non-touching) ranges, sorted, and an integer that indicates
-  // which one is the primary selection (the one that's scrolled into
-  // view, that getCursor returns, etc).
-  function Selection(ranges, primIndex) {
-    this.ranges = ranges;
-    this.primIndex = primIndex;
-  }
-
-  Selection.prototype = {
-    primary: function() { return this.ranges[this.primIndex]; },
-    equals: function(other) {
-      if (other == this) return true;
-      if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;
-      for (var i = 0; i < this.ranges.length; i++) {
-        var here = this.ranges[i], there = other.ranges[i];
-        if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;
-      }
-      return true;
-    },
-    deepCopy: function() {
-      for (var out = [], i = 0; i < this.ranges.length; i++)
-        out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));
-      return new Selection(out, this.primIndex);
-    },
-    somethingSelected: function() {
-      for (var i = 0; i < this.ranges.length; i++)
-        if (!this.ranges[i].empty()) return true;
-      return false;
-    },
-    contains: function(pos, end) {
-      if (!end) end = pos;
-      for (var i = 0; i < this.ranges.length; i++) {
-        var range = this.ranges[i];
-        if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
-          return i;
-      }
-      return -1;
-    }
-  };
-
-  function Range(anchor, head) {
-    this.anchor = anchor; this.head = head;
-  }
-
-  Range.prototype = {
-    from: function() { return minPos(this.anchor, this.head); },
-    to: function() { return maxPos(this.anchor, this.head); },
-    empty: function() {
-      return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;
-    }
-  };
-
-  // Take an unsorted, potentially overlapping set of ranges, and
-  // build a selection out of it. 'Consumes' ranges array (modifying
-  // it).
-  function normalizeSelection(ranges, primIndex) {
-    var prim = ranges[primIndex];
-    ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });
-    primIndex = indexOf(ranges, prim);
-    for (var i = 1; i < ranges.length; i++) {
-      var cur = ranges[i], prev = ranges[i - 1];
-      if (cmp(prev.to(), cur.from()) >= 0) {
-        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
-        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
-        if (i <= primIndex) --primIndex;
-        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
-      }
-    }
-    return new Selection(ranges, primIndex);
-  }
-
-  function simpleSelection(anchor, head) {
-    return new Selection([new Range(anchor, head || anchor)], 0);
-  }
-
-  // Most of the external API clips given positions to make sure they
-  // actually exist within the document.
-  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
-  function clipPos(doc, pos) {
-    if (pos.line < doc.first) return Pos(doc.first, 0);
-    var last = doc.first + doc.size - 1;
-    if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
-    return clipToLen(pos, getLine(doc, pos.line).text.length);
-  }
-  function clipToLen(pos, linelen) {
-    var ch = pos.ch;
-    if (ch == null || ch > linelen) return Pos(pos.line, linelen);
-    else if (ch < 0) return Pos(pos.line, 0);
-    else return pos;
-  }
-  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
-  function clipPosArray(doc, array) {
-    for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);
-    return out;
-  }
-
-  // SELECTION UPDATES
-
-  // The 'scroll' parameter given to many of these indicated whether
-  // the new cursor position should be scrolled into view after
-  // modifying the selection.
-
-  // If shift is held or the extend flag is set, extends a range to
-  // include a given position (and optionally a second position).
-  // Otherwise, simply returns the range between the given positions.
-  // Used for cursor motion and such.
-  function extendRange(doc, range, head, other) {
-    if (doc.cm && doc.cm.display.shift || doc.extend) {
-      var anchor = range.anchor;
-      if (other) {
-        var posBefore = cmp(head, anchor) < 0;
-        if (posBefore != (cmp(other, anchor) < 0)) {
-          anchor = head;
-          head = other;
-        } else if (posBefore != (cmp(head, other) < 0)) {
-          head = other;
-        }
-      }
-      return new Range(anchor, head);
-    } else {
-      return new Range(other || head, head);
-    }
-  }
-
-  // Extend the primary selection range, discard the rest.
-  function extendSelection(doc, head, other, options) {
-    setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);
-  }
-
-  // Extend all selections (pos is an array of selections with length
-  // equal the number of selections)
-  function extendSelections(doc, heads, options) {
-    for (var out = [], i = 0; i < doc.sel.ranges.length; i++)
-      out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);
-    var newSel = normalizeSelection(out, doc.sel.primIndex);
-    setSelection(doc, newSel, options);
-  }
-
-  // Updates a single range in the selection.
-  function replaceOneSelection(doc, i, range, options) {
-    var ranges = doc.sel.ranges.slice(0);
-    ranges[i] = range;
-    setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
-  }
-
-  // Reset the selection to a single range.
-  function setSimpleSelection(doc, anchor, head, options) {
-    setSelection(doc, simpleSelection(anchor, head), options);
-  }
-
-  // Give beforeSelectionChange handlers a change to influence a
-  // selection update.
-  function filterSelectionChange(doc, sel, options) {
-    var obj = {
-      ranges: sel.ranges,
-      update: function(ranges) {
-        this.ranges = [];
-        for (var i = 0; i < ranges.length; i++)
-          this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
-                                     clipPos(doc, ranges[i].head));
-      },
-      origin: options && options.origin
-    };
-    signal(doc, "beforeSelectionChange", doc, obj);
-    if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
-    if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);
-    else return sel;
-  }
-
-  function setSelectionReplaceHistory(doc, sel, options) {
-    var done = doc.history.done, last = lst(done);
-    if (last && last.ranges) {
-      done[done.length - 1] = sel;
-      setSelectionNoUndo(doc, sel, options);
-    } else {
-      setSelection(doc, sel, options);
-    }
-  }
-
-  // Set a new selection.
-  function setSelection(doc, sel, options) {
-    setSelectionNoUndo(doc, sel, options);
-    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
-  }
-
-  function setSelectionNoUndo(doc, sel, options) {
-    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
-      sel = filterSelectionChange(doc, sel, options);
-
-    var bias = options && options.bias ||
-      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
-    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
-
-    if (!(options && options.scroll === false) && doc.cm)
-      ensureCursorVisible(doc.cm);
-  }
-
-  function setSelectionInner(doc, sel) {
-    if (sel.equals(doc.sel)) return;
-
-    doc.sel = sel;
-
-    if (doc.cm) {
-      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
-      signalCursorActivity(doc.cm);
-    }
-    signalLater(doc, "cursorActivity", doc);
-  }
-
-  // Verify that the selection does not partially select any atomic
-  // marked ranges.
-  function reCheckSelection(doc) {
-    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);
-  }
-
-  // Return a selection that does not partially select any atomic
-  // ranges.
-  function skipAtomicInSelection(doc, sel, bias, mayClear) {
-    var out;
-    for (var i = 0; i < sel.ranges.length; i++) {
-      var range = sel.ranges[i];
-      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
-      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
-      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
-      if (out || newAnchor != range.anchor || newHead != range.head) {
-        if (!out) out = sel.ranges.slice(0, i);
-        out[i] = new Range(newAnchor, newHead);
-      }
-    }
-    return out ? normalizeSelection(out, sel.primIndex) : sel;
-  }
-
-  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
-    var line = getLine(doc, pos.line);
-    if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
-      var sp = line.markedSpans[i], m = sp.marker;
-      if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
-          (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
-        if (mayClear) {
-          signal(m, "beforeCursorEnter");
-          if (m.explicitlyCleared) {
-            if (!line.markedSpans) break;
-            else {--i; continue;}
-          }
-        }
-        if (!m.atomic) continue;
-
-        if (oldPos) {
-          var near = m.find(dir < 0 ? 1 : -1), diff;
-          if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft)
-            near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null);
-          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
-            return skipAtomicInner(doc, near, pos, dir, mayClear);
-        }
-
-        var far = m.find(dir < 0 ? -1 : 1);
-        if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight)
-          far = movePos(doc, far, dir, far.line == pos.line ? line : null);
-        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null;
-      }
-    }
-    return pos;
-  }
-
-  // Ensure a given position is not inside an atomic range.
-  function skipAtomic(doc, pos, oldPos, bias, mayClear) {
-    var dir = bias || 1;
-    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
-        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
-        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
-        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
-    if (!found) {
-      doc.cantEdit = true;
-      return Pos(doc.first, 0);
-    }
-    return found;
-  }
-
-  function movePos(doc, pos, dir, line) {
-    if (dir < 0 && pos.ch == 0) {
-      if (pos.line > doc.first) return clipPos(doc, Pos(pos.line - 1));
-      else return null;
-    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
-      if (pos.line < doc.first + doc.size - 1) return Pos(pos.line + 1, 0);
-      else return null;
-    } else {
-      return new Pos(pos.line, pos.ch + dir);
-    }
-  }
-
-  // SELECTION DRAWING
-
-  function updateSelection(cm) {
-    cm.display.input.showSelection(cm.display.input.prepareSelection());
-  }
-
-  function prepareSelection(cm, primary) {
-    var doc = cm.doc, result = {};
-    var curFragment = result.cursors = document.createDocumentFragment();
-    var selFragment = result.selection = document.createDocumentFragment();
-
-    for (var i = 0; i < doc.sel.ranges.length; i++) {
-      if (primary === false && i == doc.sel.primIndex) continue;
-      var range = doc.sel.ranges[i];
-      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) continue;
-      var collapsed = range.empty();
-      if (collapsed || cm.options.showCursorWhenSelecting)
-        drawSelectionCursor(cm, range.head, curFragment);
-      if (!collapsed)
-        drawSelectionRange(cm, range, selFragment);
-    }
-    return result;
-  }
-
-  // Draws a cursor for the given range
-  function drawSelectionCursor(cm, head, output) {
-    var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
-
-    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
-    cursor.style.left = pos.left + "px";
-    cursor.style.top = pos.top + "px";
-    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
-
-    if (pos.other) {
-      // Secondary cursor, shown when on a 'jump' in bi-directional text
-      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
-      otherCursor.style.display = "";
-      otherCursor.style.left = pos.other.left + "px";
-      otherCursor.style.top = pos.other.top + "px";
-      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
-    }
-  }
-
-  // Draws the given range as a highlighted selection
-  function drawSelectionRange(cm, range, output) {
-    var display = cm.display, doc = cm.doc;
-    var fragment = document.createDocumentFragment();
-    var padding = paddingH(cm.display), leftSide = padding.left;
-    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
-
-    function add(left, top, width, bottom) {
-      if (top < 0) top = 0;
-      top = Math.round(top);
-      bottom = Math.round(bottom);
-      fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
-                               "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
-                               "px; height: " + (bottom - top) + "px"));
-    }
-
-    function drawForLine(line, fromArg, toArg) {
-      var lineObj = getLine(doc, line);
-      var lineLen = lineObj.text.length;
-      var start, end;
-      function coords(ch, bias) {
-        return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
-      }
-
-      iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
-        var leftPos = coords(from, "left"), rightPos, left, right;
-        if (from == to) {
-          rightPos = leftPos;
-          left = right = leftPos.left;
-        } else {
-          rightPos = coords(to - 1, "right");
-          if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
-          left = leftPos.left;
-          right = rightPos.right;
-        }
-        if (fromArg == null && from == 0) left = leftSide;
-        if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
-          add(left, leftPos.top, null, leftPos.bottom);
-          left = leftSide;
-          if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
-        }
-        if (toArg == null && to == lineLen) right = rightSide;
-        if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
-          start = leftPos;
-        if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
-          end = rightPos;
-        if (left < leftSide + 1) left = leftSide;
-        add(left, rightPos.top, right - left, rightPos.bottom);
-      });
-      return {start: start, end: end};
-    }
-
-    var sFrom = range.from(), sTo = range.to();
-    if (sFrom.line == sTo.line) {
-      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
-    } else {
-      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
-      var singleVLine = visualLine(fromLine) == visualLine(toLine);
-      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
-      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
-      if (singleVLine) {
-        if (leftEnd.top < rightStart.top - 2) {
-          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
-          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
-        } else {
-          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
-        }
-      }
-      if (leftEnd.bottom < rightStart.top)
-        add(leftSide, leftEnd.bottom, null, rightStart.top);
-    }
-
-    output.appendChild(fragment);
-  }
-
-  // Cursor-blinking
-  function restartBlink(cm) {
-    if (!cm.state.focused) return;
-    var display = cm.display;
-    clearInterval(display.blinker);
-    var on = true;
-    display.cursorDiv.style.visibility = "";
-    if (cm.options.cursorBlinkRate > 0)
-      display.blinker = setInterval(function() {
-        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
-      }, cm.options.cursorBlinkRate);
-    else if (cm.options.cursorBlinkRate < 0)
-      display.cursorDiv.style.visibility = "hidden";
-  }
-
-  // HIGHLIGHT WORKER
-
-  function startWorker(cm, time) {
-    if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)
-      cm.state.highlight.set(time, bind(highlightWorker, cm));
-  }
-
-  function highlightWorker(cm) {
-    var doc = cm.doc;
-    if (doc.frontier < doc.first) doc.frontier = doc.first;
-    if (doc.frontier >= cm.display.viewTo) return;
-    var end = +new Date + cm.options.workTime;
-    var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
-    var changedLines = [];
-
-    doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
-      if (doc.frontier >= cm.display.viewFrom) { // Visible
-        var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength;
-        var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true);
-        line.styles = highlighted.styles;
-        var oldCls = line.styleClasses, newCls = highlighted.classes;
-        if (newCls) line.styleClasses = newCls;
-        else if (oldCls) line.styleClasses = null;
-        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
-          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
-        for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
-        if (ischange) changedLines.push(doc.frontier);
-        line.stateAfter = tooLong ? state : copyState(doc.mode, state);
-      } else {
-        if (line.text.length <= cm.options.maxHighlightLength)
-          processLine(cm, line.text, state);
-        line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
-      }
-      ++doc.frontier;
-      if (+new Date > end) {
-        startWorker(cm, cm.options.workDelay);
-        return true;
-      }
-    });
-    if (changedLines.length) runInOp(cm, function() {
-      for (var i = 0; i < changedLines.length; i++)
-        regLineChange(cm, changedLines[i], "text");
-    });
-  }
-
-  // Finds the line to start with when starting a parse. Tries to
-  // find a line with a stateAfter, so that it can start with a
-  // valid state. If that fails, it returns the line with the
-  // smallest indentation, which tends to need the least context to
-  // parse correctly.
-  function findStartLine(cm, n, precise) {
-    var minindent, minline, doc = cm.doc;
-    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
-    for (var search = n; search > lim; --search) {
-      if (search <= doc.first) return doc.first;
-      var line = getLine(doc, search - 1);
-      if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
-      var indented = countColumn(line.text, null, cm.options.tabSize);
-      if (minline == null || minindent > indented) {
-        minline = search - 1;
-        minindent = indented;
-      }
-    }
-    return minline;
-  }
-
-  function getStateBefore(cm, n, precise) {
-    var doc = cm.doc, display = cm.display;
-    if (!doc.mode.startState) return true;
-    var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
-    if (!state) state = startState(doc.mode);
-    else state = copyState(doc.mode, state);
-    doc.iter(pos, n, function(line) {
-      processLine(cm, line.text, state);
-      var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;
-      line.stateAfter = save ? copyState(doc.mode, state) : null;
-      ++pos;
-    });
-    if (precise) doc.frontier = pos;
-    return state;
-  }
-
-  // POSITION MEASUREMENT
-
-  function paddingTop(display) {return display.lineSpace.offsetTop;}
-  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
-  function paddingH(display) {
-    if (display.cachedPaddingH) return display.cachedPaddingH;
-    var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
-    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
-    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
-    if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
-    return data;
-  }
-
-  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }
-  function displayWidth(cm) {
-    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth;
-  }
-  function displayHeight(cm) {
-    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight;
-  }
-
-  // Ensure the lineView.wrapping.heights array is populated. This is
-  // an array of bottom offsets for the lines that make up a drawn
-  // line. When lineWrapping is on, there might be more than one
-  // height.
-  function ensureLineHeights(cm, lineView, rect) {
-    var wrapping = cm.options.lineWrapping;
-    var curWidth = wrapping && displayWidth(cm);
-    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
-      var heights = lineView.measure.heights = [];
-      if (wrapping) {
-        lineView.measure.width = curWidth;
-        var rects = lineView.text.firstChild.getClientRects();
-        for (var i = 0; i < rects.length - 1; i++) {
-          var cur = rects[i], next = rects[i + 1];
-          if (Math.abs(cur.bottom - next.bottom) > 2)
-            heights.push((cur.bottom + next.top) / 2 - rect.top);
-        }
-      }
-      heights.push(rect.bottom - rect.top);
-    }
-  }
-
-  // Find a line map (mapping character offsets to text nodes) and a
-  // measurement cache for the given line number. (A line view might
-  // contain multiple lines when collapsed ranges are present.)
-  function mapFromLineView(lineView, line, lineN) {
-    if (lineView.line == line)
-      return {map: lineView.measure.map, cache: lineView.measure.cache};
-    for (var i = 0; i < lineView.rest.length; i++)
-      if (lineView.rest[i] == line)
-        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};
-    for (var i = 0; i < lineView.rest.length; i++)
-      if (lineNo(lineView.rest[i]) > lineN)
-        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};
-  }
-
-  // Render a line into the hidden node display.externalMeasured. Used
-  // when measurement is needed for a line that's not in the viewport.
-  function updateExternalMeasurement(cm, line) {
-    line = visualLine(line);
-    var lineN = lineNo(line);
-    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
-    view.lineN = lineN;
-    var built = view.built = buildLineContent(cm, view);
-    view.text = built.pre;
-    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
-    return view;
-  }
-
-  // Get a {top, bottom, left, right} box (in line-local coordinates)
-  // for a given character.
-  function measureChar(cm, line, ch, bias) {
-    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);
-  }
-
-  // Find a line view that corresponds to the given line number.
-  function findViewForLine(cm, lineN) {
-    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
-      return cm.display.view[findViewIndex(cm, lineN)];
-    var ext = cm.display.externalMeasured;
-    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
-      return ext;
-  }
-
-  // Measurement can be split in two steps, the set-up work that
-  // applies to the whole line, and the measurement of the actual
-  // character. Functions like coordsChar, that need to do a lot of
-  // measurements in a row, can thus ensure that the set-up work is
-  // only done once.
-  function prepareMeasureForLine(cm, line) {
-    var lineN = lineNo(line);
-    var view = findViewForLine(cm, lineN);
-    if (view && !view.text) {
-      view = null;
-    } else if (view && view.changes) {
-      updateLineForChanges(cm, view, lineN, getDimensions(cm));
-      cm.curOp.forceUpdate = true;
-    }
-    if (!view)
-      view = updateExternalMeasurement(cm, line);
-
-    var info = mapFromLineView(view, line, lineN);
-    return {
-      line: line, view: view, rect: null,
-      map: info.map, cache: info.cache, before: info.before,
-      hasHeights: false
-    };
-  }
-
-  // Given a prepared measurement object, measures the position of an
-  // actual character (or fetches it from the cache).
-  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
-    if (prepared.before) ch = -1;
-    var key = ch + (bias || ""), found;
-    if (prepared.cache.hasOwnProperty(key)) {
-      found = prepared.cache[key];
-    } else {
-      if (!prepared.rect)
-        prepared.rect = prepared.view.text.getBoundingClientRect();
-      if (!prepared.hasHeights) {
-        ensureLineHeights(cm, prepared.view, prepared.rect);
-        prepared.hasHeights = true;
-      }
-      found = measureCharInner(cm, prepared, ch, bias);
-      if (!found.bogus) prepared.cache[key] = found;
-    }
-    return {left: found.left, right: found.right,
-            top: varHeight ? found.rtop : found.top,
-            bottom: varHeight ? found.rbottom : found.bottom};
-  }
-
-  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
-
-  function nodeAndOffsetInLineMap(map, ch, bias) {
-    var node, start, end, collapse;
-    // First, search the line map for the text node corresponding to,
-    // or closest to, the target character.
-    for (var i = 0; i < map.length; i += 3) {
-      var mStart = map[i], mEnd = map[i + 1];
-      if (ch < mStart) {
-        start = 0; end = 1;
-        collapse = "left";
-      } else if (ch < mEnd) {
-        start = ch - mStart;
-        end = start + 1;
-      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
-        end = mEnd - mStart;
-        start = end - 1;
-        if (ch >= mEnd) collapse = "right";
-      }
-      if (start != null) {
-        node = map[i + 2];
-        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
-          collapse = bias;
-        if (bias == "left" && start == 0)
-          while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
-            node = map[(i -= 3) + 2];
-            collapse = "left";
-          }
-        if (bias == "right" && start == mEnd - mStart)
-          while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
-            node = map[(i += 3) + 2];
-            collapse = "right";
-          }
-        break;
-      }
-    }
-    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd};
-  }
-
-  function measureCharInner(cm, prepared, ch, bias) {
-    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
-    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
-
-    var rect;
-    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
-      for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
-        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) --start;
-        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) ++end;
-        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) {
-          rect = node.parentNode.getBoundingClientRect();
-        } else if (ie && cm.options.lineWrapping) {
-          var rects = range(node, start, end).getClientRects();
-          if (rects.length)
-            rect = rects[bias == "right" ? rects.length - 1 : 0];
-          else
-            rect = nullRect;
-        } else {
-          rect = range(node, start, end).getBoundingClientRect() || nullRect;
-        }
-        if (rect.left || rect.right || start == 0) break;
-        end = start;
-        start = start - 1;
-        collapse = "right";
-      }
-      if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
-    } else { // If it is a widget, simply get the box for the whole widget.
-      if (start > 0) collapse = bias = "right";
-      var rects;
-      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
-        rect = rects[bias == "right" ? rects.length - 1 : 0];
-      else
-        rect = node.getBoundingClientRect();
-    }
-    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
-      var rSpan = node.parentNode.getClientRects()[0];
-      if (rSpan)
-        rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};
-      else
-        rect = nullRect;
-    }
-
-    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
-    var mid = (rtop + rbot) / 2;
-    var heights = prepared.view.measure.heights;
-    for (var i = 0; i < heights.length - 1; i++)
-      if (mid < heights[i]) break;
-    var top = i ? heights[i - 1] : 0, bot = heights[i];
-    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
-                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
-                  top: top, bottom: bot};
-    if (!rect.left && !rect.right) result.bogus = true;
-    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
-
-    return result;
-  }
-
-  // Work around problem with bounding client rects on ranges being
-  // returned incorrectly when zoomed on IE10 and below.
-  function maybeUpdateRectForZooming(measure, rect) {
-    if (!window.screen || screen.logicalXDPI == null ||
-        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
-      return rect;
-    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
-    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
-    return {left: rect.left * scaleX, right: rect.right * scaleX,
-            top: rect.top * scaleY, bottom: rect.bottom * scaleY};
-  }
-
-  function clearLineMeasurementCacheFor(lineView) {
-    if (lineView.measure) {
-      lineView.measure.cache = {};
-      lineView.measure.heights = null;
-      if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
-        lineView.measure.caches[i] = {};
-    }
-  }
-
-  function clearLineMeasurementCache(cm) {
-    cm.display.externalMeasure = null;
-    removeChildren(cm.display.lineMeasure);
-    for (var i = 0; i < cm.display.view.length; i++)
-      clearLineMeasurementCacheFor(cm.display.view[i]);
-  }
-
-  function clearCaches(cm) {
-    clearLineMeasurementCache(cm);
-    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
-    if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
-    cm.display.lineNumChars = null;
-  }
-
-  function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
-  function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
-
-  // Converts a {top, bottom, left, right} box from line-local
-  // coordinates into another coordinate system. Context may be one of
-  // "line", "div" (display.lineDiv), "local"/null (editor), "window",
-  // or "page".
-  function intoCoordSystem(cm, lineObj, rect, context) {
-    if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
-      var size = widgetHeight(lineObj.widgets[i]);
-      rect.top += size; rect.bottom += size;
-    }
-    if (context == "line") return rect;
-    if (!context) context = "local";
-    var yOff = heightAtLine(lineObj);
-    if (context == "local") yOff += paddingTop(cm.display);
-    else yOff -= cm.display.viewOffset;
-    if (context == "page" || context == "window") {
-      var lOff = cm.display.lineSpace.getBoundingClientRect();
-      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
-      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
-      rect.left += xOff; rect.right += xOff;
-    }
-    rect.top += yOff; rect.bottom += yOff;
-    return rect;
-  }
-
-  // Coverts a box from "div" coords to another coordinate system.
-  // Context may be "window", "page", "div", or "local"/null.
-  function fromCoordSystem(cm, coords, context) {
-    if (context == "div") return coords;
-    var left = coords.left, top = coords.top;
-    // First move into "page" coordinate system
-    if (context == "page") {
-      left -= pageScrollX();
-      top -= pageScrollY();
-    } else if (context == "local" || !context) {
-      var localBox = cm.display.sizer.getBoundingClientRect();
-      left += localBox.left;
-      top += localBox.top;
-    }
-
-    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
-    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
-  }
-
-  function charCoords(cm, pos, context, lineObj, bias) {
-    if (!lineObj) lineObj = getLine(cm.doc, pos.line);
-    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);
-  }
-
-  // Returns a box for a given cursor position, which may have an
-  // 'other' property containing the position of the secondary cursor
-  // on a bidi boundary.
-  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
-    lineObj = lineObj || getLine(cm.doc, pos.line);
-    if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);
-    function get(ch, right) {
-      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
-      if (right) m.left = m.right; else m.right = m.left;
-      return intoCoordSystem(cm, lineObj, m, context);
-    }
-    function getBidi(ch, partPos) {
-      var part = order[partPos], right = part.level % 2;
-      if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
-        part = order[--partPos];
-        ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
-        right = true;
-      } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
-        part = order[++partPos];
-        ch = bidiLeft(part) - part.level % 2;
-        right = false;
-      }
-      if (right && ch == part.to && ch > part.from) return get(ch - 1);
-      return get(ch, right);
-    }
-    var order = getOrder(lineObj), ch = pos.ch;
-    if (!order) return get(ch);
-    var partPos = getBidiPartAt(order, ch);
-    var val = getBidi(ch, partPos);
-    if (bidiOther != null) val.other = getBidi(ch, bidiOther);
-    return val;
-  }
-
-  // Used to cheaply estimate the coordinates for a position. Used for
-  // intermediate scroll updates.
-  function estimateCoords(cm, pos) {
-    var left = 0, pos = clipPos(cm.doc, pos);
-    if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;
-    var lineObj = getLine(cm.doc, pos.line);
-    var top = heightAtLine(lineObj) + paddingTop(cm.display);
-    return {left: left, right: left, top: top, bottom: top + lineObj.height};
-  }
-
-  // Positions returned by coordsChar contain some extra information.
-  // xRel is the relative x position of the input coordinates compared
-  // to the found position (so xRel > 0 means the coordinates are to
-  // the right of the character position, for example). When outside
-  // is true, that means the coordinates lie outside the line's
-  // vertical range.
-  function PosWithInfo(line, ch, outside, xRel) {
-    var pos = Pos(line, ch);
-    pos.xRel = xRel;
-    if (outside) pos.outside = true;
-    return pos;
-  }
-
-  // Compute the character position closest to the given coordinates.
-  // Input must be lineSpace-local ("div" coordinate system).
-  function coordsChar(cm, x, y) {
-    var doc = cm.doc;
-    y += cm.display.viewOffset;
-    if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
-    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
-    if (lineN > last)
-      return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
-    if (x < 0) x = 0;
-
-    var lineObj = getLine(doc, lineN);
-    for (;;) {
-      var found = coordsCharInner(cm, lineObj, lineN, x, y);
-      var merged = collapsedSpanAtEnd(lineObj);
-      var mergedPos = merged && merged.find(0, true);
-      if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
-        lineN = lineNo(lineObj = mergedPos.to.line);
-      else
-        return found;
-    }
-  }
-
-  function coordsCharInner(cm, lineObj, lineNo, x, y) {
-    var innerOff = y - heightAtLine(lineObj);
-    var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
-    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
-
-    function getX(ch) {
-      var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);
-      wrongLine = true;
-      if (innerOff > sp.bottom) return sp.left - adjust;
-      else if (innerOff < sp.top) return sp.left + adjust;
-      else wrongLine = false;
-      return sp.left;
-    }
-
-    var bidi = getOrder(lineObj), dist = lineObj.text.length;
-    var from = lineLeft(lineObj), to = lineRight(lineObj);
-    var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
-
-    if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
-    // Do a binary search between these bounds.
-    for (;;) {
-      if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
-        var ch = x < fromX || x - fromX <= toX - x ? from : to;
-        var xDiff = x - (ch == from ? fromX : toX);
-        while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
-        var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
-                              xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
-        return pos;
-      }
-      var step = Math.ceil(dist / 2), middle = from + step;
-      if (bidi) {
-        middle = from;
-        for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
-      }
-      var middleX = getX(middle);
-      if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
-      else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
-    }
-  }
-
-  var measureText;
-  // Compute the default text height.
-  function textHeight(display) {
-    if (display.cachedTextHeight != null) return display.cachedTextHeight;
-    if (measureText == null) {
-      measureText = elt("pre");
-      // Measure a bunch of lines, for browsers that compute
-      // fractional heights.
-      for (var i = 0; i < 49; ++i) {
-        measureText.appendChild(document.createTextNode("x"));
-        measureText.appendChild(elt("br"));
-      }
-      measureText.appendChild(document.createTextNode("x"));
-    }
-    removeChildrenAndAdd(display.measure, measureText);
-    var height = measureText.offsetHeight / 50;
-    if (height > 3) display.cachedTextHeight = height;
-    removeChildren(display.measure);
-    return height || 1;
-  }
-
-  // Compute the default character width.
-  function charWidth(display) {
-    if (display.cachedCharWidth != null) return display.cachedCharWidth;
-    var anchor = elt("span", "xxxxxxxxxx");
-    var pre = elt("pre", [anchor]);
-    removeChildrenAndAdd(display.measure, pre);
-    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
-    if (width > 2) display.cachedCharWidth = width;
-    return width || 10;
-  }
-
-  // OPERATIONS
-
-  // Operations are used to wrap a series of changes to the editor
-  // state in such a way that each change won't have to update the
-  // cursor and display (which would be awkward, slow, and
-  // error-prone). Instead, display updates are batched and then all
-  // combined and executed at once.
-
-  var operationGroup = null;
-
-  var nextOpId = 0;
-  // Start a new operation.
-  function startOperation(cm) {
-    cm.curOp = {
-      cm: cm,
-      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
-      startHeight: cm.doc.height, // Used to detect need to update scrollbar
-      forceUpdate: false,      // Used to force a redraw
-      updateInput: null,       // Whether to reset the input textarea
-      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
-      changeObjs: null,        // Accumulated changes, for firing change events
-      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
-      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
-      selectionChanged: false, // Whether the selection needs to be redrawn
-      updateMaxLine: false,    // Set when the widest line needs to be determined anew
-      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
-      scrollToPos: null,       // Used to scroll to a specific position
-      focus: false,
-      id: ++nextOpId           // Unique ID
-    };
-    if (operationGroup) {
-      operationGroup.ops.push(cm.curOp);
-    } else {
-      cm.curOp.ownsGroup = operationGroup = {
-        ops: [cm.curOp],
-        delayedCallbacks: []
-      };
-    }
-  }
-
-  function fireCallbacksForOps(group) {
-    // Calls delayed callbacks and cursorActivity handlers until no
-    // new ones appear
-    var callbacks = group.delayedCallbacks, i = 0;
-    do {
-      for (; i < callbacks.length; i++)
-        callbacks[i].call(null);
-      for (var j = 0; j < group.ops.length; j++) {
-        var op = group.ops[j];
-        if (op.cursorActivityHandlers)
-          while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
-            op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm);
-      }
-    } while (i < callbacks.length);
-  }
-
-  // Finish an operation, updating the display and signalling delayed events
-  function endOperation(cm) {
-    var op = cm.curOp, group = op.ownsGroup;
-    if (!group) return;
-
-    try { fireCallbacksForOps(group); }
-    finally {
-      operationGroup = null;
-      for (var i = 0; i < group.ops.length; i++)
-        group.ops[i].cm.curOp = null;
-      endOperations(group);
-    }
-  }
-
-  // The DOM updates done when an operation finishes are batched so
-  // that the minimum number of relayouts are required.
-  function endOperations(group) {
-    var ops = group.ops;
-    for (var i = 0; i < ops.length; i++) // Read DOM
-      endOperation_R1(ops[i]);
-    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
-      endOperation_W1(ops[i]);
-    for (var i = 0; i < ops.length; i++) // Read DOM
-      endOperation_R2(ops[i]);
-    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
-      endOperation_W2(ops[i]);
-    for (var i = 0; i < ops.length; i++) // Read DOM
-      endOperation_finish(ops[i]);
-  }
-
-  function endOperation_R1(op) {
-    var cm = op.cm, display = cm.display;
-    maybeClipScrollbars(cm);
-    if (op.updateMaxLine) findMaxLine(cm);
-
-    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
-      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
-                         op.scrollToPos.to.line >= display.viewTo) ||
-      display.maxLineChanged && cm.options.lineWrapping;
-    op.update = op.mustUpdate &&
-      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
-  }
-
-  function endOperation_W1(op) {
-    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
-  }
-
-  function endOperation_R2(op) {
-    var cm = op.cm, display = cm.display;
-    if (op.updatedDisplay) updateHeightsInViewport(cm);
-
-    op.barMeasure = measureForScrollbars(cm);
-
-    // If the max line changed since it was last measured, measure it,
-    // and ensure the document's width matches it.
-    // updateDisplay_W2 will use these properties to do the actual resizing
-    if (display.maxLineChanged && !cm.options.lineWrapping) {
-      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
-      cm.display.sizerWidth = op.adjustWidthTo;
-      op.barMeasure.scrollWidth =
-        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
-      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
-    }
-
-    if (op.updatedDisplay || op.selectionChanged)
-      op.preparedSelection = display.input.prepareSelection(op.focus);
-  }
-
-  function endOperation_W2(op) {
-    var cm = op.cm;
-
-    if (op.adjustWidthTo != null) {
-      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
-      if (op.maxScrollLeft < cm.doc.scrollLeft)
-        setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
-      cm.display.maxLineChanged = false;
-    }
-
-    var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus())
-    if (op.preparedSelection)
-      cm.display.input.showSelection(op.preparedSelection, takeFocus);
-    if (op.updatedDisplay || op.startHeight != cm.doc.height)
-      updateScrollbars(cm, op.barMeasure);
-    if (op.updatedDisplay)
-      setDocumentHeight(cm, op.barMeasure);
-
-    if (op.selectionChanged) restartBlink(cm);
-
-    if (cm.state.focused && op.updateInput)
-      cm.display.input.reset(op.typing);
-    if (takeFocus) ensureFocus(op.cm);
-  }
-
-  function endOperation_finish(op) {
-    var cm = op.cm, display = cm.display, doc = cm.doc;
-
-    if (op.updatedDisplay) postUpdateDisplay(cm, op.update);
-
-    // Abort mouse wheel delta measurement, when scrolling explicitly
-    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
-      display.wheelStartX = display.wheelStartY = null;
-
-    // Propagate the scroll position to the actual DOM scroller
-    if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
-      doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
-      display.scrollbars.setScrollTop(doc.scrollTop);
-      display.scroller.scrollTop = doc.scrollTop;
-    }
-    if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
-      doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));
-      display.scrollbars.setScrollLeft(doc.scrollLeft);
-      display.scroller.scrollLeft = doc.scrollLeft;
-      alignHorizontally(cm);
-    }
-    // If we need to scroll a specific position into view, do so.
-    if (op.scrollToPos) {
-      var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
-                                     clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
-      if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);
-    }
-
-    // Fire events for markers that are hidden/unidden by editing or
-    // undoing
-    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
-    if (hidden) for (var i = 0; i < hidden.length; ++i)
-      if (!hidden[i].lines.length) signal(hidden[i], "hide");
-    if (unhidden) for (var i = 0; i < unhidden.length; ++i)
-      if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
-
-    if (display.wrapper.offsetHeight)
-      doc.scrollTop = cm.display.scroller.scrollTop;
-
-    // Fire change events, and delayed event handlers
-    if (op.changeObjs)
-      signal(cm, "changes", cm, op.changeObjs);
-    if (op.update)
-      op.update.finish();
-  }
-
-  // Run the given function in an operation
-  function runInOp(cm, f) {
-    if (cm.curOp) return f();
-    startOperation(cm);
-    try { return f(); }
-    finally { endOperation(cm); }
-  }
-  // Wraps a function in an operation. Returns the wrapped function.
-  function operation(cm, f) {
-    return function() {
-      if (cm.curOp) return f.apply(cm, arguments);
-      startOperation(cm);
-      try { return f.apply(cm, arguments); }
-      finally { endOperation(cm); }
-    };
-  }
-  // Used to add methods to editor and doc instances, wrapping them in
-  // operations.
-  function methodOp(f) {
-    return function() {
-      if (this.curOp) return f.apply(this, arguments);
-      startOperation(this);
-      try { return f.apply(this, arguments); }
-      finally { endOperation(this); }
-    };
-  }
-  function docMethodOp(f) {
-    return function() {
-      var cm = this.cm;
-      if (!cm || cm.curOp) return f.apply(this, arguments);
-      startOperation(cm);
-      try { return f.apply(this, arguments); }
-      finally { endOperation(cm); }
-    };
-  }
-
-  // VIEW TRACKING
-
-  // These objects are used to represent the visible (currently drawn)
-  // part of the document. A LineView may correspond to multiple
-  // logical lines, if those are connected by collapsed ranges.
-  function LineView(doc, line, lineN) {
-    // The starting line
-    this.line = line;
-    // Continuing lines, if any
-    this.rest = visualLineContinued(line);
-    // Number of logical lines in this visual line
-    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
-    this.node = this.text = null;
-    this.hidden = lineIsHidden(doc, line);
-  }
-
-  // Create a range of LineView objects for the given lines.
-  function buildViewArray(cm, from, to) {
-    var array = [], nextPos;
-    for (var pos = from; pos < to; pos = nextPos) {
-      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
-      nextPos = pos + view.size;
-      array.push(view);
-    }
-    return array;
-  }
-
-  // Updates the display.view data structure for a given change to the
-  // document. From and to are in pre-change coordinates. Lendiff is
-  // the amount of lines added or subtracted by the change. This is
-  // used for changes that span multiple lines, or change the way
-  // lines are divided into visual lines. regLineChange (below)
-  // registers single-line changes.
-  function regChange(cm, from, to, lendiff) {
-    if (from == null) from = cm.doc.first;
-    if (to == null) to = cm.doc.first + cm.doc.size;
-    if (!lendiff) lendiff = 0;
-
-    var display = cm.display;
-    if (lendiff && to < display.viewTo &&
-        (display.updateLineNumbers == null || display.updateLineNumbers > from))
-      display.updateLineNumbers = from;
-
-    cm.curOp.viewChanged = true;
-
-    if (from >= display.viewTo) { // Change after
-      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
-        resetView(cm);
-    } else if (to <= display.viewFrom) { // Change before
-      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
-        resetView(cm);
-      } else {
-        display.viewFrom += lendiff;
-        display.viewTo += lendiff;
-      }
-    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
-      resetView(cm);
-    } else if (from <= display.viewFrom) { // Top overlap
-      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
-      if (cut) {
-        display.view = display.view.slice(cut.index);
-        display.viewFrom = cut.lineN;
-        display.viewTo += lendiff;
-      } else {
-        resetView(cm);
-      }
-    } else if (to >= display.viewTo) { // Bottom overlap
-      var cut = viewCuttingPoint(cm, from, from, -1);
-      if (cut) {
-        display.view = display.view.slice(0, cut.index);
-        display.viewTo = cut.lineN;
-      } else {
-        resetView(cm);
-      }
-    } else { // Gap in the middle
-      var cutTop = viewCuttingPoint(cm, from, from, -1);
-      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
-      if (cutTop && cutBot) {
-        display.view = display.view.slice(0, cutTop.index)
-          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
-          .concat(display.view.slice(cutBot.index));
-        display.viewTo += lendiff;
-      } else {
-        resetView(cm);
-      }
-    }
-
-    var ext = display.externalMeasured;
-    if (ext) {
-      if (to < ext.lineN)
-        ext.lineN += lendiff;
-      else if (from < ext.lineN + ext.size)
-        display.externalMeasured = null;
-    }
-  }
-
-  // Register a change to a single line. Type must be one of "text",
-  // "gutter", "class", "widget"
-  function regLineChange(cm, line, type) {
-    cm.curOp.viewChanged = true;
-    var display = cm.display, ext = cm.display.externalMeasured;
-    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
-      display.externalMeasured = null;
-
-    if (line < display.viewFrom || line >= display.viewTo) return;
-    var lineView = display.view[findViewIndex(cm, line)];
-    if (lineView.node == null) return;
-    var arr = lineView.changes || (lineView.changes = []);
-    if (indexOf(arr, type) == -1) arr.push(type);
-  }
-
-  // Clear the view.
-  function resetView(cm) {
-    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
-    cm.display.view = [];
-    cm.display.viewOffset = 0;
-  }
-
-  // Find the view element corresponding to a given line. Return null
-  // when the line isn't visible.
-  function findViewIndex(cm, n) {
-    if (n >= cm.display.viewTo) return null;
-    n -= cm.display.viewFrom;
-    if (n < 0) return null;
-    var view = cm.display.view;
-    for (var i = 0; i < view.length; i++) {
-      n -= view[i].size;
-      if (n < 0) return i;
-    }
-  }
-
-  function viewCuttingPoint(cm, oldN, newN, dir) {
-    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
-    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
-      return {index: index, lineN: newN};
-    for (var i = 0, n = cm.display.viewFrom; i < index; i++)
-      n += view[i].size;
-    if (n != oldN) {
-      if (dir > 0) {
-        if (index == view.length - 1) return null;
-        diff = (n + view[index].size) - oldN;
-        index++;
-      } else {
-        diff = n - oldN;
-      }
-      oldN += diff; newN += diff;
-    }
-    while (visualLineNo(cm.doc, newN) != newN) {
-      if (index == (dir < 0 ? 0 : view.length - 1)) return null;
-      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
-      index += dir;
-    }
-    return {index: index, lineN: newN};
-  }
-
-  // Force the view to cover a given range, adding empty view element
-  // or clipping off existing ones as needed.
-  function adjustView(cm, from, to) {
-    var display = cm.display, view = display.view;
-    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
-      display.view = buildViewArray(cm, from, to);
-      display.viewFrom = from;
-    } else {
-      if (display.viewFrom > from)
-        display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);
-      else if (display.viewFrom < from)
-        display.view = display.view.slice(findViewIndex(cm, from));
-      display.viewFrom = from;
-      if (display.viewTo < to)
-        display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));
-      else if (display.viewTo > to)
-        display.view = display.view.slice(0, findViewIndex(cm, to));
-    }
-    display.viewTo = to;
-  }
-
-  // Count the number of lines in the view whose DOM representation is
-  // out of date (or nonexistent).
-  function countDirtyView(cm) {
-    var view = cm.display.view, dirty = 0;
-    for (var i = 0; i < view.length; i++) {
-      var lineView = view[i];
-      if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;
-    }
-    return dirty;
-  }
-
-  // EVENT HANDLERS
-
-  // Attach the necessary event handlers when initializing the editor
-  function registerEventHandlers(cm) {
-    var d = cm.display;
-    on(d.scroller, "mousedown", operation(cm, onMouseDown));
-    // Older IE's will not fire a second mousedown for a double click
-    if (ie && ie_version < 11)
-      on(d.scroller, "dblclick", operation(cm, function(e) {
-        if (signalDOMEvent(cm, e)) return;
-        var pos = posFromMouse(cm, e);
-        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
-        e_preventDefault(e);
-        var word = cm.findWordAt(pos);
-        extendSelection(cm.doc, word.anchor, word.head);
-      }));
-    else
-      on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
-    // Some browsers fire contextmenu *after* opening the menu, at
-    // which point we can't mess with it anymore. Context menu is
-    // handled in onMouseDown for these browsers.
-    if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
-
-    // Used to suppress mouse event handling when a touch happens
-    var touchFinished, prevTouch = {end: 0};
-    function finishTouch() {
-      if (d.activeTouch) {
-        touchFinished = setTimeout(function() {d.activeTouch = null;}, 1000);
-        prevTouch = d.activeTouch;
-        prevTouch.end = +new Date;
-      }
-    };
-    function isMouseLikeTouchEvent(e) {
-      if (e.touches.length != 1) return false;
-      var touch = e.touches[0];
-      return touch.radiusX <= 1 && touch.radiusY <= 1;
-    }
-    function farAway(touch, other) {
-      if (other.left == null) return true;
-      var dx = other.left - touch.left, dy = other.top - touch.top;
-      return dx * dx + dy * dy > 20 * 20;
-    }
-    on(d.scroller, "touchstart", function(e) {
-      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) {
-        clearTimeout(touchFinished);
-        var now = +new Date;
-        d.activeTouch = {start: now, moved: false,
-                         prev: now - prevTouch.end <= 300 ? prevTouch : null};
-        if (e.touches.length == 1) {
-          d.activeTouch.left = e.touches[0].pageX;
-          d.activeTouch.top = e.touches[0].pageY;
-        }
-      }
-    });
-    on(d.scroller, "touchmove", function() {
-      if (d.activeTouch) d.activeTouch.moved = true;
-    });
-    on(d.scroller, "touchend", function(e) {
-      var touch = d.activeTouch;
-      if (touch && !eventInWidget(d, e) && touch.left != null &&
-          !touch.moved && new Date - touch.start < 300) {
-        var pos = cm.coordsChar(d.activeTouch, "page"), range;
-        if (!touch.prev || farAway(touch, touch.prev)) // Single tap
-          range = new Range(pos, pos);
-        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
-          range = cm.findWordAt(pos);
-        else // Triple tap
-          range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0)));
-        cm.setSelection(range.anchor, range.head);
-        cm.focus();
-        e_preventDefault(e);
-      }
-      finishTouch();
-    });
-    on(d.scroller, "touchcancel", finishTouch);
-
-    // Sync scrolling between fake scrollbars and real scrollable
-    // area, ensure viewport is updated when scrolling.
-    on(d.scroller, "scroll", function() {
-      if (d.scroller.clientHeight) {
-        setScrollTop(cm, d.scroller.scrollTop);
-        setScrollLeft(cm, d.scroller.scrollLeft, true);
-        signal(cm, "scroll", cm);
-      }
-    });
-
-    // Listen to wheel events in order to try and update the viewport on time.
-    on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
-    on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
-
-    // Prevent wrapper from ever scrolling
-    on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
-
-    d.dragFunctions = {
-      enter: function(e) {if (!signalDOMEvent(cm, e)) e_stop(e);},
-      over: function(e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
-      start: function(e){onDragStart(cm, e);},
-      drop: operation(cm, onDrop),
-      leave: function(e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
-    };
-
-    var inp = d.input.getField();
-    on(inp, "keyup", function(e) { onKeyUp.call(cm, e); });
-    on(inp, "keydown", operation(cm, onKeyDown));
-    on(inp, "keypress", operation(cm, onKeyPress));
-    on(inp, "focus", bind(onFocus, cm));
-    on(inp, "blur", bind(onBlur, cm));
-  }
-
-  function dragDropChanged(cm, value, old) {
-    var wasOn = old && old != CodeMirror.Init;
-    if (!value != !wasOn) {
-      var funcs = cm.display.dragFunctions;
-      var toggle = value ? on : off;
-      toggle(cm.display.scroller, "dragstart", funcs.start);
-      toggle(cm.display.scroller, "dragenter", funcs.enter);
-      toggle(cm.display.scroller, "dragover", funcs.over);
-      toggle(cm.display.scroller, "dragleave", funcs.leave);
-      toggle(cm.display.scroller, "drop", funcs.drop);
-    }
-  }
-
-  // Called when the window resizes
-  function onResize(cm) {
-    var d = cm.display;
-    if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth)
-      return;
-    // Might be a text scaling operation, clear size caches.
-    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
-    d.scrollbarsClipped = false;
-    cm.setSize();
-  }
-
-  // MOUSE EVENTS
-
-  // Return true when the given mouse event happened in a widget
-  function eventInWidget(display, e) {
-    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
-      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
-          (n.parentNode == display.sizer && n != display.mover))
-        return true;
-    }
-  }
-
-  // Given a mouse event, find the corresponding position. If liberal
-  // is false, it checks whether a gutter or scrollbar was clicked,
-  // and returns null if it was. forRect is used by rectangular
-  // selections, and tries to estimate a character position even for
-  // coordinates beyond the right of the text.
-  function posFromMouse(cm, e, liberal, forRect) {
-    var display = cm.display;
-    if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") return null;
-
-    var x, y, space = display.lineSpace.getBoundingClientRect();
-    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
-    try { x = e.clientX - space.left; y = e.clientY - space.top; }
-    catch (e) { return null; }
-    var coords = coordsChar(cm, x, y), line;
-    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
-      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
-      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
-    }
-    return coords;
-  }
-
-  // A mouse down can be a single click, double click, triple click,
-  // start of selection drag, start of text drag, new cursor
-  // (ctrl-click), rectangle drag (alt-drag), or xwin
-  // middle-click-paste. Or it might be a click on something we should
-  // not interfere with, such as a scrollbar or widget.
-  function onMouseDown(e) {
-    var cm = this, display = cm.display;
-    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) return;
-    display.shift = e.shiftKey;
-
-    if (eventInWidget(display, e)) {
-      if (!webkit) {
-        // Briefly turn off draggability, to allow widgets to do
-        // normal dragging things.
-        display.scroller.draggable = false;
-        setTimeout(function(){display.scroller.draggable = true;}, 100);
-      }
-      return;
-    }
-    if (clickInGutter(cm, e)) return;
-    var start = posFromMouse(cm, e);
-    window.focus();
-
-    switch (e_button(e)) {
-    case 1:
-      // #3261: make sure, that we're not starting a second selection
-      if (cm.state.selectingText)
-        cm.state.selectingText(e);
-      else if (start)
-        leftButtonDown(cm, e, start);
-      else if (e_target(e) == display.scroller)
-        e_preventDefault(e);
-      break;
-    case 2:
-      if (webkit) cm.state.lastMiddleDown = +new Date;
-      if (start) extendSelection(cm.doc, start);
-      setTimeout(function() {display.input.focus();}, 20);
-      e_preventDefault(e);
-      break;
-    case 3:
-      if (captureRightClick) onContextMenu(cm, e);
-      else delayBlurEvent(cm);
-      break;
-    }
-  }
-
-  var lastClick, lastDoubleClick;
-  function leftButtonDown(cm, e, start) {
-    if (ie) setTimeout(bind(ensureFocus, cm), 0);
-    else cm.curOp.focus = activeElt();
-
-    var now = +new Date, type;
-    if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {
-      type = "triple";
-    } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {
-      type = "double";
-      lastDoubleClick = {time: now, pos: start};
-    } else {
-      type = "single";
-      lastClick = {time: now, pos: start};
-    }
-
-    var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained;
-    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
-        type == "single" && (contained = sel.contains(start)) > -1 &&
-        (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) &&
-        (cmp(contained.to(), start) > 0 || start.xRel < 0))
-      leftButtonStartDrag(cm, e, start, modifier);
-    else
-      leftButtonSelect(cm, e, start, type, modifier);
-  }
-
-  // Start a text drag. When it ends, see if any dragging actually
-  // happen, and treat as a click if it didn't.
-  function leftButtonStartDrag(cm, e, start, modifier) {
-    var display = cm.display, startTime = +new Date;
-    var dragEnd = operation(cm, function(e2) {
-      if (webkit) display.scroller.draggable = false;
-      cm.state.draggingText = false;
-      off(document, "mouseup", dragEnd);
-      off(display.scroller, "drop", dragEnd);
-      if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
-        e_preventDefault(e2);
-        if (!modifier && +new Date - 200 < startTime)
-          extendSelection(cm.doc, start);
-        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
-        if (webkit || ie && ie_version == 9)
-          setTimeout(function() {document.body.focus(); display.input.focus();}, 20);
-        else
-          display.input.focus();
-      }
-    });
-    // Let the drag handler handle this.
-    if (webkit) display.scroller.draggable = true;
-    cm.state.draggingText = dragEnd;
-    // IE's approach to draggable
-    if (display.scroller.dragDrop) display.scroller.dragDrop();
-    on(document, "mouseup", dragEnd);
-    on(display.scroller, "drop", dragEnd);
-  }
-
-  // Normal selection, as opposed to text dragging.
-  function leftButtonSelect(cm, e, start, type, addNew) {
-    var display = cm.display, doc = cm.doc;
-    e_preventDefault(e);
-
-    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
-    if (addNew && !e.shiftKey) {
-      ourIndex = doc.sel.contains(start);
-      if (ourIndex > -1)
-        ourRange = ranges[ourIndex];
-      else
-        ourRange = new Range(start, start);
-    } else {
-      ourRange = doc.sel.primary();
-      ourIndex = doc.sel.primIndex;
-    }
-
-    if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) {
-      type = "rect";
-      if (!addNew) ourRange = new Range(start, start);
-      start = posFromMouse(cm, e, true, true);
-      ourIndex = -1;
-    } else if (type == "double") {
-      var word = cm.findWordAt(start);
-      if (cm.display.shift || doc.extend)
-        ourRange = extendRange(doc, ourRange, word.anchor, word.head);
-      else
-        ourRange = word;
-    } else if (type == "triple") {
-      var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));
-      if (cm.display.shift || doc.extend)
-        ourRange = extendRange(doc, ourRange, line.anchor, line.head);
-      else
-        ourRange = line;
-    } else {
-      ourRange = extendRange(doc, ourRange, start);
-    }
-
-    if (!addNew) {
-      ourIndex = 0;
-      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
-      startSel = doc.sel;
-    } else if (ourIndex == -1) {
-      ourIndex = ranges.length;
-      setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex),
-                   {scroll: false, origin: "*mouse"});
-    } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) {
-      setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
-                   {scroll: false, origin: "*mouse"});
-      startSel = doc.sel;
-    } else {
-      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
-    }
-
-    var lastPos = start;
-    function extendTo(pos) {
-      if (cmp(lastPos, pos) == 0) return;
-      lastPos = pos;
-
-      if (type == "rect") {
-        var ranges = [], tabSize = cm.options.tabSize;
-        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
-        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
-        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
-        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
-             line <= end; line++) {
-          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
-          if (left == right)
-            ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));
-          else if (text.length > leftPos)
-            ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));
-        }
-        if (!ranges.length) ranges.push(new Range(start, start));
-        setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
-                     {origin: "*mouse", scroll: false});
-        cm.scrollIntoView(pos);
-      } else {
-        var oldRange = ourRange;
-        var anchor = oldRange.anchor, head = pos;
-        if (type != "single") {
-          if (type == "double")
-            var range = cm.findWordAt(pos);
-          else
-            var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
-          if (cmp(range.anchor, anchor) > 0) {
-            head = range.head;
-            anchor = minPos(oldRange.from(), range.anchor);
-          } else {
-            head = range.anchor;
-            anchor = maxPos(oldRange.to(), range.head);
-          }
-        }
-        var ranges = startSel.ranges.slice(0);
-        ranges[ourIndex] = new Range(clipPos(doc, anchor), head);
-        setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);
-      }
-    }
-
-    var editorSize = display.wrapper.getBoundingClientRect();
-    // Used to ensure timeout re-tries don't fire when another extend
-    // happened in the meantime (clearTimeout isn't reliable -- at
-    // least on Chrome, the timeouts still happen even when cleared,
-    // if the clear happens after their scheduled firing time).
-    var counter = 0;
-
-    function extend(e) {
-      var curCount = ++counter;
-      var cur = posFromMouse(cm, e, true, type == "rect");
-      if (!cur) return;
-      if (cmp(cur, lastPos) != 0) {
-        cm.curOp.focus = activeElt();
-        extendTo(cur);
-        var visible = visibleLines(display, doc);
-        if (cur.line >= visible.to || cur.line < visible.from)
-          setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
-      } else {
-        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
-        if (outside) setTimeout(operation(cm, function() {
-          if (counter != curCount) return;
-          display.scroller.scrollTop += outside;
-          extend(e);
-        }), 50);
-      }
-    }
-
-    function done(e) {
-      cm.state.selectingText = false;
-      counter = Infinity;
-      e_preventDefault(e);
-      display.input.focus();
-      off(document, "mousemove", move);
-      off(document, "mouseup", up);
-      doc.history.lastSelOrigin = null;
-    }
-
-    var move = operation(cm, function(e) {
-      if (!e_button(e)) done(e);
-      else extend(e);
-    });
-    var up = operation(cm, done);
-    cm.state.selectingText = up;
-    on(document, "mousemove", move);
-    on(document, "mouseup", up);
-  }
-
-  // Determines whether an event happened in the gutter, and fires the
-  // handlers for the corresponding event.
-  function gutterEvent(cm, e, type, prevent) {
-    try { var mX = e.clientX, mY = e.clientY; }
-    catch(e) { return false; }
-    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;
-    if (prevent) e_preventDefault(e);
-
-    var display = cm.display;
-    var lineBox = display.lineDiv.getBoundingClientRect();
-
-    if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
-    mY -= lineBox.top - display.viewOffset;
-
-    for (var i = 0; i < cm.options.gutters.length; ++i) {
-      var g = display.gutters.childNodes[i];
-      if (g && g.getBoundingClientRect().right >= mX) {
-        var line = lineAtHeight(cm.doc, mY);
-        var gutter = cm.options.gutters[i];
-        signal(cm, type, cm, line, gutter, e);
-        return e_defaultPrevented(e);
-      }
-    }
-  }
-
-  function clickInGutter(cm, e) {
-    return gutterEvent(cm, e, "gutterClick", true);
-  }
-
-  // Kludge to work around strange IE behavior where it'll sometimes
-  // re-fire a series of drag-related events right after the drop (#1551)
-  var lastDrop = 0;
-
-  function onDrop(e) {
-    var cm = this;
-    clearDragCursor(cm);
-    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
-      return;
-    e_preventDefault(e);
-    if (ie) lastDrop = +new Date;
-    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
-    if (!pos || cm.isReadOnly()) return;
-    // Might be a file drop, in which case we simply extract the text
-    // and insert it.
-    if (files && files.length && window.FileReader && window.File) {
-      var n = files.length, text = Array(n), read = 0;
-      var loadFile = function(file, i) {
-        if (cm.options.allowDropFileTypes &&
-            indexOf(cm.options.allowDropFileTypes, file.type) == -1)
-          return;
-
-        var reader = new FileReader;
-        reader.onload = operation(cm, function() {
-          var content = reader.result;
-          if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) content = "";
-          text[i] = content;
-          if (++read == n) {
-            pos = clipPos(cm.doc, pos);
-            var change = {from: pos, to: pos,
-                          text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())),
-                          origin: "paste"};
-            makeChange(cm.doc, change);
-            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
-          }
-        });
-        reader.readAsText(file);
-      };
-      for (var i = 0; i < n; ++i) loadFile(files[i], i);
-    } else { // Normal drop
-      // Don't do a replace if the drop happened inside of the selected text.
-      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
-        cm.state.draggingText(e);
-        // Ensure the editor is re-focused
-        setTimeout(function() {cm.display.input.focus();}, 20);
-        return;
-      }
-      try {
-        var text = e.dataTransfer.getData("Text");
-        if (text) {
-          if (cm.state.draggingText && !(mac ? e.altKey : e.ctrlKey))
-            var selected = cm.listSelections();
-          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
-          if (selected) for (var i = 0; i < selected.length; ++i)
-            replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");
-          cm.replaceSelection(text, "around", "paste");
-          cm.display.input.focus();
-        }
-      }
-      catch(e){}
-    }
-  }
-
-  function onDragStart(cm, e) {
-    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
-    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
-
-    e.dataTransfer.setData("Text", cm.getSelection());
-    e.dataTransfer.effectAllowed = "copyMove"
-
-    // Use dummy image instead of default browsers image.
-    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
-    if (e.dataTransfer.setDragImage && !safari) {
-      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
-      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
-      if (presto) {
-        img.width = img.height = 1;
-        cm.display.wrapper.appendChild(img);
-        // Force a relayout, or Opera won't use our image for some obscure reason
-        img._top = img.offsetTop;
-      }
-      e.dataTransfer.setDragImage(img, 0, 0);
-      if (presto) img.parentNode.removeChild(img);
-    }
-  }
-
-  function onDragOver(cm, e) {
-    var pos = posFromMouse(cm, e);
-    if (!pos) return;
-    var frag = document.createDocumentFragment();
-    drawSelectionCursor(cm, pos, frag);
-    if (!cm.display.dragCursor) {
-      cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
-      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
-    }
-    removeChildrenAndAdd(cm.display.dragCursor, frag);
-  }
-
-  function clearDragCursor(cm) {
-    if (cm.display.dragCursor) {
-      cm.display.lineSpace.removeChild(cm.display.dragCursor);
-      cm.display.dragCursor = null;
-    }
-  }
-
-  // SCROLL EVENTS
-
-  // Sync the scrollable area and scrollbars, ensure the viewport
-  // covers the visible area.
-  function setScrollTop(cm, val) {
-    if (Math.abs(cm.doc.scrollTop - val) < 2) return;
-    cm.doc.scrollTop = val;
-    if (!gecko) updateDisplaySimple(cm, {top: val});
-    if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
-    cm.display.scrollbars.setScrollTop(val);
-    if (gecko) updateDisplaySimple(cm);
-    startWorker(cm, 100);
-  }
-  // Sync scroller and scrollbar, ensure the gutter elements are
-  // aligned.
-  function setScrollLeft(cm, val, isScroller) {
-    if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
-    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
-    cm.doc.scrollLeft = val;
-    alignHorizontally(cm);
-    if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
-    cm.display.scrollbars.setScrollLeft(val);
-  }
-
-  // Since the delta values reported on mouse wheel events are
-  // unstandardized between browsers and even browser versions, and
-  // generally horribly unpredictable, this code starts by measuring
-  // the scroll effect that the first few mouse wheel events have,
-  // and, from that, detects the way it can convert deltas to pixel
-  // offsets afterwards.
-  //
-  // The reason we want to know the amount a wheel event will scroll
-  // is that it gives us a chance to update the display before the
-  // actual scrolling happens, reducing flickering.
-
-  var wheelSamples = 0, wheelPixelsPerUnit = null;
-  // Fill in a browser-detected starting value on browsers where we
-  // know one. These don't have to be accurate -- the result of them
-  // being wrong would just be a slight flicker on the first wheel
-  // scroll (if it is large enough).
-  if (ie) wheelPixelsPerUnit = -.53;
-  else if (gecko) wheelPixelsPerUnit = 15;
-  else if (chrome) wheelPixelsPerUnit = -.7;
-  else if (safari) wheelPixelsPerUnit = -1/3;
-
-  var wheelEventDelta = function(e) {
-    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
-    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
-    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
-    else if (dy == null) dy = e.wheelDelta;
-    return {x: dx, y: dy};
-  };
-  CodeMirror.wheelEventPixels = function(e) {
-    var delta = wheelEventDelta(e);
-    delta.x *= wheelPixelsPerUnit;
-    delta.y *= wheelPixelsPerUnit;
-    return delta;
-  };
-
-  function onScrollWheel(cm, e) {
-    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
-
-    var display = cm.display, scroll = display.scroller;
-    // Quit if there's nothing to scroll here
-    var canScrollX = scroll.scrollWidth > scroll.clientWidth;
-    var canScrollY = scroll.scrollHeight > scroll.clientHeight;
-    if (!(dx && canScrollX || dy && canScrollY)) return;
-
-    // Webkit browsers on OS X abort momentum scrolls when the target
-    // of the scroll event is removed from the scrollable element.
-    // This hack (see related code in patchDisplay) makes sure the
-    // element is kept around.
-    if (dy && mac && webkit) {
-      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
-        for (var i = 0; i < view.length; i++) {
-          if (view[i].node == cur) {
-            cm.display.currentWheelTarget = cur;
-            break outer;
-          }
-        }
-      }
-    }
-
-    // On some browsers, horizontal scrolling will cause redraws to
-    // happen before the gutter has been realigned, causing it to
-    // wriggle around in a most unseemly way. When we have an
-    // estimated pixels/delta value, we just handle horizontal
-    // scrolling entirely here. It'll be slightly off from native, but
-    // better than glitching out.
-    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
-      if (dy && canScrollY)
-        setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
-      setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
-      // Only prevent default scrolling if vertical scrolling is
-      // actually possible. Otherwise, it causes vertical scroll
-      // jitter on OSX trackpads when deltaX is small and deltaY
-      // is large (issue #3579)
-      if (!dy || (dy && canScrollY))
-        e_preventDefault(e);
-      display.wheelStartX = null; // Abort measurement, if in progress
-      return;
-    }
-
-    // 'Project' the visible viewport to cover the area that is being
-    // scrolled into view (if we know enough to estimate it).
-    if (dy && wheelPixelsPerUnit != null) {
-      var pixels = dy * wheelPixelsPerUnit;
-      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
-      if (pixels < 0) top = Math.max(0, top + pixels - 50);
-      else bot = Math.min(cm.doc.height, bot + pixels + 50);
-      updateDisplaySimple(cm, {top: top, bottom: bot});
-    }
-
-    if (wheelSamples < 20) {
-      if (display.wheelStartX == null) {
-        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
-        display.wheelDX = dx; display.wheelDY = dy;
-        setTimeout(function() {
-          if (display.wheelStartX == null) return;
-          var movedX = scroll.scrollLeft - display.wheelStartX;
-          var movedY = scroll.scrollTop - display.wheelStartY;
-          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
-            (movedX && display.wheelDX && movedX / display.wheelDX);
-          display.wheelStartX = display.wheelStartY = null;
-          if (!sample) return;
-          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
-          ++wheelSamples;
-        }, 200);
-      } else {
-        display.wheelDX += dx; display.wheelDY += dy;
-      }
-    }
-  }
-
-  // KEY EVENTS
-
-  // Run a handler that was bound to a key.
-  function doHandleBinding(cm, bound, dropShift) {
-    if (typeof bound == "string") {
-      bound = commands[bound];
-      if (!bound) return false;
-    }
-    // Ensure previous input has been read, so that the handler sees a
-    // consistent view of the document
-    cm.display.input.ensurePolled();
-    var prevShift = cm.display.shift, done = false;
-    try {
-      if (cm.isReadOnly()) cm.state.suppressEdits = true;
-      if (dropShift) cm.display.shift = false;
-      done = bound(cm) != Pass;
-    } finally {
-      cm.display.shift = prevShift;
-      cm.state.suppressEdits = false;
-    }
-    return done;
-  }
-
-  function lookupKeyForEditor(cm, name, handle) {
-    for (var i = 0; i < cm.state.keyMaps.length; i++) {
-      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
-      if (result) return result;
-    }
-    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
-      || lookupKey(name, cm.options.keyMap, handle, cm);
-  }
-
-  var stopSeq = new Delayed;
-  function dispatchKey(cm, name, e, handle) {
-    var seq = cm.state.keySeq;
-    if (seq) {
-      if (isModifierKey(name)) return "handled";
-      stopSeq.set(50, function() {
-        if (cm.state.keySeq == seq) {
-          cm.state.keySeq = null;
-          cm.display.input.reset();
-        }
-      });
-      name = seq + " " + name;
-    }
-    var result = lookupKeyForEditor(cm, name, handle);
-
-    if (result == "multi")
-      cm.state.keySeq = name;
-    if (result == "handled")
-      signalLater(cm, "keyHandled", cm, name, e);
-
-    if (result == "handled" || result == "multi") {
-      e_preventDefault(e);
-      restartBlink(cm);
-    }
-
-    if (seq && !result && /\'$/.test(name)) {
-      e_preventDefault(e);
-      return true;
-    }
-    return !!result;
-  }
-
-  // Handle a key from the keydown event.
-  function handleKeyBinding(cm, e) {
-    var name = keyName(e, true);
-    if (!name) return false;
-
-    if (e.shiftKey && !cm.state.keySeq) {
-      // First try to resolve full name (including 'Shift-'). Failing
-      // that, see if there is a cursor-motion command (starting with
-      // 'go') bound to the keyname without 'Shift-'.
-      return dispatchKey(cm, "Shift-" + name, e, function(b) {return doHandleBinding(cm, b, true);})
-          || dispatchKey(cm, name, e, function(b) {
-               if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
-                 return doHandleBinding(cm, b);
-             });
-    } else {
-      return dispatchKey(cm, name, e, function(b) { return doHandleBinding(cm, b); });
-    }
-  }
-
-  // Handle a key from the keypress event
-  function handleCharBinding(cm, e, ch) {
-    return dispatchKey(cm, "'" + ch + "'", e,
-                       function(b) { return doHandleBinding(cm, b, true); });
-  }
-
-  var lastStoppedKey = null;
-  function onKeyDown(e) {
-    var cm = this;
-    cm.curOp.focus = activeElt();
-    if (signalDOMEvent(cm, e)) return;
-    // IE does strange things with escape.
-    if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;
-    var code = e.keyCode;
-    cm.display.shift = code == 16 || e.shiftKey;
-    var handled = handleKeyBinding(cm, e);
-    if (presto) {
-      lastStoppedKey = handled ? code : null;
-      // Opera has no cut event... we try to at least catch the key combo
-      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
-        cm.replaceSelection("", null, "cut");
-    }
-
-    // Turn mouse into crosshair when Alt is held on Mac.
-    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
-      showCrossHair(cm);
-  }
-
-  function showCrossHair(cm) {
-    var lineDiv = cm.display.lineDiv;
-    addClass(lineDiv, "CodeMirror-crosshair");
-
-    function up(e) {
-      if (e.keyCode == 18 || !e.altKey) {
-        rmClass(lineDiv, "CodeMirror-crosshair");
-        off(document, "keyup", up);
-        off(document, "mouseover", up);
-      }
-    }
-    on(document, "keyup", up);
-    on(document, "mouseover", up);
-  }
-
-  function onKeyUp(e) {
-    if (e.keyCode == 16) this.doc.sel.shift = false;
-    signalDOMEvent(this, e);
-  }
-
-  function onKeyPress(e) {
-    var cm = this;
-    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;
-    var keyCode = e.keyCode, charCode = e.charCode;
-    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
-    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) return;
-    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
-    if (handleCharBinding(cm, e, ch)) return;
-    cm.display.input.onKeyPress(e);
-  }
-
-  // FOCUS/BLUR EVENTS
-
-  function delayBlurEvent(cm) {
-    cm.state.delayingBlurEvent = true;
-    setTimeout(function() {
-      if (cm.state.delayingBlurEvent) {
-        cm.state.delayingBlurEvent = false;
-        onBlur(cm);
-      }
-    }, 100);
-  }
-
-  function onFocus(cm) {
-    if (cm.state.delayingBlurEvent) cm.state.delayingBlurEvent = false;
-
-    if (cm.options.readOnly == "nocursor") return;
-    if (!cm.state.focused) {
-      signal(cm, "focus", cm);
-      cm.state.focused = true;
-      addClass(cm.display.wrapper, "CodeMirror-focused");
-      // This test prevents this from firing when a context
-      // menu is closed (since the input reset would kill the
-      // select-all detection hack)
-      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
-        cm.display.input.reset();
-        if (webkit) setTimeout(function() { cm.display.input.reset(true); }, 20); // Issue #1730
-      }
-      cm.display.input.receivedFocus();
-    }
-    restartBlink(cm);
-  }
-  function onBlur(cm) {
-    if (cm.state.delayingBlurEvent) return;
-
-    if (cm.state.focused) {
-      signal(cm, "blur", cm);
-      cm.state.focused = false;
-      rmClass(cm.display.wrapper, "CodeMirror-focused");
-    }
-    clearInterval(cm.display.blinker);
-    setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
-  }
-
-  // CONTEXT MENU HANDLING
-
-  // To make the context menu work, we need to briefly unhide the
-  // textarea (making it as unobtrusive as possible) to let the
-  // right-click take effect on it.
-  function onContextMenu(cm, e) {
-    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) return;
-    if (signalDOMEvent(cm, e, "contextmenu")) return;
-    cm.display.input.onContextMenu(e);
-  }
-
-  function contextMenuInGutter(cm, e) {
-    if (!hasHandler(cm, "gutterContextMenu")) return false;
-    return gutterEvent(cm, e, "gutterContextMenu", false);
-  }
-
-  // UPDATING
-
-  // Compute the position of the end of a change (its 'to' property
-  // refers to the pre-change end).
-  var changeEnd = CodeMirror.changeEnd = function(change) {
-    if (!change.text) return change.to;
-    return Pos(change.from.line + change.text.length - 1,
-               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
-  };
-
-  // Adjust a position to refer to the post-change position of the
-  // same text, or the end of the change if the change covers it.
-  function adjustForChange(pos, change) {
-    if (cmp(pos, change.from) < 0) return pos;
-    if (cmp(pos, change.to) <= 0) return changeEnd(change);
-
-    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
-    if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;
-    return Pos(line, ch);
-  }
-
-  function computeSelAfterChange(doc, change) {
-    var out = [];
-    for (var i = 0; i < doc.sel.ranges.length; i++) {
-      var range = doc.sel.ranges[i];
-      out.push(new Range(adjustForChange(range.anchor, change),
-                         adjustForChange(range.head, change)));
-    }
-    return normalizeSelection(out, doc.sel.primIndex);
-  }
-
-  function offsetPos(pos, old, nw) {
-    if (pos.line == old.line)
-      return Pos(nw.line, pos.ch - old.ch + nw.ch);
-    else
-      return Pos(nw.line + (pos.line - old.line), pos.ch);
-  }
-
-  // Used by replaceSelections to allow moving the selection to the
-  // start or around the replaced test. Hint may be "start" or "around".
-  function computeReplacedSel(doc, changes, hint) {
-    var out = [];
-    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
-    for (var i = 0; i < changes.length; i++) {
-      var change = changes[i];
-      var from = offsetPos(change.from, oldPrev, newPrev);
-      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
-      oldPrev = change.to;
-      newPrev = to;
-      if (hint == "around") {
-        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
-        out[i] = new Range(inv ? to : from, inv ? from : to);
-      } else {
-        out[i] = new Range(from, from);
-      }
-    }
-    return new Selection(out, doc.sel.primIndex);
-  }
-
-  // Allow "beforeChange" event handlers to influence a change
-  function filterChange(doc, change, update) {
-    var obj = {
-      canceled: false,
-      from: change.from,
-      to: change.to,
-      text: change.text,
-      origin: change.origin,
-      cancel: function() { this.canceled = true; }
-    };
-    if (update) obj.update = function(from, to, text, origin) {
-      if (from) this.from = clipPos(doc, from);
-      if (to) this.to = clipPos(doc, to);
-      if (text) this.text = text;
-      if (origin !== undefined) this.origin = origin;
-    };
-    signal(doc, "beforeChange", doc, obj);
-    if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
-
-    if (obj.canceled) return null;
-    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
-  }
-
-  // Apply a change to a document, and add it to the document's
-  // history, and propagating it to all linked documents.
-  function makeChange(doc, change, ignoreReadOnly) {
-    if (doc.cm) {
-      if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);
-      if (doc.cm.state.suppressEdits) return;
-    }
-
-    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
-      change = filterChange(doc, change, true);
-      if (!change) return;
-    }
-
-    // Possibly split or suppress the update based on the presence
-    // of read-only spans in its range.
-    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
-    if (split) {
-      for (var i = split.length - 1; i >= 0; --i)
-        makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});
-    } else {
-      makeChangeInner(doc, change);
-    }
-  }
-
-  function makeChangeInner(doc, change) {
-    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;
-    var selAfter = computeSelAfterChange(doc, change);
-    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
-
-    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
-    var rebased = [];
-
-    linkedDocs(doc, function(doc, sharedHist) {
-      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
-        rebaseHist(doc.history, change);
-        rebased.push(doc.history);
-      }
-      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
-    });
-  }
-
-  // Revert a change stored in a document's history.
-  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
-    if (doc.cm && doc.cm.state.suppressEdits) return;
-
-    var hist = doc.history, event, selAfter = doc.sel;
-    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
-
-    // Verify that there is a useable event (so that ctrl-z won't
-    // needlessly clear selection events)
-    for (var i = 0; i < source.length; i++) {
-      event = source[i];
-      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
-        break;
-    }
-    if (i == source.length) return;
-    hist.lastOrigin = hist.lastSelOrigin = null;
-
-    for (;;) {
-      event = source.pop();
-      if (event.ranges) {
-        pushSelectionToHistory(event, dest);
-        if (allowSelectionOnly && !event.equals(doc.sel)) {
-          setSelection(doc, event, {clearRedo: false});
-          return;
-        }
-        selAfter = event;
-      }
-      else break;
-    }
-
-    // Build up a reverse change object to add to the opposite history
-    // stack (redo when undoing, and vice versa).
-    var antiChanges = [];
-    pushSelectionToHistory(selAfter, dest);
-    dest.push({changes: antiChanges, generation: hist.generation});
-    hist.generation = event.generation || ++hist.maxGeneration;
-
-    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
-
-    for (var i = event.changes.length - 1; i >= 0; --i) {
-      var change = event.changes[i];
-      change.origin = type;
-      if (filter && !filterChange(doc, change, false)) {
-        source.length = 0;
-        return;
-      }
-
-      antiChanges.push(historyChangeFromChange(doc, change));
-
-      var after = i ? computeSelAfterChange(doc, change) : lst(source);
-      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
-      if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
-      var rebased = [];
-
-      // Propagate to the linked documents
-      linkedDocs(doc, function(doc, sharedHist) {
-        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
-          rebaseHist(doc.history, change);
-          rebased.push(doc.history);
-        }
-        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
-      });
-    }
-  }
-
-  // Sub-views need their line numbers shifted when text is added
-  // above or below them in the parent document.
-  function shiftDoc(doc, distance) {
-    if (distance == 0) return;
-    doc.first += distance;
-    doc.sel = new Selection(map(doc.sel.ranges, function(range) {
-      return new Range(Pos(range.anchor.line + distance, range.anchor.ch),
-                       Pos(range.head.line + distance, range.head.ch));
-    }), doc.sel.primIndex);
-    if (doc.cm) {
-      regChange(doc.cm, doc.first, doc.first - distance, distance);
-      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
-        regLineChange(doc.cm, l, "gutter");
-    }
-  }
-
-  // More lower-level change function, handling only a single document
-  // (not linked ones).
-  function makeChangeSingleDoc(doc, change, selAfter, spans) {
-    if (doc.cm && !doc.cm.curOp)
-      return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
-
-    if (change.to.line < doc.first) {
-      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
-      return;
-    }
-    if (change.from.line > doc.lastLine()) return;
-
-    // Clip the change to the size of this doc
-    if (change.from.line < doc.first) {
-      var shift = change.text.length - 1 - (doc.first - change.from.line);
-      shiftDoc(doc, shift);
-      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
-                text: [lst(change.text)], origin: change.origin};
-    }
-    var last = doc.lastLine();
-    if (change.to.line > last) {
-      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
-                text: [change.text[0]], origin: change.origin};
-    }
-
-    change.removed = getBetween(doc, change.from, change.to);
-
-    if (!selAfter) selAfter = computeSelAfterChange(doc, change);
-    if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);
-    else updateDoc(doc, change, spans);
-    setSelectionNoUndo(doc, selAfter, sel_dontScroll);
-  }
-
-  // Handle the interaction of a change to a document with the editor
-  // that this document is part of.
-  function makeChangeSingleDocInEditor(cm, change, spans) {
-    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
-
-    var recomputeMaxLength = false, checkWidthStart = from.line;
-    if (!cm.options.lineWrapping) {
-      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
-      doc.iter(checkWidthStart, to.line + 1, function(line) {
-        if (line == display.maxLine) {
-          recomputeMaxLength = true;
-          return true;
-        }
-      });
-    }
-
-    if (doc.sel.contains(change.from, change.to) > -1)
-      signalCursorActivity(cm);
-
-    updateDoc(doc, change, spans, estimateHeight(cm));
-
-    if (!cm.options.lineWrapping) {
-      doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
-        var len = lineLength(line);
-        if (len > display.maxLineLength) {
-          display.maxLine = line;
-          display.maxLineLength = len;
-          display.maxLineChanged = true;
-          recomputeMaxLength = false;
-        }
-      });
-      if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
-    }
-
-    // Adjust frontier, schedule worker
-    doc.frontier = Math.min(doc.frontier, from.line);
-    startWorker(cm, 400);
-
-    var lendiff = change.text.length - (to.line - from.line) - 1;
-    // Remember that these lines changed, for updating the display
-    if (change.full)
-      regChange(cm);
-    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
-      regLineChange(cm, from.line, "text");
-    else
-      regChange(cm, from.line, to.line + 1, lendiff);
-
-    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
-    if (changeHandler || changesHandler) {
-      var obj = {
-        from: from, to: to,
-        text: change.text,
-        removed: change.removed,
-        origin: change.origin
-      };
-      if (changeHandler) signalLater(cm, "change", cm, obj);
-      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
-    }
-    cm.display.selForContextMenu = null;
-  }
-
-  function replaceRange(doc, code, from, to, origin) {
-    if (!to) to = from;
-    if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
-    if (typeof code == "string") code = doc.splitLines(code);
-    makeChange(doc, {from: from, to: to, text: code, origin: origin});
-  }
-
-  // SCROLLING THINGS INTO VIEW
-
-  // If an editor sits on the top or bottom of the window, partially
-  // scrolled out of view, this ensures that the cursor is visible.
-  function maybeScrollWindow(cm, coords) {
-    if (signalDOMEvent(cm, "scrollCursorIntoView")) return;
-
-    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
-    if (coords.top + box.top < 0) doScroll = true;
-    else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
-    if (doScroll != null && !phantom) {
-      var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
-                           (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +
-                           (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px; left: " +
-                           coords.left + "px; width: 2px;");
-      cm.display.lineSpace.appendChild(scrollNode);
-      scrollNode.scrollIntoView(doScroll);
-      cm.display.lineSpace.removeChild(scrollNode);
-    }
-  }
-
-  // Scroll a given position into view (immediately), verifying that
-  // it actually became visible (as line heights are accurately
-  // measured, the position of something may 'drift' during drawing).
-  function scrollPosIntoView(cm, pos, end, margin) {
-    if (margin == null) margin = 0;
-    for (var limit = 0; limit < 5; limit++) {
-      var changed = false, coords = cursorCoords(cm, pos);
-      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
-      var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
-                                         Math.min(coords.top, endCoords.top) - margin,
-                                         Math.max(coords.left, endCoords.left),
-                                         Math.max(coords.bottom, endCoords.bottom) + margin);
-      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
-      if (scrollPos.scrollTop != null) {
-        setScrollTop(cm, scrollPos.scrollTop);
-        if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
-      }
-      if (scrollPos.scrollLeft != null) {
-        setScrollLeft(cm, scrollPos.scrollLeft);
-        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
-      }
-      if (!changed) break;
-    }
-    return coords;
-  }
-
-  // Scroll a given set of coordinates into view (immediately).
-  function scrollIntoView(cm, x1, y1, x2, y2) {
-    var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
-    if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
-    if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
-  }
-
-  // Calculate a new scroll position needed to scroll the given
-  // rectangle into view. Returns an object with scrollTop and
-  // scrollLeft properties. When these are undefined, the
-  // vertical/horizontal position does not need to be adjusted.
-  function calculateScrollPos(cm, x1, y1, x2, y2) {
-    var display = cm.display, snapMargin = textHeight(cm.display);
-    if (y1 < 0) y1 = 0;
-    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
-    var screen = displayHeight(cm), result = {};
-    if (y2 - y1 > screen) y2 = y1 + screen;
-    var docBottom = cm.doc.height + paddingVert(display);
-    var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
-    if (y1 < screentop) {
-      result.scrollTop = atTop ? 0 : y1;
-    } else if (y2 > screentop + screen) {
-      var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
-      if (newTop != screentop) result.scrollTop = newTop;
-    }
-
-    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
-    var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0);
-    var tooWide = x2 - x1 > screenw;
-    if (tooWide) x2 = x1 + screenw;
-    if (x1 < 10)
-      result.scrollLeft = 0;
-    else if (x1 < screenleft)
-      result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
-    else if (x2 > screenw + screenleft - 3)
-      result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
-    return result;
-  }
-
-  // Store a relative adjustment to the scroll position in the current
-  // operation (to be applied when the operation finishes).
-  function addToScrollPos(cm, left, top) {
-    if (left != null || top != null) resolveScrollToPos(cm);
-    if (left != null)
-      cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;
-    if (top != null)
-      cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
-  }
-
-  // Make sure that at the end of the operation the current cursor is
-  // shown.
-  function ensureCursorVisible(cm) {
-    resolveScrollToPos(cm);
-    var cur = cm.getCursor(), from = cur, to = cur;
-    if (!cm.options.lineWrapping) {
-      from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;
-      to = Pos(cur.line, cur.ch + 1);
-    }
-    cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};
-  }
-
-  // When an operation has its scrollToPos property set, and another
-  // scroll action is applied before the end of the operation, this
-  // 'simulates' scrolling that position into view in a cheap way, so
-  // that the effect of intermediate scroll commands is not ignored.
-  function resolveScrollToPos(cm) {
-    var range = cm.curOp.scrollToPos;
-    if (range) {
-      cm.curOp.scrollToPos = null;
-      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
-      var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),
-                                    Math.min(from.top, to.top) - range.margin,
-                                    Math.max(from.right, to.right),
-                                    Math.max(from.bottom, to.bottom) + range.margin);
-      cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);
-    }
-  }
-
-  // API UTILITIES
-
-  // Indent the given line. The how parameter can be "smart",
-  // "add"/null, "subtract", or "prev". When aggressive is false
-  // (typically set to true for forced single-line indents), empty
-  // lines are not indented, and places where the mode returns Pass
-  // are left alone.
-  function indentLine(cm, n, how, aggressive) {
-    var doc = cm.doc, state;
-    if (how == null) how = "add";
-    if (how == "smart") {
-      // Fall back to "prev" when the mode doesn't have an indentation
-      // method.
-      if (!doc.mode.indent) how = "prev";
-      else state = getStateBefore(cm, n);
-    }
-
-    var tabSize = cm.options.tabSize;
-    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
-    if (line.stateAfter) line.stateAfter = null;
-    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
-    if (!aggressive && !/\S/.test(line.text)) {
-      indentation = 0;
-      how = "not";
-    } else if (how == "smart") {
-      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
-      if (indentation == Pass || indentation > 150) {
-        if (!aggressive) return;
-        how = "prev";
-      }
-    }
-    if (how == "prev") {
-      if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
-      else indentation = 0;
-    } else if (how == "add") {
-      indentation = curSpace + cm.options.indentUnit;
-    } else if (how == "subtract") {
-      indentation = curSpace - cm.options.indentUnit;
-    } else if (typeof how == "number") {
-      indentation = curSpace + how;
-    }
-    indentation = Math.max(0, indentation);
-
-    var indentString = "", pos = 0;
-    if (cm.options.indentWithTabs)
-      for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
-    if (pos < indentation) indentString += spaceStr(indentation - pos);
-
-    if (indentString != curSpaceString) {
-      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
-      line.stateAfter = null;
-      return true;
-    } else {
-      // Ensure that, if the cursor was in the whitespace at the start
-      // of the line, it is moved to the end of that space.
-      for (var i = 0; i < doc.sel.ranges.length; i++) {
-        var range = doc.sel.ranges[i];
-        if (range.head.line == n && range.head.ch < curSpaceString.length) {
-          var pos = Pos(n, curSpaceString.length);
-          replaceOneSelection(doc, i, new Range(pos, pos));
-          break;
-        }
-      }
-    }
-  }
-
-  // Utility for applying a change to a line by handle or number,
-  // returning the number and optionally registering the line as
-  // changed.
-  function changeLine(doc, handle, changeType, op) {
-    var no = handle, line = handle;
-    if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
-    else no = lineNo(handle);
-    if (no == null) return null;
-    if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);
-    return line;
-  }
-
-  // Helper for deleting text near the selection(s), used to implement
-  // backspace, delete, and similar functionality.
-  function deleteNearSelection(cm, compute) {
-    var ranges = cm.doc.sel.ranges, kill = [];
-    // Build up a set of ranges to kill first, merging overlapping
-    // ranges.
-    for (var i = 0; i < ranges.length; i++) {
-      var toKill = compute(ranges[i]);
-      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
-        var replaced = kill.pop();
-        if (cmp(replaced.from, toKill.from) < 0) {
-          toKill.from = replaced.from;
-          break;
-        }
-      }
-      kill.push(toKill);
-    }
-    // Next, remove those actual ranges.
-    runInOp(cm, function() {
-      for (var i = kill.length - 1; i >= 0; i--)
-        replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");
-      ensureCursorVisible(cm);
-    });
-  }
-
-  // Used for horizontal relative motion. Dir is -1 or 1 (left or
-  // right), unit can be "char", "column" (like char, but doesn't
-  // cross line boundaries), "word" (across next word), or "group" (to
-  // the start of next group of word or non-word-non-whitespace
-  // chars). The visually param controls whether, in right-to-left
-  // text, direction 1 means to move towards the next index in the
-  // string, or towards the character to the right of the current
-  // position. The resulting position will have a hitSide=true
-  // property if it reached the end of the document.
-  function findPosH(doc, pos, dir, unit, visually) {
-    var line = pos.line, ch = pos.ch, origDir = dir;
-    var lineObj = getLine(doc, line);
-    function findNextLine() {
-      var l = line + dir;
-      if (l < doc.first || l >= doc.first + doc.size) return false
-      line = l;
-      return lineObj = getLine(doc, l);
-    }
-    function moveOnce(boundToLine) {
-      var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
-      if (next == null) {
-        if (!boundToLine && findNextLine()) {
-          if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
-          else ch = dir < 0 ? lineObj.text.length : 0;
-        } else return false
-      } else ch = next;
-      return true;
-    }
-
-    if (unit == "char") {
-      moveOnce()
-    } else if (unit == "column") {
-      moveOnce(true)
-    } else if (unit == "word" || unit == "group") {
-      var sawType = null, group = unit == "group";
-      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
-      for (var first = true;; first = false) {
-        if (dir < 0 && !moveOnce(!first)) break;
-        var cur = lineObj.text.charAt(ch) || "\n";
-        var type = isWordChar(cur, helper) ? "w"
-          : group && cur == "\n" ? "n"
-          : !group || /\s/.test(cur) ? null
-          : "p";
-        if (group && !first && !type) type = "s";
-        if (sawType && sawType != type) {
-          if (dir < 0) {dir = 1; moveOnce();}
-          break;
-        }
-
-        if (type) sawType = type;
-        if (dir > 0 && !moveOnce(!first)) break;
-      }
-    }
-    var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true);
-    if (!cmp(pos, result)) result.hitSide = true;
-    return result;
-  }
-
-  // For relative vertical movement. Dir may be -1 or 1. Unit can be
-  // "page" or "line". The resulting position will have a hitSide=true
-  // property if it reached the end of the document.
-  function findPosV(cm, pos, dir, unit) {
-    var doc = cm.doc, x = pos.left, y;
-    if (unit == "page") {
-      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
-      y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
-    } else if (unit == "line") {
-      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
-    }
-    for (;;) {
-      var target = coordsChar(cm, x, y);
-      if (!target.outside) break;
-      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
-      y += dir * 5;
-    }
-    return target;
-  }
-
-  // EDITOR METHODS
-
-  // The publicly visible API. Note that methodOp(f) means
-  // 'wrap f in an operation, performed on its `this` parameter'.
-
-  // This is not the complete set of editor methods. Most of the
-  // methods defined on the Doc type are also injected into
-  // CodeMirror.prototype, for backwards compatibility and
-  // convenience.
-
-  CodeMirror.prototype = {
-    constructor: CodeMirror,
-    focus: function(){window.focus(); this.display.input.focus();},
-
-    setOption: function(option, value) {
-      var options = this.options, old = options[option];
-      if (options[option] == value && option != "mode") return;
-      options[option] = value;
-      if (optionHandlers.hasOwnProperty(option))
-        operation(this, optionHandlers[option])(this, value, old);
-    },
-
-    getOption: function(option) {return this.options[option];},
-    getDoc: function() {return this.doc;},
-
-    addKeyMap: function(map, bottom) {
-      this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
-    },
-    removeKeyMap: function(map) {
-      var maps = this.state.keyMaps;
-      for (var i = 0; i < maps.length; ++i)
-        if (maps[i] == map || maps[i].name == map) {
-          maps.splice(i, 1);
-          return true;
-        }
-    },
-
-    addOverlay: methodOp(function(spec, options) {
-      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
-      if (mode.startState) throw new Error("Overlays may not be stateful.");
-      this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
-      this.state.modeGen++;
-      regChange(this);
-    }),
-    removeOverlay: methodOp(function(spec) {
-      var overlays = this.state.overlays;
-      for (var i = 0; i < overlays.length; ++i) {
-        var cur = overlays[i].modeSpec;
-        if (cur == spec || typeof spec == "string" && cur.name == spec) {
-          overlays.splice(i, 1);
-          this.state.modeGen++;
-          regChange(this);
-          return;
-        }
-      }
-    }),
-
-    indentLine: methodOp(function(n, dir, aggressive) {
-      if (typeof dir != "string" && typeof dir != "number") {
-        if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
-        else dir = dir ? "add" : "subtract";
-      }
-      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
-    }),
-    indentSelection: methodOp(function(how) {
-      var ranges = this.doc.sel.ranges, end = -1;
-      for (var i = 0; i < ranges.length; i++) {
-        var range = ranges[i];
-        if (!range.empty()) {
-          var from = range.from(), to = range.to();
-          var start = Math.max(end, from.line);
-          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
-          for (var j = start; j < end; ++j)
-            indentLine(this, j, how);
-          var newRanges = this.doc.sel.ranges;
-          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
-            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
-        } else if (range.head.line > end) {
-          indentLine(this, range.head.line, how, true);
-          end = range.head.line;
-          if (i == this.doc.sel.primIndex) ensureCursorVisible(this);
-        }
-      }
-    }),
-
-    // Fetch the parser token for a given character. Useful for hacks
-    // that want to inspect the mode state (say, for completion).
-    getTokenAt: function(pos, precise) {
-      return takeToken(this, pos, precise);
-    },
-
-    getLineTokens: function(line, precise) {
-      return takeToken(this, Pos(line), precise, true);
-    },
-
-    getTokenTypeAt: function(pos) {
-      pos = clipPos(this.doc, pos);
-      var styles = getLineStyles(this, getLine(this.doc, pos.line));
-      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
-      var type;
-      if (ch == 0) type = styles[2];
-      else for (;;) {
-        var mid = (before + after) >> 1;
-        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
-        else if (styles[mid * 2 + 1] < ch) before = mid + 1;
-        else { type = styles[mid * 2 + 2]; break; }
-      }
-      var cut = type ? type.indexOf("cm-overlay ") : -1;
-      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
-    },
-
-    getModeAt: function(pos) {
-      var mode = this.doc.mode;
-      if (!mode.innerMode) return mode;
-      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
-    },
-
-    getHelper: function(pos, type) {
-      return this.getHelpers(pos, type)[0];
-    },
-
-    getHelpers: function(pos, type) {
-      var found = [];
-      if (!helpers.hasOwnProperty(type)) return found;
-      var help = helpers[type], mode = this.getModeAt(pos);
-      if (typeof mode[type] == "string") {
-        if (help[mode[type]]) found.push(help[mode[type]]);
-      } else if (mode[type]) {
-        for (var i = 0; i < mode[type].length; i++) {
-          var val = help[mode[type][i]];
-          if (val) found.push(val);
-        }
-      } else if (mode.helperType && help[mode.helperType]) {
-        found.push(help[mode.helperType]);
-      } else if (help[mode.name]) {
-        found.push(help[mode.name]);
-      }
-      for (var i = 0; i < help._global.length; i++) {
-        var cur = help._global[i];
-        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
-          found.push(cur.val);
-      }
-      return found;
-    },
-
-    getStateAfter: function(line, precise) {
-      var doc = this.doc;
-      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
-      return getStateBefore(this, line + 1, precise);
-    },
-
-    cursorCoords: function(start, mode) {
-      var pos, range = this.doc.sel.primary();
-      if (start == null) pos = range.head;
-      else if (typeof start == "object") pos = clipPos(this.doc, start);
-      else pos = start ? range.from() : range.to();
-      return cursorCoords(this, pos, mode || "page");
-    },
-
-    charCoords: function(pos, mode) {
-      return charCoords(this, clipPos(this.doc, pos), mode || "page");
-    },
-
-    coordsChar: function(coords, mode) {
-      coords = fromCoordSystem(this, coords, mode || "page");
-      return coordsChar(this, coords.left, coords.top);
-    },
-
-    lineAtHeight: function(height, mode) {
-      height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
-      return lineAtHeight(this.doc, height + this.display.viewOffset);
-    },
-    heightAtLine: function(line, mode) {
-      var end = false, lineObj;
-      if (typeof line == "number") {
-        var last = this.doc.first + this.doc.size - 1;
-        if (line < this.doc.first) line = this.doc.first;
-        else if (line > last) { line = last; end = true; }
-        lineObj = getLine(this.doc, line);
-      } else {
-        lineObj = line;
-      }
-      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +
-        (end ? this.doc.height - heightAtLine(lineObj) : 0);
-    },
-
-    defaultTextHeight: function() { return textHeight(this.display); },
-    defaultCharWidth: function() { return charWidth(this.display); },
-
-    setGutterMarker: methodOp(function(line, gutterID, value) {
-      return changeLine(this.doc, line, "gutter", function(line) {
-        var markers = line.gutterMarkers || (line.gutterMarkers = {});
-        markers[gutterID] = value;
-        if (!value && isEmpty(markers)) line.gutterMarkers = null;
-        return true;
-      });
-    }),
-
-    clearGutter: methodOp(function(gutterID) {
-      var cm = this, doc = cm.doc, i = doc.first;
-      doc.iter(function(line) {
-        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
-          line.gutterMarkers[gutterID] = null;
-          regLineChange(cm, i, "gutter");
-          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
-        }
-        ++i;
-      });
-    }),
-
-    lineInfo: function(line) {
-      if (typeof line == "number") {
-        if (!isLine(this.doc, line)) return null;
-        var n = line;
-        line = getLine(this.doc, line);
-        if (!line) return null;
-      } else {
-        var n = lineNo(line);
-        if (n == null) return null;
-      }
-      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
-              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
-              widgets: line.widgets};
-    },
-
-    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},
-
-    addWidget: function(pos, node, scroll, vert, horiz) {
-      var display = this.display;
-      pos = cursorCoords(this, clipPos(this.doc, pos));
-      var top = pos.bottom, left = pos.left;
-      node.style.position = "absolute";
-      node.setAttribute("cm-ignore-events", "true");
-      this.display.input.setUneditable(node);
-      display.sizer.appendChild(node);
-      if (vert == "over") {
-        top = pos.top;
-      } else if (vert == "above" || vert == "near") {
-        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
-        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
-        // Default to positioning above (if specified and possible); otherwise default to positioning below
-        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
-          top = pos.top - node.offsetHeight;
-        else if (pos.bottom + node.offsetHeight <= vspace)
-          top = pos.bottom;
-        if (left + node.offsetWidth > hspace)
-          left = hspace - node.offsetWidth;
-      }
-      node.style.top = top + "px";
-      node.style.left = node.style.right = "";
-      if (horiz == "right") {
-        left = display.sizer.clientWidth - node.offsetWidth;
-        node.style.right = "0px";
-      } else {
-        if (horiz == "left") left = 0;
-        else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
-        node.style.left = left + "px";
-      }
-      if (scroll)
-        scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
-    },
-
-    triggerOnKeyDown: methodOp(onKeyDown),
-    triggerOnKeyPress: methodOp(onKeyPress),
-    triggerOnKeyUp: onKeyUp,
-
-    execCommand: function(cmd) {
-      if (commands.hasOwnProperty(cmd))
-        return commands[cmd].call(null, this);
-    },
-
-    triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
-
-    findPosH: function(from, amount, unit, visually) {
-      var dir = 1;
-      if (amount < 0) { dir = -1; amount = -amount; }
-      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
-        cur = findPosH(this.doc, cur, dir, unit, visually);
-        if (cur.hitSide) break;
-      }
-      return cur;
-    },
-
-    moveH: methodOp(function(dir, unit) {
-      var cm = this;
-      cm.extendSelectionsBy(function(range) {
-        if (cm.display.shift || cm.doc.extend || range.empty())
-          return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);
-        else
-          return dir < 0 ? range.from() : range.to();
-      }, sel_move);
-    }),
-
-    deleteH: methodOp(function(dir, unit) {
-      var sel = this.doc.sel, doc = this.doc;
-      if (sel.somethingSelected())
-        doc.replaceSelection("", null, "+delete");
-      else
-        deleteNearSelection(this, function(range) {
-          var other = findPosH(doc, range.head, dir, unit, false);
-          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};
-        });
-    }),
-
-    findPosV: function(from, amount, unit, goalColumn) {
-      var dir = 1, x = goalColumn;
-      if (amount < 0) { dir = -1; amount = -amount; }
-      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
-        var coords = cursorCoords(this, cur, "div");
-        if (x == null) x = coords.left;
-        else coords.left = x;
-        cur = findPosV(this, coords, dir, unit);
-        if (cur.hitSide) break;
-      }
-      return cur;
-    },
-
-    moveV: methodOp(function(dir, unit) {
-      var cm = this, doc = this.doc, goals = [];
-      var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();
-      doc.extendSelectionsBy(function(range) {
-        if (collapse)
-          return dir < 0 ? range.from() : range.to();
-        var headPos = cursorCoords(cm, range.head, "div");
-        if (range.goalColumn != null) headPos.left = range.goalColumn;
-        goals.push(headPos.left);
-        var pos = findPosV(cm, headPos, dir, unit);
-        if (unit == "page" && range == doc.sel.primary())
-          addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);
-        return pos;
-      }, sel_move);
-      if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)
-        doc.sel.ranges[i].goalColumn = goals[i];
-    }),
-
-    // Find the word at the given position (as returned by coordsChar).
-    findWordAt: function(pos) {
-      var doc = this.doc, line = getLine(doc, pos.line).text;
-      var start = pos.ch, end = pos.ch;
-      if (line) {
-        var helper = this.getHelper(pos, "wordChars");
-        if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
-        var startChar = line.charAt(start);
-        var check = isWordChar(startChar, helper)
-          ? function(ch) { return isWordChar(ch, helper); }
-          : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
-          : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
-        while (start > 0 && check(line.charAt(start - 1))) --start;
-        while (end < line.length && check(line.charAt(end))) ++end;
-      }
-      return new Range(Pos(pos.line, start), Pos(pos.line, end));
-    },
-
-    toggleOverwrite: function(value) {
-      if (value != null && value == this.state.overwrite) return;
-      if (this.state.overwrite = !this.state.overwrite)
-        addClass(this.display.cursorDiv, "CodeMirror-overwrite");
-      else
-        rmClass(this.display.cursorDiv, "CodeMirror-overwrite");
-
-      signal(this, "overwriteToggle", this, this.state.overwrite);
-    },
-    hasFocus: function() { return this.display.input.getField() == activeElt(); },
-    isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit); },
-
-    scrollTo: methodOp(function(x, y) {
-      if (x != null || y != null) resolveScrollToPos(this);
-      if (x != null) this.curOp.scrollLeft = x;
-      if (y != null) this.curOp.scrollTop = y;
-    }),
-    getScrollInfo: function() {
-      var scroller = this.display.scroller;
-      return {left: scroller.scrollLeft, top: scroller.scrollTop,
-              height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
-              width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
-              clientHeight: displayHeight(this), clientWidth: displayWidth(this)};
-    },
-
-    scrollIntoView: methodOp(function(range, margin) {
-      if (range == null) {
-        range = {from: this.doc.sel.primary().head, to: null};
-        if (margin == null) margin = this.options.cursorScrollMargin;
-      } else if (typeof range == "number") {
-        range = {from: Pos(range, 0), to: null};
-      } else if (range.from == null) {
-        range = {from: range, to: null};
-      }
-      if (!range.to) range.to = range.from;
-      range.margin = margin || 0;
-
-      if (range.from.line != null) {
-        resolveScrollToPos(this);
-        this.curOp.scrollToPos = range;
-      } else {
-        var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),
-                                      Math.min(range.from.top, range.to.top) - range.margin,
-                                      Math.max(range.from.right, range.to.right),
-                                      Math.max(range.from.bottom, range.to.bottom) + range.margin);
-        this.scrollTo(sPos.scrollLeft, sPos.scrollTop);
-      }
-    }),
-
-    setSize: methodOp(function(width, height) {
-      var cm = this;
-      function interpret(val) {
-        return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
-      }
-      if (width != null) cm.display.wrapper.style.width = interpret(width);
-      if (height != null) cm.display.wrapper.style.height = interpret(height);
-      if (cm.options.lineWrapping) clearLineMeasurementCache(this);
-      var lineNo = cm.display.viewFrom;
-      cm.doc.iter(lineNo, cm.display.viewTo, function(line) {
-        if (line.widgets) for (var i = 0; i < line.widgets.length; i++)
-          if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }
-        ++lineNo;
-      });
-      cm.curOp.forceUpdate = true;
-      signal(cm, "refresh", this);
-    }),
-
-    operation: function(f){return runInOp(this, f);},
-
-    refresh: methodOp(function() {
-      var oldHeight = this.display.cachedTextHeight;
-      regChange(this);
-      this.curOp.forceUpdate = true;
-      clearCaches(this);
-      this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
-      updateGutterSpace(this);
-      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
-        estimateLineHeights(this);
-      signal(this, "refresh", this);
-    }),
-
-    swapDoc: methodOp(function(doc) {
-      var old = this.doc;
-      old.cm = null;
-      attachDoc(this, doc);
-      clearCaches(this);
-      this.display.input.reset();
-      this.scrollTo(doc.scrollLeft, doc.scrollTop);
-      this.curOp.forceScroll = true;
-      signalLater(this, "swapDoc", this, old);
-      return old;
-    }),
-
-    getInputField: function(){return this.display.input.getField();},
-    getWrapperElement: function(){return this.display.wrapper;},
-    getScrollerElement: function(){return this.display.scroller;},
-    getGutterElement: function(){return this.display.gutters;}
-  };
-  eventMixin(CodeMirror);
-
-  // OPTION DEFAULTS
-
-  // The default configuration options.
-  var defaults = CodeMirror.defaults = {};
-  // Functions to run when options are changed.
-  var optionHandlers = CodeMirror.optionHandlers = {};
-
-  function option(name, deflt, handle, notOnInit) {
-    CodeMirror.defaults[name] = deflt;
-    if (handle) optionHandlers[name] =
-      notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
-  }
-
-  // Passed to option handlers when there is no old value.
-  var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
-
-  // These two are, on init, called from the constructor because they
-  // have to be initialized before the editor can start at all.
-  option("value", "", function(cm, val) {
-    cm.setValue(val);
-  }, true);
-  option("mode", null, function(cm, val) {
-    cm.doc.modeOption = val;
-    loadMode(cm);
-  }, true);
-
-  option("indentUnit", 2, loadMode, true);
-  option("indentWithTabs", false);
-  option("smartIndent", true);
-  option("tabSize", 4, function(cm) {
-    resetModeState(cm);
-    clearCaches(cm);
-    regChange(cm);
-  }, true);
-  option("lineSeparator", null, function(cm, val) {
-    cm.doc.lineSep = val;
-    if (!val) return;
-    var newBreaks = [], lineNo = cm.doc.first;
-    cm.doc.iter(function(line) {
-      for (var pos = 0;;) {
-        var found = line.text.indexOf(val, pos);
-        if (found == -1) break;
-        pos = found + val.length;
-        newBreaks.push(Pos(lineNo, found));
-      }
-      lineNo++;
-    });
-    for (var i = newBreaks.length - 1; i >= 0; i--)
-      replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length))
-  });
-  option("specialChars", /[\u0000-\u001f\u007f\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val, old) {
-    cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
-    if (old != CodeMirror.Init) cm.refresh();
-  });
-  option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
-  option("electricChars", true);
-  option("inputStyle", mobile ? "contenteditable" : "textarea", function() {
-    throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME
-  }, true);
-  option("rtlMoveVisually", !windows);
-  option("wholeLineUpdateBefore", true);
-
-  option("theme", "default", function(cm) {
-    themeChanged(cm);
-    guttersChanged(cm);
-  }, true);
-  option("keyMap", "default", function(cm, val, old) {
-    var next = getKeyMap(val);
-    var prev = old != CodeMirror.Init && getKeyMap(old);
-    if (prev && prev.detach) prev.detach(cm, next);
-    if (next.attach) next.attach(cm, prev || null);
-  });
-  option("extraKeys", null);
-
-  option("lineWrapping", false, wrappingChanged, true);
-  option("gutters", [], function(cm) {
-    setGuttersForLineNumbers(cm.options);
-    guttersChanged(cm);
-  }, true);
-  option("fixedGutter", true, function(cm, val) {
-    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
-    cm.refresh();
-  }, true);
-  option("coverGutterNextToScrollbar", false, function(cm) {updateScrollbars(cm);}, true);
-  option("scrollbarStyle", "native", function(cm) {
-    initScrollbars(cm);
-    updateScrollbars(cm);
-    cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
-    cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
-  }, true);
-  option("lineNumbers", false, function(cm) {
-    setGuttersForLineNumbers(cm.options);
-    guttersChanged(cm);
-  }, true);
-  option("firstLineNumber", 1, guttersChanged, true);
-  option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
-  option("showCursorWhenSelecting", false, updateSelection, true);
-
-  option("resetSelectionOnContextMenu", true);
-  option("lineWiseCopyCut", true);
-
-  option("readOnly", false, function(cm, val) {
-    if (val == "nocursor") {
-      onBlur(cm);
-      cm.display.input.blur();
-      cm.display.disabled = true;
-    } else {
-      cm.display.disabled = false;
-    }
-    cm.display.input.readOnlyChanged(val)
-  });
-  option("disableInput", false, function(cm, val) {if (!val) cm.display.input.reset();}, true);
-  option("dragDrop", true, dragDropChanged);
-  option("allowDropFileTypes", null);
-
-  option("cursorBlinkRate", 530);
-  option("cursorScrollMargin", 0);
-  option("cursorHeight", 1, updateSelection, true);
-  option("singleCursorHeightPerLine", true, updateSelection, true);
-  option("workTime", 100);
-  option("workDelay", 100);
-  option("flattenSpans", true, resetModeState, true);
-  option("addModeClass", false, resetModeState, true);
-  option("pollInterval", 100);
-  option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});
-  option("historyEventDelay", 1250);
-  option("viewportMargin", 10, function(cm){cm.refresh();}, true);
-  option("maxHighlightLength", 10000, resetModeState, true);
-  option("moveInputWithCursor", true, function(cm, val) {
-    if (!val) cm.display.input.resetPosition();
-  });
-
-  option("tabindex", null, function(cm, val) {
-    cm.display.input.getField().tabIndex = val || "";
-  });
-  option("autofocus", null);
-
-  // MODE DEFINITION AND QUERYING
-
-  // Known modes, by name and by MIME
-  var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
-
-  // Extra arguments are stored as the mode's dependencies, which is
-  // used by (legacy) mechanisms like loadmode.js to automatically
-  // load a mode. (Preferred mechanism is the require/define calls.)
-  CodeMirror.defineMode = function(name, mode) {
-    if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
-    if (arguments.length > 2)
-      mode.dependencies = Array.prototype.slice.call(arguments, 2);
-    modes[name] = mode;
-  };
-
-  CodeMirror.defineMIME = function(mime, spec) {
-    mimeModes[mime] = spec;
-  };
-
-  // Given a MIME type, a {name, ...options} config object, or a name
-  // string, return a mode config object.
-  CodeMirror.resolveMode = function(spec) {
-    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
-      spec = mimeModes[spec];
-    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
-      var found = mimeModes[spec.name];
-      if (typeof found == "string") found = {name: found};
-      spec = createObj(found, spec);
-      spec.name = found.name;
-    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
-      return CodeMirror.resolveMode("application/xml");
-    }
-    if (typeof spec == "string") return {name: spec};
-    else return spec || {name: "null"};
-  };
-
-  // Given a mode spec (anything that resolveMode accepts), find and
-  // initialize an actual mode object.
-  CodeMirror.getMode = function(options, spec) {
-    var spec = CodeMirror.resolveMode(spec);
-    var mfactory = modes[spec.name];
-    if (!mfactory) return CodeMirror.getMode(options, "text/plain");
-    var modeObj = mfactory(options, spec);
-    if (modeExtensions.hasOwnProperty(spec.name)) {
-      var exts = modeExtensions[spec.name];
-      for (var prop in exts) {
-        if (!exts.hasOwnProperty(prop)) continue;
-        if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
-        modeObj[prop] = exts[prop];
-      }
-    }
-    modeObj.name = spec.name;
-    if (spec.helperType) modeObj.helperType = spec.helperType;
-    if (spec.modeProps) for (var prop in spec.modeProps)
-      modeObj[prop] = spec.modeProps[prop];
-
-    return modeObj;
-  };
-
-  // Minimal default mode.
-  CodeMirror.defineMode("null", function() {
-    return {token: function(stream) {stream.skipToEnd();}};
-  });
-  CodeMirror.defineMIME("text/plain", "null");
-
-  // This can be used to attach properties to mode objects from
-  // outside the actual mode definition.
-  var modeExtensions = CodeMirror.modeExtensions = {};
-  CodeMirror.extendMode = function(mode, properties) {
-    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
-    copyObj(properties, exts);
-  };
-
-  // EXTENSIONS
-
-  CodeMirror.defineExtension = function(name, func) {
-    CodeMirror.prototype[name] = func;
-  };
-  CodeMirror.defineDocExtension = function(name, func) {
-    Doc.prototype[name] = func;
-  };
-  CodeMirror.defineOption = option;
-
-  var initHooks = [];
-  CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
-
-  var helpers = CodeMirror.helpers = {};
-  CodeMirror.registerHelper = function(type, name, value) {
-    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
-    helpers[type][name] = value;
-  };
-  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
-    CodeMirror.registerHelper(type, name, value);
-    helpers[type]._global.push({pred: predicate, val: value});
-  };
-
-  // MODE STATE HANDLING
-
-  // Utility functions for working with state. Exported because nested
-  // modes need to do this for their inner modes.
-
-  var copyState = CodeMirror.copyState = function(mode, state) {
-    if (state === true) return state;
-    if (mode.copyState) return mode.copyState(state);
-    var nstate = {};
-    for (var n in state) {
-      var val = state[n];
-      if (val instanceof Array) val = val.concat([]);
-      nstate[n] = val;
-    }
-    return nstate;
-  };
-
-  var startState = CodeMirror.startState = function(mode, a1, a2) {
-    return mode.startState ? mode.startState(a1, a2) : true;
-  };
-
-  // Given a mode and a state (for that mode), find the inner mode and
-  // state at the position that the state refers to.
-  CodeMirror.innerMode = function(mode, state) {
-    while (mode.innerMode) {
-      var info = mode.innerMode(state);
-      if (!info || info.mode == mode) break;
-      state = info.state;
-      mode = info.mode;
-    }
-    return info || {mode: mode, state: state};
-  };
-
-  // STANDARD COMMANDS
-
-  // Commands are parameter-less actions that can be performed on an
-  // editor, mostly used for keybindings.
-  var commands = CodeMirror.commands = {
-    selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},
-    singleSelection: function(cm) {
-      cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);
-    },
-    killLine: function(cm) {
-      deleteNearSelection(cm, function(range) {
-        if (range.empty()) {
-          var len = getLine(cm.doc, range.head.line).text.length;
-          if (range.head.ch == len && range.head.line < cm.lastLine())
-            return {from: range.head, to: Pos(range.head.line + 1, 0)};
-          else
-            return {from: range.head, to: Pos(range.head.line, len)};
-        } else {
-          return {from: range.from(), to: range.to()};
-        }
-      });
-    },
-    deleteLine: function(cm) {
-      deleteNearSelection(cm, function(range) {
-        return {from: Pos(range.from().line, 0),
-                to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};
-      });
-    },
-    delLineLeft: function(cm) {
-      deleteNearSelection(cm, function(range) {
-        return {from: Pos(range.from().line, 0), to: range.from()};
-      });
-    },
-    delWrappedLineLeft: function(cm) {
-      deleteNearSelection(cm, function(range) {
-        var top = cm.charCoords(range.head, "div").top + 5;
-        var leftPos = cm.coordsChar({left: 0, top: top}, "div");
-        return {from: leftPos, to: range.from()};
-      });
-    },
-    delWrappedLineRight: function(cm) {
-      deleteNearSelection(cm, function(range) {
-        var top = cm.charCoords(range.head, "div").top + 5;
-        var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
-        return {from: range.from(), to: rightPos };
-      });
-    },
-    undo: function(cm) {cm.undo();},
-    redo: function(cm) {cm.redo();},
-    undoSelection: function(cm) {cm.undoSelection();},
-    redoSelection: function(cm) {cm.redoSelection();},
-    goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
-    goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
-    goLineStart: function(cm) {
-      cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },
-                            {origin: "+move", bias: 1});
-    },
-    goLineStartSmart: function(cm) {
-      cm.extendSelectionsBy(function(range) {
-        return lineStartSmart(cm, range.head);
-      }, {origin: "+move", bias: 1});
-    },
-    goLineEnd: function(cm) {
-      cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },
-                            {origin: "+move", bias: -1});
-    },
-    goLineRight: function(cm) {
-      cm.extendSelectionsBy(function(range) {
-        var top = cm.charCoords(range.head, "div").top + 5;
-        return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
-      }, sel_move);
-    },
-    goLineLeft: function(cm) {
-      cm.extendSelectionsBy(function(range) {
-        var top = cm.charCoords(range.head, "div").top + 5;
-        return cm.coordsChar({left: 0, top: top}, "div");
-      }, sel_move);
-    },
-    goLineLeftSmart: function(cm) {
-      cm.extendSelectionsBy(function(range) {
-        var top = cm.charCoords(range.head, "div").top + 5;
-        var pos = cm.coordsChar({left: 0, top: top}, "div");
-        if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
-        return pos;
-      }, sel_move);
-    },
-    goLineUp: function(cm) {cm.moveV(-1, "line");},
-    goLineDown: function(cm) {cm.moveV(1, "line");},
-    goPageUp: function(cm) {cm.moveV(-1, "page");},
-    goPageDown: function(cm) {cm.moveV(1, "page");},
-    goCharLeft: function(cm) {cm.moveH(-1, "char");},
-    goCharRight: function(cm) {cm.moveH(1, "char");},
-    goColumnLeft: function(cm) {cm.moveH(-1, "column");},
-    goColumnRight: function(cm) {cm.moveH(1, "column");},
-    goWordLeft: function(cm) {cm.moveH(-1, "word");},
-    goGroupRight: function(cm) {cm.moveH(1, "group");},
-    goGroupLeft: function(cm) {cm.moveH(-1, "group");},
-    goWordRight: function(cm) {cm.moveH(1, "word");},
-    delCharBefore: function(cm) {cm.deleteH(-1, "char");},
-    delCharAfter: function(cm) {cm.deleteH(1, "char");},
-    delWordBefore: function(cm) {cm.deleteH(-1, "word");},
-    delWordAfter: function(cm) {cm.deleteH(1, "word");},
-    delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
-    delGroupAfter: function(cm) {cm.deleteH(1, "group");},
-    indentAuto: function(cm) {cm.indentSelection("smart");},
-    indentMore: function(cm) {cm.indentSelection("add");},
-    indentLess: function(cm) {cm.indentSelection("subtract");},
-    insertTab: function(cm) {cm.replaceSelection("\t");},
-    insertSoftTab: function(cm) {
-      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
-      for (var i = 0; i < ranges.length; i++) {
-        var pos = ranges[i].from();
-        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
-        spaces.push(spaceStr(tabSize - col % tabSize));
-      }
-      cm.replaceSelections(spaces);
-    },
-    defaultTab: function(cm) {
-      if (cm.somethingSelected()) cm.indentSelection("add");
-      else cm.execCommand("insertTab");
-    },
-    transposeChars: function(cm) {
-      runInOp(cm, function() {
-        var ranges = cm.listSelections(), newSel = [];
-        for (var i = 0; i < ranges.length; i++) {
-          var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
-          if (line) {
-            if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);
-            if (cur.ch > 0) {
-              cur = new Pos(cur.line, cur.ch + 1);
-              cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
-                              Pos(cur.line, cur.ch - 2), cur, "+transpose");
-            } else if (cur.line > cm.doc.first) {
-              var prev = getLine(cm.doc, cur.line - 1).text;
-              if (prev)
-                cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
-                                prev.charAt(prev.length - 1),
-                                Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");
-            }
-          }
-          newSel.push(new Range(cur, cur));
-        }
-        cm.setSelections(newSel);
-      });
-    },
-    newlineAndIndent: function(cm) {
-      runInOp(cm, function() {
-        var len = cm.listSelections().length;
-        for (var i = 0; i < len; i++) {
-          var range = cm.listSelections()[i];
-          cm.replaceRange(cm.doc.lineSeparator(), range.anchor, range.head, "+input");
-          cm.indentLine(range.from().line + 1, null, true);
-        }
-        ensureCursorVisible(cm);
-      });
-    },
-    openLine: function(cm) {cm.replaceSelection("\n", "start")},
-    toggleOverwrite: function(cm) {cm.toggleOverwrite();}
-  };
-
-
-  // STANDARD KEYMAPS
-
-  var keyMap = CodeMirror.keyMap = {};
-
-  keyMap.basic = {
-    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
-    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
-    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
-    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
-    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
-    "Esc": "singleSelection"
-  };
-  // Note that the save and find-related commands aren't defined by
-  // default. User code or addons can define them. Unknown commands
-  // are simply ignored.
-  keyMap.pcDefault = {
-    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
-    "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
-    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
-    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
-    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
-    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
-    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
-    fallthrough: "basic"
-  };
-  // Very basic readline/emacs-style bindings, which are standard on Mac.
-  keyMap.emacsy = {
-    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
-    "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
-    "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
-    "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars",
-    "Ctrl-O": "openLine"
-  };
-  keyMap.macDefault = {
-    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
-    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
-    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
-    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
-    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
-    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
-    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
-    fallthrough: ["basic", "emacsy"]
-  };
-  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
-
-  // KEYMAP DISPATCH
-
-  function normalizeKeyName(name) {
-    var parts = name.split(/-(?!$)/), name = parts[parts.length - 1];
-    var alt, ctrl, shift, cmd;
-    for (var i = 0; i < parts.length - 1; i++) {
-      var mod = parts[i];
-      if (/^(cmd|meta|m)$/i.test(mod)) cmd = true;
-      else if (/^a(lt)?$/i.test(mod)) alt = true;
-      else if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;
-      else if (/^s(hift)$/i.test(mod)) shift = true;
-      else throw new Error("Unrecognized modifier name: " + mod);
-    }
-    if (alt) name = "Alt-" + name;
-    if (ctrl) name = "Ctrl-" + name;
-    if (cmd) name = "Cmd-" + name;
-    if (shift) name = "Shift-" + name;
-    return name;
-  }
-
-  // This is a kludge to keep keymaps mostly working as raw objects
-  // (backwards compatibility) while at the same time support features
-  // like normalization and multi-stroke key bindings. It compiles a
-  // new normalized keymap, and then updates the old object to reflect
-  // this.
-  CodeMirror.normalizeKeyMap = function(keymap) {
-    var copy = {};
-    for (var keyname in keymap) if (keymap.hasOwnProperty(keyname)) {
-      var value = keymap[keyname];
-      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) continue;
-      if (value == "...") { delete keymap[keyname]; continue; }
-
-      var keys = map(keyname.split(" "), normalizeKeyName);
-      for (var i = 0; i < keys.length; i++) {
-        var val, name;
-        if (i == keys.length - 1) {
-          name = keys.join(" ");
-          val = value;
-        } else {
-          name = keys.slice(0, i + 1).join(" ");
-          val = "...";
-        }
-        var prev = copy[name];
-        if (!prev) copy[name] = val;
-        else if (prev != val) throw new Error("Inconsistent bindings for " + name);
-      }
-      delete keymap[keyname];
-    }
-    for (var prop in copy) keymap[prop] = copy[prop];
-    return keymap;
-  };
-
-  var lookupKey = CodeMirror.lookupKey = function(key, map, handle, context) {
-    map = getKeyMap(map);
-    var found = map.call ? map.call(key, context) : map[key];
-    if (found === false) return "nothing";
-    if (found === "...") return "multi";
-    if (found != null && handle(found)) return "handled";
-
-    if (map.fallthrough) {
-      if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
-        return lookupKey(key, map.fallthrough, handle, context);
-      for (var i = 0; i < map.fallthrough.length; i++) {
-        var result = lookupKey(key, map.fallthrough[i], handle, context);
-        if (result) return result;
-      }
-    }
-  };
-
-  // Modifier key presses don't count as 'real' key presses for the
-  // purpose of keymap fallthrough.
-  var isModifierKey = CodeMirror.isModifierKey = function(value) {
-    var name = typeof value == "string" ? value : keyNames[value.keyCode];
-    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
-  };
-
-  // Look up the name of a key as indicated by an event object.
-  var keyName = CodeMirror.keyName = function(event, noShift) {
-    if (presto && event.keyCode == 34 && event["char"]) return false;
-    var base = keyNames[event.keyCode], name = base;
-    if (name == null || event.altGraphKey) return false;
-    if (event.altKey && base != "Alt") name = "Alt-" + name;
-    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") name = "Ctrl-" + name;
-    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") name = "Cmd-" + name;
-    if (!noShift && event.shiftKey && base != "Shift") name = "Shift-" + name;
-    return name;
-  };
-
-  function getKeyMap(val) {
-    return typeof val == "string" ? keyMap[val] : val;
-  }
-
-  // FROMTEXTAREA
-
-  CodeMirror.fromTextArea = function(textarea, options) {
-    options = options ? copyObj(options) : {};
-    options.value = textarea.value;
-    if (!options.tabindex && textarea.tabIndex)
-      options.tabindex = textarea.tabIndex;
-    if (!options.placeholder && textarea.placeholder)
-      options.placeholder = textarea.placeholder;
-    // Set autofocus to true if this textarea is focused, or if it has
-    // autofocus and no other element is focused.
-    if (options.autofocus == null) {
-      var hasFocus = activeElt();
-      options.autofocus = hasFocus == textarea ||
-        textarea.getAttribute("autofocus") != null && hasFocus == document.body;
-    }
-
-    function save() {textarea.value = cm.getValue();}
-    if (textarea.form) {
-      on(textarea.form, "submit", save);
-      // Deplorable hack to make the submit method do the right thing.
-      if (!options.leaveSubmitMethodAlone) {
-        var form = textarea.form, realSubmit = form.submit;
-        try {
-          var wrappedSubmit = form.submit = function() {
-            save();
-            form.submit = realSubmit;
-            form.submit();
-            form.submit = wrappedSubmit;
-          };
-        } catch(e) {}
-      }
-    }
-
-    options.finishInit = function(cm) {
-      cm.save = save;
-      cm.getTextArea = function() { return textarea; };
-      cm.toTextArea = function() {
-        cm.toTextArea = isNaN; // Prevent this from being ran twice
-        save();
-        textarea.parentNode.removeChild(cm.getWrapperElement());
-        textarea.style.display = "";
-        if (textarea.form) {
-          off(textarea.form, "submit", save);
-          if (typeof textarea.form.submit == "function")
-            textarea.form.submit = realSubmit;
-        }
-      };
-    };
-
-    textarea.style.display = "none";
-    var cm = CodeMirror(function(node) {
-      textarea.parentNode.insertBefore(node, textarea.nextSibling);
-    }, options);
-    return cm;
-  };
-
-  // STRING STREAM
-
-  // Fed to the mode parsers, provides helper functions to make
-  // parsers more succinct.
-
-  var StringStream = CodeMirror.StringStream = function(string, tabSize) {
-    this.pos = this.start = 0;
-    this.string = string;
-    this.tabSize = tabSize || 8;
-    this.lastColumnPos = this.lastColumnValue = 0;
-    this.lineStart = 0;
-  };
-
-  StringStream.prototype = {
-    eol: function() {return this.pos >= this.string.length;},
-    sol: function() {return this.pos == this.lineStart;},
-    peek: function() {return this.string.charAt(this.pos) || undefined;},
-    next: function() {
-      if (this.pos < this.string.length)
-        return this.string.charAt(this.pos++);
-    },
-    eat: function(match) {
-      var ch = this.string.charAt(this.pos);
-      if (typeof match == "string") var ok = ch == match;
-      else var ok = ch && (match.test ? match.test(ch) : match(ch));
-      if (ok) {++this.pos; return ch;}
-    },
-    eatWhile: function(match) {
-      var start = this.pos;
-      while (this.eat(match)){}
-      return this.pos > start;
-    },
-    eatSpace: function() {
-      var start = this.pos;
-      while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
-      return this.pos > start;
-    },
-    skipToEnd: function() {this.pos = this.string.length;},
-    skipTo: function(ch) {
-      var found = this.string.indexOf(ch, this.pos);
-      if (found > -1) {this.pos = found; return true;}
-    },
-    backUp: function(n) {this.pos -= n;},
-    column: function() {
-      if (this.lastColumnPos < this.start) {
-        this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
-        this.lastColumnPos = this.start;
-      }
-      return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
-    },
-    indentation: function() {
-      return countColumn(this.string, null, this.tabSize) -
-        (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
-    },
-    match: function(pattern, consume, caseInsensitive) {
-      if (typeof pattern == "string") {
-        var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
-        var substr = this.string.substr(this.pos, pattern.length);
-        if (cased(substr) == cased(pattern)) {
-          if (consume !== false) this.pos += pattern.length;
-          return true;
-        }
-      } else {
-        var match = this.string.slice(this.pos).match(pattern);
-        if (match && match.index > 0) return null;
-        if (match && consume !== false) this.pos += match[0].length;
-        return match;
-      }
-    },
-    current: function(){return this.string.slice(this.start, this.pos);},
-    hideFirstChars: function(n, inner) {
-      this.lineStart += n;
-      try { return inner(); }
-      finally { this.lineStart -= n; }
-    }
-  };
-
-  // TEXTMARKERS
-
-  // Created with markText and setBookmark methods. A TextMarker is a
-  // handle that can be used to clear or find a marked position in the
-  // document. Line objects hold arrays (markedSpans) containing
-  // {from, to, marker} object pointing to such marker objects, and
-  // indicating that such a marker is present on that line. Multiple
-  // lines may point to the same marker when it spans across lines.
-  // The spans will have null for their from/to properties when the
-  // marker continues beyond the start/end of the line. Markers have
-  // links back to the lines they currently touch.
-
-  var nextMarkerId = 0;
-
-  var TextMarker = CodeMirror.TextMarker = function(doc, type) {
-    this.lines = [];
-    this.type = type;
-    this.doc = doc;
-    this.id = ++nextMarkerId;
-  };
-  eventMixin(TextMarker);
-
-  // Clear the marker.
-  TextMarker.prototype.clear = function() {
-    if (this.explicitlyCleared) return;
-    var cm = this.doc.cm, withOp = cm && !cm.curOp;
-    if (withOp) startOperation(cm);
-    if (hasHandler(this, "clear")) {
-      var found = this.find();
-      if (found) signalLater(this, "clear", found.from, found.to);
-    }
-    var min = null, max = null;
-    for (var i = 0; i < this.lines.length; ++i) {
-      var line = this.lines[i];
-      var span = getMarkedSpanFor(line.markedSpans, this);
-      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");
-      else if (cm) {
-        if (span.to != null) max = lineNo(line);
-        if (span.from != null) min = lineNo(line);
-      }
-      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
-      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
-        updateLineHeight(line, textHeight(cm.display));
-    }
-    if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
-      var visual = visualLine(this.lines[i]), len = lineLength(visual);
-      if (len > cm.display.maxLineLength) {
-        cm.display.maxLine = visual;
-        cm.display.maxLineLength = len;
-        cm.display.maxLineChanged = true;
-      }
-    }
-
-    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);
-    this.lines.length = 0;
-    this.explicitlyCleared = true;
-    if (this.atomic && this.doc.cantEdit) {
-      this.doc.cantEdit = false;
-      if (cm) reCheckSelection(cm.doc);
-    }
-    if (cm) signalLater(cm, "markerCleared", cm, this);
-    if (withOp) endOperation(cm);
-    if (this.parent) this.parent.clear();
-  };
-
-  // Find the position of the marker in the document. Returns a {from,
-  // to} object by default. Side can be passed to get a specific side
-  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
-  // Pos objects returned contain a line object, rather than a line
-  // number (used to prevent looking up the same line twice).
-  TextMarker.prototype.find = function(side, lineObj) {
-    if (side == null && this.type == "bookmark") side = 1;
-    var from, to;
-    for (var i = 0; i < this.lines.length; ++i) {
-      var line = this.lines[i];
-      var span = getMarkedSpanFor(line.markedSpans, this);
-      if (span.from != null) {
-        from = Pos(lineObj ? line : lineNo(line), span.from);
-        if (side == -1) return from;
-      }
-      if (span.to != null) {
-        to = Pos(lineObj ? line : lineNo(line), span.to);
-        if (side == 1) return to;
-      }
-    }
-    return from && {from: from, to: to};
-  };
-
-  // Signals that the marker's widget changed, and surrounding layout
-  // should be recomputed.
-  TextMarker.prototype.changed = function() {
-    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
-    if (!pos || !cm) return;
-    runInOp(cm, function() {
-      var line = pos.line, lineN = lineNo(pos.line);
-      var view = findViewForLine(cm, lineN);
-      if (view) {
-        clearLineMeasurementCacheFor(view);
-        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
-      }
-      cm.curOp.updateMaxLine = true;
-      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
-        var oldHeight = widget.height;
-        widget.height = null;
-        var dHeight = widgetHeight(widget) - oldHeight;
-        if (dHeight)
-          updateLineHeight(line, line.height + dHeight);
-      }
-    });
-  };
-
-  TextMarker.prototype.attachLine = function(line) {
-    if (!this.lines.length && this.doc.cm) {
-      var op = this.doc.cm.curOp;
-      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
-        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
-    }
-    this.lines.push(line);
-  };
-  TextMarker.prototype.detachLine = function(line) {
-    this.lines.splice(indexOf(this.lines, line), 1);
-    if (!this.lines.length && this.doc.cm) {
-      var op = this.doc.cm.curOp;
-      (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
-    }
-  };
-
-  // Collapsed markers have unique ids, in order to be able to order
-  // them, which is needed for uniquely determining an outer marker
-  // when they overlap (they may nest, but not partially overlap).
-  var nextMarkerId = 0;
-
-  // Create a marker, wire it up to the right lines, and
-  function markText(doc, from, to, options, type) {
-    // Shared markers (across linked documents) are handled separately
-    // (markTextShared will call out to this again, once per
-    // document).
-    if (options && options.shared) return markTextShared(doc, from, to, options, type);
-    // Ensure we are in an operation.
-    if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
-
-    var marker = new TextMarker(doc, type), diff = cmp(from, to);
-    if (options) copyObj(options, marker, false);
-    // Don't connect empty markers unless clearWhenEmpty is false
-    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
-      return marker;
-    if (marker.replacedWith) {
-      // Showing up as a widget implies collapsed (widget replaces text)
-      marker.collapsed = true;
-      marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");
-      if (!options.handleMouseEvents) marker.widgetNode.setAttribute("cm-ignore-events", "true");
-      if (options.insertLeft) marker.widgetNode.insertLeft = true;
-    }
-    if (marker.collapsed) {
-      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
-          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
-        throw new Error("Inserting collapsed marker partially overlapping an existing one");
-      sawCollapsedSpans = true;
-    }
-
-    if (marker.addToHistory)
-      addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);
-
-    var curLine = from.line, cm = doc.cm, updateMaxLine;
-    doc.iter(curLine, to.line + 1, function(line) {
-      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
-        updateMaxLine = true;
-      if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
-      addMarkedSpan(line, new MarkedSpan(marker,
-                                         curLine == from.line ? from.ch : null,
-                                         curLine == to.line ? to.ch : null));
-      ++curLine;
-    });
-    // lineIsHidden depends on the presence of the spans, so needs a second pass
-    if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
-      if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
-    });
-
-    if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
-
-    if (marker.readOnly) {
-      sawReadOnlySpans = true;
-      if (doc.history.done.length || doc.history.undone.length)
-        doc.clearHistory();
-    }
-    if (marker.collapsed) {
-      marker.id = ++nextMarkerId;
-      marker.atomic = true;
-    }
-    if (cm) {
-      // Sync editor state
-      if (updateMaxLine) cm.curOp.updateMaxLine = true;
-      if (marker.collapsed)
-        regChange(cm, from.line, to.line + 1);
-      else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css)
-        for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");
-      if (marker.atomic) reCheckSelection(cm.doc);
-      signalLater(cm, "markerAdded", cm, marker);
-    }
-    return marker;
-  }
-
-  // SHARED TEXTMARKERS
-
-  // A shared marker spans multiple linked documents. It is
-  // implemented as a meta-marker-object controlling multiple normal
-  // markers.
-  var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
-    this.markers = markers;
-    this.primary = primary;
-    for (var i = 0; i < markers.length; ++i)
-      markers[i].parent = this;
-  };
-  eventMixin(SharedTextMarker);
-
-  SharedTextMarker.prototype.clear = function() {
-    if (this.explicitlyCleared) return;
-    this.explicitlyCleared = true;
-    for (var i = 0; i < this.markers.length; ++i)
-      this.markers[i].clear();
-    signalLater(this, "clear");
-  };
-  SharedTextMarker.prototype.find = function(side, lineObj) {
-    return this.primary.find(side, lineObj);
-  };
-
-  function markTextShared(doc, from, to, options, type) {
-    options = copyObj(options);
-    options.shared = false;
-    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
-    var widget = options.widgetNode;
-    linkedDocs(doc, function(doc) {
-      if (widget) options.widgetNode = widget.cloneNode(true);
-      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
-      for (var i = 0; i < doc.linked.length; ++i)
-        if (doc.linked[i].isParent) return;
-      primary = lst(markers);
-    });
-    return new SharedTextMarker(markers, primary);
-  }
-
-  function findSharedMarkers(doc) {
-    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
-                         function(m) { return m.parent; });
-  }
-
-  function copySharedMarkers(doc, markers) {
-    for (var i = 0; i < markers.length; i++) {
-      var marker = markers[i], pos = marker.find();
-      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
-      if (cmp(mFrom, mTo)) {
-        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
-        marker.markers.push(subMark);
-        subMark.parent = marker;
-      }
-    }
-  }
-
-  function detachSharedMarkers(markers) {
-    for (var i = 0; i < markers.length; i++) {
-      var marker = markers[i], linked = [marker.primary.doc];;
-      linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
-      for (var j = 0; j < marker.markers.length; j++) {
-        var subMarker = marker.markers[j];
-        if (indexOf(linked, subMarker.doc) == -1) {
-          subMarker.parent = null;
-          marker.markers.splice(j--, 1);
-        }
-      }
-    }
-  }
-
-  // TEXTMARKER SPANS
-
-  function MarkedSpan(marker, from, to) {
-    this.marker = marker;
-    this.from = from; this.to = to;
-  }
-
-  // Search an array of spans for a span matching the given marker.
-  function getMarkedSpanFor(spans, marker) {
-    if (spans) for (var i = 0; i < spans.length; ++i) {
-      var span = spans[i];
-      if (span.marker == marker) return span;
-    }
-  }
-  // Remove a span from an array, returning undefined if no spans are
-  // left (we don't store arrays for lines without spans).
-  function removeMarkedSpan(spans, span) {
-    for (var r, i = 0; i < spans.length; ++i)
-      if (spans[i] != span) (r || (r = [])).push(spans[i]);
-    return r;
-  }
-  // Add a span to a line.
-  function addMarkedSpan(line, span) {
-    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
-    span.marker.attachLine(line);
-  }
-
-  // Used for the algorithm that adjusts markers for a change in the
-  // document. These functions cut an array of spans at a given
-  // character position, returning an array of remaining chunks (or
-  // undefined if nothing remains).
-  function markedSpansBefore(old, startCh, isInsert) {
-    if (old) for (var i = 0, nw; i < old.length; ++i) {
-      var span = old[i], marker = span.marker;
-      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
-      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
-        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
-        (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
-      }
-    }
-    return nw;
-  }
-  function markedSpansAfter(old, endCh, isInsert) {
-    if (old) for (var i = 0, nw; i < old.length; ++i) {
-      var span = old[i], marker = span.marker;
-      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
-      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
-        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
-        (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
-                                              span.to == null ? null : span.to - endCh));
-      }
-    }
-    return nw;
-  }
-
-  // Given a change object, compute the new set of marker spans that
-  // cover the line in which the change took place. Removes spans
-  // entirely within the change, reconnects spans belonging to the
-  // same marker that appear on both sides of the change, and cuts off
-  // spans partially within the change. Returns an array of span
-  // arrays with one element for each line in (after) the change.
-  function stretchSpansOverChange(doc, change) {
-    if (change.full) return null;
-    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
-    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
-    if (!oldFirst && !oldLast) return null;
-
-    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
-    // Get the spans that 'stick out' on both sides
-    var first = markedSpansBefore(oldFirst, startCh, isInsert);
-    var last = markedSpansAfter(oldLast, endCh, isInsert);
-
-    // Next, merge those two ends
-    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
-    if (first) {
-      // Fix up .to properties of first
-      for (var i = 0; i < first.length; ++i) {
-        var span = first[i];
-        if (span.to == null) {
-          var found = getMarkedSpanFor(last, span.marker);
-          if (!found) span.to = startCh;
-          else if (sameLine) span.to = found.to == null ? null : found.to + offset;
-        }
-      }
-    }
-    if (last) {
-      // Fix up .from in last (or move them into first in case of sameLine)
-      for (var i = 0; i < last.length; ++i) {
-        var span = last[i];
-        if (span.to != null) span.to += offset;
-        if (span.from == null) {
-          var found = getMarkedSpanFor(first, span.marker);
-          if (!found) {
-            span.from = offset;
-            if (sameLine) (first || (first = [])).push(span);
-          }
-        } else {
-          span.from += offset;
-          if (sameLine) (first || (first = [])).push(span);
-        }
-      }
-    }
-    // Make sure we didn't create any zero-length spans
-    if (first) first = clearEmptySpans(first);
-    if (last && last != first) last = clearEmptySpans(last);
-
-    var newMarkers = [first];
-    if (!sameLine) {
-      // Fill gap with whole-line-spans
-      var gap = change.text.length - 2, gapMarkers;
-      if (gap > 0 && first)
-        for (var i = 0; i < first.length; ++i)
-          if (first[i].to == null)
-            (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));
-      for (var i = 0; i < gap; ++i)
-        newMarkers.push(gapMarkers);
-      newMarkers.push(last);
-    }
-    return newMarkers;
-  }
-
-  // Remove spans that are empty and don't have a clearWhenEmpty
-  // option of false.
-  function clearEmptySpans(spans) {
-    for (var i = 0; i < spans.length; ++i) {
-      var span = spans[i];
-      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
-        spans.splice(i--, 1);
-    }
-    if (!spans.length) return null;
-    return spans;
-  }
-
-  // Used for un/re-doing changes from the history. Combines the
-  // result of computing the existing spans with the set of spans that
-  // existed in the history (so that deleting around a span and then
-  // undoing brings back the span).
-  function mergeOldSpans(doc, change) {
-    var old = getOldSpans(doc, change);
-    var stretched = stretchSpansOverChange(doc, change);
-    if (!old) return stretched;
-    if (!stretched) return old;
-
-    for (var i = 0; i < old.length; ++i) {
-      var oldCur = old[i], stretchCur = stretched[i];
-      if (oldCur && stretchCur) {
-        spans: for (var j = 0; j < stretchCur.length; ++j) {
-          var span = stretchCur[j];
-          for (var k = 0; k < oldCur.length; ++k)
-            if (oldCur[k].marker == span.marker) continue spans;
-          oldCur.push(span);
-        }
-      } else if (stretchCur) {
-        old[i] = stretchCur;
-      }
-    }
-    return old;
-  }
-
-  // Used to 'clip' out readOnly ranges when making a change.
-  function removeReadOnlyRanges(doc, from, to) {
-    var markers = null;
-    doc.iter(from.line, to.line + 1, function(line) {
-      if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
-        var mark = line.markedSpans[i].marker;
-        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
-          (markers || (markers = [])).push(mark);
-      }
-    });
-    if (!markers) return null;
-    var parts = [{from: from, to: to}];
-    for (var i = 0; i < markers.length; ++i) {
-      var mk = markers[i], m = mk.find(0);
-      for (var j = 0; j < parts.length; ++j) {
-        var p = parts[j];
-        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;
-        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
-        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
-          newParts.push({from: p.from, to: m.from});
-        if (dto > 0 || !mk.inclusiveRight && !dto)
-          newParts.push({from: m.to, to: p.to});
-        parts.splice.apply(parts, newParts);
-        j += newParts.length - 1;
-      }
-    }
-    return parts;
-  }
-
-  // Connect or disconnect spans from a line.
-  function detachMarkedSpans(line) {
-    var spans = line.markedSpans;
-    if (!spans) return;
-    for (var i = 0; i < spans.length; ++i)
-      spans[i].marker.detachLine(line);
-    line.markedSpans = null;
-  }
-  function attachMarkedSpans(line, spans) {
-    if (!spans) return;
-    for (var i = 0; i < spans.length; ++i)
-      spans[i].marker.attachLine(line);
-    line.markedSpans = spans;
-  }
-
-  // Helpers used when computing which overlapping collapsed span
-  // counts as the larger one.
-  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
-  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
-
-  // Returns a number indicating which of two overlapping collapsed
-  // spans is larger (and thus includes the other). Falls back to
-  // comparing ids when the spans cover exactly the same range.
-  function compareCollapsedMarkers(a, b) {
-    var lenDiff = a.lines.length - b.lines.length;
-    if (lenDiff != 0) return lenDiff;
-    var aPos = a.find(), bPos = b.find();
-    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
-    if (fromCmp) return -fromCmp;
-    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
-    if (toCmp) return toCmp;
-    return b.id - a.id;
-  }
-
-  // Find out whether a line ends or starts in a collapsed span. If
-  // so, return the marker for that span.
-  function collapsedSpanAtSide(line, start) {
-    var sps = sawCollapsedSpans && line.markedSpans, found;
-    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
-      sp = sps[i];
-      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
-          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
-        found = sp.marker;
-    }
-    return found;
-  }
-  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
-  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }
-
-  // Test whether there exists a collapsed span that partially
-  // overlaps (covers the start or end, but not both) of a new span.
-  // Such overlap is not allowed.
-  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
-    var line = getLine(doc, lineNo);
-    var sps = sawCollapsedSpans && line.markedSpans;
-    if (sps) for (var i = 0; i < sps.length; ++i) {
-      var sp = sps[i];
-      if (!sp.marker.collapsed) continue;
-      var found = sp.marker.find(0);
-      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
-      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
-      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
-      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
-          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
-        return true;
-    }
-  }
-
-  // A visual line is a line as drawn on the screen. Folding, for
-  // example, can cause multiple logical lines to appear on the same
-  // visual line. This finds the start of the visual line that the
-  // given line is part of (usually that is the line itself).
-  function visualLine(line) {
-    var merged;
-    while (merged = collapsedSpanAtStart(line))
-      line = merged.find(-1, true).line;
-    return line;
-  }
-
-  // Returns an array of logical lines that continue the visual line
-  // started by the argument, or undefined if there are no such lines.
-  function visualLineContinued(line) {
-    var merged, lines;
-    while (merged = collapsedSpanAtEnd(line)) {
-      line = merged.find(1, true).line;
-      (lines || (lines = [])).push(line);
-    }
-    return lines;
-  }
-
-  // Get the line number of the start of the visual line that the
-  // given line number is part of.
-  function visualLineNo(doc, lineN) {
-    var line = getLine(doc, lineN), vis = visualLine(line);
-    if (line == vis) return lineN;
-    return lineNo(vis);
-  }
-  // Get the line number of the start of the next visual line after
-  // the given line.
-  function visualLineEndNo(doc, lineN) {
-    if (lineN > doc.lastLine()) return lineN;
-    var line = getLine(doc, lineN), merged;
-    if (!lineIsHidden(doc, line)) return lineN;
-    while (merged = collapsedSpanAtEnd(line))
-      line = merged.find(1, true).line;
-    return lineNo(line) + 1;
-  }
-
-  // Compute whether a line is hidden. Lines count as hidden when they
-  // are part of a visual line that starts with another line, or when
-  // they are entirely covered by collapsed, non-widget span.
-  function lineIsHidden(doc, line) {
-    var sps = sawCollapsedSpans && line.markedSpans;
-    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
-      sp = sps[i];
-      if (!sp.marker.collapsed) continue;
-      if (sp.from == null) return true;
-      if (sp.marker.widgetNode) continue;
-      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
-        return true;
-    }
-  }
-  function lineIsHiddenInner(doc, line, span) {
-    if (span.to == null) {
-      var end = span.marker.find(1, true);
-      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));
-    }
-    if (span.marker.inclusiveRight && span.to == line.text.length)
-      return true;
-    for (var sp, i = 0; i < line.markedSpans.length; ++i) {
-      sp = line.markedSpans[i];
-      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
-          (sp.to == null || sp.to != span.from) &&
-          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
-          lineIsHiddenInner(doc, line, sp)) return true;
-    }
-  }
-
-  // LINE WIDGETS
-
-  // Line widgets are block elements displayed above or below a line.
-
-  var LineWidget = CodeMirror.LineWidget = function(doc, node, options) {
-    if (options) for (var opt in options) if (options.hasOwnProperty(opt))
-      this[opt] = options[opt];
-    this.doc = doc;
-    this.node = node;
-  };
-  eventMixin(LineWidget);
-
-  function adjustScrollWhenAboveVisible(cm, line, diff) {
-    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
-      addToScrollPos(cm, null, diff);
-  }
-
-  LineWidget.prototype.clear = function() {
-    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
-    if (no == null || !ws) return;
-    for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
-    if (!ws.length) line.widgets = null;
-    var height = widgetHeight(this);
-    updateLineHeight(line, Math.max(0, line.height - height));
-    if (cm) runInOp(cm, function() {
-      adjustScrollWhenAboveVisible(cm, line, -height);
-      regLineChange(cm, no, "widget");
-    });
-  };
-  LineWidget.prototype.changed = function() {
-    var oldH = this.height, cm = this.doc.cm, line = this.line;
-    this.height = null;
-    var diff = widgetHeight(this) - oldH;
-    if (!diff) return;
-    updateLineHeight(line, line.height + diff);
-    if (cm) runInOp(cm, function() {
-      cm.curOp.forceUpdate = true;
-      adjustScrollWhenAboveVisible(cm, line, diff);
-    });
-  };
-
-  function widgetHeight(widget) {
-    if (widget.height != null) return widget.height;
-    var cm = widget.doc.cm;
-    if (!cm) return 0;
-    if (!contains(document.body, widget.node)) {
-      var parentStyle = "position: relative;";
-      if (widget.coverGutter)
-        parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;";
-      if (widget.noHScroll)
-        parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;";
-      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
-    }
-    return widget.height = widget.node.parentNode.offsetHeight;
-  }
-
-  function addLineWidget(doc, handle, node, options) {
-    var widget = new LineWidget(doc, node, options);
-    var cm = doc.cm;
-    if (cm && widget.noHScroll) cm.display.alignWidgets = true;
-    changeLine(doc, handle, "widget", function(line) {
-      var widgets = line.widgets || (line.widgets = []);
-      if (widget.insertAt == null) widgets.push(widget);
-      else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
-      widget.line = line;
-      if (cm && !lineIsHidden(doc, line)) {
-        var aboveVisible = heightAtLine(line) < doc.scrollTop;
-        updateLineHeight(line, line.height + widgetHeight(widget));
-        if (aboveVisible) addToScrollPos(cm, null, widget.height);
-        cm.curOp.forceUpdate = true;
-      }
-      return true;
-    });
-    return widget;
-  }
-
-  // LINE DATA STRUCTURE
-
-  // Line objects. These hold state related to a line, including
-  // highlighting info (the styles array).
-  var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
-    this.text = text;
-    attachMarkedSpans(this, markedSpans);
-    this.height = estimateHeight ? estimateHeight(this) : 1;
-  };
-  eventMixin(Line);
-  Line.prototype.lineNo = function() { return lineNo(this); };
-
-  // Change the content (text, markers) of a line. Automatically
-  // invalidates cached information and tries to re-estimate the
-  // line's height.
-  function updateLine(line, text, markedSpans, estimateHeight) {
-    line.text = text;
-    if (line.stateAfter) line.stateAfter = null;
-    if (line.styles) line.styles = null;
-    if (line.order != null) line.order = null;
-    detachMarkedSpans(line);
-    attachMarkedSpans(line, markedSpans);
-    var estHeight = estimateHeight ? estimateHeight(line) : 1;
-    if (estHeight != line.height) updateLineHeight(line, estHeight);
-  }
-
-  // Detach a line from the document tree and its markers.
-  function cleanUpLine(line) {
-    line.parent = null;
-    detachMarkedSpans(line);
-  }
-
-  function extractLineClasses(type, output) {
-    if (type) for (;;) {
-      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
-      if (!lineClass) break;
-      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
-      var prop = lineClass[1] ? "bgClass" : "textClass";
-      if (output[prop] == null)
-        output[prop] = lineClass[2];
-      else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
-        output[prop] += " " + lineClass[2];
-    }
-    return type;
-  }
-
-  function callBlankLine(mode, state) {
-    if (mode.blankLine) return mode.blankLine(state);
-    if (!mode.innerMode) return;
-    var inner = CodeMirror.innerMode(mode, state);
-    if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
-  }
-
-  function readToken(mode, stream, state, inner) {
-    for (var i = 0; i < 10; i++) {
-      if (inner) inner[0] = CodeMirror.innerMode(mode, state).mode;
-      var style = mode.token(stream, state);
-      if (stream.pos > stream.start) return style;
-    }
-    throw new Error("Mode " + mode.name + " failed to advance stream.");
-  }
-
-  // Utility for getTokenAt and getLineTokens
-  function takeToken(cm, pos, precise, asArray) {
-    function getObj(copy) {
-      return {start: stream.start, end: stream.pos,
-              string: stream.current(),
-              type: style || null,
-              state: copy ? copyState(doc.mode, state) : state};
-    }
-
-    var doc = cm.doc, mode = doc.mode, style;
-    pos = clipPos(doc, pos);
-    var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise);
-    var stream = new StringStream(line.text, cm.options.tabSize), tokens;
-    if (asArray) tokens = [];
-    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
-      stream.start = stream.pos;
-      style = readToken(mode, stream, state);
-      if (asArray) tokens.push(getObj(true));
-    }
-    return asArray ? tokens : getObj();
-  }
-
-  // Run the given mode's parser over a line, calling f for each token.
-  function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
-    var flattenSpans = mode.flattenSpans;
-    if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
-    var curStart = 0, curStyle = null;
-    var stream = new StringStream(text, cm.options.tabSize), style;
-    var inner = cm.options.addModeClass && [null];
-    if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
-    while (!stream.eol()) {
-      if (stream.pos > cm.options.maxHighlightLength) {
-        flattenSpans = false;
-        if (forceToEnd) processLine(cm, text, state, stream.pos);
-        stream.pos = text.length;
-        style = null;
-      } else {
-        style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses);
-      }
-      if (inner) {
-        var mName = inner[0].name;
-        if (mName) style = "m-" + (style ? mName + " " + style : mName);
-      }
-      if (!flattenSpans || curStyle != style) {
-        while (curStart < stream.start) {
-          curStart = Math.min(stream.start, curStart + 50000);
-          f(curStart, curStyle);
-        }
-        curStyle = style;
-      }
-      stream.start = stream.pos;
-    }
-    while (curStart < stream.pos) {
-      // Webkit seems to refuse to render text nodes longer than 57444 characters
-      var pos = Math.min(stream.pos, curStart + 50000);
-      f(pos, curStyle);
-      curStart = pos;
-    }
-  }
-
-  // Compute a style array (an array starting with a mode generation
-  // -- for invalidation -- followed by pairs of end positions and
-  // style strings), which is used to highlight the tokens on the
-  // line.
-  function highlightLine(cm, line, state, forceToEnd) {
-    // A styles array always starts with a number identifying the
-    // mode/overlays that it is based on (for easy invalidation).
-    var st = [cm.state.modeGen], lineClasses = {};
-    // Compute the base array of styles
-    runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
-      st.push(end, style);
-    }, lineClasses, forceToEnd);
-
-    // Run overlays, adjust style array.
-    for (var o = 0; o < cm.state.overlays.length; ++o) {
-      var overlay = cm.state.overlays[o], i = 1, at = 0;
-      runMode(cm, line.text, overlay.mode, true, function(end, style) {
-        var start = i;
-        // Ensure there's a token end at the current position, and that i points at it
-        while (at < end) {
-          var i_end = st[i];
-          if (i_end > end)
-            st.splice(i, 1, end, st[i+1], i_end);
-          i += 2;
-          at = Math.min(end, i_end);
-        }
-        if (!style) return;
-        if (overlay.opaque) {
-          st.splice(start, i - start, end, "cm-overlay " + style);
-          i = start + 2;
-        } else {
-          for (; start < i; start += 2) {
-            var cur = st[start+1];
-            st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
-          }
-        }
-      }, lineClasses);
-    }
-
-    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
-  }
-
-  function getLineStyles(cm, line, updateFrontier) {
-    if (!line.styles || line.styles[0] != cm.state.modeGen) {
-      var state = getStateBefore(cm, lineNo(line));
-      var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state);
-      line.stateAfter = state;
-      line.styles = result.styles;
-      if (result.classes) line.styleClasses = result.classes;
-      else if (line.styleClasses) line.styleClasses = null;
-      if (updateFrontier === cm.doc.frontier) cm.doc.frontier++;
-    }
-    return line.styles;
-  }
-
-  // Lightweight form of highlight -- proceed over this line and
-  // update state, but don't save a style array. Used for lines that
-  // aren't currently visible.
-  function processLine(cm, text, state, startAt) {
-    var mode = cm.doc.mode;
-    var stream = new StringStream(text, cm.options.tabSize);
-    stream.start = stream.pos = startAt || 0;
-    if (text == "") callBlankLine(mode, state);
-    while (!stream.eol()) {
-      readToken(mode, stream, state);
-      stream.start = stream.pos;
-    }
-  }
-
-  // Convert a style as returned by a mode (either null, or a string
-  // containing one or more styles) to a CSS style. This is cached,
-  // and also looks for line-wide styles.
-  var styleToClassCache = {}, styleToClassCacheWithMode = {};
-  function interpretTokenStyle(style, options) {
-    if (!style || /^\s*$/.test(style)) return null;
-    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
-    return cache[style] ||
-      (cache[style] = style.replace(/\S+/g, "cm-$&"));
-  }
-
-  // Render the DOM representation of the text of a line. Also builds
-  // up a 'line map', which points at the DOM nodes that represent
-  // specific stretches of text, and is used by the measuring code.
-  // The returned object contains the DOM node, this map, and
-  // information about line-wide styles that were set by the mode.
-  function buildLineContent(cm, lineView) {
-    // The padding-right forces the element to have a 'border', which
-    // is needed on Webkit to be able to get line-level bounding
-    // rectangles for it (in measureChar).
-    var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
-    var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content,
-                   col: 0, pos: 0, cm: cm,
-                   splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")};
-    lineView.measure = {};
-
-    // Iterate over the logical lines that make up this visual line.
-    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
-      var line = i ? lineView.rest[i - 1] : lineView.line, order;
-      builder.pos = 0;
-      builder.addToken = buildToken;
-      // Optionally wire in some hacks into the token-rendering
-      // algorithm, to deal with browser quirks.
-      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
-        builder.addToken = buildTokenBadBidi(builder.addToken, order);
-      builder.map = [];
-      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
-      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
-      if (line.styleClasses) {
-        if (line.styleClasses.bgClass)
-          builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
-        if (line.styleClasses.textClass)
-          builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
-      }
-
-      // Ensure at least a single node is present, for measuring.
-      if (builder.map.length == 0)
-        builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));
-
-      // Store the map and a cache object for the current logical line
-      if (i == 0) {
-        lineView.measure.map = builder.map;
-        lineView.measure.cache = {};
-      } else {
-        (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);
-        (lineView.measure.caches || (lineView.measure.caches = [])).push({});
-      }
-    }
-
-    // See issue #2901
-    if (webkit) {
-      var last = builder.content.lastChild
-      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
-        builder.content.className = "cm-tab-wrap-hack";
-    }
-
-    signal(cm, "renderLine", cm, lineView.line, builder.pre);
-    if (builder.pre.className)
-      builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");
-
-    return builder;
-  }
-
-  function defaultSpecialCharPlaceholder(ch) {
-    var token = elt("span", "\u2022", "cm-invalidchar");
-    token.title = "\\u" + ch.charCodeAt(0).toString(16);
-    token.setAttribute("aria-label", token.title);
-    return token;
-  }
-
-  // Build up the DOM representation for a single token, and add it to
-  // the line map. Takes care to render special characters separately.
-  function buildToken(builder, text, style, startStyle, endStyle, title, css) {
-    if (!text) return;
-    var displayText = builder.splitSpaces ? text.replace(/ {3,}/g, splitSpaces) : text;
-    var special = builder.cm.state.specialChars, mustWrap = false;
-    if (!special.test(text)) {
-      builder.col += text.length;
-      var content = document.createTextNode(displayText);
-      builder.map.push(builder.pos, builder.pos + text.length, content);
-      if (ie && ie_version < 9) mustWrap = true;
-      builder.pos += text.length;
-    } else {
-      var content = document.createDocumentFragment(), pos = 0;
-      while (true) {
-        special.lastIndex = pos;
-        var m = special.exec(text);
-        var skipped = m ? m.index - pos : text.length - pos;
-        if (skipped) {
-          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
-          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
-          else content.appendChild(txt);
-          builder.map.push(builder.pos, builder.pos + skipped, txt);
-          builder.col += skipped;
-          builder.pos += skipped;
-        }
-        if (!m) break;
-        pos += skipped + 1;
-        if (m[0] == "\t") {
-          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
-          var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
-          txt.setAttribute("role", "presentation");
-          txt.setAttribute("cm-text", "\t");
-          builder.col += tabWidth;
-        } else if (m[0] == "\r" || m[0] == "\n") {
-          var txt = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
-          txt.setAttribute("cm-text", m[0]);
-          builder.col += 1;
-        } else {
-          var txt = builder.cm.options.specialCharPlaceholder(m[0]);
-          txt.setAttribute("cm-text", m[0]);
-          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
-          else content.appendChild(txt);
-          builder.col += 1;
-        }
-        builder.map.push(builder.pos, builder.pos + 1, txt);
-        builder.pos++;
-      }
-    }
-    if (style || startStyle || endStyle || mustWrap || css) {
-      var fullStyle = style || "";
-      if (startStyle) fullStyle += startStyle;
-      if (endStyle) fullStyle += endStyle;
-      var token = elt("span", [content], fullStyle, css);
-      if (title) token.title = title;
-      return builder.content.appendChild(token);
-    }
-    builder.content.appendChild(content);
-  }
-
-  function splitSpaces(old) {
-    var out = " ";
-    for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
-    out += " ";
-    return out;
-  }
-
-  // Work around nonsense dimensions being reported for stretches of
-  // right-to-left text.
-  function buildTokenBadBidi(inner, order) {
-    return function(builder, text, style, startStyle, endStyle, title, css) {
-      style = style ? style + " cm-force-border" : "cm-force-border";
-      var start = builder.pos, end = start + text.length;
-      for (;;) {
-        // Find the part that overlaps with the start of this text
-        for (var i = 0; i < order.length; i++) {
-          var part = order[i];
-          if (part.to > start && part.from <= start) break;
-        }
-        if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title, css);
-        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css);
-        startStyle = null;
-        text = text.slice(part.to - start);
-        start = part.to;
-      }
-    };
-  }
-
-  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
-    var widget = !ignoreWidget && marker.widgetNode;
-    if (widget) builder.map.push(builder.pos, builder.pos + size, widget);
-    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
-      if (!widget)
-        widget = builder.content.appendChild(document.createElement("span"));
-      widget.setAttribute("cm-marker", marker.id);
-    }
-    if (widget) {
-      builder.cm.display.input.setUneditable(widget);
-      builder.content.appendChild(widget);
-    }
-    builder.pos += size;
-  }
-
-  // Outputs a number of spans to make up a line, taking highlighting
-  // and marked text into account.
-  function insertLineContent(line, builder, styles) {
-    var spans = line.markedSpans, allText = line.text, at = 0;
-    if (!spans) {
-      for (var i = 1; i < styles.length; i+=2)
-        builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
-      return;
-    }
-
-    var len = allText.length, pos = 0, i = 1, text = "", style, css;
-    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
-    for (;;) {
-      if (nextChange == pos) { // Update current marker set
-        spanStyle = spanEndStyle = spanStartStyle = title = css = "";
-        collapsed = null; nextChange = Infinity;
-        var foundBookmarks = [], endStyles
-        for (var j = 0; j < spans.length; ++j) {
-          var sp = spans[j], m = sp.marker;
-          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
-            foundBookmarks.push(m);
-          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
-            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
-              nextChange = sp.to;
-              spanEndStyle = "";
-            }
-            if (m.className) spanStyle += " " + m.className;
-            if (m.css) css = (css ? css + ";" : "") + m.css;
-            if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
-            if (m.endStyle && sp.to == nextChange) (endStyles || (endStyles = [])).push(m.endStyle, sp.to)
-            if (m.title && !title) title = m.title;
-            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
-              collapsed = sp;
-          } else if (sp.from > pos && nextChange > sp.from) {
-            nextChange = sp.from;
-          }
-        }
-        if (endStyles) for (var j = 0; j < endStyles.length; j += 2)
-          if (endStyles[j + 1] == nextChange) spanEndStyle += " " + endStyles[j]
-
-        if (!collapsed || collapsed.from == pos) for (var j = 0; j < foundBookmarks.length; ++j)
-          buildCollapsedSpan(builder, 0, foundBookmarks[j]);
-        if (collapsed && (collapsed.from || 0) == pos) {
-          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
-                             collapsed.marker, collapsed.from == null);
-          if (collapsed.to == null) return;
-          if (collapsed.to == pos) collapsed = false;
-        }
-      }
-      if (pos >= len) break;
-
-      var upto = Math.min(len, nextChange);
-      while (true) {
-        if (text) {
-          var end = pos + text.length;
-          if (!collapsed) {
-            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
-            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
-                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css);
-          }
-          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
-          pos = end;
-          spanStartStyle = "";
-        }
-        text = allText.slice(at, at = styles[i++]);
-        style = interpretTokenStyle(styles[i++], builder.cm.options);
-      }
-    }
-  }
-
-  // DOCUMENT DATA STRUCTURE
-
-  // By default, updates that start and end at the beginning of a line
-  // are treated specially, in order to make the association of line
-  // widgets and marker elements with the text behave more intuitive.
-  function isWholeLineUpdate(doc, change) {
-    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
-      (!doc.cm || doc.cm.options.wholeLineUpdateBefore);
-  }
-
-  // Perform a change on the document data structure.
-  function updateDoc(doc, change, markedSpans, estimateHeight) {
-    function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
-    function update(line, text, spans) {
-      updateLine(line, text, spans, estimateHeight);
-      signalLater(line, "change", line, change);
-    }
-    function linesFor(start, end) {
-      for (var i = start, result = []; i < end; ++i)
-        result.push(new Line(text[i], spansFor(i), estimateHeight));
-      return result;
-    }
-
-    var from = change.from, to = change.to, text = change.text;
-    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
-    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
-
-    // Adjust the line structure
-    if (change.full) {
-      doc.insert(0, linesFor(0, text.length));
-      doc.remove(text.length, doc.size - text.length);
-    } else if (isWholeLineUpdate(doc, change)) {
-      // This is a whole-line replace. Treated specially to make
-      // sure line objects move the way they are supposed to.
-      var added = linesFor(0, text.length - 1);
-      update(lastLine, lastLine.text, lastSpans);
-      if (nlines) doc.remove(from.line, nlines);
-      if (added.length) doc.insert(from.line, added);
-    } else if (firstLine == lastLine) {
-      if (text.length == 1) {
-        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
-      } else {
-        var added = linesFor(1, text.length - 1);
-        added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
-        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
-        doc.insert(from.line + 1, added);
-      }
-    } else if (text.length == 1) {
-      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
-      doc.remove(from.line + 1, nlines);
-    } else {
-      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
-      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
-      var added = linesFor(1, text.length - 1);
-      if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
-      doc.insert(from.line + 1, added);
-    }
-
-    signalLater(doc, "change", doc, change);
-  }
-
-  // The document is represented as a BTree consisting of leaves, with
-  // chunk of lines in them, and branches, with up to ten leaves or
-  // other branch nodes below them. The top node is always a branch
-  // node, and is the document object itself (meaning it has
-  // additional methods and properties).
-  //
-  // All nodes have parent links. The tree is used both to go from
-  // line numbers to line objects, and to go from objects to numbers.
-  // It also indexes by height, and is used to convert between height
-  // and line object, and to find the total height of the document.
-  //
-  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
-
-  function LeafChunk(lines) {
-    this.lines = lines;
-    this.parent = null;
-    for (var i = 0, height = 0; i < lines.length; ++i) {
-      lines[i].parent = this;
-      height += lines[i].height;
-    }
-    this.height = height;
-  }
-
-  LeafChunk.prototype = {
-    chunkSize: function() { return this.lines.length; },
-    // Remove the n lines at offset 'at'.
-    removeInner: function(at, n) {
-      for (var i = at, e = at + n; i < e; ++i) {
-        var line = this.lines[i];
-        this.height -= line.height;
-        cleanUpLine(line);
-        signalLater(line, "delete");
-      }
-      this.lines.splice(at, n);
-    },
-    // Helper used to collapse a small branch into a single leaf.
-    collapse: function(lines) {
-      lines.push.apply(lines, this.lines);
-    },
-    // Insert the given array of lines at offset 'at', count them as
-    // having the given height.
-    insertInner: function(at, lines, height) {
-      this.height += height;
-      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
-      for (var i = 0; i < lines.length; ++i) lines[i].parent = this;
-    },
-    // Used to iterate over a part of the tree.
-    iterN: function(at, n, op) {
-      for (var e = at + n; at < e; ++at)
-        if (op(this.lines[at])) return true;
-    }
-  };
-
-  function BranchChunk(children) {
-    this.children = children;
-    var size = 0, height = 0;
-    for (var i = 0; i < children.length; ++i) {
-      var ch = children[i];
-      size += ch.chunkSize(); height += ch.height;
-      ch.parent = this;
-    }
-    this.size = size;
-    this.height = height;
-    this.parent = null;
-  }
-
-  BranchChunk.prototype = {
-    chunkSize: function() { return this.size; },
-    removeInner: function(at, n) {
-      this.size -= n;
-      for (var i = 0; i < this.children.length; ++i) {
-        var child = this.children[i], sz = child.chunkSize();
-        if (at < sz) {
-          var rm = Math.min(n, sz - at), oldHeight = child.height;
-          child.removeInner(at, rm);
-          this.height -= oldHeight - child.height;
-          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
-          if ((n -= rm) == 0) break;
-          at = 0;
-        } else at -= sz;
-      }
-      // If the result is smaller than 25 lines, ensure that it is a
-      // single leaf node.
-      if (this.size - n < 25 &&
-          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
-        var lines = [];
-        this.collapse(lines);
-        this.children = [new LeafChunk(lines)];
-        this.children[0].parent = this;
-      }
-    },
-    collapse: function(lines) {
-      for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);
-    },
-    insertInner: function(at, lines, height) {
-      this.size += lines.length;
-      this.height += height;
-      for (var i = 0; i < this.children.length; ++i) {
-        var child = this.children[i], sz = child.chunkSize();
-        if (at <= sz) {
-          child.insertInner(at, lines, height);
-          if (child.lines && child.lines.length > 50) {
-            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
-            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
-            var remaining = child.lines.length % 25 + 25
-            for (var pos = remaining; pos < child.lines.length;) {
-              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
-              child.height -= leaf.height;
-              this.children.splice(++i, 0, leaf);
-              leaf.parent = this;
-            }
-            child.lines = child.lines.slice(0, remaining);
-            this.maybeSpill();
-          }
-          break;
-        }
-        at -= sz;
-      }
-    },
-    // When a node has grown, check whether it should be split.
-    maybeSpill: function() {
-      if (this.children.length <= 10) return;
-      var me = this;
-      do {
-        var spilled = me.children.splice(me.children.length - 5, 5);
-        var sibling = new BranchChunk(spilled);
-        if (!me.parent) { // Become the parent node
-          var copy = new BranchChunk(me.children);
-          copy.parent = me;
-          me.children = [copy, sibling];
-          me = copy;
-       } else {
-          me.size -= sibling.size;
-          me.height -= sibling.height;
-          var myIndex = indexOf(me.parent.children, me);
-          me.parent.children.splice(myIndex + 1, 0, sibling);
-        }
-        sibling.parent = me.parent;
-      } while (me.children.length > 10);
-      me.parent.maybeSpill();
-    },
-    iterN: function(at, n, op) {
-      for (var i = 0; i < this.children.length; ++i) {
-        var child = this.children[i], sz = child.chunkSize();
-        if (at < sz) {
-          var used = Math.min(n, sz - at);
-          if (child.iterN(at, used, op)) return true;
-          if ((n -= used) == 0) break;
-          at = 0;
-        } else at -= sz;
-      }
-    }
-  };
-
-  var nextDocId = 0;
-  var Doc = CodeMirror.Doc = function(text, mode, firstLine, lineSep) {
-    if (!(this instanceof Doc)) return new Doc(text, mode, firstLine, lineSep);
-    if (firstLine == null) firstLine = 0;
-
-    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
-    this.first = firstLine;
-    this.scrollTop = this.scrollLeft = 0;
-    this.cantEdit = false;
-    this.cleanGeneration = 1;
-    this.frontier = firstLine;
-    var start = Pos(firstLine, 0);
-    this.sel = simpleSelection(start);
-    this.history = new History(null);
-    this.id = ++nextDocId;
-    this.modeOption = mode;
-    this.lineSep = lineSep;
-    this.extend = false;
-
-    if (typeof text == "string") text = this.splitLines(text);
-    updateDoc(this, {from: start, to: start, text: text});
-    setSelection(this, simpleSelection(start), sel_dontScroll);
-  };
-
-  Doc.prototype = createObj(BranchChunk.prototype, {
-    constructor: Doc,
-    // Iterate over the document. Supports two forms -- with only one
-    // argument, it calls that for each line in the document. With
-    // three, it iterates over the range given by the first two (with
-    // the second being non-inclusive).
-    iter: function(from, to, op) {
-      if (op) this.iterN(from - this.first, to - from, op);
-      else this.iterN(this.first, this.first + this.size, from);
-    },
-
-    // Non-public interface for adding and removing lines.
-    insert: function(at, lines) {
-      var height = 0;
-      for (var i = 0; i < lines.length; ++i) height += lines[i].height;
-      this.insertInner(at - this.first, lines, height);
-    },
-    remove: function(at, n) { this.removeInner(at - this.first, n); },
-
-    // From here, the methods are part of the public interface. Most
-    // are also available from CodeMirror (editor) instances.
-
-    getValue: function(lineSep) {
-      var lines = getLines(this, this.first, this.first + this.size);
-      if (lineSep === false) return lines;
-      return lines.join(lineSep || this.lineSeparator());
-    },
-    setValue: docMethodOp(function(code) {
-      var top = Pos(this.first, 0), last = this.first + this.size - 1;
-      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
-                        text: this.splitLines(code), origin: "setValue", full: true}, true);
-      setSelection(this, simpleSelection(top));
-    }),
-    replaceRange: function(code, from, to, origin) {
-      from = clipPos(this, from);
-      to = to ? clipPos(this, to) : from;
-      replaceRange(this, code, from, to, origin);
-    },
-    getRange: function(from, to, lineSep) {
-      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
-      if (lineSep === false) return lines;
-      return lines.join(lineSep || this.lineSeparator());
-    },
-
-    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
-
-    getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
-    getLineNumber: function(line) {return lineNo(line);},
-
-    getLineHandleVisualStart: function(line) {
-      if (typeof line == "number") line = getLine(this, line);
-      return visualLine(line);
-    },
-
-    lineCount: function() {return this.size;},
-    firstLine: function() {return this.first;},
-    lastLine: function() {return this.first + this.size - 1;},
-
-    clipPos: function(pos) {return clipPos(this, pos);},
-
-    getCursor: function(start) {
-      var range = this.sel.primary(), pos;
-      if (start == null || start == "head") pos = range.head;
-      else if (start == "anchor") pos = range.anchor;
-      else if (start == "end" || start == "to" || start === false) pos = range.to();
-      else pos = range.from();
-      return pos;
-    },
-    listSelections: function() { return this.sel.ranges; },
-    somethingSelected: function() {return this.sel.somethingSelected();},
-
-    setCursor: docMethodOp(function(line, ch, options) {
-      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
-    }),
-    setSelection: docMethodOp(function(anchor, head, options) {
-      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
-    }),
-    extendSelection: docMethodOp(function(head, other, options) {
-      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
-    }),
-    extendSelections: docMethodOp(function(heads, options) {
-      extendSelections(this, clipPosArray(this, heads), options);
-    }),
-    extendSelectionsBy: docMethodOp(function(f, options) {
-      var heads = map(this.sel.ranges, f);
-      extendSelections(this, clipPosArray(this, heads), options);
-    }),
-    setSelections: docMethodOp(function(ranges, primary, options) {
-      if (!ranges.length) return;
-      for (var i = 0, out = []; i < ranges.length; i++)
-        out[i] = new Range(clipPos(this, ranges[i].anchor),
-                           clipPos(this, ranges[i].head));
-      if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);
-      setSelection(this, normalizeSelection(out, primary), options);
-    }),
-    addSelection: docMethodOp(function(anchor, head, options) {
-      var ranges = this.sel.ranges.slice(0);
-      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
-      setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
-    }),
-
-    getSelection: function(lineSep) {
-      var ranges = this.sel.ranges, lines;
-      for (var i = 0; i < ranges.length; i++) {
-        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
-        lines = lines ? lines.concat(sel) : sel;
-      }
-      if (lineSep === false) return lines;
-      else return lines.join(lineSep || this.lineSeparator());
-    },
-    getSelections: function(lineSep) {
-      var parts = [], ranges = this.sel.ranges;
-      for (var i = 0; i < ranges.length; i++) {
-        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
-        if (lineSep !== false) sel = sel.join(lineSep || this.lineSeparator());
-        parts[i] = sel;
-      }
-      return parts;
-    },
-    replaceSelection: function(code, collapse, origin) {
-      var dup = [];
-      for (var i = 0; i < this.sel.ranges.length; i++)
-        dup[i] = code;
-      this.replaceSelections(dup, collapse, origin || "+input");
-    },
-    replaceSelections: docMethodOp(function(code, collapse, origin) {
-      var changes = [], sel = this.sel;
-      for (var i = 0; i < sel.ranges.length; i++) {
-        var range = sel.ranges[i];
-        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
-      }
-      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
-      for (var i = changes.length - 1; i >= 0; i--)
-        makeChange(this, changes[i]);
-      if (newSel) setSelectionReplaceHistory(this, newSel);
-      else if (this.cm) ensureCursorVisible(this.cm);
-    }),
-    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
-    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
-    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
-    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
-
-    setExtending: function(val) {this.extend = val;},
-    getExtending: function() {return this.extend;},
-
-    historySize: function() {
-      var hist = this.history, done = 0, undone = 0;
-      for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;
-      for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;
-      return {undo: done, redo: undone};
-    },
-    clearHistory: function() {this.history = new History(this.history.maxGeneration);},
-
-    markClean: function() {
-      this.cleanGeneration = this.changeGeneration(true);
-    },
-    changeGeneration: function(forceSplit) {
-      if (forceSplit)
-        this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
-      return this.history.generation;
-    },
-    isClean: function (gen) {
-      return this.history.generation == (gen || this.cleanGeneration);
-    },
-
-    getHistory: function() {
-      return {done: copyHistoryArray(this.history.done),
-              undone: copyHistoryArray(this.history.undone)};
-    },
-    setHistory: function(histData) {
-      var hist = this.history = new History(this.history.maxGeneration);
-      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
-      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
-    },
-
-    addLineClass: docMethodOp(function(handle, where, cls) {
-      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
-        var prop = where == "text" ? "textClass"
-                 : where == "background" ? "bgClass"
-                 : where == "gutter" ? "gutterClass" : "wrapClass";
-        if (!line[prop]) line[prop] = cls;
-        else if (classTest(cls).test(line[prop])) return false;
-        else line[prop] += " " + cls;
-        return true;
-      });
-    }),
-    removeLineClass: docMethodOp(function(handle, where, cls) {
-      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function(line) {
-        var prop = where == "text" ? "textClass"
-                 : where == "background" ? "bgClass"
-                 : where == "gutter" ? "gutterClass" : "wrapClass";
-        var cur = line[prop];
-        if (!cur) return false;
-        else if (cls == null) line[prop] = null;
-        else {
-          var found = cur.match(classTest(cls));
-          if (!found) return false;
-          var end = found.index + found[0].length;
-          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
-        }
-        return true;
-      });
-    }),
-
-    addLineWidget: docMethodOp(function(handle, node, options) {
-      return addLineWidget(this, handle, node, options);
-    }),
-    removeLineWidget: function(widget) { widget.clear(); },
-
-    markText: function(from, to, options) {
-      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range");
-    },
-    setBookmark: function(pos, options) {
-      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
-                      insertLeft: options && options.insertLeft,
-                      clearWhenEmpty: false, shared: options && options.shared,
-                      handleMouseEvents: options && options.handleMouseEvents};
-      pos = clipPos(this, pos);
-      return markText(this, pos, pos, realOpts, "bookmark");
-    },
-    findMarksAt: function(pos) {
-      pos = clipPos(this, pos);
-      var markers = [], spans = getLine(this, pos.line).markedSpans;
-      if (spans) for (var i = 0; i < spans.length; ++i) {
-        var span = spans[i];
-        if ((span.from == null || span.from <= pos.ch) &&
-            (span.to == null || span.to >= pos.ch))
-          markers.push(span.marker.parent || span.marker);
-      }
-      return markers;
-    },
-    findMarks: function(from, to, filter) {
-      from = clipPos(this, from); to = clipPos(this, to);
-      var found = [], lineNo = from.line;
-      this.iter(from.line, to.line + 1, function(line) {
-        var spans = line.markedSpans;
-        if (spans) for (var i = 0; i < spans.length; i++) {
-          var span = spans[i];
-          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
-                span.from == null && lineNo != from.line ||
-                span.from != null && lineNo == to.line && span.from >= to.ch) &&
-              (!filter || filter(span.marker)))
-            found.push(span.marker.parent || span.marker);
-        }
-        ++lineNo;
-      });
-      return found;
-    },
-    getAllMarks: function() {
-      var markers = [];
-      this.iter(function(line) {
-        var sps = line.markedSpans;
-        if (sps) for (var i = 0; i < sps.length; ++i)
-          if (sps[i].from != null) markers.push(sps[i].marker);
-      });
-      return markers;
-    },
-
-    posFromIndex: function(off) {
-      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
-      this.iter(function(line) {
-        var sz = line.text.length + sepSize;
-        if (sz > off) { ch = off; return true; }
-        off -= sz;
-        ++lineNo;
-      });
-      return clipPos(this, Pos(lineNo, ch));
-    },
-    indexFromPos: function (coords) {
-      coords = clipPos(this, coords);
-      var index = coords.ch;
-      if (coords.line < this.first || coords.ch < 0) return 0;
-      var sepSize = this.lineSeparator().length;
-      this.iter(this.first, coords.line, function (line) {
-        index += line.text.length + sepSize;
-      });
-      return index;
-    },
-
-    copy: function(copyHistory) {
-      var doc = new Doc(getLines(this, this.first, this.first + this.size),
-                        this.modeOption, this.first, this.lineSep);
-      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
-      doc.sel = this.sel;
-      doc.extend = false;
-      if (copyHistory) {
-        doc.history.undoDepth = this.history.undoDepth;
-        doc.setHistory(this.getHistory());
-      }
-      return doc;
-    },
-
-    linkedDoc: function(options) {
-      if (!options) options = {};
-      var from = this.first, to = this.first + this.size;
-      if (options.from != null && options.from > from) from = options.from;
-      if (options.to != null && options.to < to) to = options.to;
-      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep);
-      if (options.sharedHist) copy.history = this.history;
-      (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
-      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
-      copySharedMarkers(copy, findSharedMarkers(this));
-      return copy;
-    },
-    unlinkDoc: function(other) {
-      if (other instanceof CodeMirror) other = other.doc;
-      if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
-        var link = this.linked[i];
-        if (link.doc != other) continue;
-        this.linked.splice(i, 1);
-        other.unlinkDoc(this);
-        detachSharedMarkers(findSharedMarkers(this));
-        break;
-      }
-      // If the histories were shared, split them again
-      if (other.history == this.history) {
-        var splitIds = [other.id];
-        linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
-        other.history = new History(null);
-        other.history.done = copyHistoryArray(this.history.done, splitIds);
-        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
-      }
-    },
-    iterLinkedDocs: function(f) {linkedDocs(this, f);},
-
-    getMode: function() {return this.mode;},
-    getEditor: function() {return this.cm;},
-
-    splitLines: function(str) {
-      if (this.lineSep) return str.split(this.lineSep);
-      return splitLinesAuto(str);
-    },
-    lineSeparator: function() { return this.lineSep || "\n"; }
-  });
-
-  // Public alias.
-  Doc.prototype.eachLine = Doc.prototype.iter;
-
-  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
-  var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
-  for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
-    CodeMirror.prototype[prop] = (function(method) {
-      return function() {return method.apply(this.doc, arguments);};
-    })(Doc.prototype[prop]);
-
-  eventMixin(Doc);
-
-  // Call f for all linked documents.
-  function linkedDocs(doc, f, sharedHistOnly) {
-    function propagate(doc, skip, sharedHist) {
-      if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
-        var rel = doc.linked[i];
-        if (rel.doc == skip) continue;
-        var shared = sharedHist && rel.sharedHist;
-        if (sharedHistOnly && !shared) continue;
-        f(rel.doc, shared);
-        propagate(rel.doc, doc, shared);
-      }
-    }
-    propagate(doc, null, true);
-  }
-
-  // Attach a document to an editor.
-  function attachDoc(cm, doc) {
-    if (doc.cm) throw new Error("This document is already in use.");
-    cm.doc = doc;
-    doc.cm = cm;
-    estimateLineHeights(cm);
-    loadMode(cm);
-    if (!cm.options.lineWrapping) findMaxLine(cm);
-    cm.options.mode = doc.modeOption;
-    regChange(cm);
-  }
-
-  // LINE UTILITIES
-
-  // Find the line object corresponding to the given line number.
-  function getLine(doc, n) {
-    n -= doc.first;
-    if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");
-    for (var chunk = doc; !chunk.lines;) {
-      for (var i = 0;; ++i) {
-        var child = chunk.children[i], sz = child.chunkSize();
-        if (n < sz) { chunk = child; break; }
-        n -= sz;
-      }
-    }
-    return chunk.lines[n];
-  }
-
-  // Get the part of a document between two positions, as an array of
-  // strings.
-  function getBetween(doc, start, end) {
-    var out = [], n = start.line;
-    doc.iter(start.line, end.line + 1, function(line) {
-      var text = line.text;
-      if (n == end.line) text = text.slice(0, end.ch);
-      if (n == start.line) text = text.slice(start.ch);
-      out.push(text);
-      ++n;
-    });
-    return out;
-  }
-  // Get the lines between from and to, as array of strings.
-  function getLines(doc, from, to) {
-    var out = [];
-    doc.iter(from, to, function(line) { out.push(line.text); });
-    return out;
-  }
-
-  // Update the height of a line, propagating the height change
-  // upwards to parent nodes.
-  function updateLineHeight(line, height) {
-    var diff = height - line.height;
-    if (diff) for (var n = line; n; n = n.parent) n.height += diff;
-  }
-
-  // Given a line object, find its line number by walking up through
-  // its parent links.
-  function lineNo(line) {
-    if (line.parent == null) return null;
-    var cur = line.parent, no = indexOf(cur.lines, line);
-    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
-      for (var i = 0;; ++i) {
-        if (chunk.children[i] == cur) break;
-        no += chunk.children[i].chunkSize();
-      }
-    }
-    return no + cur.first;
-  }
-
-  // Find the line at the given vertical position, using the height
-  // information in the document tree.
-  function lineAtHeight(chunk, h) {
-    var n = chunk.first;
-    outer: do {
-      for (var i = 0; i < chunk.children.length; ++i) {
-        var child = chunk.children[i], ch = child.height;
-        if (h < ch) { chunk = child; continue outer; }
-        h -= ch;
-        n += child.chunkSize();
-      }
-      return n;
-    } while (!chunk.lines);
-    for (var i = 0; i < chunk.lines.length; ++i) {
-      var line = chunk.lines[i], lh = line.height;
-      if (h < lh) break;
-      h -= lh;
-    }
-    return n + i;
-  }
-
-
-  // Find the height above the given line.
-  function heightAtLine(lineObj) {
-    lineObj = visualLine(lineObj);
-
-    var h = 0, chunk = lineObj.parent;
-    for (var i = 0; i < chunk.lines.length; ++i) {
-      var line = chunk.lines[i];
-      if (line == lineObj) break;
-      else h += line.height;
-    }
-    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
-      for (var i = 0; i < p.children.length; ++i) {
-        var cur = p.children[i];
-        if (cur == chunk) break;
-        else h += cur.height;
-      }
-    }
-    return h;
-  }
-
-  // Get the bidi ordering for the given line (and cache it). Returns
-  // false for lines that are fully left-to-right, and an array of
-  // BidiSpan objects otherwise.
-  function getOrder(line) {
-    var order = line.order;
-    if (order == null) order = line.order = bidiOrdering(line.text);
-    return order;
-  }
-
-  // HISTORY
-
-  function History(startGen) {
-    // Arrays of change events and selections. Doing something adds an
-    // event to done and clears undo. Undoing moves events from done
-    // to undone, redoing moves them in the other direction.
-    this.done = []; this.undone = [];
-    this.undoDepth = Infinity;
-    // Used to track when changes can be merged into a single undo
-    // event
-    this.lastModTime = this.lastSelTime = 0;
-    this.lastOp = this.lastSelOp = null;
-    this.lastOrigin = this.lastSelOrigin = null;
-    // Used by the isClean() method
-    this.generation = this.maxGeneration = startGen || 1;
-  }
-
-  // Create a history change event from an updateDoc-style change
-  // object.
-  function historyChangeFromChange(doc, change) {
-    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
-    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
-    linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
-    return histChange;
-  }
-
-  // Pop all selection events off the end of a history array. Stop at
-  // a change event.
-  function clearSelectionEvents(array) {
-    while (array.length) {
-      var last = lst(array);
-      if (last.ranges) array.pop();
-      else break;
-    }
-  }
-
-  // Find the top change event in the history. Pop off selection
-  // events that are in the way.
-  function lastChangeEvent(hist, force) {
-    if (force) {
-      clearSelectionEvents(hist.done);
-      return lst(hist.done);
-    } else if (hist.done.length && !lst(hist.done).ranges) {
-      return lst(hist.done);
-    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
-      hist.done.pop();
-      return lst(hist.done);
-    }
-  }
-
-  // Register a change in the history. Merges changes that are within
-  // a single operation, ore are close together with an origin that
-  // allows merging (starting with "+") into a single event.
-  function addChangeToHistory(doc, change, selAfter, opId) {
-    var hist = doc.history;
-    hist.undone.length = 0;
-    var time = +new Date, cur;
-
-    if ((hist.lastOp == opId ||
-         hist.lastOrigin == change.origin && change.origin &&
-         ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
-          change.origin.charAt(0) == "*")) &&
-        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
-      // Merge this change into the last event
-      var last = lst(cur.changes);
-      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
-        // Optimized case for simple insertion -- don't want to add
-        // new changesets for every character typed
-        last.to = changeEnd(change);
-      } else {
-        // Add new sub-event
-        cur.changes.push(historyChangeFromChange(doc, change));
-      }
-    } else {
-      // Can not be merged, start a new event.
-      var before = lst(hist.done);
-      if (!before || !before.ranges)
-        pushSelectionToHistory(doc.sel, hist.done);
-      cur = {changes: [historyChangeFromChange(doc, change)],
-             generation: hist.generation};
-      hist.done.push(cur);
-      while (hist.done.length > hist.undoDepth) {
-        hist.done.shift();
-        if (!hist.done[0].ranges) hist.done.shift();
-      }
-    }
-    hist.done.push(selAfter);
-    hist.generation = ++hist.maxGeneration;
-    hist.lastModTime = hist.lastSelTime = time;
-    hist.lastOp = hist.lastSelOp = opId;
-    hist.lastOrigin = hist.lastSelOrigin = change.origin;
-
-    if (!last) signal(doc, "historyAdded");
-  }
-
-  function selectionEventCanBeMerged(doc, origin, prev, sel) {
-    var ch = origin.charAt(0);
-    return ch == "*" ||
-      ch == "+" &&
-      prev.ranges.length == sel.ranges.length &&
-      prev.somethingSelected() == sel.somethingSelected() &&
-      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);
-  }
-
-  // Called whenever the selection changes, sets the new selection as
-  // the pending selection in the history, and pushes the old pending
-  // selection into the 'done' array when it was significantly
-  // different (in number of selected ranges, emptiness, or time).
-  function addSelectionToHistory(doc, sel, opId, options) {
-    var hist = doc.history, origin = options && options.origin;
-
-    // A new event is started when the previous origin does not match
-    // the current, or the origins don't allow matching. Origins
-    // starting with * are always merged, those starting with + are
-    // merged when similar and close together in time.
-    if (opId == hist.lastSelOp ||
-        (origin && hist.lastSelOrigin == origin &&
-         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
-          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
-      hist.done[hist.done.length - 1] = sel;
-    else
-      pushSelectionToHistory(sel, hist.done);
-
-    hist.lastSelTime = +new Date;
-    hist.lastSelOrigin = origin;
-    hist.lastSelOp = opId;
-    if (options && options.clearRedo !== false)
-      clearSelectionEvents(hist.undone);
-  }
-
-  function pushSelectionToHistory(sel, dest) {
-    var top = lst(dest);
-    if (!(top && top.ranges && top.equals(sel)))
-      dest.push(sel);
-  }
-
-  // Used to store marked span information in the history.
-  function attachLocalSpans(doc, change, from, to) {
-    var existing = change["spans_" + doc.id], n = 0;
-    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
-      if (line.markedSpans)
-        (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
-      ++n;
-    });
-  }
-
-  // When un/re-doing restores text containing marked spans, those
-  // that have been explicitly cleared should not be restored.
-  function removeClearedSpans(spans) {
-    if (!spans) return null;
-    for (var i = 0, out; i < spans.length; ++i) {
-      if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
-      else if (out) out.push(spans[i]);
-    }
-    return !out ? spans : out.length ? out : null;
-  }
-
-  // Retrieve and filter the old marked spans stored in a change event.
-  function getOldSpans(doc, change) {
-    var found = change["spans_" + doc.id];
-    if (!found) return null;
-    for (var i = 0, nw = []; i < change.text.length; ++i)
-      nw.push(removeClearedSpans(found[i]));
-    return nw;
-  }
-
-  // Used both to provide a JSON-safe object in .getHistory, and, when
-  // detaching a document, to split the history in two
-  function copyHistoryArray(events, newGroup, instantiateSel) {
-    for (var i = 0, copy = []; i < events.length; ++i) {
-      var event = events[i];
-      if (event.ranges) {
-        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
-        continue;
-      }
-      var changes = event.changes, newChanges = [];
-      copy.push({changes: newChanges});
-      for (var j = 0; j < changes.length; ++j) {
-        var change = changes[j], m;
-        newChanges.push({from: change.from, to: change.to, text: change.text});
-        if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
-          if (indexOf(newGroup, Number(m[1])) > -1) {
-            lst(newChanges)[prop] = change[prop];
-            delete change[prop];
-          }
-        }
-      }
-    }
-    return copy;
-  }
-
-  // Rebasing/resetting history to deal with externally-sourced changes
-
-  function rebaseHistSelSingle(pos, from, to, diff) {
-    if (to < pos.line) {
-      pos.line += diff;
-    } else if (from < pos.line) {
-      pos.line = from;
-      pos.ch = 0;
-    }
-  }
-
-  // Tries to rebase an array of history events given a change in the
-  // document. If the change touches the same lines as the event, the
-  // event, and everything 'behind' it, is discarded. If the change is
-  // before the event, the event's positions are updated. Uses a
-  // copy-on-write scheme for the positions, to avoid having to
-  // reallocate them all on every rebase, but also avoid problems with
-  // shared position objects being unsafely updated.
-  function rebaseHistArray(array, from, to, diff) {
-    for (var i = 0; i < array.length; ++i) {
-      var sub = array[i], ok = true;
-      if (sub.ranges) {
-        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
-        for (var j = 0; j < sub.ranges.length; j++) {
-          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
-          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
-        }
-        continue;
-      }
-      for (var j = 0; j < sub.changes.length; ++j) {
-        var cur = sub.changes[j];
-        if (to < cur.from.line) {
-          cur.from = Pos(cur.from.line + diff, cur.from.ch);
-          cur.to = Pos(cur.to.line + diff, cur.to.ch);
-        } else if (from <= cur.to.line) {
-          ok = false;
-          break;
-        }
-      }
-      if (!ok) {
-        array.splice(0, i + 1);
-        i = 0;
-      }
-    }
-  }
-
-  function rebaseHist(hist, change) {
-    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
-    rebaseHistArray(hist.done, from, to, diff);
-    rebaseHistArray(hist.undone, from, to, diff);
-  }
-
-  // EVENT UTILITIES
-
-  // Due to the fact that we still support jurassic IE versions, some
-  // compatibility wrappers are needed.
-
-  var e_preventDefault = CodeMirror.e_preventDefault = function(e) {
-    if (e.preventDefault) e.preventDefault();
-    else e.returnValue = false;
-  };
-  var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {
-    if (e.stopPropagation) e.stopPropagation();
-    else e.cancelBubble = true;
-  };
-  function e_defaultPrevented(e) {
-    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
-  }
-  var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};
-
-  function e_target(e) {return e.target || e.srcElement;}
-  function e_button(e) {
-    var b = e.which;
-    if (b == null) {
-      if (e.button & 1) b = 1;
-      else if (e.button & 2) b = 3;
-      else if (e.button & 4) b = 2;
-    }
-    if (mac && e.ctrlKey && b == 1) b = 3;
-    return b;
-  }
-
-  // EVENT HANDLING
-
-  // Lightweight event framework. on/off also work on DOM nodes,
-  // registering native DOM handlers.
-
-  var on = CodeMirror.on = function(emitter, type, f) {
-    if (emitter.addEventListener)
-      emitter.addEventListener(type, f, false);
-    else if (emitter.attachEvent)
-      emitter.attachEvent("on" + type, f);
-    else {
-      var map = emitter._handlers || (emitter._handlers = {});
-      var arr = map[type] || (map[type] = []);
-      arr.push(f);
-    }
-  };
-
-  var noHandlers = []
-  function getHandlers(emitter, type, copy) {
-    var arr = emitter._handlers && emitter._handlers[type]
-    if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
-    else return arr || noHandlers
-  }
-
-  var off = CodeMirror.off = function(emitter, type, f) {
-    if (emitter.removeEventListener)
-      emitter.removeEventListener(type, f, false);
-    else if (emitter.detachEvent)
-      emitter.detachEvent("on" + type, f);
-    else {
-      var handlers = getHandlers(emitter, type, false)
-      for (var i = 0; i < handlers.length; ++i)
-        if (handlers[i] == f) { handlers.splice(i, 1); break; }
-    }
-  };
-
-  var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {
-    var handlers = getHandlers(emitter, type, true)
-    if (!handlers.length) return;
-    var args = Array.prototype.slice.call(arguments, 2);
-    for (var i = 0; i < handlers.length; ++i) handlers[i].apply(null, args);
-  };
-
-  var orphanDelayedCallbacks = null;
-
-  // Often, we want to signal events at a point where we are in the
-  // middle of some work, but don't want the handler to start calling
-  // other methods on the editor, which might be in an inconsistent
-  // state or simply not expect any other events to happen.
-  // signalLater looks whether there are any handlers, and schedules
-  // them to be executed when the last operation ends, or, if no
-  // operation is active, when a timeout fires.
-  function signalLater(emitter, type /*, values...*/) {
-    var arr = getHandlers(emitter, type, false)
-    if (!arr.length) return;
-    var args = Array.prototype.slice.call(arguments, 2), list;
-    if (operationGroup) {
-      list = operationGroup.delayedCallbacks;
-    } else if (orphanDelayedCallbacks) {
-      list = orphanDelayedCallbacks;
-    } else {
-      list = orphanDelayedCallbacks = [];
-      setTimeout(fireOrphanDelayed, 0);
-    }
-    function bnd(f) {return function(){f.apply(null, args);};};
-    for (var i = 0; i < arr.length; ++i)
-      list.push(bnd(arr[i]));
-  }
-
-  function fireOrphanDelayed() {
-    var delayed = orphanDelayedCallbacks;
-    orphanDelayedCallbacks = null;
-    for (var i = 0; i < delayed.length; ++i) delayed[i]();
-  }
-
-  // The DOM events that CodeMirror handles can be overridden by
-  // registering a (non-DOM) handler on the editor for the event name,
-  // and preventDefault-ing the event in that handler.
-  function signalDOMEvent(cm, e, override) {
-    if (typeof e == "string")
-      e = {type: e, preventDefault: function() { this.defaultPrevented = true; }};
-    signal(cm, override || e.type, cm, e);
-    return e_defaultPrevented(e) || e.codemirrorIgnore;
-  }
-
-  function signalCursorActivity(cm) {
-    var arr = cm._handlers && cm._handlers.cursorActivity;
-    if (!arr) return;
-    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
-    for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
-      set.push(arr[i]);
-  }
-
-  function hasHandler(emitter, type) {
-    return getHandlers(emitter, type).length > 0
-  }
-
-  // Add on and off methods to a constructor's prototype, to make
-  // registering events on such objects more convenient.
-  function eventMixin(ctor) {
-    ctor.prototype.on = function(type, f) {on(this, type, f);};
-    ctor.prototype.off = function(type, f) {off(this, type, f);};
-  }
-
-  // MISC UTILITIES
-
-  // Number of pixels added to scroller and sizer to hide scrollbar
-  var scrollerGap = 30;
-
-  // Returned or thrown by various protocols to signal 'I'm not
-  // handling this'.
-  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
-
-  // Reused option objects for setSelection & friends
-  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
-
-  function Delayed() {this.id = null;}
-  Delayed.prototype.set = function(ms, f) {
-    clearTimeout(this.id);
-    this.id = setTimeout(f, ms);
-  };
-
-  // Counts the column offset in a string, taking tabs into account.
-  // Used mostly to find indentation.
-  var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {
-    if (end == null) {
-      end = string.search(/[^\s\u00a0]/);
-      if (end == -1) end = string.length;
-    }
-    for (var i = startIndex || 0, n = startValue || 0;;) {
-      var nextTab = string.indexOf("\t", i);
-      if (nextTab < 0 || nextTab >= end)
-        return n + (end - i);
-      n += nextTab - i;
-      n += tabSize - (n % tabSize);
-      i = nextTab + 1;
-    }
-  };
-
-  // The inverse of countColumn -- find the offset that corresponds to
-  // a particular column.
-  var findColumn = CodeMirror.findColumn = function(string, goal, tabSize) {
-    for (var pos = 0, col = 0;;) {
-      var nextTab = string.indexOf("\t", pos);
-      if (nextTab == -1) nextTab = string.length;
-      var skipped = nextTab - pos;
-      if (nextTab == string.length || col + skipped >= goal)
-        return pos + Math.min(skipped, goal - col);
-      col += nextTab - pos;
-      col += tabSize - (col % tabSize);
-      pos = nextTab + 1;
-      if (col >= goal) return pos;
-    }
-  }
-
-  var spaceStrs = [""];
-  function spaceStr(n) {
-    while (spaceStrs.length <= n)
-      spaceStrs.push(lst(spaceStrs) + " ");
-    return spaceStrs[n];
-  }
-
-  function lst(arr) { return arr[arr.length-1]; }
-
-  var selectInput = function(node) { node.select(); };
-  if (ios) // Mobile Safari apparently has a bug where select() is broken.
-    selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };
-  else if (ie) // Suppress mysterious IE10 errors
-    selectInput = function(node) { try { node.select(); } catch(_e) {} };
-
-  function indexOf(array, elt) {
-    for (var i = 0; i < array.length; ++i)
-      if (array[i] == elt) return i;
-    return -1;
-  }
-  function map(array, f) {
-    var out = [];
-    for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);
-    return out;
-  }
-
-  function nothing() {}
-
-  function createObj(base, props) {
-    var inst;
-    if (Object.create) {
-      inst = Object.create(base);
-    } else {
-      nothing.prototype = base;
-      inst = new nothing();
-    }
-    if (props) copyObj(props, inst);
-    return inst;
-  };
-
-  function copyObj(obj, target, overwrite) {
-    if (!target) target = {};
-    for (var prop in obj)
-      if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
-        target[prop] = obj[prop];
-    return target;
-  }
-
-  function bind(f) {
-    var args = Array.prototype.slice.call(arguments, 1);
-    return function(){return f.apply(null, args);};
-  }
-
-  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
-  var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
-    return /\w/.test(ch) || ch > "\x80" &&
-      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
-  };
-  function isWordChar(ch, helper) {
-    if (!helper) return isWordCharBasic(ch);
-    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;
-    return helper.test(ch);
-  }
-
-  function isEmpty(obj) {
-    for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
-    return true;
-  }
-
-  // Extending unicode characters. A series of a non-extending char +
-  // any number of extending chars is treated as a single unit as far
-  // as editing and measuring is concerned. This is not fully correct,
-  // since some scripts/fonts/browsers also treat other configurations
-  // of code points as a group.
-  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
-  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }
-
-  // DOM UTILITIES
-
-  function elt(tag, content, className, style) {
-    var e = document.createElement(tag);
-    if (className) e.className = className;
-    if (style) e.style.cssText = style;
-    if (typeof content == "string") e.appendChild(document.createTextNode(content));
-    else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
-    return e;
-  }
-
-  var range;
-  if (document.createRange) range = function(node, start, end, endNode) {
-    var r = document.createRange();
-    r.setEnd(endNode || node, end);
-    r.setStart(node, start);
-    return r;
-  };
-  else range = function(node, start, end) {
-    var r = document.body.createTextRange();
-    try { r.moveToElementText(node.parentNode); }
-    catch(e) { return r; }
-    r.collapse(true);
-    r.moveEnd("character", end);
-    r.moveStart("character", start);
-    return r;
-  };
-
-  function removeChildren(e) {
-    for (var count = e.childNodes.length; count > 0; --count)
-      e.removeChild(e.firstChild);
-    return e;
-  }
-
-  function removeChildrenAndAdd(parent, e) {
-    return removeChildren(parent).appendChild(e);
-  }
-
-  var contains = CodeMirror.contains = function(parent, child) {
-    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
-      child = child.parentNode;
-    if (parent.contains)
-      return parent.contains(child);
-    do {
-      if (child.nodeType == 11) child = child.host;
-      if (child == parent) return true;
-    } while (child = child.parentNode);
-  };
-
-  function activeElt() {
-    var activeElement = document.activeElement;
-    while (activeElement && activeElement.root && activeElement.root.activeElement)
-      activeElement = activeElement.root.activeElement;
-    return activeElement;
-  }
-  // Older versions of IE throws unspecified error when touching
-  // document.activeElement in some cases (during loading, in iframe)
-  if (ie && ie_version < 11) activeElt = function() {
-    try { return document.activeElement; }
-    catch(e) { return document.body; }
-  };
-
-  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); }
-  var rmClass = CodeMirror.rmClass = function(node, cls) {
-    var current = node.className;
-    var match = classTest(cls).exec(current);
-    if (match) {
-      var after = current.slice(match.index + match[0].length);
-      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
-    }
-  };
-  var addClass = CodeMirror.addClass = function(node, cls) {
-    var current = node.className;
-    if (!classTest(cls).test(current)) node.className += (current ? " " : "") + cls;
-  };
-  function joinClasses(a, b) {
-    var as = a.split(" ");
-    for (var i = 0; i < as.length; i++)
-      if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
-    return b;
-  }
-
-  // WINDOW-WIDE EVENTS
-
-  // These must be handled carefully, because naively registering a
-  // handler for each editor will cause the editors to never be
-  // garbage collected.
-
-  function forEachCodeMirror(f) {
-    if (!document.body.getElementsByClassName) return;
-    var byClass = document.body.getElementsByClassName("CodeMirror");
-    for (var i = 0; i < byClass.length; i++) {
-      var cm = byClass[i].CodeMirror;
-      if (cm) f(cm);
-    }
-  }
-
-  var globalsRegistered = false;
-  function ensureGlobalHandlers() {
-    if (globalsRegistered) return;
-    registerGlobalHandlers();
-    globalsRegistered = true;
-  }
-  function registerGlobalHandlers() {
-    // When the window resizes, we need to refresh active editors.
-    var resizeTimer;
-    on(window, "resize", function() {
-      if (resizeTimer == null) resizeTimer = setTimeout(function() {
-        resizeTimer = null;
-        forEachCodeMirror(onResize);
-      }, 100);
-    });
-    // When the window loses focus, we want to show the editor as blurred
-    on(window, "blur", function() {
-      forEachCodeMirror(onBlur);
-    });
-  }
-
-  // FEATURE DETECTION
-
-  // Detect drag-and-drop
-  var dragAndDrop = function() {
-    // There is *some* kind of drag-and-drop support in IE6-8, but I
-    // couldn't get it to work yet.
-    if (ie && ie_version < 9) return false;
-    var div = elt('div');
-    return "draggable" in div || "dragDrop" in div;
-  }();
-
-  var zwspSupported;
-  function zeroWidthElement(measure) {
-    if (zwspSupported == null) {
-      var test = elt("span", "\u200b");
-      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
-      if (measure.firstChild.offsetHeight != 0)
-        zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);
-    }
-    var node = zwspSupported ? elt("span", "\u200b") :
-      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
-    node.setAttribute("cm-text", "");
-    return node;
-  }
-
-  // Feature-detect IE's crummy client rect reporting for bidi text
-  var badBidiRects;
-  function hasBadBidiRects(measure) {
-    if (badBidiRects != null) return badBidiRects;
-    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
-    var r0 = range(txt, 0, 1).getBoundingClientRect();
-    if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
-    var r1 = range(txt, 1, 2).getBoundingClientRect();
-    return badBidiRects = (r1.right - r0.right < 3);
-  }
-
-  // See if "".split is the broken IE version, if so, provide an
-  // alternative way to split lines.
-  var splitLinesAuto = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
-    var pos = 0, result = [], l = string.length;
-    while (pos <= l) {
-      var nl = string.indexOf("\n", pos);
-      if (nl == -1) nl = string.length;
-      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
-      var rt = line.indexOf("\r");
-      if (rt != -1) {
-        result.push(line.slice(0, rt));
-        pos += rt + 1;
-      } else {
-        result.push(line);
-        pos = nl + 1;
-      }
-    }
-    return result;
-  } : function(string){return string.split(/\r\n?|\n/);};
-
-  var hasSelection = window.getSelection ? function(te) {
-    try { return te.selectionStart != te.selectionEnd; }
-    catch(e) { return false; }
-  } : function(te) {
-    try {var range = te.ownerDocument.selection.createRange();}
-    catch(e) {}
-    if (!range || range.parentElement() != te) return false;
-    return range.compareEndPoints("StartToEnd", range) != 0;
-  };
-
-  var hasCopyEvent = (function() {
-    var e = elt("div");
-    if ("oncopy" in e) return true;
-    e.setAttribute("oncopy", "return;");
-    return typeof e.oncopy == "function";
-  })();
-
-  var badZoomedRects = null;
-  function hasBadZoomedRects(measure) {
-    if (badZoomedRects != null) return badZoomedRects;
-    var node = removeChildrenAndAdd(measure, elt("span", "x"));
-    var normal = node.getBoundingClientRect();
-    var fromRange = range(node, 0, 1).getBoundingClientRect();
-    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;
-  }
-
-  // KEY NAMES
-
-  var keyNames = CodeMirror.keyNames = {
-    3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
-    19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
-    36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
-    46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
-    106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete",
-    173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
-    221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
-    63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
-  };
-  (function() {
-    // Number keys
-    for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
-    // Alphabetic keys
-    for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
-    // Function keys
-    for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
-  })();
-
-  // BIDI HELPERS
-
-  function iterateBidiSections(order, from, to, f) {
-    if (!order) return f(from, to, "ltr");
-    var found = false;
-    for (var i = 0; i < order.length; ++i) {
-      var part = order[i];
-      if (part.from < to && part.to > from || from == to && part.to == from) {
-        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
-        found = true;
-      }
-    }
-    if (!found) f(from, to, "ltr");
-  }
-
-  function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
-  function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
-
-  function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
-  function lineRight(line) {
-    var order = getOrder(line);
-    if (!order) return line.text.length;
-    return bidiRight(lst(order));
-  }
-
-  function lineStart(cm, lineN) {
-    var line = getLine(cm.doc, lineN);
-    var visual = visualLine(line);
-    if (visual != line) lineN = lineNo(visual);
-    var order = getOrder(visual);
-    var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
-    return Pos(lineN, ch);
-  }
-  function lineEnd(cm, lineN) {
-    var merged, line = getLine(cm.doc, lineN);
-    while (merged = collapsedSpanAtEnd(line)) {
-      line = merged.find(1, true).line;
-      lineN = null;
-    }
-    var order = getOrder(line);
-    var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
-    return Pos(lineN == null ? lineNo(line) : lineN, ch);
-  }
-  function lineStartSmart(cm, pos) {
-    var start = lineStart(cm, pos.line);
-    var line = getLine(cm.doc, start.line);
-    var order = getOrder(line);
-    if (!order || order[0].level == 0) {
-      var firstNonWS = Math.max(0, line.text.search(/\S/));
-      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
-      return Pos(start.line, inWS ? 0 : firstNonWS);
-    }
-    return start;
-  }
-
-  function compareBidiLevel(order, a, b) {
-    var linedir = order[0].level;
-    if (a == linedir) return true;
-    if (b == linedir) return false;
-    return a < b;
-  }
-  var bidiOther;
-  function getBidiPartAt(order, pos) {
-    bidiOther = null;
-    for (var i = 0, found; i < order.length; ++i) {
-      var cur = order[i];
-      if (cur.from < pos && cur.to > pos) return i;
-      if ((cur.from == pos || cur.to == pos)) {
-        if (found == null) {
-          found = i;
-        } else if (compareBidiLevel(order, cur.level, order[found].level)) {
-          if (cur.from != cur.to) bidiOther = found;
-          return i;
-        } else {
-          if (cur.from != cur.to) bidiOther = i;
-          return found;
-        }
-      }
-    }
-    return found;
-  }
-
-  function moveInLine(line, pos, dir, byUnit) {
-    if (!byUnit) return pos + dir;
-    do pos += dir;
-    while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
-    return pos;
-  }
-
-  // This is needed in order to move 'visually' through bi-directional
-  // text -- i.e., pressing left should make the cursor go left, even
-  // when in RTL text. The tricky part is the 'jumps', where RTL and
-  // LTR text touch each other. This often requires the cursor offset
-  // to move more than one unit, in order to visually move one unit.
-  function moveVisually(line, start, dir, byUnit) {
-    var bidi = getOrder(line);
-    if (!bidi) return moveLogically(line, start, dir, byUnit);
-    var pos = getBidiPartAt(bidi, start), part = bidi[pos];
-    var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
-
-    for (;;) {
-      if (target > part.from && target < part.to) return target;
-      if (target == part.from || target == part.to) {
-        if (getBidiPartAt(bidi, target) == pos) return target;
-        part = bidi[pos += dir];
-        return (dir > 0) == part.level % 2 ? part.to : part.from;
-      } else {
-        part = bidi[pos += dir];
-        if (!part) return null;
-        if ((dir > 0) == part.level % 2)
-          target = moveInLine(line, part.to, -1, byUnit);
-        else
-          target = moveInLine(line, part.from, 1, byUnit);
-      }
-    }
-  }
-
-  function moveLogically(line, start, dir, byUnit) {
-    var target = start + dir;
-    if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
-    return target < 0 || target > line.text.length ? null : target;
-  }
-
-  // Bidirectional ordering algorithm
-  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
-  // that this (partially) implements.
-
-  // One-char codes used for character types:
-  // L (L):   Left-to-Right
-  // R (R):   Right-to-Left
-  // r (AL):  Right-to-Left Arabic
-  // 1 (EN):  European Number
-  // + (ES):  European Number Separator
-  // % (ET):  European Number Terminator
-  // n (AN):  Arabic Number
-  // , (CS):  Common Number Separator
-  // m (NSM): Non-Spacing Mark
-  // b (BN):  Boundary Neutral
-  // s (B):   Paragraph Separator
-  // t (S):   Segment Separator
-  // w (WS):  Whitespace
-  // N (ON):  Other Neutrals
-
-  // Returns null if characters are ordered as they appear
-  // (left-to-right), or an array of sections ({from, to, level}
-  // objects) in the order in which they occur visually.
-  var bidiOrdering = (function() {
-    // Character types for codepoints 0 to 0xff
-    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
-    // Character types for codepoints 0x600 to 0x6ff
-    var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";
-    function charType(code) {
-      if (code <= 0xf7) return lowTypes.charAt(code);
-      else if (0x590 <= code && code <= 0x5f4) return "R";
-      else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);
-      else if (0x6ee <= code && code <= 0x8ac) return "r";
-      else if (0x2000 <= code && code <= 0x200b) return "w";
-      else if (code == 0x200c) return "b";
-      else return "L";
-    }
-
-    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
-    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
-    // Browsers seem to always treat the boundaries of block elements as being L.
-    var outerType = "L";
-
-    function BidiSpan(level, from, to) {
-      this.level = level;
-      this.from = from; this.to = to;
-    }
-
-    return function(str) {
-      if (!bidiRE.test(str)) return false;
-      var len = str.length, types = [];
-      for (var i = 0, type; i < len; ++i)
-        types.push(type = charType(str.charCodeAt(i)));
-
-      // W1. Examine each non-spacing mark (NSM) in the level run, and
-      // change the type of the NSM to the type of the previous
-      // character. If the NSM is at the start of the level run, it will
-      // get the type of sor.
-      for (var i = 0, prev = outerType; i < len; ++i) {
-        var type = types[i];
-        if (type == "m") types[i] = prev;
-        else prev = type;
-      }
-
-      // W2. Search backwards from each instance of a European number
-      // until the first strong type (R, L, AL, or sor) is found. If an
-      // AL is found, change the type of the European number to Arabic
-      // number.
-      // W3. Change all ALs to R.
-      for (var i = 0, cur = outerType; i < len; ++i) {
-        var type = types[i];
-        if (type == "1" && cur == "r") types[i] = "n";
-        else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
-      }
-
-      // W4. A single European separator between two European numbers
-      // changes to a European number. A single common separator between
-      // two numbers of the same type changes to that type.
-      for (var i = 1, prev = types[0]; i < len - 1; ++i) {
-        var type = types[i];
-        if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
-        else if (type == "," && prev == types[i+1] &&
-                 (prev == "1" || prev == "n")) types[i] = prev;
-        prev = type;
-      }
-
-      // W5. A sequence of European terminators adjacent to European
-      // numbers changes to all European numbers.
-      // W6. Otherwise, separators and terminators change to Other
-      // Neutral.
-      for (var i = 0; i < len; ++i) {
-        var type = types[i];
-        if (type == ",") types[i] = "N";
-        else if (type == "%") {
-          for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
-          var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
-          for (var j = i; j < end; ++j) types[j] = replace;
-          i = end - 1;
-        }
-      }
-
-      // W7. Search backwards from each instance of a European number
-      // until the first strong type (R, L, or sor) is found. If an L is
-      // found, then change the type of the European number to L.
-      for (var i = 0, cur = outerType; i < len; ++i) {
-        var type = types[i];
-        if (cur == "L" && type == "1") types[i] = "L";
-        else if (isStrong.test(type)) cur = type;
-      }
-
-      // N1. A sequence of neutrals takes the direction of the
-      // surrounding strong text if the text on both sides has the same
-      // direction. European and Arabic numbers act as if they were R in
-      // terms of their influence on neutrals. Start-of-level-run (sor)
-      // and end-of-level-run (eor) are used at level run boundaries.
-      // N2. Any remaining neutrals take the embedding direction.
-      for (var i = 0; i < len; ++i) {
-        if (isNeutral.test(types[i])) {
-          for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
-          var before = (i ? types[i-1] : outerType) == "L";
-          var after = (end < len ? types[end] : outerType) == "L";
-          var replace = before || after ? "L" : "R";
-          for (var j = i; j < end; ++j) types[j] = replace;
-          i = end - 1;
-        }
-      }
-
-      // Here we depart from the documented algorithm, in order to avoid
-      // building up an actual levels array. Since there are only three
-      // levels (0, 1, 2) in an implementation that doesn't take
-      // explicit embedding into account, we can build up the order on
-      // the fly, without following the level-based algorithm.
-      var order = [], m;
-      for (var i = 0; i < len;) {
-        if (countsAsLeft.test(types[i])) {
-          var start = i;
-          for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
-          order.push(new BidiSpan(0, start, i));
-        } else {
-          var pos = i, at = order.length;
-          for (++i; i < len && types[i] != "L"; ++i) {}
-          for (var j = pos; j < i;) {
-            if (countsAsNum.test(types[j])) {
-              if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));
-              var nstart = j;
-              for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
-              order.splice(at, 0, new BidiSpan(2, nstart, j));
-              pos = j;
-            } else ++j;
-          }
-          if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));
-        }
-      }
-      if (order[0].level == 1 && (m = str.match(/^\s+/))) {
-        order[0].from = m[0].length;
-        order.unshift(new BidiSpan(0, 0, m[0].length));
-      }
-      if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
-        lst(order).to -= m[0].length;
-        order.push(new BidiSpan(0, len - m[0].length, len));
-      }
-      if (order[0].level == 2)
-        order.unshift(new BidiSpan(1, order[0].to, order[0].to));
-      if (order[0].level != lst(order).level)
-        order.push(new BidiSpan(order[0].level, len, len));
-
-      return order;
-    };
-  })();
-
-  // THE END
-
-  CodeMirror.version = "5.15.2";
-
-  return CodeMirror;
-});
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/javascript.js b/asterixdb/asterix-app/src/main/resources/queryui/js/javascript.js
deleted file mode 100644
index e0e1bc8..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/javascript.js
+++ /dev/null
@@ -1,766 +0,0 @@
-/*
- * Copyright (C) 2016 by Marijn Haverbeke <marijnh@gmail.com> and others
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-// TODO actually recognize syntax of TypeScript constructs
-
-(function(mod) {
-  if (typeof exports == "object" && typeof module == "object") // CommonJS
-    mod(require("../../lib/codemirror"));
-  else if (typeof define == "function" && define.amd) // AMD
-    define(["../../lib/codemirror"], mod);
-  else // Plain browser env
-    mod(CodeMirror);
-})(function(CodeMirror) {
-"use strict";
-
-function expressionAllowed(stream, state, backUp) {
-  return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) ||
-    (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))))
-}
-
-CodeMirror.defineMode("javascript", function(config, parserConfig) {
-  var indentUnit = config.indentUnit;
-  var statementIndent = parserConfig.statementIndent;
-  var jsonldMode = parserConfig.jsonld;
-  var jsonMode = parserConfig.json || jsonldMode;
-  var isTS = parserConfig.typescript;
-  var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/;
-
-  // Tokenizer
-
-  var keywords = function(){
-    function kw(type) {return {type: type, style: "keyword"};}
-    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
-    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
-
-    var jsKeywords = {
-      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
-      "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C,
-      "var": kw("var"), "const": kw("var"), "let": kw("var"),
-      "function": kw("function"), "catch": kw("catch"),
-      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
-      "in": operator, "typeof": operator, "instanceof": operator,
-      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
-      "this": kw("this"), "class": kw("class"), "super": kw("atom"),
-      "yield": C, "export": kw("export"), "import": kw("import"), "extends": C,
-      "await": C, "async": kw("async")
-    };
-
-    // Extend the 'normal' keywords with the TypeScript language extensions
-    if (isTS) {
-      var type = {type: "variable", style: "variable-3"};
-      var tsKeywords = {
-        // object-like things
-        "interface": kw("class"),
-        "implements": C,
-        "namespace": C,
-        "module": kw("module"),
-        "enum": kw("module"),
-
-        // scope modifiers
-        "public": kw("modifier"),
-        "private": kw("modifier"),
-        "protected": kw("modifier"),
-        "abstract": kw("modifier"),
-
-        // operators
-        "as": operator,
-
-        // types
-        "string": type, "number": type, "boolean": type, "any": type
-      };
-
-      for (var attr in tsKeywords) {
-        jsKeywords[attr] = tsKeywords[attr];
-      }
-    }
-
-    return jsKeywords;
-  }();
-
-  var isOperatorChar = /[+\-*&%=<>!?|~^]/;
-  var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/;
-
-  function readRegexp(stream) {
-    var escaped = false, next, inSet = false;
-    while ((next = stream.next()) != null) {
-      if (!escaped) {
-        if (next == "/" && !inSet) return;
-        if (next == "[") inSet = true;
-        else if (inSet && next == "]") inSet = false;
-      }
-      escaped = !escaped && next == "\\";
-    }
-  }
-
-  // Used as scratch variables to communicate multiple values without
-  // consing up tons of objects.
-  var type, content;
-  function ret(tp, style, cont) {
-    type = tp; content = cont;
-    return style;
-  }
-  function tokenBase(stream, state) {
-    var ch = stream.next();
-    if (ch == '"' || ch == "'") {
-      state.tokenize = tokenString(ch);
-      return state.tokenize(stream, state);
-    } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) {
-      return ret("number", "number");
-    } else if (ch == "." && stream.match("..")) {
-      return ret("spread", "meta");
-    } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
-      return ret(ch);
-    } else if (ch == "=" && stream.eat(">")) {
-      return ret("=>", "operator");
-    } else if (ch == "0" && stream.eat(/x/i)) {
-      stream.eatWhile(/[\da-f]/i);
-      return ret("number", "number");
-    } else if (ch == "0" && stream.eat(/o/i)) {
-      stream.eatWhile(/[0-7]/i);
-      return ret("number", "number");
-    } else if (ch == "0" && stream.eat(/b/i)) {
-      stream.eatWhile(/[01]/i);
-      return ret("number", "number");
-    } else if (/\d/.test(ch)) {
-      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
-      return ret("number", "number");
-    } else if (ch == "/") {
-      if (stream.eat("*")) {
-        state.tokenize = tokenComment;
-        return tokenComment(stream, state);
-      } else if (stream.eat("/")) {
-        stream.skipToEnd();
-        return ret("comment", "comment");
-      } else if (expressionAllowed(stream, state, 1)) {
-        readRegexp(stream);
-        stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);
-        return ret("regexp", "string-2");
-      } else {
-        stream.eatWhile(isOperatorChar);
-        return ret("operator", "operator", stream.current());
-      }
-    } else if (ch == "`") {
-      state.tokenize = tokenQuasi;
-      return tokenQuasi(stream, state);
-    } else if (ch == "#") {
-      stream.skipToEnd();
-      return ret("error", "error");
-    } else if (isOperatorChar.test(ch)) {
-      stream.eatWhile(isOperatorChar);
-      return ret("operator", "operator", stream.current());
-    } else if (wordRE.test(ch)) {
-      stream.eatWhile(wordRE);
-      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
-      return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
-                     ret("variable", "variable", word);
-    }
-  }
-
-  function tokenString(quote) {
-    return function(stream, state) {
-      var escaped = false, next;
-      if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){
-        state.tokenize = tokenBase;
-        return ret("jsonld-keyword", "meta");
-      }
-      while ((next = stream.next()) != null) {
-        if (next == quote && !escaped) break;
-        escaped = !escaped && next == "\\";
-      }
-      if (!escaped) state.tokenize = tokenBase;
-      return ret("string", "string");
-    };
-  }
-
-  function tokenComment(stream, state) {
-    var maybeEnd = false, ch;
-    while (ch = stream.next()) {
-      if (ch == "/" && maybeEnd) {
-        state.tokenize = tokenBase;
-        break;
-      }
-      maybeEnd = (ch == "*");
-    }
-    return ret("comment", "comment");
-  }
-
-  function tokenQuasi(stream, state) {
-    var escaped = false, next;
-    while ((next = stream.next()) != null) {
-      if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) {
-        state.tokenize = tokenBase;
-        break;
-      }
-      escaped = !escaped && next == "\\";
-    }
-    return ret("quasi", "string-2", stream.current());
-  }
-
-  var brackets = "([{}])";
-  // This is a crude lookahead trick to try and notice that we're
-  // parsing the argument patterns for a fat-arrow function before we
-  // actually hit the arrow token. It only works if the arrow is on
-  // the same line as the arguments and there's no strange noise
-  // (comments) in between. Fallback is to only notice when we hit the
-  // arrow, and not declare the arguments as locals for the arrow
-  // body.
-  function findFatArrow(stream, state) {
-    if (state.fatArrowAt) state.fatArrowAt = null;
-    var arrow = stream.string.indexOf("=>", stream.start);
-    if (arrow < 0) return;
-
-    var depth = 0, sawSomething = false;
-    for (var pos = arrow - 1; pos >= 0; --pos) {
-      var ch = stream.string.charAt(pos);
-      var bracket = brackets.indexOf(ch);
-      if (bracket >= 0 && bracket < 3) {
-        if (!depth) { ++pos; break; }
-        if (--depth == 0) break;
-      } else if (bracket >= 3 && bracket < 6) {
-        ++depth;
-      } else if (wordRE.test(ch)) {
-        sawSomething = true;
-      } else if (/["'\/]/.test(ch)) {
-        return;
-      } else if (sawSomething && !depth) {
-        ++pos;
-        break;
-      }
-    }
-    if (sawSomething && !depth) state.fatArrowAt = pos;
-  }
-
-  // Parser
-
-  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true};
-
-  function JSLexical(indented, column, type, align, prev, info) {
-    this.indented = indented;
-    this.column = column;
-    this.type = type;
-    this.prev = prev;
-    this.info = info;
-    if (align != null) this.align = align;
-  }
-
-  function inScope(state, varname) {
-    for (var v = state.localVars; v; v = v.next)
-      if (v.name == varname) return true;
-    for (var cx = state.context; cx; cx = cx.prev) {
-      for (var v = cx.vars; v; v = v.next)
-        if (v.name == varname) return true;
-    }
-  }
-
-  function parseJS(state, style, type, content, stream) {
-    var cc = state.cc;
-    // Communicate our context to the combinators.
-    // (Less wasteful than consing up a hundred closures on every call.)
-    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style;
-
-    if (!state.lexical.hasOwnProperty("align"))
-      state.lexical.align = true;
-
-    while(true) {
-      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
-      if (combinator(type, content)) {
-        while(cc.length && cc[cc.length - 1].lex)
-          cc.pop()();
-        if (cx.marked) return cx.marked;
-        if (type == "variable" && inScope(state, content)) return "variable-2";
-        return style;
-      }
-    }
-  }
-
-  // Combinator utils
-
-  var cx = {state: null, column: null, marked: null, cc: null};
-  function pass() {
-    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
-  }
-  function cont() {
-    pass.apply(null, arguments);
-    return true;
-  }
-  function register(varname) {
-    function inList(list) {
-      for (var v = list; v; v = v.next)
-        if (v.name == varname) return true;
-      return false;
-    }
-    var state = cx.state;
-    cx.marked = "def";
-    if (state.context) {
-      if (inList(state.localVars)) return;
-      state.localVars = {name: varname, next: state.localVars};
-    } else {
-      if (inList(state.globalVars)) return;
-      if (parserConfig.globalVars)
-        state.globalVars = {name: varname, next: state.globalVars};
-    }
-  }
-
-  // Combinators
-
-  var defaultVars = {name: "this", next: {name: "arguments"}};
-  function pushcontext() {
-    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
-    cx.state.localVars = defaultVars;
-  }
-  function popcontext() {
-    cx.state.localVars = cx.state.context.vars;
-    cx.state.context = cx.state.context.prev;
-  }
-  function pushlex(type, info) {
-    var result = function() {
-      var state = cx.state, indent = state.indented;
-      if (state.lexical.type == "stat") indent = state.lexical.indented;
-      else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev)
-        indent = outer.indented;
-      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
-    };
-    result.lex = true;
-    return result;
-  }
-  function poplex() {
-    var state = cx.state;
-    if (state.lexical.prev) {
-      if (state.lexical.type == ")")
-        state.indented = state.lexical.indented;
-      state.lexical = state.lexical.prev;
-    }
-  }
-  poplex.lex = true;
-
-  function expect(wanted) {
-    function exp(type) {
-      if (type == wanted) return cont();
-      else if (wanted == ";") return pass();
-      else return cont(exp);
-    };
-    return exp;
-  }
-
-  function statement(type, value) {
-    if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex);
-    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
-    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
-    if (type == "{") return cont(pushlex("}"), block, poplex);
-    if (type == ";") return cont();
-    if (type == "if") {
-      if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex)
-        cx.state.cc.pop()();
-      return cont(pushlex("form"), expression, statement, poplex, maybeelse);
-    }
-    if (type == "function") return cont(functiondef);
-    if (type == "for") return cont(pushlex("form"), forspec, statement, poplex);
-    if (type == "variable") return cont(pushlex("stat"), maybelabel);
-    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
-                                      block, poplex, poplex);
-    if (type == "case") return cont(expression, expect(":"));
-    if (type == "default") return cont(expect(":"));
-    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
-                                     statement, poplex, popcontext);
-    if (type == "class") return cont(pushlex("form"), className, poplex);
-    if (type == "export") return cont(pushlex("stat"), afterExport, poplex);
-    if (type == "import") return cont(pushlex("stat"), afterImport, poplex);
-    if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex)
-    if (type == "async") return cont(statement)
-    return pass(pushlex("stat"), expression, expect(";"), poplex);
-  }
-  function expression(type) {
-    return expressionInner(type, false);
-  }
-  function expressionNoComma(type) {
-    return expressionInner(type, true);
-  }
-  function expressionInner(type, noComma) {
-    if (cx.state.fatArrowAt == cx.stream.start) {
-      var body = noComma ? arrowBodyNoComma : arrowBody;
-      if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext);
-      else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext);
-    }
-
-    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
-    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
-    if (type == "function") return cont(functiondef, maybeop);
-    if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
-    if (type == "(") return cont(pushlex(")"), maybeexpression, comprehension, expect(")"), poplex, maybeop);
-    if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression);
-    if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop);
-    if (type == "{") return contCommasep(objprop, "}", null, maybeop);
-    if (type == "quasi") return pass(quasi, maybeop);
-    if (type == "new") return cont(maybeTarget(noComma));
-    return cont();
-  }
-  function maybeexpression(type) {
-    if (type.match(/[;\}\)\],]/)) return pass();
-    return pass(expression);
-  }
-  function maybeexpressionNoComma(type) {
-    if (type.match(/[;\}\)\],]/)) return pass();
-    return pass(expressionNoComma);
-  }
-
-  function maybeoperatorComma(type, value) {
-    if (type == ",") return cont(expression);
-    return maybeoperatorNoComma(type, value, false);
-  }
-  function maybeoperatorNoComma(type, value, noComma) {
-    var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma;
-    var expr = noComma == false ? expression : expressionNoComma;
-    if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext);
-    if (type == "operator") {
-      if (/\+\+|--/.test(value)) return cont(me);
-      if (value == "?") return cont(expression, expect(":"), expr);
-      return cont(expr);
-    }
-    if (type == "quasi") { return pass(quasi, me); }
-    if (type == ";") return;
-    if (type == "(") return contCommasep(expressionNoComma, ")", "call", me);
-    if (type == ".") return cont(property, me);
-    if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me);
-  }
-  function quasi(type, value) {
-    if (type != "quasi") return pass();
-    if (value.slice(value.length - 2) != "${") return cont(quasi);
-    return cont(expression, continueQuasi);
-  }
-  function continueQuasi(type) {
-    if (type == "}") {
-      cx.marked = "string-2";
-      cx.state.tokenize = tokenQuasi;
-      return cont(quasi);
-    }
-  }
-  function arrowBody(type) {
-    findFatArrow(cx.stream, cx.state);
-    return pass(type == "{" ? statement : expression);
-  }
-  function arrowBodyNoComma(type) {
-    findFatArrow(cx.stream, cx.state);
-    return pass(type == "{" ? statement : expressionNoComma);
-  }
-  function maybeTarget(noComma) {
-    return function(type) {
-      if (type == ".") return cont(noComma ? targetNoComma : target);
-      else return pass(noComma ? expressionNoComma : expression);
-    };
-  }
-  function target(_, value) {
-    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); }
-  }
-  function targetNoComma(_, value) {
-    if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); }
-  }
-  function maybelabel(type) {
-    if (type == ":") return cont(poplex, statement);
-    return pass(maybeoperatorComma, expect(";"), poplex);
-  }
-  function property(type) {
-    if (type == "variable") {cx.marked = "property"; return cont();}
-  }
-  function objprop(type, value) {
-    if (type == "variable" || cx.style == "keyword") {
-      cx.marked = "property";
-      if (value == "get" || value == "set") return cont(getterSetter);
-      return cont(afterprop);
-    } else if (type == "number" || type == "string") {
-      cx.marked = jsonldMode ? "property" : (cx.style + " property");
-      return cont(afterprop);
-    } else if (type == "jsonld-keyword") {
-      return cont(afterprop);
-    } else if (type == "modifier") {
-      return cont(objprop)
-    } else if (type == "[") {
-      return cont(expression, expect("]"), afterprop);
-    } else if (type == "spread") {
-      return cont(expression);
-    }
-  }
-  function getterSetter(type) {
-    if (type != "variable") return pass(afterprop);
-    cx.marked = "property";
-    return cont(functiondef);
-  }
-  function afterprop(type) {
-    if (type == ":") return cont(expressionNoComma);
-    if (type == "(") return pass(functiondef);
-  }
-  function commasep(what, end) {
-    function proceed(type, value) {
-      if (type == ",") {
-        var lex = cx.state.lexical;
-        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
-        return cont(what, proceed);
-      }
-      if (type == end || value == end) return cont();
-      return cont(expect(end));
-    }
-    return function(type, value) {
-      if (type == end || value == end) return cont();
-      return pass(what, proceed);
-    };
-  }
-  function contCommasep(what, end, info) {
-    for (var i = 3; i < arguments.length; i++)
-      cx.cc.push(arguments[i]);
-    return cont(pushlex(end, info), commasep(what, end), poplex);
-  }
-  function block(type) {
-    if (type == "}") return cont();
-    return pass(statement, block);
-  }
-  function maybetype(type) {
-    if (isTS && type == ":") return cont(typeexpr);
-  }
-  function maybedefault(_, value) {
-    if (value == "=") return cont(expressionNoComma);
-  }
-  function typeexpr(type) {
-    if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);}
-  }
-  function afterType(type, value) {
-    if (value == "<") return cont(commasep(typeexpr, ">"), afterType)
-    if (type == "[") return cont(expect("]"), afterType)
-  }
-  function vardef() {
-    return pass(pattern, maybetype, maybeAssign, vardefCont);
-  }
-  function pattern(type, value) {
-    if (type == "modifier") return cont(pattern)
-    if (type == "variable") { register(value); return cont(); }
-    if (type == "spread") return cont(pattern);
-    if (type == "[") return contCommasep(pattern, "]");
-    if (type == "{") return contCommasep(proppattern, "}");
-  }
-  function proppattern(type, value) {
-    if (type == "variable" && !cx.stream.match(/^\s*:/, false)) {
-      register(value);
-      return cont(maybeAssign);
-    }
-    if (type == "variable") cx.marked = "property";
-    if (type == "spread") return cont(pattern);
-    if (type == "}") return pass();
-    return cont(expect(":"), pattern, maybeAssign);
-  }
-  function maybeAssign(_type, value) {
-    if (value == "=") return cont(expressionNoComma);
-  }
-  function vardefCont(type) {
-    if (type == ",") return cont(vardef);
-  }
-  function maybeelse(type, value) {
-    if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex);
-  }
-  function forspec(type) {
-    if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex);
-  }
-  function forspec1(type) {
-    if (type == "var") return cont(vardef, expect(";"), forspec2);
-    if (type == ";") return cont(forspec2);
-    if (type == "variable") return cont(formaybeinof);
-    return pass(expression, expect(";"), forspec2);
-  }
-  function formaybeinof(_type, value) {
-    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
-    return cont(maybeoperatorComma, forspec2);
-  }
-  function forspec2(type, value) {
-    if (type == ";") return cont(forspec3);
-    if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); }
-    return pass(expression, expect(";"), forspec3);
-  }
-  function forspec3(type) {
-    if (type != ")") cont(expression);
-  }
-  function functiondef(type, value) {
-    if (value == "*") {cx.marked = "keyword"; return cont(functiondef);}
-    if (type == "variable") {register(value); return cont(functiondef);}
-    if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext);
-  }
-  function funarg(type) {
-    if (type == "spread") return cont(funarg);
-    return pass(pattern, maybetype, maybedefault);
-  }
-  function className(type, value) {
-    if (type == "variable") {register(value); return cont(classNameAfter);}
-  }
-  function classNameAfter(type, value) {
-    if (value == "extends") return cont(expression, classNameAfter);
-    if (type == "{") return cont(pushlex("}"), classBody, poplex);
-  }
-  function classBody(type, value) {
-    if (type == "variable" || cx.style == "keyword") {
-      if (value == "static") {
-        cx.marked = "keyword";
-        return cont(classBody);
-      }
-      cx.marked = "property";
-      if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody);
-      return cont(functiondef, classBody);
-    }
-    if (value == "*") {
-      cx.marked = "keyword";
-      return cont(classBody);
-    }
-    if (type == ";") return cont(classBody);
-    if (type == "}") return cont();
-  }
-  function classGetterSetter(type) {
-    if (type != "variable") return pass();
-    cx.marked = "property";
-    return cont();
-  }
-  function afterExport(_type, value) {
-    if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); }
-    if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); }
-    return pass(statement);
-  }
-  function afterImport(type) {
-    if (type == "string") return cont();
-    return pass(importSpec, maybeFrom);
-  }
-  function importSpec(type, value) {
-    if (type == "{") return contCommasep(importSpec, "}");
-    if (type == "variable") register(value);
-    if (value == "*") cx.marked = "keyword";
-    return cont(maybeAs);
-  }
-  function maybeAs(_type, value) {
-    if (value == "as") { cx.marked = "keyword"; return cont(importSpec); }
-  }
-  function maybeFrom(_type, value) {
-    if (value == "from") { cx.marked = "keyword"; return cont(expression); }
-  }
-  function arrayLiteral(type) {
-    if (type == "]") return cont();
-    return pass(expressionNoComma, maybeArrayComprehension);
-  }
-  function maybeArrayComprehension(type) {
-    if (type == "for") return pass(comprehension, expect("]"));
-    if (type == ",") return cont(commasep(maybeexpressionNoComma, "]"));
-    return pass(commasep(expressionNoComma, "]"));
-  }
-  function comprehension(type) {
-    if (type == "for") return cont(forspec, comprehension);
-    if (type == "if") return cont(expression, comprehension);
-  }
-
-  function isContinuedStatement(state, textAfter) {
-    return state.lastType == "operator" || state.lastType == "," ||
-      isOperatorChar.test(textAfter.charAt(0)) ||
-      /[,.]/.test(textAfter.charAt(0));
-  }
-
-  // Interface
-
-  return {
-    startState: function(basecolumn) {
-      var state = {
-        tokenize: tokenBase,
-        lastType: "sof",
-        cc: [],
-        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
-        localVars: parserConfig.localVars,
-        context: parserConfig.localVars && {vars: parserConfig.localVars},
-        indented: basecolumn || 0
-      };
-      if (parserConfig.globalVars && typeof parserConfig.globalVars == "object")
-        state.globalVars = parserConfig.globalVars;
-      return state;
-    },
-
-    token: function(stream, state) {
-      if (stream.sol()) {
-        if (!state.lexical.hasOwnProperty("align"))
-          state.lexical.align = false;
-        state.indented = stream.indentation();
-        findFatArrow(stream, state);
-      }
-      if (state.tokenize != tokenComment && stream.eatSpace()) return null;
-      var style = state.tokenize(stream, state);
-      if (type == "comment") return style;
-      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
-      return parseJS(state, style, type, content, stream);
-    },
-
-    indent: function(state, textAfter) {
-      if (state.tokenize == tokenComment) return CodeMirror.Pass;
-      if (state.tokenize != tokenBase) return 0;
-      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
-      // Kludge to prevent 'maybelse' from blocking lexical scope pops
-      if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) {
-        var c = state.cc[i];
-        if (c == poplex) lexical = lexical.prev;
-        else if (c != maybeelse) break;
-      }
-      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
-      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
-        lexical = lexical.prev;
-      var type = lexical.type, closing = firstChar == type;
-
-      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0);
-      else if (type == "form" && firstChar == "{") return lexical.indented;
-      else if (type == "form") return lexical.indented + indentUnit;
-      else if (type == "stat")
-        return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);
-      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
-        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
-      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
-      else return lexical.indented + (closing ? 0 : indentUnit);
-    },
-
-    electricInput: /^\s*(?:case .*?:|default:|\{|\})$/,
-    blockCommentStart: jsonMode ? null : "/*",
-    blockCommentEnd: jsonMode ? null : "*/",
-    lineComment: jsonMode ? null : "//",
-    fold: "brace",
-    closeBrackets: "()[]{}''\"\"``",
-
-    helperType: jsonMode ? "json" : "javascript",
-    jsonldMode: jsonldMode,
-    jsonMode: jsonMode,
-
-    expressionAllowed: expressionAllowed,
-    skipExpression: function(state) {
-      var top = state.cc[state.cc.length - 1]
-      if (top == expression || top == expressionNoComma) state.cc.pop()
-    }
-  };
-});
-
-CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/);
-
-CodeMirror.defineMIME("text/javascript", "javascript");
-CodeMirror.defineMIME("text/ecmascript", "javascript");
-CodeMirror.defineMIME("application/javascript", "javascript");
-CodeMirror.defineMIME("application/x-javascript", "javascript");
-CodeMirror.defineMIME("application/ecmascript", "javascript");
-CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
-CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
-CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true});
-CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
-CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });
-
-});
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/jquery-1.12.4.min.js b/asterixdb/asterix-app/src/main/resources/queryui/js/jquery-1.12.4.min.js
deleted file mode 100644
index f23115a..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/jquery-1.12.4.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
-}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
-marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
-padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/json-formatter.min.js b/asterixdb/asterix-app/src/main/resources/queryui/js/json-formatter.min.js
deleted file mode 100644
index 77882c0..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/json-formatter.min.js
+++ /dev/null
@@ -1 +0,0 @@
-/*! jsonformatter 0.6.0 - 2016-04-29T03:24:40.680Z | (c) 2014 Mohsen Azimi | http://www.apache.org/licenses/LICENSE-2.0 */"use strict";angular.module("jsonFormatter",["RecursionHelper"]).provider("JSONFormatterConfig",function(){var n=!1,e=100,t=5;return{get hoverPreviewEnabled(){return n},set hoverPreviewEnabled(e){n=!!e},get hoverPreviewArrayCount(){return e},set hoverPreviewArrayCount(n){e=parseInt(n,10)},get hoverPreviewFieldCount(){return t},set hoverPreviewFieldCount(n){t=parseInt(n,10)},$get:function(){return{hoverPreviewEnabled:n,hoverPreviewArrayCount:e,hoverPreviewFieldCount:t}}}}).directive("jsonFormatter",["RecursionHelper","JSONFormatterConfig",function(n,e){function t(n){return n.replace('"','"')}function r(n){if(void 0===n)return"";if(null===n)return"Object";if("object"==typeof n&&!n.constructor)return"Object";var e=/function (.{1,})\(/,t=e.exec(n.constructor.toString());return t&&t.length>1?t[1]:""}function o(n){return null===n?"null":typeof n}function s(n,e){var r=o(n);return"null"===r||"undefined"===r?r:("string"===r&&(e='"'+t(e)+'"'),"function"===r?n.toString().replace(/[\r\n]/g,"").replace(/\{.*\}/,"")+"{…}":e)}function i(n){var e="";return angular.isObject(n)?(e=r(n),angular.isArray(n)&&(e+="["+n.length+"]")):e=s(n,n),e}function a(n){n.isArray=function(){return angular.isArray(n.json)},n.isObject=function(){return angular.isObject(n.json)},n.getKeys=function(){return n.isObject()?Object.keys(n.json).map(function(n){return""===n?'""':n}):void 0},n.type=o(n.json),n.hasKey="undefined"!=typeof n.key,n.getConstructorName=function(){return r(n.json)},"string"===n.type&&("Invalid Date"!==new Date(n.json).toString()&&(n.isDate=!0),0===n.json.indexOf("http")&&(n.isUrl=!0)),n.isEmptyObject=function(){return n.getKeys()&&!n.getKeys().length&&n.isOpen&&!n.isArray()},n.isOpen=!!n.open,n.toggleOpen=function(){n.isOpen=!n.isOpen},n.childrenOpen=function(){return n.open>1?n.open-1:0},n.openLink=function(e){e&&(window.location.href=n.json)},n.parseValue=function(e){return s(n.json,e)},n.showThumbnail=function(){return!!e.hoverPreviewEnabled&&n.isObject()&&!n.isOpen},n.getThumbnail=function(){if(n.isArray())return n.json.length>e.hoverPreviewArrayCount?"Array["+n.json.length+"]":"["+n.json.map(i).join(", ")+"]";var t=n.getKeys(),r=t.slice(0,e.hoverPreviewFieldCount),o=r.map(function(e){return e+":"+i(n.json[e])}),s=t.length>=5?"…":"";return"{"+o.join(", ")+s+"}"}}return{templateUrl:"json-formatter.html",restrict:"E",replace:!0,scope:{json:"=",key:"=",open:"="},compile:function(e){return n.compile(e,a)}}}]),"object"==typeof module&&(module.exports="jsonFormatter"),angular.module("RecursionHelper",[]).factory("RecursionHelper",["$compile",function(n){return{compile:function(e,t){angular.isFunction(t)&&(t={post:t});var r,o=e.contents().remove();return{pre:t&&t.pre?t.pre:null,post:function(e,s){r||(r=n(o)),r(e,function(n){s.append(n)}),t&&t.post&&t.post.apply(null,arguments)}}}}}]),angular.module("jsonFormatter").run(["$templateCache",function(n){n.put("json-formatter.html",'<div ng-init="isOpen = open && open > 0" class="json-formatter-row"><a ng-click="toggleOpen()"><span class="toggler {{isOpen ? \'open\' : \'\'}}" ng-if="isObject()"></span> <span class="key" ng-if="hasKey"><span class="key-text">{{key}}</span><span class="colon">:</span></span> <span class="value"><span ng-if="isObject()"><span class="constructor-name">{{getConstructorName(json)}}</span> <span ng-if="isArray()"><span class="bracket">[</span><span class="number">{{json.length}}</span><span class="bracket">]</span></span></span> <span ng-if="!isObject()" ng-click="openLink(isUrl)" class="{{type}}" ng-class="{date: isDate, url: isUrl}">{{parseValue(json)}}</span></span> <span ng-if="showThumbnail()" class="thumbnail-text">{{getThumbnail()}}</span></a><div class="children" ng-if="getKeys().length && isOpen"><json-formatter ng-repeat="key in getKeys() track by $index" json="json[key]" key="key" open="childrenOpen()"></json-formatter></div><div class="children empty object" ng-if="isEmptyObject()"></div><div class="children empty array" ng-if="getKeys() && !getKeys().length && isOpen && isArray()"></div></div>')}]);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/main.js b/asterixdb/asterix-app/src/main/resources/queryui/js/main.js
deleted file mode 100644
index 793c06e..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/main.js
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-var SERVER_HOST = "";
-var DATAVERSE_QUERY = "for $x in dataset Metadata.Dataverse return $x;"
-var DATE_TIME_REGEX = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z)$/;
-var DATE_REGEX = /^(\d{4}-\d{2}-\d{2})$/;
-
-var app = angular.module('queryui', ['jsonFormatter', 'ui.codemirror']);
-
-app.service('recordFunctions', function () {
-    this.ObjectKeys = function (obj) {
-        var typeStr = Object.prototype.toString.call(obj);
-        var res = [];
-        if (typeStr === "[object Object]") {
-            for (var key in obj) {
-                if (obj.hasOwnProperty(key) && !(key === "$$hashKey")) {
-                    res.push(key)
-                }
-            }
-        } else {
-            res = [-1];
-        }
-        return res;
-    }
-    this.isObject = function (obj) {
-        var typeStr = Object.prototype.toString.call(obj);
-        if (typeStr === "[object Object]") {
-            return true;
-        } else {
-            return false;
-        }
-    }
-    this.isArray = function (obj) {
-        var typeStr = Object.prototype.toString.call(obj);
-        if ((typeStr === "[object Array]" )) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-    this.isNested = function (obj) {
-        return this.isObject(obj) || this.isArray(obj);
-    }
-    this.ObjectValue = function (obj, key) {
-        var typeStr;
-        var value;
-        if (key == -1) {
-            typeStr = Object.prototype.toString.call(obj);
-            value = obj;
-        } else {
-            typeStr = Object.prototype.toString.call(obj[key]);
-            value = obj[key];
-        }
-        if (typeStr === "[object Array]") {
-            return "List +";
-        } else if (typeStr === "[object Object]") {
-            return "Record +";
-        } else if (typeStr == "[object Null]") {
-            return "NULL";
-        } else if (DATE_REGEX.exec(value) != null) {
-            var dat = new Date(value);
-            return dat.getUTCFullYear() + "/" + dat.getUTCMonth() + "/" + dat.getUTCDay();
-        } else if (DATE_TIME_REGEX.exec(value) != null) {
-            var dat = new Date(value);
-            return dat.getUTCFullYear() + "/" + dat.getUTCMonth() + "/" + dat.getUTCDay()
-                + " " + dat.getUTCHours() + ":" + dat.getUTCMinutes() + ":" + dat.getUTCSeconds();
-        } else {
-            return value;
-        }
-    }
-});
-
-app.controller('queryCtrl', function ($rootScope, $scope, $http, recordFunctions) {
-
-    $scope.recordFunctions = recordFunctions;
-    $scope.current_tab = 0;
-    $scope.current_preview_tab = 0;
-    $scope.current_list = 0;
-    $scope.maximized = false;
-    $scope.collapsed = false;
-    $scope.results = [];
-    $scope.history = [];
-    $scope.dataverses = [];
-    $scope.selectedItem = null;
-    $scope.selected_dataverse = "";
-    $scope.errorText = null;
-    $scope.statusText = "Wait...";
-    $scope.query_input = "";
-    $scope.uiReady = false;
-
-    $scope.queryCmOptions = {
-        lineNumbers: true,
-        indentWithTabs: true,
-        lineWrapping: false,
-        mode: 'aql'
-    }
-
-    $scope.queryPreviewOptions = {
-        indentWithTabs: true,
-        lineWrapping: true,
-        mode: 'javascript',
-        readOnly: true
-    }
-
-    $scope.init = function () {
-        $http.post("/").then(function (response) {
-            SERVER_HOST = location.protocol + "//" + location.hostname + ":" + response.data.api_port;
-            $scope.initDataverses();
-        }, function (response) {
-            $scope.statusText = "Unable to get Asterix HTTP API Port";
-        });
-    }
-
-    $scope.initDataverses = function () {
-        $http.get(SERVER_HOST + "/query?query=" + encodeURIComponent(DATAVERSE_QUERY)).then(function (response) {
-                for (i in response.data) {
-                    $scope.dataverses.push(response.data[i].DataverseName);
-                    $scope.selected_dataverse = $scope.dataverses[0];
-                    $scope.statusText = "Web UI Ready";
-                    $scope.uiReady = true;
-                }
-            },
-            function (response) {
-                $scope.statusText = "Error Occurred Executing Query";
-                $scope.errorText = response.data.summary;
-                $scope.maximized = false;
-            });
-        $scope.load();
-    }
-
-    $scope.query = function () {
-        var timer = new Date().getTime();
-        $scope.save($scope.query_input, $scope.selected_dataverse);
-        var uri = SERVER_HOST + "/query?query=" +
-            encodeURIComponent("use dataverse " + $scope.selected_dataverse + ";" + $scope.query_input)
-        $http.get(uri)
-            .then(function (response) {
-                    $scope.results = response.data;
-                    console.log(response);
-                    timer = new Date().getTime() - timer;
-                    $scope.statusText = "Query returned " + $scope.results.length + " records in " + timer + "ms";
-                    $scope.errorText = null;
-                    $scope.maximized = false;
-                },
-                function (response) {
-                    $scope.statusText = "Error Occurred Executing Query";
-                    $scope.errorText = response.data.summary;
-                    $scope.maximized = false;
-                    $scope.results = [];
-                });
-    }
-
-    $scope.isNested = function (obj) {
-        for (var key in obj) {
-            if (obj.hasOwnProperty(key)) {
-                var typeStr = Object.prototype.toString.call(obj[key]);
-              if (typeStr === "[object Array]" || typeStr === "[object Object]") {
-                return true;
-              }
-            }
-        }
-        return false;
-    }
-
-    $scope.isRecordPlus = function (obj, key) {
-        var value;
-        if (key == -1) {
-            value = obj;
-        } else {
-            value = obj[key];
-        }
-        return $scope.recordFunctions.isNested(value) ? "asterix-nested" : "";
-    }
-
-    $scope.viewRecord = function (obj) {
-        $scope.selectedItem = obj;
-        $scope.current_preview_tab = 0;
-        $("#recordModel").modal();
-    }
-
-    $scope.previewJSON = function (obj) {
-        return JSON.stringify(obj, null, 4);
-    }
-
-    $scope.save = function (query, database) {
-        var toSave = [query, database];
-        if ($scope.history.length >= 1) {
-            var i = $scope.history.length - 1;
-            if (new String(query).valueOf() === new String($scope.history[i][0]).valueOf()) {
-              if (new String(database).valueOf() === new String($scope.history[i][1]).valueOf()) {
-                return;
-              }
-            }
-        }
-        if ($scope.history.push(toSave) == 11) {
-            $scope.history.shift();
-        }
-        localStorage.setItem("history", JSON.stringify($scope.history));
-    }
-
-    $scope.load = function () {
-        var history = JSON.parse(localStorage.getItem("history"));
-      if (history != null) {
-        $scope.history = history;
-      }
-    }
-
-    $scope.previewHistory = function (entry) {
-        $scope.current_tab = 0;
-        $scope.query_input = entry[0];
-        $scope.selected_dataverse = entry[1];
-    }
-
-    $scope.leftContainerClass = function () {
-        if ($scope.maximized) {
-            return 'col-md-12';
-        } else {
-            if ($scope.collapsed) {
-                return 'col-md-1';
-            } else {
-                return 'col-md-4'
-            }
-        }
-    }
-
-    $scope.rightContainerClass = function () {
-        if ($scope.maximized) {
-            return 'col-md-0';
-        } else {
-            if ($scope.collapsed) {
-                return 'col-md-11';
-            } else {
-                return 'col-md-8'
-            }
-        }
-    }
-
-});
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/js/ui-codemirror.js b/asterixdb/asterix-app/src/main/resources/queryui/js/ui-codemirror.js
deleted file mode 100644
index 6eb35df..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/js/ui-codemirror.js
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-'use strict';
-
-/**
- * Binds a CodeMirror widget to a <textarea> element.
- */
-angular.module('ui.codemirror', [])
-  .constant('uiCodemirrorConfig', {})
-  .directive('uiCodemirror', uiCodemirrorDirective);
-
-/**
- * @ngInject
- */
-function uiCodemirrorDirective($timeout, uiCodemirrorConfig) {
-
-  return {
-    restrict: 'EA',
-    require: '?ngModel',
-    compile: function compile() {
-
-      // Require CodeMirror
-      if (angular.isUndefined(window.CodeMirror)) {
-        throw new Error('ui-codemirror needs CodeMirror to work... (o rly?)');
-      }
-
-      return postLink;
-    }
-  };
-
-  function postLink(scope, iElement, iAttrs, ngModel) {
-
-    var codemirrorOptions = angular.extend(
-      { value: iElement.text() },
-      uiCodemirrorConfig.codemirror || {},
-      scope.$eval(iAttrs.uiCodemirror),
-      scope.$eval(iAttrs.uiCodemirrorOpts)
-    );
-
-    var codemirror = newCodemirrorEditor(iElement, codemirrorOptions);
-
-    configOptionsWatcher(
-      codemirror,
-      iAttrs.uiCodemirror || iAttrs.uiCodemirrorOpts,
-      scope
-    );
-
-    configNgModelLink(codemirror, ngModel, scope);
-
-    configUiRefreshAttribute(codemirror, iAttrs.uiRefresh, scope);
-
-    // Allow access to the CodeMirror instance through a broadcasted event
-    // eg: $broadcast('CodeMirror', function(cm){...});
-    scope.$on('CodeMirror', function(event, callback) {
-      if (angular.isFunction(callback)) {
-        callback(codemirror);
-      } else {
-        throw new Error('the CodeMirror event requires a callback function');
-      }
-    });
-
-    // onLoad callback
-    if (angular.isFunction(codemirrorOptions.onLoad)) {
-      codemirrorOptions.onLoad(codemirror);
-    }
-  }
-
-  function newCodemirrorEditor(iElement, codemirrorOptions) {
-    var codemirrot;
-
-    if (iElement[0].tagName === 'TEXTAREA') {
-      // Might bug but still ...
-      codemirrot = window.CodeMirror.fromTextArea(iElement[0], codemirrorOptions);
-    } else {
-      iElement.html('');
-      codemirrot = new window.CodeMirror(function(cm_el) {
-        iElement.append(cm_el);
-      }, codemirrorOptions);
-    }
-
-    return codemirrot;
-  }
-
-  function configOptionsWatcher(codemirrot, uiCodemirrorAttr, scope) {
-    if (!uiCodemirrorAttr) { return; }
-
-    var codemirrorDefaultsKeys = Object.keys(window.CodeMirror.defaults);
-    scope.$watch(uiCodemirrorAttr, updateOptions, true);
-    function updateOptions(newValues, oldValue) {
-      if (!angular.isObject(newValues)) { return; }
-      codemirrorDefaultsKeys.forEach(function(key) {
-        if (newValues.hasOwnProperty(key)) {
-
-          if (oldValue && newValues[key] === oldValue[key]) {
-            return;
-          }
-
-          codemirrot.setOption(key, newValues[key]);
-        }
-      });
-    }
-  }
-
-  function configNgModelLink(codemirror, ngModel, scope) {
-    if (!ngModel) { return; }
-    // CodeMirror expects a string, so make sure it gets one.
-    // This does not change the model.
-    ngModel.$formatters.push(function(value) {
-      if (angular.isUndefined(value) || value === null) {
-        return '';
-      } else if (angular.isObject(value) || angular.isArray(value)) {
-        throw new Error('ui-codemirror cannot use an object or an array as a model');
-      }
-      return value;
-    });
-
-
-    // Override the ngModelController $render method, which is what gets called when the model is updated.
-    // This takes care of the synchronizing the codeMirror element with the underlying model, in the case that it is changed by something else.
-    ngModel.$render = function() {
-      //Code mirror expects a string so make sure it gets one
-      //Although the formatter have already done this, it can be possible that another formatter returns undefined (for example the required directive)
-      var safeViewValue = ngModel.$viewValue || '';
-      codemirror.setValue(safeViewValue);
-    };
-
-
-    // Keep the ngModel in sync with changes from CodeMirror
-    codemirror.on('change', function(instance) {
-      var newValue = instance.getValue();
-      if (newValue !== ngModel.$viewValue) {
-        scope.$evalAsync(function() {
-          ngModel.$setViewValue(newValue);
-        });
-      }
-    });
-  }
-
-  function configUiRefreshAttribute(codeMirror, uiRefreshAttr, scope) {
-    if (!uiRefreshAttr) { return; }
-
-    scope.$watch(uiRefreshAttr, function(newVal, oldVal) {
-      // Skip the initial watch firing
-      if (newVal !== oldVal) {
-        $timeout(function() {
-          codeMirror.refresh();
-        });
-      }
-    });
-  }
-
-}
diff --git a/asterixdb/asterix-app/src/main/resources/queryui/queryui.html b/asterixdb/asterix-app/src/main/resources/queryui/queryui.html
deleted file mode 100644
index c2fe702..0000000
--- a/asterixdb/asterix-app/src/main/resources/queryui/queryui.html
+++ /dev/null
@@ -1,177 +0,0 @@
-<!DOCTYPE html>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<html lang="en">
-<head>
-  <meta charset="UTF-8">
-  <title>AsterixDB Console</title>
-  <link rel="stylesheet" href="/queryui/css/bootstrap.min.css" media="screen" title="no title" charset="utf-8">
-  <link rel="stylesheet" href="/queryui/css/bootstrap-theme.min.css" media="screen" title="no title" charset="utf-8">
-  <link rel="stylesheet" href="/queryui/css/master.css" media="screen" title="no title" charset="utf-8">
-  <link rel="stylesheet" href="/queryui/css/json-formatter.min.css" media="screen" title="no title" charset="utf-8">
-  <link rel="stylesheet" href="/queryui/css/codemirror.css" media="screen" title="no title" charset="utf-8">
-  <script src="/queryui/js/jquery-1.12.4.min.js" charset="utf-8"></script>
-  <script src="/queryui/js/angular.min.js" charset="utf-8"></script>
-  <script src="/queryui/js/json-formatter.min.js" charset="utf-8"></script>
-  <script src="/queryui/js/bootstrap.min.js" charset="utf-8"></script>
-  <script src="/queryui/js/codemirror.js" charset="utf-8"></script>
-  <script src="/queryui/js/ui-codemirror.js" charset="utf-8"></script>
-  <script src="/queryui/js/aql-mode.js" charset="utf-8"></script>
-  <script src="/queryui/js/javascript.js" charset="utf-8"></script>
-  <script src="/queryui/js/main.js" charset="utf-8"></script>
-</head>
-<body ng-app="queryui">
-  <div class="row main-container" ng-controller="queryCtrl" ng-init="init()">
-    <div class="col-md-4 left-container" ng-class="leftContainerClass()">
-        <div>
-            <div class="row" ng-show="collapsed">
-                <div class="row-fluid">
-                    <div class="col-sm-12 text-center"><img class="logo-collapsed" src="/queryui/img/asterixlogo-collapsed.png" alt=""/></div>
-                </div>
-                <div class="row-fluid">
-                    <div class="col-sm-12 text-center"><span class="glyphicon glyphicon-menu-hamburger asterix-button"
-                                                           ng-class="collapsed == true ? 'asterix-button-selected' : '' "
-                                                           ng-click="collapsed = !collapsed"></span></div>
-                </div>
-            </div>
-            <div class="row" ng-hide="collapsed">
-                <div class="col-sm-10"><img class="logo" src="/queryui/img/finalasterixlogo.png" alt=""/></div>
-                <div class="col-sm-2 text-right" ng-hide="maximized"><span class="glyphicon glyphicon-menu-left asterix-button"
-                                                       ng-class="collapsed == true ? 'asterix-button-selected' : '' "
-                                                       ng-click="collapsed = !collapsed"></span></div>
-            </div>
-            <div ng-hide="collapsed" class="row">
-                <div class="col-sm-12">
-                    <div class="left-using-container">
-                        <label for="usingSelect" class="col-sm-2 control-label">Using</label>
-                        <div class="col-sm-10">
-                            <select class="form-control" id="usingSelect" ng-model="selected_dataverse">
-                                <option ng-repeat="entry in dataverses" >{{entry}}</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div ng-hide="collapsed" class="row">
-                <div class="col-sm-12">
-                    <div class="input-container">
-                        <div id="input-tab">
-                            <ul class="nav nav-justified asterix-nav">
-                                <li ng-class="current_tab == 0 ? 'asterix-nav-active' : '' "><a href="#" ng-click="current_tab = 0">Query</a></li>
-                                <li ng-class="current_tab == 1 ? 'asterix-nav-active' : '' "><a href="#" ng-click="current_tab = 1">History</a></li>
-                            </ul>
-                            <div class="asterix-tabpage" ng-if="current_tab == 0">
-                                <textarea ui-codemirror="queryCmOptions" name="Text1" ng-model="$parent.query_input" class="form-control input-container-code" placeholder="Query" cols="40" rows="15"></textarea>
-                                <div class="icon-maximize"><span class="glyphicon glyphicon-fullscreen asterix-button" aria-hidden="true"
-                                                                 ng-class="$parent.maximized == true ? 'asterix-button-selected' : '' "
-                                                                 ng-click="$parent.maximized = !$parent.maximized"></span></div>
-                            </div>
-                            <div class="asterix-tabpage" ng-if="current_tab == 1">
-                                <div class="asterix-tabpage-scroll">
-                                    <div class="asterix-well margin-bottom" ng-repeat="query in history.slice().reverse() track by $index">
-                                        <div class="row">
-                                            <div class="col-md-8"><code>{{query[0]}}</code></div>
-                                            <div class="col-md-4 asterix-well-right"><a href="" ng-click="previewHistory(query)">Preview</a></div>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="icon-maximize"><span class="glyphicon glyphicon-fullscreen asterix-button" aria-hidden="true"
-                                                                 ng-class="$parent.maximized == true ? 'asterix-button-selected' : '' "
-                                                                 ng-click="$parent.maximized = !$parent.maximized"></span></div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div ng-hide="collapsed" class="row vh-spacer">
-                <div class="col-sm-12">
-                    <button type="button" class="btn btn-asterix center-block" ng-click="query()" ng-if="uiReady">Run</button>
-                    <button type="button" class="btn btn-asterix center-block" ng-if="!uiReady">Loading Wait..</button>
-                </div>
-            </div>
-        </div>
-        <div ng-show="false">
-            <div class="row">
-                <div class="col-sm-12"><img class="logo logo-collapsed" src="/queryui/img/finalasterixlogo.png" alt="" /></div>
-            </div>
-            <div class="row">
-                <div class="col-sm-12 text-center"><span class="glyphicon glyphicon-menu-hamburger asterix-button"
-                                                         ng-class="collapsed == true ? 'asterix-button-selected' : '' "
-                                                         ng-click="collapsed = !collapsed"></span></div>
-            </div>
-        </div>
-    </div>
-    <div class="col-md-8 right-container" ng-class="rightContainerClass()">
-      <p class="asterix-status">{{statusText}}</p>
-      <div class="alert alert-danger" role="alert" ng-if="errorText != null">{{errorText}}</div>
-      <div class="right-toolbar">
-        <span class="glyphicon glyphicon-align-justify asterix-button" aria-hidden="true"
-          ng-class="current_list == 0 ? 'asterix-button-selected' : '' "
-          ng-click="current_list = 0"></span>
-        <span class="glyphicon glyphicon-th-large asterix-button" aria-hidden="true"
-          ng-class="current_list == 1 ? 'asterix-button-selected' : '' "
-          ng-click="current_list = 1"></span>
-      </div>
-      <div class="asterix-list-view" ng-if="current_list == 0 && results.length != 0">
-        <table class="table table-hover asterix-table">
-          <tbody>
-            <tr ng-repeat="record in $parent.results track by $index">
-              <td ng-repeat="key in recordFunctions.ObjectKeys(record)" class="asterix-inline-item" ng-class="isRecordPlus(record,key)" ng-click="viewRecord(record)">
-                <p class="small asterix-small">{{key == -1 ? 'value' : key}}</p>{{recordFunctions.ObjectValue(record,key)}}
-              </td>
-            </tr>
-          </tbody>
-        </table>
-      </div>
-      <div class="asterix-list-wells" ng-if="current_list == 1 && results.length != 0">
-        <div ng-repeat="record in $parent.results track by $index" class="asterix-well flex-well" ng-click="viewRecord(record)">
-          <div ng-repeat="key in recordFunctions.ObjectKeys(record)" class="row asterix-well-row">
-            <div class="col-sm-6" ng-class="isRecordPlus(record,key)">{{recordFunctions.ObjectValue(record,key)}}</div>
-            <div class="col-sm-6 asterix-well-right"><p class="small asterix-small">{{key == -1 ? 'value' : key}}</p></div>
-          </div>
-          <div class="row">
-            <div class="col-sm-12" ng-if="isNested(record)">
-              <span class="label label-warning">NESTED</span>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="modal fade" id="recordModel" role="dialog">
-          <div class="modal-dialog">
-            <div id="input-tab">
-              <ul class="nav nav-justified asterix-nav">
-                <li ng-class="current_preview_tab == 0 ? 'asterix-nav-active' : '' "><a href="#" ng-click="current_preview_tab = 0">Record Viewer</a></li>
-                <li ng-class="current_preview_tab == 1 ? 'asterix-nav-active' : '' "><a href="#" ng-click="current_preview_tab = 1">JSON Viewer</a></li>
-                <!-- <li><a href="#" data-dismiss="modal">
-                  <span class="glyphicon glyphicon-remove"></span>
-                </a></li> -->
-              </ul>
-              <div class="asterix-tabpage" ng-if="current_preview_tab == 0">
-              <json-formatter open="2" ng-if="selectedItem != null" json="selectedItem"></json-formatter>
-              </div>
-              <div class="asterix-tabpage" ng-if="current_preview_tab == 1">
-                <pre ng-bind="previewJSON(selectedItem)"></pre>
-              </div>
-            </div>
-          </div>
-        </div>
-    </div>
-  </div>
-</body>
-</html>
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/APIFrameworkTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/APIFrameworkTest.java
index e041021..2d3de1c 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/APIFrameworkTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/APIFrameworkTest.java
@@ -29,12 +29,18 @@
 
 import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
+import org.apache.asterix.runtime.job.listener.NodeJobTracker;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.client.IClusterInfoCollector;
 import org.apache.hyracks.api.client.NodeControllerInfo;
+import org.apache.hyracks.api.constraints.Constraint;
+import org.apache.hyracks.api.constraints.expressions.ConstantExpression;
+import org.apache.hyracks.api.constraints.expressions.LValueConstraintExpression;
+import org.apache.hyracks.api.job.JobSpecification;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 import junit.extensions.PA;
 
@@ -61,10 +67,10 @@
         APIFramework apiFramework = new APIFramework(mock(ILangCompilationProvider.class));
 
         // Tests large storage locations.
-        AlgebricksAbsolutePartitionConstraint storageLocations = new AlgebricksAbsolutePartitionConstraint(
-                new String[] { "node1", "node1", "node2" });
-        AlgebricksAbsolutePartitionConstraint computationLocations = (AlgebricksAbsolutePartitionConstraint) PA
-                .invokeMethod(apiFramework,
+        AlgebricksAbsolutePartitionConstraint storageLocations =
+                new AlgebricksAbsolutePartitionConstraint(new String[] { "node1", "node1", "node2" });
+        AlgebricksAbsolutePartitionConstraint computationLocations =
+                (AlgebricksAbsolutePartitionConstraint) PA.invokeMethod(apiFramework,
                         "chooseLocations(" + IClusterInfoCollector.class.getName() + ",int,"
                                 + AlgebricksAbsolutePartitionConstraint.class.getName() + ")",
                         clusterInfoCollector, CompilerProperties.COMPILER_PARALLELISM_AS_STORAGE, storageLocations);
@@ -108,8 +114,8 @@
         APIFramework apiFramework = new APIFramework(mock(ILangCompilationProvider.class));
 
         // Tests odd number parallelism.
-        AlgebricksAbsolutePartitionConstraint loc = (AlgebricksAbsolutePartitionConstraint) PA.invokeMethod(
-                apiFramework, "getComputationLocations(java.util.Map,int)", map, 5);
+        AlgebricksAbsolutePartitionConstraint loc = (AlgebricksAbsolutePartitionConstraint) PA
+                .invokeMethod(apiFramework, "getComputationLocations(java.util.Map,int)", map, 5);
         int nc1Count = 0, nc2Count = 0;
         String[] partitions = loc.getLocations();
         for (String partition : partitions) {
@@ -173,4 +179,25 @@
         Assert.assertTrue(loc.getLocations().length == 8);
     }
 
+    @Test
+    public void testJobLocations() {
+        final String nc1 = "nc1";
+        final String nc2 = "nc2";
+        final NodeJobTracker nodeJobTracker = new NodeJobTracker();
+        nodeJobTracker.notifyNodeJoin(nc1, null);
+        nodeJobTracker.notifyNodeJoin(nc2, null);
+
+        final JobSpecification jobSpec = new JobSpecification();
+        // add only nc1 to the job locations
+        final ConstantExpression nc1Location = new ConstantExpression(nc1);
+        final LValueConstraintExpression lValueMock = Mockito.mock(LValueConstraintExpression.class);
+        jobSpec.getUserConstraints().add(new Constraint(lValueMock, nc1Location));
+
+        final String[] clusterLocation = new String[] { nc1, nc2 };
+        final AlgebricksAbsolutePartitionConstraint jobLocations = APIFramework.getJobLocations(jobSpec, nodeJobTracker,
+                new AlgebricksAbsolutePartitionConstraint(clusterLocation));
+        // ensure nc2 wasn't included
+        Assert.assertEquals(1, jobLocations.getLocations().length);
+        Assert.assertEquals(nc1, jobLocations.getLocations()[0]);
+    }
 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
new file mode 100644
index 0000000..ee96d00
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java
@@ -0,0 +1,393 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.api.common;
+
+import static org.apache.asterix.api.common.AsterixHyracksIntegrationUtil.LoggerHolder.LOGGER;
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.Inet4Address;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiPredicate;
+import java.util.stream.Stream;
+
+import org.apache.asterix.app.external.ExternalUDFLibrarian;
+import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.config.PropertiesAccessor;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.asterix.hyracks.bootstrap.CCApplication;
+import org.apache.asterix.hyracks.bootstrap.NCApplication;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hyracks.api.application.ICCApplication;
+import org.apache.hyracks.api.application.INCApplication;
+import org.apache.hyracks.api.client.HyracksConnection;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.control.common.config.ConfigManager;
+import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.hyracks.control.common.controllers.ControllerConfig;
+import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.hyracks.test.support.TestUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.kohsuke.args4j.CmdLineException;
+
+@SuppressWarnings({ "squid:ClassVariableVisibilityCheck", "squid:S00112" })
+public class AsterixHyracksIntegrationUtil {
+
+    public static final int DEFAULT_HYRACKS_CC_CLIENT_PORT = 1098;
+    public static final int DEFAULT_HYRACKS_CC_CLUSTER_PORT = 1099;
+    public static final String DEFAULT_CONF_FILE =
+            joinPath(getProjectPath().toString(), "src", "test", "resources", "cc.conf");
+    private static final String DEFAULT_STORAGE_PATH = joinPath("target", "io", "dir");
+    private static String storagePath = DEFAULT_STORAGE_PATH;
+
+    static {
+        System.setProperty("java.util.logging.manager", org.apache.logging.log4j.jul.LogManager.class.getName());
+    }
+
+    public ClusterControllerService cc;
+    public NodeControllerService[] ncs = new NodeControllerService[2];
+    public IHyracksClientConnection hcc;
+    protected boolean gracefulShutdown = true;
+    List<Pair<IOption, Object>> opts = new ArrayList<>();
+    private ConfigManager configManager;
+    private List<String> nodeNames;
+
+    public static void setStoragePath(String path) {
+        storagePath = path;
+    }
+
+    public static void restoreDefaultStoragePath() {
+        storagePath = DEFAULT_STORAGE_PATH;
+    }
+
+    /**
+     * main method to run a simple 2 node cluster in-process
+     * suggested VM arguments: <code>-enableassertions -Xmx2048m -Dfile.encoding=UTF-8</code>
+     *
+     * @param args unused
+     */
+    public static void main(String[] args) throws Exception {
+        TestUtils.redirectLoggingToConsole();
+        AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
+        try {
+            integrationUtil.run(Boolean.getBoolean("cleanup.start"), Boolean.getBoolean("cleanup.shutdown"),
+                    System.getProperty("external.lib", ""), System.getProperty("conf.path", DEFAULT_CONF_FILE));
+        } catch (Exception e) {
+            LOGGER.fatal("Unexpected exception", e);
+            System.exit(1);
+        }
+    }
+
+    public void init(boolean deleteOldInstanceData, String confFile) throws Exception { //NOSONAR
+        final ICCApplication ccApplication = createCCApplication();
+        if (confFile == null) {
+            configManager = new ConfigManager();
+        } else {
+            configManager = new ConfigManager(new String[] { "-config-file", confFile });
+        }
+        ccApplication.registerConfig(configManager);
+        final CCConfig ccConfig = createCCConfig(configManager);
+        cc = new ClusterControllerService(ccConfig, ccApplication);
+
+        nodeNames = ccConfig.getConfigManager().getNodeNames();
+        if (deleteOldInstanceData) {
+            deleteTransactionLogs();
+            removeTestStorageFiles();
+        }
+        final List<NodeControllerService> nodeControllers = new ArrayList<>();
+        for (String nodeId : nodeNames) {
+            // mark this NC as virtual, so that the CC doesn't try to start via NCService...
+            configManager.set(nodeId, NCConfig.Option.NCSERVICE_PORT, NCConfig.NCSERVICE_PORT_DISABLED);
+            final INCApplication ncApplication = createNCApplication();
+            ConfigManager ncConfigManager;
+            if (confFile == null) {
+                ncConfigManager = new ConfigManager();
+            } else {
+                ncConfigManager = new ConfigManager(new String[] { "-config-file", confFile });
+            }
+            ncApplication.registerConfig(ncConfigManager);
+            nodeControllers.add(
+                    new NodeControllerService(fixupIODevices(createNCConfig(nodeId, ncConfigManager)), ncApplication));
+        }
+
+        opts.stream().forEach(opt -> configManager.set(opt.getLeft(), opt.getRight()));
+        cc.start();
+
+        // Starts ncs.
+        nodeNames = ccConfig.getConfigManager().getNodeNames();
+        List<Thread> startupThreads = new ArrayList<>();
+        for (NodeControllerService nc : nodeControllers) {
+            Thread ncStartThread = new Thread("IntegrationUtil-" + nc.getId()) {
+                @Override
+                public void run() {
+                    try {
+                        nc.start();
+                    } catch (Exception e) {
+                        LOGGER.log(Level.ERROR, e.getMessage(), e);
+                    }
+                }
+            };
+            ncStartThread.start();
+            startupThreads.add(ncStartThread);
+        }
+        //wait until all NCs complete their startup
+        for (Thread thread : startupThreads) {
+            thread.join();
+        }
+        // Wait until cluster becomes active
+        ((ICcApplicationContext) cc.getApplicationContext()).getClusterStateManager().waitForState(ClusterState.ACTIVE);
+        hcc = new HyracksConnection(cc.getConfig().getClientListenAddress(), cc.getConfig().getClientListenPort());
+        this.ncs = nodeControllers.toArray(new NodeControllerService[nodeControllers.size()]);
+    }
+
+    public void init(boolean deleteOldInstanceData, String externalLibPath, String confDir) throws Exception {
+        List<ILibraryManager> libraryManagers = new ArrayList<>();
+        ExternalUDFLibrarian librarian = new ExternalUDFLibrarian(libraryManagers);
+        librarian.cleanup();
+        init(deleteOldInstanceData, confDir);
+        if (externalLibPath != null && externalLibPath.length() != 0) {
+            libraryManagers.add(((ICcApplicationContext) cc.getApplicationContext()).getLibraryManager());
+            for (NodeControllerService nc : ncs) {
+                INcApplicationContext runtimeCtx = (INcApplicationContext) nc.getApplicationContext();
+                libraryManagers.add(runtimeCtx.getLibraryManager());
+            }
+            librarian.install(System.getProperty("external.lib.dataverse", "test"),
+                    System.getProperty("external.lib.libname", "testlib"), externalLibPath);
+        }
+    }
+
+    public ClusterControllerService getClusterControllerService() {
+        return cc;
+    }
+
+    protected CCConfig createCCConfig(ConfigManager configManager) throws IOException {
+        CCConfig ccConfig = new CCConfig(configManager);
+        ccConfig.setClusterListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ccConfig.setClientListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ccConfig.setClientListenPort(DEFAULT_HYRACKS_CC_CLIENT_PORT);
+        ccConfig.setClusterListenPort(DEFAULT_HYRACKS_CC_CLUSTER_PORT);
+        ccConfig.setResultTTL(120000L);
+        ccConfig.setResultSweepThreshold(1000L);
+        ccConfig.setEnforceFrameWriterProtocol(true);
+        configManager.set(ControllerConfig.Option.DEFAULT_DIR, joinPath(getDefaultStoragePath(), "asterixdb"));
+        return ccConfig;
+    }
+
+    protected ICCApplication createCCApplication() {
+        return new CCApplication();
+    }
+
+    protected NCConfig createNCConfig(String ncName, ConfigManager configManager) {
+        NCConfig ncConfig = new NCConfig(ncName, configManager);
+        ncConfig.setClusterAddress("localhost");
+        ncConfig.setClusterPort(DEFAULT_HYRACKS_CC_CLUSTER_PORT);
+        ncConfig.setClusterListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ncConfig.setDataListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ncConfig.setResultListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ncConfig.setMessagingListenAddress(Inet4Address.getLoopbackAddress().getHostAddress());
+        ncConfig.setResultTTL(120000L);
+        ncConfig.setResultSweepThreshold(1000L);
+        ncConfig.setVirtualNC();
+        configManager.set(ControllerConfig.Option.DEFAULT_DIR, joinPath(getDefaultStoragePath(), "asterixdb", ncName));
+        return ncConfig;
+    }
+
+    protected INCApplication createNCApplication() {
+        if (!gracefulShutdown) {
+            return new UngracefulShutdownNCApplication();
+        }
+        return new NCApplication();
+    }
+
+    private NCConfig fixupIODevices(NCConfig ncConfig) throws IOException, AsterixException, CmdLineException {
+        // we have to first process the config
+        ncConfig.getConfigManager().processConfig();
+
+        // get initial partitions from config
+        String[] nodeStores = ncConfig.getNodeScopedAppConfig().getStringArray(NCConfig.Option.IODEVICES);
+        if (nodeStores == null) {
+            throw new IllegalStateException("Couldn't find stores for NC: " + ncConfig.getNodeId());
+        }
+        LOGGER.info("Using the path: " + getDefaultStoragePath());
+        for (int i = 0; i < nodeStores.length; i++) {
+            // create IO devices based on stores
+            nodeStores[i] = joinPath(getDefaultStoragePath(), ncConfig.getNodeId(), nodeStores[i]);
+        }
+        ncConfig.getConfigManager().set(ncConfig.getNodeId(), NCConfig.Option.IODEVICES, nodeStores);
+        return ncConfig;
+    }
+
+    public IHyracksClientConnection getHyracksClientConnection() {
+        return hcc;
+    }
+
+    public void deinit(boolean deleteOldInstanceData) throws Exception {
+        //stop NCs
+        ArrayList<Thread> stopNCThreads = new ArrayList<>();
+        for (NodeControllerService nodeControllerService : ncs) {
+            if (nodeControllerService != null) {
+                Thread ncStopThread = new Thread() {
+                    @Override
+                    public void run() {
+                        try {
+                            nodeControllerService.stop();
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                };
+                stopNCThreads.add(ncStopThread);
+                ncStopThread.start();
+            }
+        }
+
+        //make sure all NCs stopped
+        for (Thread stopNcTheard : stopNCThreads) {
+            stopNcTheard.join();
+        }
+
+        stopCC(false);
+
+        if (deleteOldInstanceData) {
+            deleteTransactionLogs();
+            removeTestStorageFiles();
+        }
+    }
+
+    public void stopCC(boolean terminateNCService) throws Exception {
+        if (cc != null) {
+            cc.stop(terminateNCService);
+            cc = null;
+        }
+    }
+
+    public void setGracefulShutdown(boolean gracefulShutdown) {
+        this.gracefulShutdown = gracefulShutdown;
+    }
+
+    protected String getDefaultStoragePath() {
+        return storagePath;
+    }
+
+    public void removeTestStorageFiles() {
+        File dir = new File(getDefaultStoragePath());
+        for (String ncName : nodeNames) {
+            File ncDir = new File(dir, ncName);
+            FileUtils.deleteQuietly(ncDir);
+        }
+    }
+
+    private void deleteTransactionLogs() throws IOException, AsterixException {
+        for (String ncId : nodeNames) {
+            File log = new File(
+                    PropertiesAccessor.getInstance(configManager.getAppConfig()).getTransactionLogDirs().get(ncId));
+            if (log.exists()) {
+                FileUtils.deleteDirectory(log);
+            }
+        }
+    }
+
+    protected void run(boolean cleanupOnStart, boolean cleanupOnShutdown, String loadExternalLibs, String confFile)
+            throws Exception {
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+                try {
+                    deinit(cleanupOnShutdown);
+                } catch (Exception e) {
+                    LOGGER.log(Level.WARN, "Unexpected exception on shutdown", e);
+                }
+            }
+        });
+
+        init(cleanupOnStart, loadExternalLibs, confFile);
+        while (true) {
+            Thread.sleep(10000);
+        }
+    }
+
+    protected void run(boolean cleanupOnStart, boolean cleanupOnShutdown, String loadExternalLibs) throws Exception {
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+                try {
+                    deinit(cleanupOnShutdown);
+                } catch (Exception e) {
+                    LOGGER.log(Level.WARN, "Unexpected exception on shutdown", e);
+                }
+            }
+        });
+
+        init(cleanupOnStart, loadExternalLibs);
+        while (true) {
+            Thread.sleep(10000);
+        }
+    }
+
+    public void addOption(IOption name, Object value) {
+        opts.add(Pair.of(name, value));
+    }
+
+    /**
+     * @return the asterix-app absolute path if found, otherwise the default user path.
+     */
+    private static Path getProjectPath() {
+        final String targetDir = "asterix-app";
+        final BiPredicate<Path, BasicFileAttributes> matcher =
+                (path, attributes) -> path.getFileName().toString().equals(targetDir) && path.toFile().isDirectory()
+                        && path.toFile().list((d, n) -> n.equals("pom.xml")).length == 1;
+        final Path currentPath = Paths.get(System.getProperty("user.dir"));
+        try (Stream<Path> pathStream = Files.find(currentPath, 10, matcher)) {
+            return pathStream.findFirst().orElse(currentPath);
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    static class LoggerHolder {
+        static final Logger LOGGER = LogManager.getLogger();
+
+        private LoggerHolder() {
+        }
+    }
+
+    private class UngracefulShutdownNCApplication extends NCApplication {
+        @Override
+        public void stop() throws Exception {
+            // ungraceful shutdown
+            webManager.stop();
+        }
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
index cd58d8f..06d92b7 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/ConnectorApiServletTest.java
@@ -113,9 +113,7 @@
         ObjectMapper om = new ObjectMapper();
         ObjectNode actualResponse = (ObjectNode) om.readTree(outputStream.toString());
 
-        // Checks the temp-or-not, primary key, data type of the dataset.
-        boolean temp = actualResponse.get("temp").asBoolean();
-        Assert.assertFalse(temp);
+        // Checks the primary key, data type of the dataset.
         String primaryKey = actualResponse.get("keys").asText();
         Assert.assertEquals("DataverseName,DatasetName", primaryKey);
         ARecordType recordType = (ARecordType) JSONDeserializerForTypes.convertFromJSON(actualResponse.get("type"));
@@ -124,7 +122,7 @@
         // Checks the correctness of results.
         ArrayNode splits = (ArrayNode) actualResponse.get("splits");
         String path = (splits.get(0)).get("path").asText();
-        Assert.assertTrue(path.endsWith("Metadata/Dataset_idx_Dataset"));
+        Assert.assertTrue(path.endsWith("Metadata/Dataset/0/Dataset"));
     }
 
     @Test
@@ -154,12 +152,11 @@
         nodeMap.put("asterix_nc2", mockInfo2);
         PA.invokeMethod(let,
                 "formResponseObject(" + ObjectNode.class.getName() + ", " + FileSplit.class.getName() + "[], "
-                        + ARecordType.class.getName() + ", " + String.class.getName() + ", boolean, "
-                        + Map.class.getName() + ")",
-                actualResponse, splits, recordType, primaryKey, true, nodeMap);
+                        + ARecordType.class.getName() + ", " + String.class.getName() + ", " + Map.class.getName()
+                        + ")",
+                actualResponse, splits, recordType, primaryKey, nodeMap);
         // Constructs expected response.
         ObjectNode expectedResponse = om.createObjectNode();
-        expectedResponse.put("temp", true);
         expectedResponse.put("keys", primaryKey);
         expectedResponse.set("type", recordType.toJSON());
         ArrayNode splitsArray = om.createArrayNode();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
index 3cb46fe..d5262cf 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/QueryCancellationServletTest.java
@@ -47,8 +47,8 @@
     @Test
     public void testDelete() throws Exception {
         // Creates a query cancellation servlet.
-        QueryCancellationServlet cancellationServlet = new QueryCancellationServlet(new ConcurrentHashMap<>(),
-                new String[] { "/" });
+        QueryCancellationServlet cancellationServlet =
+                new QueryCancellationServlet(new ConcurrentHashMap<>(), new String[] { "/" });
         // Adds mocked Hyracks client connection into the servlet context.
         IHyracksClientConnection mockHcc = mock(IHyracksClientConnection.class);
         cancellationServlet.ctx().put(ServletConstants.HYRACKS_CONNECTION_ATTR, mockHcc);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionApiServletTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionApiServletTest.java
index e583c75..976dbc3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionApiServletTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/api/http/servlet/VersionApiServletTest.java
@@ -62,7 +62,6 @@
         SqlppExecutionTest.tearDown();
     }
 
-
     @Test
     public void testGet() throws Exception {
         // Configures a test version api servlet.
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
index b155b51..4d26d25 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/bootstrap/TestNodeController.java
@@ -25,9 +25,8 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 
-import org.apache.asterix.app.external.TestLibrarian;
+import org.apache.asterix.app.external.ExternalUDFLibrarian;
 import org.apache.asterix.app.nc.NCAppRuntimeContext;
 import org.apache.asterix.app.nc.TransactionSubsystem;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
@@ -40,6 +39,7 @@
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
 import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
@@ -57,6 +57,7 @@
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.formats.FormatUtils;
 import org.apache.asterix.runtime.formats.NonTaggedDataFormat;
+import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.asterix.runtime.operators.LSMPrimaryUpsertOperatorNodePushable;
 import org.apache.asterix.runtime.utils.CcApplicationContext;
 import org.apache.asterix.test.runtime.ExecutionTestUtil;
@@ -67,13 +68,18 @@
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.algebricks.runtime.operators.std.AssignRuntimeFactory;
 import org.apache.hyracks.algebricks.runtime.operators.std.EmptyTupleSourceRuntimeFactory;
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.comm.VSizeFrame;
+import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.context.IHyracksJobletContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.ActivityId;
 import org.apache.hyracks.api.dataflow.OperatorDescriptorId;
+import org.apache.hyracks.api.dataflow.TaskAttemptId;
+import org.apache.hyracks.api.dataflow.TaskId;
 import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
@@ -85,6 +91,7 @@
 import org.apache.hyracks.api.util.HyracksConstants;
 import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
+import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
 import org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorDescriptor;
 import org.apache.hyracks.storage.am.btree.dataflow.BTreeSearchOperatorNodePushable;
 import org.apache.hyracks.storage.am.common.api.IIndexBuilder;
@@ -102,15 +109,17 @@
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.test.support.TestUtils;
 import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.mockito.Mockito;
 
 public class TestNodeController {
-    protected static final Logger LOGGER = Logger.getLogger(TestNodeController.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
 
     protected static final String PATH_ACTUAL = "unittest" + File.separator;
     protected static final String PATH_BASE = FileUtil.joinPath("src", "test", "resources", "nodetests");
 
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
     protected static TransactionProperties txnProperties;
     private static final boolean cleanupOnStart = true;
     private static final boolean cleanupOnStop = true;
@@ -119,13 +128,13 @@
     public static final int DEFAULT_HYRACKS_CC_CLIENT_PORT = 1098;
     public static final int DEFAULT_HYRACKS_CC_CLUSTER_PORT = 1099;
     public static final int KB32 = 32768;
-    public static final int PARTITION = 0;
     public static final double BLOOM_FILTER_FALSE_POSITIVE_RATE = 0.01;
     public static final TransactionSubsystemProvider TXN_SUBSYSTEM_PROVIDER = TransactionSubsystemProvider.INSTANCE;
     // Mutables
-    private long jobCounter = 0L;
+    private long jobCounter = 100L;
     private final String testConfigFileName;
     private final boolean runHDFS;
+    private final List<Pair<IOption, Object>> options = new ArrayList<>();
 
     public TestNodeController(String testConfigFileName, boolean runHDFS) {
         this.testConfigFileName = testConfigFileName;
@@ -137,10 +146,10 @@
             File outdir = new File(PATH_ACTUAL);
             outdir.mkdirs();
             // remove library directory
-            TestLibrarian.removeLibraryDir();
+            ExternalUDFLibrarian.removeLibraryDir();
             ExecutionTestUtil.setUp(cleanupOnStart,
                     testConfigFileName == null ? TEST_CONFIG_FILE_NAME : testConfigFileName,
-                    ExecutionTestUtil.integrationUtil, runHDFS);
+                    ExecutionTestUtil.integrationUtil, runHDFS, options);
         } catch (Throwable th) {
             th.printStackTrace();
             throw th;
@@ -148,42 +157,112 @@
     }
 
     public void deInit() throws Exception {
-        TestLibrarian.removeLibraryDir();
+        ExternalUDFLibrarian.removeLibraryDir();
         ExecutionTestUtil.tearDown(cleanupOnStop);
     }
 
-    public org.apache.asterix.common.transactions.JobId getTxnJobId(IHyracksTaskContext ctx) {
-        return new org.apache.asterix.common.transactions.JobId((int) ctx.getJobletContext().getJobId().getId());
+    public void setOpts(List<Pair<IOption, Object>> opts) {
+        options.addAll(opts);
+    }
+
+    public TxnId getTxnJobId(IHyracksTaskContext ctx) {
+        return getTxnJobId(ctx.getJobletContext().getJobId());
+    }
+
+    public TxnId getTxnJobId(JobId jobId) {
+        return new TxnId(jobId.getId());
     }
 
     public Pair<LSMInsertDeleteOperatorNodePushable, CommitRuntime> getInsertPipeline(IHyracksTaskContext ctx,
             Dataset dataset, IAType[] primaryKeyTypes, ARecordType recordType, ARecordType metaType, int[] filterFields,
             int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators,
-            StorageComponentProvider storageComponentProvider)
+            StorageComponentProvider storageComponentProvider, Index secondaryIndex)
             throws AlgebricksException, HyracksDataException, RemoteException, ACIDException {
-        MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
-        org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
-                DatasetUtil.getMergePolicyFactory(dataset, mdTxnCtx);
-        MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-        PrimaryIndexInfo primaryIndexInfo = new PrimaryIndexInfo(dataset, primaryKeyTypes, recordType, metaType,
-                mergePolicy.first, mergePolicy.second, filterFields, primaryKeyIndexes, primaryKeyIndicators);
-        IndexOperation op = IndexOperation.INSERT;
-        IModificationOperationCallbackFactory modOpCallbackFactory =
-                new PrimaryIndexModificationOperationCallbackFactory(getTxnJobId(ctx), dataset.getDatasetId(),
-                        primaryIndexInfo.primaryKeyIndexes, TXN_SUBSYSTEM_PROVIDER, Operation.get(op),
-                        ResourceType.LSM_BTREE);
-        IRecordDescriptorProvider recordDescProvider = primaryIndexInfo.getInsertRecordDescriptorProvider();
-        IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
-                storageComponentProvider.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
-        LSMInsertDeleteOperatorNodePushable insertOp = new LSMInsertDeleteOperatorNodePushable(ctx, PARTITION,
-                primaryIndexInfo.primaryIndexInsertFieldsPermutations,
-                recordDescProvider.getInputRecordDescriptor(new ActivityId(new OperatorDescriptorId(0), 0), 0), op,
-                true, indexHelperFactory, modOpCallbackFactory, null);
-        CommitRuntime commitOp = new CommitRuntime(ctx, getTxnJobId(ctx), dataset.getDatasetId(),
-                primaryIndexInfo.primaryKeyIndexes, false, true, PARTITION, true);
-        insertOp.setOutputFrameWriter(0, commitOp, primaryIndexInfo.rDesc);
-        commitOp.setInputRecordDescriptor(0, primaryIndexInfo.rDesc);
-        return Pair.of(insertOp, commitOp);
+        CcApplicationContext appCtx =
+                (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
+        MetadataProvider mdProvider = new MetadataProvider(appCtx, null);
+        try {
+            MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+            org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
+                    DatasetUtil.getMergePolicyFactory(dataset, mdTxnCtx);
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            PrimaryIndexInfo primaryIndexInfo = new PrimaryIndexInfo(dataset, primaryKeyTypes, recordType, metaType,
+                    mergePolicy.first, mergePolicy.second, filterFields, primaryKeyIndexes, primaryKeyIndicators);
+            IndexOperation op = IndexOperation.INSERT;
+            IModificationOperationCallbackFactory modOpCallbackFactory =
+                    new PrimaryIndexModificationOperationCallbackFactory(dataset.getDatasetId(),
+                            primaryIndexInfo.primaryKeyIndexes, TXN_SUBSYSTEM_PROVIDER, Operation.get(op),
+                            ResourceType.LSM_BTREE);
+            IRecordDescriptorProvider recordDescProvider = primaryIndexInfo.getInsertRecordDescriptorProvider();
+            RecordDescriptor recordDesc =
+                    recordDescProvider.getInputRecordDescriptor(new ActivityId(new OperatorDescriptorId(0), 0), 0);
+            IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
+                    storageComponentProvider.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
+            LSMInsertDeleteOperatorNodePushable insertOp =
+                    new LSMInsertDeleteOperatorNodePushable(ctx, ctx.getTaskAttemptId().getTaskId().getPartition(),
+                            primaryIndexInfo.primaryIndexInsertFieldsPermutations, recordDesc, op, true,
+                            indexHelperFactory, modOpCallbackFactory, null);
+
+            // For now, this assumes a single secondary index. recordDesc is always <pk-record-meta>
+            // for the index, we will have to create an assign operator that extract the sk
+            // then the secondary LSMInsertDeleteOperatorNodePushable
+            if (secondaryIndex != null) {
+                List<List<String>> skNames = secondaryIndex.getKeyFieldNames();
+                List<Integer> indicators = secondaryIndex.getKeyFieldSourceIndicators();
+                IScalarEvaluatorFactory[] secondaryFieldAccessEvalFactories =
+                        new IScalarEvaluatorFactory[skNames.size()];
+                for (int i = 0; i < skNames.size(); i++) {
+                    ARecordType sourceType = dataset.hasMetaPart()
+                            ? indicators.get(i).intValue() == Index.RECORD_INDICATOR ? recordType : metaType
+                            : recordType;
+                    int pos = skNames.get(i).size() > 1 ? -1 : sourceType.getFieldIndex(skNames.get(i).get(0));
+                    secondaryFieldAccessEvalFactories[i] = mdProvider.getDataFormat().getFieldAccessEvaluatorFactory(
+                            mdProvider.getFunctionManager(), sourceType, secondaryIndex.getKeyFieldNames().get(i), pos);
+                }
+                // outColumns are computed inside the assign runtime
+                int[] outColumns = new int[skNames.size()];
+                // projection list include old and new (primary and secondary keys)
+                int[] projectionList = new int[skNames.size() + primaryIndexInfo.index.getKeyFieldNames().size()];
+                for (int i = 0; i < secondaryFieldAccessEvalFactories.length; i++) {
+                    outColumns[i] = primaryIndexInfo.rDesc.getFieldCount() + i;
+                }
+                int projCount = 0;
+                for (int i = 0; i < secondaryFieldAccessEvalFactories.length; i++) {
+                    projectionList[projCount++] = primaryIndexInfo.rDesc.getFieldCount() + i;
+                }
+                for (int i = 0; i < primaryIndexInfo.index.getKeyFieldNames().size(); i++) {
+                    projectionList[projCount++] = i;
+                }
+                IPushRuntime assignOp =
+                        new AssignRuntimeFactory(outColumns, secondaryFieldAccessEvalFactories, projectionList, true)
+                                .createPushRuntime(ctx)[0];
+                insertOp.setOutputFrameWriter(0, assignOp, primaryIndexInfo.rDesc);
+                assignOp.setInputRecordDescriptor(0, primaryIndexInfo.rDesc);
+                SecondaryIndexInfo secondaryIndexInfo = new SecondaryIndexInfo(primaryIndexInfo, secondaryIndex);
+                IIndexDataflowHelperFactory secondaryIndexHelperFactory = new IndexDataflowHelperFactory(
+                        storageComponentProvider.getStorageManager(), secondaryIndexInfo.fileSplitProvider);
+                LSMInsertDeleteOperatorNodePushable secondaryInsertOp =
+                        new LSMInsertDeleteOperatorNodePushable(ctx, ctx.getTaskAttemptId().getTaskId().getPartition(),
+                                secondaryIndexInfo.insertFieldsPermutations, secondaryIndexInfo.rDesc, op, false,
+                                secondaryIndexHelperFactory, NoOpOperationCallbackFactory.INSTANCE, null);
+                assignOp.setOutputFrameWriter(0, secondaryInsertOp, secondaryIndexInfo.rDesc);
+                CommitRuntime commitOp = new CommitRuntime(ctx, getTxnJobId(ctx), dataset.getDatasetId(),
+                        secondaryIndexInfo.primaryKeyIndexes, true, ctx.getTaskAttemptId().getTaskId().getPartition(),
+                        true);
+                secondaryInsertOp.setOutputFrameWriter(0, commitOp, secondaryIndexInfo.rDesc);
+                commitOp.setInputRecordDescriptor(0, secondaryIndexInfo.rDesc);
+                return Pair.of(insertOp, commitOp);
+            } else {
+                CommitRuntime commitOp = new CommitRuntime(ctx, getTxnJobId(ctx), dataset.getDatasetId(),
+                        primaryIndexInfo.primaryKeyIndexes, true, ctx.getTaskAttemptId().getTaskId().getPartition(),
+                        true);
+                insertOp.setOutputFrameWriter(0, commitOp, primaryIndexInfo.rDesc);
+                commitOp.setInputRecordDescriptor(0, primaryIndexInfo.rDesc);
+                return Pair.of(insertOp, commitOp);
+            }
+        } finally {
+            mdProvider.getLocks().unlock();
+        }
     }
 
     public IPushRuntime getFullScanPipeline(IFrameWriter countOp, IHyracksTaskContext ctx, Dataset dataset,
@@ -191,7 +270,7 @@
             NoMergePolicyFactory mergePolicyFactory, Map<String, String> mergePolicyProperties, int[] filterFields,
             int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators,
             StorageComponentProvider storageComponentProvider) throws HyracksDataException, AlgebricksException {
-        IPushRuntime emptyTupleOp = new EmptyTupleSourceRuntimeFactory().createPushRuntime(ctx);
+        IPushRuntime emptyTupleOp = new EmptyTupleSourceRuntimeFactory().createPushRuntime(ctx)[0];
         JobSpecification spec = new JobSpecification();
         PrimaryIndexInfo primaryIndexInfo = new PrimaryIndexInfo(dataset, primaryKeyTypes, recordType, metaType,
                 mergePolicyFactory, mergePolicyProperties, filterFields, primaryKeyIndexes, primaryKeyIndicators);
@@ -201,7 +280,8 @@
                 null, null, true, true, indexDataflowHelperFactory, false, false, null,
                 NoOpOperationCallbackFactory.INSTANCE, filterFields, filterFields, false);
         BTreeSearchOperatorNodePushable searchOp =
-                searchOpDesc.createPushRuntime(ctx, primaryIndexInfo.getSearchRecordDescriptorProvider(), PARTITION, 1);
+                searchOpDesc.createPushRuntime(ctx, primaryIndexInfo.getSearchRecordDescriptorProvider(),
+                        ctx.getTaskAttemptId().getTaskId().getPartition(), 1);
         emptyTupleOp.setOutputFrameWriter(0, searchOp,
                 primaryIndexInfo.getSearchRecordDescriptorProvider().getInputRecordDescriptor(null, 0));
         searchOp.setOutputFrameWriter(0, countOp, primaryIndexInfo.rDesc);
@@ -234,7 +314,7 @@
 
     public PrimaryIndexInfo createPrimaryIndex(Dataset dataset, IAType[] primaryKeyTypes, ARecordType recordType,
             ARecordType metaType, int[] filterFields, IStorageComponentProvider storageComponentProvider,
-            int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators)
+            int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators, int partition)
             throws AlgebricksException, HyracksDataException, RemoteException, ACIDException {
         MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
         org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
@@ -251,9 +331,9 @@
                     recordType, metaType, mergePolicy.first, mergePolicy.second);
             IndexBuilderFactory indexBuilderFactory =
                     new IndexBuilderFactory(storageComponentProvider.getStorageManager(),
-                            primaryIndexInfo.getFileSplitProvider(), resourceFactory, !dataset.isTemp());
-            IHyracksTaskContext ctx = createTestContext(false);
-            IIndexBuilder indexBuilder = indexBuilderFactory.create(ctx, 0);
+                            primaryIndexInfo.getFileSplitProvider(), resourceFactory, true);
+            IHyracksTaskContext ctx = createTestContext(newJobId(), partition, false);
+            IIndexBuilder indexBuilder = indexBuilderFactory.create(ctx, partition);
             indexBuilder.build();
         } finally {
             mdProvider.getLocks().unlock();
@@ -261,6 +341,34 @@
         return primaryIndexInfo;
     }
 
+    public SecondaryIndexInfo createSecondaryIndex(PrimaryIndexInfo primaryIndexInfo, Index secondaryIndex,
+            IStorageComponentProvider storageComponentProvider, int partition)
+            throws AlgebricksException, HyracksDataException, RemoteException, ACIDException {
+        MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+        org.apache.hyracks.algebricks.common.utils.Pair<ILSMMergePolicyFactory, Map<String, String>> mergePolicy =
+                DatasetUtil.getMergePolicyFactory(primaryIndexInfo.dataset, mdTxnCtx);
+        MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+        Dataverse dataverse = new Dataverse(primaryIndexInfo.dataset.getDataverseName(),
+                NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP);
+        MetadataProvider mdProvider = new MetadataProvider(
+                (ICcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext(), dataverse);
+        SecondaryIndexInfo secondaryIndexInfo = new SecondaryIndexInfo(primaryIndexInfo, secondaryIndex);
+        try {
+
+            IResourceFactory resourceFactory = primaryIndexInfo.dataset.getResourceFactory(mdProvider, secondaryIndex,
+                    primaryIndexInfo.recordType, primaryIndexInfo.metaType, mergePolicy.first, mergePolicy.second);
+            IndexBuilderFactory indexBuilderFactory =
+                    new IndexBuilderFactory(storageComponentProvider.getStorageManager(),
+                            secondaryIndexInfo.fileSplitProvider, resourceFactory, true);
+            IHyracksTaskContext ctx = createTestContext(newJobId(), partition, false);
+            IIndexBuilder indexBuilder = indexBuilderFactory.create(ctx, partition);
+            indexBuilder.build();
+        } finally {
+            mdProvider.getLocks().unlock();
+        }
+        return secondaryIndexInfo;
+    }
+
     public static ISerializerDeserializer<?>[] createPrimaryIndexSerdes(int primaryIndexNumOfTupleFields,
             IAType[] primaryKeyTypes, ARecordType recordType, ARecordType metaType) {
         int i = 0;
@@ -276,6 +384,22 @@
         return primaryIndexSerdes;
     }
 
+    public static ISerializerDeserializer<?>[] createSecondaryIndexSerdes(ARecordType recordType, ARecordType metaType,
+            IAType[] primaryKeyTypes, IAType[] secondaryKeyTypes) {
+        ISerializerDeserializer<?>[] secondaryIndexSerdes =
+                new ISerializerDeserializer<?>[secondaryKeyTypes.length + primaryKeyTypes.length];
+        int i = 0;
+        for (; i < secondaryKeyTypes.length; i++) {
+            secondaryIndexSerdes[i] =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(secondaryKeyTypes[i]);
+        }
+        for (; i < primaryKeyTypes.length; i++) {
+            secondaryIndexSerdes[i] =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(primaryKeyTypes[i]);
+        }
+        return secondaryIndexSerdes;
+    }
+
     public static ITypeTraits[] createPrimaryIndexTypeTraits(int primaryIndexNumOfTupleFields, IAType[] primaryKeyTypes,
             ARecordType recordType, ARecordType metaType) {
         ITypeTraits[] primaryIndexTypeTraits = new ITypeTraits[primaryIndexNumOfTupleFields];
@@ -290,18 +414,36 @@
         return primaryIndexTypeTraits;
     }
 
-    public IHyracksTaskContext createTestContext(boolean withMessaging) throws HyracksDataException {
+    public static ITypeTraits[] createSecondaryIndexTypeTraits(ARecordType recordType, ARecordType metaType,
+            IAType[] primaryKeyTypes, IAType[] secondaryKeyTypes) {
+        ITypeTraits[] secondaryIndexTypeTraits = new ITypeTraits[secondaryKeyTypes.length + primaryKeyTypes.length];
+        int i = 0;
+        for (; i < secondaryKeyTypes.length; i++) {
+            secondaryIndexTypeTraits[i] = TypeTraitProvider.INSTANCE.getTypeTrait(secondaryKeyTypes[i]);
+        }
+        for (; i < primaryKeyTypes.length; i++) {
+            secondaryIndexTypeTraits[i] = TypeTraitProvider.INSTANCE.getTypeTrait(primaryKeyTypes[i]);
+        }
+        return secondaryIndexTypeTraits;
+    }
+
+    public IHyracksTaskContext createTestContext(JobId jobId, int partition, boolean withMessaging)
+            throws HyracksDataException {
         IHyracksTaskContext ctx = TestUtils.create(KB32);
         if (withMessaging) {
             TaskUtil.put(HyracksConstants.KEY_MESSAGE, new VSizeFrame(ctx), ctx);
         }
-        JobId jobId = newJobId();
         IHyracksJobletContext jobletCtx = Mockito.mock(IHyracksJobletContext.class);
+        JobEventListenerFactory factory = new JobEventListenerFactory(new TxnId(jobId.getId()), true);
+        Mockito.when(jobletCtx.getJobletEventListenerFactory()).thenReturn(factory);
         Mockito.when(jobletCtx.getServiceContext()).thenReturn(ExecutionTestUtil.integrationUtil.ncs[0].getContext());
         Mockito.when(jobletCtx.getJobId()).thenReturn(jobId);
         ctx = Mockito.spy(ctx);
         Mockito.when(ctx.getJobletContext()).thenReturn(jobletCtx);
         Mockito.when(ctx.getIoManager()).thenReturn(ExecutionTestUtil.integrationUtil.ncs[0].getIoManager());
+        TaskAttemptId taskId =
+                new TaskAttemptId(new TaskId(new ActivityId(new OperatorDescriptorId(0), 0), partition), 0);
+        Mockito.when(ctx.getTaskAttemptId()).thenReturn(taskId);
         return ctx;
     }
 
@@ -322,7 +464,47 @@
         return (DatasetLifecycleManager) getAppRuntimeContext().getDatasetLifecycleManager();
     }
 
+    public static class SecondaryIndexInfo {
+        private int[] primaryKeyIndexes;
+        private PrimaryIndexInfo primaryIndexInfo;
+        private Index secondaryIndex;
+        private ConstantFileSplitProvider fileSplitProvider;
+        private RecordDescriptor rDesc;
+        private int[] insertFieldsPermutations;
+
+        public SecondaryIndexInfo(PrimaryIndexInfo primaryIndexInfo, Index secondaryIndex) {
+            this.primaryIndexInfo = primaryIndexInfo;
+            this.secondaryIndex = secondaryIndex;
+            List<String> nodes = Collections.singletonList(ExecutionTestUtil.integrationUtil.ncs[0].getId());
+            CcApplicationContext appCtx =
+                    (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
+            FileSplit[] splits = SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(),
+                    primaryIndexInfo.dataset, secondaryIndex.getIndexName(), nodes);
+            fileSplitProvider = new ConstantFileSplitProvider(splits);
+            ITypeTraits[] secondaryIndexTypeTraits = createSecondaryIndexTypeTraits(primaryIndexInfo.recordType,
+                    primaryIndexInfo.metaType, primaryIndexInfo.primaryKeyTypes,
+                    secondaryIndex.getKeyFieldTypes().toArray(new IAType[secondaryIndex.getKeyFieldTypes().size()]));
+            ISerializerDeserializer<?>[] secondaryIndexSerdes = createSecondaryIndexSerdes(primaryIndexInfo.recordType,
+                    primaryIndexInfo.metaType, primaryIndexInfo.primaryKeyTypes,
+                    secondaryIndex.getKeyFieldTypes().toArray(new IAType[secondaryIndex.getKeyFieldTypes().size()]));
+            rDesc = new RecordDescriptor(secondaryIndexSerdes, secondaryIndexTypeTraits);
+            insertFieldsPermutations = new int[secondaryIndexTypeTraits.length];
+            for (int i = 0; i < insertFieldsPermutations.length; i++) {
+                insertFieldsPermutations[i] = i;
+            }
+            primaryKeyIndexes = new int[primaryIndexInfo.primaryKeyIndexes.length];
+            for (int i = 0; i < primaryKeyIndexes.length; i++) {
+                primaryKeyIndexes[i] = i + secondaryIndex.getKeyFieldNames().size();
+            }
+        }
+
+        public IFileSplitProvider getFileSplitProvider() {
+            return fileSplitProvider;
+        }
+    }
+
     public static class PrimaryIndexInfo {
+        private Dataset dataset;
         private IAType[] primaryKeyTypes;
         private ARecordType recordType;
         private ARecordType metaType;
@@ -341,6 +523,7 @@
                 ILSMMergePolicyFactory mergePolicyFactory, Map<String, String> mergePolicyProperties,
                 int[] filterFields, int[] primaryKeyIndexes, List<Integer> primaryKeyIndicators)
                 throws AlgebricksException {
+            this.dataset = dataset;
             this.primaryKeyTypes = primaryKeyTypes;
             this.recordType = recordType;
             this.metaType = metaType;
@@ -373,7 +556,7 @@
                     (CcApplicationContext) ExecutionTestUtil.integrationUtil.cc.getApplicationContext();
             FileSplit[] splits = SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(), dataset,
                     index.getIndexName(), nodes);
-            fileSplitProvider = new ConstantFileSplitProvider(Arrays.copyOfRange(splits, 0, 1));
+            fileSplitProvider = new ConstantFileSplitProvider(splits);
         }
 
         public Index getIndex() {
@@ -438,18 +621,19 @@
         PrimaryIndexInfo primaryIndexInfo = new PrimaryIndexInfo(dataset, keyTypes, recordType, metaType,
                 mergePolicy.first, mergePolicy.second, filterFields, keyIndexes, keyIndicators);
         IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                storageComponentProvider, primaryIndexInfo.index, getTxnJobId(ctx), IndexOperation.UPSERT, keyIndexes);
+                storageComponentProvider, primaryIndexInfo.index, IndexOperation.UPSERT, keyIndexes);
         ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
-                storageComponentProvider, primaryIndexInfo.index, getTxnJobId(ctx), IndexOperation.UPSERT, keyIndexes);
+                storageComponentProvider, primaryIndexInfo.index, IndexOperation.UPSERT, keyIndexes);
         IRecordDescriptorProvider recordDescProvider = primaryIndexInfo.getInsertRecordDescriptorProvider();
         IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
                 storageComponentProvider.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
-        LSMPrimaryUpsertOperatorNodePushable insertOp = new LSMPrimaryUpsertOperatorNodePushable(ctx, PARTITION,
-                indexHelperFactory, primaryIndexInfo.primaryIndexInsertFieldsPermutations,
-                recordDescProvider.getInputRecordDescriptor(new ActivityId(new OperatorDescriptorId(0), 0), 0),
-                modificationCallbackFactory, searchCallbackFactory, keyIndexes.length, recordType, -1,
-                frameOpCallbackFactory == null ? dataset.getFrameOpCallbackFactory() : frameOpCallbackFactory,
-                MissingWriterFactory.INSTANCE, hasSecondaries);
+        LSMPrimaryUpsertOperatorNodePushable insertOp =
+                new LSMPrimaryUpsertOperatorNodePushable(ctx, ctx.getTaskAttemptId().getTaskId().getPartition(),
+                        indexHelperFactory, primaryIndexInfo.primaryIndexInsertFieldsPermutations,
+                        recordDescProvider.getInputRecordDescriptor(new ActivityId(new OperatorDescriptorId(0), 0), 0),
+                        modificationCallbackFactory, searchCallbackFactory, keyIndexes.length, recordType, -1,
+                        frameOpCallbackFactory == null ? dataset.getFrameOpCallbackFactory() : frameOpCallbackFactory,
+                        MissingWriterFactory.INSTANCE, hasSecondaries);
         RecordDescriptor upsertOutRecDesc = getUpsertOutRecDesc(primaryIndexInfo.rDesc, dataset,
                 filterFields == null ? 0 : filterFields.length, recordType, metaType);
         // fix pk fields
@@ -459,7 +643,7 @@
             pkFieldsInCommitOp[i] = diff + i;
         }
         CommitRuntime commitOp = new CommitRuntime(ctx, getTxnJobId(ctx), dataset.getDatasetId(), pkFieldsInCommitOp,
-                false, true, PARTITION, true);
+                true, ctx.getTaskAttemptId().getTaskId().getPartition(), true);
         insertOp.setOutputFrameWriter(0, commitOp, upsertOutRecDesc);
         commitOp.setInputRecordDescriptor(0, upsertOutRecDesc);
         return Pair.of(insertOp, commitOp);
@@ -506,4 +690,4 @@
         }
         return new RecordDescriptor(outputSerDes, outputTypeTraits);
     }
-}
\ No newline at end of file
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/external/TestLibrarian.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/external/TestLibrarian.java
deleted file mode 100644
index 76fa308..0000000
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/external/TestLibrarian.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.app.external;
-
-import java.io.File;
-import java.io.IOException;
-import java.rmi.RemoteException;
-import java.util.HashMap;
-import java.util.List;
-
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.library.ILibraryManager;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.test.common.ITestLibrarian;
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-
-public class TestLibrarian implements ITestLibrarian {
-
-    // The following list includes a library manager for the CC
-    // and library managers for NCs (one-per-NC).
-    private final List<ILibraryManager> libraryManagers;
-
-    public TestLibrarian(List<ILibraryManager> libraryManagers) {
-        this.libraryManagers = libraryManagers;
-    }
-
-    @Override
-    public void install(String dvName, String libName, String libPath) throws Exception {
-        // get the directory of the to be installed libraries
-        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
-        // directory exists?
-        if (!installLibDir.exists()) {
-            installLibDir.mkdir();
-        }
-        // copy the library file into the directory
-        File destinationDir = new File(
-                installLibDir.getAbsolutePath() + File.separator + dvName + File.separator + libName);
-        FileUtils.deleteQuietly(destinationDir);
-        destinationDir.mkdirs();
-        try {
-            AsterixEventServiceUtil.unzip(libPath, destinationDir.getAbsolutePath());
-        } catch (Exception e) {
-
-            throw new Exception("Couldn't unzip the file: " + libPath, e);
-        }
-
-        for (ILibraryManager libraryManager : libraryManagers) {
-            ExternalLibraryUtils.registerLibrary(libraryManager, dvName, libName);
-        }
-        // get library file
-        // install if needed (add functions, adapters, datasources, parsers to the metadata)
-        // <Not required for use>
-        ExternalLibraryUtils.installLibraryIfNeeded(dvName, destinationDir, new HashMap<>());
-    }
-
-    @Override
-    public void uninstall(String dvName, String libName) throws RemoteException, AsterixException, ACIDException {
-        ExternalLibraryUtils.uninstallLibrary(dvName, libName);
-        for (ILibraryManager libraryManager : libraryManagers) {
-            libraryManager.deregisterLibraryClassLoader(dvName, libName);
-        }
-    }
-
-    public static void removeLibraryDir() throws IOException {
-        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
-        FileUtils.deleteQuietly(installLibDir);
-    }
-
-    public void cleanup() throws AsterixException, RemoteException, ACIDException {
-        for (ILibraryManager libraryManager : libraryManagers) {
-            List<Pair<String, String>> libs = libraryManager.getAllLibraries();
-            for (Pair<String, String> dvAndLib : libs) {
-                ExternalLibraryUtils.uninstallLibrary(dvAndLib.first, dvAndLib.second);
-                libraryManager.deregisterLibraryClassLoader(dvAndLib.first, dvAndLib.second);
-            }
-        }
-        // get the directory of the to be installed libraries
-        File installLibDir = ExternalLibraryUtils.getLibraryInstallDir();
-        FileUtils.deleteQuietly(installLibDir);
-    }
-}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/resource/PlanStagesGeneratorTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/resource/PlanStagesGeneratorTest.java
new file mode 100644
index 0000000..0e55b1e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/app/resource/PlanStagesGeneratorTest.java
@@ -0,0 +1,307 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.app.resource;
+
+import static org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag.GROUP;
+import static org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag.INNERJOIN;
+import static org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag.LEFTOUTERJOIN;
+import static org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag.ORDER;
+import static org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode.LOCAL;
+import static org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode.PARTITIONED;
+import static org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode.UNPARTITIONED;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.apache.asterix.utils.ResourceUtils;
+import org.apache.commons.lang3.mutable.MutableObject;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.DistributeResultOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.EmptyTupleSourceOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ExchangeOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.GroupByOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.InnerJoinOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.physical.ExternalGroupByPOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.physical.HashPartitionExchangePOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.physical.OneToOneExchangePOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.physical.PreclusteredGroupByPOperator;
+import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl;
+import org.apache.hyracks.api.job.resource.IClusterCapacity;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PlanStagesGeneratorTest {
+
+    private static final Set<LogicalOperatorTag> BLOCKING_OPERATORS =
+            new HashSet<>(Arrays.asList(INNERJOIN, LEFTOUTERJOIN, ORDER));
+    private static final long MEMORY_BUDGET = 33554432L;
+    private static final int FRAME_SIZE = 32768;
+    private static final int FRAME_LIMIT = (int) (MEMORY_BUDGET / FRAME_SIZE);
+    private static final int PARALLELISM = 10;
+    private static final long MAX_BUFFER_PER_CONNECTION = 1L;
+
+    @Test
+    public void noBlockingPlan() throws AlgebricksException {
+        EmptyTupleSourceOperator ets = new EmptyTupleSourceOperator();
+        ets.setExecutionMode(UNPARTITIONED);
+
+        AssignOperator assignOperator = new AssignOperator(Collections.emptyList(), null);
+        assignOperator.setExecutionMode(UNPARTITIONED);
+        assignOperator.getInputs().add(new MutableObject<>(ets));
+
+        ExchangeOperator exchange = new ExchangeOperator();
+        exchange.setExecutionMode(UNPARTITIONED);
+        exchange.setPhysicalOperator(new OneToOneExchangePOperator());
+        exchange.getInputs().add(new MutableObject<>(assignOperator));
+
+        DistributeResultOperator resultOperator = new DistributeResultOperator(null, null);
+        resultOperator.setExecutionMode(UNPARTITIONED);
+        resultOperator.getInputs().add(new MutableObject<>(exchange));
+        ALogicalPlanImpl plan = new ALogicalPlanImpl(Collections.singletonList(new MutableObject(resultOperator)));
+
+        List<PlanStage> stages = ResourceUtils.getStages(plan);
+        // ensure a single stage plan
+        final int expectedStages = 1;
+        Assert.assertEquals(expectedStages, stages.size());
+        validateStages(stages, resultOperator, exchange, ets, assignOperator);
+        // frame size for every operator
+        final long expectedMemory = stages.get(0).getOperators().size() * FRAME_SIZE;
+        assertRequiredMemory(stages, expectedMemory);
+    }
+
+    @Test
+    public void testNonBlockingGroupByOrderBy() throws AlgebricksException {
+        EmptyTupleSourceOperator ets = new EmptyTupleSourceOperator();
+        ets.setExecutionMode(PARTITIONED);
+
+        DataSourceScanOperator scanOperator = new DataSourceScanOperator(Collections.emptyList(), null);
+        scanOperator.setExecutionMode(PARTITIONED);
+        scanOperator.getInputs().add(new MutableObject<>(ets));
+
+        ExchangeOperator exchange = new ExchangeOperator();
+        exchange.setExecutionMode(PARTITIONED);
+        exchange.setPhysicalOperator(new OneToOneExchangePOperator());
+        exchange.getInputs().add(new MutableObject<>(scanOperator));
+
+        GroupByOperator groupByOperator = new GroupByOperator();
+        groupByOperator.setExecutionMode(PARTITIONED);
+        groupByOperator
+                .setPhysicalOperator(new PreclusteredGroupByPOperator(Collections.emptyList(), true, FRAME_LIMIT));
+        groupByOperator.getInputs().add(new MutableObject<>(exchange));
+
+        OrderOperator orderOperator = new OrderOperator();
+        orderOperator.setExecutionMode(PARTITIONED);
+        orderOperator.getInputs().add(new MutableObject<>(groupByOperator));
+
+        DistributeResultOperator resultOperator = new DistributeResultOperator(null, null);
+        resultOperator.setExecutionMode(PARTITIONED);
+        resultOperator.getInputs().add(new MutableObject<>(orderOperator));
+        ALogicalPlanImpl plan = new ALogicalPlanImpl(Collections.singletonList(new MutableObject(resultOperator)));
+
+        final List<PlanStage> stages = ResourceUtils.getStages(plan);
+        validateStages(stages, ets, exchange, groupByOperator, orderOperator, resultOperator);
+        // ensure 3 stage (root to order, order to group by, group by to ets)
+        final int expectedStages = 2;
+        Assert.assertEquals(expectedStages, stages.size());
+
+        // dominating stage should have orderBy, orderBy's input (groupby), groupby's input (exchange),
+        // exchange's input (scanOperator), and scanOperator's input (ets)
+        long orderOperatorRequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long groupByOperatorRequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long exchangeRequiredMemory = PARALLELISM * FRAME_SIZE;
+        long scanOperatorRequiredMemory = PARALLELISM * FRAME_SIZE;
+        long etsRequiredMemory = FRAME_SIZE * PARALLELISM;
+
+        final long expectedMemory = orderOperatorRequiredMemory + groupByOperatorRequiredMemory + exchangeRequiredMemory
+                + scanOperatorRequiredMemory + etsRequiredMemory;
+        assertRequiredMemory(stages, expectedMemory);
+    }
+
+    @Test
+    public void testJoinGroupby() throws AlgebricksException {
+        EmptyTupleSourceOperator ets1 = new EmptyTupleSourceOperator();
+        ets1.setExecutionMode(PARTITIONED);
+
+        DataSourceScanOperator scanOperator1 = new DataSourceScanOperator(Collections.emptyList(), null);
+        scanOperator1.setExecutionMode(PARTITIONED);
+        scanOperator1.getInputs().add(new MutableObject<>(ets1));
+
+        EmptyTupleSourceOperator ets2 = new EmptyTupleSourceOperator();
+        ets1.setExecutionMode(PARTITIONED);
+
+        DataSourceScanOperator scanOperator2 = new DataSourceScanOperator(Collections.emptyList(), null);
+        scanOperator2.setExecutionMode(PARTITIONED);
+        scanOperator2.getInputs().add(new MutableObject<>(ets2));
+
+        InnerJoinOperator firstJoin = new InnerJoinOperator(new MutableObject<>(ConstantExpression.TRUE));
+        firstJoin.setExecutionMode(PARTITIONED);
+        firstJoin.getInputs().add(new MutableObject<>(scanOperator1));
+        firstJoin.getInputs().add(new MutableObject<>(scanOperator2));
+
+        ExchangeOperator exchangeOperator1 = new ExchangeOperator();
+        exchangeOperator1.setExecutionMode(PARTITIONED);
+        exchangeOperator1.setPhysicalOperator(new HashPartitionExchangePOperator(Collections.emptyList(), null));
+        exchangeOperator1.getInputs().add(new MutableObject<>(firstJoin));
+
+        EmptyTupleSourceOperator ets3 = new EmptyTupleSourceOperator();
+        ets1.setExecutionMode(PARTITIONED);
+
+        GroupByOperator groupByOperator = new GroupByOperator();
+        groupByOperator
+                .setPhysicalOperator(new ExternalGroupByPOperator(Collections.emptyList(), FRAME_LIMIT, FRAME_LIMIT));
+        groupByOperator.setExecutionMode(LOCAL);
+        groupByOperator.getInputs().add(new MutableObject<>(ets3));
+
+        ExchangeOperator exchangeOperator2 = new ExchangeOperator();
+        exchangeOperator2.setExecutionMode(PARTITIONED);
+        exchangeOperator2.setPhysicalOperator(new HashPartitionExchangePOperator(Collections.emptyList(), null));
+        exchangeOperator2.getInputs().add(new MutableObject<>(groupByOperator));
+
+        LeftOuterJoinOperator secondJoin = new LeftOuterJoinOperator(new MutableObject<>(ConstantExpression.TRUE));
+        secondJoin.setExecutionMode(PARTITIONED);
+        secondJoin.getInputs().add(new MutableObject<>(exchangeOperator1));
+        secondJoin.getInputs().add(new MutableObject<>(exchangeOperator2));
+
+        DistributeResultOperator resultOperator = new DistributeResultOperator(null, null);
+        resultOperator.setExecutionMode(PARTITIONED);
+        resultOperator.getInputs().add(new MutableObject<>(secondJoin));
+        ALogicalPlanImpl plan = new ALogicalPlanImpl(Collections.singletonList(new MutableObject(resultOperator)));
+
+        List<PlanStage> stages = ResourceUtils.getStages(plan);
+        final int expectedStages = 4;
+        Assert.assertEquals(expectedStages, stages.size());
+        validateStages(stages, ets1, scanOperator1, ets2, scanOperator2, firstJoin, exchangeOperator1, ets3,
+                groupByOperator, exchangeOperator2, secondJoin, resultOperator);
+
+        // dominating stage should have the following operators:
+        // resultOperator, its input (secondJoin), secondJoin's first input (exchangeOperator1), exchangeOperator1's
+        // input (firstJoin), firstJoin's first input (scanOperator1), and scanOperator1's input (ets1)
+        long resultOperatorRequiredMemory = FRAME_SIZE * PARALLELISM;
+        long secondJoinRequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long exchangeOperator1RequiredMemory = 2 * MAX_BUFFER_PER_CONNECTION * PARALLELISM * PARALLELISM * FRAME_SIZE;
+        long firstJoinRequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long scanOperator1RequiredMemory = FRAME_SIZE * PARALLELISM;
+        long ets1RequiredMemory = FRAME_SIZE * PARALLELISM;
+
+        long expectedMemory = resultOperatorRequiredMemory + secondJoinRequiredMemory + exchangeOperator1RequiredMemory
+                + firstJoinRequiredMemory + scanOperator1RequiredMemory + ets1RequiredMemory;
+        assertRequiredMemory(stages, expectedMemory);
+    }
+
+    @Test
+    public void testReplicateSortJoin() throws AlgebricksException {
+        EmptyTupleSourceOperator ets = new EmptyTupleSourceOperator();
+        ets.setExecutionMode(PARTITIONED);
+
+        DataSourceScanOperator scanOperator = new DataSourceScanOperator(Collections.emptyList(), null);
+        scanOperator.setExecutionMode(PARTITIONED);
+        scanOperator.getInputs().add(new MutableObject<>(ets));
+
+        ReplicateOperator replicateOperator = new ReplicateOperator(2);
+        replicateOperator.setExecutionMode(PARTITIONED);
+        replicateOperator.getInputs().add(new MutableObject<>(scanOperator));
+
+        OrderOperator order1 = new OrderOperator();
+        order1.setExecutionMode(PARTITIONED);
+        order1.setPhysicalOperator(new OneToOneExchangePOperator());
+        order1.getInputs().add(new MutableObject<>(replicateOperator));
+
+        OrderOperator order2 = new OrderOperator();
+        order2.setExecutionMode(PARTITIONED);
+        order2.setPhysicalOperator(new OneToOneExchangePOperator());
+        order2.getInputs().add(new MutableObject<>(replicateOperator));
+
+        LeftOuterJoinOperator secondJoin = new LeftOuterJoinOperator(new MutableObject<>(ConstantExpression.TRUE));
+        secondJoin.setExecutionMode(PARTITIONED);
+        secondJoin.getInputs().add(new MutableObject<>(order1));
+        secondJoin.getInputs().add(new MutableObject<>(order2));
+
+        DistributeResultOperator resultOperator = new DistributeResultOperator(null, null);
+        resultOperator.setExecutionMode(PARTITIONED);
+        resultOperator.getInputs().add(new MutableObject<>(secondJoin));
+        ALogicalPlanImpl plan = new ALogicalPlanImpl(Collections.singletonList(new MutableObject(resultOperator)));
+
+        List<PlanStage> stages = ResourceUtils.getStages(plan);
+        final int expectedStages = 3;
+        Assert.assertEquals(expectedStages, stages.size());
+        validateStages(stages);
+
+        // dominating stage should have the following operators:
+        // secondJoin, secondJoin's second input (order2), order2's input (replicate),
+        // replicate's input (scanOperator), scanOperator's input (ets)
+        long secondJoinRequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long order2RequiredMemory = FRAME_LIMIT * FRAME_SIZE * PARALLELISM;
+        long replicateOperatorRequiredMemory = FRAME_SIZE * PARALLELISM;
+        long scanOperator1RequiredMemory = FRAME_SIZE * PARALLELISM;
+        long etsRequiredMemory = FRAME_SIZE * PARALLELISM;
+        long expectedMemory = secondJoinRequiredMemory + order2RequiredMemory + replicateOperatorRequiredMemory
+                + scanOperator1RequiredMemory + etsRequiredMemory;
+        assertRequiredMemory(stages, expectedMemory);
+    }
+
+    private void validateStages(List<PlanStage> stages, ILogicalOperator... operators) {
+        // ensure all operators appear
+        Stream.of(operators).forEach(op -> ensureOperatorExists(stages, op));
+        // ensure the correct count
+        for (PlanStage stage : stages) {
+            stage.getOperators().forEach(op -> validateOperatorStages(stages, op));
+        }
+    }
+
+    private void ensureOperatorExists(List<PlanStage> stages, ILogicalOperator operator) {
+        final long actual = stages.stream().map(PlanStage::getOperators).filter(op -> op.contains(operator)).count();
+        Assert.assertTrue(actual > 0);
+    }
+
+    private void validateOperatorStages(List<PlanStage> stages, ILogicalOperator operator) {
+        if (stages.size() == 1) {
+            return;
+        }
+        long expectedAppearances = BLOCKING_OPERATORS.contains(operator.getOperatorTag()) ? 2 : 1;
+        if (operator.getOperatorTag() == GROUP) {
+            GroupByOperator groupByOperator = (GroupByOperator) operator;
+            if (groupByOperator.getPhysicalOperator().getOperatorTag() == PhysicalOperatorTag.EXTERNAL_GROUP_BY
+                    || groupByOperator.getPhysicalOperator().getOperatorTag() == PhysicalOperatorTag.SORT_GROUP_BY) {
+                expectedAppearances = 2;
+            }
+        }
+        final long actual = stages.stream().map(PlanStage::getOperators).filter(op -> op.contains(operator)).count();
+        Assert.assertEquals(expectedAppearances, actual);
+    }
+
+    private void assertRequiredMemory(List<PlanStage> stages, long expectedMemory) {
+        final IClusterCapacity clusterCapacity = ResourceUtils.getStageBasedRequiredCapacity(stages, PARALLELISM,
+                FRAME_LIMIT, FRAME_LIMIT, FRAME_LIMIT, FRAME_SIZE);
+        Assert.assertEquals(clusterCapacity.getAggregatedMemoryByteSize(), expectedMemory);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/aql/translator/QueryTranslatorTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/aql/translator/QueryTranslatorTest.java
index b80f8f8..51c512a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/aql/translator/QueryTranslatorTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/aql/translator/QueryTranslatorTest.java
@@ -29,11 +29,8 @@
 import java.util.List;
 
 import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.ExternalProperties;
 import org.apache.asterix.compiler.provider.AqlCompilationProvider;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.MasterNode;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.RunStatement;
@@ -41,7 +38,9 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.asterix.translator.SessionOutput;
 import org.apache.hyracks.api.application.ICCServiceContext;
+import org.apache.hyracks.api.client.ClusterControllerInfo;
 import org.apache.hyracks.api.config.IApplicationConfig;
+import org.apache.hyracks.api.context.ICCContext;
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.junit.Assert;
 import org.junit.Test;
@@ -64,19 +63,15 @@
         when(mockAsterixExternalProperties.getAPIServerPort()).thenReturn(19002);
         ICCServiceContext mockServiceContext = mock(ICCServiceContext.class);
         when(mockAsterixAppContextInfo.getServiceContext()).thenReturn(mockServiceContext);
+        ICCContext mockCCContext = mock(ICCContext.class);
+        when(mockServiceContext.getCCContext()).thenReturn(mockCCContext);
+        ClusterControllerInfo mockCCInfo = mock(ClusterControllerInfo.class);
+        when(mockCCContext.getClusterControllerInfo()).thenReturn(mockCCInfo);
+        when(mockCCInfo.getClientNetAddress()).thenReturn("127.0.0.1");
         IApplicationConfig mockApplicationConfig = mock(IApplicationConfig.class);
         when(mockServiceContext.getAppConfig()).thenReturn(mockApplicationConfig);
         when(mockApplicationConfig.getBoolean(CCConfig.Option.ENFORCE_FRAME_WRITER_PROTOCOL)).thenReturn(true);
 
-        // Mocks AsterixClusterProperties.
-        Cluster mockCluster = mock(Cluster.class);
-        MasterNode mockMasterNode = mock(MasterNode.class);
-        ClusterProperties mockClusterProperties = mock(ClusterProperties.class);
-        setFinalStaticField(ClusterProperties.class.getDeclaredField("INSTANCE"), mockClusterProperties);
-        when(mockClusterProperties.getCluster()).thenReturn(mockCluster);
-        when(mockCluster.getMasterNode()).thenReturn(mockMasterNode);
-        when(mockMasterNode.getClientIp()).thenReturn("127.0.0.1");
-
         IStatementExecutor aqlTranslator = new DefaultStatementExecutorFactory().create(mockAsterixAppContextInfo,
                 statements, mockSessionOutput, new AqlCompilationProvider(), new StorageComponentProvider());
         List<String> parameters = new ArrayList<>();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
new file mode 100644
index 0000000..ab8969e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/common/TestDataUtil.java
@@ -0,0 +1,230 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common;
+
+import java.io.InputStream;
+import java.rmi.RemoteException;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.app.active.ActiveNotificationHandler;
+import org.apache.asterix.common.api.IMetadataLockManager;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.utils.Servlets;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
+import org.apache.asterix.rebalance.NoOpDatasetRebalanceCallback;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.asterix.utils.RebalanceUtil;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.io.FileSplit;
+import org.junit.Assert;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+public class TestDataUtil {
+
+    private static final TestExecutor TEST_EXECUTOR = new TestExecutor();
+    private static final TestCaseContext.OutputFormat OUTPUT_FORMAT = TestCaseContext.OutputFormat.CLEAN_JSON;
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+    private TestDataUtil() {
+    }
+
+    /**
+     * Creates dataset with a single field called id as its primary key.
+     *
+     * @param dataset
+     * @throws Exception
+     */
+    public static void createIdOnlyDataset(String dataset) throws Exception {
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE TYPE KeyType IF NOT EXISTS AS { id: int };", OUTPUT_FORMAT);
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE DATASET " + dataset + "(KeyType) PRIMARY KEY id;", OUTPUT_FORMAT);
+    }
+
+    /**
+     * Creates a dataset with multiple fields
+     * @param dataset The name of the dataset
+     * @param fields The fields of the dataset
+     * @param PKName The primary key field name
+     * @throws Exception
+     */
+    public static void createDataset(String dataset, Map<String, String> fields, String PKName) throws Exception {
+        StringBuilder stringBuilder = new StringBuilder("");
+        fields.forEach((fName, fType) -> stringBuilder.append(fName).append(":").append(fType).append(","));
+        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE TYPE dsType AS {" + stringBuilder + "};", OUTPUT_FORMAT);
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE DATASET " + dataset + "(dsType) PRIMARY KEY " + PKName + ";",
+                OUTPUT_FORMAT);
+    }
+
+    /**
+     * Creates a secondary primary index
+     * @param dataset the name of the dataset
+     * @param indexName the name of the index
+     * @throws Exception
+     */
+    public static void createPrimaryIndex(String dataset, String indexName) throws Exception {
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE PRIMARY INDEX " + indexName + " ON " + dataset + ";",
+                OUTPUT_FORMAT);
+    }
+
+    /**
+     * Creates a secondary BTree index
+     * @param dataset the name of the dataset
+     * @param indexName the name of the index
+     * @param SKName the name of the field
+     * @throws Exception
+     */
+    public static void createSecondaryBTreeIndex(String dataset, String indexName, String SKName) throws Exception {
+        TEST_EXECUTOR.executeSqlppUpdateOrDdl("CREATE INDEX " + indexName + " ON " + dataset + "(" + SKName + ");",
+                OUTPUT_FORMAT);
+    }
+
+    /**
+     * Upserts {@code count} ids into {@code dataset}
+     *
+     * @param dataset
+     * @param count
+     * @throws Exception
+     */
+    public static void upsertData(String dataset, long count) throws Exception {
+        for (int i = 0; i < count; i++) {
+            TEST_EXECUTOR.executeSqlppUpdateOrDdl("UPSERT INTO " + dataset + " ({\"id\": " + i + "});",
+                    TestCaseContext.OutputFormat.CLEAN_JSON);
+        }
+    }
+
+    /**
+     * Gets the number of records in dataset {@code dataset}
+     *
+     * @param datasetName
+     * @return The count
+     * @throws Exception
+     */
+    public static long getDatasetCount(String datasetName) throws Exception {
+        final String query = "SELECT VALUE COUNT(*) FROM `" + datasetName + "`;";
+        final InputStream responseStream = TEST_EXECUTOR.executeQueryService(query,
+                TEST_EXECUTOR.getEndpoint(Servlets.QUERY_SERVICE), OUTPUT_FORMAT);
+        final ObjectNode response = OBJECT_MAPPER.readValue(responseStream, ObjectNode.class);
+        final JsonNode result = response.get("results");
+        // make sure there is a single value in result
+        Assert.assertEquals(1, result.size());
+        return result.get(0).asInt();
+    }
+
+    /**
+     * Rebalances a dataset to {@code targetNodes}
+     *
+     * @param integrationUtil
+     * @param dataverseName
+     * @param datasetName
+     * @param targetNodes
+     * @throws Exception
+     */
+    public static void rebalanceDataset(AsterixHyracksIntegrationUtil integrationUtil, String dataverseName,
+            String datasetName, String[] targetNodes) throws Exception {
+        ICcApplicationContext ccAppCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        MetadataProvider metadataProvider = new MetadataProvider(ccAppCtx, null);
+        try {
+            ActiveNotificationHandler activeNotificationHandler =
+                    (ActiveNotificationHandler) ccAppCtx.getActiveNotificationHandler();
+            activeNotificationHandler.suspend(metadataProvider);
+            try {
+                IMetadataLockManager lockManager = ccAppCtx.getMetadataLockManager();
+                lockManager.acquireDatasetExclusiveModificationLock(metadataProvider.getLocks(),
+                        dataverseName + '.' + datasetName);
+                RebalanceUtil.rebalance(dataverseName, datasetName, new LinkedHashSet<>(Arrays.asList(targetNodes)),
+                        metadataProvider, ccAppCtx.getHcc(), NoOpDatasetRebalanceCallback.INSTANCE);
+            } finally {
+                activeNotificationHandler.resume(metadataProvider);
+            }
+        } finally {
+            metadataProvider.getLocks().unlock();
+        }
+    }
+
+    /**
+     * Gets the reference of dataset {@code dataset} from metadata
+     *
+     * @param integrationUtil
+     * @param datasetName
+     * @return the dataset reference if found. Otherwise null.
+     * @throws AlgebricksException
+     * @throws RemoteException
+     */
+    public static Dataset getDataset(AsterixHyracksIntegrationUtil integrationUtil, String datasetName)
+            throws AlgebricksException, RemoteException {
+        final ICcApplicationContext appCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        final MetadataProvider metadataProvider = new MetadataProvider(appCtx, null);
+        final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(mdTxnCtx);
+        Dataset dataset;
+        try {
+            dataset = metadataProvider.findDataset(MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME, datasetName);
+        } finally {
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+            metadataProvider.getLocks().unlock();
+        }
+        return dataset;
+    }
+
+    /**
+     * Gets the file splits of {@code dataset}
+     *
+     * @param integrationUtil
+     * @param dataset
+     * @return the file splits of the dataset
+     * @throws RemoteException
+     * @throws AlgebricksException
+     */
+    public static FileSplit[] getDatasetSplits(AsterixHyracksIntegrationUtil integrationUtil, Dataset dataset)
+            throws RemoteException, AlgebricksException {
+        final ICcApplicationContext ccAppCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+        try {
+            return SplitsAndConstraintsUtil.getIndexSplits(dataset, dataset.getDatasetName(), mdTxnCtx,
+                    ccAppCtx.getClusterStateManager());
+        } finally {
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+        }
+    }
+
+    public static String getIndexPath(AsterixHyracksIntegrationUtil integrationUtil, Dataset dataset, String nodeId)
+            throws Exception {
+        final FileSplit[] datasetSplits = TestDataUtil.getDatasetSplits(integrationUtil, dataset);
+        final Optional<FileSplit> nodeFileSplit =
+                Arrays.stream(datasetSplits).filter(s -> s.getNodeName().equals(nodeId)).findFirst();
+        Assert.assertTrue(nodeFileSplit.isPresent());
+        return nodeFileSplit.get().getPath();
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ClusterStateManagerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ClusterStateManagerTest.java
index 6c11139..4beb44a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ClusterStateManagerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ClusterStateManagerTest.java
@@ -24,17 +24,17 @@
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.asterix.app.replication.NoFaultToleranceStrategy;
+import org.apache.asterix.app.replication.NcLifecycleCoordinator;
 import org.apache.asterix.app.replication.message.NCLifecycleTaskReportMessage;
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
 import org.apache.asterix.common.config.MetadataProperties;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.IMetadataBootstrap;
 import org.apache.asterix.runtime.transaction.ResourceIdManager;
 import org.apache.asterix.runtime.utils.CcApplicationContext;
 import org.apache.asterix.runtime.utils.ClusterStateManager;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.ICCServiceContext;
 import org.apache.hyracks.api.config.IApplicationConfig;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -185,7 +185,7 @@
     }
 
     private void notifyNodeJoined(ClusterStateManager csm, String nodeId, int partitionId, boolean registerPartitions)
-            throws HyracksException, AsterixException {
+            throws HyracksException, AlgebricksException {
         csm.notifyNodeJoin(nodeId, Collections.emptyMap());
         if (registerPartitions) {
             csm.registerNodePartitions(nodeId, new ClusterPartition[] { new ClusterPartition(partitionId, nodeId, 0) });
@@ -196,7 +196,7 @@
             throws HyracksDataException {
         NCLifecycleTaskReportMessage msg = new NCLifecycleTaskReportMessage(nodeId, true);
         applicationContext.getResourceIdManager().report(nodeId, 0);
-        applicationContext.getFaultToleranceStrategy().process(msg);
+        applicationContext.getNcLifecycleCoordinator().process(msg);
     }
 
     private CcApplicationContext ccAppContext(ClusterStateManager csm) throws HyracksDataException {
@@ -207,9 +207,10 @@
         Mockito.when(iccServiceContext.getAppConfig()).thenReturn(applicationConfig);
         Mockito.when(ccApplicationContext.getServiceContext()).thenReturn(iccServiceContext);
 
-        NoFaultToleranceStrategy fts = new NoFaultToleranceStrategy();
-        fts.bindTo(csm);
-        Mockito.when(ccApplicationContext.getFaultToleranceStrategy()).thenReturn(fts);
+        NcLifecycleCoordinator coordinator =
+                new NcLifecycleCoordinator(ccApplicationContext.getServiceContext(), false);
+        coordinator.bindTo(csm);
+        Mockito.when(ccApplicationContext.getNcLifecycleCoordinator()).thenReturn(coordinator);
 
         MetadataProperties metadataProperties = mockMetadataProperties();
         Mockito.when(ccApplicationContext.getMetadataProperties()).thenReturn(metadataProperties);
@@ -230,6 +231,7 @@
     private MetadataProperties mockMetadataProperties() {
         SortedMap<Integer, ClusterPartition> clusterPartitions = Collections.synchronizedSortedMap(new TreeMap<>());
         Map<String, ClusterPartition[]> nodePartitionsMap = new ConcurrentHashMap<>();
+        nodePartitionsMap.put(METADATA_NODE, new ClusterPartition[] { new ClusterPartition(0, METADATA_NODE, 0) });
         MetadataProperties metadataProperties = Mockito.mock(MetadataProperties.class);
         Mockito.when(metadataProperties.getMetadataNodeName()).thenReturn(METADATA_NODE);
         Mockito.when(metadataProperties.getClusterPartitions()).thenReturn(clusterPartitions);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
index 4bcee04..baaf546 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
@@ -60,8 +60,8 @@
     }
 
     private void testFunction(IFunctionDescriptorFactory funcFactory) throws Exception {
-        AbstractScalarFunctionDynamicDescriptor funcDesc = (AbstractScalarFunctionDynamicDescriptor) funcFactory
-                .createFunctionDescriptor();
+        AbstractScalarFunctionDynamicDescriptor funcDesc =
+                (AbstractScalarFunctionDynamicDescriptor) funcFactory.createFunctionDescriptor();
         int inputArity = funcDesc.getIdentifier().getArity();
         Iterator<IScalarEvaluatorFactory[]> argEvalFactoryIterator = getArgCombinations(inputArity);
         while (argEvalFactoryIterator.hasNext()) {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
index 40d4f6a..9612ead 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java
@@ -54,6 +54,7 @@
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobIdFactory;
 import org.apache.hyracks.api.job.JobStatus;
@@ -98,7 +99,7 @@
 
     @Before
     public void setUp() throws Exception {
-        jobIdFactory = new JobIdFactory();
+        jobIdFactory = new JobIdFactory(CcId.valueOf((short) 0));
         handler = new ActiveNotificationHandler();
         allDatasets = new ArrayList<>();
         firstDataset = new Dataset(dataverseName, "firstDataset", null, null, null, null, null, null, null, null, 0, 0);
@@ -346,6 +347,27 @@
         Assert.assertEquals(ActivityState.RUNNING, listener.getState());
     }
 
+    @Test
+    public void testStopFromRunningAndJobFails() throws Exception {
+        testStartWhenStartSucceed();
+        Assert.assertEquals(ActivityState.RUNNING, listener.getState());
+        listener.onStop(Behavior.STEP_SUCCEED);
+        Action stopping = users[1].stopActivity(listener);
+        // wait for notification from listener
+        synchronized (listener) {
+            listener.wait();
+        }
+        clusterController.jobFinish(listener.getJobId(), JobStatus.FAILURE,
+                Collections.singletonList(new HyracksDataException("Runtime Failure")));
+        Assert.assertNull(listener.getRecoveryTask());
+        listener.allowStep();
+        stopping.sync();
+        Assert.assertFalse(stopping.hasFailed());
+        Assert.assertEquals(ActivityState.STOPPED, listener.getState());
+        Assert.assertNull(listener.getRecoveryTask());
+
+    }
+
     @SuppressWarnings("deprecation")
     @Test
     public void testRecovery() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
index e1fdb69..dfb92b7 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveStatsTest.java
@@ -60,10 +60,11 @@
 
     protected boolean cleanUp = true;
     private static String EXPECTED_STATS = "\"Mock stats\"";
+    private static String CONF_PATH = "src/main/resources/cc.conf";
 
     @Before
     public void setUp() throws Exception {
-        ExecutionTestUtil.setUp(cleanUp);
+        ExecutionTestUtil.setUp(cleanUp, CONF_PATH);
     }
 
     @Test
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java
index c50a4a2..fcd18d0 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java
@@ -34,4 +34,9 @@
     protected void handle(Action action) throws Exception {
         action.execute(actorMdProvider);
     }
+
+    @Override
+    public String toString() {
+        return "{\"name\":\"" + name + "\"}";
+    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java
index 5199b1c..7e1bc37 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java
@@ -30,13 +30,13 @@
 import org.apache.asterix.app.active.ActiveEntityEventsListener;
 import org.apache.asterix.common.api.IMetadataLockManager;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.LockList;
 import org.apache.asterix.external.feed.watch.WaitForStateSubscriber;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.translator.IStatementExecutor;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
@@ -110,7 +110,7 @@
         try {
             metadataProvider.getApplicationContext().getMetadataLockManager()
                     .acquireDatasetReadLock(metadataProvider.getLocks(), "Default.type");
-        } catch (AsterixException e) {
+        } catch (AlgebricksException e) {
             throw HyracksDataException.create(e);
         }
         failCompile(onStart);
@@ -145,13 +145,14 @@
     @SuppressWarnings("deprecation")
     @Override
     protected Void doStop(MetadataProvider metadataProvider) throws HyracksDataException {
+        ActivityState intention = state;
         step(onStop);
         failCompile(onStop);
         try {
             Set<ActivityState> waitFor;
-            if (state == ActivityState.STOPPING) {
+            if (intention == ActivityState.STOPPING) {
                 waitFor = EnumSet.of(ActivityState.STOPPED, ActivityState.PERMANENTLY_FAILED);
-            } else if (state == ActivityState.SUSPENDING) {
+            } else if (intention == ActivityState.SUSPENDING) {
                 waitFor = EnumSet.of(ActivityState.SUSPENDED, ActivityState.TEMPORARILY_FAILED);
             } else {
                 throw new IllegalStateException("stop with what intention??");
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestNodeControllerActor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestNodeControllerActor.java
index a5afa0e..f849f08 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestNodeControllerActor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestNodeControllerActor.java
@@ -22,7 +22,6 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveEvent;
 import org.apache.asterix.active.ActiveEvent.Kind;
@@ -32,9 +31,11 @@
 import org.apache.asterix.active.message.ActivePartitionMessage.Event;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TestNodeControllerActor extends Actor {
-    private static final Logger LOGGER = Logger.getLogger(TestNodeControllerActor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final String id;
     private final TestClusterControllerActor clusterController;
@@ -62,7 +63,7 @@
         if (registrations.remove(registration)) {
             return registration.deregister();
         } else {
-            LOGGER.warning("Request to stop runtime: " + new ActiveRuntimeId(entityId, "Test", partition)
+            LOGGER.warn("Request to stop runtime: " + new ActiveRuntimeId(entityId, "Test", partition)
                     + " that is not registered. Could be that the runtime completed execution on"
                     + " this node before the cluster controller sent the stop request");
             return new Action() {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestCase.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestCase.java
index 7173103..cfd5373 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestCase.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestCase.java
@@ -58,11 +58,11 @@
         try {
             parser.parse();
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.warning("Failed while testing file " + reader);
+            GlobalConfig.ASTERIX_LOGGER.warn("Failed while testing file " + reader);
             StringWriter sw = new StringWriter();
             PrintWriter writer = new PrintWriter(sw);
             e.printStackTrace(writer);
-            GlobalConfig.ASTERIX_LOGGER.warning(sw.toString());
+            GlobalConfig.ASTERIX_LOGGER.warn(sw.toString());
             throw new ParseException("Parsing " + queryFile.toString());
         }
 
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestSuite.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestSuite.java
index 57a446a..a7c9c40 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestSuite.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/aql/AQLTestSuite.java
@@ -29,10 +29,11 @@
 import org.apache.commons.lang3.StringUtils;
 
 public class AQLTestSuite extends TestSuite {
-    private static String AQLTS_PATH = StringUtils.join(new String[] { "src", "test", "resources", "parserts",
-            "queries" + File.separator }, File.separator);
-    private static String AQLTS_SQL_LIKE_PATH = StringUtils.join(new String[] { "src", "test", "resources", "parserts",
-            "queries-sql-like" + File.separator }, File.separator);
+    private static String AQLTS_PATH = StringUtils
+            .join(new String[] { "src", "test", "resources", "parserts", "queries" + File.separator }, File.separator);
+    private static String AQLTS_SQL_LIKE_PATH = StringUtils.join(
+            new String[] { "src", "test", "resources", "parserts", "queries-sql-like" + File.separator },
+            File.separator);
 
     public static Test suite() throws ParseException, UnsupportedEncodingException, FileNotFoundException {
         File testData = new File(AQLTS_PATH);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
index b4f9ded..41aa23f 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/CancellationTestExecutor.java
@@ -112,7 +112,8 @@
             queryCount.increment();
             return false;
         } else {
-            System.err.println("Expected to find one of the following in error text:\n+++++\n" + expectedErrors + "\n+++++");
+            System.err.println(
+                    "Expected to find one of the following in error text:\n+++++\n" + expectedErrors + "\n+++++");
             return true;
         }
     }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ITestLibrarian.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ITestLibrarian.java
deleted file mode 100644
index d661710..0000000
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ITestLibrarian.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.test.common;
-
-import java.io.IOException;
-import java.rmi.RemoteException;
-
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.AsterixException;
-
-public interface ITestLibrarian {
-    public void install(String dvName, String libName, String libPath) throws IOException, Exception;
-
-    public void uninstall(String dvName, String libName) throws RemoteException, AsterixException, ACIDException;
-}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
index a63cb76..3318459 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/RebalanceCancellationTestExecutor.java
@@ -28,7 +28,6 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.logging.Level;
 
 import org.apache.asterix.common.exceptions.ExceptionUtils;
 import org.apache.asterix.common.utils.Servlets;
@@ -39,6 +38,7 @@
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.client.methods.RequestBuilder;
+import org.apache.logging.log4j.Level;
 import org.junit.Assert;
 
 public class RebalanceCancellationTestExecutor extends TestExecutor {
@@ -84,7 +84,7 @@
                         if (errorMsg == null || !errorMsg.contains("reference count = 1")) {
                             return e2;
                         }
-                        LOGGER.log(Level.WARNING, e2.toString(), e2);
+                        LOGGER.log(Level.WARN, e2.toString(), e2);
                     }
                 } while (!done);
             }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
index b95a283..890667a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/ResultExtractor.java
@@ -25,10 +25,11 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.commons.io.IOUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.PrettyPrinter;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -77,7 +78,7 @@
         }
     }
 
-    private static final Logger LOGGER = Logger.getLogger(ResultExtractor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
     public static InputStream extract(InputStream resultStream) throws Exception {
@@ -109,7 +110,7 @@
         final PrettyPrinter singleLine = new SingleLinePrettyPrinter();
         final ObjectNode result = OBJECT_MAPPER.readValue(resultStr, ObjectNode.class);
 
-        LOGGER.fine("+++++++\n" + result + "\n+++++++\n");
+        LOGGER.debug("+++++++\n" + result + "\n+++++++\n");
         // if we have errors field in the results, we will always return it
         checkForErrors(result);
         final StringBuilder resultBuilder = new StringBuilder();
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
index 4ca9131..bae1a21 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestExecutor.java
@@ -30,10 +30,9 @@
 import java.io.PrintStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.net.Inet4Address;
 import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
@@ -45,6 +44,7 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -53,11 +53,12 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
+import org.apache.asterix.api.http.server.QueryServiceServlet;
+import org.apache.asterix.app.external.IExternalUDFLibrarian;
 import org.apache.asterix.common.api.Duration;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.utils.Servlets;
@@ -88,6 +89,9 @@
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.util.EntityUtils;
 import org.apache.hyracks.util.StorageUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Assert;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -102,39 +106,45 @@
     /*
      * Static variables
      */
-    protected static final Logger LOGGER = Logger.getLogger(TestExecutor.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
     // see
     // https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184
     private static final long MAX_URL_LENGTH = 2000l;
-    private static final Pattern JAVA_BLOCK_COMMENT_PATTERN = Pattern.compile("/\\*.*\\*/",
-            Pattern.MULTILINE | Pattern.DOTALL);
-    private static final Pattern JAVA_SHELL_SQL_LINE_COMMENT_PATTERN = Pattern.compile("^(//|#|--).*$",
-            Pattern.MULTILINE);
+    private static final Pattern JAVA_BLOCK_COMMENT_PATTERN =
+            Pattern.compile("/\\*.*\\*/", Pattern.MULTILINE | Pattern.DOTALL);
+    private static final Pattern JAVA_SHELL_SQL_LINE_COMMENT_PATTERN =
+            Pattern.compile("^(//|#|--).*$", Pattern.MULTILINE);
     private static final Pattern REGEX_LINES_PATTERN = Pattern.compile("^(-)?/(.*)/([im]*)$");
-    private static final Pattern POLL_TIMEOUT_PATTERN = Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)",
-            Pattern.MULTILINE);
+    private static final Pattern POLL_TIMEOUT_PATTERN =
+            Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", Pattern.MULTILINE);
     private static final Pattern POLL_DELAY_PATTERN = Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE);
     private static final Pattern HANDLE_VARIABLE_PATTERN = Pattern.compile("handlevariable=(\\w+)");
     private static final Pattern VARIABLE_REF_PATTERN = Pattern.compile("\\$(\\w+)");
     private static final Pattern HTTP_PARAM_PATTERN = Pattern.compile("param (\\w+)=(.*)", Pattern.MULTILINE);
+    private static final Pattern HTTP_BODY_PATTERN = Pattern.compile("body=(.*)", Pattern.MULTILINE);
     private static final Pattern HTTP_STATUSCODE_PATTERN = Pattern.compile("statuscode (.*)", Pattern.MULTILINE);
-
+    private static final Pattern MAX_RESULT_READS_PATTERN =
+            Pattern.compile("maxresultreads=(\\d+)(\\D|$)", Pattern.MULTILINE);
     public static final int TRUNCATE_THRESHOLD = 16384;
+    public static final Set<String> NON_CANCELLABLE =
+            Collections.unmodifiableSet(new HashSet<>(Arrays.asList("store", "validate")));
 
     public static final String DELIVERY_ASYNC = "async";
     public static final String DELIVERY_DEFERRED = "deferred";
     public static final String DELIVERY_IMMEDIATE = "immediate";
+    public static final String DIAGNOSE = "diagnose";
     private static final String METRICS_QUERY_TYPE = "metrics";
 
-    private static Method managixExecuteMethod = null;
     private static final HashMap<Integer, ITestServer> runningTestServers = new HashMap<>();
+    private static Map<String, InetSocketAddress> ncEndPoints;
+    private static Map<String, InetSocketAddress> replicationAddress;
 
     /*
      * Instance members
      */
     protected final List<InetSocketAddress> endpoints;
     protected int endpointSelector;
-    protected ITestLibrarian librarian;
+    protected IExternalUDFLibrarian librarian;
     private Map<File, TestLoop> testLoops = new HashMap<>();
 
     public TestExecutor() {
@@ -153,10 +163,18 @@
         this.endpoints = endpoints;
     }
 
-    public void setLibrarian(ITestLibrarian librarian) {
+    public void setLibrarian(IExternalUDFLibrarian librarian) {
         this.librarian = librarian;
     }
 
+    public void setNcEndPoints(Map<String, InetSocketAddress> ncEndPoints) {
+        this.ncEndPoints = ncEndPoints;
+    }
+
+    public void setNcReplicationAddress(Map<String, InetSocketAddress> replicationAddress) {
+        this.replicationAddress = replicationAddress;
+    }
+
     /**
      * Probably does not work well with symlinks.
      */
@@ -171,13 +189,13 @@
         return path.delete();
     }
 
-    public void runScriptAndCompareWithResult(File scriptFile, PrintWriter print, File expectedFile, File actualFile,
+    public void runScriptAndCompareWithResult(File scriptFile, File expectedFile, File actualFile,
             ComparisonEnum compare) throws Exception {
-        System.err.println("Expected results file: " + expectedFile.toString());
-        BufferedReader readerExpected = new BufferedReader(
-                new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
-        BufferedReader readerActual = new BufferedReader(
-                new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
+        LOGGER.info("Expected results file: {} ", expectedFile);
+        BufferedReader readerExpected =
+                new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
+        BufferedReader readerActual =
+                new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
         boolean regex = false;
         try {
             if (ComparisonEnum.BINARY.equals(compare)) {
@@ -201,7 +219,7 @@
                     if (lineExpected.isEmpty()) {
                         continue;
                     }
-                    throw createLineChangedException(scriptFile, lineExpected, "<EOF> after " + num + " lines", num);
+                    throw createLineChangedException(scriptFile, lineExpected, "<EOF>", num);
                 }
 
                 // Comparing result equality but ignore "Time"-prefixed fields. (for metadata tests.)
@@ -236,10 +254,10 @@
             }
             lineActual = readerActual.readLine();
             if (lineActual != null) {
-                throw createLineChangedException(scriptFile, "expected <EOF>", lineActual, num);
+                throw createLineChangedException(scriptFile, "<EOF>", lineActual, num);
             }
         } catch (Exception e) {
-            System.err.println("Actual results file: " + actualFile.toString());
+            LOGGER.info("Actual results file: {}", actualFile);
             throw e;
         } finally {
             readerExpected.close();
@@ -250,8 +268,8 @@
 
     private ComparisonException createLineChangedException(File scriptFile, String lineExpected, String lineActual,
             int num) {
-        return new ComparisonException("Result for " + scriptFile + " changed at line " + num + ":\n< "
-                + truncateIfLong(lineExpected) + "\n> " + truncateIfLong(lineActual));
+        return new ComparisonException("Result for " + scriptFile + " changed at line " + num + ":\nexpected < "
+                + truncateIfLong(lineExpected) + "\nactual   > " + truncateIfLong(lineActual));
     }
 
     private String truncateIfLong(String string) {
@@ -360,10 +378,10 @@
     public void runScriptAndCompareWithResultRegex(File scriptFile, File expectedFile, File actualFile)
             throws Exception {
         String lineExpected, lineActual;
-        try (BufferedReader readerExpected = new BufferedReader(
-                new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
-                BufferedReader readerActual = new BufferedReader(
-                        new InputStreamReader(new FileInputStream(actualFile), "UTF-8"))) {
+        try (BufferedReader readerExpected =
+                new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile), "UTF-8"));
+                BufferedReader readerActual =
+                        new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"))) {
             StringBuilder actual = new StringBuilder();
             while ((lineActual = readerActual.readLine()) != null) {
                 actual.append(lineActual).append('\n');
@@ -432,9 +450,9 @@
         final File parentDir = actualFile.getParentFile();
         if (!parentDir.isDirectory()) {
             if (parentDir.exists()) {
-                LOGGER.warning("Actual file parent \"" + parentDir + "\" exists but is not a directory");
+                LOGGER.warn("Actual file parent \"" + parentDir + "\" exists but is not a directory");
             } else if (!parentDir.mkdirs()) {
-                LOGGER.warning("Unable to create actual file parent dir: " + parentDir);
+                LOGGER.warn("Unable to create actual file parent dir: " + parentDir);
             }
         }
         try (FileOutputStream out = new FileOutputStream(actualFile)) {
@@ -456,7 +474,7 @@
         try {
             return client.execute(method, getHttpContext());
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, e.getMessage(), e);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, e.getMessage(), e);
             e.printStackTrace();
             throw e;
         }
@@ -479,7 +497,7 @@
                         result.get("stacktrace").asText() };
             } catch (Exception e) {
                 // whoops, not JSON (e.g. 404) - just include the body
-                GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, errorBody);
+                GlobalConfig.ASTERIX_LOGGER.log(Level.ERROR, errorBody);
                 Exception failure = new Exception("HTTP operation failed:" + "\nSTATUS LINE: "
                         + httpResponse.getStatusLine() + "\nERROR_BODY: " + errorBody);
                 failure.addSuppressed(e);
@@ -542,7 +560,12 @@
 
     public InputStream executeQueryService(String str, OutputFormat fmt, URI uri, List<Parameter> params,
             boolean jsonEncoded, Predicate<Integer> responseCodeValidator, boolean cancellable) throws Exception {
-        final List<Parameter> newParams = upsertParam(params, "format", fmt.mimeType());
+        List<Parameter> newParams = upsertParam(params, "format", fmt.mimeType());
+        final Optional<String> maxReadsOptional = extractMaxResultReads(str);
+        if (maxReadsOptional.isPresent()) {
+            newParams = upsertParam(newParams, QueryServiceServlet.Parameter.MAX_RESULT_READS.str(),
+                    maxReadsOptional.get());
+        }
         HttpUriRequest method = jsonEncoded ? constructPostMethodJson(str, uri, "statement", newParams)
                 : constructPostMethodUrl(str, uri, "statement", newParams);
         // Set accepted output response type
@@ -598,18 +621,22 @@
         return builder.build();
     }
 
-    private HttpUriRequest buildRequest(String method, URI uri, List<Parameter> params) {
+    private HttpUriRequest buildRequest(String method, URI uri, List<Parameter> params, Optional<String> body) {
         RequestBuilder builder = RequestBuilder.create(method);
         builder.setUri(uri);
         for (Parameter param : params) {
             builder.addParameter(param.getName(), param.getValue());
         }
         builder.setCharset(StandardCharsets.UTF_8);
+        if (body.isPresent()) {
+            builder.setEntity(new StringEntity(body.get(), StandardCharsets.UTF_8));
+        }
         return builder.build();
     }
 
-    private HttpUriRequest buildRequest(String method, URI uri, OutputFormat fmt, List<Parameter> params) {
-        HttpUriRequest request = buildRequest(method, uri, params);
+    private HttpUriRequest buildRequest(String method, URI uri, OutputFormat fmt, List<Parameter> params,
+            Optional<String> body) {
+        HttpUriRequest request = buildRequest(method, uri, params, body);
         // Set accepted output response type
         request.setHeader("Accept", fmt.mimeType());
         return request;
@@ -680,21 +707,21 @@
 
     public InputStream executeJSONGet(OutputFormat fmt, URI uri, List<Parameter> params,
             Predicate<Integer> responseCodeValidator) throws Exception {
-        return executeJSON(fmt, "GET", uri, params, responseCodeValidator);
+        return executeJSON(fmt, "GET", uri, params, responseCodeValidator, Optional.empty());
     }
 
     public InputStream executeJSON(OutputFormat fmt, String method, URI uri, List<Parameter> params) throws Exception {
-        return executeJSON(fmt, method, uri, params, code -> code == HttpStatus.SC_OK);
+        return executeJSON(fmt, method, uri, params, code -> code == HttpStatus.SC_OK, Optional.empty());
     }
 
     public InputStream executeJSON(OutputFormat fmt, String method, URI uri, Predicate<Integer> responseCodeValidator)
             throws Exception {
-        return executeJSON(fmt, method, uri, Collections.emptyList(), responseCodeValidator);
+        return executeJSON(fmt, method, uri, Collections.emptyList(), responseCodeValidator, Optional.empty());
     }
 
     public InputStream executeJSON(OutputFormat fmt, String method, URI uri, List<Parameter> params,
-            Predicate<Integer> responseCodeValidator) throws Exception {
-        HttpUriRequest request = buildRequest(method, uri, fmt, params);
+            Predicate<Integer> responseCodeValidator, Optional<String> body) throws Exception {
+        HttpUriRequest request = buildRequest(method, uri, fmt, params, body);
         HttpResponse response = executeAndCheckHttpRequest(request, responseCodeValidator);
         return response.getEntity().getContent();
     }
@@ -703,8 +730,8 @@
     // Insert and Delete statements are executed here
     public void executeUpdate(String str, URI uri) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8))
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8)).build();
 
         // Execute the method.
         executeAndCheckHttpRequest(request);
@@ -714,10 +741,10 @@
     public InputStream executeAnyAQLAsync(String statement, boolean defer, OutputFormat fmt, URI uri,
             Map<String, Object> variableCtx) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri)
-                .addParameter("mode", defer ? "asynchronous-deferred" : "asynchronous")
-                .setEntity(new StringEntity(statement, StandardCharsets.UTF_8)).setHeader("Accept", fmt.mimeType())
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).addParameter("mode", defer ? "asynchronous-deferred" : "asynchronous")
+                        .setEntity(new StringEntity(statement, StandardCharsets.UTF_8))
+                        .setHeader("Accept", fmt.mimeType()).build();
 
         String handleVar = getHandleVariable(statement);
 
@@ -743,8 +770,8 @@
     // create function statement
     public void executeDDL(String str, URI uri) throws Exception {
         // Create a method instance.
-        HttpUriRequest request = RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8))
-                .build();
+        HttpUriRequest request =
+                RequestBuilder.post(uri).setEntity(new StringEntity(str, StandardCharsets.UTF_8)).build();
 
         // Execute the method.
         executeAndCheckHttpRequest(request);
@@ -754,8 +781,8 @@
     // and returns the contents as a string
     // This string is later passed to REST API for execution.
     public String readTestFile(File testFile) throws Exception {
-        BufferedReader reader = new BufferedReader(
-                new InputStreamReader(new FileInputStream(testFile), StandardCharsets.UTF_8));
+        BufferedReader reader =
+                new BufferedReader(new InputStreamReader(new FileInputStream(testFile), StandardCharsets.UTF_8));
         String line;
         StringBuilder stringBuilder = new StringBuilder();
         String ls = System.getProperty("line.separator");
@@ -767,15 +794,6 @@
         return stringBuilder.toString();
     }
 
-    public static void executeManagixCommand(String command) throws ClassNotFoundException, NoSuchMethodException,
-            SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
-        if (managixExecuteMethod == null) {
-            Class<?> clazz = Class.forName("org.apache.asterix.installer.test.AsterixInstallerIntegrationUtil");
-            managixExecuteMethod = clazz.getMethod("executeCommand", String.class);
-        }
-        managixExecuteMethod.invoke(null, command);
-    }
-
     public static String executeScript(ProcessBuilder pb, String scriptPath) throws Exception {
         LOGGER.info("Executing script: " + scriptPath);
         pb.command(scriptPath);
@@ -783,22 +801,6 @@
         return getProcessOutput(p);
     }
 
-    private static String executeVagrantScript(ProcessBuilder pb, String node, String scriptName) throws Exception {
-        pb.command("vagrant", "ssh", node, "--", pb.environment().get("SCRIPT_HOME") + scriptName);
-        Process p = pb.start();
-        p.waitFor();
-        InputStream input = p.getInputStream();
-        return IOUtils.toString(input, StandardCharsets.UTF_8.name());
-    }
-
-    private static String executeVagrantManagix(ProcessBuilder pb, String command) throws Exception {
-        pb.command("vagrant", "ssh", "cc", "--", pb.environment().get("MANAGIX_HOME") + command);
-        Process p = pb.start();
-        p.waitFor();
-        InputStream input = p.getInputStream();
-        return IOUtils.toString(input, StandardCharsets.UTF_8.name());
-    }
-
     private static String getScriptPath(String queryPath, String scriptBasePath, String scriptFileName) {
         String targetWord = "queries" + File.separator;
         int targetWordSize = targetWord.lastIndexOf(File.separator);
@@ -810,8 +812,8 @@
 
     private static String getProcessOutput(Process p) throws Exception {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        Future<Integer> future = Executors.newSingleThreadExecutor()
-                .submit(() -> IOUtils.copy(p.getInputStream(), new OutputStream() {
+        Future<Integer> future =
+                Executors.newSingleThreadExecutor().submit(() -> IOUtils.copy(p.getInputStream(), new OutputStream() {
                     @Override
                     public void write(int b) throws IOException {
                         baos.write(b);
@@ -897,17 +899,40 @@
                     executeScript(pb, pb.environment().get("SCRIPT_HOME") + File.separator + "dml_recovery"
                             + File.separator + "stop_and_start.sh");
                 }
-                expectedResultFile = (queryCount.intValue() >= expectedResultFileCtxs.size()) ? null
-                        : expectedResultFileCtxs.get(queryCount.intValue()).getFile();
+                expectedResultFile =
+                        (queryCount.intValue() < 0 || queryCount.intValue() >= expectedResultFileCtxs.size()) ? null
+                                : expectedResultFileCtxs.get(queryCount.intValue()).getFile();
                 File actualResultFile = expectedResultFile == null ? null
                         : testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath));
                 executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), testFile,
                         expectedResultFile, actualResultFile, queryCount, expectedResultFileCtxs.size(),
                         cUnit.getParameter(), ComparisonEnum.TEXT);
                 break;
-            case "mgx":
-                executeManagixCommand(stripLineComments(statement).trim());
-                Thread.sleep(8000);
+            case "store":
+                // This is a query that returns the expected output of a subsequent query
+                String key = getKey(statement);
+                if (variableCtx.containsKey(key)) {
+                    throw new IllegalStateException("There exist already a stored result with the key: " + key);
+                }
+                actualResultFile = new File(actualPath, testCaseCtx.getTestCase().getFilePath() + File.separatorChar
+                        + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
+                executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), testFile,
+                        null, actualResultFile, queryCount, expectedResultFileCtxs.size(), cUnit.getParameter(),
+                        ComparisonEnum.TEXT);
+                variableCtx.put(key, actualResultFile);
+                break;
+            case "validate":
+                // This is a query that validates the output against a previously executed query
+                key = getKey(statement);
+                expectedResultFile = (File) variableCtx.remove(key);
+                if (expectedResultFile == null) {
+                    throw new IllegalStateException("There is no stored result with the key: " + key);
+                }
+                actualResultFile = new File(actualPath, testCaseCtx.getTestCase().getFilePath() + File.separatorChar
+                        + cUnit.getName() + '.' + ctx.getSeqNum() + ".adm");
+                executeQuery(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(), testFile,
+                        expectedResultFile, actualResultFile, queryCount, expectedResultFileCtxs.size(),
+                        cUnit.getParameter(), ComparisonEnum.TEXT);
                 break;
             case "txnqbc": // qbc represents query before crash
                 InputStream resultStream = executeQuery(statement, OutputFormat.forCompilationUnit(cUnit),
@@ -923,8 +948,7 @@
                         + "_qar.adm");
                 writeOutputToFile(qarFile, resultStream);
                 qbcFile = getTestCaseQueryBeforeCrashFile(actualPath, testCaseCtx, cUnit);
-                runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), qbcFile, qarFile,
-                        ComparisonEnum.TEXT);
+                runScriptAndCompareWithResult(testFile, qbcFile, qarFile, ComparisonEnum.TEXT);
                 break;
             case "txneu": // eu represents erroneous update
                 try {
@@ -932,12 +956,11 @@
                 } catch (Exception e) {
                     // An exception is expected.
                     failed = true;
-                    System.err.println("testFile " + testFile.toString() + " raised an exception: " + e);
+                    LOGGER.info("testFile {} raised an (expected) exception", testFile, e.toString());
                 }
                 if (!failed) {
-                    throw new Exception("Test \"" + testFile + "\" FAILED!\n  An exception" + "is expected.");
+                    throw new Exception("Test \"" + testFile + "\" FAILED; an exception was expected");
                 }
-                System.err.println("...but that was expected.");
                 break;
             case "script":
                 try {
@@ -947,7 +970,7 @@
                         throw new Exception(output);
                     }
                 } catch (Exception e) {
-                    throw new Exception("Test \"" + testFile + "\" FAILED!\n", e);
+                    throw new Exception("Test \"" + testFile + "\" FAILED!", e);
                 }
                 break;
             case "sleep":
@@ -960,40 +983,19 @@
                 } catch (Exception e) {
                     // expected error happens
                     failed = true;
-                    System.err.println("testFile " + testFile.toString() + " raised an exception: " + e);
+                    LOGGER.info("testFile {} raised an (expected) exception", testFile, e.toString());
                 }
                 if (!failed) {
-                    throw new Exception("Test \"" + testFile + "\" FAILED!\n  An exception is expected.");
-                }
-                System.err.println("...but that was expected.");
-                break;
-            case "vscript": // a script that will be executed on a vagrant virtual node
-                try {
-                    String[] command = stripLineComments(statement).trim().split(" ");
-                    if (command.length != 2) {
-                        throw new Exception("invalid vagrant script format");
-                    }
-                    String nodeId = command[0];
-                    String scriptName = command[1];
-                    String output = executeVagrantScript(pb, nodeId, scriptName);
-                    if (output.contains("ERROR")) {
-                        throw new Exception(output);
-                    }
-                } catch (Exception e) {
-                    throw new Exception("Test \"" + testFile + "\" FAILED!\n", e);
-                }
-                break;
-            case "vmgx": // a managix command that will be executed on vagrant cc node
-                String output = executeVagrantManagix(pb, stripLineComments(statement).trim());
-                if (output.contains("ERROR")) {
-                    throw new Exception(output);
+                    throw new Exception("Test \"" + testFile + "\" FAILED; an exception was expected");
                 }
                 break;
             case "get":
             case "post":
             case "put":
-                expectedResultFile = (queryCount.intValue() >= expectedResultFileCtxs.size()) ? null
-                        : expectedResultFileCtxs.get(queryCount.intValue()).getFile();
+            case "delete":
+                expectedResultFile =
+                        (queryCount.intValue() < 0 || queryCount.intValue() >= expectedResultFileCtxs.size()) ? null
+                                : expectedResultFileCtxs.get(queryCount.intValue()).getFile();
                 actualResultFile = expectedResultFile == null ? null
                         : testCaseCtx.getActualResultFile(cUnit, expectedResultFile, new File(actualPath));
                 executeHttpRequest(OutputFormat.forCompilationUnit(cUnit), statement, variableCtx, ctx.getType(),
@@ -1082,8 +1084,13 @@
                 command = stripJavaComments(statement).trim().split(" ");
                 String commandType = command[0];
                 String nodeId = command[1];
-                if (commandType.equals("kill")) {
-                    killNC(nodeId, cUnit);
+                switch (commandType) {
+                    case "kill":
+                        killNC(nodeId, cUnit);
+                        break;
+                    case "start":
+                        startNC(nodeId);
+                        break;
                 }
                 break;
             case "loop":
@@ -1138,7 +1145,14 @@
                 // we only reach here if the loop is over
                 testLoops.remove(testFile);
                 break;
-
+            case "sto":
+                command = stripJavaComments(statement).trim().split(" ");
+                executeStorageCommand(command);
+                break;
+            case "port":
+                command = stripJavaComments(statement).trim().split(" ");
+                handlePortCommand(command);
+                break;
             default:
                 throw new IllegalArgumentException("No statements of type " + ctx.getType());
         }
@@ -1151,12 +1165,13 @@
         final String trimmedPathAndQuery = stripAllComments(statement).trim();
         final String variablesReplaced = replaceVarRef(trimmedPathAndQuery, variableCtx);
         final List<Parameter> params = extractParameters(statement);
+        final Optional<String> body = extractBody(statement);
         final Predicate<Integer> statusCodePredicate = extractStatusCodePredicate(statement);
         InputStream resultStream;
         if ("http".equals(extension)) {
-            resultStream = executeHttp(reqType, variablesReplaced, fmt, params, statusCodePredicate);
+            resultStream = executeHttp(reqType, variablesReplaced, fmt, params, statusCodePredicate, body);
         } else if ("uri".equals(extension)) {
-            resultStream = executeURI(reqType, URI.create(variablesReplaced), fmt, params, statusCodePredicate);
+            resultStream = executeURI(reqType, URI.create(variablesReplaced), fmt, params, statusCodePredicate, body);
         } else {
             throw new IllegalArgumentException("Unexpected format for method " + reqType + ": " + extension);
         }
@@ -1169,12 +1184,16 @@
             }
         } else {
             if (expectedResultFile == null) {
-                Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
-                        + ", filectxs.size: " + numResultFiles);
+                if (testFile.getName().startsWith(DIAGNOSE)) {
+                    LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+                } else {
+                    Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
+                            + ", filectxs.size: " + numResultFiles);
+                }
+            } else {
+                writeOutputToFile(actualResultFile, resultStream);
+                runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare);
             }
-            writeOutputToFile(actualResultFile, resultStream);
-            runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, actualResultFile,
-                    compare);
         }
         queryCount.increment();
     }
@@ -1204,10 +1223,9 @@
             }
             final URI uri = getEndpoint(Servlets.QUERY_SERVICE);
             if (DELIVERY_IMMEDIATE.equals(delivery)) {
-                resultStream = executeQueryService(statement, fmt, uri, params, true, null, true);
-                resultStream = METRICS_QUERY_TYPE.equals(reqType) ?
-                        ResultExtractor.extractMetrics(resultStream) :
-                        ResultExtractor.extract(resultStream);
+                resultStream = executeQueryService(statement, fmt, uri, params, true, null, isCancellable(reqType));
+                resultStream = METRICS_QUERY_TYPE.equals(reqType) ? ResultExtractor.extractMetrics(resultStream)
+                        : ResultExtractor.extract(resultStream);
             } else {
                 String handleVar = getHandleVariable(statement);
                 resultStream = executeQueryService(statement, fmt, uri, upsertParam(params, "mode", delivery), true);
@@ -1216,16 +1234,27 @@
                 variableCtx.put(handleVar, handle);
             }
         }
-        writeOutputToFile(actualResultFile, resultStream);
-        if (expectedResultFile == null) {
-            Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
-                    + ", filectxs.size: " + numResultFiles);
+        if (actualResultFile == null) {
+            if (testFile.getName().startsWith(DIAGNOSE)) {
+                LOGGER.info("Diagnostic output: {}", IOUtils.toString(resultStream, StandardCharsets.UTF_8));
+            } else {
+                Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
+                        + ", filectxs.size: " + numResultFiles);
+            }
+        } else {
+            writeOutputToFile(actualResultFile, resultStream);
+            if (expectedResultFile == null) {
+                if (reqType.equals("store")) {
+                    return;
+                }
+                Assert.fail("no result file for " + testFile.toString() + "; queryCount: " + queryCount
+                        + ", filectxs.size: " + numResultFiles);
+            }
         }
-
-        runScriptAndCompareWithResult(testFile, new PrintWriter(System.err), expectedResultFile, actualResultFile,
-                compare);
-        queryCount.increment();
-
+        runScriptAndCompareWithResult(testFile, expectedResultFile, actualResultFile, compare);
+        if (!reqType.equals("validate")) {
+            queryCount.increment();
+        }
         // Deletes the matched result file.
         actualResultFile.getParentFile().delete();
     }
@@ -1240,65 +1269,76 @@
         long startTime = System.currentTimeMillis();
         long limitTime = startTime + TimeUnit.SECONDS.toMillis(timeoutSecs);
         ctx.setType(ctx.getType().substring("poll".length()));
-        boolean expectedException = false;
-        Exception finalException = null;
-        LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay");
-        int responsesReceived = 0;
-        final ExecutorService executorService = Executors.newSingleThreadExecutor();
-        while (true) {
-            try {
-                Future<Void> execution = executorService.submit(() -> {
-                    executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount,
-                            expectedResultFileCtxs, testFile, actualPath);
-                    return null;
-                });
-                execution.get(limitTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
-                responsesReceived++;
-                finalException = null;
-                break;
-            } catch (TimeoutException e) {
-                if (responsesReceived == 0) {
-                    throw new Exception(
-                            "Poll limit (" + timeoutSecs + "s) exceeded without obtaining *any* result from server");
-                } else if (finalException != null) {
-                    throw new Exception("Poll limit (" + timeoutSecs
-                            + "s) exceeded without obtaining expected result; last exception:", finalException);
-                } else {
-                    throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result");
+        try {
+            boolean expectedException = false;
+            Exception finalException = null;
+            LOGGER.debug("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay");
+            int responsesReceived = 0;
+            final ExecutorService executorService = Executors.newSingleThreadExecutor();
+            while (true) {
+                try {
+                    Future<Void> execution = executorService.submit(() -> {
+                        executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit,
+                                queryCount, expectedResultFileCtxs, testFile, actualPath);
+                        return null;
+                    });
+                    execution.get(limitTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+                    responsesReceived++;
+                    finalException = null;
+                    break;
+                } catch (TimeoutException e) {
+                    if (responsesReceived == 0) {
+                        throw new Exception("Poll limit (" + timeoutSecs
+                                + "s) exceeded without obtaining *any* result from server");
+                    } else if (finalException != null) {
+                        throw new Exception(
+                                "Poll limit (" + timeoutSecs
+                                        + "s) exceeded without obtaining expected result; last exception:",
+                                finalException);
+                    } else {
+                        throw new Exception(
+                                "Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result");
 
+                    }
+                } catch (ExecutionException ee) {
+                    Exception e;
+                    if (ee.getCause() instanceof Exception) {
+                        e = (Exception) ee.getCause();
+                    } else {
+                        e = ee;
+                    }
+                    if (e instanceof ComparisonException) {
+                        LOGGER.info("Comparison failure on poll: {}", e::getMessage);
+                    } else if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("Received exception on poll", e);
+                    } else {
+                        LOGGER.info("Received exception on poll: {}", e::toString);
+                    }
+                    responsesReceived++;
+                    if (isExpected(e, cUnit)) {
+                        expectedException = true;
+                        finalException = e;
+                        break;
+                    }
+                    if ((System.currentTimeMillis() > limitTime)) {
+                        finalException = e;
+                        break;
+                    }
+                    LOGGER.debug("sleeping " + retryDelaySecs + " second(s) before polling again");
+                    TimeUnit.SECONDS.sleep(retryDelaySecs);
                 }
-            } catch (ExecutionException ee) {
-                Exception e;
-                if (ee.getCause() instanceof Exception) {
-                    e = (Exception) ee.getCause();
-                } else {
-                    e = ee;
-                }
-                if (e instanceof ComparisonException) {
-                    LOGGER.log(Level.INFO, "Comparison failure on poll: " + e.getMessage());
-                } else {
-                    LOGGER.log(Level.INFO, "received exception on poll", e);
-                }
-                responsesReceived++;
-                if (isExpected(e, cUnit)) {
-                    expectedException = true;
-                    finalException = e;
-                    break;
-                }
-                if ((System.currentTimeMillis() > limitTime)) {
-                    finalException = e;
-                    break;
-                }
-                LOGGER.fine("sleeping " + retryDelaySecs + " second(s) before polling again");
-                TimeUnit.SECONDS.sleep(retryDelaySecs);
             }
+            if (expectedException) {
+                throw finalException;
+            } else if (finalException != null) {
+                throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result",
+                        finalException);
+            }
+
+        } finally {
+            ctx.setType("poll" + ctx.getType());
         }
-        if (expectedException) {
-            throw finalException;
-        } else if (finalException != null) {
-            throw new Exception("Poll limit (" + timeoutSecs + "s) exceeded without obtaining expected result",
-                    finalException);
-        }
+
     }
 
     public InputStream executeSqlppUpdateOrDdl(String statement, OutputFormat outputFormat) throws Exception {
@@ -1325,6 +1365,21 @@
         }
     }
 
+    public static String getKey(String statement) {
+        String key = "key=";
+        String[] lines = statement.split("\n");
+        for (String line : lines) {
+            if (line.contains(key)) {
+                String value = line.substring(line.indexOf(key) + key.length()).trim();
+                if (value.length() == 0) {
+                    break;
+                }
+                return value;
+            }
+        }
+        throw new IllegalArgumentException("ERROR: key=<KEY> must be present in store/validate file");
+    }
+
     public static int getRetryDelaySecs(String statement) {
         final Matcher retryDelayMatcher = POLL_DELAY_PATTERN.matcher(statement);
         return retryDelayMatcher.find() ? Integer.parseInt(retryDelayMatcher.group(1)) : 1;
@@ -1348,6 +1403,22 @@
         return tmpStmt;
     }
 
+    protected static Optional<String> extractMaxResultReads(String statement) {
+        final Matcher m = MAX_RESULT_READS_PATTERN.matcher(statement);
+        while (m.find()) {
+            return Optional.of(m.group(1));
+        }
+        return Optional.empty();
+    }
+
+    protected static Optional<String> extractBody(String statement) {
+        final Matcher m = HTTP_BODY_PATTERN.matcher(statement);
+        while (m.find()) {
+            return Optional.of(m.group(1));
+        }
+        return Optional.empty();
+    }
+
     protected static List<Parameter> extractParameters(String statement) {
         List<Parameter> params = new ArrayList<>();
         final Matcher m = HTTP_PARAM_PATTERN.matcher(statement);
@@ -1374,10 +1445,10 @@
     }
 
     protected InputStream executeHttp(String ctxType, String endpoint, OutputFormat fmt, List<Parameter> params,
-            Predicate<Integer> statusCodePredicate) throws Exception {
+            Predicate<Integer> statusCodePredicate, Optional<String> body) throws Exception {
         String[] split = endpoint.split("\\?");
         URI uri = createEndpointURI(split[0], split.length > 1 ? split[1] : null);
-        return executeURI(ctxType, uri, fmt, params, statusCodePredicate);
+        return executeURI(ctxType, uri, fmt, params, statusCodePredicate, body);
     }
 
     private InputStream executeURI(String ctxType, URI uri, OutputFormat fmt, List<Parameter> params) throws Exception {
@@ -1385,13 +1456,13 @@
     }
 
     private InputStream executeURI(String ctxType, URI uri, OutputFormat fmt, List<Parameter> params,
-            Predicate<Integer> responseCodeValidator) throws Exception {
-        return executeJSON(fmt, ctxType.toUpperCase(), uri, params, responseCodeValidator);
+            Predicate<Integer> responseCodeValidator, Optional<String> body) throws Exception {
+        return executeJSON(fmt, ctxType.toUpperCase(), uri, params, responseCodeValidator, body);
     }
 
-    private void killNC(String nodeId, CompilationUnit cUnit) throws Exception {
+    public void killNC(String nodeId, CompilationUnit cUnit) throws Exception {
         //get node process id
-        OutputFormat fmt = OutputFormat.forCompilationUnit(cUnit);
+        OutputFormat fmt = OutputFormat.CLEAN_JSON;
         String endpoint = "/admin/cluster/node/" + nodeId + "/config";
         InputStream executeJSONGet = executeJSONGet(fmt, createEndpointURI(endpoint, null));
         StringWriter actual = new StringWriter();
@@ -1407,6 +1478,18 @@
         deleteNCTxnLogs(nodeId, cUnit);
     }
 
+    public void startNC(String nodeId) throws Exception {
+        //get node process id
+        OutputFormat fmt = OutputFormat.CLEAN_JSON;
+        String endpoint = "/rest/startnode";
+        List<Parameter> params = new ArrayList<>();
+        Parameter node = new Parameter();
+        node.setName("node");
+        node.setValue(nodeId);
+        params.add(node);
+        InputStream executeJSON = executeJSON(fmt, "POST", URI.create("http://localhost:16001" + endpoint), params);
+    }
+
     private void deleteNCTxnLogs(String nodeId, CompilationUnit cUnit) throws Exception {
         OutputFormat fmt = OutputFormat.forCompilationUnit(cUnit);
         String endpoint = "/admin/cluster/node/" + nodeId + "/config";
@@ -1440,8 +1523,10 @@
                 final File testFile = ctx.getFile();
                 final String statement = readTestFile(testFile);
                 try {
-                    executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit, queryCount,
-                            expectedResultFileCtxs, testFile, actualPath);
+                    if (!testFile.getName().startsWith(DIAGNOSE)) {
+                        executeTestFile(testCaseCtx, ctx, variableCtx, statement, isDmlRecoveryTest, pb, cUnit,
+                                queryCount, expectedResultFileCtxs, testFile, actualPath);
+                    }
                 } catch (TestLoop loop) {
                     // rewind the iterator until we find our target
                     while (!ctx.getFile().getName().equals(loop.getTarget())) {
@@ -1453,33 +1538,53 @@
                         queryCount.setValue(savedQueryCounts[numOfFiles]);
                     }
                 } catch (Exception e) {
-                    System.err.println("testFile " + testFile.toString() + " raised an exception: " + e);
                     numOfErrors++;
-                    if (isUnExpected(e, expectedErrors, numOfErrors, queryCount)) {
-                        e.printStackTrace();
-                        System.err.println("...Unexpected!");
+                    boolean unexpected = isUnExpected(e, expectedErrors, numOfErrors, queryCount);
+                    if (unexpected) {
+                        LOGGER.error("testFile {} raised an unexpected exception", testFile, e);
                         if (failedGroup != null) {
                             failedGroup.getTestCase().add(testCaseCtx.getTestCase());
                         }
-                        throw new Exception("Test \"" + testFile + "\" FAILED!", e);
+                        fail(true, testCaseCtx, cUnit, testFileCtxs, pb, testFile, e);
+                    } else {
+                        LOGGER.info("testFile {} raised an (expected) exception", testFile, e.toString());
                     }
-                } finally {
-                    if (numOfFiles == testFileCtxs.size()) {
-                        if (numOfErrors < cUnit.getExpectedError().size()) {
-                            System.err.println("...Unexpected!");
-                            Exception e = new Exception(
-                                    "Test \"" + cUnit.getName() + "\" FAILED!\nExpected error was not thrown...");
-                            System.err.println(e);
-                            throw e;
-                        }
-                        LOGGER.info("[TEST]: " + testCaseCtx.getTestCase().getFilePath() + "/" + cUnit.getName()
-                                + " PASSED ");
+                }
+                if (numOfFiles == testFileCtxs.size()) {
+                    if (numOfErrors < cUnit.getExpectedError().size()) {
+                        LOGGER.error("Test {} failed to raise (an) expected exception(s)", cUnit.getName());
+                        throw new Exception(
+                                "Test \"" + cUnit.getName() + "\" FAILED; expected exception was not thrown...");
                     }
+                    LOGGER.info(
+                            "[TEST]: " + testCaseCtx.getTestCase().getFilePath() + "/" + cUnit.getName() + " PASSED ");
                 }
             }
         }
     }
 
+    protected void fail(boolean runDiagnostics, TestCaseContext testCaseCtx, CompilationUnit cUnit,
+            List<TestFileContext> testFileCtxs, ProcessBuilder pb, File testFile, Exception e) throws Exception {
+        if (runDiagnostics) {
+            try {
+                // execute diagnostic files
+                Map<String, Object> variableCtx = new HashMap<>();
+                for (TestFileContext ctx : testFileCtxs) {
+                    if (ctx.getFile().getName().startsWith(TestExecutor.DIAGNOSE)) {
+                        // execute the file
+                        final File file = ctx.getFile();
+                        final String statement = readTestFile(file);
+                        executeTestFile(testCaseCtx, ctx, variableCtx, statement, false, pb, cUnit, new MutableInt(-1),
+                                Collections.emptyList(), file, null);
+                    }
+                }
+            } catch (Exception diagnosticFailure) {
+                LOGGER.log(Level.WARN, "Failure during running diagnostics", diagnosticFailure);
+            }
+        }
+        throw new Exception("Test \"" + testFile + "\" FAILED!", e);
+    }
+
     protected boolean isUnExpected(Exception e, List<String> expectedErrors, int numOfErrors, MutableInt queryCount) {
         String expectedError = null;
         if (expectedErrors.size() < numOfErrors) {
@@ -1488,11 +1593,9 @@
             // Get the expected exception
             expectedError = expectedErrors.get(numOfErrors - 1);
             if (e.toString().contains(expectedError)) {
-                System.err.println("...but that was expected.");
                 return false;
             } else {
-                System.err
-                        .println("Expected to find the following in error text:\n+++++\n" + expectedError + "\n+++++");
+                LOGGER.error("Expected to find the following in error text: +++++{}+++++", expectedError);
                 return true;
             }
         }
@@ -1506,15 +1609,26 @@
     }
 
     protected URI createEndpointURI(String path, String query) throws URISyntaxException {
-        int endpointIdx = Math.abs(endpointSelector++ % endpoints.size());
-        InetSocketAddress endpoint = endpoints.get(endpointIdx);
+        InetSocketAddress endpoint;
+        if (!path.startsWith("nc:")) {
+            int endpointIdx = Math.abs(endpointSelector++ % endpoints.size());
+            endpoint = endpoints.get(endpointIdx);
+        } else {
+            final String[] tokens = path.split(" ");
+            if (tokens.length != 2) {
+                throw new IllegalArgumentException("Unrecognized http pattern");
+            }
+            String nodeId = tokens[0].substring(3);
+            endpoint = getNcEndPoint(nodeId);
+            path = tokens[1];
+        }
         URI uri = new URI("http", null, endpoint.getHostString(), endpoint.getPort(), path, query, null);
-        LOGGER.fine("Created endpoint URI: " + uri);
+        LOGGER.debug("Created endpoint URI: " + uri);
         return uri;
     }
 
     public URI getEndpoint(String servlet) throws URISyntaxException {
-        return createEndpointURI(getPath(servlet).replaceAll("/\\*$", ""), null);
+        return createEndpointURI(Servlets.getAbsolutePath(getPath(servlet)), null);
     }
 
     public static String stripJavaComments(String text) {
@@ -1532,7 +1646,8 @@
     public void cleanup(String testCase, List<String> badtestcases) throws Exception {
         try {
             ArrayList<String> toBeDropped = new ArrayList<>();
-            InputStream resultStream = executeQueryService("select dv.DataverseName from Metadata.`Dataverse` as dv;",
+            InputStream resultStream = executeQueryService(
+                    "select dv.DataverseName from Metadata.`Dataverse` as dv order by dv.DataverseName;",
                     getEndpoint(Servlets.QUERY_SERVICE), OutputFormat.CLEAN_JSON);
             String out = IOUtils.toString(resultStream);
             ObjectMapper om = new ObjectMapper();
@@ -1554,8 +1669,7 @@
             }
             if (!toBeDropped.isEmpty()) {
                 badtestcases.add(testCase);
-                LOGGER.warning(
-                        "Last test left some garbage. Dropping dataverses: " + StringUtils.join(toBeDropped, ','));
+                LOGGER.info("Last test left some garbage. Dropping dataverses: " + StringUtils.join(toBeDropped, ','));
                 StringBuilder dropStatement = new StringBuilder();
                 for (String dv : toBeDropped) {
                     dropStatement.append("drop dataverse ");
@@ -1618,6 +1732,66 @@
         LOGGER.info("Cluster state now " + desiredState);
     }
 
+    private void executeStorageCommand(String[] command) throws Exception {
+        String srcNode = command[0];
+        String api = command[1];
+        final URI endpoint = getEndpoint(srcNode + " " + Servlets.getAbsolutePath(Servlets.STORAGE) + api);
+        String partition = command[2];
+        String destNode = command[3];
+        final InetSocketAddress destAddress = getNcReplicationAddress(destNode);
+        List<Parameter> parameters = new ArrayList<>(3);
+        Stream.of("partition", "host", "port").forEach(arg -> {
+            Parameter p = new Parameter();
+            p.setName(arg);
+            parameters.add(p);
+        });
+        parameters.get(0).setValue(partition);
+        parameters.get(1).setValue(destAddress.getHostName());
+        parameters.get(2).setValue(String.valueOf(destAddress.getPort()));
+        final HttpUriRequest httpUriRequest = constructPostMethod(endpoint, parameters);
+        final HttpResponse httpResponse = executeHttpRequest(httpUriRequest);
+        Assert.assertEquals(HttpStatus.SC_OK, httpResponse.getStatusLine().getStatusCode());
+    }
+
+    private InetSocketAddress getNcEndPoint(String nodeId) {
+        if (ncEndPoints == null || !ncEndPoints.containsKey(nodeId)) {
+            throw new IllegalStateException("No end point specified for node: " + nodeId);
+        }
+        return ncEndPoints.get(nodeId);
+    }
+
+    private InetSocketAddress getNcReplicationAddress(String nodeId) {
+        if (replicationAddress == null || !replicationAddress.containsKey(nodeId)) {
+            throw new IllegalStateException("No replication address specified for node: " + nodeId);
+        }
+        return replicationAddress.get(nodeId);
+    }
+
+    private void handlePortCommand(String[] command) throws InterruptedException, TimeoutException {
+        if (command.length != 3) {
+            throw new IllegalStateException("Unrecognized port command. Expected (host port timeout(sec))");
+        }
+        String host = command[0];
+        int port = Integer.parseInt(command[1]);
+        int timeoutSec = Integer.parseInt(command[2]);
+        while (isPortActive(host, port)) {
+            TimeUnit.SECONDS.sleep(1);
+            timeoutSec--;
+            if (timeoutSec <= 0) {
+                throw new TimeoutException(
+                        "Port is still in use: " + host + ":" + port + " after " + command[2] + " secs");
+            }
+        }
+    }
+
+    private boolean isPortActive(String host, int port) {
+        try (Socket ignored = new Socket(host, port)) {
+            return true;
+        } catch (IOException ignored) {
+            return false;
+        }
+    }
+
     abstract static class TestLoop extends Exception {
 
         private final String target;
@@ -1662,4 +1836,8 @@
             return target;
         }
     }
+
+    private static boolean isCancellable(String type) {
+        return !NON_CANCELLABLE.contains(type);
+    }
 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
index df9782a..66a34ff 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/common/TestHelper.java
@@ -19,7 +19,6 @@
 package org.apache.asterix.test.common;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,13 +28,6 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.hyracks.util.file.FileUtil;
@@ -54,6 +46,15 @@
         return false;
     }
 
+    public static void deleteExistingInstanceFiles() {
+        for (String dirName : TEST_DIRS) {
+            File f = new File(FileUtil.joinPath(TEST_DIR_BASE_PATH, dirName));
+            if (FileUtils.deleteQuietly(f)) {
+                System.out.println("Dir " + f.getName() + " deleted");
+            }
+        }
+    }
+
     public static void unzip(String sourceFile, String outputDir) throws IOException {
         if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
             try (ZipFile zipFile = new ZipFile(sourceFile)) {
@@ -80,43 +81,4 @@
             }
         }
     }
-
-    public static AsterixConfiguration getConfigurations(String fileName)
-            throws IOException, JAXBException, AsterixException {
-        try (InputStream is = TestHelper.class.getClassLoader().getResourceAsStream(fileName)) {
-            if (is != null) {
-                JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-                Unmarshaller unmarshaller = ctx.createUnmarshaller();
-                return (AsterixConfiguration) unmarshaller.unmarshal(is);
-            } else {
-                throw new AsterixException("Could not find configuration file " + fileName);
-            }
-        }
-    }
-
-    public static void writeConfigurations(AsterixConfiguration ac, String fileName)
-            throws FileNotFoundException, IOException, JAXBException {
-        File configFile = new File(fileName);
-        if (!configFile.exists()) {
-            configFile.getParentFile().mkdirs();
-            configFile.createNewFile();
-        } else {
-            configFile.delete();
-        }
-        try (FileOutputStream os = new FileOutputStream(fileName)) {
-            JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-            Marshaller marshaller = ctx.createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            marshaller.marshal(ac, os);
-        }
-    }
-
-    public static void deleteExistingInstanceFiles() {
-        for (String dirName : TEST_DIRS) {
-            File f = new File(FileUtil.joinPath(TEST_DIR_BASE_PATH, dirName));
-            if (FileUtils.deleteQuietly(f)) {
-                System.out.println("Dir " + f.getName() + " deleted");
-            }
-        }
-    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ComponentRollbackTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ComponentRollbackTest.java
index 36cb4bb..c6232f5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ComponentRollbackTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/ComponentRollbackTest.java
@@ -18,59 +18,40 @@
  */
 package org.apache.asterix.test.dataflow;
 
+import java.io.File;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 import java.util.function.Predicate;
 
 import org.apache.asterix.app.bootstrap.TestNodeController;
 import org.apache.asterix.app.bootstrap.TestNodeController.PrimaryIndexInfo;
-import org.apache.asterix.app.data.gen.TestTupleCounterFrameWriter;
 import org.apache.asterix.app.data.gen.TupleGenerator;
-import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
 import org.apache.asterix.app.nc.NCAppRuntimeContext;
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
 import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TransactionOptions;
 import org.apache.asterix.external.util.DataflowUtils;
-import org.apache.asterix.file.StorageComponentProvider;
-import org.apache.asterix.metadata.entities.Dataset;
-import org.apache.asterix.metadata.entities.Index;
-import org.apache.asterix.metadata.entities.InternalDatasetDetails;
-import org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.test.common.TestHelper;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.asterix.test.dataflow.StorageTestUtils.Flusher;
+import org.apache.asterix.test.dataflow.StorageTestUtils.Merger;
+import org.apache.asterix.test.dataflow.StorageTestUtils.Searcher;
 import org.apache.hyracks.api.comm.VSizeFrame;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.test.CountAnswer;
-import org.apache.hyracks.api.test.FrameWriterTestUtils;
-import org.apache.hyracks.api.test.FrameWriterTestUtils.FrameWriterOperation;
+import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -80,42 +61,24 @@
 
 public class ComponentRollbackTest {
 
-    private static final IAType[] KEY_TYPES = { BuiltinType.AINT32 };
-    private static final ARecordType RECORD_TYPE = new ARecordType("TestRecordType", new String[] { "key", "value" },
-            new IAType[] { BuiltinType.AINT32, BuiltinType.AINT64 }, false);
-    private static final GenerationFunction[] RECORD_GEN_FUNCTION =
-            { GenerationFunction.DETERMINISTIC, GenerationFunction.DETERMINISTIC };
-    private static final boolean[] UNIQUE_RECORD_FIELDS = { true, false };
-    private static final ARecordType META_TYPE = null;
-    private static final GenerationFunction[] META_GEN_FUNCTION = null;
-    private static final boolean[] UNIQUE_META_FIELDS = null;
-    private static final int[] KEY_INDEXES = { 0 };
-    private static final int[] KEY_INDICATORS = { Index.RECORD_INDICATOR };
-    private static final List<Integer> KEY_INDICATORS_LIST = Arrays.asList(new Integer[] { Index.RECORD_INDICATOR });
-    private static final int TOTAL_NUM_OF_RECORDS = 10000;
-    private static final int RECORDS_PER_COMPONENT = 1000;
-    private static final int DATASET_ID = 101;
-    private static final String DATAVERSE_NAME = "TestDV";
-    private static final String DATASET_NAME = "TestDS";
-    private static final String DATA_TYPE_NAME = "DUMMY";
-    private static final String NODE_GROUP_NAME = "DEFAULT";
     private static final Predicate<ILSMComponent> memoryComponentsPredicate = c -> c instanceof ILSMMemoryComponent;
-    private static final StorageComponentProvider storageManager = new StorageComponentProvider();
     private static TestNodeController nc;
     private static TestLsmBtree lsmBtree;
     private static NCAppRuntimeContext ncAppCtx;
     private static IDatasetLifecycleManager dsLifecycleMgr;
-    private static Dataset dataset;
     private static IHyracksTaskContext ctx;
     private static IIndexDataflowHelper indexDataflowHelper;
     private static ITransactionContext txnCtx;
     private static LSMInsertDeleteOperatorNodePushable insertOp;
+    private static final int PARTITION = 0;
 
     @BeforeClass
     public static void setUp() throws Exception {
         System.out.println("SetUp: ");
         TestHelper.deleteExistingInstanceFiles();
-        nc = new TestNodeController(null, false);
+        String configPath = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test"
+                + File.separator + "resources" + File.separator + "cc.conf";
+        nc = new TestNodeController(configPath, false);
         nc.init();
         ncAppCtx = nc.getAppRuntimeContext();
         dsLifecycleMgr = ncAppCtx.getDatasetLifecycleManager();
@@ -130,25 +93,18 @@
 
     @Before
     public void createIndex() throws Exception {
-        List<List<String>> partitioningKeys = new ArrayList<>();
-        partitioningKeys.add(Collections.singletonList("key"));
-        dataset = new TestDataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
-                NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null, PartitioningStrategy.HASH,
-                        partitioningKeys, null, null, null, false, null, false),
-                null, DatasetType.INTERNAL, DATASET_ID, 0);
-        PrimaryIndexInfo primaryIndexInfo = nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null,
-                storageManager, KEY_INDEXES, KEY_INDICATORS_LIST);
+        PrimaryIndexInfo primaryIndexInfo = StorageTestUtils.createPrimaryIndex(nc, PARTITION);
         IndexDataflowHelperFactory iHelperFactory =
                 new IndexDataflowHelperFactory(nc.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
-        ctx = nc.createTestContext(false);
-        indexDataflowHelper = iHelperFactory.create(ctx.getJobletContext().getServiceContext(), 0);
+        JobId jobId = nc.newJobId();
+        ctx = nc.createTestContext(jobId, PARTITION, false);
+        indexDataflowHelper = iHelperFactory.create(ctx.getJobletContext().getServiceContext(), PARTITION);
         indexDataflowHelper.open();
         lsmBtree = (TestLsmBtree) indexDataflowHelper.getIndexInstance();
         indexDataflowHelper.close();
-        nc.newJobId();
-        txnCtx = nc.getTransactionManager().getTransactionContext(nc.getTxnJobId(ctx), true);
-        insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, KEY_INDEXES,
-                KEY_INDICATORS_LIST, storageManager).getLeft();
+        txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
+        insertOp = StorageTestUtils.getInsertPipeline(nc, ctx);
     }
 
     @After
@@ -156,30 +112,22 @@
         indexDataflowHelper.destroy();
     }
 
-    private void allowAllOps(TestLsmBtree lsmBtree) {
-        lsmBtree.addModifyCallback(sem -> sem.release());
-        lsmBtree.addFlushCallback(sem -> sem.release());
-        lsmBtree.addSearchCallback(sem -> sem.release());
-        lsmBtree.addMergeCallback(sem -> sem.release());
-    }
-
     @Test
     public void testRollbackWhileNoOp() {
         try {
             // allow all operations
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -188,48 +136,55 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
-
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
-            ILSMIndexAccessor lsmAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
+            ILSMIndexAccessor lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             // rollback a memory component
             lsmAccessor.deleteComponents(memoryComponentsPredicate);
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - RECORDS_PER_COMPONENT);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - StorageTestUtils.RECORDS_PER_COMPONENT);
             // rollback the last disk component
-            lsmAccessor = lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             long lsn = AbstractLSMIOOperationCallback.getTreeIndexLSN(diskComponents.get(0).getMetadata());
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             DiskComponentLsnPredicate pred = new DiskComponentLsnPredicate(lsn);
             lsmAccessor.deleteComponents(pred);
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - (2 * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - (2 * StorageTestUtils.RECORDS_PER_COMPONENT));
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
         }
     }
 
+    public void flush(boolean async) throws Exception {
+        StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, async);
+    }
+
     @Test
     public void testRollbackThenInsert() {
         try {
             // allow all operations
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -238,27 +193,28 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
-
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
-            ILSMIndexAccessor lsmAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
+            ILSMIndexAccessor lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             // rollback a memory component
             lsmAccessor.deleteComponents(memoryComponentsPredicate);
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - RECORDS_PER_COMPONENT);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - StorageTestUtils.RECORDS_PER_COMPONENT);
 
             // insert again
             nc.newJobId();
-            txnCtx = nc.getTransactionManager().getTransactionContext(nc.getTxnJobId(ctx), true);
-            insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, KEY_INDEXES,
-                    KEY_INDICATORS_LIST, storageManager).getLeft();
+            txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                    new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
+            insertOp = StorageTestUtils.getInsertPipeline(nc, ctx);
             insertOp.open();
-            for (int j = 0; j < RECORDS_PER_COMPONENT; j++) {
+            for (int j = 0; j < StorageTestUtils.RECORDS_PER_COMPONENT; j++) {
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
             }
@@ -266,13 +222,17 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // rollback the last disk component
-            lsmAccessor = lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             long lsn = AbstractLSMIOOperationCallback.getTreeIndexLSN(diskComponents.get(0).getMetadata());
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             DiskComponentLsnPredicate pred = new DiskComponentLsnPredicate(lsn);
             lsmAccessor.deleteComponents(pred);
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - (2 * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - (2 * StorageTestUtils.RECORDS_PER_COMPONENT));
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -283,20 +243,19 @@
     public void testRollbackWhileSearch() {
         try {
             // allow all operations but search
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             lsmBtree.clearSearchCallbacks();
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -305,44 +264,50 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
 
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            Searcher firstSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            Searcher firstSearcher = new Searcher(nc, PARTITION, lsmBtree, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // wait till firstSearcher enter the components
             firstSearcher.waitUntilEntered();
             // now that we enetered, we will rollback
-            ILSMIndexAccessor lsmAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             // rollback a memory component
             lsmAccessor.deleteComponents(
                     c -> (c instanceof ILSMMemoryComponent && ((ILSMMemoryComponent) c).isModified()));
             // now that the rollback has completed, we will unblock the search
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(firstSearcher.result());
             // search now and ensure
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - RECORDS_PER_COMPONENT);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - StorageTestUtils.RECORDS_PER_COMPONENT);
             // rollback the last disk component
             // re-block searches
             lsmBtree.clearSearchCallbacks();
-            Searcher secondSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree,
-                    TOTAL_NUM_OF_RECORDS - RECORDS_PER_COMPONENT);
+            Searcher secondSearcher = new Searcher(nc, PARTITION, lsmBtree,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - StorageTestUtils.RECORDS_PER_COMPONENT);
             // wait till firstSearcher enter the components
             secondSearcher.waitUntilEntered();
-            lsmAccessor = lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             long lsn = AbstractLSMIOOperationCallback.getTreeIndexLSN(diskComponents.get(0).getMetadata());
+
+            dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+            ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
             DiskComponentLsnPredicate pred = new DiskComponentLsnPredicate(lsn);
             lsmAccessor.deleteComponents(pred);
             // now that the rollback has completed, we will unblock the search
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(secondSearcher.result());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS - (2 * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION,
+                    StorageTestUtils.TOTAL_NUM_OF_RECORDS - (2 * StorageTestUtils.RECORDS_PER_COMPONENT));
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -353,19 +318,18 @@
     public void testRollbackWhileFlush() {
         try {
             // allow all operations
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -374,22 +338,22 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // disable flushes
             lsmBtree.clearFlushCallbacks();
             Flusher firstFlusher = new Flusher(lsmBtree);
-            dsLifecycleMgr.flushDataset(dataset.getDatasetId(), true);
+            flush(true);
             firstFlusher.waitUntilCount(1);
             // now that we enetered, we will rollback. This will not proceed since it is waiting for the flush to complete
             Rollerback rollerback = new Rollerback(lsmBtree, memoryComponentsPredicate);
             // now that the rollback has completed, we will search
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             //unblock the flush
             lsmBtree.allowFlush(1);
             // ensure rollback completed
@@ -397,7 +361,7 @@
             // ensure current mem component is not modified
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
             // search now and ensure
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -408,20 +372,19 @@
     public void testRollbackWhileMerge() {
         try {
             // allow all operations but merge
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             lsmBtree.clearMergeCallbacks();
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -430,17 +393,16 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // Now, we will start a full merge
             Merger merger = new Merger(lsmBtree);
-            ILSMIndexAccessor mergeAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor mergeAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             // select the components to merge... the last three
             int numMergedComponents = 3;
             List<ILSMDiskComponent> mergedComponents = new ArrayList<>();
@@ -454,7 +416,7 @@
             Rollerback rollerback = new Rollerback(lsmBtree, new DiskComponentLsnPredicate(lsn));
             // rollback is now waiting for the merge to complete
             // we will search
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             //unblock the merge
             lsmBtree.allowMerge(1);
             // ensure rollback completes
@@ -462,8 +424,8 @@
             // ensure current mem component is not modified
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
             // search now and ensure that we rolled back the merged component
-            searchAndAssertCount(nc, ctx, dataset, storageManager,
-                    TOTAL_NUM_OF_RECORDS - ((numMergedComponents + 1/*memory component*/) * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS
+                    - ((numMergedComponents + 1/*memory component*/) * StorageTestUtils.RECORDS_PER_COMPONENT));
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -474,19 +436,18 @@
     public void testRollbackWhileFlushAndSearchFlushExistsFirst() {
         try {
             // allow all operations
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -495,35 +456,35 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // disable flushes
             // disable searches
             lsmBtree.clearFlushCallbacks();
             lsmBtree.clearSearchCallbacks();
             Flusher firstFlusher = new Flusher(lsmBtree);
-            dsLifecycleMgr.flushDataset(dataset.getDatasetId(), true);
+            flush(true);
             firstFlusher.waitUntilCount(1);
-            Searcher firstSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            Searcher firstSearcher = new Searcher(nc, PARTITION, lsmBtree, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // wait till firstSearcher enter the components
             firstSearcher.waitUntilEntered();
             // now that we enetered, we will rollback rollback a memory component
             Rollerback rollerback = new Rollerback(lsmBtree, memoryComponentsPredicate);
             //unblock the flush
             lsmBtree.allowFlush(1);
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(firstSearcher.result());
             // ensure current mem component is not modified
             rollerback.complete();
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
             // search now and ensure the rollback was no op since it waits for ongoing flushes
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -534,19 +495,18 @@
     public void testRollbackWhileFlushAndSearchSearchExistsFirst() {
         try {
             // allow all operations
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -555,27 +515,27 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // disable flushes
             // disable searches
             lsmBtree.clearFlushCallbacks();
             Flusher firstFlusher = new Flusher(lsmBtree);
-            dsLifecycleMgr.flushDataset(dataset.getDatasetId(), true);
+            flush(true);
             firstFlusher.waitUntilCount(1);
             lsmBtree.clearSearchCallbacks();
-            Searcher firstSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            Searcher firstSearcher = new Searcher(nc, PARTITION, lsmBtree, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // wait till firstSearcher enter the components
             firstSearcher.waitUntilEntered();
             // now that we enetered, we will rollback
             Rollerback rollerback = new Rollerback(lsmBtree, memoryComponentsPredicate);
             // The rollback will be waiting for the flush to complete
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(firstSearcher.result());
             //unblock the flush
@@ -584,7 +544,7 @@
             rollerback.complete();
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
             // search now and ensure
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
         } catch (Throwable e) {
             e.printStackTrace();
             Assert.fail(e.getMessage());
@@ -595,20 +555,19 @@
     public void testRollbackWhileMergeAndSearchMergeExitsFirst() {
         try {
             // allow all operations except merge
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             lsmBtree.clearMergeCallbacks();
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -617,17 +576,16 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // Now, we will start a merge
             Merger merger = new Merger(lsmBtree);
-            ILSMIndexAccessor mergeAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor mergeAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             // select the components to merge... the last three
             int numMergedComponents = 3;
             List<ILSMDiskComponent> mergedComponents = new ArrayList<>();
@@ -639,7 +597,7 @@
             merger.waitUntilCount(1);
             // we will block search
             lsmBtree.clearSearchCallbacks();
-            Searcher firstSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            Searcher firstSearcher = new Searcher(nc, PARTITION, lsmBtree, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // wait till firstSearcher enter the components
             firstSearcher.waitUntilEntered();
             // now that we enetered, we will rollback
@@ -648,13 +606,13 @@
             // unblock the merge
             lsmBtree.allowMerge(1);
             // unblock the search
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(firstSearcher.result());
             rollerback.complete();
             // now that the rollback has completed, we will search
-            searchAndAssertCount(nc, ctx, dataset, storageManager,
-                    TOTAL_NUM_OF_RECORDS - ((numMergedComponents + 1/*memory component*/) * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS
+                    - ((numMergedComponents + 1/*memory component*/) * StorageTestUtils.RECORDS_PER_COMPONENT));
             // ensure current mem component is not modified
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
         } catch (Throwable e) {
@@ -667,20 +625,19 @@
     public void testRollbackWhileMergeAndSearchSearchExitsFirst() {
         try {
             // allow all operations except merge
-            allowAllOps(lsmBtree);
+            StorageTestUtils.allowAllOps(lsmBtree);
             lsmBtree.clearMergeCallbacks();
             insertOp.open();
-            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
-                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
             VSizeFrame frame = new VSizeFrame(ctx);
             FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
-            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+            for (int j = 0; j < StorageTestUtils.TOTAL_NUM_OF_RECORDS; j++) {
                 // flush every RECORDS_PER_COMPONENT records
-                if (j % RECORDS_PER_COMPONENT == 0 && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                if (j % StorageTestUtils.RECORDS_PER_COMPONENT == 0 && j + 1 != StorageTestUtils.TOTAL_NUM_OF_RECORDS) {
                     if (tupleAppender.getTupleCount() > 0) {
                         tupleAppender.write(insertOp, true);
                     }
-                    dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                    flush(false);
                 }
                 ITupleReference tuple = tupleGenerator.next();
                 DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
@@ -689,17 +646,16 @@
                 tupleAppender.write(insertOp, true);
             }
             insertOp.close();
-            nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             // get all components
             List<ILSMMemoryComponent> memComponents = lsmBtree.getMemoryComponents();
             List<ILSMDiskComponent> diskComponents = lsmBtree.getDiskComponents();
             Assert.assertEquals(9, diskComponents.size());
             Assert.assertTrue(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // Now, we will start a merge
             Merger merger = new Merger(lsmBtree);
-            ILSMIndexAccessor mergeAccessor =
-                    lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor mergeAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             // select the components to merge... the last three
             List<ILSMDiskComponent> mergedComponents = new ArrayList<>();
             long lsn = AbstractLSMIOOperationCallback.getTreeIndexLSN(diskComponents.get(0).getMetadata());
@@ -711,22 +667,22 @@
             merger.waitUntilCount(1);
             // we will block search
             lsmBtree.clearSearchCallbacks();
-            Searcher firstSearcher = new Searcher(nc, ctx, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            Searcher firstSearcher = new Searcher(nc, PARTITION, lsmBtree, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             // wait till firstSearcher enter the components
             firstSearcher.waitUntilEntered();
             // now that we enetered, we will rollback
             Rollerback rollerBack = new Rollerback(lsmBtree, new DiskComponentLsnPredicate(lsn));
             // unblock the search
-            lsmBtree.addSearchCallback(sem -> sem.release());
+            lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
             lsmBtree.allowSearch(1);
             Assert.assertTrue(firstSearcher.result());
             // even though rollback has been called, it is still waiting for the merge to complete
-            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS);
             //unblock the merge
             lsmBtree.allowMerge(1);
             rollerBack.complete();
-            searchAndAssertCount(nc, ctx, dataset, storageManager,
-                    TOTAL_NUM_OF_RECORDS - ((numMergedComponents + 1/*memory component*/) * RECORDS_PER_COMPONENT));
+            StorageTestUtils.searchAndAssertCount(nc, PARTITION, StorageTestUtils.TOTAL_NUM_OF_RECORDS
+                    - ((numMergedComponents + 1/*memory component*/) * StorageTestUtils.RECORDS_PER_COMPONENT));
             // ensure current mem component is not modified
             Assert.assertFalse(memComponents.get(lsmBtree.getCurrentMemoryComponentIndex()).isModified());
         } catch (Throwable e) {
@@ -736,7 +692,7 @@
     }
 
     private class Rollerback {
-        private Thread task;
+        private final Thread task;
         private Exception failure;
 
         public Rollerback(TestLsmBtree lsmBtree, Predicate<ILSMComponent> predicate) {
@@ -744,9 +700,10 @@
             Runnable runnable = new Runnable() {
                 @Override
                 public void run() {
-                    ILSMIndexAccessor lsmAccessor =
-                            lsmBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                    ILSMIndexAccessor lsmAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
                     try {
+                        dsLifecycleMgr.getComponentIdGenerator(StorageTestUtils.DATASET_ID, PARTITION).refresh();
+                        ((AbstractLSMIOOperationCallback) lsmBtree.getIOOperationCallback()).updateLastLSN(0);
                         lsmAccessor.deleteComponents(predicate);
                     } catch (HyracksDataException e) {
                         failure = e;
@@ -765,79 +722,7 @@
         }
     }
 
-    private class Searcher {
-        private ExecutorService executor = Executors.newSingleThreadExecutor();
-        private Future<Boolean> task;
-        private volatile boolean entered = false;
-
-        public Searcher(TestNodeController nc, IHyracksTaskContext ctx, Dataset dataset,
-                StorageComponentProvider storageManager, TestLsmBtree lsmBtree, int numOfRecords) {
-            lsmBtree.addSearchCallback(sem -> {
-                synchronized (Searcher.this) {
-                    entered = true;
-                    Searcher.this.notifyAll();
-                }
-            });
-            Callable<Boolean> callable = new Callable<Boolean>() {
-                @Override
-                public Boolean call() throws Exception {
-                    searchAndAssertCount(nc, ctx, dataset, storageManager, numOfRecords);
-                    return true;
-                }
-            };
-            task = executor.submit(callable);
-        }
-
-        boolean result() throws Exception {
-            return task.get();
-        }
-
-        synchronized void waitUntilEntered() throws InterruptedException {
-            while (!entered) {
-                this.wait();
-            }
-        }
-    }
-
-    private class Merger {
-        private volatile int count = 0;
-
-        public Merger(TestLsmBtree lsmBtree) {
-            lsmBtree.addMergeCallback(sem -> {
-                synchronized (Merger.this) {
-                    count++;
-                    Merger.this.notifyAll();
-                }
-            });
-        }
-
-        synchronized void waitUntilCount(int count) throws InterruptedException {
-            while (this.count != count) {
-                this.wait();
-            }
-        }
-    }
-
-    private class Flusher {
-        private volatile int count = 0;
-
-        public Flusher(TestLsmBtree lsmBtree) {
-            lsmBtree.addFlushCallback(sem -> {
-                synchronized (Flusher.this) {
-                    count++;
-                    Flusher.this.notifyAll();
-                }
-            });
-        }
-
-        synchronized void waitUntilCount(int count) throws InterruptedException {
-            while (this.count != count) {
-                this.wait();
-            }
-        }
-    }
-
-    private class DiskComponentLsnPredicate implements Predicate<ILSMComponent> {
+    private static class DiskComponentLsnPredicate implements Predicate<ILSMComponent> {
         private final long lsn;
 
         public DiskComponentLsnPredicate(long lsn) {
@@ -856,34 +741,4 @@
             }
         }
     }
-
-    private void searchAndAssertCount(TestNodeController nc, IHyracksTaskContext ctx, Dataset dataset,
-            StorageComponentProvider storageManager, int numOfRecords)
-            throws HyracksDataException, AlgebricksException {
-        nc.newJobId();
-        TestTupleCounterFrameWriter countOp = create(nc.getSearchOutputDesc(KEY_TYPES, RECORD_TYPE, META_TYPE),
-                Collections.emptyList(), Collections.emptyList(), false);
-        IPushRuntime emptyTupleOp = nc.getFullScanPipeline(countOp, ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE,
-                new NoMergePolicyFactory(), null, null, KEY_INDEXES, KEY_INDICATORS_LIST, storageManager);
-        emptyTupleOp.open();
-        emptyTupleOp.close();
-        Assert.assertEquals(numOfRecords, countOp.getCount());
-    }
-
-    public static TestTupleCounterFrameWriter create(RecordDescriptor recordDescriptor,
-            Collection<FrameWriterOperation> exceptionThrowingOperations,
-            Collection<FrameWriterOperation> errorThrowingOperations, boolean deepCopyInputFrames) {
-        CountAnswer openAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Open,
-                exceptionThrowingOperations, errorThrowingOperations);
-        CountAnswer nextAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.NextFrame,
-                exceptionThrowingOperations, errorThrowingOperations);
-        CountAnswer flushAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Flush,
-                exceptionThrowingOperations, errorThrowingOperations);
-        CountAnswer failAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Fail,
-                exceptionThrowingOperations, errorThrowingOperations);
-        CountAnswer closeAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Close,
-                exceptionThrowingOperations, errorThrowingOperations);
-        return new TestTupleCounterFrameWriter(recordDescriptor, openAnswer, nextAnswer, flushAnswer, failAnswer,
-                closeAnswer, deepCopyInputFrames);
-    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/IoCallbackFailureTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/IoCallbackFailureTest.java
new file mode 100644
index 0000000..8bafd32
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/IoCallbackFailureTest.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.io.File;
+
+import org.apache.asterix.app.bootstrap.TestNodeController;
+import org.apache.asterix.app.bootstrap.TestNodeController.PrimaryIndexInfo;
+import org.apache.asterix.app.data.gen.TupleGenerator;
+import org.apache.asterix.app.nc.NCAppRuntimeContext;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.external.util.DataflowUtils;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.hyracks.api.comm.VSizeFrame;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.lsm.btree.impl.ITestOpCallback;
+import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class IoCallbackFailureTest {
+
+    private static final int PARTITION = 0;
+    private static TestNodeController nc;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.out.println("SetUp: ");
+        TestHelper.deleteExistingInstanceFiles();
+        String configPath = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test"
+                + File.separator + "resources" + File.separator + "cc.conf";
+        nc = new TestNodeController(configPath, false);
+        nc.init();
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        System.out.println("TearDown");
+        nc.deInit();
+        TestHelper.deleteExistingInstanceFiles();
+    }
+
+    @Test
+    public void testTempFailureInAllocateCallback() throws Exception {
+        PrimaryIndexInfo primaryIndexInfo = StorageTestUtils.createPrimaryIndex(nc, PARTITION);
+        IndexDataflowHelperFactory iHelperFactory =
+                new IndexDataflowHelperFactory(nc.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
+        JobId jobId = nc.newJobId();
+        IHyracksTaskContext ctx = nc.createTestContext(jobId, PARTITION, false);
+        IIndexDataflowHelper indexDataflowHelper =
+                iHelperFactory.create(ctx.getJobletContext().getServiceContext(), PARTITION);
+        indexDataflowHelper.open();
+        TestLsmBtree lsmBtree = (TestLsmBtree) indexDataflowHelper.getIndexInstance();
+        indexDataflowHelper.close();
+        LSMInsertDeleteOperatorNodePushable insertOp = StorageTestUtils.getInsertPipeline(nc, ctx);
+        StorageTestUtils.allowAllOps(lsmBtree);
+        ITestOpCallback<ILSMMemoryComponent> failCallback = new ITestOpCallback<ILSMMemoryComponent>() {
+            @SuppressWarnings("deprecation")
+            @Override
+            public void before(ILSMMemoryComponent c) throws HyracksDataException {
+                throw new HyracksDataException("Fail on allocate callback");
+            }
+
+            @Override
+            public void after() throws HyracksDataException {
+                // No Op
+            }
+        };
+        lsmBtree.addIoAllocateCallback(failCallback);
+        boolean expectedExceptionThrown = false;
+        try {
+            insert(nc, lsmBtree, ctx, insertOp, StorageTestUtils.TOTAL_NUM_OF_RECORDS,
+                    StorageTestUtils.RECORDS_PER_COMPONENT);
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        Assert.assertTrue(expectedExceptionThrown);
+        // Clear the callback and retry
+        lsmBtree.clearIoAllocateCallback();
+        jobId = nc.newJobId();
+        ctx = nc.createTestContext(jobId, PARTITION, false);
+        insertOp = StorageTestUtils.getInsertPipeline(nc, ctx);
+        insert(nc, lsmBtree, ctx, insertOp, StorageTestUtils.TOTAL_NUM_OF_RECORDS,
+                StorageTestUtils.RECORDS_PER_COMPONENT);
+    }
+
+    private static void insert(TestNodeController nc, TestLsmBtree lsmBtree, IHyracksTaskContext ctx,
+            LSMInsertDeleteOperatorNodePushable insertOp, int totalNumRecords, int recordsPerComponent)
+            throws Exception {
+        NCAppRuntimeContext ncAppCtx = nc.getAppRuntimeContext();
+        IDatasetLifecycleManager dsLifecycleMgr = ncAppCtx.getDatasetLifecycleManager();
+        TupleGenerator tupleGenerator = StorageTestUtils.getTupleGenerator();
+        ITransactionContext txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
+        boolean failed = false;
+        try {
+            try {
+                insertOp.open();
+                VSizeFrame frame = new VSizeFrame(ctx);
+                FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
+                for (int j = 0; j < totalNumRecords; j++) {
+                    // flush every recordsPerComponent records
+                    if (j % recordsPerComponent == 0 && j + 1 != totalNumRecords) {
+                        if (tupleAppender.getTupleCount() > 0) {
+                            tupleAppender.write(insertOp, true);
+                        }
+                        StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, false);
+                    }
+                    ITupleReference tuple = tupleGenerator.next();
+                    DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
+                }
+                if (tupleAppender.getTupleCount() > 0) {
+                    tupleAppender.write(insertOp, true);
+                }
+            } catch (Throwable th) {
+                failed = true;
+                insertOp.fail();
+                throw th;
+            } finally {
+                insertOp.close();
+            }
+        } finally {
+            if (failed) {
+                nc.getTransactionManager().abortTransaction(txnCtx.getTxnId());
+            } else {
+                nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
+            }
+        }
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LogMarkerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LogMarkerTest.java
index 82eb16a..0a968c8 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LogMarkerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/LogMarkerTest.java
@@ -31,9 +31,10 @@
 import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ILogRecord;
 import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TransactionOptions;
 import org.apache.asterix.external.util.DataflowUtils;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -49,6 +50,7 @@
 import org.apache.hyracks.api.comm.VSizeFrame;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.test.CountAnswer;
 import org.apache.hyracks.api.test.FrameWriterTestUtils;
 import org.apache.hyracks.api.test.FrameWriterTestUtils.FrameWriterOperation;
@@ -112,17 +114,17 @@
             partitioningKeys.add(Collections.singletonList("key"));
             Dataset dataset = new Dataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
                     NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null, PartitioningStrategy.HASH,
-                            partitioningKeys, null, null, null, false, null, false),
+                            partitioningKeys, null, null, null, false, null),
                     null, DatasetType.INTERNAL, DATASET_ID, 0);
             try {
                 PrimaryIndexInfo indexInfo = nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null,
-                        storageManager, KEY_INDEXES, KEY_INDICATORS_LIST);
-                IHyracksTaskContext ctx = nc.createTestContext(true);
-                nc.newJobId();
-                ITransactionContext txnCtx =
-                        nc.getTransactionManager().getTransactionContext(nc.getTxnJobId(ctx), true);
+                        storageManager, KEY_INDEXES, KEY_INDICATORS_LIST, 0);
+                JobId jobId = nc.newJobId();
+                IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, true);
+                ITransactionContext txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                        new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
                 LSMInsertDeleteOperatorNodePushable insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES,
-                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATORS_LIST, storageManager).getLeft();
+                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATORS_LIST, storageManager, null).getLeft();
                 insertOp.open();
                 TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
                         RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
@@ -147,7 +149,7 @@
                     tupleAppender.write(insertOp, true);
                 }
                 insertOp.close();
-                nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+                nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
                 IndexDataflowHelperFactory iHelperFactory =
                         new IndexDataflowHelperFactory(nc.getStorageManager(), indexInfo.getFileSplitProvider());
                 IIndexDataflowHelper dataflowHelper =
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
new file mode 100644
index 0000000..62705cc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/MultiPartitionLSMIndexTest.java
@@ -0,0 +1,677 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.asterix.app.bootstrap.TestNodeController;
+import org.apache.asterix.app.bootstrap.TestNodeController.PrimaryIndexInfo;
+import org.apache.asterix.app.bootstrap.TestNodeController.SecondaryIndexInfo;
+import org.apache.asterix.app.data.gen.TupleGenerator;
+import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
+import org.apache.asterix.app.nc.NCAppRuntimeContext;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.config.DatasetConfig.DatasetType;
+import org.apache.asterix.common.config.DatasetConfig.IndexType;
+import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.external.util.DataflowUtils;
+import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.commons.lang3.mutable.MutableBoolean;
+import org.apache.hyracks.api.comm.VSizeFrame;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.util.SingleThreadEventProcessor;
+import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.lsm.btree.impl.ITestOpCallback;
+import org.apache.hyracks.storage.am.lsm.btree.impl.IVirtualBufferCacheCallback;
+import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
+import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class MultiPartitionLSMIndexTest {
+    static final int REPREAT_TEST_COUNT = 1;
+
+    @Parameterized.Parameters
+    public static List<Object[]> data() {
+        return Arrays.asList(new Object[REPREAT_TEST_COUNT][0]);
+    }
+
+    private static final IAType[] KEY_TYPES = { BuiltinType.AINT32 };
+    private static final ARecordType RECORD_TYPE = new ARecordType("TestRecordType", new String[] { "key", "value" },
+            new IAType[] { BuiltinType.AINT32, BuiltinType.AINT64 }, false);
+    private static final GenerationFunction[] RECORD_GEN_FUNCTION =
+            { GenerationFunction.DETERMINISTIC, GenerationFunction.DETERMINISTIC };
+    private static final boolean[] UNIQUE_RECORD_FIELDS = { true, false };
+    private static final ARecordType META_TYPE = null;
+    private static final GenerationFunction[] META_GEN_FUNCTION = null;
+    private static final boolean[] UNIQUE_META_FIELDS = null;
+    private static final int[] KEY_INDEXES = { 0 };
+    private static final int[] KEY_INDICATORS = { Index.RECORD_INDICATOR };
+    private static final List<Integer> KEY_INDICATORS_LIST = Arrays.asList(new Integer[] { Index.RECORD_INDICATOR });
+    private static final int TOTAL_NUM_OF_RECORDS = 5000;
+    private static final int RECORDS_PER_COMPONENT = 500;
+    private static final int DATASET_ID = 101;
+    private static final String DATAVERSE_NAME = "TestDV";
+    private static final String DATASET_NAME = "TestDS";
+    private static final String INDEX_NAME = "TestIdx";
+    private static final String DATA_TYPE_NAME = "DUMMY";
+    private static final String NODE_GROUP_NAME = "DEFAULT";
+    private static final IndexType INDEX_TYPE = IndexType.BTREE;
+    private static final List<List<String>> INDEX_FIELD_NAMES =
+            Arrays.asList(Arrays.asList(RECORD_TYPE.getFieldNames()[1]));
+    private static final List<Integer> INDEX_FIELD_INDICATORS = Arrays.asList(Index.RECORD_INDICATOR);
+    private static final List<IAType> INDEX_FIELD_TYPES = Arrays.asList(BuiltinType.AINT64);
+    private static final StorageComponentProvider storageManager = new StorageComponentProvider();
+    private static final int NUM_PARTITIONS = 2;
+    private static TestNodeController nc;
+    private static NCAppRuntimeContext ncAppCtx;
+    private static IDatasetLifecycleManager dsLifecycleMgr;
+    private static Dataset dataset;
+    private static Index secondaryIndex;
+    private static ITransactionContext txnCtx;
+    private static TestLsmBtree[] primaryLsmBtrees;
+    private static TestLsmBtree[] secondaryLsmBtrees;
+    private static IHyracksTaskContext[] taskCtxs;
+    private static IIndexDataflowHelper[] primaryIndexDataflowHelpers;
+    private static IIndexDataflowHelper[] secondaryIndexDataflowHelpers;
+    private static LSMInsertDeleteOperatorNodePushable[] insertOps;
+    private static Actor[] actors;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.out.println("SetUp: ");
+        TestHelper.deleteExistingInstanceFiles();
+        String configPath = System.getProperty("user.dir") + File.separator + "src" + File.separator + "test"
+                + File.separator + "resources" + File.separator + "cc-multipart.conf";
+        nc = new TestNodeController(configPath, false);
+        nc.init();
+        ncAppCtx = nc.getAppRuntimeContext();
+        dsLifecycleMgr = ncAppCtx.getDatasetLifecycleManager();
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        System.out.println("TearDown");
+        nc.deInit();
+        TestHelper.deleteExistingInstanceFiles();
+    }
+
+    @Before
+    public void createIndex() throws Exception {
+        List<List<String>> partitioningKeys = new ArrayList<>();
+        partitioningKeys.add(Collections.singletonList("key"));
+        dataset = new TestDataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME,
+                NODE_GROUP_NAME, NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null,
+                        PartitioningStrategy.HASH, partitioningKeys, null, null, null, false, null),
+                null, DatasetType.INTERNAL, DATASET_ID, 0);
+        secondaryIndex = new Index(DATAVERSE_NAME, DATASET_NAME, INDEX_NAME, INDEX_TYPE, INDEX_FIELD_NAMES,
+                INDEX_FIELD_INDICATORS, INDEX_FIELD_TYPES, false, false, false, 0);
+        taskCtxs = new IHyracksTaskContext[NUM_PARTITIONS];
+        primaryIndexDataflowHelpers = new IIndexDataflowHelper[NUM_PARTITIONS];
+        secondaryIndexDataflowHelpers = new IIndexDataflowHelper[NUM_PARTITIONS];
+        primaryLsmBtrees = new TestLsmBtree[NUM_PARTITIONS];
+        secondaryLsmBtrees = new TestLsmBtree[NUM_PARTITIONS];
+        insertOps = new LSMInsertDeleteOperatorNodePushable[NUM_PARTITIONS];
+        JobId jobId = nc.newJobId();
+        txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(jobId),
+                new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
+        actors = new Actor[NUM_PARTITIONS];
+        for (int i = 0; i < taskCtxs.length; i++) {
+            taskCtxs[i] = nc.createTestContext(jobId, i, false);
+            PrimaryIndexInfo primaryIndexInfo = nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null,
+                    storageManager, KEY_INDEXES, KEY_INDICATORS_LIST, i);
+            SecondaryIndexInfo secondaryIndexInfo =
+                    nc.createSecondaryIndex(primaryIndexInfo, secondaryIndex, storageManager, i);
+            IndexDataflowHelperFactory iHelperFactory =
+                    new IndexDataflowHelperFactory(nc.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
+            primaryIndexDataflowHelpers[i] =
+                    iHelperFactory.create(taskCtxs[i].getJobletContext().getServiceContext(), i);
+            primaryIndexDataflowHelpers[i].open();
+            primaryLsmBtrees[i] = (TestLsmBtree) primaryIndexDataflowHelpers[i].getIndexInstance();
+            iHelperFactory =
+                    new IndexDataflowHelperFactory(nc.getStorageManager(), secondaryIndexInfo.getFileSplitProvider());
+            secondaryIndexDataflowHelpers[i] =
+                    iHelperFactory.create(taskCtxs[i].getJobletContext().getServiceContext(), i);
+            secondaryIndexDataflowHelpers[i].open();
+            secondaryLsmBtrees[i] = (TestLsmBtree) secondaryIndexDataflowHelpers[i].getIndexInstance();
+            secondaryIndexDataflowHelpers[i].close();
+            primaryIndexDataflowHelpers[i].close();
+            insertOps[i] = nc.getInsertPipeline(taskCtxs[i], dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null,
+                    KEY_INDEXES, KEY_INDICATORS_LIST, storageManager, secondaryIndex).getLeft();
+            actors[i] = new Actor("player-" + i, i);
+        }
+        // allow all operations
+        for (int i = 0; i < NUM_PARTITIONS; i++) {
+            StorageTestUtils.allowAllOps(primaryLsmBtrees[i]);
+            StorageTestUtils.allowAllOps(secondaryLsmBtrees[i]);
+            actors[i].add(new Request(Request.Action.INSERT_OPEN));
+        }
+    }
+
+    @After
+    public void destroyIndex() throws Exception {
+        for (int i = 0; i < NUM_PARTITIONS; i++) {
+            Request close = new Request(Request.Action.INSERT_CLOSE);
+            actors[i].add(close);
+            close.await();
+        }
+        nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
+        for (IIndexDataflowHelper indexDataflowHelper : secondaryIndexDataflowHelpers) {
+            indexDataflowHelper.destroy();
+        }
+        for (IIndexDataflowHelper indexDataflowHelper : primaryIndexDataflowHelpers) {
+            indexDataflowHelper.destroy();
+        }
+        for (Actor actor : actors) {
+            actor.stop();
+        }
+    }
+
+    @Test
+    public void testFlushOneFullOneEmpty() {
+        try {
+            int totalNumOfComponents = TOTAL_NUM_OF_RECORDS / RECORDS_PER_COMPONENT;
+            for (int j = 0; j < totalNumOfComponents; j++) {
+                actors[0].add(new Request(Request.Action.INSERT_PATCH));
+                actors[0].add(new Request(Request.Action.FLUSH_DATASET));
+            }
+            ensureDone(actors[0]);
+            // search now and ensure partition 0 has all the records
+            StorageTestUtils.searchAndAssertCount(nc, 0, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+            // and that partition 1 has no records
+            StorageTestUtils.searchAndAssertCount(nc, 1, dataset, storageManager, 0);
+            // and that partition 0 has numFlushes disk components
+            Assert.assertEquals(totalNumOfComponents, primaryLsmBtrees[0].getDiskComponents().size());
+            // and that partition 1 has no disk components
+            Assert.assertEquals(0, primaryLsmBtrees[1].getDiskComponents().size());
+            // and that in partition 0, all secondary components has a corresponding primary
+            List<ILSMDiskComponent> secondaryDiskComponents = secondaryLsmBtrees[0].getDiskComponents();
+            List<ILSMDiskComponent> primaryDiskComponents = primaryLsmBtrees[0].getDiskComponents();
+            for (int i = 0; i < secondaryDiskComponents.size(); i++) {
+                Assert.assertEquals(secondaryDiskComponents.get(i).getId(), primaryDiskComponents.get(i).getId());
+            }
+        } catch (Throwable e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    private void ensureDone(Actor actor) throws InterruptedException {
+        Request req = new Request(Request.Action.DUMMY);
+        actor.add(req);
+        req.await();
+    }
+
+    /**
+     * This test update partition 0, schedule flush and modify partition 1
+     * Then ensure that in partition 1, primary and secondary have the same component ids
+     */
+    @Test
+    public void testAllocateWhileFlushIsScheduled() {
+        try {
+            // when the vbc becomes full, we want to know
+            AtomicBoolean isFull = new AtomicBoolean(false);
+            MutableBoolean proceedToScheduleFlush = new MutableBoolean(false);
+            primaryLsmBtrees[0].addVirtuablBufferCacheCallback(new IVirtualBufferCacheCallback() {
+                @Override
+                public void isFullChanged(boolean newValue) {
+                    synchronized (isFull) {
+                        isFull.set(newValue);
+                        isFull.notifyAll();
+                    }
+                    synchronized (proceedToScheduleFlush) {
+                        while (!proceedToScheduleFlush.booleanValue()) {
+                            try {
+                                proceedToScheduleFlush.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+            });
+            Request insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[0].add(insertReq);
+            while (true) {
+                Thread.sleep(100);
+                if (insertReq.done) {
+                    // if done, then flush was not triggered, then we need to insert a new patch
+                    insertReq = new Request(Request.Action.INSERT_PATCH);
+                    actors[0].add(insertReq);
+                } else if (isFull.get()) {
+                    break;
+                }
+            }
+
+            // now, we need to do two things
+            // allocate primary in partition 1 but not proceed
+            MutableBoolean proceedToAllocateSecondaryIndex = new MutableBoolean(false);
+            MutableBoolean allocated = new MutableBoolean(false);
+            primaryLsmBtrees[1].addAllocateCallback(new ITestOpCallback<Void>() {
+                @Override
+                public void before(Void t) {
+                    // Nothing
+                }
+
+                @Override
+                public void after() {
+                    synchronized (allocated) {
+                        allocated.setValue(true);
+                        allocated.notifyAll();
+                    }
+                    synchronized (proceedToAllocateSecondaryIndex) {
+                        while (!proceedToAllocateSecondaryIndex.booleanValue()) {
+                            try {
+                                proceedToAllocateSecondaryIndex.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+            });
+            insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[1].add(insertReq);
+            // Wait for the allocation to happen
+            synchronized (allocated) {
+                while (!allocated.booleanValue()) {
+                    allocated.wait();
+                }
+            }
+            // The memory component has been allocated. now we allow the first actor to proceed to schedule flush
+            MutableBoolean flushStarted = new MutableBoolean(false);
+            primaryLsmBtrees[0].addFlushCallback(new ITestOpCallback<Semaphore>() {
+                @Override
+                public void before(Semaphore t) {
+                    synchronized (flushStarted) {
+                        flushStarted.setValue(true);
+                        flushStarted.notifyAll();
+                    }
+                }
+
+                @Override
+                public void after() {
+                }
+            });
+            synchronized (proceedToScheduleFlush) {
+                proceedToScheduleFlush.setValue(true);
+                proceedToScheduleFlush.notifyAll();
+            }
+            // Now we need to know that the flush has been scheduled
+            synchronized (flushStarted) {
+                while (!flushStarted.booleanValue()) {
+                    flushStarted.wait();
+                }
+            }
+
+            // we now allow the allocation to proceed
+            synchronized (proceedToAllocateSecondaryIndex) {
+                proceedToAllocateSecondaryIndex.setValue(true);
+                proceedToAllocateSecondaryIndex.notifyAll();
+            }
+            // ensure the insert patch has completed
+            insertReq.await();
+            primaryLsmBtrees[1].clearAllocateCallbacks();
+            // check the Ids of the memory components of partition 1
+            // This shows the bug
+            Assert.assertEquals(primaryLsmBtrees[1].getCurrentMemoryComponent().getId(),
+                    secondaryLsmBtrees[1].getCurrentMemoryComponent().getId());
+        } catch (Throwable e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testRecycleWhileFlushIsScheduled() {
+        try {
+            Request insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[0].add(insertReq);
+            Request flushReq = new Request(Request.Action.FLUSH_DATASET);
+            actors[0].add(flushReq);
+            flushReq.await();
+            // ensure that index switched to second component
+            Assert.assertEquals(1, primaryLsmBtrees[0].getCurrentMemoryComponentIndex());
+            insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[0].add(insertReq);
+            flushReq = new Request(Request.Action.FLUSH_DATASET);
+            actors[0].add(flushReq);
+            flushReq.await();
+            // ensure we switched back to first component
+            Assert.assertEquals(0, primaryLsmBtrees[0].getCurrentMemoryComponentIndex());
+            // flush first component of partition 1
+            insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[1].add(insertReq);
+            flushReq = new Request(Request.Action.FLUSH_DATASET);
+            actors[1].add(flushReq);
+            flushReq.await();
+            // ensure partition 1 is now on second component
+            Assert.assertEquals(1, primaryLsmBtrees[1].getCurrentMemoryComponentIndex());
+            // now we want to control when schedule flush is executed
+            AtomicBoolean arrivedAtSchduleFlush = new AtomicBoolean(false);
+            AtomicBoolean finishedSchduleFlush = new AtomicBoolean(false);
+            MutableBoolean proceedToScheduleFlush = new MutableBoolean(false);
+            // keep track of the flush of partition 1 since partitions 0 and 1 are flushed seperately
+            addOpTrackerCallback(primaryLsmBtrees[1], new ITestOpCallback<Void>() {
+                @Override
+                public void before(Void t) {
+                    synchronized (arrivedAtSchduleFlush) {
+                        arrivedAtSchduleFlush.set(true);
+                        arrivedAtSchduleFlush.notifyAll();
+                    }
+                    synchronized (proceedToScheduleFlush) {
+                        while (!proceedToScheduleFlush.booleanValue()) {
+                            try {
+                                proceedToScheduleFlush.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void after() {
+                    synchronized (finishedSchduleFlush) {
+                        finishedSchduleFlush.set(true);
+                        finishedSchduleFlush.notifyAll();
+                    }
+                }
+            });
+            AtomicBoolean isFull = new AtomicBoolean(false);
+            MutableBoolean proceedAfterIsFullChanged = new MutableBoolean(false);
+            primaryLsmBtrees[1].addVirtuablBufferCacheCallback(new IVirtualBufferCacheCallback() {
+                @Override
+                public void isFullChanged(boolean newValue) {
+                    synchronized (isFull) {
+                        isFull.set(newValue);
+                        isFull.notifyAll();
+                    }
+                    synchronized (proceedAfterIsFullChanged) {
+                        while (!proceedAfterIsFullChanged.booleanValue()) {
+                            try {
+                                proceedAfterIsFullChanged.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+            });
+
+            // now we start adding records to partition 1 until flush is triggerred
+            insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[1].add(insertReq);
+            while (true) {
+                Thread.sleep(100);
+                if (insertReq.done) {
+                    // if done, then flush was not triggered, then we need to insert a new patch
+                    insertReq = new Request(Request.Action.INSERT_PATCH);
+                    actors[1].add(insertReq);
+                } else if (isFull.get()) {
+                    break;
+                }
+            }
+            // Now we know that vbc is full and flush will be scheduled, we allow this to proceed
+            synchronized (proceedAfterIsFullChanged) {
+                proceedAfterIsFullChanged.setValue(true);
+                proceedAfterIsFullChanged.notifyAll();
+            }
+
+            // now we want to control the recycling of components in partition 0
+            MutableBoolean recycledPrimary = new MutableBoolean(false);
+            MutableBoolean proceedAfterRecyclePrimary = new MutableBoolean(false);
+            ITestOpCallback<ILSMMemoryComponent> primaryRecycleCallback = new ITestOpCallback<ILSMMemoryComponent>() {
+                @Override
+                public void before(ILSMMemoryComponent t) {
+                }
+
+                @Override
+                public void after() {
+                    synchronized (recycledPrimary) {
+                        recycledPrimary.setValue(true);
+                        recycledPrimary.notifyAll();
+                    }
+                    synchronized (proceedAfterRecyclePrimary) {
+                        while (!proceedAfterRecyclePrimary.booleanValue()) {
+                            try {
+                                proceedAfterRecyclePrimary.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+            };
+            primaryLsmBtrees[0].addIoRecycleCallback(primaryRecycleCallback);
+
+            MutableBoolean arrivedToRecycleSecondary = new MutableBoolean(false);
+            MutableBoolean proceedToRecycleSecondary = new MutableBoolean(false);
+            ITestOpCallback<ILSMMemoryComponent> secondaryRecycleCallback = new ITestOpCallback<ILSMMemoryComponent>() {
+                @Override
+                public void before(ILSMMemoryComponent t) {
+                    synchronized (arrivedToRecycleSecondary) {
+                        arrivedToRecycleSecondary.setValue(true);
+                        arrivedToRecycleSecondary.notifyAll();
+                    }
+                    synchronized (proceedToRecycleSecondary) {
+                        while (!proceedToRecycleSecondary.booleanValue()) {
+                            try {
+                                proceedToRecycleSecondary.wait();
+                            } catch (InterruptedException e) {
+                                Thread.currentThread().interrupt();
+                                return;
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void after() {
+                }
+            };
+            secondaryLsmBtrees[0].addIoRecycleCallback(secondaryRecycleCallback);
+            // we first ensure that schedule flush arrived
+            synchronized (arrivedAtSchduleFlush) {
+                while (!arrivedAtSchduleFlush.get()) {
+                    arrivedAtSchduleFlush.wait();
+                }
+            }
+
+            // we insert a single frame into partition 0
+            insertReq = new Request(Request.Action.INSERT_PATCH);
+            actors[0].add(insertReq);
+            // wait until component has been recycled
+            synchronized (recycledPrimary) {
+                while (!recycledPrimary.booleanValue()) {
+                    recycledPrimary.wait();
+                }
+            }
+            synchronized (proceedAfterRecyclePrimary) {
+                proceedAfterRecyclePrimary.setValue(true);
+                proceedAfterRecyclePrimary.notifyAll();
+            }
+            // now, we know that the primary has been recycled. we allow it to proceed
+            // we allow the scheduleFlush to proceed
+            synchronized (proceedToScheduleFlush) {
+                proceedToScheduleFlush.setValue(true);
+                proceedToScheduleFlush.notifyAll();
+            }
+            // wait until scheduleFlushCompletes
+            synchronized (finishedSchduleFlush) {
+                while (!finishedSchduleFlush.get()) {
+                    finishedSchduleFlush.wait();
+                }
+            }
+            // allow recycling of secondary
+            synchronized (proceedToRecycleSecondary) {
+                proceedToRecycleSecondary.setValue(true);
+                proceedToRecycleSecondary.notifyAll();
+            }
+            // ensure that the insert completes
+            insertReq.await();
+            dsLifecycleMgr.getDatasetInfo(DATASET_ID).waitForIO();
+            // check first partition
+            List<ILSMDiskComponent> secondaryDiskComponents = secondaryLsmBtrees[0].getDiskComponents();
+            List<ILSMDiskComponent> primaryDiskComponents = primaryLsmBtrees[0].getDiskComponents();
+            for (int i = 0; i < secondaryDiskComponents.size(); i++) {
+                Assert.assertEquals(secondaryDiskComponents.get(i).getId(), primaryDiskComponents.get(i).getId());
+            }
+            // check second partition
+            secondaryDiskComponents = secondaryLsmBtrees[1].getDiskComponents();
+            primaryDiskComponents = primaryLsmBtrees[1].getDiskComponents();
+            for (int i = 0; i < secondaryDiskComponents.size(); i++) {
+                Assert.assertEquals(secondaryDiskComponents.get(i).getId(), primaryDiskComponents.get(i).getId());
+            }
+            // ensure the two memory components at partition 0 have the same component ids
+            Assert.assertEquals(primaryLsmBtrees[0].getCurrentMemoryComponent().getId(),
+                    secondaryLsmBtrees[0].getCurrentMemoryComponent().getId());
+            // ensure the two memory components at partition 0 have the same component ids
+            Assert.assertEquals(primaryLsmBtrees[1].getCurrentMemoryComponent().getId(),
+                    secondaryLsmBtrees[1].getCurrentMemoryComponent().getId());
+        } catch (Throwable e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    private static class Request {
+        enum Action {
+            DUMMY,
+            INSERT_OPEN,
+            INSERT_PATCH,
+            FLUSH_DATASET,
+            INSERT_CLOSE
+        }
+
+        private final Action action;
+        private volatile boolean done;
+
+        public Request(Action action) {
+            this.action = action;
+            done = false;
+        }
+
+        synchronized void complete() {
+            done = true;
+            notifyAll();
+        }
+
+        synchronized void await() throws InterruptedException {
+            while (!done) {
+                wait();
+            }
+        }
+
+    }
+
+    public class Actor extends SingleThreadEventProcessor<Request> {
+        private final int partition;
+        private final TupleGenerator tupleGenerator;
+        private final VSizeFrame frame;
+        private final FrameTupleAppender tupleAppender;
+
+        public Actor(String name, int partition) throws HyracksDataException {
+            super(name);
+            this.partition = partition;
+            tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
+                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            frame = new VSizeFrame(taskCtxs[partition]);
+            tupleAppender = new FrameTupleAppender(frame);
+        }
+
+        @Override
+        protected void handle(Request req) throws Exception {
+            try {
+                switch (req.action) {
+                    case FLUSH_DATASET:
+                        if (tupleAppender.getTupleCount() > 0) {
+                            tupleAppender.write(insertOps[partition], true);
+                        }
+                        dsLifecycleMgr.flushDataset(dataset.getDatasetId(), false);
+                        break;
+                    case INSERT_CLOSE:
+                        insertOps[partition].close();
+                        break;
+                    case INSERT_OPEN:
+                        insertOps[partition].open();
+                        break;
+                    case INSERT_PATCH:
+                        for (int j = 0; j < RECORDS_PER_COMPONENT; j++) {
+                            ITupleReference tuple = tupleGenerator.next();
+                            DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOps[partition]);
+                        }
+                        if (tupleAppender.getTupleCount() > 0) {
+                            tupleAppender.write(insertOps[partition], true);
+                        }
+                        StorageTestUtils.waitForOperations(primaryLsmBtrees[partition]);
+                        break;
+                    default:
+                        break;
+                }
+            } finally {
+                req.complete();
+            }
+        }
+    }
+
+    private static void addOpTrackerCallback(TestLsmBtree lsmBtree, ITestOpCallback<Void> callback) {
+        if (!lsmBtree.isPrimaryIndex()) {
+            throw new IllegalArgumentException("Can only add callbacks to primary opTracker");
+        }
+        TestPrimaryIndexOperationTracker opTracker = (TestPrimaryIndexOperationTracker) lsmBtree.getOperationTracker();
+        opTracker.addCallback(callback);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/SearchCursorComponentSwitchTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/SearchCursorComponentSwitchTest.java
new file mode 100644
index 0000000..c452548
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/SearchCursorComponentSwitchTest.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.app.bootstrap.TestNodeController;
+import org.apache.asterix.app.bootstrap.TestNodeController.PrimaryIndexInfo;
+import org.apache.asterix.app.data.gen.TestTupleCounterFrameWriter;
+import org.apache.asterix.app.data.gen.TupleGenerator;
+import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
+import org.apache.asterix.app.nc.NCAppRuntimeContext;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.config.DatasetConfig.DatasetType;
+import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.external.util.DataflowUtils;
+import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.test.dataflow.StorageTestUtils.Searcher;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.hyracks.api.comm.VSizeFrame;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
+import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
+import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class SearchCursorComponentSwitchTest {
+    private static final IAType[] KEY_TYPES = { BuiltinType.AINT32 };
+    private static final ARecordType RECORD_TYPE = new ARecordType("TestRecordType", new String[] { "key", "value" },
+            new IAType[] { BuiltinType.AINT32, BuiltinType.AINT64 }, false);
+    private static final GenerationFunction[] RECORD_GEN_FUNCTION =
+            { GenerationFunction.DETERMINISTIC, GenerationFunction.DETERMINISTIC };
+    private static final boolean[] UNIQUE_RECORD_FIELDS = { true, false };
+    private static final ARecordType META_TYPE = null;
+    private static final GenerationFunction[] META_GEN_FUNCTION = null;
+    private static final boolean[] UNIQUE_META_FIELDS = null;
+    private static final int[] KEY_INDEXES = { 0 };
+    private static final int[] KEY_INDICATORS = { Index.RECORD_INDICATOR };
+    private static final List<Integer> KEY_INDICATORS_LIST = Arrays.asList(new Integer[] { Index.RECORD_INDICATOR });
+    private static final int TOTAL_NUM_OF_RECORDS = 2000;
+    private static final int RECORDS_PER_COMPONENT = 1000;
+    private static final int DATASET_ID = 101;
+    private static final String DATAVERSE_NAME = "TestDV";
+    private static final String DATASET_NAME = "TestDS";
+    private static final String DATA_TYPE_NAME = "DUMMY";
+    private static final String NODE_GROUP_NAME = "DEFAULT";
+    private static final StorageComponentProvider storageManager = new StorageComponentProvider();
+    private static TestNodeController nc;
+    private static TestLsmBtree lsmBtree;
+    private static NCAppRuntimeContext ncAppCtx;
+    private static IDatasetLifecycleManager dsLifecycleMgr;
+    private static Dataset dataset;
+    private static IHyracksTaskContext ctx;
+    private static IIndexDataflowHelper indexDataflowHelper;
+    private static ITransactionContext txnCtx;
+    private static LSMInsertDeleteOperatorNodePushable insertOp;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.out.println("SetUp: ");
+        TestHelper.deleteExistingInstanceFiles();
+        nc = new TestNodeController(null, false);
+        nc.init();
+        ncAppCtx = nc.getAppRuntimeContext();
+        dsLifecycleMgr = ncAppCtx.getDatasetLifecycleManager();
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        System.out.println("TearDown");
+        nc.deInit();
+        TestHelper.deleteExistingInstanceFiles();
+    }
+
+    @Before
+    public void createIndex() throws Exception {
+        List<List<String>> partitioningKeys = new ArrayList<>();
+        partitioningKeys.add(Collections.singletonList("key"));
+        dataset = new TestDataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME,
+                NODE_GROUP_NAME, NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null,
+                        PartitioningStrategy.HASH, partitioningKeys, null, null, null, false, null),
+                null, DatasetType.INTERNAL, DATASET_ID, 0);
+        PrimaryIndexInfo primaryIndexInfo = nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null,
+                storageManager, KEY_INDEXES, KEY_INDICATORS_LIST, 0);
+        IndexDataflowHelperFactory iHelperFactory =
+                new IndexDataflowHelperFactory(nc.getStorageManager(), primaryIndexInfo.getFileSplitProvider());
+        JobId jobId = nc.newJobId();
+        ctx = nc.createTestContext(jobId, 0, false);
+        indexDataflowHelper = iHelperFactory.create(ctx.getJobletContext().getServiceContext(), 0);
+        indexDataflowHelper.open();
+        lsmBtree = (TestLsmBtree) indexDataflowHelper.getIndexInstance();
+        indexDataflowHelper.close();
+        txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
+        insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, KEY_INDEXES,
+                KEY_INDICATORS_LIST, storageManager, null).getLeft();
+    }
+
+    @After
+    public void destroyIndex() throws Exception {
+        indexDataflowHelper.destroy();
+    }
+
+    void unblockSearch(TestLsmBtree lsmBtree) {
+        lsmBtree.addSearchCallback(StorageTestUtils.ALLOW_CALLBACK);
+        lsmBtree.allowSearch(1);
+    }
+
+    @Test
+    public void testCursorSwitchSucceed() {
+        try {
+            // allow all operations
+            StorageTestUtils.allowAllOps(lsmBtree);
+            // except search
+            lsmBtree.clearSearchCallbacks();
+            insertOp.open();
+            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
+                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            VSizeFrame frame = new VSizeFrame(ctx);
+            FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
+            Searcher firstSearcher = null;
+            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+                // flush every RECORDS_PER_COMPONENT records
+                if (j % RECORDS_PER_COMPONENT == (RECORDS_PER_COMPONENT - 1) && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                    if (tupleAppender.getTupleCount() > 0) {
+                        tupleAppender.write(insertOp, true);
+                    }
+                    StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, dataset, false);
+                }
+                ITupleReference tuple = tupleGenerator.next();
+                DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
+            }
+            if (tupleAppender.getTupleCount() > 0) {
+                tupleAppender.write(insertOp, true);
+            }
+            insertOp.close();
+            // start the search
+            firstSearcher = new Searcher(nc, 0, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            // wait till firstSearcher enter the components
+            firstSearcher.waitUntilEntered();
+            StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, dataset, false);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
+            // unblock the search
+            unblockSearch(lsmBtree);
+            // ensure the search got the correct number
+            Assert.assertTrue(firstSearcher.result());
+            // search now and ensure
+            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+        } catch (Throwable e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testCursorSwitchFails() {
+        try {
+            // allow all operations
+            StorageTestUtils.allowAllOps(lsmBtree);
+            // except search
+            lsmBtree.clearSearchCallbacks();
+            insertOp.open();
+            TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS,
+                    RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+            VSizeFrame frame = new VSizeFrame(ctx);
+            FrameTupleAppender tupleAppender = new FrameTupleAppender(frame);
+            Searcher firstSearcher = null;
+            for (int j = 0; j < TOTAL_NUM_OF_RECORDS; j++) {
+                // flush every RECORDS_PER_COMPONENT records
+                if (j % RECORDS_PER_COMPONENT == (RECORDS_PER_COMPONENT - 1) && j + 1 != TOTAL_NUM_OF_RECORDS) {
+                    if (tupleAppender.getTupleCount() > 0) {
+                        tupleAppender.write(insertOp, true);
+                    }
+                    StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, dataset, false);
+                }
+                ITupleReference tuple = tupleGenerator.next();
+                DataflowUtils.addTupleToFrame(tupleAppender, tuple, insertOp);
+            }
+            if (tupleAppender.getTupleCount() > 0) {
+                tupleAppender.write(insertOp, true);
+            }
+            insertOp.close();
+            // start the search
+            firstSearcher = new Searcher(nc, 0, dataset, storageManager, lsmBtree, TOTAL_NUM_OF_RECORDS);
+            // wait till firstSearcher enter the components
+            firstSearcher.waitUntilEntered();
+            StorageTestUtils.flush(dsLifecycleMgr, lsmBtree, dataset, false);
+            nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
+            // merge all components
+            ILSMIndexAccessor mergeAccessor = lsmBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            List<ILSMDiskComponent> mergedComponents = new ArrayList<>(lsmBtree.getDiskComponents());
+            BlockingIOOperationCallbackWrapper ioCallback =
+                    new BlockingIOOperationCallbackWrapper(lsmBtree.getIOOperationCallback());
+            mergeAccessor.scheduleMerge(ioCallback, mergedComponents);
+            ioCallback.waitForIO();
+            // unblock the search
+            unblockSearch(lsmBtree);
+            // ensure the search got the correct number
+            Assert.assertTrue(firstSearcher.result());
+            // search now and ensure
+            searchAndAssertCount(nc, ctx, dataset, storageManager, TOTAL_NUM_OF_RECORDS);
+        } catch (Throwable e) {
+            e.printStackTrace();
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    private void searchAndAssertCount(TestNodeController nc, IHyracksTaskContext ctx, Dataset dataset,
+            StorageComponentProvider storageManager, int numOfRecords)
+            throws HyracksDataException, AlgebricksException {
+        nc.newJobId();
+        TestTupleCounterFrameWriter countOp =
+                StorageTestUtils.create(nc.getSearchOutputDesc(KEY_TYPES, RECORD_TYPE, META_TYPE),
+                        Collections.emptyList(), Collections.emptyList(), false);
+        IPushRuntime emptyTupleOp = nc.getFullScanPipeline(countOp, ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE,
+                new NoMergePolicyFactory(), null, null, KEY_INDEXES, KEY_INDICATORS_LIST, storageManager);
+        emptyTupleOp.open();
+        emptyTupleOp.close();
+        Assert.assertEquals(numOfRecords, countOp.getCount());
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/StorageTestUtils.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/StorageTestUtils.java
new file mode 100644
index 0000000..e7a455c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/StorageTestUtils.java
@@ -0,0 +1,293 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
+
+import org.apache.asterix.app.bootstrap.TestNodeController;
+import org.apache.asterix.app.bootstrap.TestNodeController.PrimaryIndexInfo;
+import org.apache.asterix.app.data.gen.TestTupleCounterFrameWriter;
+import org.apache.asterix.app.data.gen.TupleGenerator;
+import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.config.DatasetConfig.DatasetType;
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
+import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.test.CountAnswer;
+import org.apache.hyracks.api.test.FrameWriterTestUtils;
+import org.apache.hyracks.api.test.FrameWriterTestUtils.FrameWriterOperation;
+import org.apache.hyracks.storage.am.lsm.btree.impl.ITestOpCallback;
+import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
+import org.junit.Assert;
+
+public class StorageTestUtils {
+
+    public static final IAType[] KEY_TYPES = { BuiltinType.AINT32 };
+    public static final ARecordType RECORD_TYPE = new ARecordType("TestRecordType", new String[] { "key", "value" },
+            new IAType[] { BuiltinType.AINT32, BuiltinType.AINT64 }, false);
+    public static final GenerationFunction[] RECORD_GEN_FUNCTION =
+            { GenerationFunction.DETERMINISTIC, GenerationFunction.DETERMINISTIC };
+    public static final boolean[] UNIQUE_RECORD_FIELDS = { true, false };
+    public static final ARecordType META_TYPE = null;
+    public static final GenerationFunction[] META_GEN_FUNCTION = null;
+    public static final boolean[] UNIQUE_META_FIELDS = null;
+    public static final int[] KEY_INDEXES = { 0 };
+    public static final int[] KEY_INDICATORS = { Index.RECORD_INDICATOR };
+    public static final List<Integer> KEY_INDICATORS_LIST = Arrays.asList(new Integer[] { Index.RECORD_INDICATOR });
+    public static final int TOTAL_NUM_OF_RECORDS = 10000;
+    public static final int RECORDS_PER_COMPONENT = 1000;
+    public static final int DATASET_ID = 101;
+    public static final String DATAVERSE_NAME = "TestDV";
+    public static final String DATASET_NAME = "TestDS";
+    public static final String DATA_TYPE_NAME = "DUMMY";
+    public static final String NODE_GROUP_NAME = "DEFAULT";
+    public static final StorageComponentProvider STORAGE_MANAGER = new StorageComponentProvider();
+    public static final List<List<String>> PARTITIONING_KEYS =
+            new ArrayList<>(Collections.singletonList(Collections.singletonList(RECORD_TYPE.getFieldNames()[0])));
+    public static final TestDataset DATASET =
+            new TestDataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
+                    NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null, PartitioningStrategy.HASH,
+                            PARTITIONING_KEYS, null, null, null, false, null),
+                    null, DatasetType.INTERNAL, DATASET_ID, 0);
+    public static final ITestOpCallback<Semaphore> ALLOW_CALLBACK = new ITestOpCallback<Semaphore>() {
+        @Override
+        public void before(Semaphore smeaphore) {
+            smeaphore.release();
+        }
+
+        @Override
+        public void after() {
+        }
+    };
+
+    private StorageTestUtils() {
+    }
+
+    static void allowAllOps(TestLsmBtree lsmBtree) {
+        lsmBtree.addModifyCallback(ALLOW_CALLBACK);
+        lsmBtree.addFlushCallback(ALLOW_CALLBACK);
+        lsmBtree.addSearchCallback(ALLOW_CALLBACK);
+        lsmBtree.addMergeCallback(ALLOW_CALLBACK);
+    }
+
+    public static PrimaryIndexInfo createPrimaryIndex(TestNodeController nc, int partition)
+            throws HyracksDataException, RemoteException, ACIDException, AlgebricksException {
+        return nc.createPrimaryIndex(DATASET, KEY_TYPES, RECORD_TYPE, META_TYPE, null, STORAGE_MANAGER, KEY_INDEXES,
+                KEY_INDICATORS_LIST, partition);
+    }
+
+    public static LSMInsertDeleteOperatorNodePushable getInsertPipeline(TestNodeController nc, IHyracksTaskContext ctx)
+            throws HyracksDataException, RemoteException, ACIDException, AlgebricksException {
+        return nc.getInsertPipeline(ctx, DATASET, KEY_TYPES, RECORD_TYPE, META_TYPE, null, KEY_INDEXES,
+                KEY_INDICATORS_LIST, STORAGE_MANAGER, null).getLeft();
+    }
+
+    public static TupleGenerator getTupleGenerator() {
+        return new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATORS, RECORD_GEN_FUNCTION,
+                UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
+    }
+
+    public static void searchAndAssertCount(TestNodeController nc, int partition, int numOfRecords)
+            throws HyracksDataException, AlgebricksException {
+        searchAndAssertCount(nc, partition, DATASET, STORAGE_MANAGER, numOfRecords);
+    }
+
+    public static void searchAndAssertCount(TestNodeController nc, int partition, Dataset dataset,
+            StorageComponentProvider storageManager, int numOfRecords)
+            throws HyracksDataException, AlgebricksException {
+        JobId jobId = nc.newJobId();
+        IHyracksTaskContext ctx = nc.createTestContext(jobId, partition, false);
+        TestTupleCounterFrameWriter countOp = create(nc.getSearchOutputDesc(KEY_TYPES, RECORD_TYPE, META_TYPE),
+                Collections.emptyList(), Collections.emptyList(), false);
+        IPushRuntime emptyTupleOp = nc.getFullScanPipeline(countOp, ctx, dataset, KEY_TYPES, RECORD_TYPE, META_TYPE,
+                new NoMergePolicyFactory(), null, null, KEY_INDEXES, KEY_INDICATORS_LIST, storageManager);
+        emptyTupleOp.open();
+        emptyTupleOp.close();
+        Assert.assertEquals(numOfRecords, countOp.getCount());
+    }
+
+    public static TestTupleCounterFrameWriter create(RecordDescriptor recordDescriptor,
+            Collection<FrameWriterOperation> exceptionThrowingOperations,
+            Collection<FrameWriterOperation> errorThrowingOperations, boolean deepCopyInputFrames) {
+        CountAnswer openAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Open,
+                exceptionThrowingOperations, errorThrowingOperations);
+        CountAnswer nextAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.NextFrame,
+                exceptionThrowingOperations, errorThrowingOperations);
+        CountAnswer flushAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Flush,
+                exceptionThrowingOperations, errorThrowingOperations);
+        CountAnswer failAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Fail,
+                exceptionThrowingOperations, errorThrowingOperations);
+        CountAnswer closeAnswer = FrameWriterTestUtils.createAnswer(FrameWriterOperation.Close,
+                exceptionThrowingOperations, errorThrowingOperations);
+        return new TestTupleCounterFrameWriter(recordDescriptor, openAnswer, nextAnswer, flushAnswer, failAnswer,
+                closeAnswer, deepCopyInputFrames);
+    }
+
+    public static void flush(IDatasetLifecycleManager dsLifecycleMgr, TestLsmBtree lsmBtree, boolean async)
+            throws Exception {
+        flush(dsLifecycleMgr, lsmBtree, DATASET, async);
+    }
+
+    public static void flush(IDatasetLifecycleManager dsLifecycleMgr, TestLsmBtree lsmBtree, Dataset dataset,
+            boolean async) throws Exception {
+        waitForOperations(lsmBtree);
+        dsLifecycleMgr.flushDataset(dataset.getDatasetId(), async);
+    }
+
+    public static void waitForOperations(ILSMIndex index) throws InterruptedException {
+        // wait until number of activeOperation reaches 0
+        PrimaryIndexOperationTracker opTracker = (PrimaryIndexOperationTracker) index.getOperationTracker();
+        long maxWaitTime = 60000L; // 1 minute
+        long before = System.currentTimeMillis();
+        while (opTracker.getNumActiveOperations() > 0) {
+            Thread.sleep(5); // NOSONAR: Test code with a timeout
+            if (System.currentTimeMillis() - before > maxWaitTime) {
+                throw new IllegalStateException(
+                        (System.currentTimeMillis() - before) + "ms passed without completing the frame operation");
+            }
+        }
+    }
+
+    public static class Searcher {
+        private final ExecutorService executor = Executors.newSingleThreadExecutor();
+        private Future<Boolean> task;
+        private volatile boolean entered = false;
+
+        public Searcher(TestNodeController nc, int partition, TestLsmBtree lsmBtree, int numOfRecords) {
+            this(nc, partition, DATASET, STORAGE_MANAGER, lsmBtree, numOfRecords);
+        }
+
+        public Searcher(TestNodeController nc, int partition, Dataset dataset, StorageComponentProvider storageManager,
+                TestLsmBtree lsmBtree, int numOfRecords) {
+            lsmBtree.addSearchCallback(new ITestOpCallback<Semaphore>() {
+
+                @Override
+                public void before(Semaphore sem) {
+                    synchronized (Searcher.this) {
+                        entered = true;
+                        Searcher.this.notifyAll();
+                    }
+                }
+
+                @Override
+                public void after() {
+                }
+            });
+            Callable<Boolean> callable = new Callable<Boolean>() {
+                @Override
+                public Boolean call() throws Exception {
+                    searchAndAssertCount(nc, partition, dataset, storageManager, numOfRecords);
+                    return true;
+                }
+            };
+            task = executor.submit(callable);
+        }
+
+        public boolean result() throws Exception {
+            return task.get();
+        }
+
+        public synchronized void waitUntilEntered() throws InterruptedException {
+            while (!entered) {
+                this.wait();
+            }
+        }
+    }
+
+    public static class Merger {
+        private volatile int count = 0;
+
+        public Merger(TestLsmBtree lsmBtree) {
+            lsmBtree.addMergeCallback(new ITestOpCallback<Semaphore>() {
+
+                @Override
+                public void before(Semaphore smeaphore) {
+                    synchronized (Merger.this) {
+                        count++;
+                        Merger.this.notifyAll();
+                    }
+                }
+
+                @Override
+                public void after() {
+                }
+            });
+        }
+
+        public synchronized void waitUntilCount(int count) throws InterruptedException {
+            while (this.count != count) {
+                this.wait();
+            }
+        }
+    }
+
+    public static class Flusher {
+        private volatile int count = 0;
+
+        public Flusher(TestLsmBtree lsmBtree) {
+            lsmBtree.addFlushCallback(new ITestOpCallback<Semaphore>() {
+
+                @Override
+                public void before(Semaphore smeaphore) {
+                    synchronized (Flusher.this) {
+                        count++;
+                        Flusher.this.notifyAll();
+                    }
+                }
+
+                @Override
+                public void after() {
+                }
+            });
+        }
+
+        public synchronized void waitUntilCount(int count) throws InterruptedException {
+            while (this.count != count) {
+                this.wait();
+            }
+        }
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
index 893b428..0c4983a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestDataset.java
@@ -62,6 +62,6 @@
 
     @Override
     public ILSMIOOperationCallbackFactory getIoOperationCallbackFactory(Index index) throws AlgebricksException {
-        return TestLsmBtreeIoOpCallbackFactory.INSTANCE;
+        return new TestLsmBtreeIoOpCallbackFactory(getComponentIdGeneratorFactory());
     }
 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBTreeResourceFactoryProvider.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBTreeResourceFactoryProvider.java
index 4511f42..8d37878 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBTreeResourceFactoryProvider.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBTreeResourceFactoryProvider.java
@@ -33,6 +33,7 @@
 import org.apache.asterix.metadata.utils.IndexUtil;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexOperationTrackerFactory;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.data.IBinaryComparatorFactoryProvider;
@@ -66,9 +67,11 @@
         ITypeTraits[] typeTraits = getTypeTraits(mdProvider, dataset, index, recordType, metaType);
         IBinaryComparatorFactory[] cmpFactories = getCmpFactories(mdProvider, dataset, index, recordType, metaType);
         int[] bloomFilterFields = getBloomFilterFields(dataset, index);
-        boolean durable = !dataset.isTemp();
         double bloomFilterFalsePositiveRate = mdProvider.getStorageProperties().getBloomFilterFalsePositiveRate();
         ILSMOperationTrackerFactory opTrackerFactory = dataset.getIndexOperationTrackerFactory(index);
+        if (opTrackerFactory instanceof PrimaryIndexOperationTrackerFactory) {
+            opTrackerFactory = new TestPrimaryIndexOperationTrackerFactory(dataset.getDatasetId());
+        }
         ILSMIOOperationCallbackFactory ioOpCallbackFactory = dataset.getIoOperationCallbackFactory(index);
         IStorageManager storageManager = storageComponentProvider.getStorageManager();
         IMetadataPageManagerFactory metadataPageManagerFactory =
@@ -78,7 +81,7 @@
         AsterixVirtualBufferCacheProvider vbcProvider = new AsterixVirtualBufferCacheProvider(dataset.getDatasetId());
         return new TestLsmBtreeLocalResourceFactory(storageManager, typeTraits, cmpFactories, filterTypeTraits,
                 filterCmpFactories, filterFields, opTrackerFactory, ioOpCallbackFactory, metadataPageManagerFactory,
-                vbcProvider, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties, durable, bloomFilterFields,
+                vbcProvider, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties, true, bloomFilterFields,
                 bloomFilterFalsePositiveRate, index.isPrimaryIndex(), btreeFields);
     }
 
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
index 327c66e..c69ffe5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestLsmBtreeIoOpCallbackFactory.java
@@ -18,19 +18,27 @@
  */
 package org.apache.asterix.test.dataflow;
 
+import java.util.List;
+
 import org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallback;
+import org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallbackFactory;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.btree.impl.TestLsmBtree;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.EmptyComponent;
 
-public class TestLsmBtreeIoOpCallbackFactory implements ILSMIOOperationCallbackFactory {
+public class TestLsmBtreeIoOpCallbackFactory extends LSMBTreeIOOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public static TestLsmBtreeIoOpCallbackFactory INSTANCE = new TestLsmBtreeIoOpCallbackFactory();
     private static volatile int completedFlushes = 0;
     private static volatile int completedMerges = 0;
     private static volatile int rollbackFlushes = 0;
@@ -38,11 +46,12 @@
     private static volatile int failedFlushes = 0;
     private static volatile int failedMerges = 0;
 
-    private TestLsmBtreeIoOpCallbackFactory() {
+    public TestLsmBtreeIoOpCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        super(idGeneratorFactory);
     }
 
     @Override
-    public synchronized ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
+    public synchronized ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException {
         completedFlushes = 0;
         completedMerges = 0;
         rollbackFlushes = 0;
@@ -50,7 +59,7 @@
         // Whenever this is called, it resets the counter
         // However, the counters for the failed operations are never reset since we expect them
         // To be always 0
-        return new TestLsmBtreeIoOpCallback(index);
+        return new TestLsmBtreeIoOpCallback(index, getComponentIdGenerator(), getIndexCheckpointManagerProvider());
     }
 
     public int getTotalFlushes() {
@@ -90,23 +99,44 @@
     }
 
     public class TestLsmBtreeIoOpCallback extends LSMBTreeIOOperationCallback {
-        public TestLsmBtreeIoOpCallback(ILSMIndex index) {
-            super(index);
+        private final TestLsmBtree lsmBtree;
+
+        public TestLsmBtreeIoOpCallback(ILSMIndex index, ILSMComponentIdGenerator idGenerator,
+                IIndexCheckpointManagerProvider checkpointManagerProvider) {
+            super(index, idGenerator, checkpointManagerProvider);
+            lsmBtree = (TestLsmBtree) index;
         }
 
         @Override
-        public void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent) {
+        public void beforeOperation(LSMIOOperationType opType) throws HyracksDataException {
+            lsmBtree.beforeIoOperationCalled();
+            super.beforeOperation(opType);
+            lsmBtree.beforeIoOperationReturned();
+        }
+
+        @Override
+        public void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents,
+                ILSMDiskComponent newComponent) throws HyracksDataException {
+            lsmBtree.afterIoOperationCalled();
+            super.afterOperation(opType, oldComponents, newComponent);
+            lsmBtree.afterIoOperationReturned();
+        }
+
+        @Override
+        public void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent)
+                throws HyracksDataException {
+            lsmBtree.afterIoFinalizeCalled();
             super.afterFinalize(opType, newComponent);
-            synchronized (INSTANCE) {
+            synchronized (TestLsmBtreeIoOpCallbackFactory.this) {
                 if (newComponent != null) {
                     if (newComponent == EmptyComponent.INSTANCE) {
-                        if (opType == LSMOperationType.FLUSH) {
+                        if (opType == LSMIOOperationType.FLUSH) {
                             rollbackFlushes++;
                         } else {
                             rollbackMerges++;
                         }
                     } else {
-                        if (opType == LSMOperationType.FLUSH) {
+                        if (opType == LSMIOOperationType.FLUSH) {
                             completedFlushes++;
                         } else {
                             completedMerges++;
@@ -115,12 +145,27 @@
                 } else {
                     recordFailure(opType);
                 }
-                INSTANCE.notifyAll();
+                TestLsmBtreeIoOpCallbackFactory.this.notifyAll();
             }
+            lsmBtree.afterIoFinalizeReturned();
         }
 
-        private void recordFailure(LSMOperationType opType) {
-            if (opType == LSMOperationType.FLUSH) {
+        @Override
+        public void recycled(ILSMMemoryComponent component, boolean advance) throws HyracksDataException {
+            lsmBtree.recycledCalled(component);
+            super.recycled(component, advance);
+            lsmBtree.recycledReturned(component);
+        }
+
+        @Override
+        public void allocated(ILSMMemoryComponent component) throws HyracksDataException {
+            lsmBtree.allocatedCalled(component);
+            super.allocated(component);
+            lsmBtree.allocatedReturned(component);
+        }
+
+        private void recordFailure(LSMIOOperationType opType) {
+            if (opType == LSMIOOperationType.FLUSH) {
                 failedFlushes++;
             } else {
                 failedMerges++;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTracker.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTracker.java
new file mode 100644
index 0000000..9a528d3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTracker.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.common.context.DatasetInfo;
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
+import org.apache.asterix.common.transactions.ILogManager;
+import org.apache.asterix.common.transactions.LogRecord;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.btree.impl.ITestOpCallback;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+
+public class TestPrimaryIndexOperationTracker extends PrimaryIndexOperationTracker {
+
+    private final List<ITestOpCallback<Void>> callbacks = new ArrayList<>();
+
+    public TestPrimaryIndexOperationTracker(int datasetID, int partition, ILogManager logManager, DatasetInfo dsInfo,
+            ILSMComponentIdGenerator idGenerator) {
+        super(datasetID, partition, logManager, dsInfo, idGenerator);
+    }
+
+    public void addCallback(ITestOpCallback<Void> callback) {
+        synchronized (callbacks) {
+            callbacks.add(callback);
+        }
+    }
+
+    public void clearCallbacks() {
+        synchronized (callbacks) {
+            callbacks.clear();
+        }
+    }
+
+    @Override
+    public void triggerScheduleFlush(LogRecord logRecord) throws HyracksDataException {
+        synchronized (callbacks) {
+            for (ITestOpCallback<Void> callback : callbacks) {
+                callback.before(null);
+            }
+        }
+        super.triggerScheduleFlush(logRecord);
+        synchronized (callbacks) {
+            for (ITestOpCallback<Void> callback : callbacks) {
+                callback.after();
+            }
+        }
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTrackerFactory.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTrackerFactory.java
new file mode 100644
index 0000000..e6b34b8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dataflow/TestPrimaryIndexOperationTrackerFactory.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.dataflow;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Map;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.context.DatasetLifecycleManager;
+import org.apache.asterix.common.context.DatasetResource;
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
+import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexOperationTrackerFactory;
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
+import org.apache.hyracks.storage.common.IResource;
+
+public class TestPrimaryIndexOperationTrackerFactory extends PrimaryIndexOperationTrackerFactory {
+
+    private static final long serialVersionUID = 1L;
+    private final int datasetId;
+
+    public TestPrimaryIndexOperationTrackerFactory(int datasetId) {
+        super(datasetId);
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource) {
+        try {
+            INcApplicationContext appCtx = (INcApplicationContext) ctx.getApplicationContext();
+            DatasetLifecycleManager dslcManager = (DatasetLifecycleManager) appCtx.getDatasetLifecycleManager();
+            DatasetResource dsr = dslcManager.getDatasetLifecycle(datasetId);
+            int partition = StoragePathUtil.getPartitionNumFromRelativePath(resource.getPath());
+            PrimaryIndexOperationTracker opTracker = dslcManager.getOperationTracker(datasetId, partition);
+            if (!(opTracker instanceof TestPrimaryIndexOperationTracker)) {
+                Field opTrackersField = DatasetResource.class.getDeclaredField("datasetPrimaryOpTrackers");
+                opTracker = new TestPrimaryIndexOperationTracker(datasetId, partition,
+                        appCtx.getTransactionSubsystem().getLogManager(), dsr.getDatasetInfo(),
+                        dslcManager.getComponentIdGenerator(datasetId, partition));
+                replaceMapEntry(opTrackersField, dsr, partition, opTracker);
+            }
+            return opTracker;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    static void setFinal(Field field, Object obj, Object newValue) throws Exception {
+        field.setAccessible(true);
+        Field modifiersField = Field.class.getDeclaredField("modifiers");
+        modifiersField.setAccessible(true);
+        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
+        field.set(obj, newValue);
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    static void replaceMapEntry(Field field, Object obj, Object key, Object value)
+            throws Exception, IllegalAccessException {
+        field.setAccessible(true);
+        Field modifiersField = Field.class.getDeclaredField("modifiers");
+        modifiersField.setAccessible(true);
+        Map map = (Map) field.get(obj);
+        map.put(key, value);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java
new file mode 100644
index 0000000..0affaf2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/ddl/SecondaryBTreeOperationsHelperTest.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.ddl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.common.TestDataUtil;
+import org.apache.asterix.common.config.GlobalConfig;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.metadata.utils.IndexUtil;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.dataflow.std.sort.AbstractSorterOperatorDescriptor;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class SecondaryBTreeOperationsHelperTest {
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
+    private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        integrationUtil.deinit(true);
+    }
+
+    /**
+     * Tests eliminating the sort operator from the job spec when the index to be created is secondary primary index
+     *
+     * @throws Exception
+     */
+    @Test
+    public void createPrimaryIndex() throws Exception {
+        ICcApplicationContext appCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        final MetadataProvider metadataProvider = new MetadataProvider(appCtx, null);
+        MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(mdTxn);
+        try {
+            final String datasetName = "DS";
+            final String primaryIndexName = "PIxd";
+            final String secondaryIndexName = "SIdx";
+            final String PKFieldName = "id";
+            final String SKFieldName = "name";
+            final Map<String, String> fields = new HashMap<>(2);
+            fields.put(PKFieldName, "int");
+            fields.put(SKFieldName, "string");
+
+            // create the dataset
+            TestDataUtil.createDataset(datasetName, fields, PKFieldName);
+            final Dataset dataset = metadataProvider.findDataset(null, datasetName);
+            Assert.assertNotNull(dataset);
+
+            Index index;
+            JobSpecification jobSpecification;
+
+            // create a secondary primary index
+            TestDataUtil.createPrimaryIndex(datasetName, primaryIndexName);
+            index = metadataProvider.getIndex(MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME, datasetName,
+                    primaryIndexName);
+            Assert.assertNotNull(index);
+            jobSpecification = IndexUtil.buildSecondaryIndexLoadingJobSpec(dataset, index, metadataProvider);
+            jobSpecification.getOperatorMap().values().forEach(iOperatorDescriptor -> {
+                Assert.assertFalse(iOperatorDescriptor instanceof AbstractSorterOperatorDescriptor);
+            });
+
+            // create a normal BTree index
+            TestDataUtil.createSecondaryBTreeIndex(datasetName, secondaryIndexName, SKFieldName);
+            index = metadataProvider.getIndex(MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME, datasetName,
+                    secondaryIndexName);
+            Assert.assertNotNull(index);
+            jobSpecification = IndexUtil.buildSecondaryIndexLoadingJobSpec(dataset, index, metadataProvider);
+            final long numOfSortOperators = jobSpecification.getOperatorMap().values().stream()
+                    .filter(op -> op instanceof AbstractSorterOperatorDescriptor).count();
+            Assert.assertTrue(numOfSortOperators != 0);
+        } finally {
+            MetadataManager.INSTANCE.commitTransaction(mdTxn);
+            metadataProvider.getLocks().unlock();
+        }
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
index 7818d13..3b636c6 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/dml/DmlTest.java
@@ -41,8 +41,8 @@
     private static final String[] ASTERIX_DATA_DIRS = new String[] { "nc1data", "nc2data" };
     private static final String PATH_ACTUAL = "dmltest" + File.separator;
     private static final String SEPARATOR = File.separator;
-    private static final String PATH_BASE = "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "dmlts"
-            + SEPARATOR;
+    private static final String PATH_BASE =
+            "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "dmlts" + SEPARATOR;
     private static final String PATH_SCRIPTS = PATH_BASE + "scripts" + SEPARATOR;
     private static final String LOAD_FOR_ENLIST_FILE = PATH_SCRIPTS + "load-cust.aql";
 
@@ -59,13 +59,13 @@
         }
         outdir.mkdirs();
 
-        integrationUtil.init(true);
-        Reader loadReader = new BufferedReader(
-                new InputStreamReader(new FileInputStream(LOAD_FOR_ENLIST_FILE), "UTF-8"));
+        integrationUtil.init(true, AsterixHyracksIntegrationUtil.DEFAULT_CONF_FILE);
+        Reader loadReader =
+                new BufferedReader(new InputStreamReader(new FileInputStream(LOAD_FOR_ENLIST_FILE), "UTF-8"));
         AsterixJavaClient asterixLoad =
                 new AsterixJavaClient((ICcApplicationContext) integrationUtil.cc.getApplicationContext(),
-                        integrationUtil.getHyracksClientConnection(), loadReader,
-                ERR, new AqlCompilationProvider(), new DefaultStatementExecutorFactory(), new StorageComponentProvider());
+                        integrationUtil.getHyracksClientConnection(), loadReader, ERR, new AqlCompilationProvider(),
+                        new DefaultStatementExecutorFactory(), new StorageComponentProvider());
         try {
             asterixLoad.compile(true, false, false, false, false, true, false);
         } catch (AsterixException e) {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
index 77d0130..e7b6271 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonLogicalPlanTest.java
@@ -1 +1,235 @@
-/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.asterix.test.jsonplan;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Logger;

import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
import org.apache.asterix.api.java.AsterixJavaClient;
import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
import org.apache.asterix.common.config.GlobalConfig;
import org.apache.asterix.common.context.IStorageComponentProvider;
import org.apache.asterix.common.dataflow.ICcApplicationContext;
import org.apache.asterix.common.exceptions.AsterixException;
import org.apache.asterix.compiler.provider.AqlCompilationProvider;
import org.apache.asterix.compiler.provider.ILangCompilationProvider;
import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
import org.apache.asterix.external.util.ExternalDataConstants;
import org.apache.asterix.external.util.IdentitiyResolverFactory;
import org.apache.asterix.file.StorageComponentProvider;
import org.apache.asterix.test.base.AsterixTestHelper;
import org.apache.asterix.test.common.TestHelper;
import org.apache.asterix.test.runtime.HDFSCluster;
import org.apache.asterix.translator.IStatementExecutorFactory;
import org.apache.asterix.translator.SessionConfig.PlanFormat;
import org.apache.hyracks.api.client.IHyracksClientConnection;
import org.junit.AfterClass;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.internal.AssumptionViolatedException;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;

@RunWith(Parameterized.class)
public class JsonLogicalPlanTest {

    private static final Logger LOGGER =
            Logger.getLogger(org.apache.asterix.test.jsonplan.JsonLogicalPlanTest.class.getName());

    protected static final String SEPARATOR = File.separator;
    private static final String EXTENSION_AQL = "aql";
    private static final String EXTENSION_SQLPP = "sqlpp";
    private static final String EXTENSION_RESULT = "plan";
    private static final String FILENAME_IGNORE = "ignore.txt";
    private static final String FILENAME_ONLY = "only.txt";
    private static final String PATH_BASE =
            "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "optimizerts" + SEPARATOR;
    private static final String PATH_QUERIES = PATH_BASE + "queries" + SEPARATOR;
    protected static String PATH_ACTUAL = "target" + File.separator + "jplantest" + SEPARATOR;
    protected static boolean optimized = false;

    private static final ArrayList<String> ignore = AsterixTestHelper.readTestListFile(FILENAME_IGNORE, PATH_BASE);
    private static final ArrayList<String> only = AsterixTestHelper.readTestListFile(FILENAME_ONLY, PATH_BASE);
    protected static String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
    private static final ILangCompilationProvider aqlCompilationProvider = new AqlCompilationProvider();
    private static final ILangCompilationProvider sqlppCompilationProvider = new SqlppCompilationProvider();
    protected static ILangCompilationProvider extensionLangCompilationProvider = null;
    protected static IStatementExecutorFactory statementExecutorFactory = new DefaultStatementExecutorFactory();
    protected static IStorageComponentProvider storageComponentProvider = new StorageComponentProvider();

    protected static AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();

    @BeforeClass
    public static void setUp() throws Exception {
        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
        final File outdir = new File(PATH_ACTUAL);
        outdir.mkdirs();

        HDFSCluster.getInstance().setup();

        integrationUtil.init(true);
        // Set the node resolver to be the identity resolver that expects node names
        // to be node controller ids; a valid assumption in test environment.
        System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
                IdentitiyResolverFactory.class.getName());
    }

    @AfterClass
    public static void tearDown() throws Exception {
        File outdir = new File(PATH_ACTUAL);
        File[] files = outdir.listFiles();
        if (files == null || files.length == 0) {
            outdir.delete();
        }

        HDFSCluster.getInstance().cleanup();

        integrationUtil.deinit(true);
    }

    private static void suiteBuildPerFile(File file, Collection<Object[]> testArgs, String path) {
        if (file.isDirectory() && !file.getName().startsWith(".")) {
            for (File innerfile : file.listFiles()) {
                String subdir = innerfile.isDirectory() ? path + innerfile.getName() + SEPARATOR : path;
                suiteBuildPerFile(innerfile, testArgs, subdir);
            }
        }
        if (file.isFile() && (file.getName().endsWith(EXTENSION_AQL) || file.getName().endsWith(EXTENSION_SQLPP))) {
            String resultFileName = AsterixTestHelper.extToResExt(file.getName(), EXTENSION_RESULT);
            File actualFile = new File(PATH_ACTUAL + SEPARATOR + path + resultFileName);
            testArgs.add(new Object[] { file, actualFile });
        }
    }

    @Parameters(name = "JsonLogicalPlanTest {index}: {0}")
    public static Collection<Object[]> tests() {
        Collection<Object[]> testArgs = new ArrayList<>();
        if (only.isEmpty()) {
            suiteBuildPerFile(new File(PATH_QUERIES), testArgs, "");
        } else {
            for (String path : only) {
                suiteBuildPerFile(new File(PATH_QUERIES + path), testArgs,
                        path.lastIndexOf(SEPARATOR) < 0 ? "" : path.substring(0, path.lastIndexOf(SEPARATOR) + 1));
            }
        }
        return testArgs;
    }

    private final File actualFile;
    private final File queryFile;

    public JsonLogicalPlanTest(final File queryFile, final File actualFile) {
        this.queryFile = queryFile;
        this.actualFile = actualFile;
    }

    @Test
    public void test() throws Exception {
        try {
            String queryFileShort =
                    queryFile.getPath().substring(PATH_QUERIES.length()).replace(SEPARATOR.charAt(0), '/');
            if (!only.isEmpty()) {
                boolean toRun = TestHelper.isInPrefixList(only, queryFileShort);
                if (!toRun) {
                    LOGGER.info("SKIP TEST: \"" + queryFile.getPath()
                            + "\" \"only.txt\" not empty and not in \"only.txt\".");
                }
                Assume.assumeTrue(toRun);
            }
            boolean skipped = TestHelper.isInPrefixList(ignore, queryFileShort);
            if (skipped) {
                LOGGER.info("SKIP TEST: \"" + queryFile.getPath() + "\" in \"ignore.txt\".");
            }
            Assume.assumeTrue(!skipped);

            LOGGER.info("RUN TEST: \"" + queryFile.getPath() + "\"");
            Reader query = new BufferedReader(new InputStreamReader(new FileInputStream(queryFile), "UTF-8"));

            // Forces the creation of actualFile.
            actualFile.getParentFile().mkdirs();

            PrintWriter plan = new PrintWriter(actualFile);
            ILangCompilationProvider provider =
                    queryFile.getName().endsWith("aql") ? aqlCompilationProvider : sqlppCompilationProvider;
            if (extensionLangCompilationProvider != null) {
                provider = extensionLangCompilationProvider;
            }
            IHyracksClientConnection hcc = integrationUtil.getHyracksClientConnection();
            AsterixJavaClient asterix =
                    new AsterixJavaClient((ICcApplicationContext) integrationUtil.cc.getApplicationContext(), hcc,
                            query, plan, provider, statementExecutorFactory, storageComponentProvider);
            try {
                asterix.compile(true, false, !optimized, optimized, false, false, false, PlanFormat.JSON);

            } catch (AsterixException e) {
                plan.close();
                query.close();
                throw new Exception("Compile ERROR for " + queryFile + ": " + e.getMessage(), e);
            }
            plan.close();
            query.close();

            BufferedReader readerActual =
                    new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
            String lineActual, objectActual = "";
            boolean firstPlan = false;
            while ((lineActual = readerActual.readLine()) != null) {
                if (lineActual.contains("--")) {
                    if (firstPlan) {
                        break;
                    }
                    firstPlan = true;

                } else {
                    objectActual = objectActual + lineActual;
                }
            }

            try {
                final JsonParser parser = new ObjectMapper().getJsonFactory().createJsonParser(objectActual);
                while (parser.nextToken() != null) {
                }
            } finally {
                readerActual.close();
            }

        } catch (Exception e) {
            if (!(e instanceof AssumptionViolatedException)) {
                LOGGER.severe("Test \"" + queryFile.getPath() + "\" FAILED!");
                throw new Exception("Test \"" + queryFile.getPath() + "\" FAILED!", e);
            } else {
                throw e;
            }
        }
    }
}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.test.jsonplan;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.api.java.AsterixJavaClient;
+import org.apache.asterix.app.translator.DefaultStatementExecutorFactory;
+import org.apache.asterix.common.config.GlobalConfig;
+import org.apache.asterix.common.context.IStorageComponentProvider;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.compiler.provider.AqlCompilationProvider;
+import org.apache.asterix.compiler.provider.ILangCompilationProvider;
+import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
+import org.apache.asterix.external.util.ExternalDataConstants;
+import org.apache.asterix.external.util.IdentitiyResolverFactory;
+import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.test.base.AsterixTestHelper;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.test.runtime.HDFSCluster;
+import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.asterix.translator.SessionConfig.PlanFormat;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.internal.AssumptionViolatedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(Parameterized.class)
+public class JsonLogicalPlanTest {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    protected static final String SEPARATOR = File.separator;
+    private static final String EXTENSION_AQL = "aql";
+    private static final String EXTENSION_SQLPP = "sqlpp";
+    private static final String EXTENSION_RESULT = "plan";
+    private static final String FILENAME_IGNORE = "ignore.txt";
+    private static final String FILENAME_ONLY = "only.txt";
+    private static final String PATH_BASE =
+            "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "optimizerts" + SEPARATOR;
+    private static final String PATH_QUERIES = PATH_BASE + "queries" + SEPARATOR;
+    protected static String PATH_ACTUAL = "target" + File.separator + "jplantest" + SEPARATOR;
+    protected static boolean optimized = false;
+
+    private static final ArrayList<String> ignore = AsterixTestHelper.readTestListFile(FILENAME_IGNORE, PATH_BASE);
+    private static final ArrayList<String> only = AsterixTestHelper.readTestListFile(FILENAME_ONLY, PATH_BASE);
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
+    private static final ILangCompilationProvider aqlCompilationProvider = new AqlCompilationProvider();
+    private static final ILangCompilationProvider sqlppCompilationProvider = new SqlppCompilationProvider();
+    protected static ILangCompilationProvider extensionLangCompilationProvider = null;
+    protected static IStatementExecutorFactory statementExecutorFactory = new DefaultStatementExecutorFactory();
+    protected static IStorageComponentProvider storageComponentProvider = new StorageComponentProvider();
+
+    protected static AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
+        final File outdir = new File(PATH_ACTUAL);
+        outdir.mkdirs();
+
+        HDFSCluster.getInstance().setup();
+
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
+        // Set the node resolver to be the identity resolver that expects node names
+        // to be node controller ids; a valid assumption in test environment.
+        System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
+                IdentitiyResolverFactory.class.getName());
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        File outdir = new File(PATH_ACTUAL);
+        File[] files = outdir.listFiles();
+        if (files == null || files.length == 0) {
+            outdir.delete();
+        }
+
+        HDFSCluster.getInstance().cleanup();
+
+        integrationUtil.deinit(true);
+    }
+
+    private static void suiteBuildPerFile(File file, Collection<Object[]> testArgs, String path) {
+        if (file.isDirectory() && !file.getName().startsWith(".")) {
+            for (File innerfile : file.listFiles()) {
+                String subdir = innerfile.isDirectory() ? path + innerfile.getName() + SEPARATOR : path;
+                suiteBuildPerFile(innerfile, testArgs, subdir);
+            }
+        }
+        if (file.isFile() && (file.getName().endsWith(EXTENSION_AQL) || file.getName().endsWith(EXTENSION_SQLPP))) {
+            String resultFileName = AsterixTestHelper.extToResExt(file.getName(), EXTENSION_RESULT);
+            File actualFile = new File(PATH_ACTUAL + SEPARATOR + path + resultFileName);
+            testArgs.add(new Object[] { file, actualFile });
+        }
+    }
+
+    @Parameters(name = "JsonLogicalPlanTest {index}: {0}")
+    public static Collection<Object[]> tests() {
+        Collection<Object[]> testArgs = new ArrayList<>();
+        if (only.isEmpty()) {
+            suiteBuildPerFile(new File(PATH_QUERIES), testArgs, "");
+        } else {
+            for (String path : only) {
+                suiteBuildPerFile(new File(PATH_QUERIES + path), testArgs,
+                        path.lastIndexOf(SEPARATOR) < 0 ? "" : path.substring(0, path.lastIndexOf(SEPARATOR) + 1));
+            }
+        }
+        return testArgs;
+    }
+
+    private final File actualFile;
+    private final File queryFile;
+
+    public JsonLogicalPlanTest(final File queryFile, final File actualFile) {
+        this.queryFile = queryFile;
+        this.actualFile = actualFile;
+    }
+
+    @Test
+    public void test() throws Exception {
+        try {
+            String queryFileShort =
+                    queryFile.getPath().substring(PATH_QUERIES.length()).replace(SEPARATOR.charAt(0), '/');
+            if (!only.isEmpty()) {
+                boolean toRun = TestHelper.isInPrefixList(only, queryFileShort);
+                if (!toRun) {
+                    LOGGER.info("SKIP TEST: \"" + queryFile.getPath()
+                            + "\" \"only.txt\" not empty and not in \"only.txt\".");
+                }
+                Assume.assumeTrue(toRun);
+            }
+            boolean skipped = TestHelper.isInPrefixList(ignore, queryFileShort);
+            if (skipped) {
+                LOGGER.info("SKIP TEST: \"" + queryFile.getPath() + "\" in \"ignore.txt\".");
+            }
+            Assume.assumeTrue(!skipped);
+
+            LOGGER.info("RUN TEST: \"" + queryFile.getPath() + "\"");
+            Reader query = new BufferedReader(new InputStreamReader(new FileInputStream(queryFile), "UTF-8"));
+
+            // Forces the creation of actualFile.
+            actualFile.getParentFile().mkdirs();
+
+            PrintWriter plan = new PrintWriter(actualFile);
+            ILangCompilationProvider provider =
+                    queryFile.getName().endsWith("aql") ? aqlCompilationProvider : sqlppCompilationProvider;
+            if (extensionLangCompilationProvider != null) {
+                provider = extensionLangCompilationProvider;
+            }
+            IHyracksClientConnection hcc = integrationUtil.getHyracksClientConnection();
+            AsterixJavaClient asterix =
+                    new AsterixJavaClient((ICcApplicationContext) integrationUtil.cc.getApplicationContext(), hcc,
+                            query, plan, provider, statementExecutorFactory, storageComponentProvider);
+            try {
+                asterix.compile(true, false, !optimized, optimized, false, false, false, PlanFormat.JSON);
+
+            } catch (AsterixException e) {
+                plan.close();
+                query.close();
+                throw new Exception("Compile ERROR for " + queryFile + ": " + e.getMessage(), e);
+            }
+            plan.close();
+            query.close();
+
+            BufferedReader readerActual =
+                    new BufferedReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
+            String lineActual, objectActual = "";
+            boolean firstPlan = false;
+            while ((lineActual = readerActual.readLine()) != null) {
+                if (lineActual.contains("--")) {
+                    if (firstPlan) {
+                        break;
+                    }
+                    firstPlan = true;
+
+                } else {
+                    objectActual = objectActual + lineActual;
+                }
+            }
+
+            try {
+                final JsonParser parser = new ObjectMapper().getJsonFactory().createJsonParser(objectActual);
+                while (parser.nextToken() != null) {
+                }
+            } finally {
+                readerActual.close();
+            }
+
+        } catch (Exception e) {
+            if (!(e instanceof AssumptionViolatedException)) {
+                LOGGER.error("Test \"" + queryFile.getPath() + "\" FAILED!");
+                throw new Exception("Test \"" + queryFile.getPath() + "\" FAILED!", e);
+            } else {
+                throw e;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java
index b8e4595..bc699c0 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/jsonplan/JsonOptimizedLogicalPlanTest.java
@@ -20,7 +20,6 @@
 package org.apache.asterix.test.jsonplan;
 
 import java.io.File;
-import java.util.logging.Logger;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -28,9 +27,6 @@
 @RunWith(Parameterized.class)
 public class JsonOptimizedLogicalPlanTest extends JsonLogicalPlanTest {
 
-    private static final Logger LOGGER =
-            Logger.getLogger(org.apache.asterix.test.jsonplan.JsonOptimizedLogicalPlanTest.class.getName());
-
     public JsonOptimizedLogicalPlanTest(File queryFile, File actualFile) {
         super(queryFile, actualFile);
         optimized = true;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
index 5384c92..91d98e5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/logging/CheckpointingTest.java
@@ -30,15 +30,14 @@
 import org.apache.asterix.app.data.gen.TupleGenerator.GenerationFunction;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.TransactionProperties;
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Property;
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
 import org.apache.asterix.common.transactions.Checkpoint;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ICheckpointManager;
 import org.apache.asterix.common.transactions.IRecoveryManager;
 import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
+import org.apache.asterix.common.transactions.TransactionOptions;
 import org.apache.asterix.external.util.DataflowUtils;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -51,8 +50,11 @@
 import org.apache.asterix.test.common.TestHelper;
 import org.apache.asterix.transaction.management.service.logging.LogManager;
 import org.apache.asterix.transaction.management.service.recovery.AbstractCheckpointManager;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.comm.VSizeFrame;
+import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
@@ -65,10 +67,9 @@
 
 public class CheckpointingTest {
 
-    private static final String DEFAULT_TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
-    private static final String TEST_CONFIG_FILE_NAME = "asterix-test-configuration.xml";
-    private static final String TEST_CONFIG_PATH =
-            System.getProperty("user.dir") + File.separator + "target" + File.separator + "config";
+    private static final String TEST_CONFIG_FILE_NAME = "cc-small-txn-log-partition.conf";
+    private static final String TEST_CONFIG_PATH = System.getProperty("user.dir") + File.separator + "src"
+            + File.separator + "test" + File.separator + "resources";
     private static final String TEST_CONFIG_FILE_PATH = TEST_CONFIG_PATH + File.separator + TEST_CONFIG_FILE_NAME;
     private static final IAType[] KEY_TYPES = { BuiltinType.AINT32 };
     private static final ARecordType RECORD_TYPE = new ARecordType("TestRecordType", new String[] { "key", "value" },
@@ -87,22 +88,10 @@
     private static final String DATASET_NAME = "TestDS";
     private static final String DATA_TYPE_NAME = "DUMMY";
     private static final String NODE_GROUP_NAME = "DEFAULT";
-    private static final int TXN_LOG_PARTITION_SIZE = StorageUtil.getIntSizeInBytes(2, StorageUnit.MEGABYTE);
 
     @Before
     public void setUp() throws Exception {
         System.out.println("SetUp: ");
-        TestHelper.deleteExistingInstanceFiles();
-        // Read default test configurations
-        AsterixConfiguration ac = TestHelper.getConfigurations(DEFAULT_TEST_CONFIG_FILE_NAME);
-        // Set log file size to 2MB
-        ac.getProperty().add(new Property(TransactionProperties.TXN_LOG_PARTITIONSIZE_KEY,
-                String.valueOf(TXN_LOG_PARTITION_SIZE), ""));
-        // Disable checkpointing by making checkpoint thread wait max wait time
-        ac.getProperty().add(new Property(TransactionProperties.TXN_LOG_CHECKPOINT_POLLFREQUENCY_KEY,
-                String.valueOf(Integer.MAX_VALUE), ""));
-        // Write test config file
-        TestHelper.writeConfigurations(ac, TEST_CONFIG_FILE_PATH);
     }
 
     @After
@@ -121,18 +110,18 @@
             partitioningKeys.add(Collections.singletonList("key"));
             Dataset dataset = new Dataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
                     NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null, PartitioningStrategy.HASH,
-                            partitioningKeys, null, null, null, false, null, false),
+                            partitioningKeys, null, null, null, false, null),
                     null, DatasetType.INTERNAL, DATASET_ID, 0);
             try {
                 nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, storageManager, KEY_INDEXES,
-                        KEY_INDICATOR_LIST);
-                IHyracksTaskContext ctx = nc.createTestContext(false);
-                nc.newJobId();
-                ITransactionContext txnCtx =
-                        nc.getTransactionManager().getTransactionContext(nc.getTxnJobId(ctx), true);
+                        KEY_INDICATOR_LIST, 0);
+                JobId jobId = nc.newJobId();
+                IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, false);
+                ITransactionContext txnCtx = nc.getTransactionManager().beginTransaction(nc.getTxnJobId(ctx),
+                        new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL));
                 // Prepare insert operation
                 LSMInsertDeleteOperatorNodePushable insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES,
-                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATOR_LIST, storageManager).getLeft();
+                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATOR_LIST, storageManager, null).getLeft();
                 insertOp.open();
                 TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATOR,
                         RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
@@ -202,7 +191,7 @@
                     tupleAppender.write(insertOp, true);
                 }
                 insertOp.close();
-                nc.getTransactionManager().completedTransaction(txnCtx, DatasetId.NULL, -1, true);
+                nc.getTransactionManager().commitTransaction(txnCtx.getTxnId());
             } finally {
                 nc.deInit();
             }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTest.java
index f75942d..0e8b4a9 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTest.java
@@ -43,19 +43,18 @@
     private TestCaseContext tcCtx;
 
     private static final String PATH_ACTUAL = "target" + File.separator + "mdtest" + File.separator;
-    private static final String PATH_BASE = StringUtils
-            .join(new String[] { "src", "test", "resources", "metadata" + File.separator }, File.separator);
-    private static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    private static final String PATH_BASE =
+            StringUtils.join(new String[] { "src", "test", "resources", "metadata" + File.separator }, File.separator);
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     private static final TestExecutor testExecutor = new TestExecutor();
     private static AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
 
     @BeforeClass
     public static void setUp() throws Exception {
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
         File outdir = new File(PATH_ACTUAL);
         outdir.mkdirs();
-        integrationUtil.init(true);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
     }
 
     @AfterClass
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
index 3969ec5..70e5f6e 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/metadata/MetadataTxnTest.java
@@ -21,11 +21,17 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.config.DatasetConfig;
 import org.apache.asterix.common.config.GlobalConfig;
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
@@ -36,20 +42,23 @@
 import org.apache.asterix.metadata.utils.DatasetUtil;
 import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
 public class MetadataTxnTest {
 
-    private static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
     private static final TestExecutor testExecutor = new TestExecutor();
     private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
 
     @Before
     public void setUp() throws Exception {
         System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
-        integrationUtil.init(true);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
     }
 
     @After
@@ -137,4 +146,122 @@
             MetadataManager.INSTANCE.commitTransaction(readMdTxn);
         }
     }
+
+    @Test
+    public void concurrentMetadataTxn() throws Exception {
+        // get create type and dataset
+        String datasetName = "dataset1";
+        final TestCaseContext.OutputFormat format = TestCaseContext.OutputFormat.CLEAN_JSON;
+        testExecutor.executeSqlppUpdateOrDdl("CREATE TYPE KeyType AS { id: int };", format);
+        testExecutor.executeSqlppUpdateOrDdl("CREATE DATASET " + datasetName + "(KeyType) PRIMARY KEY id;", format);
+
+        // get created dataset
+        ICcApplicationContext appCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        MetadataProvider metadataProvider = new MetadataProvider(appCtx, null);
+        final MetadataTransactionContext mdTxnCtx = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(mdTxnCtx);
+        Dataset sourceDataset;
+        try {
+            sourceDataset = metadataProvider.findDataset(MetadataBuiltinEntities.DEFAULT_DATAVERSE_NAME, datasetName);
+            MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
+        } finally {
+            metadataProvider.getLocks().unlock();
+        }
+
+        /*
+         * Concurrently insert copies of the created dataset with
+         * different names and either commit or abort the transaction.
+         */
+        final AtomicInteger failCount = new AtomicInteger(0);
+        Thread transactor1 = new Thread(() -> IntStream.range(1, 100).forEach(x -> {
+            try {
+                addDataset(appCtx, sourceDataset, x, x % 2 == 0);
+            } catch (Exception e) {
+                e.printStackTrace();
+                failCount.incrementAndGet();
+            }
+        }));
+
+        Thread transactor2 = new Thread(() -> IntStream.range(101, 200).forEach(x -> {
+            try {
+                addDataset(appCtx, sourceDataset, x, x % 3 == 0);
+            } catch (Exception e) {
+                e.printStackTrace();
+                failCount.incrementAndGet();
+            }
+        }));
+
+        transactor1.start();
+        transactor2.start();
+        transactor1.join();
+        transactor2.join();
+
+        Assert.assertEquals(0, failCount.get());
+
+        // make sure all metadata indexes have no pending operations after all txns committed/aborted
+        final IDatasetLifecycleManager datasetLifecycleManager =
+                ((INcApplicationContext) integrationUtil.ncs[0].getApplicationContext()).getDatasetLifecycleManager();
+        int maxMetadatasetId = 14;
+        for (int i = 1; i <= maxMetadatasetId; i++) {
+            ILSMIndex index = (ILSMIndex) datasetLifecycleManager.getIndex(i, i);
+            if (index != null) {
+                final PrimaryIndexOperationTracker opTracker =
+                        (PrimaryIndexOperationTracker) index.getOperationTracker();
+                Assert.assertEquals(0, opTracker.getNumActiveOperations());
+            }
+        }
+    }
+
+    @Test
+    public void surviveInterruptOnMetadataTxnCommit() throws Exception {
+        ICcApplicationContext appCtx =
+                (ICcApplicationContext) integrationUtil.getClusterControllerService().getApplicationContext();
+        final MetadataProvider metadataProvider = new MetadataProvider(appCtx, null);
+        final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(mdTxn);
+        final String nodeGroupName = "ng";
+        Thread transactor = new Thread(() -> {
+            final List<String> ngNodes = Arrays.asList("asterix_nc1");
+            try {
+                MetadataManager.INSTANCE.addNodegroup(mdTxn, new NodeGroup(nodeGroupName, ngNodes));
+                Thread.currentThread().interrupt();
+                MetadataManager.INSTANCE.commitTransaction(mdTxn);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+        transactor.start();
+        transactor.join();
+        // ensure that the node group was added
+        final MetadataTransactionContext readMdTxn = MetadataManager.INSTANCE.beginTransaction();
+        try {
+            final NodeGroup nodegroup = MetadataManager.INSTANCE.getNodegroup(readMdTxn, nodeGroupName);
+            if (nodegroup == null) {
+                throw new AssertionError("nodegroup was found after metadata txn was aborted");
+            }
+        } finally {
+            MetadataManager.INSTANCE.commitTransaction(readMdTxn);
+        }
+    }
+
+    private void addDataset(ICcApplicationContext appCtx, Dataset source, int datasetPostfix, boolean abort)
+            throws Exception {
+        Dataset dataset = new Dataset(source.getDataverseName(), "ds_" + datasetPostfix, source.getDataverseName(),
+                source.getDatasetType().name(), source.getNodeGroupName(), NoMergePolicyFactory.NAME, null,
+                source.getDatasetDetails(), source.getHints(), DatasetConfig.DatasetType.INTERNAL, datasetPostfix, 0);
+        MetadataProvider metadataProvider = new MetadataProvider(appCtx, null);
+        final MetadataTransactionContext writeTxn = MetadataManager.INSTANCE.beginTransaction();
+        metadataProvider.setMetadataTxnContext(writeTxn);
+        try {
+            MetadataManager.INSTANCE.addDataset(writeTxn, dataset);
+            if (abort) {
+                MetadataManager.INSTANCE.abortTransaction(writeTxn);
+            } else {
+                MetadataManager.INSTANCE.commitTransaction(writeTxn);
+            }
+        } finally {
+            metadataProvider.getLocks().unlock();
+        }
+    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
index d1c3ce4..3fd59a4 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/optimizer/OptimizerTest.java
@@ -26,7 +26,6 @@
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.logging.Logger;
 
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
 import org.apache.asterix.api.java.AsterixJavaClient;
@@ -34,7 +33,6 @@
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.compiler.provider.AqlCompilationProvider;
 import org.apache.asterix.compiler.provider.ILangCompilationProvider;
 import org.apache.asterix.compiler.provider.SqlppCompilationProvider;
@@ -45,7 +43,10 @@
 import org.apache.asterix.test.common.TestHelper;
 import org.apache.asterix.test.runtime.HDFSCluster;
 import org.apache.asterix.translator.IStatementExecutorFactory;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.Assume;
 import org.junit.BeforeClass;
@@ -58,7 +59,7 @@
 @RunWith(Parameterized.class)
 public class OptimizerTest {
 
-    private static final Logger LOGGER = Logger.getLogger(OptimizerTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String SEPARATOR = File.separator;
     private static final String EXTENSION_AQL = "aql";
@@ -74,7 +75,7 @@
 
     private static final ArrayList<String> ignore = AsterixTestHelper.readTestListFile(FILENAME_IGNORE, PATH_BASE);
     private static final ArrayList<String> only = AsterixTestHelper.readTestListFile(FILENAME_ONLY, PATH_BASE);
-    protected static String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
     private static final ILangCompilationProvider aqlCompilationProvider = new AqlCompilationProvider();
     private static final ILangCompilationProvider sqlppCompilationProvider = new SqlppCompilationProvider();
     protected static ILangCompilationProvider extensionLangCompilationProvider = null;
@@ -85,13 +86,12 @@
 
     @BeforeClass
     public static void setUp() throws Exception {
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
         final File outdir = new File(PATH_ACTUAL);
         outdir.mkdirs();
 
         HDFSCluster.getInstance().setup();
 
-        integrationUtil.init(true);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
         // Set the node resolver to be the identity resolver that expects node names
         // to be node controller ids; a valid assumption in test environment.
         System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
@@ -189,7 +189,7 @@
                             query, plan, provider, statementExecutorFactory, storageComponentProvider);
             try {
                 asterix.compile(true, false, false, true, true, false, false);
-            } catch (AsterixException e) {
+            } catch (AlgebricksException e) {
                 plan.close();
                 query.close();
                 throw new Exception("Compile ERROR for " + queryFile + ": " + e.getMessage(), e);
@@ -230,7 +230,7 @@
             }
         } catch (Exception e) {
             if (!(e instanceof AssumptionViolatedException)) {
-                LOGGER.severe("Test \"" + queryFile.getPath() + "\" FAILED!");
+                LOGGER.error("Test \"" + queryFile.getPath() + "\" FAILED!");
                 throw new Exception("Test \"" + queryFile.getPath() + "\" FAILED!", e);
             } else {
                 throw e;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
index dd87455..cf62e42 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/APIExecutionTest.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class APIExecutionTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionFullParallelismIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionFullParallelismIT.java
index 4ab44e0..09758f6 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionFullParallelismIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionFullParallelismIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class AqlExecutionFullParallelismIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration2.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc2.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionLessParallelismIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionLessParallelismIT.java
index c72013e..62ed790 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionLessParallelismIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionLessParallelismIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class AqlExecutionLessParallelismIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration3.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc3.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTest.java
index abc9f2f..6430219 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTest.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class AqlExecutionTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTestIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTestIT.java
index 441f27d..290638e 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTestIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/AqlExecutionTestIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class AqlExecutionTestIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
index 17e88a6..e752493 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateDefaultParameterTest.java
@@ -40,7 +40,7 @@
  */
 @RunWith(Parameterized.class)
 public class ClusterStateDefaultParameterTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration4.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc4.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
@@ -87,8 +87,8 @@
                 Assert.assertTrue(getValue(row) == maxHeap / 4);
                 matchCount++;
             }
-            if (row.contains("storage.memorycomponent.numpages")) {
-                Assert.assertTrue(getValue(row) == maxHeap / (131072 * 64));
+            if (row.contains("storage.max.active.writable.datasets")) {
+                Assert.assertTrue(getValue(row) == 8);
                 matchCount++;
             }
         }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionFullParallelismTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionFullParallelismTest.java
index e428c93..f79a7ea 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionFullParallelismTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionFullParallelismTest.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class ClusterStateExecutionFullParallelismTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration2.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc2.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionLessParallelismTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionLessParallelismTest.java
index 346ae2f..ccd54d7 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionLessParallelismTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ClusterStateExecutionLessParallelismTest.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class ClusterStateExecutionLessParallelismTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration3.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc3.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
index 5c2d263..c7ae2df 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ExecutionTestUtil.java
@@ -22,8 +22,6 @@
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -34,43 +32,50 @@
 import org.apache.asterix.external.util.IdentitiyResolverFactory;
 import org.apache.asterix.testframework.xml.TestGroup;
 import org.apache.asterix.testframework.xml.TestSuite;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExecutionTestUtil {
 
-    protected static final Logger LOGGER = Logger.getLogger(ExecutionTestUtil.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
 
     protected static final String PATH_ACTUAL = "rttest" + File.separator;
 
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
-
     public static TestGroup FailedGroup;
 
     public static AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
 
     public static List<ILibraryManager> setUp(boolean cleanup) throws Exception {
-        return setUp(cleanup, TEST_CONFIG_FILE_NAME, integrationUtil, true);
+        return setUp(cleanup, AsterixHyracksIntegrationUtil.DEFAULT_CONF_FILE, integrationUtil, true, null);
     }
 
     public static List<ILibraryManager> setUp(boolean cleanup, String configFile) throws Exception {
-        return setUp(cleanup, configFile, integrationUtil, true);
+        return setUp(cleanup, configFile, integrationUtil, true, null);
     }
 
     public static List<ILibraryManager> setUp(boolean cleanup, String configFile,
-            AsterixHyracksIntegrationUtil alternateIntegrationUtil, boolean startHdfs) throws Exception {
+            AsterixHyracksIntegrationUtil alternateIntegrationUtil, boolean startHdfs, List<Pair<IOption, Object>> opts)
+            throws Exception {
         System.out.println("Starting setup");
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Starting setup");
         }
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, configFile);
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("initializing pseudo cluster");
         }
         integrationUtil = alternateIntegrationUtil;
-        integrationUtil.init(cleanup);
+        if (opts != null) {
+            for (Pair<IOption, Object> p : opts) {
+                integrationUtil.addOption(p.getLeft(), p.getRight());
+            }
+        }
+        integrationUtil.init(cleanup, configFile);
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("initializing HDFS");
         }
 
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/HDFSCluster.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/HDFSCluster.java
index 9d35d89..a89304a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/HDFSCluster.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/HDFSCluster.java
@@ -31,8 +31,6 @@
 import org.apache.hadoop.mapred.InputSplit;
 import org.apache.hadoop.mapred.JobConf;
 import org.apache.hadoop.mapred.TextInputFormat;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
 
 /**
  * Manages a Mini (local VM) HDFS cluster with a configured number of datanodes.
@@ -73,7 +71,6 @@
         conf.addResource(new Path(basePath + PATH_TO_HADOOP_CONF + "/mapred-site.xml"));
         conf.addResource(new Path(basePath + PATH_TO_HADOOP_CONF + "/hdfs-site.xml"));
         cleanupLocal();
-        setLoggingLevel(Level.WARN);
         conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, MINIDFS_BASEDIR);
         MiniDFSCluster.Builder build = new MiniDFSCluster.Builder(conf);
         build.nameNodePort(nameNodePort);
@@ -84,11 +81,6 @@
         loadData(basePath);
     }
 
-    private void setLoggingLevel(Level level) {
-        Logger rootLogger = Logger.getRootLogger();
-        rootLogger.setLevel(level);
-    }
-
     private void loadData(String localDataRoot) throws IOException {
         Path destDir = new Path(HDFS_PATH);
         dfs.mkdirs(destDir);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
index 03f42f5..9da0e66 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/LangExecutionUtil.java
@@ -31,16 +31,17 @@
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.asterix.app.external.TestLibrarian;
-import org.apache.asterix.common.config.ClusterProperties;
+import org.apache.asterix.common.config.NodeProperties;
+import org.apache.asterix.app.external.ExternalUDFLibrarian;
 import org.apache.asterix.common.library.ILibraryManager;
+import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.testframework.context.TestCaseContext;
 import org.apache.commons.lang.SystemUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.api.io.IODeviceHandle;
-import org.apache.hyracks.util.ThreadDumpUtil;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.hyracks.util.ThreadDumpUtil;
 
 /**
  * Utils for running SQL++ or AQL runtime tests.
@@ -56,16 +57,17 @@
     private static final List<String> badTestCases = new ArrayList<>();
     private static TestExecutor testExecutor;
 
-    private static TestLibrarian librarian;
+    private static ExternalUDFLibrarian librarian;
     private static final int repeat = Integer.getInteger("test.repeat", 1);
+    private static boolean checkStorageDistribution = true;
 
     public static void setUp(String configFile, TestExecutor executor) throws Exception {
         testExecutor = executor;
         File outdir = new File(PATH_ACTUAL);
         outdir.mkdirs();
         List<ILibraryManager> libraryManagers = ExecutionTestUtil.setUp(cleanupOnStart, configFile);
-        TestLibrarian.removeLibraryDir();
-        librarian = new TestLibrarian(libraryManagers);
+        ExternalUDFLibrarian.removeLibraryDir();
+        librarian = new ExternalUDFLibrarian(libraryManagers);
         testExecutor.setLibrarian(librarian);
         if (repeat != 1) {
             System.out.println("FYI: each test will be run " + repeat + " times.");
@@ -79,7 +81,7 @@
             // Check whether there are leaked threads.
             checkThreadLeaks();
         } finally {
-            TestLibrarian.removeLibraryDir();
+            ExternalUDFLibrarian.removeLibraryDir();
             ExecutionTestUtil.tearDown(cleanupOnStop);
             ExecutionTestUtil.integrationUtil.removeTestStorageFiles();
             if (!badTestCases.isEmpty()) {
@@ -125,7 +127,9 @@
                 testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false, ExecutionTestUtil.FailedGroup);
 
                 try {
-                    checkStorageFiles();
+                    if (checkStorageDistribution) {
+                        checkStorageFiles();
+                    }
                 } finally {
                     testExecutor.cleanup(tcCtx.toString(), badTestCases);
                 }
@@ -152,7 +156,7 @@
             File[] dataDirs = ioDevice.getMount().listFiles();
             for (File dataDir : dataDirs) {
                 String dirName = dataDir.getName();
-                if (!dirName.equals(ClusterProperties.DEFAULT_STORAGE_DIR_NAME)) {
+                if (!dirName.equals(StorageConstants.STORAGE_ROOT_DIR_NAME)) {
                     // Skips non-storage directories.
                     continue;
                 }
@@ -189,7 +193,7 @@
         return num;
     }
 
-    private static void checkThreadLeaks() throws IOException {
+    public static void checkThreadLeaks() throws IOException {
         String threadDump = ThreadDumpUtil.takeDumpJSONString();
         // Currently we only do sanity check for threads used in the execution engine.
         // Later we should check if there are leaked storage threads as well.
@@ -200,7 +204,7 @@
         }
     }
 
-    private static void checkOpenRunFileLeaks() throws IOException {
+    public static void checkOpenRunFileLeaks() throws IOException {
         if (SystemUtils.IS_OS_WINDOWS) {
             return;
         }
@@ -222,6 +226,10 @@
         }
     }
 
+    public static void setCheckStorageDistribution(boolean checkStorageDistribution) {
+        LangExecutionUtil.checkStorageDistribution = checkStorageDistribution;
+    }
+
     private static void outputLeakedOpenFiles(String processId) throws IOException {
         Process process =
                 Runtime.getRuntime().exec(new String[] { "bash", "-c", "lsof -p " + processId + "|grep waf" });
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/MetricsExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/MetricsExecutionTest.java
index c7fae46..a973c63 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/MetricsExecutionTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/MetricsExecutionTest.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class MetricsExecutionTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceTest.java
index 7eb1110..afde4b2 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceTest.java
@@ -34,7 +34,7 @@
  */
 @RunWith(Parameterized.class)
 public class RebalanceTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceWithCancellationIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceWithCancellationIT.java
index 1d7bdc3..58502fb 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceWithCancellationIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/RebalanceWithCancellationIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class RebalanceWithCancellationIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
     private static RebalanceCancellationTestExecutor executor = new RebalanceCancellationTestExecutor();
 
     @BeforeClass
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ReplicationExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ReplicationExecutionTest.java
new file mode 100644
index 0000000..cbca8dc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/ReplicationExecutionTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.runtime;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ReplicationExecutionTest {
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc-rep.conf";
+    private static final TestExecutor testExecutor = new TestExecutor();
+    private static boolean configured = false;
+
+    @BeforeClass
+    public static void setUp() {
+        LangExecutionUtil.setCheckStorageDistribution(false);
+    }
+
+    @Before
+    public void before() throws Exception {
+        LangExecutionUtil.setUp(TEST_CONFIG_FILE_NAME, testExecutor);
+        if (!configured) {
+            final NodeControllerService[] ncs = ExecutionTestUtil.integrationUtil.ncs;
+            Map<String, InetSocketAddress> ncEndPoints = new HashMap<>();
+            Map<String, InetSocketAddress> replicationAddress = new HashMap<>();
+            final String ip = InetAddress.getLoopbackAddress().getHostAddress();
+            for (NodeControllerService nc : ncs) {
+                final String nodeId = nc.getId();
+                final INcApplicationContext appCtx = (INcApplicationContext) nc.getApplicationContext();
+                int apiPort = appCtx.getExternalProperties().getNcApiPort();
+                int replicationPort =
+                        (int) appCtx.getServiceContext().getAppConfig().get(NCConfig.Option.REPLICATION_LISTEN_PORT);
+                ncEndPoints.put(nodeId, InetSocketAddress.createUnresolved(ip, apiPort));
+                replicationAddress.put(nodeId, InetSocketAddress.createUnresolved(ip, replicationPort));
+            }
+            testExecutor.setNcEndPoints(ncEndPoints);
+            testExecutor.setNcReplicationAddress(replicationAddress);
+            configured = true;
+        }
+    }
+
+    @After
+    public void after() throws Exception {
+        LangExecutionUtil.tearDown();
+    }
+
+    @Parameters(name = "ReplicationExecutionTest {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        return LangExecutionUtil.tests("replication.xml", "replication.xml");
+    }
+
+    protected TestCaseContext tcCtx;
+
+    public ReplicationExecutionTest(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Test
+    public void test() throws Exception {
+        LangExecutionUtil.test(tcCtx);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionFullParallelismIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionFullParallelismIT.java
index 3d93c36..df7976b 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionFullParallelismIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionFullParallelismIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class SqlppExecutionFullParallelismIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration2.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc2.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionIT.java
index 99907a2..334d6df 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class SqlppExecutionIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionLessParallelismIT.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionLessParallelismIT.java
index 53b068e..d99590d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionLessParallelismIT.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionLessParallelismIT.java
@@ -35,7 +35,7 @@
  */
 @RunWith(Parameterized.class)
 public class SqlppExecutionLessParallelismIT {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration3.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc3.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionTest.java
index 8ec1fe7..f9f57a3 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionTest.java
@@ -34,7 +34,7 @@
  */
 @RunWith(Parameterized.class)
 public class SqlppExecutionTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
 
     @BeforeClass
     public static void setUp() throws Exception {
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
index fff0775..c5ca66a 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/SqlppExecutionWithCancellationTest.java
@@ -36,7 +36,7 @@
  */
 @RunWith(Parameterized.class)
 public class SqlppExecutionWithCancellationTest {
-    protected static final String TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
     public static int numCancelledQueries = 0;
 
     @BeforeClass
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/StringOffsetTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/StringOffsetTest.java
new file mode 100644
index 0000000..4b7d1dc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/runtime/StringOffsetTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.test.runtime;
+
+import java.util.Collection;
+
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ * Overrides string offset to be 1 instead of 0
+ */
+@RunWith(Parameterized.class)
+public class StringOffsetTest {
+    protected static final String TEST_CONFIG_FILE_NAME = "src/test/resources/cc-stringoffset.conf";
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        LangExecutionUtil.setUp(TEST_CONFIG_FILE_NAME, new TestExecutor());
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        LangExecutionUtil.tearDown();
+    }
+
+    @Parameterized.Parameters(name = "StringOffsetTest {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        return LangExecutionUtil.tests("only_sqlpp.xml", "testsuite_stringoffset.xml");
+    }
+
+    protected TestCaseContext tcCtx;
+
+    public StringOffsetTest(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Test
+    public void test() throws Exception {
+        LangExecutionUtil.test(tcCtx);
+    }
+
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
index 24a1872..35bcff5 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/OptimizerParserTest.java
@@ -21,10 +21,11 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
 import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -35,7 +36,7 @@
 @RunWith(Parameterized.class)
 public class OptimizerParserTest {
 
-    private static final Logger LOGGER = Logger.getLogger(OptimizerParserTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String EXTENSION_QUERY = "sqlpp";
     private static final String EXTENSION_RESULT = "ast";
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
index 493af30..0d0c1d9 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestExecutor.java
@@ -149,10 +149,9 @@
             }
             writer.close();
             // Compares the actual result and the expected result.
-            runScriptAndCompareWithResult(queryFile, new PrintWriter(System.err), expectedFile, actualResultFile,
-                    ComparisonEnum.TEXT);
+            runScriptAndCompareWithResult(queryFile, expectedFile, actualResultFile, ComparisonEnum.TEXT);
         } catch (Exception e) {
-            GlobalConfig.ASTERIX_LOGGER.warning("Failed while testing file " + queryFile);
+            GlobalConfig.ASTERIX_LOGGER.warn("Failed while testing file " + queryFile);
             throw e;
         } finally {
             writer.close();
@@ -192,9 +191,13 @@
                         + "org.apache.asterix.lang.common.rewrites.LangRewritingContext)",
                 declaredFunctions, topExpr, metadataProvider, context);
         PA.invokeMethod(rewriter, "inlineColumnAlias()");
-        PA.invokeMethod(rewriter, "rewriteGlobalAggregations()");
+        PA.invokeMethod(rewriter, "generateColumnNames()");
+        PA.invokeMethod(rewriter, "substituteGroupbyKeyExpression()");
         PA.invokeMethod(rewriter, "rewriteGroupBys()");
-        PA.invokeMethod(rewriter, "variableCheckAndRewrite(boolean)", Boolean.TRUE);
+        PA.invokeMethod(rewriter, "rewriteSetOperations()");
+        PA.invokeMethod(rewriter, "variableCheckAndRewrite()");
+        PA.invokeMethod(rewriter, "rewriteGroupByAggregationSugar()");
+
     }
 
 }
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
index 9c3c393..6bdf351 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/ParserTestUtil.java
@@ -21,11 +21,11 @@
 import java.io.File;
 import java.util.Collection;
 import java.util.List;
-import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
 import org.apache.asterix.test.common.TestHelper;
 import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.Logger;
 import org.junit.Assume;
 import org.junit.internal.AssumptionViolatedException;
 
@@ -74,7 +74,7 @@
         } catch (Exception e) {
             if (!(e instanceof AssumptionViolatedException)) {
                 final String msg = "Test \"" + queryFile.getPath() + "\" FAILED!";
-                logger.severe(msg);
+                logger.error(msg);
                 throw new Exception(msg, e);
             } else {
                 throw e;
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/RuntimeParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/RuntimeParserTest.java
index 0cac0c5..2088903 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/RuntimeParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/RuntimeParserTest.java
@@ -21,11 +21,12 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.logging.Logger;
 
 import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.testframework.context.TestCaseContext;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -40,11 +41,11 @@
 @RunWith(Parameterized.class)
 public class RuntimeParserTest {
 
-    protected static final Logger LOGGER = Logger.getLogger(RuntimeParserTest.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
 
     protected static final String PATH_ACTUAL = "target" + File.separator + "runtime_parserts" + File.separator;
-    protected static final String PATH_BASE = StringUtils.join(new String[] { "src", "test", "resources", "runtimets" },
-            File.separator);
+    protected static final String PATH_BASE =
+            StringUtils.join(new String[] { "src", "test", "resources", "runtimets" }, File.separator);
 
     private final TestExecutor testExecutor = new ParserTestExecutor();
 
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
index b9b0cd6..b7a316d 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/sqlpp/SmokeParserTest.java
@@ -21,10 +21,11 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.logging.Logger;
 
 import org.apache.asterix.test.base.AsterixTestHelper;
 import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -35,7 +36,7 @@
 @RunWith(Parameterized.class)
 public class SmokeParserTest {
 
-    private static final Logger LOGGER = Logger.getLogger(SmokeParserTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String EXTENSION_QUERY = "sqlpp";
     private static final String EXTENSION_RESULT = "ast";
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DeallocatableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DeallocatableTest.java
new file mode 100644
index 0000000..cfd251b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DeallocatableTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.storage;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.app.bootstrap.TestNodeController;
+import org.apache.asterix.replication.management.NetworkingUtil;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.test.runtime.LangExecutionUtil;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
+import org.apache.hyracks.api.dataflow.TaskAttemptId;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.partitions.PartitionId;
+import org.apache.hyracks.comm.channels.NetworkOutputChannel;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.hyracks.control.nc.partitions.MaterializingPipelinedPartition;
+import org.apache.hyracks.net.protocols.muxdemux.ChannelControlBlock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class DeallocatableTest {
+
+    @Before
+    public void setUp() throws Exception {
+        TestHelper.deleteExistingInstanceFiles();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        TestHelper.deleteExistingInstanceFiles();
+    }
+
+    @Test
+    public void deallocateBeforeConsumerStart() throws Exception {
+        TestNodeController nc = new TestNodeController(null, false);
+        try {
+            nc.init();
+            final NodeControllerService ncs =
+                    (NodeControllerService) nc.getAppRuntimeContext().getServiceContext().getControllerService();
+            final TaskAttemptId taId = Mockito.mock(TaskAttemptId.class);
+            JobId jobId = nc.newJobId();
+            final IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, true);
+            final ConnectorDescriptorId codId = new ConnectorDescriptorId(1);
+            final PartitionId pid = new PartitionId(ctx.getJobletContext().getJobId(), codId, 1, 1);
+            final ChannelControlBlock ccb = ncs.getNetworkManager()
+                    .connect(NetworkingUtil.getSocketAddress(ncs.getNetworkManager().getLocalNetworkAddress()));
+            final NetworkOutputChannel networkOutputChannel = new NetworkOutputChannel(ccb, 0);
+            final MaterializingPipelinedPartition mpp =
+                    new MaterializingPipelinedPartition(ctx, ncs.getPartitionManager(), pid, taId, ncs.getExecutor());
+            mpp.open();
+            // fill and write frame
+            final ByteBuffer frame = ctx.allocateFrame();
+            while (frame.hasRemaining()) {
+                frame.put((byte) 0);
+            }
+            frame.flip();
+            mpp.nextFrame(frame);
+            // close and deallocate before consumer thread starts
+            mpp.close();
+            mpp.deallocate();
+            // start the consumer thread after deallocate
+            mpp.writeTo(networkOutputChannel);
+            // give consumer thread chance to exit
+            TimeUnit.MILLISECONDS.sleep(100);
+            LangExecutionUtil.checkThreadLeaks();
+            LangExecutionUtil.checkOpenRunFileLeaks();
+        } finally {
+            nc.deInit();
+        }
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DiskIsFullTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DiskIsFullTest.java
index eb47248..8897169 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DiskIsFullTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/DiskIsFullTest.java
@@ -33,7 +33,6 @@
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.dataflow.LSMInsertDeleteOperatorNodePushable;
 import org.apache.asterix.common.exceptions.ExceptionUtils;
-import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.external.util.DataflowUtils;
 import org.apache.asterix.file.StorageComponentProvider;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -49,6 +48,7 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
@@ -121,18 +121,16 @@
             partitioningKeys.add(Collections.singletonList("key"));
             Dataset dataset = new Dataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
                     NoMergePolicyFactory.NAME, null, new InternalDatasetDetails(null, PartitioningStrategy.HASH,
-                            partitioningKeys, null, null, null, false, null, false),
+                            partitioningKeys, null, null, null, false, null),
                     null, DatasetType.INTERNAL, DATASET_ID, 0);
             try {
                 nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, storageManager, KEY_INDEXES,
-                        KEY_INDICATOR_LIST);
-                IHyracksTaskContext ctx = nc.createTestContext(false);
-                nc.newJobId();
-                ITransactionContext txnCtx =
-                        nc.getTransactionManager().getTransactionContext(nc.getTxnJobId(ctx), true);
+                        KEY_INDICATOR_LIST, 0);
+                JobId jobId = nc.newJobId();
+                IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, false);
                 // Prepare insert operation
                 LSMInsertDeleteOperatorNodePushable insertOp = nc.getInsertPipeline(ctx, dataset, KEY_TYPES,
-                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATOR_LIST, storageManager).getLeft();
+                        RECORD_TYPE, META_TYPE, null, KEY_INDEXES, KEY_INDICATOR_LIST, storageManager, null).getLeft();
                 insertOp.open();
                 TupleGenerator tupleGenerator = new TupleGenerator(RECORD_TYPE, META_TYPE, KEY_INDEXES, KEY_INDICATOR,
                         RECORD_GEN_FUNCTION, UNIQUE_RECORD_FIELDS, META_GEN_FUNCTION, UNIQUE_META_FIELDS);
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
index 2bac49e..31a6004 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/IndexDropOperatorNodePushableTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.asterix.test.storage;
 
-import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -30,19 +28,32 @@
 
 import org.apache.asterix.app.bootstrap.TestNodeController;
 import org.apache.asterix.common.config.DatasetConfig;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.file.StorageComponentProvider;
+import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
+import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.test.common.TestExecutor;
 import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.test.runtime.ExecutionTestUtil;
+import org.apache.asterix.testframework.context.TestCaseContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileSplit;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorNodePushable;
 import org.apache.hyracks.storage.am.lsm.common.impls.NoMergePolicyFactory;
 import org.junit.After;
@@ -64,6 +75,7 @@
     private static final String DATA_TYPE_NAME = "DUMMY";
     private static final String NODE_GROUP_NAME = "DEFAULT";
     private final AtomicBoolean dropFailed = new AtomicBoolean(false);
+    private final TestExecutor testExecutor = new TestExecutor();
 
     @Before
     public void setUp() throws Exception {
@@ -77,6 +89,12 @@
         TestHelper.deleteExistingInstanceFiles();
     }
 
+    /**
+     * Tests dropping a dataset using different
+     * drop options
+     *
+     * @throws Exception
+     */
     @Test
     public void dropOptionsTest() throws Exception {
         TestNodeController nc = new TestNodeController(null, false);
@@ -86,17 +104,17 @@
             List<List<String>> partitioningKeys = new ArrayList<>();
             partitioningKeys.add(Collections.singletonList("key"));
             Dataset dataset = new Dataset(DATAVERSE_NAME, DATASET_NAME, DATAVERSE_NAME, DATA_TYPE_NAME, NODE_GROUP_NAME,
-                    NoMergePolicyFactory.NAME, null,
-                    new InternalDatasetDetails(null, InternalDatasetDetails.PartitioningStrategy.HASH, partitioningKeys,
-                            null, null, null, false, null, false), null, DatasetConfig.DatasetType.INTERNAL, DATASET_ID,
-                    0);
+                    NoMergePolicyFactory.NAME,
+                    null, new InternalDatasetDetails(null, InternalDatasetDetails.PartitioningStrategy.HASH,
+                            partitioningKeys, null, null, null, false, null),
+                    null, DatasetConfig.DatasetType.INTERNAL, DATASET_ID, 0);
             // create dataset
-            TestNodeController.PrimaryIndexInfo indexInfo =
-                    nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE, META_TYPE, null, storageManager, KEY_INDEXES,
-                            KEY_INDICATORS_LIST);
+            TestNodeController.PrimaryIndexInfo indexInfo = nc.createPrimaryIndex(dataset, KEY_TYPES, RECORD_TYPE,
+                    META_TYPE, null, storageManager, KEY_INDEXES, KEY_INDICATORS_LIST, 0);
             IndexDataflowHelperFactory helperFactory =
                     new IndexDataflowHelperFactory(nc.getStorageManager(), indexInfo.getFileSplitProvider());
-            IHyracksTaskContext ctx = nc.createTestContext(true);
+            JobId jobId = nc.newJobId();
+            IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, true);
             IIndexDataflowHelper dataflowHelper = helperFactory.create(ctx.getJobletContext().getServiceContext(), 0);
             dropInUse(ctx, helperFactory, dataflowHelper);
             dropInUseWithWait(ctx, helperFactory, dataflowHelper);
@@ -107,6 +125,47 @@
         }
     }
 
+    /**
+     * Tests dropping an index whose dataset has no active
+     * operations
+     *
+     * @throws Exception
+     */
+    @Test
+    public void dropIndexInUseTest() throws Exception {
+        TestNodeController nc = new TestNodeController(null, false);
+        try {
+            nc.init();
+            String datasetName = "ds";
+            String indexName = "fooIdx";
+            // create dataset and index
+            final TestCaseContext.OutputFormat format = TestCaseContext.OutputFormat.CLEAN_JSON;
+            testExecutor.executeSqlppUpdateOrDdl("CREATE TYPE KeyType AS { id: int, foo: int };", format);
+            testExecutor.executeSqlppUpdateOrDdl("CREATE DATASET " + datasetName + "(KeyType) PRIMARY KEY id;", format);
+            testExecutor.executeSqlppUpdateOrDdl("CREATE INDEX " + indexName + " on " + datasetName + "(foo)", format);
+            final MetadataTransactionContext mdTxn = MetadataManager.INSTANCE.beginTransaction();
+            ICcApplicationContext appCtx = (ICcApplicationContext) ExecutionTestUtil.integrationUtil
+                    .getClusterControllerService().getApplicationContext();
+            MetadataProvider metadataProver = new MetadataProvider(appCtx, null);
+            metadataProver.setMetadataTxnContext(mdTxn);
+            final String defaultDv = MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDataverseName();
+            final Dataset dataset = MetadataManager.INSTANCE.getDataset(mdTxn, defaultDv, datasetName);
+            MetadataManager.INSTANCE.commitTransaction(mdTxn);
+            FileSplit[] splits = SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(), dataset,
+                    indexName, Arrays.asList("asterix_nc1"));
+            final ConstantFileSplitProvider constantFileSplitProvider =
+                    new ConstantFileSplitProvider(Arrays.copyOfRange(splits, 0, 1));
+            IndexDataflowHelperFactory helperFactory =
+                    new IndexDataflowHelperFactory(nc.getStorageManager(), constantFileSplitProvider);
+            JobId jobId = nc.newJobId();
+            IHyracksTaskContext ctx = nc.createTestContext(jobId, 0, true);
+            IIndexDataflowHelper dataflowHelper = helperFactory.create(ctx.getJobletContext().getServiceContext(), 0);
+            dropInUse(ctx, helperFactory, dataflowHelper);
+        } finally {
+            nc.deInit();
+        }
+    }
+
     private void dropInUse(IHyracksTaskContext ctx, IndexDataflowHelperFactory helperFactory,
             IIndexDataflowHelper dataflowHelper) throws Exception {
         dropFailed.set(false);
@@ -179,4 +238,4 @@
         }
         Assert.assertFalse(dropFailed.get());
     }
-}
\ No newline at end of file
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
new file mode 100644
index 0000000..fb1adde
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/storage/PersistentLocalResourceRepositoryTest.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.storage;
+
+import static org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager.COMPONENT_TIMESTAMP_FORMAT;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.common.TestDataUtil;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.config.GlobalConfig;
+import org.apache.asterix.common.dataflow.DatasetLocalResource;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
+import org.apache.hyracks.storage.common.LocalResource;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PersistentLocalResourceRepositoryTest {
+
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
+    private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
+
+    @Before
+    public void setUp() throws Exception {
+        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        integrationUtil.deinit(true);
+    }
+
+    @Test
+    public void deleteMaskedFiles() throws Exception {
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) integrationUtil.ncs[0].getApplicationContext();
+        final String nodeId = ncAppCtx.getServiceContext().getNodeId();
+        final String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        final Dataset dataset = TestDataUtil.getDataset(integrationUtil, datasetName);
+        final String indexPath = TestDataUtil.getIndexPath(integrationUtil, dataset, nodeId);
+        FileReference indexDirRef = ncAppCtx.getIoManager().resolve(indexPath);
+        // create masked component files
+        String indexDir = indexDirRef.getFile().getAbsolutePath();
+        String componentId = "12345_12345";
+        String btree = componentId + "_b";
+        String filter = componentId + "_f";
+        Path maskPath = Paths.get(indexDir, StorageConstants.COMPONENT_MASK_FILE_PREFIX + componentId);
+        Path btreePath = Paths.get(indexDir, btree);
+        Path filterPath = Paths.get(indexDir, filter);
+        Files.createFile(maskPath);
+        Files.createFile(btreePath);
+        Files.createFile(filterPath);
+        // clean up the dataset partition
+        PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) ncAppCtx.getLocalResourceRepository();
+        DatasetLocalResource lr = (DatasetLocalResource) localResourceRepository.get(indexPath).getResource();
+        int partition = lr.getPartition();
+        localResourceRepository.cleanup(partition);
+
+        // ensure all masked files and the mask were deleted
+        Assert.assertFalse(maskPath.toFile().exists());
+        Assert.assertFalse(btreePath.toFile().exists());
+        Assert.assertFalse(filterPath.toFile().exists());
+
+        // create single masked file
+        String fileName = "someFile";
+        maskPath = Paths.get(indexDir, StorageConstants.MASK_FILE_PREFIX + fileName);
+        Path filePath = Paths.get(indexDir, fileName);
+        Files.createFile(maskPath);
+        Files.createFile(filePath);
+        localResourceRepository.cleanup(partition);
+
+        // ensure the masked file and the mask were deleted
+        Assert.assertFalse(maskPath.toFile().exists());
+        Assert.assertFalse(filePath.toFile().exists());
+    }
+
+    @Test
+    public void deleteInvalidComponents() throws Exception {
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) integrationUtil.ncs[0].getApplicationContext();
+        final String nodeId = ncAppCtx.getServiceContext().getNodeId();
+        final String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        final Dataset dataset = TestDataUtil.getDataset(integrationUtil, datasetName);
+        final String indexPath = TestDataUtil.getIndexPath(integrationUtil, dataset, nodeId);
+        PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) ncAppCtx.getLocalResourceRepository();
+        DatasetLocalResource lr = (DatasetLocalResource) localResourceRepository.get(indexPath).getResource();
+        // ensure cleaning index without any components will not have any impact
+        localResourceRepository.cleanup(lr.getPartition());
+
+        // generate disk component (insert + flush)
+        TestDataUtil.upsertData(datasetName, 100);
+        ncAppCtx.getDatasetLifecycleManager().flushDataset(dataset.getDatasetId(), false);
+
+        // create new invalid component with a timestamp > checkpoint valid component timestamp (i.e. in the future)
+        Format formatter = new SimpleDateFormat(COMPONENT_TIMESTAMP_FORMAT);
+        Date futureTime = new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5));
+        String invalidComponentTimestamp =
+                formatter.format(futureTime) + AbstractLSMIndexFileManager.DELIMITER + formatter.format(futureTime);
+        FileReference indexDirRef = ncAppCtx.getIoManager().resolve(indexPath);
+        String indexDir = indexDirRef.getFile().getAbsolutePath();
+        // create the invalid component files
+        Path btreePath = Paths.get(indexDir, invalidComponentTimestamp + AbstractLSMIndexFileManager.DELIMITER
+                + AbstractLSMIndexFileManager.BTREE_SUFFIX);
+        Path filterPath = Paths.get(indexDir, invalidComponentTimestamp + AbstractLSMIndexFileManager.DELIMITER
+                + AbstractLSMIndexFileManager.BLOOM_FILTER_SUFFIX);
+        Files.createFile(btreePath);
+        Files.createFile(filterPath);
+
+        // clean up the index partition
+        localResourceRepository.cleanup(lr.getPartition());
+        // ensure that the invalid component was deleted
+        Assert.assertFalse(btreePath.toFile().exists());
+        Assert.assertFalse(filterPath.toFile().exists());
+
+        // ensure that valid components still exist
+        // find index valid component timestamp from checkpoint
+        LocalResource localResource = localResourceRepository.get(indexPath);
+        DatasetResourceReference drr = DatasetResourceReference.of(localResource);
+        IIndexCheckpointManagerProvider indexCheckpointManagerProvider = ncAppCtx.getIndexCheckpointManagerProvider();
+        IIndexCheckpointManager indexCheckpointManager = indexCheckpointManagerProvider.get(drr);
+        Optional<String> validComponentTimestamp = indexCheckpointManager.getValidComponentTimestamp();
+        Assert.assertTrue(validComponentTimestamp.isPresent());
+
+        File[] indexRemainingFiles =
+                indexDirRef.getFile().listFiles(AbstractLSMIndexFileManager.COMPONENT_FILES_FILTER);
+        Assert.assertNotNull(indexRemainingFiles);
+        long validComponentFilesCount = Arrays.stream(indexRemainingFiles)
+                .filter(file -> file.getName().startsWith(validComponentTimestamp.get())).count();
+        Assert.assertTrue(validComponentFilesCount > 0);
+    }
+}
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
new file mode 100644
index 0000000..6a70a29
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/LogManagerTest.java
@@ -0,0 +1,194 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.txn;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.common.TestDataUtil;
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.config.GlobalConfig;
+import org.apache.asterix.common.dataflow.DatasetLocalResource;
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.exceptions.ExceptionUtils;
+import org.apache.asterix.common.transactions.DatasetId;
+import org.apache.asterix.common.transactions.ILockManager;
+import org.apache.asterix.common.transactions.ILogManager;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.LogRecord;
+import org.apache.asterix.common.transactions.LogType;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.asterix.common.utils.TransactionUtil;
+import org.apache.asterix.metadata.entities.Dataset;
+import org.apache.asterix.test.common.TestTupleReference;
+import org.apache.asterix.transaction.management.service.logging.LogManager;
+import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants;
+import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LogManagerTest {
+
+    protected static final String TEST_CONFIG_FILE_NAME = "src/main/resources/cc.conf";
+    private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
+    private static final String PREPARE_NEXT_LOG_FILE_METHOD = "prepareNextLogFile";
+    private static final String ENSURE_LAST_PAGE_FLUSHED_METHOD = "ensureLastPageFlushed";
+
+    @Before
+    public void setUp() throws Exception {
+        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_NAME);
+        integrationUtil.init(true, TEST_CONFIG_FILE_NAME);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        integrationUtil.deinit(true);
+    }
+
+    @Test
+    public void interruptedLogPageSwitch() throws Exception {
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) integrationUtil.ncs[0].getApplicationContext();
+        final String nodeId = ncAppCtx.getServiceContext().getNodeId();
+
+        final String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        final Dataset dataset = TestDataUtil.getDataset(integrationUtil, datasetName);
+        final String indexPath = TestDataUtil.getIndexPath(integrationUtil, dataset, nodeId);
+        final IDatasetLifecycleManager dclm = ncAppCtx.getDatasetLifecycleManager();
+        dclm.open(indexPath);
+        final ILSMIndex index = (ILSMIndex) dclm.get(indexPath);
+        final long resourceId = ncAppCtx.getLocalResourceRepository().get(indexPath).getId();
+        final DatasetLocalResource datasetLocalResource =
+                (DatasetLocalResource) ncAppCtx.getLocalResourceRepository().get(indexPath).getResource();
+        final ITransactionContext txnCtx = beingTransaction(ncAppCtx, index, resourceId);
+        final ILogManager logManager = ncAppCtx.getTransactionSubsystem().getLogManager();
+        final ILockManager lockManager = ncAppCtx.getTransactionSubsystem().getLockManager();
+        final DatasetId datasetId = new DatasetId(dataset.getDatasetId());
+        final int[] pkFields = dataset.getPrimaryBloomFilterFields();
+        final int fieldsLength = pkFields.length;
+        final TestTupleReference tuple = new TestTupleReference(fieldsLength);
+        tuple.getFields()[0].getDataOutput().write(1);
+        final int partition = datasetLocalResource.getPartition();
+
+        // ensure interrupted thread will be interrupted on allocating next log page
+        final AtomicBoolean interrupted = new AtomicBoolean(false);
+        Thread interruptedTransactor = new Thread(() -> {
+            Thread.currentThread().interrupt();
+            try {
+                for (int i = 0; i < 10000; i++) {
+                    lockManager.lock(datasetId, i, LockManagerConstants.LockMode.S, txnCtx);
+                    LogRecord logRecord = new LogRecord();
+                    TransactionUtil.formEntityCommitLogRecord(logRecord, txnCtx, datasetId.getId(), i, tuple, pkFields,
+                            partition, LogType.ENTITY_COMMIT);
+                    logManager.log(logRecord);
+                }
+            } catch (ACIDException e) {
+                Throwable rootCause = ExceptionUtils.getRootCause(e);
+                if (rootCause instanceof java.lang.InterruptedException) {
+                    interrupted.set(true);
+                }
+            }
+        });
+        interruptedTransactor.start();
+        interruptedTransactor.join();
+        Assert.assertTrue(interrupted.get());
+
+        // ensure next thread will be able to allocate next page
+        final AtomicInteger failCount = new AtomicInteger(0);
+        Thread transactor = new Thread(() -> {
+            try {
+                for (int i = 0; i < 10000; i++) {
+                    lockManager.lock(datasetId, i, LockManagerConstants.LockMode.S, txnCtx);
+                    LogRecord logRecord = new LogRecord();
+                    TransactionUtil.formEntityCommitLogRecord(logRecord, txnCtx, datasetId.getId(), i, tuple, pkFields,
+                            partition, LogType.ENTITY_COMMIT);
+                    logManager.log(logRecord);
+                }
+            } catch (Exception e) {
+                failCount.incrementAndGet();
+            }
+        });
+        transactor.start();
+        transactor.join();
+        Assert.assertEquals(0, failCount.get());
+    }
+
+    @Test
+    public void interruptedLogFileSwitch() throws Exception {
+        final INcApplicationContext ncAppCtx = (INcApplicationContext) integrationUtil.ncs[0].getApplicationContext();
+        final LogManager logManager = (LogManager) ncAppCtx.getTransactionSubsystem().getLogManager();
+        int logFileCountBeforeInterrupt = logManager.getLogFileIds().size();
+
+        // ensure an interrupted transactor will create next log file but will fail to position the log channel
+        final AtomicBoolean failed = new AtomicBoolean(false);
+        Thread interruptedTransactor = new Thread(() -> {
+            Thread.currentThread().interrupt();
+            try {
+                prepareNextLogFile(logManager);
+            } catch (Exception e) {
+                failed.set(true);
+            }
+        });
+        interruptedTransactor.start();
+        interruptedTransactor.join();
+        // ensure a new log file was created and survived interrupt
+        int logFileCountAfterInterrupt = logManager.getLogFileIds().size();
+        Assert.assertEquals(logFileCountBeforeInterrupt + 1, logFileCountAfterInterrupt);
+        Assert.assertFalse(failed.get());
+
+        // make sure we can still log to the new file
+        interruptedLogPageSwitch();
+    }
+
+    private static ITransactionContext beingTransaction(INcApplicationContext ncAppCtx, ILSMIndex index,
+            long resourceId) {
+        final TxnId txnId = new TxnId(1);
+        final TransactionOptions options = new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL);
+        final ITransactionManager transactionManager = ncAppCtx.getTransactionSubsystem().getTransactionManager();
+        final ITransactionContext txnCtx = transactionManager.beginTransaction(txnId, options);
+        txnCtx.register(resourceId, 0, index, NoOpOperationCallback.INSTANCE, true);
+        return txnCtx;
+    }
+
+    private static void prepareNextLogFile(LogManager logManager) throws Exception {
+        Method ensureLastPageFlushed;
+        Method prepareNextLogFile;
+        String targetMethod = null;
+        try {
+            targetMethod = ENSURE_LAST_PAGE_FLUSHED_METHOD;
+            ensureLastPageFlushed = LogManager.class.getDeclaredMethod(targetMethod, null);
+            targetMethod = PREPARE_NEXT_LOG_FILE_METHOD;
+            prepareNextLogFile = LogManager.class.getDeclaredMethod(targetMethod, null);
+        } catch (Exception e) {
+            throw new IllegalStateException("Couldn't find " + targetMethod + " in LogManager. Was it renamed?");
+        }
+        ensureLastPageFlushed.setAccessible(true);
+        ensureLastPageFlushed.invoke(logManager, null);
+        prepareNextLogFile.setAccessible(true);
+        prepareNextLogFile.invoke(logManager, null);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
index 723786c..05e5aad 100644
--- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
+++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/txn/RecoveryManagerTest.java
@@ -19,51 +19,38 @@
 package org.apache.asterix.test.txn;
 
 import java.io.File;
-import java.io.InputStream;
-import java.util.Random;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.asterix.api.common.AsterixHyracksIntegrationUtil;
+import org.apache.asterix.common.TestDataUtil;
 import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Property;
+import org.apache.asterix.common.config.StorageProperties;
 import org.apache.asterix.common.utils.Servlets;
 import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.metadata.bootstrap.MetadataBuiltinEntities;
 import org.apache.asterix.test.common.TestHelper;
-import org.apache.asterix.testframework.context.TestCaseContext;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
 public class RecoveryManagerTest {
 
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-    private static final String DEFAULT_TEST_CONFIG_FILE_NAME = "asterix-build-configuration.xml";
-    private static final String TEST_CONFIG_FILE_NAME = "asterix-test-configuration.xml";
-    private static final String TEST_CONFIG_PATH =
-            System.getProperty("user.dir") + File.separator + "target" + File.separator + "config";
+    private static final String TEST_CONFIG_FILE_NAME = "cc.conf";
+    private static final String TEST_CONFIG_PATH = System.getProperty("user.dir") + File.separator + "src"
+            + File.separator + "main" + File.separator + "resources";
     private static final String TEST_CONFIG_FILE_PATH = TEST_CONFIG_PATH + File.separator + TEST_CONFIG_FILE_NAME;
-    private static final TestExecutor testExecutor = new TestExecutor();
     private static final AsterixHyracksIntegrationUtil integrationUtil = new AsterixHyracksIntegrationUtil();
-    private static final Random random = new Random();
-    private static final int numRecords = 1;
 
     @Before
     public void setUp() throws Exception {
-        // Read default test configurations
-        AsterixConfiguration ac = TestHelper.getConfigurations(DEFAULT_TEST_CONFIG_FILE_NAME);
-        // override memory config to enforce dataset eviction
-        ac.getProperty().add(new Property("storage.memorycomponent.globalbudget", "128MB", ""));
-        ac.getProperty().add(new Property("storage.memorycomponent.numpages", "32", ""));
-        // Write test config file
-        TestHelper.writeConfigurations(ac, TEST_CONFIG_FILE_PATH);
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY, TEST_CONFIG_FILE_PATH);
+        integrationUtil.addOption(StorageProperties.Option.STORAGE_MAX_ACTIVE_WRITABLE_DATASETS, 20);
         integrationUtil.setGracefulShutdown(false);
-        integrationUtil.init(true);
+        integrationUtil.init(true, TEST_CONFIG_FILE_PATH);
     }
 
     @After
@@ -74,52 +61,53 @@
     @Test
     public void multiDatasetRecovery() throws Exception {
         String datasetNamePrefix = "ds_";
-        final TestCaseContext.OutputFormat format = TestCaseContext.OutputFormat.CLEAN_JSON;
-        testExecutor.executeSqlppUpdateOrDdl("CREATE TYPE KeyType AS { id: int };", format);
         int numDatasets = 50;
         String datasetName = null;
         for (int i = 1; i <= numDatasets; i++) {
             datasetName = datasetNamePrefix + i;
-            testExecutor.executeSqlppUpdateOrDdl("CREATE DATASET " + datasetName + "(KeyType) PRIMARY KEY id;", format);
-            insertData(datasetName);
+            TestDataUtil.createIdOnlyDataset(datasetName);
+            TestDataUtil.upsertData(datasetName, 10);
         }
+        final long countBeforeFirstRecovery = TestDataUtil.getDatasetCount(datasetName);
         // do ungraceful shutdown to enforce recovery
         integrationUtil.deinit(false);
-        integrationUtil.init(false);
-        validateRecovery(datasetName);
-
+        integrationUtil.init(false, TEST_CONFIG_FILE_PATH);
+        final long countAfterFirstRecovery = TestDataUtil.getDatasetCount(datasetName);
+        Assert.assertEquals(countBeforeFirstRecovery, countAfterFirstRecovery);
         // create more datasets after recovery
         numDatasets = 100;
         for (int i = 51; i <= numDatasets; i++) {
             datasetName = datasetNamePrefix + i;
-            testExecutor.executeSqlppUpdateOrDdl("CREATE DATASET " + datasetName + "(KeyType) PRIMARY KEY id;", format);
-            insertData(datasetName);
+            TestDataUtil.createIdOnlyDataset(datasetName);
+            TestDataUtil.upsertData(datasetName, 1);
         }
+        final long countBeforeSecondRecovery = TestDataUtil.getDatasetCount(datasetName);
         // do ungraceful shutdown to enforce recovery again
         integrationUtil.deinit(false);
-        integrationUtil.init(false);
-        validateRecovery(datasetName);
+        integrationUtil.init(false, TEST_CONFIG_FILE_PATH);
+        final long countAfterSecondRecovery = TestDataUtil.getDatasetCount(datasetName);
+        Assert.assertEquals(countBeforeSecondRecovery, countAfterSecondRecovery);
     }
 
-    private void insertData(String datasetName) throws Exception {
-        for (int i = 0; i < numRecords; i++) {
-            testExecutor.executeSqlppUpdateOrDdl("UPSERT INTO " + datasetName + " ({\"id\": " + random.nextInt() + "})",
-                    TestCaseContext.OutputFormat.CLEAN_JSON);
-        }
+    @Test
+    public void reoveryAfterRebalance() throws Exception {
+        String datasetName = "ds";
+        TestDataUtil.createIdOnlyDataset(datasetName);
+        TestDataUtil.upsertData(datasetName, 10);
+        final long countBeforeRebalance = TestDataUtil.getDatasetCount(datasetName);
+        // rebalance dataset to single nc
+        TestDataUtil.rebalanceDataset(integrationUtil, MetadataBuiltinEntities.DEFAULT_DATAVERSE.getDataverseName(),
+                datasetName, new String[] { "asterix_nc2" });
+        // check data after rebalance
+        final long countAfterRebalance = TestDataUtil.getDatasetCount(datasetName);
+        Assert.assertEquals(countBeforeRebalance, countAfterRebalance);
+        // insert data after rebalance
+        TestDataUtil.upsertData(datasetName, 20);
+        final long countBeforeRecovery = TestDataUtil.getDatasetCount(datasetName);
+        // do ungraceful shutdown to enforce recovery
+        integrationUtil.deinit(false);
+        integrationUtil.init(false, TEST_CONFIG_FILE_PATH);
+        final long countAfterRecovery = TestDataUtil.getDatasetCount(datasetName);
+        Assert.assertEquals(countBeforeRecovery, countAfterRecovery);
     }
-
-    private void validateRecovery(String datasetName) throws Exception {
-        final String query = "select value count(*) from `" + datasetName + "`;";
-        final InputStream inputStream = testExecutor
-                .executeQueryService(query, testExecutor.getEndpoint(Servlets.QUERY_SERVICE),
-                        TestCaseContext.OutputFormat.CLEAN_JSON);
-        final ObjectNode jsonNodes = OBJECT_MAPPER.readValue(inputStream, ObjectNode.class);
-        JsonNode result = jsonNodes.get("results");
-        // make sure there is result
-        Assert.assertEquals(1, result.size());
-        for (int i = 0; i < result.size(); i++) {
-            JsonNode json = result.get(i);
-            Assert.assertEquals(numRecords, json.asInt());
-        }
-    }
-}
\ No newline at end of file
+}
diff --git a/asterixdb/asterix-app/src/test/resources/cc-multipart.conf b/asterixdb/asterix-app/src/test/resources/cc-multipart.conf
new file mode 100644
index 0000000..5cf1bbe
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/cc-multipart.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.subdir=test_storage
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+messaging.frame.size=4096
+messaging.frame.count=512
diff --git a/asterixdb/asterix-app/src/test/resources/cc-small-txn-log-partition.conf b/asterixdb/asterix-app/src/test/resources/cc-small-txn-log-partition.conf
new file mode 100644
index 0000000..6cd3b87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/cc-small-txn-log-partition.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=target/tmp/asterix_nc1/iodevice1,target/tmp/asterix_nc1/iodevice2
+nc.api.port=19004
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=target/tmp/asterix_nc2/iodevice1,target/tmp/asterix_nc2/iodevice2
+nc.api.port=19005
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=128MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+messaging.frame.size=4096
+messaging.frame.count=512
+txn.log.partitionsize=2MB
+txn.log.checkpoint.pollfrequency=2147483647
+storage.max.active.writable.datasets=50
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/cc-stringoffset.conf b/asterixdb/asterix-app/src/test/resources/cc-stringoffset.conf
new file mode 100644
index 0000000..ef38fc2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/cc-stringoffset.conf
@@ -0,0 +1,59 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+; Overrides string offset to be 1 instead of 0
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+compiler.stringoffset=1
+messaging.frame.size=4096
+messaging.frame.count=512
+
diff --git a/asterixdb/asterix-app/src/test/resources/cc.conf b/asterixdb/asterix-app/src/test/resources/cc.conf
new file mode 100644
index 0000000..5cf1bbe
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/cc.conf
@@ -0,0 +1,56 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=target/tmp/asterix_nc1/txnlog
+core.dump.dir=target/tmp/asterix_nc1/coredump
+iodevices=target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+nc.api.port=19004
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=target/tmp/asterix_nc2/txnlog
+core.dump.dir=target/tmp/asterix_nc2/coredump
+iodevices=target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+nc.api.port=19005
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.subdir=test_storage
+storage.buffercache.pagesize=32KB
+storage.buffercache.size=48MB
+storage.memorycomponent.globalbudget=512MB
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+compiler.framesize=32KB
+compiler.sortmemory=320KB
+compiler.groupmemory=160KB
+compiler.joinmemory=256KB
+messaging.frame.size=4096
+messaging.frame.count=512
diff --git a/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml b/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml
new file mode 100644
index 0000000..c6ecd7d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/log4j2-asterixdb-test.xml
@@ -0,0 +1,45 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in complianceo
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+    <File name="InfoLog" fileName="target/info.log">
+        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </File>
+    <Console name="ConsoleTest" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="WARN">
+      <AppenderRef ref="InfoLog"/>
+    </Root>
+    <Logger name="org.apache.hyracks.control.nc.service" level="INFO"/>
+    <Logger name="org.apache.hyracks" level="INFO"/>
+    <Logger name="org.apache.asterix" level="INFO"/>
+    <Logger name="org.apache.hyracks.test" level="INFO">
+      <AppenderRef ref="ConsoleTest"/>
+    </Logger>
+    <Logger name="org.apache.asterix.test" level="INFO">
+      <AppenderRef ref="ConsoleTest"/>
+    </Logger>
+  </Loggers>
+</Configuration>
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.1.ddl.aql
deleted file mode 100644
index 6674622..0000000
--- a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.1.ddl.aql
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a temporary dataset and verify the dataset does not exist in the metadata store
- * Expected Res : Success
- * Date         : March 12 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type LineItemType as closed {
-  l_orderkey: int64,
-  l_partkey: int64,
-  l_suppkey: int64,
-  l_linenumber: int64,
-  l_quantity: double,
-  l_extendedprice: double,
-  l_discount: double,
-  l_tax: double,
-  l_returnflag: string,
-  l_linestatus: string,
-  l_shipdate: string,
-  l_commitdate: string,
-  l_receiptdate: string,
-  l_shipinstruct: string,
-  l_shipmode: string,
-  l_comment: string
-}
-
-create temporary dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber;
-
-
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.2.update.aql b/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.2.update.aql
deleted file mode 100644
index 3e06e46..0000000
--- a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create dataverse and drop that dataverse and verify dataverse entries in metadata
- * Expected Res : Success
- * Date         : Sep 17 2012
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.3.query.aql b/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.3.query.aql
deleted file mode 100644
index 9d77309..0000000
--- a/asterixdb/asterix-app/src/test/resources/metadata/queries/basic/temp_dataset/temp_dataset.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create dataverse and drop that dataverse and verify dataverse entries in metadata
- * Expected Res : Success
- * Date         : Sep 17 2012
- */
-
-
-for $l in dataset('Metadata.Dataset')
-where $l.DataverseName = 'test'
-return $l;
-
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/meta06/meta06.1.adm b/asterixdb/asterix-app/src/test/resources/metadata/results/basic/meta06/meta06.1.adm
index 58f5b77..8be6cbc 100644
--- a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/meta06/meta06.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/metadata/results/basic/meta06/meta06.1.adm
@@ -1 +1 @@
-{ "DataverseName": "testdv", "Name": "fun01", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "\"This is an AQL Bodied UDF\"", "Language": "AQL", "Kind": "SCALAR" }
+{ "DataverseName": "testdv", "Name": "fun01", "Arity": "0", "Params": [  ], "ReturnType": "VOID", "Definition": "\"This is an AQL Bodied UDF\"", "Language": "AQL", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/metadata_datatype/metadata_datatype.1.adm b/asterixdb/asterix-app/src/test/resources/metadata/results/basic/metadata_datatype/metadata_datatype.1.adm
index 7229aa8..822d2c3 100644
--- a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/metadata_datatype/metadata_datatype.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/metadata/results/basic/metadata_datatype/metadata_datatype.1.adm
@@ -1,66 +1,69 @@
-{ "DataverseName": "Metadata", "DatatypeName": "AnyObject", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [  ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "CompactionPolicyRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicy", "FieldType": "string", "IsNullable": false }, { "FieldName": "Classname", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeDataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetType", "FieldType": "string", "IsNullable": false }, { "FieldName": "GroupName", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicy", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicyProperties", "FieldType": "DatasetRecordType_CompactionPolicyProperties", "IsNullable": false }, { "FieldName": "InternalDetails", "FieldType": "DatasetRecordType_InternalDetails", "IsNullable": true }, { "FieldName": "ExternalDetails", "FieldType": "DatasetRecordType_ExternalDetails", "IsNullable": true }, { "FieldName": "Hints", "FieldType": "DatasetRecordType_Hints", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetId", "FieldType": "int32", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_CompactionPolicyProperties", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_CompactionPolicyProperties_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_CompactionPolicyProperties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DatasourceAdapter", "FieldType": "string", "IsNullable": false }, { "FieldName": "Properties", "FieldType": "DatasetRecordType_ExternalDetails_Properties", "IsNullable": false }, { "FieldName": "LastRefreshTime", "FieldType": "datetime", "IsNullable": false }, { "FieldName": "TransactionState", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails_Properties", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_ExternalDetails_Properties_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails_Properties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_Hints", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "DatasetRecordType_Hints_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_Hints_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "FileStructure", "FieldType": "string", "IsNullable": false }, { "FieldName": "PartitioningStrategy", "FieldType": "string", "IsNullable": false }, { "FieldName": "PartitioningKey", "FieldType": "DatasetRecordType_InternalDetails_PartitioningKey", "IsNullable": false }, { "FieldName": "PrimaryKey", "FieldType": "DatasetRecordType_InternalDetails_PrimaryKey", "IsNullable": false }, { "FieldName": "Autogenerated", "FieldType": "boolean", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PartitioningKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_InternalDetails_PartitioningKey_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PartitioningKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PrimaryKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_InternalDetails_PrimaryKey_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PrimaryKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatasourceAdapterRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Classname", "FieldType": "string", "IsNullable": false }, { "FieldName": "Type", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Derived", "FieldType": "DatatypeRecordType_Derived", "IsNullable": true }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Tag", "FieldType": "string", "IsNullable": false }, { "FieldName": "IsAnonymous", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Record", "FieldType": "DatatypeRecordType_Derived_Record", "IsNullable": true }, { "FieldName": "UnorderedList", "FieldType": "string", "IsNullable": true }, { "FieldName": "OrderedList", "FieldType": "string", "IsNullable": true } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "IsOpen", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Fields", "FieldType": "DatatypeRecordType_Derived_Record_Fields", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record_Fields", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatatypeRecordType_Derived_Record_Fields_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record_Fields_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "FieldName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FieldType", "FieldType": "string", "IsNullable": false }, { "FieldName": "IsNullable", "FieldType": "boolean", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "DataverseRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DataFormat", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "ExternalFileRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FileNumber", "FieldType": "int32", "IsNullable": false }, { "FieldName": "FileName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FileSize", "FieldType": "int64", "IsNullable": false }, { "FieldName": "FileModTime", "FieldType": "datetime", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedConnectionRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FeedName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "ReturnType", "FieldType": "string", "IsNullable": false }, { "FieldName": "AppliedFunctions", "FieldType": "FeedConnectionRecordType_AppliedFunctions", "IsNullable": false }, { "FieldName": "PolicyName", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedConnectionRecordType_AppliedFunctions", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "PolicyName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Description", "FieldType": "string", "IsNullable": false }, { "FieldName": "Properties", "FieldType": "FeedPolicyRecordType_Properties", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType_Properties", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "FeedPolicyRecordType_Properties_Item" }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType_Properties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FeedName", "FieldType": "string", "IsNullable": false }, { "FieldName": "AdapterName", "FieldType": "string", "IsNullable": false }, { "FieldName": "AdapterConfiguration", "FieldType": "FeedRecordType_AdapterConfiguration", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType_AdapterConfiguration", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "FeedRecordType_AdapterConfiguration_Item" }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType_AdapterConfiguration_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Arity", "FieldType": "string", "IsNullable": false }, { "FieldName": "Params", "FieldType": "FunctionRecordType_Params", "IsNullable": false }, { "FieldName": "ReturnType", "FieldType": "string", "IsNullable": false }, { "FieldName": "Definition", "FieldType": "string", "IsNullable": false }, { "FieldName": "Language", "FieldType": "string", "IsNullable": false }, { "FieldName": "Kind", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType_Params", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "IndexName", "FieldType": "string", "IsNullable": false }, { "FieldName": "IndexStructure", "FieldType": "string", "IsNullable": false }, { "FieldName": "SearchKey", "FieldType": "IndexRecordType_SearchKey", "IsNullable": false }, { "FieldName": "IsPrimary", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType_SearchKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "IndexRecordType_SearchKey_Item" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType_SearchKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "LibraryRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:22 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "NodeGroupRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "GroupName", "FieldType": "string", "IsNullable": false }, { "FieldName": "NodeNames", "FieldType": "NodeGroupRecordType_NodeNames", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "NodeGroupRecordType_NodeNames", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "string" }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "NodeRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "NodeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "NumberOfCores", "FieldType": "int64", "IsNullable": false }, { "FieldName": "WorkingMemorySize", "FieldType": "int64", "IsNullable": false } ] } }, "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "binary", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "boolean", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "circle", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "date", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "datetime", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "day-time-duration", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "double", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "duration", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "float", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "int16", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "int32", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "int64", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "int8", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "interval", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "line", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "missing", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "null", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "point", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "point3d", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "polygon", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "rectangle", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "shortwithouttypeinfo", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "string", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "time", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "uuid", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
-{ "DataverseName": "Metadata", "DatatypeName": "year-month-duration", "Timestamp": "Fri Oct 21 10:29:21 PDT 2016" }
+{ "DataverseName": "Metadata", "DatatypeName": "AnyObject", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [  ] } }, "Timestamp": "Mon Jan 08 10:27:05 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "CompactionPolicyRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicy", "FieldType": "string", "IsNullable": false }, { "FieldName": "Classname", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeDataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetType", "FieldType": "string", "IsNullable": false }, { "FieldName": "GroupName", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicy", "FieldType": "string", "IsNullable": false }, { "FieldName": "CompactionPolicyProperties", "FieldType": "DatasetRecordType_CompactionPolicyProperties", "IsNullable": false }, { "FieldName": "InternalDetails", "FieldType": "DatasetRecordType_InternalDetails", "IsNullable": true }, { "FieldName": "ExternalDetails", "FieldType": "DatasetRecordType_ExternalDetails", "IsNullable": true }, { "FieldName": "Hints", "FieldType": "DatasetRecordType_Hints", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetId", "FieldType": "int32", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_CompactionPolicyProperties", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_CompactionPolicyProperties_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_CompactionPolicyProperties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DatasourceAdapter", "FieldType": "string", "IsNullable": false }, { "FieldName": "Properties", "FieldType": "DatasetRecordType_ExternalDetails_Properties", "IsNullable": false }, { "FieldName": "LastRefreshTime", "FieldType": "datetime", "IsNullable": false }, { "FieldName": "TransactionState", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails_Properties", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_ExternalDetails_Properties_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_ExternalDetails_Properties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_Hints", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "DatasetRecordType_Hints_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_Hints_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "FileStructure", "FieldType": "string", "IsNullable": false }, { "FieldName": "PartitioningStrategy", "FieldType": "string", "IsNullable": false }, { "FieldName": "PartitioningKey", "FieldType": "DatasetRecordType_InternalDetails_PartitioningKey", "IsNullable": false }, { "FieldName": "PrimaryKey", "FieldType": "DatasetRecordType_InternalDetails_PrimaryKey", "IsNullable": false }, { "FieldName": "Autogenerated", "FieldType": "boolean", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PartitioningKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_InternalDetails_PartitioningKey_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PartitioningKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PrimaryKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatasetRecordType_InternalDetails_PrimaryKey_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasetRecordType_InternalDetails_PrimaryKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatasourceAdapterRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Classname", "FieldType": "string", "IsNullable": false }, { "FieldName": "Type", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatatypeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Derived", "FieldType": "DatatypeRecordType_Derived", "IsNullable": true }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Tag", "FieldType": "string", "IsNullable": false }, { "FieldName": "IsAnonymous", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Record", "FieldType": "DatatypeRecordType_Derived_Record", "IsNullable": true }, { "FieldName": "UnorderedList", "FieldType": "string", "IsNullable": true }, { "FieldName": "OrderedList", "FieldType": "string", "IsNullable": true } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "IsOpen", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Fields", "FieldType": "DatatypeRecordType_Derived_Record_Fields", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record_Fields", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "DatatypeRecordType_Derived_Record_Fields_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DatatypeRecordType_Derived_Record_Fields_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "FieldName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FieldType", "FieldType": "string", "IsNullable": false }, { "FieldName": "IsNullable", "FieldType": "boolean", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "DataverseRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DataFormat", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "ExternalFileRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FileNumber", "FieldType": "int32", "IsNullable": false }, { "FieldName": "FileName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FileSize", "FieldType": "int64", "IsNullable": false }, { "FieldName": "FileModTime", "FieldType": "datetime", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedConnectionRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FeedName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "ReturnType", "FieldType": "string", "IsNullable": false }, { "FieldName": "AppliedFunctions", "FieldType": "FeedConnectionRecordType_AppliedFunctions", "IsNullable": false }, { "FieldName": "PolicyName", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedConnectionRecordType_AppliedFunctions", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "PolicyName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Description", "FieldType": "string", "IsNullable": false }, { "FieldName": "Properties", "FieldType": "FeedPolicyRecordType_Properties", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType_Properties", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "FeedPolicyRecordType_Properties_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedPolicyRecordType_Properties_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "FeedName", "FieldType": "string", "IsNullable": false }, { "FieldName": "AdapterConfiguration", "FieldType": "FeedRecordType_AdapterConfiguration", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType_AdapterConfiguration", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "FeedRecordType_AdapterConfiguration_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FeedRecordType_AdapterConfiguration_Item", "Derived": { "Tag": "RECORD", "IsAnonymous": true, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Value", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Arity", "FieldType": "string", "IsNullable": false }, { "FieldName": "Params", "FieldType": "FunctionRecordType_Params", "IsNullable": false }, { "FieldName": "ReturnType", "FieldType": "string", "IsNullable": false }, { "FieldName": "Definition", "FieldType": "string", "IsNullable": false }, { "FieldName": "Language", "FieldType": "string", "IsNullable": false }, { "FieldName": "Kind", "FieldType": "string", "IsNullable": false }, { "FieldName": "Dependencies", "FieldType": "FunctionRecordType_Dependencies", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType_Dependencies", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "FunctionRecordType_Dependencies_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType_Dependencies_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "FunctionRecordType_Dependencies_Item_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType_Dependencies_Item_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "FunctionRecordType_Params", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "DatasetName", "FieldType": "string", "IsNullable": false }, { "FieldName": "IndexName", "FieldType": "string", "IsNullable": false }, { "FieldName": "IndexStructure", "FieldType": "string", "IsNullable": false }, { "FieldName": "SearchKey", "FieldType": "IndexRecordType_SearchKey", "IsNullable": false }, { "FieldName": "IsPrimary", "FieldType": "boolean", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false }, { "FieldName": "PendingOp", "FieldType": "int32", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType_SearchKey", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "IndexRecordType_SearchKey_Item" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "IndexRecordType_SearchKey_Item", "Derived": { "Tag": "ORDEREDLIST", "IsAnonymous": true, "OrderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "LibraryRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "DataverseName", "FieldType": "string", "IsNullable": false }, { "FieldName": "Name", "FieldType": "string", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "NodeGroupRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "GroupName", "FieldType": "string", "IsNullable": false }, { "FieldName": "NodeNames", "FieldType": "NodeGroupRecordType_NodeNames", "IsNullable": false }, { "FieldName": "Timestamp", "FieldType": "string", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "NodeGroupRecordType_NodeNames", "Derived": { "Tag": "UNORDEREDLIST", "IsAnonymous": true, "UnorderedList": "string" }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "NodeRecordType", "Derived": { "Tag": "RECORD", "IsAnonymous": false, "Record": { "IsOpen": true, "Fields": [ { "FieldName": "NodeName", "FieldType": "string", "IsNullable": false }, { "FieldName": "NumberOfCores", "FieldType": "int64", "IsNullable": false }, { "FieldName": "WorkingMemorySize", "FieldType": "int64", "IsNullable": false } ] } }, "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "binary", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "boolean", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "circle", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "date", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "datetime", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "day-time-duration", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "double", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "duration", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "float", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "int16", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "int32", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "int64", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "int8", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "interval", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "line", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "missing", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "null", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "point", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "point3d", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "polygon", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "rectangle", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "shortwithouttypeinfo", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "string", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "time", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "uuid", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
+{ "DataverseName": "Metadata", "DatatypeName": "year-month-duration", "Timestamp": "Mon Jan 08 10:27:04 PST 2018" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/temp_dataset/temp_dataset.1.adm b/asterixdb/asterix-app/src/test/resources/metadata/results/basic/temp_dataset/temp_dataset.1.adm
deleted file mode 100644
index 8b13789..0000000
--- a/asterixdb/asterix-app/src/test/resources/metadata/results/basic/temp_dataset/temp_dataset.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/asterixdb/asterix-app/src/test/resources/metadata/testsuite.xml b/asterixdb/asterix-app/src/test/resources/metadata/testsuite.xml
index 02efe62..036a4bc 100644
--- a/asterixdb/asterix-app/src/test/resources/metadata/testsuite.xml
+++ b/asterixdb/asterix-app/src/test/resources/metadata/testsuite.xml
@@ -324,11 +324,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="basic">
-      <compilation-unit name="temp_dataset">
-        <output-dir compare="Text">temp_dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="basic">
       <compilation-unit name="issue_1419_drop_type_with_collection_1">
         <output-dir compare="Text">issue_1419_drop_type_with_collection</output-dir>
       </compilation-unit>
diff --git a/asterixdb/asterix-app/src/test/resources/old-optimizerts/queries/j-cust-subplan.aql b/asterixdb/asterix-app/src/test/resources/old-optimizerts/queries/j-cust-subplan.aql
index 31087a8..646a2d4 100644
--- a/asterixdb/asterix-app/src/test/resources/old-optimizerts/queries/j-cust-subplan.aql
+++ b/asterixdb/asterix-app/src/test/resources/old-optimizerts/queries/j-cust-subplan.aql
@@ -18,5 +18,5 @@
  */
 for $c in recordset(['cid', 'int32', 'name', 'string', 'age', 'int32'], 'osfiles', ['asterix_nc1', 'data/spj01/cust1.adm'], ['asterix_nc2', 'data/spj01/cust2.adm'])
 where some $c2 in [ $c ]
-      satisfies substring($c2.name, 1, 1) = "J"
+      satisfies substring($c2.name, 0, 1) = "J"
 return $c
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/gby_partitioning_property_01.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/gby_partitioning_property_01.sqlpp
new file mode 100644
index 0000000..1777301
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/gby_partitioning_property_01.sqlpp
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+create type UserType as {
+  id: string
+};
+
+create type MessageType as {
+  id: string
+};
+
+create dataset GleambookUsers(UserType) primary key id;
+
+create dataset GleambookMessages(MessageType) primary key id;
+
+select meta(user).id as id, count(*) as count
+from `GleambookUsers` user, `GleambookMessages` message
+where meta(user).id = message.author_id
+group by meta(user).id;
+
+drop  dataverse test;
+
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/nested-index/btree-index-join/ASTERIXDB-2199.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/nested-index/btree-index-join/ASTERIXDB-2199.sqlpp
new file mode 100644
index 0000000..b1dae7c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/nested-index/btree-index-join/ASTERIXDB-2199.sqlpp
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ *  Description     : This test checks whether PushFieldAccessRule works for nested keys
+ *  Expected Result : Success
+ *  Date            : 21st Dec 2017
+ */
+
+DROP DATAVERSE Facebook IF EXISTS;
+CREATE DATAVERSE Facebook;
+Use Facebook;
+
+CREATE TYPE PersonType AS closed
+{ id:string };
+
+CREATE TYPE PersonType2 AS closed
+{ id: PersonType };
+
+CREATE TYPE PersonType3 AS closed
+{ id:PersonType2};
+
+CREATE TYPE FriendshipType AS closed
+{ person : PersonType3, Friends :[PersonType3] };
+
+CREATE DATASET Friendship(FriendshipType)
+PRIMARY KEY person.id.id.id;
+
+select * from Friendship first, Friendship second where first.person.id.id.id = second.person.id.id.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-issue562.aql b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-issue562.aql
index 789cbe0..86e5d4c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-issue562.aql
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/query-issue562.aql
@@ -72,12 +72,12 @@
 
 create dataset Orders(OrderType)
   primary key o_orderkey;
-create dataset Customer(CustomerType) 
+create dataset Customer(CustomerType)
   primary key c_custkey;
 
 declare function q22_customer_tmp() {
   for $c in dataset('Customer')
-  let $phone_substr := substring($c.c_phone, 1, 2)
+  let $phone_substr := substring($c.c_phone, 0, 2)
   where $phone_substr = '13'
     or $phone_substr = '31'
     or $phone_substr = '23'
@@ -94,7 +94,7 @@
 
 let $avg := avg(
   for $c in dataset('Customer')
-  let $phone_substr := substring($c.c_phone, 1, 2)
+  let $phone_substr := substring($c.c_phone, 0, 2)
   where $c.c_acctbal > 0.00
     and ($phone_substr = '13'
     or $phone_substr = '31'
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/exists.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/exists.sqlpp
index 74573b9..2bbc134 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/exists.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/exists.sqlpp
@@ -55,7 +55,7 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, substring(c_phone,1,2) AS cntrycode
+    SELECT c_acctbal, c_custkey, substring(c_phone,0,2) AS cntrycode
     FROM  Customer
 )
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/not_exists.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/not_exists.sqlpp
index 0dfdea0..7c8f918 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/not_exists.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/subquery/not_exists.sqlpp
@@ -55,7 +55,7 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, substring(c_phone,1,2) AS cntrycode
+    SELECT c_acctbal, c_custkey, substring(c_phone,0,2) AS cntrycode
     FROM  Customer
 )
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-64.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-64.sqlpp
new file mode 100644
index 0000000..723a551
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-64.sqlpp
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ *  Description     : BTree Index verification test
+ *                  : This test is intended to verify that the secondary primary BTree index is used for aggregations
+ *                  : in the optimized query plan.
+ *  Expected Result : Success
+ *  Date            : 31st Oct 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+write output to asterix_nc1:"rttest/btree-index_btree-secondary-64.adm";
+create type test.TestType as
+{
+  id : integer,
+  fname : string,
+  lname : string
+};
+
+create dataset testdst(TestType) primary key id;
+
+create primary index on testdst;
+
+select count(*) AS count from testdst;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-65.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-65.sqlpp
new file mode 100644
index 0000000..2de8f5b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-65.sqlpp
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ *  Description     : BTree Index verification test
+ *                  : This test is intended to verify that the secondary primary BTree index is used for aggregations
+ *                  : in the optimized query plan.
+ *  Expected Result : Success
+ *  Date            : 31st Oct 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+write output to asterix_nc1:"rttest/btree-index_btree-secondary-65.adm";
+create type test.TestType as
+{
+  id : integer,
+  fname : string,
+  lname : string
+};
+
+create dataset testdst(TestType) primary key id;
+
+create primary index on testdst;
+
+select count(*) AS count from testdst t where t.id > 3;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-66.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-66.sqlpp
new file mode 100644
index 0000000..800beef
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-66.sqlpp
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ *  Description     : BTree Index verification test
+ *                  : This test is intended to verify that the secondary primary BTree index is used for aggregations
+ *                  : in the optimized query plan.
+ *  Expected Result : Success
+ *  Date            : 31st Oct 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+write output to asterix_nc1:"rttest/btree-index_btree-secondary-66.adm";
+create type test.TestType as
+{
+  id : integer,
+  fname : string,
+  lname : string
+};
+
+create dataset testdst(TestType) primary key id;
+
+create primary index on testdst;
+
+select MAX(t.id) as maximum from testdst t;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-67.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-67.sqlpp
new file mode 100644
index 0000000..89e6697
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/btree-index/btree-secondary-67.sqlpp
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ *  Description     : BTree Index verification test
+ *                  : This test is intended to verify that the secondary primary BTree index is used for aggregations
+ *                  : in the optimized query plan.
+ *  Expected Result : Success
+ *  Date            : 31st Oct 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+write output to asterix_nc1:"rttest/btree-index_btree-secondary-67.adm";
+create type test.TestType as
+{
+  id : integer,
+  fname : string,
+  lname : string
+};
+
+create dataset testdst(TestType) primary key id;
+
+create primary index on testdst;
+
+select count(t.id) as count from testdst t;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/denorm-cust-order.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/denorm-cust-order.sqlpp
index 52ce35c..508d6ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/denorm-cust-order.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/denorm-cust-order.sqlpp
@@ -62,9 +62,9 @@
 create  dataset Orders(OrderType) primary key oid on group1;
 
 write output to asterix_nc1:"/tmp/custorder.adm";
-select element {'cid':cid,'cust':cust,'cnt-orders':count(o),'orders':o}
+select element {'cid':cid,'cust':(from g select c),'cnt-orders':count(o),'orders': (from g select o)}
 from  Customers as c,
       Orders as o
 where (c.cid = o.cid)
-group by c.cid as cid
+group by c.cid as cid group as g
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orderby-desc-using-gby.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orderby-desc-using-gby.sqlpp
index 279adf6..2313e90 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orderby-desc-using-gby.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orderby-desc-using-gby.sqlpp
@@ -52,6 +52,6 @@
 write output to asterix_nc1:"rttest/gby-using-orderby-desc.adm";
 select element {'name':name,'age':age}
 from  Customers as c
-group by c.name as name
+group by c.name as name, c.age as age
 order by name desc,age
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orders-aggreg.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orders-aggreg.sqlpp
index f82ce53..cca0211 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orders-aggreg.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/orders-aggreg.sqlpp
@@ -40,13 +40,13 @@
 create  dataset Orders(OrderType) primary key oid on group1;
 
 write output to asterix_nc1:"/tmp/orders-aggreg.adm";
-select element {'cid':cid,'ordpercust':`orders-aggreg`.coll_count(o),'totalcust':`orders-aggreg`.coll_sum((
-        select element i.total
-        from  o as i
+select element {'cid':cid,'ordpercust':`orders-aggreg`.coll_count(g),'totalcust':`orders-aggreg`.coll_sum((
+        select element i.o.total
+        from  g as i
     )),'avgcust':`orders-aggreg`.coll_avg((
-        select element i.total
-        from  o as i
+        select element i.o.total
+        from  g as i
     ))}
 from  Orders as o
-group by o.cid as cid
+group by o.cid as cid group as g
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/q01_pricing_summary_report_nt.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/q01_pricing_summary_report_nt.sqlpp
index 2cc5d36..6497eea 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/q01_pricing_summary_report_nt.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/q01_pricing_summary_report_nt.sqlpp
@@ -49,30 +49,30 @@
 
 write output to asterix_nc1:"rttest/tpch_q1_pricing_summary_report_nt.adm";
 select element {'l_returnflag':l_returnflag,'l_linestatus':l_linestatus,'sum_qty':tpch.coll_sum((
-        select element i.l_quantity
-        from  l as i
+        select element i.l.l_quantity
+        from  g as i
     )),'sum_base_price':tpch.coll_sum((
-        select element i.l_extendedprice
-        from  l as i
+        select element i.l.l_extendedprice
+        from  g as i
     )),'sum_disc_price':tpch.coll_sum((
-        select element (i.l_extendedprice * (1 - i.l_discount))
-        from  l as i
+        select element (i.l.l_extendedprice * (1 - i.l.l_discount))
+        from  g as i
     )),'sum_charge':tpch.coll_sum((
-        select element (i.l_extendedprice * (1 - i.l_discount) * (1 + i.l_tax))
-        from  l as i
+        select element (i.l.l_extendedprice * (1 - i.l.l_discount) * (1 + i.l.l_tax))
+        from  g as i
     )),'ave_qty':tpch.coll_avg((
-        select element i.l_quantity
-        from  l as i
+        select element i.l.l_quantity
+        from  g as i
     )),'ave_price':tpch.coll_avg((
-        select element i.l_extendedprice
-        from  l as i
+        select element i.l.l_extendedprice
+        from  g as i
     )),'ave_disc':tpch.coll_avg((
-        select element i.l_discount
-        from  l as i
-    )),'count_order':tpch.coll_count(l)}
+        select element i.l.l_discount
+        from  g as i
+    )),'count_order':tpch.coll_count(g)}
 from  LineItem as l
 where (l.l_shipdate <= '1998-09-02')
 /* +hash */
-group by l.l_returnflag as l_returnflag,l.l_linestatus as l_linestatus
+group by l.l_returnflag as l_returnflag,l.l_linestatus as l_linestatus group as g
 order by l_returnflag,l_linestatus
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/query-issue562.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/query-issue562.sqlpp
index 645d320..22bff52 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/query-issue562.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/query-issue562.sqlpp
@@ -82,19 +82,19 @@
 (
     select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':phone_substr}
     from  Customer as c
-    with  phone_substr as tpch.substring(c.c_phone,1,2)
+    with  phone_substr as tpch.substring(c.c_phone,0,2)
     where ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17'))
 )
 };
 with  avg as tpch.coll_avg((
       select element c.c_acctbal
       from  Customer as c
-      with  phone_substr as tpch.substring(c.c_phone,1,2)
+      with  phone_substr as tpch.substring(c.c_phone,0,2)
       where ((c.c_acctbal > 0.0) and ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17')))
   ))
-select element {'cntrycode':cntrycode,'numcust':tpch.coll_count(ct),'totacctbal':tpch.coll_sum((
-        select element i.c_acctbal
-        from  ct as i
+select element {'cntrycode':cntrycode,'numcust':tpch.coll_count(g),'totacctbal':tpch.coll_sum((
+        select element i.ct.c_acctbal
+        from  g as i
     ))}
 from  tpch.q22_customer_tmp() as ct
 where (tpch.coll_count((
@@ -102,6 +102,6 @@
     from  Orders as o
     where (ct.c_custkey = o.o_custkey)
 )) = 0)
-group by ct.cntrycode as cntrycode
+group by ct.cntrycode as cntrycode group as g
 order by cntrycode
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/split-materialization-above-join.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/split-materialization-above-join.sqlpp
index 187e6cb..2f75c10 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/split-materialization-above-join.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries_sqlpp/split-materialization-above-join.sqlpp
@@ -40,7 +40,7 @@
 from  DBLP as paperLeft,
       DBLP as paperRight,
       (
-    select element {'idLeft':idLeft,'idRight':idRight,'sim':sim[0]}
+    select element {'idLeft':idLeft,'idRight':idRight,'sim':g[0].sim[0]}
     from  DBLP as paperLeft,
           fuzzyjoin.`subset-collection`(tokensLeft,0,fuzzyjoin.`prefix-len-jaccard`(lenLeft,0.500000f)) as prefixTokenLeft,
           DBLP as paperRight,
@@ -75,7 +75,7 @@
       ),
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenLeft,tokensLeft,lenRight,tokensRight,prefixTokenLeft,0.500000f)
     where ((prefixTokenLeft = prefixTokenRight) and ((sim >= 0.500000f) and (paperLeft.id < paperRight.id)))
-    group by paperLeft.id as idLeft,paperRight.id as idRight
+    group by paperLeft.id as idLeft,paperRight.id as idRight group as g(sim as sim)
 ) as ridpair
 where ((ridpair.idLeft = paperLeft.id) and (ridpair.idRight = paperRight.id))
 order by paperLeft.id,paperRight.id
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate/constant-gby-agg.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate/constant-gby-agg.plan
index 26601ba..c83a85c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate/constant-gby-agg.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/aggregate/constant-gby-agg.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          -- SORT_GROUP_BY[$$18]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$38]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$14]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$38]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$34]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_01.plan
index 00b6d92..5814a93 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_01.plan
@@ -3,9 +3,10 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- BTREE_SEARCH  |PARTITIONED|
-              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                -- DATASOURCE_SCAN  |PARTITIONED|
-                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- BTREE_SEARCH  |PARTITIONED|
+                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                  -- DATASOURCE_SCAN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_02.plan
index 00b6d92..5814a93 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index-join/primary-composite-key-join_02.plan
@@ -3,9 +3,10 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- BTREE_SEARCH  |PARTITIONED|
-              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                -- DATASOURCE_SCAN  |PARTITIONED|
-                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- BTREE_SEARCH  |PARTITIONED|
+                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                  -- DATASOURCE_SCAN  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-15.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-15.plan
index 6f13ebb..279cc83 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-15.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-15.plan
@@ -1,8 +1,9 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- BTREE_SEARCH  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-16.plan
index 6f13ebb..279cc83 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-16.plan
@@ -1,8 +1,9 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- BTREE_SEARCH  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-19.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-19.plan
index 6f13ebb..279cc83 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-19.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-19.plan
@@ -1,8 +1,9 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- BTREE_SEARCH  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-20.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-20.plan
index 6f13ebb..279cc83 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-20.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-primary-20.plan
@@ -1,8 +1,9 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- BTREE_SEARCH  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-64.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-64.plan
new file mode 100644
index 0000000..d0280bc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-64.plan
@@ -0,0 +1,13 @@
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      -- ASSIGN  |UNPARTITIONED|
+        -- AGGREGATE  |UNPARTITIONED|
+          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- BTREE_SEARCH  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-65.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-65.plan
new file mode 100644
index 0000000..011a15f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-65.plan
@@ -0,0 +1,14 @@
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      -- ASSIGN  |UNPARTITIONED|
+        -- AGGREGATE  |UNPARTITIONED|
+          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- STREAM_PROJECT  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- BTREE_SEARCH  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-66.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-66.plan
new file mode 100644
index 0000000..697008a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-66.plan
@@ -0,0 +1,11 @@
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      -- ASSIGN  |UNPARTITIONED|
+        -- AGGREGATE  |UNPARTITIONED|
+          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-67.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-67.plan
new file mode 100644
index 0000000..697008a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/btree-index/btree-secondary-67.plan
@@ -0,0 +1,11 @@
+-- DISTRIBUTE_RESULT  |UNPARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+    -- STREAM_PROJECT  |UNPARTITIONED|
+      -- ASSIGN  |UNPARTITIONED|
+        -- AGGREGATE  |UNPARTITIONED|
+          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+            -- AGGREGATE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
index 4043a9c..991404c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_inline.plan
@@ -17,7 +17,7 @@
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- HYBRID_HASH_JOIN [$$ccustkey, $$cnationkey][$$24, $$26]  |PARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$ccustkey]  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                               -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
                                       {
                                         -- AGGREGATE  |LOCAL|
@@ -34,7 +34,7 @@
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- HYBRID_HASH_JOIN [$$24][$$22]  |PARTITIONED|
-                                      -- HASH_PARTITION_EXCHANGE [$$24]  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                         -- STREAM_SELECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- PRE_CLUSTERED_GROUP_BY[$$25]  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_partitioning_property_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_partitioning_property_01.plan
new file mode 100644
index 0000000..0d7d538
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/gby_partitioning_property_01.plan
@@ -0,0 +1,36 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$59]  |PARTITIONED|
+                  {
+                    -- AGGREGATE  |LOCAL|
+                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                  }
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- SORT_GROUP_BY[$$49]  |PARTITIONED|
+                      {
+                        -- AGGREGATE  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                      }
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- STREAM_PROJECT  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$49][$$52]  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$49]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- HASH_PARTITION_EXCHANGE [$$52]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_1.plan
index d45ccfe..86bb1c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_1.plan
@@ -4,7 +4,7 @@
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- HYBRID_HASH_JOIN [$$21, $$23, $$25][$$22, $$24, $$26]  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$35, $$37, $$39][$$36, $$38, $$40]  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
@@ -20,4 +20,4 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_2.plan
index d45ccfe..86bb1c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_2.plan
@@ -4,7 +4,7 @@
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- HYBRID_HASH_JOIN [$$21, $$23, $$25][$$22, $$24, $$26]  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$35, $$37, $$39][$$36, $$38, $$40]  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
@@ -20,4 +20,4 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_3.plan
index b7669dd..240b1aa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/hints/broadcast_hint_3.plan
@@ -4,8 +4,8 @@
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- HYBRID_HASH_JOIN [$$21, $$24, $$25][$$22, $$23, $$26]  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$21, $$24, $$25]  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$35, $$38, $$39][$$36, $$37, $$40]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$35, $$38, $$39]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
@@ -13,11 +13,11 @@
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-              -- HASH_PARTITION_EXCHANGE [$$22, $$23, $$26]  |PARTITIONED|
+              -- HASH_PARTITION_EXCHANGE [$$36, $$37, $$40]  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- DATASOURCE_SCAN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
index 26d6103..143f01b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/inlined_q18_large_volume_customer.plan
@@ -45,7 +45,7 @@
                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$l_orderkey]  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               -- STREAM_SELECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-core.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-core.plan
index 1d34c95..2cab787 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-core.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-core.plan
@@ -2,20 +2,20 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$15(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$36(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$36(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- HYBRID_HASH_JOIN [$$17][$$18]  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                  -- HYBRID_HASH_JOIN [$$38][$$39]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$38]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
                       -- ASSIGN  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-sugar.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-sugar.plan
index 1d34c95..a547407 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-sugar.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/loj-sugar.plan
@@ -2,20 +2,20 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$15(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$29(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$29(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- HYBRID_HASH_JOIN [$$17][$$18]  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                  -- HYBRID_HASH_JOIN [$$31][$$32]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$31]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- DATASOURCE_SCAN  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$32]  |PARTITIONED|
                       -- ASSIGN  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/ASTERIXDB-2199.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/ASTERIXDB-2199.plan
new file mode 100644
index 0000000..8f346e0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/ASTERIXDB-2199.plan
@@ -0,0 +1,15 @@
+-- DISTRIBUTE_RESULT  |PARTITIONED|
+  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+    -- STREAM_PROJECT  |PARTITIONED|
+      -- ASSIGN  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- HYBRID_HASH_JOIN [$$30][$$31]  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.plan
index e108f8b..b3c16b6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$39(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$50(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$43(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$30(ASC), $$31(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
index 2a4e565..c3876cd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$48(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$36(ASC), $$45(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$36(ASC), $$37(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_01.plan
index bea4cf8..e9588f2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_01.plan
@@ -3,14 +3,17 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- BTREE_SEARCH  |PARTITIONED|
-              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                -- STREAM_PROJECT  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- ASSIGN  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- BROADCAST_EXCHANGE  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_02.plan
index bea4cf8..e9588f2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-composite-key-join_02.plan
@@ -3,14 +3,17 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- BTREE_SEARCH  |PARTITIONED|
-              -- BROADCAST_EXCHANGE  |PARTITIONED|
-                -- STREAM_PROJECT  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- ASSIGN  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- BROADCAST_EXCHANGE  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
-                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- DATASOURCE_SCAN  |PARTITIONED|
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-equi-join-neg_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-equi-join-neg_01.plan
index 92b4356..4a09eda 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-equi-join-neg_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index-join/primary-equi-join-neg_01.plan
@@ -2,14 +2,11 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- HYBRID_HASH_JOIN [$$11][$$12]  |PARTITIONED|
-          -- HASH_PARTITION_EXCHANGE [$$11]  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- DATASOURCE_SCAN  |PARTITIONED|
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- HYBRID_HASH_JOIN [$$9][$$12]  |PARTITIONED|
+          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+            -- DATASOURCE_SCAN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
           -- HASH_PARTITION_EXCHANGE [$$12]  |PARTITIONED|
             -- STREAM_PROJECT  |PARTITIONED|
               -- ASSIGN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-15.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-15.plan
index 6f13ebb..77ee34d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-15.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-15.plan
@@ -1,8 +1,13 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
             -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-16.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-16.plan
index 6f13ebb..77ee34d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-16.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-16.plan
@@ -1,8 +1,13 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
             -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-19.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-19.plan
index 6f13ebb..9782637 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-19.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-19.plan
@@ -1,8 +1,13 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
             -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-20.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-20.plan
index 6f13ebb..9782637 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-20.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/btree-index/btree-primary-20.plan
@@ -1,8 +1,13 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- ASSIGN  |PARTITIONED|
             -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+              -- STREAM_PROJECT  |PARTITIONED|
+                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                  -- BTREE_SEARCH  |PARTITIONED|
+                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                      -- ASSIGN  |PARTITIONED|
+                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains-panic.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains-panic.plan
index 2fb4241..eb102a3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains-panic.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains-panic.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains.plan
index 77b8436..b00702c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/ngram-contains.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$12(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$13(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check-panic.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check-panic.plan
index 5aae5fd..c2425d4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check-panic.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check-panic.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check.plan
index 9b0a03d..8d5c81f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-check.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$14(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-panic.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-panic.plan
index 5aae5fd..c2425d4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-panic.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance-panic.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance.plan
index 9b0a03d..8d5c81f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-edit-distance.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$14(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.plan
index 400f01f..bfbdf63 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$10(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$10(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$8(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$13(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$14(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/word-contains.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/word-contains.plan
index 2fb4241..eb102a3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/word-contains.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-basic/word-contains.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.plan
index e3782a1..d15a896 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$12(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$12(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$10(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let.plan
index 2cb1cca..ecd170c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-complex/olist-edit-distance-check-let.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$12(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$12(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$10(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$16(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
index 57f0ca0..f9d2564 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
@@ -2,93 +2,90 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$51(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$39(ASC), $$48(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$62][$$39]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ASSIGN  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- REPLICATE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$54(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$39(ASC), $$40(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$60][$$39]  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- REPLICATE  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- BTREE_SEARCH  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                            -- UNION_ALL  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- BTREE_SEARCH  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                                  -- UNION_ALL  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- STREAM_SELECT  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- BTREE_SEARCH  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- STABLE_SORT [$$74(ASC)]  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_SELECT  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- REPLICATE  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
-                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- REPLICATE  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- BTREE_SEARCH  |PARTITIONED|
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- ASSIGN  |PARTITIONED|
-                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- NESTED_LOOP  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
+                                                    -- STABLE_SORT [$$72(ASC)]  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_SELECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- REPLICATE  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ASSIGN  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
+                                                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
+                                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_SELECT  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- REPLICATE  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- ASSIGN  |PARTITIONED|
-                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- REPLICATE  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- BTREE_SEARCH  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- ASSIGN  |PARTITIONED|
+                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- NESTED_LOOP  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_SELECT  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- REPLICATE  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- REPLICATE  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
index 2bea026..8b5c56b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.plan
@@ -2,58 +2,55 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$51(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$39(ASC), $$48(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$62][$$39]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ASSIGN  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$54(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$39(ASC), $$40(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$60][$$39]  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- REPLICATE  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- BTREE_SEARCH  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- STREAM_SELECT  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- REPLICATE  |PARTITIONED|
+                                            -- BTREE_SEARCH  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- BTREE_SEARCH  |PARTITIONED|
+                                                -- STABLE_SORT [$$66(ASC)]  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- STREAM_SELECT  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ASSIGN  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STABLE_SORT [$$68(ASC)]  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                -- ASSIGN  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- REPLICATE  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- BTREE_SEARCH  |PARTITIONED|
-                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
-                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                    -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
+                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                          -- ASSIGN  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- REPLICATE  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- BTREE_SEARCH  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
index abb7519..1264620 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
@@ -2,43 +2,40 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$39(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$43(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- STREAM_SELECT  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- RTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- RTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                         -- ASSIGN  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- BTREE_SEARCH  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
-                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ASSIGN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- BTREE_SEARCH  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- ASSIGN  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
index 08bd165..1f5e2b7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
@@ -2,44 +2,41 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$40(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$40(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$37]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$37(ASC), $$45(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- STREAM_SELECT  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STABLE_SORT [$$66(ASC)]  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- RTREE_SEARCH  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$52(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$37]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$37(ASC), $$38(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- STREAM_SELECT  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- BTREE_SEARCH  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- STABLE_SORT [$$64(ASC)]  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- RTREE_SEARCH  |PARTITIONED|
+                                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ASSIGN  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
-                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                -- ASSIGN  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- BTREE_SEARCH  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- BTREE_SEARCH  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.plan
index e108f8b..b3c16b6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$39(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$50(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$43(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$30(ASC), $$31(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.plan
index e108f8b..b3c16b6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$39(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$50(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$43(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$30(ASC), $$31(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.plan
index 2a4e565..c3876cd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$48(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$36(ASC), $$45(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$36(ASC), $$37(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.plan
index 2a4e565..c3876cd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.plan
@@ -2,41 +2,38 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$48(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$48(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$36(ASC), $$45(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
-                          -- STREAM_SELECT  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
-                              -- ASSIGN  |PARTITIONED|
-                                -- STREAM_PROJECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- ASSIGN  |PARTITIONED|
-                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$36]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$36(ASC), $$37(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                    -- STREAM_SELECT  |PARTITIONED|
+                      -- STREAM_PROJECT  |PARTITIONED|
+                        -- ASSIGN  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
+                              -- STREAM_PROJECT  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- ASSIGN  |PARTITIONED|
+                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains-panic.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains-panic.plan
index 2fb4241..eb102a3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains-panic.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains-panic.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains.plan
index 77b8436..b00702c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/ngram-contains.plan
@@ -1,20 +1,16 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- BTREE_SEARCH  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- STABLE_SORT [$$12(ASC)]  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- BTREE_SEARCH  |PARTITIONED|
+                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$13(ASC)]  |PARTITIONED|
-                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                            -- ASSIGN  |PARTITIONED|
+                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/word-contains.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/word-contains.plan
index 2fb4241..eb102a3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/word-contains.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-basic/word-contains.plan
@@ -1,15 +1,11 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- SORT_MERGE_EXCHANGE [$$9(ASC) ]  |PARTITIONED|
-        -- STABLE_SORT [$$9(ASC)]  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- STREAM_PROJECT  |PARTITIONED|
-              -- STREAM_SELECT  |PARTITIONED|
-                -- ASSIGN  |PARTITIONED|
-                  -- ASSIGN  |PARTITIONED|
-                    -- STREAM_PROJECT  |PARTITIONED|
-                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- DATASOURCE_SCAN  |PARTITIONED|
-                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+      -- SORT_MERGE_EXCHANGE [$$7(ASC) ]  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- STREAM_SELECT  |PARTITIONED|
+            -- ASSIGN  |PARTITIONED|
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- DATASOURCE_SCAN  |PARTITIONED|
+                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
index 57f0ca0..f9d2564 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.plan
@@ -2,93 +2,90 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$51(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$51(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$39(ASC), $$48(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$62][$$39]  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ASSIGN  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- REPLICATE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$54(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$39]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$39(ASC), $$40(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$60][$$39]  |PARTITIONED|
+                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- REPLICATE  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- BTREE_SEARCH  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
+                            -- UNION_ALL  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ASSIGN  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                 -- BTREE_SEARCH  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
-                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$39]  |PARTITIONED|
-                                  -- UNION_ALL  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- STREAM_SELECT  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- BTREE_SEARCH  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- STABLE_SORT [$$74(ASC)]  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
-                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_SELECT  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- REPLICATE  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
-                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- REPLICATE  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- BTREE_SEARCH  |PARTITIONED|
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- ASSIGN  |PARTITIONED|
-                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- NESTED_LOOP  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
+                                                    -- STABLE_SORT [$$72(ASC)]  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_SELECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- REPLICATE  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ASSIGN  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
+                                                        -- LENGTH_PARTITIONED_INVERTED_INDEX_SEARCH  |PARTITIONED|
+                                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_SELECT  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- REPLICATE  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- ASSIGN  |PARTITIONED|
-                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- REPLICATE  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- BTREE_SEARCH  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- ASSIGN  |PARTITIONED|
+                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- NESTED_LOOP  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ASSIGN  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- DATASOURCE_SCAN  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                        -- STREAM_SELECT  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- REPLICATE  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- REPLICATE  |PARTITIONED|
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
index abb7519..1264620 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.plan
@@ -2,43 +2,40 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$39(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- STREAM_SELECT  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$43(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$30]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$30(ASC), $$36(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- STREAM_SELECT  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- ASSIGN  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- BTREE_SEARCH  |PARTITIONED|
-                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STABLE_SORT [$$56(ASC)]  |PARTITIONED|
-                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- RTREE_SEARCH  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                  -- BTREE_SEARCH  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- RTREE_SEARCH  |PARTITIONED|
+                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                         -- ASSIGN  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- BTREE_SEARCH  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
-                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ASSIGN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- BTREE_SEARCH  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- ASSIGN  |PARTITIONED|
+                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
index 08bd165..1f5e2b7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.plan
@@ -2,44 +2,41 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$40(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$40(ASC)]  |PARTITIONED|
-            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STREAM_PROJECT  |PARTITIONED|
-                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$37]  |PARTITIONED|
-                          {
-                            -- AGGREGATE  |LOCAL|
-                              -- STREAM_SELECT  |LOCAL|
-                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                          }
-                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$37(ASC), $$45(ASC)]  |PARTITIONED|
-                        -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
-                          -- STREAM_PROJECT  |PARTITIONED|
-                            -- STREAM_SELECT  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
-                                  -- STREAM_PROJECT  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- BTREE_SEARCH  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STABLE_SORT [$$66(ASC)]  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- RTREE_SEARCH  |PARTITIONED|
-                                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
+        -- STREAM_PROJECT  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$52(ASC) ]  |PARTITIONED|
+            -- PRE_CLUSTERED_GROUP_BY[$$37]  |PARTITIONED|
+                    {
+                      -- AGGREGATE  |LOCAL|
+                        -- STREAM_SELECT  |LOCAL|
+                          -- NESTED_TUPLE_SOURCE  |LOCAL|
+                    }
+              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                -- STABLE_SORT [$$37(ASC), $$38(ASC)]  |PARTITIONED|
+                  -- HASH_PARTITION_EXCHANGE [$$37]  |PARTITIONED|
+                    -- STREAM_PROJECT  |PARTITIONED|
+                      -- STREAM_SELECT  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
+                          -- ASSIGN  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
+                              -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- BTREE_SEARCH  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- STABLE_SORT [$$64(ASC)]  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- RTREE_SEARCH  |PARTITIONED|
+                                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
+                                                        -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ASSIGN  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
-                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                -- ASSIGN  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- BTREE_SEARCH  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- BTREE_SEARCH  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/keep-datetime-local.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/keep-datetime-local.plan
index 5246d83..5fcbcc8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/keep-datetime-local.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/nonpure/keep-datetime-local.plan
@@ -16,21 +16,25 @@
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- STABLE_SORT [$$30(ASC), $$23(ASC)]  |PARTITIONED|
                         -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
-                          -- HYBRID_HASH_JOIN [$$25][$$24]  |PARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
+                          -- STREAM_SELECT  |PARTITIONED|
+                            -- STREAM_PROJECT  |PARTITIONED|
                               -- ASSIGN  |PARTITIONED|
-                                -- STREAM_SELECT  |PARTITIONED|
-                                  -- ASSIGN  |PARTITIONED|
-                                    -- STREAM_PROJECT  |PARTITIONED|
-                                      -- ASSIGN  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- DATASOURCE_SCAN  |PARTITIONED|
-                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$24]  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
-                                -- ASSIGN  |PARTITIONED|
+                                -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                    -- DATASOURCE_SCAN  |PARTITIONED|
+                                    -- BTREE_SEARCH  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
\ No newline at end of file
+                                        -- STABLE_SORT [$$34(ASC)]  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- BTREE_SEARCH  |PARTITIONED|
+                                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                    -- ASSIGN  |PARTITIONED|
+                                                      -- STREAM_SELECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ASSIGN  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-05.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-05.plan
index 15f9171..7becb2c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-05.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-05.plan
@@ -2,13 +2,13 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$18(ASC), $$19(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$18(ASC), $$19(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$32(ASC), $$33(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$32(ASC), $$33(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- HYBRID_HASH_JOIN [$$16][$$17]  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$16]  |PARTITIONED|
+                  -- HYBRID_HASH_JOIN [$$30][$$31]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
@@ -16,7 +16,7 @@
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$31]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-06.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-06.plan
index 15f9171..7becb2c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-06.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-06.plan
@@ -2,13 +2,13 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$18(ASC), $$19(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$18(ASC), $$19(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$32(ASC), $$33(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$32(ASC), $$33(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- HYBRID_HASH_JOIN [$$16][$$17]  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$16]  |PARTITIONED|
+                  -- HYBRID_HASH_JOIN [$$30][$$31]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$30]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
@@ -16,7 +16,7 @@
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$31]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-07.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-07.plan
index 7f5a841..913c442 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-07.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-07.plan
@@ -2,13 +2,13 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$20(ASC), $$21(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$20(ASC), $$21(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$34(ASC), $$35(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$34(ASC), $$35(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- HYBRID_HASH_JOIN [$$17][$$18]  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$17]  |PARTITIONED|
+                  -- HYBRID_HASH_JOIN [$$31][$$32]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$31]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
@@ -16,7 +16,7 @@
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                    -- HASH_PARTITION_EXCHANGE [$$18]  |PARTITIONED|
+                    -- HASH_PARTITION_EXCHANGE [$$32]  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ASSIGN  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-08.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-08.plan
index 06483e4..9f54d38 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-08.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-08.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$20(ASC), $$21(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$20(ASC), $$21(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$34(ASC), $$35(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$34(ASC), $$35(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$25(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-09.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-09.plan
index 06483e4..9f54d38 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-09.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-equi-join-non-enforced/btree-equi-join-non-enforced-09.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$20(ASC), $$21(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$20(ASC), $$21(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$34(ASC), $$35(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$34(ASC), $$35(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$25(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$39(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-04.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-04.plan
index 459286e..4c8008f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-04.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-04.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$16(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$23(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-05.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-05.plan
index 459286e..4c8008f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-05.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-05.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$16(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$23(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-06.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-06.plan
index 01c6a30..844758a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-06.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-06.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-07.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-07.plan
index 01c6a30..844758a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-07.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-07.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-08.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-08.plan
index 01c6a30..844758a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-08.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-08.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-09.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-09.plan
index 01c6a30..844758a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-09.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-09.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-10.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-10.plan
index 01c6a30..844758a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-10.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-10.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$11(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$11(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$18(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$18(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -12,7 +12,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- BTREE_SEARCH  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+                            -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-105.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-105.plan
index aa6a642..1a359dd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-105.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-105.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$15(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$15(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$22(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -14,7 +14,7 @@
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- INTERSECT  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- STABLE_SORT [$$19(ASC)]  |PARTITIONED|
+                                -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -23,7 +23,7 @@
                                             -- ASSIGN  |PARTITIONED|
                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- STABLE_SORT [$$22(ASC)]  |PARTITIONED|
+                                -- STABLE_SORT [$$29(ASC)]  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-11.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-11.plan
index 41da8df..ad089de 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-11.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/open-index-non-enforced/btree-index-non-enforced/btree-index-non-enforced-11.plan
@@ -2,8 +2,8 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$14(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$14(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$21(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$21(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
@@ -13,7 +13,7 @@
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- BTREE_SEARCH  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- STABLE_SORT [$$19(ASC)]  |PARTITIONED|
+                              -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-159-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-159-3.plan
index ab2661b..07978f6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-159-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-159-3.plan
@@ -3,14 +3,14 @@
     -- STREAM_LIMIT  |UNPARTITIONED|
       -- STREAM_PROJECT  |PARTITIONED|
         -- ASSIGN  |PARTITIONED|
-          -- SORT_MERGE_EXCHANGE [$$27(DESC), $$28(DESC) ]  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$41(DESC), $$42(DESC) ]  |PARTITIONED|
             -- STREAM_LIMIT  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                -- STABLE_SORT [topK: 5] [$$27(DESC), $$28(DESC)]  |PARTITIONED|
+                -- STABLE_SORT [topK: 5] [$$41(DESC), $$42(DESC)]  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- HYBRID_HASH_JOIN [$$27][$$36]  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$41][$$50]  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
                               -- ASSIGN  |PARTITIONED|
@@ -27,7 +27,7 @@
                                                     -- DATASOURCE_SCAN  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$50]  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
                               -- STREAM_SELECT  |PARTITIONED|
                                 -- SUBPLAN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1671.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1671.plan
index 3aaaeb0..d26d5a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1671.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1671.plan
@@ -4,10 +4,10 @@
       -- STREAM_PROJECT  |PARTITIONED|
         -- ASSIGN  |PARTITIONED|
           -- STREAM_PROJECT  |PARTITIONED|
-            -- SORT_MERGE_EXCHANGE [$$10(ASC), $$11(ASC) ]  |PARTITIONED|
+            -- SORT_MERGE_EXCHANGE [$$17(ASC), $$18(ASC) ]  |PARTITIONED|
               -- STREAM_LIMIT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- STABLE_SORT [topK: 0] [$$10(ASC), $$11(ASC)]  |PARTITIONED|
+                  -- STABLE_SORT [topK: 0] [$$17(ASC), $$18(ASC)]  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- ASSIGN  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
index ad30823..0f8b28f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-1806.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$96, $$97]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$140, $$141]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$96, $$97]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$64, $$65]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$140, $$141]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$108, $$109]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
index 238736a..1d80ccf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-2.plan
@@ -3,7 +3,7 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
-          -- PRE_CLUSTERED_GROUP_BY[$$44, $$45]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$104, $$105]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -13,9 +13,9 @@
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STABLE_SORT [$$44(ASC), $$45(ASC)]  |PARTITIONED|
-                -- HASH_PARTITION_EXCHANGE [$$44, $$45]  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$30, $$31]  |PARTITIONED|
+              -- STABLE_SORT [$$104(ASC), $$105(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$104, $$105]  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$90, $$91]  |PARTITIONED|
                           {
                             -- AGGREGATE  |LOCAL|
                               -- STREAM_SELECT  |LOCAL|
@@ -27,7 +27,7 @@
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                           }
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$30(ASC), $$31(ASC)]  |PARTITIONED|
+                      -- STABLE_SORT [$$90(ASC), $$91(ASC)]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- ASSIGN  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
index 9a7df35..56a7aca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810-3.plan
@@ -3,7 +3,7 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
-          -- PRE_CLUSTERED_GROUP_BY[$$44, $$45]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$112, $$113]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -13,9 +13,9 @@
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STABLE_SORT [$$44(ASC), $$45(ASC)]  |PARTITIONED|
-                -- HASH_PARTITION_EXCHANGE [$$44, $$45]  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$31, $$32]  |PARTITIONED|
+              -- STABLE_SORT [$$112(ASC), $$113(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$112, $$113]  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$99, $$100]  |PARTITIONED|
                           {
                             -- AGGREGATE  |LOCAL|
                               -- STREAM_SELECT  |LOCAL|
@@ -27,7 +27,7 @@
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                           }
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$31(ASC), $$32(ASC)]  |PARTITIONED|
+                      -- STABLE_SORT [$$99(ASC), $$100(ASC)]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- ASSIGN  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
index 18b4218..76cd11f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-ASTERIXDB-810.plan
@@ -3,7 +3,7 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_returnflag(ASC), $$l_linestatus(ASC) ]  |PARTITIONED|
-          -- PRE_CLUSTERED_GROUP_BY[$$44, $$45]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$120, $$121]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -13,9 +13,9 @@
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- STABLE_SORT [$$44(ASC), $$45(ASC)]  |PARTITIONED|
-                -- HASH_PARTITION_EXCHANGE [$$44, $$45]  |PARTITIONED|
-                  -- PRE_CLUSTERED_GROUP_BY[$$32, $$33]  |PARTITIONED|
+              -- STABLE_SORT [$$120(ASC), $$121(ASC)]  |PARTITIONED|
+                -- HASH_PARTITION_EXCHANGE [$$120, $$121]  |PARTITIONED|
+                  -- PRE_CLUSTERED_GROUP_BY[$$108, $$109]  |PARTITIONED|
                           {
                             -- AGGREGATE  |LOCAL|
                               -- STREAM_SELECT  |LOCAL|
@@ -27,7 +27,7 @@
                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                           }
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- STABLE_SORT [$$32(ASC), $$33(ASC)]  |PARTITIONED|
+                      -- STABLE_SORT [$$108(ASC), $$109(ASC)]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- ASSIGN  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue697.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue697.plan
index 2d75ff0..aae39ae 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue697.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/query-issue697.plan
@@ -3,12 +3,12 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          -- SORT_GROUP_BY[$$20]  |PARTITIONED|
+          -- PRE_CLUSTERED_GROUP_BY[$$20]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$20]  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- PRE_CLUSTERED_GROUP_BY[$$16]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/skip-index/dont-skip-primary-index.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/skip-index/dont-skip-primary-index.plan
index 6f13ebb..279cc83 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/skip-index/dont-skip-primary-index.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/skip-index/dont-skip-primary-index.plan
@@ -1,8 +1,9 @@
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
-      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-        -- BTREE_SEARCH  |PARTITIONED|
-          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            -- ASSIGN  |PARTITIONED|
-              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+      -- STREAM_SELECT  |PARTITIONED|
+        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+          -- BTREE_SEARCH  |PARTITIONED|
+            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+              -- ASSIGN  |PARTITIONED|
+                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
index a81a142..22bc323 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/split-materialization-above-join.plan
@@ -32,26 +32,26 @@
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                   -- HYBRID_HASH_JOIN [$$prefixTokenLeft][$$prefixTokenRight]  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ASSIGN  |PARTITIONED|
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- REPLICATE  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$prefixTokenRight]  |PARTITIONED|
-                                                                -- UNNEST  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
-                                                                            {
-                                                                              -- AGGREGATE  |LOCAL|
-                                                                                -- STREAM_SELECT  |LOCAL|
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                            }
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- STABLE_SORT [$$97(ASC), $$i(ASC)]  |PARTITIONED|
-                                                                          -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- HASH_PARTITION_EXCHANGE [$$prefixTokenLeft]  |PARTITIONED|
+                                                      -- UNNEST  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- PRE_CLUSTERED_GROUP_BY[$$95]  |PARTITIONED|
+                                                                  {
+                                                                    -- AGGREGATE  |LOCAL|
+                                                                      -- STREAM_SELECT  |LOCAL|
+                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  }
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- STABLE_SORT [$$95(ASC), $$i(ASC)]  |PARTITIONED|
+                                                                -- HASH_PARTITION_EXCHANGE [$$95]  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
+                                                                                -- REPLICATE  |PARTITIONED|
                                                                                   -- HASH_PARTITION_EXCHANGE [$$tokenUnranked]  |PARTITIONED|
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                                       -- UNNEST  |PARTITIONED|
@@ -62,19 +62,24 @@
                                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                  -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
-                                                                                    -- ASSIGN  |PARTITIONED|
-                                                                                      -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          -- SORT_MERGE_EXCHANGE [$$102(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
-                                                                                            -- STABLE_SORT [$$102(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- SORT_MERGE_EXCHANGE [$$99(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
+                                                                                  -- STABLE_SORT [$$99(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- SORT_GROUP_BY[$$128]  |PARTITIONED|
+                                                                                              {
+                                                                                                -- AGGREGATE  |LOCAL|
+                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                              }
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$128]  |PARTITIONED|
+                                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                                            -- ASSIGN  |PARTITIONED|
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                -- SORT_GROUP_BY[$$130]  |PARTITIONED|
-                                                                                                        {
-                                                                                                          -- AGGREGATE  |LOCAL|
-                                                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                                        }
-                                                                                                  -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
+                                                                                                -- REPLICATE  |PARTITIONED|
+                                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                     -- SORT_GROUP_BY[$$token]  |PARTITIONED|
                                                                                                             {
                                                                                                               -- AGGREGATE  |LOCAL|
@@ -92,23 +97,23 @@
                                                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- REPLICATE  |PARTITIONED|
-                                                        -- HASH_PARTITION_EXCHANGE [$$prefixTokenRight]  |PARTITIONED|
-                                                          -- UNNEST  |PARTITIONED|
+                                                    -- HASH_PARTITION_EXCHANGE [$$prefixTokenRight]  |PARTITIONED|
+                                                      -- UNNEST  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
+                                                                  {
+                                                                    -- AGGREGATE  |LOCAL|
+                                                                      -- STREAM_SELECT  |LOCAL|
+                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  }
                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
-                                                                      {
-                                                                        -- AGGREGATE  |LOCAL|
-                                                                          -- STREAM_SELECT  |LOCAL|
-                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                      }
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STABLE_SORT [$$97(ASC), $$i(ASC)]  |PARTITIONED|
-                                                                    -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
-                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- STABLE_SORT [$$97(ASC), $$i(ASC)]  |PARTITIONED|
+                                                                -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
+                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- HYBRID_HASH_JOIN [$$tokenUnranked][$$tokenGroupped]  |PARTITIONED|
+                                                                          -- REPLICATE  |PARTITIONED|
                                                                             -- HASH_PARTITION_EXCHANGE [$$tokenUnranked]  |PARTITIONED|
                                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                                 -- UNNEST  |PARTITIONED|
@@ -119,19 +124,21 @@
                                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                            -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
-                                                                              -- ASSIGN  |PARTITIONED|
-                                                                                -- RUNNING_AGGREGATE  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- SORT_MERGE_EXCHANGE [$$102(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
-                                                                                      -- STABLE_SORT [$$102(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- SORT_GROUP_BY[$$130]  |PARTITIONED|
-                                                                                                  {
-                                                                                                    -- AGGREGATE  |LOCAL|
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                                  }
-                                                                                            -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$tokenGroupped]  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- RUNNING_AGGREGATE  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- SORT_MERGE_EXCHANGE [$$102(ASC), $$tokenGroupped(ASC) ]  |PARTITIONED|
+                                                                                  -- STABLE_SORT [$$102(ASC), $$tokenGroupped(ASC)]  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- SORT_GROUP_BY[$$130]  |PARTITIONED|
+                                                                                              {
+                                                                                                -- AGGREGATE  |LOCAL|
+                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                              }
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
+                                                                                          -- REPLICATE  |PARTITIONED|
+                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                               -- SORT_GROUP_BY[$$token]  |PARTITIONED|
                                                                                                       {
                                                                                                         -- AGGREGATE  |LOCAL|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
index 3f47dac..1ae1e60 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/exists.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$cntrycode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$78]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$146]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$78]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$55]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$146]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$123]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -21,25 +21,25 @@
                         -- STREAM_SELECT  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- SORT_GROUP_BY[$$75]  |PARTITIONED|
+                              -- SORT_GROUP_BY[$$143]  |PARTITIONED|
                                       {
                                         -- AGGREGATE  |LOCAL|
                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                                       }
-                                -- HASH_PARTITION_EXCHANGE [$$75]  |PARTITIONED|
-                                  -- PRE_CLUSTERED_GROUP_BY[$$69]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$143]  |PARTITIONED|
+                                  -- PRE_CLUSTERED_GROUP_BY[$$137]  |PARTITIONED|
                                           {
                                             -- AGGREGATE  |LOCAL|
                                               -- STREAM_SELECT  |LOCAL|
                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                                           }
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STABLE_SORT [$$69(ASC)]  |PARTITIONED|
+                                      -- STABLE_SORT [$$137(ASC)]  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- HYBRID_HASH_JOIN [$$64][$$61]  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$64]  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$132][$$129]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$132]  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -66,7 +66,7 @@
                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$61]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$129]  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- DATASOURCE_SCAN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
index 8276df2..7f916f16 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in.plan
@@ -2,13 +2,13 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$26(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$26(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$40(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$40(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- PRE_CLUSTERED_GROUP_BY[$$19]  |PARTITIONED|
+                    -- PRE_CLUSTERED_GROUP_BY[$$33]  |PARTITIONED|
                             {
                               -- AGGREGATE  |LOCAL|
                                 -- STREAM_SELECT  |LOCAL|
@@ -17,7 +17,7 @@
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- HYBRID_HASH_JOIN [$$19][$$7]  |PARTITIONED|
+                            -- HYBRID_HASH_JOIN [$$33][$$21]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- STREAM_SELECT  |PARTITIONED|
@@ -25,7 +25,7 @@
                                       -- DATASOURCE_SCAN  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                              -- HASH_PARTITION_EXCHANGE [$$7]  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$21]  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
                                   -- ASSIGN  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_correlated.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_correlated.plan
index 268b914..7f0bb3b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_correlated.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/in_correlated.plan
@@ -2,13 +2,13 @@
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
-        -- SORT_MERGE_EXCHANGE [$$31(ASC) ]  |PARTITIONED|
-          -- STABLE_SORT [$$31(ASC)]  |PARTITIONED|
+        -- SORT_MERGE_EXCHANGE [$$45(ASC) ]  |PARTITIONED|
+          -- STABLE_SORT [$$45(ASC)]  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
               -- STREAM_PROJECT  |PARTITIONED|
                 -- STREAM_SELECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- PRE_CLUSTERED_GROUP_BY[$$23]  |PARTITIONED|
+                    -- PRE_CLUSTERED_GROUP_BY[$$37]  |PARTITIONED|
                             {
                               -- AGGREGATE  |LOCAL|
                                 -- STREAM_SELECT  |LOCAL|
@@ -22,7 +22,7 @@
                                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                             }
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- HYBRID_HASH_JOIN [$$23][$$22]  |PARTITIONED|
+                        -- HYBRID_HASH_JOIN [$$37][$$36]  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                             -- STREAM_SELECT  |PARTITIONED|
                               -- ASSIGN  |PARTITIONED|
@@ -30,7 +30,7 @@
                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                          -- HASH_PARTITION_EXCHANGE [$$22]  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$36]  |PARTITIONED|
                             -- STREAM_PROJECT  |PARTITIONED|
                               -- ASSIGN  |PARTITIONED|
                                 -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
index 311ab6d..7ef3e37 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/not_exists.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$cntrycode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$79]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$147]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$79]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$56]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$147]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$124]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -21,25 +21,25 @@
                         -- STREAM_SELECT  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- SORT_GROUP_BY[$$76]  |PARTITIONED|
+                              -- SORT_GROUP_BY[$$144]  |PARTITIONED|
                                       {
                                         -- AGGREGATE  |LOCAL|
                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                                       }
-                                -- HASH_PARTITION_EXCHANGE [$$76]  |PARTITIONED|
-                                  -- PRE_CLUSTERED_GROUP_BY[$$70]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$144]  |PARTITIONED|
+                                  -- PRE_CLUSTERED_GROUP_BY[$$138]  |PARTITIONED|
                                           {
                                             -- AGGREGATE  |LOCAL|
                                               -- STREAM_SELECT  |LOCAL|
                                                 -- NESTED_TUPLE_SOURCE  |LOCAL|
                                           }
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STABLE_SORT [$$70(ASC)]  |PARTITIONED|
+                                      -- STABLE_SORT [$$138(ASC)]  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                           -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- HYBRID_HASH_JOIN [$$65][$$62]  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$65]  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$133][$$130]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$133]  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -66,7 +66,7 @@
                                                                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                     -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                -- HASH_PARTITION_EXCHANGE [$$62]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$130]  |PARTITIONED|
                                                   -- ASSIGN  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                       -- DATASOURCE_SCAN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
index 6c9c457..ec9715e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/subquery/query-ASTERIXDB-1572.plan
@@ -5,73 +5,71 @@
         -- STREAM_PROJECT  |PARTITIONED|
           -- STREAM_SELECT  |PARTITIONED|
             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-              -- PRE_CLUSTERED_GROUP_BY[$$44]  |PARTITIONED|
+              -- PRE_CLUSTERED_GROUP_BY[$$58]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- STREAM_SELECT  |LOCAL|
                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                       }
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- STABLE_SORT [$$44(ASC)]  |PARTITIONED|
+                  -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- HYBRID_HASH_JOIN [$$44][$#4]  |PARTITIONED|
-                            -- HASH_PARTITION_EXCHANGE [$$44]  |PARTITIONED|
-                              -- PRE_CLUSTERED_GROUP_BY[$$42]  |PARTITIONED|
+                          -- HYBRID_HASH_JOIN [$$58][$#4]  |PARTITIONED|
+                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                              -- PRE_CLUSTERED_GROUP_BY[$$56]  |PARTITIONED|
                                       {
                                         -- AGGREGATE  |LOCAL|
                                           -- STREAM_SELECT  |LOCAL|
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
                                       }
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- STABLE_SORT [$$42(ASC)]  |PARTITIONED|
+                                  -- STREAM_PROJECT  |PARTITIONED|
                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$56][$#3]  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- HYBRID_HASH_JOIN [$$42][$#3]  |PARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$$42]  |PARTITIONED|
-                                              -- PRE_CLUSTERED_GROUP_BY[$$40]  |PARTITIONED|
-                                                      {
-                                                        -- AGGREGATE  |LOCAL|
-                                                          -- STREAM_SELECT  |LOCAL|
-                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                      }
+                                          -- PRE_CLUSTERED_GROUP_BY[$$54]  |PARTITIONED|
+                                                  {
+                                                    -- AGGREGATE  |LOCAL|
+                                                      -- STREAM_SELECT  |LOCAL|
+                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  }
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STABLE_SORT [$$54(ASC)]  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- STABLE_SORT [$$40(ASC)]  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN [$$54][$#2]  |PARTITIONED|
                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- HYBRID_HASH_JOIN [$$40][$#2]  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$40]  |PARTITIONED|
-                                                              -- PRE_CLUSTERED_GROUP_BY[$$33]  |PARTITIONED|
-                                                                      {
-                                                                        -- AGGREGATE  |LOCAL|
-                                                                          -- STREAM_SELECT  |LOCAL|
-                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                      }
+                                                          -- PRE_CLUSTERED_GROUP_BY[$$47]  |PARTITIONED|
+                                                                  {
+                                                                    -- AGGREGATE  |LOCAL|
+                                                                      -- STREAM_SELECT  |LOCAL|
+                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                  }
+                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                              -- STREAM_PROJECT  |PARTITIONED|
                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- HYBRID_HASH_JOIN [$$47][$#1]  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- HYBRID_HASH_JOIN [$$33][$#1]  |PARTITIONED|
+                                                                      -- STREAM_PROJECT  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
-                                                                          -- ASSIGN  |UNPARTITIONED|
-                                                                            -- UNNEST  |UNPARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$#2]  |PARTITIONED|
-                                                              -- ASSIGN  |UNPARTITIONED|
-                                                                -- UNNEST  |UNPARTITIONED|
-                                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$#3]  |PARTITIONED|
-                                              -- ASSIGN  |UNPARTITIONED|
-                                                -- UNNEST  |UNPARTITIONED|
-                                                  -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    -- HASH_PARTITION_EXCHANGE [$#1]  |PARTITIONED|
+                                                                      -- ASSIGN  |UNPARTITIONED|
+                                                                        -- UNNEST  |UNPARTITIONED|
+                                                                          -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$#2]  |PARTITIONED|
+                                                          -- ASSIGN  |UNPARTITIONED|
+                                                            -- UNNEST  |UNPARTITIONED|
+                                                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$#3]  |PARTITIONED|
+                                          -- ASSIGN  |UNPARTITIONED|
+                                            -- UNNEST  |UNPARTITIONED|
+                                              -- EMPTY_TUPLE_SOURCE  |UNPARTITIONED|
                             -- HASH_PARTITION_EXCHANGE [$#4]  |PARTITIONED|
                               -- ASSIGN  |UNPARTITIONED|
                                 -- UNNEST  |UNPARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
index 78d1566..a647c7c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1580.plan
@@ -4,21 +4,21 @@
       -- STREAM_PROJECT  |PARTITIONED|
         -- ASSIGN  |PARTITIONED|
           -- STREAM_PROJECT  |PARTITIONED|
-            -- SORT_MERGE_EXCHANGE [$$59(ASC) ]  |PARTITIONED|
+            -- SORT_MERGE_EXCHANGE [$$110(ASC) ]  |PARTITIONED|
               -- STREAM_LIMIT  |PARTITIONED|
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  -- STABLE_SORT [topK: 100] [$$59(ASC)]  |PARTITIONED|
+                  -- STABLE_SORT [topK: 100] [$$110(ASC)]  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                       -- STREAM_PROJECT  |PARTITIONED|
                         -- STREAM_SELECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- SORT_GROUP_BY[$$69]  |PARTITIONED|
+                            -- SORT_GROUP_BY[$$120]  |PARTITIONED|
                                     {
                                       -- AGGREGATE  |LOCAL|
                                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                                     }
-                              -- HASH_PARTITION_EXCHANGE [$$69]  |PARTITIONED|
-                                -- SORT_GROUP_BY[$$47]  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$120]  |PARTITIONED|
+                                -- SORT_GROUP_BY[$$98]  |PARTITIONED|
                                         {
                                           -- AGGREGATE  |LOCAL|
                                             -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -26,33 +26,33 @@
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- HYBRID_HASH_JOIN [$$51][$$54]  |PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$51]  |PARTITIONED|
+                                        -- HYBRID_HASH_JOIN [$$102][$$105]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$102]  |PARTITIONED|
                                             -- STREAM_PROJECT  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- HYBRID_HASH_JOIN [$$60][$$53]  |PARTITIONED|
-                                                  -- HASH_PARTITION_EXCHANGE [$$60]  |PARTITIONED|
+                                                -- HYBRID_HASH_JOIN [$$111][$$104]  |PARTITIONED|
+                                                  -- HASH_PARTITION_EXCHANGE [$$111]  |PARTITIONED|
                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- HYBRID_HASH_JOIN [$$50][$$65]  |PARTITIONED|
-                                                          -- HASH_PARTITION_EXCHANGE [$$50]  |PARTITIONED|
+                                                        -- HYBRID_HASH_JOIN [$$101][$$116]  |PARTITIONED|
+                                                          -- HASH_PARTITION_EXCHANGE [$$101]  |PARTITIONED|
                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- HYBRID_HASH_JOIN [$$49][$$63]  |PARTITIONED|
+                                                                -- HYBRID_HASH_JOIN [$$100][$$114]  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- ASSIGN  |PARTITIONED|
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                  -- HASH_PARTITION_EXCHANGE [$$63]  |PARTITIONED|
+                                                                  -- HASH_PARTITION_EXCHANGE [$$114]  |PARTITIONED|
                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                       -- ASSIGN  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- DATASOURCE_SCAN  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                          -- HASH_PARTITION_EXCHANGE [$$65]  |PARTITIONED|
+                                                          -- HASH_PARTITION_EXCHANGE [$$116]  |PARTITIONED|
                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                               -- ASSIGN  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
index 5ac6b62..906e52f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581-correlated.plan
@@ -8,7 +8,7 @@
               -- ASSIGN  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- PRE_CLUSTERED_GROUP_BY[$$95]  |PARTITIONED|
+                    -- PRE_CLUSTERED_GROUP_BY[$$144]  |PARTITIONED|
                             {
                               -- AGGREGATE  |LOCAL|
                                 -- AGGREGATE  |LOCAL|
@@ -18,187 +18,226 @@
                                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                             }
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- STABLE_SORT [$$95(ASC)]  |PARTITIONED|
+                        -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- STREAM_PROJECT  |PARTITIONED|
+                            -- HYBRID_HASH_JOIN [$$144][$$145]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- HYBRID_HASH_JOIN [$$95][$$96]  |PARTITIONED|
-                                  -- HASH_PARTITION_EXCHANGE [$$95]  |PARTITIONED|
-                                    -- PRE_CLUSTERED_GROUP_BY[$$83]  |PARTITIONED|
-                                            {
-                                              -- AGGREGATE  |LOCAL|
+                                -- PRE_CLUSTERED_GROUP_BY[$$132]  |PARTITIONED|
+                                        {
+                                          -- AGGREGATE  |LOCAL|
+                                            -- AGGREGATE  |LOCAL|
+                                              -- ASSIGN  |LOCAL|
                                                 -- AGGREGATE  |LOCAL|
-                                                  -- ASSIGN  |LOCAL|
-                                                    -- AGGREGATE  |LOCAL|
-                                                      -- STREAM_SELECT  |LOCAL|
-                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                            }
+                                                  -- STREAM_SELECT  |LOCAL|
+                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                        }
+                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                    -- STABLE_SORT [$$132(ASC)]  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- STABLE_SORT [$$83(ASC)]  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                            -- STREAM_PROJECT  |PARTITIONED|
+                                            -- HYBRID_HASH_JOIN [$$132][$$133]  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- HYBRID_HASH_JOIN [$$83][$$84]  |PARTITIONED|
-                                                  -- HASH_PARTITION_EXCHANGE [$$83]  |PARTITIONED|
-                                                    -- PRE_CLUSTERED_GROUP_BY[$$63]  |PARTITIONED|
-                                                            {
-                                                              -- AGGREGATE  |LOCAL|
-                                                                -- AGGREGATE  |LOCAL|
-                                                                  -- STREAM_SELECT  |LOCAL|
-                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                            }
+                                                -- PRE_CLUSTERED_GROUP_BY[$$112]  |PARTITIONED|
+                                                        {
+                                                          -- AGGREGATE  |LOCAL|
+                                                            -- AGGREGATE  |LOCAL|
+                                                              -- STREAM_SELECT  |LOCAL|
+                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                        }
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                        -- HYBRID_HASH_JOIN [$$112][$$122]  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- HYBRID_HASH_JOIN [$$63][$$73]  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                   -- ASSIGN  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                       -- REPLICATE  |PARTITIONED|
                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- REPLICATE  |PARTITIONED|
-                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- BTREE_SEARCH  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- ASSIGN  |PARTITIONED|
-                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- REPLICATE  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$$120]  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- BTREE_SEARCH  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- ASSIGN  |PARTITIONED|
+                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- REPLICATE  |PARTITIONED|
+                                                                    -- HASH_PARTITION_EXCHANGE [$$169]  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ASSIGN  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- REPLICATE  |PARTITIONED|
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  -- REPLICATE  |PARTITIONED|
+                                                                                  -- STREAM_PROJECT  |PARTITIONED|
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                              -- HASH_PARTITION_EXCHANGE [$$133]  |PARTITIONED|
+                                                -- ASSIGN  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN [$$126][$$125]  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$126]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ASSIGN  |PARTITIONED|
+                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- PRE_CLUSTERED_GROUP_BY[$$134]  |PARTITIONED|
+                                                                            {
+                                                                              -- AGGREGATE  |LOCAL|
+                                                                                -- AGGREGATE  |LOCAL|
+                                                                                  -- STREAM_SELECT  |LOCAL|
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                            }
+                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- HYBRID_HASH_JOIN [$$134][$$136]  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- REPLICATE  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- BTREE_SEARCH  |PARTITIONED|
                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                  -- HASH_PARTITION_EXCHANGE [$$84]  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- HYBRID_HASH_JOIN [$$77][$$76]  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- REPLICATE  |PARTITIONED|
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$169]  |PARTITIONED|
+                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                  -- REPLICATE  |PARTITIONED|
+                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$125]  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- ASSIGN  |PARTITIONED|
                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                 -- ASSIGN  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                     -- REPLICATE  |PARTITIONED|
-                                                                      -- HASH_PARTITION_EXCHANGE [$$114]  |PARTITIONED|
+                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                              -- STREAM_SELECT  |PARTITIONED|
-                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  -- PRE_CLUSTERED_GROUP_BY[$$119]  |PARTITIONED|
-                                                                                          {
-                                                                                            -- AGGREGATE  |LOCAL|
-                                                                                              -- AGGREGATE  |LOCAL|
-                                                                                                -- STREAM_SELECT  |LOCAL|
-                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                          }
-                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- HYBRID_HASH_JOIN [$$119][$$120]  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- REPLICATE  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- REPLICATE  |PARTITIONED|
-                                                                                                -- HASH_PARTITION_EXCHANGE [$$120]  |PARTITIONED|
-                                                                                                  -- ASSIGN  |PARTITIONED|
-                                                                                                    -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                          -- REPLICATE  |PARTITIONED|
-                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$76]  |PARTITIONED|
+                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                              -- HASH_PARTITION_EXCHANGE [$$145]  |PARTITIONED|
+                                -- ASSIGN  |PARTITIONED|
+                                  -- STREAM_PROJECT  |PARTITIONED|
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- HYBRID_HASH_JOIN [$$128][$$127]  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$128]  |PARTITIONED|
+                                          -- PRE_CLUSTERED_GROUP_BY[$$146]  |PARTITIONED|
+                                                  {
+                                                    -- AGGREGATE  |LOCAL|
+                                                      -- AGGREGATE  |LOCAL|
+                                                        -- AGGREGATE  |LOCAL|
+                                                          -- STREAM_SELECT  |LOCAL|
+                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                  }
+                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- STABLE_SORT [$$146(ASC)]  |PARTITIONED|
+                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                      -- HYBRID_HASH_JOIN [$$146][$$149]  |PARTITIONED|
+                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- STREAM_SELECT  |PARTITIONED|
                                                               -- STREAM_PROJECT  |PARTITIONED|
                                                                 -- ASSIGN  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
+                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                    -- PRE_CLUSTERED_GROUP_BY[$$150]  |PARTITIONED|
+                                                                            {
+                                                                              -- AGGREGATE  |LOCAL|
+                                                                                -- AGGREGATE  |LOCAL|
+                                                                                  -- STREAM_SELECT  |LOCAL|
+                                                                                    -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                            }
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- REPLICATE  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                            -- HYBRID_HASH_JOIN [$$150][$$151]  |PARTITIONED|
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                  -- HASH_PARTITION_EXCHANGE [$$96]  |PARTITIONED|
-                                    -- ASSIGN  |PARTITIONED|
-                                      -- STREAM_PROJECT  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- HYBRID_HASH_JOIN [$$79][$$78]  |PARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$$79]  |PARTITIONED|
-                                              -- PRE_CLUSTERED_GROUP_BY[$$97]  |PARTITIONED|
-                                                      {
-                                                        -- AGGREGATE  |LOCAL|
-                                                          -- AGGREGATE  |LOCAL|
-                                                            -- AGGREGATE  |LOCAL|
-                                                              -- STREAM_SELECT  |LOCAL|
-                                                                -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                      }
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- STABLE_SORT [$$97(ASC)]  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- HYBRID_HASH_JOIN [$$97][$$100]  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$97]  |PARTITIONED|
-                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                -- STREAM_SELECT  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- PRE_CLUSTERED_GROUP_BY[$$101]  |PARTITIONED|
-                                                                                {
-                                                                                  -- AGGREGATE  |LOCAL|
-                                                                                    -- AGGREGATE  |LOCAL|
-                                                                                      -- STREAM_SELECT  |LOCAL|
-                                                                                        -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                }
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- HYBRID_HASH_JOIN [$$101][$$102]  |PARTITIONED|
-                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                    -- REPLICATE  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- REPLICATE  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                        -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                -- STREAM_PROJECT  |PARTITIONED|
                                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                     -- STREAM_PROJECT  |PARTITIONED|
                                                                                       -- ASSIGN  |PARTITIONED|
                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                           -- REPLICATE  |PARTITIONED|
-                                                                                            -- HASH_PARTITION_EXCHANGE [$$120]  |PARTITIONED|
+                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- REPLICATE  |PARTITIONED|
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$169]  |PARTITIONED|
+                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                                              -- ASSIGN  |PARTITIONED|
+                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                  -- REPLICATE  |PARTITIONED|
+                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                        -- HASH_PARTITION_EXCHANGE [$$149]  |PARTITIONED|
+                                                          -- ASSIGN  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- HYBRID_HASH_JOIN [$$163][$$162]  |PARTITIONED|
+                                                                  -- HASH_PARTITION_EXCHANGE [$$163]  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                          -- STREAM_SELECT  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- PRE_CLUSTERED_GROUP_BY[$$168]  |PARTITIONED|
+                                                                                      {
+                                                                                        -- AGGREGATE  |LOCAL|
+                                                                                          -- AGGREGATE  |LOCAL|
+                                                                                            -- STREAM_SELECT  |LOCAL|
+                                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                      }
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- HYBRID_HASH_JOIN [$$168][$$169]  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- REPLICATE  |PARTITIONED|
+                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                              -- BTREE_SEARCH  |PARTITIONED|
+                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- REPLICATE  |PARTITIONED|
+                                                                                            -- HASH_PARTITION_EXCHANGE [$$169]  |PARTITIONED|
                                                                                               -- ASSIGN  |PARTITIONED|
                                                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                                                   -- ASSIGN  |PARTITIONED|
@@ -210,72 +249,27 @@
                                                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                   -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                            -- HASH_PARTITION_EXCHANGE [$$100]  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- HYBRID_HASH_JOIN [$$114][$$113]  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- REPLICATE  |PARTITIONED|
-                                                                          -- HASH_PARTITION_EXCHANGE [$$114]  |PARTITIONED|
-                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                              -- ASSIGN  |PARTITIONED|
-                                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                                  -- STREAM_SELECT  |PARTITIONED|
-                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- PRE_CLUSTERED_GROUP_BY[$$119]  |PARTITIONED|
-                                                                                              {
-                                                                                                -- AGGREGATE  |LOCAL|
-                                                                                                  -- AGGREGATE  |LOCAL|
-                                                                                                    -- STREAM_SELECT  |LOCAL|
-                                                                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                                              }
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- HYBRID_HASH_JOIN [$$119][$$120]  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- REPLICATE  |PARTITIONED|
-                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                      -- BTREE_SEARCH  |PARTITIONED|
-                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                  -- REPLICATE  |PARTITIONED|
-                                                                                                    -- HASH_PARTITION_EXCHANGE [$$120]  |PARTITIONED|
-                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                              -- REPLICATE  |PARTITIONED|
-                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                      -- HASH_PARTITION_EXCHANGE [$$113]  |PARTITIONED|
-                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                          -- ASSIGN  |PARTITIONED|
+                                                                  -- HASH_PARTITION_EXCHANGE [$$162]  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- REPLICATE  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              -- REPLICATE  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                                  -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                            -- HASH_PARTITION_EXCHANGE [$$78]  |PARTITIONED|
+                                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                        -- HASH_PARTITION_EXCHANGE [$$127]  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
+                                            -- ASSIGN  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- ASSIGN  |PARTITIONED|
-                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                    -- ASSIGN  |PARTITIONED|
+                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                    -- REPLICATE  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- REPLICATE  |PARTITIONED|
+                                                        -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- DATASOURCE_SCAN  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
index 14b31eb..c335414 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1581.plan
@@ -16,7 +16,7 @@
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ASSIGN  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- PRE_CLUSTERED_GROUP_BY[$$92]  |PARTITIONED|
+                      -- PRE_CLUSTERED_GROUP_BY[$$141]  |PARTITIONED|
                               {
                                 -- AGGREGATE  |LOCAL|
                                   -- AGGREGATE  |LOCAL|
@@ -26,155 +26,146 @@
                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                               }
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          -- STABLE_SORT [$$92(ASC)]  |PARTITIONED|
+                          -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- STREAM_PROJECT  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$141][$$142]  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- HYBRID_HASH_JOIN [$$92][$$93]  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$92]  |PARTITIONED|
-                                      -- PRE_CLUSTERED_GROUP_BY[$$32]  |PARTITIONED|
-                                              {
-                                                -- AGGREGATE  |LOCAL|
+                                  -- PRE_CLUSTERED_GROUP_BY[$$77]  |PARTITIONED|
+                                          {
+                                            -- AGGREGATE  |LOCAL|
+                                              -- AGGREGATE  |LOCAL|
+                                                -- ASSIGN  |LOCAL|
                                                   -- AGGREGATE  |LOCAL|
-                                                    -- ASSIGN  |LOCAL|
-                                                      -- AGGREGATE  |LOCAL|
-                                                        -- STREAM_SELECT  |LOCAL|
-                                                          -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                              }
+                                                    -- STREAM_SELECT  |LOCAL|
+                                                      -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                          }
+                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                      -- STABLE_SORT [$$77(ASC)]  |PARTITIONED|
                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- STABLE_SORT [$$32(ASC)]  |PARTITIONED|
+                                          -- STREAM_PROJECT  |PARTITIONED|
                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- HYBRID_HASH_JOIN [$$32][$$85]  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                        -- ASSIGN  |PARTITIONED|
-                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- REPLICATE  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$94]  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |UNPARTITIONED|
-                                                                  -- ASSIGN  |UNPARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                      -- REPLICATE  |UNPARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                          -- AGGREGATE  |UNPARTITIONED|
-                                                                            -- AGGREGATE  |UNPARTITIONED|
-                                                                              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                                -- AGGREGATE  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- STREAM_SELECT  |PARTITIONED|
-                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$85]  |PARTITIONED|
-                                                      -- ASSIGN  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- STREAM_SELECT  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                              -- ASSIGN  |PARTITIONED|
-                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                  -- ASSIGN  |PARTITIONED|
-                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- REPLICATE  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                              -- HYBRID_HASH_JOIN [$$77][$$134]  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$77]  |PARTITIONED|
+                                                  -- STREAM_PROJECT  |UNPARTITIONED|
+                                                    -- ASSIGN  |UNPARTITIONED|
+                                                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                        -- REPLICATE  |UNPARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                            -- AGGREGATE  |UNPARTITIONED|
+                                                              -- AGGREGATE  |UNPARTITIONED|
+                                                                -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                                  -- AGGREGATE  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- STREAM_SELECT  |PARTITIONED|
+                                                                        -- ASSIGN  |PARTITIONED|
                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                               -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                  -- STREAM_SELECT  |UNPARTITIONED|
-                                                                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                      -- REPLICATE  |UNPARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                          -- AGGREGATE  |UNPARTITIONED|
-                                                                                            -- AGGREGATE  |UNPARTITIONED|
-                                                                                              -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                                                -- AGGREGATE  |PARTITIONED|
-                                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                    -- STREAM_SELECT  |PARTITIONED|
-                                                                                                      -- ASSIGN  |PARTITIONED|
-                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                            -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- HASH_PARTITION_EXCHANGE [$$93]  |PARTITIONED|
-                                      -- ASSIGN  |PARTITIONED|
-                                        -- STREAM_PROJECT  |PARTITIONED|
-                                          -- STREAM_SELECT  |PARTITIONED|
-                                            -- STREAM_PROJECT  |PARTITIONED|
-                                              -- ASSIGN  |PARTITIONED|
-                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- DATASOURCE_SCAN  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                -- HASH_PARTITION_EXCHANGE [$$134]  |PARTITIONED|
+                                                  -- ASSIGN  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- STREAM_SELECT  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- STREAM_SELECT  |PARTITIONED|
-                                                            -- ASSIGN  |PARTITIONED|
-                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- PRE_CLUSTERED_GROUP_BY[$$94]  |PARTITIONED|
-                                                                        {
+                                                          -- ASSIGN  |PARTITIONED|
+                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                              -- ASSIGN  |PARTITIONED|
+                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                  -- REPLICATE  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- STREAM_PROJECT  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                            -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                              -- STREAM_SELECT  |UNPARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                                                  -- REPLICATE  |UNPARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                                                      -- AGGREGATE  |UNPARTITIONED|
+                                                                                        -- AGGREGATE  |UNPARTITIONED|
+                                                                                          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                                                            -- AGGREGATE  |PARTITIONED|
+                                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$142]  |PARTITIONED|
+                                  -- ASSIGN  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- STREAM_SELECT  |PARTITIONED|
+                                        -- STREAM_PROJECT  |PARTITIONED|
+                                          -- ASSIGN  |PARTITIONED|
+                                            -- STREAM_PROJECT  |PARTITIONED|
+                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- STREAM_SELECT  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- PRE_CLUSTERED_GROUP_BY[$$143]  |PARTITIONED|
+                                                                    {
+                                                                      -- AGGREGATE  |LOCAL|
+                                                                        -- AGGREGATE  |LOCAL|
                                                                           -- AGGREGATE  |LOCAL|
-                                                                            -- AGGREGATE  |LOCAL|
-                                                                              -- AGGREGATE  |LOCAL|
-                                                                                -- STREAM_SELECT  |LOCAL|
-                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                        }
+                                                                            -- STREAM_SELECT  |LOCAL|
+                                                                              -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                    }
+                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                -- STABLE_SORT [$$143(ASC)]  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- STABLE_SORT [$$94(ASC)]  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
                                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- HYBRID_HASH_JOIN [$$94][$$95]  |PARTITIONED|
-                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                -- REPLICATE  |PARTITIONED|
-                                                                                  -- HASH_PARTITION_EXCHANGE [$$94]  |PARTITIONED|
-                                                                                    -- STREAM_PROJECT  |UNPARTITIONED|
-                                                                                      -- ASSIGN  |UNPARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                          -- REPLICATE  |UNPARTITIONED|
-                                                                                            -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                              -- AGGREGATE  |UNPARTITIONED|
-                                                                                                -- AGGREGATE  |UNPARTITIONED|
-                                                                                                  -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                                                    -- AGGREGATE  |PARTITIONED|
-                                                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                        -- STREAM_SELECT  |PARTITIONED|
-                                                                                                          -- ASSIGN  |PARTITIONED|
-                                                                                                            -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                              -- HASH_PARTITION_EXCHANGE [$$95]  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
+                                                                        -- HYBRID_HASH_JOIN [$$143][$$144]  |PARTITIONED|
+                                                                          -- HASH_PARTITION_EXCHANGE [$$143]  |PARTITIONED|
+                                                                            -- STREAM_PROJECT  |UNPARTITIONED|
+                                                                              -- ASSIGN  |UNPARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                                                  -- REPLICATE  |UNPARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                                                      -- AGGREGATE  |UNPARTITIONED|
+                                                                                        -- AGGREGATE  |UNPARTITIONED|
+                                                                                          -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                                                            -- AGGREGATE  |PARTITIONED|
+                                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                                                  -- ASSIGN  |PARTITIONED|
+                                                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                          -- HASH_PARTITION_EXCHANGE [$$144]  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- STREAM_SELECT  |PARTITIONED|
                                                                                   -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- STREAM_SELECT  |PARTITIONED|
-                                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                                        -- ASSIGN  |PARTITIONED|
+                                                                                    -- ASSIGN  |PARTITIONED|
+                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                        -- REPLICATE  |PARTITIONED|
                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- REPLICATE  |PARTITIONED|
+                                                                                            -- STREAM_PROJECT  |PARTITIONED|
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                    -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                                        -- STREAM_SELECT  |UNPARTITIONED|
+                                                                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                  -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                    -- STREAM_SELECT  |UNPARTITIONED|
+                                                                                                      -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
+                                                                                                        -- REPLICATE  |UNPARTITIONED|
                                                                                                           -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                                            -- REPLICATE  |UNPARTITIONED|
-                                                                                                              -- ONE_TO_ONE_EXCHANGE  |UNPARTITIONED|
-                                                                                                                -- AGGREGATE  |UNPARTITIONED|
-                                                                                                                  -- AGGREGATE  |UNPARTITIONED|
-                                                                                                                    -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
-                                                                                                                      -- AGGREGATE  |PARTITIONED|
-                                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                                                                                          -- STREAM_SELECT  |PARTITIONED|
-                                                                                                                            -- ASSIGN  |PARTITIONED|
-                                                                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                            -- AGGREGATE  |UNPARTITIONED|
+                                                                                                              -- AGGREGATE  |UNPARTITIONED|
+                                                                                                                -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
+                                                                                                                  -- AGGREGATE  |PARTITIONED|
+                                                                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                                      -- STREAM_SELECT  |PARTITIONED|
+                                                                                                                        -- ASSIGN  |PARTITIONED|
+                                                                                                                          -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                              -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                  -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                                                      -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
index 90d7b02..4925110 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1591.plan
@@ -4,76 +4,76 @@
       -- STREAM_PROJECT  |PARTITIONED|
         -- ASSIGN  |PARTITIONED|
           -- STREAM_PROJECT  |PARTITIONED|
-            -- SORT_MERGE_EXCHANGE [$$112(ASC) ]  |PARTITIONED|
+            -- SORT_MERGE_EXCHANGE [$$168(ASC) ]  |PARTITIONED|
               -- STREAM_LIMIT  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- STREAM_SELECT  |PARTITIONED|
                     -- STREAM_PROJECT  |PARTITIONED|
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        -- SORT_GROUP_BY[$$121, $$122]  |PARTITIONED|
+                        -- SORT_GROUP_BY[$$177, $$178]  |PARTITIONED|
                                 {
                                   -- AGGREGATE  |LOCAL|
                                     -- NESTED_TUPLE_SOURCE  |LOCAL|
                                 }
-                          -- HASH_PARTITION_EXCHANGE [$$121, $$122]  |PARTITIONED|
-                            -- PRE_CLUSTERED_GROUP_BY[$$109, $$110]  |PARTITIONED|
+                          -- HASH_PARTITION_EXCHANGE [$$177, $$178]  |PARTITIONED|
+                            -- PRE_CLUSTERED_GROUP_BY[$$165, $$166]  |PARTITIONED|
                                     {
                                       -- AGGREGATE  |LOCAL|
                                         -- STREAM_SELECT  |LOCAL|
                                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                                     }
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                -- STABLE_SORT [$$109(ASC), $$110(ASC)]  |PARTITIONED|
+                                -- STABLE_SORT [$$165(ASC), $$166(ASC)]  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                     -- STREAM_PROJECT  |PARTITIONED|
                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                        -- HYBRID_HASH_JOIN [$$109][$$91]  |PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$109]  |PARTITIONED|
-                                            -- SORT_GROUP_BY[$$118, $$119]  |PARTITIONED|
+                                        -- HYBRID_HASH_JOIN [$$165][$$147]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$165]  |PARTITIONED|
+                                            -- SORT_GROUP_BY[$$174, $$175]  |PARTITIONED|
                                                     {
                                                       -- AGGREGATE  |LOCAL|
                                                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                     }
-                                              -- HASH_PARTITION_EXCHANGE [$$118, $$119]  |PARTITIONED|
-                                                -- PRE_CLUSTERED_GROUP_BY[$$106, $$107]  |PARTITIONED|
+                                              -- HASH_PARTITION_EXCHANGE [$$174, $$175]  |PARTITIONED|
+                                                -- PRE_CLUSTERED_GROUP_BY[$$162, $$163]  |PARTITIONED|
                                                         {
                                                           -- AGGREGATE  |LOCAL|
                                                             -- STREAM_SELECT  |LOCAL|
                                                               -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                         }
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- STABLE_SORT [$$106(ASC), $$107(ASC)]  |PARTITIONED|
+                                                    -- STABLE_SORT [$$162(ASC), $$163(ASC)]  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- HYBRID_HASH_JOIN [$$106][$$89]  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$106]  |PARTITIONED|
+                                                            -- HYBRID_HASH_JOIN [$$162][$$145]  |PARTITIONED|
+                                                              -- HASH_PARTITION_EXCHANGE [$$162]  |PARTITIONED|
                                                                 -- STREAM_PROJECT  |PARTITIONED|
                                                                   -- STREAM_SELECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- SORT_GROUP_BY[$$115, $$116]  |PARTITIONED|
+                                                                      -- SORT_GROUP_BY[$$171, $$172]  |PARTITIONED|
                                                                               {
                                                                                 -- AGGREGATE  |LOCAL|
                                                                                   -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                               }
-                                                                        -- HASH_PARTITION_EXCHANGE [$$115, $$116]  |PARTITIONED|
-                                                                          -- PRE_CLUSTERED_GROUP_BY[$$70, $$71]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$171, $$172]  |PARTITIONED|
+                                                                          -- PRE_CLUSTERED_GROUP_BY[$$126, $$127]  |PARTITIONED|
                                                                                   {
                                                                                     -- AGGREGATE  |LOCAL|
                                                                                       -- STREAM_SELECT  |LOCAL|
                                                                                         -- NESTED_TUPLE_SOURCE  |LOCAL|
                                                                                   }
                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                              -- STABLE_SORT [$$70(ASC), $$71(ASC)]  |PARTITIONED|
+                                                                              -- STABLE_SORT [$$126(ASC), $$127(ASC)]  |PARTITIONED|
                                                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- HYBRID_HASH_JOIN [$$70][$$87]  |PARTITIONED|
-                                                                                        -- HASH_PARTITION_EXCHANGE [$$70]  |PARTITIONED|
+                                                                                      -- HYBRID_HASH_JOIN [$$126][$$143]  |PARTITIONED|
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$126]  |PARTITIONED|
                                                                                           -- STREAM_PROJECT  |PARTITIONED|
                                                                                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                              -- HYBRID_HASH_JOIN [$$81][$$71]  |PARTITIONED|
-                                                                                                -- HASH_PARTITION_EXCHANGE [$$81]  |PARTITIONED|
+                                                                                              -- HYBRID_HASH_JOIN [$$137][$$127]  |PARTITIONED|
+                                                                                                -- HASH_PARTITION_EXCHANGE [$$137]  |PARTITIONED|
                                                                                                   -- ASSIGN  |PARTITIONED|
                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                       -- DATASOURCE_SCAN  |PARTITIONED|
@@ -83,12 +83,12 @@
                                                                                                   -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                       -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                        -- HASH_PARTITION_EXCHANGE [$$87]  |PARTITIONED|
+                                                                                        -- HASH_PARTITION_EXCHANGE [$$143]  |PARTITIONED|
                                                                                           -- ASSIGN  |PARTITIONED|
                                                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                                -- HYBRID_HASH_JOIN [$$92][$$74]  |PARTITIONED|
-                                                                                                  -- HASH_PARTITION_EXCHANGE [$$92]  |PARTITIONED|
+                                                                                                -- HYBRID_HASH_JOIN [$$148][$$130]  |PARTITIONED|
+                                                                                                  -- HASH_PARTITION_EXCHANGE [$$148]  |PARTITIONED|
                                                                                                     -- ASSIGN  |PARTITIONED|
                                                                                                       -- STREAM_PROJECT  |PARTITIONED|
                                                                                                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -103,12 +103,12 @@
                                                                                                             -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                                                 -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                              -- HASH_PARTITION_EXCHANGE [$$89]  |PARTITIONED|
+                                                              -- HASH_PARTITION_EXCHANGE [$$145]  |PARTITIONED|
                                                                 -- ASSIGN  |PARTITIONED|
                                                                   -- STREAM_PROJECT  |PARTITIONED|
                                                                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                      -- HYBRID_HASH_JOIN [$$94][$$77]  |PARTITIONED|
-                                                                        -- HASH_PARTITION_EXCHANGE [$$94]  |PARTITIONED|
+                                                                      -- HYBRID_HASH_JOIN [$$150][$$133]  |PARTITIONED|
+                                                                        -- HASH_PARTITION_EXCHANGE [$$150]  |PARTITIONED|
                                                                           -- ASSIGN  |PARTITIONED|
                                                                             -- STREAM_PROJECT  |PARTITIONED|
                                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
@@ -126,12 +126,12 @@
                                                                                         -- DATASOURCE_SCAN  |PARTITIONED|
                                                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                                             -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                          -- HASH_PARTITION_EXCHANGE [$$91]  |PARTITIONED|
+                                          -- HASH_PARTITION_EXCHANGE [$$147]  |PARTITIONED|
                                             -- ASSIGN  |PARTITIONED|
                                               -- STREAM_PROJECT  |PARTITIONED|
                                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- HYBRID_HASH_JOIN [$$96][$$80]  |PARTITIONED|
-                                                    -- HASH_PARTITION_EXCHANGE [$$96]  |PARTITIONED|
+                                                  -- HYBRID_HASH_JOIN [$$152][$$136]  |PARTITIONED|
+                                                    -- HASH_PARTITION_EXCHANGE [$$152]  |PARTITIONED|
                                                       -- ASSIGN  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1596.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1596.plan
index 442d1ec..d845b25 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1596.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpcds/query-ASTERIXDB-1596.plan
@@ -3,16 +3,16 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- STREAM_PROJECT  |PARTITIONED|
-          -- SORT_MERGE_EXCHANGE [$$23(ASC), $$24(ASC) ]  |PARTITIONED|
-            -- STABLE_SORT [$$23(ASC), $$24(ASC)]  |PARTITIONED|
+          -- SORT_MERGE_EXCHANGE [$$44(ASC), $$45(ASC) ]  |PARTITIONED|
+            -- STABLE_SORT [$$44(ASC), $$45(ASC)]  |PARTITIONED|
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                 -- STREAM_PROJECT  |PARTITIONED|
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    -- HYBRID_HASH_JOIN [$$23][$$27]  |PARTITIONED|
-                      -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
+                    -- HYBRID_HASH_JOIN [$$44][$$48]  |PARTITIONED|
+                      -- HASH_PARTITION_EXCHANGE [$$44]  |PARTITIONED|
                         -- STREAM_PROJECT  |PARTITIONED|
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            -- HYBRID_HASH_JOIN [$$24, $$23][$$26, $$25]  |PARTITIONED|
+                            -- HYBRID_HASH_JOIN [$$45, $$44][$$47, $$46]  |PARTITIONED|
                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                 -- DATASOURCE_SCAN  |PARTITIONED|
                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
index 655b2f5..c2790a4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$91]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$119]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$91]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$73]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$119]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$101]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -17,12 +17,12 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$73][$$80]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$101][$$108]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$82][$$77]  |PARTITIONED|
-                                -- HASH_PARTITION_EXCHANGE [$$82]  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$110][$$105]  |PARTITIONED|
+                                -- HASH_PARTITION_EXCHANGE [$$110]  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
                                       -- ASSIGN  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
index 8fd10f5..789992e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/tpch/q12_shipping_broadcast.plan
@@ -3,13 +3,13 @@
     -- STREAM_PROJECT  |PARTITIONED|
       -- ASSIGN  |PARTITIONED|
         -- SORT_MERGE_EXCHANGE [$$l_shipmode(ASC) ]  |PARTITIONED|
-          -- SORT_GROUP_BY[$$91]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$119]  |PARTITIONED|
                   {
                     -- AGGREGATE  |LOCAL|
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                   }
-            -- HASH_PARTITION_EXCHANGE [$$91]  |PARTITIONED|
-              -- SORT_GROUP_BY[$$73]  |PARTITIONED|
+            -- HASH_PARTITION_EXCHANGE [$$119]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$101]  |PARTITIONED|
                       {
                         -- AGGREGATE  |LOCAL|
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
@@ -17,11 +17,11 @@
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                   -- STREAM_PROJECT  |PARTITIONED|
                     -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                      -- HYBRID_HASH_JOIN [$$73][$$80]  |PARTITIONED|
+                      -- HYBRID_HASH_JOIN [$$101][$$108]  |PARTITIONED|
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                           -- STREAM_PROJECT  |PARTITIONED|
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              -- HYBRID_HASH_JOIN [$$81][$$77]  |PARTITIONED|
+                              -- HYBRID_HASH_JOIN [$$109][$$105]  |PARTITIONED|
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                   -- STREAM_PROJECT  |PARTITIONED|
                                     -- STREAM_SELECT  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan
index ed40740..18aab46 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan
@@ -34,53 +34,56 @@
                                             -- STABLE_SORT [$$47(ASC), $$53(ASC)]  |PARTITIONED|
                                               -- HASH_PARTITION_EXCHANGE [$$47, $$53]  |PARTITIONED|
                                                 -- STREAM_PROJECT  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- NESTED_LOOP  |PARTITIONED|
-                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                  -- STREAM_SELECT  |PARTITIONED|
+                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                      -- ASSIGN  |PARTITIONED|
                                                         -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- STREAM_SELECT  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- PRE_CLUSTERED_GROUP_BY[$$40, $$52]  |PARTITIONED|
-                                                                      {
-                                                                        -- AGGREGATE  |LOCAL|
-                                                                          -- STREAM_SELECT  |LOCAL|
-                                                                            -- NESTED_TUPLE_SOURCE  |LOCAL|
-                                                                      }
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STABLE_SORT [$$40(ASC), $$52(ASC)]  |PARTITIONED|
-                                                                    -- HASH_PARTITION_EXCHANGE [$$40, $$52]  |PARTITIONED|
-                                                                      -- STREAM_PROJECT  |PARTITIONED|
-                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                          -- HYBRID_HASH_JOIN [$$50][$$43]  |PARTITIONED|
-                                                                            -- HASH_PARTITION_EXCHANGE [$$50]  |PARTITIONED|
-                                                                              -- NESTED_LOOP  |PARTITIONED|
-                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- ASSIGN  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                                -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- ASSIGN  |PARTITIONED|
-                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                        -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                                            -- HASH_PARTITION_EXCHANGE [$$43]  |PARTITIONED|
-                                                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                                                -- ASSIGN  |PARTITIONED|
-                                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
-                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                                          -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                                        -- STREAM_PROJECT  |PARTITIONED|
-                                                          -- ASSIGN  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                            -- BTREE_SEARCH  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                -- STABLE_SORT [$$65(ASC)]  |PARTITIONED|
                                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                        -- RTREE_SEARCH  |PARTITIONED|
+                                                                          -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                            -- ASSIGN  |PARTITIONED|
+                                                                              -- STREAM_PROJECT  |PARTITIONED|
+                                                                                -- STREAM_SELECT  |PARTITIONED|
+                                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                    -- PRE_CLUSTERED_GROUP_BY[$$40, $$52]  |PARTITIONED|
+                                                                                            {
+                                                                                              -- AGGREGATE  |LOCAL|
+                                                                                                -- STREAM_SELECT  |LOCAL|
+                                                                                                  -- NESTED_TUPLE_SOURCE  |LOCAL|
+                                                                                            }
+                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                        -- STABLE_SORT [$$40(ASC), $$52(ASC)]  |PARTITIONED|
+                                                                                          -- HASH_PARTITION_EXCHANGE [$$40, $$52]  |PARTITIONED|
+                                                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                -- HYBRID_HASH_JOIN [$$50][$$43]  |PARTITIONED|
+                                                                                                  -- HASH_PARTITION_EXCHANGE [$$50]  |PARTITIONED|
+                                                                                                    -- NESTED_LOOP  |PARTITIONED|
+                                                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                      -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                              -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                  -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                                                                  -- HASH_PARTITION_EXCHANGE [$$43]  |PARTITIONED|
+                                                                                                    -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                      -- ASSIGN  |PARTITIONED|
+                                                                                                        -- STREAM_PROJECT  |PARTITIONED|
+                                                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                            -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                                                              -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                                                -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029.plan
index 71070bd..048b6ff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029.plan
@@ -19,57 +19,44 @@
                           -- STABLE_SORT [$$36(ASC), $$37(ASC)]  |PARTITIONED|
                             -- HASH_PARTITION_EXCHANGE [$$36, $$37]  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- NESTED_LOOP  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- NESTED_LOOP  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
+                                -- STREAM_SELECT  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- BTREE_SEARCH  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STABLE_SORT [$$64(ASC)]  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_SELECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
+                                                    -- RTREE_SEARCH  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- NESTED_LOOP  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- BTREE_SEARCH  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- REPLICATE  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- ASSIGN  |PARTITIONED|
+                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                      -- ASSIGN  |PARTITIONED|
-                                        -- STREAM_PROJECT  |PARTITIONED|
-                                          -- STREAM_SELECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- BTREE_SEARCH  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- REPLICATE  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- BTREE_SEARCH  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- BTREE_SEARCH  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
             -- BROADCAST_EXCHANGE  |PARTITIONED|
               -- AGGREGATE  |UNPARTITIONED|
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029_2.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029_2.plan
index 71070bd..048b6ff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029_2.plan
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1029_2.plan
@@ -19,57 +19,44 @@
                           -- STABLE_SORT [$$36(ASC), $$37(ASC)]  |PARTITIONED|
                             -- HASH_PARTITION_EXCHANGE [$$36, $$37]  |PARTITIONED|
                               -- STREAM_PROJECT  |PARTITIONED|
-                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                  -- NESTED_LOOP  |PARTITIONED|
-                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                      -- NESTED_LOOP  |PARTITIONED|
-                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
+                                -- STREAM_SELECT  |PARTITIONED|
+                                  -- STREAM_SELECT  |PARTITIONED|
+                                    -- STREAM_PROJECT  |PARTITIONED|
+                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                        -- BTREE_SEARCH  |PARTITIONED|
+                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                            -- STABLE_SORT [$$64(ASC)]  |PARTITIONED|
                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                -- DATASOURCE_SCAN  |PARTITIONED|
+                                                -- STREAM_PROJECT  |PARTITIONED|
                                                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                        -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                          -- STREAM_PROJECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_SELECT  |PARTITIONED|
-                                                -- ASSIGN  |PARTITIONED|
-                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                    -- BTREE_SEARCH  |PARTITIONED|
+                                                    -- RTREE_SEARCH  |PARTITIONED|
                                                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                        -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                                        -- ASSIGN  |PARTITIONED|
                                                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                            -- STREAM_PROJECT  |PARTITIONED|
+                                                            -- NESTED_LOOP  |PARTITIONED|
                                                               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                -- BTREE_SEARCH  |PARTITIONED|
-                                                                  -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                    -- REPLICATE  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- ASSIGN  |PARTITIONED|
+                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                      -- DATASOURCE_SCAN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
                                                                           -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
-                                    -- BROADCAST_EXCHANGE  |PARTITIONED|
-                                      -- ASSIGN  |PARTITIONED|
-                                        -- STREAM_PROJECT  |PARTITIONED|
-                                          -- STREAM_SELECT  |PARTITIONED|
-                                            -- ASSIGN  |PARTITIONED|
-                                              -- STREAM_PROJECT  |PARTITIONED|
-                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                  -- BTREE_SEARCH  |PARTITIONED|
-                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                      -- STABLE_SORT [$$58(ASC)]  |PARTITIONED|
-                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                          -- STREAM_PROJECT  |PARTITIONED|
-                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                              -- BTREE_SEARCH  |PARTITIONED|
-                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                  -- STREAM_PROJECT  |PARTITIONED|
-                                                                    -- ASSIGN  |PARTITIONED|
-                                                                      -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                        -- REPLICATE  |PARTITIONED|
-                                                                          -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                                                                            -- ASSIGN  |PARTITIONED|
-                                                                              -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
+                                                              -- BROADCAST_EXCHANGE  |PARTITIONED|
+                                                                -- STREAM_PROJECT  |PARTITIONED|
+                                                                  -- ASSIGN  |PARTITIONED|
+                                                                    -- STREAM_SELECT  |PARTITIONED|
+                                                                      -- ASSIGN  |PARTITIONED|
+                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                          -- BTREE_SEARCH  |PARTITIONED|
+                                                                            -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                              -- STABLE_SORT [$$55(ASC)]  |PARTITIONED|
+                                                                                -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                  -- STREAM_PROJECT  |PARTITIONED|
+                                                                                    -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                      -- BTREE_SEARCH  |PARTITIONED|
+                                                                                        -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
+                                                                                          -- ASSIGN  |PARTITIONED|
+                                                                                            -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
             -- BROADCAST_EXCHANGE  |PARTITIONED|
               -- AGGREGATE  |UNPARTITIONED|
                 -- RANDOM_MERGE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
index 91e53d8..ea19f64 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
@@ -67,8 +67,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -95,8 +95,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
index 634647d..090b6f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
@@ -67,8 +67,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -109,8 +109,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_01.ast
index de81aed..5b100e0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_01.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_02.ast
index dcd7ab5..3de3b5e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_02.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_03.ast
index 9a5df78..9950cbb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-join_03.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_01.ast
index b095188..7650cff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_01.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_02.ast
index 31c5af0..3a38cb9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_02.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_03.ast
index ca4fecf..eb17fc3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_03.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_04.ast
index 60b812b..1958182 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_04.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_05.ast
index fb0b3ac..c6c02b1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_05.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_06.ast
index a6ad0f3..f3b85dd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-composite-key-prefix-join_06.ast
@@ -22,13 +22,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-multipred.ast
index ee3eae8..dff4049 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-multipred.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_01.ast
index 9f7c12c..85ce2d6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_02.ast
index 6794f96..db8b535 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join-neg_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_01.ast
index c15b75c..9fbb8f1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_02.ast
index 6a3eeb1..dd2d5c0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_03.ast
index 58db75b..72ee37b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_03.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_04.ast
index f1a48c1..2bbf27f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_04.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_05.ast
index 4f5078b..c02a153 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-equi-join_05.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_01.ast
index 8cde586..e99a722 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_02.ast
index 98d29cc..968d0ce 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-ge-join_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_01.ast
index 10f3324..aaa16a4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_02.ast
index 9923779..53c60ed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-gt-join_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_01.ast
index 6a8fb8d..7c6cd3d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_02.ast
index 21fb361..d97a727 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-le-join_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_01.ast
index 60f1848..9a305b6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_01.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_02.ast
index fe67f96..ae4c9ed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/primary-lt-join_02.ast
@@ -13,12 +13,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multiindex.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multiindex.ast
index 15a3847..0ce7de3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multiindex.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multiindex.ast
@@ -71,13 +71,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multipred.ast
index ae18847..c5348a5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join-multipred.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_01.ast
index bcc9a3d..abf836a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_02.ast
index b581216..4ca8e3e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_03.ast
index dd29bbd..de6ec10 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_04.ast
index fc898df..aa130d5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_04.ast
@@ -12,13 +12,13 @@
 SELECT [
 *
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$a ]
   INNER JOIN
-    FunctionCall Metadata.dataset@1[
-      LiteralExpr [STRING] [testdst2]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [test.testdst2]
     ]
     AS Variable [ Name=$b ]
     ON
@@ -34,8 +34,8 @@
       ]
     ]
   INNER JOIN
-    FunctionCall Metadata.dataset@1[
-      LiteralExpr [STRING] [testdst3]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [test.testdst3]
     ]
     AS Variable [ Name=$c ]
     ON
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_05.ast
index 589b5e1..de732c1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_05.ast
@@ -17,8 +17,8 @@
   ]
   AS Variable [ Name=$bar ]
   INNER JOIN
-    FunctionCall Metadata.dataset@1[
-      LiteralExpr [STRING] [testdst]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [test.testdst]
     ]
     AS Variable [ Name=$testdst ]
     ON
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_06.ast
index 141ee40..36219e2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index-join/secondary-equi-join_06.ast
@@ -20,26 +20,26 @@
         SELECT ELEMENT [
         LiteralExpr [LONG] [1]
         ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#2 ]
+        FROM [          Variable [ Name=#2 ]
+          AS Variable [ Name=#3 ]
         ]
       )
     ]
-    null
+    $1
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [testdst]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.testdst]
       ]
       AS Variable [ Name=$testdst ]
     ]
     Groupby
       Variable [ Name=$val ]
       :=
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [val]
+      FunctionCall asterix.field-access-by-name@2[
         Variable [ Name=$testdst ]
+        LiteralExpr [STRING] [val]
       ]
-      GROUP AS Variable [ Name=#1 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         testdst:=Variable [ Name=$testdst ]
       )
@@ -47,8 +47,8 @@
   )
   AS Variable [ Name=$bar ]
   INNER JOIN
-    FunctionCall Metadata.dataset@1[
-      LiteralExpr [STRING] [testdst2]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [test.testdst2]
     ]
     AS Variable [ Name=$testdst2 ]
     ON
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-01.ast
index 8aea035..9cfb593 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-01.ast
@@ -15,8 +15,8 @@
   Field=message
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CHPReports]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [emergencyTest.CHPReports]
   ]
   AS Variable [ Name=$emergency ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-02.ast
index dbf643e..9359bfa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-02.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emergency ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CHPReports]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [emergencyTest.CHPReports]
   ]
   AS Variable [ Name=$emergency ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-03.ast
index 28e2f15..95baeaa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-03.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emergency ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CHPReports]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [emergencyTest.CHPReports]
   ]
   AS Variable [ Name=$emergency ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-04.ast
index d133226..6c2d45c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-datetime-04.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emergency ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CHPReports]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [emergencyTest.CHPReports]
   ]
   AS Variable [ Name=$emergency ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-01.ast
index ca6b464..a110598 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-01.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-02.ast
index 4ff1776..8bd4191 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-02.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-03.ast
index 72f6e53..b17aba4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-03.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-04.ast
index 4c7d7e2..0c5b0b8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-04.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-05.ast
index 888d8bb..6f2636a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-05.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-06.ast
index 8d4e7c7..8f62e88 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-06.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-07.ast
index e07b6a3..79b8f81 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-07.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-08.ast
index 3bde6c3..6186d45 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-08.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-09.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-09.ast
index 193ba2f..b4d23a1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-09.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-09.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-10.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-10.ast
index 7c934ef..ec74a73 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-10.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-10.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-11.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-11.ast
index d14d1610..d77d307 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-11.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-11.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-12.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-12.ast
index 74507b1..d32d25f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-12.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-12.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-13.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-13.ast
index 3a1e8c2..a88694a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-13.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-13.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-14.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-14.ast
index 105c9e8..fe8f3c2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-14.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-14.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-15.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-15.ast
index 5ef21e9..e0a006d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-15.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-15.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-16.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-16.ast
index a83918f..ec18343 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-16.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-16.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-17.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-17.ast
index 5335a9d..c6fc17b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-17.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-17.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-18.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-18.ast
index a083cae..291caac 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-18.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-18.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-19.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-19.ast
index acee21f..3cdfc00 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-19.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-19.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-20.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-20.ast
index 8daf39c..e75f875 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-20.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-20.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-21.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-21.ast
index d6f14a4..991ad2b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-21.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-21.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-22.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-22.ast
index 9fefece..9ae6cbf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-22.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-22.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-23.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-23.ast
index d42ddff..6e59c20 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-23.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-23.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-24.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-24.ast
index 8b60775..f595f46 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-24.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-24.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-25.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-25.ast
index 3de69d0..1b35152 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-25.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-25.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-26.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-26.ast
index 744b9e1..292ab52 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-26.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-26.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-27.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-27.ast
index 47b67c8..ea45444 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-27.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-27.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-28.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-28.ast
index 11b9e3a..d136685 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-28.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-28.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-29.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-29.ast
index 8e90953..8d12bf4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-29.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-29.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-30.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-30.ast
index 75d9cba..1d6ab85 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-30.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-30.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-31.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-31.ast
index 39a45ef..2c1ac84 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-31.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-31.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-32.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-32.ast
index 454d067..6ddf16a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-32.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-primary-32.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-33.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-33.ast
index 95b4200..501128f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-33.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-33.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-34.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-34.ast
index 8dd2668..03744ba 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-34.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-34.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-35.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-35.ast
index 719d911..bd3d2a6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-35.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-35.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-36.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-36.ast
index 7645930..ae541cd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-36.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-36.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-37.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-37.ast
index 1f18352..9836775 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-37.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-37.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-38.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-38.ast
index 60d9877..def5c12 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-38.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-38.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-39.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-39.ast
index e010213..15aa892 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-39.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-39.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-40.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-40.ast
index 31073b2..bf3f516 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-40.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-40.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-41.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-41.ast
index d1c498a..1917d14 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-41.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-41.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-42.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-42.ast
index 9f8f1f3..18dc951 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-42.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-42.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-43.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-43.ast
index 82fbc31..4ab44cb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-43.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-43.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-44.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-44.ast
index 4b9bb99..7d3ec46 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-44.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-44.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-45.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-45.ast
index 974f3e2..09aebbb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-45.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-45.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-46.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-46.ast
index a6aa58d..19c187a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-46.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-46.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-47.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-47.ast
index eec8852..b0bd64d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-47.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-47.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-48.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-48.ast
index 8309073..f7dd2f5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-48.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-48.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-49.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-49.ast
index dcafe2a..463d7b1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-49.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-49.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-50.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-50.ast
index 1213868..5aa1c6d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-50.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-50.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-51.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-51.ast
index fdd3002..e5207d6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-51.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-51.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-52.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-52.ast
index 84213c9..e49bdf3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-52.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-52.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-53.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-53.ast
index 1b6663f..1b9bfb2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-53.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-53.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-54.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-54.ast
index 35efa3f..75ad1ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-54.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-54.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-55.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-55.ast
index c1c49c0..7b18229 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-55.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-55.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-56.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-56.ast
index 96932ef..94ef3cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-56.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-56.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-57.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-57.ast
index 8b68fad..7d2d833 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-57.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-57.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-58.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-58.ast
index 47ae9ca..7425220 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-58.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-58.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-59.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-59.ast
index 25c9303..9b272f2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-59.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-59.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-60.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-60.ast
index 303fa65..d367499 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-60.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-60.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-61.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-61.ast
index bad9dc2..329f7a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-61.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-61.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-62.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-62.ast
index 663d35f..52d7a34 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-62.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-62.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-63.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-63.ast
index 04a40fa..818e3ad 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-63.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-63.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-64.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-64.ast
new file mode 100644
index 0000000..2f61ea8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-64.ast
@@ -0,0 +1,35 @@
+DataverseUse test
+WriteOutputTo asterix_nc1:rttest/btree-index_btree-secondary-64.adm
+TypeDecl TestType [
+  open RecordType {
+    id : integer,
+    fname : string,
+    lname : string
+  }
+]
+DatasetDecl testdst(TestType) partitioned by [[id]]
+Query:
+SELECT [
+FunctionCall asterix.sql-count@1[
+  (
+    SELECT ELEMENT [
+    LiteralExpr [LONG] [1]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#2 ]
+    ]
+  )
+]
+count
+]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
+  ]
+  AS Variable [ Name=$testdst ]
+]
+Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    testdst:=Variable [ Name=$testdst ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-65.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-65.ast
new file mode 100644
index 0000000..a18469f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-65.ast
@@ -0,0 +1,44 @@
+DataverseUse test
+WriteOutputTo asterix_nc1:rttest/btree-index_btree-secondary-65.adm
+TypeDecl TestType [
+  open RecordType {
+    id : integer,
+    fname : string,
+    lname : string
+  }
+]
+DatasetDecl testdst(TestType) partitioned by [[id]]
+Query:
+SELECT [
+FunctionCall asterix.sql-count@1[
+  (
+    SELECT ELEMENT [
+    LiteralExpr [LONG] [1]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#2 ]
+    ]
+  )
+]
+count
+]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
+  ]
+  AS Variable [ Name=$t ]
+]
+Where
+  OperatorExpr [
+    FieldAccessor [
+      Variable [ Name=$t ]
+      Field=id
+    ]
+    >
+    LiteralExpr [LONG] [3]
+  ]
+Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    t:=Variable [ Name=$t ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-66.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-66.ast
new file mode 100644
index 0000000..d4e56da
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-66.ast
@@ -0,0 +1,41 @@
+DataverseUse test
+WriteOutputTo asterix_nc1:rttest/btree-index_btree-secondary-66.adm
+TypeDecl TestType [
+  open RecordType {
+    id : integer,
+    fname : string,
+    lname : string
+  }
+]
+DatasetDecl testdst(TestType) partitioned by [[id]]
+Query:
+SELECT [
+FunctionCall asterix.sql-max@1[
+  (
+    SELECT ELEMENT [
+    FieldAccessor [
+      FieldAccessor [
+        Variable [ Name=#2 ]
+        Field=t
+      ]
+      Field=id
+    ]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#2 ]
+    ]
+  )
+]
+maximum
+]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
+  ]
+  AS Variable [ Name=$t ]
+]
+Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    t:=Variable [ Name=$t ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-67.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-67.ast
new file mode 100644
index 0000000..128db69
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/btree-index/btree-secondary-67.ast
@@ -0,0 +1,41 @@
+DataverseUse test
+WriteOutputTo asterix_nc1:rttest/btree-index_btree-secondary-67.adm
+TypeDecl TestType [
+  open RecordType {
+    id : integer,
+    fname : string,
+    lname : string
+  }
+]
+DatasetDecl testdst(TestType) partitioned by [[id]]
+Query:
+SELECT [
+FunctionCall asterix.sql-count@1[
+  (
+    SELECT ELEMENT [
+    FieldAccessor [
+      FieldAccessor [
+        Variable [ Name=#2 ]
+        Field=t
+      ]
+      Field=id
+    ]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#2 ]
+    ]
+  )
+]
+count
+]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
+  ]
+  AS Variable [ Name=$t ]
+]
+Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    t:=Variable [ Name=$t ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/collocated.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/collocated.ast
index 952d004..712f8f0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/collocated.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/collocated.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Users]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [colocated.Users]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Visitors]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [colocated.Visitors]
   ]
   AS Variable [ Name=$visitor ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-complex.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-complex.ast
index 91064d9..165e2e3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-complex.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-complex.ast
@@ -25,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-simple.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-simple.ast
index 32cfc91..07b1760 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-simple.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/consolidate-selects-simple.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/count-tweets.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/count-tweets.ast
index 133b650..ec7c370 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/count-tweets.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/count-tweets.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.TwitterData]
   ]
   AS Variable [ Name=$t ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tokens]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.tokens]
   ]
   AS Variable [ Name=$token ]
 ]
@@ -63,5 +63,6 @@
   (
     t:=Variable [ Name=$t ]
     token:=Variable [ Name=$token ]
+    tokens:=Variable [ Name=$tokens ]
   )
 
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/cust_group_no_agg.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/cust_group_no_agg.ast
index 48b11ff..b02db45 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/cust_group_no_agg.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/cust_group_no_agg.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$name ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [group_no_agg.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/denorm-cust-order.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/denorm-cust-order.ast
index cf3721d..35389ee 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/denorm-cust-order.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/denorm-cust-order.ast
@@ -43,11 +43,18 @@
   (
     LiteralExpr [STRING] [cust]
     :
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [cust]
-      Variable [ Name=$cid ]
-      Variable [ Name=#1 ]
-    ]
+    (
+      SELECT [
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [c]
+      ]
+      c
+      ]
+      FROM [        Variable [ Name=$g ]
+        AS Variable [ Name=$g ]
+      ]
+    )
   )
   (
     LiteralExpr [STRING] [cnt-orders]
@@ -56,12 +63,12 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=#2 ]
+          Variable [ Name=#1 ]
           Field=o
         ]
         ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#2 ]
+        FROM [          Variable [ Name=$g ]
+          AS Variable [ Name=#1 ]
         ]
       )
     ]
@@ -69,21 +76,28 @@
   (
     LiteralExpr [STRING] [orders]
     :
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [o]
-      Variable [ Name=$cid ]
-      Variable [ Name=#1 ]
-    ]
+    (
+      SELECT [
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [o]
+      ]
+      o
+      ]
+      FROM [        Variable [ Name=$g ]
+        AS Variable [ Name=$g ]
+      ]
+    )
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [custorder.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [custorder.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
@@ -106,7 +120,7 @@
     Variable [ Name=$c ]
     Field=cid
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=$g ]
   (
     c:=Variable [ Name=$c ]
     o:=Variable [ Name=$o ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/distinct_aggregate.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/distinct_aggregate.ast
index 7dfc9a1..410d63f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/distinct_aggregate.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/distinct_aggregate.ast
@@ -45,7 +45,7 @@
           Field=g
         ]
         ]
-        FROM [          Variable [ Name=#2 ]
+        FROM [          Variable [ Name=#1 ]
           AS Variable [ Name=#3 ]
         ]
       )
@@ -73,8 +73,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItems_q1]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItems_q1]
       ]
       AS Variable [ Name=$l ]
     ]
@@ -106,7 +106,7 @@
         Variable [ Name=$l ]
         Field=l_suppkey
       ]
-      GROUP AS Variable [ Name=#1 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         l:=Variable [ Name=$l ]
       )
@@ -127,7 +127,7 @@
     Variable [ Name=$g ]
     Field=l_linestatus
   ]
-  GROUP AS Variable [ Name=#2 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     g:=Variable [ Name=$g ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/filter-nested.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/filter-nested.ast
index 3819ead..0d434de 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/filter-nested.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/filter-nested.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-dblp-csx.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-dblp-csx.ast
index 8528d84..7e68aa8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-dblp-csx.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-dblp-csx.ast
@@ -35,23 +35,23 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fj-dblp-csx.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tokensDBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fj-dblp-csx.tokensDBLP]
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fj-dblp-csx.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tokensCSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fj-dblp-csx.tokensCSX]
   ]
   AS Variable [ Name=$prefixTokenCSX ]
 ]
@@ -85,14 +85,14 @@
           Field=title
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fj-dblp-csx.DBLP]
           ]
           AS Variable [ Name=$paper ]
         ]
       )
       AS Variable [ Name=$tokenRanked ]
- AT 
+ AT
 Variable [ Name=$i ]
     ]
     Where
@@ -136,14 +136,14 @@
           Field=title
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fj-dblp-csx.DBLP]
           ]
           AS Variable [ Name=$paper ]
         ]
       )
       AS Variable [ Name=$tokenRanked ]
- AT 
+ AT
 Variable [ Name=$i ]
     ]
     Where
@@ -176,6 +176,12 @@
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    unrankedTokensDBLP:=Variable [ Name=$unrankedTokensDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    unrankedTokensCSX:=Variable [ Name=$unrankedTokensCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase1.ast
index 4d5fe2b..f0107fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase1.ast
@@ -36,8 +36,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Users]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [rares03.Users]
   ]
   AS Variable [ Name=$user ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$item ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Users]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [rares03.Users]
           ]
           AS Variable [ Name=$user ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase2-with-hints.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase2-with-hints.ast
index 595e2cb..760a65f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase2-with-hints.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/fj-phase2-with-hints.ast
@@ -28,8 +28,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP_fuzzyjoin_078]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin_078.DBLP_fuzzyjoin_078]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -54,8 +54,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP_fuzzyjoin_078]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin_078.DBLP_fuzzyjoin_078]
           ]
           AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/hashjoin-with-unnest.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/hashjoin-with-unnest.ast
index 45bdd94..3075d61 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/hashjoin-with-unnest.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/hashjoin-with-unnest.ast
@@ -23,13 +23,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$m ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t2]
   ]
   AS Variable [ Name=$n ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inlined_q18_large_volume_customer.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inlined_q18_large_volume_customer.ast
index 2f16552..6205982 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inlined_q18_large_volume_customer.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inlined_q18_large_volume_customer.ast
@@ -87,8 +87,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [inlined_q18_large_volume_customer.l]
           ]
           AS Variable [ Name=$j ]
         ]
@@ -97,13 +97,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [inlined_q18_large_volume_customer.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [inlined_q18_large_volume_customer.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
@@ -126,8 +126,8 @@
               Field=l_quantity
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [l]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [inlined_q18_large_volume_customer.l]
               ]
               AS Variable [ Name=$i ]
             ]
@@ -136,8 +136,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItems]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [inlined_q18_large_volume_customer.LineItems]
       ]
       AS Variable [ Name=$l ]
     ]
@@ -148,7 +148,7 @@
         Variable [ Name=$l ]
         Field=l_orderkey
       ]
-      GROUP AS Variable [ Name=#1 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         l:=Variable [ Name=$l ]
       )
@@ -156,8 +156,8 @@
   )
   AS Variable [ Name=$t ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItems]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [inlined_q18_large_volume_customer.LineItems]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -241,7 +241,7 @@
     Variable [ Name=$o ]
     Field=o_totalprice
   ]
-  GROUP AS Variable [ Name=#2 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     c:=Variable [ Name=$c ]
     o:=Variable [ Name=$o ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/introhashpartitionmerge.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/introhashpartitionmerge.ast
index 982989c..bf1b799 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/introhashpartitionmerge.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/introhashpartitionmerge.ast
@@ -14,8 +14,8 @@
   Field=rank
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TOKENSRANKEDADM]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.TOKENSRANKEDADM]
   ]
   AS Variable [ Name=$token1 ]
 ,
@@ -23,8 +23,8 @@
     SELECT ELEMENT [
     Variable [ Name=$tokenRanked ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TOKENSRANKEDADM]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.TOKENSRANKEDADM]
       ]
       AS Variable [ Name=$tokenRanked ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains-panic.ast
index 56389af..f63ae69 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains-panic.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains.ast
index 4647d35..4bfd511 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-contains.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check-panic.ast
index df255ab..b91eee9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check-panic.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check.ast
index 2a927e0..f3ec986 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-check.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-panic.ast
index 3ec78a2..96828e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance-panic.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance.ast
index 3c737f8..adf6402 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-edit-distance.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
index 77d8b6f..2a4a892 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
index b79c9e5..be82f72 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard-check.ast
index 7e924cc..65dfc45 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard-check.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard.ast
index 8649d0b..9919418 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ngram-jaccard.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check-panic.ast
index 3ebbe43..81e0f92 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check-panic.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check.ast
index 9c1ae38..6125ef7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-check.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-panic.ast
index 70b342f..84b062d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance-panic.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance.ast
index 292183a..a452237 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-edit-distance.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
index 3d2e76f..eeca2a9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
@@ -30,8 +30,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-jaccard.ast
index d43d96d..64f857c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-fuzzyeq-jaccard.ast
@@ -30,8 +30,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard-check.ast
index cee92b5..95538bb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard-check.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard.ast
index 57cdedf..edd77ff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/olist-jaccard.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
index 9679cce..d1cd1fb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
@@ -30,8 +30,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard-check.ast
index 16cfff9..cfdd948 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard-check.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard.ast
index c3d0c15..239a83fbb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/ulist-jaccard.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-contains.ast
index 55076fa..6ba9e63 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-contains.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-fuzzyeq-jaccard.ast
index 3742b4b..31c6b58 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-fuzzyeq-jaccard.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard-check.ast
index 7f14b74..d0f765c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard-check.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard.ast
index 5e1bf73..93cc528 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-basic/word-jaccard.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
index def528d..4573700 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
index b96e02a..80a0c1e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
index 59aaf68..1426c21 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let.ast
index ce9a6ac..6be8d11 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-let.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-substring.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-substring.ast
index 3b99da0..23b6ef3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-substring.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-substring.ast
@@ -31,8 +31,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
index f6a75d9..4e740dd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
@@ -31,8 +31,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-let.ast
index 6462966..bc735ac 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-let.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-multi-let.ast
index eabc337..c56b4cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ngram-jaccard-check-multi-let.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let-panic.ast
index e63b966..73eea6c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let-panic.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let.ast
index 16b17d7..8519356 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-edit-distance-check-let.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-jaccard-check-let.ast
index e9048e6..2069fba 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/olist-jaccard-check-let.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ulist-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ulist-jaccard-check-let.ast
index 89c5d25..ddda42c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ulist-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/ulist-jaccard-check-let.ast
@@ -28,8 +28,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-let.ast
index 9db1fba..53299c1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-let.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-multi-let.ast
index efa64a5..36c3ad3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-complex/word-jaccard-check-multi-let.ast
@@ -25,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline.ast
index 4af417c..149dadd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance.ast
index 18c2dd2..6e07481 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-edit-distance.ast
index 2cdb356..c3dff99 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-edit-distance.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-jaccard.ast
index 75f879d..ed58c20 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-fuzzyeq-jaccard.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline.ast
index 0ecd9c9..9ba0a6c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard.ast
index f4d4aa2..c14577e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline.ast
index 19c22b6..48c7269 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline.ast
@@ -50,13 +50,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance.ast
index 0aea7e8..309af23 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-edit-distance.ast
index 3520b20..df63e8a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-edit-distance.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-jaccard.ast
index efeb564..ab7d128 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-fuzzyeq-jaccard.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline.ast
index 5c2bebc..177a4ab 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline.ast
@@ -50,13 +50,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard.ast
index 066a527..174ce27 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-fuzzyeq-jaccard.ast
index 8712516..bff6924 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-fuzzyeq-jaccard.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline.ast
index 3240a70..fc3c6da 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline.ast
@@ -50,13 +50,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard.ast
index d5985bd..a217c50 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-fuzzyeq-jaccard.ast
index 65a2fe2..64fb45b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-fuzzyeq-jaccard.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline.ast
index a14d016..dd4d340 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard.ast
index fffedbd..b05b6c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/issue741.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/issue741.ast
index bbd397c..feab647 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/issue741.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/issue741.ast
@@ -43,8 +43,8 @@
         Field=tweetid
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
index 0aa744a..e0091da 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
@@ -73,8 +73,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -121,8 +121,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
index 3852df8..7953333 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
@@ -73,8 +73,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -121,8 +121,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-contains.ast
index c26c8cb..ec9d99f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-contains.ast
@@ -31,13 +31,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_01.ast
index e3821b0..fb901be 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_02.ast
index ae63e3d..0ca48a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_03.ast
index 5709b45..ba2ec52 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_04.ast
index 1b5ba0c..b7b4232 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-check_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-contains.ast
index 3cae2a3..379fb25 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-contains.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_01.ast
index db1ad32..31ae3d4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_02.ast
index c28ea30..a81df4e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_03.ast
index 129caed..331c38e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_04.ast
index 56af5ec..21aad57 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-edit-distance_04.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
index ef81304..08baa3b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
index ef81304..08baa3b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
index 9a4c3a1..c416bc8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
index a87fcf5..e9579c5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
@@ -38,13 +38,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
index 0fa3286..edbe33a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
@@ -38,13 +38,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
index b0eb79d..4b0b23e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_01.ast
index 7115f28..6335c6e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_01.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_02.ast
index 26fc4de..2b6296d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_02.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_03.ast
index b3f6815..a217b81 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_04.ast
index 9a784e3..14ce520 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard-check_04.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_01.ast
index 0507902..99dc8bd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_01.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_02.ast
index 7e9a44e..ab4f3a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_02.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_03.ast
index a95b3ea..21f2967 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_04.ast
index 28f796f..f72bb82 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ngram-jaccard_04.ast
@@ -31,13 +31,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_01.ast
index 7a54640..51f5dbb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_02.ast
index 171b815..6cd3181 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_03.ast
index 7b6031c..d4b9f2b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_04.ast
index fa3418f..956b14b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance-check_04.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_01.ast
index d2c4f7b..43f7ed9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_02.ast
index cdf9538..0d3ceda 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_03.ast
index 217c7dc..bc94b88 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_04.ast
index f16a5e4..f1a1d3f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-edit-distance_04.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
index fe6c7a2..e5d4a73 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_02.ast
index 93220c7..ef71a93 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_02.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_03.ast
index 2e9ab0d..093e0b9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-edit-distance_03.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
index 3eda323..20c1286 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_02.ast
index 4ed2a88..af2d31a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_02.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_03.ast
index 61d8d4d..7bfa769 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-fuzzyeq-jaccard_03.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_01.ast
index 4307a46..ce38b34 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_02.ast
index b30a9002..9b508c7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_03.ast
index 8f7baa7..16beb06 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_04.ast
index 16ba8e9..cbf5765 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard-check_04.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_01.ast
index 4877699..8822738 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_02.ast
index f77ea6f..49bd093 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_03.ast
index 7539483..ecfac07 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_04.ast
index c442cbc..ca1098d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/olist-jaccard_04.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
index 520ebdd..e2306db 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_02.ast
index 370f544..6f2107c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_02.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_03.ast
index 86e7a4f..26547cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-fuzzyeq-jaccard_03.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_01.ast
index 9bbdb3c..d63e18c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_02.ast
index 9a1af12..4fb802a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_03.ast
index 97db320..4d00756 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_04.ast
index d879470..edc49c9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard-check_04.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_01.ast
index d27043e..b72a4ef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_02.ast
index 2d03cb0..dcf7ba3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_03.ast
index 6bb1584..0e76c21 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_03.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_04.ast
index 0186075..fb53866 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/ulist-jaccard_04.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_01.ast
index 48a554b..e7ce5f7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_01.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_02.ast
index f3ae39a..c37b4e6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_02.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_03.ast
index ca4a606..aed4e5c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-fuzzyeq-jaccard_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check-after-btree-access.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check-after-btree-access.ast
index 1569c8c..977fd78 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check-after-btree-access.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check-after-btree-access.ast
@@ -53,13 +53,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_01.ast
index 77f67a4..8137523 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_02.ast
index f29a515..02f1194 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_03.ast
index 8ef39a5..61f0161 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_04.ast
index ae3cbbf..425e82ce 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard-check_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_01.ast
index a555af8..3a12ec0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_02.ast
index a462d2d..090bf16 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_03.ast
index a570416..ec3cea1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_04.ast
index 4b50953..5f0e53a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/inverted-index-join/word-jaccard_04.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_01.ast
index 9bfa8ca..50b2a5a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_01.ast
@@ -76,13 +76,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItems]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [join-super-key_1.LineItems]
   ]
   AS Variable [ Name=$li ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [PartSupp]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [join-super-key_1.PartSupp]
   ]
   AS Variable [ Name=$ps ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_02.ast
index 7e77a62..8e8cfe6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/join-super-key_02.ast
@@ -76,13 +76,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [PartSupp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [join-super-key_01.PartSupp]
   ]
   AS Variable [ Name=$ps ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItems]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [join-super-key_01.LineItems]
   ]
   AS Variable [ Name=$li ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/limit-issue353.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/limit-issue353.ast
index 561f290..b0caf68 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/limit-issue353.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/limit-issue353.ast
@@ -50,8 +50,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_01.ast
index ed8bc8a..46c09a9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_01.ast
@@ -78,8 +78,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItems]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [loj-super-key_01.LineItems]
   ]
   AS Variable [ Name=$li ]
 ]
@@ -89,8 +89,8 @@
     SELECT ELEMENT [
     Variable [ Name=$ps ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [PartSupp]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [loj-super-key_01.PartSupp]
       ]
       AS Variable [ Name=$ps ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_02.ast
index 881fd14..c0390e9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/loj-super-key_02.ast
@@ -78,8 +78,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [PartSupp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [loj-super-key_02.PartSupp]
   ]
   AS Variable [ Name=$ps ]
 ]
@@ -89,8 +89,8 @@
     SELECT ELEMENT [
     Variable [ Name=$li ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItems]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [loj-super-key_02.LineItems]
       ]
       AS Variable [ Name=$li ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nest_aggregate.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nest_aggregate.ast
index bb1b519..7f8fe58 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nest_aggregate.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nest_aggregate.ast
@@ -117,13 +117,13 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Orders]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Orders]
         ]
         AS Variable [ Name=$orders ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$customer ]
       ]
@@ -176,8 +176,8 @@
               Field=o_totalprice
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [orders]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.orders]
               ]
               AS Variable [ Name=$o ]
             ]
@@ -193,13 +193,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Nation]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Nation]
   ]
   AS Variable [ Name=$nation ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [SelectedNation]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.SelectedNation]
   ]
   AS Variable [ Name=$sn ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/disjunction-to-join.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/disjunction-to-join.ast
index 070f91b..43b570c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/disjunction-to-join.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/disjunction-to-join.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TestSet]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
index deed5d1..6687d69 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01.ast
@@ -84,8 +84,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -121,8 +121,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
index be4dee4..1fd15fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02.ast
@@ -84,8 +84,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -141,8 +141,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_01.ast
index ab8d56a..67ea475 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_01.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_02.ast
index d9eb12d..b39858a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_02.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_03.ast
index c974456..5d1eed5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-join_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_01.ast
index fbc638b..06f2e0e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_01.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_02.ast
index ce857c4..85bc30b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_02.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_03.ast
index 6d67f1a..90f6a42 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_04.ast
index 6507a34..b11f064 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_04.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_05.ast
index d621592..bd87136 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_05.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_06.ast
index 1853548..ecc055b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-composite-key-prefix-join_06.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-multipred.ast
index c4f686a..52c73a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-multipred.ast
@@ -63,13 +63,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-neg_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-neg_01.ast
index 5c6c00b..cab3285 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-neg_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join-neg_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_01.ast
index bbfdc0a..169ac13 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_02.ast
index 98bf5a3..41a0dff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_02.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_03.ast
index c8f2c68..726b20e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_03.ast
@@ -63,13 +63,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_04.ast
index 991d6f9..ec580f5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_04.ast
@@ -63,13 +63,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_05.ast
index 64c9753..db6d9b4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-equi-join_05.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-ge-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-ge-join_01.ast
index ec71364..5c842dd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-ge-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-ge-join_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-gt-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-gt-join_01.ast
index ff8fed5..4876514 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-gt-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-gt-join_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-le-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-le-join_01.ast
index 4819dae..068153b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-le-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-le-join_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-lt-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-lt-join_01.ast
index 76648f8..fdcaf32 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-lt-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/primary-lt-join_01.ast
@@ -18,12 +18,12 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsOne]
   ]
   AS Variable [ Name=$x ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.DsTwo]
   ]
   AS Variable [ Name=$y ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multiindex.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multiindex.ast
index dd05817..8ab6d60 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multiindex.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multiindex.ast
@@ -93,13 +93,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multipred.ast
index 8d78dba..77a210c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join-multipred.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join_01.ast
index 2a51bd0..612efd5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index-join/secondary-equi-join_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-01.ast
index bb6e09f..84a1e94 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-01.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-02.ast
index b9dd560..9dedd70 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-02.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-03.ast
index 0645497..5c5d531 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-03.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-04.ast
index 1aaeaa2..c4e0cc0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-04.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-05.ast
index 6c31abd..b3dfab3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-05.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-06.ast
index 3f6e7d0..1144ebc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-06.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-07.ast
index 7f0c74d..ecd662b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-07.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-08.ast
index 814f90d..a296ae2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-08.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-09.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-09.ast
index 67d07fb..2812011 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-09.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-09.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-10.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-10.ast
index 8d57254..d1a8a1e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-10.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-10.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-11.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-11.ast
index b284429..f208244 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-11.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-11.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-12.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-12.ast
index 6a1d26c..f486f6b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-12.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-12.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-13.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-13.ast
index d01636c..649c228 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-13.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-13.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-14.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-14.ast
index 552fdfc..0142b3e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-14.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-14.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-15.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-15.ast
index 9c2cbe0..d696040 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-15.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-15.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-16.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-16.ast
index b913a84..5fb6602 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-16.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-16.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-17.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-17.ast
index 16c6ece..ff50e2c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-17.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-17.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-18.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-18.ast
index 82d3a6c..e53bbe1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-18.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-18.ast
@@ -19,8 +19,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-19.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-19.ast
index e0102ee..b9c0155 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-19.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-19.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-20.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-20.ast
index 6d4840b..e14bf42 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-20.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-20.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-21.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-21.ast
index 30cefb2..a12c25d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-21.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-21.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-22.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-22.ast
index b2a3420..8398ea6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-22.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-22.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-23.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-23.ast
index a5d3b08..0ded911 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-23.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-23.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-24.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-24.ast
index 243029f..fc07439 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-24.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-24.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-25.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-25.ast
index 514367c..9f777ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-25.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-25.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-26.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-26.ast
index b1284cf..4a23d2b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-26.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-26.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-27.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-27.ast
index d3eba3c..6dd8fd5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-27.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-27.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-28.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-28.ast
index 3371da9..c98f3e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-28.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-28.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-29.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-29.ast
index c7e0cdd..a70c092 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-29.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-29.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-30.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-30.ast
index 37be516..458b2f1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-30.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-30.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-31.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-31.ast
index 38ae6d6..0b2de22 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-31.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-31.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-32.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-32.ast
index 8e78d4b..4ba7769 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-32.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-primary-32.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-33.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-33.ast
index 1d5a449..73d253c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-33.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-33.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-34.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-34.ast
index e005a94..3d67725 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-34.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-34.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-35.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-35.ast
index 8b7c456..2d3461c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-35.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-35.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-36.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-36.ast
index 8a488b7..9c98570 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-36.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-36.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-37.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-37.ast
index 320d929..409e808 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-37.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-37.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-38.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-38.ast
index dcc50b5..55b9e60 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-38.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-38.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-39.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-39.ast
index 48a221f..a687d78 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-39.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-39.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-40.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-40.ast
index 0333dfb..073930e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-40.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-40.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-41.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-41.ast
index 294f17a..cfd72ff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-41.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-41.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-42.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-42.ast
index 22bebdc..ea845f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-42.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-42.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-43.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-43.ast
index 4d71f72..5e27769 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-43.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-43.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-44.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-44.ast
index 150bc3a..a58d942 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-44.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-44.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-45.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-45.ast
index d49ec6e..5a91f05 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-45.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-45.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-46.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-46.ast
index 391a181..b49041a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-46.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-46.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-47.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-47.ast
index 8682ec5..aeecf14 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-47.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-47.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-48.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-48.ast
index e152677..c458ea5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-48.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-48.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-49.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-49.ast
index 1d75cea..1b550a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-49.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-49.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-50.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-50.ast
index 5fb1eb6..f539b41 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-50.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-50.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-51.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-51.ast
index 15c39e2..2db63f3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-51.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-51.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-52.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-52.ast
index 888f043..afcfdd8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-52.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-52.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-53.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-53.ast
index 32f3a02..8a133f1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-53.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-53.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-54.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-54.ast
index 68ddbd4..3d231c7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-54.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-54.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-55.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-55.ast
index 8d9e6eb..9c30011 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-55.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-55.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-56.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-56.ast
index 91bd1eb..43a364d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-56.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-56.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-57.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-57.ast
index 36bc794..1adf046 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-57.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-57.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-58.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-58.ast
index 856276a..96c4300 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-58.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-58.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-59.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-59.ast
index dc27c49..a01ad08 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-59.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-59.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-60.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-60.ast
index 45c480e..5c4a5b1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-60.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-60.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-61.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-61.ast
index bda2974..d52e5d0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-61.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-61.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-62.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-62.ast
index c6bd724..d53b8f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-62.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-62.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-63.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-63.ast
index 92c2c3a..9fa240e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-63.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/btree-index/btree-secondary-63.ast
@@ -17,8 +17,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains-panic.ast
index 7dfee3a..67a69d7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains-panic.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains.ast
index 4cf33f0..239b045 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-contains.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
index 370d446..fc47597 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check.ast
index a8afba9..05d2532 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-check.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-panic.ast
index e5658da..f00873b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance-panic.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance.ast
index 7086ea0..fa976ab 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-edit-distance.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
index 33035b7..8ebaf4a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
@@ -21,8 +21,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
index 44e26f5..99df8bb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
@@ -22,8 +22,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard-check.ast
index 7414699..d4764a4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard-check.ast
@@ -20,8 +20,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard.ast
index 21c6e81..993fc7c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ngram-jaccard.ast
@@ -20,8 +20,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check-panic.ast
index 81ae9bf..b60a90f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check-panic.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check.ast
index 1753700..a57d7bf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-check.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-panic.ast
index 60e740c..73895ec 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance-panic.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance.ast
index 2066429..14402a0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-edit-distance.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
index e6b0d33..a3ea856 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-edit-distance.ast
@@ -35,8 +35,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-jaccard.ast
index e36bce4..98aab2b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-fuzzyeq-jaccard.ast
@@ -35,8 +35,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard-check.ast
index 766e622..36a3968 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard-check.ast
@@ -33,8 +33,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard.ast
index a4c5bf6..7662170 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/olist-jaccard.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
index e33d0ce..586bb84 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-fuzzyeq-jaccard.ast
@@ -36,8 +36,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard-check.ast
index a4a9879..c7de02f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard-check.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard.ast
index bf7fb93..a1920b0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/ulist-jaccard.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-contains.ast
index 6da4c73..07c2257 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-contains.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
index cc8bfc0..115cffd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
@@ -21,8 +21,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard-check.ast
index f972712..cd2f808 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard-check.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard.ast
index e9f84798..8d6ebff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-basic/word-jaccard.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
index 704d815..cd87e3d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
index a8fd351..e83f266 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
index 5a93885..3182178 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let.ast
index 9b02a4e..4d74189 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-let.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-substring.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
index 7581d8d..12e5004 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
@@ -42,8 +42,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
index c935aae..83e7c39 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
@@ -42,8 +42,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-let.ast
index f31064d..da3e28d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-let.ast
@@ -20,8 +20,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
index a50fd2f..c313df1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
@@ -31,8 +31,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.ast
index 572c59d..7926519 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let-panic.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let.ast
index 859b2c1..f811f6f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-edit-distance-check-let.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-jaccard-check-let.ast
index d4bec43..d4fb901 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/olist-jaccard-check-let.ast
@@ -33,8 +33,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ulist-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ulist-jaccard-check-let.ast
index 873107f..7fbf43b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ulist-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/ulist-jaccard-check-let.ast
@@ -34,8 +34,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-let.ast
index a0eb543..0e81882 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-let.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-multi-let.ast
index d9c65f6..09c2663 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-complex/word-jaccard-check-multi-let.ast
@@ -30,8 +30,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
index 6df9bb1..21fc269 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
@@ -90,8 +90,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -153,8 +153,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
index e0ec549..f27b10a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-jaccard-check-idx_01.ast
@@ -90,8 +90,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -153,8 +153,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-check_01.ast
index 420723a..2c56b6d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-contains.ast
index 78f3fe7..be76ff4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-contains.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-inline.ast
index 90e59a0..486ebf9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance-inline.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance_01.ast
index e2d9b25..3cbdf20 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-edit-distance_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
index f0c7b7f..5ec3806 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
index 6c6bd8c..766812b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-check_01.ast
index 6db6a5d..4bf1d3a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-check_01.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-inline.ast
index 289f8da..9eac854 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard-inline.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard_01.ast
index 4763edc..6c3a6c7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ngram-jaccard_01.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-check_01.ast
index 8d7f95a..12d27fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-inline.ast
index 2df37e9..84e2153 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance-inline.ast
@@ -62,13 +62,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance_01.ast
index a04210e..79306cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-edit-distance_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
index abfb1ac..5fa8fa3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-edit-distance_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
index 9e68d75..2551463 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-fuzzyeq-jaccard_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-check_01.ast
index c430b4e..010d833 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-inline.ast
index ead2509..e4c4c65 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard-inline.ast
@@ -62,13 +62,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard_01.ast
index bceac1d..4df3370 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/olist-jaccard_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
index 91f7838..66c07ed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-fuzzyeq-jaccard_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-check_01.ast
index ac0603d..d1d960a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-inline.ast
index e1eba33..b52756f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard-inline.ast
@@ -62,13 +62,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard_01.ast
index fca8e85..541c5c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/ulist-jaccard_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
index 42c94d8..a2df3ef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check-after-btree-access.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
index 8eaaa9b..7371c6f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
@@ -64,13 +64,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check_01.ast
index c1a2b32..ca36bc2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-inline.ast
index bf78930..c2d5bdf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard-inline.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard_01.ast
index c883e13..d766ddf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/inverted-index-join/word-jaccard_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
index 45f442f..5db718b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
@@ -84,8 +84,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -111,8 +111,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
index 6958ec3..004d42a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
@@ -84,8 +84,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -134,8 +134,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_01.ast
index 50b50a6..af4b22c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_02.ast
index 9e68e92..f0b71f8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_03.ast
index 9f2f3e5..4d62044 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-index/rtree-index-join/spatial-intersect-point_03.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/disjunction-to-join.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/disjunction-to-join.ast
index 3055c2d..274876f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/disjunction-to-join.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/disjunction-to-join.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TestSet]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
index 4f36425..42e98bd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
@@ -83,8 +83,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -120,8 +120,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
index 15ba229..eafaa62 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
@@ -82,8 +82,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -119,8 +119,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
index 5718c4b..3830ce2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
@@ -83,8 +83,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -140,8 +140,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
index 50a1282..763759e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
@@ -82,8 +82,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -139,8 +139,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_01.ast
index 48f2b7b..5c25aa2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_01.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_02.ast
index 4b7ffc5..3beae22 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_02.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_03.ast
index 75b8db3..7fb9602 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-join_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_01.ast
index d56d96a..6a701d4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_01.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_02.ast
index 0177ea7..7f0a206 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_02.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_03.ast
index 9ff02e1..e3572b4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_04.ast
index 140fd9e..50f9012 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_04.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_05.ast
index 83a2300..77e6f42 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_05.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_06.ast
index c2f61b6..219246c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-composite-key-prefix-join_06.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multiindex.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multiindex.ast
index 7542c35..5bee77f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multiindex.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multiindex.ast
@@ -92,13 +92,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multipred.ast
index b5fcf3a..251ebaa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join-multipred.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_01.ast
index 3bac0fc..fbafbf0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_01.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_02.ast
index 1f68a9c..bac276a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_02.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_03.ast
index 30739ca..b2ea711 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_03.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_04.ast
index 7dd5c8b..d610097 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_04.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_05.ast
index 38bbdb5..d0366f2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index-join/secondary-equi-join_05.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-33.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-33.ast
index 11db30e..29936b8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-33.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-33.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-34.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-34.ast
index d35819c..db20503 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-34.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-34.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-35.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-35.ast
index 108b1cb..64d82c8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-35.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-35.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-36.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-36.ast
index 0cade11..1f746fc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-36.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-36.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-37.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-37.ast
index 3649104..63fe2e4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-37.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-37.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-38.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-38.ast
index 2201b8c..c3d3466 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-38.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-38.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-39.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-39.ast
index 1f4a88c..98aa61e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-39.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-39.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-40.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-40.ast
index 903b754..6884c92 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-40.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-40.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-41.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-41.ast
index 86feaf4..85d03a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-41.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-41.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-42.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-42.ast
index ef94a6f..f5d81c6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-42.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-42.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-43.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-43.ast
index d4a7555..182df2d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-43.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-43.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-44.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-44.ast
index ce07caf1..23dab44 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-44.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-44.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-45.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-45.ast
index 225bf81..5ef1bb3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-45.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-45.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-46.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-46.ast
index d6dde70..d022650 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-46.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-46.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-47.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-47.ast
index 80accb3..09f1f2d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-47.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-47.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-48.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-48.ast
index 5db107b..ed0a1c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-48.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-48.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-49.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-49.ast
index d1a6277..0c52bc7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-49.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-49.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-50.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-50.ast
index ba74592..1a86db6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-50.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-50.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-51.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-51.ast
index fb67ea6..392be20 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-51.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-51.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-52.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-52.ast
index 453342c..e4720f6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-52.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-52.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-53.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-53.ast
index 65ad8b2..e32c66c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-53.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-53.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-54.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-54.ast
index 94ae299..a7c957c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-54.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-54.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-55.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-55.ast
index cc20882..839f352 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-55.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-55.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-56.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-56.ast
index b1368f1..5617432 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-56.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-56.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-57.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-57.ast
index 486d03e..2d2fa57 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-57.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-57.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-58.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-58.ast
index 38e37da..d0d6966 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-58.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-58.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-59.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-59.ast
index 82962fd..09f02a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-59.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-59.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-60.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-60.ast
index 2006e34..a8498e3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-60.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-60.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-61.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-61.ast
index 7f11abe..84ec9cb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-61.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-61.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-62.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-62.ast
index e8f76d8..f970c2c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-62.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-62.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-63.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-63.ast
index c1b71fc..ce5782f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-63.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/btree-index/btree-secondary-63.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains-panic.ast
index 3a05c3a..f6e781a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains-panic.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains.ast
index ca99934..283e91c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-contains.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
index 17abb95..e9a2f0a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check-panic.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check.ast
index 20f6090..8bc458d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-check.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-panic.ast
index 0d245d2..cea6433 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance-panic.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance.ast
index e85c8a1..026476c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-edit-distance.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
index 5731795..cd76e6c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
@@ -20,8 +20,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
index 840a28a..31ccaf8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
@@ -21,8 +21,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard-check.ast
index c94a207..3ff23f9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard-check.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard.ast
index 7645cdd..f57427b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/ngram-jaccard.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-contains.ast
index dc2ad53..2088a9e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-contains.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
index 1298c33..7efb273 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-fuzzyeq-jaccard.ast
@@ -20,8 +20,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard-check.ast
index 5657988..4ee76d2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard-check.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard.ast
index 1c971d2..fe1460f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-basic/word-jaccard.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
index 01302aa..a47c5d7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
index c71ee06..b666419 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
index 252ae0e..2f08590 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let.ast
index 0aafd74..b2a5d79 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-let.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-substring.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
index 2168572..78aac04 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-substring.ast
@@ -41,8 +41,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
index 352250b..0559bbc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
@@ -41,8 +41,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-let.ast
index d53658d..336b9d6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-let.ast
@@ -19,8 +19,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
index 9129345..e246355 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/ngram-jaccard-check-multi-let.ast
@@ -30,8 +30,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-let.ast
index 74de8aa..f710009 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-let.ast
@@ -18,8 +18,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-multi-let.ast
index 28b074f..fe3fb7c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-complex/word-jaccard-check-multi-let.ast
@@ -29,8 +29,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
index a043819..ab37e11 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
@@ -89,8 +89,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -152,8 +152,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_01.ast
index 0978f7a..b80cae4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_01.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_02.ast
index 8ec966a..8b5571d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_02.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_03.ast
index eaeb6fb..f8085ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_03.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_04.ast
index 1546710..84389f3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-contains_04.ast
@@ -38,13 +38,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_01.ast
index 3d47cf7..d2c4499 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_01.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_02.ast
index e8e6c66..2d74c5f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_02.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_03.ast
index b055a6b..17bdeca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_04.ast
index 76ce6b3..9fcd085 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_04.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_05.ast
index 76ce6b3..9fcd085 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-check_05.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-contains.ast
index 0f2bbe8..399c1e7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-contains.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-inline.ast
index d2dec49..b1ed987 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance-inline.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_01.ast
index 5f3a3b0..402625f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_01.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_02.ast
index f19ecbc..4eed056 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_02.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_03.ast
index 1358e20..6f51552 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_04.ast
index e7816e8..dc5e707 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_04.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_05.ast
index e7816e8..dc5e707 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-edit-distance_05.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
index ba09046..dc33114 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
index fd8370e..a0d33fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
index fd5699f..9c00f66 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
@@ -31,13 +31,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
index 98a8e6c..f76df1d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
index 98a8e6c..f76df1d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
index ef1b75b..2705525 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
index e4e38cc..1bba5a8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
index ddd0a62..658259b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
@@ -32,13 +32,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
index 7ec15b8..274474e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_01.ast
index aa8ccd5..1a7702e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_02.ast
index 1aec1d1..27ac86c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_02.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_03.ast
index 70540c5..8cd5e54 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_03.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_04.ast
index f0ddb9d..c5154c0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-check_04.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-inline.ast
index bf2e6f1..e2a7a9f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard-inline.ast
@@ -47,13 +47,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_01.ast
index 00550b6..fe046f5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_01.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_02.ast
index e63e074..066f5ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_02.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_03.ast
index 39f0cc7..4bbc6ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_03.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_04.ast
index d431177..b8a8e6b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/ngram-jaccard_04.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
index ea12577..f2872bb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_01.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_02.ast
index 3dfa660..9e3ccd0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_02.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_03.ast
index f48d204..d8d300d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_03.ast
@@ -31,13 +31,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_04.ast
index c2ee58e..32449a8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-fuzzyeq-jaccard_04.ast
@@ -45,13 +45,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check-after-btree-access.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
index 56fe48d..bbd9e0b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check-after-btree-access.ast
@@ -63,13 +63,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_01.ast
index 8f752dc..6ed0796 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_01.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_02.ast
index 2f786a7..6666280 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_02.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_03.ast
index 2f577bb..84ddb2c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_04.ast
index 4a3c467..fe15603 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-check_04.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-inline.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-inline.ast
index 4d211e9..55e4dff 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-inline.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard-inline.ast
@@ -46,13 +46,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_01.ast
index 1471a9a..d94b65b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_01.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_02.ast
index dddfb60..e30d595 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_02.ast
@@ -44,13 +44,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_03.ast
index f6cdec4..b313d66 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_04.ast
index 3e8a0e5..544fcc6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/inverted-index-join/word-jaccard_04.ast
@@ -43,13 +43,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
index eb46bd3..9277b59 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
@@ -83,8 +83,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -110,8 +110,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
index 83da15f..7da0f59 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
@@ -83,8 +83,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -133,8 +133,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_01.ast
index 50b50a6..af4b22c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_02.ast
index 9e68e92..f0b71f8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_03.ast
index 9f2f3e5..4d62044 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_03.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_04.ast
index b636b9a..bfe83a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_05.ast
index b636b9a..bfe83a2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested-open-index/rtree-index-join/spatial-intersect-point_05.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj2.ast
index 7bb0caf..36dfee3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj2.ast
@@ -63,8 +63,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
@@ -85,8 +85,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
     ]
@@ -96,8 +96,8 @@
         SELECT ELEMENT [
         Variable [ Name=$l ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItems]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItems]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj3.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj3.ast
index 6a854a2..46ba97f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj3.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/nested_loj3.ast
@@ -73,8 +73,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
@@ -95,8 +95,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
     ]
@@ -117,8 +117,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItems]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItems]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -128,8 +128,8 @@
             SELECT ELEMENT [
             Variable [ Name=$ps ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [PartSupp]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.PartSupp]
               ]
               AS Variable [ Name=$ps ]
             ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/disjunction-to-join.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/disjunction-to-join.ast
index d1e9759..8240b88 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/disjunction-to-join.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/disjunction-to-join.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TestSet]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
index 76a2e5b..b48f1e5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_1.ast
@@ -66,8 +66,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -94,8 +94,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
index d6114a0..9e6d696 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_01_2.ast
@@ -65,8 +65,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -93,8 +93,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
index d28aff9..a08f422 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_1.ast
@@ -66,8 +66,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -108,8 +108,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
index 7726a83..8b54d5d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/leftouterjoin-probe-pidx-with-join-btree-sidx_02_2.ast
@@ -65,8 +65,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -107,8 +107,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_01.ast
index d8d958b..1ff24b1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_01.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_02.ast
index d024ed2..9bb34db 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_02.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_03.ast
index 3af7cb3..d26ba99 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-join_03.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_01.ast
index 6b802b3..9fe3a66 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_01.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_02.ast
index 92afdbb..19e8601 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_02.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_03.ast
index 203c2b2..75ae301 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_03.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_04.ast
index e4852e4..4a304a4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_04.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_05.ast
index 9a23b2e..715ef35 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_05.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_06.ast
index 3f69e31..dd530af 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-composite-key-prefix-join_06.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Names]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Names]
   ]
   AS Variable [ Name=$emp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multiindex.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multiindex.ast
index f47ee04..8dd07dc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multiindex.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multiindex.ast
@@ -70,13 +70,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multipred.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multipred.ast
index 571ec36..fbdade6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multipred.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join-multipred.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_01.ast
index d00a4a1..a58bd4e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_02.ast
index 498ef47..6932d46 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_03.ast
index c115997..5e21138 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_03.ast
@@ -24,13 +24,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_04.ast
index e60fa3b..e99796f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_05.ast
index e60fa3b..e99796f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index-join/secondary-equi-join_05.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-33.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-33.ast
index 5c5d52d..04c5b61 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-33.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-33.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-34.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-34.ast
index 58afd51..f189044 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-34.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-34.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-35.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-35.ast
index 24ebd22..229d649 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-35.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-35.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-36.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-36.ast
index b5e0af7..e275ed9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-36.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-36.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-37.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-37.ast
index 6deb867..66829c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-37.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-37.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-38.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-38.ast
index 4902e4c..19c7a87 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-38.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-38.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-39.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-39.ast
index e6443cc..d76d661 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-39.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-39.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-40.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-40.ast
index 989bfcd..60931bb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-40.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-40.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-41.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-41.ast
index d165715..207cee8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-41.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-41.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-42.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-42.ast
index 603d004..307c6b2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-42.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-42.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-43.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-43.ast
index cd1ebb4..2e89de2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-43.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-43.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-44.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-44.ast
index b6fb2de..820d851 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-44.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-44.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-45.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-45.ast
index 178de05..ef28ba9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-45.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-45.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-46.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-46.ast
index 45a4915..1c2de53 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-46.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-46.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-47.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-47.ast
index 8f34a91..3de42f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-47.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-47.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-48.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-48.ast
index a7f9e37..5da3296 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-48.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-48.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-49.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-49.ast
index 32027ab..bcc76f3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-49.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-49.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-50.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-50.ast
index 823782f..edeb3a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-50.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-50.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-51.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-51.ast
index 9cbb534..44c1e9d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-51.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-51.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-52.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-52.ast
index 7136788..04c4b38 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-52.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-52.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-53.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-53.ast
index 2501fc5..6746204 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-53.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-53.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-54.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-54.ast
index 1d87d65..624dffa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-54.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-54.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-55.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-55.ast
index 79ea3c2..1f0bd3b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-55.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-55.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-56.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-56.ast
index 9f22978..d48eee5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-56.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-56.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-57.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-57.ast
index 6264ffd..2236703 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-57.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-57.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-58.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-58.ast
index b7b30f9..8671ba8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-58.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-58.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-59.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-59.ast
index 26dce99..0f8393f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-59.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-59.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-60.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-60.ast
index eb13302..fd6c3e9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-60.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-60.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-61.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-61.ast
index 89aef71..cb9ad21 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-61.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-61.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-62.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-62.ast
index 4945e13..8165db0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-62.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-62.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-63.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-63.ast
index 26fbde9..cc144f2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-63.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/btree-index/btree-secondary-63.ast
@@ -10,8 +10,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains-panic.ast
index 6dc93c7..d0331ae 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains-panic.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains.ast
index b759757..ec5826f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-contains.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check-panic.ast
index fd2ba6d..82ea6c3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check-panic.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check.ast
index 5f2a1d7..99dd1cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-check.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-panic.ast
index 15d9fd0..08b1cba 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance-panic.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance.ast
index 2914df1..bc0f6c3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-edit-distance.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
index be959ce..9c7aef5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-edit-distance.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
index 79dcbed..12dcd8d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-fuzzyeq-jaccard.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard-check.ast
index 7b4ccc7..3495dbd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard-check.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard.ast
index d22410d..d8f71d0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/ngram-jaccard.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-contains.ast
index 909177c..6480fe5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-contains.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-fuzzyeq-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-fuzzyeq-jaccard.ast
index add3101..e175bee 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-fuzzyeq-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-fuzzyeq-jaccard.ast
@@ -15,8 +15,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard-check.ast
index 43fa817..87d5779 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard-check.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard.ast
index 1563de3..74d7bd4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-basic/word-jaccard.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
index e340987..bfeb54e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_01.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
index 31d8798..917fdb0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic-nopanic_02.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
index 69839b2..b5e2691 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let-panic.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let.ast
index 616db27..111bb1c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-let.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-substring.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-substring.ast
index cd46656..10f09c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-substring.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-substring.ast
@@ -30,8 +30,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
index 23b15c0..f3f3545 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-edit-distance-check-word-tokens.ast
@@ -30,8 +30,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-let.ast
index 299760f..9e5c32e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-let.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-multi-let.ast
index 6887742..8bae958 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/ngram-jaccard-check-multi-let.ast
@@ -25,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-let.ast
index 2238bf4..586ae2a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-let.ast
@@ -13,8 +13,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-multi-let.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-multi-let.ast
index 1e64350..7bc1846 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-multi-let.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-complex/word-jaccard-check-multi-let.ast
@@ -24,8 +24,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
index 553171d..331bdf1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/leftouterjoin-probe-pidx-with-join-edit-distance-check-idx_01.ast
@@ -72,8 +72,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -120,8 +120,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_01.ast
index 0978f7a..b80cae4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_01.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_02.ast
index 43ed1f3..b9af450 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_02.ast
@@ -39,13 +39,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_03.ast
index eaeb6fb..f8085ca 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_03.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_04.ast
index 1546710..84389f3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-contains_04.ast
@@ -38,13 +38,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_01.ast
index a995990..d579f69 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_02.ast
index 0bb3c18..b612948 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_03.ast
index b838f8a..b2ed201 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_03.ast
@@ -24,13 +24,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_04.ast
index cb96703..32df103 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_05.ast
index cb96703..32df103 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_05.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_inline_03.ast
index 78c5abe..fbdd268 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-check_inline_03.ast
@@ -32,13 +32,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-contains.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-contains.ast
index 73a9b12..7211a5c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-contains.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance-contains.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_01.ast
index 0da1348..d686ced 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_02.ast
index bf359d3..cc9c208 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_03.ast
index f672f4c..d619a95 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_03.ast
@@ -24,13 +24,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_04.ast
index 596a0e8..d9c54c1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_05.ast
index 596a0e8..d9c54c1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_05.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_inline_03.ast
index e350538..db0924d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-edit-distance_inline_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
index 865b0ce..694e4cc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_01.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
index 14f1722..3d999c4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_02.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
index 01718f2..7f0e2f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
index 4bac0fe..2a57621 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_04.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
index 4bac0fe..2a57621 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-edit-distance_05.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
index d847ed7..97c1778 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_01.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
index d575cd9..879eea4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_02.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
index f6529e3..39138f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
index 2393e0d..9b892c5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-fuzzyeq-jaccard_04.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_01.ast
index dfc5806..e38106b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_02.ast
index 17b5d69..c70c30f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_03.ast
index 0d988a9..d15b32d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_04.ast
index 0063692..7e45c77 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_04.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_inline_03.ast
index a7f8c69..073e7f5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard-check_inline_03.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_01.ast
index 2c470d0..d661706 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_01.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_02.ast
index 4eaed02..16dcb06 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_02.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_03.ast
index 85c0135..37fd896 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_03.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_04.ast
index bfd6fa9..511eb3e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_04.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_inline_03.ast
index 336e8b6..fe548d6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/ngram-jaccard_inline_03.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_01.ast
index 5b9fd80..b30d7ee 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_01.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_02.ast
index 54dc66e..e1da73f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_02.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_03.ast
index c88e567..807f5bf 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_03.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_04.ast
index 31a2d5d..0d41007 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-fuzzyeq-jaccard_04.ast
@@ -35,13 +35,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check-after-btree-access.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check-after-btree-access.ast
index 15be700..def707e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check-after-btree-access.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check-after-btree-access.ast
@@ -52,13 +52,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_01.ast
index c7b47c7..61f40dc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_02.ast
index a62d8da..bcc540a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_03.ast
index 2052511..7883806 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_03.ast
@@ -24,13 +24,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_04.ast
index cb55ef9..c0d2879 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_inline_03.ast
index 7030392..3f14745 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard-check_inline_03.ast
@@ -32,13 +32,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_01.ast
index 2cbe046..fe9bcfe 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_01.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_02.ast
index ee010a7..e856da5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_02.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_03.ast
index c6f2392..1c780a1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_03.ast
@@ -24,13 +24,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_04.ast
index b35e9db..e070d7a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_04.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_inline_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_inline_03.ast
index e7c6029..a311ef2 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_inline_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/inverted-index-join/word-jaccard_inline_03.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
index c86b6fc..8fe06f1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
@@ -66,8 +66,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -90,8 +90,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
index e8b41fb..0a533b8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
@@ -66,8 +66,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -104,8 +104,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_01.ast
index 5217c93..4605152 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_01.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_02.ast
index 0472b4b..dfd9368 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_02.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_03.ast
index b8f0de2..d2d61ef 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_03.ast
@@ -27,13 +27,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_04.ast
index b3a61a3..2a53cb0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_04.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_05.ast
index b3a61a3..2a53cb0 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/open-index-enforced/rtree-index-join/spatial-intersect-point_05.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orderby-desc-using-gby.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orderby-desc-using-gby.ast
index 5c200bb..675ca8d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orderby-desc-using-gby.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orderby-desc-using-gby.ast
@@ -32,16 +32,12 @@
   (
     LiteralExpr [STRING] [age]
     :
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [age]
-      Variable [ Name=$name ]
-      Variable [ Name=#1 ]
-    ]
+    Variable [ Name=$age ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [gby-using-orderby-desc.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
@@ -52,6 +48,12 @@
     Variable [ Name=$c ]
     Field=name
   ]
+  Variable [ Name=$age ]
+  :=
+  FieldAccessor [
+    Variable [ Name=$c ]
+    Field=age
+  ]
   GROUP AS Variable [ Name=#1 ]
   (
     c:=Variable [ Name=$c ]
@@ -60,10 +62,6 @@
 Orderby
   Variable [ Name=$name ]
   DESC
-  FunctionCall Metadata.resolve@-1[
-    LiteralExpr [STRING] [age]
-    Variable [ Name=$name ]
-    Variable [ Name=#1 ]
-  ]
+  Variable [ Name=$age ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-aggreg.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-aggreg.ast
index f2c8872..cd4bca3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-aggreg.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-aggreg.ast
@@ -23,11 +23,7 @@
     LiteralExpr [STRING] [ordpercust]
     :
     FunctionCall asterix.count@1[
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [o]
-        Variable [ Name=$cid ]
-        Variable [ Name=#1 ]
-      ]
+      Variable [ Name=$g ]
     ]
   )
   (
@@ -37,13 +33,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=o
+          ]
           Field=total
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [o]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -56,13 +53,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=o
+          ]
           Field=total
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [o]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -70,8 +68,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [orders-aggreg.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
@@ -82,7 +80,7 @@
     Variable [ Name=$o ]
     Field=cid
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=$g ]
   (
     o:=Variable [ Name=$o ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-composite-index-search.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-composite-index-search.ast
index 96a4bc9..c69f338 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-composite-index-search.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-composite-index-search.ast
@@ -43,8 +43,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [index_search.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_01.ast
index dd0c4ea..79333be 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_01.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_02.ast
index 97b43b2..11c7e13 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive-open_02.ast
@@ -43,8 +43,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_01.ast
index 2cc53a8..f4aece7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_01.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_02.ast
index 3609c78..840ed37 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-conjunctive_02.ast
@@ -43,8 +43,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-open.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-open.ast
index 9222a7e..f7f3fce 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-open.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search-open.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [index_search.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search.ast
index 5f4d438..da5b02b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/orders-index-search.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [index_search.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search-open.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search-open.ast
index bd7c74c..027c353 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search-open.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search-open.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [prim_index_search.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search.ast
index da4c90b..4c02734 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/prim-idx-search.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [prim_index_search.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/pull_select_above_eq_join.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/pull_select_above_eq_join.ast
index 7b5ac60..ca6fe07 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/pull_select_above_eq_join.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/pull_select_above_eq_join.ast
@@ -41,13 +41,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Users]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [pull-select-above-eq-join.Users]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Visitors]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [pull-select-above-eq-join.Visitors]
   ]
   AS Variable [ Name=$visitor ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push-project-through-group.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push-project-through-group.ast
index 6bb15c8..0e349bbd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push-project-through-group.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push-project-through-group.ast
@@ -28,8 +28,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin_080.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -42,8 +42,8 @@
       Field=title
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin_080.DBLP]
       ]
       AS Variable [ Name=$paper ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push_limit.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push_limit.ast
index 833d67f..bfb413a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push_limit.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/push_limit.ast
@@ -35,8 +35,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q01_pricing_summary_report_nt.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q01_pricing_summary_report_nt.ast
index 5e220fd..dc175a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q01_pricing_summary_report_nt.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q01_pricing_summary_report_nt.ast
@@ -41,13 +41,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=l
+          ]
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -60,13 +61,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=l
+          ]
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -80,7 +82,10 @@
         SELECT ELEMENT [
         OperatorExpr [
           FieldAccessor [
-            Variable [ Name=$i ]
+            FieldAccessor [
+              Variable [ Name=$i ]
+              Field=l
+            ]
             Field=l_extendedprice
           ]
           *
@@ -88,15 +93,16 @@
             LiteralExpr [LONG] [1]
             -
             FieldAccessor [
-              Variable [ Name=$i ]
+              FieldAccessor [
+                Variable [ Name=$i ]
+                Field=l
+              ]
               Field=l_discount
             ]
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -110,7 +116,10 @@
         SELECT ELEMENT [
         OperatorExpr [
           FieldAccessor [
-            Variable [ Name=$i ]
+            FieldAccessor [
+              Variable [ Name=$i ]
+              Field=l
+            ]
             Field=l_extendedprice
           ]
           *
@@ -118,7 +127,10 @@
             LiteralExpr [LONG] [1]
             -
             FieldAccessor [
-              Variable [ Name=$i ]
+              FieldAccessor [
+                Variable [ Name=$i ]
+                Field=l
+              ]
               Field=l_discount
             ]
           ]
@@ -127,15 +139,16 @@
             LiteralExpr [LONG] [1]
             +
             FieldAccessor [
-              Variable [ Name=$i ]
+              FieldAccessor [
+                Variable [ Name=$i ]
+                Field=l
+              ]
               Field=l_tax
             ]
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -148,13 +161,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=l
+          ]
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -167,13 +181,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=l
+          ]
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -186,13 +201,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=l
+          ]
           Field=l_discount
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [l]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -202,18 +218,13 @@
     LiteralExpr [STRING] [count_order]
     :
     FunctionCall asterix.count@1[
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [l]
-        Variable [ Name=$l_linestatus ]
-        Variable [ Name=$l_returnflag ]
-        Variable [ Name=#1 ]
-      ]
+      Variable [ Name=$g ]
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -239,7 +250,7 @@
     Variable [ Name=$l ]
     Field=l_linestatus
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=$g ]
   (
     l:=Variable [ Name=$l ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q03_shipping_priority.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q03_shipping_priority.ast
index 35a0f59..c08dc5c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q03_shipping_priority.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q03_shipping_priority.ast
@@ -73,18 +73,18 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q3_shipping_priority.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q3_shipping_priority.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItems]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q3_shipping_priority.LineItems]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -192,8 +192,8 @@
         ]
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [l]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [q3_shipping_priority.l]
         ]
         AS Variable [ Name=$i ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q05_local_supplier_volume.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q05_local_supplier_volume.ast
index 6795260..448c433 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q05_local_supplier_volume.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q05_local_supplier_volume.ast
@@ -92,8 +92,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q5_local_supplier.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
@@ -142,8 +142,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [q5_local_supplier.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -192,8 +192,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItems]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [q5_local_supplier.LineItems]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -226,8 +226,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Suppliers]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [q5_local_supplier.Suppliers]
               ]
               AS Variable [ Name=$s ]
 ,
@@ -252,13 +252,13 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Nations]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [q5_local_supplier.Nations]
                   ]
                   AS Variable [ Name=$n ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Regions]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [q5_local_supplier.Regions]
                   ]
                   AS Variable [ Name=$r ]
                 ]
@@ -413,8 +413,8 @@
         ]
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [o1]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [q5_local_supplier.o1]
         ]
         AS Variable [ Name=$i ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q08_group_by.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q08_group_by.ast
index b50fc64..815bee9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q08_group_by.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q08_group_by.ast
@@ -135,8 +135,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Supplier]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q08_group_by.Supplier]
   ]
   AS Variable [ Name=$s ]
 ,
@@ -222,8 +222,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [q08_group_by.LineItem]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -248,8 +248,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Orders]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [q08_group_by.Orders]
               ]
               AS Variable [ Name=$o ]
 ,
@@ -266,8 +266,8 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Customer]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [q08_group_by.Customer]
                   ]
                   AS Variable [ Name=$c ]
 ,
@@ -284,13 +284,13 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Nation]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [q08_group_by.Nation]
                       ]
                       AS Variable [ Name=$n1 ]
 ,
-                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Region]
+                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [q08_group_by.Region]
                       ]
                       AS Variable [ Name=$r1 ]
                     ]
@@ -385,8 +385,8 @@
       )
       AS Variable [ Name=$lnrco ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Part]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [q08_group_by.Part]
       ]
       AS Variable [ Name=$p ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q09_group_by.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q09_group_by.ast
index 37fecbd..52b59f4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q09_group_by.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q09_group_by.ast
@@ -153,8 +153,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Part]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [q09_group_by.Part]
   ]
   AS Variable [ Name=$p ]
 ,
@@ -219,8 +219,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Partsupp]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [q09_group_by.Partsupp]
       ]
       AS Variable [ Name=$ps ]
 ,
@@ -306,13 +306,13 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Supplier]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [q09_group_by.Supplier]
               ]
               AS Variable [ Name=$s ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Nation]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [q09_group_by.Nation]
               ]
               AS Variable [ Name=$n ]
             ]
@@ -331,8 +331,8 @@
           )
           AS Variable [ Name=$s1 ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [q09_group_by.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q1.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q1.ast
index 899be1a..4e8ad75 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q1.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q1.ast
@@ -38,8 +38,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [User]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [events.User]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q2.ast
index cfeb5fc..40229c3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/q2.ast
@@ -51,8 +51,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Event]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [events.Event]
   ]
   AS Variable [ Name=$event ]
 ,
@@ -87,6 +87,7 @@
   (
     event:=Variable [ Name=$event ]
     sponsor:=Variable [ Name=$sponsor ]
+    es:=Variable [ Name=$es ]
   )
 
 Let Variable [ Name=$sig_sponsorship_count ]
@@ -94,17 +95,13 @@
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [es]
-        Variable [ Name=$sponsor ]
-        Variable [ Name=$event ]
-        Variable [ Name=$sig_name ]
-        Variable [ Name=#1 ]
-        Variable [ Name=#2 ]
+      FieldAccessor [
+        Variable [ Name=#3 ]
+        Field=es
       ]
       ]
       FROM [        Variable [ Name=#1 ]
-        AS Variable [ Name=#2 ]
+        AS Variable [ Name=#3 ]
       ]
     )
   ]
@@ -129,7 +126,7 @@
               Field=e
             ]
             ]
-            FROM [              Variable [ Name=#3 ]
+            FROM [              Variable [ Name=#2 ]
               AS Variable [ Name=#4 ]
             ]
           )
@@ -137,8 +134,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [es]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [events.es]
       ]
       AS Variable [ Name=$e ]
     ]
@@ -152,7 +149,7 @@
         ]
         Field=chapter_name
       ]
-      GROUP AS Variable [ Name=#3 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         e:=Variable [ Name=$e ]
       )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue550.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue550.ast
index 38c25da..042bd3d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue550.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue550.ast
@@ -161,7 +161,7 @@
       SELECT ELEMENT [
       Variable [ Name=$srec ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
+      FROM [        FunctionCall asterix.dataset@1[
           LiteralExpr [STRING] [s]
         ]
         AS Variable [ Name=$srec ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue562.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue562.ast
index d8f328a..62f92a7 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue562.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue562.ast
@@ -83,7 +83,7 @@
           Variable [ Name=$c ]
           Field=c_phone
         ]
-        LiteralExpr [LONG] [1]
+        LiteralExpr [LONG] [0]
         LiteralExpr [LONG] [2]
       ]
     Where
@@ -144,8 +144,8 @@
         Field=c_acctbal
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$c ]
       ]
@@ -156,7 +156,7 @@
             Variable [ Name=$c ]
             Field=c_phone
           ]
-          LiteralExpr [LONG] [1]
+          LiteralExpr [LONG] [0]
           LiteralExpr [LONG] [2]
         ]
       Where
@@ -227,11 +227,7 @@
     LiteralExpr [STRING] [numcust]
     :
     FunctionCall asterix.count@1[
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [ct]
-        Variable [ Name=$cntrycode ]
-        Variable [ Name=#1 ]
-      ]
+      Variable [ Name=$g ]
     ]
   )
   (
@@ -241,13 +237,14 @@
       (
         SELECT ELEMENT [
         FieldAccessor [
-          Variable [ Name=$i ]
+          FieldAccessor [
+            Variable [ Name=$i ]
+            Field=ct
+          ]
           Field=c_acctbal
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [ct]
-          ]
+        FROM [          Variable [ Name=$g ]
           AS Variable [ Name=$i ]
         ]
       )
@@ -266,8 +263,8 @@
         SELECT ELEMENT [
         Variable [ Name=$o ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
         ]
@@ -295,7 +292,7 @@
     Variable [ Name=$ct ]
     Field=cntrycode
   ]
-  GROUP AS Variable [ Name=#1 ]
+  GROUP AS Variable [ Name=$g ]
   (
     ct:=Variable [ Name=$ct ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue601.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue601.ast
index 3f3558d..577a260 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue601.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue601.ast
@@ -47,8 +47,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue697.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue697.ast
index b106711..dee2ce4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue697.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue697.ast
@@ -25,14 +25,14 @@
           Field=value
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [i]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.i]
           ]
           AS Variable [ Name=$j ]
         ]
         Where
-          FunctionCall null.not@1[
-            FunctionCall null.is-null@1[
+          FunctionCall algebricks.not@1[
+            FunctionCall algebricks.is-null@1[
               FieldAccessor [
                 Variable [ Name=$j ]
                 Field=value
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [test]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.test]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue785.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue785.ast
index c383a04..00cc47e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue785.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue785.ast
@@ -80,13 +80,13 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$nation ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [SelectedNation]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.SelectedNation]
       ]
       AS Variable [ Name=$sn ]
     ]
@@ -128,13 +128,13 @@
     FROM [      Variable [ Name=$t ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customer]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Customer]
       ]
       AS Variable [ Name=$customer ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$orders ]
     ]
@@ -194,8 +194,8 @@
             Field=o_totalprice
           ]
           ]
-          FROM [            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [orders]
+          FROM [            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [tpch.orders]
             ]
             AS Variable [ Name=$o ]
           ]
@@ -233,8 +233,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [x]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.x]
         ]
         AS Variable [ Name=$y ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810-2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810-2.ast
index 90336e2..93839fb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810-2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810-2.ast
@@ -63,8 +63,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -104,8 +104,8 @@
       Field=l_discount
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$i ]
     ]
@@ -125,8 +125,8 @@
     SELECT ELEMENT [
     Variable [ Name=$i ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$i ]
     ]
@@ -169,8 +169,8 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$i ]
     ]
@@ -195,8 +195,8 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$i ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810.ast
index 65d64bc..a0ea1d4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue810.ast
@@ -49,8 +49,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -87,8 +87,8 @@
     SELECT ELEMENT [
     Variable [ Name=$m ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$m ]
     ]
@@ -108,8 +108,8 @@
     SELECT ELEMENT [
     Variable [ Name=$a ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [l]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.l]
       ]
       AS Variable [ Name=$a ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue827-2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue827-2.ast
index 50efae7..d1a0253 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue827-2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query-issue827-2.ast
@@ -33,8 +33,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -61,8 +61,8 @@
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -91,8 +91,8 @@
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -130,8 +130,8 @@
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -149,8 +149,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -177,8 +177,8 @@
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -196,8 +196,8 @@
           Field=l_discount
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -212,8 +212,8 @@
         SELECT ELEMENT [
         Variable [ Name=$l ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849-2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849-2.ast
index 6150c74..3bcc275 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849-2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849-2.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [s]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.s]
   ]
   AS Variable [ Name=$x ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849.ast
index b83b445e..3eed823 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/query_issue849.ast
@@ -45,8 +45,8 @@
       Field=b
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [s]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.s]
       ]
       AS Variable [ Name=$z ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric-desc.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric-desc.ast
index 4ac7aa6..0e13e13 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric-desc.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric-desc.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric.ast
index f0c9b9b..003c539 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-numeric.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string-desc.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string-desc.ast
index e3e358e..d9e277a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string-desc.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string-desc.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string.ast
index d0f4e62..ab81553 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/range-connector/sort-hint-on-closed-string.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/issue730.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/issue730.ast
index 8bef230..64b1b09 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/issue730.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/issue730.ast
@@ -43,8 +43,8 @@
         Field=tweetid
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -60,8 +60,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
index 3ad79eb..ef9d197 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_01.ast
@@ -67,8 +67,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -91,8 +91,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
index 2fa343b..d07da6c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/leftouterjoin-probe-pidx-with-join-rtree-sidx_02.ast
@@ -67,8 +67,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -105,8 +105,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/query-issue838.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/query-issue838.ast
index 7c28623..092105d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/query-issue838.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/query-issue838.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetHistorySubscriptions]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.TweetHistorySubscriptions]
   ]
   AS Variable [ Name=$sub ]
 ,
@@ -53,18 +53,17 @@
     SELECT ELEMENT [
     Variable [ Name=$tweet ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TweetMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [twitter.TweetMessages]
       ]
       AS Variable [ Name=$tweet ]
     ]
     Let Variable [ Name=$circle ]
       :=
       FunctionCall twitter.create-circle@2[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [location]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$tweet ]
-          Variable [ Name=$sub ]
+          LiteralExpr [STRING] [location]
         ]
         LiteralExpr [DOUBLE] [30.0]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_01.ast
index ffa9ba7..b1ef06d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_01.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_02.ast
index 5bbcf02..5b894a8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_02.ast
@@ -29,13 +29,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_03.ast
index a3a67e3..88f292c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-index-join/spatial-intersect-point_03.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index-open.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index-open.ast
index 415c1f4..23f1b56 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index-open.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index-open.ast
@@ -27,8 +27,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index.ast
index e5c689e..43691ee 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/rtree-secondary-index.ast
@@ -27,8 +27,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_01.ast
index 9f0b05a..471d006 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_01.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_02.ast
index bd009ea..c78b8cb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_02.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_03.ast
index e00d123..9bb5957 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_03.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_04.ast
index 8503fc0..73fd3d8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_04.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_05.ast
index 091ac0b..693d2942 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_05.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_06.ast
index 1fc15b9..1ce8ea8 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_06.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_07.ast
index 210c5f8..efe51d3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_07.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_08.ast
index dde6594..6ad672e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-let-to-edit-distance-check_08.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$ed ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_01.ast
index 23e9f94..97c36bd 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_01.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_02.ast
index 3ea6c39..510fbfc 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_02.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_03.ast
index f3e6664..861376f 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_03.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_04.ast
index 33896a8..8b565e3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_04.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_05.ast
index a2339f8..993573d 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_05.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_06.ast
index 64c9e36..79c3f78 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_06.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_07.ast
index c80aa6c..4c25e1c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_07.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_08.ast
index 8c146c9..e3da8fa 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/edit-distance-to-edit-distance-check_08.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-edit-distance-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-edit-distance-check.ast
index 41f2380..b498f55 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-edit-distance-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-edit-distance-check.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-jaccard-check.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-jaccard-check.ast
index 3c06584..fe5b837 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-jaccard-check.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/fuzzyeq-to-jaccard-check.ast
@@ -16,8 +16,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_01.ast
index 83f7572..4a60b67 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_01.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_02.ast
index 9252d55..f7dc16c 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_02.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_03.ast
index c3f6a91..bb0b900 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_03.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_04.ast
index ab9edef..c0f61b1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_04.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_05.ast
index 60fccc6..4beebd6 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_05.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_06.ast
index d4c181d..a34fd1e 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_06.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_07.ast
index 6efb812..0911e49 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_07.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_08.ast
index ffdc437..31f5160 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-let-to-jaccard-check_08.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$jacc ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_01.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_01.ast
index 024623d..0628802 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_01.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_01.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_02.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_02.ast
index 433eae6..a4d18f5 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_02.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_02.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_03.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_03.ast
index 97314fe..38634ed 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_03.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_03.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_04.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_04.ast
index 621a9f0..5f83e9b 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_04.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_04.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_05.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_05.ast
index 4ea0e01..aba64ae 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_05.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_05.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_06.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_06.ast
index e94c845..3f6a9a3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_06.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_06.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_07.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_07.ast
index 0741d5c..17815d3 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_07.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_07.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_08.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_08.ast
index 5914745..fee5f3a 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_08.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/similarity/jaccard-to-jaccard-check_08.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/dont-skip-primary-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/dont-skip-primary-index.ast
index a83918f..ec18343 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/dont-skip-primary-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/dont-skip-primary-index.ast
@@ -11,8 +11,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-ngram-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-ngram-index.ast
index 4647d35..4bfd511 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-ngram-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-ngram-index.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-rtree-secondary-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-rtree-secondary-index.ast
index e5c689e..43691ee 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-rtree-secondary-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-rtree-secondary-index.ast
@@ -27,8 +27,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index-2.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index-2.ast
index 4c8f681..89f3acb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index-2.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index-2.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index.ast
index 4c8f681..89f3acb 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-secondary-btree-index.ast
@@ -12,8 +12,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-word-index.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-word-index.ast
index c76c66b..eaff5d1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-word-index.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/skip-index/skip-word-index.ast
@@ -14,8 +14,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/sort-cust.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/sort-cust.ast
index 8e0b8cc..de97209 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/sort-cust.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/sort-cust.ast
@@ -42,8 +42,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [custlimit.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization-above-join.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization-above-join.ast
index c5c32c6..a1c3dc4 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization-above-join.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization-above-join.ast
@@ -33,13 +33,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperLeft ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperRight ]
 ,
@@ -60,67 +60,50 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=#5 ]
-            Variable [ Name=$lenLeft ]
-            Variable [ Name=$idLeft ]
-            Variable [ Name=$lenRight ]
-            Variable [ Name=$tokensLeft ]
-            Variable [ Name=$prefixTokenRight ]
-            Variable [ Name=$tokensRight ]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$idRight ]
-            Variable [ Name=$prefixTokenLeft ]
+          FieldAccessor [
+            IndexAccessor [
+              Variable [ Name=$g ]
+              Index:               LiteralExpr [LONG] [0]
+            ]
+            Field=sim
           ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperLeft ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensLeft]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensLeft]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenLeft]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenLeft]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
       ]
       AS Variable [ Name=$prefixTokenLeft ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperRight ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensRight]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
-          Variable [ Name=$prefixTokenLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensRight]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenRight]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$prefixTokenLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenRight]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
@@ -155,8 +138,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -183,12 +166,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#2 ]
+                    Variable [ Name=#3 ]
                     Field=paper
                   ]
                   ]
                   FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                    AS Variable [ Name=#3 ]
                   ]
                 )
               ]
@@ -198,7 +181,7 @@
 
           )
           AS Variable [ Name=$tokenRanked ]
- AT
+ AT 
 Variable [ Name=$i ]
         ]
         Where
@@ -240,8 +223,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -257,7 +240,7 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#3 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
@@ -272,7 +255,7 @@
                     Field=paper
                   ]
                   ]
-                  FROM [                    Variable [ Name=#3 ]
+                  FROM [                    Variable [ Name=#2 ]
                     AS Variable [ Name=#4 ]
                   ]
                 )
@@ -283,7 +266,7 @@
 
           )
           AS Variable [ Name=$tokenRanked ]
- AT
+ AT 
 Variable [ Name=$i ]
         ]
         Where
@@ -348,12 +331,9 @@
         Variable [ Name=$paperRight ]
         Field=id
       ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=$g ]
       (
-        paperLeft:=Variable [ Name=$paperLeft ]
-        prefixTokenLeft:=Variable [ Name=$prefixTokenLeft ]
-        paperRight:=Variable [ Name=$paperRight ]
-        prefixTokenRight:=Variable [ Name=$prefixTokenRight ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization.ast
index 1824e70..657a347 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/split-materialization.ast
@@ -26,8 +26,8 @@
     SELECT ELEMENT [
     Variable [ Name=$d ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$d ]
     ]
@@ -49,8 +49,8 @@
     SELECT ELEMENT [
     Variable [ Name=$d ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$d ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/unnest_list_in_subplan.ast b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/unnest_list_in_subplan.ast
index 8379b56..20c07d1 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/unnest_list_in_subplan.ast
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results_parser_sqlpp/unnest_list_in_subplan.ast
@@ -32,8 +32,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -63,8 +63,8 @@
     FROM [      Variable [ Name=$tokensUnrankedDBLP ]
       AS Variable [ Name=$tokenUnranked ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TOKENSRANKEDADM]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.TOKENSRANKEDADM]
       ]
       AS Variable [ Name=$tokenRanked ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias.sqlpp b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias.sqlpp
index 72eb1d9..9d1af80 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias.sqlpp
@@ -17,8 +17,6 @@
  * under the License.
  */
 
-SELECT SQRT(t.a*t.b) AS root FROM tbl_name t
-GROUP BY root
-WITH u AS root
-HAVING root > 0
-ORDER BY u;
\ No newline at end of file
+SELECT sum(t.a*t.b) AS root FROM tbl_name t
+GROUP BY t.id
+ORDER BY root;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias2.sqlpp b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias2.sqlpp
index f74cf47..2e82be5 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias2.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias2.sqlpp
@@ -17,8 +17,8 @@
  * under the License.
  */
 
-SELECT SQRT(t.a*t.b) AS root FROM tbl_name root
+SELECT sum(t.a*t.b) AS root FROM tbl_name root
 GROUP BY root.id
-WITH u AS root.time
-HAVING root.orders > 0
+WITH u AS min(root.time)
+HAVING count(root.orders) > 0
 ORDER BY u;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias3.sqlpp b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias3.sqlpp
index 8226362..d95b42d 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias3.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/columnalias3.sqlpp
@@ -17,8 +17,6 @@
  * under the License.
  */
 
-SELECT ELEMENT {'root': SQRT(t.a*t.b)} FROM tbl_name t
-GROUP BY root
-WITH u AS root
-HAVING root > 0
-ORDER BY u; 
\ No newline at end of file
+SELECT ELEMENT {'root': SUM(t.a*t.b)} FROM tbl_name t
+GROUP BY t.id
+ORDER BY root;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/variables.sqlpp b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/variables.sqlpp
index 7611e3e..417bea8 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/variables.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/parserts/queries_sqlpp/variables.sqlpp
@@ -18,6 +18,7 @@
  */
 
 with  a as 1,
-      b as 1
-select element (b - a)
+      b as 1,
+      _c as 0
+select element (b - a - _c)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/1.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/1.ast
index 807e7a7..f26febf 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/1.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/1.ast
@@ -11,7 +11,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [User]
   ]
   AS Variable [ Name=$user ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/2.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/2.ast
index 0ee0fbd..a605028 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/2.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/2.ast
@@ -18,7 +18,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Event]
   ]
   AS Variable [ Name=$event ]
@@ -54,6 +54,7 @@
   (
     event:=Variable [ Name=$event ]
     sponsor:=Variable [ Name=$sponsor ]
+    es:=Variable [ Name=$es ]
   )
 
 Let Variable [ Name=$sig_sponsorship_count ]
@@ -61,17 +62,13 @@
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [es]
-        Variable [ Name=$sponsor ]
-        Variable [ Name=$event ]
-        Variable [ Name=$sig_name ]
-        Variable [ Name=#1 ]
-        Variable [ Name=#2 ]
+      FieldAccessor [
+        Variable [ Name=#3 ]
+        Field=es
       ]
       ]
       FROM [        Variable [ Name=#1 ]
-        AS Variable [ Name=#2 ]
+        AS Variable [ Name=#3 ]
       ]
     )
   ]
@@ -91,19 +88,15 @@
         FunctionCall asterix.sql-count@1[
           (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [es]
-              Variable [ Name=#4 ]
-              Variable [ Name=$sponsor ]
-              Variable [ Name=$sig_sponsorship_count ]
-              Variable [ Name=$chapter_name ]
-              Variable [ Name=$event ]
-              Variable [ Name=$sig_name ]
-              Variable [ Name=#1 ]
-              Variable [ Name=#3 ]
+            FieldAccessor [
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=e
+              ]
+              Field=es
             ]
             ]
-            FROM [              Variable [ Name=#3 ]
+            FROM [              Variable [ Name=#2 ]
               AS Variable [ Name=#4 ]
             ]
           )
@@ -111,7 +104,7 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [es]
       ]
       AS Variable [ Name=$e ]
@@ -126,7 +119,7 @@
         ]
         Field=chapter_name
       ]
-      GROUP AS Variable [ Name=#3 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         e:=Variable [ Name=$e ]
       )
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/4.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/4.ast
index f7272c5..9599255 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/4.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/4.ast
@@ -8,7 +8,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [SIGroup]
   ]
   AS Variable [ Name=$sig ]
@@ -28,7 +28,7 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [SIGroup]
       ]
       AS Variable [ Name=$similar_sig ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/5.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/5.ast
index 0fd42ae..9eb7cf8 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/5.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/5.ast
@@ -8,7 +8,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Event]
   ]
   AS Variable [ Name=$event ]
@@ -28,7 +28,7 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [Events]
       ]
       AS Variable [ Name=$collocated_event ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/6.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/6.ast
index 0fb00ff..854c7d1 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/6.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/6.ast
@@ -16,7 +16,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Users]
   ]
   AS Variable [ Name=$user ]
@@ -41,7 +41,7 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [Users]
       ]
       AS Variable [ Name=$similar_user ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/ANYInFieldAccessor.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/ANYInFieldAccessor.ast
index 063e698..42e81f9 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/ANYInFieldAccessor.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/ANYInFieldAccessor.ast
@@ -19,12 +19,12 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [User]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Movie]
   ]
   AS Variable [ Name=$mv ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/LetFor.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/LetFor.ast
index 5211b72..cf95f08 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/LetFor.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/LetFor.ast
@@ -1,7 +1,7 @@
 Query:
 Let Variable [ Name=$users ]
   :=
-  FunctionCall Metadata.resolve@-1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [User]
   ]
 SELECT ELEMENT [
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
index aadad7e..1e0efba 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias.ast
@@ -1,66 +1,76 @@
 Query:
 SELECT [
-FunctionCall null.sqrt@1[
-  OperatorExpr [
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [t]
-        Variable [ Name=$u ]
-        Variable [ Name=$root ]
-        Variable [ Name=#1 ]
+FunctionCall asterix.sql-sum@1[
+  (
+    SELECT ELEMENT [
+    OperatorExpr [
+      FieldAccessor [
+        FieldAccessor [
+          Variable [ Name=#3 ]
+          Field=t
+        ]
+        Field=a
       ]
-      Field=a
-    ]
-    *
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [t]
-        Variable [ Name=$u ]
-        Variable [ Name=$root ]
-        Variable [ Name=#1 ]
+      *
+      FieldAccessor [
+        FieldAccessor [
+          Variable [ Name=#3 ]
+          Field=t
+        ]
+        Field=b
       ]
-      Field=b
     ]
-  ]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#3 ]
+    ]
+  )
 ]
 root
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [tbl_name]
   ]
   AS Variable [ Name=$t ]
 ]
 Groupby
-  Variable [ Name=$root ]
+  Variable [ Name=$id ]
   :=
-  FunctionCall null.sqrt@1[
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$t ]
-        Field=a
-      ]
-      *
-      FieldAccessor [
-        Variable [ Name=$t ]
-        Field=b
-      ]
-    ]
+  FieldAccessor [
+    Variable [ Name=$t ]
+    Field=id
   ]
   GROUP AS Variable [ Name=#1 ]
   (
     t:=Variable [ Name=$t ]
   )
 
-Let Variable [ Name=$u ]
-  :=
-  Variable [ Name=$root ]
- HAVING
-  OperatorExpr [
-    Variable [ Name=$root ]
-    >
-    LiteralExpr [LONG] [0]
-  ]
 Orderby
-  Variable [ Name=$u ]
+  FunctionCall asterix.sql-sum@1[
+    (
+      SELECT ELEMENT [
+      OperatorExpr [
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#2 ]
+            Field=t
+          ]
+          Field=a
+        ]
+        *
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#2 ]
+            Field=t
+          ]
+          Field=b
+        ]
+      ]
+      ]
+      FROM [        Variable [ Name=#1 ]
+        AS Variable [ Name=#2 ]
+      ]
+    )
+  ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
index 9cf8d6f..563b883 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias2.ast
@@ -1,31 +1,40 @@
 Query:
 SELECT [
-FunctionCall null.sqrt@1[
-  OperatorExpr [
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [t]
-        Variable [ Name=$u ]
-        Variable [ Name=#1 ]
-        Variable [ Name=$id ]
+FunctionCall asterix.sql-sum@1[
+  (
+    SELECT ELEMENT [
+    OperatorExpr [
+      FieldAccessor [
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#4 ]
+            Field=root
+          ]
+          Field=t
+        ]
+        Field=a
       ]
-      Field=a
-    ]
-    *
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [t]
-        Variable [ Name=$u ]
-        Variable [ Name=#1 ]
-        Variable [ Name=$id ]
+      *
+      FieldAccessor [
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#4 ]
+            Field=root
+          ]
+          Field=t
+        ]
+        Field=b
       ]
-      Field=b
     ]
-  ]
+    ]
+    FROM [      Variable [ Name=#1 ]
+      AS Variable [ Name=#4 ]
+    ]
+  )
 ]
 root
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [tbl_name]
   ]
   AS Variable [ Name=$root ]
@@ -44,24 +53,39 @@
 
 Let Variable [ Name=$u ]
   :=
-  FieldAccessor [
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [root]
-      Variable [ Name=#1 ]
-      Variable [ Name=$id ]
-    ]
-    Field=time
+  FunctionCall asterix.sql-min@1[
+    (
+      SELECT ELEMENT [
+      FieldAccessor [
+        FieldAccessor [
+          Variable [ Name=#2 ]
+          Field=root
+        ]
+        Field=time
+      ]
+      ]
+      FROM [        Variable [ Name=#1 ]
+        AS Variable [ Name=#2 ]
+      ]
+    )
   ]
  HAVING
   OperatorExpr [
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [root]
-        Variable [ Name=$u ]
-        Variable [ Name=#1 ]
-        Variable [ Name=$id ]
-      ]
-      Field=orders
+    FunctionCall asterix.sql-count@1[
+      (
+        SELECT ELEMENT [
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#3 ]
+            Field=root
+          ]
+          Field=orders
+        ]
+        ]
+        FROM [          Variable [ Name=#1 ]
+          AS Variable [ Name=#3 ]
+        ]
+      )
     ]
     >
     LiteralExpr [LONG] [0]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
index 92fcd53..7deb117 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/columnalias3.ast
@@ -4,68 +4,78 @@
   (
     LiteralExpr [STRING] [root]
     :
-    FunctionCall null.sqrt@1[
-      OperatorExpr [
-        FieldAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [t]
-            Variable [ Name=$u ]
-            Variable [ Name=$root ]
-            Variable [ Name=#1 ]
+    FunctionCall asterix.sql-sum@1[
+      (
+        SELECT ELEMENT [
+        OperatorExpr [
+          FieldAccessor [
+            FieldAccessor [
+              Variable [ Name=#3 ]
+              Field=t
+            ]
+            Field=a
           ]
-          Field=a
-        ]
-        *
-        FieldAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [t]
-            Variable [ Name=$u ]
-            Variable [ Name=$root ]
-            Variable [ Name=#1 ]
+          *
+          FieldAccessor [
+            FieldAccessor [
+              Variable [ Name=#3 ]
+              Field=t
+            ]
+            Field=b
           ]
-          Field=b
         ]
-      ]
+        ]
+        FROM [          Variable [ Name=#1 ]
+          AS Variable [ Name=#3 ]
+        ]
+      )
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [tbl_name]
   ]
   AS Variable [ Name=$t ]
 ]
 Groupby
-  Variable [ Name=$root ]
+  Variable [ Name=$id ]
   :=
-  FunctionCall null.sqrt@1[
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$t ]
-        Field=a
-      ]
-      *
-      FieldAccessor [
-        Variable [ Name=$t ]
-        Field=b
-      ]
-    ]
+  FieldAccessor [
+    Variable [ Name=$t ]
+    Field=id
   ]
   GROUP AS Variable [ Name=#1 ]
   (
     t:=Variable [ Name=$t ]
   )
 
-Let Variable [ Name=$u ]
-  :=
-  Variable [ Name=$root ]
- HAVING
-  OperatorExpr [
-    Variable [ Name=$root ]
-    >
-    LiteralExpr [LONG] [0]
-  ]
 Orderby
-  Variable [ Name=$u ]
+  FunctionCall asterix.sql-sum@1[
+    (
+      SELECT ELEMENT [
+      OperatorExpr [
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#2 ]
+            Field=t
+          ]
+          Field=a
+        ]
+        *
+        FieldAccessor [
+          FieldAccessor [
+            Variable [ Name=#2 ]
+            Field=t
+          ]
+          Field=b
+        ]
+      ]
+      ]
+      FROM [        Variable [ Name=#1 ]
+        AS Variable [ Name=#2 ]
+      ]
+    )
+  ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_correlate.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_correlate.ast
index 26a623b..667f4e2 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_correlate.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_correlate.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$r ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [sensors]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.sensors]
   ]
   AS Variable [ Name=$s ]
   INNER UNNEST
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_flatten.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_flatten.ast
index 5f5e37f..8c463f0 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_flatten.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_flatten.ast
@@ -9,8 +9,8 @@
 Variable [ Name=$r ]
 reading
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [sensors]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.sensors]
   ]
   AS Variable [ Name=$s ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_join.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_join.ast
index 9d28bd0..80f2302 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_join.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/from_inner_join.ast
@@ -17,13 +17,13 @@
 ]
 location
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [sensors]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.sensors]
   ]
   AS Variable [ Name=$s ]
   INNER JOIN
-    FunctionCall Metadata.dataset@1[
-      LiteralExpr [STRING] [sensorMeta]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [test.sensorMeta]
     ]
     AS Variable [ Name=$m ]
     ON
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
index b14e49b..6c92c37 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/functionDecl1.ast
@@ -102,7 +102,7 @@
 Let Variable [ Name=$result ]
   :=
   FunctionCall null.calculate@1[
-    FunctionCall Metadata.resolve@-1[
+    FunctionCall asterix.dataset@1[
       LiteralExpr [STRING] [Events]
     ]
   ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR.ast
index aa422a1..b43814a 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR.ast
@@ -14,7 +14,7 @@
 FROM [  (
     Let Variable [ Name=$data ]
       :=
-      FunctionCall Metadata.resolve@-1[
+      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [User]
       ]
     SELECT ELEMENT [
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR2.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR2.ast
index 60f5465..463ddc4 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR2.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR2.ast
@@ -34,7 +34,7 @@
       SELECT ELEMENT [
       Variable [ Name=$tmp ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
+      FROM [        FunctionCall asterix.dataset@1[
           LiteralExpr [STRING] [number]
         ]
         AS Variable [ Name=$tmp ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR3.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR3.ast
index f9be2c5..f4d8694 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR3.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFLWOGR3.ast
@@ -18,7 +18,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Event]
   ]
   AS Variable [ Name=$event ]
@@ -54,6 +54,7 @@
   (
     event:=Variable [ Name=$event ]
     sponsor:=Variable [ Name=$sponsor ]
+    es:=Variable [ Name=$es ]
   )
 
 Let Variable [ Name=$sig_sponsorship_count ]
@@ -61,17 +62,13 @@
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [es]
-        Variable [ Name=$sponsor ]
-        Variable [ Name=$event ]
-        Variable [ Name=$sig_name ]
-        Variable [ Name=#1 ]
-        Variable [ Name=#2 ]
+      FieldAccessor [
+        Variable [ Name=#3 ]
+        Field=es
       ]
       ]
       FROM [        Variable [ Name=#1 ]
-        AS Variable [ Name=#2 ]
+        AS Variable [ Name=#3 ]
       ]
     )
   ]
@@ -91,19 +88,15 @@
         FunctionCall asterix.sql-count@1[
           (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [es]
-              Variable [ Name=#4 ]
-              Variable [ Name=$sponsor ]
-              Variable [ Name=$sig_sponsorship_count ]
-              Variable [ Name=$chapter_name ]
-              Variable [ Name=$event ]
-              Variable [ Name=$sig_name ]
-              Variable [ Name=#1 ]
-              Variable [ Name=#3 ]
+            FieldAccessor [
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=e
+              ]
+              Field=es
             ]
             ]
-            FROM [              Variable [ Name=#3 ]
+            FROM [              Variable [ Name=#2 ]
               AS Variable [ Name=#4 ]
             ]
           )
@@ -111,7 +104,7 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [es]
       ]
       AS Variable [ Name=$e ]
@@ -126,7 +119,7 @@
         ]
         Field=chapter_name
       ]
-      GROUP AS Variable [ Name=#3 ]
+      GROUP AS Variable [ Name=#2 ]
       (
         e:=Variable [ Name=$e ]
       )
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFor.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFor.ast
index da1252e..52a9319 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFor.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/nestedFor.ast
@@ -19,12 +19,12 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [User]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Movie]
   ]
   AS Variable [ Name=$mv ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/numberInFieldAccessor.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/numberInFieldAccessor.ast
index ef6707f..605113f 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/numberInFieldAccessor.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/numberInFieldAccessor.ast
@@ -19,12 +19,12 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [User]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Movie]
   ]
   AS Variable [ Name=$mv ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/variables.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/variables.ast
index 698f469..9f6906c 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/variables.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/variables.ast
@@ -5,10 +5,15 @@
 Let Variable [ Name=$b ]
   :=
   LiteralExpr [LONG] [1]
+Let Variable [ Name=$_c ]
+  :=
+  LiteralExpr [LONG] [0]
 SELECT ELEMENT [
 OperatorExpr [
   Variable [ Name=$b ]
   -
   Variable [ Name=$a ]
+  -
+  Variable [ Name=$_c ]
 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/where_clause.ast b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/where_clause.ast
index 4ada26d..e26b724 100644
--- a/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/where_clause.ast
+++ b/asterixdb/asterix-app/src/test/resources/parserts/results_parser_sqlpp/where_clause.ast
@@ -6,8 +6,8 @@
   Field=reading
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [sensors]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.sensors]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/data/big_object_20M.adm b/asterixdb/asterix-app/src/test/resources/runtimets/data/big_object_20M.adm
new file mode 100644
index 0000000..0a79c67
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/data/big_object_20M.adm
Binary files differ
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/feed-stats/feed-stats.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/feed-stats/feed-stats.1.ddl.aql
index 8089d15..7b8c63b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/feed-stats/feed-stats.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/api/feed-stats/feed-stats.1.ddl.aql
@@ -43,10 +43,10 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/big-object/big_object_feed_20M/big_object_feed_20M.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/big-object/big_object_feed_20M/big_object_feed_20M.1.ddl.aql
index e296d50..170e693 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/big-object/big_object_feed_20M/big_object_feed_20M.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/big-object/big_object_feed_20M/big_object_feed_20M.1.ddl.aql
@@ -36,9 +36,10 @@
 create dataset testds(testtype) primary key id;
 
 
-create feed BigFeed
-using localfs
-(("path"="asterix_nc1://target/data/big-object/big_object_20M.adm"),
-("format"="adm"),
-("type-name"="testtype"),
-("tuple-interval"="2"));
+create feed BigFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://target/data/big-object/big_object_20M.adm",
+  "format" : "adm",
+  "type-name" : "testtype",
+  "tuple-interval" : "2"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/find/find.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/find/find.3.query.aql
index 58f6a96..6e64f16 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/find/find.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/find/find.3.query.aql
@@ -19,13 +19,13 @@
 use dataverse test;
 
 let $x := hex("aabbccddaa")
-let $r1 := find-binary($x, hex('')) = 1
-let $r2 := find-binary($x, hex('aa')) = 1
-let $r3 := find-binary($x, hex('aa'), 1) = 5
+let $r1 := find-binary($x, hex('')) = 0
+let $r2 := find-binary($x, hex('aa')) = 0
+let $r3 := find-binary($x, hex('aa'), 1) = 4
 let $r4 := find-binary($x, hex('aabb'), 0) = find-binary($x, hex('aabb'))
-let $r5 := find-binary($x, hex('11')) = 0
-let $r6 := find-binary($x, hex('ccddaa')) = 3
-let $r7 := find-binary($x, hex('ccddaabb')) = 0
+let $r5 := find-binary($x, hex('11')) = -1
+let $r6 := find-binary($x, hex('ccddaa')) = 2
+let $r7 := find-binary($x, hex('ccddaabb')) = -1
 
 let $r8 := find-binary($x, null)
 let $r9 := find-binary(null, null)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/subbinary/subbinary_01.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/subbinary/subbinary_01.3.query.aql
index d4dce94..79980af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/subbinary/subbinary_01.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/binary/subbinary/subbinary_01.3.query.aql
@@ -24,18 +24,18 @@
 let $r2 := sub-binary(hex(''),1) = hex('')
 let $r3 := sub-binary(hex(''),-1) = hex('')
 
-let $r4 := sub-binary($x, 1, binary-length($x)) = $x
-let $r5 := sub-binary($x, 2, 1) = hex('bb')
-let $r6 := sub-binary($x, 2) = hex('bbccdd')
-let $r7 := sub-binary($x, 5, 0) = hex('')
-let $r8 := sub-binary($x, 4, 1) = hex('dd')
-let $r9 := sub-binary($x, 2, 2) = hex('bbcc') 
+let $r4 := sub-binary($x, 0, binary-length($x)) = $x
+let $r5 := sub-binary($x, 1, 1) = hex('bb')
+let $r6 := sub-binary($x, 1) = hex('bbccdd')
+let $r7 := sub-binary($x, 4, 0) = hex('')
+let $r8 := sub-binary($x, 3, 1) = hex('dd')
+let $r9 := sub-binary($x, 1, 2) = hex('bbcc')
 
 let $r10 := sub-binary($x, 0) = $x
 let $r11 := sub-binary($x, -1) = $x
-let $r12 := sub-binary($x, 1, 256) = $x
-let $r13 := sub-binary($x, 2, 256) = hex('bbccdd')
-let $r14 := sub-binary($x, 2, -1) = hex('')
+let $r12 := sub-binary($x, 0, 256) = $x
+let $r13 := sub-binary($x, 1, 256) = hex('bbccdd')
+let $r14 := sub-binary($x, 1, -1) = hex('')
 
 return  [ $r1 ,$r2 ,$r3 ,$r4 ,$r5 , $r6 , $r7 , $r8 , $r9 , $r10 , $r11 , $r12 , $r13 , $r14 ]
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv11/cross-dv11.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv11/cross-dv11.1.ddl.aql
index 393d6a3..5a7b7b2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv11/cross-dv11.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv11/cross-dv11.1.ddl.aql
@@ -28,11 +28,10 @@
 create dataverse testdv1;
 create dataverse testdv2;
 
-create function testdv1.fun01(){
-testdv2.fun02()
-}
-
 create function testdv2.fun02(){
 "function 02"
 }
 
+create function testdv1.fun01(){
+testdv2.fun02()
+}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.1.ddl.aql
deleted file mode 100644
index 21ff696..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.1.ddl.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception. 
- */
-
-drop dataverse testdv1 if exists;
-drop dataverse testdv2 if exists;
-create dataverse testdv1;
-create dataverse testdv2;
-
-create function testdv1.fun01(){
-testdv2.fun02()
-}
-
-create function testdv2.fun02(){
-testdv2.fun03()
-}
-
-create function testdv2.fun03(){
-testdv1.fun01()
-}
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.2.update.aql
deleted file mode 100644
index 6f99df6..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.2.update.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception. 
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.3.query.aql
deleted file mode 100644
index 1131add..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv13/cross-dv13.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception. 
- */
-
-use dataverse testdv1;
-
-testdv1.fun01();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.1.ddl.aql
deleted file mode 100644
index eb559df..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.1.ddl.aql
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
-drop dataverse testdv1 if exists;
-create dataverse testdv1;
-
-// UDF with no inputs
-create function testdv1.fun01(){
-testdv1.fun02()
-}
-
-// UDF with one input
-create function testdv1.fun02(){
-testdv1.fun03()
-}
-
-// UDF with two inputs
-create function testdv1.fun03(){
-testdv1.fun04()
-}
-
-create function testdv1.fun04(){
-testdv1.fun02()
-}
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.2.update.aql
deleted file mode 100644
index c70f3db..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.2.update.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.3.query.aql
deleted file mode 100644
index f9545d2..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/cross-dataverse/cross-dv16/cross-dv16.3.query.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
-use dataverse testdv1;
-
-testdv1.fun01()
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/load-with-autogenerated-no-field/load-with-autogenerated-no-field.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/load-with-autogenerated-no-field/load-with-autogenerated-no-field.1.ddl.aql
new file mode 100644
index 0000000..a0764a0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/load-with-autogenerated-no-field/load-with-autogenerated-no-field.1.ddl.aql
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+// try to create autogenerated key on field not mentioned in type, should fail
+
+drop dataverse test if exists;
+create dataverse test;
+
+use dataverse test;
+
+create type DBLPType as open {
+  id: uuid,
+  dblpid: string,
+  title: string,
+  authors: string,
+  misc: string
+}
+
+create dataset DBLP(DBLPType) primary key not_id autogenerated;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.aql
index e4a402e..6de0041 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.aql
@@ -45,13 +45,17 @@
 }
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed CustomerFeed
-using localfs
-(("path"="asterix_nc1://data/semistructured/co1k/customer.adm"),
-("format"="adm"),
-("type-name"="CustomerType"),
-("tuple-interval"="10"));
-
+create feed CustomerFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/semistructured/co1k/customer.adm",
+ "format" : "adm",
+ "type-name" : "CustomerType",
+ "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.aql
index c540b1f..352f821 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.aql
@@ -53,9 +53,17 @@
 }
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset CustomersOpen(CustomerOpenType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.aql
index c846c06..4c244c8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.aql
@@ -45,10 +45,17 @@
 }
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset CustomersMini(CustomerType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.aql
index 09e4d94..7fa85b8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.aql
@@ -53,10 +53,17 @@
 }
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset CustomersOpen(CustomerOpenType) primary key cid
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.aql
index f5360a4..d60105e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.aql
@@ -49,6 +49,10 @@
 }
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy constant
-(("num-components"="2"));
-
+primary key l_orderkey, l_linenumber
+with {
+  "merge-policy": {
+    "name": "constant",
+    "parameters": { "num-components": 2 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.aql
index ab50500..195ff14 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.aql
@@ -49,13 +49,19 @@
 }
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy correlated-prefix
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+primary key l_orderkey, l_linenumber
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed LineItemFeed
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),
-("format"="delimited-text"),
-("delimiter"="|"),
-("type-name"="LineItemType"),
-("tuple-interval"="10"));
\ No newline at end of file
+create feed LineItemFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/tpch0.001/lineitem.tbl",
+  "format" : "delimited-text",
+  "delimiter" : "|",
+  "type-name" : "LineItemType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.aql
index 37a7374..bf03e36 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.aql
@@ -49,6 +49,10 @@
 }
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy correlated-prefix
-(("max-mergable-component-size"="1048576"),("max-tolerance-component-count"="3"));
-
+primary key l_orderkey, l_linenumber
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.aql
index 5b335e0..8ee9893 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.aql
@@ -49,5 +49,4 @@
 }
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy no-merge;
-
+primary key l_orderkey, l_linenumber with { "merge-policy": { "name": "no-merge" } };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.aql
index 80a5d68..1f41b10 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.aql
@@ -49,6 +49,10 @@
 }
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy prefix
-(("max-mergable-component-size"="1048576"),("max-tolerance-component-count"="3"));
-
+primary key l_orderkey, l_linenumber
+with {"merge-policy":
+       {"name":"prefix", "parameters":
+         {"max-mergable-component-size":1048576, "max-tolerance-component-count":3
+         }
+       }
+     };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/external-library/typed_adapter/typed_adapter.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/external-library/typed_adapter/typed_adapter.3.ddl.aql
index 800cef3..d615b1f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/external-library/typed_adapter/typed_adapter.3.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/external-library/typed_adapter/typed_adapter.3.ddl.aql
@@ -27,5 +27,8 @@
  */
 
 use dataverse externallibtest;
-create feed TestTypedAdapterFeed
-using "testlib#test_typed_adapter" (("num_output_records"="5"),("type-name"="TestTypedAdapterOutputType"));
+create feed TestTypedAdapterFeed with {
+  "adapter-name" : "testlib#test_typed_adapter",
+  "num_output_records" : "5",
+  "type-name" : "TestTypedAdapterOutputType"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-csv/change-feed-with-meta-csv.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-csv/change-feed-with-meta-csv.1.ddl.aql
index b695a5d..965605a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-csv/change-feed-with-meta-csv.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-csv/change-feed-with-meta-csv.1.ddl.aql
@@ -4,7 +4,7 @@
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
+ * "License"; you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
@@ -32,30 +32,31 @@
  id:int
  }
 
- create dataset TestDS(TestType) with meta(MetaType) primary key meta().id;
- create index TestIdx on TestDS(test);
- drop feed TestFeed if exists;
- create feed TestFeed using localfs
- (
-     ("parser"="record-with-metadata"),
-     ("reader"="localfs"),
-     ("path"="asterix_nc1://target/data/csv/change_feed.csv"),
-     //type of the record
-     ("type-name"="TestType"),
-     //type of the meta record
-     ("meta-type-name"="MetaType"),
-     //format of the record
-     ("record-format"="adm"),
-     // format of the meta record
-     ("format"="csv"),
-     ("delimiter"=","),
-     // index of the primary key the record (meta or orig)
-     ("key-indexes"="0"),
-     // indicates that PK originates from meta
-     ("key-indicators"="1"),
-     //index of the record in the meta record
-     ("record-index"="1"),
-     ("change-feed"="true"),
-     // whether CSV header is present in the input
-     ("header"="false")
- );
\ No newline at end of file
+create dataset TestDS(TestType) with meta(MetaType) primary key meta().id;
+create index TestIdx on TestDS(test);
+drop feed TestFeed if exists;
+
+create feed TestFeed with {
+  "adapter-name" : "localfs",
+  "parser" : "record-with-metadata",
+  "reader" : "localfs",
+  "path" : "asterix_nc1://target/data/csv/change_feed.csv",
+  //type of the record
+  "type-name" : "TestType",
+  //type of the meta record
+  "meta-type-name" : "MetaType",
+  //format of the record
+  "record-format" : "adm",
+  // format of the meta record
+  "format" : "csv",
+  "delimiter" : ",",
+  // index of the primary key the record (meta or orig)
+  "key-indexes" : "0",
+  // indicates that PK originates from meta
+  "key-indicators" : "1",
+  //index of the record in the meta record
+  "record-index" : "1",
+  "change-feed" : "true",
+  // whether CSV header is present in the input
+  "header" : "false"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-open-index-in-meta/change-feed-with-meta-open-index-in-meta.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-open-index-in-meta/change-feed-with-meta-open-index-in-meta.1.ddl.aql
index 8d923c5..58f2091 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-open-index-in-meta/change-feed-with-meta-open-index-in-meta.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-open-index-in-meta/change-feed-with-meta-open-index-in-meta.1.ddl.aql
@@ -43,17 +43,18 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
+create feed KVChangeStream with {
+  "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
 
 create index OpenIndex on KVStore(meta().id:int32?) enforced;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-after-ingest/change-feed-with-meta-pk-in-meta-index-after-ingest.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-after-ingest/change-feed-with-meta-pk-in-meta-index-after-ingest.1.ddl.aql
index 37e3e90..4f4ea0f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-after-ingest/change-feed-with-meta-pk-in-meta-index-after-ingest.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-after-ingest/change-feed-with-meta-pk-in-meta-index-after-ingest.1.ddl.aql
@@ -43,15 +43,16 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
\ No newline at end of file
+create feed KVChangeStream with {
+ "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-in-meta/change-feed-with-meta-pk-in-meta-index-in-meta.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-in-meta/change-feed-with-meta-pk-in-meta-index-in-meta.1.ddl.aql
index 1a1acea..c3e82f2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-in-meta/change-feed-with-meta-pk-in-meta-index-in-meta.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-in-meta/change-feed-with-meta-pk-in-meta-index-in-meta.1.ddl.aql
@@ -43,17 +43,18 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
+create feed KVChangeStream with {
+ "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
 
-create index VBucketIndex on KVStore(meta().vbucket);
\ No newline at end of file
+create index VBucketIndex on KVStore(meta().vbucket);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest.1.ddl.aql
index 6d475bd..689456d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest/change-feed-with-meta-pk-in-meta-index-with-missing-after-ingest.1.ddl.aql
@@ -43,15 +43,16 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
\ No newline at end of file
+create feed KVChangeStream with {
+  "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-in-value/change-feed-with-meta-pk-in-meta-open-index-in-value.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-in-value/change-feed-with-meta-pk-in-meta-open-index-in-value.1.ddl.aql
index 3ef8603..928f3ce 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-in-value/change-feed-with-meta-pk-in-meta-open-index-in-value.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-in-value/change-feed-with-meta-pk-in-meta-open-index-in-value.1.ddl.aql
@@ -43,17 +43,18 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
+create feed KVChangeStream with {
+  "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
 
 create index OpenIndex on KVStore(id:int32?) enforced;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-with-missing/change-feed-with-meta-pk-in-meta-open-index-with-missing.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-with-missing/change-feed-with-meta-pk-in-meta-open-index-with-missing.1.ddl.aql
index 8689c91..05e7564 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-with-missing/change-feed-with-meta-pk-in-meta-open-index-with-missing.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta-open-index-with-missing/change-feed-with-meta-pk-in-meta-open-index-with-missing.1.ddl.aql
@@ -43,17 +43,18 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
+create feed KVChangeStream with {
+  "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
 
 create index OpenIndex on KVStore(exp:int32?) enforced;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta/change-feed-with-meta-pk-in-meta.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta/change-feed-with-meta-pk-in-meta.1.ddl.aql
index 2c74ac7..4dfeffb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta/change-feed-with-meta-pk-in-meta.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-pk-in-meta/change-feed-with-meta-pk-in-meta.1.ddl.aql
@@ -4,7 +4,7 @@
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
+ * "License"; you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
@@ -42,15 +42,16 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
\ No newline at end of file
+create feed KVChangeStream with {
+ "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-with-mixed-index/change-feed-with-meta-with-mixed-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-with-mixed-index/change-feed-with-meta-with-mixed-index.1.ddl.aql
index 2471f79..6e2cefb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-with-mixed-index/change-feed-with-meta-with-mixed-index.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed-with-meta-with-mixed-index/change-feed-with-meta-with-mixed-index.1.ddl.aql
@@ -44,17 +44,18 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
 
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
+create feed KVChangeStream with {
+  "adapter-name" : "adapter",
+  "type-name" : "DocumentType",
+  "meta-type-name" : "KVMetaType",
+  "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+  "parser" : "record-with-metadata",
+  "format" : "dcp",
+  "record-format" : "json",
+  "change-feed" : "true",
+  "key-indexes" : "0",
+  "key-indicators" : "1",
+  "num-of-records" : "1000"
+};
 
-create index MixedIndex on KVStore(meta().vbucket,id);
\ No newline at end of file
+create index MixedIndex on KVStore(meta().vbucket,id);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed/change-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed/change-feed.1.ddl.aql
index e78327a..44fedb1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed/change-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/change-feed/change-feed.1.ddl.aql
@@ -31,13 +31,14 @@
 }
 
 create dataset FeedDataset(FeedRecordType) primary key id;
-create feed ChangeFeed using test_change_feed(
-    ("type-name"="FeedRecordType"),
-    ("record-format"="adm"),
-    ("format"="test-csv"),
-    ("delimiter"=","),
-    ("key-indexes"="0"),
-    ("reader"="org.apache.asterix.external.input.record.reader.RecordWithPKTestReaderFactory"),
-    ("parser"="org.apache.asterix.external.parser.factory.TestRecordWithPKParserFactory"),
-    ("change-feed"="true")
-);
\ No newline at end of file
+create feed ChangeFeed with {
+  "adapter-name" : "test_change_feed",
+  "type-name" : "FeedRecordType",
+  "record-format" : "adm",
+  "format" : "test-csv",
+  "delimiter" : ",",
+  "key-indexes" : "0",
+  "reader" : "org.apache.asterix.external.input.record.reader.RecordWithPKTestReaderFactory",
+  "parser" : "org.apache.asterix.external.parser.factory.TestRecordWithPKParserFactory",
+  "change-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.aql
index 631c3fb..159b3a2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.aql
@@ -47,11 +47,11 @@
     return object_merge($tty2, $anyname)
 }
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("upsert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "upsert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed/connect-feed.0.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed/connect-feed.0.ddl.aql
index 9237c1e..5a57d7c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed/connect-feed.0.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-feed/connect-feed.0.ddl.aql
@@ -37,10 +37,10 @@
 create dataset Tweets3 (Tweet)
 primary key id;
 
-create feed TwitterFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="Tweet"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TwitterFeed with {
+ "adapter-name" : "socket_adapter",
+ "sockets" : "127.0.0.1:10001",
+ "address-type" : "IP",
+ "type-name" : "Tweet",
+ "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-live-feed/connect-live-feed.0.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-live-feed/connect-live-feed.0.ddl.aql
index 47bee4d..cfd885b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-live-feed/connect-live-feed.0.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/connect-live-feed/connect-live-feed.0.ddl.aql
@@ -29,12 +29,12 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
- ("sockets"="127.0.0.1:10001"),
- ("address-type"="IP"),
- ("type-name"="TweetMessageType"),
- ("format"="adm")
-);
+create feed TweetFeed with {
+ "adapter-name" : "socket_adapter",
+ "sockets" : "127.0.0.1:10001",
+ "address-type" : "IP",
+ "type-name" : "TweetMessageType",
+ "format" : "adm"
+};
 
 connect feed TweetFeed to dataset Tweets1;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/create-feed-with-policy/create-feed-with-policy.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/create-feed-with-policy/create-feed-with-policy.1.ddl.aql
index 4e21323..138231f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/create-feed-with-policy/create-feed-with-policy.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/create-feed-with-policy/create-feed-with-policy.1.ddl.aql
@@ -49,10 +49,10 @@
 
 create dataset Tweets(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TweetFeed with {
+ "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/disconnect-live-feed/disconnect-live-feed.0.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/disconnect-live-feed/disconnect-live-feed.0.ddl.aql
index 00fb12d..0b8f74e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/disconnect-live-feed/disconnect-live-feed.0.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/disconnect-live-feed/disconnect-live-feed.0.ddl.aql
@@ -29,13 +29,13 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
- ("sockets"="127.0.0.1:10001"),
- ("address-type"="IP"),
- ("type-name"="TweetMessageType"),
- ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
 
 connect feed TweetFeed to dataset Tweets1;
 connect feed TweetFeed to dataset Tweets2;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-disconnected-feed/drop-dataverse-with-disconnected-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-disconnected-feed/drop-dataverse-with-disconnected-feed.1.ddl.aql
index 70322cb..0a659fe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-disconnected-feed/drop-dataverse-with-disconnected-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-disconnected-feed/drop-dataverse-with-disconnected-feed.1.ddl.aql
@@ -45,10 +45,10 @@
 
 create dataset Tweets(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-function-used-by-feed/drop-dataverse-with-function-used-by-feed.2.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-function-used-by-feed/drop-dataverse-with-function-used-by-feed.2.ddl.aql
index f16a105..3116f56 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-function-used-by-feed/drop-dataverse-with-function-used-by-feed.2.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-dataverse-with-function-used-by-feed/drop-dataverse-with-function-used-by-feed.2.ddl.aql
@@ -29,11 +29,11 @@
 
 create dataset TwitterUsers(TwitterUser) primary key screen-name;
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("upsert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "upsert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-no-longer-used-by-feed/drop-function-no-longer-used-by-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-no-longer-used-by-feed/drop-function-no-longer-used-by-feed.1.ddl.aql
index 19eda0e..3ccff8f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-no-longer-used-by-feed/drop-function-no-longer-used-by-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-no-longer-used-by-feed/drop-function-no-longer-used-by-feed.1.ddl.aql
@@ -4,7 +4,7 @@
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
+ * "License"; you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
@@ -34,11 +34,11 @@
     return object_merge($tty1, $xyz)
 }
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("upsert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "upsert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-used-by-feed/drop-function-used-by-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-used-by-feed/drop-function-used-by-feed.1.ddl.aql
index 19eda0e..aaa573b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-used-by-feed/drop-function-used-by-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/drop-function-used-by-feed/drop-function-used-by-feed.1.ddl.aql
@@ -34,11 +34,11 @@
     return object_merge($tty1, $xyz)
 }
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("upsert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "upsert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-push-socket/feed-push-socket.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-push-socket/feed-push-socket.1.ddl.aql
index 547085f..c6ab096 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-push-socket/feed-push-socket.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-push-socket/feed-push-socket.1.ddl.aql
@@ -49,10 +49,10 @@
 
 create dataset Tweets(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.1.ddl.aql
index 58b9174..e68f75a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-function/feed-with-external-function.1.ddl.aql
@@ -47,11 +47,12 @@
   topics : {{string}}
 }
 
-create feed TweetFeed
-using localfs
-(("type-name"="TweetInputType"),
-("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"));
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "type-name" : "TweetInputType",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm"
+};
 
 create dataset TweetsFeedIngest(TweetOutputType)
 primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-open-index/feed-with-external-parser-with-open-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-open-index/feed-with-external-parser-with-open-index.3.ddl.aql
index df82fd0..2052e10 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-open-index/feed-with-external-parser-with-open-index.3.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-open-index/feed-with-external-parser-with-open-index.3.ddl.aql
@@ -27,9 +27,11 @@
 create dataset Condor(Classad) primary key GlobalJobId;
 create index BlockWritesIndex on Condor(BlockWrites:int64?) enforced;
 
-create feed CondorFeed using push_localfs(
-("path"="asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt, asterix_nc1://data/external-parser/dropbox2/jobads3.txt"),
-("reader"="localfs"),
-("format"="semi-structured"),
-("parser"="testlib#org.apache.asterix.external.library.ClassAdParserFactory"),
-("type-name"="Classad"));
+create feed CondorFeed with {
+  "adapter-name" : "push_localfs",
+  "path" : "asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt, asterix_nc1://data/external-parser/dropbox2/jobads3.txt",
+  "reader" : "localfs",
+  "format" : "semi-structured",
+  "parser" : "testlib#org.apache.asterix.external.library.ClassAdParserFactory",
+  "type-name" : "Classad"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-two-open-indexes/feed-with-external-parser-with-two-open-indexes.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-two-open-indexes/feed-with-external-parser-with-two-open-indexes.3.ddl.aql
index fa9b833..53513b8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-two-open-indexes/feed-with-external-parser-with-two-open-indexes.3.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser-with-two-open-indexes/feed-with-external-parser-with-two-open-indexes.3.ddl.aql
@@ -28,9 +28,11 @@
 create index BlockWritesIndex on Condor(BlockWrites:int64?) enforced;
 create index JobStartDateIndex on Condor(JobStartDate:int64?) enforced;
 
-create feed CondorFeed using push_localfs(
-("path"="asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt, asterix_nc1://data/external-parser/dropbox2/jobads3.txt"),
-("reader"="localfs"),
-("format"="semi-structured"),
-("parser"="testlib#org.apache.asterix.external.library.ClassAdParserFactory"),
-("type-name"="Classad"));
+create feed CondorFeed with {
+  "adapter-name" : "push_localfs",
+  "path" : "asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt, asterix_nc1://data/external-parser/dropbox2/jobads3.txt",
+  "reader" : "localfs",
+  "format" : "semi-structured",
+  "parser" : "testlib#org.apache.asterix.external.library.ClassAdParserFactory",
+  "type-name" : "Classad"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser/feed-with-external-parser.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser/feed-with-external-parser.3.ddl.aql
index 1ec1f45..1be78a2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser/feed-with-external-parser.3.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-external-parser/feed-with-external-parser.3.ddl.aql
@@ -25,9 +25,11 @@
 use dataverse externallibtest;
 create dataset Condor(Classad) primary key GlobalJobId;
 
-create feed CondorFeed using push_localfs(
-("path"="asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt"),
-("reader"="localfs"),
-("format"="semi-structured"),
-("parser"="testlib#org.apache.asterix.external.library.ClassAdParserFactory"),
-("type-name"="Classad"));
+create feed CondorFeed with {
+  "adapter-name" : "push_localfs",
+  "path" : "asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt",
+  "reader" : "localfs",
+  "format" : "semi-structured",
+  "parser" : "testlib#org.apache.asterix.external.library.ClassAdParserFactory",
+  "type-name" : "Classad"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-filtered-dataset/feed-with-filtered-dataset.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-filtered-dataset/feed-with-filtered-dataset.1.ddl.aql
index 8bd1e3d..cd7c638 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-filtered-dataset/feed-with-filtered-dataset.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-filtered-dataset/feed-with-filtered-dataset.1.ddl.aql
@@ -39,7 +39,9 @@
 create dataset FacebookMessages(FacebookMessageType)
 primary key message-id with filter on send-time;
 
-create feed MessageFeed using localfs(
-("path"="asterix_nc1://data/fbm-with-send-time.adm"),
-("format"="adm"),
-("type-name"="FacebookMessageType"));
+create feed MessageFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/fbm-with-send-time.adm",
+  "format" : "adm",
+  "type-name" : "FacebookMessageType"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-meta-pk-in-meta/feed-with-meta-pk-in-meta.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-meta-pk-in-meta/feed-with-meta-pk-in-meta.1.ddl.aql
index 601986f..5b4bb29 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-meta-pk-in-meta/feed-with-meta-pk-in-meta.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-meta-pk-in-meta/feed-with-meta-pk-in-meta.1.ddl.aql
@@ -41,15 +41,16 @@
 
 create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta().id;
 
-create feed KVStream using adapter(
- ("reader"="localfs"),
- ("parser"="record-with-metadata"),
- ("type-name"="DocumentType"),
- ("meta-type-name"="KVMetaType"),
- ("path"="asterix_nc1://target/data/csv/openbeerdb/beer.csv"),
- ("format"="csv"),
- ("delimiter"=","),
- ("record-format"="adm"),
- ("record-index"="4"),
- ("header"="true")
-);
\ No newline at end of file
+create feed KVStream with {
+ "adapter-name" : "adapter",
+ "reader" : "localfs",
+ "parser" : "record-with-metadata",
+ "type-name" : "DocumentType",
+ "meta-type-name" : "KVMetaType",
+ "path" : "asterix_nc1://target/data/csv/openbeerdb/beer.csv",
+ "format" : "csv",
+ "delimiter" : ",",
+ "record-format" : "adm",
+ "record-index" : "4",
+ "header" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-multiple-indexes/feed-with-multiple-indexes.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-multiple-indexes/feed-with-multiple-indexes.3.ddl.aql
index 2c60692..fc7b95d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-multiple-indexes/feed-with-multiple-indexes.3.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-multiple-indexes/feed-with-multiple-indexes.3.ddl.aql
@@ -24,9 +24,11 @@
  */
 use dataverse externallibtest;
 
-create feed CondorFeed using push_localfs(
-("path"="asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt"),
-("reader"="localfs"),
-("format"="semi-structured"),
-("parser"="testlib#org.apache.asterix.external.library.ClassAdParserFactory"),
-("type-name"="Classad"));
+create feed CondorFeed with {
+  "adapter-name" : "push_localfs",
+  "path" : "asterix_nc1://data/external-parser/dropbox/jobads1.txt,asterix_nc1://data/external-parser/dropbox/jobads2.txt",
+  "reader" : "localfs",
+  "format" : "semi-structured",
+  "parser" : "testlib#org.apache.asterix.external.library.ClassAdParserFactory",
+  "type-name" : "Classad"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-undefined-function/feed-with-undefined-function.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-undefined-function/feed-with-undefined-function.1.ddl.aql
index d294772..8b9d007 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-undefined-function/feed-with-undefined-function.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feed-with-undefined-function/feed-with-undefined-function.1.ddl.aql
@@ -29,11 +29,12 @@
   timestamp : string
 }
 
-create feed TweetFeed
-using localfs
-(("type-name"="TweetInputType"),
-("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"));
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "type-name" : "TweetInputType",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm"
+};
 
 create dataset TweetsFeedIngest(TweetInputType)
 primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_01/feeds_01.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_01/feeds_01.1.ddl.aql
index 171c067..1a260ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_01/feeds_01.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_01/feeds_01.1.ddl.aql
@@ -36,6 +36,10 @@
 create dataset Tweets(TweetType)
 primary key id;
 
-create feed TweetFeed
-using localfs
-(("type-name"="TweetType"),("path"="asterix_nc1://data/twitter/obamatweets.adm"),("format"="adm"),("tuple-interval"="10"))
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "type-name" : "TweetType",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_02/feeds_02.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_02/feeds_02.1.ddl.aql
index 589c93d..82371da 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_02/feeds_02.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_02/feeds_02.1.ddl.aql
@@ -38,9 +38,11 @@
 create dataset Tweets(TweetType)
 primary key id;
 
-create feed  TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format": "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_03/feeds_03.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_03/feeds_03.1.ddl.aql
index 68fead0..cdd5f52 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_03/feeds_03.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_03/feeds_03.1.ddl.aql
@@ -42,7 +42,10 @@
 $x
 }
 
-create feed TweetFeed
-using localfs
-(("type-name"="TweetType"),("path"="asterix_nc1://data/twitter/obamatweets.adm"),("format"="adm")
-,("tuple-interval"="10"));
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+  "type-name" : "TweetType",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_07/feeds_07.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_07/feeds_07.1.ddl.aql
index 0e881bc..f3ff1c9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_07/feeds_07.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_07/feeds_07.1.ddl.aql
@@ -53,13 +53,14 @@
 create dataset SyntheticTweets(TweetMessageType)
 primary key id;
 
-create feed  SyntheticTweetFeed
-using stream(
-("duration"="5"),
-("tps"="50"),
-("type-name"="TweetMessageType"),
-("format"="adm"),
-("stream-source"="org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory"),
-("tput-duration"="5"),
-("dataverse-dataset"="feeds:SyntheticTweets"),
-("mode"="controlled"));
\ No newline at end of file
+create feed SyntheticTweetFeed with {
+  "adapter-name" : "stream",
+  "duration" : "5",
+  "tps" : "50",
+  "type-name" : "TweetMessageType",
+  "format" : "adm",
+  "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+  "tput-duration" : "5",
+  "dataverse-dataset" : "feeds:SyntheticTweets",
+  "mode" : "controlled"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_08/feeds_08.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_08/feeds_08.1.ddl.aql
index b2300f2..8f5c9d2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_08/feeds_08.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_08/feeds_08.1.ddl.aql
@@ -57,13 +57,14 @@
 
 create index ngram_index on SyntheticTweets(message_text) type ngram(3);
 
-create feed  SyntheticTweetFeed
-using stream
-(("duration"="5"),
-("stream-source"="org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory"),
-("tps"="50"),
-("type-name"="TweetMessageType"),
-("tput-duration"="5"),
-("dataverse-dataset"="feeds:SyntheticTweets"),
-("format"="adm"),
-("mode"="controlled"));
+create  feed SyntheticTweetFeed with {
+ "adapter-name" : "stream",
+ "duration" : "5",
+ "tps" : "50",
+ "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+ "type-name" : "TweetMessageType",
+ "tput-duration" : "5",
+ "dataverse-dataset" : "feeds:SyntheticTweets",
+ "format" : "adm",
+ "mode" : "controlled"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_09/feeds_09.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_09/feeds_09.1.ddl.aql
index 7c0ac29..0be61d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_09/feeds_09.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_09/feeds_09.1.ddl.aql
@@ -55,13 +55,13 @@
 
 create index message_text on SyntheticTweets(message_text) type btree;
 
-create feed  SyntheticTweetFeed
-using stream
-(("duration"="5"),
-("tps"="50"),
-("tput-duration"="5"),
-("type-name"="TweetMessageType"),
-("dataverse-dataset"="feeds:SyntheticTweets"),
-("format"="adm"),
-("stream-source"="org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory"),
-("mode"="controlled"));
+create  feed SyntheticTweetFeed with {
+ "adapter-name" : "stream",
+ "duration" : "5",
+ "tps" : "50","tput-duration" : "5",
+ "type-name" : "TweetMessageType",
+ "dataverse-dataset" : "feeds:SyntheticTweets",
+ "format" : "adm",
+ "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+ "mode" : "controlled"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_10/feeds_10.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_10/feeds_10.1.ddl.aql
index 75410f4..10b003a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_10/feeds_10.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_10/feeds_10.1.ddl.aql
@@ -43,9 +43,10 @@
 
 create index usernameIdx on Tweets(username) type btree;
 
-create feed TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_11/feeds_11.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_11/feeds_11.1.ddl.aql
index f139d01..ac38c96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_11/feeds_11.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_11/feeds_11.1.ddl.aql
@@ -38,9 +38,10 @@
 create dataset Tweets(TweetType)
 primary key id;
 
-create feed TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
\ No newline at end of file
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_12/feeds_12.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_12/feeds_12.1.ddl.aql
index dbf77ef..6fa9c45 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_12/feeds_12.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/feeds_12/feeds_12.1.ddl.aql
@@ -41,9 +41,10 @@
 create dataset Tweets(TweetType)
 primary key id;
 
-create feed TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets_duplicate.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path":"asterix_nc1://data/twitter/obamatweets_duplicate.adm",
+  "format":"adm",
+  "type-name":"TweetType",
+  "tuple-interval":"10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/insert-feed/insert-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/insert-feed/insert-feed.1.ddl.aql
index 8dba0fe..052df1f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/insert-feed/insert-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/insert-feed/insert-feed.1.ddl.aql
@@ -35,11 +35,11 @@
 
 create dataset TwitterUsers(TwitterUser) primary key screen-name;
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("insert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+ "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "insert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/issue_230_feeds/issue_230_feeds.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/issue_230_feeds/issue_230_feeds.1.ddl.aql
index 237c949..d999665 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/issue_230_feeds/issue_230_feeds.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/issue_230_feeds/issue_230_feeds.1.ddl.aql
@@ -38,11 +38,10 @@
 create dataset Tweets(TweetType)
 primary key id;
 
-create feed TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
-
-
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/push-socket-with-auuid/push-socket-with-auuid.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/push-socket-with-auuid/push-socket-with-auuid.1.ddl.aql
index d234ecf..9b11ff7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/push-socket-with-auuid/push-socket-with-auuid.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/push-socket-with-auuid/push-socket-with-auuid.1.ddl.aql
@@ -62,10 +62,10 @@
 create dataset DBLP1(DBLPType1) primary key id autogenerated;
 create dataset DBLP2(DBLPType2) primary key dblpid;
 
-create feed DBLPFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="DBLPFeedType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed DBLPFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "DBLPFeedType",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/record-reader-with-malformed-input-stream/record-reader-with-malformed-input-stream.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/record-reader-with-malformed-input-stream/record-reader-with-malformed-input-stream.1.ddl.aql
index 747c858..1b37ef0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/record-reader-with-malformed-input-stream/record-reader-with-malformed-input-stream.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/record-reader-with-malformed-input-stream/record-reader-with-malformed-input-stream.1.ddl.aql
@@ -26,7 +26,9 @@
 
 create dataset Restaurants(RestaurantsType) primary key restr_id;
 
-create feed RFeed using localfs
-(("type-name"="RestaurantsType"),
-("path"="asterix_nc1://data/restaurants/"), /* This test case reply on restaurants.adm implicitly*/
-("format"="adm"));
\ No newline at end of file
+create feed RFeed with {
+  "adapter-name" : "localfs",
+  "type-name" : "RestaurantsType",
+  "path" : "asterix_nc1://data/restaurants/", /* This test case reply on restaurants.adm implicitly*/
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/revised-tweet-parser/revised-tweet-parser.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/revised-tweet-parser/revised-tweet-parser.1.ddl.aql
index ddffc43..970fe06 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/revised-tweet-parser/revised-tweet-parser.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/revised-tweet-parser/revised-tweet-parser.1.ddl.aql
@@ -47,9 +47,11 @@
 create dataset Tweets (Tweet)
 primary key id;
 
-create feed TwitterFeed using push_twitter(
-("type-name"="Tweet"),
-("format"="twitter-status"),//
-("consumer.key"="************"),
-("access.token"="************"),
-("access.token.secret"="************"));
\ No newline at end of file
+create feed TwitterFeed with {
+  "adapter-name" : "push_twitter",
+  "type-name" : "Tweet",
+  "format" : "twitter-status",//
+  "consumer.key" : "************",
+  "access.token" : "************",
+  "access.token.secret" : "************"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-feed/start-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-feed/start-feed.1.ddl.aql
index f14d609..66d9a99 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-feed/start-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-feed/start-feed.1.ddl.aql
@@ -50,10 +50,10 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm")
-);
\ No newline at end of file
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-started-feed/start-started-feed.0.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-started-feed/start-started-feed.0.ddl.aql
index f7e30c1..483630a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-started-feed/start-started-feed.0.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/start-started-feed/start-started-feed.0.ddl.aql
@@ -28,13 +28,13 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
- ("sockets"="127.0.0.1:10001"),
- ("address-type"="IP"),
- ("type-name"="TweetMessageType"),
- ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TweetMessageType",
+  "format" : "adm"
+};
 
 connect feed TweetFeed to dataset Tweets1;
 connect feed TweetFeed to dataset Tweets2;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/stop-stopped-feed/stop-stopped-feed.0.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/stop-stopped-feed/stop-stopped-feed.0.ddl.aql
index 00fb12d..932fd1f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/stop-stopped-feed/stop-stopped-feed.0.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/stop-stopped-feed/stop-stopped-feed.0.ddl.aql
@@ -29,13 +29,13 @@
 create dataset Tweets1(TweetMessageType) primary key tweetid;
 create dataset Tweets2(TweetMessageType) primary key tweetid;
 
-create feed TweetFeed using socket_adapter
-(
- ("sockets"="127.0.0.1:10001"),
- ("address-type"="IP"),
- ("type-name"="TweetMessageType"),
- ("format"="adm")
-);
+create feed TweetFeed with {
+ "adapter-name" : "socket_adapter",
+ "sockets" : "127.0.0.1:10001",
+ "address-type" : "IP",
+ "type-name" : "TweetMessageType",
+ "format" : "adm"
+};
 
 connect feed TweetFeed to dataset Tweets1;
 connect feed TweetFeed to dataset Tweets2;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/twitter-feed/twitter-feed.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/twitter-feed/twitter-feed.1.ddl.aql
index d7827c5..66cc3bb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/twitter-feed/twitter-feed.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/feeds/twitter-feed/twitter-feed.1.ddl.aql
@@ -4,7 +4,7 @@
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
  * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
+ * "License"; you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
@@ -46,9 +46,11 @@
 create dataset Tweets (Tweet)
 primary key id;
 
-create feed TwitterFeed using push_twitter(
-("type-name"="Tweet"),
-("format"="twitter-status"),
-("consumer.key"="************"),
-("access.token"="**********"),
-("access.token.secret"="*************"));
\ No newline at end of file
+create feed TwitterFeed with {
+ "adapter-name" : "push_twitter",
+ "type-name" : "Tweet",
+ "format" : "twitter-status",
+ "consumer.key" : "************",
+ "access.token" : "**********",
+ "access.token.secret" : "*************"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/delete/delete.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/delete/delete.1.ddl.aql
index 70af710..d8254fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/delete/delete.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/delete/delete.1.ddl.aql
@@ -81,16 +81,21 @@
 }
 
 create dataset Tweet(typeTweet) primary key id
-using compaction policy prefix (("max-mergable-component-size"="32768"),("max-tolerance-component-count"="32"))
-with filter on create_at;
+with filter on create_at
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 32768, "max-tolerance-component-count": 32 }
+  }
+};
 
 create index text_idx if not exists on Tweet("text") type fulltext;
 create index state_idx if not exists on Tweet(geo_tag.stateID) type btree;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="typeTweet"),
-    ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "typeTweet",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.aql
index 511775d..fc8dd52 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.aql
@@ -36,12 +36,20 @@
 
 create dataset FacebookMessages(FacebookMessageType)
 primary key message-id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
 create dataset FacebookMessages2(FacebookMessageType)
 primary key message-id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"))
-with filter on send-time;
+with filter on send-time
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/upsert/upsert.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/upsert/upsert.1.ddl.aql
index 4adc491..ae8dbd0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/upsert/upsert.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/filters/upsert/upsert.1.ddl.aql
@@ -81,16 +81,21 @@
 }
 
 create dataset Tweet(typeTweet) primary key id
-using compaction policy prefix (("max-mergable-component-size"="32768"),("max-tolerance-component-count"="32"))
-with filter on create_at;
+with filter on create_at
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 32768, "max-tolerance-component-count": 32 }
+  }
+};
 
 create index text_idx if not exists on Tweet("text") type btree;
 create index state_idx if not exists on Tweet(geo_tag.stateID) type btree;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="typeTweet"),
-    ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "typeTweet",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/fulltext/fulltext-08/fulltext-08.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/fulltext/fulltext-08/fulltext-08.1.ddl.aql
index b6732c4..b3c496b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/fulltext/fulltext-08/fulltext-08.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/fulltext/fulltext-08/fulltext-08.1.ddl.aql
@@ -82,4 +82,10 @@
     geo_tag: typeGeoTag
 }
 create dataset ds_tweet(typeTweet) if not exists primary key id
-using compaction policy prefix (("max-mergable-component-size"="134217728"),("max-tolerance-component-count"="10")) with filter on create_at;
+with filter on create_at
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 134217728, "max-tolerance-component-count": 10 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.aql
index 460c9b4..a6a0add 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.aql
@@ -39,9 +39,10 @@
 primary key id
 hints(cardinality=200);
 
-create feed TweetFeed
-using localfs
-(("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"),
-("type-name"="TweetType"),
-("tuple-interval"="10"));
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+ "format" : "adm",
+ "type-name" : "TweetType",
+ "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql
index 0c20cec..bc9e7f7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr01/substr01.3.query.aql
@@ -24,13 +24,13 @@
  */
 
 let $str1:="Hello World"
-let $str2:=substring($str1,10)
+let $str2:=substring($str1,9)
 
 let $str3:="This is a test string"
-let $str4:=substring($str3,21)
+let $str4:=substring($str3,20)
 
 let $str5:="This is a test string"
-let $str6:=substring($str5,22)
+let $str6:=substring($str5,21)
 
 let $str7:="This is a test string"
 let $str8:=substring($str7,0)
@@ -40,7 +40,7 @@
 
 let $str11:="This is a test string"
 let $str12:="This is a another test string"
-let $str13:=substring(string-concat([$str11,$str12]),21)
+let $str13:=substring(string-concat([$str11,$str12]),20)
 
-let $str14:=substring("UC Irvine",string-length("UC Irvine")/2)
+let $str14:=substring("UC Irvine",string-length("UC Irvine")/2 - 1)
 return { "str2":$str2,"str4":$str4,"str6":$str6,"str8":$str8,"str10":$str10,"str13":$str13,"str14":$str14}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr04/substr04.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr04/substr04.3.query.aql
index ee98756..1c31ea0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr04/substr04.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr04/substr04.3.query.aql
@@ -23,13 +23,13 @@
  * Date           : 18th April 2012
  */
 
-for $a in [ substring("hello world", 7, 5),
-substring("hello world", 1, 11),
-substring("hello world", 3, 9),
-substring("ABCD", 3, 2),
-substring("ABCD", 1, 4),
-substring("UC Irvine", 4, string-length("UC Irvine") - 3),
-substring("UC Irvine", 1, string-length("UC Irvine")),
-substring(substring("UC Irvine", 4), 1, string-length("Irvine"))
+for $a in [ substring("hello world", 6, 5),
+substring("hello world", 0, 11),
+substring("hello world", 2, 9),
+substring("ABCD", 2, 2),
+substring("ABCD", 0, 4),
+substring("UC Irvine", 3, string-length("UC Irvine") - 3),
+substring("UC Irvine", 0, string-length("UC Irvine")),
+substring(substring("UC Irvine", 3), 0, string-length("Irvine"))
 ]
 return $a
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr05/substr05.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr05/substr05.3.query.aql
index cd6ab0a..d500ac5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr05/substr05.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr05/substr05.3.query.aql
@@ -29,4 +29,4 @@
 
 for $a in dataset('testdst')
 order by $a.name
-return substring($a.name, 4, string-length($a.name) - 3);
+return substring($a.name, 3, string-length($a.name) - 3);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr06/substr06.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr06/substr06.3.query.aql
index 0f41b6e..078fd0c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr06/substr06.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substr06/substr06.3.query.aql
@@ -28,4 +28,4 @@
 
 for $a in dataset('testdst')
 order by $a.name
-return substring($a.name,4);
+return substring($a.name,3);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-1/substring2-1.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-1/substring2-1.3.query.aql
index 57ddd9a..26337e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-1/substring2-1.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-1/substring2-1.3.query.aql
@@ -18,5 +18,5 @@
  */
 use dataverse test;
 
-let $c1 := substring("HEllow",2)
+let $c1 := substring("HEllow",1)
 return {"result1": $c1}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-3/substring2-3.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-3/substring2-3.3.query.aql
index e230f91..385db08 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-3/substring2-3.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring2-3/substring2-3.3.query.aql
@@ -18,5 +18,5 @@
  */
 use dataverse test;
 
-let $c1 := substring("HEllow",10)
+let $c1 := substring("HEllow",9)
 return {"result1": $c1}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring_01/substring_01.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring_01/substring_01.3.query.aql
index dc94226..752ec61 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring_01/substring_01.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring_01/substring_01.3.query.aql
@@ -19,4 +19,4 @@
 use dataverse test;
 
 for $x in ["foobar"]
-return substring($x, 2, 3)
+return substring($x, 1, 3)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.aql
deleted file mode 100644
index 3d529fb..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.aql
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type LineItemType as closed {
-  l_orderkey: int64,
-  l_partkey: int64,
-  l_suppkey: int64,
-  l_linenumber: int64,
-  l_quantity: int64,
-  l_extendedprice: double,
-  l_discount: double,
-  l_tax: double,
-  l_returnflag: string,
-  l_linestatus: string,
-  l_shipdate: string,
-  l_commitdate: string,
-  l_receiptdate: string,
-  l_shipinstruct: string,
-  l_shipmode: string,
-  l_comment: string
-}
-
-create temporary dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.aql
deleted file mode 100644
index bc2b6ee..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-load dataset LineItem 
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.aql
deleted file mode 100644
index 496ce13..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-create index idx_LineItem_partkey on LineItem(l_linenumber);
-create index idx_LineItem_suppkey on LineItem(l_suppkey);
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.aql
deleted file mode 100644
index edc4af6..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-delete $l from dataset LineItem where $l.l_suppkey>=2 or $l.l_linenumber>1;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.aql
deleted file mode 100644
index 88d4a86..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-     
-for $c in dataset('LineItem')
-where $c.l_suppkey<150
-order by $c.l_orderkey, $c.l_linenumber
-return $c
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.aql
deleted file mode 100644
index 7cf6796..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.aql
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type LineItemType as closed {
-  l_orderkey: int64,
-  l_partkey: int64,
-  l_suppkey: int64,
-  l_linenumber: int64,
-  l_quantity: int64,
-  l_extendedprice: double,
-  l_discount: double,
-  l_tax: double,
-  l_returnflag: string,
-  l_linestatus: string,
-  l_shipdate: string,
-  l_commitdate: string,
-  l_receiptdate: string,
-  l_shipinstruct: string,
-  l_shipmode: string,
-  l_comment: string
-}
-
-create temporary dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.aql
deleted file mode 100644
index e6b98c7..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-load dataset LineItem 
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
-
-delete $l from dataset LineItem where $l.l_orderkey>=10;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.aql
deleted file mode 100644
index c88cf8c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-  
-for $c in dataset('LineItem')
-order by $c.l_orderkey, $c.l_linenumber
-return $c 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.aql
deleted file mode 100644
index 3b6c965..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.aql
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-create type Name as open {
-first : string,
-last : string
-}
-
-create type Person as open {
-name : Name
-}
-
-create type TestType as open {
-id : int32,
-name : string,
-locn : point,
-zip : string,
-person : Person
-}
-
-create temporary dataset t1(TestType) primary key id;
-
-create index rtree_index_point on t1(locn) type rtree;
-
-create index rtree_index_point_open on t1(open_locn:point?) type rtree enforced;
-
-create index keyWD_indx on t1(name) type keyword;
-
-create index keyWD_indx_open on t1(nickname:string?) type keyword enforced;
-
-create index secndIndx on t1(zip);
-
-create index nested on t1(person.name.first);
-
-create index secndIndx_open on t1(address:string?) enforced;
-
-drop index t1.rtree_index_point;
-
-drop index t1.rtree_index_point_open;
-
-drop index t1.keyWD_indx;
-
-drop index t1.keyWD_indx_open;
-
-drop index t1.secndIndx;
-
-drop index t1.nested;
-
-drop index t1.secndIndx_open;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.aql
deleted file mode 100644
index ebe3e6a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.aql
deleted file mode 100644
index 61f4309..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-for $l in dataset('Metadata.Index')
-where $l.IsPrimary=false and $l.DataverseName='test'
-return $l;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.1.ddl.aql
deleted file mode 100644
index 887b004a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.1.ddl.aql
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type Schema as closed {
-unique1:  int64,
-unique2:  int64,
-two:  int64,
-four:  int64,
-ten:  int64,
-twenty:  int64,
-onePercent: int64,
-tenPercent:  int64,
-twentyPercent:  int64,
-fiftyPercent:  int64,
-unique3:  int64,
-evenOnePercent: int64,
-oddOnePercent:  int64,
-stringu1:  string,
-stringu2:  string,
-string4:  string
-}
-
-create temporary dataset t1(Schema) primary key unique2;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.2.update.aql
deleted file mode 100644
index bf556a0..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.2.update.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-// Load data
-load dataset t1
-using localfs
-(("path"="asterix_nc1://data/wisc/onektup.adm"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.3.ddl.aql
deleted file mode 100644
index a66a9e5..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.3.ddl.aql
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-// create secondary indexes
-create index idx_t1_str1 on t1(stringu1);
-create index idx_t1_unique1 on t1(unique1);
-
-// drop secondary indexes
-drop index t1.idx_t1_str1;
-drop index t1.idx_t1_unique1;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.4.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.4.query.aql
deleted file mode 100644
index 7a17743..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/drop-index/drop-index.4.query.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use dataverse test;
-
-for $a in dataset('t1')
-where $a.unique1 > 10 and $a.stringu1="DGAAAAXXXXXXXXXXXXXXXXXXX"
-return $a
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.aql
deleted file mode 100644
index d1f5a7a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.aql
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type LineItemType as closed {
-  l_orderkey: int64,
-  l_partkey: int64,
-  l_suppkey: int64,
-  l_linenumber: int64,
-  l_quantity: double,
-  l_extendedprice: double,
-  l_discount: double,
-  l_tax: double,
-  l_returnflag: string,
-  l_linestatus: string,
-  l_shipdate: string,
-  l_commitdate: string,
-  l_receiptdate: string,
-  l_shipinstruct: string,
-  l_shipmode: string,
-  l_comment: string
-}
-
-create temporary dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber;
-
-create index part_index on LineItem(l_partkey);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.aql
deleted file mode 100644
index 7223583..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset LineItem 
-using localfs
-(("path"="asterix_nc1://data/empty.adm"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
-
-load dataset LineItem 
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.aql
deleted file mode 100644
index 04f1679..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-for $c in dataset('LineItem')
-order by $c.l_orderkey, $c.l_linenumber
-limit 1
-return $c
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.aql
deleted file mode 100644
index 6834cde..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.aql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-create type test.Emp as closed {
-id: int64,
-fname: string,
-lname: string,
-age: int64,
-dept: string
-}
-
-create temporary dataset test.employee(Emp) primary key id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.aql
deleted file mode 100644
index c68a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use dataverse test;
-
-load dataset test.employee
-using localfs
-(("path"="asterix_nc1://data/names.adm"),("format"="delimited-text"),("delimiter"="|"));
-
-
-insert into dataset test.employee (
-for $x in dataset test.employee
-return {
-    "id": $x.id + 10000,
-    "fname": $x.fname,
-    "lname": $x.lname,
-    "age": $x.age,
-    "dept": $x.dept
-}
-);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.aql
deleted file mode 100644
index 00b0850..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use dataverse test;
-
-create index idx_employee_first_name on test.employee(fname);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.aql
deleted file mode 100644
index 195f11e7..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use dataverse test;
-
-for $l in dataset('test.employee')
-order by $l.id
-return $l
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.aql
deleted file mode 100644
index e6865e2..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.aql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-create type test.Emp as closed {
-id: int64,
-fname: string,
-lname: string,
-age: int64,
-dept: string
-}
-
-create temporary dataset test.employee(Emp) primary key id;
-
-create index idx_employee_first_name on test.employee(fname);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.aql
deleted file mode 100644
index 5c9e569..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 28 2015
- */
-
-use dataverse test;
-
-load dataset test.employee
-using localfs
-(("path"="asterix_nc1://data/names.adm"),("format"="delimited-text"),("delimiter"="|"));
-
-
-insert into dataset test.employee (
-for $x in dataset test.employee
-return {
-    "id": $x.id + 10000,
-    "fname": $x.fname,
-    "lname": $x.lname,
-    "age": $x.age,
-    "dept": $x.dept
-}
-);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.aql
deleted file mode 100644
index 1b15209..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of dead latch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
- 
- 
-use dataverse test;
-
-for $l in dataset('test.employee')
-order by $l.id
-return $l
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.aql
deleted file mode 100644
index 4b17b3e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : July 11 2013
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type myDataType as open {
-  id: int64
-}
-
-create temporary dataset myData(myDataType)
-  primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.aql
deleted file mode 100644
index c61edcb..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.aql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : insert-and-scan-dataset.aql
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset myData
-using localfs
-(("path"="asterix_nc1://data/odd-numbers.adm"),("format"="adm"))pre-sorted;
-
-
-insert into dataset myData (
-for $x in dataset myData
-return {
-    "id": $x.id + 1
-}
-);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.aql
deleted file mode 100644
index 37ceca0..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : insert-and-scan-dataset.aql
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- *
- */
- 
-use dataverse test;
-
-for $c in dataset('myData')
-order by $c.id
-return $c 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.aql
deleted file mode 100644
index 78c0221..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.aql
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse tpch if exists;
-create dataverse tpch;
-
-use dataverse tpch;
-
-create type LineItemType as closed {
-  l_orderkey: int64,
-  l_partkey: int64,
-  l_suppkey: int64,
-  l_linenumber: int64,
-  l_quantity: double,
-  l_extendedprice: double,
-  l_discount: double,
-  l_tax: double,
-  l_returnflag: string,
-  l_linestatus: string,
-  l_shipdate: string,
-  l_commitdate: string,
-  l_receiptdate: string,
-  l_shipinstruct: string,
-  l_shipmode: string,
-  l_comment: string
-}
-
-create temporary dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.aql
deleted file mode 100644
index 5a99e55..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse tpch;
-
-load dataset LineItem 
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),("format"="delimited-text"),("delimiter"="|")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.aql
deleted file mode 100644
index 75f6f6a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.aql
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse tpch;
-set import-private-functions 'true';
- 
-for $l in dataset('LineItem')
-where $l.l_shipdate <= '1998-09-02'
-/*+ hash*/
-group by $l_returnflag := $l.l_returnflag,
-         $l_linestatus := $l.l_linestatus  
-  with $l
-order by $l_returnflag, $l_linestatus
-return {
-  "l_returnflag": $l_returnflag,
-  "l_linestatus": $l_linestatus,
-  "sum_qty": sum(for $i in $l return $i.l_quantity),
-  "sum_base_price": sum(for $i in $l return $i.l_extendedprice),
-  "sum_disc_price": sum(for $i in $l return $i.l_extendedprice * (1 - $i.l_discount)),
-  "sum_charge": sum(for $i in $l return $i.l_extendedprice * (1 - $i.l_discount) * (1 + $i.l_tax)),
-  "ave_qty": avg(for $i in $l return $i.l_quantity),  
-  "ave_price": avg(for $i in $l return $i.l_extendedprice),
-  "ave_disc": avg(for $i in $l return $i.l_discount),
-  "count_order": count($l)
-}   
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.aql
deleted file mode 100644
index 9bf5118..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.aql
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type MyRecord as closed {
-  id: int64,
-  point: point,
-  kwds: string,
-  line1: line,
-  line2: line,
-  poly1: polygon,
-  poly2: polygon,
-  rec: rectangle,
-  circle: circle
-}
-
-create temporary dataset MyData(MyRecord)
-  primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.aql
deleted file mode 100644
index 24d8d3d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset MyData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.aql
deleted file mode 100644
index 3fff78a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-create index rtree_index_point on MyData(point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.aql
deleted file mode 100644
index 2698483..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-delete $m from dataset MyData where $m.id>10;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.aql
deleted file mode 100644
index db8d975..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-for $o in dataset('MyData')
-where spatial-intersect($o.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by $o.id
-return {"id":$o.id}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.aql
deleted file mode 100644
index 82430ed..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.aql
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a persistent dataset into a temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type MyRecord as closed {
-  id: int64,
-  point: point,
-  kwds: string,
-  line1: line,
-  line2: line,
-  poly1: polygon,
-  poly2: polygon,
-  rec: rectangle,
-  circle: circle
-}
-
-create type MyMiniRecord as closed {
-  id: int64,
-  point: point
-}
-
-create dataset MyData(MyRecord)
-  primary key id;
-
-create temporary dataset MyMiniData(MyMiniRecord)
-  primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.aql
deleted file mode 100644
index 8fffba1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.aql
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset MyData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
-
-load dataset MyMiniData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData0.json"),("format"="adm")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.aql
deleted file mode 100644
index 6c00a8d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-create index rtree_index_point_0 on MyData(point) type rtree;
-create index rtree_index_point on MyMiniData(point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.aql
deleted file mode 100644
index 913be14..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-insert into dataset MyMiniData
-(
-    for $m in dataset('MyData')
-    return {
-        "id": $m.id,
-        "point": $m.point
-    }
-);
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.aql
deleted file mode 100644
index 35906d1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-for $o in dataset('MyMiniData')
-where spatial-intersect($o.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by $o.id
-return {"id":$o.id}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.aql
deleted file mode 100644
index 66c5c48..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.aql
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type MyRecord as closed {
-  id: int64,
-  point: point,
-  kwds: string,
-  line1: line,
-  line2: line,
-  poly1: polygon,
-  poly2: polygon,
-  rec: rectangle,
-  circle: circle
-}
-
-create type MyMiniRecord as closed {
-  id: int64,
-  point: point
-}
-
-create temporary dataset MyData(MyRecord)
-  primary key id;
-
-create temporary dataset MyMiniData(MyMiniRecord)
-  primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.aql
deleted file mode 100644
index 8fffba1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.aql
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset MyData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
-
-load dataset MyMiniData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData0.json"),("format"="adm")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.aql
deleted file mode 100644
index 6c00a8d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-create index rtree_index_point_0 on MyData(point) type rtree;
-create index rtree_index_point on MyMiniData(point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.aql
deleted file mode 100644
index 913be14..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-insert into dataset MyMiniData
-(
-    for $m in dataset('MyData')
-    return {
-        "id": $m.id,
-        "point": $m.point
-    }
-);
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.aql
deleted file mode 100644
index 35906d1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-for $o in dataset('MyMiniData')
-where spatial-intersect($o.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by $o.id
-return {"id":$o.id}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.aql
deleted file mode 100644
index a770f78..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.aql
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into a persistent dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create type MyRecord as closed {
-  id: int64,
-  point: point,
-  kwds: string,
-  line1: line,
-  line2: line,
-  poly1: polygon,
-  poly2: polygon,
-  rec: rectangle,
-  circle: circle
-}
-
-create type MyMiniRecord as closed {
-  id: int64,
-  point: point
-}
-
-create temporary dataset MyData(MyRecord)
-  primary key id;
-
-create dataset MyMiniData(MyMiniRecord)
-  primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.aql
deleted file mode 100644
index 8fffba1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.aql
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-load dataset MyData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData.json"),("format"="adm")) pre-sorted;
-
-load dataset MyMiniData 
-using localfs
-(("path"="asterix_nc1://data/spatial/spatialData0.json"),("format"="adm")) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.aql
deleted file mode 100644
index 6c00a8d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-create index rtree_index_point_0 on MyData(point) type rtree;
-create index rtree_index_point on MyMiniData(point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.aql
deleted file mode 100644
index 913be14..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-insert into dataset MyMiniData
-(
-    for $m in dataset('MyData')
-    return {
-        "id": $m.id,
-        "point": $m.point
-    }
-);
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.aql
deleted file mode 100644
index 35906d1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset. 
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use dataverse test;
-
-for $o in dataset('MyMiniData')
-where spatial-intersect($o.point, create-polygon([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by $o.id
-return {"id":$o.id}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.1.ddl.aql
deleted file mode 100644
index 671e5a2..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.1.ddl.aql
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : temp_primary_plus_ngram_flush.aql
- * Description     : Check that flush for temporary datasets with ngram indexes succeeds.
- * Expected Result : Success
- * Date            : Apr 4 2016
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-row_id: int32,
-sid: int32,
-date: string,
-day: int32,
-time: string,
-bpm: int32,
-RR: float,
-text: string,
-location: point,
-text2: string
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-row_id: int32,
-sid: int32,
-date: date,
-day: int32,
-time: time,
-bpm: int32,
-RR: float,
-text: string,
-location: point,
-text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-/* Create default secondary index on dataset clean Fragile */
-create index cfText2Ix on Fragile(text2) type ngram(3);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.2.update.aql
deleted file mode 100644
index 1b3cbd3..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.2.update.aql
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : temp_primary_plus_ngram_flush.aql
- * Description     : Check that flush for temporary datasets with ngram indexes succeeds.
- * Expected Result : Success
- * Date            : Apr 4 2016
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-for $t in dataset Fragile_raw
-where $t.row_id <= 1000
-return {
-"row_id": $t.row_id,
-"sid": $t.sid,
-"date": date($t.date),
-"day": $t.day,
-"time": parse-time($t.time, "h:m:s"),
-"bpm": $t.bpm,
-"RR": $t.RR,
-"text": $t.text,
-"location": $t.location,
-"text2": $t.text2}
-);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.query.aql
deleted file mode 100644
index 67c41d6..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : temp_primary_plus_ngram_flush.aql
- * Description     : Check that flush for temporary datasets with ngram indexes succeeds.
- * Expected Result : Success
- * Date            : Apr 4 2016
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile
-where contains($x.text2, "location") return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
index e8cf4e8..ae5f99a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
@@ -23,7 +23,7 @@
   select {
     "c_acctbal": $c.c_acctbal,
     "c_custkey": $c.c_custkey,
-    "cntrycode": substring($c.c_phone, 1, 2)
+    "cntrycode": substring($c.c_phone, 0, 2)
   }
 }
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
index 0c7f979..365e84a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.aql
@@ -23,7 +23,7 @@
   return {
     "c_acctbal": $c.c_acctbal,
     "c_custkey": $c.c_custkey,
-    "cntrycode": substring($c.c_phone, 1, 2)
+    "cntrycode": substring($c.c_phone, 0, 2)
   }
 }
 
@@ -37,7 +37,7 @@
 group by $cntrycode := $ct.cntrycode with $ct
 order by $cntrycode
 return {
-  "cntrycode": $cntrycode, 
-  "numcust": count($ct), 
+  "cntrycode": $cntrycode,
+  "numcust": count($ct),
   "totacctbal": sum(for $i in $ct return $i.c_acctbal)
 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/query-issue562/query-issue562.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/query-issue562/query-issue562.3.query.aql
index 4aa0e13..24db233 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/query-issue562/query-issue562.3.query.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/tpch/query-issue562/query-issue562.3.query.aql
@@ -27,7 +27,7 @@
 
 declare function q22_customer_tmp() {
   for $c in dataset('Customer')
-  let $phone_substr := substring($c.c_phone, 1, 2)
+  let $phone_substr := substring($c.c_phone, 0, 2)
   where $phone_substr = '13'
     or $phone_substr = '31'
     or $phone_substr = '23'
@@ -44,7 +44,7 @@
 
 let $avg := avg(
   for $c in dataset('Customer')
-  let $phone_substr := substring($c.c_phone, 1, 2)
+  let $phone_substr := substring($c.c_phone, 0, 2)
   where $c.c_acctbal > 0.00
     and ($phone_substr = '13'
     or $phone_substr = '31'
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/upsert/primary-correlated-secondary-btree/primary-correlated-secondary-btree.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/upsert/primary-correlated-secondary-btree/primary-correlated-secondary-btree.1.ddl.aql
index 5bb3985..4a6a5d2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/upsert/primary-correlated-secondary-btree/primary-correlated-secondary-btree.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/upsert/primary-correlated-secondary-btree/primary-correlated-secondary-btree.1.ddl.aql
@@ -34,9 +34,17 @@
 };
 
 create dataset UpsertTo("TestType") primary key id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset UpsertFrom("TestType") primary key id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf17/udf17.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf17/udf17.1.ddl.aql
index fba90d1..0b2348a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf17/udf17.1.ddl.aql
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf17/udf17.1.ddl.aql
@@ -28,11 +28,11 @@
 
 use dataverse test;
 
-create function test.parent(){
-test.child()
-}
-
 create function test.child() {
 "This data is from the child function"
 }
 
+create function test.parent(){
+test.child()
+}
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.1.ddl.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.1.ddl.aql
deleted file mode 100644
index bea7d9e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.1.ddl.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use dataverse test;
-
-create function test.needs_f1($x){
- $x + f1()
-}
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.2.update.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.2.update.aql
deleted file mode 100644
index c6b8c48..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.2.update.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.3.query.aql b/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.3.query.aql
deleted file mode 100644
index 1a1b73a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries/user-defined-functions/udf26/udf26.3.query.aql
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
-use dataverse test;
-
-test.needs_f1(12345)
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
index 9a2ad3c..1ae94ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/AsyncDeferredQueries.xml
@@ -49,4 +49,10 @@
             <output-dir compare="Text">async-running</output-dir>
         </compilation-unit>
     </test-case>
+    <test-case FilePath="async-deferred">
+        <compilation-unit name="async-exhausted-result">
+            <output-dir compare="Text">async-exhausted-result</output-dir>
+            <expected-error>HYR0093</expected-error>
+        </compilation-unit>
+    </test-case>
 </test-group>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.1.async.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.1.async.sqlpp
new file mode 100644
index 0000000..f8ec2cf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.1.async.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+-- maxresultreads=1
+-- handlevariable=status
+
+select i, i * i as i2 from range(1, 10) i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.2.pollget.uri b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.2.pollget.uri
new file mode 100644
index 0000000..bca879b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.2.pollget.uri
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+-- polltimeoutsecs=20
+-- handlevariable=result
+
+$status
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.3.get.uri b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.3.get.uri
new file mode 100644
index 0000000..b613531
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.3.get.uri
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+$result
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.4.get.uri b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.4.get.uri
new file mode 100644
index 0000000..b613531
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-exhausted-result/async-exhausted-result.4.get.uri
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+$result
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-repeated/async-repeated.1.async.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-repeated/async-repeated.1.async.sqlpp
index 1e18f66..8055915 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-repeated/async-repeated.1.async.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-repeated/async-repeated.1.async.sqlpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+-- maxresultreads=2
 -- handlevariable=status
 
 select i, i * i as i2 from range(1, 10) i;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-running/async-running.3.pollget.uri b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-running/async-running.3.pollget.uri
index d10aed9..bca879b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-running/async-running.3.pollget.uri
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/async-deferred/async-running/async-running.3.pollget.uri
@@ -17,7 +17,7 @@
  * under the License.
  */
 
--- polltimeoutsecs=10
+-- polltimeoutsecs=20
 -- handlevariable=result
 
 $status
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/find/find.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/find/find.3.query.sqlpp
index 2b596c6..1660974 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/find/find.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/find/find.3.query.sqlpp
@@ -19,5 +19,18 @@
 
 use test;
 
-
-[(test.`find-binary`(test.hex('aabbccddaa'),test.hex('')) = 1),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('aa')) = 1),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('aa'),1) = 5),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('aabb'),0) = test.`find-binary`(test.hex('aabbccddaa'),test.hex('aabb'))),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('11')) = 0),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('ccddaa')) = 3),(test.`find-binary`(test.hex('aabbccddaa'),test.hex('ccddaabb')) = 0),test.`find-binary`(test.hex('aabbccddaa'),null),test.`find-binary`(null,null),test.`find-binary`(null,test.hex('aabbccddaa'))];
+[
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('')) = 0),
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('aa')) = 0),
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('aa'),1) = 4),
+  (
+    test.`find-binary`(test.hex('aabbccddaa'),test.hex('aabb'),-1) =
+    test.`find-binary`(test.hex('aabbccddaa'),test.hex('aabb'))
+  ),
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('11')) = -1),
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('ccddaa')) = 2),
+  (test.`find-binary`(test.hex('aabbccddaa'),test.hex('ccddaabb')) = -1),
+  test.`find-binary`(test.hex('aabbccddaa'),null),
+  test.`find-binary`(null,null),
+  test.`find-binary`(null,test.hex('aabbccddaa'))
+];
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/subbinary/subbinary_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/subbinary/subbinary_01.3.query.sqlpp
index a1141b5..99ef6fa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/subbinary/subbinary_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/binary/subbinary/subbinary_01.3.query.sqlpp
@@ -20,4 +20,19 @@
 use test;
 
 
-[(test.`sub-binary`(test.hex(''),0) = test.hex('')),(test.`sub-binary`(test.hex(''),1) = test.hex('')),(test.`sub-binary`(test.hex(''),-1) = test.hex('')),(test.`sub-binary`(test.hex('aabbccdd'),1,test.`binary-length`(test.hex('aabbccdd'))) = test.hex('aabbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),2,1) = test.hex('bb')),(test.`sub-binary`(test.hex('aabbccdd'),2) = test.hex('bbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),5,0) = test.hex('')),(test.`sub-binary`(test.hex('aabbccdd'),4,1) = test.hex('dd')),(test.`sub-binary`(test.hex('aabbccdd'),2,2) = test.hex('bbcc')),(test.`sub-binary`(test.hex('aabbccdd'),0) = test.hex('aabbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),-1) = test.hex('aabbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),1,256) = test.hex('aabbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),2,256) = test.hex('bbccdd')),(test.`sub-binary`(test.hex('aabbccdd'),2,-1) = test.hex(''))];
+[
+    (test.`sub-binary`(test.hex(''),0) = test.hex('')),
+    (test.`sub-binary`(test.hex(''),1) = test.hex('')),
+    (test.`sub-binary`(test.hex(''),-1) = test.hex('')),
+    (test.`sub-binary`(test.hex('aabbccdd'),0,test.`binary-length`(test.hex('aabbccdd'))) = test.hex('aabbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),1,1) = test.hex('bb')),
+    (test.`sub-binary`(test.hex('aabbccdd'),1) = test.hex('bbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),4,0) = test.hex('')),
+    (test.`sub-binary`(test.hex('aabbccdd'),3,1) = test.hex('dd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),1,2) = test.hex('bbcc')),
+    (test.`sub-binary`(test.hex('aabbccdd'),0) = test.hex('aabbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),-1) = test.hex('aabbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),0,256) = test.hex('aabbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),1,256) = test.hex('bbccdd')),
+    (test.`sub-binary`(test.hex('aabbccdd'),1,-1) = test.hex(''))
+];
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.1.ddl.sqlpp
new file mode 100644
index 0000000..735666b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.1.ddl.sqlpp
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : This test case is to verify composite key search with low and high ranges
+ * Expected Res : Success
+ * Date         : 22 Dec 2017
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type PointType as closed {
+x:int,
+y:int
+};
+
+
+drop nodegroup group_test if exists;
+create  nodegroup group_test on
+    asterix_nc1
+;
+
+create dataset Points(PointType)
+primary key x, y
+on group_test;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.2.update.sqlpp
new file mode 100644
index 0000000..a8b70cd
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.2.update.sqlpp
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into Points
+{"x": 9, "y": 15};
+
+insert into Points
+{"x": 15, "y": 40};
+
+insert into Points
+{"x": 20, "y": 50};
+
+insert into Points
+{"x": 50, "y": 200};
+
+insert into Points
+{"x": 60, "y": 40};
+
+insert into Points
+{"x": 101, "y": 80};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.3.query.sqlpp
new file mode 100644
index 0000000..777499c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/composite-low-high/composite-low-high.3.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+use test;
+
+select value p
+from Points p
+where p.x>10 and p.x<100
+and p.y>10 and p.y<100
+order by p.x;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.ddl.sqlpp
new file mode 100644
index 0000000..9ad7c4e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.ddl.sqlpp
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : This test case is to verify the fix for ASTERIXDB-920
+                : https://issues.apache.org/jira/browse/ASTERIXDB-920
+ * Expected Res : Success
+ * Date         : 14 Dec 2017
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+
+use test;
+
+create type FacebookMessageType as closed {
+messageid: int32,
+authorid: int32,
+in_response_to: int32?,
+sender_location: point?,
+message: string
+};
+
+create dataset FacebookMessages(FacebookMessageType)
+primary key messageid, authorid;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.2.update.sqlpp
new file mode 100644
index 0000000..2ba8569
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.2.update.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into FacebookMessages
+{"messageid":5,"authorid":6,"in_response_to":2,"sender_location":point("34.7,90.76"),
+"message":"msg3"};
+
+insert into FacebookMessages
+{"messageid":6,"authorid":-1,"in_response_to":3,"sender_location":point("34.7,90.76"),
+"message":"msg2"};
+
+insert into FacebookMessages
+{"messageid":6,"authorid":8,"in_response_to":4,"sender_location":point("34.7,90.76"),
+"message":"msg3"};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.3.query.sqlpp
new file mode 100644
index 0000000..fa01455
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.3.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+use test;
+
+select value msg
+from FacebookMessages msg
+where msg.messageid>5
+and msg.authorid>0;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.query.sqlpp
index eabb93e..dace396 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.query.sqlpp
@@ -25,8 +25,8 @@
  */
 
 select element {'ug-student':s,'prof':p,'grd-student':a,'postdoc':b}
-from  `student.ugdstd` as s,
-      `teacher.prof` as p,
-      `student.gdstd` as a,
-      `teacher.pstdoc` as b
+from  `student`.`ugdstd` as s,
+      `teacher`.`prof` as p,
+      `student`.`gdstd` as a,
+      `teacher`.`pstdoc` as b
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.query.sqlpp
index 02b03be..e9b2b51 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.query.sqlpp
@@ -25,7 +25,7 @@
  */
 
 select element l
-from  `Metadata.Dataset` as l
+from  `Metadata`.`Dataset` as l
 where ((l.DataverseName = 'student') or (l.DataverseName = 'teacher'))
 order by l.DatasetName
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.query.sqlpp
index a09512f..51668ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.query.sqlpp
@@ -28,6 +28,6 @@
 
 select element coll_count((
     select element l
-    from  `Metadata.Dataset` as l
+    from  `Metadata`.`Dataset` as l
     where ((l.DataverseName = 'student') or (l.DataverseName = 'teacher'))
 ));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.query.sqlpp
index 14b0c44..b9c51a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.query.sqlpp
@@ -28,7 +28,7 @@
  */
 
 select element l
-from  `Metadata.Dataset` as l
+from  `Metadata`.`Dataset` as l
 where ((l.DataverseName = 'student') or (l.DataverseName = 'teacher'))
 order by l.DatasetName
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.query.sqlpp
index a030d63..ba0c453 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.query.sqlpp
@@ -24,6 +24,6 @@
  */
 
 select element l
-from  `test.employee` as l
+from  `test`.`employee` as l
 where ((l.fname = 'Julio') and (l.lname = 'Isa'))
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv11/cross-dv11.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv11/cross-dv11.1.ddl.sqlpp
index 70ec199..6146a26 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv11/cross-dv11.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv11/cross-dv11.1.ddl.sqlpp
@@ -28,10 +28,10 @@
 create dataverse testdv1;
 create dataverse testdv2;
 
-create function testdv1.fun01(){
-testdv2.fun02()
-};
-
 create function testdv2.fun02(){
 'function 02'
 };
+
+create function testdv1.fun01(){
+testdv2.fun02()
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ddl.sqlpp
deleted file mode 100644
index 590ece1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ddl.sqlpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception.
- */
-
-drop dataverse testdv1 if exists;
-drop dataverse testdv2 if exists;
-create dataverse testdv1;
-create dataverse testdv2;
-
-create function testdv1.fun01(){
-testdv2.fun02()
-};
-
-create function testdv2.fun02(){
-testdv2.fun03()
-};
-
-create function testdv2.fun03(){
-testdv1.fun01()
-};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.update.sqlpp
deleted file mode 100644
index 21ae20b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.update.sqlpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception.
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.query.sqlpp
deleted file mode 100644
index 115179d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.query.sqlpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDFs in different dataverses
- *              : Test for recursion in those UDFs
- * Expected Res : Failure - Recursion is not allowed!
- * Date         : 31st Aug 2012
- * Ignored      : This test is currently not part of the test build, because it being a negative test case expectedly throws an exception.
- */
-
-use testdv1;
-
-
-select element testdv1.fun01();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.query.sqlpp
index 264e918..258e80a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.query.sqlpp
@@ -29,6 +29,6 @@
 'Arity': l.Arity,
 'ReturnType': l.ReturnType
 }
-from  `Metadata.Function` as l
+from  `Metadata`.`Function` as l
 where (l.DataverseName = 'testdv1')
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ddl.sqlpp
deleted file mode 100644
index 02d0153..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ddl.sqlpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
-drop dataverse testdv1 if exists;
-create dataverse testdv1;
-
-// UDF with no inputs
-create function testdv1.fun01(){
-testdv1.fun02()
-};
-
-// UDF with one input
-create function testdv1.fun02(){
-testdv1.fun03()
-};
-
-// UDF with two inputs
-create function testdv1.fun03(){
-testdv1.fun04()
-};
-
-create function testdv1.fun04(){
-testdv1.fun02()
-};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.update.sqlpp
deleted file mode 100644
index c70f3db..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.update.sqlpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.query.sqlpp
deleted file mode 100644
index 1668b59..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.query.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Detect Recursion in UDFs
- * Expected Res : Failure
- * Date         : 30 Aug 2012
- * Ignored      : Not part of test build, as its a negative test case that thrwos an exception
- */
-
-use testdv1;
-
-
-select element testdv1.fun01();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.query.sqlpp
index 2c5c6a4..a74c316 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.query.sqlpp
@@ -23,7 +23,7 @@
  */
 
 select element l
-from  `Metadata.Dataset` as l
+from  `Metadata`.`Dataset` as l
 where ((l.DataverseName = 'test1') or (l.DataverseName = 'test2') or (l.DataverseName = 'TwitterData'))
 order by l.DataverseName, l.DatasetName, l.DatatypeDataverseName
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.query.sqlpp
index 6d34d53..235a74f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.query.sqlpp
@@ -18,8 +18,8 @@
  */
 
 select element {'ug-student':s,'prof':p,'grd-student':a,'postdoc':b}
-from  `student.ugdstd` as s,
-      `teacher.prof` as p,
-      `student.gdstd` as a,
-      `teacher.pstdoc` as b
+from  `student`.`ugdstd` as s,
+      `teacher`.`prof` as p,
+      `student`.`gdstd` as a,
+      `teacher`.`pstdoc` as b
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.2.update.sqlpp
index 1d4b862..c68b09e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.2.update.sqlpp
@@ -21,5 +21,5 @@
 
 insert into test2.Customers
 select element x
-from  `test1.Customers` as x
+from  `test1`.`Customers` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.query.sqlpp
index 6e65b68..65591e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.query.sqlpp
@@ -21,6 +21,6 @@
 
 
 select element c
-from  `test2.Customers` as c
+from  `test2`.`Customers` as c
 order by c.cid
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.query.sqlpp
index a65e753..2b38cb7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.query.sqlpp
@@ -24,8 +24,8 @@
 
 
 select element {'cust_name':c.name,'cust_age':c.age,'order_total':o.total,'orderList':[o.oid,o.cid]}
-from  `test1.Customers` as c,
-      `test2.Orders` as o
+from  `test1`.`Customers` as c,
+      `test2`.`Orders` as o
 where (c.cid = o.cid)
 order by c.name,o.total
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/custord/join_q_09/join_q_09.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/custord/join_q_09/join_q_09.2.query.sqlpp
index 49aa67f..32071ee 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/custord/join_q_09/join_q_09.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/custord/join_q_09/join_q_09.2.query.sqlpp
@@ -17,10 +17,10 @@
  * under the License.
  */
 
-/** This query is a negative test for ambiguous alias reference. */
+/** This query is a test for ambiguous alias reference. */
 
 SELECT c.name AS cust_name,
-       age AS cust_age,
+       age AS age,
        o.total AS order_total,
        [o.oid,o.cid] AS orderList
 FROM test.Customers c, test.Orders o
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-4/q2-4.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-4/q2-4.3.query.sqlpp
index a16706d..7aa1ca9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-4/q2-4.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-4/q2-4.3.query.sqlpp
@@ -29,11 +29,11 @@
        (
          SELECT chapter_name, COUNT(e) AS escount
          FROM es AS e
-         GROUP BY chapter_name
+         GROUP BY sponsor.chapter_name
        ) chapter_breakdown
 FROM  Event,
       Event.sponsoring_sigs AS sponsor
-GROUP BY sig_id GROUP AS es
+GROUP BY sponsor.sig_id GROUP AS es
 ORDER BY total_count DESC
 LIMIT 5
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.query.sqlpp
index 0526174..41d228c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.query.sqlpp
@@ -27,6 +27,6 @@
 
 
 select element l
-from  `Metadata.Datatype` as l
+from  `Metadata`.`Datatype` as l
 where (l.DatatypeName = 'TestType')
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.query.sqlpp
index 5d6e31c..b7d9e3a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.query.sqlpp
@@ -27,6 +27,6 @@
 
 
 select element l
-from  `Metadata.Datatype` as l
+from  `Metadata`.`Datatype` as l
 where (l.DatatypeName = 'TestType')
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp
index 0d1fd55..ebf8d41 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp
@@ -27,6 +27,6 @@
 
 
 select element l
-from  `Metadata.Index` as l
+from  `Metadata`.`Index` as l
 where (l.IsPrimary = false)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp
index 6f2395b..5f71ee1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp
@@ -31,5 +31,5 @@
 
 insert into test.employee
 select element {'id':(x.id + 10000),'fname':x.fname,'lname':x.lname,'age':x.age,'dept':x.dept}
-from  `test.employee` as x
+from  `test`.`employee` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp
index fe7aefe..c1fe6e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp
@@ -28,6 +28,6 @@
 
 
 select element l
-from  `test.employee` as l
+from  `test`.`employee` as l
 order by l.id
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-autogenerated-no-field/load-with-autogenerated-pk_txt_01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-autogenerated-no-field/load-with-autogenerated-pk_txt_01.1.ddl.sqlpp
new file mode 100644
index 0000000..b04d413
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-autogenerated-no-field/load-with-autogenerated-pk_txt_01.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.DBLPType as
+ closed {
+  id : uuid,
+  title : string,
+  authors : string
+};
+
+create dataset DBLP(DBLPType) primary key not_id autogenerated ;
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-index-open/load-with-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-index-open/load-with-index-open.2.update.sqlpp
index ff7f878..c532f72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-index-open/load-with-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-index-open/load-with-index-open.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.LineItemOpen
 select element x
-from  `test.LineItem` as x
+from  `test`.`LineItem` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.2.update.sqlpp
index 566fd7e..1f5ad07 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.2.update.sqlpp
index c740e3d..11b4eaf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.MyDataOpen
 select element x
-from  `test.MyData` as x
+from  `test`.`MyData` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.2.update.sqlpp
index 566fd7e..1f5ad07 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.2.update.sqlpp
index 08a2f88..82772fa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.2.update.sqlpp
@@ -32,5 +32,5 @@
 
 insert into test.employee
 select element {'id':(x.id + 10000),'fname':x.fname,'lname':x.lname,'age':x.age,'dept':x.dept}
-from  `test.employee` as x
+from  `test`.`employee` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.4.update.sqlpp
index 1f89c71..3c4d5bc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.4.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.4.update.sqlpp
@@ -29,5 +29,5 @@
 
 insert into test.employee
 select element {'id':(x.id + 20000),'fname':x.fname,'lname':x.lname,'age':x.age,'dept':x.dept}
-from  `test.employee` as x
+from  `test`.`employee` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.5.query.sqlpp
index 122ff4c..fc98599 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.5.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/recreate-index/recreate-index.5.query.sqlpp
@@ -28,4 +28,4 @@
 use test;
 
 select element count(*)
-from  `test.employee`;
+from  `test`.`employee`;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
index 43b3b0d..e25121b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-nullable/scan-delete-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -52,14 +52,17 @@
 };
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-
-create feed CustomerFeed
-using localfs
-(("path"="asterix_nc1://data/semistructured/co1k/customer.adm"),
-("format"="adm"),
-("type-name"="CustomerType"),
-("tuple-interval"="10"));
-
+create feed CustomerFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/semistructured/co1k/customer.adm",
+ "format" : "adm",
+ "type-name" : "CustomerType",
+ "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.sqlpp
index 4ede65d..fae8310 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.1.ddl.sqlpp
@@ -65,9 +65,17 @@
 };
 
 create dataset Customers(CustomerType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset CustomersOpen(CustomerOpenType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.2.update.sqlpp
index 47f0031..ad57c73 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-correlated-secondary-index-open/scan-delete-btree-correlated-secondary-index-open.2.update.sqlpp
@@ -24,7 +24,7 @@
 
 insert into test.CustomersOpen
 select element {'cid':x.cid,'name':x.name,'age':x.age,'address':x.address,'interests':x.interests,'children':x.children}
-from  `test.Customers` as x
+from  `test`.`Customers` as x
 ;
 
 delete from CustomersOpen
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.2.update.sqlpp
index 67b310c..7edbb59 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.2.update.sqlpp
@@ -30,5 +30,5 @@
 
 insert into test.CustomersOpen
 select element {'cid':x.cid,'name':x.name,'age':x.age,'address':x.address,'interests':x.interests,'children':x.children}
-from  `test.Customers` as x
+from  `test`.`Customers` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
index e79276a..764a473 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable/scan-delete-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -40,13 +40,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed DBLPFeed
-using localfs
-((`path`=`asterix_nc1://data/dblp-small/dblp-small-nulls.adm`),
-(`format`=`adm`),
-(`delimiter`=`:`),
-(`type-name`=`DBLPType`),
-(`tuple-interval`=`10`));
+create feed DBLPFeed with {
+ "adapter-name" : "localfs",
+ "path":"asterix_nc1://data/dblp-small/dblp-small-nulls.adm",
+ "format":"adm",
+ "delimiter":":",
+ "type-name":"DBLPType",
+ "tuple-interval":"10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
index 2b5788e..1d286ca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
@@ -47,10 +47,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLPOpen(DBLPOpenType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.2.update.sqlpp
index 5865ca6..1d457f0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index-open/scan-delete-inverted-index-ngram-correlated-secondary-index-open.2.update.sqlpp
@@ -24,7 +24,7 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
 
 delete from DBLPOpen
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index/scan-delete-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index/scan-delete-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
index 9622774..2a0eaee 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index/scan-delete-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-correlated-secondary-index/scan-delete-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
@@ -39,13 +39,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed DBLPFeed
-using localfs
-((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),
-(`format`=`delimited-text`),
-(`delimiter`=`:`),
-(`type-name`=`DBLPType`),
-(`tuple-interval`=`10`));
+create feed DBLPFeed with {
+ "adapter-name" : "localfs",
+ "path":"asterix_nc1://data/dblp-small/dblp-small-id.txt",
+ "format":"delimited-text",
+ "delimiter":":",
+ "type-name":"DBLPType",
+ "tuple-interval":"10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.2.update.sqlpp
index 7317ab9..b3c4795 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.2.update.sqlpp
@@ -30,5 +30,5 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-nullable/scan-delete-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-nullable/scan-delete-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
index 4750e17..4dc54b6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-nullable/scan-delete-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-nullable/scan-delete-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -40,12 +40,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed DBLPFeed
-using localfs
-((`path`=`asterix_nc1://data/dblp-small/dblp-small-nulls.adm`),
-(`format`=`adm`),
-(`type-name`=`DBLPType`),
-(`tuple-interval`=`10`));
+create feed DBLPFeed with {
+ "adapter-name" : "localfs",
+ "path":"asterix_nc1://data/dblp-small/dblp-small-nulls.adm",
+ "format":"adm",
+ "delimiter":":",
+ "type-name":"DBLPType",
+ "tuple-interval":"10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
index 7a08dd2..2f45268 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
@@ -48,10 +48,19 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLPOpen(DBLPOpenType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.2.update.sqlpp
index 878bdd0..b04ba2b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index-open/scan-delete-inverted-index-word-correlated-secondary-index-open.2.update.sqlpp
@@ -24,7 +24,7 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
 
 delete from DBLPOpen
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index/scan-delete-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index/scan-delete-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
index 4bb975e..b7b64c3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index/scan-delete-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-correlated-secondary-index/scan-delete-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
@@ -39,14 +39,19 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed DBLPFeed
-using localfs
-((`path`=`asterix_nc1://data/dblp-small/dblp-small-id.txt`),
-(`format`=`delimited-text`),
-(`delimiter`=`:`),
-(`type-name`=`DBLPType`),
-(`tuple-interval`=`10`));
 
+create feed DBLPFeed with {
+ "adapter-name" : "localfs",
+ "path":"asterix_nc1://data/dblp-small/dblp-small-id.txt",
+ "format":"delimited-text",
+ "delimiter":":",
+ "type-name":"DBLPType",
+ "tuple-interval":"10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.2.update.sqlpp
index d256022..e4d3d54 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.2.update.sqlpp
@@ -30,5 +30,5 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-nullable/scan-delete-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-nullable/scan-delete-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
index 3e1b6d5d..e6226ca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-nullable/scan-delete-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-nullable/scan-delete-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -43,13 +43,18 @@
 };
 
 create  dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed MyFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialDataNulls.json`),
-(`format`=`adm`),
-(`type-name`=`MyRecord`),
-(`tuple-interval`=`10`));
+create feed MyFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialDataNulls.json",
+ "format" : "adm",
+ "type-name" : "MyRecord",
+ "tuple-interval" : "10"
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.1.ddl.sqlpp
index cc505c2..6569e65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.1.ddl.sqlpp
@@ -56,11 +56,19 @@
 };
 
 create  dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset MyDataOpen(MyRecordOpen) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.2.update.sqlpp
index 3fae91c..afaf60e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index-open/scan-delete-rtree-correlated-secondary-index-open.2.update.sqlpp
@@ -23,7 +23,7 @@
 
 insert into test.MyDataOpen
 select element x
-from  `test.MyData` as x
+from  `test`.`MyData` as x
 ;
 
 delete from MyDataOpen
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index/scan-delete-rtree-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index/scan-delete-rtree-correlated-secondary-index.1.ddl.sqlpp
index 00cdd5b..d4a392e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index/scan-delete-rtree-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-correlated-secondary-index/scan-delete-rtree-correlated-secondary-index.1.ddl.sqlpp
@@ -44,13 +44,17 @@
 };
 
 create dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-
-create feed MyFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialData.json`),
-(`format`=`adm`),
-(`type-name`=`MyRecord`),
-(`tuple-interval`=`10`));
+create feed MyFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialData.json",
+ "format" : "adm",
+ "type-name" : "MyRecord",
+ "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.2.update.sqlpp
index 225c9cb..59e39e8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.2.update.sqlpp
@@ -30,5 +30,5 @@
 
 insert into test.MyDataOpen
 select element x
-from  `test.MyData` as x
+from  `test`.`MyData` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
index ef0237f..b6e0d1c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-nullable/scan-insert-btree-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -52,11 +52,19 @@
 };
 
 create  dataset Customers(CustomerType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset CustomersMini(CustomerType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.sqlpp
index d467308..95d2b8f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-btree-correlated-secondary-index-open/scan-insert-btree-correlated-secondary-index-open.1.ddl.sqlpp
@@ -64,9 +64,17 @@
 };
 
 create  dataset Customers(CustomerType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset CustomersOpen(CustomerOpenType) primary key cid
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
index c28e580..2c30b4b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable/scan-insert-inverted-index-ngram-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -40,11 +40,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLP1(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
-
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-open/scan-insert-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-open/scan-insert-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
index aaf1888..8f18401 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-open/scan-insert-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index-open/scan-insert-inverted-index-ngram-correlated-secondary-index-open.1.ddl.sqlpp
@@ -48,10 +48,17 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLPOpen(DBLPOpenType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
-
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index/scan-insert-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index/scan-insert-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
index b788e1a..9ff7255 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index/scan-insert-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-ngram-correlated-secondary-index/scan-insert-inverted-index-ngram-correlated-secondary-index.1.ddl.sqlpp
@@ -39,10 +39,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLP1(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-nullable/scan-insert-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-nullable/scan-insert-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
index 61c8447..82b4683 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-nullable/scan-insert-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-nullable/scan-insert-inverted-index-word-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -40,10 +40,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLP1(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-open/scan-insert-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-open/scan-insert-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
index a858394..ac91578 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-open/scan-insert-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index-open/scan-insert-inverted-index-word-correlated-secondary-index-open.1.ddl.sqlpp
@@ -48,10 +48,18 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLPOpen(DBLPOpenType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index/scan-insert-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index/scan-insert-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
index 1067c80..c805844 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index/scan-insert-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-inverted-index-word-correlated-secondary-index/scan-insert-inverted-index-word-correlated-secondary-index.1.ddl.sqlpp
@@ -39,11 +39,19 @@
 };
 
 create  dataset DBLP(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset DBLP1(DBLPType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-nullable/scan-insert-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-nullable/scan-insert-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
index 849f7d1..f9e08de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-nullable/scan-insert-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-nullable/scan-insert-rtree-correlated-secondary-index-nullable.1.ddl.sqlpp
@@ -49,18 +49,26 @@
 };
 
 create  dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
 create  dataset MyMiniData(MyMiniRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed MyFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialDataNulls.json`),
-(`format`=`adm`),
-(`type-name`=`MyRecord`),
-(`tuple-interval`=`10`));
-
+create feed MyFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialDataNulls.json",
+ "format" : "adm",
+ "type-name" : "MyRecord",
+ "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-open/scan-insert-rtree-correlated-secondary-index-open.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-open/scan-insert-rtree-correlated-secondary-index-open.1.ddl.sqlpp
index 510cc51..c785252 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-open/scan-insert-rtree-correlated-secondary-index-open.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index-open/scan-insert-rtree-correlated-secondary-index-open.1.ddl.sqlpp
@@ -49,17 +49,26 @@
 };
 
 create  dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset MyOpenData(MyOpenRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed MyFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialData.json`),
-(`format`=`adm`),
-(`type-name`=`MyRecord`),
-(`tuple-interval`=`10`));
+create feed MyFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialData.json",
+ "format" : "adm",
+ "type-name" : "MyRecord",
+ "tuple-interval" : "10"
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index/scan-insert-rtree-correlated-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index/scan-insert-rtree-correlated-secondary-index.1.ddl.sqlpp
index e986bb6..94e700a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index/scan-insert-rtree-correlated-secondary-index.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/scan-insert-rtree-correlated-secondary-index/scan-insert-rtree-correlated-secondary-index.1.ddl.sqlpp
@@ -42,26 +42,37 @@
 };
 
 create  dataset MyData(MyRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset MyMiniData(MyMiniRecord) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed MyFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialData.json`),
-(`format`=`adm`),
-(`type-name`=`MyRecord`),
-(`tuple-interval`=`10`));
+create feed MyFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialData.json",
+ "format" : "adm",
+ "type-name" : "MyRecord",
+ "tuple-interval" : "10"
+};
 
-create feed MyMiniFeed
-using localfs
-((`path`=`asterix_nc1://data/spatial/spatialData0.json`),
-(`format`=`adm`),
-(`type-name`=`MyMiniRecord`),
-(`tuple-interval`=`10`));
+
+create feed MyMiniFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/spatial/spatialData0.json",
+ "format" : "adm",
+ "type-name" : "MyMiniRecord",
+ "tuple-interval" : "10"
+};
 
 
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.sqlpp
index 14b2ad1..aa4efdb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.1.ddl.sqlpp
@@ -50,5 +50,11 @@
   l_comment : string
 };
 
-create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber using compaction policy `constant`((`num-components`=`2`));
+create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber
+with {
+  "merge-policy": {
+    "name": "constant",
+    "parameters": { "num-components": 2 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.sqlpp
index 0acd01f..ad9b25a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy-with-feed/using-correlated-prefix-merge-policy-with-feed.1.ddl.sqlpp
@@ -49,13 +49,19 @@
 };
 
 create dataset LineItem(LineItemType)
-  primary key l_orderkey, l_linenumber using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+primary key l_orderkey, l_linenumber
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
-create feed LineItemFeed
-using localfs
-(("path"="asterix_nc1://data/tpch0.001/lineitem.tbl"),
-("format"="delimited-text"),
-("delimiter"="|"),
-("type-name"="LineItemType"),
-("tuple-interval"="10"));
+create feed LineItemFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/tpch0.001/lineitem.tbl",
+  "format" : "delimited-text",
+  "delimiter" : "|",
+  "type-name" : "LineItemType",
+  "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.sqlpp
index 9fb610e..66aaf10 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.1.ddl.sqlpp
@@ -50,5 +50,11 @@
   l_comment : string
 };
 
-create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber using compaction policy `correlated-prefix`((`max-mergable-component-size`=`1048576`),(`max-tolerance-component-count`=`3`));
+create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 1048576, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.sqlpp
index 8ea402c..ae60be0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.1.ddl.sqlpp
@@ -50,5 +50,5 @@
   l_comment : string
 };
 
-create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber using compaction policy `no-merge`;
+create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber with { "merge-policy": { "name": "no-merge" } };
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.sqlpp
index b04c631..0e1ece1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.1.ddl.sqlpp
@@ -50,5 +50,10 @@
   l_comment : string
 };
 
-create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber using compaction policy `prefix`((`max-mergable-component-size`=`1048576`),(`max-tolerance-component-count`=`3`));
-
+create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 1048576, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
index a4166e5..25017f8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access/explain_field_access.2.query.sqlpp
@@ -21,5 +21,5 @@
 
 EXPLAIN
 FROM Employee e
-GROUP BY substr(e.dept.department_id, 1)
-SELECT substr(e.dept.department_id, 1) as deptId, SUM(e.salary) AS star_cost;
+GROUP BY substr(e.dept.department_id, 0)
+SELECT substr(e.dept.department_id, 0) as deptId, SUM(e.salary) AS star_cost;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
index e170a6e..05179af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/explain/explain_field_access_closed/explain_field_access_closed.2.query.sqlpp
@@ -21,5 +21,5 @@
 
 EXPLAIN
 FROM Employee e
-GROUP BY substr(e.department_id, 1)
-SELECT substr(e.department_id, 1) as deptId, SUM(e.salary) AS star_cost;
+GROUP BY substr(e.department_id, 0)
+SELECT substr(e.department_id, 0) as deptId, SUM(e.salary) AS star_cost;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/return_invalid_type/return_invalid_type.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/return_invalid_type/return_invalid_type.1.ddl.sqlpp
index e375558..059b7e4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/return_invalid_type/return_invalid_type.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/external-library/return_invalid_type/return_invalid_type.1.ddl.sqlpp
@@ -52,12 +52,14 @@
 
 create dataset SyntheticTweets(Tweet) primary key id;
 
-create feed  SyntheticTweetFeed using stream
-(("duration"="1"),
-("stream-source"="org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory"),
-("tps"="50"),
-("type-name"="Tweet"),
-("tput-duration"="1"),
-("dataverse-dataset"="feeds:SyntheticTweets"),
-("format"="adm"),
-("mode"="controlled"));
+create feed  SyntheticTweetFeed with {
+  "adapter-name" : "stream",
+  "duration" : "1",
+  "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+  "tps" : "50",
+  "type-name" : "Tweet",
+  "tput-duration" : "1",
+  "dataverse-dataset" : "feeds:SyntheticTweets",
+  "format" : "adm",
+  "mode" : "controlled"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.sqlpp
index 4de5415..111486f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/connect-feed-with-function/connect-feed-with-function.1.ddl.sqlpp
@@ -45,11 +45,11 @@
     object_merge((case (anyname.popularity = "Good!") when true then {"true_popularity":"Indeed Good!"} else {"true_popularity":"Indeed Bad!"} end), anyname)
 };
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("upsert-feed"="true")
-);
\ No newline at end of file
+create feed UserFeed with {
+    "adapter-name" : "socket_adapter",
+    "sockets" : "127.0.0.1:10001",
+    "address-type" : "IP",
+    "type-name" : "TwitterUser",
+    "format" : "adm",
+    "upsert-feed" : "true"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/create-policy-from-file/create-policy-from-file.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/create-policy-from-file/create-policy-from-file.2.query.sqlpp
index 8a50280..05d2fe7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/create-policy-from-file/create-policy-from-file.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/create-policy-from-file/create-policy-from-file.2.query.sqlpp
@@ -22,5 +22,5 @@
  * Date         : 25th Jul 2016
  */
 
-select element x from `Metadata.FeedPolicy` as x
+select element x from `Metadata`.`FeedPolicy` as x
 where x.DataverseName = 'experiments';
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feed-with-external-function/feed-with-external-function.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feed-with-external-function/feed-with-external-function.1.ddl.sqlpp
index 9b0f2a0..4fdc669 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feed-with-external-function/feed-with-external-function.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feed-with-external-function/feed-with-external-function.1.ddl.sqlpp
@@ -43,11 +43,13 @@
   topics : {{string}}
 };
 
-create feed TweetFeed
-using localfs
-(("type-name"="TweetInputType"),
-("path"="asterix_nc1://data/twitter/obamatweets.adm"),
-("format"="adm"));
+create feed TweetFeed with
+{
+    "adapter-name" : "localfs",
+    "type-name" : "TweetInputType",
+    "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+    "format" : "adm"
+};
 
 create dataset TweetsFeedIngest(TweetOutputType)
 primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.1.ddl.sqlpp
index 7f79467..f381284 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.1.ddl.sqlpp
@@ -39,5 +39,10 @@
 
 create  dataset Tweets(TweetType) primary key id;
 
-create feed TweetFeed using localfs
-((`type-name`=`TweetType`),(`path`=`asterix_nc1://data/twitter/obamatweets.adm`),(`format`=`adm`),(`tuple-interval`=`10`));
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+ "type-name" : "TweetType",
+ "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+ "format" : "adm",
+ "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
index e28482f..f4862f2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_01/feeds_01.3.query.sqlpp
@@ -23,6 +23,6 @@
  */
 
 select element x
-from  `Metadata.Feed` as x
+from  `Metadata`.`Feed` as x
 where ((x.DataverseName = 'feeds') and (x.FeedName = 'TweetFeed'))
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_02/feeds_02.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_02/feeds_02.1.ddl.sqlpp
index a0d01c2..de40e1a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_02/feeds_02.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_02/feeds_02.1.ddl.sqlpp
@@ -39,8 +39,10 @@
 };
 
 create  dataset Tweets(TweetType) primary key id;
-create  feed TweetFeed using localfs
-((`path`=`asterix_nc1://data/twitter/obamatweets.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format": "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.1.ddl.sqlpp
index 7b8e70c..4cff7b1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.1.ddl.sqlpp
@@ -41,7 +41,10 @@
 x
 };
 
-create feed TweetFeed
-using localfs
-((`type-name`=`TweetType`),(`path`=`asterix_nc1://data/twitter/obamatweets.adm`),(`format`=`adm`)
-,(`tuple-interval`=`10`));
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+  "type-name" : "TweetType",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.3.query.sqlpp
index 755fbf3..0fa967b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_03/feeds_03.3.query.sqlpp
@@ -23,6 +23,6 @@
  */
 
 select element x
-from  `Metadata.FeedConnection` as x
+from  `Metadata`.`FeedConnection` as x
 where ((x.DataverseName = 'feeds') and (x.FeedName = 'TweetFeed'))
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_07/feeds_07.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_07/feeds_07.1.ddl.sqlpp
index 5553694..9e77b07 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_07/feeds_07.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_07/feeds_07.1.ddl.sqlpp
@@ -45,12 +45,14 @@
 
 create dataset SyntheticTweets(TweetMessageType) primary key id;
 
-create feed SyntheticTweetFeed using stream(
-(`duration`=`5`),
-(`tps`=`50`),
-(`type-name`=`TweetMessageType`),
-(`format`=`adm`),
-(`stream-source`=`org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory`),
-(`tput-duration`=`5`),
-(`dataverse-dataset`=`feeds:SyntheticTweets`),
-(`mode`=`controlled`));
+create feed SyntheticTweetFeed with {
+  "adapter-name" : "stream",
+  "duration" : "5",
+  "tps" : "50",
+  "type-name" : "TweetMessageType",
+  "format" : "adm",
+  "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+  "tput-duration" : "5",
+  "dataverse-dataset" : "feeds:SyntheticTweets",
+  "mode" : "controlled"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_08/feeds_08.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_08/feeds_08.1.ddl.sqlpp
index 3b78e5a..1cf6a95 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_08/feeds_08.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_08/feeds_08.1.ddl.sqlpp
@@ -45,12 +45,15 @@
 
 create  dataset SyntheticTweets(TweetMessageType) primary key id;
 create  index ngram_index  on SyntheticTweets (message_text) type ngram (3);
-create  feed SyntheticTweetFeed using stream (
-(`duration`=`5`),
-(`tps`=`50`),
-(`stream-source`=`org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory`),
-(`type-name`=`TweetMessageType`),
-(`tput-duration`=`5`),
-(`dataverse-dataset`=`feeds:SyntheticTweets`),
-(`format`=`adm`),
-(`mode`=`controlled`));
+
+create  feed SyntheticTweetFeed with {
+ "adapter-name" : "stream",
+ "duration" : "5",
+ "tps" : "50",
+ "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+ "type-name" : "TweetMessageType",
+ "tput-duration" : "5",
+ "dataverse-dataset" : "feeds:SyntheticTweets",
+ "format" : "adm",
+ "mode" : "controlled"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_09/feeds_09.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_09/feeds_09.1.ddl.sqlpp
index f979a3a..0c627bf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_09/feeds_09.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_09/feeds_09.1.ddl.sqlpp
@@ -45,7 +45,14 @@
 };
 create  dataset SyntheticTweets(TweetMessageType) primary key id;
 create  index message_text  on SyntheticTweets (message_text) type btree;
-create  feed SyntheticTweetFeed using stream ((`duration`=`5`),
-(`tps`=`50`),(`tput-duration`=`5`),(`type-name`=`TweetMessageType`),
-(`dataverse-dataset`=`feeds:SyntheticTweets`),(`format`=`adm`),
-(`stream-source`=`org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory`),(`mode`=`controlled`));
+
+create  feed SyntheticTweetFeed with {
+ "adapter-name" : "stream",
+ "duration" : "5",
+ "tps" : "50","tput-duration" : "5",
+ "type-name" : "TweetMessageType",
+ "dataverse-dataset" : "feeds:SyntheticTweets",
+ "format" : "adm",
+ "stream-source" : "org.apache.asterix.external.input.stream.factory.TwitterFirehoseStreamFactory",
+ "mode" : "controlled"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_10/feeds_10.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_10/feeds_10.1.ddl.sqlpp
index 8898864..c198723 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_10/feeds_10.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_10/feeds_10.1.ddl.sqlpp
@@ -36,8 +36,10 @@
 
 create  index usernameIdx  on Tweets (username) type btree;
 
-create  feed TweetFeed using localfs
-((`path`=`asterix_nc1://data/twitter/obamatweets.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_11/feeds_11.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_11/feeds_11.1.ddl.sqlpp
index 84c8047..f497dfe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_11/feeds_11.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_11/feeds_11.1.ddl.sqlpp
@@ -31,8 +31,10 @@
 };
 
 create  dataset Tweets(TweetType) primary key id;
-create  feed TweetFeed using localfs
-((`path`=`asterix_nc1://data/twitter/obamatweets.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_12/feeds_12.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_12/feeds_12.1.ddl.sqlpp
index 9f1ce3a..de4bd7c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_12/feeds_12.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/feeds_12/feeds_12.1.ddl.sqlpp
@@ -34,8 +34,10 @@
 
 create  dataset Tweets(TweetType) primary key id;
 
-create  feed TweetFeed using localfs
-((`path`=`asterix_nc1://data/twitter/obamatweets_duplicate.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path":"asterix_nc1://data/twitter/obamatweets_duplicate.adm",
+  "format":"adm",
+  "type-name":"TweetType",
+  "tuple-interval":"10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/insert-feed/insert-feed.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/insert-feed/insert-feed.1.ddl.sqlpp
index be7c383..f7890c8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/insert-feed/insert-feed.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/insert-feed/insert-feed.1.ddl.sqlpp
@@ -36,11 +36,11 @@
 
 create dataset TwitterUsers(TwitterUser) primary key `screen-name`;
 
-create feed UserFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TwitterUser"),
-    ("format"="adm"),
-    ("insert-feed"="true")
-);
+create feed UserFeed with {
+ "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "TwitterUser",
+  "format" : "adm",
+  "insert-feed" : "true"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/issue_230_feeds/issue_230_feeds.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/issue_230_feeds/issue_230_feeds.1.ddl.sqlpp
index 3141627..231e125 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/issue_230_feeds/issue_230_feeds.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/feeds/issue_230_feeds/issue_230_feeds.1.ddl.sqlpp
@@ -34,8 +34,10 @@
 
 create  dataset Tweets(TweetType) primary key id;
 
-create  feed TweetFeed using localfs
-((`path`=`asterix_nc1://data/twitter/obamatweets.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create  feed TweetFeed with {
+  "adapter-name" : "localfs",
+  "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+  "format" : "adm",
+  "type-name" : "TweetType",
+  "tuple-interval" : "10"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/delete/delete.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/delete/delete.1.ddl.sqlpp
index fcd4f57..3d0a5e4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/delete/delete.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/delete/delete.1.ddl.sqlpp
@@ -81,16 +81,21 @@
 };
 
 create dataset Tweet(typeTweet) primary key id
-using compaction policy prefix (("max-mergable-component-size"="32768"),("max-tolerance-component-count"="32"))
-with filter on create_at;
+with filter on create_at
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 32768, "max-tolerance-component-count": 32 }
+  }
+};
 
 create index text_idx if not exists on Tweet(`text`) type fulltext;
 create index state_idx if not exists on Tweet(geo_tag.stateID) type btree;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="typeTweet"),
-    ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "typeTweet",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.sqlpp
index a76d678..63db3be 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-btree/insert-with-correlated-secondary-btree.1.ddl.sqlpp
@@ -39,10 +39,18 @@
 };
 
 create  dataset FacebookMessages(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset FacebookMessages2(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`))
- with filter on `send-time`;
+with filter on `send-time`
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-ngram/insert-with-correlated-secondary-inverted-ngram.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-ngram/insert-with-correlated-secondary-inverted-ngram.1.ddl.sqlpp
index abec9e5..574d5a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-ngram/insert-with-correlated-secondary-inverted-ngram.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-ngram/insert-with-correlated-secondary-inverted-ngram.1.ddl.sqlpp
@@ -39,11 +39,19 @@
 };
 
 create  dataset FacebookMessages(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset FacebookMessages2(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`))
-with filter on `send-time`;
+with filter on `send-time`
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-word/insert-with-correlated-secondary-inverted-word.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-word/insert-with-correlated-secondary-inverted-word.1.ddl.sqlpp
index d2eb504..e176108 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-word/insert-with-correlated-secondary-inverted-word.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-inverted-word/insert-with-correlated-secondary-inverted-word.1.ddl.sqlpp
@@ -39,11 +39,19 @@
 };
 
 create  dataset FacebookMessages(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset FacebookMessages2(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`))
-with filter on `send-time`;
+with filter on `send-time`
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-rtree/insert-with-correlated-secondary-rtree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-rtree/insert-with-correlated-secondary-rtree.1.ddl.sqlpp
index 3727b9c..3bf80d4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-rtree/insert-with-correlated-secondary-rtree.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/insert-with-correlated-secondary-rtree/insert-with-correlated-secondary-rtree.1.ddl.sqlpp
@@ -39,11 +39,19 @@
 };
 
 create  dataset FacebookMessages(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create  dataset FacebookMessages2(FacebookMessageType) primary key `message-id`
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`))
-with filter on `send-time`;
+with filter on `send-time`
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp
index fd65d71..91b3ee1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/filters/upsert/upsert.1.ddl.sqlpp
@@ -82,16 +82,21 @@
 };
 
 create dataset Tweet(typeTweet) primary key id
-using compaction policy prefix (("max-mergable-component-size"="32768"),("max-tolerance-component-count"="32"))
-with filter on create_at;
+with filter on create_at
+with {
+  "merge-policy": {
+    "name": "prefix",
+    "parameters": { "max-mergable-component-size": 32768, "max-tolerance-component-count": 32 }
+  }
+};
 
 create index text_idx if not exists on Tweet(`text`) type btree;
 create index state_idx if not exists on Tweet(geo_tag.stateID) type btree;
 
-create feed TweetFeed using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="typeTweet"),
-    ("format"="adm")
-);
+create feed TweetFeed with {
+  "adapter-name" : "socket_adapter",
+  "sockets" : "127.0.0.1:10001",
+  "address-type" : "IP",
+  "type-name" : "typeTweet",
+  "format" : "adm"
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.1.ddl.sqlpp
new file mode 100644
index 0000000..c201040
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.1.ddl.sqlpp
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ *  Description     : Full-text search non-index test
+ *                  : This test is intended to verify that the full-text search works as expected
+ *                  : with multiple conditions.
+ *                  : query #3 - two string values in [an ordered list] query with "any" option
+ *                  :            in this case, "any" option that enforces a disjunctive search will be applied.
+ *                  : query #4 - the same as query #3, but with a different option - "all"
+ *                  :            in this case, we explicitly specify "all" option that enforces a conjunctive search.
+ *                  : query #5 - two string values in {{an unordered list}} query with "any" option
+ *                  :            in this case, "any" option that enforces a disjunctive search will be applied.
+ *                  : query #6 - the same as query #6, but with a different option - "all"
+ *                  :            in this case, we explicitly specify "all" option that enforces a conjunctive search.
+ *                  : query #7 - the same as query #4, but without any option that is equivalent to "all".
+ *                  : query #8 - the same as query #6, but without any option that is equivalent to "all".
+ *  Expected Result : Success
+ *
+*/
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type MyRecord as closed {
+  id: int64,
+  docid: int64,
+  val1: int64,
+  title: string,
+  point: point,
+  kwds: string,
+  line1: line,
+  line2: line,
+  poly1: polygon,
+  poly2: polygon,
+  rec: rectangle,
+  circle: circle
+};
+
+create dataset MyData(MyRecord)
+  primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.2.update.sqlpp
new file mode 100644
index 0000000..9b7c1f6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.2.update.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+load dataset MyData
+using localfs
+(("path"="asterix_nc1://data/spatial/spatialData2.json"),("format"="adm"));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.3.query.sqlpp
new file mode 100644
index 0000000..02d27ab
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.3.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"], {"mode":"any"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.4.query.sqlpp
new file mode 100644
index 0000000..f495022
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.4.query.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"], {"mode":"all"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.5.query.sqlpp
new file mode 100644
index 0000000..8bf8eba
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.5.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}, {"mode":"any"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.6.query.sqlpp
new file mode 100644
index 0000000..6a2c2ba
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.6.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}, {"mode":"all"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.7.query.sqlpp
new file mode 100644
index 0000000..14ec94f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.7.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"]) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.8.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.8.query.sqlpp
new file mode 100644
index 0000000..c770842
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-09/fulltext-09.8.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.1.ddl.sqlpp
new file mode 100644
index 0000000..5848e28
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.1.ddl.sqlpp
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ *  Description     : Full-text search index test
+ *                  : This test is intended to verify that the full-text search works as expected
+ *                  : with multiple conditions.
+ *                  : query #3 - two string values in [an ordered list] query with "any" option
+ *                  :            in this case, "any" option that enforces a disjunctive search will be applied.
+ *                  : query #4 - the same as query #3, but with a different option - "all"
+ *                  :            in this case, we explicitly specify "all" option that enforces a conjunctive search.
+ *                  : query #5 - two string values in {{an unordered list}} query with "any" option
+ *                  :            in this case, "any" option that enforces a disjunctive search will be applied.
+ *                  : query #6 - the same as query #6, but with a different option - "all"
+ *                  :            in this case, we explicitly specify "all" option that enforces a conjunctive search.
+ *                  : query #7 - the same as query #4, but without any option that is equivalent to "all".
+ *                  : query #8 - the same as query #6, but without any option that is equivalent to "all".
+ *  Expected Result : Success
+ *
+*/
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type MyRecord as closed {
+  id: int64,
+  docid: int64,
+  val1: int64,
+  title: string,
+  point: point,
+  kwds: string,
+  line1: line,
+  line2: line,
+  poly1: polygon,
+  poly2: polygon,
+  rec: rectangle,
+  circle: circle
+};
+
+create dataset MyData(MyRecord)
+  primary key id;
+
+create index fulltext_index_title on MyData(title) type fulltext;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.2.update.sqlpp
new file mode 100644
index 0000000..9b7c1f6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.2.update.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+load dataset MyData
+using localfs
+(("path"="asterix_nc1://data/spatial/spatialData2.json"),("format"="adm"));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.3.query.sqlpp
new file mode 100644
index 0000000..02d27ab
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.3.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"], {"mode":"any"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.4.query.sqlpp
new file mode 100644
index 0000000..f495022
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.4.query.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"], {"mode":"all"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.5.query.sqlpp
new file mode 100644
index 0000000..8bf8eba
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.5.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}, {"mode":"any"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.6.query.sqlpp
new file mode 100644
index 0000000..6a2c2ba
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.6.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}, {"mode":"all"}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.7.query.sqlpp
new file mode 100644
index 0000000..14ec94f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.7.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, ["object","database"]) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.8.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.8.query.sqlpp
new file mode 100644
index 0000000..c770842
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fulltext/fulltext-index-08/fulltext-index-08.8.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select element {"id":ftval.id}
+from MyData as ftval
+where test.ftcontains(ftval.title, {{"object","database"}}) and ftval.val1 > 0 and ftval.val1 < 200
+order by ftval.id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.1.3.query.sqlpp
index 5e0785e..8adf8dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.1.3.query.sqlpp
@@ -62,7 +62,7 @@
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenLeft,tokensLeft,lenRight,tokensRight,prefixTokenLeft,0.500000f)
     where ((prefixTokenLeft = prefixTokenRight) and ((sim >= 0.500000f) and (paperLeft.id < paperRight.id)))
     /* +hash */
-    group by paperLeft.id as idLeft,paperRight.id as idRight
+    group by paperLeft.id as idLeft,paperRight.id as idRight,sim as sim
 ) as ridpair,
       DBLP as paperLeft,
       DBLP as paperRight
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.2.3.query.sqlpp
index 5e0785e..8adf8dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.2.3.query.sqlpp
@@ -62,7 +62,7 @@
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenLeft,tokensLeft,lenRight,tokensRight,prefixTokenLeft,0.500000f)
     where ((prefixTokenLeft = prefixTokenRight) and ((sim >= 0.500000f) and (paperLeft.id < paperRight.id)))
     /* +hash */
-    group by paperLeft.id as idLeft,paperRight.id as idRight
+    group by paperLeft.id as idLeft,paperRight.id as idRight,sim as sim
 ) as ridpair,
       DBLP as paperLeft,
       DBLP as paperRight
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.query.sqlpp
index dd94d30..d9e5106 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.query.sqlpp
@@ -61,7 +61,7 @@
       ),
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenLeft,tokensLeft,lenRight,tokensRight,prefixTokenLeft,0.500000f)
     where ((prefixTokenLeft = prefixTokenRight) and ((sim >= 0.500000f) and (paperLeft.id < paperRight.id)))
-    group by paperLeft.id as idLeft,paperRight.id as idRight
+    group by paperLeft.id as idLeft,paperRight.id as idRight,sim as sim
 ) as ridpair
 where ((ridpair.idLeft = paperLeft.id) and (ridpair.idRight = paperRight.id))
 order by paperLeft.id,paperRight.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.1.3.query.sqlpp
index 1d1735c..21b0d5b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.1.3.query.sqlpp
@@ -65,6 +65,6 @@
   ),
       sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
 where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
-group by idDBLP as idDBLP,idCSX as idCSX
+group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 order by idDBLP,idCSX
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.2.3.query.sqlpp
index f17649b..deea71d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.2.3.query.sqlpp
@@ -66,6 +66,6 @@
       sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
 where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
 /* +hash */
-group by idDBLP as idDBLP,idCSX as idCSX
+group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 order by idDBLP,idCSX
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.3.query.sqlpp
index f17649b..deea71d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.3.query.sqlpp
@@ -66,6 +66,6 @@
       sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
 where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
 /* +hash */
-group by idDBLP as idDBLP,idCSX as idCSX
+group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 order by idDBLP,idCSX
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.1.3.query.sqlpp
index 2241df2..d85c7d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.1.3.query.sqlpp
@@ -67,7 +67,7 @@
       ),
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
     where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
-    group by idDBLP as idDBLP,idCSX as idCSX
+    group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 ) as ridpair,
       DBLP as paperDBLP,
       CSX as paperCSX
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.2.3.query.sqlpp
index 0c69632..1238a9d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.2.3.query.sqlpp
@@ -68,7 +68,7 @@
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
     where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
     /* +hash */
-    group by idDBLP as idDBLP,idCSX as idCSX
+    group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 ) as ridpair,
       DBLP as paperDBLP,
       CSX as paperCSX
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.1.3.query.sqlpp
index 0c69632..1238a9d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.1.3.query.sqlpp
@@ -68,7 +68,7 @@
           sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
     where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
     /* +hash */
-    group by idDBLP as idDBLP,idCSX as idCSX
+    group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
 ) as ridpair,
       DBLP as paperDBLP,
       CSX as paperCSX
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.4.1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.4.1.3.query.sqlpp
index b9c649a..578d7c1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.4.1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.4.1.3.query.sqlpp
@@ -72,7 +72,7 @@
               sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
         where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
         /* +hash */
-        group by idDBLP as idDBLP,idCSX as idCSX
+        group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
     ) as ridpair
     where (ridpair.idDBLP = paperDBLP.id)
 ) as paperDBLPridpair
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.4.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.4.3.query.sqlpp
index dbde905..5f0f083 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.4.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.4.3.query.sqlpp
@@ -72,7 +72,7 @@
               sim as fuzzyjoin.`similarity-jaccard-prefix`(lenDBLP,tokensDBLP,lenCSX,tokensCSX,prefixTokenDBLP,0.500000f)
         where ((prefixTokenDBLP = prefixTokenCSX) and (sim >= 0.500000f))
         /* +hash */
-        group by idDBLP as idDBLP,idCSX as idCSX
+        group by idDBLP as idDBLP,idCSX as idCSX,sim as sim
     ) as ridpair
     where (ridpair.idDBLP = paperDBLP.id)
 ) as paperDBLPridpair
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr-2/gby-expr-2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr-2/gby-expr-2.3.query.sqlpp
index 5c6cc38..8e8ce59 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr-2/gby-expr-2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr-2/gby-expr-2.3.query.sqlpp
@@ -22,6 +22,6 @@
 FROM Employee e
     JOIN Incentive i ON e.job_category = i.job_category
     JOIN SuperStars s ON e.id = s.id
-GROUP BY substr(e.department_id, 1)
-SELECT substr(e.department_id, 1), SUM(e.salary + i.bonus);
+GROUP BY substr(e.department_id, 0)
+SELECT substr(e.department_id, 0), SUM(e.salary + i.bonus);
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr/gby-expr.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr/gby-expr.3.query.sqlpp
index c2d046d..eb6fa1d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr/gby-expr.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/gby-expr/gby-expr.3.query.sqlpp
@@ -22,6 +22,6 @@
 FROM Employee e
     JOIN Incentive i ON e.job_category = i.job_category
     JOIN SuperStars s ON e.id = s.id
-GROUP BY substr(e.department_id, 1)
-SELECT substr(e.department_id, 1) as deptId, SUM(e.salary + i.bonus) AS star_cost;
+GROUP BY substr(e.department_id, 0)
+SELECT substr(e.department_id, 0) as deptId, SUM(e.salary + i.bonus) AS star_cost;
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.sqlpp
index ec7ede9..233ea32 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.1.ddl.sqlpp
@@ -41,8 +41,10 @@
 
 create  dataset Tweets(TweetType) primary key id hints (`CARDINALITY`=`200`);
 
-create feed TweetFeed using localfs(
-(`path`=`asterix_nc1://data/twitter/obamatweets.adm`),
-(`format`=`adm`),
-(`type-name`=`TweetType`),
-(`tuple-interval`=`10`));
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+ "path" : "asterix_nc1://data/twitter/obamatweets.adm",
+ "format" : "adm",
+ "type-name" : "TweetType",
+ "tuple-interval" : "10"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.1.ddl.sqlpp
new file mode 100644
index 0000000..53c5a21
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.1.ddl.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.Emp as
+ closed {
+  id : bigint,
+  fname : string,
+  lname : string,
+  age : bigint,
+  dept : string
+};
+
+create  dataset employee(Emp) primary key id;
+
+create primary index sec_primary_idx on employee ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.2.update.sqlpp
new file mode 100644
index 0000000..a2b8188
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.2.update.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+
+load  dataset employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.query.sqlpp
new file mode 100644
index 0000000..5d47c41
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+select count(*) from employee;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.1.ddl.sqlpp
new file mode 100644
index 0000000..53c5a21
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.1.ddl.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.Emp as
+ closed {
+  id : bigint,
+  fname : string,
+  lname : string,
+  age : bigint,
+  dept : string
+};
+
+create  dataset employee(Emp) primary key id;
+
+create primary index sec_primary_idx on employee ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.2.update.sqlpp
new file mode 100644
index 0000000..a2b8188
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.2.update.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+
+load  dataset employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.query.sqlpp
new file mode 100644
index 0000000..f4c22c7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+select count(*) from employee e where e.id > 500;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.1.ddl.sqlpp
new file mode 100644
index 0000000..53c5a21
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.1.ddl.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.Emp as
+ closed {
+  id : bigint,
+  fname : string,
+  lname : string,
+  age : bigint,
+  dept : string
+};
+
+create  dataset employee(Emp) primary key id;
+
+create primary index sec_primary_idx on employee ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.2.update.sqlpp
new file mode 100644
index 0000000..a2b8188
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.2.update.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+
+load  dataset employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.query.sqlpp
new file mode 100644
index 0000000..8c55f86
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+select MAX(e.id) from employee e;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.1.ddl.sqlpp
new file mode 100644
index 0000000..53c5a21
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.1.ddl.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.Emp as
+ closed {
+  id : bigint,
+  fname : string,
+  lname : string,
+  age : bigint,
+  dept : string
+};
+
+create  dataset employee(Emp) primary key id;
+
+create primary index sec_primary_idx on employee ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.2.update.sqlpp
new file mode 100644
index 0000000..a2b8188
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.2.update.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+
+load  dataset employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.query.sqlpp
new file mode 100644
index 0000000..b86d634
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description     : Testing using the secondary primary index for aggregation
+ * Expected Result : Success
+ * Date            : Oct 31 2017
+ */
+
+use test;
+
+select count(e.id) from employee e;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.1.ddl.sqlpp
new file mode 100644
index 0000000..3795dbf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  field: int
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/duplicate-fields.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.2.query.sqlpp
new file mode 100644
index 0000000..4ffc750
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/duplicate-fields/duplicate-fields.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.field
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.1.ddl.sqlpp
new file mode 100644
index 0000000..3712040
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  field: int
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/malformed-json.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.2.query.sqlpp
new file mode 100644
index 0000000..4ffc750
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/malformed-json/malformed.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.field
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.1.ddl.sqlpp
new file mode 100644
index 0000000..9295261
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.1.ddl.sqlpp
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  missing_value: int,
+  null_value: int?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/null-missing.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-missing/nonoptional-missing.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.1.ddl.sqlpp
new file mode 100644
index 0000000..a6318f0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.1.ddl.sqlpp
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  missing_value: int?,
+  null_value: int
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/null-missing.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/nonoptional-null/nonoptional-null.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.1.ddl.sqlpp
new file mode 100644
index 0000000..8b2bebc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.1.ddl.sqlpp
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  missing_value: int?,
+  null_value: int?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/null-missing.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/null-missing/null-missing.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.1.ddl.sqlpp
new file mode 100644
index 0000000..cd5acce
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  double_value: bigint
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/double-150-11.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.2.query.sqlpp
new file mode 100644
index 0000000..d8f1d90
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-demote-double-bigint/double-bigint.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.double_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.1.ddl.sqlpp
new file mode 100644
index 0000000..28adba7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  double_value: float
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/double-150-11.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.2.query.sqlpp
new file mode 100644
index 0000000..d8f1d90
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-float/float.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.double_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.1.ddl.sqlpp
new file mode 100644
index 0000000..7219763
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: double
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.2.query.sqlpp
new file mode 100644
index 0000000..9dfbd18
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-promote-bigint-double/bigint-double.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.int_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.1.ddl.sqlpp
new file mode 100644
index 0000000..1d9cab0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: tinyint
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.2.query.sqlpp
new file mode 100644
index 0000000..9dfbd18
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint-overflow/tinyint-overflow.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.int_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.1.ddl.sqlpp
new file mode 100644
index 0000000..c5b198f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: tinyint
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-100.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.2.query.sqlpp
new file mode 100644
index 0000000..9dfbd18
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/numeric-tinyint/tinyint.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.int_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.1.ddl.sqlpp
new file mode 100644
index 0000000..f551ec9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  line_value: line
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/line-3-points.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-line-3-points/spatial-line-3-points.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.1.ddl.sqlpp
new file mode 100644
index 0000000..e17403a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  polygon_value: polygon
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/unclosed-polygon.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-unclosed/spatial-polygon-unclosed.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.1.ddl.sqlpp
new file mode 100644
index 0000000..56d829b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  polygon_with_hole: polygon
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/polygon-with-hole.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.2.query.sqlpp
new file mode 100644
index 0000000..44bfb0e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial-polygon-with-hole/spatial-polygon-with-hole.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.polygon_with_hole
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.1.ddl.sqlpp
new file mode 100644
index 0000000..5e5ec72
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.1.ddl.sqlpp
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  point_value: point,
+  line_value: line,
+  polygon_value: polygon
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/geometry.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/spatial/spatial.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.1.ddl.sqlpp
new file mode 100644
index 0000000..33c8b33
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.1.ddl.sqlpp
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  datefield:date,
+  dateFieldPlus: date,
+  timeField: time,
+  timeFieldPlus: time,
+  datetimeField: datetime,
+  datetimeFieldPlus: datetime
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/temporal.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/temporal/temporal.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.1.ddl.sqlpp
new file mode 100644
index 0000000..8913cad
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: string
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.2.query.sqlpp
new file mode 100644
index 0000000..9dfbd18
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/type-mismatch/type-mismatch.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j.int_value
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.1.ddl.sqlpp
new file mode 100644
index 0000000..9a117a7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.1.ddl.sqlpp
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  circle_value:circle?,
+  int_value:int
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-circle/unsupported-type-circle.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.1.ddl.sqlpp
new file mode 100644
index 0000000..76b0fae
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.1.ddl.sqlpp
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE NestedType AS
+{
+   duration_value: day_time_duration?
+};
+
+CREATE TYPE JsonType AS
+{
+   int_value:int,
+   nested_value: [NestedType]?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-daytimeduration/unsupported-type-daytimeduration.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.1.ddl.sqlpp
new file mode 100644
index 0000000..018b858
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.1.ddl.sqlpp
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE NestedType AS
+{
+   duration_value: duration?
+};
+
+CREATE TYPE JsonType AS
+{
+   int_value:int,
+   nested_value: [NestedType]?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-duration/unsupported-type-duration.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.1.ddl.sqlpp
new file mode 100644
index 0000000..b140ec6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.1.ddl.sqlpp
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE NestedType AS
+{
+   duration_value: interval?
+};
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  nested_value: [NestedType]?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-interval/unsupported-type-interval.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.1.ddl.sqlpp
new file mode 100644
index 0000000..aaa0488
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.1.ddl.sqlpp
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE NestedType AS
+{
+   int_value: int
+};
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  nested_value: {{NestedType}}?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-multiset/unsupported-type-multiset.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.1.ddl.sqlpp
new file mode 100644
index 0000000..b0bd7e2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.1.ddl.sqlpp
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  point_value: point3d?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-point3d/unsupported-type-point3d.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.1.ddl.sqlpp
new file mode 100644
index 0000000..159bc0c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.1.ddl.sqlpp
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+DROP DATAVERSE test IF EXISTS;
+CREATE DATAVERSE test;
+
+USE test;
+
+CREATE TYPE JsonType AS
+{
+  int_value: int,
+  rectangle_value: rectangle?
+};
+
+CREATE EXTERNAL DATASET Json(JsonType) USING localfs
+(
+   ("path"="asterix_nc1://data/json/int-1000.json"),
+   ("format"="json")
+)
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.2.query.sqlpp
new file mode 100644
index 0000000..8e43190
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/json-parser/unsupported-type-rectangle/unsupported-type-rectangle.2.query.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE test;
+
+SELECT VALUE j
+FROM Json as j;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.1.ddl.sqlpp
new file mode 100644
index 0000000..ca38c20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.1.ddl.sqlpp
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
+use test;
+
+
+create type test.LineItemType as
+ closed {
+  l_orderkey : bigint,
+  l_partkey : bigint,
+  l_suppkey : bigint,
+  l_linenumber : bigint,
+  l_quantity : double,
+  l_extendedprice : double,
+  l_discount : double,
+  l_tax : double,
+  l_returnflag : string,
+  l_linestatus : string,
+  l_shipdate : string,
+  l_commitdate : string,
+  l_receiptdate : string,
+  l_shipinstruct : string,
+  l_shipmode : string,
+  l_comment : string
+};
+
+create  dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
+
+create  index idx_partkey  on LineItem (l_partkey) type btree;
+
+create  primary index sec_primary_idx  on LineItem;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.2.update.sqlpp
new file mode 100644
index 0000000..546a831
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.2.update.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+
+load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.3.query.sqlpp
new file mode 100644
index 0000000..53af94f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.3.query.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+set `import-private-functions` `true`;
+select value count(*) from dataset_resources('Metadata','Dataset') dsr;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.4.query.sqlpp
new file mode 100644
index 0000000..33b4b33
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.4.query.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+set `import-private-functions` `true`;
+select value (( select value count(*) from dataset_resources('test','LineItem') resource )[0] > 2);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.5.query.sqlpp
new file mode 100644
index 0000000..b396dd4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dataset-resources/dataset-resources.5.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+set `import-private-functions` `true`;
+select value (( select value count(*) from storage_components('test','LineItem') resource )[0] > 2);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/identifier_01/identifier_01.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/identifier_01/identifier_01.1.query.sqlpp
new file mode 100644
index 0000000..17ad534
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/identifier_01/identifier_01.1.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+WITH _x as 1
+
+SELECT _x AS _y
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-971/query-ASTERIXDB-971.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-971/query-ASTERIXDB-971.3.query.sqlpp
index 6856726..cd1bcfc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-971/query-ASTERIXDB-971.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/query-ASTERIXDB-971/query-ASTERIXDB-971.3.query.sqlpp
@@ -23,4 +23,5 @@
 SELECT ELEMENT (
     WITH z AS (FROM Accounts AS y WHERE y.id=x SELECT VALUE y)
     SELECT x, z
-);
+)
+ORDER BY x;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
new file mode 100644
index 0000000..894837d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.1.store.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-- key=someKey
+select * from `Metadata`.`Index`;
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
new file mode 100644
index 0000000..d257e9c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/validate-expected/validate-expected.2.validate.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+-- key=someKey
+select * from `Metadata`.`Index`;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
index 38de0df..4254fb8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.DBLP
 select element {'nested':x}
-from  `test.DBLPtmp` as x
+from  `test`.`DBLPtmp` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
index 38de0df..4254fb8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
@@ -24,5 +24,5 @@
 
 insert into test.DBLP
 select element {'nested':x}
-from  `test.DBLPtmp` as x
+from  `test`.`DBLPtmp` as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
index 9e4b71b..22fbe26 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLP
 select element {'nested':x}
-from  `test.DBLPtmp` as x
+from  `test`.`DBLPtmp` as x
 where (x.id <= 50)
 ;
 insert into test.DBLP
 select element {'nested':{'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}}
-from  `test.DBLPtmp` as c
+from  `test`.`DBLPtmp` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/is/is.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/is/is.1.query.sqlpp
index 4c4a2fc..81f2a3f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/is/is.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/is/is.1.query.sqlpp
@@ -35,5 +35,11 @@
   "15": 1 is unknown,
   "16": null is not unknown,
   "17": missing is not unknown,
-  "18": 1 is not unknown
+  "18": 1 is not unknown,
+  "19": null is valued,
+  "20": missing is valued,
+  "21": 1 is valued,
+  "22": null is not valued,
+  "23": missing is not valued,
+  "24": 1 is not valued
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/substr/substr.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/substr/substr.1.query.sqlpp
index d6bb472..10e525f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/substr/substr.1.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/null-missing/substr/substr.1.query.sqlpp
@@ -18,24 +18,24 @@
  */
 
 {
-  'a': SUBSTR(null, 1),
+  'a': SUBSTR(null, 0),
   'b': SUBSTR('abc', null),
   'c': SUBSTR(null, null),
-  'd': SUBSTR(null, 1, 2),
+  'd': SUBSTR(null, 0, 2),
   'e': substr('abc', null, 2),
-  'f': SUBSTR('abc', 1, null),
+  'f': SUBSTR('abc', 0, null),
   'g': SUBSTR(null, null, 2),
-  'h': substr(null, 1, null),
+  'h': substr(null, 0, null),
   'i': SUBSTR(null, null, null),
   'j': SUBSTR('abc', null, null),
-  'k': SUBSTR(missing, 1),
+  'k': SUBSTR(missing, 0),
   'l': SUBSTR('abc', missing),
   'm': SUBSTR(missing, missing),
-  'o': SUBSTR(missing, 1, 2),
+  'o': SUBSTR(missing, 0, 2),
   'p': substr('abc', missing, 2),
-  'q': SUBSTR('abc', 1, missing),
+  'q': SUBSTR('abc', 0, missing),
   'r': SUBSTR(missing, missing, 2),
-  's': substr(missing, 1, missing),
+  's': substr(missing, 0, missing),
   't': SUBSTR(missing, missing, missing),
   'u': SUBSTR('abc', missing, missing),
   'v': SUBSTR(null, missing, missing),
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.2.update.sqlpp
index 186141e..2b9803a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
index e8c0c5c..f2ae1e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLP
 select element x
-from  `test.DBLPtmp` as x
+from  `test`.`DBLPtmp` as x
 where (x.id <= 50)
 ;
 insert into test.DBLP
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLPtmp` as c
+from  `test`.`DBLPtmp` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.2.update.sqlpp
index 1697d8e..afab2e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'title':c.title,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
index e8c0c5c..f2ae1e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLP
 select element x
-from  `test.DBLPtmp` as x
+from  `test`.`DBLPtmp` as x
 where (x.id <= 50)
 ;
 insert into test.DBLP
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLPtmp` as c
+from  `test`.`DBLPtmp` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.2.update.sqlpp
index 1697d8e..afab2e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'title':c.title,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.2.update.sqlpp
index 186141e..2b9803a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.2.update.sqlpp
index 186141e..2b9803a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.2.update.sqlpp
index 186141e..2b9803a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.DBLPOpen
 select element x
-from  `test.DBLP` as x
+from  `test`.`DBLP` as x
 where (x.id <= 50)
 ;
 insert into test.DBLPOpen
 select element {'id':c.id,'dblpid':c.dblpid,'authors':c.authors,'misc':c.misc}
-from  `test.DBLP` as c
+from  `test`.`DBLP` as c
 where (c.id > 50)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/range-search/range-search.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/range-search/range-search.2.update.sqlpp
index ebc33fd..6c19a35 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/range-search/range-search.2.update.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-enforced/index-selection/range-search/range-search.2.update.sqlpp
@@ -24,11 +24,11 @@
 
 insert into test.LineItemOpen
 select element x
-from  `test.LineItem` as x
+from  `test`.`LineItem` as x
 where (x.l_orderkey < 3000)
 ;
 insert into test.LineItemOpen
 select element {'l_orderkey':x.l_orderkey,'l_partkey':x.l_partkey,'l_linenumber':x.l_linenumber,'l_quantity':x.l_quantity,'l_extendedprice':x.l_extendedprice,'l_discount':x.l_discount,'l_tax':x.l_tax,'l_returnflag':x.l_returnflag,'l_linestatus':x.l_linestatus,'l_shipdate':x.l_shipdate,'l_commitdate':x.l_commitdate,'l_receiptdate':x.l_receiptdate,'l_shipinstruct':x.l_shipinstruct,'l_shipmode':x.l_shipmode,'l_comment':x.l_comment}
-from  `test.LineItem` as x
+from  `test`.`LineItem` as x
 where (x.l_orderkey >= 3000)
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp
index caa7ca4..b42d017 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/open-index-non-enforced/correlated-index-selection/btree-index-01/btree-index-01.1.ddl.sqlpp
@@ -31,5 +31,9 @@
 
 create dataset TestOpen(TestOpenType)
 primary key c_id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`="16384"),(`max-tolerance-component-count`="3"));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.13.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.13.query.sqlpp
index f63fc2e..a30c374 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.13.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.13.query.sqlpp
@@ -25,11 +25,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM tpch2.Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM tpch2.Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.3.query.sqlpp
index f63fc2e..a30c374 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.3.query.sqlpp
@@ -25,11 +25,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM tpch2.Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM tpch2.Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.7.query.sqlpp
index f63fc2e..a30c374 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.7.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/all_datasets/all_datasets.7.query.sqlpp
@@ -25,11 +25,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM tpch2.Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM tpch2.Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.13.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.13.query.sqlpp
index 77667ab..ce9e993 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.13.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.13.query.sqlpp
@@ -26,11 +26,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.3.query.sqlpp
index 77667ab..ce9e993 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.3.query.sqlpp
@@ -26,11 +26,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.7.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.7.query.sqlpp
index 77667ab..ce9e993 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.7.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/rebalance/single_dataverse/single_dataverse.7.query.sqlpp
@@ -26,11 +26,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(*) AS count
-FROM Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
-ORDER BY o_orderpriority
+SELECT o.o_orderpriority AS order_priority, count(*) AS count
+FROM Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
+ORDER BY o.o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.1.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.2.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.2.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/add_replica/add_replica.2.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.1.sto.cmd
new file mode 100644
index 0000000..1947749
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /addReplica 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.10.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.10.post.http
new file mode 100644
index 0000000..a3ea801
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.10.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=3&node=asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.11.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.11.pollget.http
new file mode 100644
index 0000000..32e2f78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.11.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.12.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.12.query.sqlpp
new file mode 100644
index 0000000..cd777cf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.12.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use tpch;
+
+select value count(*) from LineItem;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.13.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.13.sto.cmd
new file mode 100644
index 0000000..1e192f4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.13.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /removeReplica 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.14.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.14.sto.cmd
new file mode 100644
index 0000000..530432f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.14.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /removeReplica 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.2.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.2.sto.cmd
new file mode 100644
index 0000000..f3810f8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.2.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /addReplica 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.3.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.3.pollget.http
new file mode 100644
index 0000000..4ea16d7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.3.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc2 /admin/storage/partition/2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.4.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.4.pollget.http
new file mode 100644
index 0000000..22558bc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.4.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc2 /admin/storage/partition/3
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.5.ddl.sqlpp
new file mode 100644
index 0000000..071a40f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.5.ddl.sqlpp
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse tpch if exists;
+create  dataverse tpch;
+
+use tpch;
+
+create type tpch.LineItemType as
+ closed {
+  l_orderkey : bigint,
+  l_partkey : bigint,
+  l_suppkey : bigint,
+  l_linenumber : bigint,
+  l_quantity : double,
+  l_extendedprice : double,
+  l_discount : double,
+  l_tax : double,
+  l_returnflag : string,
+  l_linestatus : string,
+  l_shipdate : string,
+  l_commitdate : string,
+  l_receiptdate : string,
+  l_shipinstruct : string,
+  l_shipmode : string,
+  l_comment : string
+};
+
+create dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.6.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.6.update.sqlpp
new file mode 100644
index 0000000..e53f462
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.6.update.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use tpch;
+
+load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),
+      (`format`=`delimited-text`),(`delimiter`=`|`));
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.7.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.7.sto.cmd
new file mode 100644
index 0000000..389cf68
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.7.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /promote 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.8.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.8.sto.cmd
new file mode 100644
index 0000000..257f26a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.8.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /promote 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.9.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.9.post.http
new file mode 100644
index 0000000..36e1d00
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/bulkload/bulkload.9.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=2&node=asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.1.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.10.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.10.sto.cmd
new file mode 100644
index 0000000..71621ac
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.10.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /removeReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.2.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.2.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.2.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.3.ddl.sqlpp
new file mode 100644
index 0000000..15bc3c5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.3.ddl.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE TYPE MyType AS {
+  id : int
+};
+
+CREATE DATASET ds_1(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.4.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.4.get.http
new file mode 100644
index 0000000..09ddf42
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.4.get.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/connector?dataverseName=Metadata&datasetName=Dataset
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.5.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.5.sto.cmd
new file mode 100644
index 0000000..a5753f0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.5.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /promote 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.6.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.6.post.http
new file mode 100644
index 0000000..2e8fc63
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.6.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=0&node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.7.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.7.post.http
new file mode 100644
index 0000000..e8dca0b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.7.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/metadataNode?node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.8.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.8.pollget.http
new file mode 100644
index 0000000..32e2f78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.8.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.9.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.9.query.sqlpp
new file mode 100644
index 0000000..a612cbb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/flushed_component/flushed_component.9.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+SELECT value count(*)
+FROM Metadata.`Dataset`
+WHERE DatasetName = 'ds_1';
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.1.sto.cmd
new file mode 100644
index 0000000..1947749
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /addReplica 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.10.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.10.post.http
new file mode 100644
index 0000000..a3ea801
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.10.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=3&node=asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.11.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.11.pollget.http
new file mode 100644
index 0000000..32e2f78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.11.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.12.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.12.query.sqlpp
new file mode 100644
index 0000000..4951292
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.12.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use tpch;
+
+select value count(*) from InMemoryLineItem;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.13.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.13.sto.cmd
new file mode 100644
index 0000000..1e192f4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.13.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /removeReplica 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.14.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.14.sto.cmd
new file mode 100644
index 0000000..530432f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.14.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /removeReplica 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.2.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.2.sto.cmd
new file mode 100644
index 0000000..f3810f8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.2.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /addReplica 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.3.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.3.pollget.http
new file mode 100644
index 0000000..4ea16d7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.3.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc2 /admin/storage/partition/2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.4.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.4.pollget.http
new file mode 100644
index 0000000..22558bc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.4.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc2 /admin/storage/partition/3
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.5.ddl.sqlpp
new file mode 100644
index 0000000..4dbf9e3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.5.ddl.sqlpp
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop  dataverse tpch if exists;
+create  dataverse tpch;
+
+use tpch;
+
+create type tpch.LineItemType as
+ closed {
+  l_orderkey : bigint,
+  l_partkey : bigint,
+  l_suppkey : bigint,
+  l_linenumber : bigint,
+  l_quantity : double,
+  l_extendedprice : double,
+  l_discount : double,
+  l_tax : double,
+  l_returnflag : string,
+  l_linestatus : string,
+  l_shipdate : string,
+  l_commitdate : string,
+  l_receiptdate : string,
+  l_shipinstruct : string,
+  l_shipmode : string,
+  l_comment : string
+};
+
+create dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
+create dataset InMemoryLineItem(LineItemType) primary key l_orderkey,l_linenumber;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.6.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.6.update.sqlpp
new file mode 100644
index 0000000..8962e6d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.6.update.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use tpch;
+
+load dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),
+      (`format`=`delimited-text`),(`delimiter`=`|`));
+
+insert into InMemoryLineItem (select value ls from LineItem ls);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.7.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.7.sto.cmd
new file mode 100644
index 0000000..389cf68
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.7.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /promote 2 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.8.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.8.sto.cmd
new file mode 100644
index 0000000..257f26a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.8.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /promote 3 asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.9.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.9.post.http
new file mode 100644
index 0000000..36e1d00
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/mem_component_recovery/mem_component_recovery.9.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=2&node=asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.1.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.10.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.10.ddl.sqlpp
new file mode 100644
index 0000000..f96d5a8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.10.ddl.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE DATASET ds_2(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.11.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.11.query.sqlpp
new file mode 100644
index 0000000..555954d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.11.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+SELECT value count(*)
+FROM Metadata.`Dataset`
+WHERE DatasetName = 'ds_2';
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.12.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.12.sto.cmd
new file mode 100644
index 0000000..71621ac
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.12.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /removeReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.2.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.2.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.2.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.3.ddl.sqlpp
new file mode 100644
index 0000000..15bc3c5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.3.ddl.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE TYPE MyType AS {
+  id : int
+};
+
+CREATE DATASET ds_1(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.4.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.4.sto.cmd
new file mode 100644
index 0000000..a5753f0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.4.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /promote 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.5.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.5.get.http
new file mode 100644
index 0000000..4a53aed
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.5.get.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc2 /admin/storage
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.6.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.6.post.http
new file mode 100644
index 0000000..2e8fc63
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.6.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=0&node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.7.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.7.post.http
new file mode 100644
index 0000000..e8dca0b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.7.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/metadataNode?node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.8.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.8.pollget.http
new file mode 100644
index 0000000..32e2f78
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.8.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.9.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.9.query.sqlpp
new file mode 100644
index 0000000..a612cbb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/metadata_failover/metadata_failover.9.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+SELECT value count(*)
+FROM Metadata.`Dataset`
+WHERE DatasetName = 'ds_1';
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.1.sto.cmd b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.1.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.2.pollget.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.2.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.2.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.3.post.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.3.post.http
new file mode 100644
index 0000000..bb942d8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.3.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /admin/storage/release?partition=0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.4.get.http b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.4.get.http
new file mode 100644
index 0000000..d5cf952
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/replication/release_partition/release_partition.4.get.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/conflict-fields-dataset/conflict-fields-dataset.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/conflict-fields-dataset/conflict-fields-dataset.3.query.sqlpp
index 2645ddc..6560931 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/conflict-fields-dataset/conflict-fields-dataset.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/conflict-fields-dataset/conflict-fields-dataset.3.query.sqlpp
@@ -21,4 +21,5 @@
 
 select *
 from samptable s1, samptable s2
-where samptable > 0;
+where samptable > 0
+order by s1.id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.1.ddl.sqlpp
new file mode 100644
index 0000000..54c7089
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.1.ddl.sqlpp
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+
+use experiments;
+
+create type TwitterUser if not exists as open
+{ screen_name: string, friends_count: int32, name: string, followers_count: int32 }
+;
+
+create dataset TwitterUsers(TwitterUser) primary key screen_name;
+
+create function test_func0()
+{ (select * from TwitterUsers order by screen_name) }
+;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.2.update.sqlpp
new file mode 100644
index 0000000..3e3ab9e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.2.update.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use experiments;
+
+insert into TwitterUsers ({'screen_name': 'john_01', 'friends_count': 1, 'name': 'John', 'followers_count': 2 });
+insert into TwitterUsers ({'screen_name': 'marry_02', 'friends_count': 4, 'name': 'Marry', 'followers_count': 5 });
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.3.query.sqlpp
new file mode 100644
index 0000000..e1ceff4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.3.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use experiments;
+
+test_func0();
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.4.ddl.sqlpp
new file mode 100644
index 0000000..a5ccfb2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.4.ddl.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop dataverse two if exists;
+create dataverse two;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.5.query.sqlpp
new file mode 100644
index 0000000..58572e8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/function_dataverse/function_dataverse.5.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use two;
+
+experiments.test_func0();
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.1.ddl.sqlpp
new file mode 100644
index 0000000..71e62d6
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.1.ddl.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type orderType as {
+  oid: bigint
+};
+
+create dataset orders(orderType) primary key oid;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.2.update.sqlpp
new file mode 100644
index 0000000..4ec4dfb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.2.update.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into orders ({'oid' : 100, 'pid': 0,  'amount': 1});
+insert into orders ({'oid' : 101, 'pid': 1,  'amount': 2});
+insert into orders ({'oid' : 102, 'pid': 2,  'amount': 3});
+insert into orders ({'oid' : 103, 'pid': 1,  'amount': 4});
+insert into orders ({'oid' : 104, 'pid': 0,  'amount': 6});
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.query.sqlpp
new file mode 100644
index 0000000..323a0e3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select pid, sum(amount) as s, (select value g from g order by g.ord.oid) as g
+from orders o
+group by pid group as g(o as ord)
+order by pid
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.1.ddl.sqlpp
new file mode 100644
index 0000000..c577bea
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.1.ddl.sqlpp
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type partType as {
+  pid: bigint
+};
+
+create type orderType as {
+  oid: bigint,
+  pid: bigint
+};
+
+create dataset parts(partType) primary key pid;
+
+create dataset orders(orderType) primary key oid;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.2.update.sqlpp
new file mode 100644
index 0000000..3e5e1d1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.2.update.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into parts ({'pid': 0});
+insert into parts ({'pid': 1});
+
+insert into orders ({'oid' : 100, 'pid': 0});
+insert into orders ({'oid' : 101, 'pid': 1});
+insert into orders ({'oid' : 102, 'pid': 99});
+insert into orders ({'oid' : 103, 'pid': 1});
+insert into orders ({'oid' : 104, 'pid': 0});
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.3.query.sqlpp
new file mode 100644
index 0000000..01ed3a5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/resolution/order_1/order_1.3.query.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select value oid from orders
+where pid in (select value pid from parts)
+order by oid
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/from/from.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/from/from.3.query.sqlpp
index 53fb0cf..cf61511 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/from/from.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/from/from.3.query.sqlpp
@@ -24,9 +24,9 @@
 FROM  Customer c,
       Orders o,
       LineItem l
-WHERE c_mktsegment = 'BUILDING' AND c_custkey = o_custkey
-      AND l_orderkey = o_orderkey AND o_orderdate < '1995-03-15'
-      AND l_shipdate > '1995-03-15'
-ORDER BY l_linenumber, l_orderkey
+WHERE c.c_mktsegment = 'BUILDING' AND c.c_custkey = o.o_custkey
+      AND l.l_orderkey = o.o_orderkey AND o.o_orderdate < '1995-03-15'
+      AND l.l_shipdate > '1995-03-15'
+ORDER BY l.l_linenumber, l.l_orderkey
 LIMIT 3;
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/join/join.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/join/join.3.query.sqlpp
index 5eeee7c..00f37cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/join/join.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/join/join.3.query.sqlpp
@@ -22,11 +22,11 @@
 
 SELECT *
 FROM  Customer c
-JOIN  Orders o ON c_custkey = o_custkey
-JOIN  LineItem l ON l_orderkey = o_orderkey
-WHERE c_mktsegment = 'BUILDING'
-      AND o_orderdate < '1995-03-15'
-      AND l_shipdate > '1995-03-15'
-ORDER BY l_linenumber, l_orderkey
+JOIN  Orders o ON c.c_custkey = o.o_custkey
+JOIN  LineItem l ON l.l_orderkey = o.o_orderkey
+WHERE c.c_mktsegment = 'BUILDING'
+      AND o.o_orderdate < '1995-03-15'
+      AND l.l_shipdate > '1995-03-15'
+ORDER BY l.l_linenumber, l.l_orderkey
 LIMIT 3;
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/mixed/mixed.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/mixed/mixed.3.query.sqlpp
index 95ac04e..188401b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/mixed/mixed.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/mixed/mixed.3.query.sqlpp
@@ -20,13 +20,13 @@
 USE tpch;
 
 
-SELECT  c_custkey, *, o_orderkey
+SELECT  c.c_custkey, *, o.o_orderkey
 FROM  Customer c,
       Orders o,
       LineItem l
-WHERE c_mktsegment = 'BUILDING' AND c_custkey = o_custkey
-      AND l_orderkey = o_orderkey AND o_orderdate < '1995-03-15'
-      AND l_shipdate > '1995-03-15'
-ORDER BY l_linenumber, l_orderkey
+WHERE c.c_mktsegment = 'BUILDING' AND c.c_custkey = o.o_custkey
+      AND l.l_orderkey = o.o_orderkey AND o.o_orderdate < '1995-03-15'
+      AND l.l_shipdate > '1995-03-15'
+ORDER BY l.l_linenumber, l.l_orderkey
 LIMIT 3;
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/no_star/no_star.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/no_star/no_star.3.query.sqlpp
index 14ae8d1..16e0471 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/no_star/no_star.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/select-star/no_star/no_star.3.query.sqlpp
@@ -24,9 +24,9 @@
 FROM  Customer c,
       Orders o,
       LineItem l
-WHERE c_mktsegment = 'BUILDING' AND c_custkey = o_custkey
-      AND l_orderkey = o_orderkey AND o_orderdate < '1995-03-15'
-      AND l_shipdate > '1995-03-15'
-ORDER BY l_linenumber, l_orderkey
+WHERE c.c_mktsegment = 'BUILDING' AND c.c_custkey = o.o_custkey
+      AND l.l_orderkey = o.o_orderkey AND o.o_orderdate < '1995-03-15'
+      AND l.l_shipdate > '1995-03-15'
+ORDER BY l.l_linenumber, l.l_orderkey
 LIMIT 3;
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp
index 3fa0247..b9c79d0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr01/substr01.3.query.sqlpp
@@ -23,4 +23,4 @@
  * Date           : 18th April 2012
  */
 
-{'str2':substring('Hello World',10),'str4':substring('This is a test string',21),'str6':substring('This is a test string',22),'str8':substring('This is a test string',0),'str10':substring('This is a test string',-1),'str13':substring(`string-concat`(['This is a test string','This is a another test string']),21),'str14':substring('UC Irvine',(`string-length`('UC Irvine') / 2))};
+{'str2':substring('Hello World',9),'str4':substring('This is a test string',20),'str6':substring('This is a test string',21),'str8':substring('This is a test string',0),'str10':substring('This is a test string',-1),'str13':substring(`string-concat`(['This is a test string','This is a another test string']),20),'str14':substring('UC Irvine',(`string-length`('UC Irvine') / 2 - 1))};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr04/substr04.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr04/substr04.3.query.sqlpp
index a088506..860173e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr04/substr04.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr04/substr04.3.query.sqlpp
@@ -24,5 +24,5 @@
  */
 
 select element a
-from  [substring('hello world',7,5),substring('hello world',1,11),substring('hello world',3,9),substring('ABCD',3,2),substring('ABCD',1,4),substring('UC Irvine',4,(`string-length`('UC Irvine') - 3)),substring('UC Irvine',1,`string-length`('UC Irvine')),substring(substring('UC Irvine',4),1,`string-length`('Irvine'))] as a
+from  [substring('hello world',6,5),substring('hello world',0,11),substring('hello world',2,9),substring('ABCD',2,2),substring('ABCD',0,4),substring('UC Irvine',3,(`string-length`('UC Irvine') - 3)),substring('UC Irvine',0,`string-length`('UC Irvine')),substring(substring('UC Irvine',3),0,`string-length`('Irvine'))] as a
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr05/substr05.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr05/substr05.3.query.sqlpp
index 2bfa797..9926926 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr05/substr05.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr05/substr05.3.query.sqlpp
@@ -26,7 +26,7 @@
 use test;
 
 
-select element test.substring(a.name,4,(test.`string-length`(a.name) - 3))
+select element test.substring(a.name,3,(test.`string-length`(a.name) - 3))
 from  testdst as a
 order by a.name
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr06/substr06.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr06/substr06.3.query.sqlpp
index 991a911..dfd8ebb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr06/substr06.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substr06/substr06.3.query.sqlpp
@@ -25,7 +25,7 @@
 use test;
 
 
-select element test.substring(a.name,4)
+select element test.substring(a.name,3)
 from  testdst as a
 order by a.name
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-1/substring2-1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-1/substring2-1.3.query.sqlpp
index 27ff9ae..fa3b8af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-1/substring2-1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-1/substring2-1.3.query.sqlpp
@@ -20,4 +20,4 @@
 use test;
 
 
-{'result1':test.substring('HEllow',2)};
+{'result1':test.substring('HEllow',1)};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-3/substring2-3.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-3/substring2-3.3.query.sqlpp
index eee0126c..9f1fbc6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-3/substring2-3.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring2-3/substring2-3.3.query.sqlpp
@@ -20,4 +20,4 @@
 use test;
 
 
-{'result1':test.substring('HEllow',10)};
+{'result1':test.substring('HEllow',9)};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring_01/substring_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring_01/substring_01.3.query.sqlpp
index 40a6960..1ad0a0f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring_01/substring_01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/substring_01/substring_01.3.query.sqlpp
@@ -20,6 +20,6 @@
 use test;
 
 
-select element test.substring(x,2,3)
+select element test.substring(x,1,3)
 from  ['foobar'] as x
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary/findbinary.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary/findbinary.1.query.sqlpp
new file mode 100644
index 0000000..073220f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary/findbinary.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    find_binary(hex('aabbccddeeffaabbccddeeff'),hex('aabb'),-1),
+    find_binary(hex('aabbccddeeffaabbccddeeff'),hex('aabb'),0),
+    find_binary(hex('aabbccddeeffaabbccddeeff'),hex('aabb'),1),
+    find_binary(hex('aabbccddeeffaabbccddeeff'),hex('aabb'),2),
+    find_binary(hex('aabbccddeeffaabbccddeeff'),hex('1122'))
+]
+;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary2/findbinary2.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary2/findbinary2.1.query.sqlpp
new file mode 100644
index 0000000..7ea703e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/findbinary2/findbinary2.1.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    find_binary(hex('aabbccddeeff'),hex('aabb')),
+    find_binary(hex('aabbccddeeff'),hex('ccdd')),
+    find_binary(hex('aabbccddeeff'),hex('1122'))
+]
+;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/position/position.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/position/position.1.query.sqlpp
new file mode 100644
index 0000000..8f321c4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/position/position.1.query.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    position('abcdefg','ab'),
+    position('abcdefg','de'),
+    position('abc', 'de')
+]
+;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position/regexp_position.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position/regexp_position.1.query.sqlpp
new file mode 100644
index 0000000..7a27b2f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position/regexp_position.1.query.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+  REGEXP_POSITION('mnop','.'),
+  REGEXP_POSITION('mnop','p'),
+  REGEXP_POSITION('abcdefABCDEF','/d')
+]
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp
new file mode 100644
index 0000000..ac47eb9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+  REGEXP_POSITION('mnop','.','x'),
+  REGEXP_POSITION('mnop','p','x'),
+  REGEXP_POSITION('abcdefABCDEF','/d','x')
+]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary/subbinary.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary/subbinary.1.query.sqlpp
new file mode 100644
index 0000000..6989cf7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary/subbinary.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    print_binary(sub_binary(hex('aabbccddeeff'),-1,2), "hex"),
+    print_binary(sub_binary(hex('aabbccddeeff'),0,2), "hex"),
+    print_binary(sub_binary(hex('aabbccddeeff'),1,2), "hex"),
+    print_binary(sub_binary(hex('aabbccddeeff'),2,2), "hex"),
+    print_binary(sub_binary(hex('aabbccddeeff'),3,2), "hex")
+]
+;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary2/subbinary2.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary2/subbinary2.1.query.sqlpp
new file mode 100644
index 0000000..075f803
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/subbinary2/subbinary2.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    print_binary(sub_binary(hex('aabbccddeeff'),-1), 'hex'),
+    print_binary(sub_binary(hex('aabbccddeeff'),0), 'hex'),
+    print_binary(sub_binary(hex('aabbccddeeff'),1), 'hex'),
+    print_binary(sub_binary(hex('aabbccddeeff'),2), 'hex'),
+    print_binary(sub_binary(hex('aabbccddeeff'),3), 'hex')
+]
+;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring/substring.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring/substring.1.query.sqlpp
new file mode 100644
index 0000000..1c35e7f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring/substring.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    substring('abcdefg',-1,2),
+    substring('abcdefg',0,2),
+    substring('abcdefg',1,2),
+    substring('abcdefg',2,2),
+    substring('abcdefg',3,2)
+]
+;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring2/substring2.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring2/substring2.1.query.sqlpp
new file mode 100644
index 0000000..65d10b5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/stringoffset/substring2/substring2.1.query.sqlpp
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* String offset is set to 1 */
+
+select value [
+    substring('abcdefg',-1),
+    substring('abcdefg',0),
+    substring('abcdefg',1),
+    substring('abcdefg',2),
+    substring('abcdefg',3)
+]
+;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/exists/exists.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/exists/exists.3.query.sqlpp
index e7328f3..cdaad5e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/exists/exists.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/exists/exists.3.query.sqlpp
@@ -21,7 +21,7 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, substring(c_phone,1,2) AS cntrycode
+    SELECT c_acctbal, c_custkey, substring(c_phone,0,2) AS cntrycode
     FROM  Customer
 ),
 avg AS (
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.1.ddl.sqlpp
new file mode 100644
index 0000000..c1ce4a3
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.1.ddl.sqlpp
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use test;
+
+create type TType as open
+{ id: bigint };
+
+create dataset TData (TType) primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.2.update.sqlpp
new file mode 100644
index 0000000..3ce9554
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.2.update.sqlpp
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+insert into TData ( [
+{'id':1, 'x':1, 'f':19},
+{'id':2, 'x':2, 'f':12},
+{'id':3, 'x':1, 'f':10},
+{'id':4, 'x':2, 'f':17},
+{'id':5, 'x':1, 'f':12}
+]);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.3.query.sqlpp
new file mode 100644
index 0000000..b825157
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/non_unary_subplan_01/non_unary_subplan_01.3.query.sqlpp
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use test;
+
+select x,
+array_sum((
+   select value a.f
+   from g as p
+   union all
+   select value a.f
+   from g as w
+)) s
+from TData as a
+group by a.x as x group as g
+order by x
+;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/not_exists/not_exists.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/not_exists/not_exists.3.query.sqlpp
index c47aad3..53d2a68 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/not_exists/not_exists.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/not_exists/not_exists.3.query.sqlpp
@@ -21,7 +21,7 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, substring(c_phone,1,2) AS cntrycode
+    SELECT c_acctbal, c_custkey, substring(c_phone,0,2) AS cntrycode
     FROM  Customer
 )
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.sqlpp
deleted file mode 100644
index 016b37e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.LineItemType as
- closed {
-  l_orderkey : bigint,
-  l_partkey : bigint,
-  l_suppkey : bigint,
-  l_linenumber : bigint,
-  l_quantity : bigint,
-  l_extendedprice : double,
-  l_discount : double,
-  l_tax : double,
-  l_returnflag : string,
-  l_linestatus : string,
-  l_shipdate : string,
-  l_commitdate : string,
-  l_receiptdate : string,
-  l_shipinstruct : string,
-  l_shipmode : string,
-  l_comment : string
-};
-
-create temporary dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.sqlpp
deleted file mode 100644
index 5ebf862..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.update.sqlpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.sqlpp
deleted file mode 100644
index 55f14eb..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ddl.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-create  index idx_LineItem_partkey  on LineItem (l_linenumber) type btree;
-
-create  index idx_LineItem_suppkey  on LineItem (l_suppkey) type btree;
-
-create  primary index sec_primary_idx  on LineItem;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.sqlpp
deleted file mode 100644
index 71a5f53..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.update.sqlpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-delete from LineItem
- where l_suppkey >= 2 or l_linenumber > 1;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.sqlpp
deleted file mode 100644
index dff3496..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.query.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset with indexes.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-select element c
-from  LineItem as c
-where (c.l_suppkey < 150)
-order by c.l_orderkey,c.l_linenumber
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.sqlpp
deleted file mode 100644
index 617f5c9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ddl.sqlpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.LineItemType as
- closed {
-  l_orderkey : bigint,
-  l_partkey : bigint,
-  l_suppkey : bigint,
-  l_linenumber : bigint,
-  l_quantity : bigint,
-  l_extendedprice : double,
-  l_discount : double,
-  l_tax : double,
-  l_returnflag : string,
-  l_linestatus : string,
-  l_shipdate : string,
-  l_commitdate : string,
-  l_receiptdate : string,
-  l_shipinstruct : string,
-  l_shipmode : string,
-  l_comment : string
-};
-
-create temporary dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.sqlpp
deleted file mode 100644
index eb0f76e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
-delete from LineItem
- where l_orderkey >= 10;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.sqlpp
deleted file mode 100644
index aa13cc7..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.query.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete a portion of data from a loaded temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-select element c
-from  LineItem as c
-order by c.l_orderkey,c.l_linenumber
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.sqlpp
deleted file mode 100644
index 4ca67fe..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ddl.sqlpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.Name as
-{
-  first : string,
-  last : string
-};
-
-create type test.Person as
-{
-  name : Name
-};
-
-create type test.TestType as
-{
-  id : integer,
-  name : string,
-  locn : point,
-  zip : string,
-  person : Person
-};
-
-create temporary dataset t1(TestType) primary key id;
-
-create  index rtree_index_point  on t1 (locn) type rtree;
-
-create  index rtree_index_point_open  on t1 (open_locn:point?) type rtree enforced;
-
-create  index keyWD_indx  on t1 (name) type keyword;
-
-create  index keyWD_indx_open  on t1 (nickname:string?) type keyword enforced;
-
-create  index secndIndx  on t1 (zip) type btree;
-
-create  index nested  on t1 (person.name.first) type btree;
-
-create  index secndIndx_open  on t1 (address:string?) type btree enforced;
-
-create  primary index sec_primary_idx on t1;
-
-drop index t1.rtree_index_point;
-drop index t1.rtree_index_point_open;
-drop index t1.keyWD_indx;
-drop index t1.keyWD_indx_open;
-drop index t1.secndIndx;
-drop index t1.nested;
-drop index t1.secndIndx_open;
-drop index t1.sec_primary_idx;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.sqlpp
deleted file mode 100644
index ebe3e6a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.update.sqlpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp
deleted file mode 100644
index 78e103b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.query.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop empty secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-select element l
-from  `Metadata.Index` as l
-where ((l.IsPrimary = false) and (l.DataverseName = 'test'))
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.1.ddl.sqlpp
deleted file mode 100644
index 00e7e20..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.Schema as
- closed {
-  unique1 : bigint,
-  unique2 : bigint,
-  two : bigint,
-  four : bigint,
-  ten : bigint,
-  twenty : bigint,
-  onePercent : bigint,
-  tenPercent : bigint,
-  twentyPercent : bigint,
-  fiftyPercent : bigint,
-  unique3 : bigint,
-  evenOnePercent : bigint,
-  oddOnePercent : bigint,
-  stringu1 : string,
-  stringu2 : string,
-  string4 : string
-};
-
-create temporary dataset t1(Schema) primary key unique2;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.2.update.sqlpp
deleted file mode 100644
index 23906a4..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.2.update.sqlpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-load  dataset t1 using localfs ((`path`=`asterix_nc1://data/wisc/onektup.adm`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.3.ddl.sqlpp
deleted file mode 100644
index f01f959..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.3.ddl.sqlpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-create  index idx_t1_str1  on t1 (stringu1) type btree;
-
-create  index idx_t1_unique1  on t1 (unique1) type btree;
-
-create  primary index sec_primary_idx  on t1;
-
-drop index t1.idx_t1_str1;
-drop index t1.idx_t1_unique1;
-drop index t1.sec_primary_idx;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.4.query.sqlpp
deleted file mode 100644
index 0950324..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/drop-index/drop-index.4.query.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Drop secondary indexes for a temporary dataset.
- * Expected Result : Success
- * Date            : 27th March 2015
- *
- */
-
-use test;
-
-
-select element a
-from  t1 as a
-where ((a.unique1 > 10) and (a.stringu1 = 'DGAAAAXXXXXXXXXXXXXXXXXXX'))
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.sqlpp
deleted file mode 100644
index 2b169dd..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.LineItemType as
- closed {
-  l_orderkey : bigint,
-  l_partkey : bigint,
-  l_suppkey : bigint,
-  l_linenumber : bigint,
-  l_quantity : double,
-  l_extendedprice : double,
-  l_discount : double,
-  l_tax : double,
-  l_returnflag : string,
-  l_linestatus : string,
-  l_shipdate : string,
-  l_commitdate : string,
-  l_receiptdate : string,
-  l_shipinstruct : string,
-  l_shipmode : string,
-  l_comment : string
-};
-
-create temporary dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
-
-create  index part_index  on LineItem (l_partkey) type btree;
-
-create  primary index sec_primary_idx on LineItem ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.sqlpp
deleted file mode 100644
index ef9dd8f..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.update.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/empty.adm`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
-load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.sqlpp
deleted file mode 100644
index a4c443a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.query.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Load a temporary dataset with previously created empty indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element c
-from  LineItem as c
-order by c.l_orderkey,c.l_linenumber
-limit 1
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.sqlpp
deleted file mode 100644
index 6c1595df..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data at the same time where we insert a materializing to prevent the possibility
- * of deadlatch.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-create type test.Emp as
- closed {
-  id : bigint,
-  fname : string,
-  lname : string,
-  age : bigint,
-  dept : string
-};
-
-create temporary dataset test.employee(Emp) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.sqlpp
deleted file mode 100644
index 969f8ef..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.2.update.sqlpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data at the same time where we insert a materializing to prevent the possibility
- * of deadlatch.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use test;
-
-
-load  dataset test.employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
-
-insert into test.employee
-select element {'id':(x.id + 10000),'fname':x.fname,'lname':x.lname,'age':x.age,'dept':x.dept}
-from  `test.employee` as x
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.sqlpp
deleted file mode 100644
index c3ee05f..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.3.ddl.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data at the same time where we insert a materializing to prevent the possibility
- * of deadlatch.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use test;
-
-create  index idx_employee_first_name  on test.employee (fname) type btree;
-
-create  primary index sec_primary_idx  on test.employee;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.sqlpp
deleted file mode 100644
index a179e16..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-correlated-index/insert-and-scan-dataset-with-correlated-index.4.query.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a correlated
- * secondary index and scan the data at the same time where we insert a materializing to prevent the possibility
- * of deadlatch.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use test;
-
-
-select element l
-from  `test.employee` as l
-order by l.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.sqlpp
deleted file mode 100644
index e9aae4a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-create type test.Emp as
- closed {
-  id : bigint,
-  fname : string,
-  lname : string,
-  age : bigint,
-  dept : string
-};
-
-create temporary dataset test.employee(Emp) primary key id;
-
-create  index idx_employee_first_name  on test.employee (fname) type btree;
-
-create  primary index sec_primary_idx  on test.employee;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp
deleted file mode 100644
index da759b4..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.update.sqlpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 28 2015
- */
-
-use test;
-
-
-load  dataset test.employee using localfs ((`path`=`asterix_nc1://data/names.adm`),(`format`=`delimited-text`),(`delimiter`=`|`));
-
-insert into test.employee
-select element {'id':(x.id + 10000),'fname':x.fname,'lname':x.lname,'age':x.age,'dept':x.dept}
-from  `test.employee` as x
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp
deleted file mode 100644
index 065e5b9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.query.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset that has a secondary index and scan
- * the data at the same time where we insert a materializing to prevent the possibility of dead latch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element l
-from  `test.employee` as l
-order by l.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.sqlpp
deleted file mode 100644
index c716bbe..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ddl.sqlpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : July 11 2013
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.myDataType as
-{
-  id : bigint
-};
-
-create temporary dataset myData(myDataType) primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.sqlpp
deleted file mode 100644
index 06917df..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.update.sqlpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : insert-and-scan-dataset.aql
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset myData using localfs ((`path`=`asterix_nc1://data/odd-numbers.adm`),(`format`=`adm`)) pre-sorted;
-
-insert into myData
-select element {'id':(x.id + 1)}
-from  myData as x
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.sqlpp
deleted file mode 100644
index 4418b67..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.query.sqlpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : insert-and-scan-dataset.aql
- * Description     : This test is intended to test inserting into a temporary dataset and scan it at the same time
- * where we insert a materializing to prevent the possibility of deadlatch.
- * Expected Result : Success
- * Date            : March 27 2015
- *
- */
-
-use test;
-
-
-select element c
-from  myData as c
-order by c.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.sqlpp
deleted file mode 100644
index 45cde93..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ddl.sqlpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse tpch if exists;
-create  dataverse tpch;
-
-use tpch;
-
-
-create type tpch.LineItemType as
- closed {
-  l_orderkey : bigint,
-  l_partkey : bigint,
-  l_suppkey : bigint,
-  l_linenumber : bigint,
-  l_quantity : double,
-  l_extendedprice : double,
-  l_discount : double,
-  l_tax : double,
-  l_returnflag : string,
-  l_linestatus : string,
-  l_shipdate : string,
-  l_commitdate : string,
-  l_receiptdate : string,
-  l_shipinstruct : string,
-  l_shipmode : string,
-  l_comment : string
-};
-
-create temporary dataset LineItem(LineItemType) primary key l_orderkey,l_linenumber;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.sqlpp
deleted file mode 100644
index 696a84b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.update.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use tpch;
-
-
-load  dataset LineItem using localfs ((`path`=`asterix_nc1://data/tpch0.001/lineitem.tbl`),(`format`=`delimited-text`),(`delimiter`=`|`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.sqlpp
deleted file mode 100644
index 4a5eae4..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.query.sqlpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Test a read query over a temporary dataset.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use tpch;
-
-
-set `import-private-functions` `true`;
-
-select element {'l_returnflag':l_returnflag,'l_linestatus':l_linestatus,
-    'sum_qty': sum(l.l_quantity),
-    'sum_base_price': sum(l.l_extendedprice),
-    'sum_disc_price': sum(l.l_extendedprice * (1 - l.l_discount)),
-    'sum_charge': sum(l.l_extendedprice * (1 - l.l_discount) * (1 + l.l_tax)),
-    'ave_qty': avg(l.l_quantity),
-    'ave_price': avg(l.l_extendedprice),
-    'ave_disc': avg(l.l_discount),
-    'count_order': count(*)}
-from  LineItem as l
-where (l.l_shipdate <= '1998-09-02')
-/* +hash */
-group by l.l_returnflag as l_returnflag,l.l_linestatus as l_linestatus
-order by l_returnflag,l_linestatus
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.sqlpp
deleted file mode 100644
index 7e0f9cc..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.MyRecord as
- closed {
-  id : bigint,
-  point : point,
-  kwds : string,
-  line1 : line,
-  line2 : line,
-  poly1 : polygon,
-  poly2 : polygon,
-  rec : rectangle,
-  circle : circle
-};
-
-create temporary dataset MyData(MyRecord) primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.sqlpp
deleted file mode 100644
index 39eaee2..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.update.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset MyData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData.json`),(`format`=`adm`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.sqlpp
deleted file mode 100644
index 56a3186..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ddl.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-create  index rtree_index_point  on MyData (point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.sqlpp
deleted file mode 100644
index 5a6708a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.update.sqlpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-delete from MyData
- where id > 10;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.sqlpp
deleted file mode 100644
index 7e2f12e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.query.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Delete tuples from a temporary dataset with a R-tree index.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element {'id':o.id}
-from  MyData as o
-where test.`spatial-intersect`(o.point,test.`create-polygon`([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by o.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.sqlpp
deleted file mode 100644
index b352768..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ddl.sqlpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a persistent dataset into a temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.MyRecord as
- closed {
-  id : bigint,
-  point : point,
-  kwds : string,
-  line1 : line,
-  line2 : line,
-  poly1 : polygon,
-  poly2 : polygon,
-  rec : rectangle,
-  circle : circle
-};
-
-create type test.MyMiniRecord as
- closed {
-  id : bigint,
-  point : point
-};
-
-create  dataset MyData(MyRecord) primary key id;
-
-create temporary dataset MyMiniData(MyMiniRecord) primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.sqlpp
deleted file mode 100644
index c2214c9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset MyData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData.json`),(`format`=`adm`)) pre-sorted;
-
-load  dataset MyMiniData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData0.json`),(`format`=`adm`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.sqlpp
deleted file mode 100644
index 98bfaf8..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ddl.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-create  index rtree_index_point_0  on MyData (point) type rtree;
-
-create  index rtree_index_point  on MyMiniData (point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.sqlpp
deleted file mode 100644
index 7ab14fe..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-insert into MyMiniData
-select element {'id':m.id,'point':m.point}
-from  MyData as m
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.sqlpp
deleted file mode 100644
index 33c063d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.query.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element {'id':o.id}
-from  MyMiniData as o
-where test.`spatial-intersect`(o.point,test.`create-polygon`([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by o.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.sqlpp
deleted file mode 100644
index 8d1110a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ddl.sqlpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.MyRecord as
- closed {
-  id : bigint,
-  point : point,
-  kwds : string,
-  line1 : line,
-  line2 : line,
-  poly1 : polygon,
-  poly2 : polygon,
-  rec : rectangle,
-  circle : circle
-};
-
-create type test.MyMiniRecord as
- closed {
-  id : bigint,
-  point : point
-};
-
-create temporary dataset MyData(MyRecord) primary key id;
-
-create temporary dataset MyMiniData(MyMiniRecord) primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.sqlpp
deleted file mode 100644
index c2214c9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset MyData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData.json`),(`format`=`adm`)) pre-sorted;
-
-load  dataset MyMiniData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData0.json`),(`format`=`adm`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.sqlpp
deleted file mode 100644
index 98bfaf8..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ddl.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-create  index rtree_index_point_0  on MyData (point) type rtree;
-
-create  index rtree_index_point  on MyMiniData (point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.sqlpp
deleted file mode 100644
index 7ab14fe..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-insert into MyMiniData
-select element {'id':m.id,'point':m.point}
-from  MyData as m
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.sqlpp
deleted file mode 100644
index 33c063d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.query.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element {'id':o.id}
-from  MyMiniData as o
-where test.`spatial-intersect`(o.point,test.`create-polygon`([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by o.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.sqlpp
deleted file mode 100644
index f7e32ab..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ddl.sqlpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into a persistent dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-drop  dataverse test if exists;
-create  dataverse test;
-
-use test;
-
-
-create type test.MyRecord as
- closed {
-  id : bigint,
-  point : point,
-  kwds : string,
-  line1 : line,
-  line2 : line,
-  poly1 : polygon,
-  poly2 : polygon,
-  rec : rectangle,
-  circle : circle
-};
-
-create type test.MyMiniRecord as
- closed {
-  id : bigint,
-  point : point
-};
-
-create temporary dataset MyData(MyRecord) primary key id;
-
-create  dataset MyMiniData(MyMiniRecord) primary key id;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.sqlpp
deleted file mode 100644
index c2214c9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-load  dataset MyData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData.json`),(`format`=`adm`)) pre-sorted;
-
-load  dataset MyMiniData using localfs ((`path`=`asterix_nc1://data/spatial/spatialData0.json`),(`format`=`adm`)) pre-sorted;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.sqlpp
deleted file mode 100644
index 98bfaf8..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ddl.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-create  index rtree_index_point_0  on MyData (point) type rtree;
-
-create  index rtree_index_point  on MyMiniData (point) type rtree;
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.sqlpp
deleted file mode 100644
index 7ab14fe..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.update.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-insert into MyMiniData
-select element {'id':m.id,'point':m.point}
-from  MyData as m
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.sqlpp
deleted file mode 100644
index 33c063d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.query.sqlpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description     : Port data from a temporary dataset into yet-another temporary dataset.
- *                   Both datasets have R-tree indexes.
- * Expected Result : Success
- * Date            : March 27 2015
- */
-
-use test;
-
-
-select element {'id':o.id}
-from  MyMiniData as o
-where test.`spatial-intersect`(o.point,test.`create-polygon`([0.0,1.0,0.0,4.0,12.0,4.0,12.0,1.0]))
-order by o.id
-;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.query.sqlpp
index ce3159a..0f9b329 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.query.sqlpp
@@ -25,7 +25,7 @@
 
 
 select element {'timebin':bin,
-    'count':count((select value 1 from g)),
+    'count':coll_count((select value 1 from g)),
     'total_ms':coll_sum((
         select element
         `ms_from_day_time_duration`(`duration-from-interval`(`get-overlapping-interval`(bin, g.i2.interval)))
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite-open/query-ASTERIXDB-1329.24.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite-open/query-ASTERIXDB-1329.24.query.sqlpp
index 66e99ab..2f46ea7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite-open/query-ASTERIXDB-1329.24.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite-open/query-ASTERIXDB-1329.24.query.sqlpp
@@ -23,7 +23,7 @@
 
 SELECT  user.name AS uname,
         user.alias AS alias,
-        substring(message.message, 30) AS msg
+        substring(message.message, 29) AS msg
 FROM FacebookMessages AS message,
      FacebookUsers AS user
 WHERE message.`author-id` = user.id and
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.query.sqlpp
index 7f84895..a8f43a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.query.sqlpp
@@ -21,7 +21,7 @@
 
 SELECT  user.name AS uname,
         user.alias AS alias,
-        substring(message.message, 30) AS msg
+        substring(message.message, 29) AS msg
 FROM FacebookMessages AS message,
      FacebookUsers AS user
 WHERE message.`author-id` = user.id and
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q01/q01.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q01/q01.3.query.sqlpp
index f4f6d52..fa3764a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q01/q01.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q01/q01.3.query.sqlpp
@@ -23,24 +23,24 @@
 with customer_total_return as
 (select sr_customer_sk as ctr_customer_sk
 ,sr_store_sk as ctr_store_sk
-,sum(sr_fee) as ctr_total_return
-from store_returns
-,date_dim
-where sr_returned_date_sk = d_date_sk
-and d_year = 2000
-group by sr_customer_sk
-,sr_store_sk)
+,sum(sr.sr_fee) as ctr_total_return
+from store_returns sr
+,date_dim d
+where sr.sr_returned_date_sk = d.d_date_sk
+and d.d_year = 2000
+group by sr.sr_customer_sk
+,sr.sr_store_sk)
 
-select  c_customer_id
+select c.c_customer_id
 from customer_total_return ctr1
-,store
-,customer
+,store s
+,customer c
 where ctr1.ctr_total_return > (
     select value (avg(ctr2.ctr_total_return)*1.2)
     from customer_total_return ctr2
     where ctr1.ctr_store_sk = ctr2.ctr_store_sk)[0]
-and s_store_sk = ctr1.ctr_store_sk
-and s_state = 'TN'
-and ctr1.ctr_customer_sk = c_customer_sk
-order by c_customer_id
+and s.s_store_sk = ctr1.ctr_store_sk
+and s.s_state = 'TN'
+and ctr1.ctr_customer_sk = c.c_customer_sk
+order by c.c_customer_id
 limit 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q03/q03.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q03/q03.3.query.sqlpp
index 67f4a14..612a8c5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q03/q03.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q03/q03.3.query.sqlpp
@@ -20,10 +20,10 @@
 USE tpcds;
 
 
-SELECT dt.d_year
+SELECT d_year
        ,item.i_brand_id brand_id
        ,item.i_brand brand
-       ,sum(ss_ext_sales_price) sum_agg
+       ,sum(store_sales.ss_ext_sales_price) sum_agg
 FROM date_dim dt
     ,store_sales
     ,item
@@ -34,7 +34,7 @@
 GROUP BY dt.d_year
         ,item.i_brand
         ,item.i_brand_id
-ORDER BY dt.d_year
+ORDER BY d_year
          ,sum_agg desc
          ,brand_id
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q07/q07.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q07/q07.3.query.sqlpp
index 14c8840..6f949b9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q07/q07.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q07/q07.3.query.sqlpp
@@ -21,20 +21,20 @@
 
 
 SELECT  i_item_id,
-        avg(ss_quantity) agg1,
-        avg(ss_list_price) agg2,
-        avg(ss_coupon_amt) agg3,
-        avg(ss_sales_price) agg4
-FROM store_sales, customer_demographics, date_dim, item, promotion
-WHERE ss_sold_date_sk = d_date_sk
-AND   ss_item_sk = i_item_sk
-AND   ss_cdemo_sk = cd_demo_sk
-AND   ss_promo_sk = p_promo_sk
-AND   cd_gender = 'F'
-AND   cd_marital_status = 'W'
-AND   cd_education_status = 'Primary'
-AND   (p_channel_email = 'N' OR p_channel_event = 'N')
-AND   d_year = 1998
-GROUP BY i_item_id
+        avg(ss.ss_quantity) agg1,
+        avg(ss.ss_list_price) agg2,
+        avg(ss.ss_coupon_amt) agg3,
+        avg(ss.ss_sales_price) agg4
+FROM store_sales ss, customer_demographics cd, date_dim d, item i, promotion p
+WHERE ss.ss_sold_date_sk = d.d_date_sk
+AND   ss.ss_item_sk = i.i_item_sk
+AND   ss.ss_cdemo_sk = cd.cd_demo_sk
+AND   ss.ss_promo_sk = p.p_promo_sk
+AND   cd.cd_gender = 'F'
+AND   cd.cd_marital_status = 'W'
+AND   cd.cd_education_status = 'Primary'
+AND   (p.p_channel_email = 'N' OR p.p_channel_event = 'N')
+AND   d.d_year = 1998
+GROUP BY i.i_item_id
 ORDER BY i_item_id
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q15/q15.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q15/q15.3.query.sqlpp
index ceb7134..7152cc6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q15/q15.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q15/q15.3.query.sqlpp
@@ -21,20 +21,20 @@
 
 
 SELECT ca_zip
-      ,sum(cs_sales_price)
-FROM catalog_sales
-    ,customer
-    ,customer_address
-    ,date_dim
-WHERE cs_bill_customer_sk = c_customer_sk
-AND c_current_addr_sk = ca_address_sk
-AND ( substr(ca_zip,1,5) in ['85669', '86197','88274','83405','86475',
+      ,sum(cs.cs_sales_price)
+FROM catalog_sales cs
+    ,customer c
+    ,customer_address ca
+    ,date_dim d
+WHERE cs.cs_bill_customer_sk = c.c_customer_sk
+AND c.c_current_addr_sk = ca.ca_address_sk
+AND ( substr(ca.ca_zip,0,5) in ['85669', '86197','88274','83405','86475',
                              '85392', '85460', '80348', '81792']
-OR ca_state in ['CA','WA','GA']
-OR cs_sales_price > 500)
-AND cs_sold_date_sk = d_date_sk
-AND d_qoy = 2
-AND d_year = 2000
-GROUP BY ca_zip
+OR ca.ca_state in ['CA','WA','GA']
+OR cs.cs_sales_price > 500)
+AND cs.cs_sold_date_sk = d.d_date_sk
+AND d.d_qoy = 2
+AND d.d_year = 2000
+GROUP BY ca.ca_zip
 ORDER BY ca_zip
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q19/q19.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q19/q19.3.query.sqlpp
index 12ca91f..52c298e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q19/q19.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q19/q19.3.query.sqlpp
@@ -21,21 +21,21 @@
 
 
 SELECT i_brand_id brand_id, i_brand brand, i_manufact_id, i_manufact,
-       SUM(ss_ext_sales_price) ext_price
-FROM date_dim, store_sales, item,customer,customer_address,store
-WHERE d_date_sk = ss_sold_date_sk
-AND ss_item_sk = i_item_sk
-AND i_manager_id=7
-AND d_moy=11
-AND d_year=1999
-AND ss_customer_sk = c_customer_sk
-AND c_current_addr_sk = ca_address_sk
-AND substr(ca_zip,1,5) != substr(s_zip,1,5)
-AND ss_store_sk = s_store_sk
-GROUP BY i_brand
-        ,i_brand_id
-        ,i_manufact_id
-        ,i_manufact
+       SUM(ss.ss_ext_sales_price) ext_price
+FROM date_dim d, store_sales ss, item i, customer c, customer_address ca, store s
+WHERE d.d_date_sk = ss.ss_sold_date_sk
+AND ss.ss_item_sk = i.i_item_sk
+AND i.i_manager_id=7
+AND d.d_moy=11
+AND d.d_year=1999
+AND ss.ss_customer_sk = c.c_customer_sk
+AND c.c_current_addr_sk = ca.ca_address_sk
+AND substr(ca.ca_zip,0,5) != substr(s.s_zip,0,5)
+AND ss.ss_store_sk = s.s_store_sk
+GROUP BY i.i_brand
+        ,i.i_brand_id
+        ,i.i_manufact_id
+        ,i.i_manufact
 ORDER BY ext_price desc
          ,i_brand
          ,i_brand_id
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q21/q21.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q21/q21.3.query.sqlpp
index d39c5bd..a62a7c6f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q21/q21.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q21/q21.3.query.sqlpp
@@ -23,24 +23,24 @@
 SELECT  *
 FROM (SELECT w_warehouse_name
             ,i_item_id
-            ,SUM(CASE WHEN date(d_date) < date('1998-04-08')
-                 THEN inv_quantity_on_hand
+            ,SUM(CASE WHEN date(d.d_date) < date('1998-04-08')
+                 THEN inv.inv_quantity_on_hand
                  ELSE 0 END) AS inv_before
-            ,SUM(CASE WHEN date(d_date) >= date('1998-04-08')
-                      THEN inv_quantity_on_hand
+            ,SUM(CASE WHEN date(d.d_date) >= date('1998-04-08')
+                      THEN inv.inv_quantity_on_hand
                       ELSE 0 END) AS inv_after
-   FROM inventory
-       ,warehouse
-       ,item
-       ,date_dim
-   WHERE i_current_price >= 0.99
-     AND i_current_price <= 1.49
-     AND i_item_sk          = inv_item_sk
-     AND inv_warehouse_sk   = w_warehouse_sk
-     AND inv_date_sk    = d_date_sk
-     AND date(d_date) >= date('1998-03-09')
-     AND date(d_date) <= date('1998-05-08')
-   GROUP BY w_warehouse_name, i_item_id) x
+   FROM inventory inv
+       ,warehouse w
+       ,item i
+       ,date_dim d
+   WHERE i.i_current_price >= 0.99
+     AND i.i_current_price <= 1.49
+     AND i.i_item_sk          = inv.inv_item_sk
+     AND inv.inv_warehouse_sk   = w.w_warehouse_sk
+     AND inv.inv_date_sk    = d.d_date_sk
+     AND date(d.d_date) >= date('1998-03-09')
+     AND date(d.d_date) <= date('1998-05-08')
+   GROUP BY w.w_warehouse_name, i.i_item_id) x
    WHERE (CASE WHEN inv_before > 0
           THEN inv_after / inv_before
           ELSE null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
index 9456961..95e4e8c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24a/q24a.3.query.sqlpp
@@ -31,40 +31,41 @@
       ,i_manager_id
       ,i_units
       ,i_size
-      ,SUM(ss_sales_price) netpaid
-FROM store_sales
-    ,store_returns
-    ,store
-    ,item
-    ,customer
-    ,customer_address
-WHERE ss_ticket_number = sr_ticket_number
-  AND ss_item_sk = sr_item_sk
-  AND ss_customer_sk = c_customer_sk
-  AND ss_item_sk = i_item_sk
-  AND ss_store_sk = s_store_sk
-  AND c_birth_country = UPPERCASE(ca_country)
-  AND s_zip = ca_zip
-AND s_market_id=7
-GROUP BY c_last_name
-        ,c_first_name
-        ,s_store_name
-        ,ca_state
-        ,s_state
-        ,i_color
-        ,i_current_price
-        ,i_manager_id
-        ,i_units
-        ,i_size)
+      ,SUM(ss.ss_sales_price) netpaid
+FROM store_sales ss
+    ,store_returns sr
+    ,store s
+    ,item i
+    ,customer c
+    ,customer_address ca
+WHERE ss.ss_ticket_number = sr.sr_ticket_number
+  AND ss.ss_item_sk = sr.sr_item_sk
+  AND ss.ss_customer_sk = c.c_customer_sk
+  AND ss.ss_item_sk = i.i_item_sk
+  AND ss.ss_store_sk = s.s_store_sk
+  AND c.c_birth_country = UPPERCASE(ca.ca_country)
+  AND s.s_zip = ca.ca_zip
+AND s.s_market_id=7
+GROUP BY c.c_last_name
+        ,c.c_first_name
+        ,s.s_store_name
+        ,ca.ca_state
+        ,s.s_state
+        ,i.i_color
+        ,i.i_current_price
+        ,i.i_manager_id
+        ,i.i_units
+        ,i.i_size)
 SELECT c_last_name
       ,c_first_name
       ,s_store_name
-      ,SUM(netpaid) paid
+      ,paid
 FROM ssales
 WHERE i_color = 'orchid'
 GROUP BY c_last_name
         ,c_first_name
         ,s_store_name
 GROUP AS g
+LET paid = SUM(netpaid)
 HAVING paid > (SELECT value 0.05*avg(g.ssales.netpaid) FROM g)[0]
 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
index 0c80d1d..3a1590d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q24b/q24b.3.query.sqlpp
@@ -31,40 +31,41 @@
       ,i_manager_id
       ,i_units
       ,i_size
-      ,SUM(ss_sales_price) netpaid
-FROM store_sales
-    ,store_returns
-    ,store
-    ,item
-    ,customer
-    ,customer_address
-WHERE ss_ticket_number = sr_ticket_number
-  AND ss_item_sk = sr_item_sk
-  AND ss_customer_sk = c_customer_sk
-  AND ss_item_sk = i_item_sk
-  AND ss_store_sk = s_store_sk
-  AND c_birth_country = uppercase(ca_country)
-  AND s_zip = ca_zip
-  AND s_market_id = 7
-GROUP BY c_last_name
-        ,c_first_name
-        ,s_store_name
-        ,ca_state
-        ,s_state
-        ,i_color
-        ,i_current_price
-        ,i_manager_id
-        ,i_units
-        ,i_size)
+      ,SUM(ss.ss_sales_price) netpaid
+FROM store_sales ss
+    ,store_returns sr
+    ,store s
+    ,item i
+    ,customer c
+    ,customer_address ca
+WHERE ss.ss_ticket_number = sr.sr_ticket_number
+  AND ss.ss_item_sk = sr.sr_item_sk
+  AND ss.ss_customer_sk = c.c_customer_sk
+  AND ss.ss_item_sk = i.i_item_sk
+  AND ss.ss_store_sk = s.s_store_sk
+  AND c.c_birth_country = uppercase(ca.ca_country)
+  AND s.s_zip = ca.ca_zip
+  AND s.s_market_id = 7
+GROUP BY c.c_last_name
+        ,c.c_first_name
+        ,s.s_store_name
+        ,ca.ca_state
+        ,s.s_state
+        ,i.i_color
+        ,i.i_current_price
+        ,i.i_manager_id
+        ,i.i_units
+        ,i.i_size)
 SELECT c_last_name
       ,c_first_name
       ,s_store_name
-      ,SUM(netpaid) paid
+      ,paid
 FROM ssales
 WHERE i_color = 'chiffon'
 GROUP BY c_last_name
         ,c_first_name
         ,s_store_name
 GROUP AS g
+LET paid = SUM(netpaid)
 HAVING paid > (SELECT value 0.05*avg(g.ssales.netpaid) FROM g)[0]
 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q25/q25.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q25/q25.3.query.sqlpp
index 8245836..7a473f8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q25/q25.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q25/q25.3.query.sqlpp
@@ -25,42 +25,42 @@
  ,i_item_desc
  ,s_store_id
  ,s_store_name
- ,SUM(ss_net_profit) as store_sales_profit
- ,SUM(sr_net_loss) as store_returns_loss
- ,SUM(cs_net_profit) as catalog_sales_profit
+ ,SUM(ss.ss_net_profit) as store_sales_profit
+ ,SUM(sr.sr_net_loss) as store_returns_loss
+ ,SUM(cs.cs_net_profit) as catalog_sales_profit
  FROM
- store_sales
- ,store_returns
- ,catalog_sales
+ store_sales ss
+ ,store_returns sr
+ ,catalog_sales cs
  ,date_dim d1
  ,date_dim d2
  ,date_dim d3
- ,store
- ,item
+ ,store s
+ ,item i
  WHERE
  d1.d_moy = 4
  AND d1.d_year = 2000
- AND d1.d_date_sk = ss_sold_date_sk
- AND i_item_sk = ss_item_sk
- AND s_store_sk = ss_store_sk
- AND ss_customer_sk = sr_customer_sk
- AND ss_item_sk = sr_item_sk
- AND ss_ticket_number = sr_ticket_number
- AND sr_returned_date_sk = d2.d_date_sk
+ AND d1.d_date_sk = ss.ss_sold_date_sk
+ AND i.i_item_sk = ss.ss_item_sk
+ AND s.s_store_sk = ss.ss_store_sk
+ AND ss.ss_customer_sk = sr.sr_customer_sk
+ AND ss.ss_item_sk = sr.sr_item_sk
+ AND ss.ss_ticket_number = sr.sr_ticket_number
+ AND sr.sr_returned_date_sk = d2.d_date_sk
  AND d2.d_moy >= 4
  AND d2.d_moy <= 10
  AND d2.d_year = 2000
- AND sr_customer_sk = cs_bill_customer_sk
- AND sr_item_sk = cs_item_sk
- AND cs_sold_date_sk = d3.d_date_sk
+ AND sr.sr_customer_sk = cs.cs_bill_customer_sk
+ AND sr.sr_item_sk = cs.cs_item_sk
+ AND cs.cs_sold_date_sk = d3.d_date_sk
  AND d3.d_moy >= 4
  AND d3.d_moy <= 10
  AND d3.d_year = 2000
  GROUP BY
- i_item_id
- ,i_item_desc
- ,s_store_id
- ,s_store_name
+ i.i_item_id
+ ,i.i_item_desc
+ ,s.s_store_id
+ ,s.s_store_name
  ORDER BY
  i_item_id
  ,i_item_desc
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q26/q26.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q26/q26.3.query.sqlpp
index d5c38ce..7f219b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q26/q26.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q26/q26.3.query.sqlpp
@@ -21,20 +21,20 @@
 USE tpcds;
 
 SELECT  i_item_id,
-        avg(cs_quantity) agg1,
-        avg(cs_list_price) agg2,
-        avg(cs_coupon_amt) agg3,
-        avg(cs_sales_price) agg4
- FROM catalog_sales, customer_demographics, date_dim, item, promotion
- WHERE cs_sold_date_sk = d_date_sk AND
-       cs_item_sk = i_item_sk AND
-       cs_bill_cdemo_sk = cd_demo_sk AND
-       cs_promo_sk = p_promo_sk AND
-       cd_gender = 'F' AND
-       cd_marital_status = 'W' AND
-       cd_education_status = 'Primary' AND
-       (p_channel_email = 'N' OR p_channel_event = 'N') AND
-       d_year = 1998
- GROUP BY i_item_id
+        avg(cs.cs_quantity) agg1,
+        avg(cs.cs_list_price) agg2,
+        avg(cs.cs_coupon_amt) agg3,
+        avg(cs.cs_sales_price) agg4
+ FROM catalog_sales cs, customer_demographics cd, date_dim d, item i, promotion p
+ WHERE cs.cs_sold_date_sk = d.d_date_sk AND
+       cs.cs_item_sk = i.i_item_sk AND
+       cs.cs_bill_cdemo_sk = cd.cd_demo_sk AND
+       cs.cs_promo_sk = p.p_promo_sk AND
+       cd.cd_gender = 'F' AND
+       cd.cd_marital_status = 'W' AND
+       cd.cd_education_status = 'Primary' AND
+       (p.p_channel_email = 'N' OR p.p_channel_event = 'N') AND
+       d.d_year = 1998
+ GROUP BY i.i_item_id
  ORDER BY i_item_id
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q29/q29.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q29/q29.3.query.sqlpp
index e2ba54d..2b7270f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q29/q29.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q29/q29.3.query.sqlpp
@@ -25,39 +25,39 @@
     ,i_item_desc
     ,s_store_id
     ,s_store_name
-    ,SUM(ss_quantity)        as store_sales_quantity
-    ,SUM(sr_return_quantity) as store_returns_quantity
-    ,SUM(cs_quantity)        as catalog_sales_quantity
+    ,SUM(ss.ss_quantity)        as store_sales_quantity
+    ,SUM(sr.sr_return_quantity) as store_returns_quantity
+    ,SUM(cs.cs_quantity)        as catalog_sales_quantity
  FROM
-    store_sales
-   ,store_returns
-   ,catalog_sales
+    store_sales          ss
+   ,store_returns        sr
+   ,catalog_sales        cs
    ,date_dim             d1
    ,date_dim             d2
    ,date_dim             d3
-   ,store
-   ,item
+   ,store                s
+   ,item                 i
  WHERE
      d1.d_moy               = 4
  AND d1.d_year              = 1999
- AND d1.d_date_sk           = ss_sold_date_sk
- AND i_item_sk              = ss_item_sk
- AND s_store_sk             = ss_store_sk
- AND ss_customer_sk         = sr_customer_sk
- AND ss_item_sk             = sr_item_sk
- AND ss_ticket_number       = sr_ticket_number
- AND sr_returned_date_sk    = d2.d_date_sk
+ AND d1.d_date_sk           = ss.ss_sold_date_sk
+ AND i.i_item_sk            = ss.ss_item_sk
+ AND s.s_store_sk           = ss.ss_store_sk
+ AND ss.ss_customer_sk      = sr.sr_customer_sk
+ AND ss.ss_item_sk          = sr.sr_item_sk
+ AND ss.ss_ticket_number    = sr.sr_ticket_number
+ AND sr.sr_returned_date_sk = d2.d_date_sk
  AND d2.d_moy >= 4 AND  d2.d_moy <= 4 + 3
  AND d2.d_year              = 1999
- AND sr_customer_sk         = cs_bill_customer_sk
- AND sr_item_sk             = cs_item_sk
- AND cs_sold_date_sk        = d3.d_date_sk
+ AND sr.sr_customer_sk      = cs.cs_bill_customer_sk
+ AND sr.sr_item_sk          = cs.cs_item_sk
+ AND cs.cs_sold_date_sk     = d3.d_date_sk
  AND d3.d_year              IN [1999,1999+1,1999+2]
  GROUP BY
-    i_item_id
-   ,i_item_desc
-   ,s_store_id
-   ,s_store_name
+    i.i_item_id
+   ,i.i_item_desc
+   ,s.s_store_id
+   ,s.s_store_name
  ORDER BY
     i_item_id
    ,i_item_desc
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q30/q30.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q30/q30.3.query.sqlpp
index 0793006..8ba0feb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q30/q30.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q30/q30.3.query.sqlpp
@@ -23,28 +23,28 @@
 WITH customer_total_return as
  (SELECT wr_returning_customer_sk as ctr_customer_sk
         ,ca_state as ctr_state,
-  sum(wr_return_amt) as ctr_total_return
- FROM web_returns
-     ,date_dim
-     ,customer_address
- where wr_returned_date_sk = d_date_sk
-   AND d_year =2002
-   AND wr_returning_addr_sk = ca_address_sk
- group by wr_returning_customer_sk
-         ,ca_state)
-  SELECT  c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag
-       ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address
-       ,c_last_review_date,ctr_total_return
+  sum(wr.wr_return_amt) as ctr_total_return
+ FROM web_returns wr
+     ,date_dim d
+     ,customer_address ca
+ where wr.wr_returned_date_sk = d.d_date_sk
+   AND d.d_year =2002
+   AND wr.wr_returning_addr_sk = ca.ca_address_sk
+ group by wr.wr_returning_customer_sk
+         ,ca.ca_state)
+  SELECT  c.c_customer_id,c.c_salutation,c.c_first_name,c.c_last_name,c.c_preferred_cust_flag
+       ,c.c_birth_day,c.c_birth_month,c.c_birth_year,c.c_birth_country,c.c_login,c.c_email_address
+       ,c.c_last_review_date,ctr1.ctr_total_return
  FROM customer_total_return ctr1
-     ,customer_address
-     ,customer
+     ,customer_address ca
+     ,customer c
  where ctr1.ctr_total_return > (SELECT VALUE (AVG(ctr2.ctr_total_return)*1.2)
       FROM customer_total_return ctr2
                      where ctr1.ctr_state = ctr2.ctr_state)[0]
-       AND ca_address_sk = c_current_addr_sk
-       AND ca_state = 'IL'
-       AND ctr1.ctr_customer_sk = c_customer_sk
- ORDER BY c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag
-                  ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address
-                  ,c_last_review_date,ctr_total_return
+       AND ca.ca_address_sk = c.c_current_addr_sk
+       AND ca.ca_state = 'IL'
+       AND ctr1.ctr_customer_sk = c.c_customer_sk
+ ORDER BY c.c_customer_id,c.c_salutation,c.c_first_name,c.c_last_name,c.c_preferred_cust_flag
+                  ,c.c_birth_day,c.c_birth_month,c.c_birth_year,c.c_birth_country,c.c_login,c.c_email_address
+                  ,c.c_last_review_date,ctr1.ctr_total_return
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q31/q31.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q31/q31.3.query.sqlpp
index b869d5e..1768a95 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q31/q31.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q31/q31.3.query.sqlpp
@@ -21,17 +21,17 @@
 USE tpcds;
 
 WITH ss AS
- (SELECT ca_county,d_qoy, d_year,sum(ss_ext_sales_price) as store_sales
- FROM store_sales,date_dim,customer_address
- WHERE ss_sold_date_sk = d_date_sk
-  AND ss_addr_sk=ca_address_sk
- GROUP BY ca_county,d_qoy, d_year),
+ (SELECT ca_county,d_qoy, d_year,sum(ss.ss_ext_sales_price) as store_sales
+ FROM store_sales ss,date_dim d,customer_address ca
+ WHERE ss.ss_sold_date_sk = d.d_date_sk
+  AND ss.ss_addr_sk=ca.ca_address_sk
+ GROUP BY ca.ca_county,d.d_qoy, d.d_year),
  ws AS
- (SELECT ca_county,d_qoy, d_year,sum(ws_ext_sales_price) as web_sales
- FROM web_sales,date_dim,customer_address
- WHERE ws_sold_date_sk = d_date_sk
-  AND ws_bill_addr_sk=ca_address_sk
- GROUP BY ca_county,d_qoy, d_year)
+ (SELECT ca_county,d_qoy, d_year,sum(ws.ws_ext_sales_price) as web_sales
+ FROM web_sales ws,date_dim d,customer_address ca
+ WHERE ws.ws_sold_date_sk = d.d_date_sk
+  AND ws.ws_bill_addr_sk=ca.ca_address_sk
+ GROUP BY ca.ca_county,d.d_qoy, d.d_year)
  SELECT /* tt */
         ss1.ca_county
        ,ss1.d_year
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q34/q34.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q34/q34.3.query.sqlpp
index e81d182..b5908e8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q34/q34.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q34/q34.3.query.sqlpp
@@ -20,12 +20,12 @@
 
 USE tpcds;
 
-SELECT  c_last_name
-       ,c_first_name
-       ,c_salutation
-       ,c_preferred_cust_flag
-       ,ss_ticket_number
-       ,cnt
+SELECT  c.c_last_name
+       ,c.c_first_name
+       ,c.c_salutation
+       ,c.c_preferred_cust_flag
+       ,dn.ss_ticket_number
+       ,dn.cnt
        FROM
        (select ss_ticket_number
           ,ss_customer_sk
@@ -48,8 +48,8 @@
      AND date_dim.d_year in [1998,1998+1,1998+2]
      AND store.s_county in ['Williamson County','Williamson County','Williamson County','Williamson County',
                            'Williamson County','Williamson County','Williamson County','Williamson County']
-GROUP BY ss_ticket_number,ss_customer_sk GROUP AS dngrp) dn, customer
-WHERE dn.ss_customer_sk = c_customer_sk
-      AND cnt >= 15
-      AND cnt <= 20
-ORDER BY c_last_name,c_first_name,c_salutation,c_preferred_cust_flag desc;
\ No newline at end of file
+GROUP BY store_sales.ss_ticket_number,store_sales.ss_customer_sk GROUP AS dngrp) dn, customer c
+WHERE dn.ss_customer_sk = c.c_customer_sk
+      AND dn.cnt >= 15
+      AND dn.cnt <= 20
+ORDER BY c.c_last_name,c.c_first_name,c.c_salutation,c.c_preferred_cust_flag desc;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q37/q37.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q37/q37.3.query.sqlpp
index df1b580..e05720c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q37/q37.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q37/q37.3.query.sqlpp
@@ -23,14 +23,14 @@
 SELECT  i_item_id
        ,i_item_desc
        ,i_current_price
- FROM item, inventory, date_dim, catalog_sales
- WHERE i_current_price >= 22 AND i_current_price <= 22 + 30
- AND inv_item_sk = i_item_sk
- AND d_date_sk=inv_date_sk
- AND date(d_date) >= date('2001-06-02') AND date(d_date) <= date('2001-08-01')
- AND i_manufact_id in [678,964,918,849]
- AND inv_quantity_on_hand >= 100 AND inv_quantity_on_hand <= 500
- AND cs_item_sk = i_item_sk
- GROUP BY i_item_id,i_item_desc,i_current_price
+ FROM item i, inventory inv, date_dim d, catalog_sales cs
+ WHERE i.i_current_price >= 22 AND i.i_current_price <= 22 + 30
+ AND inv.inv_item_sk = i.i_item_sk
+ AND d.d_date_sk=inv.inv_date_sk
+ AND date(d.d_date) >= date('2001-06-02') AND date(d.d_date) <= date('2001-08-01')
+ AND i.i_manufact_id in [678,964,918,849]
+ AND inv.inv_quantity_on_hand >= 100 AND inv.inv_quantity_on_hand <= 500
+ AND cs.cs_item_sk = i.i_item_sk
+ GROUP BY i.i_item_id,i.i_item_desc,i.i_current_price
  ORDER BY i_item_id
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q42/q42.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q42/q42.3.query.sqlpp
index cee34eb..94d3975 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q42/q42.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q42/q42.3.query.sqlpp
@@ -23,7 +23,7 @@
 SELECT  dt.d_year
   ,item.i_category_id
   ,item.i_category
-  ,sum(ss_ext_sales_price)
+  ,sum(store_sales.ss_ext_sales_price)
  FROM  date_dim dt
   ,store_sales
   ,item
@@ -35,7 +35,7 @@
  GROUP BY  dt.d_year
    ,item.i_category_id
    ,item.i_category
- ORDER BY SUM(ss_ext_sales_price) desc,dt.d_year
+ ORDER BY SUM(store_sales.ss_ext_sales_price) desc,dt.d_year
    ,item.i_category_id
    ,item.i_category
 LIMIT 100 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q43/q43.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q43/q43.3.query.sqlpp
index 6e77ed4..4db7758 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q43/q43.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q43/q43.3.query.sqlpp
@@ -21,18 +21,18 @@
 USE tpcds;
 
 SELECT  s_store_name, s_store_id,
-        SUM(CASE WHEN (d_day_name='Sunday') THEN ss_sales_price ELSE null END) sun_sales,
-        SUM(CASE WHEN (d_day_name='Monday') THEN ss_sales_price ELSE null END) mon_sales,
-        SUM(CASE WHEN (d_day_name='Tuesday') THEN ss_sales_price ELSE  null END) tue_sales,
-        SUM(CASE WHEN (d_day_name='Wednesday') THEN ss_sales_price ELSE null END) wed_sales,
-        SUM(CASE WHEN (d_day_name='Thursday') THEN ss_sales_price ELSE null END) thu_sales,
-        SUM(CASE WHEN (d_day_name='Friday') THEN ss_sales_price ELSE null END) fri_sales,
-        SUM(CASE WHEN (d_day_name='Saturday') THEN ss_sales_price ELSE null END) sat_sales
- FROM date_dim, store_sales, store
- where d_date_sk = ss_sold_date_sk and
-       s_store_sk = ss_store_sk and
-       s_gmt_offset = -5 and
-       d_year = 1998
- GROUP BY s_store_name, s_store_id
+        SUM(CASE WHEN (d.d_day_name='Sunday') THEN ss.ss_sales_price ELSE null END) sun_sales,
+        SUM(CASE WHEN (d.d_day_name='Monday') THEN ss.ss_sales_price ELSE null END) mon_sales,
+        SUM(CASE WHEN (d.d_day_name='Tuesday') THEN ss.ss_sales_price ELSE  null END) tue_sales,
+        SUM(CASE WHEN (d.d_day_name='Wednesday') THEN ss.ss_sales_price ELSE null END) wed_sales,
+        SUM(CASE WHEN (d.d_day_name='Thursday') THEN ss.ss_sales_price ELSE null END) thu_sales,
+        SUM(CASE WHEN (d.d_day_name='Friday') THEN ss.ss_sales_price ELSE null END) fri_sales,
+        SUM(CASE WHEN (d.d_day_name='Saturday') THEN ss.ss_sales_price ELSE null END) sat_sales
+ FROM date_dim d, store_sales ss, store s
+ where d.d_date_sk = ss.ss_sold_date_sk and
+       s.s_store_sk = ss.ss_store_sk and
+       s.s_gmt_offset = -5 and
+       d.d_year = 1998
+ GROUP BY s.s_store_name, s.s_store_id
  ORDER BY s_store_name, s_store_id,sun_sales,mon_sales,tue_sales,wed_sales,thu_sales,fri_sales,sat_sales
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q45/q45.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q45/q45.3.query.sqlpp
index 83acd4a..2d8fdc9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q45/q45.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q45/q45.3.query.sqlpp
@@ -19,20 +19,20 @@
 
 
 USE tpcds;
-SELECT  ca_zip, ca_county, SUM(ws_sales_price)
- FROM web_sales, customer, customer_address, date_dim, item i2
- WHERE ws_bill_customer_sk = c_customer_sk
-  AND c_current_addr_sk = ca_address_sk
-  AND ws_item_sk = i2.i_item_sk
-  AND ( substr(ca_zip,1,5) IN ['85669', '86197','88274','83405','86475', '85392', '85460', '80348', '81792']
+SELECT  ca_zip, ca_county, SUM(ws.ws_sales_price)
+ FROM web_sales ws, customer c, customer_address ca, date_dim d, item i2
+ WHERE ws.ws_bill_customer_sk = c.c_customer_sk
+  AND c.c_current_addr_sk = ca.ca_address_sk
+  AND ws.ws_item_sk = i2.i_item_sk
+  AND ( substr(ca.ca_zip,0,5) IN ['85669', '86197','88274','83405','86475', '85392', '85460', '80348', '81792']
         OR
         i2.i_item_id IN (SELECT VALUE i1.i_item_id
                          FROM item i1
                          WHERE i1.i_item_sk in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
                          )
       )
-  AND ws_sold_date_sk = d_date_sk
-  AND d_qoy = 2 and d_year = 2000
- GROUP BY ca_zip, ca_county
+  AND ws.ws_sold_date_sk = d.d_date_sk
+  AND d.d_qoy = 2 and d.d_year = 2000
+ GROUP BY ca.ca_zip, ca.ca_county
  ORDER BY ca_zip, ca_county
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q46/q46.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q46/q46.3.query.sqlpp
index 873d78b..202f579 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q46/q46.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q46/q46.3.query.sqlpp
@@ -20,18 +20,18 @@
 
 USE tpcds;
 
-SELECT  c_last_name
-       ,c_first_name
-       ,ca_city
-       ,bought_city
-       ,ss_ticket_number
-       ,amt,profit
+SELECT  customer.c_last_name
+       ,customer.c_first_name
+       ,current_addr.ca_city
+       ,dn.bought_city
+       ,dn.ss_ticket_number
+       ,dn.amt,dn.profit
  FROM
    (SELECT ss_ticket_number
           ,ss_customer_sk
           ,ca_city bought_city
-          ,sum(ss_coupon_amt) amt
-          ,sum(ss_net_profit) profit
+          ,sum(store_sales.ss_coupon_amt) amt
+          ,sum(store_sales.ss_net_profit) profit
     FROM store_sales,date_dim,store,household_demographics,customer_address
     WHERE store_sales.ss_sold_date_sk = date_dim.d_date_sk
     AND store_sales.ss_store_sk = store.s_store_sk
@@ -42,13 +42,13 @@
     AND date_dim.d_dow in [6,0]
     AND date_dim.d_year in [1999,1999+1,1999+2]
     AND store.s_city in ['Midway','Fairview','Fairview','Fairview','Fairview']
-    GROUP BY ss_ticket_number,ss_customer_sk,ss_addr_sk,ca_city) dn,customer,customer_address current_addr
-    WHERE ss_customer_sk = c_customer_sk
+    GROUP BY store_sales.ss_ticket_number,store_sales.ss_customer_sk,store_sales.ss_addr_sk,customer_address.ca_city) dn,customer,customer_address current_addr
+    WHERE dn.ss_customer_sk = customer.c_customer_sk
       AND customer.c_current_addr_sk = current_addr.ca_address_sk
-      AND current_addr.ca_city != bought_city
-  ORDER BY c_last_name
-          ,c_first_name
-          ,ca_city
-          ,bought_city
-          ,ss_ticket_number
+      AND current_addr.ca_city != dn.bought_city
+  ORDER BY customer.c_last_name
+          ,customer.c_first_name
+          ,current_addr.ca_city
+          ,dn.bought_city
+          ,dn.ss_ticket_number
   LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q50/q50.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q50/q50.3.query.sqlpp
index 5bf8683..b7d4152 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q50/q50.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q50/q50.3.query.sqlpp
@@ -31,40 +31,40 @@
   ,s_county
   ,s_state
   ,s_zip
-  ,SUM((CASE WHEN (sr_returned_date_sk - ss_sold_date_sk) <= 30  THEN 1 ELSE 0 END))  AS c30_days
-  ,SUM((CASE WHEN ((sr_returned_date_sk - ss_sold_date_sk) > 30 AND
-                 (sr_returned_date_sk - ss_sold_date_sk) <= 60) THEN 1 ELSE 0 END ))  AS c31_60_days
-  ,SUM((CASE WHEN ((sr_returned_date_sk - ss_sold_date_sk) > 60 AND
-                 (sr_returned_date_sk - ss_sold_date_sk) <= 90) THEN 1 ELSE 0 END))  AS c61_90_days
-  ,SUM((CASE WHEN ((sr_returned_date_sk - ss_sold_date_sk) > 90 AND
-                 (sr_returned_date_sk - ss_sold_date_sk) <= 120) THEN 1 ELSE 0 END))  AS c91_120_days
-  ,SUM((CASE WHEN (sr_returned_date_sk - ss_sold_date_sk)  > 120 THEN 1 ELSE 0 END))  AS gt120_days
+  ,SUM((CASE WHEN (sr.sr_returned_date_sk - ss.ss_sold_date_sk) <= 30  THEN 1 ELSE 0 END))  AS c30_days
+  ,SUM((CASE WHEN ((sr.sr_returned_date_sk - ss.ss_sold_date_sk) > 30 AND
+                 (sr.sr_returned_date_sk - ss.ss_sold_date_sk) <= 60) THEN 1 ELSE 0 END ))  AS c31_60_days
+  ,SUM((CASE WHEN ((sr.sr_returned_date_sk - ss.ss_sold_date_sk) > 60 AND
+                 (sr.sr_returned_date_sk - ss.ss_sold_date_sk) <= 90) THEN 1 ELSE 0 END))  AS c61_90_days
+  ,SUM((CASE WHEN ((sr.sr_returned_date_sk - ss.ss_sold_date_sk) > 90 AND
+                 (sr.sr_returned_date_sk - ss.ss_sold_date_sk) <= 120) THEN 1 ELSE 0 END))  AS c91_120_days
+  ,SUM((CASE WHEN (sr.sr_returned_date_sk - ss.ss_sold_date_sk)  > 120 THEN 1 ELSE 0 END))  AS gt120_days
 FROM
-   store_sales
-  ,store_returns
-  ,store
+   store_sales ss
+  ,store_returns sr
+  ,store s
   ,date_dim d1
   ,date_dim d2
 WHERE
     d2.d_year = 2000
 AND d2.d_moy  = 9
-AND ss_ticket_number = sr_ticket_number
-AND ss_item_sk = sr_item_sk
-AND ss_sold_date_sk   = d1.d_date_sk
-AND sr_returned_date_sk   = d2.d_date_sk
-AND ss_customer_sk = sr_customer_sk
-AND ss_store_sk = s_store_sk
+AND ss.ss_ticket_number = sr.sr_ticket_number
+AND ss.ss_item_sk = sr.sr_item_sk
+AND ss.ss_sold_date_sk   = d1.d_date_sk
+AND sr.sr_returned_date_sk   = d2.d_date_sk
+AND ss.ss_customer_sk = sr.sr_customer_sk
+AND ss.ss_store_sk = s.s_store_sk
 GROUP BY
-   s_store_name
-  ,s_company_id
-  ,s_street_number
-  ,s_street_name
-  ,s_street_type
-  ,s_suite_number
-  ,s_city
-  ,s_county
-  ,s_state
-  ,s_zip
+   s.s_store_name
+  ,s.s_company_id
+  ,s.s_street_number
+  ,s.s_street_name
+  ,s.s_street_type
+  ,s.s_suite_number
+  ,s.s_city
+  ,s.s_county
+  ,s.s_state
+  ,s.s_zip
 ORDER BY s_store_name
         ,s_company_id
         ,s_street_number
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q52/q52.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q52/q52.3.query.sqlpp
index 6c3ad96..4b27365 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q52/q52.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q52/q52.3.query.sqlpp
@@ -23,7 +23,7 @@
 SELECT  dt.d_year
   ,item.i_brand_id brand_id
   ,item.i_brand brand
-  ,SUM(ss_ext_sales_price) ext_price
+  ,SUM(store_sales.ss_ext_sales_price) ext_price
  FROM date_dim dt
      ,store_sales
      ,item
@@ -35,7 +35,7 @@
  GROUP BY dt.d_year
   ,item.i_brand
   ,item.i_brand_id
- ORDER BY dt.d_year
+ ORDER BY d_year
   ,ext_price desc
   ,brand_id
 LIMIT 100 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q55/q55.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q55/q55.3.query.sqlpp
index 4928de3..d30e267 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q55/q55.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q55/q55.3.query.sqlpp
@@ -21,13 +21,13 @@
 USE tpcds;
 
 SELECT  i_brand_id brand_id, i_brand brand,
-  SUM(ss_ext_sales_price) ext_price
- FROM date_dim, store_sales, item
- WHERE d_date_sk = ss_sold_date_sk
-  AND ss_item_sk = i_item_sk
-  AND i_manager_id=36
-  AND d_moy=12
-  AND d_year=2001
- GROUP BY i_brand, i_brand_id
+  SUM(ss.ss_ext_sales_price) ext_price
+ FROM date_dim d, store_sales ss, item i
+ WHERE d.d_date_sk = ss.ss_sold_date_sk
+  AND ss.ss_item_sk = i.i_item_sk
+  AND i.i_manager_id=36
+  AND d.d_moy=12
+  AND d.d_year=2001
+ GROUP BY i.i_brand, i.i_brand_id
  ORDER BY ext_price desc, i_brand_id
 LIMIT 100 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q59/q59.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q59/q59.3.query.sqlpp
index ff45e4d..638219e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q59/q59.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q59/q59.3.query.sqlpp
@@ -23,41 +23,41 @@
 WITH wss AS
  (SELECT d_week_seq,
         ss_store_sk,
-        SUM(CASE WHEN d_day_name='Sunday' THEN ss_sales_price ELSE null END) sun_sales,
-        SUM(CASE WHEN d_day_name='Monday' THEN ss_sales_price ELSE null END) mon_sales,
-        SUM(CASE WHEN d_day_name='Tuesday' THEN ss_sales_price ELSE  null END) tue_sales,
-        SUM(CASE WHEN d_day_name='Wednesday' THEN ss_sales_price ELSE null END) wed_sales,
-        SUM(CASE WHEN d_day_name='Thursday' THEN ss_sales_price ELSE null END) thu_sales,
-        SUM(CASE WHEN d_day_name='Friday' THEN ss_sales_price ELSE null END) fri_sales,
-        SUM(CASE WHEN d_day_name='Saturday' THEN ss_sales_price ELSE null END) sat_sales
- FROM store_sales,date_dim
- WHERE d_date_sk = ss_sold_date_sk
- GROUP BY d_week_seq,ss_store_sk
+        SUM(CASE WHEN d.d_day_name='Sunday' THEN ss.ss_sales_price ELSE null END) sun_sales,
+        SUM(CASE WHEN d.d_day_name='Monday' THEN ss.ss_sales_price ELSE null END) mon_sales,
+        SUM(CASE WHEN d.d_day_name='Tuesday' THEN ss.ss_sales_price ELSE  null END) tue_sales,
+        SUM(CASE WHEN d.d_day_name='Wednesday' THEN ss.ss_sales_price ELSE null END) wed_sales,
+        SUM(CASE WHEN d.d_day_name='Thursday' THEN ss.ss_sales_price ELSE null END) thu_sales,
+        SUM(CASE WHEN d.d_day_name='Friday' THEN ss.ss_sales_price ELSE null END) fri_sales,
+        SUM(CASE WHEN d.d_day_name='Saturday' THEN ss.ss_sales_price ELSE null END) sat_sales
+ FROM store_sales ss,date_dim d
+ WHERE d.d_date_sk = ss.ss_sold_date_sk
+ GROUP BY d.d_week_seq,ss.ss_store_sk
  )
-  SELECT  s_store_name1,s_store_id1,d_week_seq1
-       ,sun_sales1/sun_sales2,mon_sales1/mon_sales2
-       ,tue_sales1/tue_sales2,wed_sales1/wed_sales2,thu_sales1/thu_sales2
-       ,fri_sales1/fri_sales2,sat_sales1/sat_sales2
+  SELECT  y.s_store_name1,y.s_store_id1,y.d_week_seq1
+       ,y.sun_sales1/x.sun_sales2,y.mon_sales1/x.mon_sales2
+       ,y.tue_sales1/x.tue_sales2,y.wed_sales1/x.wed_sales2,y.thu_sales1/x.thu_sales2
+       ,y.fri_sales1/x.fri_sales2,y.sat_sales1/x.sat_sales2
  FROM
- (SELECT s_store_name s_store_name1,wss.d_week_seq d_week_seq1
-        ,s_store_id s_store_id1,sun_sales sun_sales1
-        ,mon_sales mon_sales1,tue_sales tue_sales1
-        ,wed_sales wed_sales1,thu_sales thu_sales1
-        ,fri_sales fri_sales1,sat_sales sat_sales1
-  FROM wss,store,date_dim d
+ (SELECT s.s_store_name s_store_name1,wss.d_week_seq d_week_seq1
+        ,s.s_store_id s_store_id1,wss.sun_sales sun_sales1
+        ,wss.mon_sales mon_sales1,wss.tue_sales tue_sales1
+        ,wss.wed_sales wed_sales1,wss.thu_sales thu_sales1
+        ,wss.fri_sales fri_sales1,wss.sat_sales sat_sales1
+  FROM wss,store s,date_dim d
   WHERE d.d_week_seq = wss.d_week_seq AND
-        ss_store_sk = s_store_sk AND
-        d_month_seq >= 1185 AND d_month_seq <= 1185 + 11) y,
- (SELECT s_store_name s_store_name2,wss.d_week_seq d_week_seq2
-        ,s_store_id s_store_id2,sun_sales sun_sales2
-        ,mon_sales mon_sales2,tue_sales tue_sales2
-        ,wed_sales wed_sales2,thu_sales thu_sales2
-        ,fri_sales fri_sales2,sat_sales sat_sales2
-  FROM wss,store,date_dim d
+        wss.ss_store_sk = s.s_store_sk AND
+        d.d_month_seq >= 1185 AND d.d_month_seq <= 1185 + 11) y,
+ (SELECT s.s_store_name s_store_name2,wss.d_week_seq d_week_seq2
+        ,s.s_store_id s_store_id2,wss.sun_sales sun_sales2
+        ,wss.mon_sales mon_sales2,wss.tue_sales tue_sales2
+        ,wss.wed_sales wed_sales2,wss.thu_sales thu_sales2
+        ,wss.fri_sales fri_sales2,wss.sat_sales sat_sales2
+  FROM wss,store s,date_dim d
   WHERE d.d_week_seq = wss.d_week_seq AND
-        ss_store_sk = s_store_sk AND
-        d_month_seq >= 1185+ 12 AND d_month_seq <= 1185 + 23) x
-  WHERE s_store_id1=s_store_id2
-  AND d_week_seq1=d_week_seq2-52
- ORDER BY s_store_name1,s_store_id1,d_week_seq1
+        wss.ss_store_sk = s.s_store_sk AND
+        d.d_month_seq >= 1185+ 12 AND d.d_month_seq <= 1185 + 23) x
+  WHERE y.s_store_id1=x.s_store_id2
+  AND y.d_week_seq1=x.d_week_seq2-52
+ ORDER BY y.s_store_name1,y.s_store_id1,y.d_week_seq1
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q62/q62.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q62/q62.3.query.sqlpp
index 4d45927..6f8eb1e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q62/q62.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q62/q62.3.query.sqlpp
@@ -21,34 +21,34 @@
 USE tpcds;
 
 SELECT
-   SUBSTR(w_warehouse_name,1,20)
-  ,sm_type
-  ,web_name
-  ,SUM(CASE WHEN (ws_ship_date_sk - ws_sold_date_sk) <= 30 THEN 1 ELSE 0 END)  AS c30_days
-  ,SUM(CASE WHEN (ws_ship_date_sk - ws_sold_date_sk) > 30 AND
-                 (ws_ship_date_sk - ws_sold_date_sk) <= 60 THEN 1 ELSE 0 END )  AS c31_60_days
-  ,SUM(CASE WHEN (ws_ship_date_sk - ws_sold_date_sk) > 60 AND
-                 (ws_ship_date_sk - ws_sold_date_sk) <= 90 THEN 1 ELSE 0 END)  AS c61_90_days
-  ,SUM(CASE WHEN (ws_ship_date_sk - ws_sold_date_sk) > 90 AND
-                 (ws_ship_date_sk - ws_sold_date_sk) <= 120 THEN 1 ELSE 0 END)  AS c91_120_days
-  ,SUM(CASE WHEN (ws_ship_date_sk - ws_sold_date_sk)  > 120 THEN 1 ELSE 0 END)  AS gt120_days
+   SUBSTR(w.w_warehouse_name,0,20)
+  ,sm.sm_type
+  ,web.web_name
+  ,SUM(CASE WHEN (ws.ws_ship_date_sk - ws.ws_sold_date_sk) <= 30 THEN 1 ELSE 0 END)  AS c30_days
+  ,SUM(CASE WHEN (ws.ws_ship_date_sk - ws.ws_sold_date_sk) > 30 AND
+                 (ws.ws_ship_date_sk - ws.ws_sold_date_sk) <= 60 THEN 1 ELSE 0 END )  AS c31_60_days
+  ,SUM(CASE WHEN (ws.ws_ship_date_sk - ws.ws_sold_date_sk) > 60 AND
+                 (ws.ws_ship_date_sk - ws.ws_sold_date_sk) <= 90 THEN 1 ELSE 0 END)  AS c61_90_days
+  ,SUM(CASE WHEN (ws.ws_ship_date_sk - ws.ws_sold_date_sk) > 90 AND
+                 (ws.ws_ship_date_sk - ws.ws_sold_date_sk) <= 120 THEN 1 ELSE 0 END)  AS c91_120_days
+  ,SUM(CASE WHEN (ws.ws_ship_date_sk - ws.ws_sold_date_sk)  > 120 THEN 1 ELSE 0 END)  AS gt120_days
 FROM
-   web_sales
-  ,warehouse
-  ,ship_mode
-  ,web_site
-  ,date_dim
+   web_sales ws
+  ,warehouse w
+  ,ship_mode sm
+  ,web_site web
+  ,date_dim d
 WHERE
-    d_month_seq >= 1212 AND d_month_seq <= 1212 + 11
-AND ws_ship_date_sk   = d_date_sk
-AND ws_warehouse_sk   = w_warehouse_sk
-AND ws_ship_mode_sk   = sm_ship_mode_sk
-AND ws_web_site_sk    = web_site_sk
+    d.d_month_seq >= 1212 AND d.d_month_seq <= 1212 + 11
+AND ws.ws_ship_date_sk   = d.d_date_sk
+AND ws.ws_warehouse_sk   = w.w_warehouse_sk
+AND ws.ws_ship_mode_sk   = sm.sm_ship_mode_sk
+AND ws.ws_web_site_sk    = web.web_site_sk
 GROUP BY
-   SUBSTR(w_warehouse_name,1,20)
-  ,sm_type
-  ,web_name
-ORDER BY SUBSTR(w_warehouse_name,1,20)
+   SUBSTR(w.w_warehouse_name,0,20)
+  ,sm.sm_type
+  ,web.web_name
+ORDER BY SUBSTR(w.w_warehouse_name,0,20)
         ,sm_type
        ,web_name
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q68/q68.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q68/q68.3.query.sqlpp
index 5e5833b..d227de9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q68/q68.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q68/q68.3.query.sqlpp
@@ -20,20 +20,20 @@
 
 USE tpcds;
 
- SELECT  c_last_name
-       ,c_first_name
-       ,ca_city
-       ,bought_city
-       ,ss_ticket_number
-       ,extended_price
-       ,extended_tax
-       ,list_price
+ SELECT  customer.c_last_name
+       ,customer.c_first_name
+       ,current_addr.ca_city
+       ,dn.bought_city
+       ,dn.ss_ticket_number
+       ,dn.extended_price
+       ,dn.extended_tax
+       ,dn.list_price
  FROM (SELECT ss_ticket_number
              ,ss_customer_sk
              ,ca_city bought_city
-             ,sum(ss_ext_sales_price) extended_price
-             ,sum(ss_ext_list_price) list_price
-             ,sum(ss_ext_tax) extended_tax
+             ,sum(store_sales.ss_ext_sales_price) extended_price
+             ,sum(store_sales.ss_ext_list_price) list_price
+             ,sum(store_sales.ss_ext_tax) extended_tax
        FROM store_sales
            ,date_dim
            ,store
@@ -48,14 +48,14 @@
              household_demographics.hd_vehicle_count= 3)
         AND date_dim.d_year in [1999,1999+1,1999+2]
         AND store.s_city IN ['Midway','Fairview']
-        GROUP BY ss_ticket_number
-               ,ss_customer_sk
-               ,ss_addr_sk,ca_city) dn
+        GROUP BY store_sales.ss_ticket_number
+               ,store_sales.ss_customer_sk
+               ,store_sales.ss_addr_sk,customer_address.ca_city) dn
       ,customer
       ,customer_address current_addr
- WHERE ss_customer_sk = c_customer_sk
+ WHERE dn.ss_customer_sk = customer.c_customer_sk
    AND customer.c_current_addr_sk = current_addr.ca_address_sk
-   AND current_addr.ca_city != bought_city
- ORDER BY c_last_name
-         ,ss_ticket_number
+   AND current_addr.ca_city != dn.bought_city
+ ORDER BY customer.c_last_name
+         ,dn.ss_ticket_number
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q73/q73.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q73/q73.3.query.sqlpp
index 0036755..304af8e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q73/q73.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q73/q73.3.query.sqlpp
@@ -20,12 +20,12 @@
 
 USE tpcds;
 
-SELECT c_last_name
-       ,c_first_name
-       ,c_salutation
-       ,c_preferred_cust_flag
-       ,ss_ticket_number
-       ,cnt FROM
+SELECT c.c_last_name
+       ,c.c_first_name
+       ,c.c_salutation
+       ,c.c_preferred_cust_flag
+       ,dj.ss_ticket_number
+       ,dj.cnt FROM
    (SELECT ss_ticket_number
           ,ss_customer_sk
           ,len(djgrp) cnt
@@ -41,8 +41,8 @@
              household_demographics.hd_dep_count/ household_demographics.hd_vehicle_count ELSE null END) > 1
     AND date_dim.d_year in [1998,1998+1,1998+2]
     AND store.s_county in ['Williamson County','Williamson County','Williamson County','Williamson County']
-    GROUP BY ss_ticket_number,ss_customer_sk
-    GROUP AS djgrp) dj,customer
-    WHERE ss_customer_sk = c_customer_sk
-      AND cnt >= 1 AND cnt <= 5
-    ORDER BY cnt desc;
\ No newline at end of file
+    GROUP BY store_sales.ss_ticket_number,store_sales.ss_customer_sk
+    GROUP AS djgrp) dj,customer c
+    WHERE dj.ss_customer_sk = c.c_customer_sk
+      AND dj.cnt >= 1 AND dj.cnt <= 5
+    ORDER BY dj.cnt desc;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q79/q79.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q79/q79.3.query.sqlpp
index f9a9a5c..ea27bdf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q79/q79.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q79/q79.3.query.sqlpp
@@ -21,13 +21,13 @@
 USE tpcds;
 
 SELECT
-  c_last_name,c_first_name,substr(s_city,1,30),ss_ticket_number,amt,profit
+  c.c_last_name,c.c_first_name,substr(ms.s_city,0,30),ms.ss_ticket_number,ms.amt,ms.profit
   FROM
    (SELECT ss_ticket_number
           ,ss_customer_sk
           ,store.s_city
-          ,sum(ss_coupon_amt) amt
-          ,sum(ss_net_profit) profit
+          ,sum(store_sales.ss_coupon_amt) amt
+          ,sum(store_sales.ss_net_profit) profit
     FROM store_sales,date_dim,store,household_demographics
     WHERE store_sales.ss_sold_date_sk = date_dim.d_date_sk
     AND store_sales.ss_store_sk = store.s_store_sk
@@ -36,7 +36,7 @@
     AND date_dim.d_dow = 1
     AND date_dim.d_year IN [1998,1998+1,1998+2]
     AND store.s_number_employees >= 200 AND store.s_number_employees <= 295
-    group by ss_ticket_number,ss_customer_sk,ss_addr_sk,store.s_city) ms,customer
-    WHERE ss_customer_sk = c_customer_sk
- ORDER BY c_last_name,c_first_name,SUBSTR(s_city,1,30), profit
+    group by store_sales.ss_ticket_number,store_sales.ss_customer_sk,store_sales.ss_addr_sk,store.s_city) ms,customer c
+    WHERE ms.ss_customer_sk = c.c_customer_sk
+ ORDER BY c.c_last_name,c.c_first_name,SUBSTR(ms.s_city,0,30), ms.profit
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q81/q81.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q81/q81.3.query.sqlpp
index 1dbe2ef..d3e4372 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q81/q81.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q81/q81.3.query.sqlpp
@@ -23,28 +23,28 @@
 WITH customer_total_return AS
  (SELECT cr_returning_customer_sk as ctr_customer_sk
         ,ca_state as ctr_state,
-  SUM(cr_return_amt_inc_tax) as ctr_total_return
-  FROM catalog_returns
-     ,date_dim
-     ,customer_address
- WHERE cr_returned_date_sk = d_date_sk
-   AND d_year =1998
-   AND cr_returning_addr_sk = ca_address_sk
- GROUP BY cr_returning_customer_sk
-         ,ca_state )
-  SELECT  c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name
-                   ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset
-                  ,ca_location_type,ctr_total_return
+  SUM(cr.cr_return_amt_inc_tax) as ctr_total_return
+  FROM catalog_returns cr
+     ,date_dim d
+     ,customer_address ca
+ WHERE cr.cr_returned_date_sk = d.d_date_sk
+   AND d.d_year =1998
+   AND cr.cr_returning_addr_sk = ca.ca_address_sk
+ GROUP BY cr.cr_returning_customer_sk
+         ,ca.ca_state )
+  SELECT  c.c_customer_id,c.c_salutation,c.c_first_name,c.c_last_name,ca.ca_street_number,ca.ca_street_name
+                   ,ca.ca_street_type,ca.ca_suite_number,ca.ca_city,ca.ca_county,ca.ca_state,ca.ca_zip,ca.ca_country,ca.ca_gmt_offset
+                  ,ca.ca_location_type,ctr1.ctr_total_return
  FROM customer_total_return ctr1
-     ,customer_address
-     ,customer
+     ,customer_address ca
+     ,customer c
  WHERE ctr1.ctr_total_return > (SELECT VALUE (AVG(ctr2.ctr_total_return)*1.2)
       FROM customer_total_return ctr2
                      WHERE ctr1.ctr_state = ctr2.ctr_state)[0]
-       AND ca_address_sk = c_current_addr_sk
-       AND ca_state = 'IL'
-       AND ctr1.ctr_customer_sk = c_customer_sk
- ORDER BY c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name
-                   ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset
-                  ,ca_location_type,ctr_total_return
+       AND ca.ca_address_sk = c.c_current_addr_sk
+       AND ca.ca_state = 'IL'
+       AND ctr1.ctr_customer_sk = c.c_customer_sk
+ ORDER BY c.c_customer_id,c.c_salutation,c.c_first_name,c.c_last_name,ca.ca_street_number,ca.ca_street_name
+                   ,ca.ca_street_type,ca.ca_suite_number,ca.ca_city,ca.ca_county,ca.ca_state,ca.ca_zip,ca.ca_country,ca.ca_gmt_offset
+                  ,ca.ca_location_type,ca.ctr_total_return
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q82/q82.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q82/q82.3.query.sqlpp
index 7463682..a82b05f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q82/q82.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q82/q82.3.query.sqlpp
@@ -23,14 +23,14 @@
 SELECT  i_item_id
        ,i_item_desc
        ,i_current_price
- FROM item, inventory, date_dim, store_sales
- WHERE i_current_price >= 30 AND i_current_price <= 30+30
- AND inv_item_sk = i_item_sk
- AND d_date_sk=inv_date_sk
- AND date(d_date) >= date('2002-05-30') AND date(d_date) <= date('2002-07-01')
- AND i_manufact_id in [437,129,727,663]
- AND inv_quantity_on_hand >= 100 AND inv_quantity_on_hand <= 500
- AND ss_item_sk = i_item_sk
- GROUP BY i_item_id,i_item_desc,i_current_price
+ FROM item i, inventory inv, date_dim d, store_sales ss
+ WHERE i.i_current_price >= 30 AND i.i_current_price <= 30+30
+ AND inv.inv_item_sk = i.i_item_sk
+ AND d.d_date_sk=inv.inv_date_sk
+ AND date(d.d_date) >= date('2002-05-30') AND date(d.d_date) <= date('2002-07-01')
+ AND i.i_manufact_id in [437,129,727,663]
+ AND inv.inv_quantity_on_hand >= 100 AND inv.inv_quantity_on_hand <= 500
+ AND ss.ss_item_sk = i.i_item_sk
+ GROUP BY i.i_item_id,i.i_item_desc,i.i_current_price
  ORDER BY i_item_id
  LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q85/q85.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q85/q85.3.query.sqlpp
index 6330d9b..7951333 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q85/q85.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q85/q85.3.query.sqlpp
@@ -20,20 +20,20 @@
 
 use tpcds;
 
-select  substr(r_reason_desc,1,20)
-       ,avg(ws_quantity)
-       ,avg(wr_refunded_cash)
-       ,avg(wr_fee)
- from web_sales, web_returns, web_page, customer_demographics cd1,
-      customer_demographics cd2, customer_address, date_dim, reason
- where ws_web_page_sk = wp_web_page_sk
-   and ws_item_sk = wr_item_sk
-   and ws_order_number = wr_order_number
-   and ws_sold_date_sk = d_date_sk and d_year = 1998
-   and cd1.cd_demo_sk = wr_refunded_cdemo_sk
-   and cd2.cd_demo_sk = wr_returning_cdemo_sk
-   and ca_address_sk = wr_refunded_addr_sk
-   and r_reason_sk = wr_reason_sk
+select  substr(r_reason_desc,0,20)
+       ,avg(ws.ws_quantity)
+       ,avg(wr.wr_refunded_cash)
+       ,avg(wr.wr_fee)
+ from web_sales ws, web_returns wr, web_page wp, customer_demographics cd1,
+      customer_demographics cd2, customer_address ca, date_dim d, reason r
+ where ws.ws_web_page_sk = wp.wp_web_page_sk
+   and ws.ws_item_sk = wr.wr_item_sk
+   and ws.ws_order_number = wr.wr_order_number
+   and ws.ws_sold_date_sk = d.d_date_sk and d.d_year = 1998
+   and cd1.cd_demo_sk = wr.wr_refunded_cdemo_sk
+   and cd2.cd_demo_sk = wr.wr_returning_cdemo_sk
+   and ca.ca_address_sk = wr.wr_refunded_addr_sk
+   and r.r_reason_sk = wr.wr_reason_sk
    and
    (
     (
@@ -45,7 +45,7 @@
      and
      cd1.cd_education_status = cd2.cd_education_status
      and
-     ws_sales_price >= 100.00 and ws_sales_price <= 150.00
+     ws.ws_sales_price >= 100.00 and ws.ws_sales_price <= 150.00
     )
    or
     (
@@ -57,7 +57,7 @@
      and
      cd1.cd_education_status = cd2.cd_education_status
      and
-     ws_sales_price >= 50.00 and ws_sales_price <= 100.00
+     ws.ws_sales_price >= 50.00 and ws.ws_sales_price <= 100.00
     )
    or
     (
@@ -69,35 +69,35 @@
      and
      cd1.cd_education_status = cd2.cd_education_status
      and
-     ws_sales_price >= 150.00 and ws_sales_price <= 200.00
+     ws.ws_sales_price >= 150.00 and ws.ws_sales_price <= 200.00
     )
    )
    and
    (
     (
-     ca_country = 'United States'
+     ca.ca_country = 'United States'
      and
-     ca_state in ['KY', 'GA', 'NM']
-     and ws_net_profit >= 100 and ws_net_profit <= 200
+     ca.ca_state in ['KY', 'GA', 'NM']
+     and ws.ws_net_profit >= 100 and ws.ws_net_profit <= 200
     )
     or
     (
-     ca_country = 'United States'
+     ca.ca_country = 'United States'
      and
-     ca_state in ['MT', 'OR', 'IN']
-     and ws_net_profit >= 150 and ws_net_profit <= 300
+     ca.ca_state in ['MT', 'OR', 'IN']
+     and ws.ws_net_profit >= 150 and ws.ws_net_profit <= 300
     )
     or
     (
-     ca_country = 'United States'
+     ca.ca_country = 'United States'
      and
-     ca_state in ['WI', 'MO', 'WV']
-     and ws_net_profit >= 50 and ws_net_profit <= 250
+     ca.ca_state in ['WI', 'MO', 'WV']
+     and ws.ws_net_profit >= 50 and ws.ws_net_profit <= 250
     )
    )
-group by r_reason_desc
-order by substr(r_reason_desc,1,20)
-        ,avg(ws_quantity)
-        ,avg(wr_refunded_cash)
-        ,avg(wr_fee)
+group by r.r_reason_desc
+order by substr(r_reason_desc,0,20)
+        ,avg(ws.ws_quantity)
+        ,avg(wr.wr_refunded_cash)
+        ,avg(wr.wr_fee)
 limit 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q91/q91.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q91/q91.3.query.sqlpp
index 9ce8ffe..29166c3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q91/q91.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q91/q91.3.query.sqlpp
@@ -24,27 +24,27 @@
         cc_call_center_id Call_Center,
         cc_name Call_Center_Name,
         cc_manager Manager,
-        SUM(cr_net_loss) Returns_Loss
+        SUM(cr.cr_net_loss) Returns_Loss
 FROM
-        call_center,
-        catalog_returns,
-        date_dim,
-        customer,
-        customer_address,
-        customer_demographics,
-        household_demographics
+        call_center cc,
+        catalog_returns cr,
+        date_dim d,
+        customer c,
+        customer_address ca,
+        customer_demographics cd,
+        household_demographics hd
 WHERE
-        cr_call_center_sk       = cc_call_center_sk
-AND     cr_returned_date_sk     = d_date_sk
-AND     cr_returning_customer_sk= c_customer_sk
-AND     cd_demo_sk              = c_current_cdemo_sk
-AND     hd_demo_sk              = c_current_hdemo_sk
-AND     ca_address_sk           = c_current_addr_sk
-AND     d_year                  = 1999
-AND     d_moy                   = 11
-AND     ( (cd_marital_status       = 'M' AND cd_education_status     = 'Unknown')
-        OR (cd_marital_status       = 'W' AND cd_education_status     = 'Advanced Degree'))
-AND     hd_buy_potential like '0-500%'
-AND     ca_gmt_offset           = -7
-GROUP BY cc_call_center_id,cc_name,cc_manager,cd_marital_status,cd_education_status
-ORDER BY SUM(cr_net_loss) desc;
\ No newline at end of file
+        cr.cr_call_center_sk       = cc.cc_call_center_sk
+AND     cr.cr_returned_date_sk     = d.d_date_sk
+AND     cr.cr_returning_customer_sk= c.c_customer_sk
+AND     cd.cd_demo_sk              = c.c_current_cdemo_sk
+AND     hd.hd_demo_sk              = c.c_current_hdemo_sk
+AND     ca.ca_address_sk           = c.c_current_addr_sk
+AND     d.d_year                  = 1999
+AND     d.d_moy                   = 11
+AND     ( (cd.cd_marital_status       = 'M' AND cd.cd_education_status     = 'Unknown')
+        OR (cd.cd_marital_status       = 'W' AND cd.cd_education_status     = 'Advanced Degree'))
+AND     hd.hd_buy_potential like '0-500%'
+AND     ca.ca_gmt_offset           = -7
+GROUP BY cc.cc_call_center_id,cc.cc_name,cc.cc_manager,cd.cd_marital_status,cd.cd_education_status
+ORDER BY SUM(cr.cr_net_loss) desc;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q94/q94.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q94/q94.3.query.sqlpp
index 9de99d7..c30002f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q94/q94.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q94/q94.3.query.sqlpp
@@ -22,24 +22,24 @@
 
 SELECT
    COUNT(wsnondup.ws_order_number) order_count,
-   SUM(ws_ext_ship_cost) total_shipping_cost,
-   SUM(ws_net_profit) total_net_profit
+   SUM(ws1.ws_ext_ship_cost) total_shipping_cost,
+   SUM(ws1.ws_net_profit) total_net_profit
 FROM
    (SELECT ws_order_number
     FROM web_sales
     GROUP BY ws_order_number) AS wsnondup,
    web_sales as ws1,
-   date_dim,
-   customer_address,
-   web_site
+   date_dim d,
+   customer_address ca,
+   web_site web
 WHERE
-    date(d_date) >= date('1999-05-01')
-AND date(d_date) <= date('1999-06-29')
-AND ws1.ws_ship_date_sk = d_date_sk
-AND ws1.ws_ship_addr_sk = ca_address_sk
-AND ca_state = 'TX'
-AND ws1.ws_web_site_sk = web_site_sk
-AND web_company_name = 'pri'
+    date(d.d_date) >= date('1999-05-01')
+AND date(d.d_date) <= date('1999-06-29')
+AND ws1.ws_ship_date_sk = d.d_date_sk
+AND ws1.ws_ship_addr_sk = ca.ca_address_sk
+AND ca.ca_state = 'TX'
+AND ws1.ws_web_site_sk = web.web_site_sk
+AND web.web_company_name = 'pri'
 AND EXISTS (SELECT *
             FROM web_sales ws2
             WHERE ws1.ws_order_number = ws2.ws_order_number
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q95/q95.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q95/q95.3.query.sqlpp
index e32122f..9e04780 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q95/q95.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q95/q95.3.query.sqlpp
@@ -32,27 +32,27 @@
  FROM
  (
  SELECT
-   distinct ws_order_number
-  ,ws_ext_ship_cost
-  ,ws_net_profit
+   distinct ws1.ws_order_number
+  ,ws1.ws_ext_ship_cost
+  ,ws1.ws_net_profit
 FROM
    web_sales ws1
-  ,date_dim
-  ,customer_address
-  ,web_site
+  ,date_dim d
+  ,customer_address ca
+  ,web_site web
 WHERE
-    date(d_date) >= date('1999-05-01')
-AND date(d_date) <= date('1999-06-30')
-AND ws1.ws_ship_date_sk = d_date_sk
-AND ws1.ws_ship_addr_sk = ca_address_sk
-AND ca_state = 'TX'
-AND ws1.ws_web_site_sk = web_site_sk
-AND web_company_name = 'pri'
-AND ws1.ws_order_number IN (SELECT VALUE ws_wh.ws_order_number
+    date(d.d_date) >= date('1999-05-01')
+AND date(d.d_date) <= date('1999-06-30')
+AND ws1.ws_ship_date_sk = d.d_date_sk
+AND ws1.ws_ship_addr_sk = ca.ca_address_sk
+AND ca.ca_state = 'TX'
+AND ws1.ws_web_site_sk = web.web_site_sk
+AND web.web_company_name = 'pri'
+AND ws1.ws_order_number IN (SELECT VALUE ws_order_number
                             FROM ws_wh)
-AND ws1.ws_order_number IN (SELECT VALUE wr_order_number
-                            FROM web_returns,ws_wh
-                            WHERE wr_order_number = ws_wh.ws_order_number)
+AND ws1.ws_order_number IN (SELECT VALUE wr.wr_order_number
+                            FROM web_returns wr,ws_wh
+                            WHERE wr.wr_order_number = ws_wh.ws_order_number)
 ) t1
 ORDER BY COUNT(ws_order_number)
 LIMIT 100;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q96/q96.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q96/q96.3.query.sqlpp
index 1fa8c67..b35f5c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q96/q96.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q96/q96.3.query.sqlpp
@@ -26,9 +26,9 @@
 FROM store_sales,
            household_demographics,
            time_dim, store
-WHERE ss_sold_time_sk = time_dim.t_time_sk
-    AND ss_hdemo_sk = household_demographics.hd_demo_sk
-    AND ss_store_sk = s_store_sk
+WHERE store_sales.ss_sold_time_sk = time_dim.t_time_sk
+    AND store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+    AND store_sales.ss_store_sk = store.s_store_sk
     AND time_dim.t_hour = 8
     AND time_dim.t_minute >= 30
     AND household_demographics.hd_dep_count = 5
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q98/q98.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q98/q98.3.query.sqlpp
index 99d81e0..17038de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q98/q98.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/q98/q98.3.query.sqlpp
@@ -33,35 +33,35 @@
         i_class,
         i_current_price,
         i_item_id,
-        SUM(ss_ext_sales_price) itemrevenue
+        SUM(ss.ss_ext_sales_price) itemrevenue
 FROM
-  store_sales,
-  item,
-  date_dim
+  store_sales ss,
+  item i,
+  date_dim d
 WHERE
-  ss_item_sk = i_item_sk
-  AND i_category IN ["Jewelry", "Sports", "Books"]
-  AND ss_sold_date_sk = d_date_sk
-  AND date(d_date) >= date('2001-01-12')
-  AND date(d_date) <= date('2001-02-11')
+  ss.ss_item_sk = i.i_item_sk
+  AND i.i_category IN ["Jewelry", "Sports", "Books"]
+  AND ss.ss_sold_date_sk = d.d_date_sk
+  AND date(d.d_date) >= date('2001-01-12')
+  AND date(d.d_date) <= date('2001-02-11')
 GROUP BY
-  i_item_id,
-  i_item_desc,
-  i_category,
-  i_class,
-  i_current_price
+  i.i_item_id,
+  i.i_item_desc,
+  i.i_category,
+  i.i_class,
+  i.i_current_price
 ) AS currpricetable
 JOIN
-(SELECT i_item_id, i_item_desc, i_category, i_class, SUM(ss_ext_sales_price) revrat
+(SELECT i_item_id, i_item_desc, i_category, i_class, SUM(ss.ss_ext_sales_price) revrat
   FROM
-  store_sales,
-  item
-  WHERE ss_item_sk = i_item_sk
+  store_sales ss,
+  item i
+  WHERE ss.ss_item_sk = i.i_item_sk
   GROUP BY
-     i_item_id,
-     i_item_desc,
-     i_category,
-     i_class
+     i.i_item_id,
+     i.i_item_desc,
+     i.i_category,
+     i.i_class
 ) AS revrattable
 ON  currpricetable.i_item_id = revrattable.i_item_id
 AND currpricetable.i_class = revrattable.i_class
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1602/query-ASTERIXDB-1602.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1602/query-ASTERIXDB-1602.3.query.sqlpp
index 95889bc..3a1b5c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1602/query-ASTERIXDB-1602.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1602/query-ASTERIXDB-1602.3.query.sqlpp
@@ -33,7 +33,7 @@
              where d3.d_date in ['1900-01-02', '1900-01-12', '1900-01-15']
             )
         )
- group by i_item_id
+ group by item.i_item_id
 )
 
 select coll_count((
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
index 4823a39..a15ab14 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
@@ -41,6 +41,6 @@
 ) as gco
 group by gco.c_count as c_count
 group as g
-let  custdist = count(( select value gco from g ))
+let  custdist = coll_count(( select value gco from g ))
 order by custdist desc,c_count desc
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
index 3963de0..65293dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
@@ -78,6 +78,6 @@
 ) as t4
 group by t4.s_name as s_name
 group as g
-let  numwait = count(( from g select value t4 ))
+let  numwait = coll_count(( from g select value t4 ))
 order by numwait desc,s_name
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
index bdd7323..d33a095 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
@@ -22,7 +22,7 @@
 
 declare function q22_customer_tmp() {
 (
-    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,1,2)}
+    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,0,2)}
     from  Customer as c
 )
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.query.sqlpp
index 3f3a50a..4689676 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.query.sqlpp
@@ -26,7 +26,7 @@
 use tpch;
 
 
-select element {'l_linenumber':l.l_linenumber,'count_order': count((from g select value g))}
+select element {'l_linenumber':l.l_linenumber,'count_order': coll_count((from g select value g))}
 from  LineItem as l
 group by l.l_linenumber
 group as g
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate/nest_aggregate.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate/nest_aggregate.3.query.sqlpp
index 6d0d928..ba3297f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate/nest_aggregate.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate/nest_aggregate.3.query.sqlpp
@@ -29,11 +29,11 @@
 SELECT  Nation.n_nationkey AS nation_key,
         Nation.n_name AS name,
         (
-            SELECT orderdate AS order_date, sum(o_totalprice) AS sum_price
-            FROM  Orders,
-                  Customer
-            WHERE o_custkey = c_custkey AND c_nationkey = Nation.n_nationkey
-            GROUP BY o_orderdate AS orderdate
+            SELECT orderdate AS order_date, sum(o.o_totalprice) AS sum_price
+            FROM  Orders o,
+                  Customer c
+            WHERE o.o_custkey = c.c_custkey AND c.c_nationkey = Nation.n_nationkey
+            GROUP BY o.o_orderdate AS orderdate
             ORDER BY sum_price
             LIMIT 3
         ) AS aggregates
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate2/nest_aggregate2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate2/nest_aggregate2.3.query.sqlpp
index 4a4cfc5..ae1dd27 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate2/nest_aggregate2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/nest_aggregate2/nest_aggregate2.3.query.sqlpp
@@ -31,11 +31,11 @@
         Nation.n_name AS name,
         (
             SELECT ELEMENT orderdate
-            FROM  Orders,
-                  Customer
-            WHERE o_custkey = c_custkey AND c_nationkey = Nation.n_nationkey
-            GROUP BY o_orderdate AS orderdate
-            ORDER BY sum(o_totalprice)
+            FROM  Orders o,
+                  Customer c
+            WHERE o.o_custkey = c.c_custkey AND c.c_nationkey = Nation.n_nationkey
+            GROUP BY o.o_orderdate AS orderdate
+            ORDER BY sum(o.o_totalprice)
             LIMIT 3
         ) AS aggregates
 from  Nation,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q02_minimum_cost_supplier/q02_minimum_cost_supplier.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q02_minimum_cost_supplier/q02_minimum_cost_supplier.3.query.sqlpp
index e1704fe..1decc72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q02_minimum_cost_supplier/q02_minimum_cost_supplier.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q02_minimum_cost_supplier/q02_minimum_cost_supplier.3.query.sqlpp
@@ -22,11 +22,11 @@
 
 WITH q2_minimum_cost_supplier_tmp1 AS
 (
- SELECT s_acctbal, s_name, n_name, p_partkey, ps_supplycost, p_mfgr, s_address, s_phone, s_comment
- FROM Nation JOIN Region ON n_regionkey = r_regionkey and r_name = 'EUROPE'
- JOIN Supplier ON s_nationkey = n_nationkey
- JOIN Partsupp ON s_suppkey = ps_suppkey
- JOIN Part ON p_partkey = ps_partkey AND p_type LIKE '%BRASS'
+ SELECT s.s_acctbal, s.s_name, n.n_name, p.p_partkey, ps.ps_supplycost, p.p_mfgr, s.s_address, s.s_phone, s.s_comment
+ FROM Nation n JOIN Region r ON n.n_regionkey = r.r_regionkey and r.r_name = 'EUROPE'
+ JOIN Supplier s ON s.s_nationkey = n.n_nationkey
+ JOIN Partsupp ps ON s.s_suppkey = ps.ps_suppkey
+ JOIN Part p ON p.p_partkey = ps.ps_partkey AND p.p_type LIKE '%BRASS'
 ),
 q2_minimum_cost_supplier_tmp2 AS
 (
@@ -35,10 +35,10 @@
   GROUP BY p_partkey
 )
 
-SELECT s_acctbal, s_name, n_name, t1.p_partkey, p_mfgr, s_address, s_phone, s_comment
+SELECT t1.s_acctbal, t1.s_name, t1.n_name, t1.p_partkey, t1.p_mfgr, t1.s_address, t1.s_phone, t1.s_comment
 FROM
   q2_minimum_cost_supplier_tmp1 t1 JOIN q2_minimum_cost_supplier_tmp2 t2
 ON
-  t1.p_partkey = t2.p_partkey AND ps_supplycost=ps_min_supplycost
-ORDER BY s_acctbal DESC, n_name, s_name, t1.p_partkey
+  t1.p_partkey = t2.p_partkey AND t1.ps_supplycost = t2.ps_min_supplycost
+ORDER BY t1.s_acctbal DESC, t1.n_name, t1.s_name, t1.p_partkey
 LIMIT 100;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q03_shipping_priority_nt/q03_shipping_priority_nt.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q03_shipping_priority_nt/q03_shipping_priority_nt.3.query.sqlpp
index c620bdc..f5dcb4a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q03_shipping_priority_nt/q03_shipping_priority_nt.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q03_shipping_priority_nt/q03_shipping_priority_nt.3.query.sqlpp
@@ -21,15 +21,15 @@
 
 
 SELECT l_orderkey,
-       sum(l_extendedprice * (1 - l_discount)) AS revenue,
+       sum(l.l_extendedprice * (1 - l.l_discount)) AS revenue,
        o_orderdate,
        o_shippriority
-FROM  Customer,
-      Orders,
-      LineItem
-where c_mktsegment = 'BUILDING' AND c_custkey = o_custkey AND l_orderkey = o_orderkey AND o_orderdate < '1995-03-15' AND l_shipdate > '1995-03-15'
+FROM  Customer c,
+      Orders o,
+      LineItem l
+where c.c_mktsegment = 'BUILDING' AND c.c_custkey = o.o_custkey AND l.l_orderkey = o.o_orderkey AND o.o_orderdate < '1995-03-15' AND l.l_shipdate > '1995-03-15'
 /* +hash */
-GROUP BY l_orderkey, o_orderdate, o_shippriority
+GROUP BY l.l_orderkey, o.o_orderdate, o.o_shippriority
 ORDER BY revenue DESC,o_orderdate
 LIMIT 10
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q04_order_priority/q04_order_priority.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q04_order_priority/q04_order_priority.3.query.sqlpp
index e2e486d..c9457d5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q04_order_priority/q04_order_priority.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q04_order_priority/q04_order_priority.3.query.sqlpp
@@ -27,11 +27,11 @@
     WHERE l_commitdate < l_receiptdate
 )
 
-SELECT o_orderpriority AS order_priority, count(Orders) AS count
-FROM Orders
-JOIN tmp
-ON l_orderkey = o_orderkey
-WHERE o_orderdate >= '1993-07-01' AND o_orderdate < '1993-10-01'
-GROUP BY o_orderpriority
+SELECT o_orderpriority AS order_priority, count(o) AS count
+FROM Orders o
+JOIN tmp t
+ON t.l_orderkey = o.o_orderkey
+WHERE o.o_orderdate >= '1993-07-01' AND o.o_orderdate < '1993-10-01'
+GROUP BY o.o_orderpriority
 ORDER BY o_orderpriority
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q05_local_supplier_volume/q05_local_supplier_volume.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q05_local_supplier_volume/q05_local_supplier_volume.3.query.sqlpp
index dce8e76..921810b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q05_local_supplier_volume/q05_local_supplier_volume.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q05_local_supplier_volume/q05_local_supplier_volume.3.query.sqlpp
@@ -19,24 +19,24 @@
 
 USE tpch;
 
-SELECT n_name, sum(l_extendedprice * (1 - l_discount)) AS revenue
+SELECT n_name, sum(o1.l_extendedprice * (1 - o1.l_discount)) AS revenue
 FROM
-  Customer JOIN
-    ( SELECT n_name, l_extendedprice, l_discount, s_nationkey, o_custkey
-      FROM Orders JOIN
-      ( SELECT n_name, l_extendedprice, l_discount, l_orderkey, s_nationkey
-        FROM LineItem JOIN
-            (   SELECT n_name, s_suppkey, s_nationkey
-                FROM Supplier JOIN
-                (   SELECT n_name, n_nationkey
+  Customer c JOIN
+    ( SELECT l1.n_name, l1.l_extendedprice, l1.l_discount, l1.s_nationkey, o.o_custkey
+      FROM Orders o JOIN
+      ( SELECT s1.n_name, l.l_extendedprice, l.l_discount, l.l_orderkey, s1.s_nationkey
+        FROM LineItem l JOIN
+            (   SELECT n1.n_name, s.s_suppkey, s.s_nationkey
+                FROM Supplier s JOIN
+                (   SELECT n.n_name, n.n_nationkey
                     FROM Nation n JOIN Region r
-                    ON n_regionkey = r_regionkey
-                ) n1 ON s_nationkey = n_nationkey
+                    ON n.n_regionkey = r.r_regionkey
+                ) n1 ON s.s_nationkey = n1.n_nationkey
             ) s1
-        ON l_suppkey = s_suppkey
-      ) l1 ON l_orderkey = o_orderkey AND o_orderdate >= '1990-01-01'
-              AND o_orderdate < '1995-01-01'
+        ON l.l_suppkey = s1.s_suppkey
+      ) l1 ON l1.l_orderkey = o.o_orderkey AND o.o_orderdate >= '1990-01-01'
+              AND o.o_orderdate < '1995-01-01'
    ) o1
-ON c_nationkey = s_nationkey AND c_custkey = o_custkey
-GROUP BY n_name
+ON c.c_nationkey = o1.s_nationkey AND c.c_custkey = o1.o_custkey
+GROUP BY o1.n_name
 ORDER BY revenue DESC;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q07_volume_shipping/q07_volume_shipping.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q07_volume_shipping/q07_volume_shipping.3.query.sqlpp
index 0016fad..4166d0c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q07_volume_shipping/q07_volume_shipping.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q07_volume_shipping/q07_volume_shipping.3.query.sqlpp
@@ -34,21 +34,21 @@
 SELECT supp_nation, cust_nation, l_year, sum(volume) AS revenue
 FROM
   (
-    SELECT supp_nation, cust_nation,
-      get_year(l_shipdate) AS l_year,
-       l_extendedprice * (1 - l_discount) AS volume
+    SELECT t.supp_nation, t.cust_nation,
+      get_year(l3.l_shipdate) AS l_year,
+       l3.l_extendedprice * (1 - l3.l_discount) AS volume
     FROM
       q7_volume_shipping_tmp t JOIN
-        (SELECT l_shipdate, l_extendedprice, l_discount, c_nationkey, s_nationkey
-         FROM Supplier JOIN
-           (SELECT l_shipdate, l_extendedprice, l_discount, l_suppkey, c_nationkey
-            FROM Customer JOIN
-              (SELECT l_shipdate, l_extendedprice, l_discount, l_suppkey, o_custkey
-               FROM Orders
-               JOIN LineItem ON o_orderkey = l_orderkey AND l_shipdate >= '1992-01-01'
-                    AND l_shipdate <= '1996-12-31'
-               ) l1 ON c_custkey = o_custkey
-            ) l2 ON s_suppkey = l_suppkey
+        (SELECT l2.l_shipdate, l2.l_extendedprice, l2.l_discount, l2.c_nationkey, s.s_nationkey
+         FROM Supplier s JOIN
+           (SELECT l1.l_shipdate, l1.l_extendedprice, l1.l_discount, l1.l_suppkey, c.c_nationkey
+            FROM Customer c JOIN
+              (SELECT l.l_shipdate, l.l_extendedprice, l.l_discount, l.l_suppkey, o.o_custkey
+               FROM Orders o
+               JOIN LineItem l ON o.o_orderkey = l.l_orderkey AND l.l_shipdate >= '1992-01-01'
+                    AND l.l_shipdate <= '1996-12-31'
+               ) l1 ON c.c_custkey = l1.o_custkey
+            ) l2 ON s.s_suppkey = l2.l_suppkey
          ) l3 ON t.c_nationkey = l3.c_nationkey AND t.s_nationkey = l3.s_nationkey
    ) shipping
 GROUP BY supp_nation, cust_nation, l_year
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q08_national_market_share/q08_national_market_share.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q08_national_market_share/q08_national_market_share.3.query.sqlpp
index ce91102..704ea1b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q08_national_market_share/q08_national_market_share.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q08_national_market_share/q08_national_market_share.3.query.sqlpp
@@ -24,43 +24,43 @@
         SUM( CASE s_name = 'BRAZIL' WHEN true THEN revenue ELSE 0.0 END ) / SUM(revenue) AS mkt_share
 FROM  (
         SELECT o_year AS year,
-               l_extendedprice * (1 - l_discount) AS revenue,
-               n_name AS s_name
+               slnrcop.l_extendedprice * (1 - slnrcop.l_discount) AS revenue,
+               n.n_name AS s_name
         FROM  (
-                SELECT o_orderdate, l_discount, l_extendedprice, l_suppkey, s_nationkey
-                FROM  Supplier,
+                SELECT lnrcop.o_orderdate, lnrcop.l_discount, lnrcop.l_extendedprice, lnrcop.l_suppkey, s.s_nationkey
+                FROM  Supplier s,
                 (
-                  SELECT o_orderdate, l_discount, l_extendedprice, l_suppkey
+                  SELECT lnrco.o_orderdate, lnrco.l_discount, lnrco.l_extendedprice, lnrco.l_suppkey
                   FROM  (
-                         SELECT o_orderdate, l_partkey, l_discount, l_extendedprice, l_suppkey
-                         FROM  LineItem,
+                         SELECT nrco.o_orderdate, l.l_partkey, l.l_discount, l.l_extendedprice, l.l_suppkey
+                         FROM  LineItem l,
                                (
-                                SELECT o_orderdate, o_orderkey
-                                FROM  Orders,
+                                SELECT o.o_orderdate, o.o_orderkey
+                                FROM  Orders o,
                                       (
-                                        SELECT c_custkey
-                                        FROM  Customer,
+                                        SELECT c.c_custkey
+                                        FROM  Customer c,
                                               (
-                                                SELECT n_nationkey
-                                                FROM  Nation,
-                                                      Region
-                                                WHERE n_regionkey = r_regionkey AND r_name = 'AMERICA'
+                                                SELECT n.n_nationkey
+                                                FROM  Nation n,
+                                                      Region r
+                                                WHERE n.n_regionkey = r.r_regionkey AND r.r_name = 'AMERICA'
                                                 ) AS nr
-                                         WHERE c_nationkey = n_nationkey
+                                         WHERE c.c_nationkey = nr.n_nationkey
                                        ) AS nrc
-                                WHERE c_custkey = o_custkey
+                                WHERE nrc.c_custkey = o.o_custkey
                                 ) AS nrco
-                        WHERE l_orderkey = o_orderkey and o_orderdate >= '1995-01-01' and o_orderdate < '1996-12-31'
+                        WHERE l.l_orderkey = nrco.o_orderkey and nrco.o_orderdate >= '1995-01-01' and nrco.o_orderdate < '1996-12-31'
                         ) AS lnrco,
-                        Part
-                        WHERE p_partkey = l_partkey and p_type = 'ECONOMY ANODIZED STEEL'
+                        Part p
+                        WHERE p.p_partkey = lnrco.l_partkey and p.p_type = 'ECONOMY ANODIZED STEEL'
                     ) AS lnrcop
-                WHERE s_suppkey = l_suppkey
-                ) AS slnrcop,
-                Nation
-                LET o_year = GET_YEAR(o_orderdate)
-                WHERE s_nationkey = n_nationkey
-             ) as t
+                WHERE s.s_suppkey = lnrcop.l_suppkey
+            ) AS slnrcop,
+            Nation n
+        LET o_year = GET_YEAR(slnrcop.o_orderdate)
+        WHERE slnrcop.s_nationkey = n.n_nationkey
+    ) as t
 GROUP BY year
 ORDER BY year
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_nt/q09_product_type_profit_nt.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_nt/q09_product_type_profit_nt.3.query.sqlpp
index bcb3687..2e3bf7d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_nt/q09_product_type_profit_nt.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_nt/q09_product_type_profit_nt.3.query.sqlpp
@@ -23,24 +23,24 @@
 SELECT nation, o_year, sum(amount) AS sum_profit
 FROM
   (
-    SELECT   n_name AS nation,
-             get_year(o_orderdate) AS o_year,
-             l_extendedprice * (1 - l_discount) -  ps_supplycost * l_quantity AS amount
+    SELECT   l3.n_name AS nation,
+             get_year(o.o_orderdate) AS o_year,
+             l3.l_extendedprice * (1 - l3.l_discount) -  l3.ps_supplycost * l3.l_quantity AS amount
     FROM
-      Orders JOIN
+      Orders o JOIN
       (
-       SELECT l_extendedprice, l_discount, l_quantity, l_orderkey, n_name, ps_supplycost
-       FROM Part JOIN
-         (SELECT l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name, ps_supplycost
-          FROM Partsupp join
-            (SELECT l_suppkey, l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name
+       SELECT l2.l_extendedprice, l2.l_discount, l2.l_quantity, l2.l_orderkey, l2.n_name, l2.ps_supplycost
+       FROM Part p JOIN
+         (SELECT l1.l_extendedprice, l1.l_discount, l1.l_quantity, l1.l_partkey, l1.l_orderkey, l1.n_name, ps.ps_supplycost
+          FROM Partsupp ps join
+            (SELECT l.l_suppkey, l.l_extendedprice, l.l_discount, l.l_quantity, l.l_partkey, l.l_orderkey, s1.n_name
              FROM
-               (SELECT s_suppkey, n_name
-                FROM Nation JOIN Supplier ON n_nationkey = s_nationkey
-               ) s1 JOIN LineItem ON s_suppkey = l_suppkey
-            ) l1 ON ps_suppkey = l_suppkey AND ps_partkey = l_partkey
-         ) l2 ON contains(p_name,'green') AND p_partkey = l_partkey
-     ) l3 ON o_orderkey = l_orderkey
+               (SELECT s.s_suppkey, n.n_name
+                FROM Nation n JOIN Supplier s ON n.n_nationkey = s.s_nationkey
+               ) s1 JOIN LineItem l ON s1.s_suppkey = l.l_suppkey
+            ) l1 ON ps.ps_suppkey = l1.l_suppkey AND ps.ps_partkey = l1.l_partkey
+         ) l2 ON contains(p.p_name,'green') AND p.p_partkey = l2.l_partkey
+     ) l3 ON o.o_orderkey = l3.l_orderkey
   ) profit
 GROUP BY nation, o_year
 ORDER BY nation, o_year desc;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_parameter/q09_product_type_profit_parameter.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_parameter/q09_product_type_profit_parameter.3.query.sqlpp
index d7ab8ec..9a8c03c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_parameter/q09_product_type_profit_parameter.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q09_product_type_profit_parameter/q09_product_type_profit_parameter.3.query.sqlpp
@@ -24,24 +24,24 @@
 SELECT nation, o_year, sum(amount) AS sum_profit
 FROM
   (
-    SELECT   n_name AS nation,
-             get_year(o_orderdate) AS o_year,
-             l_extendedprice * (1 - l_discount) -  ps_supplycost * l_quantity AS amount
+    SELECT   l3.n_name AS nation,
+             get_year(o.o_orderdate) AS o_year,
+             l3.l_extendedprice * (1 - l3.l_discount) -  l3.ps_supplycost * l3.l_quantity AS amount
     FROM
-      Orders JOIN
+      Orders o JOIN
       (
-       SELECT l_extendedprice, l_discount, l_quantity, l_orderkey, n_name, ps_supplycost
-       FROM Part JOIN
-         (SELECT l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name, ps_supplycost
-          FROM Partsupp join
-            (SELECT l_suppkey, l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name
+       SELECT l2.l_extendedprice, l2.l_discount, l2.l_quantity, l2.l_orderkey, l2.n_name, l2.ps_supplycost
+       FROM Part p JOIN
+         (SELECT l1.l_extendedprice, l1.l_discount, l1.l_quantity, l1.l_partkey, l1.l_orderkey, l1.n_name, ps.ps_supplycost
+          FROM Partsupp ps join
+            (SELECT l.l_suppkey, l.l_extendedprice, l.l_discount, l.l_quantity, l.l_partkey, l.l_orderkey, s1.n_name
              FROM
-               (SELECT s_suppkey, n_name
-                FROM Nation JOIN Supplier ON n_nationkey = s_nationkey
-               ) s1 JOIN LineItem ON s_suppkey = l_suppkey
-            ) l1 ON ps_suppkey = l_suppkey AND ps_partkey = l_partkey
-         ) l2 ON contains(p_name,'green') AND p_partkey = l_partkey
-     ) l3 ON o_orderkey = l_orderkey
+               (SELECT s.s_suppkey, n.n_name
+                FROM Nation n JOIN Supplier s ON n.n_nationkey = s.s_nationkey
+               ) s1 JOIN LineItem l ON s1.s_suppkey = l.l_suppkey
+            ) l1 ON ps.ps_suppkey = l1.l_suppkey AND ps.ps_partkey = l1.l_partkey
+         ) l2 ON contains(p.p_name,'green') AND p.p_partkey = l2.l_partkey
+     ) l3 ON o.o_orderkey = l3.l_orderkey
   ) profit
 GROUP BY nation, o_year
 ORDER BY nation, o_year desc;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item/q10_returned_item.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item/q10_returned_item.3.query.sqlpp
index ef499de..f2f15ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item/q10_returned_item.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item/q10_returned_item.3.query.sqlpp
@@ -24,17 +24,17 @@
        sum(l_extendedprice * (1 - l_discount)) AS revenue,
        c_acctbal, n_name, c_address, c_phone, c_comment
 FROM  (
-        SELECT c_custkey, c_name, c_acctbal, n_name, c_address, c_phone, c_comment, l_extendedprice, l_discount
-        FROM  LineItem,
+        SELECT ocn.c_custkey, ocn.c_name, ocn.c_acctbal, ocn.n_name, ocn.c_address, ocn.c_phone, ocn.c_comment, l.l_extendedprice, l.l_discount
+        FROM  LineItem l,
           (
-            SELECT  c_custkey, c_name, c_acctbal, n_name, c_address, c_phone, c_comment, o_orderkey
-            from  Orders,
-                  Customer,
-                  Nation
-            WHERE c_custkey = o_custkey AND o_orderdate >= '1993-10-01'
-                  AND o_orderdate < '1994-01-01' AND c_nationkey = n_nationkey
+            SELECT  c.c_custkey, c.c_name, c.c_acctbal, n.n_name, c.c_address, c.c_phone, c.c_comment, o.o_orderkey
+            from  Orders o,
+                  Customer c,
+                  Nation n
+            WHERE c.c_custkey = o.o_custkey AND o.o_orderdate >= '1993-10-01'
+                  AND o.o_orderdate < '1994-01-01' AND c.c_nationkey = n.n_nationkey
           ) AS ocn
-        WHERE l_orderkey = o_orderkey and l_returnflag = 'R'
+        WHERE l.l_orderkey = ocn.o_orderkey and l.l_returnflag = 'R'
       ) AS locn
 GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment
 ORDER BY revenue DESC
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item_int64/q10_returned_item_int64.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item_int64/q10_returned_item_int64.3.query.sqlpp
index bd07d48..846954c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item_int64/q10_returned_item_int64.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q10_returned_item_int64/q10_returned_item_int64.3.query.sqlpp
@@ -25,17 +25,17 @@
        sum(l_extendedprice * (1 - l_discount)) AS revenue,
        c_acctbal, n_name, c_address, c_phone, c_comment
 FROM  (
-        SELECT c_custkey, c_name, c_acctbal, n_name, c_address, c_phone, c_comment, l_extendedprice, l_discount
-        FROM  LineItem,
+        SELECT ocn.c_custkey, ocn.c_name, ocn.c_acctbal, ocn.n_name, ocn.c_address, ocn.c_phone, ocn.c_comment, l.l_extendedprice, l.l_discount
+        FROM  LineItem l,
           (
-            SELECT  c_custkey, c_name, c_acctbal, n_name, c_address, c_phone, c_comment, o_orderkey
-            from  Orders,
-                  Customer,
-                  Nation
-            WHERE c_custkey = o_custkey AND o_orderdate >= '1993-10-01'
-                  AND o_orderdate < '1994-01-01' AND c_nationkey = n_nationkey
+            SELECT  c.c_custkey, c.c_name, c.c_acctbal, n.n_name, c.c_address, c.c_phone, c.c_comment, o.o_orderkey
+            from  Orders o,
+                  Customer c,
+                  Nation n
+            WHERE c.c_custkey = o.o_custkey AND o.o_orderdate >= '1993-10-01'
+                  AND o.o_orderdate < '1994-01-01' AND c.c_nationkey = n.n_nationkey
           ) AS ocn
-        WHERE l_orderkey = o_orderkey and l_returnflag = 'R'
+        WHERE l.l_orderkey = ocn.o_orderkey and l.l_returnflag = 'R'
       ) AS locn
 GROUP BY c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment
 ORDER BY revenue DESC
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q11_important_stock/q11_important_stock.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q11_important_stock/q11_important_stock.3.query.sqlpp
index b3a08e8..1b1c05a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q11_important_stock/q11_important_stock.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q11_important_stock/q11_important_stock.3.query.sqlpp
@@ -21,30 +21,30 @@
 
 
 WITH sum as (
-      SELECT ELEMENT SUM(ps_supplycost * ps_availqty)
-      FROM  Partsupp,
+      SELECT ELEMENT SUM(ps.ps_supplycost * ps.ps_availqty)
+      FROM  Partsupp ps,
             (
-                SELECT s_suppkey
-                FROM  Supplier,
-                      Nation
-                WHERE s_nationkey = n_nationkey
+                SELECT s.s_suppkey
+                FROM  Supplier s,
+                      Nation n
+                WHERE s.s_nationkey = n.n_nationkey
             ) AS sn
-      WHERE ps_suppkey = s_suppkey
+      WHERE ps.ps_suppkey = sn.s_suppkey
 )[0]
 
 SELECT ps_partkey AS partkey, part_value
 FROM  (
-        SELECT ps_partkey,
-               sum(ps_supplycost * ps_availqty) AS part_value
-        FROM  Partsupp,
+        SELECT ps.ps_partkey,
+               sum(ps.ps_supplycost * ps.ps_availqty) AS part_value
+        FROM  Partsupp ps,
               (
-                SELECT s_suppkey
-                FROM  Supplier,
-                      Nation
-                WHERE s_nationkey = n_nationkey
+                SELECT s.s_suppkey
+                FROM  Supplier s,
+                      Nation n
+                WHERE s.s_nationkey = n.n_nationkey
               ) sn
-        WHERE ps_suppkey = s_suppkey
-        GROUP BY ps_partkey
+        WHERE ps.ps_suppkey = sn.s_suppkey
+        GROUP BY ps.ps_partkey
 ) t1
 WHERE part_value > sum * 0.00001
 ORDER BY part_value DESC
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping/q12_shipping.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping/q12_shipping.3.query.sqlpp
index 5d0378a..b1fdff2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping/q12_shipping.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping/q12_shipping.3.query.sqlpp
@@ -21,13 +21,13 @@
 
 
 SELECT l_shipmode,
-       sum(CASE WHEN o_orderpriority = '1-URGENT' or o_orderpriority = '2-HIGH' THEN 1 ELSE 0 END) high_line_count,
-       sum(CASE o_orderpriority = '1-URGENT' or o_orderpriority = '2-HIGH' WHEN true THEN 0 ELSE 1 END) low_line_count
-FROM  LineItem,
-      Orders
-WHERE o_orderkey = l_orderkey AND l_commitdate < l_receiptdate AND
-      l_shipdate < l_commitdate AND l_receiptdate >= '1994-01-01' AND
-      l_receiptdate < '1995-01-01' AND (l_shipmode = 'MAIL' OR l_shipmode = 'SHIP')
-GROUP BY l_shipmode
+       sum(CASE WHEN o.o_orderpriority = '1-URGENT' or o.o_orderpriority = '2-HIGH' THEN 1 ELSE 0 END) high_line_count,
+       sum(CASE o.o_orderpriority = '1-URGENT' or o.o_orderpriority = '2-HIGH' WHEN true THEN 0 ELSE 1 END) low_line_count
+FROM  LineItem l,
+      Orders o
+WHERE o.o_orderkey = l.l_orderkey AND l.l_commitdate < l.l_receiptdate AND
+      l.l_shipdate < l.l_commitdate AND l.l_receiptdate >= '1994-01-01' AND
+      l.l_receiptdate < '1995-01-01' AND (l.l_shipmode = 'MAIL' OR l.l_shipmode = 'SHIP')
+GROUP BY l.l_shipmode
 ORDER BY l_shipmode
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping_broadcast/q12_shipping_broadcast.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping_broadcast/q12_shipping_broadcast.3.query.sqlpp
index 75b359c..28c9a9b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping_broadcast/q12_shipping_broadcast.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q12_shipping_broadcast/q12_shipping_broadcast.3.query.sqlpp
@@ -21,13 +21,13 @@
 
 
 SELECT l_shipmode,
-       sum(CASE WHEN o_orderpriority = '1-URGENT' or o_orderpriority = '2-HIGH' THEN 1 ELSE 0 END) high_line_count,
-       sum(CASE o_orderpriority = '1-URGENT' or o_orderpriority = '2-HIGH' WHEN true THEN 0 ELSE 1 END) low_line_count
-FROM  LineItem,
-      Orders
-WHERE l_orderkey /*+ bcast */ = o_orderkey AND l_commitdate < l_receiptdate AND
-      l_shipdate < l_commitdate AND l_receiptdate >= '1994-01-01' AND
-      l_receiptdate < '1995-01-01' AND (l_shipmode = 'MAIL' OR l_shipmode = 'SHIP')
-GROUP BY l_shipmode
+       sum(CASE WHEN o.o_orderpriority = '1-URGENT' or o.o_orderpriority = '2-HIGH' THEN 1 ELSE 0 END) high_line_count,
+       sum(CASE o.o_orderpriority = '1-URGENT' or o.o_orderpriority = '2-HIGH' WHEN true THEN 0 ELSE 1 END) low_line_count
+FROM  LineItem l,
+      Orders o
+WHERE l.l_orderkey /*+ bcast */ = o.o_orderkey AND l.l_commitdate < l.l_receiptdate AND
+      l.l_shipdate < l.l_commitdate AND l.l_receiptdate >= '1994-01-01' AND
+      l.l_receiptdate < '1995-01-01' AND (l.l_shipmode = 'MAIL' OR l.l_shipmode = 'SHIP')
+GROUP BY l.l_shipmode
 ORDER BY l_shipmode
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
index bd5f431..f8211c9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
@@ -28,10 +28,10 @@
                            (
                             select element o_orderkey
                             from  Orders
-                            where c_custkey = o_custkey and o_comment NOT LIKE '%special%requests%'
+                            where c.c_custkey = o_custkey and o_comment NOT LIKE '%special%requests%'
                            )
                          ) AS o_orderkey_count
-                from  Customer
+                from  Customer c
         ) co
         GROUP BY c_custkey
 ) gco
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q14_promotion_effect/q14_promotion_effect.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q14_promotion_effect/q14_promotion_effect.3.query.sqlpp
index d359369..f6b80fc8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q14_promotion_effect/q14_promotion_effect.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q14_promotion_effect/q14_promotion_effect.3.query.sqlpp
@@ -21,9 +21,9 @@
 
 
 SELECT ELEMENT 100.0 *
-     SUM( CASE WHEN p_type LIKE 'PROMO%' THEN l_extendedprice * (1 - l_discount) ELSE 0.0 END )
-     / SUM(l_extendedprice * (1 - l_discount))
-FROM  LineItem,
-      Part
-WHERE l_partkey = p_partkey AND l_shipdate >= '1995-09-01' AND l_shipdate < '1995-10-01'
+     SUM( CASE WHEN p.p_type LIKE 'PROMO%' THEN l.l_extendedprice * (1 - l.l_discount) ELSE 0.0 END )
+     / SUM(l.l_extendedprice * (1 - l.l_discount))
+FROM  LineItem l,
+      Part p
+WHERE l.l_partkey = p.p_partkey AND l.l_shipdate >= '1995-09-01' AND l.l_shipdate < '1995-10-01'
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q15_top_supplier/q15_top_supplier.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q15_top_supplier/q15_top_supplier.3.query.sqlpp
index 95a360e..ba35a74 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q15_top_supplier/q15_top_supplier.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q15_top_supplier/q15_top_supplier.3.query.sqlpp
@@ -33,13 +33,13 @@
       FROM revenue
 )[0]
 
-SELECT s_suppkey,
-       s_name,
-       s_address,
-       s_phone,
-       total_revenue
-FROM  Supplier,
-      revenue
-WHERE s_suppkey = supplier_no AND total_revenue < m + 0.000000001
-      AND total_revenue > m - 0.000000001
+SELECT s.s_suppkey,
+       s.s_name,
+       s.s_address,
+       s.s_phone,
+       r.total_revenue
+FROM  Supplier s,
+      revenue r
+WHERE s.s_suppkey = r.supplier_no AND r.total_revenue < m + 0.000000001
+      AND r.total_revenue > m - 0.000000001
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.query.sqlpp
index 5d9eef3..f253f86 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.query.sqlpp
@@ -22,16 +22,16 @@
 
 WITH tmp AS
 (
-    SELECT p_brand, p_type, p_size, ps_suppkey
+    SELECT psp.p_brand, psp.p_type, psp.p_size, psp.ps_suppkey
     FROM  (
-            SELECT p_brand, p_type, p_size, ps_suppkey
-            FROM  Partsupp,
-                  Part
-            WHERE p_partkey = ps_partkey AND p_brand != 'Brand#45' AND
-                  p_type NOT LIKE 'MEDIUM POLISHED%'
+            SELECT p.p_brand, p.p_type, p.p_size, ps.ps_suppkey
+            FROM  Partsupp ps,
+                  Part p
+            WHERE p.p_partkey = ps.ps_partkey AND p.p_brand != 'Brand#45' AND
+                  p.p_type NOT LIKE 'MEDIUM POLISHED%'
            ) AS psp,
-           Supplier
-    WHERE ps_suppkey = s_suppkey AND s_comment NOT LIKE '%Customer%Complaints%'
+           Supplier s
+    WHERE psp.ps_suppkey = s.s_suppkey AND s.s_comment NOT LIKE '%Customer%Complaints%'
 )
 
 SELECT p_brand, p_type, p_size, count(ps_suppkey) supplier_cnt
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.query.sqlpp
index e4f3299..569352f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.query.sqlpp
@@ -27,10 +27,10 @@
     GROUP BY l_partkey
 )
 
-SELECT ELEMENT SUM(l_extendedprice) / 7.0
-FROM  tmp,
-      LineItem,
-      Part
-WHERE p_partkey = l_partkey AND p_container = 'MED BOX'
-            AND l_partkey = t_partkey AND l_quantity < t_avg_quantity
+SELECT ELEMENT SUM(l.l_extendedprice) / 7.0
+FROM  tmp t,
+      LineItem l,
+      Part p
+WHERE p.p_partkey = l.l_partkey AND p.p_container = 'MED BOX'
+            AND l.l_partkey = t.t_partkey AND l.l_quantity < t.t_avg_quantity
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q18_large_volume_customer/q18_large_volume_customer.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q18_large_volume_customer/q18_large_volume_customer.3.query.sqlpp
index 4f0561c..2b12cfd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q18_large_volume_customer/q18_large_volume_customer.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q18_large_volume_customer/q18_large_volume_customer.3.query.sqlpp
@@ -27,14 +27,14 @@
 )
 
 SELECT c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice,
-       sum(l_quantity) sum_quantity
-FROM  Customer,
-      Orders,
+       sum(l.l_quantity) sum_quantity
+FROM  Customer c,
+      Orders o,
       tmp t,
       LineItem l
-WHERE c_custkey = o_custkey AND o_orderkey = t.l_orderkey
-      AND t.l_orderkey = l.l_orderkey AND t_sum_quantity > 30
-GROUP BY c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
+WHERE c.c_custkey = o.o_custkey AND o.o_orderkey = t.l_orderkey
+      AND t.l_orderkey = l.l_orderkey AND t.t_sum_quantity > 30
+GROUP BY c.c_name, c.c_custkey, o.o_orderkey, o.o_orderdate, o.o_totalprice
 ORDER BY o_totalprice DESC,o_orderdate
 LIMIT 100
 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q19_discounted_revenue/q19_discounted_revenue.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q19_discounted_revenue/q19_discounted_revenue.3.query.sqlpp
index 318e939..61f065a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q19_discounted_revenue/q19_discounted_revenue.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q19_discounted_revenue/q19_discounted_revenue.3.query.sqlpp
@@ -21,35 +21,35 @@
 
 set `import-private-functions` `true`;
 
-SELECT ELEMENT SUM(l_extendedprice * (1 - l_discount))
-FROM LineItem
-JOIN Part
-ON p_partkey = l_partkey
+SELECT ELEMENT SUM(l.l_extendedprice * (1 - l.l_discount))
+FROM LineItem l
+JOIN Part p
+ON p.p_partkey = l.l_partkey
   WHERE
   (
-    p_brand = 'Brand#12'
-    AND regexp_contains(p_container, 'SM CASE||SM BOX||SM PACK||SM PKG')
-    AND l_quantity >= 1 and l_quantity <= 11
-    AND p_size >= 1 and p_size <= 5
-    AND regexp_contains(l_shipmode, 'AIR||AIR REG')
-    AND l_shipinstruct = 'DELIVER IN PERSON'
+    p.p_brand = 'Brand#12'
+    AND regexp_contains(p.p_container, 'SM CASE||SM BOX||SM PACK||SM PKG')
+    AND l.l_quantity >= 1 and l.l_quantity <= 11
+    AND p.p_size >= 1 and p.p_size <= 5
+    AND regexp_contains(l.l_shipmode, 'AIR||AIR REG')
+    AND l.l_shipinstruct = 'DELIVER IN PERSON'
   )
   OR
   (
-    p_brand = 'Brand#23'
-    AND regexp_contains(p_container, 'MED BAG||MED BOX||MED PKG||MED PACK')
-    AND l_quantity >= 10 and l_quantity <= 20
-    AND p_size >= 1 and p_size <= 10
-    AND regexp_contains(l_shipmode, 'AIR||AIR REG')
-    AND l_shipinstruct = 'DELIVER IN PERSON'
+    p.p_brand = 'Brand#23'
+    AND regexp_contains(p.p_container, 'MED BAG||MED BOX||MED PKG||MED PACK')
+    AND l.l_quantity >= 10 and l.l_quantity <= 20
+    AND p.p_size >= 1 and p.p_size <= 10
+    AND regexp_contains(l.l_shipmode, 'AIR||AIR REG')
+    AND l.l_shipinstruct = 'DELIVER IN PERSON'
   )
   OR
   (
-    p_brand = 'Brand#34'
-    AND regexp_contains(p_container, 'LG CASE||LG BOX||LG PACK||LG PKG')
-    AND l_quantity >= 20 and l_quantity <= 30
-    AND p_size >= 1 and p_size <= 15
-    AND regexp_contains(l_shipmode, 'AIR||AIR REG')
-    AND l_shipinstruct = 'DELIVER IN PERSON'
+    p.p_brand = 'Brand#34'
+    AND regexp_contains(p.p_container, 'LG CASE||LG BOX||LG PACK||LG PKG')
+    AND l.l_quantity >= 20 and l.l_quantity <= 30
+    AND p.p_size >= 1 and p.p_size <= 15
+    AND regexp_contains(l.l_shipmode, 'AIR||AIR REG')
+    AND l.l_shipinstruct = 'DELIVER IN PERSON'
   )
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q20_potential_part_promotion/q20_potential_part_promotion.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q20_potential_part_promotion/q20_potential_part_promotion.3.query.sqlpp
index 2c138e8..0d28df3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q20_potential_part_promotion/q20_potential_part_promotion.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q20_potential_part_promotion/q20_potential_part_promotion.3.query.sqlpp
@@ -34,12 +34,12 @@
 ,
 q20_tmp3 AS
 (
-  SELECT ps_suppkey, ps_availqty, sum_quantity
-  FROM Partsupp
-  JOIN q20_tmp1
-  ON ps_partkey = p_partkey
-  JOIN q20_tmp2
-  ON ps_partkey = l_partkey and ps_suppkey = l_suppkey
+  SELECT ps.ps_suppkey, ps.ps_availqty, t2.sum_quantity
+  FROM Partsupp ps
+  JOIN q20_tmp1 t1
+  ON ps.ps_partkey = t1.p_partkey
+  JOIN q20_tmp2 t2
+  ON ps.ps_partkey = t2.l_partkey and ps.ps_suppkey = t2.l_suppkey
 )
 ,
 q20_tmp4 AS
@@ -50,10 +50,10 @@
   GROUP BY ps_suppkey
 )
 
-SELECT s_name, s_address
-FROM Supplier
-JOIN Nation
-ON s_nationkey = n_nationkey
-JOIN q20_tmp4
-ON s_suppkey = ps_suppkey
-ORDER BY s_name;
+SELECT s.s_name, s.s_address
+FROM Supplier s
+JOIN Nation n
+ON s.s_nationkey = n.n_nationkey
+JOIN q20_tmp4 t4
+ON s.s_suppkey = t4.ps_suppkey
+ORDER BY s.s_name;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
index 62a6d9d..13ea032 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
@@ -48,22 +48,22 @@
 
 SELECT s_name, count(t4) AS numwait
 FROM  (
-    SELECT s_name, l_suppkey, t2.l_orderkey, count_suppkey, max_suppkey
+    SELECT t3.s_name, t3.l_suppkey, t2.l_orderkey, t2.count_suppkey, t2.max_suppkey
     FROM  (
-            SELECT s_name, t1.l_orderkey AS l_orderkey, l_suppkey
+            SELECT ns.s_name, t1.l_orderkey AS l_orderkey, l.l_suppkey
             FROM  LineItem l,
                   (
-                        SELECT s_name, s_suppkey
-                        FROM Nation,
-                             Supplier
-                        WHERE s_nationkey = n_nationkey
+                        SELECT s.s_name, s.s_suppkey
+                        FROM Nation n,
+                             Supplier s
+                        WHERE s.s_nationkey = n.n_nationkey
                    ) AS ns,
-                   Orders,
+                   Orders o,
                    tmp1 AS t1
-            WHERE s_suppkey = l_suppkey AND l_receiptdate > l_commitdate
-                  AND o_orderkey = t1.l_orderkey AND l.l_orderkey = t1.l_orderkey
+            WHERE ns.s_suppkey = l.l_suppkey AND l.l_receiptdate > l.l_commitdate
+                  AND o.o_orderkey = t1.l_orderkey AND l.l_orderkey = t1.l_orderkey
           ) AS t3
-     JOIN tmp2 AS t2 ON count_suppkey >= 0 AND t3.l_orderkey = t2.l_orderkey
+     JOIN tmp2 AS t2 ON t2.count_suppkey >= 0 AND t3.l_orderkey = t2.l_orderkey
 ) AS t4
 GROUP BY s_name
 ORDER BY numwait DESC, s_name
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
index f873dc6..a3a4473 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
@@ -21,7 +21,7 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, substring(c_phone,1,2) AS cntrycode
+    SELECT c_acctbal, c_custkey, substring(c_phone,0,2) AS cntrycode
     FROM  Customer
 )
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue562/query-issue562.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue562/query-issue562.3.query.sqlpp
index afd3db5..c6afe18 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue562/query-issue562.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue562/query-issue562.3.query.sqlpp
@@ -28,9 +28,9 @@
 
 WITH q22_customer_tmp AS
 (
-    SELECT c_acctbal, c_custkey, phone_substr AS cntrycode
-    FROM  Customer
-    LET  phone_substr = substring(c_phone,1,2)
+    SELECT c.c_acctbal, c.c_custkey, phone_substr AS cntrycode
+    FROM  Customer c
+    LET  phone_substr = substring(c_phone,0,2)
     WHERE phone_substr = '13' OR phone_substr = '31' OR phone_substr = '23' OR phone_substr = '29'
           OR phone_substr = '30' OR phone_substr = '18' OR phone_substr = '17'
 )
@@ -40,7 +40,7 @@
 WHERE coll_count((
                 SELECT ELEMENT Orders
                 FROM  Orders
-                WHERE c_custkey = o_custkey
+                WHERE ct.c_custkey = o_custkey
             )) = 0
 GROUP BY cntrycode
 ORDER BY cntrycode
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue638/query-issue638.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue638/query-issue638.3.query.sqlpp
index 5854816..cb6eca7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue638/query-issue638.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue638/query-issue638.3.query.sqlpp
@@ -29,24 +29,24 @@
 SELECT nation, o_year, sum(amount) AS sum_profit
 FROM
   (
-    SELECT   n_name AS nation,
-             GET_YEAR(o_orderdate) AS o_year,
-             l_extendedprice * (1 - l_discount) -  ps_supplycost * l_quantity AS amount
+    SELECT   l3.n_name AS nation,
+             GET_YEAR(o.o_orderdate) AS o_year,
+             l3.l_extendedprice * (1 - l3.l_discount) -  l3.ps_supplycost * l3.l_quantity AS amount
     FROM
       Orders o JOIN
       (
-       SELECT l_extendedprice, l_discount, l_quantity, l_orderkey, n_name, ps_supplycost
+       SELECT l2.l_extendedprice, l2.l_discount, l2.l_quantity, l2.l_orderkey, l2.n_name, l2.ps_supplycost
        FROM Part p JOIN
-         (SELECT l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name, ps_supplycost
+         (SELECT l1.l_extendedprice, l1.l_discount, l1.l_quantity, l1.l_partkey, l1.l_orderkey, l1.n_name, ps.ps_supplycost
           FROM Partsupp ps join
-            (SELECT l_suppkey, l_extendedprice, l_discount, l_quantity, l_partkey, l_orderkey, n_name
+            (SELECT l.l_suppkey, l.l_extendedprice, l.l_discount, l.l_quantity, l.l_partkey, l.l_orderkey, s1.n_name
              FROM
-               (SELECT s_suppkey, n_name
-                FROM Nation n join Supplier s ON n_nationkey = s_nationkey
-               ) s1 JOIN LineItem l ON s_suppkey = l_suppkey
-            ) l1 ON ps_suppkey = l_suppkey and ps_partkey = l_partkey
-         ) l2 ON contains(p_name,'green') AND p_partkey = l_partkey
-     ) l3 ON o_orderkey = l_orderkey
+               (SELECT s.s_suppkey, n.n_name
+                FROM Nation n join Supplier s ON n.n_nationkey = s.s_nationkey
+               ) s1 JOIN LineItem l ON s1.s_suppkey = l.l_suppkey
+            ) l1 ON ps.ps_suppkey = l1.l_suppkey and ps.ps_partkey = l1.l_partkey
+         ) l2 ON contains(p.p_name,'green') AND p.p_partkey = l2.l_partkey
+     ) l3 ON o.o_orderkey = l3.l_orderkey
   ) profit
 GROUP BY nation, o_year
 ORDER BY nation, o_year desc;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785-2/query-issue785-2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785-2/query-issue785-2.3.query.sqlpp
index 9254656..609ad06 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785-2/query-issue785-2.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785-2/query-issue785-2.3.query.sqlpp
@@ -33,19 +33,19 @@
       WHERE nation.n_nationkey = sn.n_nationkey
 ),
 X as (
-      SELECT nation_key, orderdate AS order_date, sum(o_totalprice) AS sum_price
-      FROM  t,
-            Customer,
-            Orders
-      WHERE o_custkey = c_custkey and c_nationkey = n_nationkey
-      GROUP BY o_orderdate AS orderdate, n_nationkey AS nation_key
+      SELECT nation_key, orderdate AS order_date, sum(o.o_totalprice) AS sum_price
+      FROM  t n,
+            Customer c,
+            Orders o
+      WHERE o.o_custkey = c.c_custkey and c.c_nationkey = n.n_nationkey
+      GROUP BY o.o_orderdate AS orderdate, n.n_nationkey AS nation_key
 )
 
 SELECT nation_key,
        (
             SELECT g.X.order_date AS orderdate, g.X.sum_price
             FROM  g // the X here refers to implicit variable X defined in the outer FROM.
-            ORDER BY sum_price desc
+            ORDER BY g.X.sum_price desc
             LIMIT 3
         ) AS sum_price
 FROM  X
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785/query-issue785.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785/query-issue785.3.query.sqlpp
index 8d4460a..541b3ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785/query-issue785.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue785/query-issue785.3.query.sqlpp
@@ -36,12 +36,12 @@
             LIMIT 3
         ) AS sum_price
 FROM  (
-        SELECT nation_key, orderdate AS order_date, sum(o_totalprice) AS sum_price
-        FROM  Nation,
-              Customer,
-              Orders AS orders
-        WHERE o_custkey = c_custkey AND c_nationkey = n_nationkey
-        GROUP BY o_orderdate as orderdate, n_nationkey as nation_key
+        SELECT nation_key, orderdate AS order_date, sum(o.o_totalprice) AS sum_price
+        FROM  Nation n,
+              Customer c,
+              Orders o
+        WHERE o.o_custkey = c.c_custkey AND c.c_nationkey = n.n_nationkey
+        GROUP BY o.o_orderdate as orderdate, n.n_nationkey as nation_key
 ) AS x
 GROUP BY nation_key
 GROUP AS g
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue786/query-issue786.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue786/query-issue786.3.query.sqlpp
index a9fc808..5eda643 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue786/query-issue786.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql-sugar/query-issue786/query-issue786.3.query.sqlpp
@@ -29,11 +29,11 @@
 SELECT  nation.n_nationkey AS nation_key,
         nation.n_name AS name,
         (
-            SELECT orderdate AS order_date, sum(o_totalprice) AS sum_price
-            FROM  Orders,
-                  Customer
-            WHERE o_custkey = c_custkey AND c_nationkey = nation.n_nationkey
-            GROUP BY o_orderdate as orderdate
+            SELECT orderdate AS order_date, sum(o.o_totalprice) AS sum_price
+            FROM  Orders o,
+                  Customer c
+            WHERE o.o_custkey = c.c_custkey AND c.c_nationkey = nation.n_nationkey
+            GROUP BY o.o_orderdate as orderdate
             ORDER BY sum_price DESC
             LIMIT 3
         ) AS aggregates
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
index 109e5a9..206033a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
@@ -22,7 +22,7 @@
 
 declare function q22_customer_tmp() {
 (
-    SELECT c.c_acctbal AS c_acctbal, c.c_custkey AS c_custkey, substring(c.c_phone,1,2) AS cntrycode
+    SELECT c.c_acctbal AS c_acctbal, c.c_custkey AS c_custkey, substring(c.c_phone,0,2) AS cntrycode
     FROM  Customer AS c
 )
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/query-issue562/query-issue562.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/query-issue562/query-issue562.3.query.sqlpp
index 3c99324..531e17f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/query-issue562/query-issue562.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-sql/query-issue562/query-issue562.3.query.sqlpp
@@ -30,7 +30,7 @@
 (
     SELECT c.c_acctbal AS c_acctbal, c.c_custkey AS c_custkey, phone_substr AS cntrycode
     FROM  Customer AS c
-    WITH  phone_substr AS substring(c.c_phone,1,2)
+    WITH  phone_substr AS substring(c.c_phone,0,2)
     WHERE phone_substr = '13' OR phone_substr = '31' OR phone_substr = '23' OR phone_substr = '29'
           OR phone_substr = '30' OR phone_substr = '18' OR phone_substr = '17'
 )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
index 4823a39..0c0bdaa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
@@ -41,6 +41,6 @@
 ) as gco
 group by gco.c_count as c_count
 group as g
-let  custdist = count(( select value gco from g ))
+let  custdist = count(gco)
 order by custdist desc,c_count desc
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
index 3963de0..65293dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
@@ -78,6 +78,6 @@
 ) as t4
 group by t4.s_name as s_name
 group as g
-let  numwait = count(( from g select value t4 ))
+let  numwait = coll_count(( from g select value t4 ))
 order by numwait desc,s_name
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
index bdd7323..d33a095 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
@@ -22,7 +22,7 @@
 
 declare function q22_customer_tmp() {
 (
-    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,1,2)}
+    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,0,2)}
     from  Customer as c
 )
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue562/query-issue562.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue562/query-issue562.3.query.sqlpp
index dc54947..4cd5d54 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue562/query-issue562.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue562/query-issue562.3.query.sqlpp
@@ -30,14 +30,14 @@
 (
     select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':phone_substr}
     from  Customer as c
-    let  phone_substr = tpch.substring(c.c_phone,1,2)
+    let  phone_substr = tpch.substring(c.c_phone,0,2)
     where ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17'))
 )
 };
 with  avg as tpch.coll_avg((
       select element c.c_acctbal
       from  Customer as c
-      let  phone_substr = tpch.substring(c.c_phone,1,2)
+      let  phone_substr = tpch.substring(c.c_phone,0,2)
       where ((c.c_acctbal > 0.0) and ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17')))
   ))
 select element {'cntrycode':cntrycode,'numcust':tpch.count(ct),'totacctbal':tpch.coll_sum((
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue601/query-issue601.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue601/query-issue601.3.query.sqlpp
index 3f3a50a..4689676 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue601/query-issue601.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch-with-index/query-issue601/query-issue601.3.query.sqlpp
@@ -26,7 +26,7 @@
 use tpch;
 
 
-select element {'l_linenumber':l.l_linenumber,'count_order': count((from g select value g))}
+select element {'l_linenumber':l.l_linenumber,'count_order': coll_count((from g select value g))}
 from  LineItem as l
 group by l.l_linenumber
 group as g
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
index 4823a39..0c0bdaa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.query.sqlpp
@@ -41,6 +41,6 @@
 ) as gco
 group by gco.c_count as c_count
 group as g
-let  custdist = count(( select value gco from g ))
+let  custdist = count(gco)
 order by custdist desc,c_count desc
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
index 3963de0..65293dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.query.sqlpp
@@ -78,6 +78,6 @@
 ) as t4
 group by t4.s_name as s_name
 group as g
-let  numwait = count(( from g select value t4 ))
+let  numwait = coll_count(( from g select value t4 ))
 order by numwait desc,s_name
 ;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
index bdd7323..d33a095 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.query.sqlpp
@@ -22,7 +22,7 @@
 
 declare function q22_customer_tmp() {
 (
-    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,1,2)}
+    select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':SUBSTR(c.c_phone,0,2)}
     from  Customer as c
 )
 };
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue562/query-issue562.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue562/query-issue562.3.query.sqlpp
index dc54947..4cd5d54 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue562/query-issue562.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue562/query-issue562.3.query.sqlpp
@@ -30,14 +30,14 @@
 (
     select element {'c_acctbal':c.c_acctbal,'c_custkey':c.c_custkey,'cntrycode':phone_substr}
     from  Customer as c
-    let  phone_substr = tpch.substring(c.c_phone,1,2)
+    let  phone_substr = tpch.substring(c.c_phone,0,2)
     where ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17'))
 )
 };
 with  avg as tpch.coll_avg((
       select element c.c_acctbal
       from  Customer as c
-      let  phone_substr = tpch.substring(c.c_phone,1,2)
+      let  phone_substr = tpch.substring(c.c_phone,0,2)
       where ((c.c_acctbal > 0.0) and ((phone_substr = '13') or (phone_substr = '31') or (phone_substr = '23') or (phone_substr = '29') or (phone_substr = '30') or (phone_substr = '18') or (phone_substr = '17')))
   ))
 select element {'cntrycode':cntrycode,'numcust':tpch.count(ct),'totacctbal':tpch.coll_sum((
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue601/query-issue601.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue601/query-issue601.3.query.sqlpp
index 3f3a50a..4689676 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue601/query-issue601.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpch/query-issue601/query-issue601.3.query.sqlpp
@@ -26,7 +26,7 @@
 use tpch;
 
 
-select element {'l_linenumber':l.l_linenumber,'count_order': count((from g select value g))}
+select element {'l_linenumber':l.l_linenumber,'count_order': coll_count((from g select value g))}
 from  LineItem as l
 group by l.l_linenumber
 group as g
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.3.query.sqlpp
deleted file mode 100644
index bd68de8..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.3.query.sqlpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-USE TinySocial;
-
-SELECT t.id id
-FROM FacebookUsers AS t
-UNION ALL
-SELECT s.`message-id` id
-FROM FacebookMessages AS s
-UNION ALL
-SELECT t.name id
-FROM FacebookUsers AS t
-ORDER BY t.id; // There is certainly no field called "t" in the union all results.
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.1.ddl.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.1.ddl.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.1.ddl.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.2.update.sqlpp
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_negative_2/union_negative_2.2.update.sqlpp
rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.2.update.sqlpp
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.3.query.sqlpp
new file mode 100644
index 0000000..b527e71
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/union/union_order_by_5/union_orderby_5.3.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+USE TinySocial;
+
+SELECT t.id id
+FROM FacebookUsers AS t
+UNION ALL
+SELECT s.`message-id` id
+FROM FacebookMessages AS s
+UNION ALL
+SELECT t.name id
+FROM FacebookUsers AS t
+ORDER BY t.id, id; // There is certainly no field called "t" in the union all results.
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp
index 872e1bc..edfa1d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/multiple-correlated-secondaries/multiple-correlated-secondaries.1.ddl.sqlpp
@@ -35,11 +35,19 @@
 
 create dataset UpsertTo(MyRecord)
 primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 
 create dataset UpsertFrom(MyRecord)
 primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp
index d1db047..6095171 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-btree/primary-secondary-btree.1.ddl.sqlpp
@@ -34,9 +34,17 @@
 };
 
 create dataset UpsertTo(TestType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset UpsertFrom(TestType) primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp
index f54ab2b..0b2b260 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-inverted/primary-correlated-secondary-inverted.1.ddl.sqlpp
@@ -30,10 +30,18 @@
 
 create dataset UpsertToDBLP(DBLPType)
 primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset UpsertFromDBLP(DBLPType)
 primary key id
-using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp
index cc33f84..4cc2324 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/upsert/primary-correlated-secondary-rtree/primary-correlated-secondary-rtree.1.ddl.sqlpp
@@ -33,11 +33,19 @@
 };
 
 create dataset UpsertTo(MyRecord)
- primary key id
- using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+primary key id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
 
 create dataset UpsertFrom(MyRecord)
- primary key id
- using compaction policy `correlated-prefix`
-((`max-mergable-component-size`=`16384`),(`max-tolerance-component-count`=`3`));
+primary key id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp
new file mode 100644
index 0000000..36eed22
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-1/bad-function-ddl-1.1.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF on a dataset that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create function bad_function(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place))
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-10/bad-function-ddl-10.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-10/bad-function-ddl-10.1.ddl.sqlpp
new file mode 100644
index 0000000..efeff1c
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-10/bad-function-ddl-10.1.ddl.sqlpp
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a function that does not exist in the right dataverse
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+drop dataverse two if exists;
+create dataverse two;
+use two;
+
+create function f0(message, text){
+  contains(message,text)
+};
+
+create function experiments.f2(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place)
+  and f1(m.message_text,text)
+  and f0(m.message_text,text))
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-2/bad-function-ddl-2.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-2/bad-function-ddl-2.1.ddl.sqlpp
new file mode 100644
index 0000000..7288045
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-2/bad-function-ddl-2.1.ddl.sqlpp
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF on a dataset that should be qualified
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
+
+create function bad_function(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place))
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-3/bad-function-ddl-3.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-3/bad-function-ddl-3.1.ddl.sqlpp
new file mode 100644
index 0000000..0b7f8c7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-3/bad-function-ddl-3.1.ddl.sqlpp
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a foreign UDF on a dataset that is local and not qualified
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function experiments.bad_function(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place))
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-4/bad-function-ddl-4.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-4/bad-function-ddl-4.1.ddl.sqlpp
new file mode 100644
index 0000000..d36bad5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-4/bad-function-ddl-4.1.ddl.sqlpp
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF on a dataset that should be qualified
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+drop dataverse experiments2 if exists;
+create dataverse experiments2;
+use experiments2;
+
+create function bad_function(place, text) {
+  (select m.message_text
+  from experients.TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place))
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp
new file mode 100644
index 0000000..f3b0c0f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-5/bad-function-ddl-5.1.ddl.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a function that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+
+create function bad_function(place, text) {
+  function_that_does_not_exist()
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-6/bad-function-ddl-6.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-6/bad-function-ddl-6.1.ddl.sqlpp
new file mode 100644
index 0000000..669f979
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-6/bad-function-ddl-6.1.ddl.sqlpp
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a function that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+
+create function bad_function(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where function_that_does_not_exist(m.message_text,text)
+  and spatial_intersect(m.sender_location, place))
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-7/bad-function-ddl-7.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-7/bad-function-ddl-7.1.ddl.sqlpp
new file mode 100644
index 0000000..6fa1d16
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-7/bad-function-ddl-7.1.ddl.sqlpp
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a dataset that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function good_function(place) {
+  place
+};
+
+create function bad_function(place, text) {
+  good_function((select m.sender_location
+  from TweetMessaes m))
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-8/bad-function-ddl-8.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-8/bad-function-ddl-8.1.ddl.sqlpp
new file mode 100644
index 0000000..0bcb4f0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-8/bad-function-ddl-8.1.ddl.sqlpp
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a function that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+
+create function bad_function(place, text) {
+  (select * from (select m.message_text
+  from TweetMessaes m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place)) text)
+};
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-9/bad-function-ddl-9.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-9/bad-function-ddl-9.1.ddl.sqlpp
new file mode 100644
index 0000000..23653b0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/bad-function-ddl-9/bad-function-ddl-9.1.ddl.sqlpp
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Declare a UDF that uses a function that does not exist
+ * Expected Res : Error
+ */
+
+drop dataverse experiments if exists;
+create dataverse experiments;
+use experiments;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function good_function(place) {
+  place
+};
+
+create function bad_function(place, text) {
+  good_function(function_that_does_not_exist())
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.1.ddl.sqlpp
new file mode 100644
index 0000000..c9639c4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.1.ddl.sqlpp
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Verify Function Dependency Metadata
+ * Expected Res : Success
+ * Date         : Dec 15th 2017
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse B;
+create dataverse C;
+use C;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+create function f4(){
+(select * from TweetMessages)
+};
+
+use B;
+
+create dataset TweetMessages2(C.TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f0(message, text){
+  contains(message,text)
+};
+
+create function C.f2(place, text) {
+  (select m.message_text
+  from TweetMessages m
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place)
+  and f1(m.message_text,text)
+  and B.f0(m.message_text,text))
+};
+
+create function C.f3(place, text) {
+  f2(place, text)
+};
+
+create function f5(place, text){
+ (select m.message_text
+  from TweetMessages2 m, C.TweetMessages m2
+  where contains(m.message_text,text)
+  and spatial_intersect(m.sender_location, place)
+  and C.f1(m.message_text,text)
+  and f0(m2.message_text,text))
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.2.query.sqlpp
new file mode 100644
index 0000000..e9ab11e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.2.query.sqlpp
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Verify Function Dependency Metadata
+ * Expected Res : Success
+ * Date         : Dec 15th 2017
+ */
+
+select f.DataverseName,f.Name,f.Dependencies from Metadata.`Function` f
+order by f.DataverseName, f.Name;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.3.ddl.sqlpp
new file mode 100644
index 0000000..215118b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/check-dependencies-1/check-dependencies-1.3.ddl.sqlpp
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Verify Function Dependency Metadata
+ * Expected Res : Success
+ * Date         : Dec 15th 2017
+ */
+
+drop function B.f5@2;
+drop function C.f3@2;
+drop function C.f2@2;
+
+drop dataset B.TweetMessages2;
+
+drop dataverse C;
+drop dataverse B;
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp
new file mode 100644
index 0000000..08ad454
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-1/drop-dependency.1.ddl.sqlpp
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse B;
+create dataverse C;
+use C;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+use B;
+
+create function f0(message, text){
+  C.f1(message,text)
+};
+
+drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
new file mode 100644
index 0000000..53debdf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-2/drop-dependency.2.ddl.sqlpp
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse B;
+create dataverse C;
+use C;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+use B;
+
+create function f2(place, text){
+ (select m.message_text
+  from C.TweetMessages m)
+};
+
+drop dataverse C;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
new file mode 100644
index 0000000..7e7b60e
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-3/drop-dependency.3.ddl.sqlpp
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse B;
+create dataverse C;
+use C;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+use B;
+
+create function f0(message, text){
+  C.f1(message,text)
+};
+
+use C;
+drop function f1@2;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
new file mode 100644
index 0000000..c972efc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-4/drop-dependency.4.ddl.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse B;
+create dataverse C;
+use C;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+use B;
+
+create function f2(place, text){
+ (select m.message_text
+  from C.TweetMessages m)
+};
+
+use C;
+drop dataset TweetMessages;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
new file mode 100644
index 0000000..3a7f4dc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-5/drop-dependency.5.ddl.sqlpp
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse C;
+use C;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+create function f0(message, text){
+  C.f1(message,text)
+};
+
+drop function f1@2;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
new file mode 100644
index 0000000..3ab7b6f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/drop-dependency-6/drop-dependency.6.ddl.sqlpp
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under A
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Description  : Try to drop a functional dependency
+ * Expected Res : Error
+ */
+
+drop dataverse B if exists;
+drop dataverse C if exists;
+create dataverse C;
+use C;
+
+create type TweetMessageType as closed {
+  tweetid: uuid,
+  sender_location: point,
+  send_time: datetime,
+  referred_topics: {{ string }},
+  message_text: string,
+  countA: int32,
+  countB: int32
+};
+
+create dataset TweetMessages(TweetMessageType)
+primary key tweetid autogenerated;
+
+create function f1(message, text){
+  contains(message,text)
+};
+
+create function f2(place, text){
+ (select m.message_text
+  from C.TweetMessages m)
+};
+
+drop dataset TweetMessages;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.2.query.sqlpp
index 75e6c45..a383042 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.2.query.sqlpp
@@ -25,6 +25,6 @@
 
 select element coll_count((
     select element x
-    from  `Metadata.Function` as x
+    from  `Metadata`.`Function` as x
     where (x.DataverseName = 'test')
 ));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.4.query.sqlpp
index 75e6c45..a383042 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.4.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/query-issue489/query-issue489.4.query.sqlpp
@@ -25,6 +25,6 @@
 
 select element coll_count((
     select element x
-    from  `Metadata.Function` as x
+    from  `Metadata`.`Function` as x
     where (x.DataverseName = 'test')
 ));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/single-line-definition/single-line-definition.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/single-line-definition/single-line-definition.2.query.sqlpp
index 6e47c62..f27f5a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/single-line-definition/single-line-definition.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/single-line-definition/single-line-definition.2.query.sqlpp
@@ -30,6 +30,6 @@
 'ReturnType': l.ReturnType,
 'Definition': l.`Definition`
 }
-from  `Metadata.Function` as l
+from  `Metadata`.`Function` as l
 where (l.DataverseName = 'test')
 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf09/udf09.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf09/udf09.3.query.sqlpp
index 540c1eb..b212a37 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf09/udf09.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf09/udf09.3.query.sqlpp
@@ -27,6 +27,6 @@
 
 select element test.readDataset((
     select element a
-    from  `test.t1` as a
+    from  `test`.`t1` as a
     order by a.id
 ));
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf17/udf17.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf17/udf17.1.ddl.sqlpp
index 82098f8..3c5c441 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf17/udf17.1.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf17/udf17.1.ddl.sqlpp
@@ -29,10 +29,10 @@
 
 use test;
 
-create function test.parent(){
-test.child()
-};
-
 create function test.child() {
 'This data is from the child function'
 };
+
+create function test.parent(){
+test.child()
+};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf23/udf23.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf23/udf23.3.query.sqlpp
index fc52968..91359a7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf23/udf23.3.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf23/udf23.3.query.sqlpp
@@ -26,7 +26,7 @@
 
 
 select element l
-from  `Metadata.Dataset` as l
+from  `Metadata`.`Dataset` as l
 where (l.DataverseName = 'Metadata')
 order by l.DatasetName
 limit test.numRows()
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.1.ddl.sqlpp
deleted file mode 100644
index fc23af0..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.1.ddl.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
-drop dataverse test if exists;
-create dataverse test;
-
-use test;
-
-create function test.needs_f1(x){
- x + f1()
-};
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.2.update.sqlpp
deleted file mode 100644
index 62a7a0b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.2.update.sqlpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.3.query.sqlpp
deleted file mode 100644
index 161929d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf26/udf26.3.query.sqlpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create UDF and define with missing references.
- * Expected Res : Failure
- * Date         : Sep 6th 2012
- */
-
-use test;
-
-
-select element test.needs_f1(12345);
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf28/udf28.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf28/udf28.2.query.sqlpp
index 1083570..ce0756e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf28/udf28.2.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/user-defined-functions/udf28/udf28.2.query.sqlpp
@@ -29,6 +29,6 @@
 'ReturnType': l.ReturnType,
 'Definition': l.`Definition`
 }
-from  `Metadata.Function` as l
+from  `Metadata`.`Function` as l
 where (l.DataverseName = 'test')
 ;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/replication.xml b/asterixdb/asterix-app/src/test/resources/runtimets/replication.xml
new file mode 100644
index 0000000..469446d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/replication.xml
@@ -0,0 +1,53 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries_sqlpp"
+            QueryFileExtension=".sqlpp">
+  <test-group name="replication">
+    <test-case FilePath="replication">
+      <compilation-unit name="add_replica">
+        <output-dir compare="Text">add_replica</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="replication">
+      <compilation-unit name="metadata_failover">
+        <output-dir compare="Text">metadata_failover</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="replication">
+      <compilation-unit name="bulkload">
+        <output-dir compare="Text">bulkload</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="replication">
+      <compilation-unit name="mem_component_recovery">
+        <output-dir compare="Text">mem_component_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="replication">
+      <compilation-unit name="flushed_component">
+        <output-dir compare="Text">flushed_component</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="replication">
+      <compilation-unit name="release_partition">
+        <output-dir compare="Text">release_partition</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
index e8f018e..59057b1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1/cluster_state_1.1.regexadm
@@ -21,11 +21,14 @@
     "metadata\.listen\.port" : 0,
     "metadata\.node" : "asterix_nc1",
     "metadata\.registration\.timeout\.secs" : 60,
+    "replication\.enabled" : false,
+    "replication\.factor" : 2,
     "replication\.log\.batchsize" : 4096,
     "replication\.log\.buffer\.numpages" : 8,
     "replication\.log\.buffer\.pagesize" : 131072,
-    "replication\.max\.remote\.recovery\.attempts" : 5,
+    "replication\.strategy" : "none",
     "replication\.timeout" : 30,
+    "storage.max.active.writable.datasets" : 8,
     "txn\.commitprofiler\.enabled" : false,
     "txn\.commitprofiler\.reportinterval" : 5,
     "txn\.job\.recovery\.memorysize" : 67108864,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
index e099835..13dacb8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_full/cluster_state_1_full.1.regexadm
@@ -13,7 +13,7 @@
     "compiler\.sortmemory" : 327680,
     "default\.dir" : "target/io/dir/asterixdb",
     "instance\.name" : "DEFAULT_INSTANCE",
-    "log\.level" : "WARNING",
+    "log\.level" : "WARN",
     "max\.wait\.active\.cluster" : 60,
     "messaging\.frame\.count" : 512,
     "messaging\.frame\.size" : 4096,
@@ -21,11 +21,14 @@
     "metadata\.listen\.port" : 0,
     "metadata\.node" : "asterix_nc1",
     "metadata\.registration\.timeout\.secs" : 60,
+    "replication\.enabled" : false,
+    "replication\.factor" : 2,
     "replication\.log\.batchsize" : 4096,
     "replication\.log\.buffer\.numpages" : 8,
     "replication\.log\.buffer\.pagesize" : 131072,
-    "replication\.max\.remote\.recovery\.attempts" : 5,
+    "replication\.strategy" : "none",
     "replication\.timeout" : 30,
+    "storage.max.active.writable.datasets" : 8,
     "txn\.commitprofiler\.enabled" : false,
     "txn\.commitprofiler\.reportinterval" : 5,
     "txn\.job\.recovery\.memorysize" : 67108864,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
index b3fe5cc..9f18638 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/cluster_state_1_less/cluster_state_1_less.1.regexadm
@@ -13,7 +13,7 @@
     "compiler\.sortmemory" : 327680,
     "default\.dir" : "target/io/dir/asterixdb",
     "instance\.name" : "DEFAULT_INSTANCE",
-    "log\.level" : "WARNING",
+    "log\.level" : "WARN",
     "max\.wait\.active\.cluster" : 60,
     "messaging\.frame\.count" : 512,
     "messaging\.frame\.size" : 4096,
@@ -21,11 +21,14 @@
     "metadata\.listen\.port" : 0,
     "metadata\.node" : "asterix_nc1",
     "metadata\.registration\.timeout\.secs" : 60,
+    "replication\.enabled" : false,
+    "replication\.factor" : 2,
     "replication\.log\.batchsize" : 4096,
     "replication\.log\.buffer\.numpages" : 8,
     "replication\.log\.buffer\.pagesize" : 131072,
-    "replication\.max\.remote\.recovery\.attempts" : 5,
+    "replication\.strategy" : "none",
     "replication\.timeout" : 30,
+    "storage.max.active.writable.datasets" : 8,
     "txn\.commitprofiler\.enabled" : false,
     "txn\.commitprofiler\.reportinterval" : 5,
     "txn\.job\.recovery\.memorysize" : 67108864,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.1.ignore
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.1.ignore
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.2.regex b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.2.regex
new file mode 100644
index 0000000..4308ba2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.2.regex
@@ -0,0 +1,2 @@
+/"status": "success"/
+/"handle": ".*"/
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.3.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.3.json
new file mode 100644
index 0000000..09e86cc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/async-deferred/async-exhausted-result/async-exhausted-result.3.json
@@ -0,0 +1,10 @@
+{ "i": 1, "i2": 1 }
+{ "i": 2, "i2": 4 }
+{ "i": 3, "i2": 9 }
+{ "i": 4, "i2": 16 }
+{ "i": 5, "i2": 25 }
+{ "i": 6, "i2": 36 }
+{ "i": 7, "i2": 49 }
+{ "i": 8, "i2": 64 }
+{ "i": 9, "i2": 81 }
+{ "i": 10, "i2": 100 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/composite-low-high/composite-low-high.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/composite-low-high/composite-low-high.1.adm
new file mode 100644
index 0000000..8c4166d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/composite-low-high/composite-low-high.1.adm
@@ -0,0 +1,3 @@
+{ "x": 15, "y": 40 }
+{ "x": 20, "y": 50 }
+{ "x": 60, "y": 40 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.adm
new file mode 100644
index 0000000..f63ad37
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/composite-key/query-ASTERIXDB-920/query-ASTERIXDB-920.1.adm
@@ -0,0 +1 @@
+{ "messageid": 6, "authorid": 8, "in_response_to": 4, "sender_location": point("34.7,90.76"), "message": "msg3" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/dapd/q2-7/q2-7.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/dapd/q2-7/q2-7.1.adm
index 5839a99..5adf5db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/dapd/q2-7/q2-7.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/dapd/q2-7/q2-7.1.adm
@@ -1,2 +1,2 @@
-{ "sig_id": 14, "total_count": 3, "chapter_breakdown": [ { "chapter_name": "Laguna Beach", "$2": [ { "e": { "Event": { "event_id": 1023, "name": "Art Opening: Southern Orange County Beaches", "organizers": {{ { "name": "Jane Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "San Clemente" }, { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "art", "landscape", "nature", "vernissage" }}, "start_time": datetime("2011-02-24T02:00:00.000Z"), "end_time": datetime("2011-02-24T05:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "Laguna Beach" } } }, { "e": { "Event": { "event_id": 1042, "name": "Orange County Landmarks", "organizers": {{ { "name": "John Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "architecture", "photography" }}, "price": 10.0, "start_time": datetime("2011-02-24T01:00:00.000Z"), "end_time": datetime("2011-02-24T03:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "Laguna Beach" } } } ] }, { "chapter_name": "San Clemente", "$2": [ { "e": { "Event": { "event_id": 1023, "name": "Art Opening: Southern Orange County Beaches", "organizers": {{ { "name": "Jane Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "San Clemente" }, { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "art", "landscape", "nature", "vernissage" }}, "start_time": datetime("2011-02-24T02:00:00.000Z"), "end_time": datetime("2011-02-24T05:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "San Clemente" } } } ] } ] }
-{ "sig_id": 31, "total_count": 1, "chapter_breakdown": [ { "chapter_name": "Huntington Beach", "$2": [ { "e": { "Event": { "event_id": 941, "name": "Intro to Scuba Diving", "organizers": {{ { "name": "Joseph Surfer", "affiliation": "Huntington Beach Scuba Assoc." } }}, "sponsoring_sigs": [ { "sig_id": 31, "chapter_name": "Huntington Beach" } ], "interest_keywords": {{ "scuba", "diving", "aquatics" }}, "price": 40.0, "start_time": datetime("2010-10-16T17:00:00.000Z"), "end_time": datetime("2010-10-16T20:00:00.000Z") }, "sponsor": { "sig_id": 31, "chapter_name": "Huntington Beach" } } } ] } ] }
+{ "sig_id": 14, "total_count": 3, "chapter_breakdown": [ { "chapter_name": "Laguna Beach", "$1": [ { "e": { "Event": { "event_id": 1023, "name": "Art Opening: Southern Orange County Beaches", "organizers": {{ { "name": "Jane Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "San Clemente" }, { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "art", "landscape", "nature", "vernissage" }}, "start_time": datetime("2011-02-24T02:00:00.000Z"), "end_time": datetime("2011-02-24T05:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "Laguna Beach" } } }, { "e": { "Event": { "event_id": 1042, "name": "Orange County Landmarks", "organizers": {{ { "name": "John Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "architecture", "photography" }}, "price": 10.0, "start_time": datetime("2011-02-24T01:00:00.000Z"), "end_time": datetime("2011-02-24T03:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "Laguna Beach" } } } ] }, { "chapter_name": "San Clemente", "$1": [ { "e": { "Event": { "event_id": 1023, "name": "Art Opening: Southern Orange County Beaches", "organizers": {{ { "name": "Jane Smith" } }}, "sponsoring_sigs": [ { "sig_id": 14, "chapter_name": "San Clemente" }, { "sig_id": 14, "chapter_name": "Laguna Beach" } ], "interest_keywords": {{ "art", "landscape", "nature", "vernissage" }}, "start_time": datetime("2011-02-24T02:00:00.000Z"), "end_time": datetime("2011-02-24T05:00:00.000Z") }, "sponsor": { "sig_id": 14, "chapter_name": "San Clemente" } } } ] } ] }
+{ "sig_id": 31, "total_count": 1, "chapter_breakdown": [ { "chapter_name": "Huntington Beach", "$1": [ { "e": { "Event": { "event_id": 941, "name": "Intro to Scuba Diving", "organizers": {{ { "name": "Joseph Surfer", "affiliation": "Huntington Beach Scuba Assoc." } }}, "sponsoring_sigs": [ { "sig_id": 31, "chapter_name": "Huntington Beach" } ], "interest_keywords": {{ "scuba", "diving", "aquatics" }}, "price": 40.0, "start_time": datetime("2010-10-16T17:00:00.000Z"), "end_time": datetime("2010-10-16T20:00:00.000Z") }, "sponsor": { "sig_id": 31, "chapter_name": "Huntington Beach" } } } ] } ] }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
index 5f6b71d..98cedcc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access/explain_field_access.1.adm
@@ -1,44 +1,44 @@
-distribute result [$$17]
+distribute result [$$36]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$17])
+    project ([$$36])
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$17] <- [{"deptId": $#1, "star_cost": $$20}]
+      assign [$$36] <- [{"deptId": $#1, "star_cost": $$39}]
       -- ASSIGN  |PARTITIONED|
         exchange
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$#1 := $$25]) decor ([]) {
-                    aggregate [$$20] <- [agg-sql-sum($$24)]
+          group by ([$#1 := $$44]) decor ([]) {
+                    aggregate [$$39] <- [agg-sql-sum($$43)]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- SORT_GROUP_BY[$$25]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$44]  |PARTITIONED|
             exchange
-            -- HASH_PARTITION_EXCHANGE [$$25]  |PARTITIONED|
-              group by ([$$25 := $$18]) decor ([]) {
-                        aggregate [$$24] <- [agg-local-sql-sum($$15)]
+            -- HASH_PARTITION_EXCHANGE [$$44]  |PARTITIONED|
+              group by ([$$44 := $$37]) decor ([]) {
+                        aggregate [$$43] <- [agg-local-sql-sum($$34)]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- SORT_GROUP_BY[$$18]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$37]  |PARTITIONED|
                 exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$15, $$18])
+                  project ([$$34, $$37])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$18] <- [substring($$22.getField("department_id"), 1)]
+                    assign [$$37] <- [substring($$41.getField("department_id"), 0)]
                     -- ASSIGN  |PARTITIONED|
-                      project ([$$15, $$22])
+                      project ([$$34, $$41])
                       -- STREAM_PROJECT  |PARTITIONED|
-                        assign [$$15, $$22] <- [$$e.getField("salary"), $$e.getField("dept")]
+                        assign [$$34, $$41] <- [$$e.getField("salary"), $$e.getField("dept")]
                         -- ASSIGN  |PARTITIONED|
                           project ([$$e])
                           -- STREAM_PROJECT  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                              data-scan []<-[$$19, $$e] <- gby.Employee
+                              data-scan []<-[$$38, $$e] <- gby.Employee
                               -- DATASOURCE_SCAN  |PARTITIONED|
                                 exchange
                                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
index c984482..e2e1c91 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/explain/explain_field_access_closed/explain_field_access_closed.1.adm
@@ -1,40 +1,40 @@
-distribute result [$$16]
+distribute result [$$35]
 -- DISTRIBUTE_RESULT  |PARTITIONED|
   exchange
   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-    project ([$$16])
+    project ([$$35])
     -- STREAM_PROJECT  |PARTITIONED|
-      assign [$$16] <- [{"deptId": $#1, "star_cost": $$19}]
+      assign [$$35] <- [{"deptId": $#1, "star_cost": $$38}]
       -- ASSIGN  |PARTITIONED|
         exchange
         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-          group by ([$#1 := $$23]) decor ([]) {
-                    aggregate [$$19] <- [agg-sql-sum($$22)]
+          group by ([$#1 := $$42]) decor ([]) {
+                    aggregate [$$38] <- [agg-sql-sum($$41)]
                     -- AGGREGATE  |LOCAL|
                       nested tuple source
                       -- NESTED_TUPLE_SOURCE  |LOCAL|
                  }
-          -- SORT_GROUP_BY[$$23]  |PARTITIONED|
+          -- SORT_GROUP_BY[$$42]  |PARTITIONED|
             exchange
-            -- HASH_PARTITION_EXCHANGE [$$23]  |PARTITIONED|
-              group by ([$$23 := $$17]) decor ([]) {
-                        aggregate [$$22] <- [agg-local-sql-sum($$14)]
+            -- HASH_PARTITION_EXCHANGE [$$42]  |PARTITIONED|
+              group by ([$$42 := $$36]) decor ([]) {
+                        aggregate [$$41] <- [agg-local-sql-sum($$33)]
                         -- AGGREGATE  |LOCAL|
                           nested tuple source
                           -- NESTED_TUPLE_SOURCE  |LOCAL|
                      }
-              -- SORT_GROUP_BY[$$17]  |PARTITIONED|
+              -- SORT_GROUP_BY[$$36]  |PARTITIONED|
                 exchange
                 -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                  project ([$$14, $$17])
+                  project ([$$33, $$36])
                   -- STREAM_PROJECT  |PARTITIONED|
-                    assign [$$17, $$14] <- [substring($$e.getField(1), 1), $$e.getField(2)]
+                    assign [$$36, $$33] <- [substring($$e.getField(1), 0), $$e.getField(2)]
                     -- ASSIGN  |PARTITIONED|
                       project ([$$e])
                       -- STREAM_PROJECT  |PARTITIONED|
                         exchange
                         -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                          data-scan []<-[$$18, $$e] <- gby.Employee
+                          data-scan []<-[$$37, $$e] <- gby.Employee
                           -- DATASOURCE_SCAN  |PARTITIONED|
                             exchange
                             -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/validate-default-library/validate-default-library.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/validate-default-library/validate-default-library.1.adm
index 8f4c581..403237e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/validate-default-library/validate-default-library.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/validate-default-library/validate-default-library.1.adm
@@ -1,8 +1,8 @@
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#addHashTags", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#addHashTagsInPlace", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsInPlaceFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#allTypes", "Arity": "1", "Params": [ "AllType" ], "ReturnType": "AllType", "Definition": "org.apache.asterix.external.library.AllTypesFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#echoDelay", "Arity": "1", "Params": [ "TweetMessageType" ], "ReturnType": "TweetMessageType", "Definition": "org.apache.asterix.external.library.EchoDelayFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#getCapital", "Arity": "1", "Params": [ "ASTRING" ], "ReturnType": "CountryCapitalType", "Definition": "org.apache.asterix.external.library.CapitalFinderFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#mysum", "Arity": "2", "Params": [ "AINT32", "AINT32" ], "ReturnType": "AINT32", "Definition": "org.apache.asterix.external.library.SumFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#parseTweet", "Arity": "1", "Params": [ "TweetInputType" ], "ReturnType": "TweetOutputType", "Definition": "org.apache.asterix.external.library.ParseTweetFactory", "Language": "JAVA", "Kind": "SCALAR" } }
-{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#toUpper", "Arity": "1", "Params": [ "TextType" ], "ReturnType": "TextType", "Definition": "org.apache.asterix.external.library.UpperCaseFactory", "Language": "JAVA", "Kind": "SCALAR" } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#addHashTags", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#addHashTagsInPlace", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsInPlaceFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#allTypes", "Arity": "1", "Params": [ "AllType" ], "ReturnType": "AllType", "Definition": "org.apache.asterix.external.library.AllTypesFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#echoDelay", "Arity": "1", "Params": [ "TweetMessageType" ], "ReturnType": "TweetMessageType", "Definition": "org.apache.asterix.external.library.EchoDelayFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#getCapital", "Arity": "1", "Params": [ "ASTRING" ], "ReturnType": "CountryCapitalType", "Definition": "org.apache.asterix.external.library.CapitalFinderFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#mysum", "Arity": "2", "Params": [ "AINT32", "AINT32" ], "ReturnType": "AINT32", "Definition": "org.apache.asterix.external.library.SumFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#parseTweet", "Arity": "1", "Params": [ "TweetInputType" ], "ReturnType": "TweetOutputType", "Definition": "org.apache.asterix.external.library.ParseTweetFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
+{ "Function": { "DataverseName": "externallibtest", "Name": "testlib#toUpper", "Arity": "1", "Params": [ "TextType" ], "ReturnType": "TextType", "Definition": "org.apache.asterix.external.library.UpperCaseFactory", "Language": "JAVA", "Kind": "SCALAR", "Dependencies": [ [  ], [  ] ] } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm
index a6fa97e..85cd967 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/feeds/feeds_01/feeds_01.1.adm
@@ -1 +1 @@
-{ "DataverseName": "feeds", "FeedName": "TweetFeed", "AdapterName": "localfs", "AdapterConfiguration": {{ { "Name": "type-name", "Value": "TweetType" }, { "Name": "path", "Value": "asterix_nc1://data/twitter/obamatweets.adm" }, { "Name": "format", "Value": "adm" }, { "Name": "tuple-interval", "Value": "10" }, { "Name": "is-feed", "Value": "true" }, { "Name": "dataverse", "Value": "feeds" }, { "Name": "feed", "Value": "TweetFeed" }, { "Name": "reader", "Value": "localfs" }, { "Name": "parser", "Value": "adm" } }}, "Timestamp": "Mon Oct 10 14:54:32 PDT 2016" }
+{ "DataverseName": "feeds", "FeedName": "TweetFeed", "AdapterConfiguration": {{ { "Name": "path", "Value": "asterix_nc1://data/twitter/obamatweets.adm" }, { "Name": "feed", "Value": "TweetFeed" }, { "Name": "adapter-name", "Value": "localfs" }, { "Name": "is-feed", "Value": "true" }, { "Name": "parser", "Value": "adm" }, { "Name": "reader", "Value": "localfs" }, { "Name": "format", "Value": "adm" }, { "Name": "tuple-interval", "Value": "10" }, { "Name": "type-name", "Value": "TweetType" }, { "Name": "dataverse", "Value": "feeds" } }}, "Timestamp": "Thu Dec 07 19:22:41 PST 2017" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.3.adm
new file mode 100644
index 0000000..9b34c44
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.3.adm
@@ -0,0 +1,38 @@
+{ "id": 1 }
+{ "id": 2 }
+{ "id": 5 }
+{ "id": 6 }
+{ "id": 8 }
+{ "id": 11 }
+{ "id": 12 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 17 }
+{ "id": 19 }
+{ "id": 20 }
+{ "id": 21 }
+{ "id": 22 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 27 }
+{ "id": 29 }
+{ "id": 30 }
+{ "id": 31 }
+{ "id": 32 }
+{ "id": 35 }
+{ "id": 36 }
+{ "id": 38 }
+{ "id": 41 }
+{ "id": 42 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 47 }
+{ "id": 49 }
+{ "id": 50 }
+{ "id": 51 }
+{ "id": 52 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 57 }
+{ "id": 59 }
+{ "id": 60 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.4.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.4.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.5.adm
new file mode 100644
index 0000000..9b34c44
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.5.adm
@@ -0,0 +1,38 @@
+{ "id": 1 }
+{ "id": 2 }
+{ "id": 5 }
+{ "id": 6 }
+{ "id": 8 }
+{ "id": 11 }
+{ "id": 12 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 17 }
+{ "id": 19 }
+{ "id": 20 }
+{ "id": 21 }
+{ "id": 22 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 27 }
+{ "id": 29 }
+{ "id": 30 }
+{ "id": 31 }
+{ "id": 32 }
+{ "id": 35 }
+{ "id": 36 }
+{ "id": 38 }
+{ "id": 41 }
+{ "id": 42 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 47 }
+{ "id": 49 }
+{ "id": 50 }
+{ "id": 51 }
+{ "id": 52 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 57 }
+{ "id": 59 }
+{ "id": 60 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.6.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.6.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.7.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.7.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.8.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-09/fulltext-09.8.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-02.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-02.8.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-02.8.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.3.adm
new file mode 100644
index 0000000..9b34c44
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.3.adm
@@ -0,0 +1,38 @@
+{ "id": 1 }
+{ "id": 2 }
+{ "id": 5 }
+{ "id": 6 }
+{ "id": 8 }
+{ "id": 11 }
+{ "id": 12 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 17 }
+{ "id": 19 }
+{ "id": 20 }
+{ "id": 21 }
+{ "id": 22 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 27 }
+{ "id": 29 }
+{ "id": 30 }
+{ "id": 31 }
+{ "id": 32 }
+{ "id": 35 }
+{ "id": 36 }
+{ "id": 38 }
+{ "id": 41 }
+{ "id": 42 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 47 }
+{ "id": 49 }
+{ "id": 50 }
+{ "id": 51 }
+{ "id": 52 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 57 }
+{ "id": 59 }
+{ "id": 60 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.4.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.4.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.5.adm
new file mode 100644
index 0000000..9b34c44
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.5.adm
@@ -0,0 +1,38 @@
+{ "id": 1 }
+{ "id": 2 }
+{ "id": 5 }
+{ "id": 6 }
+{ "id": 8 }
+{ "id": 11 }
+{ "id": 12 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 17 }
+{ "id": 19 }
+{ "id": 20 }
+{ "id": 21 }
+{ "id": 22 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 27 }
+{ "id": 29 }
+{ "id": 30 }
+{ "id": 31 }
+{ "id": 32 }
+{ "id": 35 }
+{ "id": 36 }
+{ "id": 38 }
+{ "id": 41 }
+{ "id": 42 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 47 }
+{ "id": 49 }
+{ "id": 50 }
+{ "id": 51 }
+{ "id": 52 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 57 }
+{ "id": 59 }
+{ "id": 60 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.6.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.6.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.7.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.7.adm
new file mode 100644
index 0000000..acde73f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/fulltext/fulltext-index-08/fulltext-index-08.7.adm
@@ -0,0 +1,14 @@
+{ "id": 8 }
+{ "id": 13 }
+{ "id": 16 }
+{ "id": 19 }
+{ "id": 23 }
+{ "id": 26 }
+{ "id": 29 }
+{ "id": 38 }
+{ "id": 43 }
+{ "id": 46 }
+{ "id": 49 }
+{ "id": 53 }
+{ "id": 56 }
+{ "id": 59 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.adm
new file mode 100644
index 0000000..044b3f5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-01/btree-sec-primary-index-01.3.adm
@@ -0,0 +1 @@
+{ "$1": 120 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.adm
new file mode 100644
index 0000000..12d64a1
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-02/btree-sec-primary-index-02.3.adm
@@ -0,0 +1 @@
+{ "$1": 88 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.adm
new file mode 100644
index 0000000..ac25b3f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-03/btree-sec-primary-index-03.3.adm
@@ -0,0 +1 @@
+{ "$1": 9941 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.adm
new file mode 100644
index 0000000..044b3f5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/index-selection/btree-sec-primary-index-04/btree-sec-primary-index-04.3.adm
@@ -0,0 +1 @@
+{ "$1": 120 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/null-missing/null-missing.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/null-missing/null-missing.1.json
new file mode 100644
index 0000000..6955a79
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/null-missing/null-missing.1.json
@@ -0,0 +1 @@
+{ "int_value": 1000, "null_value": null }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-demote-double-bigint/numeric-demote-double-bigint.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-demote-double-bigint/numeric-demote-double-bigint.1.json
new file mode 100644
index 0000000..4701cc7
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-demote-double-bigint/numeric-demote-double-bigint.1.json
@@ -0,0 +1 @@
+150
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-float/numeric-float.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-float/numeric-float.1.json
new file mode 100644
index 0000000..0cda3b0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-float/numeric-float.1.json
@@ -0,0 +1 @@
+150.11
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-promote-bigint-double/numeric-demote-double-bigint.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-promote-bigint-double/numeric-demote-double-bigint.1.json
new file mode 100644
index 0000000..3bac2cd
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-promote-bigint-double/numeric-demote-double-bigint.1.json
@@ -0,0 +1 @@
+1000.0
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-tinyint/numeric-tinyint.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-tinyint/numeric-tinyint.1.json
new file mode 100644
index 0000000..105d7d9
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/numeric-tinyint/numeric-tinyint.1.json
@@ -0,0 +1 @@
+100
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/spatial/spatial.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/spatial/spatial.1.json
new file mode 100644
index 0000000..94ace91
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/spatial/spatial.1.json
@@ -0,0 +1 @@
+{ "point_value": point("10.0,10.0"), "line_value": line("10.0,10.0 11.0,11.0"), "polygon_value": polygon("10.0,10.0 11.0,11.0 10.0,10.0") }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/temporal/temporal.1.json b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/temporal/temporal.1.json
new file mode 100644
index 0000000..cdfc51d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/json-parser/temporal/temporal.1.json
@@ -0,0 +1 @@
+{ "datefield": date("-2012-12-12"), "dateFieldPlus": date("0990-01-01"), "timeField": time("23:49:12.390Z"), "timeFieldPlus": time("03:23:12.200Z"), "datetimeField": datetime("2012-12-12T00:00:00.001Z"), "datetimeFieldPlus": datetime("-0013-08-10T22:10:15.398Z") }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.3.adm
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.3.adm
@@ -0,0 +1 @@
+1
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.4.adm
new file mode 100644
index 0000000..27ba77d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.4.adm
@@ -0,0 +1 @@
+true
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.5.adm
new file mode 100644
index 0000000..27ba77d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dataset-resources/dataset-resources.5.adm
@@ -0,0 +1 @@
+true
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/identifier_01/identifier_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/identifier_01/identifier_01.1.adm
new file mode 100644
index 0000000..864e169
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/identifier_01/identifier_01.1.adm
@@ -0,0 +1 @@
+{ "_y": 1 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-1577/query-ASTERIXDB-1577.3.adm
similarity index 100%
rename from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/misc/query-ASTERIXDB-1577/query-ASTERIXDB-1577.3.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/is/is.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/is/is.1.adm
index 38de473..920f7b4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/is/is.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/null-missing/is/is.1.adm
@@ -1 +1 @@
-{ "1": true, "3": false, "4": false, "6": true, "7": false, "8": true, "9": false, "10": true, "11": false, "12": true, "13": true, "14": true, "15": false, "16": false, "17": false, "18": true }
+{ "1": true, "3": false, "4": false, "6": true, "7": false, "8": true, "9": false, "10": true, "11": false, "12": true, "13": true, "14": true, "15": false, "16": false, "17": false, "18": true, "19": false, "20": false, "21": true, "22": true, "23": true, "24": false }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.11.adm
index 8325e98..d970119 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.11.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.11.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch1/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch1/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch1/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch1/2/LineItem_idx_LineItem"}]}
\ No newline at end of file
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch1/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch1/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch1/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch1/LineItem/2/LineItem"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.12.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.12.adm
index b93b62c..38d2eac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.12.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.12.adm
@@ -1 +1 @@
-{"temp":false,"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch2/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch2/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch2/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch2/2/Orders_idx_Orders"}]}
\ No newline at end of file
+{"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch2/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch2/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch2/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch2/Orders/2/Orders"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.5.adm
index abe4c45..af9759b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.5.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.5.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch1/1/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch1/1/LineItem_idx_LineItem"}]}
\ No newline at end of file
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch1/LineItem/1/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch1/LineItem/1/LineItem"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.6.adm
index 9b37249..0003101 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.6.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/all_datasets/all_datasets.6.adm
@@ -1 +1 @@
-{"temp":false,"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch2/1/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch2/1/Orders_idx_Orders"}]}
\ No newline at end of file
+{"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch2/Orders/1/Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch2/Orders/1/Orders"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.5.adm
index 4f0990e..374e1af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.5.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.5.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/1/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/1/LineItem_idx_LineItem"}]}
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/1/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/1/LineItem"}]}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.9.adm
index 44c244c..ae6e2fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.9.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset/single_dataset.9.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/2/LineItem_idx_LineItem"}]}
\ No newline at end of file
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/LineItem/2/LineItem"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.10.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.10.adm
index 44c244c..ae6e2fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.10.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.10.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/2/LineItem_idx_LineItem"}]}
\ No newline at end of file
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/LineItem/2/LineItem"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.13.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.13.adm
index a76e980..2a155f9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.13.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.13.adm
@@ -5,28 +5,28 @@
     project ([$$l])
     -- STREAM_PROJECT  |PARTITIONED|
       exchange
-      -- SORT_MERGE_EXCHANGE [$$7(ASC), $$8(ASC) ]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$14(ASC), $$15(ASC) ]  |PARTITIONED|
         select (eq($$l.getField(10), "1994-01-20"))
         -- STREAM_SELECT  |PARTITIONED|
           exchange
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            unnest-map [$$7, $$8, $$l] <- index-search("LineItem", 0, "tpch", "LineItem", FALSE, FALSE, 2, $$15, $$16, 2, $$15, $$16, TRUE, TRUE, TRUE)
+            unnest-map [$$14, $$15, $$l] <- index-search("LineItem", 0, "tpch", "LineItem", FALSE, FALSE, 2, $$22, $$23, 2, $$22, $$23, TRUE, TRUE, TRUE)
             -- BTREE_SEARCH  |PARTITIONED|
               exchange
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$15) (ASC, $$16)
-                -- STABLE_SORT [$$15(ASC), $$16(ASC)]  |PARTITIONED|
+                order (ASC, $$22) (ASC, $$23)
+                -- STABLE_SORT [$$22(ASC), $$23(ASC)]  |PARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$15, $$16])
+                    project ([$$22, $$23])
                     -- STREAM_PROJECT  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$14, $$15, $$16] <- index-search("lineitem_shipdateIx", 0, "tpch", "LineItem", FALSE, FALSE, 1, $$12, 1, $$13, TRUE, TRUE, TRUE)
+                        unnest-map [$$21, $$22, $$23] <- index-search("lineitem_shipdateIx", 0, "tpch", "LineItem", FALSE, FALSE, 1, $$19, 1, $$20, TRUE, TRUE, TRUE)
                         -- BTREE_SEARCH  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$12, $$13] <- ["1994-01-20", "1994-01-20"]
+                            assign [$$19, $$20] <- ["1994-01-20", "1994-01-20"]
                             -- ASSIGN  |PARTITIONED|
                               empty-tuple-source
                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.5.adm
index 4f0990e..374e1af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.5.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.5.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/1/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/1/LineItem_idx_LineItem"}]}
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/1/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/1/LineItem"}]}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.8.adm
index a76e980..2a155f9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.8.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataset_with_index/single_dataset_with_index.8.adm
@@ -5,28 +5,28 @@
     project ([$$l])
     -- STREAM_PROJECT  |PARTITIONED|
       exchange
-      -- SORT_MERGE_EXCHANGE [$$7(ASC), $$8(ASC) ]  |PARTITIONED|
+      -- SORT_MERGE_EXCHANGE [$$14(ASC), $$15(ASC) ]  |PARTITIONED|
         select (eq($$l.getField(10), "1994-01-20"))
         -- STREAM_SELECT  |PARTITIONED|
           exchange
           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-            unnest-map [$$7, $$8, $$l] <- index-search("LineItem", 0, "tpch", "LineItem", FALSE, FALSE, 2, $$15, $$16, 2, $$15, $$16, TRUE, TRUE, TRUE)
+            unnest-map [$$14, $$15, $$l] <- index-search("LineItem", 0, "tpch", "LineItem", FALSE, FALSE, 2, $$22, $$23, 2, $$22, $$23, TRUE, TRUE, TRUE)
             -- BTREE_SEARCH  |PARTITIONED|
               exchange
               -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                order (ASC, $$15) (ASC, $$16)
-                -- STABLE_SORT [$$15(ASC), $$16(ASC)]  |PARTITIONED|
+                order (ASC, $$22) (ASC, $$23)
+                -- STABLE_SORT [$$22(ASC), $$23(ASC)]  |PARTITIONED|
                   exchange
                   -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                    project ([$$15, $$16])
+                    project ([$$22, $$23])
                     -- STREAM_PROJECT  |PARTITIONED|
                       exchange
                       -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                        unnest-map [$$14, $$15, $$16] <- index-search("lineitem_shipdateIx", 0, "tpch", "LineItem", FALSE, FALSE, 1, $$12, 1, $$13, TRUE, TRUE, TRUE)
+                        unnest-map [$$21, $$22, $$23] <- index-search("lineitem_shipdateIx", 0, "tpch", "LineItem", FALSE, FALSE, 1, $$19, 1, $$20, TRUE, TRUE, TRUE)
                         -- BTREE_SEARCH  |PARTITIONED|
                           exchange
                           -- ONE_TO_ONE_EXCHANGE  |PARTITIONED|
-                            assign [$$12, $$13] <- ["1994-01-20", "1994-01-20"]
+                            assign [$$19, $$20] <- ["1994-01-20", "1994-01-20"]
                             -- ASSIGN  |PARTITIONED|
                               empty-tuple-source
                               -- EMPTY_TUPLE_SOURCE  |PARTITIONED|
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.11.adm
index 44c244c..ae6e2fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.11.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.11.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/2/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/2/LineItem_idx_LineItem"}]}
\ No newline at end of file
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/LineItem/2/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/LineItem/2/LineItem"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.12.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.12.adm
index 32a8aa9..f9cd003 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.12.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.12.adm
@@ -1 +1 @@
-{"temp":false,"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/2/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/2/Orders_idx_Orders"}]}
\ No newline at end of file
+{"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_2/tpch/Orders/2/Orders"},{"ip":"127.0.0.1","path":"storage/partition_3/tpch/Orders/2/Orders"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.5.adm
index 4f0990e..374e1af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.5.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.5.adm
@@ -1 +1 @@
-{"temp":false,"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/1/LineItem_idx_LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/1/LineItem_idx_LineItem"}]}
+{"keys":"l_orderkey,l_linenumber","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"LineItemType","open":false,"fields":[{"l_orderkey":{"type":"AInt64"}},{"l_partkey":{"type":"AInt64"}},{"l_suppkey":{"type":"AInt64"}},{"l_linenumber":{"type":"AInt64"}},{"l_quantity":{"type":"ADouble"}},{"l_extendedprice":{"type":"ADouble"}},{"l_discount":{"type":"ADouble"}},{"l_tax":{"type":"ADouble"}},{"l_returnflag":{"type":"AString"}},{"l_linestatus":{"type":"AString"}},{"l_shipdate":{"type":"AString"}},{"l_commitdate":{"type":"AString"}},{"l_receiptdate":{"type":"AString"}},{"l_shipinstruct":{"type":"AString"}},{"l_shipmode":{"type":"AString"}},{"l_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/LineItem/1/LineItem"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/LineItem/1/LineItem"}]}
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.6.adm
index c5639c6..bca061b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.6.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/rebalance/single_dataverse/single_dataverse.6.adm
@@ -1 +1 @@
-{"temp":false,"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/1/Orders_idx_Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/1/Orders_idx_Orders"}]}
\ No newline at end of file
+{"keys":"o_orderkey","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"OrderType","open":false,"fields":[{"o_orderkey":{"type":"AInt64"}},{"o_custkey":{"type":"AInt64"}},{"o_orderstatus":{"type":"AString"}},{"o_totalprice":{"type":"ADouble"}},{"o_orderdate":{"type":"AString"}},{"o_orderpriority":{"type":"AString"}},{"o_clerk":{"type":"AString"}},{"o_shippriority":{"type":"AInt64"}},{"o_comment":{"type":"AString"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/tpch/Orders/1/Orders"},{"ip":"127.0.0.1","path":"storage/partition_1/tpch/Orders/1/Orders"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/add_replica/add_replica.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/add_replica/add_replica.2.adm
new file mode 100644
index 0000000..e48cbcf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/add_replica/add_replica.2.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.10.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.10.adm
new file mode 100644
index 0000000..3a8dfe0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.10.adm
@@ -0,0 +1 @@
+6005
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.3.adm
new file mode 100644
index 0000000..a6afbb4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.3.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 2,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2001",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.4.adm
new file mode 100644
index 0000000..53648a2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.4.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 3,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2001",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.7.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.7.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.8.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.8.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.9.adm
new file mode 100644
index 0000000..c382703
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/bulkload/bulkload.9.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc1",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "ACTIVE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.2.adm
new file mode 100644
index 0000000..7e92c87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.2.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.4.adm
new file mode 100644
index 0000000..f84d77a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.4.adm
@@ -0,0 +1 @@
+{"keys":"DataverseName,DatasetName","type":{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType","open":true,"fields":[{"DataverseName":{"type":"AString"}},{"DatasetName":{"type":"AString"}},{"DatatypeDataverseName":{"type":"AString"}},{"DatatypeName":{"type":"AString"}},{"DatasetType":{"type":"AString"}},{"GroupName":{"type":"AString"}},{"CompactionPolicy":{"type":"AString"}},{"CompactionPolicyProperties":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType_CompactionPolicyProperties_Item","open":true,"fields":[{"Name":{"type":"AString"}},{"Value":{"type":"AString"}}]}}},{"InternalDetails":{"type":"org.apache.asterix.om.types.AUnionType","fields":[{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType_InternalDetails","open":true,"fields":[{"FileStructure":{"type":"AString"}},{"PartitioningStrategy":{"type":"AString"}},{"PartitioningKey":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"AString"}}}},{"PrimaryKey":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"AString"}}}},{"Autogenerated":{"type":"ABoolean"}}]},{"type":"ANULL"},{"type":"AMISSING"}]}},{"ExternalDetails":{"type":"org.apache.asterix.om.types.AUnionType","fields":[{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType_ExternalDetails","open":true,"fields":[{"DatasourceAdapter":{"type":"AString"}},{"Properties":{"type":"org.apache.asterix.om.types.AOrderedListType","item-type":{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType_ExternalDetails_Properties_Item","open":true,"fields":[{"Name":{"type":"AString"}},{"Value":{"type":"AString"}}]}}},{"LastRefreshTime":{"type":"ADateTime"}},{"TransactionState":{"type":"AInt32"}}]},{"type":"ANULL"},{"type":"AMISSING"}]}},{"Hints":{"type":"org.apache.asterix.om.types.AUnorderedListType","item-type":{"type":"org.apache.asterix.om.types.ARecordType","name":"DatasetRecordType_Hints_Item","open":true,"fields":[{"Name":{"type":"AString"}},{"Value":{"type":"AString"}}]}}},{"Timestamp":{"type":"AString"}},{"DatasetId":{"type":"AInt32"}},{"PendingOp":{"type":"AInt32"}}]},"splits":[{"ip":"127.0.0.1","path":"storage/partition_0/Metadata/Dataset/0/Dataset"}]}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.6.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.6.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.7.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.7.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.8.adm
new file mode 100644
index 0000000..fa5cfb4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.8.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc2",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "ACTIVE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.9.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm
rename to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/flushed_component/flushed_component.9.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.10.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.10.adm
new file mode 100644
index 0000000..3a8dfe0
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.10.adm
@@ -0,0 +1 @@
+6005
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.3.adm
new file mode 100644
index 0000000..a6afbb4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.3.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 2,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2001",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.4.adm
new file mode 100644
index 0000000..53648a2
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.4.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 3,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2001",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.7.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.7.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.8.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.8.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.9.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.9.adm
new file mode 100644
index 0000000..c382703
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/mem_component_recovery/mem_component_recovery.9.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc1",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "ACTIVE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.11.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.11.adm
new file mode 100644
index 0000000..d0138cb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.11.adm
@@ -0,0 +1,3 @@
+1
+
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.2.adm
new file mode 100644
index 0000000..7e92c87
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.2.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.5.adm
new file mode 100644
index 0000000..3d3204d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.5.adm
@@ -0,0 +1,10 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ ]
+}, {
+  "partition" : 2,
+  "replicas" : [ ]
+}, {
+  "partition" : 3,
+  "replicas" : [ ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.6.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.6.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.7.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.7.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.8.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.8.adm
new file mode 100644
index 0000000..fa5cfb4
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.8.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc2",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "ACTIVE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.9.adm
similarity index 100%
copy from asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/metadata_failover/metadata_failover.9.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.2.adm
new file mode 100644
index 0000000..e48cbcf
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.2.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.3.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.3.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.4.adm
new file mode 100644
index 0000000..8878e54
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/replication/release_partition/release_partition.4.adm
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.3.adm
new file mode 100644
index 0000000..59371b8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.3.adm
@@ -0,0 +1,2 @@
+{ "TwitterUsers": { "screen_name": "john_01", "friends_count": 1, "name": "John", "followers_count": 2 } }
+{ "TwitterUsers": { "screen_name": "marry_02", "friends_count": 4, "name": "Marry", "followers_count": 5 } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.5.adm
new file mode 100644
index 0000000..59371b8
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/function_dataverse/function_dataverse.5.adm
@@ -0,0 +1,2 @@
+{ "TwitterUsers": { "screen_name": "john_01", "friends_count": 1, "name": "John", "followers_count": 2 } }
+{ "TwitterUsers": { "screen_name": "marry_02", "friends_count": 4, "name": "Marry", "followers_count": 5 } }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.adm
new file mode 100644
index 0000000..d575d7f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/groupby_rename_with_sugar/groupby_rename_with_sugar.3.adm
@@ -0,0 +1,3 @@
+{ "g": [ { "ord": { "oid": 100, "pid": 0, "amount": 1 } }, { "ord": { "oid": 104, "pid": 0, "amount": 6 } } ], "pid": 0, "s": 7 }
+{ "g": [ { "ord": { "oid": 101, "pid": 1, "amount": 2 } }, { "ord": { "oid": 103, "pid": 1, "amount": 4 } } ], "pid": 1, "s": 6 }
+{ "g": [ { "ord": { "oid": 102, "pid": 2, "amount": 3 } } ], "pid": 2, "s": 3 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/order_1/order_1.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/order_1/order_1.3.adm
new file mode 100644
index 0000000..c9e3657
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/resolution/order_1/order_1.3.adm
@@ -0,0 +1,4 @@
+100
+101
+103
+104
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/position/position.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/position/position.1.adm
index 5c54d04..76e3e97 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/position/position.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/position/position.1.adm
@@ -1 +1 @@
-[ 3, -1 ]
+[ 2, -1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm
index 83ee615..428917f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm
@@ -1,15 +1,15 @@
-1
+0
 -1
-1
-1
-1
+0
+0
+0
 -1
-1
+0
 -1
 -1
-1
-1
-1
-1
+0
+0
+0
+0
 -1
-1
+0
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm
index f962896..fa99af7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm
@@ -1 +1 @@
-{ "result1": 1 }
+{ "result1": 0 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary/findbinary.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary/findbinary.1.adm
new file mode 100644
index 0000000..0fae953
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary/findbinary.1.adm
@@ -0,0 +1 @@
+[ 1, 1, 1, 7, -1 ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary2/findbinary2.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary2/findbinary2.1.adm
new file mode 100644
index 0000000..299ae43
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/findbinary2/findbinary2.1.adm
@@ -0,0 +1 @@
+[ 1, 3, -1 ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/position/position.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/position/position.1.adm
new file mode 100644
index 0000000..613f89b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/position/position.1.adm
@@ -0,0 +1 @@
+[ 1, 4, -1 ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position/regexp_position.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position/regexp_position.1.adm
new file mode 100644
index 0000000..613f89b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position/regexp_position.1.adm
@@ -0,0 +1 @@
+[ 1, 4, -1 ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.adm
new file mode 100644
index 0000000..613f89b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/regexp_position_with_flag/regexp_position_with_flag.1.adm
@@ -0,0 +1 @@
+[ 1, 4, -1 ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary/subbinary.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary/subbinary.1.adm
new file mode 100644
index 0000000..f5e809d
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary/subbinary.1.adm
@@ -0,0 +1 @@
+[ "AABB", "AABB", "AABB", "BBCC", "CCDD" ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary2/subbinary2.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary2/subbinary2.1.adm
new file mode 100644
index 0000000..275d27a
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/subbinary2/subbinary2.1.adm
@@ -0,0 +1 @@
+[ "AABBCCDDEEFF", "AABBCCDDEEFF", "AABBCCDDEEFF", "BBCCDDEEFF", "CCDDEEFF" ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm
new file mode 100644
index 0000000..b92a705
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring/substring.1.adm
@@ -0,0 +1 @@
+[ "ab", "ab", "ab", "bc", "cd" ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm
new file mode 100644
index 0000000..e341861
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/stringoffset/substring2/substring2.1.adm
@@ -0,0 +1 @@
+[ "abcdefg", "abcdefg", "abcdefg", "bcdefg", "cdefg" ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/non_unary_subplan_01/non_unary_subplan_01.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/non_unary_subplan_01/non_unary_subplan_01.1.adm
new file mode 100644
index 0000000..5071183
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/subquery/non_unary_subplan_01/non_unary_subplan_01.1.adm
@@ -0,0 +1,2 @@
+{ "x": 1, "s": 82 }
+{ "x": 2, "s": 58 }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.1.adm
deleted file mode 100644
index 0d69984..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.1.adm
+++ /dev/null
@@ -1,167 +0,0 @@
-{ "l_orderkey": 36, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 42845.04d, "l_discount": 0.09d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-03", "l_commitdate": "1996-01-21", "l_receiptdate": "1996-02-23", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": " careful courts. special " }
-{ "l_orderkey": 68, "l_partkey": 8, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2724.0d, "l_discount": 0.05d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-04", "l_commitdate": "1998-06-05", "l_receiptdate": "1998-07-21", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "fully special instructions cajole. furious" }
-{ "l_orderkey": 162, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38d, "l_discount": 0.02d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-09-02", "l_commitdate": "1995-06-17", "l_receiptdate": "1995-09-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "es! final somas integrate" }
-{ "l_orderkey": 192, "l_partkey": 98, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 23, "l_extendedprice": 22956.07d, "l_discount": 0.0d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-02-05", "l_commitdate": "1998-02-06", "l_receiptdate": "1998-03-07", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "ly pending theodolites haggle quickly fluf" }
-{ "l_orderkey": 197, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 38964.51d, "l_discount": 0.02d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-21", "l_commitdate": "1995-07-01", "l_receiptdate": "1995-08-14", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "press accounts. daringly sp" }
-{ "l_orderkey": 227, "l_partkey": 166, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 19, "l_extendedprice": 20257.04d, "l_discount": 0.05d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-10", "l_commitdate": "1996-01-30", "l_receiptdate": "1995-12-26", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "s cajole furiously a" }
-{ "l_orderkey": 290, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 35, "l_extendedprice": 31710.0d, "l_discount": 0.01d, "l_tax": 0.02d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-04-01", "l_commitdate": "1994-02-05", "l_receiptdate": "1994-04-27", "l_shipinstruct": "NONE", "l_shipmode": "MAIL", "l_comment": "ove the final foxes detect slyly fluffily" }
-{ "l_orderkey": 325, "l_partkey": 159, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 36011.1d, "l_discount": 0.09d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-10-28", "l_commitdate": "1993-12-13", "l_receiptdate": "1993-11-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "ly bold deposits. always iron" }
-{ "l_orderkey": 355, "l_partkey": 114, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 31437.41d, "l_discount": 0.09d, "l_tax": 0.07d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-07-13", "l_commitdate": "1994-08-18", "l_receiptdate": "1994-07-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "y unusual, ironic" }
-{ "l_orderkey": 389, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38d, "l_discount": 0.09d, "l_tax": 0.0d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-04-13", "l_commitdate": "1994-04-10", "l_receiptdate": "1994-04-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "fts. courts eat blithely even dependenc" }
-{ "l_orderkey": 391, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 14309.68d, "l_discount": 0.09d, "l_tax": 0.02d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-02-11", "l_commitdate": "1995-02-03", "l_receiptdate": "1995-02-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": " escapades sleep furiously about " }
-{ "l_orderkey": 417, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 36661.56d, "l_discount": 0.01d, "l_tax": 0.02d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-05-31", "l_commitdate": "1994-05-02", "l_receiptdate": "1994-06-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "y regular requests wake along " }
-{ "l_orderkey": 453, "l_partkey": 198, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 49418.55d, "l_discount": 0.01d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-30", "l_commitdate": "1997-08-20", "l_receiptdate": "1997-07-19", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "ifts wake carefully." }
-{ "l_orderkey": 485, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 52507.5d, "l_discount": 0.01d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-28", "l_commitdate": "1997-05-26", "l_receiptdate": "1997-04-18", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "iously quick excuses. carefully final f" }
-{ "l_orderkey": 545, "l_partkey": 170, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4280.68d, "l_discount": 0.02d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-23", "l_commitdate": "1995-12-16", "l_receiptdate": "1996-03-21", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": ", ironic grouches cajole over" }
-{ "l_orderkey": 581, "l_partkey": 64, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 39526.46d, "l_discount": 0.09d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-26", "l_commitdate": "1997-04-06", "l_receiptdate": "1997-06-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "nts. quickly" }
-{ "l_orderkey": 647, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 37597.41d, "l_discount": 0.08d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-19", "l_commitdate": "1997-09-24", "l_receiptdate": "1997-12-15", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "r instructions. quickly unusu" }
-{ "l_orderkey": 704, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 43607.6d, "l_discount": 0.05d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-30", "l_commitdate": "1997-01-10", "l_receiptdate": "1997-02-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "ggle quickly. r" }
-{ "l_orderkey": 738, "l_partkey": 198, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 37338.46d, "l_discount": 0.0d, "l_tax": 0.06d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-06-09", "l_commitdate": "1993-04-15", "l_receiptdate": "1993-07-09", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "s against the ironic exc" }
-{ "l_orderkey": 773, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 5000.5d, "l_discount": 0.06d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-11-21", "l_commitdate": "1993-12-19", "l_receiptdate": "1993-12-21", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "ar requests. regular, thin packages u" }
-{ "l_orderkey": 800, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 36938.66d, "l_discount": 0.0d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-21", "l_commitdate": "1998-09-25", "l_receiptdate": "1998-08-07", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "according to the bold, final dependencies " }
-{ "l_orderkey": 900, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 48364.36d, "l_discount": 0.01d, "l_tax": 0.06d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-15", "l_commitdate": "1994-12-03", "l_receiptdate": "1994-12-27", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": " detect quick" }
-{ "l_orderkey": 931, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 16920.72d, "l_discount": 0.0d, "l_tax": 0.05d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-04-04", "l_commitdate": "1993-01-11", "l_receiptdate": "1993-04-13", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "slyly ironic re" }
-{ "l_orderkey": 932, "l_partkey": 44, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 38705.64d, "l_discount": 0.01d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-05", "l_commitdate": "1997-07-22", "l_receiptdate": "1997-06-26", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "foxes. ironic pl" }
-{ "l_orderkey": 965, "l_partkey": 108, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 20, "l_extendedprice": 20162.0d, "l_discount": 0.04d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "F", "l_shipdate": "1995-06-16", "l_commitdate": "1995-07-20", "l_receiptdate": "1995-07-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "kly. carefully pending requ" }
-{ "l_orderkey": 995, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 16097.55d, "l_discount": 0.08d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-30", "l_commitdate": "1995-08-04", "l_receiptdate": "1995-07-27", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "uses. fluffily fina" }
-{ "l_orderkey": 1025, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 37805.4d, "l_discount": 0.03d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-05-15", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-06-10", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "e unusual, regular instr" }
-{ "l_orderkey": 1027, "l_partkey": 156, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 45414.45d, "l_discount": 0.07d, "l_tax": 0.08d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-06-17", "l_commitdate": "1992-08-28", "l_receiptdate": "1992-07-10", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "oxes. carefully regular deposits" }
-{ "l_orderkey": 1155, "l_partkey": 70, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3880.28d, "l_discount": 0.09d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-10-19", "l_commitdate": "1997-12-09", "l_receiptdate": "1997-11-02", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "ic foxes according to the carefully final " }
-{ "l_orderkey": 1185, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7776.56d, "l_discount": 0.01d, "l_tax": 0.06d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-12-05", "l_commitdate": "1992-10-05", "l_receiptdate": "1992-12-28", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ely according to the furiously regular r" }
-{ "l_orderkey": 1216, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7976.72d, "l_discount": 0.03d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-02-01", "l_commitdate": "1993-03-06", "l_receiptdate": "1993-02-08", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": " of the carefully express" }
-{ "l_orderkey": 1223, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 28002.8d, "l_discount": 0.1d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-07", "l_commitdate": "1996-07-24", "l_receiptdate": "1996-08-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": " quickly ironic requests. furious" }
-{ "l_orderkey": 1381, "l_partkey": 144, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 49074.58d, "l_discount": 0.08d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-09-22", "l_commitdate": "1998-08-12", "l_receiptdate": "1998-10-12", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "ly ironic deposits" }
-{ "l_orderkey": 1409, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 23, "l_extendedprice": 22979.07d, "l_discount": 0.01d, "l_tax": 0.03d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-04-18", "l_commitdate": "1993-02-25", "l_receiptdate": "1993-05-06", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ions. slyly ironic packages wake quick" }
-{ "l_orderkey": 1445, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 24002.4d, "l_discount": 0.01d, "l_tax": 0.0d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-02-21", "l_commitdate": "1995-02-22", "l_receiptdate": "1995-03-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "al accounts use furiously a" }
-{ "l_orderkey": 1477, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 30134.17d, "l_discount": 0.0d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-16", "l_commitdate": "1997-09-30", "l_receiptdate": "1997-12-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": " requests. fluffily final " }
-{ "l_orderkey": 1540, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 40780.46d, "l_discount": 0.03d, "l_tax": 0.01d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-09-30", "l_commitdate": "1992-10-27", "l_receiptdate": "1992-10-12", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": " final grouches bo" }
-{ "l_orderkey": 1568, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 35643.24d, "l_discount": 0.02d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-31", "l_commitdate": "1997-04-22", "l_receiptdate": "1997-06-21", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "platelets-- furiously sly excu" }
-{ "l_orderkey": 1605, "l_partkey": 142, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 48980.58d, "l_discount": 0.0d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-04-29", "l_commitdate": "1998-06-12", "l_receiptdate": "1998-05-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": ". carefully r" }
-{ "l_orderkey": 1607, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38d, "l_discount": 0.02d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-11", "l_commitdate": "1996-02-15", "l_receiptdate": "1996-01-19", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "packages haggle. regular requests boost s" }
-{ "l_orderkey": 1635, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2913.21d, "l_discount": 0.06d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-13", "l_commitdate": "1997-03-25", "l_receiptdate": "1997-03-27", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": " quickly ironic r" }
-{ "l_orderkey": 1700, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 39525.32d, "l_discount": 0.04d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-10-03", "l_commitdate": "1996-07-27", "l_receiptdate": "1996-10-22", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "ular dependencies engage slyly " }
-{ "l_orderkey": 1796, "l_partkey": 10, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 25480.28d, "l_discount": 0.08d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-12-01", "l_commitdate": "1993-01-01", "l_receiptdate": "1992-12-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "y quickly ironic accounts." }
-{ "l_orderkey": 1825, "l_partkey": 156, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 45414.45d, "l_discount": 0.05d, "l_tax": 0.05d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-02-18", "l_commitdate": "1994-02-19", "l_receiptdate": "1994-03-02", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": " accounts breach fluffily spe" }
-{ "l_orderkey": 1827, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 46534.23d, "l_discount": 0.0d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-01", "l_commitdate": "1996-08-07", "l_receiptdate": "1996-08-23", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": ". pending courts about the even e" }
-{ "l_orderkey": 1893, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 42960.87d, "l_discount": 0.1d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-01-25", "l_commitdate": "1998-01-06", "l_receiptdate": "1998-02-14", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "he carefully regular " }
-{ "l_orderkey": 1924, "l_partkey": 73, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6811.49d, "l_discount": 0.06d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-01", "l_commitdate": "1996-12-02", "l_receiptdate": "1997-01-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "osits. even accounts nag furious" }
-{ "l_orderkey": 1953, "l_partkey": 128, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 25703.0d, "l_discount": 0.07d, "l_tax": 0.06d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-01-07", "l_commitdate": "1994-01-28", "l_receiptdate": "1994-01-29", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ular, regular i" }
-{ "l_orderkey": 1985, "l_partkey": 28, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 30624.66d, "l_discount": 0.1d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-11-01", "l_receiptdate": "1994-12-05", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "s are express packages. pendin" }
-{ "l_orderkey": 1988, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 34994.52d, "l_discount": 0.09d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-21", "l_commitdate": "1995-11-24", "l_receiptdate": "1996-01-27", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "gular theodolites. " }
-{ "l_orderkey": 2048, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6545.21d, "l_discount": 0.06d, "l_tax": 0.01d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-12-07", "l_commitdate": "1994-01-31", "l_receiptdate": "1994-01-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "lent platelets boost deposits. carefully sp" }
-{ "l_orderkey": 2086, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 21121.32d, "l_discount": 0.03d, "l_tax": 0.07d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-12-16", "l_receiptdate": "1994-12-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "idly busy acc" }
-{ "l_orderkey": 2118, "l_partkey": 160, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 25443.84d, "l_discount": 0.1d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-06", "l_commitdate": "1996-12-14", "l_receiptdate": "1997-01-14", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "about the slyly bold depende" }
-{ "l_orderkey": 2183, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28161.03d, "l_discount": 0.05d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-21", "l_commitdate": "1996-08-24", "l_receiptdate": "1996-08-15", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ly unusual deposits sleep carefully" }
-{ "l_orderkey": 2211, "l_partkey": 48, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 23701.0d, "l_discount": 0.04d, "l_tax": 0.01d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-10-09", "l_commitdate": "1994-08-04", "l_receiptdate": "1994-11-03", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "deas. carefully special theodolites along" }
-{ "l_orderkey": 2215, "l_partkey": 73, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 32111.31d, "l_discount": 0.0d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-19", "l_commitdate": "1996-08-10", "l_receiptdate": "1996-07-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "dolites cajole b" }
-{ "l_orderkey": 2272, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 17821.62d, "l_discount": 0.04d, "l_tax": 0.0d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-08-01", "l_commitdate": "1993-07-06", "l_receiptdate": "1993-08-25", "l_shipinstruct": "NONE", "l_shipmode": "MAIL", "l_comment": "ons along the blithely e" }
-{ "l_orderkey": 2342, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 11304.48d, "l_discount": 0.0d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-31", "l_commitdate": "1996-07-26", "l_receiptdate": "1996-08-14", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "print blithely even deposits. carefull" }
-{ "l_orderkey": 2343, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 27272.97d, "l_discount": 0.0d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-11-10", "l_commitdate": "1995-11-17", "l_receiptdate": "1995-12-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "old theodolites." }
-{ "l_orderkey": 2439, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2128.32d, "l_discount": 0.09d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-14", "l_commitdate": "1997-06-11", "l_receiptdate": "1997-05-09", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "courts boos" }
-{ "l_orderkey": 2469, "l_partkey": 166, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11727.76d, "l_discount": 0.0d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-02-09", "l_commitdate": "1997-01-26", "l_receiptdate": "1997-02-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "ies wake carefully b" }
-{ "l_orderkey": 2592, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6930.63d, "l_discount": 0.1d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-03-13", "l_commitdate": "1993-04-25", "l_receiptdate": "1993-04-01", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": " carefully special theodolites integrate " }
-{ "l_orderkey": 2625, "l_partkey": 20, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 38640.84d, "l_discount": 0.02d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-10-18", "l_commitdate": "1992-11-17", "l_receiptdate": "1992-10-23", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": " even accounts haggle furiously" }
-{ "l_orderkey": 2659, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 26377.12d, "l_discount": 0.08d, "l_tax": 0.05d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-03-17", "l_commitdate": "1994-01-24", "l_receiptdate": "1994-03-19", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "idle tithes" }
-{ "l_orderkey": 2689, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 40770.0d, "l_discount": 0.02d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-04-29", "l_commitdate": "1992-06-22", "l_receiptdate": "1992-04-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "e quickly. carefully silent" }
-{ "l_orderkey": 2690, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 45766.16d, "l_discount": 0.05d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-30", "l_commitdate": "1996-05-19", "l_receiptdate": "1996-06-26", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "ly alongside of th" }
-{ "l_orderkey": 2692, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2751.03d, "l_discount": 0.1d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-02-25", "l_commitdate": "1998-01-29", "l_receiptdate": "1998-03-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "equests. bold, even foxes haggle slyl" }
-{ "l_orderkey": 2694, "l_partkey": 153, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31594.5d, "l_discount": 0.02d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-06-20", "l_commitdate": "1996-06-01", "l_receiptdate": "1996-07-15", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "oxes. never iro" }
-{ "l_orderkey": 2759, "l_partkey": 59, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 10, "l_extendedprice": 9590.5d, "l_discount": 0.1d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-12-14", "l_commitdate": "1994-01-08", "l_receiptdate": "1994-01-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "s. busily ironic theodo" }
-{ "l_orderkey": 2819, "l_partkey": 70, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 17, "l_extendedprice": 16491.19d, "l_discount": 0.08d, "l_tax": 0.08d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-07-16", "l_commitdate": "1994-07-15", "l_receiptdate": "1994-07-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "en deposits above the f" }
-{ "l_orderkey": 2850, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 42874.87d, "l_discount": 0.02d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-11", "l_commitdate": "1996-11-03", "l_receiptdate": "1997-02-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "unusual accounts" }
-{ "l_orderkey": 2886, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 960.06d, "l_discount": 0.09d, "l_tax": 0.05d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-02-01", "l_commitdate": "1994-12-18", "l_receiptdate": "1995-02-28", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "eposits fr" }
-{ "l_orderkey": 2912, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 8176.96d, "l_discount": 0.06d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-04-09", "l_commitdate": "1992-04-19", "l_receiptdate": "1992-04-26", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "hs cajole over the slyl" }
-{ "l_orderkey": 2944, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 44885.28d, "l_discount": 0.08d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-25", "l_commitdate": "1997-10-28", "l_receiptdate": "1998-01-21", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "ickly special theodolit" }
-{ "l_orderkey": 2947, "l_partkey": 10, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 33670.37d, "l_discount": 0.09d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-08-09", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-08-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "e accounts: expres" }
-{ "l_orderkey": 2950, "l_partkey": 130, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 32, "l_extendedprice": 32964.16d, "l_discount": 0.01d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-09-21", "l_commitdate": "1997-08-25", "l_receiptdate": "1997-10-08", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "its wake carefully slyly final ideas." }
-{ "l_orderkey": 2978, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28712.61d, "l_discount": 0.0d, "l_tax": 0.08d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-06-03", "l_commitdate": "1995-07-25", "l_receiptdate": "1995-06-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "ecial ideas promise slyly" }
-{ "l_orderkey": 3143, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 21781.98d, "l_discount": 0.02d, "l_tax": 0.0d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-03-26", "l_receiptdate": "1993-05-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "l, special instructions nag " }
-{ "l_orderkey": 3264, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 42907.8d, "l_discount": 0.06d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-11-07", "l_commitdate": "1996-12-12", "l_receiptdate": "1996-11-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "sleep carefully after the slyly final" }
-{ "l_orderkey": 3266, "l_partkey": 64, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 29885.86d, "l_discount": 0.09d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-19", "l_commitdate": "1995-05-04", "l_receiptdate": "1995-07-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "grate among the quickly express deposits" }
-{ "l_orderkey": 3270, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 10285.33d, "l_discount": 0.07d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-07-29", "l_commitdate": "1997-08-11", "l_receiptdate": "1997-08-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": " solve at the regular deposits. " }
-{ "l_orderkey": 3364, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 48514.41d, "l_discount": 0.03d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-09-17", "l_commitdate": "1997-08-23", "l_receiptdate": "1997-10-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "d accounts? caref" }
-{ "l_orderkey": 3366, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3760.16d, "l_discount": 0.07d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-20", "l_commitdate": "1997-06-25", "l_receiptdate": "1997-06-03", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": " carefully about " }
-{ "l_orderkey": 3425, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11221.32d, "l_discount": 0.03d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-04-24", "l_commitdate": "1996-05-29", "l_receiptdate": "1996-05-23", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ckly final deposits use quickly?" }
-{ "l_orderkey": 3460, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 36440.4d, "l_discount": 0.1d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-28", "l_commitdate": "1995-12-14", "l_receiptdate": "1996-01-02", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "odolites are slyly bold deposits" }
-{ "l_orderkey": 3494, "l_partkey": 117, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 40684.4d, "l_discount": 0.05d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-07-10", "l_commitdate": "1993-06-01", "l_receiptdate": "1993-07-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "lites haggle furiously about the fin" }
-{ "l_orderkey": 3520, "l_partkey": 28, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 27840.6d, "l_discount": 0.04d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-11", "l_commitdate": "1997-10-02", "l_receiptdate": "1997-12-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "deas should solve blithely among the ironi" }
-{ "l_orderkey": 3559, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28712.61d, "l_discount": 0.0d, "l_tax": 0.07d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-12-10", "l_commitdate": "1992-12-03", "l_receiptdate": "1992-12-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "l, regular accounts wake flu" }
-{ "l_orderkey": 3585, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 21, "l_extendedprice": 21464.52d, "l_discount": 0.05d, "l_tax": 0.04d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-12-25", "l_receiptdate": "1995-01-01", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ounts use. express, final platelets us" }
-{ "l_orderkey": 3618, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 39525.32d, "l_discount": 0.08d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-22", "l_commitdate": "1998-02-23", "l_receiptdate": "1998-01-03", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "nts haggle fluffily above the regular " }
-{ "l_orderkey": 3715, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 13, "l_extendedprice": 12962.17d, "l_discount": 0.0d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-11", "l_commitdate": "1996-04-25", "l_receiptdate": "1996-06-09", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "e quickly ironic" }
-{ "l_orderkey": 3844, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2070.26d, "l_discount": 0.03d, "l_tax": 0.07d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-02-24", "l_commitdate": "1995-02-03", "l_receiptdate": "1995-03-18", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "es haggle final acco" }
-{ "l_orderkey": 3878, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 6601.2d, "l_discount": 0.07d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-21", "l_commitdate": "1997-05-22", "l_receiptdate": "1997-07-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "s. regular instru" }
-{ "l_orderkey": 3906, "l_partkey": 153, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 44232.3d, "l_discount": 0.0d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-09-03", "l_commitdate": "1992-07-22", "l_receiptdate": "1992-09-04", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "jole blithely after the furiously regular " }
-{ "l_orderkey": 3974, "l_partkey": 22, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 43334.94d, "l_discount": 0.1d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-06-03", "l_commitdate": "1996-05-08", "l_receiptdate": "1996-06-28", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "dencies above the re" }
-{ "l_orderkey": 4001, "l_partkey": 106, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 26, "l_extendedprice": 26158.6d, "l_discount": 0.0d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-07-26", "l_commitdate": "1997-06-18", "l_receiptdate": "1997-08-08", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "tegrate blithely" }
-{ "l_orderkey": 4005, "l_partkey": 4, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 26, "l_extendedprice": 23504.0d, "l_discount": 0.09d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-12-01", "l_commitdate": "1997-02-03", "l_receiptdate": "1996-12-15", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": " to the quic" }
-{ "l_orderkey": 4033, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 27272.97d, "l_discount": 0.01d, "l_tax": 0.04d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-08-08", "l_commitdate": "1993-08-14", "l_receiptdate": "1993-08-09", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "pinto beans" }
-{ "l_orderkey": 4034, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 48, "l_extendedprice": 52329.12d, "l_discount": 0.03d, "l_tax": 0.03d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-03-01", "l_commitdate": "1994-01-16", "l_receiptdate": "1994-03-16", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": " blithely regular requests play carefull" }
-{ "l_orderkey": 4036, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 41676.0d, "l_discount": 0.09d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-21", "l_commitdate": "1997-05-29", "l_receiptdate": "1997-07-18", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "usly across the even th" }
-{ "l_orderkey": 4064, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 3297.57d, "l_discount": 0.1d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-04", "l_commitdate": "1997-01-01", "l_receiptdate": "1997-01-23", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "its! quickly sp" }
-{ "l_orderkey": 4067, "l_partkey": 180, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 19443.24d, "l_discount": 0.03d, "l_tax": 0.08d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-01-24", "l_commitdate": "1992-12-23", "l_receiptdate": "1993-02-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": "e the slyly final packages d" }
-{ "l_orderkey": 4068, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 43434.73d, "l_discount": 0.05d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-11-28", "l_commitdate": "1996-11-16", "l_receiptdate": "1996-12-22", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ructions. regular, special packag" }
-{ "l_orderkey": 4098, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 50609.2d, "l_discount": 0.07d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-26", "l_commitdate": "1997-01-27", "l_receiptdate": "1997-02-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "e slyly blithely silent deposits. fluff" }
-{ "l_orderkey": 4192, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 32796.36d, "l_discount": 0.06d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-04-25", "l_commitdate": "1998-05-26", "l_receiptdate": "1998-05-03", "l_shipinstruct": "COLLECT COD", "l_shipmode": "TRUCK", "l_comment": "eodolites sleep" }
-{ "l_orderkey": 4194, "l_partkey": 197, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 47179.17d, "l_discount": 0.08d, "l_tax": 0.06d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-11-06", "l_commitdate": "1994-12-09", "l_receiptdate": "1994-11-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "olites are after the exp" }
-{ "l_orderkey": 4261, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 12121.32d, "l_discount": 0.05d, "l_tax": 0.01d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-11-01", "l_commitdate": "1993-01-01", "l_receiptdate": "1992-11-12", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "into beans " }
-{ "l_orderkey": 4418, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 32, "l_extendedprice": 29920.96d, "l_discount": 0.02d, "l_tax": 0.06d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-05-28", "l_commitdate": "1993-06-02", "l_receiptdate": "1993-05-30", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ly. bold pinto b" }
-{ "l_orderkey": 4422, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 5175.65d, "l_discount": 0.09d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-17", "l_commitdate": "1995-08-13", "l_receiptdate": "1995-07-25", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "e furiously about t" }
-{ "l_orderkey": 4486, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 47615.98d, "l_discount": 0.08d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-05-02", "l_commitdate": "1998-04-05", "l_receiptdate": "1998-05-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "ackages. specia" }
-{ "l_orderkey": 4512, "l_partkey": 162, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31864.8d, "l_discount": 0.07d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-28", "l_commitdate": "1995-12-22", "l_receiptdate": "1996-02-22", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ly unusual package" }
-{ "l_orderkey": 4513, "l_partkey": 170, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 31034.93d, "l_discount": 0.03d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-18", "l_commitdate": "1996-05-23", "l_receiptdate": "1996-06-08", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "cajole. regular packages boost. s" }
-{ "l_orderkey": 4545, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 40780.46d, "l_discount": 0.06d, "l_tax": 0.06d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-01-27", "l_commitdate": "1993-03-01", "l_receiptdate": "1993-02-04", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "nts serve according to th" }
-{ "l_orderkey": 4549, "l_partkey": 159, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 46602.6d, "l_discount": 0.08d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-03-13", "l_commitdate": "1998-04-15", "l_receiptdate": "1998-03-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ding to the regular, silent requests" }
-{ "l_orderkey": 4551, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 5466.06d, "l_discount": 0.08d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-18", "l_commitdate": "1996-04-23", "l_receiptdate": "1996-06-13", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "fily silent fo" }
-{ "l_orderkey": 4576, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 4950.45d, "l_discount": 0.09d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-23", "l_commitdate": "1996-11-08", "l_receiptdate": "1996-09-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "ly express, special asymptote" }
-{ "l_orderkey": 4608, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 32195.1d, "l_discount": 0.08d, "l_tax": 0.05d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-08", "l_commitdate": "1994-07-18", "l_receiptdate": "1994-10-25", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "s cajole. slyly " }
-{ "l_orderkey": 4641, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 49058.55d, "l_discount": 0.07d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-04-19", "l_receiptdate": "1993-05-21", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": " about the close " }
-{ "l_orderkey": 4679, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 7631.33d, "l_discount": 0.1d, "l_tax": 0.05d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-04-11", "l_receiptdate": "1993-05-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "kages. bold, regular packa" }
-{ "l_orderkey": 4769, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 14960.48d, "l_discount": 0.08d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-16", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-07-22", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": " deposits. slyly even asymptote" }
-{ "l_orderkey": 4802, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 5640.24d, "l_discount": 0.0d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-16", "l_commitdate": "1997-03-25", "l_receiptdate": "1997-04-21", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "unusual accounts wake blithely. b" }
-{ "l_orderkey": 4804, "l_partkey": 128, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 45237.28d, "l_discount": 0.06d, "l_tax": 0.08d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-05-02", "l_commitdate": "1992-03-24", "l_receiptdate": "1992-05-28", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "aggle quickly among the slyly fi" }
-{ "l_orderkey": 4805, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 7351.05d, "l_discount": 0.09d, "l_tax": 0.03d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-05-01", "l_commitdate": "1992-07-09", "l_receiptdate": "1992-05-09", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": " requests. regular deposit" }
-{ "l_orderkey": 4807, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 9, "l_extendedprice": 9199.08d, "l_discount": 0.04d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-23", "l_commitdate": "1997-03-01", "l_receiptdate": "1997-05-15", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "may are blithely. carefully even pinto b" }
-{ "l_orderkey": 4836, "l_partkey": 162, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 23367.52d, "l_discount": 0.01d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-03", "l_commitdate": "1997-02-23", "l_receiptdate": "1997-03-04", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "al pinto beans. care" }
-{ "l_orderkey": 4837, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 15072.64d, "l_discount": 0.09d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-08-12", "l_commitdate": "1998-06-06", "l_receiptdate": "1998-08-26", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "ing requests are blithely regular instructi" }
-{ "l_orderkey": 4898, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 42771.08d, "l_discount": 0.07d, "l_tax": 0.02d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-09-13", "l_commitdate": "1994-08-18", "l_receiptdate": "1994-09-16", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "y regular grouches about" }
-{ "l_orderkey": 4928, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4000.4d, "l_discount": 0.04d, "l_tax": 0.02d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-10-25", "l_commitdate": "1993-12-24", "l_receiptdate": "1993-11-16", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "bout the slyly final accounts. carefull" }
-{ "l_orderkey": 4929, "l_partkey": 14, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 20, "l_extendedprice": 18280.2d, "l_discount": 0.0d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-12", "l_commitdate": "1996-05-23", "l_receiptdate": "1996-03-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": " final pinto beans detect. final," }
-{ "l_orderkey": 4967, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 48553.5d, "l_discount": 0.07d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-27", "l_commitdate": "1997-05-13", "l_receiptdate": "1997-06-12", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "kages. final, unusual accounts c" }
-{ "l_orderkey": 4996, "l_partkey": 56, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 35, "l_extendedprice": 33461.75d, "l_discount": 0.07d, "l_tax": 0.01d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-10-30", "l_commitdate": "1992-10-27", "l_receiptdate": "1992-11-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "s. unusual, regular dolphins integrate care" }
-{ "l_orderkey": 5028, "l_partkey": 14, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 13710.15d, "l_discount": 0.07d, "l_tax": 0.07d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-07-17", "l_commitdate": "1992-07-16", "l_receiptdate": "1992-08-05", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "es are quickly final pains. furiously pend" }
-{ "l_orderkey": 5031, "l_partkey": 50, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 14250.75d, "l_discount": 0.02d, "l_tax": 0.05d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-04-01", "l_commitdate": "1995-02-24", "l_receiptdate": "1995-04-12", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "yly pending theodolites." }
-{ "l_orderkey": 5092, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31924.8d, "l_discount": 0.06d, "l_tax": 0.0d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-27", "l_commitdate": "1995-12-08", "l_receiptdate": "1996-01-09", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ss, ironic deposits. furiously stea" }
-{ "l_orderkey": 5153, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 39271.26d, "l_discount": 0.03d, "l_tax": 0.01d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-10-03", "l_commitdate": "1995-11-09", "l_receiptdate": "1995-10-11", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "re thinly. ironic" }
-{ "l_orderkey": 5154, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11992.09d, "l_discount": 0.02d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-06", "l_commitdate": "1997-06-30", "l_receiptdate": "1997-09-04", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "luffily bold foxes. final" }
-{ "l_orderkey": 5185, "l_partkey": 197, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 40596.03d, "l_discount": 0.0d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-08", "l_commitdate": "1997-09-08", "l_receiptdate": "1997-08-14", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "gainst the courts dazzle care" }
-{ "l_orderkey": 5187, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 44639.49d, "l_discount": 0.04d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-10-20", "l_commitdate": "1997-10-12", "l_receiptdate": "1997-10-26", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "l, regular platelets instead of the foxes w" }
-{ "l_orderkey": 5190, "l_partkey": 56, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 41110.15d, "l_discount": 0.09d, "l_tax": 0.06d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-08-19", "l_commitdate": "1992-06-10", "l_receiptdate": "1992-09-01", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "encies use fluffily unusual requests? hoc" }
-{ "l_orderkey": 5217, "l_partkey": 80, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 49004.0d, "l_discount": 0.05d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-26", "l_commitdate": "1995-11-21", "l_receiptdate": "1996-01-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "s. express, express accounts c" }
-{ "l_orderkey": 5281, "l_partkey": 114, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 37522.07d, "l_discount": 0.05d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-11-10", "l_commitdate": "1996-01-31", "l_receiptdate": "1995-11-22", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ronic dependencies. fluffily final p" }
-{ "l_orderkey": 5284, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 17170.72d, "l_discount": 0.04d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-08-17", "l_commitdate": "1995-08-23", "l_receiptdate": "1995-08-26", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "unts detect furiously even d" }
-{ "l_orderkey": 5286, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 1099.19d, "l_discount": 0.01d, "l_tax": 0.07d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-25", "l_commitdate": "1997-11-07", "l_receiptdate": "1997-12-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "ly! furiously final pack" }
-{ "l_orderkey": 5313, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 31178.34d, "l_discount": 0.1d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-07", "l_commitdate": "1997-08-12", "l_receiptdate": "1997-08-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ccording to the blithely final account" }
-{ "l_orderkey": 5315, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 11220.36d, "l_discount": 0.08d, "l_tax": 0.06d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-12-18", "l_commitdate": "1993-01-16", "l_receiptdate": "1993-01-10", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ccounts. furiously ironi" }
-{ "l_orderkey": 5316, "l_partkey": 108, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 29234.9d, "l_discount": 0.1d, "l_tax": 0.05d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-03-28", "l_commitdate": "1994-04-29", "l_receiptdate": "1994-04-09", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "ckly unusual foxes bo" }
-{ "l_orderkey": 5379, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 43967.6d, "l_discount": 0.01d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-10-01", "l_commitdate": "1995-10-19", "l_receiptdate": "1995-10-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "carefully final accounts haggle blithely. " }
-{ "l_orderkey": 5441, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 3192.48d, "l_discount": 0.0d, "l_tax": 0.02d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-08-12", "l_commitdate": "1994-10-14", "l_receiptdate": "1994-09-01", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "are. unusual, " }
-{ "l_orderkey": 5445, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 32672.97d, "l_discount": 0.08d, "l_tax": 0.07d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-10-21", "l_commitdate": "1993-10-14", "l_receiptdate": "1993-10-28", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "ests. final instructions" }
-{ "l_orderkey": 5446, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 29435.13d, "l_discount": 0.05d, "l_tax": 0.07d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-07-21", "l_commitdate": "1994-08-25", "l_receiptdate": "1994-08-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ously across the quic" }
-{ "l_orderkey": 5447, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 30971.79d, "l_discount": 0.09d, "l_tax": 0.03d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-14", "l_commitdate": "1996-05-07", "l_receiptdate": "1996-07-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": " foxes sleep. blithely unusual accounts det" }
-{ "l_orderkey": 5476, "l_partkey": 48, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 13, "l_extendedprice": 12324.52d, "l_discount": 0.01d, "l_tax": 0.04d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-27", "l_commitdate": "1997-12-08", "l_receiptdate": "1997-12-29", "l_shipinstruct": "COLLECT COD", "l_shipmode": "TRUCK", "l_comment": "iously special ac" }
-{ "l_orderkey": 5506, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2080.28d, "l_discount": 0.0d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-02-04", "l_commitdate": "1994-01-13", "l_receiptdate": "1994-02-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "onic theodolites are fluffil" }
-{ "l_orderkey": 5536, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 13861.26d, "l_discount": 0.08d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-05-18", "l_commitdate": "1998-05-08", "l_receiptdate": "1998-06-05", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "instructions sleep " }
-{ "l_orderkey": 5572, "l_partkey": 22, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 22128.48d, "l_discount": 0.08d, "l_tax": 0.08d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-30", "l_commitdate": "1994-10-02", "l_receiptdate": "1994-11-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "ests cajole. evenly ironic exc" }
-{ "l_orderkey": 5664, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 25553.0d, "l_discount": 0.0d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-10-29", "l_commitdate": "1998-09-23", "l_receiptdate": "1998-11-25", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "eposits: furiously ironic grouch" }
-{ "l_orderkey": 5670, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 26732.43d, "l_discount": 0.1d, "l_tax": 0.06d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-09", "l_commitdate": "1993-05-30", "l_receiptdate": "1993-06-06", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": " ideas promise bli" }
-{ "l_orderkey": 5728, "l_partkey": 44, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 44369.88d, "l_discount": 0.1d, "l_tax": 0.05d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-13", "l_commitdate": "1995-01-25", "l_receiptdate": "1994-12-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "nd the bravely final deposits. final ideas" }
-{ "l_orderkey": 5735, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 39362.46d, "l_discount": 0.01d, "l_tax": 0.01d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-23", "l_commitdate": "1995-02-10", "l_receiptdate": "1995-01-22", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "lthily ruthless i" }
-{ "l_orderkey": 5826, "l_partkey": 144, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4176.56d, "l_discount": 0.03d, "l_tax": 0.06d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-31", "l_commitdate": "1998-09-10", "l_receiptdate": "1998-08-27", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": " packages across the fluffily spec" }
-{ "l_orderkey": 5829, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3760.16d, "l_discount": 0.01d, "l_tax": 0.02d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-01", "l_commitdate": "1997-02-17", "l_receiptdate": "1997-03-22", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "ithely; accounts cajole ideas. regular foxe" }
-{ "l_orderkey": 5856, "l_partkey": 4, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 904.0d, "l_discount": 0.03d, "l_tax": 0.02d, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-29", "l_commitdate": "1995-01-07", "l_receiptdate": "1995-01-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "tly. special deposits wake blithely even" }
-{ "l_orderkey": 5926, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7920.72d, "l_discount": 0.02d, "l_tax": 0.0d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-07-17", "l_commitdate": "1994-07-20", "l_receiptdate": "1994-08-11", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "gle furiously express foxes. bo" }
-{ "l_orderkey": 5927, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 43563.96d, "l_discount": 0.04d, "l_tax": 0.05d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-29", "l_commitdate": "1997-11-21", "l_receiptdate": "1997-12-13", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "rding to the special, final decoy" }
-{ "l_orderkey": 5955, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 14561.96d, "l_discount": 0.08d, "l_tax": 0.08d, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-22", "l_commitdate": "1995-05-23", "l_receiptdate": "1995-06-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": " unusual, bold theodolit" }
-{ "l_orderkey": 5959, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 50721.37d, "l_discount": 0.07d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-07-16", "l_commitdate": "1992-08-09", "l_receiptdate": "1992-08-14", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "usual packages haggle slyly pi" }
-{ "l_orderkey": 5988, "l_partkey": 172, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 43958.97d, "l_discount": 0.08d, "l_tax": 0.03d, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-01-20", "l_commitdate": "1994-02-06", "l_receiptdate": "1994-02-10", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "the pending, express reque" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.adm
deleted file mode 100644
index 199ac15..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.adm
+++ /dev/null
@@ -1,167 +0,0 @@
-{ "l_orderkey": 36, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 42845.04, "l_discount": 0.09, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-03", "l_commitdate": "1996-01-21", "l_receiptdate": "1996-02-23", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": " careful courts. special " }
-{ "l_orderkey": 68, "l_partkey": 8, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2724.0, "l_discount": 0.05, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-04", "l_commitdate": "1998-06-05", "l_receiptdate": "1998-07-21", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "fully special instructions cajole. furious" }
-{ "l_orderkey": 162, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38, "l_discount": 0.02, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-09-02", "l_commitdate": "1995-06-17", "l_receiptdate": "1995-09-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "es! final somas integrate" }
-{ "l_orderkey": 192, "l_partkey": 98, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 23, "l_extendedprice": 22956.07, "l_discount": 0.0, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-02-05", "l_commitdate": "1998-02-06", "l_receiptdate": "1998-03-07", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "ly pending theodolites haggle quickly fluf" }
-{ "l_orderkey": 197, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 38964.51, "l_discount": 0.02, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-21", "l_commitdate": "1995-07-01", "l_receiptdate": "1995-08-14", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "press accounts. daringly sp" }
-{ "l_orderkey": 227, "l_partkey": 166, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 19, "l_extendedprice": 20257.04, "l_discount": 0.05, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-10", "l_commitdate": "1996-01-30", "l_receiptdate": "1995-12-26", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "s cajole furiously a" }
-{ "l_orderkey": 290, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 35, "l_extendedprice": 31710.0, "l_discount": 0.01, "l_tax": 0.02, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-04-01", "l_commitdate": "1994-02-05", "l_receiptdate": "1994-04-27", "l_shipinstruct": "NONE", "l_shipmode": "MAIL", "l_comment": "ove the final foxes detect slyly fluffily" }
-{ "l_orderkey": 325, "l_partkey": 159, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 36011.1, "l_discount": 0.09, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-10-28", "l_commitdate": "1993-12-13", "l_receiptdate": "1993-11-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "ly bold deposits. always iron" }
-{ "l_orderkey": 355, "l_partkey": 114, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 31437.41, "l_discount": 0.09, "l_tax": 0.07, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-07-13", "l_commitdate": "1994-08-18", "l_receiptdate": "1994-07-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "y unusual, ironic" }
-{ "l_orderkey": 389, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38, "l_discount": 0.09, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-04-13", "l_commitdate": "1994-04-10", "l_receiptdate": "1994-04-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "fts. courts eat blithely even dependenc" }
-{ "l_orderkey": 391, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 14309.68, "l_discount": 0.09, "l_tax": 0.02, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-02-11", "l_commitdate": "1995-02-03", "l_receiptdate": "1995-02-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": " escapades sleep furiously about " }
-{ "l_orderkey": 417, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 36661.56, "l_discount": 0.01, "l_tax": 0.02, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-05-31", "l_commitdate": "1994-05-02", "l_receiptdate": "1994-06-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "y regular requests wake along " }
-{ "l_orderkey": 453, "l_partkey": 198, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 49418.55, "l_discount": 0.01, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-30", "l_commitdate": "1997-08-20", "l_receiptdate": "1997-07-19", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "ifts wake carefully." }
-{ "l_orderkey": 485, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 52507.5, "l_discount": 0.01, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-28", "l_commitdate": "1997-05-26", "l_receiptdate": "1997-04-18", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "iously quick excuses. carefully final f" }
-{ "l_orderkey": 545, "l_partkey": 170, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4280.68, "l_discount": 0.02, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-23", "l_commitdate": "1995-12-16", "l_receiptdate": "1996-03-21", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": ", ironic grouches cajole over" }
-{ "l_orderkey": 581, "l_partkey": 64, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 39526.46, "l_discount": 0.09, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-26", "l_commitdate": "1997-04-06", "l_receiptdate": "1997-06-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "nts. quickly" }
-{ "l_orderkey": 647, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 37597.41, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-19", "l_commitdate": "1997-09-24", "l_receiptdate": "1997-12-15", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "r instructions. quickly unusu" }
-{ "l_orderkey": 704, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 43607.6, "l_discount": 0.05, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-30", "l_commitdate": "1997-01-10", "l_receiptdate": "1997-02-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "ggle quickly. r" }
-{ "l_orderkey": 738, "l_partkey": 198, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 37338.46, "l_discount": 0.0, "l_tax": 0.06, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-06-09", "l_commitdate": "1993-04-15", "l_receiptdate": "1993-07-09", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "s against the ironic exc" }
-{ "l_orderkey": 773, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 5000.5, "l_discount": 0.06, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-11-21", "l_commitdate": "1993-12-19", "l_receiptdate": "1993-12-21", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "ar requests. regular, thin packages u" }
-{ "l_orderkey": 800, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 36938.66, "l_discount": 0.0, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-21", "l_commitdate": "1998-09-25", "l_receiptdate": "1998-08-07", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "according to the bold, final dependencies " }
-{ "l_orderkey": 900, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 48364.36, "l_discount": 0.01, "l_tax": 0.06, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-15", "l_commitdate": "1994-12-03", "l_receiptdate": "1994-12-27", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": " detect quick" }
-{ "l_orderkey": 931, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 16920.72, "l_discount": 0.0, "l_tax": 0.05, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-04-04", "l_commitdate": "1993-01-11", "l_receiptdate": "1993-04-13", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "slyly ironic re" }
-{ "l_orderkey": 932, "l_partkey": 44, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 38705.64, "l_discount": 0.01, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-05", "l_commitdate": "1997-07-22", "l_receiptdate": "1997-06-26", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "foxes. ironic pl" }
-{ "l_orderkey": 965, "l_partkey": 108, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 20, "l_extendedprice": 20162.0, "l_discount": 0.04, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "F", "l_shipdate": "1995-06-16", "l_commitdate": "1995-07-20", "l_receiptdate": "1995-07-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "kly. carefully pending requ" }
-{ "l_orderkey": 995, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 16097.55, "l_discount": 0.08, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-30", "l_commitdate": "1995-08-04", "l_receiptdate": "1995-07-27", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "uses. fluffily fina" }
-{ "l_orderkey": 1025, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 37805.4, "l_discount": 0.03, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-05-15", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-06-10", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "e unusual, regular instr" }
-{ "l_orderkey": 1027, "l_partkey": 156, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 45414.45, "l_discount": 0.07, "l_tax": 0.08, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-06-17", "l_commitdate": "1992-08-28", "l_receiptdate": "1992-07-10", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "oxes. carefully regular deposits" }
-{ "l_orderkey": 1155, "l_partkey": 70, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3880.28, "l_discount": 0.09, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-10-19", "l_commitdate": "1997-12-09", "l_receiptdate": "1997-11-02", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "ic foxes according to the carefully final " }
-{ "l_orderkey": 1185, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7776.56, "l_discount": 0.01, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-12-05", "l_commitdate": "1992-10-05", "l_receiptdate": "1992-12-28", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ely according to the furiously regular r" }
-{ "l_orderkey": 1216, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7976.72, "l_discount": 0.03, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-02-01", "l_commitdate": "1993-03-06", "l_receiptdate": "1993-02-08", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": " of the carefully express" }
-{ "l_orderkey": 1223, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 28002.8, "l_discount": 0.1, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-07", "l_commitdate": "1996-07-24", "l_receiptdate": "1996-08-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": " quickly ironic requests. furious" }
-{ "l_orderkey": 1381, "l_partkey": 144, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 49074.58, "l_discount": 0.08, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-09-22", "l_commitdate": "1998-08-12", "l_receiptdate": "1998-10-12", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "ly ironic deposits" }
-{ "l_orderkey": 1409, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 23, "l_extendedprice": 22979.07, "l_discount": 0.01, "l_tax": 0.03, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-04-18", "l_commitdate": "1993-02-25", "l_receiptdate": "1993-05-06", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ions. slyly ironic packages wake quick" }
-{ "l_orderkey": 1445, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 24002.4, "l_discount": 0.01, "l_tax": 0.0, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-02-21", "l_commitdate": "1995-02-22", "l_receiptdate": "1995-03-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "al accounts use furiously a" }
-{ "l_orderkey": 1477, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 30134.17, "l_discount": 0.0, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-16", "l_commitdate": "1997-09-30", "l_receiptdate": "1997-12-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": " requests. fluffily final " }
-{ "l_orderkey": 1540, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 40780.46, "l_discount": 0.03, "l_tax": 0.01, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-09-30", "l_commitdate": "1992-10-27", "l_receiptdate": "1992-10-12", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": " final grouches bo" }
-{ "l_orderkey": 1568, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 35643.24, "l_discount": 0.02, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-31", "l_commitdate": "1997-04-22", "l_receiptdate": "1997-06-21", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "platelets-- furiously sly excu" }
-{ "l_orderkey": 1605, "l_partkey": 142, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 48980.58, "l_discount": 0.0, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-04-29", "l_commitdate": "1998-06-12", "l_receiptdate": "1998-05-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": ". carefully r" }
-{ "l_orderkey": 1607, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2180.38, "l_discount": 0.02, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-11", "l_commitdate": "1996-02-15", "l_receiptdate": "1996-01-19", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "packages haggle. regular requests boost s" }
-{ "l_orderkey": 1635, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2913.21, "l_discount": 0.06, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-13", "l_commitdate": "1997-03-25", "l_receiptdate": "1997-03-27", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": " quickly ironic r" }
-{ "l_orderkey": 1700, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 39525.32, "l_discount": 0.04, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-10-03", "l_commitdate": "1996-07-27", "l_receiptdate": "1996-10-22", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "ular dependencies engage slyly " }
-{ "l_orderkey": 1796, "l_partkey": 10, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 25480.28, "l_discount": 0.08, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-12-01", "l_commitdate": "1993-01-01", "l_receiptdate": "1992-12-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "y quickly ironic accounts." }
-{ "l_orderkey": 1825, "l_partkey": 156, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 45414.45, "l_discount": 0.05, "l_tax": 0.05, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-02-18", "l_commitdate": "1994-02-19", "l_receiptdate": "1994-03-02", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": " accounts breach fluffily spe" }
-{ "l_orderkey": 1827, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 46534.23, "l_discount": 0.0, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-01", "l_commitdate": "1996-08-07", "l_receiptdate": "1996-08-23", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": ". pending courts about the even e" }
-{ "l_orderkey": 1893, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 42960.87, "l_discount": 0.1, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-01-25", "l_commitdate": "1998-01-06", "l_receiptdate": "1998-02-14", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "he carefully regular " }
-{ "l_orderkey": 1924, "l_partkey": 73, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6811.49, "l_discount": 0.06, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-01", "l_commitdate": "1996-12-02", "l_receiptdate": "1997-01-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "osits. even accounts nag furious" }
-{ "l_orderkey": 1953, "l_partkey": 128, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 25703.0, "l_discount": 0.07, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-01-07", "l_commitdate": "1994-01-28", "l_receiptdate": "1994-01-29", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ular, regular i" }
-{ "l_orderkey": 1985, "l_partkey": 28, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 30624.66, "l_discount": 0.1, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-11-01", "l_receiptdate": "1994-12-05", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "s are express packages. pendin" }
-{ "l_orderkey": 1988, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 34994.52, "l_discount": 0.09, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-21", "l_commitdate": "1995-11-24", "l_receiptdate": "1996-01-27", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "gular theodolites. " }
-{ "l_orderkey": 2048, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6545.21, "l_discount": 0.06, "l_tax": 0.01, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-12-07", "l_commitdate": "1994-01-31", "l_receiptdate": "1994-01-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "lent platelets boost deposits. carefully sp" }
-{ "l_orderkey": 2086, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 21121.32, "l_discount": 0.03, "l_tax": 0.07, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-12-16", "l_receiptdate": "1994-12-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "idly busy acc" }
-{ "l_orderkey": 2118, "l_partkey": 160, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 25443.84, "l_discount": 0.1, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-06", "l_commitdate": "1996-12-14", "l_receiptdate": "1997-01-14", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "about the slyly bold depende" }
-{ "l_orderkey": 2183, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28161.03, "l_discount": 0.05, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-21", "l_commitdate": "1996-08-24", "l_receiptdate": "1996-08-15", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ly unusual deposits sleep carefully" }
-{ "l_orderkey": 2211, "l_partkey": 48, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 23701.0, "l_discount": 0.04, "l_tax": 0.01, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-10-09", "l_commitdate": "1994-08-04", "l_receiptdate": "1994-11-03", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "deas. carefully special theodolites along" }
-{ "l_orderkey": 2215, "l_partkey": 73, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 32111.31, "l_discount": 0.0, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-19", "l_commitdate": "1996-08-10", "l_receiptdate": "1996-07-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "dolites cajole b" }
-{ "l_orderkey": 2272, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 17821.62, "l_discount": 0.04, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-08-01", "l_commitdate": "1993-07-06", "l_receiptdate": "1993-08-25", "l_shipinstruct": "NONE", "l_shipmode": "MAIL", "l_comment": "ons along the blithely e" }
-{ "l_orderkey": 2342, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 11304.48, "l_discount": 0.0, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-31", "l_commitdate": "1996-07-26", "l_receiptdate": "1996-08-14", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "print blithely even deposits. carefull" }
-{ "l_orderkey": 2343, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 27272.97, "l_discount": 0.0, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-11-10", "l_commitdate": "1995-11-17", "l_receiptdate": "1995-12-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "old theodolites." }
-{ "l_orderkey": 2439, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2128.32, "l_discount": 0.09, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-14", "l_commitdate": "1997-06-11", "l_receiptdate": "1997-05-09", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "courts boos" }
-{ "l_orderkey": 2469, "l_partkey": 166, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11727.76, "l_discount": 0.0, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-02-09", "l_commitdate": "1997-01-26", "l_receiptdate": "1997-02-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "ies wake carefully b" }
-{ "l_orderkey": 2592, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 6930.63, "l_discount": 0.1, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-03-13", "l_commitdate": "1993-04-25", "l_receiptdate": "1993-04-01", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": " carefully special theodolites integrate " }
-{ "l_orderkey": 2625, "l_partkey": 20, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 38640.84, "l_discount": 0.02, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-10-18", "l_commitdate": "1992-11-17", "l_receiptdate": "1992-10-23", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": " even accounts haggle furiously" }
-{ "l_orderkey": 2659, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 28, "l_extendedprice": 26377.12, "l_discount": 0.08, "l_tax": 0.05, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-03-17", "l_commitdate": "1994-01-24", "l_receiptdate": "1994-03-19", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "idle tithes" }
-{ "l_orderkey": 2689, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 40770.0, "l_discount": 0.02, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-04-29", "l_commitdate": "1992-06-22", "l_receiptdate": "1992-04-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "e quickly. carefully silent" }
-{ "l_orderkey": 2690, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 45766.16, "l_discount": 0.05, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-30", "l_commitdate": "1996-05-19", "l_receiptdate": "1996-06-26", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "ly alongside of th" }
-{ "l_orderkey": 2692, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 2751.03, "l_discount": 0.1, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-02-25", "l_commitdate": "1998-01-29", "l_receiptdate": "1998-03-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "equests. bold, even foxes haggle slyl" }
-{ "l_orderkey": 2694, "l_partkey": 153, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31594.5, "l_discount": 0.02, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-06-20", "l_commitdate": "1996-06-01", "l_receiptdate": "1996-07-15", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "oxes. never iro" }
-{ "l_orderkey": 2759, "l_partkey": 59, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 10, "l_extendedprice": 9590.5, "l_discount": 0.1, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-12-14", "l_commitdate": "1994-01-08", "l_receiptdate": "1994-01-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "s. busily ironic theodo" }
-{ "l_orderkey": 2819, "l_partkey": 70, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 17, "l_extendedprice": 16491.19, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-07-16", "l_commitdate": "1994-07-15", "l_receiptdate": "1994-07-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "en deposits above the f" }
-{ "l_orderkey": 2850, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 42874.87, "l_discount": 0.02, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-11", "l_commitdate": "1996-11-03", "l_receiptdate": "1997-02-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "unusual accounts" }
-{ "l_orderkey": 2886, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 960.06, "l_discount": 0.09, "l_tax": 0.05, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-02-01", "l_commitdate": "1994-12-18", "l_receiptdate": "1995-02-28", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "eposits fr" }
-{ "l_orderkey": 2912, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 8176.96, "l_discount": 0.06, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-04-09", "l_commitdate": "1992-04-19", "l_receiptdate": "1992-04-26", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "hs cajole over the slyl" }
-{ "l_orderkey": 2944, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 44885.28, "l_discount": 0.08, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-25", "l_commitdate": "1997-10-28", "l_receiptdate": "1998-01-21", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "ickly special theodolit" }
-{ "l_orderkey": 2947, "l_partkey": 10, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 33670.37, "l_discount": 0.09, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-08-09", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-08-20", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "e accounts: expres" }
-{ "l_orderkey": 2950, "l_partkey": 130, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 32, "l_extendedprice": 32964.16, "l_discount": 0.01, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-09-21", "l_commitdate": "1997-08-25", "l_receiptdate": "1997-10-08", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "its wake carefully slyly final ideas." }
-{ "l_orderkey": 2978, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28712.61, "l_discount": 0.0, "l_tax": 0.08, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1995-06-03", "l_commitdate": "1995-07-25", "l_receiptdate": "1995-06-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "ecial ideas promise slyly" }
-{ "l_orderkey": 3143, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 21781.98, "l_discount": 0.02, "l_tax": 0.0, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-03-26", "l_receiptdate": "1993-05-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "l, special instructions nag " }
-{ "l_orderkey": 3264, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 39, "l_extendedprice": 42907.8, "l_discount": 0.06, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-11-07", "l_commitdate": "1996-12-12", "l_receiptdate": "1996-11-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "sleep carefully after the slyly final" }
-{ "l_orderkey": 3266, "l_partkey": 64, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 29885.86, "l_discount": 0.09, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-19", "l_commitdate": "1995-05-04", "l_receiptdate": "1995-07-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "grate among the quickly express deposits" }
-{ "l_orderkey": 3270, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 10285.33, "l_discount": 0.07, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-07-29", "l_commitdate": "1997-08-11", "l_receiptdate": "1997-08-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": " solve at the regular deposits. " }
-{ "l_orderkey": 3364, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 48514.41, "l_discount": 0.03, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-09-17", "l_commitdate": "1997-08-23", "l_receiptdate": "1997-10-06", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "d accounts? caref" }
-{ "l_orderkey": 3366, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3760.16, "l_discount": 0.07, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-20", "l_commitdate": "1997-06-25", "l_receiptdate": "1997-06-03", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": " carefully about " }
-{ "l_orderkey": 3425, "l_partkey": 120, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11221.32, "l_discount": 0.03, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-04-24", "l_commitdate": "1996-05-29", "l_receiptdate": "1996-05-23", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ckly final deposits use quickly?" }
-{ "l_orderkey": 3460, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 36440.4, "l_discount": 0.1, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-28", "l_commitdate": "1995-12-14", "l_receiptdate": "1996-01-02", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "odolites are slyly bold deposits" }
-{ "l_orderkey": 3494, "l_partkey": 117, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 40684.4, "l_discount": 0.05, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-07-10", "l_commitdate": "1993-06-01", "l_receiptdate": "1993-07-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "lites haggle furiously about the fin" }
-{ "l_orderkey": 3520, "l_partkey": 28, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 27840.6, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-11", "l_commitdate": "1997-10-02", "l_receiptdate": "1997-12-06", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "deas should solve blithely among the ironi" }
-{ "l_orderkey": 3559, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 28712.61, "l_discount": 0.0, "l_tax": 0.07, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-12-10", "l_commitdate": "1992-12-03", "l_receiptdate": "1992-12-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "l, regular accounts wake flu" }
-{ "l_orderkey": 3585, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 21, "l_extendedprice": 21464.52, "l_discount": 0.05, "l_tax": 0.04, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-04", "l_commitdate": "1994-12-25", "l_receiptdate": "1995-01-01", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ounts use. express, final platelets us" }
-{ "l_orderkey": 3618, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 39525.32, "l_discount": 0.08, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-22", "l_commitdate": "1998-02-23", "l_receiptdate": "1998-01-03", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "nts haggle fluffily above the regular " }
-{ "l_orderkey": 3715, "l_partkey": 97, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 13, "l_extendedprice": 12962.17, "l_discount": 0.0, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-11", "l_commitdate": "1996-04-25", "l_receiptdate": "1996-06-09", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "e quickly ironic" }
-{ "l_orderkey": 3844, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2070.26, "l_discount": 0.03, "l_tax": 0.07, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-02-24", "l_commitdate": "1995-02-03", "l_receiptdate": "1995-03-18", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "es haggle final acco" }
-{ "l_orderkey": 3878, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 6601.2, "l_discount": 0.07, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-21", "l_commitdate": "1997-05-22", "l_receiptdate": "1997-07-01", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "s. regular instru" }
-{ "l_orderkey": 3906, "l_partkey": 153, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 44232.3, "l_discount": 0.0, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-09-03", "l_commitdate": "1992-07-22", "l_receiptdate": "1992-09-04", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "jole blithely after the furiously regular " }
-{ "l_orderkey": 3974, "l_partkey": 22, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 43334.94, "l_discount": 0.1, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-06-03", "l_commitdate": "1996-05-08", "l_receiptdate": "1996-06-28", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "dencies above the re" }
-{ "l_orderkey": 4001, "l_partkey": 106, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 26, "l_extendedprice": 26158.6, "l_discount": 0.0, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-07-26", "l_commitdate": "1997-06-18", "l_receiptdate": "1997-08-08", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "RAIL", "l_comment": "tegrate blithely" }
-{ "l_orderkey": 4005, "l_partkey": 4, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 26, "l_extendedprice": 23504.0, "l_discount": 0.09, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-12-01", "l_commitdate": "1997-02-03", "l_receiptdate": "1996-12-15", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": " to the quic" }
-{ "l_orderkey": 4033, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 27272.97, "l_discount": 0.01, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-08-08", "l_commitdate": "1993-08-14", "l_receiptdate": "1993-08-09", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "pinto beans" }
-{ "l_orderkey": 4034, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 48, "l_extendedprice": 52329.12, "l_discount": 0.03, "l_tax": 0.03, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-03-01", "l_commitdate": "1994-01-16", "l_receiptdate": "1994-03-16", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": " blithely regular requests play carefull" }
-{ "l_orderkey": 4036, "l_partkey": 6, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 41676.0, "l_discount": 0.09, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-06-21", "l_commitdate": "1997-05-29", "l_receiptdate": "1997-07-18", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "usly across the even th" }
-{ "l_orderkey": 4064, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 3297.57, "l_discount": 0.1, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-04", "l_commitdate": "1997-01-01", "l_receiptdate": "1997-01-23", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "its! quickly sp" }
-{ "l_orderkey": 4067, "l_partkey": 180, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 18, "l_extendedprice": 19443.24, "l_discount": 0.03, "l_tax": 0.08, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-01-24", "l_commitdate": "1992-12-23", "l_receiptdate": "1993-02-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": "e the slyly final packages d" }
-{ "l_orderkey": 4068, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 43434.73, "l_discount": 0.05, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-11-28", "l_commitdate": "1996-11-16", "l_receiptdate": "1996-12-22", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ructions. regular, special packag" }
-{ "l_orderkey": 4098, "l_partkey": 200, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 50609.2, "l_discount": 0.07, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-26", "l_commitdate": "1997-01-27", "l_receiptdate": "1997-02-13", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "e slyly blithely silent deposits. fluff" }
-{ "l_orderkey": 4192, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 36, "l_extendedprice": 32796.36, "l_discount": 0.06, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-04-25", "l_commitdate": "1998-05-26", "l_receiptdate": "1998-05-03", "l_shipinstruct": "COLLECT COD", "l_shipmode": "TRUCK", "l_comment": "eodolites sleep" }
-{ "l_orderkey": 4194, "l_partkey": 197, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 47179.17, "l_discount": 0.08, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-11-06", "l_commitdate": "1994-12-09", "l_receiptdate": "1994-11-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "olites are after the exp" }
-{ "l_orderkey": 4261, "l_partkey": 110, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 12121.32, "l_discount": 0.05, "l_tax": 0.01, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-11-01", "l_commitdate": "1993-01-01", "l_receiptdate": "1992-11-12", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "into beans " }
-{ "l_orderkey": 4418, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 32, "l_extendedprice": 29920.96, "l_discount": 0.02, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-05-28", "l_commitdate": "1993-06-02", "l_receiptdate": "1993-05-30", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ly. bold pinto b" }
-{ "l_orderkey": 4422, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 5175.65, "l_discount": 0.09, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-17", "l_commitdate": "1995-08-13", "l_receiptdate": "1995-07-25", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "e furiously about t" }
-{ "l_orderkey": 4486, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 46, "l_extendedprice": 47615.98, "l_discount": 0.08, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-05-02", "l_commitdate": "1998-04-05", "l_receiptdate": "1998-05-08", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "ackages. specia" }
-{ "l_orderkey": 4512, "l_partkey": 162, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31864.8, "l_discount": 0.07, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-28", "l_commitdate": "1995-12-22", "l_receiptdate": "1996-02-22", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ly unusual package" }
-{ "l_orderkey": 4513, "l_partkey": 170, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 31034.93, "l_discount": 0.03, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-18", "l_commitdate": "1996-05-23", "l_receiptdate": "1996-06-08", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "cajole. regular packages boost. s" }
-{ "l_orderkey": 4545, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 40780.46, "l_discount": 0.06, "l_tax": 0.06, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-01-27", "l_commitdate": "1993-03-01", "l_receiptdate": "1993-02-04", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "nts serve according to th" }
-{ "l_orderkey": 4549, "l_partkey": 159, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 46602.6, "l_discount": 0.08, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-03-13", "l_commitdate": "1998-04-15", "l_receiptdate": "1998-03-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "ding to the regular, silent requests" }
-{ "l_orderkey": 4551, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 5466.06, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-18", "l_commitdate": "1996-04-23", "l_receiptdate": "1996-06-13", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "fily silent fo" }
-{ "l_orderkey": 4576, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 5, "l_extendedprice": 4950.45, "l_discount": 0.09, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-08-23", "l_commitdate": "1996-11-08", "l_receiptdate": "1996-09-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "ly express, special asymptote" }
-{ "l_orderkey": 4608, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 32195.1, "l_discount": 0.08, "l_tax": 0.05, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-08", "l_commitdate": "1994-07-18", "l_receiptdate": "1994-10-25", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "s cajole. slyly " }
-{ "l_orderkey": 4641, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 49058.55, "l_discount": 0.07, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-04-19", "l_receiptdate": "1993-05-21", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": " about the close " }
-{ "l_orderkey": 4679, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 7631.33, "l_discount": 0.1, "l_tax": 0.05, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-11", "l_commitdate": "1993-04-11", "l_receiptdate": "1993-05-16", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "kages. bold, regular packa" }
-{ "l_orderkey": 4769, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 14960.48, "l_discount": 0.08, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-07-16", "l_commitdate": "1995-07-05", "l_receiptdate": "1995-07-22", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": " deposits. slyly even asymptote" }
-{ "l_orderkey": 4802, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 6, "l_extendedprice": 5640.24, "l_discount": 0.0, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-16", "l_commitdate": "1997-03-25", "l_receiptdate": "1997-04-21", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "unusual accounts wake blithely. b" }
-{ "l_orderkey": 4804, "l_partkey": 128, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 45237.28, "l_discount": 0.06, "l_tax": 0.08, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-05-02", "l_commitdate": "1992-03-24", "l_receiptdate": "1992-05-28", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "AIR", "l_comment": "aggle quickly among the slyly fi" }
-{ "l_orderkey": 4805, "l_partkey": 150, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 7, "l_extendedprice": 7351.05, "l_discount": 0.09, "l_tax": 0.03, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-05-01", "l_commitdate": "1992-07-09", "l_receiptdate": "1992-05-09", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": " requests. regular deposit" }
-{ "l_orderkey": 4807, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 9, "l_extendedprice": 9199.08, "l_discount": 0.04, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-04-23", "l_commitdate": "1997-03-01", "l_receiptdate": "1997-05-15", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "may are blithely. carefully even pinto b" }
-{ "l_orderkey": 4836, "l_partkey": 162, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 22, "l_extendedprice": 23367.52, "l_discount": 0.01, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-03", "l_commitdate": "1997-02-23", "l_receiptdate": "1997-03-04", "l_shipinstruct": "NONE", "l_shipmode": "SHIP", "l_comment": "al pinto beans. care" }
-{ "l_orderkey": 4837, "l_partkey": 42, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 15072.64, "l_discount": 0.09, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-08-12", "l_commitdate": "1998-06-06", "l_receiptdate": "1998-08-26", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "ing requests are blithely regular instructi" }
-{ "l_orderkey": 4898, "l_partkey": 72, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 42771.08, "l_discount": 0.07, "l_tax": 0.02, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-09-13", "l_commitdate": "1994-08-18", "l_receiptdate": "1994-09-16", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "y regular grouches about" }
-{ "l_orderkey": 4928, "l_partkey": 100, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4000.4, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-10-25", "l_commitdate": "1993-12-24", "l_receiptdate": "1993-11-16", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "bout the slyly final accounts. carefull" }
-{ "l_orderkey": 4929, "l_partkey": 14, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 20, "l_extendedprice": 18280.2, "l_discount": 0.0, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-12", "l_commitdate": "1996-05-23", "l_receiptdate": "1996-03-20", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": " final pinto beans detect. final," }
-{ "l_orderkey": 4967, "l_partkey": 71, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 48553.5, "l_discount": 0.07, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-05-27", "l_commitdate": "1997-05-13", "l_receiptdate": "1997-06-12", "l_shipinstruct": "NONE", "l_shipmode": "REG AIR", "l_comment": "kages. final, unusual accounts c" }
-{ "l_orderkey": 4996, "l_partkey": 56, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 35, "l_extendedprice": 33461.75, "l_discount": 0.07, "l_tax": 0.01, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-10-30", "l_commitdate": "1992-10-27", "l_receiptdate": "1992-11-05", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "s. unusual, regular dolphins integrate care" }
-{ "l_orderkey": 5028, "l_partkey": 14, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 13710.15, "l_discount": 0.07, "l_tax": 0.07, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-07-17", "l_commitdate": "1992-07-16", "l_receiptdate": "1992-08-05", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "es are quickly final pains. furiously pend" }
-{ "l_orderkey": 5031, "l_partkey": 50, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 14250.75, "l_discount": 0.02, "l_tax": 0.05, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1995-04-01", "l_commitdate": "1995-02-24", "l_receiptdate": "1995-04-12", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "yly pending theodolites." }
-{ "l_orderkey": 5092, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 31924.8, "l_discount": 0.06, "l_tax": 0.0, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-27", "l_commitdate": "1995-12-08", "l_receiptdate": "1996-01-09", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ss, ironic deposits. furiously stea" }
-{ "l_orderkey": 5153, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 42, "l_extendedprice": 39271.26, "l_discount": 0.03, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-10-03", "l_commitdate": "1995-11-09", "l_receiptdate": "1995-10-11", "l_shipinstruct": "COLLECT COD", "l_shipmode": "RAIL", "l_comment": "re thinly. ironic" }
-{ "l_orderkey": 5154, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 11, "l_extendedprice": 11992.09, "l_discount": 0.02, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-06", "l_commitdate": "1997-06-30", "l_receiptdate": "1997-09-04", "l_shipinstruct": "NONE", "l_shipmode": "RAIL", "l_comment": "luffily bold foxes. final" }
-{ "l_orderkey": 5185, "l_partkey": 197, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 40596.03, "l_discount": 0.0, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-08", "l_commitdate": "1997-09-08", "l_receiptdate": "1997-08-14", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": "gainst the courts dazzle care" }
-{ "l_orderkey": 5187, "l_partkey": 11, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 44639.49, "l_discount": 0.04, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-10-20", "l_commitdate": "1997-10-12", "l_receiptdate": "1997-10-26", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "l, regular platelets instead of the foxes w" }
-{ "l_orderkey": 5190, "l_partkey": 56, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 43, "l_extendedprice": 41110.15, "l_discount": 0.09, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-08-19", "l_commitdate": "1992-06-10", "l_receiptdate": "1992-09-01", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "encies use fluffily unusual requests? hoc" }
-{ "l_orderkey": 5217, "l_partkey": 80, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 50, "l_extendedprice": 49004.0, "l_discount": 0.05, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-12-26", "l_commitdate": "1995-11-21", "l_receiptdate": "1996-01-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "s. express, express accounts c" }
-{ "l_orderkey": 5281, "l_partkey": 114, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 37522.07, "l_discount": 0.05, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-11-10", "l_commitdate": "1996-01-31", "l_receiptdate": "1995-11-22", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "ronic dependencies. fluffily final p" }
-{ "l_orderkey": 5284, "l_partkey": 173, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 16, "l_extendedprice": 17170.72, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-08-17", "l_commitdate": "1995-08-23", "l_receiptdate": "1995-08-26", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "unts detect furiously even d" }
-{ "l_orderkey": 5286, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 1099.19, "l_discount": 0.01, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-25", "l_commitdate": "1997-11-07", "l_receiptdate": "1997-12-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "REG AIR", "l_comment": "ly! furiously final pack" }
-{ "l_orderkey": 5313, "l_partkey": 17, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 34, "l_extendedprice": 31178.34, "l_discount": 0.1, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-08-07", "l_commitdate": "1997-08-12", "l_receiptdate": "1997-08-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "FOB", "l_comment": "ccording to the blithely final account" }
-{ "l_orderkey": 5315, "l_partkey": 35, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 11220.36, "l_discount": 0.08, "l_tax": 0.06, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-12-18", "l_commitdate": "1993-01-16", "l_receiptdate": "1993-01-10", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ccounts. furiously ironi" }
-{ "l_orderkey": 5316, "l_partkey": 108, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 29, "l_extendedprice": 29234.9, "l_discount": 0.1, "l_tax": 0.05, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-03-28", "l_commitdate": "1994-04-29", "l_receiptdate": "1994-04-09", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "ckly unusual foxes bo" }
-{ "l_orderkey": 5379, "l_partkey": 199, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 40, "l_extendedprice": 43967.6, "l_discount": 0.01, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-10-01", "l_commitdate": "1995-10-19", "l_receiptdate": "1995-10-30", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "carefully final accounts haggle blithely. " }
-{ "l_orderkey": 5441, "l_partkey": 164, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 3, "l_extendedprice": 3192.48, "l_discount": 0.0, "l_tax": 0.02, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-08-12", "l_commitdate": "1994-10-14", "l_receiptdate": "1994-09-01", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "are. unusual, " }
-{ "l_orderkey": 5445, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 33, "l_extendedprice": 32672.97, "l_discount": 0.08, "l_tax": 0.07, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-10-21", "l_commitdate": "1993-10-14", "l_receiptdate": "1993-10-28", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "ests. final instructions" }
-{ "l_orderkey": 5446, "l_partkey": 190, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 29435.13, "l_discount": 0.05, "l_tax": 0.07, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-07-21", "l_commitdate": "1994-08-25", "l_receiptdate": "1994-08-17", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ously across the quic" }
-{ "l_orderkey": 5447, "l_partkey": 99, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 31, "l_extendedprice": 30971.79, "l_discount": 0.09, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-07-14", "l_commitdate": "1996-05-07", "l_receiptdate": "1996-07-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "SHIP", "l_comment": " foxes sleep. blithely unusual accounts det" }
-{ "l_orderkey": 5476, "l_partkey": 48, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 13, "l_extendedprice": 12324.52, "l_discount": 0.01, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-12-27", "l_commitdate": "1997-12-08", "l_receiptdate": "1997-12-29", "l_shipinstruct": "COLLECT COD", "l_shipmode": "TRUCK", "l_comment": "iously special ac" }
-{ "l_orderkey": 5506, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 2, "l_extendedprice": 2080.28, "l_discount": 0.0, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-02-04", "l_commitdate": "1994-01-13", "l_receiptdate": "1994-02-17", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "onic theodolites are fluffil" }
-{ "l_orderkey": 5536, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 13861.26, "l_discount": 0.08, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-05-18", "l_commitdate": "1998-05-08", "l_receiptdate": "1998-06-05", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "instructions sleep " }
-{ "l_orderkey": 5572, "l_partkey": 22, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 24, "l_extendedprice": 22128.48, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-30", "l_commitdate": "1994-10-02", "l_receiptdate": "1994-11-27", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "ests cajole. evenly ironic exc" }
-{ "l_orderkey": 5664, "l_partkey": 122, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 25, "l_extendedprice": 25553.0, "l_discount": 0.0, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-10-29", "l_commitdate": "1998-09-23", "l_receiptdate": "1998-11-25", "l_shipinstruct": "COLLECT COD", "l_shipmode": "FOB", "l_comment": "eposits: furiously ironic grouch" }
-{ "l_orderkey": 5670, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 27, "l_extendedprice": 26732.43, "l_discount": 0.1, "l_tax": 0.06, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-05-09", "l_commitdate": "1993-05-30", "l_receiptdate": "1993-06-06", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": " ideas promise bli" }
-{ "l_orderkey": 5728, "l_partkey": 44, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 47, "l_extendedprice": 44369.88, "l_discount": 0.1, "l_tax": 0.05, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-13", "l_commitdate": "1995-01-25", "l_receiptdate": "1994-12-25", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "nd the bravely final deposits. final ideas" }
-{ "l_orderkey": 5735, "l_partkey": 60, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 39362.46, "l_discount": 0.01, "l_tax": 0.01, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-12-23", "l_commitdate": "1995-02-10", "l_receiptdate": "1995-01-22", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "lthily ruthless i" }
-{ "l_orderkey": 5826, "l_partkey": 144, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 4176.56, "l_discount": 0.03, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1998-07-31", "l_commitdate": "1998-09-10", "l_receiptdate": "1998-08-27", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": " packages across the fluffily spec" }
-{ "l_orderkey": 5829, "l_partkey": 40, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 4, "l_extendedprice": 3760.16, "l_discount": 0.01, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-03-01", "l_commitdate": "1997-02-17", "l_receiptdate": "1997-03-22", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "ithely; accounts cajole ideas. regular foxe" }
-{ "l_orderkey": 5856, "l_partkey": 4, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 1, "l_extendedprice": 904.0, "l_discount": 0.03, "l_tax": 0.02, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-12-29", "l_commitdate": "1995-01-07", "l_receiptdate": "1995-01-10", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "tly. special deposits wake blithely even" }
-{ "l_orderkey": 5926, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 8, "l_extendedprice": 7920.72, "l_discount": 0.02, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-07-17", "l_commitdate": "1994-07-20", "l_receiptdate": "1994-08-11", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": "gle furiously express foxes. bo" }
-{ "l_orderkey": 5927, "l_partkey": 90, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 44, "l_extendedprice": 43563.96, "l_discount": 0.04, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-11-29", "l_commitdate": "1997-11-21", "l_receiptdate": "1997-12-13", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "rding to the special, final decoy" }
-{ "l_orderkey": 5955, "l_partkey": 140, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 14, "l_extendedprice": 14561.96, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1995-06-22", "l_commitdate": "1995-05-23", "l_receiptdate": "1995-06-24", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": " unusual, bold theodolit" }
-{ "l_orderkey": 5959, "l_partkey": 135, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 49, "l_extendedprice": 50721.37, "l_discount": 0.07, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1992-07-16", "l_commitdate": "1992-08-09", "l_receiptdate": "1992-08-14", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "usual packages haggle slyly pi" }
-{ "l_orderkey": 5988, "l_partkey": 172, "l_suppkey": 1, "l_linenumber": 1, "l_quantity": 41, "l_extendedprice": 43958.97, "l_discount": 0.08, "l_tax": 0.03, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-01-20", "l_commitdate": "1994-02-06", "l_receiptdate": "1994-02-10", "l_shipinstruct": "COLLECT COD", "l_shipmode": "AIR", "l_comment": "the pending, express reque" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.adm
deleted file mode 100644
index 0c2fa2d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.adm
+++ /dev/null
@@ -1,25 +0,0 @@
-{ "l_orderkey": 1, "l_partkey": 156, "l_suppkey": 4, "l_linenumber": 1, "l_quantity": 17, "l_extendedprice": 17954.55, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-13", "l_commitdate": "1996-02-12", "l_receiptdate": "1996-03-22", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "egular courts above the" }
-{ "l_orderkey": 1, "l_partkey": 68, "l_suppkey": 9, "l_linenumber": 2, "l_quantity": 36, "l_extendedprice": 34850.16, "l_discount": 0.09, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-04-12", "l_commitdate": "1996-02-28", "l_receiptdate": "1996-04-20", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "MAIL", "l_comment": "ly final dependencies: slyly bold " }
-{ "l_orderkey": 1, "l_partkey": 64, "l_suppkey": 5, "l_linenumber": 3, "l_quantity": 8, "l_extendedprice": 7712.48, "l_discount": 0.1, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-29", "l_commitdate": "1996-03-05", "l_receiptdate": "1996-01-31", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "REG AIR", "l_comment": "riously. regular, express dep" }
-{ "l_orderkey": 1, "l_partkey": 3, "l_suppkey": 6, "l_linenumber": 4, "l_quantity": 28, "l_extendedprice": 25284.0, "l_discount": 0.09, "l_tax": 0.06, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-04-21", "l_commitdate": "1996-03-30", "l_receiptdate": "1996-05-16", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "lites. fluffily even de" }
-{ "l_orderkey": 1, "l_partkey": 25, "l_suppkey": 8, "l_linenumber": 5, "l_quantity": 24, "l_extendedprice": 22200.48, "l_discount": 0.1, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-30", "l_commitdate": "1996-03-14", "l_receiptdate": "1996-04-01", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": " pending foxes. slyly re" }
-{ "l_orderkey": 1, "l_partkey": 16, "l_suppkey": 3, "l_linenumber": 6, "l_quantity": 32, "l_extendedprice": 29312.32, "l_discount": 0.07, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-30", "l_commitdate": "1996-02-07", "l_receiptdate": "1996-02-03", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "MAIL", "l_comment": "arefully slyly ex" }
-{ "l_orderkey": 2, "l_partkey": 107, "l_suppkey": 2, "l_linenumber": 1, "l_quantity": 38, "l_extendedprice": 38269.8, "l_discount": 0.0, "l_tax": 0.05, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1997-01-28", "l_commitdate": "1997-01-14", "l_receiptdate": "1997-02-02", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ven requests. deposits breach a" }
-{ "l_orderkey": 3, "l_partkey": 5, "l_suppkey": 2, "l_linenumber": 1, "l_quantity": 45, "l_extendedprice": 40725.0, "l_discount": 0.06, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-02-02", "l_commitdate": "1994-01-04", "l_receiptdate": "1994-02-23", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ongside of the furiously brave acco" }
-{ "l_orderkey": 3, "l_partkey": 20, "l_suppkey": 10, "l_linenumber": 2, "l_quantity": 49, "l_extendedprice": 45080.98, "l_discount": 0.1, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-11-09", "l_commitdate": "1993-12-20", "l_receiptdate": "1993-11-24", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": " unusual accounts. eve" }
-{ "l_orderkey": 3, "l_partkey": 129, "l_suppkey": 8, "l_linenumber": 3, "l_quantity": 27, "l_extendedprice": 27786.24, "l_discount": 0.06, "l_tax": 0.07, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-01-16", "l_commitdate": "1993-11-22", "l_receiptdate": "1994-01-23", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "SHIP", "l_comment": "nal foxes wake. " }
-{ "l_orderkey": 3, "l_partkey": 30, "l_suppkey": 5, "l_linenumber": 4, "l_quantity": 2, "l_extendedprice": 1860.06, "l_discount": 0.01, "l_tax": 0.06, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-12-04", "l_commitdate": "1994-01-07", "l_receiptdate": "1994-01-01", "l_shipinstruct": "NONE", "l_shipmode": "TRUCK", "l_comment": "y. fluffily pending d" }
-{ "l_orderkey": 3, "l_partkey": 184, "l_suppkey": 5, "l_linenumber": 5, "l_quantity": 28, "l_extendedprice": 30357.04, "l_discount": 0.04, "l_tax": 0.0, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1993-12-14", "l_commitdate": "1994-01-10", "l_receiptdate": "1994-01-01", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": "ages nag slyly pending" }
-{ "l_orderkey": 3, "l_partkey": 63, "l_suppkey": 8, "l_linenumber": 6, "l_quantity": 26, "l_extendedprice": 25039.56, "l_discount": 0.1, "l_tax": 0.02, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1993-10-29", "l_commitdate": "1993-12-18", "l_receiptdate": "1993-11-04", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "RAIL", "l_comment": "ges sleep after the caref" }
-{ "l_orderkey": 4, "l_partkey": 89, "l_suppkey": 10, "l_linenumber": 1, "l_quantity": 30, "l_extendedprice": 29672.4, "l_discount": 0.03, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-10", "l_commitdate": "1995-12-14", "l_receiptdate": "1996-01-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "REG AIR", "l_comment": "- quickly regular packages sleep. idly" }
-{ "l_orderkey": 5, "l_partkey": 109, "l_suppkey": 10, "l_linenumber": 1, "l_quantity": 15, "l_extendedprice": 15136.5, "l_discount": 0.02, "l_tax": 0.04, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-31", "l_commitdate": "1994-08-31", "l_receiptdate": "1994-11-20", "l_shipinstruct": "NONE", "l_shipmode": "AIR", "l_comment": "ts wake furiously " }
-{ "l_orderkey": 5, "l_partkey": 124, "l_suppkey": 5, "l_linenumber": 2, "l_quantity": 26, "l_extendedprice": 26627.12, "l_discount": 0.07, "l_tax": 0.08, "l_returnflag": "R", "l_linestatus": "F", "l_shipdate": "1994-10-16", "l_commitdate": "1994-09-25", "l_receiptdate": "1994-10-19", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "sts use slyly quickly special instruc" }
-{ "l_orderkey": 5, "l_partkey": 38, "l_suppkey": 4, "l_linenumber": 3, "l_quantity": 50, "l_extendedprice": 46901.5, "l_discount": 0.08, "l_tax": 0.03, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1994-08-08", "l_commitdate": "1994-10-13", "l_receiptdate": "1994-08-26", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "AIR", "l_comment": "eodolites. fluffily unusual" }
-{ "l_orderkey": 6, "l_partkey": 140, "l_suppkey": 6, "l_linenumber": 1, "l_quantity": 37, "l_extendedprice": 38485.18, "l_discount": 0.08, "l_tax": 0.03, "l_returnflag": "A", "l_linestatus": "F", "l_shipdate": "1992-04-27", "l_commitdate": "1992-05-15", "l_receiptdate": "1992-05-02", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "TRUCK", "l_comment": "p furiously special foxes" }
-{ "l_orderkey": 7, "l_partkey": 183, "l_suppkey": 4, "l_linenumber": 1, "l_quantity": 12, "l_extendedprice": 12998.16, "l_discount": 0.07, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-05-07", "l_commitdate": "1996-03-13", "l_receiptdate": "1996-06-03", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": "ss pinto beans wake against th" }
-{ "l_orderkey": 7, "l_partkey": 146, "l_suppkey": 3, "l_linenumber": 2, "l_quantity": 9, "l_extendedprice": 9415.26, "l_discount": 0.08, "l_tax": 0.08, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-01", "l_commitdate": "1996-03-02", "l_receiptdate": "1996-02-19", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "SHIP", "l_comment": "es. instructions" }
-{ "l_orderkey": 7, "l_partkey": 95, "l_suppkey": 8, "l_linenumber": 3, "l_quantity": 46, "l_extendedprice": 45774.14, "l_discount": 0.1, "l_tax": 0.07, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-15", "l_commitdate": "1996-03-27", "l_receiptdate": "1996-02-03", "l_shipinstruct": "COLLECT COD", "l_shipmode": "MAIL", "l_comment": " unusual reques" }
-{ "l_orderkey": 7, "l_partkey": 164, "l_suppkey": 5, "l_linenumber": 4, "l_quantity": 28, "l_extendedprice": 29796.48, "l_discount": 0.03, "l_tax": 0.04, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-21", "l_commitdate": "1996-04-08", "l_receiptdate": "1996-04-20", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": ". slyly special requests haggl" }
-{ "l_orderkey": 7, "l_partkey": 152, "l_suppkey": 4, "l_linenumber": 5, "l_quantity": 38, "l_extendedprice": 39981.7, "l_discount": 0.08, "l_tax": 0.01, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-11", "l_commitdate": "1996-02-24", "l_receiptdate": "1996-02-18", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "ns haggle carefully ironic deposits. bl" }
-{ "l_orderkey": 7, "l_partkey": 80, "l_suppkey": 10, "l_linenumber": 6, "l_quantity": 35, "l_extendedprice": 34302.8, "l_discount": 0.06, "l_tax": 0.03, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-01-16", "l_commitdate": "1996-02-23", "l_receiptdate": "1996-01-22", "l_shipinstruct": "TAKE BACK RETURN", "l_shipmode": "FOB", "l_comment": "jole. excuses wake carefully alongside of " }
-{ "l_orderkey": 7, "l_partkey": 158, "l_suppkey": 3, "l_linenumber": 7, "l_quantity": 5, "l_extendedprice": 5290.75, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-02-10", "l_commitdate": "1996-03-26", "l_receiptdate": "1996-02-13", "l_shipinstruct": "NONE", "l_shipmode": "FOB", "l_comment": "ithely regula" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-index/drop-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-index/drop-index.1.adm
deleted file mode 100644
index f3c688b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-index/drop-index.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "unique1": 84, "unique2": 10, "two": 0, "four": 0, "ten": 4, "twenty": 4, "onePercent": 84, "tenPercent": 4, "twentyPercent": 4, "fiftyPercent": 0, "unique3": 84, "evenOnePercent": 168, "oddOnePercent": 169, "stringu1": "DGAAAAXXXXXXXXXXXXXXXXXXX", "stringu2": "KAAAAAXXXXXXXXXXXXXXXXXXX", "string4": "OOOOXXXXXXXXXXXXXXXXXXXXXX" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/empty-load-with-index/empty-load-with-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/empty-load-with-index/empty-load-with-index.1.adm
deleted file mode 100644
index 8344a9f..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/empty-load-with-index/empty-load-with-index.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "l_orderkey": 1, "l_partkey": 156, "l_suppkey": 4, "l_linenumber": 1, "l_quantity": 17.0, "l_extendedprice": 17954.55, "l_discount": 0.04, "l_tax": 0.02, "l_returnflag": "N", "l_linestatus": "O", "l_shipdate": "1996-03-13", "l_commitdate": "1996-02-12", "l_receiptdate": "1996-03-22", "l_shipinstruct": "DELIVER IN PERSON", "l_shipmode": "TRUCK", "l_comment": "egular courts above the" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.adm
deleted file mode 100644
index 0eea6ff..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.adm
+++ /dev/null
@@ -1,240 +0,0 @@
-{ "id": 101, "fname": "Javier", "lname": "Makuch", "age": 28, "dept": "IT" }
-{ "id": 110, "fname": "Allan", "lname": "Piland", "age": 29, "dept": "HR" }
-{ "id": 112, "fname": "Pearlie", "lname": "Aumann", "age": 31, "dept": "Payroll" }
-{ "id": 113, "fname": "Chandra", "lname": "Hase", "age": 34, "dept": "Sales" }
-{ "id": 114, "fname": "Christian", "lname": "Convery", "age": 28, "dept": "HR" }
-{ "id": 115, "fname": "Panther", "lname": "Ritch", "age": 26, "dept": "IT" }
-{ "id": 116, "fname": "Ted", "lname": "Elsea", "age": 26, "dept": "IT" }
-{ "id": 117, "fname": "Tabatha", "lname": "Bladen", "age": 25, "dept": "HR" }
-{ "id": 118, "fname": "Clayton", "lname": "Oltman", "age": 42, "dept": "Sales" }
-{ "id": 119, "fname": "Sharron", "lname": "Darwin", "age": 32, "dept": "Payroll" }
-{ "id": 210, "fname": "Clayton", "lname": "Durgin", "age": 52, "dept": "HR" }
-{ "id": 212, "fname": "Emilia", "lname": "Chenail", "age": 26, "dept": "Sales" }
-{ "id": 213, "fname": "Kenya", "lname": "Almquist", "age": 43, "dept": "Payroll" }
-{ "id": 214, "fname": "Alejandra", "lname": "Lacefield", "age": 41, "dept": "HR" }
-{ "id": 215, "fname": "Karina", "lname": "Michelsen", "age": 46, "dept": "IT" }
-{ "id": 216, "fname": "Katy", "lname": "Delillo", "age": 36, "dept": "IT" }
-{ "id": 217, "fname": "Benita", "lname": "Kleist", "age": 37, "dept": "HR" }
-{ "id": 218, "fname": "Earlene", "lname": "Paluch", "age": 31, "dept": "IT" }
-{ "id": 219, "fname": "Kurt", "lname": "Petermann", "age": 27, "dept": "Payroll" }
-{ "id": 299, "fname": "Julio", "lname": "Iorio", "age": 37, "dept": "IT" }
-{ "id": 363, "fname": "Cody", "lname": "Rodreguez", "age": 26, "dept": "IT" }
-{ "id": 404, "fname": "Emilia", "lname": "Square", "age": 32, "dept": "IT" }
-{ "id": 414, "fname": "Mathew", "lname": "Fuschetto", "age": 34, "dept": "HR" }
-{ "id": 424, "fname": "Allyson", "lname": "Remus", "age": 32, "dept": "IT" }
-{ "id": 434, "fname": "Earlene", "lname": "Linebarger", "age": 26, "dept": "Payroll" }
-{ "id": 444, "fname": "Clinton", "lname": "Sick", "age": 29, "dept": "IT" }
-{ "id": 454, "fname": "Ted", "lname": "Caba", "age": 28, "dept": "HR" }
-{ "id": 463, "fname": "Marcie", "lname": "States", "age": 28, "dept": "IT" }
-{ "id": 464, "fname": "Fernando", "lname": "Engelke", "age": 39, "dept": "IT" }
-{ "id": 474, "fname": "Mathew", "lname": "Courchesne", "age": 31, "dept": "IT" }
-{ "id": 484, "fname": "Cody", "lname": "Vinyard", "age": 36, "dept": "Payroll" }
-{ "id": 494, "fname": "Benita", "lname": "Fravel", "age": 33, "dept": "Sales" }
-{ "id": 504, "fname": "Erik", "lname": "Dobek", "age": 29, "dept": "IT" }
-{ "id": 514, "fname": "Julio", "lname": "Ruben", "age": 41, "dept": "IT" }
-{ "id": 524, "fname": "Benita", "lname": "Maltos", "age": 33, "dept": "IT" }
-{ "id": 534, "fname": "Kurt", "lname": "Biscoe", "age": 36, "dept": "HR" }
-{ "id": 538, "fname": "Milagros", "lname": "Forkey", "age": 34, "dept": "Sales" }
-{ "id": 544, "fname": "Loraine", "lname": "Housel", "age": 30, "dept": "Sales" }
-{ "id": 554, "fname": "Jamie", "lname": "Rachal", "age": 30, "dept": "IT" }
-{ "id": 564, "fname": "Liza", "lname": "Fredenburg", "age": 37, "dept": "IT" }
-{ "id": 574, "fname": "Ericka", "lname": "Feldmann", "age": 29, "dept": "Sales" }
-{ "id": 584, "fname": "Dollie", "lname": "Dattilo", "age": 32, "dept": "Payroll" }
-{ "id": 589, "fname": "Lorrie", "lname": "Sharon", "age": 27, "dept": "IT" }
-{ "id": 594, "fname": "Roxie", "lname": "Houghtaling", "age": 40, "dept": "Payroll" }
-{ "id": 601, "fname": "Neil", "lname": "Deforge", "age": 26, "dept": "HR" }
-{ "id": 611, "fname": "Earlene", "lname": "Marcy", "age": 32, "dept": "IT" }
-{ "id": 621, "fname": "Erik", "lname": "Lechuga", "age": 42, "dept": "Payroll" }
-{ "id": 631, "fname": "Tyrone", "lname": "Holtzclaw", "age": 34, "dept": "Sales" }
-{ "id": 641, "fname": "Lance", "lname": "Hankey", "age": 35, "dept": "Sales" }
-{ "id": 651, "fname": "Mallory", "lname": "Gladding", "age": 31, "dept": "HR" }
-{ "id": 661, "fname": "Tia", "lname": "Braaten", "age": 40, "dept": "IT" }
-{ "id": 671, "fname": "Julio", "lname": "Vanpatten", "age": 30, "dept": "Payroll" }
-{ "id": 681, "fname": "Max", "lname": "Teachout", "age": 34, "dept": "IT" }
-{ "id": 691, "fname": "Karina", "lname": "Wingerter", "age": 31, "dept": "IT" }
-{ "id": 711, "fname": "Hugh", "lname": "Lema", "age": 25, "dept": "HR" }
-{ "id": 721, "fname": "Schwan", "lname": "Phil", "age": 34, "dept": "Payroll" }
-{ "id": 732, "fname": "Noemi", "lname": "Eacret", "age": 56, "dept": "HR" }
-{ "id": 741, "fname": "Julio", "lname": "Mattocks", "age": 38, "dept": "Sales" }
-{ "id": 751, "fname": "Lance", "lname": "Kottke", "age": 34, "dept": "IT" }
-{ "id": 761, "fname": "Kurt", "lname": "Liz", "age": 32, "dept": "HR" }
-{ "id": 771, "fname": "Neva", "lname": "Barbeau", "age": 45, "dept": "Sales" }
-{ "id": 781, "fname": "Karina", "lname": "Tuthill", "age": 46, "dept": "Payroll" }
-{ "id": 791, "fname": "Maricela", "lname": "Cambron", "age": 36, "dept": "IT" }
-{ "id": 809, "fname": "Clayton", "lname": "Delany", "age": 23, "dept": "IT" }
-{ "id": 811, "fname": "Kubik", "lname": "Kuhn", "age": 27, "dept": "HR" }
-{ "id": 821, "fname": "Allan", "lname": "Tomes", "age": 29, "dept": "Payroll" }
-{ "id": 831, "fname": "Lonnie", "lname": "Aller", "age": 33, "dept": "Sales" }
-{ "id": 841, "fname": "Neil", "lname": "Hurrell", "age": 26, "dept": "IT" }
-{ "id": 851, "fname": "Clayton", "lname": "Engles", "age": 41, "dept": "HR" }
-{ "id": 861, "fname": "Javier", "lname": "Gabrielson", "age": 39, "dept": "Payroll" }
-{ "id": 871, "fname": "Allan", "lname": "Alejandre", "age": 48, "dept": "IT" }
-{ "id": 881, "fname": "Julio", "lname": "Isa", "age": 38, "dept": "Sales" }
-{ "id": 891, "fname": "Roslyn", "lname": "Simmerman", "age": 31, "dept": "IT" }
-{ "id": 915, "fname": "Starner", "lname": "Stuart", "age": 25, "dept": "Sales" }
-{ "id": 925, "fname": "Sofia", "lname": "Cuff", "age": 30, "dept": "HR" }
-{ "id": 935, "fname": "Milagros", "lname": "Murguia", "age": 31, "dept": "IT" }
-{ "id": 945, "fname": "Margery", "lname": "Haldeman", "age": 32, "dept": "IT" }
-{ "id": 955, "fname": "Max", "lname": "Mell", "age": 33, "dept": "HR" }
-{ "id": 965, "fname": "Micco", "lname": "Mercy", "age": 31, "dept": "Payroll" }
-{ "id": 975, "fname": "Clare", "lname": "Vangieson", "age": 34, "dept": "IT" }
-{ "id": 985, "fname": "Elnora", "lname": "Dimauro", "age": 35, "dept": "Sales" }
-{ "id": 995, "fname": "Pearlie", "lname": "Kocian", "age": 38, "dept": "HR" }
-{ "id": 1007, "fname": "Yingyi", "lname": "Bu", "age": 27, "dept": "IT" }
-{ "id": 1263, "fname": "Tania", "lname": "Loffredo", "age": 25, "dept": "IT" }
-{ "id": 1410, "fname": "Clinton", "lname": "Fredricks", "age": 34, "dept": "IT" }
-{ "id": 1411, "fname": "Lance", "lname": "Farquhar", "age": 32, "dept": "HR" }
-{ "id": 1412, "fname": "Tabatha", "lname": "Crisler", "age": 33, "dept": "IT" }
-{ "id": 1413, "fname": "Max", "lname": "Durney", "age": 29, "dept": "IT" }
-{ "id": 1414, "fname": "Carmella", "lname": "Strauser", "age": 30, "dept": "Payroll" }
-{ "id": 1415, "fname": "Kelly", "lname": "Carrales", "age": 40, "dept": "IT" }
-{ "id": 1416, "fname": "Guy", "lname": "Merten", "age": 29, "dept": "Sales" }
-{ "id": 1417, "fname": "Noreen", "lname": "Ruhland", "age": 29, "dept": "IT" }
-{ "id": 1418, "fname": "Julio", "lname": "Damore", "age": 27, "dept": "Sales" }
-{ "id": 1419, "fname": "Selena", "lname": "Truby", "age": 25, "dept": "HR" }
-{ "id": 1420, "fname": "Alejandra", "lname": "Commons", "age": 30, "dept": "Sales" }
-{ "id": 1421, "fname": "Allyson", "lname": "Balk", "age": 30, "dept": "IT" }
-{ "id": 1422, "fname": "Nelson", "lname": "Byun", "age": 40, "dept": "Sales" }
-{ "id": 1423, "fname": "Christian", "lname": "Reidhead", "age": 40, "dept": "IT" }
-{ "id": 1424, "fname": "Pearlie", "lname": "Hopkin", "age": 48, "dept": "Payroll" }
-{ "id": 1425, "fname": "Nelson", "lname": "Wohlers", "age": 41, "dept": "HR" }
-{ "id": 1426, "fname": "Marcie", "lname": "Rasnake", "age": 42, "dept": "Sales" }
-{ "id": 1427, "fname": "Hugh", "lname": "Marshburn", "age": 43, "dept": "Payroll" }
-{ "id": 1428, "fname": "Mathew", "lname": "Marasco", "age": 45, "dept": "Sales" }
-{ "id": 1429, "fname": "Kurt", "lname": "Veres", "age": 32, "dept": "IT" }
-{ "id": 1430, "fname": "Julio", "lname": "Barkett", "age": 39, "dept": "Sales" }
-{ "id": 1863, "fname": "Darren", "lname": "Thorington", "age": 32, "dept": "Sales" }
-{ "id": 1999, "fname": "Susan", "lname": "Malaika", "age": 42, "dept": "HR" }
-{ "id": 2333, "fname": "Chen", "lname": "Li", "age": 42, "dept": "HR" }
-{ "id": 2963, "fname": "Neil", "lname": "Gunnerson", "age": 34, "dept": "IT" }
-{ "id": 3563, "fname": "Hazeltine", "lname": "Susan", "age": 29, "dept": "Sales" }
-{ "id": 3666, "fname": "Young Seok", "lname": "Kim", "age": 35, "dept": "Payroll" }
-{ "id": 4727, "fname": "Michael", "lname": "Carey", "age": 50, "dept": "Payroll" }
-{ "id": 5438, "fname": "Lakisha", "lname": "Quashie", "age": 29, "dept": "HR" }
-{ "id": 7444, "fname": "Sharad", "lname": "Mehrotra", "age": 42, "dept": "Sales" }
-{ "id": 7663, "fname": "Annabelle", "lname": "Nimmo", "age": 30, "dept": "Payroll" }
-{ "id": 8301, "fname": "Earlene", "lname": "Wallick", "age": 26, "dept": "HR" }
-{ "id": 8338, "fname": "Julio", "lname": "Bosket", "age": 28, "dept": "Payroll" }
-{ "id": 9555, "fname": "Tony", "lname": "Givargis", "age": 40, "dept": "Sales" }
-{ "id": 9763, "fname": "Ted", "lname": "Saini", "age": 31, "dept": "IT" }
-{ "id": 9941, "fname": "Khurram Faraaz", "lname": "Mohammed", "age": 30, "dept": "HR" }
-{ "id": 10101, "fname": "Javier", "lname": "Makuch", "age": 28, "dept": "IT" }
-{ "id": 10110, "fname": "Allan", "lname": "Piland", "age": 29, "dept": "HR" }
-{ "id": 10112, "fname": "Pearlie", "lname": "Aumann", "age": 31, "dept": "Payroll" }
-{ "id": 10113, "fname": "Chandra", "lname": "Hase", "age": 34, "dept": "Sales" }
-{ "id": 10114, "fname": "Christian", "lname": "Convery", "age": 28, "dept": "HR" }
-{ "id": 10115, "fname": "Panther", "lname": "Ritch", "age": 26, "dept": "IT" }
-{ "id": 10116, "fname": "Ted", "lname": "Elsea", "age": 26, "dept": "IT" }
-{ "id": 10117, "fname": "Tabatha", "lname": "Bladen", "age": 25, "dept": "HR" }
-{ "id": 10118, "fname": "Clayton", "lname": "Oltman", "age": 42, "dept": "Sales" }
-{ "id": 10119, "fname": "Sharron", "lname": "Darwin", "age": 32, "dept": "Payroll" }
-{ "id": 10210, "fname": "Clayton", "lname": "Durgin", "age": 52, "dept": "HR" }
-{ "id": 10212, "fname": "Emilia", "lname": "Chenail", "age": 26, "dept": "Sales" }
-{ "id": 10213, "fname": "Kenya", "lname": "Almquist", "age": 43, "dept": "Payroll" }
-{ "id": 10214, "fname": "Alejandra", "lname": "Lacefield", "age": 41, "dept": "HR" }
-{ "id": 10215, "fname": "Karina", "lname": "Michelsen", "age": 46, "dept": "IT" }
-{ "id": 10216, "fname": "Katy", "lname": "Delillo", "age": 36, "dept": "IT" }
-{ "id": 10217, "fname": "Benita", "lname": "Kleist", "age": 37, "dept": "HR" }
-{ "id": 10218, "fname": "Earlene", "lname": "Paluch", "age": 31, "dept": "IT" }
-{ "id": 10219, "fname": "Kurt", "lname": "Petermann", "age": 27, "dept": "Payroll" }
-{ "id": 10299, "fname": "Julio", "lname": "Iorio", "age": 37, "dept": "IT" }
-{ "id": 10363, "fname": "Cody", "lname": "Rodreguez", "age": 26, "dept": "IT" }
-{ "id": 10404, "fname": "Emilia", "lname": "Square", "age": 32, "dept": "IT" }
-{ "id": 10414, "fname": "Mathew", "lname": "Fuschetto", "age": 34, "dept": "HR" }
-{ "id": 10424, "fname": "Allyson", "lname": "Remus", "age": 32, "dept": "IT" }
-{ "id": 10434, "fname": "Earlene", "lname": "Linebarger", "age": 26, "dept": "Payroll" }
-{ "id": 10444, "fname": "Clinton", "lname": "Sick", "age": 29, "dept": "IT" }
-{ "id": 10454, "fname": "Ted", "lname": "Caba", "age": 28, "dept": "HR" }
-{ "id": 10463, "fname": "Marcie", "lname": "States", "age": 28, "dept": "IT" }
-{ "id": 10464, "fname": "Fernando", "lname": "Engelke", "age": 39, "dept": "IT" }
-{ "id": 10474, "fname": "Mathew", "lname": "Courchesne", "age": 31, "dept": "IT" }
-{ "id": 10484, "fname": "Cody", "lname": "Vinyard", "age": 36, "dept": "Payroll" }
-{ "id": 10494, "fname": "Benita", "lname": "Fravel", "age": 33, "dept": "Sales" }
-{ "id": 10504, "fname": "Erik", "lname": "Dobek", "age": 29, "dept": "IT" }
-{ "id": 10514, "fname": "Julio", "lname": "Ruben", "age": 41, "dept": "IT" }
-{ "id": 10524, "fname": "Benita", "lname": "Maltos", "age": 33, "dept": "IT" }
-{ "id": 10534, "fname": "Kurt", "lname": "Biscoe", "age": 36, "dept": "HR" }
-{ "id": 10538, "fname": "Milagros", "lname": "Forkey", "age": 34, "dept": "Sales" }
-{ "id": 10544, "fname": "Loraine", "lname": "Housel", "age": 30, "dept": "Sales" }
-{ "id": 10554, "fname": "Jamie", "lname": "Rachal", "age": 30, "dept": "IT" }
-{ "id": 10564, "fname": "Liza", "lname": "Fredenburg", "age": 37, "dept": "IT" }
-{ "id": 10574, "fname": "Ericka", "lname": "Feldmann", "age": 29, "dept": "Sales" }
-{ "id": 10584, "fname": "Dollie", "lname": "Dattilo", "age": 32, "dept": "Payroll" }
-{ "id": 10589, "fname": "Lorrie", "lname": "Sharon", "age": 27, "dept": "IT" }
-{ "id": 10594, "fname": "Roxie", "lname": "Houghtaling", "age": 40, "dept": "Payroll" }
-{ "id": 10601, "fname": "Neil", "lname": "Deforge", "age": 26, "dept": "HR" }
-{ "id": 10611, "fname": "Earlene", "lname": "Marcy", "age": 32, "dept": "IT" }
-{ "id": 10621, "fname": "Erik", "lname": "Lechuga", "age": 42, "dept": "Payroll" }
-{ "id": 10631, "fname": "Tyrone", "lname": "Holtzclaw", "age": 34, "dept": "Sales" }
-{ "id": 10641, "fname": "Lance", "lname": "Hankey", "age": 35, "dept": "Sales" }
-{ "id": 10651, "fname": "Mallory", "lname": "Gladding", "age": 31, "dept": "HR" }
-{ "id": 10661, "fname": "Tia", "lname": "Braaten", "age": 40, "dept": "IT" }
-{ "id": 10671, "fname": "Julio", "lname": "Vanpatten", "age": 30, "dept": "Payroll" }
-{ "id": 10681, "fname": "Max", "lname": "Teachout", "age": 34, "dept": "IT" }
-{ "id": 10691, "fname": "Karina", "lname": "Wingerter", "age": 31, "dept": "IT" }
-{ "id": 10711, "fname": "Hugh", "lname": "Lema", "age": 25, "dept": "HR" }
-{ "id": 10721, "fname": "Schwan", "lname": "Phil", "age": 34, "dept": "Payroll" }
-{ "id": 10732, "fname": "Noemi", "lname": "Eacret", "age": 56, "dept": "HR" }
-{ "id": 10741, "fname": "Julio", "lname": "Mattocks", "age": 38, "dept": "Sales" }
-{ "id": 10751, "fname": "Lance", "lname": "Kottke", "age": 34, "dept": "IT" }
-{ "id": 10761, "fname": "Kurt", "lname": "Liz", "age": 32, "dept": "HR" }
-{ "id": 10771, "fname": "Neva", "lname": "Barbeau", "age": 45, "dept": "Sales" }
-{ "id": 10781, "fname": "Karina", "lname": "Tuthill", "age": 46, "dept": "Payroll" }
-{ "id": 10791, "fname": "Maricela", "lname": "Cambron", "age": 36, "dept": "IT" }
-{ "id": 10809, "fname": "Clayton", "lname": "Delany", "age": 23, "dept": "IT" }
-{ "id": 10811, "fname": "Kubik", "lname": "Kuhn", "age": 27, "dept": "HR" }
-{ "id": 10821, "fname": "Allan", "lname": "Tomes", "age": 29, "dept": "Payroll" }
-{ "id": 10831, "fname": "Lonnie", "lname": "Aller", "age": 33, "dept": "Sales" }
-{ "id": 10841, "fname": "Neil", "lname": "Hurrell", "age": 26, "dept": "IT" }
-{ "id": 10851, "fname": "Clayton", "lname": "Engles", "age": 41, "dept": "HR" }
-{ "id": 10861, "fname": "Javier", "lname": "Gabrielson", "age": 39, "dept": "Payroll" }
-{ "id": 10871, "fname": "Allan", "lname": "Alejandre", "age": 48, "dept": "IT" }
-{ "id": 10881, "fname": "Julio", "lname": "Isa", "age": 38, "dept": "Sales" }
-{ "id": 10891, "fname": "Roslyn", "lname": "Simmerman", "age": 31, "dept": "IT" }
-{ "id": 10915, "fname": "Starner", "lname": "Stuart", "age": 25, "dept": "Sales" }
-{ "id": 10925, "fname": "Sofia", "lname": "Cuff", "age": 30, "dept": "HR" }
-{ "id": 10935, "fname": "Milagros", "lname": "Murguia", "age": 31, "dept": "IT" }
-{ "id": 10945, "fname": "Margery", "lname": "Haldeman", "age": 32, "dept": "IT" }
-{ "id": 10955, "fname": "Max", "lname": "Mell", "age": 33, "dept": "HR" }
-{ "id": 10965, "fname": "Micco", "lname": "Mercy", "age": 31, "dept": "Payroll" }
-{ "id": 10975, "fname": "Clare", "lname": "Vangieson", "age": 34, "dept": "IT" }
-{ "id": 10985, "fname": "Elnora", "lname": "Dimauro", "age": 35, "dept": "Sales" }
-{ "id": 10995, "fname": "Pearlie", "lname": "Kocian", "age": 38, "dept": "HR" }
-{ "id": 11007, "fname": "Yingyi", "lname": "Bu", "age": 27, "dept": "IT" }
-{ "id": 11263, "fname": "Tania", "lname": "Loffredo", "age": 25, "dept": "IT" }
-{ "id": 11410, "fname": "Clinton", "lname": "Fredricks", "age": 34, "dept": "IT" }
-{ "id": 11411, "fname": "Lance", "lname": "Farquhar", "age": 32, "dept": "HR" }
-{ "id": 11412, "fname": "Tabatha", "lname": "Crisler", "age": 33, "dept": "IT" }
-{ "id": 11413, "fname": "Max", "lname": "Durney", "age": 29, "dept": "IT" }
-{ "id": 11414, "fname": "Carmella", "lname": "Strauser", "age": 30, "dept": "Payroll" }
-{ "id": 11415, "fname": "Kelly", "lname": "Carrales", "age": 40, "dept": "IT" }
-{ "id": 11416, "fname": "Guy", "lname": "Merten", "age": 29, "dept": "Sales" }
-{ "id": 11417, "fname": "Noreen", "lname": "Ruhland", "age": 29, "dept": "IT" }
-{ "id": 11418, "fname": "Julio", "lname": "Damore", "age": 27, "dept": "Sales" }
-{ "id": 11419, "fname": "Selena", "lname": "Truby", "age": 25, "dept": "HR" }
-{ "id": 11420, "fname": "Alejandra", "lname": "Commons", "age": 30, "dept": "Sales" }
-{ "id": 11421, "fname": "Allyson", "lname": "Balk", "age": 30, "dept": "IT" }
-{ "id": 11422, "fname": "Nelson", "lname": "Byun", "age": 40, "dept": "Sales" }
-{ "id": 11423, "fname": "Christian", "lname": "Reidhead", "age": 40, "dept": "IT" }
-{ "id": 11424, "fname": "Pearlie", "lname": "Hopkin", "age": 48, "dept": "Payroll" }
-{ "id": 11425, "fname": "Nelson", "lname": "Wohlers", "age": 41, "dept": "HR" }
-{ "id": 11426, "fname": "Marcie", "lname": "Rasnake", "age": 42, "dept": "Sales" }
-{ "id": 11427, "fname": "Hugh", "lname": "Marshburn", "age": 43, "dept": "Payroll" }
-{ "id": 11428, "fname": "Mathew", "lname": "Marasco", "age": 45, "dept": "Sales" }
-{ "id": 11429, "fname": "Kurt", "lname": "Veres", "age": 32, "dept": "IT" }
-{ "id": 11430, "fname": "Julio", "lname": "Barkett", "age": 39, "dept": "Sales" }
-{ "id": 11863, "fname": "Darren", "lname": "Thorington", "age": 32, "dept": "Sales" }
-{ "id": 11999, "fname": "Susan", "lname": "Malaika", "age": 42, "dept": "HR" }
-{ "id": 12333, "fname": "Chen", "lname": "Li", "age": 42, "dept": "HR" }
-{ "id": 12963, "fname": "Neil", "lname": "Gunnerson", "age": 34, "dept": "IT" }
-{ "id": 13563, "fname": "Hazeltine", "lname": "Susan", "age": 29, "dept": "Sales" }
-{ "id": 13666, "fname": "Young Seok", "lname": "Kim", "age": 35, "dept": "Payroll" }
-{ "id": 14727, "fname": "Michael", "lname": "Carey", "age": 50, "dept": "Payroll" }
-{ "id": 15438, "fname": "Lakisha", "lname": "Quashie", "age": 29, "dept": "HR" }
-{ "id": 17444, "fname": "Sharad", "lname": "Mehrotra", "age": 42, "dept": "Sales" }
-{ "id": 17663, "fname": "Annabelle", "lname": "Nimmo", "age": 30, "dept": "Payroll" }
-{ "id": 18301, "fname": "Earlene", "lname": "Wallick", "age": 26, "dept": "HR" }
-{ "id": 18338, "fname": "Julio", "lname": "Bosket", "age": 28, "dept": "Payroll" }
-{ "id": 19555, "fname": "Tony", "lname": "Givargis", "age": 40, "dept": "Sales" }
-{ "id": 19763, "fname": "Ted", "lname": "Saini", "age": 31, "dept": "IT" }
-{ "id": 19941, "fname": "Khurram Faraaz", "lname": "Mohammed", "age": 30, "dept": "HR" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.adm
deleted file mode 100644
index 55b9a4d..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.adm
+++ /dev/null
@@ -1,20 +0,0 @@
-{ "id": 1 }
-{ "id": 2 }
-{ "id": 3 }
-{ "id": 4 }
-{ "id": 5 }
-{ "id": 6 }
-{ "id": 7 }
-{ "id": 8 }
-{ "id": 9 }
-{ "id": 10 }
-{ "id": 11 }
-{ "id": 12 }
-{ "id": 13 }
-{ "id": 14 }
-{ "id": 15 }
-{ "id": 16 }
-{ "id": 17 }
-{ "id": 18 }
-{ "id": 19 }
-{ "id": 20 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.adm
deleted file mode 100644
index c39ad6b..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.adm
+++ /dev/null
@@ -1,4 +0,0 @@
-{ "l_returnflag": "A", "l_linestatus": "F", "sum_qty": 37474.0, "sum_base_price": 3.7569624640000015E7, "sum_disc_price": 3.5676192097E7, "sum_charge": 3.710141622242399E7, "ave_qty": 25.354533152909337, "ave_price": 25419.231826792973, "ave_disc": 0.050866035182679264, "count_order": 1478 }
-{ "l_returnflag": "N", "l_linestatus": "F", "sum_qty": 1041.0, "sum_base_price": 1041301.0700000001, "sum_disc_price": 999060.898, "sum_charge": 1036450.80228, "ave_qty": 27.394736842105264, "ave_price": 27402.659736842106, "ave_disc": 0.04289473684210526, "count_order": 38 }
-{ "l_returnflag": "N", "l_linestatus": "O", "sum_qty": 75168.0, "sum_base_price": 7.538495536999999E7, "sum_disc_price": 7.165316630340001E7, "sum_charge": 7.449879813307299E7, "ave_qty": 25.558653519211152, "ave_price": 25632.422771166268, "ave_disc": 0.04969738184291062, "count_order": 2941 }
-{ "l_returnflag": "R", "l_linestatus": "F", "sum_qty": 36511.0, "sum_base_price": 3.657084124E7, "sum_disc_price": 3.47384728758E7, "sum_charge": 3.616906011219301E7, "ave_qty": 25.059025394646532, "ave_price": 25100.09693891558, "ave_disc": 0.05002745367192856, "count_order": 1457 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.adm
deleted file mode 100644
index 0e739c3..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "id": 10 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.adm
deleted file mode 100644
index 0dd81cd..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.adm
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "id": 10 }
-{ "id": 12 }
-{ "id": 20 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.adm
deleted file mode 100644
index 0dd81cd..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.adm
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "id": 10 }
-{ "id": 12 }
-{ "id": 20 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-temp-to-persistent/scan-insert-persistent-to-temp.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-temp-to-persistent/scan-insert-persistent-to-temp.1.adm
deleted file mode 100644
index 0dd81cd..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/scan-insert-temp-to-persistent/scan-insert-persistent-to-temp.1.adm
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "id": 10 }
-{ "id": 12 }
-{ "id": 20 }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.adm
deleted file mode 100644
index 83b33d2..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/temp_primary_plus_ngram_flush/temp_primary_plus_ngram_flush.3.adm
+++ /dev/null
@@ -1 +0,0 @@
-1000
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/union/union_orderby_5/union_orderby_5.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/union/union_orderby_5/union_orderby_5.1.adm
new file mode 100644
index 0000000..6286610
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/union/union_orderby_5/union_orderby_5.1.adm
@@ -0,0 +1,35 @@
+{ "id": 1 }
+{ "id": 1 }
+{ "id": 2 }
+{ "id": 2 }
+{ "id": 3 }
+{ "id": 3 }
+{ "id": 4 }
+{ "id": 4 }
+{ "id": 5 }
+{ "id": 5 }
+{ "id": 6 }
+{ "id": 6 }
+{ "id": 7 }
+{ "id": 7 }
+{ "id": 8 }
+{ "id": 8 }
+{ "id": 9 }
+{ "id": 9 }
+{ "id": 10 }
+{ "id": 10 }
+{ "id": 11 }
+{ "id": 12 }
+{ "id": 13 }
+{ "id": 14 }
+{ "id": 15 }
+{ "id": "BramHatch" }
+{ "id": "EmoryUnk" }
+{ "id": "IsbelDull" }
+{ "id": "MargaritaStoddard" }
+{ "id": "NicholasStroh" }
+{ "id": "NilaMilliron" }
+{ "id": "SuzannaTillson" }
+{ "id": "VonKemble" }
+{ "id": "WillisWynne" }
+{ "id": "WoodrowNehling" }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm
new file mode 100644
index 0000000..50f19bb
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/user-defined-functions/check-dependencies-1/check-dependencies-1.1.adm
@@ -0,0 +1,6 @@
+{ "DataverseName": "B", "Name": "f0", "Dependencies": [ [  ], [  ] ] }
+{ "DataverseName": "B", "Name": "f5", "Dependencies": [ [ [ "C", "TweetMessages" ], [ "B", "TweetMessages2" ] ], [ [ "C", "f1", "2" ], [ "B", "f0", "2" ] ] ] }
+{ "DataverseName": "C", "Name": "f1", "Dependencies": [ [  ], [  ] ] }
+{ "DataverseName": "C", "Name": "f2", "Dependencies": [ [ [ "C", "TweetMessages" ] ], [ [ "C", "f1", "2" ], [ "B", "f0", "2" ] ] ] }
+{ "DataverseName": "C", "Name": "f3", "Dependencies": [ [  ], [ [ "C", "f2", "2" ] ] ] }
+{ "DataverseName": "C", "Name": "f4", "Dependencies": [ [ [ "C", "TweetMessages" ] ], [  ] ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec/agg_null_rec.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec/agg_null_rec.3.ast
index 0d84c5d..05a76b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec/agg_null_rec.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec/agg_null_rec.3.ast
@@ -12,8 +12,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -31,8 +31,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -50,8 +50,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -69,8 +69,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -88,8 +88,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec_1/agg_null_rec_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec_1/agg_null_rec_1.3.ast
index dbd02c5..99a39ac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec_1/agg_null_rec_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_null_rec_1/agg_null_rec_1.3.ast
@@ -9,8 +9,8 @@
         SELECT ELEMENT [
         Variable [ Name=$t ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -32,8 +32,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -58,8 +58,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -84,8 +84,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -110,8 +110,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_number_rec/agg_number_rec.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_number_rec/agg_number_rec.3.ast
index 0d84c5d..05a76b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_number_rec/agg_number_rec.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/agg_number_rec/agg_number_rec.3.ast
@@ -12,8 +12,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -31,8 +31,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -50,8 +50,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -69,8 +69,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -88,8 +88,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_double_null/avg_double_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_double_null/avg_double_null.3.ast
index 344de1f..5ab3cbe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_double_null/avg_double_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_double_null/avg_double_null.3.ast
@@ -12,8 +12,8 @@
           Field=doubleField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_empty_02/avg_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_empty_02/avg_empty_02.3.ast
index f17fad0..c407f2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_empty_02/avg_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_empty_02/avg_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_float_null/avg_float_nu.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_float_null/avg_float_nu.3.ast
index c82659b..61bc779 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_float_null/avg_float_nu.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_float_null/avg_float_nu.3.ast
@@ -12,8 +12,8 @@
           Field=floatField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int16_null/avg_int16_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int16_null/avg_int16_null.3.ast
index 896af7a..07dd0c4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int16_null/avg_int16_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int16_null/avg_int16_null.3.ast
@@ -12,8 +12,8 @@
           Field=int16Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int32_null/avg_int32_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int32_null/avg_int32_null.3.ast
index 2293707..fecf3f9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int32_null/avg_int32_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int32_null/avg_int32_null.3.ast
@@ -12,8 +12,8 @@
           Field=int32Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int64_null/avg_int64_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int64_null/avg_int64_null.3.ast
index 4107b9a..5c3706e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int64_null/avg_int64_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int64_null/avg_int64_null.3.ast
@@ -12,8 +12,8 @@
           Field=int64Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int8_null/avg_int8_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int8_null/avg_int8_null.3.ast
index 210917c..80256a1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int8_null/avg_int8_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/avg_int8_null/avg_int8_null.3.ast
@@ -12,8 +12,8 @@
           Field=int8Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_empty_02/count_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_empty_02/count_empty_02.3.ast
index 2ccd958..451d97a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_empty_02/count_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_empty_02/count_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_null/count_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_null/count_null.3.ast
index 619729a..fb41724 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_null/count_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/count_null/count_null.3.ast
@@ -12,8 +12,8 @@
           Field=doubleField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue395/issue395.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue395/issue395.3.ast
index 56c8c0a..a3640ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue395/issue395.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue395/issue395.3.ast
@@ -9,8 +9,8 @@
       Field=name
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Employee]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Employee]
       ]
       AS Variable [ Name=$l ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue531_string_min_max/issue531_string_min_max.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue531_string_min_max/issue531_string_min_max.3.ast
index 5ed4c7b..0dd9304 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue531_string_min_max/issue531_string_min_max.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/issue531_string_min_max/issue531_string_min_max.3.ast
@@ -13,8 +13,8 @@
           Field=name
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [t1]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.t1]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -32,8 +32,8 @@
           Field=name
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [t1]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.t1]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/max_empty_02/max_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/max_empty_02/max_empty_02.3.ast
index 524082e..6ebef88 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/max_empty_02/max_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/max_empty_02/max_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/min_empty_02/min_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/min_empty_02/min_empty_02.3.ast
index 03bb24f..e2a5960 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/min_empty_02/min_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/min_empty_02/min_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_double_null/sum_double_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_double_null/sum_double_null.3.ast
index f5e525e..5bc98d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_double_null/sum_double_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_double_null/sum_double_null.3.ast
@@ -9,8 +9,8 @@
       Field=doubleField
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_empty_02/sum_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_empty_02/sum_empty_02.3.ast
index 6371498..8f2c23b0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_empty_02/sum_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_empty_02/sum_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_float_null/sum_float_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_float_null/sum_float_null.3.ast
index 62ea3b4..fedb1d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_float_null/sum_float_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_float_null/sum_float_null.3.ast
@@ -9,8 +9,8 @@
       Field=floatField
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int16_null/sum_int16_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int16_null/sum_int16_null.3.ast
index 4c7bf75..484996a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int16_null/sum_int16_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int16_null/sum_int16_null.3.ast
@@ -9,8 +9,8 @@
       Field=int16Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int32_null/sum_int32_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int32_null/sum_int32_null.3.ast
index b77dbf42..0187939 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int32_null/sum_int32_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int32_null/sum_int32_null.3.ast
@@ -9,8 +9,8 @@
       Field=int32Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int64_null/sum_int64_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int64_null/sum_int64_null.3.ast
index 4bbfacc..cb8d45f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int64_null/sum_int64_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int64_null/sum_int64_null.3.ast
@@ -9,8 +9,8 @@
       Field=int64Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int8_null/sum_int8_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int8_null/sum_int8_null.3.ast
index 77c987d..1175f57 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int8_null/sum_int8_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_int8_null/sum_int8_null.3.ast
@@ -9,8 +9,8 @@
       Field=int8Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_null-with-pred/sum_null-with-pred.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_null-with-pred/sum_null-with-pred.3.ast
index f185de3..a65ab13 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_null-with-pred/sum_null-with-pred.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_null-with-pred/sum_null-with-pred.3.ast
@@ -9,14 +9,14 @@
       Field=sal
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [tdst]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.tdst]
       ]
       AS Variable [ Name=$l ]
     ]
     Where
-      FunctionCall null.not@1[
-        FunctionCall null.is-null@1[
+      FunctionCall algebricks.not@1[
+        FunctionCall algebricks.is-null@1[
           FieldAccessor [
             Variable [ Name=$l ]
             Field=sal
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_numeric_null/sum_numeric_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_numeric_null/sum_numeric_null.3.ast
index 3c424ab..7965ce8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_numeric_null/sum_numeric_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate-sql/sum_numeric_null/sum_numeric_null.3.ast
@@ -9,8 +9,8 @@
       Field=sal
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [tdst]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.tdst]
       ]
       AS Variable [ Name=$l ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec/agg_null_rec.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec/agg_null_rec.3.ast
index 77482fa..f2fe7a8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec/agg_null_rec.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec/agg_null_rec.3.ast
@@ -12,8 +12,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -31,8 +31,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -50,8 +50,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -69,8 +69,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -88,8 +88,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec_1/agg_null_rec_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec_1/agg_null_rec_1.3.ast
index efbacd2..f7d2b25 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec_1/agg_null_rec_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_null_rec_1/agg_null_rec_1.3.ast
@@ -9,8 +9,8 @@
         SELECT ELEMENT [
         Variable [ Name=$t ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -32,8 +32,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -58,8 +58,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -84,8 +84,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
@@ -110,8 +110,8 @@
             SELECT ELEMENT [
             Variable [ Name=$t ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Test]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [test.Test]
               ]
               AS Variable [ Name=$t ]
             ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_number_rec/agg_number_rec.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_number_rec/agg_number_rec.3.ast
index 77482fa..f2fe7a8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_number_rec/agg_number_rec.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/agg_number_rec/agg_number_rec.3.ast
@@ -12,8 +12,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -31,8 +31,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -50,8 +50,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -69,8 +69,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
@@ -88,8 +88,8 @@
           Field=valplus
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Test]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Test]
           ]
           AS Variable [ Name=$t ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_double_null/avg_double_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_double_null/avg_double_null.3.ast
index 9efb867..649b97c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_double_null/avg_double_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_double_null/avg_double_null.3.ast
@@ -12,8 +12,8 @@
           Field=doubleField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_empty_02/avg_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_empty_02/avg_empty_02.3.ast
index 6940efa..24345f7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_empty_02/avg_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_empty_02/avg_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_float_null/avg_float_nu.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_float_null/avg_float_nu.3.ast
index 6654f36..00256af 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_float_null/avg_float_nu.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_float_null/avg_float_nu.3.ast
@@ -12,8 +12,8 @@
           Field=floatField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int16_null/avg_int16_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int16_null/avg_int16_null.3.ast
index 3852800..8dc5470 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int16_null/avg_int16_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int16_null/avg_int16_null.3.ast
@@ -12,8 +12,8 @@
           Field=int16Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int32_null/avg_int32_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int32_null/avg_int32_null.3.ast
index 35574bd..d27467f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int32_null/avg_int32_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int32_null/avg_int32_null.3.ast
@@ -12,8 +12,8 @@
           Field=int32Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int64_null/avg_int64_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int64_null/avg_int64_null.3.ast
index 5e11c78..acc6550 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int64_null/avg_int64_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int64_null/avg_int64_null.3.ast
@@ -12,8 +12,8 @@
           Field=int64Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int8_null/avg_int8_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int8_null/avg_int8_null.3.ast
index dc177ee..5c20a91 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int8_null/avg_int8_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/avg_int8_null/avg_int8_null.3.ast
@@ -12,8 +12,8 @@
           Field=int8Field
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_empty_02/count_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_empty_02/count_empty_02.3.ast
index ccf8f0d..9eab693 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_empty_02/count_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_empty_02/count_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_null/count_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_null/count_null.3.ast
index 93a2b72..7c91b13 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_null/count_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/count_null/count_null.3.ast
@@ -12,8 +12,8 @@
           Field=doubleField
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Numeric]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.Numeric]
           ]
           AS Variable [ Name=$x ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue395/issue395.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue395/issue395.3.ast
index 98a5343..e92683f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue395/issue395.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue395/issue395.3.ast
@@ -9,8 +9,8 @@
       Field=name
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Employee]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Employee]
       ]
       AS Variable [ Name=$l ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue531_string_min_max/issue531_string_min_max.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue531_string_min_max/issue531_string_min_max.3.ast
index 39e4ae9..7d16caf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue531_string_min_max/issue531_string_min_max.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/issue531_string_min_max/issue531_string_min_max.3.ast
@@ -13,8 +13,8 @@
           Field=name
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [t1]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.t1]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -32,8 +32,8 @@
           Field=name
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [t1]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.t1]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/max_empty_02/max_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/max_empty_02/max_empty_02.3.ast
index 7a363e7..74443d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/max_empty_02/max_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/max_empty_02/max_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/min_empty_02/min_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/min_empty_02/min_empty_02.3.ast
index 472d7f6..98dd118 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/min_empty_02/min_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/min_empty_02/min_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_double_null/sum_double_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_double_null/sum_double_null.3.ast
index 59dad88..8ca1c9f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_double_null/sum_double_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_double_null/sum_double_null.3.ast
@@ -9,8 +9,8 @@
       Field=doubleField
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_empty_02/sum_empty_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_empty_02/sum_empty_02.3.ast
index afc0582..68b6b29 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_empty_02/sum_empty_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_empty_02/sum_empty_02.3.ast
@@ -9,8 +9,8 @@
       Field=val
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Test]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Test]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_float_null/sum_float_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_float_null/sum_float_null.3.ast
index 069ed30..8040eb9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_float_null/sum_float_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_float_null/sum_float_null.3.ast
@@ -9,8 +9,8 @@
       Field=floatField
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int16_null/sum_int16_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int16_null/sum_int16_null.3.ast
index a54b145..21c20b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int16_null/sum_int16_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int16_null/sum_int16_null.3.ast
@@ -9,8 +9,8 @@
       Field=int16Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int32_null/sum_int32_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int32_null/sum_int32_null.3.ast
index 1380de9..b3e83e1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int32_null/sum_int32_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int32_null/sum_int32_null.3.ast
@@ -9,8 +9,8 @@
       Field=int32Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int64_null/sum_int64_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int64_null/sum_int64_null.3.ast
index 7a1859d..c62cb77 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int64_null/sum_int64_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int64_null/sum_int64_null.3.ast
@@ -9,8 +9,8 @@
       Field=int64Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int8_null/sum_int8_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int8_null/sum_int8_null.3.ast
index 33e0e30..f7af415 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int8_null/sum_int8_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_int8_null/sum_int8_null.3.ast
@@ -9,8 +9,8 @@
       Field=int8Field
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Numeric]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Numeric]
       ]
       AS Variable [ Name=$x ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_null-with-pred/sum_null-with-pred.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_null-with-pred/sum_null-with-pred.3.ast
index 32b5d9a..646ccce 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_null-with-pred/sum_null-with-pred.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_null-with-pred/sum_null-with-pred.3.ast
@@ -9,14 +9,14 @@
       Field=sal
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [tdst]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.tdst]
       ]
       AS Variable [ Name=$l ]
     ]
     Where
-      FunctionCall null.not@1[
-        FunctionCall null.is-null@1[
+      FunctionCall algebricks.not@1[
+        FunctionCall algebricks.is-null@1[
           FieldAccessor [
             Variable [ Name=$l ]
             Field=sal
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_numeric_null/sum_numeric_null.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_numeric_null/sum_numeric_null.3.ast
index 2270d23..8a682b9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_numeric_null/sum_numeric_null.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/aggregate/sum_numeric_null/sum_numeric_null.3.ast
@@ -9,8 +9,8 @@
       Field=sal
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [tdst]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.tdst]
       ]
       AS Variable [ Name=$l ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby-2/big_object_groupby.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby-2/big_object_groupby.3.ast
index 3fc7b9f..7ec7ccb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby-2/big_object_groupby.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby-2/big_object_groupby.3.ast
@@ -21,8 +21,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Line]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Line]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby/big_object_groupby.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby/big_object_groupby.3.ast
index 9747f1e..599aee6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby/big_object_groupby.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_groupby/big_object_groupby.3.ast
@@ -13,10 +13,9 @@
     :
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [i]
-        Variable [ Name=$partkey ]
+      FunctionCall asterix.field-access-by-name@2[
         Variable [ Name=$g ]
+        LiteralExpr [STRING] [i]
       ]
       ]
       FROM [        Variable [ Name=$g ]
@@ -26,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Line]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Line]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_join/big_object_join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_join/big_object_join.3.ast
index 1d781bc..1fa4750 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_join/big_object_join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_join/big_object_join.3.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Order]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Order]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_sort/big_object_sort.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_sort/big_object_sort.3.ast
index 61d5c19..8ef1dc5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_sort/big_object_sort.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/big-object/big_object_sort/big_object_sort.3.ast
@@ -38,8 +38,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Order]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Order]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/equal_join/equal_join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/equal_join/equal_join.3.ast
index fed3916..68d2a2b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/equal_join/equal_join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/equal_join/equal_join.3.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [User]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.User]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [UserCopy]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.UserCopy]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/find/find.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/find/find.3.ast
index cd2f25c..813591c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/find/find.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/find/find.3.ast
@@ -11,7 +11,7 @@
       ]
     ]
     =
-    LiteralExpr [LONG] [1]
+    LiteralExpr [LONG] [0]
   ]
   OperatorExpr [
     FunctionCall test.find-binary@2[
@@ -23,7 +23,7 @@
       ]
     ]
     =
-    LiteralExpr [LONG] [1]
+    LiteralExpr [LONG] [0]
   ]
   OperatorExpr [
     FunctionCall test.find-binary@3[
@@ -36,7 +36,7 @@
       LiteralExpr [LONG] [1]
     ]
     =
-    LiteralExpr [LONG] [5]
+    LiteralExpr [LONG] [4]
   ]
   OperatorExpr [
     FunctionCall test.find-binary@3[
@@ -46,7 +46,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabb]
       ]
-      LiteralExpr [LONG] [0]
+      - LiteralExpr [LONG] [1]
     ]
     =
     FunctionCall test.find-binary@2[
@@ -68,7 +68,7 @@
       ]
     ]
     =
-    LiteralExpr [LONG] [0]
+    - LiteralExpr [LONG] [1]
   ]
   OperatorExpr [
     FunctionCall test.find-binary@2[
@@ -80,7 +80,7 @@
       ]
     ]
     =
-    LiteralExpr [LONG] [3]
+    LiteralExpr [LONG] [2]
   ]
   OperatorExpr [
     FunctionCall test.find-binary@2[
@@ -92,7 +92,7 @@
       ]
     ]
     =
-    LiteralExpr [LONG] [0]
+    - LiteralExpr [LONG] [1]
   ]
   FunctionCall test.find-binary@2[
     FunctionCall test.hex@1[
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/index_join/index_join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/index_join/index_join.3.ast
index fed3916..68d2a2b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/index_join/index_join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/index_join/index_join.3.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [User]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.User]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [UserCopy]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.UserCopy]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/insert/insert.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/insert/insert.3.ast
index 4123c5a..da318e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/insert/insert.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/insert/insert.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [UserOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.UserOpen]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/subbinary/subbinary_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/subbinary/subbinary_01.3.ast
index 6ec8199..5a232ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/subbinary/subbinary_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/binary/subbinary/subbinary_01.3.ast
@@ -42,7 +42,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       FunctionCall test.binary-length@1[
         FunctionCall test.hex@1[
           LiteralExpr [STRING] [aabbccdd]
@@ -59,7 +59,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
       LiteralExpr [LONG] [1]
     ]
     =
@@ -72,7 +72,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
     ]
     =
     FunctionCall test.hex@1[
@@ -84,7 +84,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [5]
+      LiteralExpr [LONG] [4]
       LiteralExpr [LONG] [0]
     ]
     =
@@ -97,7 +97,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [4]
+      LiteralExpr [LONG] [3]
       LiteralExpr [LONG] [1]
     ]
     =
@@ -110,7 +110,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
       LiteralExpr [LONG] [2]
     ]
     =
@@ -147,7 +147,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       LiteralExpr [LONG] [256]
     ]
     =
@@ -160,7 +160,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
       LiteralExpr [LONG] [256]
     ]
     =
@@ -173,7 +173,7 @@
       FunctionCall test.hex@1[
         LiteralExpr [STRING] [aabbccdd]
       ]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
       - LiteralExpr [LONG] [1]
     ]
     =
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/boolean/not_01/not_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/boolean/not_01/not_01.3.ast
index c554923..10f49ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/boolean/not_01/not_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/boolean/not_01/not_01.3.ast
@@ -4,21 +4,21 @@
   (
     LiteralExpr [STRING] [not_x]
     :
-    FunctionCall null.not@1[
+    FunctionCall algebricks.not@1[
       LiteralExpr [TRUE]
     ]
   )
   (
     LiteralExpr [STRING] [not_y]
     :
-    FunctionCall null.not@1[
+    FunctionCall algebricks.not@1[
       LiteralExpr [FALSE]
     ]
   )
   (
     LiteralExpr [STRING] [not_z]
     :
-    FunctionCall null.not@1[
+    FunctionCall algebricks.not@1[
       LiteralExpr [NULL]
     ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/comparison/datetime_range/datetime_range.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/comparison/datetime_range/datetime_range.3.ast
index bfadfc4..f9148b3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/comparison/datetime_range/datetime_range.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/comparison/datetime_range/datetime_range.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TwitterData]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.ast
index 7843472..580a1db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv01/cross-dv01.3.ast
@@ -23,22 +23,22 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [student.ugdstd]
   ]
   AS Variable [ Name=$s ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [teacher.prof]
   ]
   AS Variable [ Name=$p ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [student.gdstd]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [teacher.pstdoc]
   ]
   AS Variable [ Name=$b ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.ast
index d45d4ec..6c05c55 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv02/cross-dv02.3.ast
@@ -2,7 +2,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Dataset]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.ast
index 9613c78..cc2bb09 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv03/cross-dv03.3.ast
@@ -5,7 +5,7 @@
     SELECT ELEMENT [
     Variable [ Name=$l ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [Metadata.Dataset]
       ]
       AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.ast
index d45d4ec..6c05c55 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv04/cross-dv04.3.ast
@@ -2,7 +2,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Dataset]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.ast
index 5857a1f..cda6d54 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv07/cross-dv07.3.ast
@@ -2,7 +2,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.1.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.2.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.ast
deleted file mode 100644
index 3f12d12..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv13/cross-dv13.3.ast
+++ /dev/null
@@ -1,6 +0,0 @@
-DataverseUse testdv1
-Query:
-SELECT ELEMENT [
-FunctionCall testdv1.fun01@0[
-]
-]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.ast
index 4fd48a7..4748ac3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv15/cross-dv15.3.ast
@@ -35,7 +35,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Function]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.1.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.2.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.ast
deleted file mode 100644
index 3f12d12..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv16/cross-dv16.3.ast
+++ /dev/null
@@ -1,6 +0,0 @@
-DataverseUse testdv1
-Query:
-SELECT ELEMENT [
-FunctionCall testdv1.fun01@0[
-]
-]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.ast
index fc3acc8..c2f1488 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv19/cross-dv19.3.ast
@@ -2,7 +2,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Dataset]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.ast
index 7843472..580a1db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/cross-dv20/cross-dv20.3.ast
@@ -23,22 +23,22 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [student.ugdstd]
   ]
   AS Variable [ Name=$s ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [teacher.prof]
   ]
   AS Variable [ Name=$p ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [student.gdstd]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [teacher.pstdoc]
   ]
   AS Variable [ Name=$b ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.ast
index 01e321b..d159490 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/insert_across_dataverses/insert_across_dataverses.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test2.Customers]
   ]
   AS Variable [ Name=$c ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.ast
index 84b9dcf..b0250e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/cross-dataverse/join_across_dataverses/join_across_dataverses.3.ast
@@ -43,12 +43,12 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test1.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test2.Orders]
   ]
   AS Variable [ Name=$o ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_01/customer_q_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_01/customer_q_01.3.ast
index 8188ad5..10d5e7e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_01/customer_q_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_01/customer_q_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_02/customer_q_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_02/customer_q_02.3.ast
index a439f9d..4f62bcb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_02/customer_q_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_02/customer_q_02.3.ast
@@ -25,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_03/customer_q_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_03/customer_q_03.3.ast
index 49bc6ce..a32db1d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_03/customer_q_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_03/customer_q_03.3.ast
@@ -32,8 +32,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_04/customer_q_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_04/customer_q_04.3.ast
index 3109b22..ed79556 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_04/customer_q_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_04/customer_q_04.3.ast
@@ -33,8 +33,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_05/customer_q_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_05/customer_q_05.3.ast
index f2f701b..8c758d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_05/customer_q_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_05/customer_q_05.3.ast
@@ -25,8 +25,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_06/customer_q_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_06/customer_q_06.3.ast
index 5d80076..0ebf373 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_06/customer_q_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_06/customer_q_06.3.ast
@@ -17,8 +17,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_07/customer_q_07.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_07/customer_q_07.3.ast
index b8e9644..3c8d114 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_07/customer_q_07.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_07/customer_q_07.3.ast
@@ -17,8 +17,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_08/customer_q_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_08/customer_q_08.3.ast
index 6ebc2b9..7ed6f53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_08/customer_q_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/customer_q_08/customer_q_08.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/denorm-cust-order_02/denorm-cust-order_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/denorm-cust-order_02/denorm-cust-order_02.3.ast
index 7af85d1..34dd761 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/denorm-cust-order_02/denorm-cust-order_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/denorm-cust-order_02/denorm-cust-order_02.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$co ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomerOrders2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomerOrders2]
   ]
   AS Variable [ Name=$co ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_01/join_q_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_01/join_q_01.3.ast
index d36f4fb..ce28d08 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_01/join_q_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_01/join_q_01.3.ast
@@ -42,13 +42,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_02/join_q_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_02/join_q_02.3.ast
index e7bcf70..78bd1b1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_02/join_q_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_02/join_q_02.3.ast
@@ -30,13 +30,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_03/join_q_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_03/join_q_03.3.ast
index 239ceac..6653361 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_03/join_q_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_03/join_q_03.3.ast
@@ -62,13 +62,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_04/join_q_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_04/join_q_04.3.ast
index 92d78da..0037524 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_04/join_q_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/join_q_04/join_q_04.3.ast
@@ -20,8 +20,8 @@
         Field=oid
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Orders]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.Orders]
         ]
         AS Variable [ Name=$o ]
       ]
@@ -48,8 +48,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/load-test/load-test.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/load-test/load-test.4.ast
index cd92dce..39b0ad0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/load-test/load-test.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/load-test/load-test.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [c2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.c2]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_01/order_q_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_01/order_q_01.3.ast
index d6b4d05..b78ce24 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_01/order_q_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_01/order_q_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_02/order_q_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_02/order_q_02.3.ast
index 1966962..76eb020 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_02/order_q_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_02/order_q_02.3.ast
@@ -32,8 +32,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_03/order_q_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_03/order_q_03.3.ast
index d844943..9761524 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_03/order_q_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_03/order_q_03.3.ast
@@ -49,8 +49,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_04/order_q_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_04/order_q_04.3.ast
index 755c260..e7fd256 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_04/order_q_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_04/order_q_04.3.ast
@@ -57,8 +57,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_05/order_q_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_05/order_q_05.3.ast
index 3b6ed3d..2682444 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_05/order_q_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_05/order_q_05.3.ast
@@ -54,8 +54,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_06/order_q_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_06/order_q_06.3.ast
index 0221c9d..3aae7c8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_06/order_q_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/custord/order_q_06/order_q_06.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q1/q1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q1/q1.3.ast
index a4005db..4e8ccf9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q1/q1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q1/q1.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [User]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.User]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q2/q2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q2/q2.3.ast
index 03f37bb..968ea0d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q2/q2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dapd/q2/q2.3.ast
@@ -19,8 +19,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Event]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Event]
   ]
   AS Variable [ Name=$event ]
 ,
@@ -51,7 +51,7 @@
       LiteralExpr [LONG] [1]
       ]
       FROM [        Variable [ Name=$es ]
-        AS Variable [ Name=#1 ]
+        AS Variable [ Name=#2 ]
       ]
     )
   ]
@@ -76,7 +76,7 @@
               Field=e
             ]
             ]
-            FROM [              Variable [ Name=#2 ]
+            FROM [              Variable [ Name=#1 ]
               AS Variable [ Name=#3 ]
             ]
           )
@@ -97,7 +97,7 @@
         ]
         Field=chapter_name
       ]
-      GROUP AS Variable [ Name=#2 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         e:=Variable [ Name=$e ]
       )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.ast
index c698b2d..21cb274 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-cltype/create-drop-cltype.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Datatype]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.ast
index c698b2d..21cb274 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/create-drop-opntype/create-drop-opntype.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Datatype]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast
index 38a6ea9..a56f527 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-multi-statement/delete-multi-statement.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-multi-statement/delete-multi-statement.3.ast
index 8968082..af3e18d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-multi-statement/delete-multi-statement.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-multi-statement/delete-multi-statement.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-syntax-change/delete-syntax-change.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-syntax-change/delete-syntax-change.3.ast
index 38a6ea9..a56f527 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-syntax-change/delete-syntax-change.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/delete-syntax-change/delete-syntax-change.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast
index 2bf9eb7..3dd31cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Index]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-index/drop-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-index/drop-index.4.ast
index 6802467..a71546f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-index/drop-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/drop-index/drop-index.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/empty-load-with-index/empty-load-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/empty-load-with-index/empty-load-with-index.3.ast
index d52d730..b3925dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/empty-load-with-index/empty-load-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/empty-load-with-index/empty-load-with-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast
index 4a6c0e4e5f..514247c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset/insert-and-scan-dataset.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset/insert-and-scan-dataset.3.ast
index bb37414..0737a72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset/insert-and-scan-dataset.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-dataset/insert-and-scan-dataset.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [myData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.myData]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-joined-datasets/insert-and-scan-joined-datasets.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-joined-datasets/insert-and-scan-joined-datasets.3.ast
index bb37414..0737a72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-joined-datasets/insert-and-scan-joined-datasets.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-and-scan-joined-datasets/insert-and-scan-joined-datasets.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [myData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.myData]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
index 7553fc3..f9dce7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset/insert-into-empty-dataset.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset/insert-into-empty-dataset.3.ast
index 7553fc3..f9dce7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset/insert-into-empty-dataset.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-empty-dataset/insert-into-empty-dataset.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
index 961abaf..45c5a0e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
index 7553fc3..f9dce7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_01/insert-into-loaded-dataset_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_01/insert-into-loaded-dataset_01.3.ast
index 7553fc3..f9dce7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_01/insert-into-loaded-dataset_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_01/insert-into-loaded-dataset_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_02/insert-into-loaded-dataset_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_02/insert-into-loaded-dataset_02.3.ast
index 7a4233f..10c826c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_02/insert-into-loaded-dataset_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-into-loaded-dataset_02/insert-into-loaded-dataset_02.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$t ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tmp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.tmp]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-src-dst-01/insert-src-dst-01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-src-dst-01/insert-src-dst-01.3.ast
index 660fb7f..d8ef172 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-src-dst-01/insert-src-dst-01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-src-dst-01/insert-src-dst-01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-syntax/insert-syntax.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-syntax/insert-syntax.3.ast
index e739a6d9..b9a1f90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-syntax/insert-syntax.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-syntax/insert-syntax.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_01/insert-with-autogenerated-pk_adm_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_01/insert-with-autogenerated-pk_adm_01.3.ast
index 0482435..9e739f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_01/insert-with-autogenerated-pk_adm_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_01/insert-with-autogenerated-pk_adm_01.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_02/insert-with-autogenerated-pk_adm_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_02/insert-with-autogenerated-pk_adm_02.3.ast
index 0482435..9e739f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_02/insert-with-autogenerated-pk_adm_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_02/insert-with-autogenerated-pk_adm_02.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_03/insert-with-autogenerated-pk_adm_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_03/insert-with-autogenerated-pk_adm_03.3.ast
index c02fa79..9fbfba8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_03/insert-with-autogenerated-pk_adm_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert-with-autogenerated-pk_adm_03/insert-with-autogenerated-pk_adm_03.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert/insert.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert/insert.3.ast
index 4d878f1..2e016b4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert/insert.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert/insert.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert_less_nc/insert_less_nc.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert_less_nc/insert_less_nc.3.ast
index 4d878f1..2e016b4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert_less_nc/insert_less_nc.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/insert_less_nc/insert_less_nc.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_01/load-with-autogenerated-pk_adm_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_01/load-with-autogenerated-pk_adm_01.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_01/load-with-autogenerated-pk_adm_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_01/load-with-autogenerated-pk_adm_01.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_02/load-with-autogenerated-pk_adm_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_02/load-with-autogenerated-pk_adm_01.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_02/load-with-autogenerated-pk_adm_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_02/load-with-autogenerated-pk_adm_01.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_03/load-with-autogenerated-pk_adm_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_03/load-with-autogenerated-pk_adm_03.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_03/load-with-autogenerated-pk_adm_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_03/load-with-autogenerated-pk_adm_03.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_04/load-with-autogenerated-pk_adm_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_04/load-with-autogenerated-pk_adm_04.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_04/load-with-autogenerated-pk_adm_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_adm_04/load-with-autogenerated-pk_adm_04.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_01/load-with-autogenerated-pk_csv_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_01/load-with-autogenerated-pk_csv_01.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_01/load-with-autogenerated-pk_csv_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_01/load-with-autogenerated-pk_csv_01.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_02/load-with-autogenerated-pk_csv_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_02/load-with-autogenerated-pk_csv_02.3.ast
index 71f5bd2..30d57a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_02/load-with-autogenerated-pk_csv_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_csv_02/load-with-autogenerated-pk_csv_02.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_txt_01/load-with-autogenerated-pk_txt_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_txt_01/load-with-autogenerated-pk_txt_01.3.ast
index 165cb7b..0efb991 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_txt_01/load-with-autogenerated-pk_txt_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-autogenerated-pk_txt_01/load-with-autogenerated-pk_txt_01.3.ast
@@ -6,8 +6,8 @@
   Field=title
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index-open/load-with-index-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index-open/load-with-index-open.3.ast
index c26b29e..afd8bf7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index-open/load-with-index-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index-open/load-with-index-open.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItemOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItemOpen]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index/load-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index/load-with-index.3.ast
index ad91508..0a0a6d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index/load-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-index/load-with-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.3.ast
index 857c325..6ddcba2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index-open/load-with-ngram-index-open.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index/load-with-ngram-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index/load-with-ngram-index.3.ast
index a4f5e43..0e4c541 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index/load-with-ngram-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-ngram-index/load-with-ngram-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.3.ast
index 7418fdc4..1485b5e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index-open/load-with-rtree-index-open.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyDataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyDataOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index/load-with-rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index/load-with-rtree-index.3.ast
index f814183..ded6d72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index/load-with-rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-rtree-index/load-with-rtree-index.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.3.ast
index 05ff6d0..3b02994 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index-open/load-with-word-index-open.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index/load-with-word-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index/load-with-word-index.3.ast
index 1795965..a9e83dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index/load-with-word-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/load-with-word-index/load-with-word-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o-recursive/opentype-c2o-recursive.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o-recursive/opentype-c2o-recursive.3.ast
index 5082316..8b98f23 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o-recursive/opentype-c2o-recursive.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o-recursive/opentype-c2o-recursive.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds2]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o/opentype-c2o.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o/opentype-c2o.3.ast
index 5082316..8b98f23 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o/opentype-c2o.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-c2o/opentype-c2o.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds2]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-closed-optional/opentype-closed-optional.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-closed-optional/opentype-closed-optional.3.ast
index e739a6d9..b9a1f90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-closed-optional/opentype-closed-optional.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-closed-optional/opentype-closed-optional.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert/opentype-insert.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert/opentype-insert.3.ast
index 28f0e23..cd4af34 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert/opentype-insert.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert/opentype-insert.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert2/opentype-insert2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert2/opentype-insert2.3.ast
index 00bab71..fd5aae5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert2/opentype-insert2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-insert2/opentype-insert2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-noexpand/opentype-noexpand.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-noexpand/opentype-noexpand.3.ast
index e739a6d9..b9a1f90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-noexpand/opentype-noexpand.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-noexpand/opentype-noexpand.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c-recursive/opentype-o2c-recursive.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c-recursive/opentype-o2c-recursive.3.ast
index 5082316..8b98f23 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c-recursive/opentype-o2c-recursive.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c-recursive/opentype-o2c-recursive.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds2]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c/opentype-o2c.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c/opentype-o2c.3.ast
index 5082316..8b98f23 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c/opentype-o2c.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2c/opentype-o2c.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds2]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2o/opentype-o2o.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2o/opentype-o2o.3.ast
index 5082316..8b98f23 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2o/opentype-o2o.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/opentype-o2o/opentype-o2o.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds2]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue205/query-issue205.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue205/query-issue205.3.ast
index ef7410a..3d35d4e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue205/query-issue205.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue205/query-issue205.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Employees]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Employees]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue288/query-issue288.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue288/query-issue288.5.ast
index c812590..94758d0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue288/query-issue288.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue288/query-issue288.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineID2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineID2]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue382/query-issue382.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue382/query-issue382.3.ast
index 7861c35..8516e3d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue382/query-issue382.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue382/query-issue382.3.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$h ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [HandbookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [SocialNetworkData.HandbookUsers]
       ]
       AS Variable [ Name=$h ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue433/query-issue433.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue433/query-issue433.3.ast
index 76f5ca2..e82208f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue433/query-issue433.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/query-issue433/query-issue433.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [myDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [insertIssue.myDataset]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
index c6ad91b..ccddfc4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.5.ast
index 0001d01..3c04a74 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-btree-secondary-index-open/scan-delete-btree-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomersOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomersOpen]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
index a4f5e43..0e4c541 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.5.ast
index 857c325..6ddcba2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index-open/scan-delete-inverted-index-ngram-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
index a4f5e43..0e4c541 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
index 1795965..a9e83dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.5.ast
index 05ff6d0..3b02994 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index-open/scan-delete-inverted-index-word-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
index 1795965..a9e83dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
index f814183..ded6d72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.5.ast
index 7418fdc4..1485b5e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index-open/scan-delete-rtree-secondary-index-open.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyDataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyDataOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
index f814183..ded6d72 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
index cb88c12..d03eebe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomersMini]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomersMini]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-open/scan-insert-btree-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-open/scan-insert-btree-secondary-index-open.5.ast
index 0001d01..3c04a74 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-open/scan-insert-btree-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-btree-secondary-index-open/scan-insert-btree-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomersOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomersOpen]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
index ea6fcbe..8e5ec0b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP1]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-open/scan-insert-inverted-index-ngram-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-open/scan-insert-inverted-index-ngram-secondary-index-open.5.ast
index 857c325..6ddcba2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-open/scan-insert-inverted-index-ngram-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index-open/scan-insert-inverted-index-ngram-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
index ea6fcbe..8e5ec0b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP1]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
index 30b0e34..2a11645 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP1]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-open/scan-insert-inverted-index-word-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-open/scan-insert-inverted-index-word-secondary-index-open.5.ast
index 05ff6d0..3b02994 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-open/scan-insert-inverted-index-word-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index-open/scan-insert-inverted-index-word-secondary-index-open.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
index 30b0e34..2a11645 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP1]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
index bc7ec93..a3863e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyMiniData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-open/scan-insert-rtree-secondary-index-open.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-open/scan-insert-rtree-secondary-index-open.5.ast
index 9451ea3..a3ab36b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-open/scan-insert-rtree-secondary-index-open.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index-open/scan-insert-rtree-secondary-index-open.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyOpenData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyOpenData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
index bc7ec93..a3863e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyMiniData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-constant-merge-policy/using-constant-merge-policy.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-correlated-prefix-merge-policy/using-correlated-prefix-merge-policy.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-no-merge-policy/using-no-merge-policy.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.5.ast
index 89cac37..5222162 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/dml/using-prefix-merge-policy/using-prefix-merge-policy.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_01/q_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_01/q_01.3.ast
index 0718a9d..de43ae2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_01/q_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_01/q_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$e ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Emp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Emp]
   ]
   AS Variable [ Name=$e ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_02/q_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_02/q_02.3.ast
index 0e5b3d9..43344eb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_02/q_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/employee/q_02/q_02.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Emp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Emp]
   ]
   AS Variable [ Name=$e ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
index 927f192..5d4c69d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -66,8 +66,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin/leftouterjoin.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin/leftouterjoin.3.ast
index 016d582..caf47d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin/leftouterjoin.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/leftouterjoin/leftouterjoin.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -70,8 +70,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rc-format/rc-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rc-format/rc-format.3.ast
index ed64b71..3ac8a2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rc-format/rc-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rc-format/rc-format.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [EmployeeDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.EmployeeDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rtree-index/rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rtree-index/rtree-index.3.ast
index 7c356c1..2f985dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rtree-index/rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/rtree-index/rtree-index.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/sequence-format/sequence-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/sequence-format/sequence-format.3.ast
index ed64b71..3ac8a2a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/sequence-format/sequence-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/sequence-format/sequence-format.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [EmployeeDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.EmployeeDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/text-format/text-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/text-format/text-format.3.ast
index e5649c0..3432273 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/text-format/text-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/external-indexing/text-format/text-format.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$emp ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [EmployeeDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.EmployeeDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/equality-predicate/equality-predicate.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/equality-predicate/equality-predicate.5.ast
index d23ef11..e0501fd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/equality-predicate/equality-predicate.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/equality-predicate/equality-predicate.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-btree/insert-with-secondary-btree.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-btree/insert-with-secondary-btree.5.ast
index 0a178d8..8bc514e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-btree/insert-with-secondary-btree.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-btree/insert-with-secondary-btree.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages2]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-ngram/insert-with-secondary-inverted-ngram.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-ngram/insert-with-secondary-inverted-ngram.5.ast
index 55a463c..8257da4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-ngram/insert-with-secondary-inverted-ngram.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-ngram/insert-with-secondary-inverted-ngram.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-word/insert-with-secondary-inverted-word.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-word/insert-with-secondary-inverted-word.5.ast
index 6d330a8..e60853f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-word/insert-with-secondary-inverted-word.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-inverted-word/insert-with-secondary-inverted-word.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-rtree/insert-with-secondary-rtree.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-rtree/insert-with-secondary-rtree.5.ast
index b83a453..71e9ac4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-rtree/insert-with-secondary-rtree.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert-with-secondary-rtree/insert-with-secondary-rtree.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert/insert.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert/insert.5.ast
index 286161b..18f08db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert/insert.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/insert/insert.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages2]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-btree/load-with-secondary-btree.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-btree/load-with-secondary-btree.5.ast
index 60a0e7b..5b83358 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-btree/load-with-secondary-btree.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-btree/load-with-secondary-btree.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-ngram/load-with-secondary-inverted-ngram.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-ngram/load-with-secondary-inverted-ngram.5.ast
index 55a463c..8257da4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-ngram/load-with-secondary-inverted-ngram.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-ngram/load-with-secondary-inverted-ngram.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-word/load-with-secondary-inverted-word.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-word/load-with-secondary-inverted-word.5.ast
index 6d330a8..e60853f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-word/load-with-secondary-inverted-word.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-inverted-word/load-with-secondary-inverted-word.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.5.ast
index b83a453..71e9ac4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.6.ast
index 1d51f60..af827a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load-with-secondary-rtree/load-with-secondary-rtree.6.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load/load.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load/load.5.ast
index d2ac504..2c74e63 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load/load.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/filters/load/load.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$m ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at01/at01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at01/at01.3.ast
index 04f0c6d..c011f5f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at01/at01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at01/at01.3.ast
@@ -29,8 +29,8 @@
     SELECT ELEMENT [
     Variable [ Name=$fb ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.FacebookUsers]
       ]
       AS Variable [ Name=$fb ]
     ]
@@ -43,6 +43,6 @@
 
   )
   AS Variable [ Name=$i ]
- AT 
+ AT
 Variable [ Name=$p ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at02/at02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at02/at02.3.ast
index e97fefb..5e0ed3d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at02/at02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at02/at02.3.ast
@@ -50,20 +50,20 @@
 
         )
         AS Variable [ Name=$a ]
- AT 
+ AT
 Variable [ Name=$p ]
       ]
     )
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookUsers]
   ]
   AS Variable [ Name=$u ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.FacebookMessages]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at03/at03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at03/at03.3.ast
index 78388da..79623e5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at03/at03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at03/at03.3.ast
@@ -50,7 +50,7 @@
 
         )
         AS Variable [ Name=$f ]
- AT 
+ AT
 Variable [ Name=$ip ]
       ]
     )
@@ -61,8 +61,8 @@
     SELECT ELEMENT [
     Variable [ Name=$fb ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.FacebookUsers]
       ]
       AS Variable [ Name=$fb ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at04/at04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at04/at04.3.ast
index e99b1b6..fc13694 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at04/at04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at04/at04.3.ast
@@ -50,7 +50,7 @@
 
         )
         AS Variable [ Name=$f ]
- AT 
+ AT
 Variable [ Name=$ip ]
       ]
     )
@@ -61,8 +61,8 @@
     SELECT ELEMENT [
     Variable [ Name=$o ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Orders]
       ]
       AS Variable [ Name=$o ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at05/at05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at05/at05.3.ast
index 33ebf91..e3a55b0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at05/at05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at05/at05.3.ast
@@ -33,8 +33,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Orders]
       ]
       AS Variable [ Name=$x ]
     ]
@@ -106,7 +106,7 @@
 
           )
           AS Variable [ Name=$y ]
- AT 
+ AT
 Variable [ Name=$i ]
         ]
       )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
index 11063f7..4748a29 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/flwor/at06/at06.3.ast
@@ -54,19 +54,12 @@
       (
         LiteralExpr [STRING] [partkey]
         :
-        FieldAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [i]
-            Variable [ Name=$g ]
-            Variable [ Name=$l_partkey ]
-          ]
-          Field=l_partkey
-        ]
+        Variable [ Name=$l_partkey ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.LineItem]
       ]
       AS Variable [ Name=$i ]
     ]
@@ -109,7 +102,7 @@
 
   )
   AS Variable [ Name=$j ]
- AT 
+ AT
 Variable [ Name=$p ]
 ]
 Where
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_1/dblp-1_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_1/dblp-1_1.3.ast
index c7de79e..6a37de6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_1/dblp-1_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_1/dblp-1_1.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tokenGroupped ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1.1/dblp-1_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1.1/dblp-1_2.3.ast
index fd84015..95fc8fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1.1/dblp-1_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1.1/dblp-1_2.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tokenGroupped ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
@@ -31,19 +31,16 @@
   (
     paper:=Variable [ Name=$paper ]
     token:=Variable [ Name=$token ]
+    id:=Variable [ Name=$id ]
   )
 
 Orderby
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [id]
-        Variable [ Name=$token ]
-        Variable [ Name=$paper ]
-        Variable [ Name=$tokenGroupped ]
-        Variable [ Name=#1 ]
+      FieldAccessor [
         Variable [ Name=#2 ]
+        Field=id
       ]
       ]
       FROM [        Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1/dblp-1_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1/dblp-1_2.3.ast
index fd84015..95fc8fb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1/dblp-1_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2.1/dblp-1_2.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tokenGroupped ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
@@ -31,19 +31,16 @@
   (
     paper:=Variable [ Name=$paper ]
     token:=Variable [ Name=$token ]
+    id:=Variable [ Name=$id ]
   )
 
 Orderby
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [id]
-        Variable [ Name=$token ]
-        Variable [ Name=$paper ]
-        Variable [ Name=$tokenGroupped ]
-        Variable [ Name=#1 ]
+      FieldAccessor [
         Variable [ Name=#2 ]
+        Field=id
       ]
       ]
       FROM [        Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2/dblp-1_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2/dblp-1_2.3.ast
index e1dceff..934a36e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2/dblp-1_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-1_2/dblp-1_2.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tokenGroupped ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
@@ -31,19 +31,16 @@
   (
     paper:=Variable [ Name=$paper ]
     token:=Variable [ Name=$token ]
+    paperid:=Variable [ Name=$paperid ]
   )
 
 Orderby
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [paperid]
-        Variable [ Name=$token ]
-        Variable [ Name=$paper ]
-        Variable [ Name=$tokenGroupped ]
-        Variable [ Name=#1 ]
+      FieldAccessor [
         Variable [ Name=#2 ]
+        Field=paperid
       ]
       ]
       FROM [        Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.1_5.3.1/dblp-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.1_5.3.1/dblp-2.3.ast
index 75bbdb2..63c83d4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.1_5.3.1/dblp-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.1_5.3.1/dblp-2.3.ast
@@ -20,21 +20,19 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [lenDBLP]
-        Variable [ Name=$paperDBLP ]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.lenDBLP]
       ]
       LiteralExpr [FLOAT] [0.5]
     ]
@@ -73,8 +71,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -100,25 +98,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.2/dblp-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.2/dblp-2.3.ast
index 939f281..a3f4e26 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.2/dblp-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2.2/dblp-2.3.ast
@@ -20,22 +20,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -74,8 +72,8 @@
     FROM [      Variable [ Name=$tokensUnrankedDBLP ]
       AS Variable [ Name=$tokenUnranked ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TOKENSRANKEDADM]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.TOKENSRANKEDADM]
       ]
       AS Variable [ Name=$tokenRanked ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_1/dblp-2_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_1/dblp-2_1.3.ast
index d0f1d48..9a6bf41 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_1/dblp-2_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_1/dblp-2_1.3.ast
@@ -18,8 +18,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -41,8 +41,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_2/dblp-2_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_2/dblp-2_2.3.ast
index fd432c3..464b8aa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_2/dblp-2_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_2/dblp-2_2.3.ast
@@ -18,8 +18,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -41,8 +41,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -68,21 +68,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$token ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_3/dblp-2_3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_3/dblp-2_3.3.ast
index db9a73c..1e7cafa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_3/dblp-2_3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_3/dblp-2_3.3.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -44,8 +44,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -71,22 +71,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$token ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_4/dblp-2_4.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_4/dblp-2_4.3.ast
index b132778..1689261 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_4/dblp-2_4.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_4/dblp-2_4.3.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -47,8 +47,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -74,23 +74,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.1/dblp-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.1/dblp-2_5.3.ast
index daa4c54..a2babd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.1/dblp-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.1/dblp-2_5.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -84,24 +84,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.2/dblp-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.2/dblp-2_5.3.ast
index daa4c54..a2babd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.2/dblp-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.2/dblp-2_5.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -84,24 +84,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3.1/dblp-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3.1/dblp-2_5.3.ast
index daa4c54..a2babd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3.1/dblp-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3.1/dblp-2_5.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -84,24 +84,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3/dblp-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3/dblp-2_5.3.ast
index daa4c54..a2babd9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3/dblp-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5.3/dblp-2_5.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -84,24 +84,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5/dblp-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5/dblp-2_5.3.ast
index 01a66e5..6304774 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5/dblp-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-2_5/dblp-2_5.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ]
@@ -57,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -84,24 +84,16 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
+              FieldAccessor [
                 Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.3.ast
index 17eeb99..959f69a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.1/dblp-3_1.3.ast
@@ -40,65 +40,44 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=#5 ]
-            Variable [ Name=$lenLeft ]
-            Variable [ Name=$idLeft ]
-            Variable [ Name=$lenRight ]
-            Variable [ Name=$tokensLeft ]
-            Variable [ Name=$prefixTokenRight ]
-            Variable [ Name=$tokensRight ]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$idRight ]
-            Variable [ Name=$prefixTokenLeft ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperLeft ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensLeft]
-          Variable [ Name=$paperLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensLeft]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenLeft]
-            Variable [ Name=$paperLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenLeft]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
       ]
       AS Variable [ Name=$prefixTokenLeft ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperRight ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensRight]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
-          Variable [ Name=$prefixTokenLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensRight]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenRight]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$prefixTokenLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenRight]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
@@ -133,8 +112,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -150,7 +129,7 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
@@ -161,12 +140,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#2 ]
+                    Variable [ Name=#4 ]
                     Field=paper
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -218,8 +197,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -246,12 +225,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#4 ]
+                    Variable [ Name=#5 ]
                     Field=paper
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -326,24 +305,32 @@
         Variable [ Name=$paperRight ]
         Field=id
       ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperLeft:=Variable [ Name=$paperLeft ]
         prefixTokenLeft:=Variable [ Name=$prefixTokenLeft ]
         paperRight:=Variable [ Name=$paperRight ]
         prefixTokenRight:=Variable [ Name=$prefixTokenRight ]
+        lenLeft:=Variable [ Name=$lenLeft ]
+        tokensLeft:=Variable [ Name=$tokensLeft ]
+        lenRight:=Variable [ Name=$lenRight ]
+        tokensRight:=Variable [ Name=$tokensRight ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperLeft ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperRight ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.3.ast
index 17eeb99..959f69a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1.2/dblp-3_1.3.ast
@@ -40,65 +40,44 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=#5 ]
-            Variable [ Name=$lenLeft ]
-            Variable [ Name=$idLeft ]
-            Variable [ Name=$lenRight ]
-            Variable [ Name=$tokensLeft ]
-            Variable [ Name=$prefixTokenRight ]
-            Variable [ Name=$tokensRight ]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$idRight ]
-            Variable [ Name=$prefixTokenLeft ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperLeft ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensLeft]
-          Variable [ Name=$paperLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensLeft]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenLeft]
-            Variable [ Name=$paperLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenLeft]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
       ]
       AS Variable [ Name=$prefixTokenLeft ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperRight ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensRight]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
-          Variable [ Name=$prefixTokenLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensRight]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenRight]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$prefixTokenLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenRight]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
@@ -133,8 +112,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -150,7 +129,7 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
@@ -161,12 +140,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#2 ]
+                    Variable [ Name=#4 ]
                     Field=paper
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -218,8 +197,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -246,12 +225,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#4 ]
+                    Variable [ Name=#5 ]
                     Field=paper
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -326,24 +305,32 @@
         Variable [ Name=$paperRight ]
         Field=id
       ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperLeft:=Variable [ Name=$paperLeft ]
         prefixTokenLeft:=Variable [ Name=$prefixTokenLeft ]
         paperRight:=Variable [ Name=$paperRight ]
         prefixTokenRight:=Variable [ Name=$prefixTokenRight ]
+        lenLeft:=Variable [ Name=$lenLeft ]
+        tokensLeft:=Variable [ Name=$tokensLeft ]
+        lenRight:=Variable [ Name=$lenRight ]
+        tokensRight:=Variable [ Name=$tokensRight ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperLeft ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperRight ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.ast
index bed4f76..ba90fec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-3_1/dblp-3_1.3.ast
@@ -23,13 +23,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperLeft ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperRight ]
 ,
@@ -50,67 +50,44 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=#5 ]
-            Variable [ Name=$lenLeft ]
-            Variable [ Name=$idLeft ]
-            Variable [ Name=$lenRight ]
-            Variable [ Name=$tokensLeft ]
-            Variable [ Name=$prefixTokenRight ]
-            Variable [ Name=$tokensRight ]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$idRight ]
-            Variable [ Name=$prefixTokenLeft ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperLeft ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensLeft]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensLeft]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenLeft]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenLeft]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
       ]
       AS Variable [ Name=$prefixTokenLeft ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperRight ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensRight]
-          Variable [ Name=$paperLeft ]
-          Variable [ Name=$paperRight ]
-          Variable [ Name=$prefixTokenLeft ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensRight]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lenRight]
-            Variable [ Name=$paperLeft ]
-            Variable [ Name=$paperRight ]
-            Variable [ Name=$prefixTokenLeft ]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.lenRight]
           ]
           LiteralExpr [FLOAT] [0.5]
         ]
@@ -145,8 +122,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -162,7 +139,7 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
@@ -173,12 +150,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#2 ]
+                    Variable [ Name=#4 ]
                     Field=paper
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -230,8 +207,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -258,12 +235,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#4 ]
+                    Variable [ Name=#5 ]
                     Field=paper
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -338,12 +315,20 @@
         Variable [ Name=$paperRight ]
         Field=id
       ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperLeft:=Variable [ Name=$paperLeft ]
         prefixTokenLeft:=Variable [ Name=$prefixTokenLeft ]
         paperRight:=Variable [ Name=$paperRight ]
         prefixTokenRight:=Variable [ Name=$prefixTokenRight ]
+        lenLeft:=Variable [ Name=$lenLeft ]
+        tokensLeft:=Variable [ Name=$tokensLeft ]
+        lenRight:=Variable [ Name=$lenRight ]
+        tokensRight:=Variable [ Name=$tokensRight ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_1/dblp-aqlplus_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_1/dblp-aqlplus_1.3.ast
index 175ec78..4c1fd0e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_1/dblp-aqlplus_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_1/dblp-aqlplus_1.3.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_2/dblp-aqlplus_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_2/dblp-aqlplus_2.3.ast
index 6afb337..8ee0639 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_2/dblp-aqlplus_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-aqlplus_2/dblp-aqlplus_2.3.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_1/dblp-csx-2_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_1/dblp-csx-2_1.3.ast
index 8bca6c2..201405b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_1/dblp-csx-2_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_1/dblp-csx-2_1.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -91,8 +83,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -108,7 +100,7 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
@@ -119,12 +111,12 @@
             (
               SELECT ELEMENT [
               FieldAccessor [
-                Variable [ Name=#2 ]
+                Variable [ Name=#4 ]
                 Field=paper
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -166,8 +158,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -194,12 +186,12 @@
             (
               SELECT ELEMENT [
               FieldAccessor [
-                Variable [ Name=#4 ]
+                Variable [ Name=#5 ]
                 Field=paper
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -277,12 +269,15 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_2/dblp-csx-2_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_2/dblp-csx-2_2.3.ast
index 39e3ad0..bc3e7bd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_2/dblp-csx-2_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_2/dblp-csx-2_2.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -91,8 +83,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -114,32 +106,24 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$paperCSX ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -181,8 +165,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -208,29 +192,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$paperCSX ]
-                Variable [ Name=#3 ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -308,12 +283,15 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_3/dblp-csx-2_3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_3/dblp-csx-2_3.3.ast
index 6a46c78..9820085 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_3/dblp-csx-2_3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_3/dblp-csx-2_3.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -97,8 +89,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -120,33 +112,24 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$paperCSX ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -194,8 +177,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -221,31 +204,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -317,12 +289,17 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_4/dblp-csx-2_4.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_4/dblp-csx-2_4.3.ast
index 1d1c7b3..b426df7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_4/dblp-csx-2_4.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_4/dblp-csx-2_4.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -100,8 +92,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -123,34 +115,24 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$paperCSX ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -201,8 +183,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -228,33 +210,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -316,12 +285,19 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.3.ast
index 2922b08..2fcb5cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.1/dblp-csx-2_5.3.ast
@@ -17,43 +17,26 @@
     LiteralExpr [STRING] [sim]
     :
     IndexAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [sim]
-        Variable [ Name=$lenDBLP ]
-        Variable [ Name=$tokensUnrankedDBLP ]
-        Variable [ Name=$tokensDBLP ]
-        Variable [ Name=$idCSX ]
-        Variable [ Name=$idDBLP ]
-        Variable [ Name=$prefixTokenCSX ]
-        Variable [ Name=#5 ]
-        Variable [ Name=$tokensUnrankedCSX ]
-        Variable [ Name=$prefixTokenDBLP ]
-        Variable [ Name=$lenCSX ]
-        Variable [ Name=$tokensCSX ]
-        Variable [ Name=$paperDBLP ]
-        Variable [ Name=$paperCSX ]
-      ]
+      Variable [ Name=$sim ]
       Index:       LiteralExpr [LONG] [0]
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -61,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -120,8 +97,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -143,35 +120,24 @@
           Variable [ Name=$tokenGrouped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -227,8 +193,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -254,35 +220,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -337,12 +288,24 @@
   Variable [ Name=$idCSX ]
   :=
   Variable [ Name=$idCSX ]
-  GROUP AS Variable [ Name=#5 ]
+  Variable [ Name=$sim ]
+  :=
+  Variable [ Name=$sim ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    lenDBLP:=Variable [ Name=$lenDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    lenCSX:=Variable [ Name=$lenCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.3.ast
index 2922b08..2fcb5cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.2/dblp-csx-2_5.3.ast
@@ -17,43 +17,26 @@
     LiteralExpr [STRING] [sim]
     :
     IndexAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [sim]
-        Variable [ Name=$lenDBLP ]
-        Variable [ Name=$tokensUnrankedDBLP ]
-        Variable [ Name=$tokensDBLP ]
-        Variable [ Name=$idCSX ]
-        Variable [ Name=$idDBLP ]
-        Variable [ Name=$prefixTokenCSX ]
-        Variable [ Name=#5 ]
-        Variable [ Name=$tokensUnrankedCSX ]
-        Variable [ Name=$prefixTokenDBLP ]
-        Variable [ Name=$lenCSX ]
-        Variable [ Name=$tokensCSX ]
-        Variable [ Name=$paperDBLP ]
-        Variable [ Name=$paperCSX ]
-      ]
+      Variable [ Name=$sim ]
       Index:       LiteralExpr [LONG] [0]
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -61,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -120,8 +97,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -143,35 +120,24 @@
           Variable [ Name=$tokenGrouped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -227,8 +193,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -254,35 +220,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -337,12 +288,24 @@
   Variable [ Name=$idCSX ]
   :=
   Variable [ Name=$idCSX ]
-  GROUP AS Variable [ Name=#5 ]
+  Variable [ Name=$sim ]
+  :=
+  Variable [ Name=$sim ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    lenDBLP:=Variable [ Name=$lenDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    lenCSX:=Variable [ Name=$lenCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3.1/dblp-csx-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3.1/dblp-csx-2_5.3.ast
index bef1d14..8aa7d18 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3.1/dblp-csx-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3.1/dblp-csx-2_5.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -105,8 +97,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -128,35 +120,24 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -212,8 +193,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -239,35 +220,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -325,12 +291,21 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    lenDBLP:=Variable [ Name=$lenDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    lenCSX:=Variable [ Name=$lenCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.ast
index 2922b08..2fcb5cd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5.3/dblp-csx-2_5.3.ast
@@ -17,43 +17,26 @@
     LiteralExpr [STRING] [sim]
     :
     IndexAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [sim]
-        Variable [ Name=$lenDBLP ]
-        Variable [ Name=$tokensUnrankedDBLP ]
-        Variable [ Name=$tokensDBLP ]
-        Variable [ Name=$idCSX ]
-        Variable [ Name=$idDBLP ]
-        Variable [ Name=$prefixTokenCSX ]
-        Variable [ Name=#5 ]
-        Variable [ Name=$tokensUnrankedCSX ]
-        Variable [ Name=$prefixTokenDBLP ]
-        Variable [ Name=$lenCSX ]
-        Variable [ Name=$tokensCSX ]
-        Variable [ Name=$paperDBLP ]
-        Variable [ Name=$paperCSX ]
-      ]
+      Variable [ Name=$sim ]
       Index:       LiteralExpr [LONG] [0]
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -61,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -120,8 +97,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -143,35 +120,24 @@
           Variable [ Name=$tokenGrouped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -227,8 +193,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGrouped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -254,35 +220,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGrouped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -337,12 +288,24 @@
   Variable [ Name=$idCSX ]
   :=
   Variable [ Name=$idCSX ]
-  GROUP AS Variable [ Name=#5 ]
+  Variable [ Name=$sim ]
+  :=
+  Variable [ Name=$sim ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    lenDBLP:=Variable [ Name=$lenDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    lenCSX:=Variable [ Name=$lenCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5/dblp-csx-2_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5/dblp-csx-2_5.3.ast
index bef1d14..8aa7d18 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5/dblp-csx-2_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-2_5/dblp-csx-2_5.3.ast
@@ -23,22 +23,20 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensDBLP]
-      Variable [ Name=$paperDBLP ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -46,26 +44,20 @@
   ]
   AS Variable [ Name=$prefixTokenDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
   FunctionCall fuzzyjoin.subset-collection@3[
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [tokensCSX]
-      Variable [ Name=$prefixTokenDBLP ]
-      Variable [ Name=$paperDBLP ]
-      Variable [ Name=$paperCSX ]
+    FunctionCall asterix.dataset@1[
+      LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
     ]
     LiteralExpr [LONG] [0]
     FunctionCall fuzzyjoin.prefix-len-jaccard@2[
       FunctionCall fuzzyjoin.len@1[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
       ]
       LiteralExpr [FLOAT] [0.5]
@@ -105,8 +97,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -128,35 +120,24 @@
           Variable [ Name=$tokenGroupped ]
           :=
           Variable [ Name=$token ]
-          GROUP AS Variable [ Name=#1 ]
+          GROUP AS Variable [ Name=#2 ]
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=#1 ]
-                Variable [ Name=#2 ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#4 ]
+                Field=id
               ]
               ]
-              FROM [                Variable [ Name=#1 ]
-                AS Variable [ Name=#2 ]
+              FROM [                Variable [ Name=#2 ]
+                AS Variable [ Name=#4 ]
               ]
             )
           ]
@@ -212,8 +193,8 @@
         SELECT ELEMENT [
         Variable [ Name=$tokenGroupped ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paper ]
 ,
@@ -239,35 +220,20 @@
           (
             paper:=Variable [ Name=$paper ]
             token:=Variable [ Name=$token ]
+            id:=Variable [ Name=$id ]
           )
 
         Orderby
           FunctionCall asterix.sql-count@1[
             (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [id]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$paper ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$tokenUnranked ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=#3 ]
-                Variable [ Name=#4 ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=$token ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$tokenGroupped ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
+              FieldAccessor [
+                Variable [ Name=#5 ]
+                Field=id
               ]
               ]
               FROM [                Variable [ Name=#3 ]
-                AS Variable [ Name=#4 ]
+                AS Variable [ Name=#5 ]
               ]
             )
           ]
@@ -325,12 +291,21 @@
   Variable [ Name=$sim ]
   :=
   Variable [ Name=$sim ]
-  GROUP AS Variable [ Name=#5 ]
+  GROUP AS Variable [ Name=#1 ]
   (
     paperDBLP:=Variable [ Name=$paperDBLP ]
     prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
     paperCSX:=Variable [ Name=$paperCSX ]
     prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+    idDBLP:=Variable [ Name=$idDBLP ]
+    tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+    lenDBLP:=Variable [ Name=$lenDBLP ]
+    tokensDBLP:=Variable [ Name=$tokensDBLP ]
+    idCSX:=Variable [ Name=$idCSX ]
+    tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+    lenCSX:=Variable [ Name=$lenCSX ]
+    tokensCSX:=Variable [ Name=$tokensCSX ]
+    sim:=Variable [ Name=$sim ]
   )
 
 Orderby
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_1/dblp-csx-3_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_1/dblp-csx-3_1.3.ast
index a37d367..38fff8c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_1/dblp-csx-3_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_1/dblp-csx-3_1.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -114,8 +106,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -131,7 +123,7 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
@@ -142,12 +134,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#2 ]
+                    Variable [ Name=#4 ]
                     Field=paper
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -189,8 +181,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -217,12 +209,12 @@
                 (
                   SELECT ELEMENT [
                   FieldAccessor [
-                    Variable [ Name=#4 ]
+                    Variable [ Name=#5 ]
                     Field=paper
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -300,24 +292,27 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_2/dblp-csx-3_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_2/dblp-csx-3_2.3.ast
index 052f7c0..49eedfd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_2/dblp-csx-3_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_2/dblp-csx-3_2.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -114,8 +106,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -137,32 +129,24 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$paperCSX ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -204,8 +188,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -231,29 +215,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$paperCSX ]
-                    Variable [ Name=#3 ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -331,24 +306,27 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_3/dblp-csx-3_3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_3/dblp-csx-3_3.3.ast
index 09a2efd..22069a1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_3/dblp-csx-3_3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_3/dblp-csx-3_3.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -120,8 +112,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -143,33 +135,24 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$paperCSX ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -217,8 +200,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -244,31 +227,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -340,24 +312,29 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_4/dblp-csx-3_4.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_4/dblp-csx-3_4.3.ast
index ed021c3..7d61632 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_4/dblp-csx-3_4.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_4/dblp-csx-3_4.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -123,8 +115,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -146,34 +138,24 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$paperCSX ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -224,8 +206,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -251,33 +233,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -339,24 +308,31 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.3.ast
index ae318cc..99ef2b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.1/dblp-csx-3_5.3.ast
@@ -40,43 +40,26 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=$lenDBLP ]
-            Variable [ Name=$tokensUnrankedDBLP ]
-            Variable [ Name=$tokensDBLP ]
-            Variable [ Name=$idCSX ]
-            Variable [ Name=$idDBLP ]
-            Variable [ Name=$prefixTokenCSX ]
-            Variable [ Name=#5 ]
-            Variable [ Name=$tokensUnrankedCSX ]
-            Variable [ Name=$prefixTokenDBLP ]
-            Variable [ Name=$lenCSX ]
-            Variable [ Name=$tokensCSX ]
-            Variable [ Name=$paperDBLP ]
-            Variable [ Name=$paperCSX ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -84,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -143,8 +120,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -166,35 +143,24 @@
               Variable [ Name=$tokenGrouped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -250,8 +216,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -277,35 +243,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$lenCSX ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -360,24 +311,36 @@
       Variable [ Name=$idCSX ]
       :=
       Variable [ Name=$idCSX ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        lenDBLP:=Variable [ Name=$lenDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        lenCSX:=Variable [ Name=$lenCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.3.ast
index ae318cc..99ef2b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.2/dblp-csx-3_5.3.ast
@@ -40,43 +40,26 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=$lenDBLP ]
-            Variable [ Name=$tokensUnrankedDBLP ]
-            Variable [ Name=$tokensDBLP ]
-            Variable [ Name=$idCSX ]
-            Variable [ Name=$idDBLP ]
-            Variable [ Name=$prefixTokenCSX ]
-            Variable [ Name=#5 ]
-            Variable [ Name=$tokensUnrankedCSX ]
-            Variable [ Name=$prefixTokenDBLP ]
-            Variable [ Name=$lenCSX ]
-            Variable [ Name=$tokensCSX ]
-            Variable [ Name=$paperDBLP ]
-            Variable [ Name=$paperCSX ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -84,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -143,8 +120,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -166,35 +143,24 @@
               Variable [ Name=$tokenGrouped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -250,8 +216,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -277,35 +243,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$lenCSX ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -360,24 +311,36 @@
       Variable [ Name=$idCSX ]
       :=
       Variable [ Name=$idCSX ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        lenDBLP:=Variable [ Name=$lenDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        lenCSX:=Variable [ Name=$lenCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.ast
index ae318cc..99ef2b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3.1/dblp-csx-3_5.3.ast
@@ -40,43 +40,26 @@
         LiteralExpr [STRING] [sim]
         :
         IndexAccessor [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [sim]
-            Variable [ Name=$lenDBLP ]
-            Variable [ Name=$tokensUnrankedDBLP ]
-            Variable [ Name=$tokensDBLP ]
-            Variable [ Name=$idCSX ]
-            Variable [ Name=$idDBLP ]
-            Variable [ Name=$prefixTokenCSX ]
-            Variable [ Name=#5 ]
-            Variable [ Name=$tokensUnrankedCSX ]
-            Variable [ Name=$prefixTokenDBLP ]
-            Variable [ Name=$lenCSX ]
-            Variable [ Name=$tokensCSX ]
-            Variable [ Name=$paperDBLP ]
-            Variable [ Name=$paperCSX ]
-          ]
+          Variable [ Name=$sim ]
           Index:           LiteralExpr [LONG] [0]
         ]
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -84,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -143,8 +120,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -166,35 +143,24 @@
               Variable [ Name=$tokenGrouped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -250,8 +216,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGrouped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -277,35 +243,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGrouped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$lenCSX ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -360,24 +311,36 @@
       Variable [ Name=$idCSX ]
       :=
       Variable [ Name=$idCSX ]
-      GROUP AS Variable [ Name=#5 ]
+      Variable [ Name=$sim ]
+      :=
+      Variable [ Name=$sim ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        lenDBLP:=Variable [ Name=$lenDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        lenCSX:=Variable [ Name=$lenCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3/dblp-csx-3_5.3.ast
index fadf81a..99399d76 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.3/dblp-csx-3_5.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -128,8 +120,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -151,35 +143,24 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -235,8 +216,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -262,35 +243,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$lenCSX ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -348,24 +314,33 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        lenDBLP:=Variable [ Name=$lenDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        lenCSX:=Variable [ Name=$lenCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.3.ast
index d498017..606edd0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4.1/dblp-csx-3_5.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
@@ -65,8 +65,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
@@ -87,45 +87,26 @@
             LiteralExpr [STRING] [sim]
             :
             IndexAccessor [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [sim]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=#5 ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$tokensCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
-              ]
+              Variable [ Name=$sim ]
               Index:               LiteralExpr [LONG] [0]
             ]
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paperDBLP ]
 ,
           FunctionCall fuzzyjoin.subset-collection@3[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
             LiteralExpr [LONG] [0]
             FunctionCall fuzzyjoin.prefix-len-jaccard@2[
               FunctionCall fuzzyjoin.len@1[
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [tokensDBLP]
-                  Variable [ Name=$paperDBLP ]
-                  Variable [ Name=$paperCSX ]
+                FunctionCall asterix.dataset@1[
+                  LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
                 ]
               ]
               LiteralExpr [FLOAT] [0.5]
@@ -133,26 +114,20 @@
           ]
           AS Variable [ Name=$prefixTokenDBLP ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [CSX]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.CSX]
           ]
           AS Variable [ Name=$paperCSX ]
 ,
           FunctionCall fuzzyjoin.subset-collection@3[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
             LiteralExpr [LONG] [0]
             FunctionCall fuzzyjoin.prefix-len-jaccard@2[
               FunctionCall fuzzyjoin.len@1[
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [tokensCSX]
-                  Variable [ Name=$prefixTokenDBLP ]
-                  Variable [ Name=$paperDBLP ]
-                  Variable [ Name=$paperCSX ]
+                FunctionCall asterix.dataset@1[
+                  LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
                 ]
               ]
               LiteralExpr [FLOAT] [0.5]
@@ -192,8 +167,8 @@
                 SELECT ELEMENT [
                 Variable [ Name=$tokenGrouped ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [DBLP]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [fuzzyjoin.DBLP]
                   ]
                   AS Variable [ Name=$paper ]
 ,
@@ -215,35 +190,24 @@
                   Variable [ Name=$tokenGrouped ]
                   :=
                   Variable [ Name=$token ]
-                  GROUP AS Variable [ Name=#1 ]
+                  GROUP AS Variable [ Name=#2 ]
                   (
                     paper:=Variable [ Name=$paper ]
                     token:=Variable [ Name=$token ]
+                    id:=Variable [ Name=$id ]
                   )
 
                 Orderby
                   FunctionCall asterix.sql-count@1[
                     (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [id]
-                        Variable [ Name=$lenDBLP ]
-                        Variable [ Name=$tokensUnrankedDBLP ]
-                        Variable [ Name=$paper ]
-                        Variable [ Name=$tokenUnranked ]
-                        Variable [ Name=#1 ]
-                        Variable [ Name=#2 ]
-                        Variable [ Name=$idDBLP ]
-                        Variable [ Name=$prefixTokenCSX ]
-                        Variable [ Name=$token ]
-                        Variable [ Name=$tokenGrouped ]
-                        Variable [ Name=$prefixTokenDBLP ]
-                        Variable [ Name=$paperDBLP ]
-                        Variable [ Name=$paperCSX ]
+                      FieldAccessor [
+                        Variable [ Name=#4 ]
+                        Field=id
                       ]
                       ]
-                      FROM [                        Variable [ Name=#1 ]
-                        AS Variable [ Name=#2 ]
+                      FROM [                        Variable [ Name=#2 ]
+                        AS Variable [ Name=#4 ]
                       ]
                     )
                   ]
@@ -299,8 +263,8 @@
                 SELECT ELEMENT [
                 Variable [ Name=$tokenGrouped ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [DBLP]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [fuzzyjoin.DBLP]
                   ]
                   AS Variable [ Name=$paper ]
 ,
@@ -326,35 +290,20 @@
                   (
                     paper:=Variable [ Name=$paper ]
                     token:=Variable [ Name=$token ]
+                    id:=Variable [ Name=$id ]
                   )
 
                 Orderby
                   FunctionCall asterix.sql-count@1[
                     (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [id]
-                        Variable [ Name=$lenDBLP ]
-                        Variable [ Name=$tokensUnrankedDBLP ]
-                        Variable [ Name=$paper ]
-                        Variable [ Name=$tokensDBLP ]
-                        Variable [ Name=$tokenUnranked ]
-                        Variable [ Name=$idCSX ]
-                        Variable [ Name=$idDBLP ]
-                        Variable [ Name=#3 ]
-                        Variable [ Name=#4 ]
-                        Variable [ Name=$prefixTokenCSX ]
-                        Variable [ Name=$token ]
-                        Variable [ Name=$tokensUnrankedCSX ]
-                        Variable [ Name=$tokenGrouped ]
-                        Variable [ Name=$prefixTokenDBLP ]
-                        Variable [ Name=$lenCSX ]
-                        Variable [ Name=$paperDBLP ]
-                        Variable [ Name=$paperCSX ]
+                      FieldAccessor [
+                        Variable [ Name=#5 ]
+                        Field=id
                       ]
                       ]
                       FROM [                        Variable [ Name=#3 ]
-                        AS Variable [ Name=#4 ]
+                        AS Variable [ Name=#5 ]
                       ]
                     )
                   ]
@@ -409,12 +358,24 @@
           Variable [ Name=$idCSX ]
           :=
           Variable [ Name=$idCSX ]
-          GROUP AS Variable [ Name=#5 ]
+          Variable [ Name=$sim ]
+          :=
+          Variable [ Name=$sim ]
+          GROUP AS Variable [ Name=#1 ]
           (
             paperDBLP:=Variable [ Name=$paperDBLP ]
             prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
             paperCSX:=Variable [ Name=$paperCSX ]
             prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+            idDBLP:=Variable [ Name=$idDBLP ]
+            tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+            lenDBLP:=Variable [ Name=$lenDBLP ]
+            tokensDBLP:=Variable [ Name=$tokensDBLP ]
+            idCSX:=Variable [ Name=$idCSX ]
+            tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+            lenCSX:=Variable [ Name=$lenCSX ]
+            tokensCSX:=Variable [ Name=$tokensCSX ]
+            sim:=Variable [ Name=$sim ]
           )
 
       )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.3.ast
index 40d55ad..87e475a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5.4/dblp-csx-3_5.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ,
@@ -65,8 +65,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
@@ -87,45 +87,26 @@
             LiteralExpr [STRING] [sim]
             :
             IndexAccessor [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [sim]
-                Variable [ Name=$lenDBLP ]
-                Variable [ Name=$tokensUnrankedDBLP ]
-                Variable [ Name=$tokensDBLP ]
-                Variable [ Name=$idCSX ]
-                Variable [ Name=$idDBLP ]
-                Variable [ Name=$prefixTokenCSX ]
-                Variable [ Name=#5 ]
-                Variable [ Name=$tokensUnrankedCSX ]
-                Variable [ Name=$prefixTokenDBLP ]
-                Variable [ Name=$lenCSX ]
-                Variable [ Name=$tokensCSX ]
-                Variable [ Name=$paperDBLP ]
-                Variable [ Name=$paperCSX ]
-              ]
+              Variable [ Name=$sim ]
               Index:               LiteralExpr [LONG] [0]
             ]
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [DBLP]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.DBLP]
           ]
           AS Variable [ Name=$paperDBLP ]
 ,
           FunctionCall fuzzyjoin.subset-collection@3[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
             LiteralExpr [LONG] [0]
             FunctionCall fuzzyjoin.prefix-len-jaccard@2[
               FunctionCall fuzzyjoin.len@1[
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [tokensDBLP]
-                  Variable [ Name=$paperDBLP ]
-                  Variable [ Name=$paperCSX ]
+                FunctionCall asterix.dataset@1[
+                  LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
                 ]
               ]
               LiteralExpr [FLOAT] [0.5]
@@ -133,26 +114,20 @@
           ]
           AS Variable [ Name=$prefixTokenDBLP ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [CSX]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [fuzzyjoin.CSX]
           ]
           AS Variable [ Name=$paperCSX ]
 ,
           FunctionCall fuzzyjoin.subset-collection@3[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
             LiteralExpr [LONG] [0]
             FunctionCall fuzzyjoin.prefix-len-jaccard@2[
               FunctionCall fuzzyjoin.len@1[
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [tokensCSX]
-                  Variable [ Name=$prefixTokenDBLP ]
-                  Variable [ Name=$paperDBLP ]
-                  Variable [ Name=$paperCSX ]
+                FunctionCall asterix.dataset@1[
+                  LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
                 ]
               ]
               LiteralExpr [FLOAT] [0.5]
@@ -192,8 +167,8 @@
                 SELECT ELEMENT [
                 Variable [ Name=$tokenGrouped ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [DBLP]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [fuzzyjoin.DBLP]
                   ]
                   AS Variable [ Name=$paper ]
 ,
@@ -215,35 +190,24 @@
                   Variable [ Name=$tokenGrouped ]
                   :=
                   Variable [ Name=$token ]
-                  GROUP AS Variable [ Name=#1 ]
+                  GROUP AS Variable [ Name=#2 ]
                   (
                     paper:=Variable [ Name=$paper ]
                     token:=Variable [ Name=$token ]
+                    id:=Variable [ Name=$id ]
                   )
 
                 Orderby
                   FunctionCall asterix.sql-count@1[
                     (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [id]
-                        Variable [ Name=$lenDBLP ]
-                        Variable [ Name=$tokensUnrankedDBLP ]
-                        Variable [ Name=$paper ]
-                        Variable [ Name=$tokenUnranked ]
-                        Variable [ Name=#1 ]
-                        Variable [ Name=#2 ]
-                        Variable [ Name=$idDBLP ]
-                        Variable [ Name=$prefixTokenCSX ]
-                        Variable [ Name=$token ]
-                        Variable [ Name=$tokenGrouped ]
-                        Variable [ Name=$prefixTokenDBLP ]
-                        Variable [ Name=$paperDBLP ]
-                        Variable [ Name=$paperCSX ]
+                      FieldAccessor [
+                        Variable [ Name=#4 ]
+                        Field=id
                       ]
                       ]
-                      FROM [                        Variable [ Name=#1 ]
-                        AS Variable [ Name=#2 ]
+                      FROM [                        Variable [ Name=#2 ]
+                        AS Variable [ Name=#4 ]
                       ]
                     )
                   ]
@@ -299,8 +263,8 @@
                 SELECT ELEMENT [
                 Variable [ Name=$tokenGrouped ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [DBLP]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [fuzzyjoin.DBLP]
                   ]
                   AS Variable [ Name=$paper ]
 ,
@@ -326,35 +290,20 @@
                   (
                     paper:=Variable [ Name=$paper ]
                     token:=Variable [ Name=$token ]
+                    id:=Variable [ Name=$id ]
                   )
 
                 Orderby
                   FunctionCall asterix.sql-count@1[
                     (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [id]
-                        Variable [ Name=$lenDBLP ]
-                        Variable [ Name=$tokensUnrankedDBLP ]
-                        Variable [ Name=$paper ]
-                        Variable [ Name=$tokensDBLP ]
-                        Variable [ Name=$tokenUnranked ]
-                        Variable [ Name=$idCSX ]
-                        Variable [ Name=$idDBLP ]
-                        Variable [ Name=#3 ]
-                        Variable [ Name=#4 ]
-                        Variable [ Name=$prefixTokenCSX ]
-                        Variable [ Name=$token ]
-                        Variable [ Name=$tokensUnrankedCSX ]
-                        Variable [ Name=$tokenGrouped ]
-                        Variable [ Name=$prefixTokenDBLP ]
-                        Variable [ Name=$lenCSX ]
-                        Variable [ Name=$paperDBLP ]
-                        Variable [ Name=$paperCSX ]
+                      FieldAccessor [
+                        Variable [ Name=#5 ]
+                        Field=id
                       ]
                       ]
                       FROM [                        Variable [ Name=#3 ]
-                        AS Variable [ Name=#4 ]
+                        AS Variable [ Name=#5 ]
                       ]
                     )
                   ]
@@ -409,12 +358,24 @@
           Variable [ Name=$idCSX ]
           :=
           Variable [ Name=$idCSX ]
-          GROUP AS Variable [ Name=#5 ]
+          Variable [ Name=$sim ]
+          :=
+          Variable [ Name=$sim ]
+          GROUP AS Variable [ Name=#1 ]
           (
             paperDBLP:=Variable [ Name=$paperDBLP ]
             prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
             paperCSX:=Variable [ Name=$paperCSX ]
             prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+            idDBLP:=Variable [ Name=$idDBLP ]
+            tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+            lenDBLP:=Variable [ Name=$lenDBLP ]
+            tokensDBLP:=Variable [ Name=$tokensDBLP ]
+            idCSX:=Variable [ Name=$idCSX ]
+            tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+            lenCSX:=Variable [ Name=$lenCSX ]
+            tokensCSX:=Variable [ Name=$tokensCSX ]
+            sim:=Variable [ Name=$sim ]
           )
 
       )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5/dblp-csx-3_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5/dblp-csx-3_5.3.ast
index fadf81a..99399d76 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5/dblp-csx-3_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-3_5/dblp-csx-3_5.3.ast
@@ -46,22 +46,20 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [DBLP]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.DBLP]
       ]
       AS Variable [ Name=$paperDBLP ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensDBLP]
-          Variable [ Name=$paperDBLP ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensDBLP]
-              Variable [ Name=$paperDBLP ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensDBLP]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -69,26 +67,20 @@
       ]
       AS Variable [ Name=$prefixTokenDBLP ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [CSX]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [fuzzyjoin.CSX]
       ]
       AS Variable [ Name=$paperCSX ]
 ,
       FunctionCall fuzzyjoin.subset-collection@3[
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [tokensCSX]
-          Variable [ Name=$prefixTokenDBLP ]
-          Variable [ Name=$paperDBLP ]
-          Variable [ Name=$paperCSX ]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
         ]
         LiteralExpr [LONG] [0]
         FunctionCall fuzzyjoin.prefix-len-jaccard@2[
           FunctionCall fuzzyjoin.len@1[
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [tokensCSX]
-              Variable [ Name=$prefixTokenDBLP ]
-              Variable [ Name=$paperDBLP ]
-              Variable [ Name=$paperCSX ]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [fuzzyjoin.tokensCSX]
             ]
           ]
           LiteralExpr [FLOAT] [0.5]
@@ -128,8 +120,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -151,35 +143,24 @@
               Variable [ Name=$tokenGroupped ]
               :=
               Variable [ Name=$token ]
-              GROUP AS Variable [ Name=#1 ]
+              GROUP AS Variable [ Name=#2 ]
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=#1 ]
-                    Variable [ Name=#2 ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#4 ]
+                    Field=id
                   ]
                   ]
-                  FROM [                    Variable [ Name=#1 ]
-                    AS Variable [ Name=#2 ]
+                  FROM [                    Variable [ Name=#2 ]
+                    AS Variable [ Name=#4 ]
                   ]
                 )
               ]
@@ -235,8 +216,8 @@
             SELECT ELEMENT [
             Variable [ Name=$tokenGroupped ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [DBLP]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [fuzzyjoin.DBLP]
               ]
               AS Variable [ Name=$paper ]
 ,
@@ -262,35 +243,20 @@
               (
                 paper:=Variable [ Name=$paper ]
                 token:=Variable [ Name=$token ]
+                id:=Variable [ Name=$id ]
               )
 
             Orderby
               FunctionCall asterix.sql-count@1[
                 (
                   SELECT ELEMENT [
-                  FunctionCall Metadata.resolve@-1[
-                    LiteralExpr [STRING] [id]
-                    Variable [ Name=$lenDBLP ]
-                    Variable [ Name=$tokensUnrankedDBLP ]
-                    Variable [ Name=$paper ]
-                    Variable [ Name=$tokensDBLP ]
-                    Variable [ Name=$tokenUnranked ]
-                    Variable [ Name=$idCSX ]
-                    Variable [ Name=$idDBLP ]
-                    Variable [ Name=#3 ]
-                    Variable [ Name=#4 ]
-                    Variable [ Name=$prefixTokenCSX ]
-                    Variable [ Name=$token ]
-                    Variable [ Name=$tokensUnrankedCSX ]
-                    Variable [ Name=$tokenGroupped ]
-                    Variable [ Name=$prefixTokenDBLP ]
-                    Variable [ Name=$lenCSX ]
-                    Variable [ Name=$paperDBLP ]
-                    Variable [ Name=$paperCSX ]
+                  FieldAccessor [
+                    Variable [ Name=#5 ]
+                    Field=id
                   ]
                   ]
                   FROM [                    Variable [ Name=#3 ]
-                    AS Variable [ Name=#4 ]
+                    AS Variable [ Name=#5 ]
                   ]
                 )
               ]
@@ -348,24 +314,33 @@
       Variable [ Name=$sim ]
       :=
       Variable [ Name=$sim ]
-      GROUP AS Variable [ Name=#5 ]
+      GROUP AS Variable [ Name=#1 ]
       (
         paperDBLP:=Variable [ Name=$paperDBLP ]
         prefixTokenDBLP:=Variable [ Name=$prefixTokenDBLP ]
         paperCSX:=Variable [ Name=$paperCSX ]
         prefixTokenCSX:=Variable [ Name=$prefixTokenCSX ]
+        idDBLP:=Variable [ Name=$idDBLP ]
+        tokensUnrankedDBLP:=Variable [ Name=$tokensUnrankedDBLP ]
+        lenDBLP:=Variable [ Name=$lenDBLP ]
+        tokensDBLP:=Variable [ Name=$tokensDBLP ]
+        idCSX:=Variable [ Name=$idCSX ]
+        tokensUnrankedCSX:=Variable [ Name=$tokensUnrankedCSX ]
+        lenCSX:=Variable [ Name=$lenCSX ]
+        tokensCSX:=Variable [ Name=$tokensCSX ]
+        sim:=Variable [ Name=$sim ]
       )
 
   )
   AS Variable [ Name=$ridpair ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paperDBLP ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$paperCSX ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_1/dblp-csx-aqlplus_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_1/dblp-csx-aqlplus_1.3.ast
index bd34da8..6d23e45 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_1/dblp-csx-aqlplus_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_1/dblp-csx-aqlplus_1.3.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$i ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$j ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_2/dblp-csx-aqlplus_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_2/dblp-csx-aqlplus_2.3.ast
index c0af204..a796c3e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_2/dblp-csx-aqlplus_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_2/dblp-csx-aqlplus_2.3.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$csx ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_3/dblp-csx-aqlplus_3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_3/dblp-csx-aqlplus_3.3.ast
index 847cd77..8091791 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_3/dblp-csx-aqlplus_3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-aqlplus_3/dblp-csx-aqlplus_3.3.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$csx ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-dblp-aqlplus_1/dblp-csx-dblp-aqlplus_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-dblp-aqlplus_1/dblp-csx-dblp-aqlplus_1.3.ast
index 736c5fe..c7ed736 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-dblp-aqlplus_1/dblp-csx-dblp-aqlplus_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-csx-dblp-aqlplus_1/dblp-csx-dblp-aqlplus_1.3.ast
@@ -20,18 +20,18 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.CSX]
   ]
   AS Variable [ Name=$csx ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$dblp2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-lookup_1/dblp-lookup_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-lookup_1/dblp-lookup_1.3.ast
index 24c6240..e71c574 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-lookup_1/dblp-lookup_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/dblp-lookup_1/dblp-lookup_1.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fuzzyjoin.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/opentype/opentype.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/opentype/opentype.3.ast
index f00ce81..77d5ae0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/opentype/opentype.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/fuzzyjoin/opentype/opentype.3.ast
@@ -19,8 +19,8 @@
         Field=referred-topics
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -61,8 +61,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_02/hdfs_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_02/hdfs_02.3.ast
index a9e10ed..c77a8ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_02/hdfs_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_02/hdfs_02.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [token]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$tok ]
+          LiteralExpr [STRING] [token]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TextDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TextDataset]
   ]
   AS Variable [ Name=$line ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_03/hdfs_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_03/hdfs_03.3.ast
index a9e10ed..c77a8ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_03/hdfs_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_03/hdfs_03.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [token]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$tok ]
+          LiteralExpr [STRING] [token]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TextDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TextDataset]
   ]
   AS Variable [ Name=$line ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_shortcircuit/hdfs_shortcircuit.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_shortcircuit/hdfs_shortcircuit.3.ast
index a9e10ed..c77a8ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_shortcircuit/hdfs_shortcircuit.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/hdfs_shortcircuit/hdfs_shortcircuit.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [token]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$tok ]
+          LiteralExpr [STRING] [token]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TextDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TextDataset]
   ]
   AS Variable [ Name=$line ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/issue_245_hdfs/issue_245_hdfs.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/issue_245_hdfs/issue_245_hdfs.3.ast
index 4192035..4f4fe83 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/issue_245_hdfs/issue_245_hdfs.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hdfs/issue_245_hdfs/issue_245_hdfs.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TextDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TextDataset]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_5/issue_251_dataset_hint_5.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_5/issue_251_dataset_hint_5.3.ast
index 639c43e..e92e381 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_5/issue_251_dataset_hint_5.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_5/issue_251_dataset_hint_5.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPadm]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPadm]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_6/issue_251_dataset_hint_6.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_6/issue_251_dataset_hint_6.3.ast
index a9e10ed..c77a8ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_6/issue_251_dataset_hint_6.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_6/issue_251_dataset_hint_6.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [token]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$tok ]
+          LiteralExpr [STRING] [token]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TextDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TextDataset]
   ]
   AS Variable [ Name=$line ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.3.ast
index 538363d..c18c038 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/hints/issue_251_dataset_hint_7/issue_251_dataset_hint_7.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Tweets]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [feeds.Tweets]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-index-nested-loop-join/btree-index-nested-loop-join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-index-nested-loop-join/btree-index-nested-loop-join.3.ast
index 08c152d..598fde3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-index-nested-loop-join/btree-index-nested-loop-join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-index-nested-loop-join/btree-index-nested-loop-join.3.ast
@@ -6,18 +6,18 @@
   Field=tweetid
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TwitterUsers]
   ]
   AS Variable [ Name=$tu ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$tm ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [results]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.results]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
index 006962c..886f977 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_01/btree-secondary-equi-join_01.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_01/btree-secondary-equi-join_01.4.ast
index 81f6fce..fe097d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_01/btree-secondary-equi-join_01.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_01/btree-secondary-equi-join_01.4.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_02/btree-secondary-equi-join_02.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_02/btree-secondary-equi-join_02.4.ast
index 81f6fce..fe097d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_02/btree-secondary-equi-join_02.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_02/btree-secondary-equi-join_02.4.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_03/btree-secondary-equi-join_03.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_03/btree-secondary-equi-join_03.4.ast
index 81f6fce..fe097d6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_03/btree-secondary-equi-join_03.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/btree-secondary-equi-join_03/btree-secondary-equi-join_03.4.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
index 76b9409..939c13a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
index 016d582..caf47d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -70,8 +70,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
index 9da7404..63d8847 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
index d6bac72..eab8c44 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
@@ -48,8 +48,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -96,8 +96,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
index d62445c..1517a3a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
@@ -48,8 +48,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -96,8 +96,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
index 927f192..5d4c69d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -66,8 +66,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
index 947d145..e88a804 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -80,8 +80,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.3.ast
index c97f432..7e4a247 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
index 1580e57..484844c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
index 5249a5b..f673933 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
@@ -52,13 +52,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
index c6ad91b..ccddfc4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/disjunctive-predicate-1/disjunctive-predicate-1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/disjunctive-predicate-1/disjunctive-predicate-1.3.ast
index 674bfd5..9f0ab9e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/disjunctive-predicate-1/disjunctive-predicate-1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/disjunctive-predicate-1/disjunctive-predicate-1.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TestSet]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
index a4f5e43..0e4c541 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
index 7b7c84a..0f93d91 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
index cedae20..7ba1ec6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
index fd07d6a..204b85c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
index cce39e2..c50ce00 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
index 0ae291b..2cace6f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
index 991cc6c..71a47e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
index 61c54f0..609dc25 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
index ab21d02..de7e638 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
index 9be27d4..4979e59 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
index a4f5e43..0e4c541 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
index 1795965..a9e83dd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
index 14d63cb..5044094 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
index 14d63cb..5044094 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
index b6d7c24..32f4da6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey/orders-index-custkey.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey/orders-index-custkey.4.ast
index b6d7c24..32f4da6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey/orders-index-custkey.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/orders-index-custkey/orders-index-custkey.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search-open/range-search-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search-open/range-search-open.4.ast
index 4e6446a..15e5bb9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search-open/range-search-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search-open/range-search-open.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search/range-search.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search/range-search.4.ast
index 4e6446a..15e5bb9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search/range-search.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/range-search/range-search.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-circular-query/rtree-secondary-index-circular-query.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-circular-query/rtree-secondary-index-circular-query.4.ast
index 46f9215..f411049 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-circular-query/rtree-secondary-index-circular-query.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-circular-query/rtree-secondary-index-circular-query.4.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
index 7c356c1..2f985dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
index 7c356c1..2f985dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
index 7c356c1..2f985dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
index 4caec13..13e4f9c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance/ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance/ngram-edit-distance.4.ast
index 7790e94..be5c8eb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance/ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-edit-distance/ngram-edit-distance.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline/ngram-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
index c65e6f3..c72c206 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard/ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard/ngram-jaccard.4.ast
index 485c868..fbc8b28 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard/ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ngram-jaccard/ngram-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline/olist-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
index c46d563..39cc5a7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance/olist-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance/olist-edit-distance.4.ast
index 02f5a67..5907460 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance/olist-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-edit-distance/olist-edit-distance.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline/olist-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline/olist-jaccard-inline.4.ast
index ce0b0cd..7a5e585 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline/olist-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard-inline/olist-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard/olist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard/olist-jaccard.4.ast
index 7e70652..7bbc28e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard/olist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/olist-jaccard/olist-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline/ulist-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
index ce0b0cd..7a5e585 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard/ulist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard/ulist-jaccard.4.ast
index 7e70652..7bbc28e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard/ulist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/ulist-jaccard/ulist-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline/word-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline/word-jaccard-inline.4.ast
index cc1d06a..73e56d9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline/word-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard-inline/word-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard/word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard/word-jaccard.4.ast
index fd7dbe9..b0c74ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard/word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join-noeqjoin/word-jaccard/word-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
index d9ac017..de125c4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance/ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance/ngram-edit-distance.4.ast
index b3202b8..ad5215b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance/ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-edit-distance/ngram-edit-distance.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
index 37b6be1..a07b84a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard/ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard/ngram-jaccard.4.ast
index b53b8fb..72fd50d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard/ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ngram-jaccard/ngram-jaccard.4.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance-inline/olist-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
index b8f05ef..69103f8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance-inline/olist-edit-distance-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance/olist-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance/olist-edit-distance.4.ast
index 3a631f9..2cbf52e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance/olist-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-edit-distance/olist-edit-distance.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard-inline/olist-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard-inline/olist-jaccard-inline.4.ast
index d4c2e8a..1b069c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard-inline/olist-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard-inline/olist-jaccard-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard/olist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard/olist-jaccard.4.ast
index 444291e..fbffbda 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard/olist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/olist-jaccard/olist-jaccard.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard-inline/ulist-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
index d4c2e8a..1b069c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard-inline/ulist-jaccard-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard/ulist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard/ulist-jaccard.4.ast
index 444291e..fbffbda 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard/ulist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/ulist-jaccard/ulist-jaccard.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard-inline/word-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard-inline/word-jaccard-inline.4.ast
index 4c8a817..e324f87 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard-inline/word-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard-inline/word-jaccard-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard/word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard/word-jaccard.4.ast
index 47976ed..917d83b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard/word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/inverted-index-join/word-jaccard/word-jaccard.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285-2/query_issue285-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285-2/query_issue285-2.3.ast
index a7e83ca..b699916 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285-2/query_issue285-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285-2/query_issue285-2.3.ast
@@ -20,8 +20,8 @@
         Field=id
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [CSX]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.CSX]
         ]
         AS Variable [ Name=$b ]
       ]
@@ -48,8 +48,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285/query_issue285.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285/query_issue285.3.ast
index d1a7271..92f07b5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285/query_issue285.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue285/query_issue285.3.ast
@@ -20,8 +20,8 @@
         Field=id
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [CSX]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.CSX]
         ]
         AS Variable [ Name=$b ]
       ]
@@ -48,8 +48,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue658/query_issue658.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue658/query_issue658.3.ast
index 8046dae..9ad2870 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue658/query_issue658.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue658/query_issue658.3.ast
@@ -20,8 +20,8 @@
         Field=id
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [CSX]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.CSX]
         ]
         AS Variable [ Name=$b ]
       ]
@@ -62,8 +62,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849-2/query_issue849-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849-2/query_issue849-2.3.ast
index 1a8dc54..98fecbf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849-2/query_issue849-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849-2/query_issue849-2.3.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [s]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.s]
   ]
   AS Variable [ Name=$x ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849/query_issue849.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849/query_issue849.3.ast
index a35b4fa..caabe2b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849/query_issue849.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/leftouterjoin/query_issue849/query_issue849.3.ast
@@ -39,8 +39,8 @@
       Field=b
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [s]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.s]
       ]
       AS Variable [ Name=$z ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/adm_binary/adm_bianry.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/adm_binary/adm_bianry.3.ast
index 6147a6e..981166b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/adm_binary/adm_bianry.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/adm_binary/adm_bianry.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_01/csv_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_01/csv_01.3.ast
index 1fc68cf..75a14fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_01/csv_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_01/csv_01.3.ast
@@ -82,8 +82,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_02/csv_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_02/csv_02.3.ast
index 5fa5ed3..9b3f471 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_02/csv_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_02/csv_02.3.ast
@@ -52,8 +52,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_03/csv_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_03/csv_03.3.ast
index 0f9c737..e63e4dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_03/csv_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_03/csv_03.3.ast
@@ -60,8 +60,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_04/csv_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_04/csv_04.3.ast
index 418bbfd..8fae7a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_04/csv_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_04/csv_04.3.ast
@@ -36,8 +36,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_05/csv_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_05/csv_05.3.ast
index 418bbfd..8fae7a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_05/csv_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_05/csv_05.3.ast
@@ -36,8 +36,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_06/csv_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_06/csv_06.3.ast
index 418bbfd..8fae7a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_06/csv_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_06/csv_06.3.ast
@@ -36,8 +36,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_07/csv_07.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_07/csv_07.3.ast
index 418bbfd..8fae7a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_07/csv_07.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_07/csv_07.3.ast
@@ -36,8 +36,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_cr/csv_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_cr/csv_08.3.ast
index 1fc68cf..75a14fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_cr/csv_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_cr/csv_08.3.ast
@@ -82,8 +82,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_crlf/csv_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_crlf/csv_08.3.ast
index 1fc68cf..75a14fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_crlf/csv_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_crlf/csv_08.3.ast
@@ -82,8 +82,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_lf/csv_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_lf/csv_08.3.ast
index 1fc68cf..75a14fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_lf/csv_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/csv_08_header_lf/csv_08.3.ast
@@ -82,8 +82,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [temp.testds]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes01/escapes01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes01/escapes01.3.ast
index 9248970..27b78fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes01/escapes01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes01/escapes01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TestDataverse.TestSet]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes02/escapes02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes02/escapes02.3.ast
index 9248970..27b78fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes02/escapes02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/escapes02/escapes02.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TestDataverse.TestSet]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/issue289_query/issue289_query.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/issue289_query/issue289_query.3.ast
index e5a74a8..43c4c8f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/issue289_query/issue289_query.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/issue289_query/issue289_query.3.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$l ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.Customers]
       ]
       AS Variable [ Name=$l ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/type_promotion_0/type_promotion_0.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/type_promotion_0/type_promotion_0.3.ast
index 9248970..27b78fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/type_promotion_0/type_promotion_0.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/load/type_promotion_0/type_promotion_0.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TestDataverse.TestSet]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/materialization/assign-reuse/assign-reuse.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/materialization/assign-reuse/assign-reuse.3.ast
index 323bb0e..55766e5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/materialization/assign-reuse/assign-reuse.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/materialization/assign-reuse/assign-reuse.3.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$d ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$d ]
     ]
@@ -29,8 +29,8 @@
     SELECT ELEMENT [
     Variable [ Name=$d ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$d ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/flushtest/flushtest.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/flushtest/flushtest.4.ast
index b1f231f..6d8041a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/flushtest/flushtest.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/flushtest/flushtest.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$t ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [DMLTest.FacebookUsers2]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/groupby-orderby-count/groupby-orderby-count.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/groupby-orderby-count/groupby-orderby-count.3.ast
index 0645a7f..3e66487 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/groupby-orderby-count/groupby-orderby-count.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/groupby-orderby-count/groupby-orderby-count.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [token]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$tok ]
+          LiteralExpr [STRING] [token]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.TwitterData]
   ]
   AS Variable [ Name=$t ]
 ,
@@ -54,10 +53,9 @@
   FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [token]
+      FunctionCall asterix.field-access-by-name@2[
         Variable [ Name=$g ]
-        Variable [ Name=$tok ]
+        LiteralExpr [STRING] [token]
       ]
       ]
       FROM [        Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/is-null_01/is-null_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/is-null_01/is-null_01.3.ast
index 25b715e..ccf0bf2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/is-null_01/is-null_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/is-null_01/is-null_01.3.ast
@@ -3,10 +3,10 @@
 Query:
 SELECT ELEMENT [
 OrderedListConstructor [
-  FunctionCall null.is-null@1[
+  FunctionCall algebricks.is-null@1[
     LiteralExpr [NULL]
   ]
-  FunctionCall null.is-null@1[
+  FunctionCall algebricks.is-null@1[
     LiteralExpr [LONG] [10]
   ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/nested-loop-join_01/nested-loop-join_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/nested-loop-join_01/nested-loop-join_01.3.ast
index 27f1a69..ca9f0b3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/nested-loop-join_01/nested-loop-join_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/nested-loop-join_01/nested-loop-join_01.3.ast
@@ -34,13 +34,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Users]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Users]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Visitors]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Visitors]
   ]
   AS Variable [ Name=$visitor ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/partition-by-nonexistent-field/partition-by-nonexistent-field.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/partition-by-nonexistent-field/partition-by-nonexistent-field.3.ast
index 0b3fd5c..af3d42e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/partition-by-nonexistent-field/partition-by-nonexistent-field.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/partition-by-nonexistent-field/partition-by-nonexistent-field.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/prefix-search/prefix-search.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/prefix-search/prefix-search.3.ast
index 78a70a7..1dc730f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/prefix-search/prefix-search.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/prefix-search/prefix-search.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/query_issue267/query_issue267.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/query_issue267/query_issue267.3.ast
index 5cef21d..d17917f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/query_issue267/query_issue267.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/query_issue267/query_issue267.3.ast
@@ -3,13 +3,13 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t2]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/stable_sort/stable_sort.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/stable_sort/stable_sort.3.ast
index 73977d7..87320ab 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/stable_sort/stable_sort.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/stable_sort/stable_sort.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/string_eq_01/string_eq_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/string_eq_01/string_eq_01.3.ast
index 41fbfd9..89b063c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/string_eq_01/string_eq_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/misc/string_eq_01/string_eq_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
index b129f62..0308f12 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/compact-dataset-and-its-indexes/compact-dataset-and-its-indexes.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
index 347bcd1..2388e3a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/drop-index/drop-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/drop-index/drop-index.4.ast
index 59e64c5..913cad5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/drop-index/drop-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/drop-index/drop-index.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
index 63307a6..b6ab83b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-empty-dataset-with-index/insert-into-empty-dataset-with-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
index da5c8e8..dddd0c0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_01/insert-into-loaded-dataset-with-index_01.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
index 010d69e..7c3e519 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/insert-into-loaded-dataset-with-index_02/insert-into-loaded-dataset-with-index_02.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-index/load-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-index/load-with-index.3.ast
index 010d69e..7c3e519 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-index/load-with-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-index/load-with-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-ngram-index/load-with-ngram-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-ngram-index/load-with-ngram-index.3.ast
index 5d856c6..2ca5870 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-ngram-index/load-with-ngram-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-ngram-index/load-with-ngram-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-rtree-index/load-with-rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-rtree-index/load-with-rtree-index.3.ast
index 0f6b17a..71ef449 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-rtree-index/load-with-rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-rtree-index/load-with-rtree-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-word-index/load-with-word-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-word-index/load-with-word-index.3.ast
index 81ed659..8300e7e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-word-index/load-with-word-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/load-with-word-index/load-with-word-index.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-insert/nested-uuid-insert.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-insert/nested-uuid-insert.3.ast
index 7e9c615..9902dbf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-insert/nested-uuid-insert.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-insert/nested-uuid-insert.3.ast
@@ -12,8 +12,8 @@
   Field=message-text
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [doublenests]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.doublenests]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-load/nested-uuid-load.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-load/nested-uuid-load.3.ast
index 1ba5521..4f70e05 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-load/nested-uuid-load.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/nested-uuid-load/nested-uuid-load.3.ast
@@ -23,8 +23,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [twitter.TweetMessages]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
index e85ef69..693860b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-btree-secondary-index-nullable/scan-delete-btree-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index-nullable/scan-delete-inverted-index-ngram-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-ngram-secondary-index/scan-delete-inverted-index-ngram-secondary-index.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index-nullable/scan-delete-inverted-index-word-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-inverted-index-word-secondary-index/scan-delete-inverted-index-word-secondary-index.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
index 7922298..9ce46c5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index-nullable/scan-delete-rtree-secondary-index-nullable.5.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
index 7922298..9ce46c5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
index 03e0f3e..d61cda8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-btree-secondary-index-nullable/scan-insert-btree-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomersMini]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomersMini]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index-nullable/scan-insert-inverted-index-ngram-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-ngram-secondary-index/scan-insert-inverted-index-ngram-secondary-index.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index-nullable/scan-insert-inverted-index-word-secondary-index-nullable.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-inverted-index-word-secondary-index/scan-insert-inverted-index-word-secondary-index.5.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
index 8c41a3a..8977eed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index-nullable/scan-insert-rtree-secondary-index-nullable.5.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyMiniData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
index 8c41a3a..8977eed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index-dml/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyMiniData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/adm-format/adm-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/adm-format/adm-format.3.ast
index e6ee28d..8c05570 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/adm-format/adm-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/adm-format/adm-format.3.ast
@@ -103,8 +103,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
index 14fb18f..943af65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin/leftouterjoin.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
index b06cad5..8117066 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -91,8 +91,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/rtree-index/rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/rtree-index/rtree-index.3.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/rtree-index/rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/external-indexing/rtree-index/rtree-index.3.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
index 27a3a1e..84a3e05 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-primary-equi-join/btree-primary-equi-join.3.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
index ddfe85e..5ba16e8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
index 55edfef..2de4faa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
index 7b84832..5629998 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
index 98199de..8fb65e3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard/ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
index f54a33a..74328ad 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
index 45e7acd..4881a92 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
index 007ed4c5..cce9421 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard/word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard/word-jaccard.4.ast
index 0c0ec3f..4a4a222 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard/word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-join/word-jaccard/word-jaccard.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
index b06cad5..8117066 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -91,8 +91,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
index 5c212c0..5fd6a09 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -111,8 +111,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
index 7101e57..f3cc092 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx1/probe-pidx-with-join-invidx-sidx1.3.ast
@@ -60,8 +60,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -123,8 +123,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
index df40355..769e4cf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
@@ -60,8 +60,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -123,8 +123,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
index 14fb18f..943af65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
index 4e6fcaa..14c38d5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -104,8 +104,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
index 85f10b7..f17bf1c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
index cbb879c..b1ab2c3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
index 448c8aa..e626ba4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
@@ -70,13 +70,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
index e85ef69..693860b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/cust-index-age-nullable/cust-index-age-nullable.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
index a430474..8825927 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
index 5e173d3..7dafb90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
index fe86c69..627ab43 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
index 3e387f7..41a5216 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
index c7a9a8d..d87360a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
@@ -7,8 +7,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
index e54f62e..bb146ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance-panic/inverted-index-olist-edit-distance-panic.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
index 3a228f8..b451307 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-edit-distance/inverted-index-olist-edit-distance.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
index e22169f..245e0a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-olist-jaccard/inverted-index-olist-jaccard.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
index 72d84d0..2b79329 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-ulist-jaccard/inverted-index-ulist-jaccard.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
index b482e66..01d032c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive-open/orders-index-custkey-conjunctive-open.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
index b482e66..01d032c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
index 3aa4530..f0c565f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey-open/orders-index-custkey-open.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
index 3aa4530..f0c565f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search-open/range-search-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search-open/range-search-open.4.ast
index 25dade1..f5abcd7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search-open/range-search-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search-open/range-search-open.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search/range-search.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search/range-search.4.ast
index 25dade1..f5abcd7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search/range-search.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/range-search/range-search.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-nullable/rtree-secondary-index-nullable.4.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index-open/rtree-secondary-index-open.4.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/adm-format/adm-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/adm-format/adm-format.3.ast
index e6ee28d..8c05570 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/adm-format/adm-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/adm-format/adm-format.3.ast
@@ -103,8 +103,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
index 14fb18f..943af65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin/leftouterjoin.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
index b06cad5..8117066 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/leftouterjoin/leftouterjoin.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -91,8 +91,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/rtree-index/rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/rtree-index/rtree-index.3.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/rtree-index/rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/external-indexing/rtree-index/rtree-index.3.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-closed/bottom-closed-top-closed.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-closed/bottom-closed-top-closed.3.ast
index 2c289ee..73ee2a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-closed/bottom-closed-top-closed.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-closed/bottom-closed-top-closed.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$test ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Animals]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Animals]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-open/bottom-closed-top-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-open/bottom-closed-top-open.3.ast
index 2c289ee..73ee2a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-open/bottom-closed-top-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-closed-top-open/bottom-closed-top-open.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$test ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Animals]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Animals]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-closed/bottom-open-top-closed.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-closed/bottom-open-top-closed.3.ast
index 2c289ee..73ee2a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-closed/bottom-open-top-closed.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-closed/bottom-open-top-closed.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$test ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Animals]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Animals]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-open/bottom-open-top-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-open/bottom-open-top-open.3.ast
index 2c289ee..73ee2a5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-open/bottom-open-top-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/highly-open-highly-nested/bottom-open-top-open/bottom-open-top-open.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$test ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Animals]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Animals]
   ]
   AS Variable [ Name=$test ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
index ddfe85e..5ba16e8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
@@ -37,13 +37,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
index 55edfef..2de4faa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
index 7b84832..5629998 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
index 1bf6be6..e1044f3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
@@ -26,13 +26,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard/ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
index 774a7a9..f111822 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/ngram-jaccard/ngram-jaccard.4.ast
@@ -21,13 +21,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
index 45e7acd..4881a92 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
@@ -48,13 +48,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
index 007ed4c5..cce9421 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
@@ -25,13 +25,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard/word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard/word-jaccard.4.ast
index 0c0ec3f..4a4a222 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard/word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-join/word-jaccard/word-jaccard.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
index b06cad5..8117066 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -91,8 +91,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
index 5c212c0..5fd6a09 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -111,8 +111,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
index b12cdac..1b6e63e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -111,8 +111,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessagesTmp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessagesTmp]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
index 14fb18f..943af65 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
index 4e6fcaa..14c38d5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
@@ -54,8 +54,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -104,8 +104,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
index 85f10b7..f17bf1c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
index cbb879c..b1ab2c3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
index 448c8aa..e626ba4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
@@ -70,13 +70,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
index a430474..8825927 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
index 5e173d3..7dafb90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
index 3e387f7..41a5216 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
index c7a9a8d..d87360a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
@@ -7,8 +7,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
index 724d3b9..d9a04f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
index 7b62e3a..480570a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
index b482e66..01d032c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
index 3aa4530..f0c565f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/orders-index-custkey/orders-index-custkey.4.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/range-search/range-search.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/range-search/range-search.4.ast
index 25dade1..f5abcd7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/range-search/range-search.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/range-search/range-search.4.ast
@@ -6,8 +6,8 @@
   Field=nested
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItem]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
index 9c42719..6dbb3ea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nested-open-index/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
@@ -15,8 +15,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nestrecords/nestrecord/nestrecord.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nestrecords/nestrecord/nestrecord.3.ast
index e739a6d9..b9a1f90 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nestrecords/nestrecord/nestrecord.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/nestrecords/nestrecord/nestrecord.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.10.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.10.ast
index 596df09..355407d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.10.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.10.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.11.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.11.ast
index 2136522..8002e0a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.11.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.11.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.12.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.12.ast
index 6964ae3..910daaa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.12.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.12.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.3.ast
index 06c8956..0c8e282 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.4.ast
index 1e0dfbe..61be60d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.4.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.5.ast
index 5538c4e..3367d42 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.5.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.6.ast
index 147c38a..8336e41 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.6.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.7.ast
index d10c2e4..169dc7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.7.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.8.ast
index d4091ba..e8bdf9d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.8.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.9.ast
index a6a2d64..61da4ee 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/access-nested-fields/access-nested-fields.9.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/field-access-on-open-field/field-access-on-open-field.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/field-access-on-open-field/field-access-on-open-field.3.ast
index 84c69fe..662f9cb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/field-access-on-open-field/field-access-on-open-field.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/field-access-on-open-field/field-access-on-open-field.3.ast
@@ -6,7 +6,7 @@
   Field=zip
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [testds]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-closed/highly-nested-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-closed/highly-nested-open.3.ast
index 844db7f..d348c3e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-closed/highly-nested-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-closed/highly-nested-open.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-mixed/highly-nested-mixed.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-mixed/highly-nested-mixed.3.ast
index 844db7f..d348c3e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-mixed/highly-nested-mixed.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-mixed/highly-nested-mixed.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-open/highly-nested-open.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-open/highly-nested-open.3.ast
index 844db7f..d348c3e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-open/highly-nested-open.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/highly-nested-open/highly-nested-open.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Animals]
   ]
   AS Variable [ Name=$test ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/tiny-social-example/tiny-social-example.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/tiny-social-example/tiny-social-example.4.ast
index 62d2ab4..9935372 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/tiny-social-example/tiny-social-example.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-field-value/tiny-social-example/tiny-social-example.4.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$result ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessages]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.4.ast
index b1b51e1..281b48b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.4.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$user ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$user ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.5.ast
index b623766..ffdd2e2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.5.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.6.ast
index 21c3121..767f44d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.6.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.7.ast
index d3d80bb..ee8c594 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.7.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TwitterUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.8.ast
index 112eff2..764d81e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.8.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.9.ast
index 0e005a9..307b9db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-no-complex-types/tiny-social-example-no-complex-types.9.ast
@@ -19,7 +19,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.4.ast
index b1b51e1..281b48b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.4.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$user ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$user ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.5.ast
index b623766..ffdd2e2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.5.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.6.ast
index 21c3121..767f44d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.6.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.7.ast
index d3d80bb..ee8c594 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.7.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TwitterUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.8.ast
index 112eff2..764d81e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.8.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.9.ast
index 0e005a9..307b9db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-lists/tiny-social-example-only-lists.9.ast
@@ -19,7 +19,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.4.ast
index b1b51e1..281b48b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.4.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$user ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$user ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.5.ast
index b623766..ffdd2e2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.5.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.6.ast
index 21c3121..767f44d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.6.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [FacebookMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.7.ast
index d3d80bb..ee8c594 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.7.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TwitterUsersAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.8.ast
index 112eff2..764d81e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.8.ast
@@ -5,7 +5,7 @@
   Variable [ Name=$r ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.9.ast
index 0e005a9..307b9db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/get-object-fields/tiny-social-example-only-records/tiny-social-example-only-records.9.ast
@@ -19,7 +19,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [TweetMessagesAlternate]
   ]
   AS Variable [ Name=$r ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-closed-fieldname-conflict_issue173/open-closed-fieldname-conflict_issue173.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-closed-fieldname-conflict_issue173/open-closed-fieldname-conflict_issue173.3.ast
index c165b6f..0ce294c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-closed-fieldname-conflict_issue173/open-closed-fieldname-conflict_issue173.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-closed-fieldname-conflict_issue173/open-closed-fieldname-conflict_issue173.3.ast
@@ -19,7 +19,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [testds]
   ]
   AS Variable [ Name=$x ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-open-fieldname-conflict_issue173/open-open-fieldname-conflict_issue173.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-open-fieldname-conflict_issue173/open-open-fieldname-conflict_issue173.3.ast
index 0ec5e92..fdb1c7a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-open-fieldname-conflict_issue173/open-open-fieldname-conflict_issue173.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/objects/open-open-fieldname-conflict_issue173/open-open-fieldname-conflict_issue173.3.ast
@@ -20,7 +20,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [testds]
   ]
   AS Variable [ Name=$x ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list-ordered01/heterog-list-ordered01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list-ordered01/heterog-list-ordered01.3.ast
index 1ede8bd..d19750c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list-ordered01/heterog-list-ordered01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list-ordered01/heterog-list-ordered01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [T1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.T1]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list01/heterog-list01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list01/heterog-list01.3.ast
index 1ede8bd..d19750c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list01/heterog-list01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/heterog-list01/heterog-list01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [T1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.T1]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-01/open-closed-01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-01/open-closed-01.3.ast
index 00bab71..fd5aae5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-01/open-closed-01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-01/open-closed-01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-12/open-closed-12.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-12/open-closed-12.3.ast
index 660fb7f..d8ef172 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-12/open-closed-12.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-12/open-closed-12.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-14/open-closed-14.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-14/open-closed-14.3.ast
index 660fb7f..d8ef172 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-14/open-closed-14.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-14/open-closed-14.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-24/open-closed-24.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-24/open-closed-24.3.ast
index 0b3fd5c..af3d42e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-24/open-closed-24.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-24/open-closed-24.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-25/open-closed-25.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-25/open-closed-25.3.ast
index 0b3fd5c..af3d42e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-25/open-closed-25.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-25/open-closed-25.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-26/open-closed-26.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-26/open-closed-26.3.ast
index 0b3fd5c..af3d42e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-26/open-closed-26.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-26/open-closed-26.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-29/open-closed-29.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-29/open-closed-29.3.ast
index 698a06e..e0a9c06 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-29/open-closed-29.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-29/open-closed-29.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-31/open-closed-31.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-31/open-closed-31.3.ast
index 0d4b3ff..a7684f4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-31/open-closed-31.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-31/open-closed-31.3.ast
@@ -6,8 +6,8 @@
   Field=hobbies
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-32/open-closed-32.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-32/open-closed-32.3.ast
index eab1dd6..2df5c53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-32/open-closed-32.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-32/open-closed-32.3.ast
@@ -6,8 +6,8 @@
   Field=interests
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-33/open-closed-33.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-33/open-closed-33.3.ast
index eab1dd6..2df5c53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-33/open-closed-33.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/open-closed-33/open-closed-33.3.ast
@@ -6,8 +6,8 @@
   Field=interests
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds01]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdv2.testds01]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue196/query-issue196.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue196/query-issue196.3.ast
index fc3536d..dafbb9f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue196/query-issue196.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue196/query-issue196.3.ast
@@ -8,8 +8,8 @@
       SELECT ELEMENT [
       Variable [ Name=$l ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [t1]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.t1]
         ]
         AS Variable [ Name=$l ]
       ]
@@ -29,8 +29,8 @@
       SELECT ELEMENT [
       Variable [ Name=$m ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [t2]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.t2]
         ]
         AS Variable [ Name=$m ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue208/query-issue208.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue208/query-issue208.3.ast
index 9f85911..4a0cf5b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue208/query-issue208.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue208/query-issue208.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [OpenSocialNetworkData.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue236/query-issue236.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue236/query-issue236.3.ast
index 077c79a..7517af5 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue236/query-issue236.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue236/query-issue236.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$r ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [SocialNetworkData.TweetMessages]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue258/query-issue258.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue258/query-issue258.3.ast
index a2bee66..f3235f0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue258/query-issue258.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue258/query-issue258.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [ds1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.ds1]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343-2/query-issue343-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343-2/query-issue343-2.3.ast
index d4ff417..03b650c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343-2/query-issue343-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343-2/query-issue343-2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [All]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.All]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343/query-issue343.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343/query-issue343.3.ast
index d4ff417..03b650c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343/query-issue343.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue343/query-issue343.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [All]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.All]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350-2/query-issue350-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350-2/query-issue350-2.3.ast
index b2c1077..b4afe39 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350-2/query-issue350-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350-2/query-issue350-2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tm ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$tm ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350/query-issue350.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350/query-issue350.3.ast
index f2dbadd..1f530bf 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350/query-issue350.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue350/query-issue350.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$tm ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$tm ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue377/query-issue377.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue377/query-issue377.3.ast
index c246b60..16588b6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue377/query-issue377.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue377/query-issue377.3.ast
@@ -44,8 +44,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t ]
       ]
@@ -71,8 +71,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue410/query-issue410.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue410/query-issue410.3.ast
index 8411681..3266951 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue410/query-issue410.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue410/query-issue410.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Employee]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423-2/query-issue423-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423-2/query-issue423-2.3.ast
index 4898dd3..8c7d35b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423-2/query-issue423-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423-2/query-issue423-2.3.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t2]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423/query-issue423.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423/query-issue423.3.ast
index 290e76b..3269cfb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423/query-issue423.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue423/query-issue423.3.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t1]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t2]
   ]
   AS Variable [ Name=$m ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453-2/query-issue453-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453-2/query-issue453-2.3.ast
index f3eb5ac..ffedb2d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453-2/query-issue453-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453-2/query-issue453-2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DataOpen]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453/query-issue453.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453/query-issue453.3.ast
index f3eb5ac..ffedb2d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453/query-issue453.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue453/query-issue453.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DataOpen]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue456/query-issue456.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue456/query-issue456.3.ast
index c9e0567..bd6620d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue456/query-issue456.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue456/query-issue456.3.ast
@@ -2,14 +2,14 @@
 Query:
 SELECT ELEMENT [
 OrderedListConstructor [
-  FieldAccessor [
-    Variable [ Name=$x ]
-    Field=int_m
-  ]
+  Variable [ Name=$int_m ]
   FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      Variable [ Name=$x ]
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [x]
+      ]
       ]
       FROM [        Variable [ Name=$g ]
         AS Variable [ Name=$g ]
@@ -18,8 +18,8 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DataOpen]
   ]
   AS Variable [ Name=$x ]
 ]
@@ -39,12 +39,10 @@
   GROUP AS Variable [ Name=$g ]
   (
     x:=Variable [ Name=$x ]
+    id:=Variable [ Name=$id ]
   )
 
 Orderby
-  FieldAccessor [
-    Variable [ Name=$x ]
-    Field=int_m
-  ]
+  Variable [ Name=$int_m ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue487/query-issue487.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue487/query-issue487.3.ast
index 57772bf..34766a2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue487/query-issue487.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue487/query-issue487.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Employee]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Employee]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue592/query-issue592.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue592/query-issue592.3.ast
index 6d0a36d..1de2464 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue592/query-issue592.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue592/query-issue592.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$f ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [fooset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fooverse.fooset]
   ]
   AS Variable [ Name=$f ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue625/query-issue625.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue625/query-issue625.3.ast
index 7df5c42..8ccbcf1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue625/query-issue625.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-issue625/query-issue625.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$x ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Foo]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [fooverse.Foo]
   ]
   AS Variable [ Name=$x ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal/query-proposal.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal/query-proposal.3.ast
index 36a2f6b..599d473 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal/query-proposal.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal/query-proposal.3.ast
@@ -36,8 +36,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TweetMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.TweetMessages]
       ]
       AS Variable [ Name=$tweet ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal02/query-proposal02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal02/query-proposal02.3.ast
index 2c7cc21..b005051 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal02/query-proposal02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-closed/query-proposal02/query-proposal02.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$tweet ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/adm-format/adm-format.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/adm-format/adm-format.3.ast
index c21eaf2..7b6fbad 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/adm-format/adm-format.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/adm-format/adm-format.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$d ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$d ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
index 927f192..5d4c69d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin-rtree/leftouterjoin-rtree.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -66,8 +66,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin/leftouterjoin.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin/leftouterjoin.3.ast
index 016d582..caf47d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin/leftouterjoin.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/leftouterjoin/leftouterjoin.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -70,8 +70,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/rtree-index/rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/rtree-index/rtree-index.3.ast
index 7c356c1..2f985dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/rtree-index/rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/external-indexing/rtree-index/rtree-index.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
index b98ea54..01d1367 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/btree-secondary-equi-join/btree-secondary-equi-join.4.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
index d9ac017..de125c4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance-inline/ngram-edit-distance-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance/ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
index b3202b8..ad5215b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-edit-distance/ngram-edit-distance.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
index 22a6a81..b5e2450 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard-inline/ngram-jaccard-inline.4.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard/ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard/ngram-jaccard.4.ast
index 2424075..09fc922 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard/ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/ngram-jaccard/ngram-jaccard.4.ast
@@ -15,13 +15,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
index 76b9409..939c13a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/rtree-spatial-intersect-point/rtree-spatial-intersect-point.4.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData1]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData2]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData2]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard-inline/word-jaccard-inline.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
index f8f167b..3f3db25 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard-inline/word-jaccard-inline.4.ast
@@ -19,13 +19,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard/word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard/word-jaccard.4.ast
index d7de2c4..9689853 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard/word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-join/word-jaccard/word-jaccard.4.ast
@@ -14,13 +14,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$a ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CSX]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CSX]
   ]
   AS Variable [ Name=$b ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
index 016d582..caf47d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx1/probe-pidx-with-join-btree-sidx1.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -70,8 +70,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
index 9da7404..63d8847 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-btree-sidx2/probe-pidx-with-join-btree-sidx2.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -84,8 +84,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
index 2d27947..67155b4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-invidx-sidx2/probe-pidx-with-join-invidx-sidx2.3.ast
@@ -48,8 +48,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -96,8 +96,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessagesTmp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessagesTmp]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
index 927f192..5d4c69d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx1/probe-pidx-with-join-rtree-sidx1.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -66,8 +66,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
index 947d145..e88a804 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-leftouterjoin/probe-pidx-with-join-rtree-sidx2/probe-pidx-with-join-rtree-sidx2.3.ast
@@ -42,8 +42,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [test.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -80,8 +80,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TweetMessages]
   ]
   AS Variable [ Name=$t1 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
index 366d06e..6000ed4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key-mixed-intervals/btree-index-composite-key-mixed-intervals.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employeeOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employeeOpen]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
index 914bf05..0824721 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-composite-key/btree-index-composite-key.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [employeeOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.employeeOpen]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
index 786562f..ab506d8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/btree-index-rewrite-multiple/btree-index-rewrite-multiple.4.ast
@@ -52,13 +52,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [OrdersOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.OrdersOpen]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [OrdersOpen]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.OrdersOpen]
   ]
   AS Variable [ Name=$o2 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
index 4ea1306..8c4e3f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-contains/inverted-index-ngram-contains.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
index 7b7c84a..0f93d91 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-contains/inverted-index-ngram-edit-distance-contains.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
index 649dfd5..adc3eb8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-panic/inverted-index-ngram-edit-distance-panic.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
index fd07d6a..204b85c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance-word-tokens/inverted-index-ngram-edit-distance-word-tokens.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
index 70df0ed..b63ea47 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-edit-distance/inverted-index-ngram-edit-distance.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
index 21b9588..5f71699 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-ngram-jaccard/inverted-index-ngram-jaccard.4.ast
@@ -45,8 +45,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
index 4ea1306..8c4e3f1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-contains/inverted-index-word-contains.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
index baec7df..9dfa690 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/inverted-index-word-jaccard/inverted-index-word-jaccard.4.ast
@@ -44,8 +44,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
index 0a8aa7c..ff55604 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey-conjunctive/orders-index-custkey-conjunctive.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [OrdersOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.OrdersOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey/orders-index-custkey.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey/orders-index-custkey.4.ast
index cb8548e..916add8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey/orders-index-custkey.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/orders-index-custkey/orders-index-custkey.4.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [OrdersOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.OrdersOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/range-search/range-search.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/range-search/range-search.4.ast
index 5710661..3662b7b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/range-search/range-search.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/range-search/range-search.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$c ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItemOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.LineItemOpen]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
index c6f3177..74ea6fe4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/open-index-enforced/index-selection/rtree-secondary-index/rtree-secondary-index.4.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyDataOpen]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyDataOpen]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/everysat_04/everysat_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/everysat_04/everysat_04.3.ast
index 9a08a18..e2fc21b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/everysat_04/everysat_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/everysat_04/everysat_04.3.ast
@@ -60,7 +60,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -74,7 +74,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -88,7 +88,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -102,7 +102,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_02/somesat_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_02/somesat_02.3.ast
index 0fee643..07e0add 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_02/somesat_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_02/somesat_02.3.ast
@@ -6,8 +6,8 @@
   Field=cid
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [CustomerSomeSat02]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.CustomerSomeSat02]
   ]
   AS Variable [ Name=$x ]
 ]
@@ -15,8 +15,8 @@
   QuantifiedExpression SOME [
     [Variable [ Name=$y ]
     In
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [OrdersSomeSat02]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.OrdersSomeSat02]
       ]
     ]
     Satifies [
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_06/somesat_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_06/somesat_06.3.ast
index 4a499d7..151dfbd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_06/somesat_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/quantifiers/somesat_06/somesat_06.3.ast
@@ -61,7 +61,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -75,7 +75,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -89,7 +89,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
@@ -103,7 +103,7 @@
         ]
       ]
       Satifies [
-        FunctionCall null.not@1[
+        FunctionCall algebricks.not@1[
           Variable [ Name=$x ]
         ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.4.ast
index e4b5374..2197198 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.5.ast
index 9c74363..fd2acb4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.6.ast
index 081ab7b..0a92b53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.6.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.7.ast
index 6b1a0fc..8b01037 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/range-hints/order-by/order-by.7.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TwitterUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/10/10.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/10/10.3.ast
index 89a91ac..02dc7c2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/10/10.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/10/10.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP1]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/20/20.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/20/20.3.ast
index 639c43e..e92e381 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/20/20.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/20/20.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPadm]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPadm]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/30/30.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/30/30.3.ast
index 4da87c8..ed59bb9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/30/30.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/30/30.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPsplits]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPsplits]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_01/alltypes_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_01/alltypes_01.3.ast
index bb0ad88..8b2c14c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_01/alltypes_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_01/alltypes_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [All]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.All]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_02/alltypes_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_02/alltypes_02.3.ast
index bb0ad88..8b2c14c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_02/alltypes_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/alltypes_02/alltypes_02.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [All]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.All]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/invalid-scan-syntax/invalid-scan-syntax.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/invalid-scan-syntax/invalid-scan-syntax.3.ast
index 96f1482..5cc8b28 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/invalid-scan-syntax/invalid-scan-syntax.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/invalid-scan-syntax/invalid-scan-syntax.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$t ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [test.Office]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.test.Office]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_1/issue238_query_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_1/issue238_query_1.3.ast
index 639c43e..e92e381 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_1/issue238_query_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_1/issue238_query_1.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPadm]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPadm]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_2/issue238_query_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_2/issue238_query_2.3.ast
index 639c43e..e92e381 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_2/issue238_query_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/issue238_query_2/issue238_query_2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLPadm]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLPadm]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/numeric_types_01/numeric_types_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/numeric_types_01/numeric_types_01.3.ast
index 7a43203..60085fc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/numeric_types_01/numeric_types_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/numeric_types_01/numeric_types_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Numeric]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Numeric]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/spatial_types_01/spatial_types_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/spatial_types_01/spatial_types_01.3.ast
index fe680d7..7a105be 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/spatial_types_01/spatial_types_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/spatial_types_01/spatial_types_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Spatial]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Spatial]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/temp_types_01/temp_types_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/temp_types_01/temp_types_01.3.ast
index 8a8d9e4..a601124 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/temp_types_01/temp_types_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/scan/temp_types_01/temp_types_01.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$a ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Temp]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Temp]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/count-nullable/count-nullable.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/count-nullable/count-nullable.3.ast
index 96d0aa7..df45faa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/count-nullable/count-nullable.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/count-nullable/count-nullable.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [c]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$age ]
+          LiteralExpr [STRING] [c]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -27,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/cust-filter/cust-filter.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/cust-filter/cust-filter.3.ast
index eea1c28..17919e6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/cust-filter/cust-filter.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/cust-filter/cust-filter.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Customers]
   ]
   AS Variable [ Name=$c ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/has-param1/has-param1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/has-param1/has-param1.3.ast
index fb79748..860ad00 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/has-param1/has-param1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/semistructured/has-param1/has-param1.3.ast
@@ -4,14 +4,14 @@
 SELECT ELEMENT [
 Variable [ Name=$o ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
 Where
-  FunctionCall null.not@1[
-    FunctionCall null.is-missing@1[
+  FunctionCall algebricks.not@1[
+    FunctionCall algebricks.is-missing@1[
       FieldAccessor [
         Variable [ Name=$o ]
         Field=param1
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-edit-distance/fuzzyeq-edit-distance.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-edit-distance/fuzzyeq-edit-distance.3.ast
index 57dcfa5..235888c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-edit-distance/fuzzyeq-edit-distance.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-edit-distance/fuzzyeq-edit-distance.3.ast
@@ -5,8 +5,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-similarity-jaccard/fuzzyeq-similarity-jaccard.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-similarity-jaccard/fuzzyeq-similarity-jaccard.3.ast
index e85a7bf..640a665 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-similarity-jaccard/fuzzyeq-similarity-jaccard.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/fuzzyeq-similarity-jaccard/fuzzyeq-similarity-jaccard.3.ast
@@ -5,8 +5,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-check_query/similarity-jaccard-check_query.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-check_query/similarity-jaccard-check_query.3.ast
index c22f17a..465525c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-check_query/similarity-jaccard-check_query.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-check_query/similarity-jaccard-check_query.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted-check_query/similarity-jaccard-sorted-check_query.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted-check_query/similarity-jaccard-sorted-check_query.3.ast
index 71ac309..df3273d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted-check_query/similarity-jaccard-sorted-check_query.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted-check_query/similarity-jaccard-sorted-check_query.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted_query/similarity-jaccard-sorted_query.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted_query/similarity-jaccard-sorted_query.3.ast
index 5151c6c..9a2a37d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted_query/similarity-jaccard-sorted_query.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard-sorted_query/similarity-jaccard-sorted_query.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard_query/similarity-jaccard_query.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard_query/similarity-jaccard_query.3.ast
index 9a20266..01d099d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard_query/similarity-jaccard_query.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/similarity/similarity-jaccard_query/similarity-jaccard_query.3.ast
@@ -4,8 +4,8 @@
 SELECT ELEMENT [
 Variable [ Name=$paper ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [DBLP]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.DBLP]
   ]
   AS Variable [ Name=$paper ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation-with-filtering/cell-aggregation-with-filtering.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation-with-filtering/cell-aggregation-with-filtering.3.ast
index 956cabf..e430618 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation-with-filtering/cell-aggregation-with-filtering.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation-with-filtering/cell-aggregation-with-filtering.3.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TwitterData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.TwitterData]
   ]
   AS Variable [ Name=$t ]
 ]
@@ -89,6 +89,8 @@
   GROUP AS Variable [ Name=$g ]
   (
     t:=Variable [ Name=$t ]
+    keywords:=Variable [ Name=$keywords ]
+    region:=Variable [ Name=$region ]
   )
 
 Let Variable [ Name=$num ]
@@ -96,7 +98,10 @@
   FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      Variable [ Name=$t ]
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [t]
+      ]
       ]
       FROM [        Variable [ Name=$g ]
         AS Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation/cell-aggregation.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation/cell-aggregation.3.ast
index 87ebfdb..26afbc0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation/cell-aggregation.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/cell-aggregation/cell-aggregation.3.ast
@@ -17,8 +17,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [MyData]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.MyData]
       ]
       AS Variable [ Name=$o ]
     ]
@@ -47,10 +47,9 @@
       FunctionCall asterix.count@1[
         (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [o]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$c ]
+            LiteralExpr [STRING] [o]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/circle-intersect-circle/circle-intersect-circle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/circle-intersect-circle/circle-intersect-circle.3.ast
index 5040c1b..576e12e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/circle-intersect-circle/circle-intersect-circle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/circle-intersect-circle/circle-intersect-circle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/create-rtree-index/create-rtree-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/create-rtree-index/create-rtree-index.3.ast
index 58d5fdc..ad58f7d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/create-rtree-index/create-rtree-index.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/create-rtree-index/create-rtree-index.3.ast
@@ -6,8 +6,8 @@
   Field=id
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/distance-between-points/distance-between-points.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/distance-between-points/distance-between-points.3.ast
index 3843218..806c6d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/distance-between-points/distance-between-points.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/distance-between-points/distance-between-points.3.ast
@@ -17,8 +17,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-circle/line-intersect-circle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-circle/line-intersect-circle.3.ast
index d86e0a2..4c5531f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-circle/line-intersect-circle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-circle/line-intersect-circle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-line/line-intersect-line.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-line/line-intersect-line.3.ast
index 61a0bec..c81ec44 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-line/line-intersect-line.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-line/line-intersect-line.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-polygon/line-intersect-polygon.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-polygon/line-intersect-polygon.3.ast
index c61ff06..7e39b21 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-polygon/line-intersect-polygon.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-polygon/line-intersect-polygon.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-rectangle/line-intersect-rectangle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-rectangle/line-intersect-rectangle.3.ast
index 03641af..a5c81e2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-rectangle/line-intersect-rectangle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/line-intersect-rectangle/line-intersect-rectangle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-equals-point/point-equals-point.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-equals-point/point-equals-point.3.ast
index 061b28e..aaf9a36 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-equals-point/point-equals-point.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-equals-point/point-equals-point.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-circle/point-in-circle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-circle/point-in-circle.3.ast
index 6dd5acf..ae6469b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-circle/point-in-circle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-circle/point-in-circle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-polygon/point-in-polygon.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-polygon/point-in-polygon.3.ast
index 1b1c871..f614085 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-polygon/point-in-polygon.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-polygon/point-in-polygon.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-rectangle/point-in-rectangle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-rectangle/point-in-rectangle.3.ast
index 0ed156a..75c6087 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-rectangle/point-in-rectangle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-in-rectangle/point-in-rectangle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-on-line/point-on-line.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-on-line/point-on-line.3.ast
index d42bc6d..a47745c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-on-line/point-on-line.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/point-on-line/point-on-line.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-circle/polygon-intersect-circle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-circle/polygon-intersect-circle.3.ast
index a5b2bce..783c331 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-circle/polygon-intersect-circle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-circle/polygon-intersect-circle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-polygon/polygon-intersect-polygon.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-polygon/polygon-intersect-polygon.3.ast
index 7db7bd7..65f6dea 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-polygon/polygon-intersect-polygon.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-polygon/polygon-intersect-polygon.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-rectangle/polygon-intersect-rectangle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-rectangle/polygon-intersect-rectangle.3.ast
index 823b733..87b6006 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-rectangle/polygon-intersect-rectangle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/polygon-intersect-rectangle/polygon-intersect-rectangle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-circle/rectangle-intersect-circle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-circle/rectangle-intersect-circle.3.ast
index b32c632..0c3d894 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-circle/rectangle-intersect-circle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-circle/rectangle-intersect-circle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-rectangle/rectangle-intersect-rectangle.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-rectangle/rectangle-intersect-rectangle.3.ast
index cb1d05b..33c7191 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-rectangle/rectangle-intersect-rectangle.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/spatial/rectangle-intersect-rectangle/rectangle-intersect-rectangle.3.ast
@@ -12,8 +12,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.MyData]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/cpttostr01/cpttostr01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/cpttostr01/cpttostr01.3.ast
index f3fe952..67695cc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/cpttostr01/cpttostr01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/cpttostr01/cpttostr01.3.ast
@@ -8,8 +8,8 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/matches05/matches05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/matches05/matches05.3.ast
index 046dd8e..9a81914 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/matches05/matches05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/matches05/matches05.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds1]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds1]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strconcat01/strconcat01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strconcat01/strconcat01.3.ast
index 5109d04..edb4853 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strconcat01/strconcat01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strconcat01/strconcat01.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strlen03/strlen03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strlen03/strlen03.3.ast
index 6e1db4d..f25307f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strlen03/strlen03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/strlen03/strlen03.3.ast
@@ -8,8 +8,8 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast
index 9e8f66d..a86d0a4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr01/substr01.3.ast
@@ -5,7 +5,7 @@
     :
     FunctionCall null.substring@2[
       LiteralExpr [STRING] [Hello World]
-      LiteralExpr [LONG] [10]
+      LiteralExpr [LONG] [9]
     ]
   )
   (
@@ -13,7 +13,7 @@
     :
     FunctionCall null.substring@2[
       LiteralExpr [STRING] [This is a test string]
-      LiteralExpr [LONG] [21]
+      LiteralExpr [LONG] [20]
     ]
   )
   (
@@ -21,7 +21,7 @@
     :
     FunctionCall null.substring@2[
       LiteralExpr [STRING] [This is a test string]
-      LiteralExpr [LONG] [22]
+      LiteralExpr [LONG] [21]
     ]
   )
   (
@@ -50,7 +50,7 @@
           LiteralExpr [STRING] [This is a another test string]
         ]
       ]
-      LiteralExpr [LONG] [21]
+      LiteralExpr [LONG] [20]
     ]
   )
   (
@@ -59,11 +59,15 @@
     FunctionCall null.substring@2[
       LiteralExpr [STRING] [UC Irvine]
       OperatorExpr [
-        FunctionCall null.string-length@1[
-          LiteralExpr [STRING] [UC Irvine]
+        OperatorExpr [
+          FunctionCall null.string-length@1[
+            LiteralExpr [STRING] [UC Irvine]
+          ]
+          /
+          LiteralExpr [LONG] [2]
         ]
-        /
-        LiteralExpr [LONG] [2]
+        -
+        LiteralExpr [LONG] [1]
       ]
     ]
   )
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr04/substr04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr04/substr04.3.ast
index ccd395d..f85b949 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr04/substr04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr04/substr04.3.ast
@@ -5,32 +5,32 @@
 FROM [  OrderedListConstructor [
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [hello world]
-      LiteralExpr [LONG] [7]
+      LiteralExpr [LONG] [6]
       LiteralExpr [LONG] [5]
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [hello world]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       LiteralExpr [LONG] [11]
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [hello world]
-      LiteralExpr [LONG] [3]
+      LiteralExpr [LONG] [2]
       LiteralExpr [LONG] [9]
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [ABCD]
-      LiteralExpr [LONG] [3]
+      LiteralExpr [LONG] [2]
       LiteralExpr [LONG] [2]
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [ABCD]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       LiteralExpr [LONG] [4]
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [UC Irvine]
-      LiteralExpr [LONG] [4]
+      LiteralExpr [LONG] [3]
       OperatorExpr [
         FunctionCall null.string-length@1[
           LiteralExpr [STRING] [UC Irvine]
@@ -41,7 +41,7 @@
     ]
     FunctionCall null.substring@3[
       LiteralExpr [STRING] [UC Irvine]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       FunctionCall null.string-length@1[
         LiteralExpr [STRING] [UC Irvine]
       ]
@@ -49,9 +49,9 @@
     FunctionCall null.substring@3[
       FunctionCall null.substring@2[
         LiteralExpr [STRING] [UC Irvine]
-        LiteralExpr [LONG] [4]
+        LiteralExpr [LONG] [3]
       ]
-      LiteralExpr [LONG] [1]
+      LiteralExpr [LONG] [0]
       FunctionCall null.string-length@1[
         LiteralExpr [STRING] [Irvine]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr05/substr05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr05/substr05.3.ast
index caa541f..685a3b4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr05/substr05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr05/substr05.3.ast
@@ -6,7 +6,7 @@
     Variable [ Name=$a ]
     Field=name
   ]
-  LiteralExpr [LONG] [4]
+  LiteralExpr [LONG] [3]
   OperatorExpr [
     FunctionCall test.string-length@1[
       FieldAccessor [
@@ -19,8 +19,8 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr06/substr06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr06/substr06.3.ast
index 6248340..f27bf4d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr06/substr06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substr06/substr06.3.ast
@@ -6,11 +6,11 @@
     Variable [ Name=$a ]
     Field=name
   ]
-  LiteralExpr [LONG] [4]
+  LiteralExpr [LONG] [3]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testdst]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testdst]
   ]
   AS Variable [ Name=$a ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-1/substring2-1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-1/substring2-1.3.ast
index ed84aaa..c170655 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-1/substring2-1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-1/substring2-1.3.ast
@@ -6,7 +6,7 @@
     :
     FunctionCall test.substring@2[
       LiteralExpr [STRING] [HEllow]
-      LiteralExpr [LONG] [2]
+      LiteralExpr [LONG] [1]
     ]
   )
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-3/substring2-3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-3/substring2-3.3.ast
index 865e373..358d135 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-3/substring2-3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring2-3/substring2-3.3.ast
@@ -6,7 +6,7 @@
     :
     FunctionCall test.substring@2[
       LiteralExpr [STRING] [HEllow]
-      LiteralExpr [LONG] [10]
+      LiteralExpr [LONG] [9]
     ]
   )
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring_01/substring_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring_01/substring_01.3.ast
index cd3b906..d24c5b8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring_01/substring_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/substring_01/substring_01.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 FunctionCall test.substring@3[
   Variable [ Name=$x ]
-  LiteralExpr [LONG] [2]
+  LiteralExpr [LONG] [1]
   LiteralExpr [LONG] [3]
 ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/toLowerCase03/toLowerCase03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/toLowerCase03/toLowerCase03.3.ast
index 885501d..a9aed30 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/toLowerCase03/toLowerCase03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/string/toLowerCase03/toLowerCase03.3.ast
@@ -8,8 +8,8 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.testds]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ast
deleted file mode 100644
index 2192c6c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl LineItemType [
-  closed RecordType {
-    l_orderkey : bigint,
-    l_partkey : bigint,
-    l_suppkey : bigint,
-    l_linenumber : bigint,
-    l_quantity : bigint,
-    l_extendedprice : double,
-    l_discount : double,
-    l_tax : double,
-    l_returnflag : string,
-    l_linestatus : string,
-    l_shipdate : string,
-    l_commitdate : string,
-    l_receiptdate : string,
-    l_shipinstruct : string,
-    l_shipmode : string,
-    l_comment : string
-  }
-]
-DatasetDecl LineItem(LineItemType) partitioned by [[l_orderkey], [l_linenumber]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.4.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
deleted file mode 100644
index 89cac37..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset-with-index/delete-from-loaded-dataset-with-index.5.ast
+++ /dev/null
@@ -1,31 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$c ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
-  ]
-  AS Variable [ Name=$c ]
-]
-Where
-  OperatorExpr [
-    FieldAccessor [
-      Variable [ Name=$c ]
-      Field=l_suppkey
-    ]
-    <
-    LiteralExpr [LONG] [150]
-  ]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_orderkey
-  ]
-  ASC
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_linenumber
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ast
deleted file mode 100644
index 2192c6c..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl LineItemType [
-  closed RecordType {
-    l_orderkey : bigint,
-    l_partkey : bigint,
-    l_suppkey : bigint,
-    l_linenumber : bigint,
-    l_quantity : bigint,
-    l_extendedprice : double,
-    l_discount : double,
-    l_tax : double,
-    l_returnflag : string,
-    l_linestatus : string,
-    l_shipdate : string,
-    l_commitdate : string,
-    l_receiptdate : string,
-    l_shipinstruct : string,
-    l_shipmode : string,
-    l_comment : string
-  }
-]
-DatasetDecl LineItem(LineItemType) partitioned by [[l_orderkey], [l_linenumber]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast
deleted file mode 100644
index 38a6ea9..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/delete-from-loaded-dataset/delete-from-loaded-dataset.3.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$c ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
-  ]
-  AS Variable [ Name=$c ]
-]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_orderkey
-  ]
-  ASC
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_linenumber
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ast
deleted file mode 100644
index 27e4cf5..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl Name [
-  open RecordType {
-    first : string,
-    last : string
-  }
-]
-TypeDecl Person [
-  open RecordType {
-    name : Name
-  }
-]
-TypeDecl TestType [
-  open RecordType {
-    id : integer,
-    name : string,
-    locn : point,
-    zip : string,
-    person : Person
-  }
-]
-DatasetDecl t1(TestType) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.2.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast
deleted file mode 100644
index 3a1ea0a..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.3.ast
+++ /dev/null
@@ -1,29 +0,0 @@
-Query:
-SELECT ELEMENT [
-Variable [ Name=$l ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Metadata.Index]
-  ]
-  AS Variable [ Name=$l ]
-]
-Where
-  OperatorExpr [
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$l ]
-        Field=IsPrimary
-      ]
-      =
-      LiteralExpr [FALSE]
-    ]
-    and
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$l ]
-        Field=DataverseName
-      ]
-      =
-      LiteralExpr [STRING] [test]
-    ]
-  ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.1.ast
deleted file mode 100644
index 13f1f01..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl Schema [
-  closed RecordType {
-    unique1 : bigint,
-    unique2 : bigint,
-    two : bigint,
-    four : bigint,
-    ten : bigint,
-    twenty : bigint,
-    onePercent : bigint,
-    tenPercent : bigint,
-    twentyPercent : bigint,
-    fiftyPercent : bigint,
-    unique3 : bigint,
-    evenOnePercent : bigint,
-    oddOnePercent : bigint,
-    stringu1 : string,
-    stringu2 : string,
-    string4 : string
-  }
-]
-DatasetDecl t1(Schema) partitioned by [[unique2]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.4.ast
deleted file mode 100644
index 6802467..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/drop-index/drop-index.4.ast
+++ /dev/null
@@ -1,30 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$a ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t1]
-  ]
-  AS Variable [ Name=$a ]
-]
-Where
-  OperatorExpr [
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$a ]
-        Field=unique1
-      ]
-      >
-      LiteralExpr [LONG] [10]
-    ]
-    and
-    OperatorExpr [
-      FieldAccessor [
-        Variable [ Name=$a ]
-        Field=stringu1
-      ]
-      =
-      LiteralExpr [STRING] [DGAAAAXXXXXXXXXXXXXXXXXXX]
-    ]
-  ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ast
deleted file mode 100644
index 17dc8b5..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl LineItemType [
-  closed RecordType {
-    l_orderkey : bigint,
-    l_partkey : bigint,
-    l_suppkey : bigint,
-    l_linenumber : bigint,
-    l_quantity : double,
-    l_extendedprice : double,
-    l_discount : double,
-    l_tax : double,
-    l_returnflag : string,
-    l_linestatus : string,
-    l_shipdate : string,
-    l_commitdate : string,
-    l_receiptdate : string,
-    l_shipinstruct : string,
-    l_shipmode : string,
-    l_comment : string
-  }
-]
-DatasetDecl LineItem(LineItemType) partitioned by [[l_orderkey], [l_linenumber]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.ast
deleted file mode 100644
index d52d730..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/empty-load-with-index/empty-load-with-index.3.ast
+++ /dev/null
@@ -1,24 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$c ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
-  ]
-  AS Variable [ Name=$c ]
-]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_orderkey
-  ]
-  ASC
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=l_linenumber
-  ]
-  ASC
-
-Limit
-  LiteralExpr [LONG] [1]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ast
deleted file mode 100644
index d8ba369..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.1.ast
+++ /dev/null
@@ -1,10 +0,0 @@
-TypeDecl Emp [
-  closed RecordType {
-    id : bigint,
-    fname : string,
-    lname : string,
-    age : bigint,
-    dept : string
-  }
-]
-DatasetDecl employee(Emp) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast
deleted file mode 100644
index 4a6c0e4e5f..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset-with-index/insert-and-scan-dataset-with-index.3.ast
+++ /dev/null
@@ -1,17 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$l ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [test.employee]
-  ]
-  AS Variable [ Name=$l ]
-]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$l ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ast
deleted file mode 100644
index d546e56..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.1.ast
+++ /dev/null
@@ -1,7 +0,0 @@
-DataverseUse test
-TypeDecl myDataType [
-  open RecordType {
-    id : bigint
-  }
-]
-DatasetDecl myData(myDataType) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.ast
deleted file mode 100644
index bb37414..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/insert-and-scan-dataset/insert-and-scan-dataset.3.ast
+++ /dev/null
@@ -1,17 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-Variable [ Name=$c ]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [myData]
-  ]
-  AS Variable [ Name=$c ]
-]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$c ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ast
deleted file mode 100644
index c1ede5e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse tpch
-TypeDecl LineItemType [
-  closed RecordType {
-    l_orderkey : bigint,
-    l_partkey : bigint,
-    l_suppkey : bigint,
-    l_linenumber : bigint,
-    l_quantity : double,
-    l_extendedprice : double,
-    l_discount : double,
-    l_tax : double,
-    l_returnflag : string,
-    l_linestatus : string,
-    l_shipdate : string,
-    l_commitdate : string,
-    l_receiptdate : string,
-    l_shipinstruct : string,
-    l_shipmode : string,
-    l_comment : string
-  }
-]
-DatasetDecl LineItem(LineItemType) partitioned by [[l_orderkey], [l_linenumber]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.ast
deleted file mode 100644
index 0a5cca1..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse tpch
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
deleted file mode 100644
index 90ebf05..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
+++ /dev/null
@@ -1,249 +0,0 @@
-DataverseUse tpch
-Set import-private-functions=true
-Query:
-SELECT ELEMENT [
-RecordConstructor [
-  (
-    LiteralExpr [STRING] [l_returnflag]
-    :
-    Variable [ Name=$l_returnflag ]
-  )
-  (
-    LiteralExpr [STRING] [l_linestatus]
-    :
-    Variable [ Name=$l_linestatus ]
-  )
-  (
-    LiteralExpr [STRING] [sum_qty]
-    :
-    FunctionCall asterix.sql-sum@1[
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          FieldAccessor [
-            Variable [ Name=#2 ]
-            Field=l
-          ]
-          Field=l_quantity
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#2 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [sum_base_price]
-    :
-    FunctionCall asterix.sql-sum@1[
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          FieldAccessor [
-            Variable [ Name=#3 ]
-            Field=l
-          ]
-          Field=l_extendedprice
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#3 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [sum_disc_price]
-    :
-    FunctionCall asterix.sql-sum@1[
-      (
-        SELECT ELEMENT [
-        OperatorExpr [
-          FieldAccessor [
-            FieldAccessor [
-              Variable [ Name=#4 ]
-              Field=l
-            ]
-            Field=l_extendedprice
-          ]
-          *
-          OperatorExpr [
-            LiteralExpr [LONG] [1]
-            -
-            FieldAccessor [
-              FieldAccessor [
-                Variable [ Name=#4 ]
-                Field=l
-              ]
-              Field=l_discount
-            ]
-          ]
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#4 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [sum_charge]
-    :
-    FunctionCall asterix.sql-sum@1[
-      (
-        SELECT ELEMENT [
-        OperatorExpr [
-          FieldAccessor [
-            FieldAccessor [
-              Variable [ Name=#5 ]
-              Field=l
-            ]
-            Field=l_extendedprice
-          ]
-          *
-          OperatorExpr [
-            LiteralExpr [LONG] [1]
-            -
-            FieldAccessor [
-              FieldAccessor [
-                Variable [ Name=#5 ]
-                Field=l
-              ]
-              Field=l_discount
-            ]
-          ]
-          *
-          OperatorExpr [
-            LiteralExpr [LONG] [1]
-            +
-            FieldAccessor [
-              FieldAccessor [
-                Variable [ Name=#5 ]
-                Field=l
-              ]
-              Field=l_tax
-            ]
-          ]
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#5 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [ave_qty]
-    :
-    FunctionCall asterix.sql-avg@1[
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          FieldAccessor [
-            Variable [ Name=#6 ]
-            Field=l
-          ]
-          Field=l_quantity
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#6 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [ave_price]
-    :
-    FunctionCall asterix.sql-avg@1[
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          FieldAccessor [
-            Variable [ Name=#7 ]
-            Field=l
-          ]
-          Field=l_extendedprice
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#7 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [ave_disc]
-    :
-    FunctionCall asterix.sql-avg@1[
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          FieldAccessor [
-            Variable [ Name=#8 ]
-            Field=l
-          ]
-          Field=l_discount
-        ]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#8 ]
-        ]
-      )
-    ]
-  )
-  (
-    LiteralExpr [STRING] [count_order]
-    :
-    FunctionCall asterix.sql-count@1[
-      (
-        SELECT ELEMENT [
-        LiteralExpr [LONG] [1]
-        ]
-        FROM [          Variable [ Name=#1 ]
-          AS Variable [ Name=#9 ]
-        ]
-      )
-    ]
-  )
-]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
-  ]
-  AS Variable [ Name=$l ]
-]
-Where
-  OperatorExpr [
-    FieldAccessor [
-      Variable [ Name=$l ]
-      Field=l_shipdate
-    ]
-    <=
-    LiteralExpr [STRING] [1998-09-02]
-  ]
-Groupby
-  Variable [ Name=$l_returnflag ]
-  :=
-  FieldAccessor [
-    Variable [ Name=$l ]
-    Field=l_returnflag
-  ]
-  Variable [ Name=$l_linestatus ]
-  :=
-  FieldAccessor [
-    Variable [ Name=$l ]
-    Field=l_linestatus
-  ]
-  GROUP AS Variable [ Name=#1 ]
-  (
-    l:=Variable [ Name=$l ]
-  )
-
-Orderby
-  Variable [ Name=$l_returnflag ]
-  ASC
-  Variable [ Name=$l_linestatus ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ast
deleted file mode 100644
index 9e01d19..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.1.ast
+++ /dev/null
@@ -1,15 +0,0 @@
-DataverseUse test
-TypeDecl MyRecord [
-  closed RecordType {
-    id : bigint,
-    point : point,
-    kwds : string,
-    line1 : line,
-    line2 : line,
-    poly1 : polygon,
-    poly2 : polygon,
-    rec : rectangle,
-    circle : circle
-  }
-]
-DatasetDecl MyData(MyRecord) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.4.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
deleted file mode 100644
index f814183..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-delete-rtree-secondary-index/scan-delete-rtree-secondary-index.5.ast
+++ /dev/null
@@ -1,45 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-RecordConstructor [
-  (
-    LiteralExpr [STRING] [id]
-    :
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=id
-    ]
-  )
-]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyData]
-  ]
-  AS Variable [ Name=$o ]
-]
-Where
-  FunctionCall test.spatial-intersect@2[
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=point
-    ]
-    FunctionCall test.create-polygon@1[
-      OrderedListConstructor [
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [1.0]
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [1.0]
-      ]
-    ]
-  ]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$o ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ast
deleted file mode 100644
index 79e3a90..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl MyRecord [
-  closed RecordType {
-    id : bigint,
-    point : point,
-    kwds : string,
-    line1 : line,
-    line2 : line,
-    poly1 : polygon,
-    poly2 : polygon,
-    rec : rectangle,
-    circle : circle
-  }
-]
-TypeDecl MyMiniRecord [
-  closed RecordType {
-    id : bigint,
-    point : point
-  }
-]
-DatasetDecl MyData(MyRecord) partitioned by [[id]]
-DatasetDecl MyMiniData(MyMiniRecord) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.4.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.ast
deleted file mode 100644
index bc7ec93..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-persistent-to-temp/scan-insert-persistent-to-temp.5.ast
+++ /dev/null
@@ -1,45 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-RecordConstructor [
-  (
-    LiteralExpr [STRING] [id]
-    :
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=id
-    ]
-  )
-]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
-  ]
-  AS Variable [ Name=$o ]
-]
-Where
-  FunctionCall test.spatial-intersect@2[
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=point
-    ]
-    FunctionCall test.create-polygon@1[
-      OrderedListConstructor [
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [1.0]
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [1.0]
-      ]
-    ]
-  ]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$o ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ast
deleted file mode 100644
index 79e3a90..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl MyRecord [
-  closed RecordType {
-    id : bigint,
-    point : point,
-    kwds : string,
-    line1 : line,
-    line2 : line,
-    poly1 : polygon,
-    poly2 : polygon,
-    rec : rectangle,
-    circle : circle
-  }
-]
-TypeDecl MyMiniRecord [
-  closed RecordType {
-    id : bigint,
-    point : point
-  }
-]
-DatasetDecl MyData(MyRecord) partitioned by [[id]]
-DatasetDecl MyMiniData(MyMiniRecord) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.4.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
deleted file mode 100644
index bc7ec93..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-rtree-secondary-index/scan-insert-rtree-secondary-index.5.ast
+++ /dev/null
@@ -1,45 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-RecordConstructor [
-  (
-    LiteralExpr [STRING] [id]
-    :
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=id
-    ]
-  )
-]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
-  ]
-  AS Variable [ Name=$o ]
-]
-Where
-  FunctionCall test.spatial-intersect@2[
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=point
-    ]
-    FunctionCall test.create-polygon@1[
-      OrderedListConstructor [
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [1.0]
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [1.0]
-      ]
-    ]
-  ]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$o ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ast
deleted file mode 100644
index 79e3a90..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.1.ast
+++ /dev/null
@@ -1,22 +0,0 @@
-DataverseUse test
-TypeDecl MyRecord [
-  closed RecordType {
-    id : bigint,
-    point : point,
-    kwds : string,
-    line1 : line,
-    line2 : line,
-    poly1 : polygon,
-    poly2 : polygon,
-    rec : rectangle,
-    circle : circle
-  }
-]
-TypeDecl MyMiniRecord [
-  closed RecordType {
-    id : bigint,
-    point : point
-  }
-]
-DatasetDecl MyData(MyRecord) partitioned by [[id]]
-DatasetDecl MyMiniData(MyMiniRecord) partitioned by [[id]]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.2.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.3.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.4.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.ast
deleted file mode 100644
index bc7ec93..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temp-dataset/scan-insert-temp-to-persistent/scan-insert-temp-to-persistent.5.ast
+++ /dev/null
@@ -1,45 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-RecordConstructor [
-  (
-    LiteralExpr [STRING] [id]
-    :
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=id
-    ]
-  )
-]
-]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [MyMiniData]
-  ]
-  AS Variable [ Name=$o ]
-]
-Where
-  FunctionCall test.spatial-intersect@2[
-    FieldAccessor [
-      Variable [ Name=$o ]
-      Field=point
-    ]
-    FunctionCall test.create-polygon@1[
-      OrderedListConstructor [
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [1.0]
-        LiteralExpr [DOUBLE] [0.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [4.0]
-        LiteralExpr [DOUBLE] [12.0]
-        LiteralExpr [DOUBLE] [1.0]
-      ]
-    ]
-  ]
-Orderby
-  FieldAccessor [
-    Variable [ Name=$o ]
-    Field=id
-  ]
-  ASC
-
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds/insert_from_ext_ds.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds/insert_from_ext_ds.3.ast
index b86efca..8d9a818 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds/insert_from_ext_ds.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds/insert_from_ext_ds.3.ast
@@ -60,8 +60,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [testds]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [testdvt.testds]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds_2/insert_from_ext_ds_2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds_2/insert_from_ext_ds_2.3.ast
index 8b4bda8..74f9cff 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds_2/insert_from_ext_ds_2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/insert_from_ext_ds_2/insert_from_ext_ds_2.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$r ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [timeData]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [timeTest.timeData]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_0/interval_bin_gby_0.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_0/interval_bin_gby_0.3.ast
index 3845b11..4819073 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_0/interval_bin_gby_0.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_0/interval_bin_gby_0.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tsdata]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.tsdata]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_1/interval_bin_gby_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_1/interval_bin_gby_1.3.ast
index 6e6e16d..10467b9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_1/interval_bin_gby_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/interval_bin_gby_1/interval_bin_gby_1.3.ast
@@ -26,8 +26,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [tsdata]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.tsdata]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_0/overlap_bins_gby_0.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_0/overlap_bins_gby_0.3.ast
index 155bef0..36fb0a1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_0/overlap_bins_gby_0.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_0/overlap_bins_gby_0.3.ast
@@ -41,10 +41,9 @@
         :
         (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [i]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$bin ]
+            LiteralExpr [STRING] [i]
           ]
           ]
           FROM [            Variable [ Name=$g ]
@@ -58,8 +57,8 @@
         SELECT ELEMENT [
         Variable [ Name=$i ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [tsdata]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [test.tsdata]
           ]
           AS Variable [ Name=$i ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.ast
index 94cd539..f30c61a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_1/overlap_bins_gby_1.3.ast
@@ -10,20 +10,13 @@
   (
     LiteralExpr [STRING] [count]
     :
-    FunctionCall asterix.sql-count@1[
+    FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        (
-          SELECT ELEMENT [
-          LiteralExpr [LONG] [1]
-          ]
-          FROM [            Variable [ Name=$g ]
-            AS Variable [ Name=$g ]
-          ]
-        )
+        LiteralExpr [LONG] [1]
         ]
         FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=#1 ]
+          AS Variable [ Name=$g ]
         ]
       )
     ]
@@ -76,8 +69,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [tsdata]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [test.tsdata]
       ]
       AS Variable [ Name=$i1 ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_3/overlap_bins_gby_3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_3/overlap_bins_gby_3.3.ast
index af17428..2a3e8f2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_3/overlap_bins_gby_3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/temporal/overlap_bins_gby_3/overlap_bins_gby_3.3.ast
@@ -37,8 +37,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [logs]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [multitask.logs]
         ]
         AS Variable [ Name=$i ]
       ]
@@ -102,8 +102,8 @@
             Field=time
           ]
           ]
-          FROM [            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [logs]
+          FROM [            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [multitask.logs]
             ]
             AS Variable [ Name=$i ]
           ]
@@ -130,8 +130,8 @@
             ]
           ]
           ]
-          FROM [            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [logs]
+          FROM [            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [multitask.logs]
             ]
             AS Variable [ Name=$i ]
           ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.10.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.10.ast
index 4f9e4ae..212935c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.10.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.10.ast
@@ -26,8 +26,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -57,8 +57,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.11.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.11.ast
index c246b60..16588b6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.11.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.11.ast
@@ -44,8 +44,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t ]
       ]
@@ -71,8 +71,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.12.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.12.ast
index 72f7150..6363ade 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.12.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.12.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$fbu ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
@@ -18,7 +18,7 @@
       ]
     ]
     Satifies [
-      FunctionCall null.is-missing@1[
+      FunctionCall algebricks.is-missing@1[
         FieldAccessor [
           Variable [ Name=$e ]
           Field=end-date
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.13.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.13.ast
index 733dc37..c39794f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.13.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.13.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$fbu ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
@@ -18,8 +18,8 @@
       ]
     ]
     Satifies [
-      FunctionCall null.not@1[
-        FunctionCall null.is-missing@1[
+      FunctionCall algebricks.not@1[
+        FunctionCall algebricks.is-missing@1[
           FieldAccessor [
             Variable [ Name=$e ]
             Field=end-date
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.14.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.14.ast
index 08c931a..cd4f470 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.14.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.14.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$fbu ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$fbu ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.15.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.15.ast
index 210e276..924355c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.15.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.15.ast
@@ -23,8 +23,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.16.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.16.ast
index 210e276..924355c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.16.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.16.ast
@@ -23,8 +23,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.17.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.17.ast
index f3e7d16..d48ccd0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.17.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.17.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.18.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.18.ast
index f00ce81..77d5ae0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.18.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.18.ast
@@ -19,8 +19,8 @@
         Field=referred-topics
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -61,8 +61,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.20.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.20.ast
index dca454e..07f6dca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.20.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.20.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$t ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.22.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.22.ast
index b12acb3..799b4fcb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.22.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.22.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$t ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TweetMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.TweetMessages]
       ]
       AS Variable [ Name=$t ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.23.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.23.ast
index de6b8d6..32e545b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.23.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.23.ast
@@ -57,8 +57,8 @@
 )
 finer
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
index 06fdeb4..cdd8a53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.24.ast
@@ -16,17 +16,17 @@
     Variable [ Name=$message ]
     Field=message
   ]
-  LiteralExpr [LONG] [30]
+  LiteralExpr [LONG] [29]
 ]
 msg
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
@@ -78,7 +78,7 @@
       Variable [ Name=$message ]
       Field=message
     ]
-    LiteralExpr [LONG] [30]
+    LiteralExpr [LONG] [29]
   ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.25.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.25.ast
index 8985862..a1377a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.25.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.25.ast
@@ -11,8 +11,8 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookMessages]
       ]
       AS Variable [ Name=$message ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.26.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.26.ast
index ead363d..eb31c41 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.26.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.26.ast
@@ -1,14 +1,7 @@
 DataverseUse TinySocial
 Query:
 SELECT [
-FieldAccessor [
-  FunctionCall Metadata.resolve@-1[
-    LiteralExpr [STRING] [employment]
-    Variable [ Name=#1 ]
-    Variable [ Name=$organization-name ]
-  ]
-  Field=organization-name
-]
+Variable [ Name=$organization-name ]
 organization
 FunctionCall asterix.sql-avg@1[
   (
@@ -100,8 +93,8 @@
 ]
 max
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ,
@@ -125,13 +118,6 @@
   )
 
 Orderby
-  FieldAccessor [
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [employment]
-      Variable [ Name=#1 ]
-      Variable [ Name=$organization-name ]
-    ]
-    Field=organization-name
-  ]
+  Variable [ Name=$organization-name ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.27.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.27.ast
index dccec7c..7df69ee 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.27.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.27.ast
@@ -91,8 +91,8 @@
 ]
 max
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ,
@@ -103,3 +103,9 @@
   AS Variable [ Name=$employment ]
 ]
 Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    fbu:=Variable [ Name=$fbu ]
+    employment:=Variable [ Name=$employment ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.4.ast
index d26d606..5b66e81 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.5.ast
index b31cba5..a2c6789 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.6.ast
index 1d90356..1447bdc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.6.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.7.ast
index b38e679..a88ce96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.7.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.8.ast
index b38e679..a88ce96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.8.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.9.ast
index 1d228cf..2df77ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite-open/tinysocial-suite.9.ast
@@ -20,8 +20,8 @@
         Field=message
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [FacebookMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.FacebookMessages]
         ]
         AS Variable [ Name=$message ]
       ]
@@ -48,8 +48,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.10.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.10.ast
index 4f9e4ae..212935c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.10.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.10.ast
@@ -26,8 +26,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -57,8 +57,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.11.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.11.ast
index c246b60..16588b6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.11.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.11.ast
@@ -44,8 +44,8 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t ]
       ]
@@ -71,8 +71,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.12.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.12.ast
index 72f7150..6363ade 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.12.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.12.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$fbu ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
@@ -18,7 +18,7 @@
       ]
     ]
     Satifies [
-      FunctionCall null.is-missing@1[
+      FunctionCall algebricks.is-missing@1[
         FieldAccessor [
           Variable [ Name=$e ]
           Field=end-date
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.13.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.13.ast
index 733dc37..c39794f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.13.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.13.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$fbu ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$fbu ]
 ]
@@ -18,8 +18,8 @@
       ]
     ]
     Satifies [
-      FunctionCall null.not@1[
-        FunctionCall null.is-missing@1[
+      FunctionCall algebricks.not@1[
+        FunctionCall algebricks.is-missing@1[
           FieldAccessor [
             Variable [ Name=$e ]
             Field=end-date
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.14.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.14.ast
index 08c931a..cd4f470 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.14.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.14.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$fbu ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookUsers]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookUsers]
       ]
       AS Variable [ Name=$fbu ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.15.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.15.ast
index 210e276..924355c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.15.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.15.ast
@@ -23,8 +23,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.16.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.16.ast
index 210e276..924355c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.16.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.16.ast
@@ -23,8 +23,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.17.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.17.ast
index f3e7d16..d48ccd0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.17.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.17.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.18.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.18.ast
index f00ce81..77d5ae0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.18.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.18.ast
@@ -19,8 +19,8 @@
         Field=referred-topics
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [TweetMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.TweetMessages]
         ]
         AS Variable [ Name=$t2 ]
       ]
@@ -61,8 +61,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.20.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.20.ast
index dca454e..07f6dca 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.20.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.20.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$t ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.22.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.22.ast
index b12acb3..799b4fcb 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.22.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.22.ast
@@ -6,8 +6,8 @@
     SELECT ELEMENT [
     Variable [ Name=$t ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [TweetMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.TweetMessages]
       ]
       AS Variable [ Name=$t ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.23.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.23.ast
index de6b8d6..32e545b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.23.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.23.ast
@@ -57,8 +57,8 @@
 )
 finer
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TweetMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.TweetMessages]
   ]
   AS Variable [ Name=$t ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
index 06fdeb4..cdd8a53 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.24.ast
@@ -16,17 +16,17 @@
     Variable [ Name=$message ]
     Field=message
   ]
-  LiteralExpr [LONG] [30]
+  LiteralExpr [LONG] [29]
 ]
 msg
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
@@ -78,7 +78,7 @@
       Variable [ Name=$message ]
       Field=message
     ]
-    LiteralExpr [LONG] [30]
+    LiteralExpr [LONG] [29]
   ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.25.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.25.ast
index 8985862..a1377a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.25.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.25.ast
@@ -11,8 +11,8 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [FacebookMessages]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [TinySocial.FacebookMessages]
       ]
       AS Variable [ Name=$message ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.4.ast
index d26d606..5b66e81 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.4.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.5.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.5.ast
index b31cba5..a2c6789 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.5.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.5.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.6.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.6.ast
index 1d90356..1447bdc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.6.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.6.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$user ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.7.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.7.ast
index b38e679..a88ce96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.7.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.7.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.8.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.8.ast
index b38e679..a88ce96 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.8.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.8.ast
@@ -20,13 +20,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookMessages]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookMessages]
   ]
   AS Variable [ Name=$message ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.9.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.9.ast
index 1d228cf..2df77ed 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.9.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tinysocial/tinysocial-suite/tinysocial-suite.9.ast
@@ -20,8 +20,8 @@
         Field=message
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [FacebookMessages]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [TinySocial.FacebookMessages]
         ]
         AS Variable [ Name=$message ]
       ]
@@ -48,8 +48,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [FacebookUsers]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TinySocial.FacebookUsers]
   ]
   AS Variable [ Name=$user ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
index 64b8438..0c2ddfa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
@@ -199,11 +199,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -214,8 +212,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
index cc34520..7fc1e5b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
@@ -24,18 +24,18 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -145,12 +145,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [l]
-            Variable [ Name=$o_shippriority ]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$o_orderdate ]
-            Variable [ Name=$l_orderkey ]
+            LiteralExpr [STRING] [l]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q04_order_priority/q04_order_priority.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q04_order_priority/q04_order_priority.3.ast
index 5c8e26f..ecb870c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q04_order_priority/q04_order_priority.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q04_order_priority/q04_order_priority.3.ast
@@ -55,8 +55,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q05_local_supplier_volume/q05_local_supplier_volume.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
index 2672311..2bca9a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
@@ -64,8 +64,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -114,8 +114,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -148,8 +148,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Supplier]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Supplier]
               ]
               AS Variable [ Name=$s ]
 ,
@@ -174,13 +174,13 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Nation]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Nation]
                   ]
                   AS Variable [ Name=$n ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Region]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Region]
                   ]
                   AS Variable [ Name=$r ]
                 ]
@@ -326,10 +326,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [o1]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$n_name ]
+            LiteralExpr [STRING] [o1]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
index 4b18e9c..8e58426 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
@@ -29,8 +29,8 @@
 ]
 revenue
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -82,3 +82,8 @@
     ]
   ]
 Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    l:=Variable [ Name=$l ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q07_volume_shipping/q07_volume_shipping.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q07_volume_shipping/q07_volume_shipping.3.ast
index 940a665..4de6f4e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q07_volume_shipping/q07_volume_shipping.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q07_volume_shipping/q07_volume_shipping.3.ast
@@ -226,13 +226,13 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [LineItem]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.LineItem]
               ]
               AS Variable [ Name=$l ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Orders]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Orders]
               ]
               AS Variable [ Name=$o ]
             ]
@@ -271,8 +271,8 @@
           )
           AS Variable [ Name=$lo ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
         ]
@@ -291,8 +291,8 @@
       )
       AS Variable [ Name=$loc ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Supplier]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Supplier]
       ]
       AS Variable [ Name=$s ]
     ]
@@ -369,6 +369,7 @@
   (
     locs:=Variable [ Name=$locs ]
     t:=Variable [ Name=$t ]
+    l_year0:=Variable [ Name=$l_year0 ]
   )
 
 Let Variable [ Name=$revenue ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q08_national_market_share/q08_national_market_share.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q08_national_market_share/q08_national_market_share.3.ast
index 7ce4dcf..148fe1d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q08_national_market_share/q08_national_market_share.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q08_national_market_share/q08_national_market_share.3.ast
@@ -147,8 +147,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Supplier]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Supplier]
           ]
           AS Variable [ Name=$s ]
 ,
@@ -234,8 +234,8 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [LineItem]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.LineItem]
                   ]
                   AS Variable [ Name=$l ]
 ,
@@ -260,8 +260,8 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Orders]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Orders]
                       ]
                       AS Variable [ Name=$o ]
 ,
@@ -278,8 +278,8 @@
                           )
                         ]
                         ]
-                        FROM [                          FunctionCall Metadata.dataset@1[
-                            LiteralExpr [STRING] [Customer]
+                        FROM [                          FunctionCall asterix.dataset@1[
+                            LiteralExpr [STRING] [tpch.Customer]
                           ]
                           AS Variable [ Name=$c ]
 ,
@@ -296,13 +296,13 @@
                               )
                             ]
                             ]
-                            FROM [                              FunctionCall Metadata.dataset@1[
-                                LiteralExpr [STRING] [Nation]
+                            FROM [                              FunctionCall asterix.dataset@1[
+                                LiteralExpr [STRING] [tpch.Nation]
                               ]
                               AS Variable [ Name=$n1 ]
 ,
-                              FunctionCall Metadata.dataset@1[
-                                LiteralExpr [STRING] [Region]
+                              FunctionCall asterix.dataset@1[
+                                LiteralExpr [STRING] [tpch.Region]
                               ]
                               AS Variable [ Name=$r1 ]
                             ]
@@ -397,8 +397,8 @@
               )
               AS Variable [ Name=$lnrco ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Part]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Part]
               ]
               AS Variable [ Name=$p ]
             ]
@@ -443,8 +443,8 @@
       )
       AS Variable [ Name=$slnrcop ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n2 ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
index 544ee11..683f2f2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
@@ -57,8 +57,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -115,8 +115,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Part]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Part]
           ]
           AS Variable [ Name=$p ]
 ,
@@ -181,8 +181,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Partsupp]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Partsupp]
               ]
               AS Variable [ Name=$ps ]
 ,
@@ -268,13 +268,13 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Supplier]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Supplier]
                       ]
                       AS Variable [ Name=$s ]
 ,
-                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Nation]
+                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Nation]
                       ]
                       AS Variable [ Name=$n ]
                     ]
@@ -293,8 +293,8 @@
                   )
                   AS Variable [ Name=$s1 ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [LineItem]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.LineItem]
                   ]
                   AS Variable [ Name=$l ]
                 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item/q10_returned_item.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item/q10_returned_item.3.ast
index 1509e6a..51d4bfe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item/q10_returned_item.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item/q10_returned_item.3.ast
@@ -121,8 +121,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
@@ -195,18 +195,18 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
@@ -356,16 +356,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [locn]
-            Variable [ Name=$c_address ]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$c_name ]
-            Variable [ Name=$c_phone ]
-            Variable [ Name=$c_acctbal ]
-            Variable [ Name=$n_name ]
-            Variable [ Name=$c_custkey ]
-            Variable [ Name=$c_comment ]
+            LiteralExpr [STRING] [locn]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item_int64/q10_returned_item_int64.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item_int64/q10_returned_item_int64.3.ast
index 1509e6a..51d4bfe 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item_int64/q10_returned_item_int64.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q10_returned_item_int64/q10_returned_item_int64.3.ast
@@ -121,8 +121,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
@@ -195,18 +195,18 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
@@ -356,16 +356,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [locn]
-            Variable [ Name=$c_address ]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$c_name ]
-            Variable [ Name=$c_phone ]
-            Variable [ Name=$c_acctbal ]
-            Variable [ Name=$n_name ]
-            Variable [ Name=$c_custkey ]
-            Variable [ Name=$c_comment ]
+            LiteralExpr [STRING] [locn]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q11_important_stock/q11_important_stock.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q11_important_stock/q11_important_stock.3.ast
index 5ad8aae..b4ae160 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q11_important_stock/q11_important_stock.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q11_important_stock/q11_important_stock.3.ast
@@ -17,8 +17,8 @@
         ]
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Partsupp]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Partsupp]
         ]
         AS Variable [ Name=$ps ]
 ,
@@ -35,13 +35,13 @@
             )
           ]
           ]
-          FROM [            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [Supplier]
+          FROM [            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [tpch.Supplier]
             ]
             AS Variable [ Name=$s ]
 ,
-            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [Nation]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [tpch.Nation]
             ]
             AS Variable [ Name=$n ]
           ]
@@ -134,8 +134,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Partsupp]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Partsupp]
       ]
       AS Variable [ Name=$ps ]
 ,
@@ -152,13 +152,13 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Supplier]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Supplier]
           ]
           AS Variable [ Name=$s ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q12_shipping/q12_shipping.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q12_shipping/q12_shipping.3.ast
index 98af71c..f6b7ea4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q12_shipping/q12_shipping.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q12_shipping/q12_shipping.3.ast
@@ -105,13 +105,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.ast
index 9e21c8f..fcba5ec 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q13_customer_distribution/q13_customer_distribution.3.ast
@@ -36,10 +36,9 @@
             ]
             FROM [              (
                 SELECT ELEMENT [
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [co]
+                FunctionCall asterix.field-access-by-name@2[
                   Variable [ Name=$g2 ]
-                  Variable [ Name=$c_custkey ]
+                  LiteralExpr [STRING] [co]
                 ]
                 ]
                 FROM [                  Variable [ Name=$g2 ]
@@ -75,8 +74,8 @@
                   Field=o_orderkey
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Orders]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Orders]
                   ]
                   AS Variable [ Name=$o ]
                 ]
@@ -108,8 +107,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
         ]
@@ -145,23 +144,16 @@
 
 Let Variable [ Name=$custdist ]
   :=
-  FunctionCall asterix.sql-count@1[
+  FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          Variable [ Name=#1 ]
-          Field=gco
-        ]
-        ]
-        FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=$g ]
-        ]
-      )
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [gco]
+      ]
       ]
       FROM [        Variable [ Name=$g ]
-        AS Variable [ Name=#1 ]
+        AS Variable [ Name=$g ]
       ]
     )
   ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q14_promotion_effect/q14_promotion_effect.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q14_promotion_effect/q14_promotion_effect.3.ast
index f5287e7..f6ee0e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q14_promotion_effect/q14_promotion_effect.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q14_promotion_effect/q14_promotion_effect.3.ast
@@ -24,7 +24,7 @@
             ]
             *
             OperatorExpr [
-              LiteralExpr [LONG] [1]
+              Variable [ Name=$t ]
               -
               FieldAccessor [
                 Variable [ Name=$i ]
@@ -39,12 +39,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lp]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$l ]
-            Variable [ Name=$p ]
-            Variable [ Name=$t ]
+            LiteralExpr [STRING] [lp]
           ]
           ]
           FROM [            Variable [ Name=$g ]
@@ -66,7 +63,7 @@
         ]
         *
         OperatorExpr [
-          LiteralExpr [LONG] [1]
+          Variable [ Name=$t ]
           -
           FieldAccessor [
             Variable [ Name=$i ]
@@ -77,12 +74,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lp]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$l ]
-            Variable [ Name=$p ]
-            Variable [ Name=$t ]
+            LiteralExpr [STRING] [lp]
           ]
           ]
           FROM [            Variable [ Name=$g ]
@@ -95,13 +89,13 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Part]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Part]
   ]
   AS Variable [ Name=$p ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q15_top_supplier/q15_top_supplier.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q15_top_supplier/q15_top_supplier.3.ast
index 8a37ecc..8ae41ce 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q15_top_supplier/q15_top_supplier.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q15_top_supplier/q15_top_supplier.3.ast
@@ -140,8 +140,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Supplier]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Supplier]
   ]
   AS Variable [ Name=$s ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
index d4ea6a5..94cd5e4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
@@ -341,12 +341,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [t2]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$p_brand ]
-            Variable [ Name=$p_size ]
-            Variable [ Name=$p_type ]
+            LiteralExpr [STRING] [t2]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_large_gby_variant/q17_large_gby_variant.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_large_gby_variant/q17_large_gby_variant.3.ast
index f05d5e3..3a660e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_large_gby_variant/q17_large_gby_variant.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_large_gby_variant/q17_large_gby_variant.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_partkey ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -41,10 +40,9 @@
           ]
           FROM [            (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [l]
+              FunctionCall asterix.field-access-by-name@2[
                 Variable [ Name=$g ]
-                Variable [ Name=$l_partkey ]
+                LiteralExpr [STRING] [l]
               ]
               ]
               FROM [                Variable [ Name=$g ]
@@ -70,10 +68,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -98,10 +95,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -126,10 +122,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -154,10 +149,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -182,10 +176,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -210,10 +203,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -238,10 +230,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -266,10 +257,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -294,10 +284,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -311,8 +300,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.ast
index 185529b..de332e6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q17_small_quantity_order_revenue/q17_small_quantity_order_revenue.3.ast
@@ -68,13 +68,13 @@
         ]
         AS Variable [ Name=$t ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [LineItem]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.LineItem]
         ]
         AS Variable [ Name=$l ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Part]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Part]
         ]
         AS Variable [ Name=$p ]
       ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q18_large_volume_customer/q18_large_volume_customer.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q18_large_volume_customer/q18_large_volume_customer.3.ast
index adb46b5..731913e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q18_large_volume_customer/q18_large_volume_customer.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q18_large_volume_customer/q18_large_volume_customer.3.ast
@@ -40,14 +40,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$o_orderdate ]
-              Variable [ Name=$c_name ]
-              Variable [ Name=$o_orderkey ]
-              Variable [ Name=$o_totalprice ]
-              Variable [ Name=$c_custkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -61,13 +56,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
@@ -92,12 +87,9 @@
             ]
             FROM [              (
                 SELECT ELEMENT [
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [l]
-                  Variable [ Name=$o ]
-                  Variable [ Name=$l_orderkey ]
+                FunctionCall asterix.field-access-by-name@2[
                   Variable [ Name=$g2 ]
-                  Variable [ Name=$c ]
+                  LiteralExpr [STRING] [l]
                 ]
                 ]
                 FROM [                  Variable [ Name=$g2 ]
@@ -111,8 +103,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
     ]
@@ -131,8 +123,8 @@
   )
   AS Variable [ Name=$t ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q19_discounted_revenue/q19_discounted_revenue.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q19_discounted_revenue/q19_discounted_revenue.3.ast
index 8afd86a..3314c43 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q19_discounted_revenue/q19_discounted_revenue.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q19_discounted_revenue/q19_discounted_revenue.3.ast
@@ -21,13 +21,13 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Part]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Part]
       ]
       AS Variable [ Name=$p ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q20_potential_part_promotion/q20_potential_part_promotion.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
index aa7187e..d18766b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
@@ -62,11 +62,9 @@
                   ]
                   FROM [                    (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [l]
-                        Variable [ Name=$l_suppkey ]
+                      FunctionCall asterix.field-access-by-name@2[
                         Variable [ Name=$g ]
-                        Variable [ Name=$l_partkey ]
+                        LiteralExpr [STRING] [l]
                       ]
                       ]
                       FROM [                        Variable [ Name=$g ]
@@ -81,8 +79,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -136,8 +134,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Partsupp]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Partsupp]
           ]
           AS Variable [ Name=$ps ]
 ,
@@ -154,8 +152,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Part]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Part]
               ]
               AS Variable [ Name=$p ]
             ]
@@ -247,13 +245,13 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Supplier]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Supplier]
       ]
       AS Variable [ Name=$s ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
index 01b9b14..1244df6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
@@ -324,8 +324,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -350,13 +350,13 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Nation]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Nation]
               ]
               AS Variable [ Name=$n ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Supplier]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Supplier]
               ]
               AS Variable [ Name=$s ]
             ]
@@ -375,8 +375,8 @@
           )
           AS Variable [ Name=$ns ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
@@ -481,23 +481,16 @@
 
 Let Variable [ Name=$numwait ]
   :=
-  FunctionCall asterix.sql-count@1[
+  FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          Variable [ Name=#1 ]
-          Field=t4
-        ]
-        ]
-        FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=$g ]
-        ]
-      )
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [t4]
+      ]
       ]
       FROM [        Variable [ Name=$g ]
-        AS Variable [ Name=#1 ]
+        AS Variable [ Name=$g ]
       ]
     )
   ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
index 45790cd..0ad2c82 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
@@ -27,7 +27,7 @@
             Variable [ Name=$c ]
             Field=c_phone
           ]
-          LiteralExpr [LONG] [1]
+          LiteralExpr [LONG] [0]
           LiteralExpr [LONG] [2]
         ]
       )
@@ -50,8 +50,8 @@
         Field=c_acctbal
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$c ]
       ]
@@ -79,10 +79,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [ct]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$cntrycode ]
+          LiteralExpr [STRING] [ct]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -104,10 +103,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [ct]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$cntrycode ]
+              LiteralExpr [STRING] [ct]
             ]
             ]
             FROM [              Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.ast
index 3dde59d..5a62178 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue601/query-issue601.3.ast
@@ -5,40 +5,26 @@
   (
     LiteralExpr [STRING] [l_linenumber]
     :
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [l]
-        Variable [ Name=$g ]
-        Variable [ Name=$l_linenumber ]
-      ]
-      Field=l_linenumber
-    ]
+    Variable [ Name=$l_linenumber ]
   )
   (
     LiteralExpr [STRING] [count_order]
     :
-    FunctionCall asterix.sql-count@1[
+    FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        (
-          SELECT ELEMENT [
-          Variable [ Name=$g ]
-          ]
-          FROM [            Variable [ Name=$g ]
-            AS Variable [ Name=$g ]
-          ]
-        )
+        Variable [ Name=$g ]
         ]
         FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=#1 ]
+          AS Variable [ Name=$g ]
         ]
       )
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -55,13 +41,6 @@
   )
 
 Orderby
-  FieldAccessor [
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [l]
-      Variable [ Name=$g ]
-      Variable [ Name=$l_linenumber ]
-    ]
-    Field=l_linenumber
-  ]
+  Variable [ Name=$l_linenumber ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue638/query-issue638.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue638/query-issue638.3.ast
index 177f281..7dd2855 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue638/query-issue638.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue638/query-issue638.3.ast
@@ -57,8 +57,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -115,8 +115,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Part]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Part]
           ]
           AS Variable [ Name=$p ]
 ,
@@ -181,8 +181,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Partsupp]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Partsupp]
               ]
               AS Variable [ Name=$ps ]
 ,
@@ -268,13 +268,13 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Supplier]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Supplier]
                       ]
                       AS Variable [ Name=$s ]
 ,
-                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Nation]
+                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Nation]
                       ]
                       AS Variable [ Name=$n ]
                     ]
@@ -293,8 +293,8 @@
                   )
                   AS Variable [ Name=$s1 ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [LineItem]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.LineItem]
                   ]
                   AS Variable [ Name=$l ]
                 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785-2/query-issue785-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785-2/query-issue785-2.3.ast
index 3681810..7a23a4d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785-2/query-issue785-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785-2/query-issue785-2.3.ast
@@ -23,13 +23,13 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$nation ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [SelectedNation]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.SelectedNation]
       ]
       AS Variable [ Name=$sn ]
     ]
@@ -71,13 +71,13 @@
     FROM [      Variable [ Name=$t ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customer]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Customer]
       ]
       AS Variable [ Name=$customer ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$orders ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785/query-issue785.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785/query-issue785.3.ast
index 9d44d8f..3fc45de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785/query-issue785.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue785/query-issue785.3.ast
@@ -109,18 +109,18 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customer]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Customer]
       ]
       AS Variable [ Name=$customer ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$orders ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue786/query-issue786.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue786/query-issue786.3.ast
index 9302eb3..001433c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue786/query-issue786.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch-sql-like/query-issue786/query-issue786.3.ast
@@ -36,13 +36,13 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Orders]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Orders]
         ]
         AS Variable [ Name=$orders ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$customer ]
       ]
@@ -113,13 +113,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Nation]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Nation]
   ]
   AS Variable [ Name=$nation ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [SelectedNation]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.SelectedNation]
   ]
   AS Variable [ Name=$sn ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/distinct_by/distinct_by.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/distinct_by/distinct_by.3.ast
index 59ff8c8..4ac52ef 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/distinct_by/distinct_by.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/distinct_by/distinct_by.3.ast
@@ -28,8 +28,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/group_no_agg/group_no_agg.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/group_no_agg/group_no_agg.3.ast
index 40dfc87..bfe0f46 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/group_no_agg/group_no_agg.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/group_no_agg/group_no_agg.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$name ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Regions_group_no_agg]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Regions_group_no_agg]
   ]
   AS Variable [ Name=$r ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/nest_aggregate/nest_aggregate.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/nest_aggregate/nest_aggregate.3.ast
index 4bc5156..6168019 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/nest_aggregate/nest_aggregate.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/nest_aggregate/nest_aggregate.3.ast
@@ -36,13 +36,13 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Orders]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Orders]
         ]
         AS Variable [ Name=$orders ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$customer ]
       ]
@@ -113,13 +113,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Nation]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Nation]
   ]
   AS Variable [ Name=$nation ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [SelectedNation]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.SelectedNation]
   ]
   AS Variable [ Name=$sn ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
index 64b8438..0c2ddfa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q01_pricing_summary_report_nt/q01_pricing_summary_report_nt.3.ast
@@ -199,11 +199,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -214,8 +212,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
index cc34520..7fc1e5b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q03_shipping_priority_nt/q03_shipping_priority_nt.3.ast
@@ -24,18 +24,18 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -145,12 +145,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [l]
-            Variable [ Name=$o_shippriority ]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$o_orderdate ]
-            Variable [ Name=$l_orderkey ]
+            LiteralExpr [STRING] [l]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q04_order_priority/q04_order_priority.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q04_order_priority/q04_order_priority.3.ast
index 86148b2..deb97a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q04_order_priority/q04_order_priority.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q04_order_priority/q04_order_priority.3.ast
@@ -58,8 +58,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
   INNER JOIN
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q05_local_supplier_volume/q05_local_supplier_volume.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
index 2672311..2bca9a6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q05_local_supplier_volume/q05_local_supplier_volume.3.ast
@@ -14,8 +14,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
@@ -64,8 +64,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -114,8 +114,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -148,8 +148,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Supplier]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Supplier]
               ]
               AS Variable [ Name=$s ]
 ,
@@ -174,13 +174,13 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Nation]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Nation]
                   ]
                   AS Variable [ Name=$n ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Region]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Region]
                   ]
                   AS Variable [ Name=$r ]
                 ]
@@ -326,10 +326,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [o1]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$n_name ]
+            LiteralExpr [STRING] [o1]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
index e5f7758..ceb84f8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.3.ast
@@ -19,8 +19,8 @@
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.4.ast
index 8cad46d..45dabe2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q06_forecast_revenue_change/q06_forecast_revenue_change.4.ast
@@ -16,8 +16,8 @@
 ]
 count
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -69,3 +69,8 @@
     ]
   ]
 Group All
+  GROUP AS Variable [ Name=#1 ]
+  (
+    l:=Variable [ Name=$l ]
+  )
+
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q07_volume_shipping/q07_volume_shipping.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q07_volume_shipping/q07_volume_shipping.3.ast
index 940a665..4de6f4e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q07_volume_shipping/q07_volume_shipping.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q07_volume_shipping/q07_volume_shipping.3.ast
@@ -226,13 +226,13 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [LineItem]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.LineItem]
               ]
               AS Variable [ Name=$l ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Orders]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Orders]
               ]
               AS Variable [ Name=$o ]
             ]
@@ -271,8 +271,8 @@
           )
           AS Variable [ Name=$lo ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
         ]
@@ -291,8 +291,8 @@
       )
       AS Variable [ Name=$loc ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Supplier]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Supplier]
       ]
       AS Variable [ Name=$s ]
     ]
@@ -369,6 +369,7 @@
   (
     locs:=Variable [ Name=$locs ]
     t:=Variable [ Name=$t ]
+    l_year0:=Variable [ Name=$l_year0 ]
   )
 
 Let Variable [ Name=$revenue ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q08_national_market_share/q08_national_market_share.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q08_national_market_share/q08_national_market_share.3.ast
index e3d1247..c30d705 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q08_national_market_share/q08_national_market_share.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q08_national_market_share/q08_national_market_share.3.ast
@@ -38,10 +38,9 @@
           ]
           FROM [            (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [t]
+              FunctionCall asterix.field-access-by-name@2[
                 Variable [ Name=$g ]
-                Variable [ Name=$year ]
+                LiteralExpr [STRING] [t]
               ]
               ]
               FROM [                Variable [ Name=$g ]
@@ -63,10 +62,9 @@
           ]
           FROM [            (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [t]
+              FunctionCall asterix.field-access-by-name@2[
                 Variable [ Name=$g ]
-                Variable [ Name=$year ]
+                LiteralExpr [STRING] [t]
               ]
               ]
               FROM [                Variable [ Name=$g ]
@@ -163,8 +161,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Supplier]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Supplier]
           ]
           AS Variable [ Name=$s ]
 ,
@@ -250,8 +248,8 @@
                   )
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [LineItem]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.LineItem]
                   ]
                   AS Variable [ Name=$l ]
 ,
@@ -276,8 +274,8 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Orders]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Orders]
                       ]
                       AS Variable [ Name=$o ]
 ,
@@ -294,8 +292,8 @@
                           )
                         ]
                         ]
-                        FROM [                          FunctionCall Metadata.dataset@1[
-                            LiteralExpr [STRING] [Customer]
+                        FROM [                          FunctionCall asterix.dataset@1[
+                            LiteralExpr [STRING] [tpch.Customer]
                           ]
                           AS Variable [ Name=$c ]
 ,
@@ -312,13 +310,13 @@
                               )
                             ]
                             ]
-                            FROM [                              FunctionCall Metadata.dataset@1[
-                                LiteralExpr [STRING] [Nation]
+                            FROM [                              FunctionCall asterix.dataset@1[
+                                LiteralExpr [STRING] [tpch.Nation]
                               ]
                               AS Variable [ Name=$n1 ]
 ,
-                              FunctionCall Metadata.dataset@1[
-                                LiteralExpr [STRING] [Region]
+                              FunctionCall asterix.dataset@1[
+                                LiteralExpr [STRING] [tpch.Region]
                               ]
                               AS Variable [ Name=$r1 ]
                             ]
@@ -413,8 +411,8 @@
               )
               AS Variable [ Name=$lnrco ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Part]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Part]
               ]
               AS Variable [ Name=$p ]
             ]
@@ -459,8 +457,8 @@
       )
       AS Variable [ Name=$slnrcop ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n2 ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
index b2f198a..3ec921a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q09_product_type_profit_nt/q09_product_type_profit_nt.3.ast
@@ -25,11 +25,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [profit]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$nation ]
-              Variable [ Name=$o_year ]
+              LiteralExpr [STRING] [profit]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -66,8 +64,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -124,8 +122,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Part]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Part]
           ]
           AS Variable [ Name=$p ]
           INNER JOIN
@@ -190,8 +188,8 @@
                 )
               ]
               ]
-              FROM [                FunctionCall Metadata.dataset@1[
-                  LiteralExpr [STRING] [Partsupp]
+              FROM [                FunctionCall asterix.dataset@1[
+                  LiteralExpr [STRING] [tpch.Partsupp]
                 ]
                 AS Variable [ Name=$ps ]
                 INNER JOIN
@@ -277,13 +275,13 @@
                           )
                         ]
                         ]
-                        FROM [                          FunctionCall Metadata.dataset@1[
-                            LiteralExpr [STRING] [Supplier]
+                        FROM [                          FunctionCall asterix.dataset@1[
+                            LiteralExpr [STRING] [tpch.Supplier]
                           ]
                           AS Variable [ Name=$s ]
 ,
-                          FunctionCall Metadata.dataset@1[
-                            LiteralExpr [STRING] [Nation]
+                          FunctionCall asterix.dataset@1[
+                            LiteralExpr [STRING] [tpch.Nation]
                           ]
                           AS Variable [ Name=$n ]
                         ]
@@ -302,8 +300,8 @@
                       )
                       AS Variable [ Name=$s1 ]
                       INNER JOIN
-                        FunctionCall Metadata.dataset@1[
-                          LiteralExpr [STRING] [LineItem]
+                        FunctionCall asterix.dataset@1[
+                          LiteralExpr [STRING] [tpch.LineItem]
                         ]
                         AS Variable [ Name=$l ]
                         ON
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item/q10_returned_item.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item/q10_returned_item.3.ast
index 2afc675..4bc641e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item/q10_returned_item.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item/q10_returned_item.3.ast
@@ -121,8 +121,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
@@ -195,18 +195,18 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item_int64/q10_returned_item_int64.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item_int64/q10_returned_item_int64.3.ast
index 2afc675..4bc641e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item_int64/q10_returned_item_int64.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q10_returned_item_int64/q10_returned_item_int64.3.ast
@@ -121,8 +121,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
@@ -195,18 +195,18 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q11_important_stock/q11_important_stock.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q11_important_stock/q11_important_stock.3.ast
index 5ad8aae..b4ae160 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q11_important_stock/q11_important_stock.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q11_important_stock/q11_important_stock.3.ast
@@ -17,8 +17,8 @@
         ]
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Partsupp]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Partsupp]
         ]
         AS Variable [ Name=$ps ]
 ,
@@ -35,13 +35,13 @@
             )
           ]
           ]
-          FROM [            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [Supplier]
+          FROM [            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [tpch.Supplier]
             ]
             AS Variable [ Name=$s ]
 ,
-            FunctionCall Metadata.dataset@1[
-              LiteralExpr [STRING] [Nation]
+            FunctionCall asterix.dataset@1[
+              LiteralExpr [STRING] [tpch.Nation]
             ]
             AS Variable [ Name=$n ]
           ]
@@ -134,8 +134,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Partsupp]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Partsupp]
       ]
       AS Variable [ Name=$ps ]
 ,
@@ -152,13 +152,13 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Supplier]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Supplier]
           ]
           AS Variable [ Name=$s ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Nation]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Nation]
           ]
           AS Variable [ Name=$n ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q12_shipping/q12_shipping.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q12_shipping/q12_shipping.3.ast
index 3a0bf9e..51efec1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q12_shipping/q12_shipping.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q12_shipping/q12_shipping.3.ast
@@ -45,10 +45,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [o]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_shipmode ]
+              LiteralExpr [STRING] [o]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -95,10 +94,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [o]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_shipmode ]
+              LiteralExpr [STRING] [o]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -112,13 +110,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.ast
index 9e21c8f..e03ea95 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q13_customer_distribution/q13_customer_distribution.3.ast
@@ -36,10 +36,9 @@
             ]
             FROM [              (
                 SELECT ELEMENT [
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [co]
+                FunctionCall asterix.field-access-by-name@2[
                   Variable [ Name=$g2 ]
-                  Variable [ Name=$c_custkey ]
+                  LiteralExpr [STRING] [co]
                 ]
                 ]
                 FROM [                  Variable [ Name=$g2 ]
@@ -75,8 +74,8 @@
                   Field=o_orderkey
                 ]
                 ]
-                FROM [                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [Orders]
+                FROM [                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.Orders]
                   ]
                   AS Variable [ Name=$o ]
                 ]
@@ -108,8 +107,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Customer]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Customer]
           ]
           AS Variable [ Name=$c ]
         ]
@@ -148,17 +147,10 @@
   FunctionCall asterix.sql-count@1[
     (
       SELECT ELEMENT [
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          Variable [ Name=#1 ]
-          Field=gco
-        ]
-        ]
-        FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=$g ]
-        ]
-      )
+      FieldAccessor [
+        Variable [ Name=#1 ]
+        Field=gco
+      ]
       ]
       FROM [        Variable [ Name=$g ]
         AS Variable [ Name=#1 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q14_promotion_effect/q14_promotion_effect.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q14_promotion_effect/q14_promotion_effect.3.ast
index f5287e7..f6ee0e7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q14_promotion_effect/q14_promotion_effect.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q14_promotion_effect/q14_promotion_effect.3.ast
@@ -24,7 +24,7 @@
             ]
             *
             OperatorExpr [
-              LiteralExpr [LONG] [1]
+              Variable [ Name=$t ]
               -
               FieldAccessor [
                 Variable [ Name=$i ]
@@ -39,12 +39,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lp]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$l ]
-            Variable [ Name=$p ]
-            Variable [ Name=$t ]
+            LiteralExpr [STRING] [lp]
           ]
           ]
           FROM [            Variable [ Name=$g ]
@@ -66,7 +63,7 @@
         ]
         *
         OperatorExpr [
-          LiteralExpr [LONG] [1]
+          Variable [ Name=$t ]
           -
           FieldAccessor [
             Variable [ Name=$i ]
@@ -77,12 +74,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [lp]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$l ]
-            Variable [ Name=$p ]
-            Variable [ Name=$t ]
+            LiteralExpr [STRING] [lp]
           ]
           ]
           FROM [            Variable [ Name=$g ]
@@ -95,13 +89,13 @@
   ]
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Part]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Part]
   ]
   AS Variable [ Name=$p ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q15_top_supplier/q15_top_supplier.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q15_top_supplier/q15_top_supplier.3.ast
index 8a37ecc..8ae41ce 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q15_top_supplier/q15_top_supplier.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q15_top_supplier/q15_top_supplier.3.ast
@@ -140,8 +140,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Supplier]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Supplier]
   ]
   AS Variable [ Name=$s ]
 ,
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
index d4ea6a5..94cd5e4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q16_parts_supplier_relationship/q16_parts_supplier_relationship.3.ast
@@ -341,12 +341,9 @@
       ]
       FROM [        (
           SELECT ELEMENT [
-          FunctionCall Metadata.resolve@-1[
-            LiteralExpr [STRING] [t2]
+          FunctionCall asterix.field-access-by-name@2[
             Variable [ Name=$g ]
-            Variable [ Name=$p_brand ]
-            Variable [ Name=$p_size ]
-            Variable [ Name=$p_type ]
+            LiteralExpr [STRING] [t2]
           ]
           ]
           FROM [            Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
index f05d5e3..3a660e0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q17_large_gby_variant/q17_large_gby_variant.3.ast
@@ -13,10 +13,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_partkey ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -41,10 +40,9 @@
           ]
           FROM [            (
               SELECT ELEMENT [
-              FunctionCall Metadata.resolve@-1[
-                LiteralExpr [STRING] [l]
+              FunctionCall asterix.field-access-by-name@2[
                 Variable [ Name=$g ]
-                Variable [ Name=$l_partkey ]
+                LiteralExpr [STRING] [l]
               ]
               ]
               FROM [                Variable [ Name=$g ]
@@ -70,10 +68,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -98,10 +95,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -126,10 +122,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -154,10 +149,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -182,10 +176,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -210,10 +203,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -238,10 +230,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -266,10 +257,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -294,10 +284,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$l_partkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -311,8 +300,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
index adb46b5..731913e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q18_large_volume_customer/q18_large_volume_customer.3.ast
@@ -40,14 +40,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [l]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$o_orderdate ]
-              Variable [ Name=$c_name ]
-              Variable [ Name=$o_orderkey ]
-              Variable [ Name=$o_totalprice ]
-              Variable [ Name=$c_custkey ]
+              LiteralExpr [STRING] [l]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -61,13 +56,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Customer]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Customer]
   ]
   AS Variable [ Name=$c ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Orders]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Orders]
   ]
   AS Variable [ Name=$o ]
 ,
@@ -92,12 +87,9 @@
             ]
             FROM [              (
                 SELECT ELEMENT [
-                FunctionCall Metadata.resolve@-1[
-                  LiteralExpr [STRING] [l]
-                  Variable [ Name=$o ]
-                  Variable [ Name=$l_orderkey ]
+                FunctionCall asterix.field-access-by-name@2[
                   Variable [ Name=$g2 ]
-                  Variable [ Name=$c ]
+                  LiteralExpr [STRING] [l]
                 ]
                 ]
                 FROM [                  Variable [ Name=$g2 ]
@@ -111,8 +103,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
     ]
@@ -131,8 +123,8 @@
   )
   AS Variable [ Name=$t ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
index 8afd86a..3314c43 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q19_discounted_revenue/q19_discounted_revenue.3.ast
@@ -21,13 +21,13 @@
       ]
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [LineItem]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.LineItem]
       ]
       AS Variable [ Name=$l ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Part]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Part]
       ]
       AS Variable [ Name=$p ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
index aa7187e..d18766b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q20_potential_part_promotion/q20_potential_part_promotion.3.ast
@@ -62,11 +62,9 @@
                   ]
                   FROM [                    (
                       SELECT ELEMENT [
-                      FunctionCall Metadata.resolve@-1[
-                        LiteralExpr [STRING] [l]
-                        Variable [ Name=$l_suppkey ]
+                      FunctionCall asterix.field-access-by-name@2[
                         Variable [ Name=$g ]
-                        Variable [ Name=$l_partkey ]
+                        LiteralExpr [STRING] [l]
                       ]
                       ]
                       FROM [                        Variable [ Name=$g ]
@@ -81,8 +79,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -136,8 +134,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Partsupp]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Partsupp]
           ]
           AS Variable [ Name=$ps ]
 ,
@@ -154,8 +152,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Part]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Part]
               ]
               AS Variable [ Name=$p ]
             ]
@@ -247,13 +245,13 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Supplier]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Supplier]
       ]
       AS Variable [ Name=$s ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
index 01b9b14..1244df6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q21_suppliers_who_kept_orders_waiting/q21_suppliers_who_kept_orders_waiting.3.ast
@@ -324,8 +324,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
 ,
@@ -350,13 +350,13 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Nation]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Nation]
               ]
               AS Variable [ Name=$n ]
 ,
-              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Supplier]
+              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Supplier]
               ]
               AS Variable [ Name=$s ]
             ]
@@ -375,8 +375,8 @@
           )
           AS Variable [ Name=$ns ]
 ,
-          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
 ,
@@ -481,23 +481,16 @@
 
 Let Variable [ Name=$numwait ]
   :=
-  FunctionCall asterix.sql-count@1[
+  FunctionCall asterix.count@1[
     (
       SELECT ELEMENT [
-      (
-        SELECT ELEMENT [
-        FieldAccessor [
-          Variable [ Name=#1 ]
-          Field=t4
-        ]
-        ]
-        FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=$g ]
-        ]
-      )
+      FunctionCall asterix.field-access-by-name@2[
+        Variable [ Name=$g ]
+        LiteralExpr [STRING] [t4]
+      ]
       ]
       FROM [        Variable [ Name=$g ]
-        AS Variable [ Name=#1 ]
+        AS Variable [ Name=$g ]
       ]
     )
   ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
index 45790cd..0ad2c82 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/q22_global_sales_opportunity/q22_global_sales_opportunity.3.ast
@@ -27,7 +27,7 @@
             Variable [ Name=$c ]
             Field=c_phone
           ]
-          LiteralExpr [LONG] [1]
+          LiteralExpr [LONG] [0]
           LiteralExpr [LONG] [2]
         ]
       )
@@ -50,8 +50,8 @@
         Field=c_acctbal
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$c ]
       ]
@@ -79,10 +79,9 @@
     FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [ct]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$cntrycode ]
+          LiteralExpr [STRING] [ct]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -104,10 +103,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [ct]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$cntrycode ]
+              LiteralExpr [STRING] [ct]
             ]
             ]
             FROM [              Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
index 45c344d..928d5e2 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue562/query-issue562.3.ast
@@ -36,7 +36,7 @@
           Variable [ Name=$c ]
           Field=c_phone
         ]
-        LiteralExpr [LONG] [1]
+        LiteralExpr [LONG] [0]
         LiteralExpr [LONG] [2]
       ]
     Where
@@ -97,8 +97,8 @@
         Field=c_acctbal
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$c ]
       ]
@@ -109,7 +109,7 @@
             Variable [ Name=$c ]
             Field=c_phone
           ]
-          LiteralExpr [LONG] [1]
+          LiteralExpr [LONG] [0]
           LiteralExpr [LONG] [2]
         ]
       Where
@@ -206,10 +206,9 @@
         ]
         FROM [          (
             SELECT ELEMENT [
-            FunctionCall Metadata.resolve@-1[
-              LiteralExpr [STRING] [ct]
+            FunctionCall asterix.field-access-by-name@2[
               Variable [ Name=$g ]
-              Variable [ Name=$cntrycode ]
+              LiteralExpr [STRING] [ct]
             ]
             ]
             FROM [              Variable [ Name=$g ]
@@ -234,8 +233,8 @@
         SELECT ELEMENT [
         Variable [ Name=$o ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Orders]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Orders]
           ]
           AS Variable [ Name=$o ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
index 3dde59d..5a62178 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue601/query-issue601.3.ast
@@ -5,40 +5,26 @@
   (
     LiteralExpr [STRING] [l_linenumber]
     :
-    FieldAccessor [
-      FunctionCall Metadata.resolve@-1[
-        LiteralExpr [STRING] [l]
-        Variable [ Name=$g ]
-        Variable [ Name=$l_linenumber ]
-      ]
-      Field=l_linenumber
-    ]
+    Variable [ Name=$l_linenumber ]
   )
   (
     LiteralExpr [STRING] [count_order]
     :
-    FunctionCall asterix.sql-count@1[
+    FunctionCall asterix.count@1[
       (
         SELECT ELEMENT [
-        (
-          SELECT ELEMENT [
-          Variable [ Name=$g ]
-          ]
-          FROM [            Variable [ Name=$g ]
-            AS Variable [ Name=$g ]
-          ]
-        )
+        Variable [ Name=$g ]
         ]
         FROM [          Variable [ Name=$g ]
-          AS Variable [ Name=#1 ]
+          AS Variable [ Name=$g ]
         ]
       )
     ]
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -55,13 +41,6 @@
   )
 
 Orderby
-  FieldAccessor [
-    FunctionCall Metadata.resolve@-1[
-      LiteralExpr [STRING] [l]
-      Variable [ Name=$g ]
-      Variable [ Name=$l_linenumber ]
-    ]
-    Field=l_linenumber
-  ]
+  Variable [ Name=$l_linenumber ]
   ASC
 
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
index 177f281..7dd2855 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue638/query-issue638.3.ast
@@ -57,8 +57,8 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$o ]
 ,
@@ -115,8 +115,8 @@
           )
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [Part]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.Part]
           ]
           AS Variable [ Name=$p ]
 ,
@@ -181,8 +181,8 @@
               )
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [Partsupp]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.Partsupp]
               ]
               AS Variable [ Name=$ps ]
 ,
@@ -268,13 +268,13 @@
                       )
                     ]
                     ]
-                    FROM [                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Supplier]
+                    FROM [                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Supplier]
                       ]
                       AS Variable [ Name=$s ]
 ,
-                      FunctionCall Metadata.dataset@1[
-                        LiteralExpr [STRING] [Nation]
+                      FunctionCall asterix.dataset@1[
+                        LiteralExpr [STRING] [tpch.Nation]
                       ]
                       AS Variable [ Name=$n ]
                     ]
@@ -293,8 +293,8 @@
                   )
                   AS Variable [ Name=$s1 ]
 ,
-                  FunctionCall Metadata.dataset@1[
-                    LiteralExpr [STRING] [LineItem]
+                  FunctionCall asterix.dataset@1[
+                    LiteralExpr [STRING] [tpch.LineItem]
                   ]
                   AS Variable [ Name=$l ]
                 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
index 3681810..7a23a4d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785-2/query-issue785-2.3.ast
@@ -23,13 +23,13 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$nation ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [SelectedNation]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.SelectedNation]
       ]
       AS Variable [ Name=$sn ]
     ]
@@ -71,13 +71,13 @@
     FROM [      Variable [ Name=$t ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customer]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Customer]
       ]
       AS Variable [ Name=$customer ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$orders ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
index 9d44d8f..3fc45de 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue785/query-issue785.3.ast
@@ -109,18 +109,18 @@
       )
     ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Nation]
+    FROM [      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Nation]
       ]
       AS Variable [ Name=$n ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Customer]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Customer]
       ]
       AS Variable [ Name=$customer ]
 ,
-      FunctionCall Metadata.dataset@1[
-        LiteralExpr [STRING] [Orders]
+      FunctionCall asterix.dataset@1[
+        LiteralExpr [STRING] [tpch.Orders]
       ]
       AS Variable [ Name=$orders ]
     ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
index 9302eb3..001433c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue786/query-issue786.3.ast
@@ -36,13 +36,13 @@
         )
       ]
       ]
-      FROM [        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Orders]
+      FROM [        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Orders]
         ]
         AS Variable [ Name=$orders ]
 ,
-        FunctionCall Metadata.dataset@1[
-          LiteralExpr [STRING] [Customer]
+        FunctionCall asterix.dataset@1[
+          LiteralExpr [STRING] [tpch.Customer]
         ]
         AS Variable [ Name=$customer ]
       ]
@@ -113,13 +113,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Nation]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.Nation]
   ]
   AS Variable [ Name=$nation ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [SelectedNation]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.SelectedNation]
   ]
   AS Variable [ Name=$sn ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
index 4f8a868..8f028fa 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-2/query-issue810-2.3.ast
@@ -28,8 +28,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
index bc03eae..927a1a3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810-3/query-issue810-3.3.ast
@@ -42,8 +42,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
@@ -85,11 +85,9 @@
     ]
     FROM [      (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -116,12 +114,9 @@
     ]
     FROM [      (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
-          Variable [ Name=$expensives ]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -171,13 +166,9 @@
     ]
     FROM [      (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
-          Variable [ Name=$expensives ]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
-          Variable [ Name=$cheaps ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
@@ -209,14 +200,9 @@
     ]
     FROM [      (
         SELECT ELEMENT [
-        FunctionCall Metadata.resolve@-1[
-          LiteralExpr [STRING] [l]
-          Variable [ Name=$expensives ]
+        FunctionCall asterix.field-access-by-name@2[
           Variable [ Name=$g ]
-          Variable [ Name=$l_linestatus ]
-          Variable [ Name=$l_returnflag ]
-          Variable [ Name=$charges ]
-          Variable [ Name=$cheaps ]
+          LiteralExpr [STRING] [l]
         ]
         ]
         FROM [          Variable [ Name=$g ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
index 6a25433..0569f31 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue810/query-issue810.3.ast
@@ -28,8 +28,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [LineItem]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [tpch.LineItem]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
index 13647f7..dbe949f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827-2/query-issue827-2.3.ast
@@ -12,8 +12,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -40,8 +40,8 @@
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -70,8 +70,8 @@
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -109,8 +109,8 @@
           ]
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -128,8 +128,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -156,8 +156,8 @@
           Field=l_extendedprice
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -175,8 +175,8 @@
           Field=l_discount
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$i ]
         ]
@@ -191,8 +191,8 @@
         SELECT ELEMENT [
         Variable [ Name=$l ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
index c970c9f..317fa7d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/tpch/query-issue827/query-issue827.3.ast
@@ -12,8 +12,8 @@
           Field=l_quantity
         ]
         ]
-        FROM [          FunctionCall Metadata.dataset@1[
-            LiteralExpr [STRING] [LineItem]
+        FROM [          FunctionCall asterix.dataset@1[
+            LiteralExpr [STRING] [tpch.LineItem]
           ]
           AS Variable [ Name=$l ]
         ]
@@ -35,8 +35,8 @@
               Field=l_extendedprice
             ]
             ]
-            FROM [              FunctionCall Metadata.dataset@1[
-                LiteralExpr [STRING] [LineItem]
+            FROM [              FunctionCall asterix.dataset@1[
+                LiteralExpr [STRING] [tpch.LineItem]
               ]
               AS Variable [ Name=$l ]
             ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/opentype_orderby_01/opentype_orderby_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/opentype_orderby_01/opentype_orderby_01.3.ast
index 3bfb16d..bb7739f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/opentype_orderby_01/opentype_orderby_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/opentype_orderby_01/opentype_orderby_01.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_01/promotion_closedtype_field_vs_closedtype_field_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_01/promotion_closedtype_field_vs_closedtype_field_01.3.ast
index 0213ef7..69f1a9a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_01/promotion_closedtype_field_vs_closedtype_field_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_01/promotion_closedtype_field_vs_closedtype_field_01.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_02/promotion_closedtype_field_vs_closedtype_field_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_02/promotion_closedtype_field_vs_closedtype_field_02.3.ast
index 64df8db..51922e1 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_02/promotion_closedtype_field_vs_closedtype_field_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_02/promotion_closedtype_field_vs_closedtype_field_02.3.ast
@@ -40,13 +40,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_03/promotion_closedtype_field_vs_closedtype_field_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_03/promotion_closedtype_field_vs_closedtype_field_03.3.ast
index 94a96b3..6e4eb39 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_03/promotion_closedtype_field_vs_closedtype_field_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_03/promotion_closedtype_field_vs_closedtype_field_03.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_04/promotion_closedtype_field_vs_closedtype_field_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_04/promotion_closedtype_field_vs_closedtype_field_04.3.ast
index 7f64ba5..45b182a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_04/promotion_closedtype_field_vs_closedtype_field_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_04/promotion_closedtype_field_vs_closedtype_field_04.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_05/promotion_closedtype_field_vs_closedtype_field_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_05/promotion_closedtype_field_vs_closedtype_field_05.3.ast
index a2dace8..2774914 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_05/promotion_closedtype_field_vs_closedtype_field_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_closedtype_field_05/promotion_closedtype_field_vs_closedtype_field_05.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_01/promotion_closedtype_field_vs_constant_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_01/promotion_closedtype_field_vs_constant_01.3.ast
index 9c92b73..fe649d3 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_01/promotion_closedtype_field_vs_constant_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_01/promotion_closedtype_field_vs_constant_01.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_02/promotion_closedtype_field_vs_constant_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_02/promotion_closedtype_field_vs_constant_02.3.ast
index dc2d65e..50c76b7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_02/promotion_closedtype_field_vs_constant_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_02/promotion_closedtype_field_vs_constant_02.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_03/promotion_closedtype_field_vs_constant_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_03/promotion_closedtype_field_vs_constant_03.3.ast
index ce149e5..eccf7e9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_03/promotion_closedtype_field_vs_constant_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_03/promotion_closedtype_field_vs_constant_03.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_04/promotion_closedtype_field_vs_constant_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_04/promotion_closedtype_field_vs_constant_04.3.ast
index bb6e108..2c542a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_04/promotion_closedtype_field_vs_constant_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_04/promotion_closedtype_field_vs_constant_04.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_05/promotion_closedtype_field_vs_constant_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_05/promotion_closedtype_field_vs_constant_05.3.ast
index 9c09b76..22095c4 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_05/promotion_closedtype_field_vs_constant_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_05/promotion_closedtype_field_vs_constant_05.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_06/promotion_closedtype_field_vs_constant_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_06/promotion_closedtype_field_vs_constant_06.3.ast
index bb6e108..2c542a9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_06/promotion_closedtype_field_vs_constant_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_06/promotion_closedtype_field_vs_constant_06.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_07/promotion_closedtype_field_vs_constant_07.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_07/promotion_closedtype_field_vs_constant_07.3.ast
index f72fe79..8245e3f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_07/promotion_closedtype_field_vs_constant_07.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_07/promotion_closedtype_field_vs_constant_07.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_08/promotion_closedtype_field_vs_constant_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_08/promotion_closedtype_field_vs_constant_08.3.ast
index 6d9aeb1..41f6c6c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_08/promotion_closedtype_field_vs_constant_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_08/promotion_closedtype_field_vs_constant_08.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_09/promotion_closedtype_field_vs_constant_09.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_09/promotion_closedtype_field_vs_constant_09.3.ast
index c9bb1db..09dbd79 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_09/promotion_closedtype_field_vs_constant_09.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_09/promotion_closedtype_field_vs_constant_09.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_10/promotion_closedtype_field_vs_constant_10.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_10/promotion_closedtype_field_vs_constant_10.3.ast
index ba64cdb..1c1aa07 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_10/promotion_closedtype_field_vs_constant_10.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_10/promotion_closedtype_field_vs_constant_10.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_11/promotion_closedtype_field_vs_constant_11.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_11/promotion_closedtype_field_vs_constant_11.3.ast
index 2b34755..dbbce3a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_11/promotion_closedtype_field_vs_constant_11.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_constant_11/promotion_closedtype_field_vs_constant_11.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_01/promotion_closedtype_field_vs_opentype_field_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_01/promotion_closedtype_field_vs_opentype_field_01.3.ast
index ba51a7d..0eac7c6 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_01/promotion_closedtype_field_vs_opentype_field_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_01/promotion_closedtype_field_vs_opentype_field_01.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_02/promotion_closedtype_field_vs_opentype_field_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_02/promotion_closedtype_field_vs_opentype_field_02.3.ast
index bd77024..43449d9 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_02/promotion_closedtype_field_vs_opentype_field_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_02/promotion_closedtype_field_vs_opentype_field_02.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_03/promotion_closedtype_field_vs_opentype_field_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_03/promotion_closedtype_field_vs_opentype_field_03.3.ast
index b98cf75..53739dc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_03/promotion_closedtype_field_vs_opentype_field_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_03/promotion_closedtype_field_vs_opentype_field_03.3.ast
@@ -36,13 +36,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_04/promotion_closedtype_field_vs_opentype_field_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_04/promotion_closedtype_field_vs_opentype_field_04.3.ast
index c35de65..bceb286 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_04/promotion_closedtype_field_vs_opentype_field_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_closedtype_field_vs_opentype_field_04/promotion_closedtype_field_vs_opentype_field_04.3.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_01/promotion_opentype_field_vs_constant_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_01/promotion_opentype_field_vs_constant_01.3.ast
index d9b7e47..d3f9a59 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_01/promotion_opentype_field_vs_constant_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_01/promotion_opentype_field_vs_constant_01.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_02/promotion_opentype_field_vs_constant_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_02/promotion_opentype_field_vs_constant_02.3.ast
index 3a70fcd..02a69df 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_02/promotion_opentype_field_vs_constant_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_02/promotion_opentype_field_vs_constant_02.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_03/promotion_opentype_field_vs_constant_03.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_03/promotion_opentype_field_vs_constant_03.3.ast
index 2a43942..d2fddef 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_03/promotion_opentype_field_vs_constant_03.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_03/promotion_opentype_field_vs_constant_03.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_04/promotion_opentype_field_vs_constant_04.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_04/promotion_opentype_field_vs_constant_04.3.ast
index 280cc68..f0a7742 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_04/promotion_opentype_field_vs_constant_04.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_04/promotion_opentype_field_vs_constant_04.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_05/promotion_opentype_field_vs_constant_05.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_05/promotion_opentype_field_vs_constant_05.3.ast
index b3157c6..dfbe5db 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_05/promotion_opentype_field_vs_constant_05.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_05/promotion_opentype_field_vs_constant_05.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_06/promotion_opentype_field_vs_constant_06.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_06/promotion_opentype_field_vs_constant_06.3.ast
index d75525e..38e4915 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_06/promotion_opentype_field_vs_constant_06.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_06/promotion_opentype_field_vs_constant_06.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_07/promotion_opentype_field_vs_constant_07.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_07/promotion_opentype_field_vs_constant_07.3.ast
index 2fec640..bc47181 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_07/promotion_opentype_field_vs_constant_07.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_07/promotion_opentype_field_vs_constant_07.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_08/promotion_opentype_field_vs_constant_08.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_08/promotion_opentype_field_vs_constant_08.3.ast
index eeeaaf0..b6ab37e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_08/promotion_opentype_field_vs_constant_08.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_constant_08/promotion_opentype_field_vs_constant_08.3.ast
@@ -20,8 +20,8 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_01/promotion_opentype_field_vs_opentype_field_01.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_01/promotion_opentype_field_vs_opentype_field_01.3.ast
index 7e17d14..25134ae 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_01/promotion_opentype_field_vs_opentype_field_01.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_01/promotion_opentype_field_vs_opentype_field_01.3.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_02/promotion_opentype_field_vs_opentype_field_02.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_02/promotion_opentype_field_vs_opentype_field_02.3.ast
index 5230c60..886501c 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_02/promotion_opentype_field_vs_opentype_field_02.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/promotion_opentype_field_vs_opentype_field_02/promotion_opentype_field_vs_opentype_field_02.3.ast
@@ -28,13 +28,13 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [empDataset]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.empDataset]
   ]
   AS Variable [ Name=$emp ]
 ,
-  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [deptDataset]
+  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.deptDataset]
   ]
   AS Variable [ Name=$dept ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_0/type_promotion_0.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_0/type_promotion_0.3.ast
index 60d0074..84c0b39 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_0/type_promotion_0.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_0/type_promotion_0.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [Int64Test]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TestVerse.Int64Test]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_1/type_promotion_1.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_1/type_promotion_1.3.ast
index 98f9e80..b911309 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_1/type_promotion_1.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/types/type_promotion_1/type_promotion_1.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$i ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [TestSet]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [TestDataverse.TestSet]
   ]
   AS Variable [ Name=$i ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue244/query-issue244.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue244/query-issue244.3.ast
index f1655e7..192188b 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue244/query-issue244.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue244/query-issue244.3.ast
@@ -3,8 +3,8 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
-    LiteralExpr [STRING] [t2]
+FROM [  FunctionCall asterix.dataset@1[
+    LiteralExpr [STRING] [test.t2]
   ]
   AS Variable [ Name=$l ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
index d5b9c31..96ef965 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.2.ast
@@ -5,7 +5,7 @@
     SELECT ELEMENT [
     Variable [ Name=$x ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [Metadata.Function]
       ]
       AS Variable [ Name=$x ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
index d5b9c31..96ef965 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/query-issue489/query-issue489.4.ast
@@ -5,7 +5,7 @@
     SELECT ELEMENT [
     Variable [ Name=$x ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [Metadata.Function]
       ]
       AS Variable [ Name=$x ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf09/udf09.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf09/udf09.3.ast
index 4965a73..11f6429 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf09/udf09.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf09/udf09.3.ast
@@ -6,7 +6,7 @@
     SELECT ELEMENT [
     Variable [ Name=$a ]
     ]
-    FROM [      FunctionCall Metadata.dataset@1[
+    FROM [      FunctionCall asterix.dataset@1[
         LiteralExpr [STRING] [test.t1]
       ]
       AS Variable [ Name=$a ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf18/udf18.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf18/udf18.3.ast
index c95a811..5c55550 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf18/udf18.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf18/udf18.3.ast
@@ -1,6 +1,6 @@
 DataverseUse test
 Query:
-FunctionCall null.not@1[
+FunctionCall algebricks.not@1[
   FunctionCall test.fn06@0[
   ]
 ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf23/udf23.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf23/udf23.3.ast
index 6280700..cf9ed5f 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf23/udf23.3.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf23/udf23.3.ast
@@ -3,7 +3,7 @@
 SELECT ELEMENT [
 Variable [ Name=$l ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Dataset]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.1.ast
deleted file mode 100644
index 916a59e..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.1.ast
+++ /dev/null
@@ -1 +0,0 @@
-DataverseUse test
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.2.ast
deleted file mode 100644
index e69de29..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.2.ast
+++ /dev/null
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.3.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.3.ast
deleted file mode 100644
index c2db2b6..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf26/udf26.3.ast
+++ /dev/null
@@ -1,7 +0,0 @@
-DataverseUse test
-Query:
-SELECT ELEMENT [
-FunctionCall test.needs_f1@1[
-  LiteralExpr [LONG] [12345]
-]
-]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf28/udf28.2.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf28/udf28.2.ast
index 17e46ec..a6b4c63 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf28/udf28.2.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf28/udf28.2.ast
@@ -43,7 +43,7 @@
   )
 ]
 ]
-FROM [  FunctionCall Metadata.dataset@1[
+FROM [  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [Metadata.Function]
   ]
   AS Variable [ Name=$l ]
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf30/udf30.1.ast b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf30/udf30.1.ast
index 5f9294c..b787d0d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf30/udf30.1.ast
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results_parser_sqlpp/user-defined-functions/udf30/udf30.1.ast
@@ -5,7 +5,7 @@
 Query:
 Let Variable [ Name=$z ]
   :=
-  FunctionCall Metadata.resolve@-1[
+  FunctionCall asterix.dataset@1[
     LiteralExpr [STRING] [y]
   ]
 SELECT ELEMENT [
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
index 47560f6..b17db48 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -1941,6 +1941,12 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="dml">
+      <compilation-unit name="load-with-autogenerated-no-field">
+        <output-dir compare="Text">load-with-autogenerated-no-field</output-dir>
+        <expected-error>ASX1014: Field "not_id" is not found [CompilationException]</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="dml">
       <compilation-unit name="load-with-index">
         <output-dir compare="Text">load-with-index</output-dir>
       </compilation-unit>
@@ -6377,12 +6383,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv13">
-        <output-dir compare="Text">cross-dv13</output-dir>
-        <expected-error>Recursive invocation testdv2.fun03@0</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="cross-dataverse">
       <compilation-unit name="cross-dv14">
         <output-dir compare="Text">cross-dv14</output-dir>
       </compilation-unit>
@@ -6392,12 +6392,6 @@
         <output-dir compare="Text">cross-dv15</output-dir>
       </compilation-unit>
     </test-case>
-    <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv16">
-        <output-dir compare="Text">cross-dv16</output-dir>
-        <expected-error>Recursive invocation testdv1.fun04@0</expected-error>
-      </compilation-unit>
-    </test-case>
     <!--NotImplementedException: No binary comparator factory implemented for type RECORD.
     <test-case FilePath="cross-dataverse">
       <compilation-unit name="cross-dv17">
@@ -6625,12 +6619,6 @@
       </compilation-unit>
     </test-case>
     -->
-    <test-case FilePath="user-defined-functions">
-      <compilation-unit name="udf26"><!-- Error not propagated properly -->
-        <output-dir compare="Text">udf26</output-dir>
-        <expected-error>function test.needs_f1@1 depends upon function test.f1@0 which is undefined</expected-error>
-      </compilation-unit>
-    </test-case>
     <test-case FilePath="user-defined-functions"><!-- Exception is never thrown!! -->
       <compilation-unit name="udf27">
         <output-dir compare="Text">udf27</output-dir>
@@ -7422,76 +7410,4 @@
       </compilation-unit>
     </test-case>
   </test-group>
-  <test-group name="temp-dataset">
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset">
-        <output-dir compare="Text">delete-from-loaded-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset-with-index">
-        <output-dir compare="Text">delete-from-loaded-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-empty-secondary-indexes">
-        <output-dir compare="Text">drop-empty-secondary-indexes</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-index">
-        <output-dir compare="Text">drop-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="empty-load-with-index">
-        <output-dir compare="Text">empty-load-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset">
-        <output-dir compare="Text">insert-and-scan-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="q01_pricing_summary_report_nt">
-        <output-dir compare="Text">q01_pricing_summary_report_nt</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-delete-rtree-secondary-index">
-        <output-dir compare="Text">scan-delete-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-rtree-secondary-index">
-        <output-dir compare="Text">scan-insert-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-persistent-to-temp">
-        <output-dir compare="Text">scan-insert-persistent-to-temp</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-temp-to-persistent">
-        <output-dir compare="Text">scan-insert-temp-to-persistent</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset-with-index">
-        <output-dir compare="Text">insert-and-scan-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset-with-correlated-index">
-        <output-dir compare="Text">insert-and-scan-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="temp_primary_plus_ngram_flush">
-        <output-dir compare="Text">temp_primary_plus_ngram_flush</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
 </test-suite>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 0d7ef36..3a535cc 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -1563,6 +1563,7 @@
     <test-case FilePath="dapd">
       <compilation-unit name="q2-3">
         <output-dir compare="Text">q2</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined identifier sig_id</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="dapd">
@@ -1887,6 +1888,12 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="dml">
+      <compilation-unit name="load-with-autogenerated-no-field">
+        <output-dir compare="Text">load-with-autogenerated-no-field</output-dir>
+        <expected-error>org.apache.asterix.common.exceptions.AsterixException: ASX1014: Field "not_id" is not found</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="dml">
       <compilation-unit name="insert-return-records">
         <output-dir compare="Text">insert-return-records</output-dir>
       </compilation-unit>
@@ -2737,6 +2744,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="fulltext">
+      <compilation-unit name="fulltext-09">
+        <output-dir compare="Text">fulltext-09</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="fulltext">
       <compilation-unit name="fulltext-index-01">
         <output-dir compare="Text">fulltext-index-01</output-dir>
       </compilation-unit>
@@ -2746,6 +2758,11 @@
         <output-dir compare="Text">fulltext-index-02</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="fulltext">
+      <compilation-unit name="fulltext-index-08">
+        <output-dir compare="Text">fulltext-index-08</output-dir>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-group name="global-aggregate">
     <test-case FilePath="global-aggregate">
@@ -2771,7 +2788,7 @@
     <test-case FilePath="global-aggregate">
       <compilation-unit name="q05_error">
         <output-dir compare="Text">q01</output-dir>
-        <expected-error>Cannot find dataset u in dataverse TinySocial nor an alias with name u</expected-error>
+        <expected-error>Type mismatch: function field-access-by-name expects its 1st input parameter to be type object, but the actual input type is array</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="global-aggregate">
@@ -2885,11 +2902,13 @@
     <test-case FilePath="group-by">
       <compilation-unit name="sugar-02">
         <output-dir compare="Text">core-02</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined identifier deptId</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
       <compilation-unit name="sugar-02-2">
         <output-dir compare="Text">core-02</output-dir>
+        <expected-error>Cannot resolve ambiguous alias reference for undefined identifier deptId</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="group-by">
@@ -3040,6 +3059,26 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="index-selection">
+      <compilation-unit name="btree-sec-primary-index-01">
+        <output-dir compare="Text">btree-sec-primary-index-01</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="index-selection">
+      <compilation-unit name="btree-sec-primary-index-02">
+        <output-dir compare="Text">btree-sec-primary-index-02</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="index-selection">
+      <compilation-unit name="btree-sec-primary-index-03">
+        <output-dir compare="Text">btree-sec-primary-index-03</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="index-selection">
+      <compilation-unit name="btree-sec-primary-index-04">
+        <output-dir compare="Text">btree-sec-primary-index-04</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="index-selection">
       <compilation-unit name="btree-index-composite-key-mixed-intervals">
         <output-dir compare="Text">btree-index-composite-key-mixed-intervals</output-dir>
       </compilation-unit>
@@ -3409,6 +3448,16 @@
   </test-group>
   <test-group name="misc">
     <test-case FilePath="misc">
+      <compilation-unit name="validate-expected">
+        <output-dir compare="Text">validate-expected</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="misc">
+      <compilation-unit name="dataset-resources">
+        <output-dir compare="Text">dataset-resources</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="misc">
       <compilation-unit name="case_01">
         <output-dir compare="Text">case_01</output-dir>
       </compilation-unit>
@@ -3472,6 +3521,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="misc">
+      <compilation-unit name="identifier_01">
+        <output-dir compare="Text">identifier_01</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="misc">
       <compilation-unit name="ifthenelse_01">
         <output-dir compare="Text">ifthenelse_01</output-dir>
       </compilation-unit>
@@ -3543,7 +3597,6 @@
     <test-case FilePath="misc">
       <compilation-unit name="query-ASTERIXDB-1577">
         <output-dir compare="Text">query-ASTERIXDB-1577</output-dir>
-        <expected-error>Type mismatch: function field-access-by-name expects its 1st input parameter to be type object, but the actual input type is array</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="misc">
@@ -5367,6 +5420,21 @@
         <output-dir compare="Text">fullyqualified2</output-dir>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="resolution">
+      <compilation-unit name="order_1">
+        <output-dir compare="Text">order_1</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="resolution">
+      <compilation-unit name="groupby_rename_with_sugar">
+        <output-dir compare="Text">groupby_rename_with_sugar</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="resolution">
+      <compilation-unit name="function_dataverse">
+        <output-dir compare="Text">function_dataverse</output-dir>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-group name="scan">
     <test-case FilePath="scan">
@@ -6362,6 +6430,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="subquery">
+      <compilation-unit name="non_unary_subplan_01">
+        <output-dir compare="Text">non_unary_subplan_01</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="subquery">
       <compilation-unit name="query-ASTERIXDB-1571">
         <output-dir compare="Text">query-ASTERIXDB-1571</output-dir>
       </compilation-unit>
@@ -6401,7 +6474,6 @@
     <test-case FilePath="subquery">
       <compilation-unit name="query-ASTERIXDB-1574-3">
         <output-dir compare="Text">query-ASTERIXDB-1574</output-dir>
-        <expected-error>Cannot resolve ambiguous alias reference for undefined identifier</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="subquery">
@@ -7767,12 +7839,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv13">
-        <output-dir compare="Text">cross-dv13</output-dir>
-        <expected-error>Recursive invocation testdv2.fun03@0</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="cross-dataverse">
       <compilation-unit name="cross-dv14">
         <output-dir compare="Text">cross-dv14</output-dir>
       </compilation-unit>
@@ -7782,12 +7848,6 @@
         <output-dir compare="Text">cross-dv15</output-dir>
       </compilation-unit>
     </test-case>
-    <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv16">
-        <output-dir compare="Text">cross-dv16</output-dir>
-        <expected-error>Recursive invocation testdv1.fun04@0</expected-error>
-      </compilation-unit>
-    </test-case>
     <!--NotImplementedException: No binary comparator factory implemented for type OBJECT.
         <test-case FilePath="cross-dataverse">
           <compilation-unit name="cross-dv17">
@@ -7825,6 +7885,107 @@
   </test-group>
   <test-group name="user-defined-functions">
     <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-1">
+        <output-dir compare="Text">bad-function-ddl-1</output-dir>
+        <expected-error>Cannot find dataset TweetMessages in dataverse experiments nor an alias with name TweetMessages!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-2">
+        <output-dir compare="Text">bad-function-ddl-2</output-dir>
+        <expected-error>Cannot find dataset TweetMessages in dataverse experiments2 nor an alias with name TweetMessages!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-3">
+        <output-dir compare="Text">bad-function-ddl-3</output-dir>
+        <expected-error>Cannot find dataset TweetMessages in dataverse experiments nor an alias with name TweetMessages!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-4">
+        <output-dir compare="Text">bad-function-ddl-4</output-dir>
+        <expected-error>Cannot find dataset TweetMessages in dataverse experients nor an alias with name TweetMessages!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-5">
+        <output-dir compare="Text">bad-function-ddl-5</output-dir>
+        <expected-error>function experiments.function_that_does_not_exist@0 is not defined</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-6">
+        <output-dir compare="Text">bad-function-ddl-6</output-dir>
+        <expected-error>function experiments.function_that_does_not_exist@2 is not defined</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-7">
+        <output-dir compare="Text">bad-function-ddl-7</output-dir>
+        <expected-error>Cannot find dataset TweetMessaes in dataverse experiments nor an alias with name TweetMessaes!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-8">
+        <output-dir compare="Text">bad-function-ddl-8</output-dir>
+        <expected-error>Cannot find dataset TweetMessaes in dataverse experiments nor an alias with name TweetMessaes!</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-9">
+        <output-dir compare="Text">bad-function-ddl-9</output-dir>
+        <expected-error>function experiments.function_that_does_not_exist@0 is not defined</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="bad-function-ddl-10">
+        <output-dir compare="Text">bad-function-ddl-10</output-dir>
+        <expected-error>function experiments.f0@2 is not defined</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="check-dependencies-1">
+        <output-dir compare="Text">check-dependencies-1</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-1">
+        <output-dir compare="Text">drop-dependency-1</output-dir>
+        <expected-error>Cannot drop dataverse. Function B.f0@2 depends on function C.f1@2</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-2">
+        <output-dir compare="Text">drop-dependency-2</output-dir>
+        <expected-error>Cannot drop dataverse. Function B.f2@2 depends on dataset C.TweetMessages</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-3">
+        <output-dir compare="Text">drop-dependency-3</output-dir>
+        <expected-error>Cannot drop function C.f1@2 being used by function B.f0@2</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-4">
+        <output-dir compare="Text">drop-dependency-4</output-dir>
+        <expected-error>Cannot drop dataset C.TweetMessages being used by function B.f2@2</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-5">
+        <output-dir compare="Text">drop-dependency-5</output-dir>
+        <expected-error>Cannot drop function C.f1@2 being used by function C.f0@2</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
+      <compilation-unit name="drop-dependency-6">
+        <output-dir compare="Text">drop-dependency-6</output-dir>
+        <expected-error>Cannot drop dataset C.TweetMessages being used by function C.f2@2</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="user-defined-functions">
       <compilation-unit name="single-line-definition">
         <output-dir compare="Text">single-line-definition</output-dir>
       </compilation-unit>
@@ -8010,12 +8171,6 @@
         </test-case>
         -->
     <test-case FilePath="user-defined-functions">
-      <compilation-unit name="udf26">
-        <output-dir compare="Text">udf26</output-dir>
-        <expected-error>function test.needs_f1@1 depends upon function test.f1@0 which is undefined</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="user-defined-functions">
       <compilation-unit name="udf27">
         <output-dir compare="Text">udf27</output-dir>
       </compilation-unit>
@@ -8995,72 +9150,7 @@
       </compilation-unit>
     </test-case>
   </test-group>
-  <test-group name="temp-dataset">
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset">
-        <output-dir compare="Text">delete-from-loaded-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset-with-index">
-        <output-dir compare="Text">delete-from-loaded-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-empty-secondary-indexes">
-        <output-dir compare="Text">drop-empty-secondary-indexes</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-index">
-        <output-dir compare="Text">drop-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="empty-load-with-index">
-        <output-dir compare="Text">empty-load-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset">
-        <output-dir compare="Text">insert-and-scan-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="q01_pricing_summary_report_nt">
-        <output-dir compare="Text">q01_pricing_summary_report_nt</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-delete-rtree-secondary-index">
-        <output-dir compare="Text">scan-delete-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-rtree-secondary-index">
-        <output-dir compare="Text">scan-insert-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-persistent-to-temp">
-        <output-dir compare="Text">scan-insert-persistent-to-temp</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-temp-to-persistent">
-        <output-dir compare="Text">scan-insert-temp-to-persistent</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset-with-index">
-        <output-dir compare="Text">insert-and-scan-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-        <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset-with-correlated-index">
-        <output-dir compare="Text">insert-and-scan-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
+  <test-group name="unnest">
     <test-case FilePath="unnest">
       <compilation-unit name="left-outer-unnest">
         <output-dir compare="Text">left-outer-unnest</output-dir>
@@ -9090,12 +9180,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="union">
-      <compilation-unit name="union_negative_2">
-        <output-dir compare="Text">union</output-dir>
-        <expected-error>Cannot find dataset t in dataverse TinySocial nor an alias with name t</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="union">
       <compilation-unit name="union_negative_3">
         <output-dir compare="Text">union</output-dir>
         <expected-error>Operation UNION with set semantics is not supported.</expected-error>
@@ -9122,6 +9206,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="union">
+      <compilation-unit name="union_orderby_5">
+        <output-dir compare="Text">union_orderby_5</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="union">
       <compilation-unit name="query-ASTERIXDB-1354-2">
         <output-dir compare="Text">query-ASTERIXDB-1354-2</output-dir>
       </compilation-unit>
@@ -9209,4 +9298,149 @@
       </compilation-unit>
     </test-case>
   </test-group>
+  <test-group name="json-parser">
+    <test-case FilePath="json-parser">
+      <compilation-unit name="numeric-tinyint">
+        <output-dir compare="Text">numeric-tinyint</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="numeric-tinyint-overflow">
+        <output-dir compare="Text">numeric-tinyint</output-dir>
+        <expected-error>Numeric value (1000) out of range of Java byte</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="numeric-float">
+        <output-dir compare="Text">numeric-float</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="numeric-demote-double-bigint">
+        <output-dir compare="Text">numeric-demote-double-bigint</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="numeric-promote-bigint-double">
+        <output-dir compare="Text">numeric-promote-bigint-double</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="duplicate-fields">
+        <output-dir compare="Text">duplicate-fields</output-dir>
+        <expected-error>Duplicate field 'field'</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="malformed-json">
+        <output-dir compare="Text">malformed-json</output-dir>
+        <expected-error>Unexpected character ('}' (code 125)): was expecting double-quote to start field name</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="null-missing">
+        <output-dir compare="Text">null-missing</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="nonoptional-missing">
+        <output-dir compare="Text">nonoptional-missing</output-dir>
+        <expected-error>ASX3075: Closed field missing_value has null value</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="nonoptional-null">
+        <output-dir compare="Text">nonoptional-null</output-dir>
+        <expected-error>ASX3075: Closed field null_value has null value</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="spatial">
+        <output-dir compare="Text">spatial</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="spatial-line-3-points">
+        <output-dir compare="Text">spatial-line-3-points</output-dir>
+        <expected-error>Line must have 4 coordinates</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="spatial-polygon-unclosed">
+        <output-dir compare="Text">spatial-polygon-unclosed</output-dir>
+        <expected-error>Unclosed polygon is not supported</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="spatial-polygon-with-hole">
+        <output-dir compare="Text">spatial-polygon-with-hole</output-dir>
+        <expected-error>Only simple geometries are supported (Point, LineString and Polygon without holes)</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="temporal">
+        <output-dir compare="Text">temporal</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="type-mismatch">
+        <output-dir compare="Text">type-mismatch</output-dir>
+        <expected-error>ASX3054: Mismatch Type, expecting a value of type string</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-circle">
+        <output-dir compare="Text">unsupported-type-circle</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type circle</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-daytimeduration">
+        <output-dir compare="Text">unsupported-type-daytimeduration</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type daytimeduration</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-duration">
+        <output-dir compare="Text">unsupported-type-duration</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type duration</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-interval">
+        <output-dir compare="Text">unsupported-type-interval</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type interval</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-multiset">
+        <output-dir compare="Text">unsupported-type-multiset</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type multiset</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-point3d">
+        <output-dir compare="Text">unsupported-type-point3d</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type point3d</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="json-parser">
+      <compilation-unit name="unsupported-type-rectangle">
+        <output-dir compare="Text">unsupported-type-rectangle</output-dir>
+        <expected-error>ASX0004: Unsupported type: org.apache.asterix.external.parser.factory.JSONDataParserFactory cannot process input type rectangle</expected-error>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+  <test-group name="composite-key">
+    <test-case FilePath="composite-key">
+      <compilation-unit name="query-ASTERIXDB-920">
+        <output-dir compare="Text">query-ASTERIXDB-920</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="composite-key">
+      <compilation-unit name="composite-low-high">
+        <output-dir compare="Text">composite-low-high</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
 </test-suite>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
index fcd1a70..283f055 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp_parser.xml
@@ -5671,12 +5671,6 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv13">
-        <output-dir compare="AST">cross-dv13</output-dir>
-        <expected-error>org.apache.asterix.common.exceptions.AsterixException</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="cross-dataverse">
       <compilation-unit name="cross-dv14">
         <output-dir compare="AST">cross-dv14</output-dir>
       </compilation-unit>
@@ -5686,12 +5680,6 @@
         <output-dir compare="AST">cross-dv15</output-dir>
       </compilation-unit>
     </test-case>
-    <test-case FilePath="cross-dataverse">
-      <compilation-unit name="cross-dv16">
-        <output-dir compare="AST">cross-dv16</output-dir>
-        <expected-error>org.apache.asterix.common.exceptions.AsterixException</expected-error>
-      </compilation-unit>
-    </test-case>
     <!--NotImplementedException: No binary comparator factory implemented for type RECORD.
         <test-case FilePath="cross-dataverse">
           <compilation-unit name="cross-dv17">
@@ -5893,12 +5881,6 @@
         </test-case>
         -->
     <test-case FilePath="user-defined-functions">
-      <compilation-unit name="udf26">
-        <output-dir compare="AST">udf26</output-dir>
-        <expected-error>org.apache.asterix.common.exceptions.AsterixException</expected-error>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="user-defined-functions">
       <compilation-unit name="udf27">
         <output-dir compare="AST">udf27</output-dir>
       </compilation-unit>
@@ -6746,66 +6728,4 @@
       </compilation-unit>
     </test-case>
   </test-group>
-  <test-group name="temp-dataset">
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset">
-        <output-dir compare="AST">delete-from-loaded-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="delete-from-loaded-dataset-with-index">
-        <output-dir compare="AST">delete-from-loaded-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-empty-secondary-indexes">
-        <output-dir compare="AST">drop-empty-secondary-indexes</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="drop-index">
-        <output-dir compare="AST">drop-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="empty-load-with-index">
-        <output-dir compare="AST">empty-load-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset">
-        <output-dir compare="AST">insert-and-scan-dataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="q01_pricing_summary_report_nt">
-        <output-dir compare="AST">q01_pricing_summary_report_nt</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-delete-rtree-secondary-index">
-        <output-dir compare="AST">scan-delete-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-rtree-secondary-index">
-        <output-dir compare="AST">scan-insert-rtree-secondary-index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-persistent-to-temp">
-        <output-dir compare="AST">scan-insert-persistent-to-temp</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="scan-insert-temp-to-persistent">
-        <output-dir compare="AST">scan-insert-temp-to-persistent</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="temp-dataset">
-      <compilation-unit name="insert-and-scan-dataset-with-index">
-        <output-dir compare="AST">insert-and-scan-dataset-with-index</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
 </test-suite>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_stringoffset.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_stringoffset.xml
new file mode 100644
index 0000000..f7da162
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_stringoffset.xml
@@ -0,0 +1,67 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries_sqlpp" QueryFileExtension=".sqlpp">
+  <test-group name="stringoffset">
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="position">
+        <output-dir compare="Text">position</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="regexp_position">
+        <output-dir compare="Text">regexp_position</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="regexp_position_with_flag">
+        <output-dir compare="Text">regexp_position_with_flag</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="substring">
+        <output-dir compare="Text">substring</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="substring2">
+        <output-dir compare="Text">substring2</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="subbinary">
+        <output-dir compare="Text">subbinary</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="subbinary2">
+        <output-dir compare="Text">subbinary2</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="findbinary">
+        <output-dir compare="Text">findbinary</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="stringoffset">
+      <compilation-unit name="findbinary2">
+        <output-dir compare="Text">findbinary2</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-benchmark/pom.xml b/asterixdb/asterix-benchmark/pom.xml
index af21e0f..d3e41c3 100644
--- a/asterixdb/asterix-benchmark/pom.xml
+++ b/asterixdb/asterix-benchmark/pom.xml
@@ -25,6 +25,10 @@
   </parent>
   <artifactId>asterix-benchmark</artifactId>
 
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
+
   <build>
     <plugins>
       <plugin>
diff --git a/asterixdb/asterix-client-helper/pom.xml b/asterixdb/asterix-client-helper/pom.xml
index 9f057f2..8063817 100644
--- a/asterixdb/asterix-client-helper/pom.xml
+++ b/asterixdb/asterix-client-helper/pom.xml
@@ -24,6 +24,9 @@
     <artifactId>apache-asterixdb</artifactId>
     <version>0.9.4-SNAPSHOT</version>
   </parent>
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java
index 8a721b9..5432df9 100644
--- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/Args.java
@@ -28,22 +28,18 @@
 @SuppressWarnings("FieldCanBeLocal")
 public class Args {
 
-    @Option(name = "-clusteraddress", metaVar = "<address>",
-            usage = "Hostname or IP Address of the cluster")
+    @Option(name = "-clusteraddress", metaVar = "<address>", usage = "Hostname or IP Address of the cluster")
     protected String clusterAddress = InetAddress.getLoopbackAddress().getHostAddress();
 
     @Option(name = "-clusterport", metaVar = "<port>", usage = "Port of the cluster to connect to")
     protected int clusterPort = 19002;
 
-    @Option(name = "-clusterstatepath", metaVar = "<path>", hidden = true,
-            usage = "Path on host:port to check for cluster readiness")
+    @Option(name = "-clusterstatepath", metaVar = "<path>", hidden = true, usage = "Path on host:port to check for cluster readiness")
     protected String clusterStatePath = "admin/cluster";
 
-    @Option(name = "-shutdownpath", metaVar = "<path>", hidden = true,
-            usage = "Path on host:port to invoke to initiate shutdown")
+    @Option(name = "-shutdownpath", metaVar = "<path>", hidden = true, usage = "Path on host:port to invoke to initiate shutdown")
     protected String shutdownPath = "admin/shutdown";
 
-
     @Option(name = "-timeout", metaVar = "<secs>", usage = "Timeout for wait commands in seconds")
     protected int timeoutSecs = 0;
 
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java
index 7dfede9..d71b844 100644
--- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelper.java
@@ -25,7 +25,7 @@
     private AsterixHelper() {
     }
 
-    public static void main(String [] args) throws IOException {
+    public static void main(String[] args) throws IOException {
         AsterixHelperExecution execution = new AsterixHelperExecution();
         System.exit(execution.execute(args));
     }
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java
index cf7fd4f..326b1ca 100644
--- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/AsterixHelperExecution.java
@@ -40,11 +40,10 @@
     protected AsterixHelperExecution() {
     }
 
-    @SuppressWarnings({
-            "squid:S106", // use of System.err
+    @SuppressWarnings({ "squid:S106", // use of System.err
             "squid:S1166" // rethrow or log exception
     })
-    public int execute(String [] argArray) throws IOException {
+    public int execute(String[] argArray) throws IOException {
         Args args = createArgs();
         CmdLineParser parser = createParser(args);
         try {
@@ -59,8 +58,8 @@
                 return command.execute();
             }
         } catch (CmdLineException e) {
-            System.err.println("ERROR: " + e.getMessage() + "\n\n"
-                    + "Usage: " + getHelperCommandName() + " [options] <command>");
+            System.err.println(
+                    "ERROR: " + e.getMessage() + "\n\n" + "Usage: " + getHelperCommandName() + " [options] <command>");
 
             printUsageDetails(parser, System.err);
             return 99;
diff --git a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java
index 6a16761..4ba48c6 100644
--- a/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java
+++ b/asterixdb/asterix-client-helper/src/main/java/org/apache/asterix/clienthelper/commands/RemoteCommand.java
@@ -67,7 +67,7 @@
 
     protected HttpURLConnection openConnection(String path, Method method) throws IOException {
         URL url = new URL("http://" + hostPort + "/" + path);
-        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         final int timeoutMillis =
                 (int) TimeUnit.SECONDS.toMillis(Math.max(MAX_CONNECTION_TIMEOUT_SECS, args.getTimeoutSecs()));
         conn.setConnectTimeout(timeoutMillis);
diff --git a/asterixdb/asterix-common/pom.xml b/asterixdb/asterix-common/pom.xml
index 9d9196c..79af3b6 100644
--- a/asterixdb/asterix-common/pom.xml
+++ b/asterixdb/asterix-common/pom.xml
@@ -33,7 +33,7 @@
     </license>
   </licenses>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
   <build>
     <plugins>
@@ -169,7 +169,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
+        <configuration combine.children="append">
           <ignoredUnusedDeclaredDependencies>
             <ignoredUnusedDeclaredDependency>org.apache.hyracks:hyracks-storage-am-lsm-btree:*</ignoredUnusedDeclaredDependency>
             <ignoredUnusedDeclaredDependency>org.apache.hyracks:hyracks-storage-am-lsm-rtree:*</ignoredUnusedDeclaredDependency>
@@ -225,18 +225,10 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-storage-am-btree</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-storage-am-bloomfilter</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-storage-am-rtree</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-api</artifactId>
     </dependency>
     <dependency>
@@ -245,17 +237,9 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-storage-am-lsm-invertedindex</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-storage-am-lsm-rtree</artifactId>
     </dependency>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
       <groupId>com.rometools</groupId>
       <artifactId>rome</artifactId>
       <scope>test</scope>
@@ -303,5 +287,9 @@
       <groupId>args4j</groupId>
       <artifactId>args4j</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java
index de1e1fa..4d08b54 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/annotations/SkipSecondaryIndexSearchExpressionAnnotation.java
@@ -24,7 +24,8 @@
 public class SkipSecondaryIndexSearchExpressionAnnotation extends AbstractExpressionAnnotation {
 
     public static final String HINT_STRING = "skip-index";
-    public static final SkipSecondaryIndexSearchExpressionAnnotation INSTANCE = new SkipSecondaryIndexSearchExpressionAnnotation();
+    public static final SkipSecondaryIndexSearchExpressionAnnotation INSTANCE =
+            new SkipSecondaryIndexSearchExpressionAnnotation();
 
     @Override
     public IExpressionAnnotation copy() {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ExtensionId.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ExtensionId.java
index 1cd0ce7..0e0a67c 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ExtensionId.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ExtensionId.java
@@ -19,8 +19,7 @@
 package org.apache.asterix.common.api;
 
 import java.io.Serializable;
-
-import org.apache.commons.lang3.ObjectUtils;
+import java.util.Objects;
 
 public class ExtensionId implements Serializable {
 
@@ -35,7 +34,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(getName().hashCode(), version);
+        return Objects.hash(getName().hashCode(), version);
     }
 
     @Override
@@ -44,7 +43,7 @@
             return true;
         } else if (o instanceof ExtensionId) {
             ExtensionId oExtensionId = (ExtensionId) o;
-            return version == oExtensionId.version && ObjectUtils.equals(name, oExtensionId.getName());
+            return version == oExtensionId.version && Objects.equals(name, oExtensionId.getName());
         }
         return false;
     }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
index 4e30d54..6b5b472 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IApplicationContext.java
@@ -71,4 +71,9 @@
      *             if connection couldn't be established to cluster controller
      */
     IHyracksClientConnection getHcc() throws HyracksDataException;
+
+    /**
+     * @return the cluster coordination service.
+     */
+    ICoordinationService getCoordinationService();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWork.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWork.java
index 8bc6eb0..c2d3303 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWork.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWork.java
@@ -26,12 +26,12 @@
     }
 
     enum ClusterState {
-        UNUSABLE,       // one or more cluster partitions are inactive or max id resources have not been reported
-        PENDING,        // the metadata node has not yet joined & initialized
-        RECOVERING,     // global recovery has not yet completed
-        ACTIVE,         // cluster is ACTIVE and ready for requests
-        REBALANCING,    // replication is processing failbacks
-        SHUTTING_DOWN   // a shutdown request has been received, and is underway
+        UNUSABLE, // one or more cluster partitions are inactive or max id resources have not been reported
+        PENDING, // the metadata node has not yet joined & initialized
+        RECOVERING, // global recovery has not yet completed
+        ACTIVE, // cluster is ACTIVE and ready for requests
+        REBALANCING, // replication is processing failbacks
+        SHUTTING_DOWN // a shutdown request has been received, and is underway
     }
 
     WorkType getClusterManagementWorkType();
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWorkResponse.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWorkResponse.java
index a39aecd..0506817 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWorkResponse.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IClusterManagementWorkResponse.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.common.api;
 
-
 public interface IClusterManagementWorkResponse {
 
     public enum Status {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICoordinationService.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICoordinationService.java
new file mode 100644
index 0000000..6146084
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICoordinationService.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.api;
+
+import java.util.Optional;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface ICoordinationService {
+
+    /**
+     * Adds or updates the property with the name {@code key}
+     * with {@code value}
+     *
+     * @param key
+     * @param value
+     * @throws HyracksDataException
+     */
+    void put(String key, byte[] value) throws HyracksDataException;
+
+    /**
+     * Gets the value of the property with name {@code key} if exists.
+     *
+     * @param key
+     * @return optional with the value or {@link Optional#empty()}
+     * @throws HyracksDataException
+     */
+    Optional<byte[]> get(String key) throws HyracksDataException;
+
+    /**
+     * Deletes the property with name {@code key} if exists.
+     *
+     * @param key
+     * @throws HyracksDataException
+     */
+    void delete(String key) throws HyracksDataException;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IDatasetLifecycleManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IDatasetLifecycleManager.java
index a32d4dc..4441c6e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IDatasetLifecycleManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IDatasetLifecycleManager.java
@@ -25,6 +25,7 @@
 import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
 import org.apache.asterix.common.replication.IReplicationStrategy;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.IResourceLifecycleManager;
@@ -74,9 +75,19 @@
      * creates (if necessary) and returns the primary index operation tracker of a dataset.
      *
      * @param datasetId
+     * @param partition
      * @return
      */
-    PrimaryIndexOperationTracker getOperationTracker(int datasetId);
+    PrimaryIndexOperationTracker getOperationTracker(int datasetId, int partition);
+
+    /**
+     * creates (if necessary) and returns the component Id generator of a dataset.
+     *
+     * @param datasetId
+     * @param partition
+     * @return
+     */
+    ILSMComponentIdGenerator getComponentIdGenerator(int datasetId, int partition);
 
     /**
      * creates (if necessary) and returns the dataset virtual buffer caches.
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IJobEventListenerFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IJobEventListenerFactory.java
new file mode 100644
index 0000000..acb3ae8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IJobEventListenerFactory.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.api;
+
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
+
+/**
+ * an interface for JobEventListenerFactories to add Asterix txnId getter
+ */
+public interface IJobEventListenerFactory extends IJobletEventListenerFactory {
+
+    TxnId getTxnId(int datasetId);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IMetadataLockManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IMetadataLockManager.java
index 4408d84..bed9869 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IMetadataLockManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/IMetadataLockManager.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.common.api;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.LockList;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
@@ -31,10 +30,10 @@
      *            the lock list to add the new lock to
      * @param dataverseName
      *            the dataverse name
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDataverseReadLock(LockList locks, String dataverseName) throws AsterixException;
+    void acquireDataverseReadLock(LockList locks, String dataverseName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the dataverse
@@ -43,10 +42,10 @@
      *            the lock list to add the new lock to
      * @param dataverseName
      *            the dataverse name
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDataverseWriteLock(LockList locks, String dataverseName) throws AsterixException;
+    void acquireDataverseWriteLock(LockList locks, String dataverseName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the dataset (for queries)
@@ -55,10 +54,10 @@
      *            the lock list to add the new lock to
      * @param datasetFullyQualifiedName
      *            the fully qualified name of the dataset
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDatasetReadLock(LockList locks, String datasetFullyQualifiedName) throws AsterixException;
+    void acquireDatasetReadLock(LockList locks, String datasetFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the dataset (for dataset create, dataset drop, and index drop)
@@ -67,10 +66,10 @@
      *            the lock list to add the new lock to
      * @param datasetFullyQualifiedName
      *            the fully qualified name of the dataset
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDatasetWriteLock(LockList locks, String datasetFullyQualifiedName) throws AsterixException;
+    void acquireDatasetWriteLock(LockList locks, String datasetFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire modify lock on the dataset (for inserts, upserts, deletes) Mutually exclusive with create index lock
@@ -79,10 +78,10 @@
      *            the lock list to add the new lock to
      * @param datasetFullyQualifiedName
      *            the fully qualified name of the dataset
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDatasetModifyLock(LockList locks, String datasetFullyQualifiedName) throws AsterixException;
+    void acquireDatasetModifyLock(LockList locks, String datasetFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire create index lock on the dataset (for index creation) Mutually exclusive with modify lock
@@ -91,10 +90,10 @@
      *            the lock list to add the new lock to
      * @param datasetFullyQualifiedName
      *            the fully qualified name of the dataset
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDatasetCreateIndexLock(LockList locks, String datasetFullyQualifiedName) throws AsterixException;
+    void acquireDatasetCreateIndexLock(LockList locks, String datasetFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire exclusive modify lock on the dataset. only a single thread can acquire this lock and it is mutually
@@ -104,11 +103,11 @@
      *            the lock list to add the new lock to
      * @param datasetFullyQualifiedName
      *            the fully qualified name of the dataset
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
     void acquireDatasetExclusiveModificationLock(LockList locks, String datasetFullyQualifiedName)
-            throws AsterixException;
+            throws AlgebricksException;
 
     /**
      * Acquire read lock on the function
@@ -117,10 +116,10 @@
      *            the lock list to add the new lock to
      * @param functionFullyQualifiedName
      *            the fully qualified name of the function
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireFunctionReadLock(LockList locks, String functionFullyQualifiedName) throws AsterixException;
+    void acquireFunctionReadLock(LockList locks, String functionFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the function
@@ -129,10 +128,10 @@
      *            the lock list to add the new lock to
      * @param functionFullyQualifiedName
      *            the fully qualified name of the function
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireFunctionWriteLock(LockList locks, String functionFullyQualifiedName) throws AsterixException;
+    void acquireFunctionWriteLock(LockList locks, String functionFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the node group
@@ -141,10 +140,10 @@
      *            the lock list to add the new lock to
      * @param nodeGroupName
      *            the name of the node group
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireNodeGroupReadLock(LockList locks, String nodeGroupName) throws AsterixException;
+    void acquireNodeGroupReadLock(LockList locks, String nodeGroupName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the node group
@@ -153,10 +152,10 @@
      *            the lock list to add the new lock to
      * @param nodeGroupName
      *            the name of the node group
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireNodeGroupWriteLock(LockList locks, String nodeGroupName) throws AsterixException;
+    void acquireNodeGroupWriteLock(LockList locks, String nodeGroupName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the active entity
@@ -165,10 +164,10 @@
      *            the lock list to add the new lock to
      * @param entityFullyQualifiedName
      *            the fully qualified name of the active entity
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireActiveEntityReadLock(LockList locks, String entityFullyQualifiedName) throws AsterixException;
+    void acquireActiveEntityReadLock(LockList locks, String entityFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the active entity
@@ -177,10 +176,10 @@
      *            the lock list to add the new lock to
      * @param entityFullyQualifiedName
      *            the fully qualified name of the active entity
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireActiveEntityWriteLock(LockList locks, String entityFullyQualifiedName) throws AsterixException;
+    void acquireActiveEntityWriteLock(LockList locks, String entityFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the feed policy
@@ -189,10 +188,10 @@
      *            the lock list to add the new lock to
      * @param feedPolicyFullyQualifiedName
      *            the fully qualified name of the feed policy
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireFeedPolicyWriteLock(LockList locks, String feedPolicyFullyQualifiedName) throws AsterixException;
+    void acquireFeedPolicyWriteLock(LockList locks, String feedPolicyFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the feed policy
@@ -201,10 +200,10 @@
      *            the lock list to add the new lock to
      * @param feedPolicyFullyQualifiedName
      *            the fully qualified name of the feed policy
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireFeedPolicyReadLock(LockList locks, String feedPolicyFullyQualifiedName) throws AsterixException;
+    void acquireFeedPolicyReadLock(LockList locks, String feedPolicyFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the merge policy
@@ -213,10 +212,10 @@
      *            the lock list to add the new lock to
      * @param mergePolicyFullyQualifiedName
      *            the fully qualified name of the merge policy
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireMergePolicyReadLock(LockList locks, String mergePolicyFullyQualifiedName) throws AsterixException;
+    void acquireMergePolicyReadLock(LockList locks, String mergePolicyFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the merge policy
@@ -225,10 +224,10 @@
      *            the lock list to add the new lock to
      * @param mergePolicyFullyQualifiedName
      *            the fully qualified name of the merge policy
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireMergePolicyWriteLock(LockList locks, String mergePolicyFullyQualifiedName) throws AsterixException;
+    void acquireMergePolicyWriteLock(LockList locks, String mergePolicyFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the data type
@@ -237,10 +236,10 @@
      *            the lock list to add the new lock to
      * @param datatypeFullyQualifiedName
      *            the fully qualified name of the data type
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDataTypeReadLock(LockList locks, String datatypeFullyQualifiedName) throws AsterixException;
+    void acquireDataTypeReadLock(LockList locks, String datatypeFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire write lock on the data type
@@ -249,10 +248,10 @@
      *            the lock list to add the new lock to
      * @param datatypeFullyQualifiedName
      *            the fully qualified name of the data type
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
-    void acquireDataTypeWriteLock(LockList locks, String datatypeFullyQualifiedName) throws AsterixException;
+    void acquireDataTypeWriteLock(LockList locks, String datatypeFullyQualifiedName) throws AlgebricksException;
 
     /**
      * Acquire read lock on the extension entity
@@ -263,11 +262,11 @@
      *            the extension key
      * @param extensionEntityFullyQualifiedName
      *            the fully qualified name of the extension entity
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
     void acquireExtensionReadLock(LockList locks, String extension, String extensionEntityFullyQualifiedName)
-            throws AsterixException;
+            throws AlgebricksException;
 
     /**
      * Acquire write lock on the extension entity
@@ -278,11 +277,11 @@
      *            the extension key
      * @param extensionEntityFullyQualifiedName
      *            the fully qualified name of the extension entity
-     * @throws AsterixException
+     * @throws AlgebricksException
      *             if lock couldn't be acquired
      */
     void acquireExtensionWriteLock(LockList locks, String extension, String extensionEntityFullyQualifiedName)
-            throws AsterixException;
+            throws AlgebricksException;
 
     /**
      * Upgrade a previously acquired exclusive modification lock on the dataset to a write lock
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INCLifecycleTask.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INCLifecycleTask.java
index c30e999..138f0e2 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INCLifecycleTask.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INCLifecycleTask.java
@@ -20,6 +20,7 @@
 
 import java.io.Serializable;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.service.IControllerService;
 
@@ -29,8 +30,9 @@
     /**
      * Performs the task.
      *
+     * @param ccId
      * @param cs
      * @throws HyracksDataException
      */
-    void perform(IControllerService cs) throws HyracksDataException;
+    void perform(CcId ccId, IControllerService cs) throws HyracksDataException;
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INcApplicationContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INcApplicationContext.java
index 548907c..19b4d61 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INcApplicationContext.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INcApplicationContext.java
@@ -24,13 +24,14 @@
 
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.replication.IRemoteRecoveryManager;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
 import org.apache.asterix.common.replication.IReplicationChannel;
 import org.apache.asterix.common.replication.IReplicationManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.IReplicaManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.IIOManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -66,9 +67,9 @@
 
     IResourceIdFactory getResourceIdFactory();
 
-    ILSMOperationTracker getLSMBTreeOperationTracker(int datasetID);
+    ILSMOperationTracker getPrimaryOperationTracker(int datasetID, int partition);
 
-    void initialize(boolean initialRun) throws IOException, ACIDException, AsterixException;
+    void initialize(boolean initialRun) throws IOException, ACIDException, AlgebricksException;
 
     void setShuttingdown(boolean b);
 
@@ -78,10 +79,6 @@
 
     Object getActiveManager();
 
-    IRemoteRecoveryManager getRemoteRecoveryManager();
-
-    IReplicaResourcesManager getReplicaResourcesManager();
-
     IReplicationManager getReplicationManager();
 
     IReplicationChannel getReplicationChannel();
@@ -97,9 +94,10 @@
      * Initializes the metadata node and bootstraps the metadata.
      *
      * @param newUniverse
+     * @param partitionId
      * @throws Exception
      */
-    void initializeMetadata(boolean newUniverse) throws Exception;
+    void initializeMetadata(boolean newUniverse, int partitionId) throws Exception;
 
     /**
      * Unexports the metadata node from the RMI registry
@@ -109,10 +107,23 @@
     void unexportMetadataNodeStub() throws RemoteException;
 
     /**
+     * Binds the exported metadata node to the CC's distributed state.
+     *
+     * @throws RemoteException
+     */
+    void bindMetadataNodeStub(CcId ccId) throws RemoteException;
+
+    /**
      * @return instance of {@link org.apache.asterix.common.context.IStorageComponentProvider}
      */
     IStorageComponentProvider getStorageComponentProvider();
 
     @Override
     INCServiceContext getServiceContext();
+
+    IIndexCheckpointManagerProvider getIndexCheckpointManagerProvider();
+
+    IReplicaManager getReplicaManager();
+
+    long getMaxTxnId();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INodeJobTracker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INodeJobTracker.java
new file mode 100644
index 0000000..9966c95
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/INodeJobTracker.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.api;
+
+import java.util.Set;
+
+import org.apache.hyracks.api.application.IClusterLifecycleListener;
+import org.apache.hyracks.api.job.IJobLifecycleListener;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.JobSpecification;
+
+public interface INodeJobTracker extends IJobLifecycleListener, IClusterLifecycleListener {
+
+    /**
+     * Gets node {@code nodeId} pending jobs. If the node is not active,
+     * an empty set is returned.
+     *
+     * @param nodeId
+     * @return unmodifiable set of the node pending jobs.
+     */
+    Set<JobId> getPendingJobs(String nodeId);
+
+    /**
+     * Gets the set of nodes that will participate in the execution
+     * of the job. The nodes will include only nodes that are known
+     * to this {@link INodeJobTracker}
+     *
+     * @param spec
+     * @return The participating nodes in the job execution
+     */
+    Set<String> getJobParticipatingNodes(JobSpecification spec);
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
index 3948ea6..0a5707e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/cluster/IClusterStateManager.java
@@ -25,8 +25,8 @@
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.schema.cluster.Node;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -115,7 +115,7 @@
      * @param nodePartitions
      * @throws AsterixException
      */
-    void registerNodePartitions(String nodeId, ClusterPartition[] nodePartitions) throws AsterixException;
+    void registerNodePartitions(String nodeId, ClusterPartition[] nodePartitions) throws AlgebricksException;
 
     /**
      * De-register the specified node's partitions from this cluster state manager
@@ -209,11 +209,6 @@
     void notifyNodeFailure(String deadNode) throws HyracksException;
 
     /**
-     * @return a substitution node or null
-     */
-    Node getAvailableSubstitutionNode();
-
-    /**
      * Add node to the list of nodes pending removal
      *
      * @param nodeId
@@ -227,4 +222,20 @@
      * @return
      */
     boolean cancelRemovePending(String nodeId);
+
+    Map<String, Map<IOption, Object>> getActiveNcConfiguration();
+
+    /**
+     * Sets the cluster partition in which metadata datasets stored
+     *
+     * @param partition
+     */
+    void setMetadataPartitionId(ClusterPartition partition);
+
+    /**
+     * Gets the cluster partition in which metadata datasets are stored
+     *
+     * @return The metadata cluster partitions
+     */
+    ClusterPartition getMetadataPartition();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixExtension.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixExtension.java
index 57a3c79..89a44c7 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixExtension.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixExtension.java
@@ -20,8 +20,8 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public class AsterixExtension {
@@ -50,13 +50,13 @@
     public boolean equals(Object o) {
         if (o instanceof AsterixExtension) {
             AsterixExtension other = (AsterixExtension) o;
-            return ObjectUtils.equals(className, other.className) && ObjectUtils.equals(args, other.args);
+            return Objects.equals(className, other.className) && Objects.equals(args, other.args);
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(className);
+        return Objects.hash(className);
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
index 690d326..2c981c9 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/AsterixProperties.java
@@ -34,15 +34,9 @@
     }
 
     public static void registerConfigOptions(IConfigManager configManager) {
-        configManager.register(
-                NodeProperties.Option.class,
-                CompilerProperties.Option.class,
-                MetadataProperties.Option.class,
-                ExternalProperties.Option.class,
-                ActiveProperties.Option.class,
-                MessagingProperties.Option.class,
-                ReplicationProperties.Option.class,
-                StorageProperties.Option.class,
+        configManager.register(NodeProperties.Option.class, CompilerProperties.Option.class,
+                MetadataProperties.Option.class, ExternalProperties.Option.class, ActiveProperties.Option.class,
+                MessagingProperties.Option.class, ReplicationProperties.Option.class, StorageProperties.Option.class,
                 TransactionProperties.Option.class);
 
         // we need to process the old-style asterix config before we apply defaults!
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
deleted file mode 100644
index 0abb92f..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ClusterProperties.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.config;
-
-import java.io.InputStream;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.ReplicationStrategyFactory;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.cluster.Replica;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class ClusterProperties {
-
-    public static final ClusterProperties INSTANCE = new ClusterProperties();
-    public static final String CLUSTER_CONFIGURATION_FILE = "cluster.xml";
-    public static final String DEFAULT_STORAGE_DIR_NAME = "storage";
-    private String nodeNamePrefix = StringUtils.EMPTY;
-    private Cluster cluster;
-
-    private ClusterProperties() {
-        InputStream is = this.getClass().getClassLoader().getResourceAsStream(CLUSTER_CONFIGURATION_FILE);
-        if (is != null) {
-            try {
-                JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-                Unmarshaller unmarshaller = ctx.createUnmarshaller();
-                cluster = (Cluster) unmarshaller.unmarshal(is);
-                nodeNamePrefix = cluster.getInstanceName() + "_";
-                updateNodeIdToFullName();
-            } catch (JAXBException e) {
-                throw new IllegalStateException("Failed to read configuration file " + CLUSTER_CONFIGURATION_FILE, e);
-            }
-        }
-    }
-
-    public Cluster getCluster() {
-        return cluster;
-    }
-
-    public String getStorageDirectoryName() {
-        if (cluster != null) {
-            return cluster.getStore();
-        }
-        // virtual cluster without cluster config file
-        return DEFAULT_STORAGE_DIR_NAME;
-    }
-
-    public Node getNodeById(String nodeId) {
-        Optional<Node> matchingNode = cluster.getNode().stream().filter(node -> node.getId().equals(nodeId)).findAny();
-        return matchingNode.isPresent() ? matchingNode.get() : null;
-    }
-
-    public int getNodeIndex(String nodeId) {
-        for (int i = 0; i < cluster.getNode().size(); i++) {
-            Node node = cluster.getNode().get(i);
-            if (node.getId().equals(nodeId)) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    public IReplicationStrategy getReplicationStrategy() throws HyracksDataException {
-        return ReplicationStrategyFactory.create(cluster);
-    }
-
-    private String getNodeFullName(String nodeId) {
-        if (nodeId.startsWith(nodeNamePrefix)) {
-            return nodeId;
-        }
-        return nodeNamePrefix + nodeId;
-    }
-
-    private void updateNodeIdToFullName() {
-        cluster.getNode().forEach(node -> node.setId(getNodeFullName(node.getId())));
-        if (cluster.getMetadataNode() != null) {
-            cluster.setMetadataNode(getNodeFullName(cluster.getMetadataNode()));
-        }
-        if (cluster.getHighAvailability() != null && cluster.getHighAvailability().getFaultTolerance() != null
-                && cluster.getHighAvailability().getFaultTolerance().getReplica() != null) {
-            Replica replicas = cluster.getHighAvailability().getFaultTolerance().getReplica();
-            replicas.setNodeId(replicas.getNodeId().stream().map(this::getNodeFullName).collect(Collectors.toList()));
-        }
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
index 5ccff4f..821b6e1 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/CompilerProperties.java
@@ -33,20 +33,32 @@
 public class CompilerProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        COMPILER_SORTMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+        COMPILER_SORTMEMORY(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
                 "The memory budget (in bytes) for a sort operator instance in a partition"),
-        COMPILER_JOINMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+        COMPILER_JOINMEMORY(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
                 "The memory budget (in bytes) for a join operator instance in a partition"),
-        COMPILER_GROUPMEMORY(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
+        COMPILER_GROUPMEMORY(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(32L, MEGABYTE),
                 "The memory budget (in bytes) for a group by operator instance in a partition"),
-        COMPILER_FRAMESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(32, KILOBYTE),
+        COMPILER_FRAMESIZE(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(32, KILOBYTE),
                 "The page size (in bytes) for computation"),
-        COMPILER_PARALLELISM(INTEGER, COMPILER_PARALLELISM_AS_STORAGE, "The degree of parallelism for query " +
-                "execution. Zero means to use the storage parallelism as the query execution parallelism, while " +
-                "other integer values dictate the number of query execution parallel partitions. The system will " +
-                "fall back to use the number of all available CPU cores in the cluster as the degree of parallelism " +
-                "if the number set by a user is too large or too small"),
-        COMPILER_PREGELIX_HOME(STRING, "~/pregelix", "Pregelix installation root directory");
+        COMPILER_PARALLELISM(
+                INTEGER,
+                COMPILER_PARALLELISM_AS_STORAGE,
+                "The degree of parallelism for query "
+                        + "execution. Zero means to use the storage parallelism as the query execution parallelism, while "
+                        + "other integer values dictate the number of query execution parallel partitions. The system will "
+                        + "fall back to use the number of all available CPU cores in the cluster as the degree of parallelism "
+                        + "if the number set by a user is too large or too small"),
+        COMPILER_PREGELIX_HOME(STRING, "~/pregelix", "Pregelix installation root directory"),
+        COMPILER_STRINGOFFSET(INTEGER, 0, "Position of a first character in a String/Binary (0 or 1)");
 
         private final IOptionType type;
         private final Object defaultValue;
@@ -80,9 +92,10 @@
 
         @Override
         public boolean hidden() {
-            return this == COMPILER_PREGELIX_HOME;
+            return this == COMPILER_PREGELIX_HOME || this == COMPILER_STRINGOFFSET;
         }
     }
+
     public static final String COMPILER_SORTMEMORY_KEY = Option.COMPILER_SORTMEMORY.ini();
 
     public static final String COMPILER_GROUPMEMORY_KEY = Option.COMPILER_GROUPMEMORY.ini();
@@ -120,4 +133,9 @@
     public String getPregelixHome() {
         return accessor.getString(Option.COMPILER_PREGELIX_HOME);
     }
+
+    public int getStringOffset() {
+        int value = accessor.getInt(Option.COMPILER_STRINGOFFSET);
+        return value > 0 ? 1 : 0;
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
index bde8303..4bc1953 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ExternalProperties.java
@@ -18,11 +18,14 @@
  */
 package org.apache.asterix.common.config;
 
-import static org.apache.hyracks.control.common.config.OptionTypes.*;
+import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
+import static org.apache.hyracks.control.common.config.OptionTypes.LEVEL;
+import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
 
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.config.Section;
+import org.apache.logging.log4j.Level;
 
 public class ExternalProperties extends AbstractProperties {
 
@@ -31,9 +34,13 @@
         WEB_QUERYINTERFACE_PORT(INTEGER, 19006, "The listen port of the query web interface"),
         API_PORT(INTEGER, 19002, "The listen port of the API server"),
         ACTIVE_PORT(INTEGER, 19003, "The listen port of the active server"),
-        LOG_LEVEL(LEVEL, java.util.logging.Level.WARNING, "The logging level for master and slave processes"),
-        MAX_WAIT_ACTIVE_CLUSTER(INTEGER, 60, "The max pending time (in seconds) for cluster startup. After the " +
-                "threshold, if the cluster still is not up and running, it is considered unavailable"),
+        NC_API_PORT(INTEGER, 19004, "The listen port of the node controller API server"),
+        LOG_LEVEL(LEVEL, Level.WARN, "The logging level for master and slave processes"),
+        MAX_WAIT_ACTIVE_CLUSTER(
+                INTEGER,
+                60,
+                "The max pending time (in seconds) for cluster startup. After the "
+                        + "threshold, if the cluster still is not up and running, it is considered unavailable"),
         CC_JAVA_OPTS(STRING, "-Xmx1024m", "The JVM options passed to the cluster controller process by managix"),
         NC_JAVA_OPTS(STRING, "-Xmx1024m", "The JVM options passed to the node controller process(es) by managix");
 
@@ -55,6 +62,8 @@
                 case API_PORT:
                 case ACTIVE_PORT:
                     return Section.CC;
+                case NC_API_PORT:
+                    return Section.NC;
                 case LOG_LEVEL:
                 case MAX_WAIT_ACTIVE_CLUSTER:
                     return Section.COMMON;
@@ -102,7 +111,7 @@
         return accessor.getInt(Option.ACTIVE_PORT);
     }
 
-    public java.util.logging.Level getLogLevel() {
+    public Level getLogLevel() {
         return accessor.getLoggingLevel(Option.LOG_LEVEL);
     }
 
@@ -117,4 +126,8 @@
     public String getCCJavaParams() {
         return accessor.getString(Option.CC_JAVA_OPTS);
     }
+
+    public int getNcApiPort() {
+        return accessor.getInt(Option.NC_API_PORT);
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/GlobalConfig.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/GlobalConfig.java
index bc8fd5f..67d974b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/GlobalConfig.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/GlobalConfig.java
@@ -20,14 +20,16 @@
 
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class GlobalConfig {
     public static final boolean DEBUG = true;
 
     public static final String ASTERIX_LOGGER_NAME = "org.apache.asterix";
 
-    public static final Logger ASTERIX_LOGGER = Logger.getLogger(ASTERIX_LOGGER_NAME);
+    public static final Logger ASTERIX_LOGGER = LogManager.getLogger(ASTERIX_LOGGER_NAME);
 
     public static final String DEFAULT_CONFIG_FILE_NAME = "asterix-configuration.xml";
 
@@ -60,7 +62,7 @@
             try {
                 fz = Integer.parseInt(frameSizeStr);
             } catch (NumberFormatException nfe) {
-                GlobalConfig.ASTERIX_LOGGER.warning("Wrong frame size size argument. Picking default value ("
+                GlobalConfig.ASTERIX_LOGGER.warn("Wrong frame size size argument. Picking default value ("
                         + GlobalConfig.DEFAULT_FRAME_SIZE + ") instead.\n");
             }
             if (fz >= 0) {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
index 6a96546..e382293 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MessagingProperties.java
@@ -30,7 +30,9 @@
 public class MessagingProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        MESSAGING_FRAME_SIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(4, KILOBYTE),
+        MESSAGING_FRAME_SIZE(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(4, KILOBYTE),
                 "The frame size to be used for NC to NC messaging"),
         MESSAGING_FRAME_COUNT(INTEGER, 512, "Number of reusable frames for NC to NC messaging");
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
index 948bdad..0b18f98 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/MetadataProperties.java
@@ -105,11 +105,6 @@
         return accessor.getString(Option.METADATA_NODE);
     }
 
-    public ClusterPartition getMetadataPartition() {
-        // metadata partition is always the first partition on the metadata node
-        return accessor.getNodePartitions().get(getMetadataNodeName())[0];
-    }
-
     public Map<String, String[]> getStores() {
         return accessor.getStores();
     }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
index 2e25e34..1443b8e 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/NodeProperties.java
@@ -112,4 +112,12 @@
     public boolean isVirtualNc() {
         return accessor.getInt(NCConfig.Option.NCSERVICE_PORT) == NCConfig.NCSERVICE_PORT_DISABLED;
     }
+
+    public String getTxnLogDir() {
+        return accessor.getString(Option.TXN_LOG_DIR);
+    }
+
+    public String getStorageSubdir() {
+        return accessor.getString(Option.STORAGE_SUBDIR);
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
index eacc18b..9c002b5 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/PropertiesAccessor.java
@@ -18,47 +18,27 @@
  */
 package org.apache.asterix.common.config;
 
-import static org.apache.asterix.common.config.MetadataProperties.Option.INSTANCE_NAME;
-import static org.apache.asterix.common.config.MetadataProperties.Option.METADATA_NODE;
 import static org.apache.asterix.common.config.NodeProperties.Option.STORAGE_SUBDIR;
 import static org.apache.hyracks.control.common.controllers.NCConfig.Option.IODEVICES;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Properties;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Stream;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Coredump;
-import org.apache.asterix.common.configuration.Extension;
-import org.apache.asterix.common.configuration.Property;
-import org.apache.asterix.common.configuration.Store;
-import org.apache.asterix.common.configuration.TransactionLogDir;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.utils.ConfigUtil;
 import org.apache.commons.lang3.mutable.MutableInt;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.config.IApplicationConfig;
@@ -67,11 +47,11 @@
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.control.common.application.ConfigManagerApplicationConfig;
 import org.apache.hyracks.control.common.config.ConfigManager;
-import org.apache.hyracks.control.common.controllers.ControllerConfig;
-import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class PropertiesAccessor implements IApplicationConfig {
-    private static final Logger LOGGER = Logger.getLogger(PropertiesAccessor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final Map<IApplicationConfig, PropertiesAccessor> instances = new ConcurrentHashMap<>();
     private final Map<String, String[]> stores = new HashMap<>();
@@ -92,137 +72,21 @@
         nodePartitionsMap = new ConcurrentHashMap<>();
         clusterPartitions = Collections.synchronizedSortedMap(new TreeMap<>());
         extensions = new ArrayList<>();
-        // Determine whether to use old-style asterix-configuration.xml or new-style configuration.
-        // QQQ strip this out eventually
-        // QQQ this is NOT a good way to determine whether to use config file
         ConfigManager configManager = ((ConfigManagerApplicationConfig) cfg).getConfigManager();
-        boolean usingConfigFile = Stream
-                .of((IOption) ControllerConfig.Option.CONFIG_FILE, ControllerConfig.Option.CONFIG_FILE_URL)
-                .map(configManager::get).anyMatch(Objects::nonNull);
-        AsterixConfiguration asterixConfiguration = null;
-        try {
-            asterixConfiguration = configure(
-                    System.getProperty(GlobalConfig.CONFIG_FILE_PROPERTY, GlobalConfig.DEFAULT_CONFIG_FILE_NAME));
-        } catch (Exception e) {
-            // cannot load config file, assume new-style config
+        MutableInt uniquePartitionId = new MutableInt(0);
+        // Iterate through each configured NC.
+        for (String ncName : cfg.getNCNames()) {
+            configureNc(configManager, ncName, uniquePartitionId);
         }
-
-        if (!usingConfigFile && asterixConfiguration != null) {
-            LOGGER.info("using old-style configuration: " + System.getProperty(GlobalConfig.CONFIG_FILE_PROPERTY));
-            if (asterixConfiguration.getInstanceName() != null) {
-                configManager.set(INSTANCE_NAME, asterixConfiguration.getInstanceName());
-            }
-            if (asterixConfiguration.getMetadataNode() != null) {
-                configManager.set(METADATA_NODE, asterixConfiguration.getMetadataNode());
-            }
-            List<Store> configuredStores = asterixConfiguration.getStore();
-
-            int uniquePartitionId = 0;
-            // Here we iterate through all <store> elements in asterix-configuration.xml.
-            // For each one, we create an array of ClusterPartitions and store this array
-            // in nodePartitionsMap, keyed by the node name. The array is the same length
-            // as the comma-separated <storeDirs> child element, because Managix will have
-            // arranged for that element to be populated with the full paths to each
-            // partition directory (as formed by appending the <store> subdirectory to
-            // each <iodevices> path from the user's original cluster.xml).
-            for (Store store : configuredStores) {
-                configManager.set(store.getNcId(), NodeProperties.Option.STARTING_PARTITION_ID, uniquePartitionId);
-                String trimmedStoreDirs = store.getStoreDirs().trim();
-                String[] nodeStores = trimmedStoreDirs.split(",");
-                ClusterPartition[] nodePartitions = new ClusterPartition[nodeStores.length];
-                for (int i = 0; i < nodePartitions.length; i++) {
-                    ClusterPartition partition = new ClusterPartition(uniquePartitionId++, store.getNcId(), i);
-                    clusterPartitions.put(partition.getPartitionId(), partition);
-                    nodePartitions[i] = partition;
-                }
-                stores.put(store.getNcId(), nodeStores);
-                nodePartitionsMap.put(store.getNcId(), nodePartitions);
-                // push the store info to the config manager
-                configManager.set(store.getNcId(), NCConfig.Option.IODEVICES, nodeStores);
-                // marking node as virtual, as we're not using NCServices with old-style config
-                configManager.set(store.getNcId(), NCConfig.Option.NCSERVICE_PORT, NCConfig.NCSERVICE_PORT_DISABLED);
-            }
-            // Get extensions
-            if (asterixConfiguration.getExtensions() != null) {
-                for (Extension ext : asterixConfiguration.getExtensions().getExtension()) {
-                    extensions.add(ConfigUtil.toAsterixExtension(ext));
-                }
-            }
-            for (Property p : asterixConfiguration.getProperty()) {
-                IOption option = null;
-                for (Section section : Arrays.asList(Section.COMMON, Section.CC, Section.NC)) {
-                    IOption optionTemp = cfg.lookupOption(section.sectionName(), p.getName());
-                    if (optionTemp == null) {
-                        continue;
-                    }
-                    if (option != null) {
-                        throw new IllegalStateException(
-                                "ERROR: option found in multiple sections: " + Arrays.asList(option, optionTemp));
-                    }
-                    option = optionTemp;
-                }
-                if (option == null) {
-                    LOGGER.warning("Ignoring unknown property: " + p.getName());
-                } else {
-                    configManager.set(option, option.type().parse(p.getValue()));
-                }
-            }
-            for (Coredump cd : asterixConfiguration.getCoredump()) {
-                coredumpConfig.put(cd.getNcId(), cd.getCoredumpPath());
-            }
-            for (TransactionLogDir txnLogDir : asterixConfiguration.getTransactionLogDir()) {
-                transactionLogDirs.put(txnLogDir.getNcId(), txnLogDir.getTxnLogDirPath());
-            }
-        } else {
-            LOGGER.info("using new-style configuration");
-            MutableInt uniquePartitionId = new MutableInt(0);
-            // Iterate through each configured NC.
-            for (String ncName : cfg.getNCNames()) {
-                configureNc(configManager, ncName, uniquePartitionId);
-            }
-            for (String section : cfg.getSectionNames()) {
-                if (section.startsWith(AsterixProperties.SECTION_PREFIX_EXTENSION)) {
-                    String className = AsterixProperties.getSectionId(AsterixProperties.SECTION_PREFIX_EXTENSION,
-                            section);
-                    configureExtension(className, section);
-                }
+        for (String section : cfg.getSectionNames()) {
+            if (section.startsWith(AsterixProperties.SECTION_PREFIX_EXTENSION)) {
+                String className = AsterixProperties.getSectionId(AsterixProperties.SECTION_PREFIX_EXTENSION, section);
+                configureExtension(className, section);
             }
         }
         loadAsterixBuildProperties();
     }
 
-    private AsterixConfiguration configure(String fileName) throws IOException, AsterixException {
-        try (InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)) {
-            if (is != null) {
-                return configure(is, fileName);
-            }
-        }
-        try (FileInputStream is = new FileInputStream(fileName)) {
-            return configure(is, fileName);
-        } catch (FileNotFoundException fnf1) {
-            LOGGER.warning(
-                    "Failed to get configuration file " + fileName + " as FileInputStream. FileNotFoundException");
-            LOGGER.warning("Attempting to get default configuration file " + GlobalConfig.DEFAULT_CONFIG_FILE_NAME
-                    + " as FileInputStream");
-            try (FileInputStream fis = new FileInputStream(GlobalConfig.DEFAULT_CONFIG_FILE_NAME)) {
-                return configure(fis, GlobalConfig.DEFAULT_CONFIG_FILE_NAME);
-            } catch (FileNotFoundException fnf2) {
-                fnf1.addSuppressed(fnf2);
-                throw new AsterixException("Could not find configuration file " + fileName, fnf1);
-            }
-        }
-    }
-
-    private AsterixConfiguration configure(InputStream is, String fileName) throws AsterixException {
-        try {
-            JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-            Unmarshaller unmarshaller = ctx.createUnmarshaller();
-            return (AsterixConfiguration) unmarshaller.unmarshal(is);
-        } catch (JAXBException e) {
-            throw new AsterixException("Failed to read configuration file " + fileName, e);
-        }
-    }
-
     private void configureExtension(String className, String section) {
         Set<String> keys = cfg.getKeys(section);
         List<Pair<String, String>> kvs = new ArrayList<>();
@@ -313,8 +177,8 @@
         try {
             return value == null ? defaultValue : interpreter.parse(value);
         } catch (IllegalArgumentException e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.severe("Invalid property value '" + value + "' for property '" + property + "'.\n" + "Default = "
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.error("Invalid property value '" + value + "' for property '" + property + "'.\n" + "Default = "
                         + defaultValue);
             }
             throw e;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ReplicationProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ReplicationProperties.java
index 1e79a26..18503b2 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ReplicationProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/ReplicationProperties.java
@@ -18,37 +18,40 @@
  */
 package org.apache.asterix.common.config;
 
+import static org.apache.hyracks.control.common.config.OptionTypes.BOOLEAN;
 import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
 import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT;
+import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
+import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
 
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.concurrent.TimeUnit;
 
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.hyracks.api.config.IApplicationConfig;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.config.Section;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.util.StorageUtil;
 import org.apache.hyracks.util.StorageUtil.StorageUnit;
 
 public class ReplicationProperties extends AbstractProperties {
 
     public enum Option implements IOption {
-        REPLICATION_MAX_REMOTE_RECOVERY_ATTEMPTS(INTEGER, 5,
-                "The maximum number of times to attempt to recover from a replica on failure before giving up"),
-        REPLICATION_LOG_BUFFER_PAGESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(128,
-                StorageUnit.KILOBYTE), "The size in bytes of each log buffer page"),
+        REPLICATION_LOG_BUFFER_PAGESIZE(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(128, StorageUnit.KILOBYTE),
+                "The size in bytes of each log buffer page"),
         REPLICATION_LOG_BUFFER_NUMPAGES(INTEGER, 8, "The number of log buffer pages"),
-        REPLICATION_LOG_BATCHSIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(4, StorageUnit.KILOBYTE),
+        REPLICATION_LOG_BATCHSIZE(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(4, StorageUnit.KILOBYTE),
                 "The size in bytes to replicate in each batch"),
-        REPLICATION_TIMEOUT(INTEGER, REPLICATION_TIME_OUT_DEFAULT,
-                "The time in seconds to timeout when trying to contact a replica, before assuming it is dead"),
-        ;
+        REPLICATION_TIMEOUT(
+                LONG,
+                TimeUnit.SECONDS.toSeconds(30),
+                "The time in seconds to timeout waiting for master or replica to ack"),
+        REPLICATION_ENABLED(BOOLEAN, false, "Whether or not data replication is enabled"),
+        REPLICATION_FACTOR(INTEGER, 2, "Number of replicas (backups) to maintain per master replica"),
+        REPLICATION_STRATEGY(STRING, "none", "Replication strategy to choose");
 
         private final IOptionType type;
         private final Object defaultValue;
@@ -79,40 +82,14 @@
         public Object defaultValue() {
             return defaultValue;
         }
-
-        @Override
-        public Object get(IApplicationConfig config) {
-            switch (this) {
-                case REPLICATION_TIMEOUT:
-                    final Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-                    if (cluster != null
-                            && cluster.getHighAvailability() != null
-                            && cluster.getHighAvailability().getDataReplication() != null
-                            && cluster.getHighAvailability().getDataReplication().getReplicationTimeOut() != null) {
-                        return cluster.getHighAvailability().getDataReplication().getReplicationTimeOut().intValue();
-                    }
-                    return REPLICATION_TIME_OUT_DEFAULT;
-                default:
-                    return config.getStatic(this);
-            }
-        }
     }
 
-    private static final int REPLICATION_DATAPORT_DEFAULT = 2000;
+    public boolean isReplicationEnabled() {
+        return accessor.getBoolean(Option.REPLICATION_ENABLED);
+    }
 
-    private static final int REPLICATION_TIME_OUT_DEFAULT = 15;
-
-    private static final String NODE_IP_ADDRESS_DEFAULT = "127.0.0.1";
-
-    private final IReplicationStrategy repStrategy;
-
-    public ReplicationProperties(PropertiesAccessor accessor) throws HyracksDataException {
+    public ReplicationProperties(PropertiesAccessor accessor) {
         super(accessor);
-        this.repStrategy = ClusterProperties.INSTANCE.getReplicationStrategy();
-    }
-
-    public int getMaxRemoteRecoveryAttempts() {
-        return accessor.getInt(Option.REPLICATION_MAX_REMOTE_RECOVERY_ATTEMPTS);
     }
 
     public int getLogBufferPageSize() {
@@ -127,53 +104,23 @@
         return accessor.getInt(Option.REPLICATION_LOG_BATCHSIZE);
     }
 
-    public String getReplicaIPAddress(String nodeId) {
-        Node node = ClusterProperties.INSTANCE.getNodeById(nodeId);
-        return node != null ? node.getClusterIp() : NODE_IP_ADDRESS_DEFAULT;
+    public String getReplicationAddress() {
+        return accessor.getString(NCConfig.Option.REPLICATION_LISTEN_ADDRESS);
     }
 
-    public int getDataReplicationPort(String nodeId) {
-        final Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-        Node node = ClusterProperties.INSTANCE.getNodeById(nodeId);
-        if (node != null) {
-            return node.getReplicationPort() != null ? node.getReplicationPort().intValue()
-                    : cluster.getHighAvailability().getDataReplication().getReplicationPort().intValue();
-        }
-        return REPLICATION_DATAPORT_DEFAULT;
+    public int getReplicationPort() {
+        return accessor.getInt(NCConfig.Option.REPLICATION_LISTEN_PORT);
     }
 
-    public Replica getReplicaById(String nodeId) {
-        Node node = ClusterProperties.INSTANCE.getNodeById(nodeId);
-        if (node != null) {
-            return new Replica(node);
-        }
-        return null;
+    public String getReplicationStrategy() {
+        return accessor.getString(Option.REPLICATION_STRATEGY);
     }
 
-    public Set<String> getRemoteReplicasIds(String nodeId) {
-        return repStrategy.getRemoteReplicas(nodeId).stream().map(Replica::getId).collect(Collectors.toSet());
+    public long getReplicationTimeOut() {
+        return accessor.getLong(Option.REPLICATION_TIMEOUT);
     }
 
-    public Set<String> getRemotePrimaryReplicasIds(String nodeId) {
-        return repStrategy.getRemotePrimaryReplicas(nodeId).stream().map(Replica::getId).collect(Collectors.toSet());
-    }
-
-    public Set<String> getNodeReplicasIds(String nodeId) {
-        Set<String> remoteReplicasIds = getRemoteReplicasIds(nodeId);
-        // This includes the node itself
-        remoteReplicasIds.add(nodeId);
-        return remoteReplicasIds;
-    }
-
-    public int getReplicationTimeOut() {
-        return accessor.getInt(Option.REPLICATION_TIMEOUT);
-    }
-
-    public boolean isParticipant(String nodeId) {
-        return repStrategy.isParticipant(nodeId);
-    }
-
-    public IReplicationStrategy getReplicationStrategy() {
-        return repStrategy;
+    public int getReplicationFactor() {
+        return accessor.getInt(Option.REPLICATION_FACTOR);
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/StorageProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/StorageProperties.java
index d363f3d..e01198f 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/StorageProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/StorageProperties.java
@@ -42,18 +42,11 @@
         STORAGE_BUFFERCACHE_MAXOPENFILES(INTEGER, Integer.MAX_VALUE),
         STORAGE_MEMORYCOMPONENT_GLOBALBUDGET(LONG_BYTE_UNIT, Runtime.getRuntime().maxMemory() / 4),
         STORAGE_MEMORYCOMPONENT_PAGESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(128, KILOBYTE)),
-        STORAGE_MEMORYCOMPONENT_NUMPAGES(INTEGER, (Function<IApplicationConfig, Integer>) accessor ->
-                // By default, uses 1/16 of the STORAGE_MEMORYCOMPONENT_GLOBALBUDGET for the write buffer
-                // budget for a dataset, including data and indexes.
-                (int) (accessor.getLong(STORAGE_MEMORYCOMPONENT_GLOBALBUDGET) /
-                        (16 * accessor.getInt(STORAGE_MEMORYCOMPONENT_PAGESIZE)))),
         STORAGE_MEMORYCOMPONENT_NUMCOMPONENTS(INTEGER, 2),
-        STORAGE_METADATA_MEMORYCOMPONENT_NUMPAGES(INTEGER, (Function<IApplicationConfig, Integer>) accessor ->
-                // By default, uses the min of 1/64 of the STORAGE_MEMORYCOMPONENT_GLOBALBUDGET and 256 pages
-                // for the write buffer budget for a metadata dataset, including data and indexes.
-                Math.min((int) (accessor.getLong(STORAGE_MEMORYCOMPONENT_GLOBALBUDGET)
-                        / (64 * accessor.getInt(STORAGE_MEMORYCOMPONENT_PAGESIZE))), 256)),
-        STORAGE_LSM_BLOOMFILTER_FALSEPOSITIVERATE(DOUBLE, 0.01d);
+        STORAGE_METADATA_MEMORYCOMPONENT_NUMPAGES(INTEGER, 32),
+        STORAGE_LSM_BLOOMFILTER_FALSEPOSITIVERATE(DOUBLE, 0.01d),
+        STORAGE_METADATA_DATASETS(INTEGER, 14),
+        STORAGE_MAX_ACTIVE_WRITABLE_DATASETS(INTEGER, 8);
 
         private final IOptionType interpreter;
         private final Object defaultValue;
@@ -63,13 +56,11 @@
             this.defaultValue = defaultValue;
         }
 
-        <T> Option(IOptionType<T> interpreter, Function<IApplicationConfig, T> defaultValueFunction) {
-            this.interpreter = interpreter;
-            this.defaultValue = defaultValueFunction;
-        }
-
         @Override
         public Section section() {
+            if (this == STORAGE_MAX_ACTIVE_WRITABLE_DATASETS) {
+                return Section.COMMON;
+            }
             return Section.NC;
         }
 
@@ -79,26 +70,25 @@
                 case STORAGE_BUFFERCACHE_PAGESIZE:
                     return "The page size in bytes for pages in the buffer cache";
                 case STORAGE_BUFFERCACHE_SIZE:
-                    return "The size of memory allocated to the disk buffer cache.  The value should be a multiple" +
-                            " of the buffer cache page size.";
+                    return "The size of memory allocated to the disk buffer cache.  The value should be a multiple"
+                            + " of the buffer cache page size.";
                 case STORAGE_BUFFERCACHE_MAXOPENFILES:
                     return "The maximum number of open files in the buffer cache";
                 case STORAGE_MEMORYCOMPONENT_GLOBALBUDGET:
-                    return "The size of memory allocated to the memory components.  The value should be a multiple " +
-                            "of the memory component page size";
+                    return "The size of memory allocated to the memory components.  The value should be a multiple "
+                            + "of the memory component page size";
                 case STORAGE_MEMORYCOMPONENT_PAGESIZE:
                     return "The page size in bytes for pages allocated to memory components";
-                case STORAGE_MEMORYCOMPONENT_NUMPAGES:
-                    return "The number of pages to allocate for a memory component.  This budget is shared by all " +
-                            "the memory components of the primary index and all its secondary indexes across all I/O " +
-                            "devices on a node.  Note: in-memory components usually has fill factor of 75% since " +
-                            "the pages are 75% full and the remaining 25% is un-utilized";
                 case STORAGE_MEMORYCOMPONENT_NUMCOMPONENTS:
                     return "The number of memory components to be used per lsm index";
                 case STORAGE_METADATA_MEMORYCOMPONENT_NUMPAGES:
                     return "The number of pages to allocate for a metadata memory component";
                 case STORAGE_LSM_BLOOMFILTER_FALSEPOSITIVERATE:
                     return "The maximum acceptable false positive rate for bloom filters associated with LSM indexes";
+                case STORAGE_METADATA_DATASETS:
+                    return "The number of metadata datasets";
+                case STORAGE_MAX_ACTIVE_WRITABLE_DATASETS:
+                    return "The maximum number of datasets that can be concurrently modified";
                 default:
                     throw new IllegalStateException("NYI: " + this);
             }
@@ -114,19 +104,12 @@
             return defaultValue;
         }
 
-
         @Override
         public String usageDefaultOverride(IApplicationConfig accessor, Function<IOption, String> optionPrinter) {
-            switch (this) {
-                case STORAGE_MEMORYCOMPONENT_NUMPAGES:
-                    return "1/16th of the " + optionPrinter.apply(Option.STORAGE_MEMORYCOMPONENT_GLOBALBUDGET) +
-                            " value";
-                case STORAGE_METADATA_MEMORYCOMPONENT_NUMPAGES:
-                    return "1/64th of the " + optionPrinter.apply(Option.STORAGE_MEMORYCOMPONENT_GLOBALBUDGET) +
-                            " value or 256, whichever is larger";
-                default:
-                    return null;
+            if (this == STORAGE_METADATA_MEMORYCOMPONENT_NUMPAGES) {
+                return "32 pages";
             }
+            return null;
         }
     }
 
@@ -151,7 +134,10 @@
     }
 
     public int getMemoryComponentNumPages() {
-        return accessor.getInt(Option.STORAGE_MEMORYCOMPONENT_NUMPAGES);
+        final long metadataReservedMem = getMetadataReservedMemory();
+        final long globalUserDatasetMem = getMemoryComponentGlobalBudget() - metadataReservedMem;
+        final long userDatasetMem = globalUserDatasetMem / getMaxActiveWritableDatasets();
+        return (int) (userDatasetMem / getMemoryComponentPageSize());
     }
 
     public int getMetadataMemoryComponentNumPages() {
@@ -173,4 +159,29 @@
     public int getBufferCacheNumPages() {
         return (int) (getBufferCacheSize() / (getBufferCachePageSize() + IBufferCache.RESERVED_HEADER_BYTES));
     }
+
+    public long getJobExecutionMemoryBudget() {
+        final long jobExecutionMemory =
+                Runtime.getRuntime().maxMemory() - getBufferCacheSize() - getMemoryComponentGlobalBudget();
+        if (jobExecutionMemory <= 0) {
+            final String msg = String.format(
+                    "Invalid node memory configuration, more memory budgeted than available in JVM. Runtime max memory:"
+                            + " (%d), Buffer cache memory (%d), memory component global budget (%d)",
+                    Runtime.getRuntime().maxMemory(), getBufferCacheSize(), getMemoryComponentGlobalBudget());
+            throw new IllegalStateException(msg);
+        }
+        return jobExecutionMemory;
+    }
+
+    public int getMaxActiveWritableDatasets() {
+        return accessor.getInt(Option.STORAGE_MAX_ACTIVE_WRITABLE_DATASETS);
+    }
+
+    private int getMetadataDatasets() {
+        return accessor.getInt(Option.STORAGE_METADATA_DATASETS);
+    }
+
+    private long getMetadataReservedMemory() {
+        return (getMetadataMemoryComponentNumPages() * (long) getMemoryComponentPageSize()) * getMetadataDatasets();
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
index b809b4d..c15f8a7 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/config/TransactionProperties.java
@@ -36,26 +36,39 @@
 
     public enum Option implements IOption {
         TXN_LOG_BUFFER_NUMPAGES(INTEGER, 8, "The number of pages in the transaction log tail"),
-        TXN_LOG_BUFFER_PAGESIZE(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(128, KILOBYTE),
+        TXN_LOG_BUFFER_PAGESIZE(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(128, KILOBYTE),
                 "The page size (in bytes) for transaction log buffer"),
-        TXN_LOG_PARTITIONSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(256L, MEGABYTE),
+        TXN_LOG_PARTITIONSIZE(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(256L, MEGABYTE),
                 "The maximum size (in bytes) of each transaction log file"),
-        TXN_LOG_CHECKPOINT_LSNTHRESHOLD(INTEGER_BYTE_UNIT, StorageUtil.getIntSizeInBytes(64, MEGABYTE),
-                "The checkpoint threshold (in terms of LSNs (log sequence numbers) that have been written to the " +
-                        "transaction log, i.e., the length of the transaction log) for transaction logs"),
-        TXN_LOG_CHECKPOINT_POLLFREQUENCY(INTEGER, 120,
-                "The frequency (in seconds) the checkpoint thread should check to see if a checkpoint should be written"
-        ),
+        TXN_LOG_CHECKPOINT_LSNTHRESHOLD(
+                INTEGER_BYTE_UNIT,
+                StorageUtil.getIntSizeInBytes(64, MEGABYTE),
+                "The checkpoint threshold (in terms of LSNs (log sequence numbers) that have been written to the "
+                        + "transaction log, i.e., the length of the transaction log) for transaction logs"),
+        TXN_LOG_CHECKPOINT_POLLFREQUENCY(
+                INTEGER,
+                120,
+                "The frequency (in seconds) the checkpoint thread should check to see if a checkpoint should be written"),
         TXN_LOG_CHECKPOINT_HISTORY(INTEGER, 0, "The number of checkpoints to keep in the transaction log"),
-        TXN_LOCK_ESCALATIONTHRESHOLD(INTEGER, 1000,
+        TXN_LOCK_ESCALATIONTHRESHOLD(
+                INTEGER,
+                1000,
                 "The maximum number of entity locks to obtain before upgrading to a dataset lock"),
-        TXN_LOCK_SHRINKTIMER(INTEGER, 5000,
+        TXN_LOCK_SHRINKTIMER(
+                INTEGER,
+                5000,
                 "The time (in milliseconds) where under utilization of resources will trigger a shrink phase"),
         TXN_LOCK_TIMEOUT_WAITTHRESHOLD(INTEGER, 60000, "Time out (in milliseconds) of waiting for a lock"),
         TXN_LOCK_TIMEOUT_SWEEPTHRESHOLD(INTEGER, 10000, "Interval (in milliseconds) for checking lock timeout"),
         TXN_COMMITPROFILER_ENABLED(BOOLEAN, false, "Enable output of commit profiler logs"),
         TXN_COMMITPROFILER_REPORTINTERVAL(INTEGER, 5, "Interval (in seconds) to report commit profiler logs"),
-        TXN_JOB_RECOVERY_MEMORYSIZE(LONG_BYTE_UNIT, StorageUtil.getLongSizeInBytes(64L, MEGABYTE),
+        TXN_JOB_RECOVERY_MEMORYSIZE(
+                LONG_BYTE_UNIT,
+                StorageUtil.getLongSizeInBytes(64L, MEGABYTE),
                 "The memory budget (in bytes) used for recovery");
 
         private final IOptionType type;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
index e74600e..9ec13ef 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/BaseOperationTracker.java
@@ -20,12 +20,11 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
-public class BaseOperationTracker implements ILSMOperationTracker {
+public class BaseOperationTracker implements ITransactionOperationTracker {
 
     protected final int datasetID;
     protected final DatasetInfo dsInfo;
@@ -47,7 +46,7 @@
     @Override
     public void afterOperation(ILSMIndex index, LSMOperationType opType, ISearchOperationCallback searchCallback,
             IModificationOperationCallback modificationCallback) throws HyracksDataException {
-        if (opType == LSMOperationType.FLUSH || opType == LSMOperationType.REPLICATE) {
+        if (opType == LSMOperationType.REPLICATE) {
             dsInfo.undeclareActiveIOOperation();
         }
     }
@@ -55,11 +54,24 @@
     @Override
     public void completeOperation(ILSMIndex index, LSMOperationType opType, ISearchOperationCallback searchCallback,
             IModificationOperationCallback modificationCallback) throws HyracksDataException {
-        if (opType == LSMOperationType.MERGE) {
+        if (opType == LSMOperationType.FLUSH || opType == LSMOperationType.MERGE) {
             dsInfo.undeclareActiveIOOperation();
         }
     }
 
-    public void exclusiveJobCommitted() throws HyracksDataException {
+    @Override
+    public void beforeTransaction(long resourceId) {
+        /*
+         * Increment dataset and index ref count to prevent them
+         * from being evicted/dropped until the transaction completes
+         */
+        dsInfo.touch();
+        dsInfo.getIndexes().get(resourceId).touch();
+    }
+
+    @Override
+    public void afterTransaction(long resourceId) {
+        dsInfo.untouch();
+        dsInfo.getIndexes().get(resourceId).untouch();
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/CorrelatedPrefixMergePolicy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/CorrelatedPrefixMergePolicy.java
index a20e660..41461ec 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/CorrelatedPrefixMergePolicy.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/CorrelatedPrefixMergePolicy.java
@@ -23,17 +23,19 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId.IdCompareResult;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.PrefixMergePolicy;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
 
 public class CorrelatedPrefixMergePolicy extends PrefixMergePolicy {
 
@@ -86,58 +88,44 @@
             //nothing to merge
             return false;
         }
-        long minID = immutableComponents.get(mergeableIndexes.getLeft()).getComponentId().getMinId();
-        long maxID = immutableComponents.get(mergeableIndexes.getRight()).getComponentId().getMaxId();
-
-        Set<IndexInfo> indexInfos = datasetLifecycleManager.getDatasetInfo(datasetId).getDatsetIndexInfos();
-        int partition = getIndexPartition(index, indexInfos);
-        triggerScheduledMerge(minID, maxID,
-                indexInfos.stream().filter(info -> info.getPartition() == partition).collect(Collectors.toSet()));
+        ILSMComponent leftComponent = immutableComponents.get(mergeableIndexes.getLeft());
+        ILSMComponent rightComponent = immutableComponents.get(mergeableIndexes.getRight());
+        ILSMComponentId targetId = LSMComponentIdUtils.union(leftComponent.getId(), rightComponent.getId());
+        int partition = ((PrimaryIndexOperationTracker) index.getOperationTracker()).getPartition();
+        Set<ILSMIndex> indexes =
+                datasetLifecycleManager.getDatasetInfo(datasetId).getDatasetPartitionOpenIndexes(partition);
+        triggerScheduledMerge(targetId, indexes);
         return true;
     }
 
     /**
-     * Submit merge requests for all disk components within [minID, maxID]
+     * Submit merge requests for all disk components within the range specified by targetId
      * of all indexes of a given dataset in the given partition
      *
-     * @param minID
-     * @param maxID
-     * @param partition
+     * @param targetId
      * @param indexInfos
      * @throws HyracksDataException
      */
-    private void triggerScheduledMerge(long minID, long maxID, Set<IndexInfo> indexInfos) throws HyracksDataException {
-        for (IndexInfo info : indexInfos) {
-            ILSMIndex lsmIndex = info.getIndex();
-
+    private void triggerScheduledMerge(ILSMComponentId targetId, Set<ILSMIndex> indexes) throws HyracksDataException {
+        for (ILSMIndex lsmIndex : indexes) {
             List<ILSMDiskComponent> immutableComponents = new ArrayList<>(lsmIndex.getDiskComponents());
             if (isMergeOngoing(immutableComponents)) {
                 continue;
             }
             List<ILSMDiskComponent> mergableComponents = new ArrayList<>();
             for (ILSMDiskComponent component : immutableComponents) {
-                ILSMDiskComponentId id = component.getComponentId();
-                if (id.getMinId() >= minID && id.getMaxId() <= maxID) {
+                ILSMComponentId id = component.getId();
+                IdCompareResult cmp = targetId.compareTo(id);
+                if (cmp == IdCompareResult.INCLUDE) {
                     mergableComponents.add(component);
-                }
-                if (id.getMaxId() < minID) {
+                } else if (cmp == IdCompareResult.GREATER_THAN) {
                     //disk components are ordered from latest (with largest IDs) to oldest (with smallest IDs)
-                    //if the component.maxID < minID, we can safely skip the rest disk components in the list
+                    // if targetId>component.Id, we can safely skip the rest disk components in the list
                     break;
                 }
             }
-            ILSMIndexAccessor accessor =
-                    lsmIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = lsmIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             accessor.scheduleMerge(lsmIndex.getIOOperationCallback(), mergableComponents);
         }
     }
-
-    private int getIndexPartition(ILSMIndex index, Set<IndexInfo> indexInfos) {
-        for (IndexInfo info : indexInfos) {
-            if (info.getIndex() == index) {
-                return info.getPartition();
-            }
-        }
-        return -1;
-    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
index f703c19..44baf77 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetInfo.java
@@ -22,14 +22,17 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetInfo extends Info implements Comparable<DatasetInfo> {
-    private static final Logger LOGGER = Logger.getLogger(DatasetInfo.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
+    // partition -> index
+    private final Map<Integer, Set<IndexInfo>> partitionIndexes;
+    // resourceID -> index
     private final Map<Long, IndexInfo> indexes;
     private final int datasetID;
     private int numActiveIOOps;
@@ -40,6 +43,7 @@
     private boolean durable;
 
     public DatasetInfo(int datasetID) {
+        this.partitionIndexes = new HashMap<>();
         this.indexes = new HashMap<>();
         this.setLastAccess(-1);
         this.datasetID = datasetID;
@@ -69,26 +73,17 @@
         notifyAll();
     }
 
-    public synchronized Set<ILSMIndex> getDatasetIndexes() {
-        Set<ILSMIndex> datasetIndexes = new HashSet<>();
-        for (IndexInfo iInfo : getIndexes().values()) {
-            if (iInfo.isOpen()) {
-                datasetIndexes.add(iInfo.getIndex());
+    public synchronized Set<ILSMIndex> getDatasetPartitionOpenIndexes(int partition) {
+        Set<ILSMIndex> indexSet = new HashSet<>();
+        Set<IndexInfo> partitionIndexInfos = this.partitionIndexes.get(partition);
+        if (partitionIndexInfos != null) {
+            for (IndexInfo iInfo : partitionIndexInfos) {
+                if (iInfo.isOpen()) {
+                    indexSet.add(iInfo.getIndex());
+                }
             }
         }
-
-        return datasetIndexes;
-    }
-
-    public synchronized Set<IndexInfo> getDatsetIndexInfos() {
-        Set<IndexInfo> infos = new HashSet<>();
-        for (IndexInfo iInfo : getIndexes().values()) {
-            if (iInfo.isOpen()) {
-                infos.add(iInfo);
-            }
-        }
-
-        return infos;
+        return indexSet;
     }
 
     @Override
@@ -160,6 +155,18 @@
         return indexes;
     }
 
+    public synchronized void addIndex(long resourceID, IndexInfo indexInfo) {
+        indexes.put(resourceID, indexInfo);
+        partitionIndexes.computeIfAbsent(indexInfo.getPartition(), partition -> new HashSet<>()).add(indexInfo);
+    }
+
+    public synchronized void removeIndex(long resourceID) {
+        IndexInfo info = indexes.remove(resourceID);
+        if (info != null) {
+            partitionIndexes.get(info.getPartition()).remove(info);
+        }
+    }
+
     public boolean isRegistered() {
         return isRegistered;
     }
@@ -205,8 +212,8 @@
             }
         }
         if (numActiveIOOps < 0) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.severe("Number of IO operations cannot be negative for dataset: " + this);
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.error("Number of IO operations cannot be negative for dataset: " + this);
             }
             throw new IllegalStateException("Number of IO operations cannot be negative");
         }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLSMComponentIdGeneratorFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLSMComponentIdGeneratorFactory.java
new file mode 100644
index 0000000..83e3144
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLSMComponentIdGeneratorFactory.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.common.context;
+
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
+import org.apache.hyracks.storage.common.IResource;
+
+/**
+ * This factory implementation is used by AsterixDB layer so that indexes of a dataset (/partition)
+ * use the same Id generator. This guarantees their memory components would receive the same Id upon
+ * activation.
+ *
+ */
+public class DatasetLSMComponentIdGeneratorFactory implements ILSMComponentIdGeneratorFactory {
+    private static final long serialVersionUID = 1L;
+
+    private final int datasetId;
+
+    public DatasetLSMComponentIdGeneratorFactory(int datasetId) {
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    public ILSMComponentIdGenerator getComponentIdGenerator(INCServiceContext serviceCtx, IResource resource)
+            throws HyracksDataException {
+        IDatasetLifecycleManager dslcManager =
+                ((INcApplicationContext) serviceCtx.getApplicationContext()).getDatasetLifecycleManager();
+        int partition = StoragePathUtil.getPartitionNumFromRelativePath(resource.getPath());
+        return dslcManager.getComponentIdGenerator(datasetId, partition);
+    }
+
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
index c4cd791..1a61b8f 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetLifecycleManager.java
@@ -21,12 +21,11 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.IDatasetMemoryManager;
@@ -35,6 +34,8 @@
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
 import org.apache.asterix.common.replication.IReplicationStrategy;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
 import org.apache.asterix.common.transactions.ILogManager;
 import org.apache.asterix.common.transactions.LogRecord;
 import org.apache.asterix.common.utils.StoragePathUtil;
@@ -42,19 +43,22 @@
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.ILocalResourceRepository;
 import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetLifecycleManager implements IDatasetLifecycleManager, ILifeCycleComponent {
 
-    private static final Logger LOGGER = Logger.getLogger(DatasetLifecycleManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final Map<Integer, DatasetResource> datasets = new ConcurrentHashMap<>();
     private final StorageProperties storageProperties;
     private final ILocalResourceRepository resourceRepository;
@@ -63,13 +67,16 @@
     private final LogRecord logRecord;
     private final int numPartitions;
     private volatile boolean stopped = false;
+    private final IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
 
     public DatasetLifecycleManager(StorageProperties storageProperties, ILocalResourceRepository resourceRepository,
-            ILogManager logManager, IDatasetMemoryManager memoryManager, int numPartitions) {
+            ILogManager logManager, IDatasetMemoryManager memoryManager,
+            IIndexCheckpointManagerProvider indexCheckpointManagerProvider, int numPartitions) {
         this.logManager = logManager;
         this.storageProperties = storageProperties;
         this.resourceRepository = resourceRepository;
         this.memoryManager = memoryManager;
+        this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
         this.numPartitions = numPartitions;
         logRecord = new LogRecord();
     }
@@ -133,13 +140,13 @@
             throw HyracksDataException.create(ErrorCode.INDEX_DOES_NOT_EXIST);
         }
 
-        PrimaryIndexOperationTracker opTracker = dsr.getOpTracker();
+        PrimaryIndexOperationTracker opTracker = dsr.getOpTracker(iInfo.getPartition());
         if (iInfo.getReferenceCount() != 0 || (opTracker != null && opTracker.getNumActiveOperations() != 0)) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
+            if (LOGGER.isErrorEnabled()) {
                 final String logMsg = String.format(
                         "Failed to drop in-use index %s. Ref count (%d), Operation tracker active ops (%d)",
                         resourcePath, iInfo.getReferenceCount(), opTracker.getNumActiveOperations());
-                LOGGER.severe(logMsg);
+                LOGGER.error(logMsg);
             }
             throw HyracksDataException.create(ErrorCode.CANNOT_DROP_IN_USE_INDEX,
                     StoragePathUtil.getIndexNameFromPath(resourcePath));
@@ -148,13 +155,8 @@
         // TODO: use fine-grained counters, one for each index instead of a single counter per dataset.
         DatasetInfo dsInfo = dsr.getDatasetInfo();
         dsInfo.waitForIO();
-        if (iInfo.isOpen()) {
-            ILSMOperationTracker indexOpTracker = iInfo.getIndex().getOperationTracker();
-            synchronized (indexOpTracker) {
-                iInfo.getIndex().deactivate(false);
-            }
-        }
-        dsInfo.getIndexes().remove(resourceID);
+        closeIndex(iInfo);
+        dsInfo.removeIndex(resourceID);
         if (dsInfo.getReferenceCount() == 0 && dsInfo.isOpen() && dsInfo.getIndexes().isEmpty()
                 && !dsInfo.isExternal()) {
             removeDatasetFromCache(dsInfo.getDatasetID());
@@ -202,11 +204,8 @@
         List<DatasetResource> datasetsResources = new ArrayList<>(datasets.values());
         Collections.sort(datasetsResources);
         for (DatasetResource dsr : datasetsResources) {
-            PrimaryIndexOperationTracker opTracker = dsr.getOpTracker();
-            if (opTracker != null && opTracker.getNumActiveOperations() == 0
-                    && dsr.getDatasetInfo().getReferenceCount() == 0 && dsr.getDatasetInfo().isOpen()
-                    && !dsr.isMetadataDataset()) {
-                closeDataset(dsr.getDatasetInfo());
+            if (isCandidateDatasetForEviction(dsr)) {
+                closeDataset(dsr);
                 LOGGER.info(() -> "Evicted Dataset" + dsr.getDatasetID());
                 return true;
             }
@@ -214,15 +213,18 @@
         return false;
     }
 
-    private static void flushAndWaitForIO(DatasetInfo dsInfo, IndexInfo iInfo) throws HyracksDataException {
-        if (iInfo.isOpen()) {
-            ILSMIndexAccessor accessor =
-                    iInfo.getIndex().createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-            accessor.scheduleFlush(iInfo.getIndex().getIOOperationCallback());
+    private boolean isCandidateDatasetForEviction(DatasetResource dsr) {
+        for (PrimaryIndexOperationTracker opTracker : dsr.getOpTrackers()) {
+            if (opTracker.getNumActiveOperations() != 0) {
+                return false;
+            }
+        }
+        if (dsr.getDatasetInfo().getReferenceCount() != 0 || !dsr.getDatasetInfo().isOpen()
+                || dsr.isMetadataDataset()) {
+            return false;
         }
 
-        // Wait for the above flush op.
-        dsInfo.waitForIO();
+        return true;
     }
 
     public DatasetResource getDatasetLifecycle(int did) {
@@ -234,10 +236,9 @@
             dsr = datasets.get(did);
             if (dsr == null) {
                 DatasetInfo dsInfo = new DatasetInfo(did);
-                PrimaryIndexOperationTracker opTracker = new PrimaryIndexOperationTracker(did, logManager, dsInfo);
                 DatasetVirtualBufferCaches vbcs = new DatasetVirtualBufferCaches(did, storageProperties,
                         memoryManager.getNumPages(did), numPartitions);
-                dsr = new DatasetResource(dsInfo, opTracker, vbcs);
+                dsr = new DatasetResource(dsInfo, vbcs);
                 datasets.put(did, dsr);
             }
             return dsr;
@@ -316,8 +317,33 @@
     }
 
     @Override
-    public PrimaryIndexOperationTracker getOperationTracker(int datasetId) {
-        return datasets.get(datasetId).getOpTracker();
+    public synchronized PrimaryIndexOperationTracker getOperationTracker(int datasetId, int partition) {
+        DatasetResource dataset = datasets.get(datasetId);
+        PrimaryIndexOperationTracker opTracker = dataset.getOpTracker(partition);
+        if (opTracker == null) {
+            populateOpTrackerAndIdGenerator(dataset, partition);
+            opTracker = dataset.getOpTracker(partition);
+        }
+        return opTracker;
+    }
+
+    @Override
+    public synchronized ILSMComponentIdGenerator getComponentIdGenerator(int datasetId, int partition) {
+        DatasetResource dataset = datasets.get(datasetId);
+        ILSMComponentIdGenerator generator = dataset.getComponentIdGenerator(partition);
+        if (generator == null) {
+            populateOpTrackerAndIdGenerator(dataset, partition);
+            generator = dataset.getComponentIdGenerator(partition);
+        }
+        return generator;
+    }
+
+    private void populateOpTrackerAndIdGenerator(DatasetResource dataset, int partition) {
+        ILSMComponentIdGenerator idGenerator = new LSMComponentIdGenerator();
+        PrimaryIndexOperationTracker opTracker = new PrimaryIndexOperationTracker(dataset.getDatasetID(), partition,
+                logManager, dataset.getDatasetInfo(), idGenerator);
+        dataset.setPrimaryIndexOperationTracker(partition, opTracker);
+        dataset.setIdGenerator(partition, idGenerator);
     }
 
     private void validateDatasetLifecycleManagerState() throws HyracksDataException {
@@ -334,7 +360,7 @@
     @Override
     public synchronized void flushAllDatasets() throws HyracksDataException {
         for (DatasetResource dsr : datasets.values()) {
-            flushDatasetOpenIndexes(dsr.getDatasetInfo(), false);
+            flushDatasetOpenIndexes(dsr, false);
         }
     }
 
@@ -342,7 +368,7 @@
     public synchronized void flushDataset(int datasetId, boolean asyncFlush) throws HyracksDataException {
         DatasetResource dsr = datasets.get(datasetId);
         if (dsr != null) {
-            flushDatasetOpenIndexes(dsr.getDatasetInfo(), asyncFlush);
+            flushDatasetOpenIndexes(dsr, asyncFlush);
         }
     }
 
@@ -350,93 +376,115 @@
     public synchronized void scheduleAsyncFlushForLaggingDatasets(long targetLSN) throws HyracksDataException {
         //schedule flush for datasets with min LSN (Log Serial Number) < targetLSN
         for (DatasetResource dsr : datasets.values()) {
-            PrimaryIndexOperationTracker opTracker = dsr.getOpTracker();
-            synchronized (opTracker) {
-                for (IndexInfo iInfo : dsr.getIndexes().values()) {
-                    AbstractLSMIOOperationCallback ioCallback =
-                            (AbstractLSMIOOperationCallback) iInfo.getIndex().getIOOperationCallback();
-                    if (!(((AbstractLSMIndex) iInfo.getIndex()).isCurrentMutableComponentEmpty()
-                            || ioCallback.hasPendingFlush() || opTracker.isFlushLogCreated()
-                            || opTracker.isFlushOnExit())) {
-                        long firstLSN = ioCallback.getFirstLSN();
-                        if (firstLSN < targetLSN) {
-                            if (LOGGER.isLoggable(Level.INFO)) {
-                                LOGGER.info("Checkpoint flush dataset " + dsr.getDatasetID());
-                            }
-                            opTracker.setFlushOnExit(true);
-                            if (opTracker.getNumActiveOperations() == 0) {
-                                // No Modify operations currently, we need to trigger the flush and we can do so safely
-                                opTracker.flushIfRequested();
-                            }
-                            break;
-                        }
+            for (PrimaryIndexOperationTracker opTracker : dsr.getOpTrackers()) {
+                // check all partitions
+                synchronized (opTracker) {
+                    scheduleAsyncFlushForLaggingDatasetPartition(dsr, opTracker, targetLSN);
+                }
+            }
+        }
+    }
+
+    private void scheduleAsyncFlushForLaggingDatasetPartition(DatasetResource dsr,
+            PrimaryIndexOperationTracker opTracker, long targetLSN) throws HyracksDataException {
+        int partition = opTracker.getPartition();
+        for (ILSMIndex lsmIndex : dsr.getDatasetInfo().getDatasetPartitionOpenIndexes(partition)) {
+            AbstractLSMIOOperationCallback ioCallback =
+                    (AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback();
+            if (!(lsmIndex.isCurrentMutableComponentEmpty() || ioCallback.hasPendingFlush()
+                    || opTracker.isFlushLogCreated() || opTracker.isFlushOnExit())) {
+                long firstLSN = ioCallback.getFirstLSN();
+                if (firstLSN < targetLSN) {
+                    LOGGER.info("Checkpoint flush dataset {} partition {}", dsr.getDatasetID(), partition);
+                    opTracker.setFlushOnExit(true);
+                    if (opTracker.getNumActiveOperations() == 0) {
+                        // No Modify operations currently, we need to trigger the flush and we can do so safely
+                        opTracker.flushIfRequested();
                     }
+                    break;
                 }
             }
         }
     }
 
     /*
-     * This method can only be called asynchronously safely if we're sure no modify operation will take place until the flush is scheduled
+     * This method can only be called asynchronously safely if we're sure no modify operation
+     * will take place until the flush is scheduled
      */
-    private void flushDatasetOpenIndexes(DatasetInfo dsInfo, boolean asyncFlush) throws HyracksDataException {
-        if (!dsInfo.isExternal() && dsInfo.isDurable()) {
-            synchronized (logRecord) {
-                TransactionUtil.formFlushLogRecord(logRecord, dsInfo.getDatasetID(), null, logManager.getNodeId(),
-                        dsInfo.getIndexes().size());
-                try {
-                    logManager.log(logRecord);
-                } catch (ACIDException e) {
-                    throw new HyracksDataException("could not write flush log while closing dataset", e);
-                }
+    private void flushDatasetOpenIndexes(DatasetResource dsr, boolean asyncFlush) throws HyracksDataException {
+        DatasetInfo dsInfo = dsr.getDatasetInfo();
+        if (dsInfo.isExternal()) {
+            // no memory components for external dataset
+            return;
+        }
+        for (PrimaryIndexOperationTracker primaryOpTracker : dsr.getOpTrackers()) {
+            // flush each partition one by one
+            if (primaryOpTracker.getNumActiveOperations() > 0) {
+                throw new IllegalStateException(
+                        "flushDatasetOpenIndexes is called on a dataset with currently active operations");
+            }
+            int partition = primaryOpTracker.getPartition();
+            Collection<ILSMIndex> indexes = dsInfo.getDatasetPartitionOpenIndexes(partition);
+            ILSMComponentIdGenerator idGenerator = getComponentIdGenerator(dsInfo.getDatasetID(), partition);
+            idGenerator.refresh();
 
-                try {
-                    //notification will come from LogPage class (notifyFlushTerminator)
-                    logRecord.wait();
-                } catch (InterruptedException e) {
-                    throw new HyracksDataException(e);
+            if (dsInfo.isDurable()) {
+                synchronized (logRecord) {
+                    TransactionUtil.formFlushLogRecord(logRecord, dsInfo.getDatasetID(), null);
+                    try {
+                        logManager.log(logRecord);
+                    } catch (ACIDException e) {
+                        throw new HyracksDataException("could not write flush log while closing dataset", e);
+                    }
+
+                    try {
+                        //notification will come from LogBuffer class (notifyFlushTerminator)
+                        logRecord.wait();
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        throw HyracksDataException.create(e);
+                    }
                 }
             }
-            for (IndexInfo iInfo : dsInfo.getIndexes().values()) {
+            for (ILSMIndex index : indexes) {
                 //update resource lsn
                 AbstractLSMIOOperationCallback ioOpCallback =
-                        (AbstractLSMIOOperationCallback) iInfo.getIndex().getIOOperationCallback();
+                        (AbstractLSMIOOperationCallback) index.getIOOperationCallback();
                 ioOpCallback.updateLastLSN(logRecord.getLSN());
             }
+
+            if (asyncFlush) {
+                for (ILSMIndex index : indexes) {
+                    ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                    accessor.scheduleFlush(index.getIOOperationCallback());
+                }
+            } else {
+                for (ILSMIndex index : indexes) {
+                    // TODO: This is not efficient since we flush the indexes sequentially.
+                    // Think of a way to allow submitting the flush requests concurrently.
+                    // We don't do them concurrently because this may lead to a deadlock scenario
+                    // between the DatasetLifeCycleManager and the PrimaryIndexOperationTracker.
+                    ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                    accessor.scheduleFlush(index.getIOOperationCallback());
+                    // Wait for the above flush op.
+                    dsInfo.waitForIO();
+                }
+            }
         }
 
-        if (asyncFlush) {
-            for (IndexInfo iInfo : dsInfo.getIndexes().values()) {
-                ILSMIndexAccessor accessor =
-                        iInfo.getIndex().createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-                accessor.scheduleFlush(iInfo.getIndex().getIOOperationCallback());
-            }
-        } else {
-            for (IndexInfo iInfo : dsInfo.getIndexes().values()) {
-                // TODO: This is not efficient since we flush the indexes sequentially.
-                // Think of a way to allow submitting the flush requests concurrently. We don't do them concurrently because this
-                // may lead to a deadlock scenario between the DatasetLifeCycleManager and the PrimaryIndexOperationTracker.
-                flushAndWaitForIO(dsInfo, iInfo);
-            }
-        }
     }
 
-    private void closeDataset(DatasetInfo dsInfo) throws HyracksDataException {
+    private void closeDataset(DatasetResource dsr) throws HyracksDataException {
         // First wait for any ongoing IO operations
+        DatasetInfo dsInfo = dsr.getDatasetInfo();
         dsInfo.waitForIO();
         try {
-            flushDatasetOpenIndexes(dsInfo, false);
+            flushDatasetOpenIndexes(dsr, false);
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
         for (IndexInfo iInfo : dsInfo.getIndexes().values()) {
-            if (iInfo.isOpen()) {
-                ILSMOperationTracker opTracker = iInfo.getIndex().getOperationTracker();
-                synchronized (opTracker) {
-                    iInfo.getIndex().deactivate(false);
-                }
-                iInfo.setOpen(false);
-            }
+            closeIndex(iInfo);
         }
         removeDatasetFromCache(dsInfo.getDatasetID());
         dsInfo.setOpen(false);
@@ -446,7 +494,7 @@
     public synchronized void closeAllDatasets() throws HyracksDataException {
         ArrayList<DatasetResource> openDatasets = new ArrayList<>(datasets.values());
         for (DatasetResource dsr : openDatasets) {
-            closeDataset(dsr.getDatasetInfo());
+            closeDataset(dsr);
         }
     }
 
@@ -455,7 +503,7 @@
         ArrayList<DatasetResource> openDatasets = new ArrayList<>(datasets.values());
         for (DatasetResource dsr : openDatasets) {
             if (!dsr.isMetadataDataset()) {
-                closeDataset(dsr.getDatasetInfo());
+                closeDataset(dsr);
             }
         }
     }
@@ -554,8 +602,19 @@
     public void flushDataset(IReplicationStrategy replicationStrategy) throws HyracksDataException {
         for (DatasetResource dsr : datasets.values()) {
             if (replicationStrategy.isMatch(dsr.getDatasetID())) {
-                flushDatasetOpenIndexes(dsr.getDatasetInfo(), false);
+                flushDatasetOpenIndexes(dsr, false);
             }
         }
     }
+
+    private void closeIndex(IndexInfo indexInfo) throws HyracksDataException {
+        if (indexInfo.isOpen()) {
+            ILSMOperationTracker opTracker = indexInfo.getIndex().getOperationTracker();
+            synchronized (opTracker) {
+                indexInfo.getIndex().deactivate(false);
+            }
+            indexCheckpointManagerProvider.close(DatasetResourceReference.of(indexInfo.getLocalResource()));
+            indexInfo.setOpen(false);
+        }
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
index 88f406e..34d0774 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetMemoryManager.java
@@ -20,17 +20,18 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IDatasetMemoryManager;
 import org.apache.asterix.common.config.StorageProperties;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
 import org.apache.hyracks.util.annotations.ThreadSafe;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @ThreadSafe
 public class DatasetMemoryManager implements IDatasetMemoryManager {
 
-    private static final Logger LOGGER = Logger.getLogger(DatasetMemoryManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final Map<Integer, Long> allocatedMap = new HashMap<>();
     private final Map<Integer, Long> reservedMap = new HashMap<>();
     private long available;
@@ -108,9 +109,9 @@
 
     @Override
     public int getNumPages(int datasetId) {
-        return MetadataIndexImmutableProperties.isMetadataDataset(datasetId) ?
-                storageProperties.getMetadataMemoryComponentNumPages() :
-                storageProperties.getMemoryComponentNumPages();
+        return MetadataIndexImmutableProperties.isMetadataDataset(datasetId)
+                ? storageProperties.getMetadataMemoryComponentNumPages()
+                : storageProperties.getMemoryComponentNumPages();
     }
 
     private long getTotalSize(int datasetId) {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
index 79ae1da..8dcae23 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/DatasetResource.java
@@ -18,11 +18,14 @@
  */
 package org.apache.asterix.common.context;
 
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.common.LocalResource;
 
@@ -40,14 +43,16 @@
  */
 public class DatasetResource implements Comparable<DatasetResource> {
     private final DatasetInfo datasetInfo;
-    private final PrimaryIndexOperationTracker datasetPrimaryOpTracker;
     private final DatasetVirtualBufferCaches datasetVirtualBufferCaches;
 
-    public DatasetResource(DatasetInfo datasetInfo, PrimaryIndexOperationTracker datasetPrimaryOpTracker,
-            DatasetVirtualBufferCaches datasetVirtualBufferCaches) {
+    private final Map<Integer, PrimaryIndexOperationTracker> datasetPrimaryOpTrackers;
+    private final Map<Integer, ILSMComponentIdGenerator> datasetComponentIdGenerators;
+
+    public DatasetResource(DatasetInfo datasetInfo, DatasetVirtualBufferCaches datasetVirtualBufferCaches) {
         this.datasetInfo = datasetInfo;
-        this.datasetPrimaryOpTracker = datasetPrimaryOpTracker;
         this.datasetVirtualBufferCaches = datasetVirtualBufferCaches;
+        this.datasetPrimaryOpTrackers = new HashMap<>();
+        this.datasetComponentIdGenerators = new HashMap<>();
     }
 
     public boolean isRegistered() {
@@ -104,7 +109,8 @@
         if (index == null) {
             throw new HyracksDataException("Attempt to register a null index");
         }
-        datasetInfo.getIndexes().put(resourceID, new IndexInfo(index, datasetInfo.getDatasetID(), resourceID,
+
+        datasetInfo.addIndex(resourceID, new IndexInfo(index, datasetInfo.getDatasetID(), resource,
                 ((DatasetLocalResource) resource.getResource()).getPartition()));
     }
 
@@ -112,8 +118,31 @@
         return datasetInfo;
     }
 
-    public PrimaryIndexOperationTracker getOpTracker() {
-        return datasetPrimaryOpTracker;
+    public PrimaryIndexOperationTracker getOpTracker(int partition) {
+        return datasetPrimaryOpTrackers.get(partition);
+    }
+
+    public Collection<PrimaryIndexOperationTracker> getOpTrackers() {
+        return datasetPrimaryOpTrackers.values();
+    }
+
+    public ILSMComponentIdGenerator getComponentIdGenerator(int partition) {
+        return datasetComponentIdGenerators.get(partition);
+    }
+
+    public void setPrimaryIndexOperationTracker(int partition, PrimaryIndexOperationTracker opTracker) {
+        if (datasetPrimaryOpTrackers.containsKey(partition)) {
+            throw new IllegalStateException(
+                    "PrimaryIndexOperationTracker has already been set for partition " + partition);
+        }
+        datasetPrimaryOpTrackers.put(partition, opTracker);
+    }
+
+    public void setIdGenerator(int partition, ILSMComponentIdGenerator idGenerator) {
+        if (datasetComponentIdGenerators.containsKey(partition)) {
+            throw new IllegalStateException("LSMComponentIdGenerator has already been set for partition " + partition);
+        }
+        datasetComponentIdGenerators.put(partition, idGenerator);
     }
 
     @Override
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
new file mode 100644
index 0000000..301801b
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/ITransactionOperationTracker.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.context;
+
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
+
+public interface ITransactionOperationTracker extends ILSMOperationTracker {
+
+    /**
+     * Called before a transaction performs any operations on
+     * {@link org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex}
+     * with resource id {@code resourceId}
+     *
+     * @param resourceId
+     */
+    void beforeTransaction(long resourceId);
+
+    /**
+     * Called after a transaction completes its operations on
+     * {@link org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex}
+     * with resource id {@code resourceId}
+     *
+     * @param resourceId
+     */
+    void afterTransaction(long resourceId);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/IndexInfo.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/IndexInfo.java
index 9eb5b6c..b094b6f 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/IndexInfo.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/IndexInfo.java
@@ -19,17 +19,20 @@
 package org.apache.asterix.common.context;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.common.LocalResource;
 
 public class IndexInfo extends Info {
     private final ILSMIndex index;
     private final int datasetId;
     private final long resourceId;
     private final int partition;
+    private final LocalResource localResource;
 
-    public IndexInfo(ILSMIndex index, int datasetId, long resourceId, int partition) {
+    public IndexInfo(ILSMIndex index, int datasetId, LocalResource localResource, int partition) {
         this.index = index;
         this.datasetId = datasetId;
-        this.resourceId = resourceId;
+        this.localResource = localResource;
+        this.resourceId = localResource.getId();
         this.partition = partition;
     }
 
@@ -48,4 +51,8 @@
     public int getDatasetId() {
         return datasetId;
     }
+
+    public LocalResource getLocalResource() {
+        return localResource;
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/PrimaryIndexOperationTracker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/PrimaryIndexOperationTracker.java
index 0899c21..1a76b66 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/PrimaryIndexOperationTracker.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/context/PrimaryIndexOperationTracker.java
@@ -29,8 +29,10 @@
 import org.apache.asterix.common.transactions.LogRecord;
 import org.apache.asterix.common.utils.TransactionUtil;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
@@ -41,16 +43,21 @@
 
 public class PrimaryIndexOperationTracker extends BaseOperationTracker {
 
+    private final int partition;
     // Number of active operations on an ILSMIndex instance.
     private final AtomicInteger numActiveOperations;
     private final ILogManager logManager;
+    private final ILSMComponentIdGenerator idGenerator;
     private boolean flushOnExit = false;
     private boolean flushLogCreated = false;
 
-    public PrimaryIndexOperationTracker(int datasetID, ILogManager logManager, DatasetInfo dsInfo) {
+    public PrimaryIndexOperationTracker(int datasetID, int partition, ILogManager logManager, DatasetInfo dsInfo,
+            ILSMComponentIdGenerator idGenerator) {
         super(datasetID, dsInfo);
+        this.partition = partition;
         this.logManager = logManager;
         this.numActiveOperations = new AtomicInteger();
+        this.idGenerator = idGenerator;
     }
 
     @Override
@@ -68,7 +75,7 @@
     public void afterOperation(ILSMIndex index, LSMOperationType opType, ISearchOperationCallback searchCallback,
             IModificationOperationCallback modificationCallback) throws HyracksDataException {
         // Searches are immediately considered complete, because they should not prevent the execution of flushes.
-        if (opType == LSMOperationType.FLUSH || opType == LSMOperationType.REPLICATE) {
+        if (opType == LSMOperationType.REPLICATE) {
             completeOperation(index, opType, searchCallback, modificationCallback);
         }
     }
@@ -95,7 +102,7 @@
         // or if there is a flush scheduled by the checkpoint (flushOnExit), then schedule it
 
         boolean needsFlush = false;
-        Set<ILSMIndex> indexes = dsInfo.getDatasetIndexes();
+        Set<ILSMIndex> indexes = dsInfo.getDatasetPartitionOpenIndexes(partition);
 
         if (!flushOnExit) {
             for (ILSMIndex lsmIndex : indexes) {
@@ -124,8 +131,7 @@
                  * Generate a FLUSH log.
                  * Flush will be triggered when the log is written to disk by LogFlusher.
                  */
-                TransactionUtil.formFlushLogRecord(logRecord, datasetID, this, logManager.getNodeId(),
-                        dsInfo.getDatasetIndexes().size());
+                TransactionUtil.formFlushLogRecord(logRecord, datasetID, this);
                 try {
                     logManager.log(logRecord);
                 } catch (ACIDException e) {
@@ -141,10 +147,10 @@
 
     //This method is called sequentially by LogPage.notifyFlushTerminator in the sequence flushes were scheduled.
     public synchronized void triggerScheduleFlush(LogRecord logRecord) throws HyracksDataException {
-        for (ILSMIndex lsmIndex : dsInfo.getDatasetIndexes()) {
+        idGenerator.refresh();
+        for (ILSMIndex lsmIndex : dsInfo.getDatasetPartitionOpenIndexes(partition)) {
             //get resource
-            ILSMIndexAccessor accessor =
-                    lsmIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = lsmIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             //update resource lsn
             AbstractLSMIOOperationCallback ioOpCallback =
                     (AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback();
@@ -155,12 +161,6 @@
         flushLogCreated = false;
     }
 
-    @Override
-    public void exclusiveJobCommitted() throws HyracksDataException {
-        numActiveOperations.set(0);
-        flushIfRequested();
-    }
-
     public int getNumActiveOperations() {
         return numActiveOperations.get();
     }
@@ -169,7 +169,7 @@
         //modificationCallback can be NoOpOperationCallback when redo/undo operations are executed.
         if (modificationCallback != NoOpOperationCallback.INSTANCE) {
             numActiveOperations.incrementAndGet();
-            ((AbstractOperationCallback) modificationCallback).incrementLocalNumActiveOperations();
+            ((AbstractOperationCallback) modificationCallback).beforeOperation();
         }
     }
 
@@ -177,7 +177,7 @@
         //modificationCallback can be NoOpOperationCallback when redo/undo operations are executed.
         if (modificationCallback != NoOpOperationCallback.INSTANCE) {
             numActiveOperations.decrementAndGet();
-            ((AbstractOperationCallback) modificationCallback).decrementLocalNumActiveOperations();
+            ((AbstractOperationCallback) modificationCallback).afterOperation();
         }
     }
 
@@ -201,4 +201,8 @@
         return flushLogCreated;
     }
 
+    public int getPartition() {
+        return partition;
+    }
+
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/DatasetLocalResource.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/DatasetLocalResource.java
index 78b5cb2..48bbf00 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/DatasetLocalResource.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/DatasetLocalResource.java
@@ -59,6 +59,11 @@
     }
 
     @Override
+    public void setPath(String path) {
+        resource.setPath(path);
+    }
+
+    @Override
     public IIndex createInstance(INCServiceContext ncServiceCtx) throws HyracksDataException {
         return resource.createInstance(ncServiceCtx);
     }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java
index 690d1fd..18e3327 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/ICcApplicationContext.java
@@ -20,11 +20,14 @@
 
 import org.apache.asterix.common.api.IApplicationContext;
 import org.apache.asterix.common.api.IMetadataLockManager;
+import org.apache.asterix.common.api.INodeJobTracker;
+import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
+import org.apache.asterix.common.config.ExtensionProperties;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.metadata.IMetadataBootstrap;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
+import org.apache.asterix.common.replication.INcLifecycleCoordinator;
 import org.apache.asterix.common.transactions.IResourceIdManager;
 import org.apache.hyracks.api.application.ICCServiceContext;
 import org.apache.hyracks.api.job.IJobLifecycleListener;
@@ -60,9 +63,9 @@
     IGlobalRecoveryManager getGlobalRecoveryManager();
 
     /**
-     * @return the fault tolerance strategy in use for the cluster
+     * @return the NC lifecycle coordinator in use for the cluster
      */
-    IFaultToleranceStrategy getFaultToleranceStrategy();
+    INcLifecycleCoordinator getNcLifecycleCoordinator();
 
     /**
      * @return the active notification handler at Cluster controller
@@ -102,4 +105,26 @@
      * @return the cluster state manager
      */
     IClusterStateManager getClusterStateManager();
+
+    /**
+     * Set the extension manager
+     *
+     * @param extensionManager
+     */
+    void setExtensionManager(Object extensionManager);
+
+    /**
+     * @return the extension properties
+     */
+    ExtensionProperties getExtensionProperties();
+
+    /**
+     * @return the node job tracker
+     */
+    INodeJobTracker getNodeJobTracker();
+
+    /**
+     * @return the transaction id factory
+     */
+    ITxnIdFactory getTxnIdFactory();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMIndexUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMIndexUtil.java
index 04090bb..e844192 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMIndexUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMIndexUtil.java
@@ -41,11 +41,4 @@
             }
         }
     }
-
-    public static long getComponentFileLSNOffset(ILSMIndex lsmIndex, ILSMDiskComponent lsmComponent,
-            String componentFilePath) throws HyracksDataException {
-        AbstractLSMIOOperationCallback ioOpCallback =
-                (AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback();
-        return ioOpCallback.getComponentFileLSNOffset(lsmComponent, componentFilePath);
-    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
index 1c610ac..3879fb8 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/dataflow/LSMInsertDeleteOperatorNodePushable.java
@@ -36,11 +36,13 @@
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.api.ITupleFilterFactory;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.dataflow.LSMIndexInsertUpdateDeleteOperatorNodePushable;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 
 public class LSMInsertDeleteOperatorNodePushable extends LSMIndexInsertUpdateDeleteOperatorNodePushable {
 
@@ -88,7 +90,8 @@
             writer.open();
             modCallback =
                     modOpCallbackFactory.createModificationOperationCallback(indexHelper.getResource(), ctx, this);
-            indexAccessor = lsmIndex.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
+            IIndexAccessParameters iap = new IndexAccessParameters(modCallback, NoOpOperationCallback.INSTANCE);
+            indexAccessor = lsmIndex.createAccessor(iap);
             if (tupleFilterFactory != null) {
                 tupleFilter = tupleFilterFactory.createTupleFilter(ctx);
                 frameTuple = new FrameTupleReference();
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ACIDException.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ACIDException.java
index 7b489f2..77634eb 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ACIDException.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ACIDException.java
@@ -27,7 +27,7 @@
  * ACIDException encountered during crash recovery shall not have a transaction
  * context as recovery does not happen as part of a transaction.
  */
-public class ACIDException extends Exception {
+public class ACIDException extends RuntimeException {
 
     private static final long serialVersionUID = -8855848112541877323L;
     private ITransactionContext txnContext;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
index 6d3b6c2..1fc0f54 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java
@@ -132,6 +132,14 @@
     public static final int CANNOT_CREATE_SEC_PRIMARY_IDX_ON_EXT_DATASET = 1053;
     public static final int COMPILATION_FAILED_DUE_TO_REPLICATE_OP = 1054;
     public static final int COMPILATION_INCOMPATIBLE_FUNCTION_LANGUAGE = 1055;
+    public static final int TOO_MANY_OPTIONS_FOR_FUNCTION = 1056;
+    public static final int EXPRESSION_NOT_SUPPORTED_IN_CONSTANT_RECORD = 1057;
+    public static final int LITERAL_TYPE_NOT_SUPPORTED_IN_CONSTANT_RECORD = 1058;
+    public static final int UNSUPPORTED_WITH_FIELD = 1059;
+    public static final int WITH_FIELD_MUST_BE_OF_TYPE = 1060;
+    public static final int WITH_FIELD_MUST_CONTAIN_SUB_FIELD = 1061;
+    public static final int MERGE_POLICY_PARAMETER_INVALID_TYPE = 1062;
+    public static final int NO_DATAVERSE_WITH_NAME = 1063;
 
     // Feed errors
     public static final int DATAFLOW_ILLEGAL_STATE = 3001;
@@ -240,6 +248,7 @@
     public static final int METADATA_DROP_FUCTION_IN_USE = 3109;
     public static final int FEED_FAILED_WHILE_GETTING_A_NEW_RECORD = 3110;
     public static final int FEED_START_FEED_WITHOUT_CONNECTION = 3111;
+    public static final int PARSER_COLLECTION_ITEM_CANNOT_BE_NULL = 3112;
 
     // Lifecycle management errors
     public static final int DUPLICATE_PARTITION_ID = 4000;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java
index 3105b3f..256ce08 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ExceptionUtils.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.common.exceptions;
 
+import java.util.function.Predicate;
+
 public class ExceptionUtils {
     public static final String INCORRECT_PARAMETER = "Incorrect parameter.\n";
     public static final String PARAMETER_NAME = "Parameter name: ";
@@ -49,4 +51,21 @@
         }
         return current;
     }
+
+    /**
+     * Determines whether supplied exception contains a matching cause in its hierarchy, or is itself a match
+     */
+    public static boolean matchingCause(Throwable e, Predicate<Throwable> test) {
+        Throwable current = e;
+        Throwable cause = e.getCause();
+        while (cause != null && cause != current) {
+            if (test.test(cause)) {
+                return true;
+            }
+            Throwable nextCause = current.getCause();
+            current = cause;
+            cause = nextCause;
+        }
+        return test.test(e);
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/MetadataException.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/MetadataException.java
index f04d19d..085f465 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/MetadataException.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/MetadataException.java
@@ -20,12 +20,14 @@
 package org.apache.asterix.common.exceptions;
 
 import java.io.Serializable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MetadataException extends CompilationException {
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(MetadataException.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     @Deprecated
     /**
@@ -69,7 +71,7 @@
             return (MetadataException) cause;
         }
         if (cause instanceof InterruptedException && !Thread.currentThread().isInterrupted()) {
-            LOGGER.log(Level.WARNING, "Wrapping an InterruptedException in " + MetadataException.class.getSimpleName()
+            LOGGER.log(Level.WARN, "Wrapping an InterruptedException in " + MetadataException.class.getSimpleName()
                     + " and current thread is not interrupted", cause);
         }
         return new MetadataException(cause);
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ReplicationException.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ReplicationException.java
new file mode 100644
index 0000000..034d668
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ReplicationException.java
@@ -0,0 +1,26 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.asterix.common.exceptions;
+
+public class ReplicationException extends RuntimeException {
+
+    public ReplicationException(Throwable cause) {
+        super(cause);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
index 736aff6..d7b054d 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
@@ -28,6 +28,10 @@
     private String name;
     private int arity;
 
+    public FunctionSignature(FunctionIdentifier fi) {
+        this(fi.getNamespace(), fi.getName(), fi.getArity());
+    }
+
     public FunctionSignature(String namespace, String name, int arity) {
         this.namespace = namespace;
         this.name = name;
@@ -40,9 +44,10 @@
             return false;
         } else {
             FunctionSignature f = ((FunctionSignature) o);
-            return ((namespace != null && namespace.equals(f.getNamespace()) || (namespace == null && f.getNamespace() == null)))
-                    && name.equals(f.getName())
-                    && (arity == f.getArity() || arity == FunctionIdentifier.VARARGS || f.getArity() == FunctionIdentifier.VARARGS);
+            return ((namespace != null && namespace.equals(f.getNamespace())
+                    || (namespace == null && f.getNamespace() == null))) && name.equals(f.getName())
+                    && (arity == f.getArity() || arity == FunctionIdentifier.VARARGS
+                            || f.getArity() == FunctionIdentifier.VARARGS);
         }
     }
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
index 5fcbac9..bacebf1 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIOOperationCallback.java
@@ -19,28 +19,32 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
+import java.util.HashMap;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Map;
+import java.util.Optional;
 
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.ResourceReference;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.common.freepage.MutableArrayValueReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.DiskComponentMetadata;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.util.ComponentUtils;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
 
 // A single LSMIOOperationCallback per LSM index used to perform actions around Flush and Merge operations
 public abstract class AbstractLSMIOOperationCallback implements ILSMIOOperationCallback {
-    private static final Logger LOGGER = Logger.getLogger(AbstractLSMIOOperationCallback.class.getName());
     public static final MutableArrayValueReference LSN_KEY = new MutableArrayValueReference("LSN".getBytes());
     public static final long INVALID = -1L;
 
@@ -55,20 +59,39 @@
     protected int readIndex;
     // Index of the currently being written to component
     protected int writeIndex;
+    // Index of the memory component to be recycled
+    protected int recycleIndex;
+    // Indicates whether this index has been scheduled to flush (no matter whether succeeds or not)
+    protected boolean hasFlushed;
+    // Keep track of the component Id of the next component being activated.
+    protected ILSMComponentId[] nextComponentIds;
 
-    public AbstractLSMIOOperationCallback(ILSMIndex lsmIndex) {
+    protected final ILSMComponentIdGenerator idGenerator;
+    private final IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
+    private final Map<ILSMComponentId, Long> componentLsnMap = new HashMap<>();
+
+    public AbstractLSMIOOperationCallback(ILSMIndex lsmIndex, ILSMComponentIdGenerator idGenerator,
+            IIndexCheckpointManagerProvider indexCheckpointManagerProvider) {
         this.lsmIndex = lsmIndex;
+        this.idGenerator = idGenerator;
+        this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
         int count = lsmIndex.getNumberOfAllMemoryComponents();
         mutableLastLSNs = new long[count];
         firstLSNs = new long[count];
         flushRequested = new boolean[count];
         readIndex = 0;
         writeIndex = 0;
+        recycleIndex = 0;
+        hasFlushed = false;
+        nextComponentIds = new ILSMComponentId[count];
+        if (count > 0) {
+            nextComponentIds[0] = idGenerator.getId();
+        }
     }
 
     @Override
-    public void beforeOperation(LSMOperationType opType) throws HyracksDataException {
-        if (opType == LSMOperationType.FLUSH) {
+    public void beforeOperation(LSMIOOperationType opType) throws HyracksDataException {
+        if (opType == LSMIOOperationType.FLUSH) {
             /*
              * This method was called on the scheduleFlush operation.
              * We set the lastLSN to the last LSN for the index (the LSN for the flush log)
@@ -82,15 +105,35 @@
                 if (writeIndex != readIndex) {
                     firstLSNs[writeIndex] = mutableLastLSNs[writeIndex];
                 }
+
             }
         }
     }
 
     @Override
-    public void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent) {
-        // The operation was complete and the next I/O operation for the LSM index didn't start yet
-        if (opType == LSMOperationType.FLUSH && newComponent != null) {
+    public void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents,
+            ILSMDiskComponent newComponent) throws HyracksDataException {
+        //TODO: Copying Filters and all content of the metadata pages for flush operation should be done here
+        if (newComponent == null) {
+            // failed operation. Nothing to do.
+            return;
+        }
+        putLSNIntoMetadata(newComponent, oldComponents);
+        putComponentIdIntoMetadata(opType, newComponent, oldComponents);
+        componentLsnMap.put(newComponent.getId(), getComponentLSN(oldComponents));
+        if (opType == LSMIOOperationType.MERGE) {
+            if (oldComponents == null) {
+                throw new IllegalStateException("Merge must have old components");
+            }
+            LongPointable markerLsn =
+                    LongPointable.FACTORY.createPointable(ComponentUtils.getLong(oldComponents.get(0).getMetadata(),
+                            ComponentUtils.MARKER_LSN_KEY, ComponentUtils.NOT_FOUND));
+            newComponent.getMetadata().put(ComponentUtils.MARKER_LSN_KEY, markerLsn);
+        } else if (opType == LSMIOOperationType.FLUSH) {
+            // advance memory component indexes
             synchronized (this) {
+                // we've already consumed the specified LSN/component id.
+                // Now we can advance to the next component
                 flushRequested[readIndex] = false;
                 // if the component which just finished flushing is the component that will be modified next,
                 // we set its first LSN to its previous LSN
@@ -102,7 +145,28 @@
         }
     }
 
-    public void putLSNIntoMetadata(ILSMDiskComponent newComponent, List<ILSMComponent> oldComponents)
+    @Override
+    public void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent) throws HyracksDataException {
+        // The operation was complete and the next I/O operation for the LSM index didn't start yet
+        if (opType == LSMIOOperationType.FLUSH) {
+            hasFlushed = true;
+            if (newComponent != null) {
+                final Long lsn = componentLsnMap.remove(newComponent.getId());
+                if (lsn == null) {
+                    throw new IllegalStateException("Unidentified flushed component: " + newComponent);
+                }
+                // empty component doesn't have any files
+                final Optional<String> componentFile = newComponent.getLSMComponentPhysicalFiles().stream().findAny();
+                if (componentFile.isPresent()) {
+                    final ResourceReference ref = ResourceReference.of(componentFile.get());
+                    final String componentEndTime = AbstractLSMIndexFileManager.getComponentEndTime(ref.getName());
+                    indexCheckpointManagerProvider.get(ref).flushed(componentEndTime, lsn);
+                }
+            }
+        }
+    }
+
+    private void putLSNIntoMetadata(ILSMDiskComponent newComponent, List<ILSMComponent> oldComponents)
             throws HyracksDataException {
         newComponent.getMetadata().put(LSN_KEY, LongPointable.FACTORY.createPointable(getComponentLSN(oldComponents)));
     }
@@ -114,40 +178,22 @@
         return pointable.getLength() == 0 ? INVALID : pointable.longValue();
     }
 
-    private ILSMDiskComponentId getComponentId(List<ILSMComponent> oldComponents) throws HyracksDataException {
-        if (oldComponents == null) {
-            //if oldComponents == null, then getComponentLSN would treat it as a flush operation,
-            //and return the LSN for the flushed component
-            long id = getComponentLSN(null);
-            if (id == 0) {
-                LOGGER.log(Level.WARNING, "Flushing a memory component without setting the LSN");
-                id = ILSMDiskComponentId.NOT_FOUND;
-            }
-            return new LSMDiskComponentId(id, id);
-        } else {
-            long minId = Long.MAX_VALUE;
-            long maxId = Long.MIN_VALUE;
-            for (ILSMComponent oldComponent : oldComponents) {
-                ILSMDiskComponentId oldComponentId = ((ILSMDiskComponent) oldComponent).getComponentId();
-                if (oldComponentId.getMinId() < minId) {
-                    minId = oldComponentId.getMinId();
-                }
-                if (oldComponentId.getMaxId() > maxId) {
-                    maxId = oldComponentId.getMaxId();
-                }
-            }
-            return new LSMDiskComponentId(minId, maxId);
+    private ILSMComponentId getMergedComponentId(List<ILSMComponent> mergedComponents) throws HyracksDataException {
+        if (mergedComponents == null || mergedComponents.isEmpty()) {
+            return null;
         }
+        return LSMComponentIdUtils.union(mergedComponents.get(0).getId(),
+                mergedComponents.get(mergedComponents.size() - 1).getId());
+
     }
 
-    private void putComponentIdIntoMetadata(ILSMDiskComponent component, List<ILSMComponent> oldComponents)
-            throws HyracksDataException {
-        DiskComponentMetadata metadata = component.getMetadata();
-        ILSMDiskComponentId componentId = getComponentId(oldComponents);
-        metadata.put(ILSMDiskComponentId.COMPONENT_ID_MIN_KEY,
-                LongPointable.FACTORY.createPointable(componentId.getMinId()));
-        metadata.put(ILSMDiskComponentId.COMPONENT_ID_MAX_KEY,
-                LongPointable.FACTORY.createPointable(componentId.getMaxId()));
+    private void putComponentIdIntoMetadata(LSMIOOperationType opType, ILSMDiskComponent newComponent,
+            List<ILSMComponent> oldComponents) throws HyracksDataException {
+        // the id of flushed component is set when we copy the metadata of the memory component
+        if (opType == LSMIOOperationType.MERGE) {
+            ILSMComponentId componentId = getMergedComponentId(oldComponents);
+            LSMComponentIdUtils.persist(componentId, newComponent.getMetadata());
+        }
     }
 
     public synchronized void updateLastLSN(long lastLSN) {
@@ -157,10 +203,17 @@
             //Moreover, since the memory component is already being flushed, the next scheduleFlush request must fail.
             //See https://issues.apache.org/jira/browse/ASTERIXDB-1917
             mutableLastLSNs[writeIndex] = lastLSN;
+            if (hasFlushed || lsmIndex.isMemoryComponentsAllocated()) {
+                // we only (re)set next component id if either this index has been flushed (no matter succeed or not)
+                // or the memory component has been allocated
+                // This prevents the case where indexes in a partition are being allocated, while another partition
+                // tries to schedule flush
+                nextComponentIds[writeIndex] = idGenerator.getId();
+            }
         }
     }
 
-    public void setFirstLSN(long firstLSN) {
+    public synchronized void setFirstLSN(long firstLSN) {
         // We make sure that this method is only called on an empty component so the first LSN is not set incorrectly
         firstLSNs[writeIndex] = firstLSN;
     }
@@ -173,7 +226,6 @@
     }
 
     public synchronized boolean hasPendingFlush() {
-
         for (int i = 0; i < flushRequested.length; i++) {
             if (flushRequested[i]) {
                 return true;
@@ -182,31 +234,12 @@
         return false;
     }
 
-    @Override
-    public void afterOperation(LSMOperationType opType, List<ILSMComponent> oldComponents,
-            ILSMDiskComponent newComponent) throws HyracksDataException {
-        //TODO: Copying Filters and all content of the metadata pages for flush operation should be done here
-        if (newComponent != null) {
-            putLSNIntoMetadata(newComponent, oldComponents);
-            putComponentIdIntoMetadata(newComponent, oldComponents);
-            if (opType == LSMOperationType.MERGE) {
-                // In case of merge, oldComponents are never null
-                LongPointable markerLsn =
-                        LongPointable.FACTORY.createPointable(ComponentUtils.getLong(oldComponents.get(0).getMetadata(),
-                                ComponentUtils.MARKER_LSN_KEY, ComponentUtils.NOT_FOUND));
-                newComponent.getMetadata().put(ComponentUtils.MARKER_LSN_KEY, markerLsn);
-            }
-
-        }
-    }
-
     public long getComponentLSN(List<? extends ILSMComponent> diskComponents) throws HyracksDataException {
         if (diskComponents == null) {
             // Implies a flush IO operation. --> moves the flush pointer
             // Flush operation of an LSM index are executed sequentially.
             synchronized (this) {
-                long lsn = mutableLastLSNs[readIndex];
-                return lsn;
+                return mutableLastLSNs[readIndex];
             }
         }
         // Get max LSN from the diskComponents. Implies a merge IO operation or Recovery operation.
@@ -218,23 +251,25 @@
         return maxLSN;
     }
 
+    private synchronized ILSMComponentId getLSMComponentId() {
+        return nextComponentIds[recycleIndex];
+    }
+
     @Override
-    public void recycled(ILSMMemoryComponent component) throws HyracksDataException {
-        // No op
+    public void recycled(ILSMMemoryComponent component, boolean componentSwitched) throws HyracksDataException {
+        ILSMComponentId componentId = getLSMComponentId();
+        component.resetId(componentId);
+        if (componentSwitched) {
+            recycleIndex = (recycleIndex + 1) % nextComponentIds.length;
+        }
     }
 
     @Override
     public void allocated(ILSMMemoryComponent component) throws HyracksDataException {
-        // No op
+        if (component == lsmIndex.getCurrentMemoryComponent()) {
+            // only set the component id for the first (current) memory component
+            ILSMComponentId componentId = getLSMComponentId();
+            component.resetId(componentId);
+        }
     }
-
-    /**
-     * @param component
-     * @param componentFilePath
-     * @return The LSN byte offset in the LSM disk component if the index is valid,
-     *         otherwise {@link IMetadataPageManager#INVALID_LSN_OFFSET}.
-     * @throws HyracksDataException
-     */
-    public abstract long getComponentFileLSNOffset(ILSMDiskComponent component, String componentFilePath)
-            throws HyracksDataException;
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIndexIOOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIndexIOOperationCallbackFactory.java
new file mode 100644
index 0000000..5b9883c
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/AbstractLSMIndexIOOperationCallbackFactory.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.common.ioopcallbacks;
+
+import java.io.ObjectStreamException;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentId;
+import org.apache.hyracks.storage.common.IResource;
+
+public abstract class AbstractLSMIndexIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    protected ILSMComponentIdGeneratorFactory idGeneratorFactory;
+
+    protected transient INCServiceContext ncCtx;
+
+    protected transient IResource resource;
+
+    public AbstractLSMIndexIOOperationCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        this.idGeneratorFactory = idGeneratorFactory;
+    }
+
+    @Override
+    public void initialize(INCServiceContext ncCtx, IResource resource) {
+        this.ncCtx = ncCtx;
+        this.resource = resource;
+    }
+
+    protected ILSMComponentIdGenerator getComponentIdGenerator() throws HyracksDataException {
+        return idGeneratorFactory.getComponentIdGenerator(ncCtx, resource);
+    }
+
+    protected IIndexCheckpointManagerProvider getIndexCheckpointManagerProvider() {
+        return ((INcApplicationContext) ncCtx.getApplicationContext()).getIndexCheckpointManagerProvider();
+    }
+
+    private void readObjectNoData() throws ObjectStreamException {
+        idGeneratorFactory = new ILSMComponentIdGeneratorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public ILSMComponentIdGenerator getComponentIdGenerator(INCServiceContext serviceCtx, IResource resource) {
+                // used for backward compatibility
+                // if idGeneratorFactory is not set for legacy lsm indexes, we return a default
+                // component id generator which always generates the missing component id.
+                return new ILSMComponentIdGenerator() {
+                    @Override
+                    public void refresh() {
+                        // No op
+                    }
+
+                    @Override
+                    public ILSMComponentId getId() {
+                        return LSMComponentId.MISSING_COMPONENT_ID;
+                    }
+                };
+            }
+        };
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
index c7fbb65..db6c609 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallback.java
@@ -19,27 +19,14 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
-import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeFileManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeIOOperationCallback extends AbstractLSMIOOperationCallback {
 
-    public LSMBTreeIOOperationCallback(ILSMIndex index) {
-        super(index);
-    }
-
-    @Override
-    public long getComponentFileLSNOffset(ILSMDiskComponent diskComponent, String diskComponentFilePath)
-            throws HyracksDataException {
-        if (diskComponentFilePath.endsWith(LSMBTreeFileManager.BTREE_SUFFIX)) {
-            IMetadataPageManager metadataPageManager =
-                    (IMetadataPageManager) ((BTree) diskComponent.getIndex()).getPageManager();
-            return metadataPageManager.getFileOffset(metadataPageManager.createMetadataFrame(), LSN_KEY);
-        }
-        return INVALID;
+    public LSMBTreeIOOperationCallback(ILSMIndex index, ILSMComponentIdGenerator idGenerator,
+            IIndexCheckpointManagerProvider checkpointManagerProvider) {
+        super(index, idGenerator, checkpointManagerProvider);
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
index e3abb6b..97badb2 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeIOOperationCallbackFactory.java
@@ -19,21 +19,21 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
-public class LSMBTreeIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
+public class LSMBTreeIOOperationCallbackFactory extends AbstractLSMIndexIOOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public static LSMBTreeIOOperationCallbackFactory INSTANCE = new LSMBTreeIOOperationCallbackFactory();
-
-    private LSMBTreeIOOperationCallbackFactory() {
+    public LSMBTreeIOOperationCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        super(idGeneratorFactory);
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
-        return new LSMBTreeIOOperationCallback(index);
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException {
+        return new LSMBTreeIOOperationCallback(index, getComponentIdGenerator(), getIndexCheckpointManagerProvider());
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
index 67d623a..da1446b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallback.java
@@ -18,27 +18,14 @@
  */
 package org.apache.asterix.common.ioopcallbacks;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
-import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeWithBuddyFileManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
 public class LSMBTreeWithBuddyIOOperationCallback extends AbstractLSMIOOperationCallback {
 
-    public LSMBTreeWithBuddyIOOperationCallback(ILSMIndex lsmIndex) {
-        super(lsmIndex);
-    }
-
-    @Override
-    public long getComponentFileLSNOffset(ILSMDiskComponent diskComponent, String diskComponentFilePath)
-            throws HyracksDataException {
-        if (diskComponentFilePath.endsWith(LSMBTreeWithBuddyFileManager.BTREE_SUFFIX)) {
-            IMetadataPageManager metadataPageManager =
-                    (IMetadataPageManager) ((BTree) diskComponent.getIndex()).getPageManager();
-            return metadataPageManager.getFileOffset(metadataPageManager.createMetadataFrame(), LSN_KEY);
-        }
-        return INVALID;
+    public LSMBTreeWithBuddyIOOperationCallback(ILSMIndex lsmIndex, ILSMComponentIdGenerator idGenerator,
+            IIndexCheckpointManagerProvider checkpointManagerProvider) {
+        super(lsmIndex, idGenerator, checkpointManagerProvider);
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
index 93f505c..9b32345 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackFactory.java
@@ -18,22 +18,22 @@
  */
 package org.apache.asterix.common.ioopcallbacks;
 
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
-public class LSMBTreeWithBuddyIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
+public class LSMBTreeWithBuddyIOOperationCallbackFactory extends AbstractLSMIndexIOOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public static final LSMBTreeWithBuddyIOOperationCallbackFactory INSTANCE =
-            new LSMBTreeWithBuddyIOOperationCallbackFactory();
-
-    private LSMBTreeWithBuddyIOOperationCallbackFactory() {
+    public LSMBTreeWithBuddyIOOperationCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        super(idGeneratorFactory);
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
-        return new LSMBTreeWithBuddyIOOperationCallback(index);
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException {
+        return new LSMBTreeWithBuddyIOOperationCallback(index, getComponentIdGenerator(),
+                getIndexCheckpointManagerProvider());
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
index 2d27b78..3ba9bcd 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallback.java
@@ -19,28 +19,14 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.invertedindex.impls.LSMInvertedIndexDiskComponent;
-import org.apache.hyracks.storage.am.lsm.invertedindex.impls.LSMInvertedIndexFileManager;
 
 public class LSMInvertedIndexIOOperationCallback extends AbstractLSMIOOperationCallback {
 
-    public LSMInvertedIndexIOOperationCallback(ILSMIndex index) {
-        super(index);
-    }
-
-    @Override
-    public long getComponentFileLSNOffset(ILSMDiskComponent diskComponent, String diskComponentFilePath)
-            throws HyracksDataException {
-        if (diskComponentFilePath.endsWith(LSMInvertedIndexFileManager.DELETED_KEYS_BTREE_SUFFIX)) {
-            LSMInvertedIndexDiskComponent invIndexComponent = (LSMInvertedIndexDiskComponent) diskComponent;
-            IMetadataPageManager metadataPageManager =
-                    (IMetadataPageManager) invIndexComponent.getBuddyIndex().getPageManager();
-            return metadataPageManager.getFileOffset(metadataPageManager.createMetadataFrame(), LSN_KEY);
-        }
-        return INVALID;
+    public LSMInvertedIndexIOOperationCallback(ILSMIndex index, ILSMComponentIdGenerator idGenerator,
+            IIndexCheckpointManagerProvider checkpointManagerProvider) {
+        super(index, idGenerator, checkpointManagerProvider);
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
index 47a67b2..766ef95 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMInvertedIndexIOOperationCallbackFactory.java
@@ -19,22 +19,22 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
-public class LSMInvertedIndexIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
+public class LSMInvertedIndexIOOperationCallbackFactory extends AbstractLSMIndexIOOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public static final LSMInvertedIndexIOOperationCallbackFactory INSTANCE =
-            new LSMInvertedIndexIOOperationCallbackFactory();
-
-    private LSMInvertedIndexIOOperationCallbackFactory() {
+    public LSMInvertedIndexIOOperationCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        super(idGeneratorFactory);
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
-        return new LSMInvertedIndexIOOperationCallback(index);
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException {
+        return new LSMInvertedIndexIOOperationCallback(index, getComponentIdGenerator(),
+                getIndexCheckpointManagerProvider());
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
index 9ba99f9..f3e80ec 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallback.java
@@ -19,27 +19,14 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.rtree.impls.LSMRTreeFileManager;
-import org.apache.hyracks.storage.am.rtree.impls.RTree;
 
 public class LSMRTreeIOOperationCallback extends AbstractLSMIOOperationCallback {
 
-    public LSMRTreeIOOperationCallback(ILSMIndex index) {
-        super(index);
-    }
-
-    @Override
-    public long getComponentFileLSNOffset(ILSMDiskComponent diskComponent, String diskComponentFilePath)
-            throws HyracksDataException {
-        if (diskComponentFilePath.endsWith(LSMRTreeFileManager.RTREE_SUFFIX)) {
-            IMetadataPageManager metadataPageManager =
-                    (IMetadataPageManager) ((RTree) diskComponent.getIndex()).getPageManager();
-            return metadataPageManager.getFileOffset(metadataPageManager.createMetadataFrame(), LSN_KEY);
-        }
-        return INVALID;
+    public LSMRTreeIOOperationCallback(ILSMIndex index, ILSMComponentIdGenerator idGenerator,
+            IIndexCheckpointManagerProvider checkpointManagerProvodier) {
+        super(index, idGenerator, checkpointManagerProvodier);
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
index 14cf648..3a0afa8 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/ioopcallbacks/LSMRTreeIOOperationCallbackFactory.java
@@ -19,21 +19,21 @@
 
 package org.apache.asterix.common.ioopcallbacks;
 
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 
-public class LSMRTreeIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
+public class LSMRTreeIOOperationCallbackFactory extends AbstractLSMIndexIOOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public static final LSMRTreeIOOperationCallbackFactory INSTANCE = new LSMRTreeIOOperationCallbackFactory();
-
-    private LSMRTreeIOOperationCallbackFactory() {
+    public LSMRTreeIOOperationCallbackFactory(ILSMComponentIdGeneratorFactory idGeneratorFactory) {
+        super(idGeneratorFactory);
     }
 
     @Override
-    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) {
-        return new LSMRTreeIOOperationCallback(index);
+    public ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException {
+        return new LSMRTreeIOOperationCallback(index, getComponentIdGenerator(), getIndexCheckpointManagerProvider());
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/ConcurrentFramePool.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/ConcurrentFramePool.java
index d57a4fc..b7d34f2 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/ConcurrentFramePool.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/ConcurrentFramePool.java
@@ -25,18 +25,19 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ConcurrentFramePool {
     private static final boolean DEBUG = false;
-    private static final String ERROR_INVALID_FRAME_SIZE = "The size should be an integral "
-            + "multiple of the default frame size";
-    private static final String ERROR_LARGER_THAN_BUDGET_REQUEST = "The requested frame size"
-            + " must not be greater than the allocated budget";
-    private static final Logger LOGGER = Logger.getLogger(ConcurrentFramePool.class.getName());
+    private static final String ERROR_INVALID_FRAME_SIZE =
+            "The size should be an integral " + "multiple of the default frame size";
+    private static final String ERROR_LARGER_THAN_BUDGET_REQUEST =
+            "The requested frame size" + " must not be greater than the allocated budget";
+    private static final Logger LOGGER = LogManager.getLogger();
     private final String nodeId;
     private final int budget;
     private final int defaultFrameSize;
@@ -233,8 +234,8 @@
                 try {
                     frameAction.call(freeBuffer);
                 } catch (Exception e) {
-                    LOGGER.log(Level.SEVERE,
-                            "Error while attempting to answer a subscription. Buffer will be reclaimed", e);
+                    LOGGER.log(Level.ERROR, "Error while attempting to answer a subscription. Buffer will be reclaimed",
+                            e);
                     // TODO(amoudi): Add test cases and get rid of recursion
                     if (handedOut == handedOutBeforeCall) {
                         release(freeBuffer);
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/FrameAction.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/FrameAction.java
index 366125a..c41f960 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/FrameAction.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/memory/FrameAction.java
@@ -19,11 +19,13 @@
 package org.apache.asterix.common.memory;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FrameAction {
     private static final boolean DEBUG = false;
-    private static final Logger LOGGER = Logger.getLogger(FrameAction.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private ByteBuffer allocated;
     private ByteBuffer frame;
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/CcIdentifiedMessage.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/CcIdentifiedMessage.java
new file mode 100644
index 0000000..d8a68ef
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/CcIdentifiedMessage.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.messaging;
+
+import java.io.Serializable;
+
+import org.apache.asterix.common.messaging.api.ICcIdentifiedMessage;
+import org.apache.hyracks.api.control.CcId;
+
+public abstract class CcIdentifiedMessage implements ICcIdentifiedMessage, Serializable {
+    private CcId ccId;
+
+    @Override
+    public CcId getCcId() {
+        return ccId;
+    }
+
+    @Override
+    public void setCcId(CcId ccId) {
+        this.ccId = ccId;
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICCMessageBroker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICCMessageBroker.java
index 33a8ff3..208686c 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICCMessageBroker.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICCMessageBroker.java
@@ -23,7 +23,7 @@
 import org.apache.hyracks.api.messages.IMessageBroker;
 
 public interface ICCMessageBroker extends IMessageBroker {
-    public enum ResponseState {
+    enum ResponseState {
         UNINITIALIZED,
         SUCCESS,
         FAILURE
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcAddressedMessage.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcAddressedMessage.java
index 37cba9c..549f1dd 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcAddressedMessage.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcAddressedMessage.java
@@ -29,5 +29,4 @@
      * handle the message upon delivery
      */
     void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException;
-
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcIdentifiedMessage.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcIdentifiedMessage.java
new file mode 100644
index 0000000..d144498
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/ICcIdentifiedMessage.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.messaging.api;
+
+import org.apache.hyracks.api.control.CcId;
+
+public interface ICcIdentifiedMessage {
+    CcId getCcId();
+
+    void setCcId(CcId ccId);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/INCMessageBroker.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/INCMessageBroker.java
index 86d1074..6bd58a9 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/INCMessageBroker.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/messaging/api/INCMessageBroker.java
@@ -18,17 +18,26 @@
  */
 package org.apache.asterix.common.messaging.api;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.messages.IMessageBroker;
 
 public interface INCMessageBroker extends IMessageBroker {
 
     /**
+     * Sends application message from this NC to the primary CC.
+     *
+     * @param message
+     * @throws Exception
+     */
+    public void sendMessageToPrimaryCC(ICcAddressedMessage message) throws Exception;
+
+    /**
      * Sends application message from this NC to the CC.
      *
      * @param message
      * @throws Exception
      */
-    public void sendMessageToCC(ICcAddressedMessage message) throws Exception;
+    public void sendMessageToCC(CcId ccId, ICcAddressedMessage message) throws Exception;
 
     /**
      * Sends application message from this NC to another NC.
@@ -36,8 +45,7 @@
      * @param message
      * @throws Exception
      */
-    public void sendMessageToNC(String nodeId, INcAddressedMessage message)
-            throws Exception;
+    public void sendMessageToNC(String nodeId, INcAddressedMessage message) throws Exception;
 
     /**
      * Queue a message to this {@link INCMessageBroker} for processing
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
new file mode 100644
index 0000000..9f9294b
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/AllDatasetsReplicationStrategy.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.replication;
+
+public class AllDatasetsReplicationStrategy implements IReplicationStrategy {
+
+    @Override
+    public boolean isMatch(int datasetId) {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ChainedDeclusteringReplicationStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ChainedDeclusteringReplicationStrategy.java
deleted file mode 100644
index dc69383..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ChainedDeclusteringReplicationStrategy.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class ChainedDeclusteringReplicationStrategy implements IReplicationStrategy {
-
-    private static final Logger LOGGER = Logger.getLogger(ChainedDeclusteringReplicationStrategy.class.getName());
-    private int replicationFactor;
-
-    @Override
-    public boolean isMatch(int datasetId) {
-        return true;
-    }
-
-    @Override
-    public Set<Replica> getRemoteReplicas(String nodeId) {
-        Set<Replica> remoteReplicas = new HashSet<>();
-        Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-        int numberOfRemoteReplicas = replicationFactor - 1;
-        int nodeIndex = ClusterProperties.INSTANCE.getNodeIndex(nodeId);
-
-        if (nodeIndex == -1) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Could not find node " + nodeId + " in cluster configurations");
-            }
-            return Collections.emptySet();
-        }
-
-        //find nodes to the right of this node
-        while (remoteReplicas.size() != numberOfRemoteReplicas) {
-            remoteReplicas.add(new Replica(cluster.getNode().get(++nodeIndex % cluster.getNode().size())));
-        }
-
-        return remoteReplicas;
-    }
-
-    @Override
-    public Set<Replica> getRemotePrimaryReplicas(String nodeId) {
-        Set<Replica> clientReplicas = new HashSet<>();
-        Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-        final int remotePrimaryReplicasCount = replicationFactor - 1;
-
-        int nodeIndex = ClusterProperties.INSTANCE.getNodeIndex(nodeId);
-
-        //find nodes to the left of this node
-        while (clientReplicas.size() != remotePrimaryReplicasCount) {
-            clientReplicas.add(new Replica(cluster.getNode().get(Math.abs(--nodeIndex % cluster.getNode().size()))));
-        }
-
-        return clientReplicas;
-    }
-
-    @Override
-    public ChainedDeclusteringReplicationStrategy from(Cluster cluster) throws HyracksDataException {
-        if (cluster.getHighAvailability().getDataReplication().getReplicationFactor() == null) {
-            throw new RuntimeDataException(ErrorCode.INVALID_CONFIGURATION, "Replication factor must be specified.");
-        }
-        ChainedDeclusteringReplicationStrategy cd = new ChainedDeclusteringReplicationStrategy();
-        cd.replicationFactor = cluster.getHighAvailability().getDataReplication().getReplicationFactor().intValue();
-        return cd;
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IFaultToleranceStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IFaultToleranceStrategy.java
deleted file mode 100644
index 5c286cc..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IFaultToleranceStrategy.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.hyracks.api.application.ICCServiceContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public interface IFaultToleranceStrategy {
-
-    /**
-     * Defines the logic of a {@link IFaultToleranceStrategy} when a node joins the cluster.
-     *
-     * @param nodeId
-     * @throws HyracksDataException
-     */
-    void notifyNodeJoin(String nodeId) throws HyracksDataException;
-
-    /**
-     * Defines the logic of a {@link IFaultToleranceStrategy} when a node leaves the cluster.
-     *
-     * @param nodeId
-     * @throws HyracksDataException
-     */
-    void notifyNodeFailure(String nodeId) throws HyracksDataException;
-
-    /**
-     * Binds the fault tolerance strategy to {@code cluserManager}.
-     *
-     * @param clusterManager
-     */
-    void bindTo(IClusterStateManager clusterManager);
-
-    /**
-     * Processes {@code message} based on the message type.
-     *
-     * @param message
-     * @throws HyracksDataException
-     */
-    void process(INCLifecycleMessage message) throws HyracksDataException;
-
-    /**
-     * Constructs a fault tolerance strategy.
-     *
-     * @param replicationStrategy
-     * @param messageBroker
-     * @return
-     */
-    IFaultToleranceStrategy from(ICCServiceContext serviceCtx, IReplicationStrategy replicationStrategy);
-
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INCLifecycleMessage.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INCLifecycleMessage.java
index 87b0856..69432e9 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INCLifecycleMessage.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INCLifecycleMessage.java
@@ -22,20 +22,12 @@
 
 public interface INCLifecycleMessage extends IMessage {
 
-    public enum MessageType {
-        REPLAY_LOGS_REQUEST,
-        REPLAY_LOGS_RESPONSE,
-        PREPARE_FAILBACK_REQUEST,
-        PREPARE_FAILBACK_RESPONSE,
-        COMPLETE_FAILBACK_REQUEST,
-        COMPLETE_FAILBACK_RESPONSE,
-        STARTUP_TASK_REQUEST,
-        STARTUP_TASK_RESPONSE,
-        STARTUP_TASK_RESULT,
-        TAKEOVER_PARTITION_REQUEST,
-        TAKEOVER_PARTITION_RESPONSE,
-        TAKEOVER_METADATA_NODE_REQUEST,
-        TAKEOVER_METADATA_NODE_RESPONSE
+    enum MessageType {
+        REGISTRATION_TASKS_REQUEST,
+        REGISTRATION_TASKS_RESPONSE,
+        REGISTRATION_TASKS_RESULT,
+        METADATA_NODE_REQUEST,
+        METADATA_NODE_RESPONSE
     }
 
     /**
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INcLifecycleCoordinator.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INcLifecycleCoordinator.java
new file mode 100644
index 0000000..1a7c3c8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/INcLifecycleCoordinator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.replication;
+
+import org.apache.asterix.common.cluster.IClusterStateManager;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface INcLifecycleCoordinator {
+
+    /**
+     * Defines the logic of a {@link INcLifecycleCoordinator} when a node joins the cluster.
+     *
+     * @param nodeId
+     * @throws HyracksDataException
+     */
+    void notifyNodeJoin(String nodeId) throws HyracksDataException;
+
+    /**
+     * Defines the logic of a {@link INcLifecycleCoordinator} when a node leaves the cluster.
+     *
+     * @param nodeId
+     * @throws HyracksDataException
+     */
+    void notifyNodeFailure(String nodeId) throws HyracksDataException;
+
+    /**
+     * Binds the coordinator to {@code cluserManager}.
+     *
+     * @param clusterManager
+     */
+    void bindTo(IClusterStateManager clusterManager);
+
+    /**
+     * Processes {@code message} based on the message type.
+     *
+     * @param message
+     * @throws HyracksDataException
+     */
+    void process(INCLifecycleMessage message) throws HyracksDataException;
+
+    /**
+     * Performs the required steps to change the metadata node to {@code node}
+     *
+     * @param node
+     */
+    void notifyMetadataNodeChange(String node) throws HyracksDataException;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IPartitionReplica.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IPartitionReplica.java
new file mode 100644
index 0000000..761b2c6
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IPartitionReplica.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.replication;
+
+import org.apache.asterix.common.storage.ReplicaIdentifier;
+
+public interface IPartitionReplica {
+
+    enum PartitionReplicaStatus {
+        /* replica is in-sync with master */
+        IN_SYNC,
+        /* replica is still catching up with master */
+        CATCHING_UP,
+        /* replica is not connected with master */
+        DISCONNECTED
+    }
+
+    /**
+     * Gets the status of a replica.
+     *
+     * @return The status
+     */
+    PartitionReplicaStatus getStatus();
+
+    /**
+     * Gets the identifier of a replica
+     *
+     * @return The identifier
+     */
+    ReplicaIdentifier getIdentifier();
+
+    /**
+     * Notifies that failure {@code failure} occurred on this replica
+     *
+     * @param failure
+     */
+    void notifyFailure(Exception failure);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IRemoteRecoveryManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IRemoteRecoveryManager.java
deleted file mode 100644
index 51b826b..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IRemoteRecoveryManager.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public interface IRemoteRecoveryManager {
-
-    /**
-     * Performs the partitions takeover process from the {@code failedNode}
-     *
-     * @param failedNode
-     * @param partitions
-     * @throws IOException
-     * @throws ACIDException
-     */
-    public void takeoverPartitons(Integer[] partitions) throws IOException, ACIDException;
-
-    /**
-     * Construct failback plan and requests LSM disk components from active remote replicas.
-     */
-    public void startFailbackProcess();
-
-    /**
-     * Requests the remaining LSM disk components files from active remote replicas.
-     *
-     * @throws IOException
-     * @throws InterruptedException
-     */
-    public void completeFailbackProcess() throws IOException, InterruptedException;
-
-    /**
-     * Replays all committed jobs logs for {@code partitions}. Optionally, flushes all datasets
-     * to convert the replayed logs into LSM Components.
-     *
-     * @param partitions
-     * @param flush
-     * @throws HyracksDataException
-     */
-    void replayReplicaPartitionLogs(Set<Integer> partitions, boolean flush) throws HyracksDataException;
-
-    /**
-     * Performs the remote recovery plan by requesting data from each specified node
-     * for each partitions specified.
-     *
-     * @param recoveryPlan
-     * @throws HyracksDataException
-     */
-    void doRemoteRecoveryPlan(Map<String, Set<Integer>> recoveryPlan) throws HyracksDataException;
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicaResourcesManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicaResourcesManager.java
deleted file mode 100644
index 6ffa095..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicaResourcesManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.util.Set;
-
-public interface IReplicaResourcesManager {
-
-    /**
-     * @param partitions
-     * @return the minimum LSN of all indexes that belong to {@code partitions}.
-     */
-    public long getPartitionsMinLSN(Set<Integer> partitions);
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationDestination.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationDestination.java
new file mode 100644
index 0000000..2fe9de8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationDestination.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.replication;
+
+import java.net.InetSocketAddress;
+import java.util.Set;
+
+public interface IReplicationDestination {
+
+    /**
+     * Adds {@code replica} to this {@link IReplicationDestination}
+     *
+     * @param replica
+     */
+    void add(IPartitionReplica replica);
+
+    /**
+     * Removes {@code replica} from this {@link IReplicationDestination}
+     *
+     * @param replica
+     */
+    void remove(IPartitionReplica replica);
+
+    /**
+     * Notifies that failure {@code failure} occurred on this {@link IReplicationDestination}
+     *
+     * @param failure
+     */
+    void notifyFailure(Exception failure);
+
+    /**
+     * Gets the list of replicas on this {@link IReplicationDestination}
+     *
+     * @return the list of replicas
+     */
+    Set<IPartitionReplica> getReplicas();
+
+    /**
+     * Gets the location of this {@link IReplicationDestination}
+     *
+     * @return the location
+     */
+    InetSocketAddress getLocation();
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationManager.java
index b969bef..1da2980 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationManager.java
@@ -18,113 +18,44 @@
  */
 package org.apache.asterix.common.replication;
 
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Set;
-
 import org.apache.asterix.common.transactions.ILogRecord;
 import org.apache.hyracks.api.replication.IIOReplicationManager;
 
 public interface IReplicationManager extends IIOReplicationManager {
 
     /**
-     * Asynchronously sends a serialized version of the record to remote replicas.
-     *
-     * @param logRecord
-     *            The log record to be replicated,
-     * @throws InterruptedException
-     */
-    public void replicateLog(ILogRecord logRecord) throws InterruptedException;
-
-    /**
-     * Checks whether a log record has been replicated
-     *
-     * @param logRecord
-     *            the log to check for.
-     * @return true, if all ACKs were received from remote replicas.
-     */
-    public boolean hasBeenReplicated(ILogRecord logRecord);
-
-    /**
-     * Requests LSM components files from a remote replica.
-     *
-     * @param remoteReplicaId
-     *            The replica id to send the request to.
-     * @param partitionsToRecover
-     *            Get files that belong to those partitions.
-     * @param existingFiles
-     *            a list of already existing files on the requester
-     * @throws IOException
-     */
-    public void requestReplicaFiles(String remoteReplicaId, Set<Integer> partitionsToRecover,
-            Set<String> existingFiles) throws IOException;
-
-    /**
-     * Requests current maximum LSN from remote replicas.
-     *
-     * @param remoteReplicaIds
-     *            remote replicas to send the request to.
-     * @return The maximum of the received maximum LSNs.
-     * @throws IOException
-     */
-    public long getMaxRemoteLSN(Set<String> remoteReplicaIds) throws IOException;
-
-    /**
-     * @return The number of remote replicas that are in ACTIVE state.
-     */
-    public int getActiveReplicasCount();
-
-    /**
-     * @return The IDs of the remote replicas that are in DEAD state.
-     */
-    public Set<String> getDeadReplicasIds();
-
-    /**
-     * Starts processing of ASYNC replication jobs as well as Txn logs.
-     *
-     * @throws InterruptedException
-     */
-    public void startReplicationThreads() throws InterruptedException;
-
-    /**
-     * Checks and sets each remote replica state.
-     */
-    public void initializeReplicasState();
-
-    /**
-     * Updates remote replica (in-memory) information.
+     * Registers {@code replica}. After registration, the replica will be included in all replication events
      *
      * @param replica
-     *            the replica to update.
      */
-    public void updateReplicaInfo(Replica replica);
+    void register(IPartitionReplica replica);
 
     /**
-     * @return The IDs of the remote replicas that are in ACTIVE state.
-     */
-    public Set<String> getActiveReplicasIds();
-
-    /**
-     * Submits a ReplicaEvent to ReplicationEventsMonitor thread.
+     * Unregisters {@code replica} from replication events.
      *
-     * @param event
+     * @param replica
      */
-    public void reportReplicaEvent(ReplicaEvent event);
+    void unregister(IPartitionReplica replica);
 
     /**
-     * Sends a request to remote replicas to flush indexes that have LSN less than nonSharpCheckpointTargetLSN
+     * Notifies that failure {@code failure} occurred on {@code dest}
      *
-     * @param nonSharpCheckpointTargetLSN
-     * @throws IOException
+     * @param dest
+     * @param failure
      */
-    public void requestFlushLaggingReplicaIndexes(long nonSharpCheckpointTargetLSN) throws IOException;
+    void notifyFailure(IReplicationDestination dest, Exception failure);
 
     /**
-     * Transfers the contents of the {@code buffer} to active remote replicas.
-     * The transfer starts from the {@code buffer} current position to its limit.
-     * After the transfer, the {@code buffer} position will be its limit.
+     * Asynchronously sends a serialized version of the record to remote replicas.
      *
-     * @param buffer
+     * @param logRecord The log record to be replicated
+     * @throws InterruptedException
      */
-    public void replicateTxnLogBatch(ByteBuffer buffer);
+    void replicate(ILogRecord logRecord) throws InterruptedException;
+
+    /**
+     * @return the replication strategy
+     */
+    IReplicationStrategy getReplicationStrategy();
+
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationStrategy.java
index b3f1701..0ad8be2 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationStrategy.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationStrategy.java
@@ -18,11 +18,6 @@
  */
 package org.apache.asterix.common.replication;
 
-import java.util.Set;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
 public interface IReplicationStrategy {
 
     /**
@@ -30,30 +25,4 @@
      * @return True, if the dataset should be replicated. Otherwise false.
      */
     boolean isMatch(int datasetId);
-
-    /**
-     * @param nodeId
-     * @return The set of nodes that replicate data on {@code nodeId}.
-     */
-    Set<Replica> getRemotePrimaryReplicas(String nodeId);
-
-    /**
-     * @param node
-     * @return The set of nodes that {@code nodeId} replicates data to.
-     */
-    Set<Replica> getRemoteReplicas(String node);
-
-    /**
-     * @param nodeId
-     * @return true if {@code nodeId} has any remote primary replica or remote replica. Otherwise false.
-     */
-    default boolean isParticipant(String nodeId) {
-        return !getRemoteReplicas(nodeId).isEmpty() || !getRemotePrimaryReplicas(nodeId).isEmpty();
-    }
-
-    /**
-     * @param cluster
-     * @return A replication strategy based on the passed configurations.
-     */
-    IReplicationStrategy from(Cluster cluster) throws HyracksDataException;
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationThread.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationThread.java
deleted file mode 100644
index a88b82a..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/IReplicationThread.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.nio.channels.SocketChannel;
-
-import org.apache.asterix.common.transactions.LogRecord;
-
-public interface IReplicationThread extends Runnable {
-
-    /**
-     * Sends a notification to this thread that logRecord has been flushed.
-     *
-     * @param logRecord
-     *            The log that has been flushed.
-     */
-    public void notifyLogReplicationRequester(LogRecord logRecord);
-
-    /**
-     * @return The replication client socket channel.
-     */
-    public SocketChannel getReplicationClientSocket();
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/MetadataOnlyReplicationStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/MetadataOnlyReplicationStrategy.java
index bd4b32f..5733a60 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/MetadataOnlyReplicationStrategy.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/MetadataOnlyReplicationStrategy.java
@@ -18,77 +18,12 @@
  */
 package org.apache.asterix.common.replication;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class MetadataOnlyReplicationStrategy implements IReplicationStrategy {
 
-    private String metadataNodeId;
-    private Replica metadataPrimaryReplica;
-    private Set<Replica> metadataNodeReplicas;
-
     @Override
     public boolean isMatch(int datasetId) {
         return datasetId < MetadataIndexImmutableProperties.FIRST_AVAILABLE_USER_DATASET_ID && datasetId >= 0;
     }
-
-    @Override
-    public Set<Replica> getRemoteReplicas(String nodeId) {
-        if (nodeId.equals(metadataNodeId)) {
-            return metadataNodeReplicas;
-        }
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<Replica> getRemotePrimaryReplicas(String nodeId) {
-        if (metadataNodeReplicas.stream().map(Replica::getId).filter(replicaId -> replicaId.equals(nodeId))
-                .count() != 0) {
-            return new HashSet<>(Arrays.asList(metadataPrimaryReplica));
-        }
-        return Collections.emptySet();
-    }
-
-    @Override
-    public MetadataOnlyReplicationStrategy from(Cluster cluster) throws HyracksDataException {
-        if (cluster.getMetadataNode() == null) {
-            throw new RuntimeDataException(ErrorCode.INVALID_CONFIGURATION, "Metadata node must be specified.");
-        }
-
-        Node metadataNode = ClusterProperties.INSTANCE.getNodeById(cluster.getMetadataNode());
-        if (metadataNode == null) {
-            throw new IllegalStateException("Invalid metadata node specified");
-        }
-
-        if (cluster.getHighAvailability().getFaultTolerance().getReplica() == null
-                || cluster.getHighAvailability().getFaultTolerance().getReplica().getNodeId() == null
-                || cluster.getHighAvailability().getFaultTolerance().getReplica().getNodeId().isEmpty()) {
-            throw new RuntimeDataException(ErrorCode.INVALID_CONFIGURATION,
-                    "One or more replicas must be specified for metadata node.");
-        }
-
-        final Set<Replica> replicas = new HashSet<>();
-        for (String nodeId : cluster.getHighAvailability().getFaultTolerance().getReplica().getNodeId()) {
-            Node node = ClusterProperties.INSTANCE.getNodeById(nodeId);
-            if (node == null) {
-                throw new RuntimeDataException(ErrorCode.INVALID_CONFIGURATION, "Invalid replica specified: " + nodeId);
-            }
-            replicas.add(new Replica(node));
-        }
-        MetadataOnlyReplicationStrategy st = new MetadataOnlyReplicationStrategy();
-        st.metadataNodeId = cluster.getMetadataNode();
-        st.metadataPrimaryReplica = new Replica(metadataNode);
-        st.metadataNodeReplicas = replicas;
-        return st;
-    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/NoReplicationStrategy.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/NoReplicationStrategy.java
index 43347f6..c3d9ced 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/NoReplicationStrategy.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/NoReplicationStrategy.java
@@ -18,35 +18,10 @@
  */
 package org.apache.asterix.common.replication;
 
-import java.util.Collections;
-import java.util.Set;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-
 public class NoReplicationStrategy implements IReplicationStrategy {
 
     @Override
     public boolean isMatch(int datasetId) {
         return false;
     }
-
-    @Override
-    public boolean isParticipant(String nodeId) {
-        return false;
-    }
-
-    @Override
-    public Set<Replica> getRemotePrimaryReplicas(String nodeId) {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Set<Replica> getRemoteReplicas(String node) {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public NoReplicationStrategy from(Cluster cluster) {
-        return new NoReplicationStrategy();
-    }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/Replica.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/Replica.java
deleted file mode 100644
index 267a22d..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/Replica.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.InetSocketAddress;
-
-import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.event.schema.cluster.Node;
-
-public class Replica {
-
-    public enum ReplicaState {
-        ACTIVE,
-        DEAD,
-        UNKNOWN
-    }
-
-    private final Node node;
-    private ReplicaState state = ReplicaState.UNKNOWN;
-
-    public Replica(Node node) {
-        this.node = new Node();
-        this.node.setId(node.getId());
-        this.node.setClusterIp(node.getClusterIp());
-    }
-
-    public ReplicaState getState() {
-        return state;
-    }
-
-    public void setState(ReplicaState state) {
-        this.state = state;
-    }
-
-    public Node getNode() {
-        return node;
-    }
-
-    public String getId() {
-        return node.getId();
-    }
-
-    public InetSocketAddress getAddress(ReplicationProperties asterixReplicationProperties) {
-        String replicaIPAddress = node.getClusterIp();
-        int replicationPort = asterixReplicationProperties.getDataReplicationPort(node.getId());
-        return InetSocketAddress.createUnresolved(replicaIPAddress, replicationPort);
-    }
-
-    public static Replica create(DataInput input) throws IOException {
-        Node node = new Node();
-        Replica replica = new Replica(node);
-        replica.readFields(input);
-        return replica;
-    }
-
-    public void writeFields(DataOutput output) throws IOException {
-        output.writeUTF(node.getId());
-        output.writeUTF(node.getClusterIp());
-        output.writeInt(state.ordinal());
-    }
-
-    public void readFields(DataInput input) throws IOException {
-        this.node.setId(input.readUTF());
-        this.node.setClusterIp(input.readUTF());
-        this.state = ReplicaState.values()[input.readInt()];
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        writeFields(dos);
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicaEvent.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicaEvent.java
deleted file mode 100644
index ae02ca9..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicaEvent.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.replication;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-
-public class ReplicaEvent {
-
-    Replica replica;
-    ClusterEventType eventType;
-
-    public ReplicaEvent(Replica replica, ClusterEventType eventType) {
-        this.replica = replica;
-        this.eventType = eventType;
-    }
-
-    public Replica getReplica() {
-        return replica;
-    }
-
-    public void setReplica(Replica replica) {
-        this.replica = replica;
-    }
-
-    public ClusterEventType getEventType() {
-        return eventType;
-    }
-
-    public void setEventType(ClusterEventType eventType) {
-        this.eventType = eventType;
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        replica.writeFields(dos);
-        dos.writeInt(eventType.ordinal());
-    }
-
-    public static ReplicaEvent create(DataInput input) throws IOException {
-        Replica replica = Replica.create(input);
-        ClusterEventType eventType = ClusterEventType.values()[input.readInt()];
-        ReplicaEvent event = new ReplicaEvent(replica, eventType);
-        return event;
-    }
-
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicationStrategyFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicationStrategyFactory.java
index 703ddcc..8d51a99 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicationStrategyFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/replication/ReplicationStrategyFactory.java
@@ -21,46 +21,31 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.exceptions.RuntimeDataException;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
 public class ReplicationStrategyFactory {
 
-    private static final Map<String, Class<? extends IReplicationStrategy>>
-    BUILT_IN_REPLICATION_STRATEGY = new HashMap<>();
+    private static final Map<String, Class<? extends IReplicationStrategy>> BUILT_IN_REPLICATION_STRATEGY =
+            new HashMap<>();
 
     static {
-        BUILT_IN_REPLICATION_STRATEGY.put("no_replication", NoReplicationStrategy.class);
-        BUILT_IN_REPLICATION_STRATEGY.put("chained_declustering", ChainedDeclusteringReplicationStrategy.class);
-        BUILT_IN_REPLICATION_STRATEGY.put("metadata_only", MetadataOnlyReplicationStrategy.class);
+        BUILT_IN_REPLICATION_STRATEGY.put("none", NoReplicationStrategy.class);
+        BUILT_IN_REPLICATION_STRATEGY.put("all", AllDatasetsReplicationStrategy.class);
+        BUILT_IN_REPLICATION_STRATEGY.put("metadata", MetadataOnlyReplicationStrategy.class);
     }
 
     private ReplicationStrategyFactory() {
         throw new AssertionError();
     }
 
-    public static IReplicationStrategy create(Cluster cluster) throws HyracksDataException {
-        boolean highAvailabilityEnabled = cluster.getHighAvailability() != null
-                && cluster.getHighAvailability().getEnabled() != null
-                && Boolean.valueOf(cluster.getHighAvailability().getEnabled());
-
-        if (!highAvailabilityEnabled || cluster.getHighAvailability().getDataReplication() == null
-                || cluster.getHighAvailability().getDataReplication().getStrategy() == null) {
-            return new NoReplicationStrategy();
-        }
-        String strategyName = cluster.getHighAvailability().getDataReplication().getStrategy().toLowerCase();
+    public static IReplicationStrategy create(String name) {
+        String strategyName = name.toLowerCase();
         if (!BUILT_IN_REPLICATION_STRATEGY.containsKey(strategyName)) {
-            throw new RuntimeDataException(ErrorCode.UNSUPPORTED_REPLICATION_STRATEGY,
-                    String.format("%s. Available strategies: %s", strategyName,
-                            BUILT_IN_REPLICATION_STRATEGY.keySet().toString()));
+            throw new IllegalStateException("Couldn't find strategy with name: " + name);
         }
         Class<? extends IReplicationStrategy> clazz = BUILT_IN_REPLICATION_STRATEGY.get(strategyName);
         try {
-            return clazz.newInstance().from(cluster);
+            return clazz.newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
-            throw new RuntimeDataException(ErrorCode.INSTANTIATION_ERROR, e, clazz.getName());
+            throw new IllegalStateException("Couldn't instantiated replication strategy: " + name, e);
         }
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/DatasetResourceReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/DatasetResourceReference.java
new file mode 100644
index 0000000..906a8b7
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/DatasetResourceReference.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.nio.file.Paths;
+
+import org.apache.asterix.common.dataflow.DatasetLocalResource;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.hyracks.storage.common.LocalResource;
+
+public class DatasetResourceReference extends ResourceReference {
+
+    private int datasetId;
+    private int partitionId;
+    private long resourceId;
+
+    private DatasetResourceReference() {
+        super();
+    }
+
+    public static DatasetResourceReference of(LocalResource localResource) {
+        return parse(localResource);
+    }
+
+    public int getDatasetId() {
+        return datasetId;
+    }
+
+    public int getPartitionId() {
+        return partitionId;
+    }
+
+    public long getResourceId() {
+        return resourceId;
+    }
+
+    private static DatasetResourceReference parse(LocalResource localResource) {
+        final DatasetResourceReference datasetResourceReference = new DatasetResourceReference();
+        final String filePath = Paths.get(localResource.getPath(), StorageConstants.METADATA_FILE_NAME).toString();
+        parse(datasetResourceReference, filePath);
+        assignIds(localResource, datasetResourceReference);
+        return datasetResourceReference;
+    }
+
+    private static void assignIds(LocalResource localResource, DatasetResourceReference lrr) {
+        final DatasetLocalResource dsResource = (DatasetLocalResource) localResource.getResource();
+        lrr.datasetId = dsResource.getDatasetId();
+        lrr.partitionId = dsResource.getPartition();
+        lrr.resourceId = localResource.getId();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o != null && o instanceof ResourceReference) {
+            ResourceReference that = (ResourceReference) o;
+            return getRelativePath().toString().equals(that.getRelativePath().toString());
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return getRelativePath().toString().hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return getRelativePath().toString();
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManager.java
new file mode 100644
index 0000000..b008f11
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManager.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.util.Optional;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface IIndexCheckpointManager {
+
+    /**
+     * Initializes the first checkpoint of an index with low watermark {@code lsn}
+     *
+     * @param lsn
+     * @throws HyracksDataException
+     */
+    void init(long lsn) throws HyracksDataException;
+
+    /**
+     * Called when a new LSM disk component is flushed. When called,  the index checkpoiint is updated
+     * with the latest valid {@code componentTimestamp} and low watermark {@code lsn}
+     *
+     * @param componentTimestamp
+     * @param lsn
+     * @throws HyracksDataException
+     */
+    void flushed(String componentTimestamp, long lsn) throws HyracksDataException;
+
+    /**
+     * Called when a new LSM disk component is replicated from master. When called,  the index checkpoiint is updated
+     * with the latest valid {@code componentTimestamp} and the local lsn mapping of {@code masterLsn} is set as the
+     * new low watermark.
+     *
+     * @param componentTimestamp
+     * @param masterLsn
+     * @throws HyracksDataException
+     */
+    void replicated(String componentTimestamp, long masterLsn) throws HyracksDataException;
+
+    /**
+     * Called when a flush log is received and replicated from master. The mapping between
+     * {@code masterLsn} and {@code localLsn} is updated in the checkpoint.
+     *
+     * @param masterLsn
+     * @param localLsn
+     * @throws HyracksDataException
+     */
+    void masterFlush(long masterLsn, long localLsn) throws HyracksDataException;
+
+    /**
+     * The index low watermark
+     *
+     * @return The low watermark
+     * @throws HyracksDataException
+     */
+    long getLowWatermark() throws HyracksDataException;
+
+    /**
+     * True if a mapping exists between {@code masterLsn} and a localLsn. Otherwise false.
+     *
+     * @param masterLsn
+     * @return True if the mapping exists. Otherwise false.
+     * @throws HyracksDataException
+     */
+    boolean isFlushed(long masterLsn) throws HyracksDataException;
+
+    /**
+     * Deletes all checkpoints
+     */
+    void delete();
+
+    /**
+     * Gets the index last valid component timestamp if the index has any components. Otherwise {@link Optional#empty()}
+     *
+     * @return the index last valid component timestamp
+     */
+    Optional<String> getValidComponentTimestamp();
+
+    /**
+     * Gets the number of valid checkpoints the index has.
+     *
+     * @return the number of valid checkpoints
+     */
+    int getCheckpointCount();
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManagerProvider.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManagerProvider.java
new file mode 100644
index 0000000..e6cef57
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IIndexCheckpointManagerProvider.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface IIndexCheckpointManagerProvider {
+
+    /**
+     * Gets {@link IIndexCheckpointManager} for the index referenced by {@code ref}
+     *
+     * @param ref
+     * @return The index checkpoint manager.
+     * @throws HyracksDataException
+     */
+    IIndexCheckpointManager get(ResourceReference ref) throws HyracksDataException;
+
+    /**
+     * Closes any resources used by the index checkpoint manager referenced by {@code ref}
+     *
+     * @param ref
+     */
+    void close(ResourceReference ref);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IReplicaManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IReplicaManager.java
new file mode 100644
index 0000000..b2deb1e
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IReplicaManager.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface IReplicaManager {
+
+    /**
+     * Adds a replica with the specified {@code id}
+     *
+     * @param id
+     */
+    void addReplica(ReplicaIdentifier id);
+
+    /**
+     * Removes the replica with the specified {@code id}
+     *
+     * @param id
+     */
+    void removeReplica(ReplicaIdentifier id);
+
+    /**
+     * The existing replicas of the partition {@code partition}
+     *
+     * @param partition
+     * @return The list of replicas
+     */
+    List<IPartitionReplica> getReplicas(int partition);
+
+    /**
+     * Gets the list of partition to which the current node is
+     * the master of.
+     *
+     * @return The list of partition
+     */
+    Set<Integer> getPartitions();
+
+    /**
+     * Promotes a partition by making this node its master replica
+     *
+     * @param partition
+     */
+    void promote(int partition) throws HyracksDataException;
+
+    /**
+     * Releases a partition by flushing all its resources to disk
+     * then removing all partition replicas.
+     *
+     * @param partition
+     * @throws HyracksDataException
+     */
+    void release(int partition) throws HyracksDataException;
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexCheckpoint.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexCheckpoint.java
new file mode 100644
index 0000000..6e845e1
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexCheckpoint.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class IndexCheckpoint {
+
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private static final long INITIAL_CHECKPOINT_ID = 0;
+    private long id;
+    private String validComponentTimestamp;
+    private long lowWatermark;
+    private Map<Long, Long> masterNodeFlushMap;
+
+    public static IndexCheckpoint first(long lowWatermark) {
+        IndexCheckpoint firstCheckpoint = new IndexCheckpoint();
+        firstCheckpoint.id = INITIAL_CHECKPOINT_ID;
+        firstCheckpoint.lowWatermark = lowWatermark;
+        firstCheckpoint.validComponentTimestamp = null;
+        firstCheckpoint.masterNodeFlushMap = new HashMap<>();
+        return firstCheckpoint;
+    }
+
+    public static IndexCheckpoint next(IndexCheckpoint latest, long lowWatermark, String validComponentTimestamp) {
+        if (lowWatermark < latest.getLowWatermark()) {
+            throw new IllegalStateException("Low watermark should always be increasing");
+        }
+        IndexCheckpoint next = new IndexCheckpoint();
+        next.id = latest.getId() + 1;
+        next.lowWatermark = lowWatermark;
+        next.validComponentTimestamp = validComponentTimestamp;
+        next.masterNodeFlushMap = latest.getMasterNodeFlushMap();
+        // remove any lsn from the map that wont be used anymore
+        next.masterNodeFlushMap.values().removeIf(lsn -> lsn <= lowWatermark);
+        return next;
+    }
+
+    @JsonCreator
+    private IndexCheckpoint() {
+    }
+
+    public String getValidComponentTimestamp() {
+        return validComponentTimestamp;
+    }
+
+    public long getLowWatermark() {
+        return lowWatermark;
+    }
+
+    public Map<Long, Long> getMasterNodeFlushMap() {
+        return masterNodeFlushMap;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public String asJson() throws HyracksDataException {
+        try {
+            return OBJECT_MAPPER.writeValueAsString(this);
+        } catch (JsonProcessingException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static IndexCheckpoint fromJson(String json) throws HyracksDataException {
+        try {
+            return OBJECT_MAPPER.readValue(json, IndexCheckpoint.class);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexFileProperties.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexFileProperties.java
deleted file mode 100644
index ca6968f..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexFileProperties.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.storage;
-
-import java.io.File;
-
-import org.apache.asterix.common.utils.StoragePathUtil;
-
-/**
- * A holder class for an index file properties.
- */
-public class IndexFileProperties {
-
-    private final String fileName;
-    private final String idxName;
-    private final String dataverseName;
-    private final int partitionId;
-    private final int datasetId;
-
-    public IndexFileProperties(int partitionId, String dataverseName, String idxName, String fileName, int datasetId) {
-        this.partitionId = partitionId;
-        this.dataverseName = dataverseName;
-        this.idxName = idxName;
-        this.fileName = fileName;
-        this.datasetId = datasetId;
-    }
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public String getIdxName() {
-        return idxName;
-    }
-
-    public String getDataverseName() {
-        return dataverseName;
-    }
-
-    public int getPartitionId() {
-        return partitionId;
-    }
-
-    public int getDatasetId() {
-        return datasetId;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(StoragePathUtil.PARTITION_DIR_PREFIX + partitionId + File.separator);
-        sb.append(dataverseName + File.separator);
-        sb.append(idxName + File.separator);
-        sb.append(fileName);
-        sb.append(" [Dataset ID: " + datasetId + "]");
-        return sb.toString();
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexPathElements.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexPathElements.java
new file mode 100644
index 0000000..4d0f3dd
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/IndexPathElements.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+public class IndexPathElements {
+
+    private final String datasetName;
+    private final String indexName;
+    private final String rebalanceCount;
+
+    public IndexPathElements(String datasetName, String indexName, String rebalanceCount) {
+        this.datasetName = datasetName;
+        this.indexName = indexName;
+        this.rebalanceCount = rebalanceCount;
+    }
+
+    public String getDatasetName() {
+        return datasetName;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public String getRebalanceCount() {
+        return rebalanceCount;
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ReplicaIdentifier.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ReplicaIdentifier.java
new file mode 100644
index 0000000..01ffba6
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ReplicaIdentifier.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.net.InetSocketAddress;
+
+public class ReplicaIdentifier {
+
+    private final int partition;
+    private final InetSocketAddress location;
+    private final String id;
+
+    private ReplicaIdentifier(int partition, InetSocketAddress location) {
+        this.partition = partition;
+        this.location = location;
+        id = partition + "@" + location.toString();
+    }
+
+    public static ReplicaIdentifier of(int partition, InetSocketAddress location) {
+        return new ReplicaIdentifier(partition, location);
+    }
+
+    public int getPartition() {
+        return partition;
+    }
+
+    public InetSocketAddress getLocation() {
+        return location;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        ReplicaIdentifier that = (ReplicaIdentifier) o;
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
new file mode 100644
index 0000000..52cf4a0
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/storage/ResourceReference.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.storage;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.asterix.common.utils.StorageConstants;
+
+public class ResourceReference {
+
+    protected String root;
+    protected String partition;
+    protected String dataverse;
+    protected String dataset;
+    protected String rebalance;
+    protected String index;
+    protected String name;
+
+    protected ResourceReference() {
+    }
+
+    public static ResourceReference of(String localResourcePath) {
+        ResourceReference lrr = new ResourceReference();
+        parse(lrr, localResourcePath);
+        return lrr;
+    }
+
+    public String getPartition() {
+        return partition;
+    }
+
+    public String getDataverse() {
+        return dataverse;
+    }
+
+    public String getDataset() {
+        return dataset;
+    }
+
+    public String getRebalance() {
+        return rebalance;
+    }
+
+    public String getIndex() {
+        return index;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Path getRelativePath() {
+        return Paths.get(root, partition, dataverse, dataset, rebalance, index);
+    }
+
+    public Path getFileRelativePath() {
+        return Paths.get(root, partition, dataverse, dataset, rebalance, index, name);
+    }
+
+    protected static void parse(ResourceReference ref, String path) {
+        // format: root/partition/dataverse/dataset/rebalanceCount/index/fileName
+        final String[] tokens = path.split(File.separator);
+        if (tokens.length < 6) {
+            throw new IllegalStateException("Unrecognized path structure: " + path);
+        }
+        int offset = tokens.length;
+        ref.name = tokens[--offset];
+        ref.index = tokens[--offset];
+        ref.rebalance = tokens[--offset];
+        ref.dataset = tokens[--offset];
+        ref.dataverse = tokens[--offset];
+        ref.partition = tokens[--offset];
+        ref.root = tokens[--offset];
+    }
+
+    public int getPartitionNum() {
+        return Integer.parseInt(partition.substring(StorageConstants.PARTITION_DIR_PREFIX.length()));
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o != null && o instanceof ResourceReference) {
+            ResourceReference that = (ResourceReference) o;
+            return getRelativePath().toString().equals(that.getRelativePath().toString());
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return getRelativePath().toString().hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return getRelativePath().toString();
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallback.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallback.java
index 9844344..098bbd4 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallback.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallback.java
@@ -31,14 +31,16 @@
     protected final ITransactionContext txnCtx;
     protected final ILockManager lockManager;
     protected final long[] longHashes;
+    protected final long resourceId;
 
-    public AbstractOperationCallback(DatasetId datasetId, int[] primaryKeyFields, ITransactionContext txnCtx,
-            ILockManager lockManager) {
+    public AbstractOperationCallback(DatasetId datasetId, long resourceId, int[] primaryKeyFields,
+            ITransactionContext txnCtx, ILockManager lockManager) {
         this.datasetId = datasetId;
+        this.resourceId = resourceId;
         this.primaryKeyFields = primaryKeyFields;
         this.txnCtx = txnCtx;
         this.lockManager = lockManager;
-        this.longHashes = new long[2];
+        longHashes = new long[2];
     }
 
     public int computePrimaryKeyHashValue(ITupleReference tuple, int[] primaryKeyFields) {
@@ -46,12 +48,11 @@
         return Math.abs((int) longHashes[0]);
     }
 
-    public void incrementLocalNumActiveOperations() {
-        txnCtx.incrementNumActiveOperations();
+    public void beforeOperation() {
+        txnCtx.beforeOperation(resourceId);
     }
 
-    public void decrementLocalNumActiveOperations() {
-        txnCtx.decrementNumActiveOperations();
+    public void afterOperation() {
+        txnCtx.afterOperation(resourceId);
     }
-
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java
index d1d869e..ce6671b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/AbstractOperationCallbackFactory.java
@@ -26,15 +26,13 @@
 public abstract class AbstractOperationCallbackFactory implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    protected final JobId jobId;
     protected final int datasetId;
     protected final int[] primaryKeyFields;
     protected final ITransactionSubsystemProvider txnSubsystemProvider;
     protected final byte resourceType;
 
-    public AbstractOperationCallbackFactory(JobId jobId, int datasetId, int[] primaryKeyFields,
+    public AbstractOperationCallbackFactory(int datasetId, int[] primaryKeyFields,
             ITransactionSubsystemProvider txnSubsystemProvider, byte resourceType) {
-        this.jobId = jobId;
         this.datasetId = datasetId;
         this.primaryKeyFields = primaryKeyFields;
         this.txnSubsystemProvider = txnSubsystemProvider;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java
index a4c41df..825c7d1 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/Checkpoint.java
@@ -31,19 +31,19 @@
 
     private final long checkpointLsn;
     private final long minMCTFirstLsn;
-    private final int maxJobId;
+    private final long maxTxnId;
     private final long timeStamp;
     private final boolean sharp;
     private final int storageVersion;
 
     @JsonCreator
     public Checkpoint(@JsonProperty("checkpointLsn") long checkpointLsn,
-            @JsonProperty("minMCTFirstLsn") long minMCTFirstLsn, @JsonProperty("maxJobId") int maxJobId,
+            @JsonProperty("minMCTFirstLsn") long minMCTFirstLsn, @JsonProperty("maxJobId") long maxTxnId,
             @JsonProperty("timeStamp") long timeStamp, @JsonProperty("sharp") boolean sharp,
             @JsonProperty("storageVersion") int storageVersion) {
         this.checkpointLsn = checkpointLsn;
         this.minMCTFirstLsn = minMCTFirstLsn;
-        this.maxJobId = maxJobId;
+        this.maxTxnId = maxTxnId;
         this.timeStamp = timeStamp;
         this.sharp = sharp;
         this.storageVersion = storageVersion;
@@ -57,8 +57,8 @@
         return minMCTFirstLsn;
     }
 
-    public int getMaxJobId() {
-        return maxJobId;
+    public long getMaxTxnId() {
+        return maxTxnId;
     }
 
     public long getTimeStamp() {
@@ -108,7 +108,7 @@
         final int prime = 31;
         int result = 1;
         result = prime * result + (int) (checkpointLsn ^ (checkpointLsn >>> 32));
-        result = prime * result + maxJobId;
+        result = prime * result + Long.hashCode(maxTxnId);
         result = prime * result + (int) (minMCTFirstLsn ^ (minMCTFirstLsn >>> 32));
         result = prime * result + (sharp ? 1231 : 1237);
         result = prime * result + storageVersion;
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IAppRuntimeContextProvider.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IAppRuntimeContextProvider.java
deleted file mode 100644
index 229fb6d..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IAppRuntimeContextProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.transactions;
-
-import java.util.concurrent.ExecutorService;
-
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
-import org.apache.hyracks.storage.common.ILocalResourceRepository;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
-
-public interface IAppRuntimeContextProvider {
-
-    ExecutorService getThreadExecutor();
-
-    IBufferCache getBufferCache();
-
-    ITransactionSubsystem getTransactionSubsystem();
-
-    IDatasetLifecycleManager getDatasetLifecycleManager();
-
-    double getBloomFilterFalsePositiveRate();
-
-    ILSMOperationTracker getLSMBTreeOperationTracker(int datasetID);
-
-    ILSMIOOperationScheduler getLSMIOScheduler();
-
-    ILocalResourceRepository getLocalResourceRepository();
-
-    IIOManager getIOManager();
-
-    INcApplicationContext getAppContext();
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogBuffer.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogBuffer.java
index 6bdce73..b4a7d38 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogBuffer.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogBuffer.java
@@ -62,11 +62,6 @@
     void reset();
 
     /**
-     * Set current page to be the last page of the associated file
-     */
-    void setLastPage();
-
-    /**
      * stops the log buffer
      */
     void stop();
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogManager.java
index aa018ba..d7e0885 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogManager.java
@@ -63,14 +63,6 @@
     public String getNodeId();
 
     /**
-     * Delete all log files and start new log partition > LSNtoStartFrom
-     *
-     * @param LSNtoStartFrom
-     * @throws IOException
-     */
-    public void renewLogFilesAndStartFromLSN(long LSNtoStartFrom) throws IOException;
-
-    /**
      * @return the log page size in bytes
      */
     public int getLogPageSize();
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogReader.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogReader.java
index da188e3..8539e2b 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogReader.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogReader.java
@@ -18,18 +18,34 @@
  */
 package org.apache.asterix.common.transactions;
 
-import org.apache.asterix.common.exceptions.ACIDException;
-
 public interface ILogReader {
 
-    public void initializeScan(long beginLSN) throws ACIDException;
+    /**
+     * Sets the log reader position at log sequence number with value {@code lsn}.
+     *
+     * @param lsn
+     */
+    void setPosition(long lsn);
 
-    //for scanning
-    public ILogRecord next() throws ACIDException;
+    /**
+     * Reads and returns the log record located at the log reader current position. After reading the log record,
+     * the log reader position is incremented by the size of the read log.
+     *
+     * @return the log record
+     */
+    ILogRecord next();
 
-    //for random reading
-    public ILogRecord read(long readLSN) throws ACIDException;
+    /**
+     * Reads and returns the log record with log sequence number {@code lsn}.
+     *
+     * @param lsn
+     * @return The log record
+     */
+    ILogRecord read(long lsn);
 
-    public void close() throws ACIDException;
+    /**
+     * Closes the log reader and any resources used.
+     */
+    void close();
 
-}
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRecord.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRecord.java
index 6ee0980..7ddfdfb 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRecord.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRecord.java
@@ -20,7 +20,6 @@
 
 import java.nio.ByteBuffer;
 
-import org.apache.asterix.common.replication.IReplicationThread;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
 public interface ILogRecord {
@@ -32,36 +31,33 @@
         LARGE_RECORD
     }
 
-    public static final int CHKSUM_LEN = Long.BYTES;
-    public static final int FLDCNT_LEN = Integer.BYTES;
-    public static final int DS_LEN = Integer.BYTES;
-    public static final int LOG_SOURCE_LEN = Byte.BYTES;
-    public static final int LOGRCD_SZ_LEN = Integer.BYTES;
-    public static final int NEWOP_LEN = Byte.BYTES;
-    public static final int NEWVALSZ_LEN = Integer.BYTES;
-    public static final int PKHASH_LEN = Integer.BYTES;
-    public static final int PKSZ_LEN = Integer.BYTES;
-    public static final int PRVLSN_LEN = Long.BYTES;
-    public static final int RS_PARTITION_LEN = Integer.BYTES;
-    public static final int RSID_LEN = Long.BYTES;
-    public static final int SEQ_NUM_LEN = Long.BYTES;
-    public static final int TYPE_LEN = Byte.BYTES;
-    public static final int UUID_LEN = Long.BYTES;
+    int CHKSUM_LEN = Long.BYTES;
+    int FLDCNT_LEN = Integer.BYTES;
+    int DS_LEN = Integer.BYTES;
+    int LOG_SOURCE_LEN = Byte.BYTES;
+    int LOGRCD_SZ_LEN = Integer.BYTES;
+    int NEWOP_LEN = Byte.BYTES;
+    int NEWVALSZ_LEN = Integer.BYTES;
+    int PKHASH_LEN = Integer.BYTES;
+    int PKSZ_LEN = Integer.BYTES;
+    int PRVLSN_LEN = Long.BYTES;
+    int RS_PARTITION_LEN = Integer.BYTES;
+    int RSID_LEN = Long.BYTES;
+    int SEQ_NUM_LEN = Long.BYTES;
+    int TYPE_LEN = Byte.BYTES;
+    int UUID_LEN = Long.BYTES;
 
-    public static final int ALL_RECORD_HEADER_LEN = LOG_SOURCE_LEN + TYPE_LEN + JobId.BYTES;
-    public static final int ENTITYCOMMIT_UPDATE_HEADER_LEN = RS_PARTITION_LEN + DatasetId.BYTES + PKHASH_LEN + PKSZ_LEN;
-    public static final int UPDATE_LSN_HEADER = RSID_LEN + LOGRCD_SZ_LEN;
-    public static final int UPDATE_BODY_HEADER = FLDCNT_LEN + NEWOP_LEN + NEWVALSZ_LEN;
-    // What are these fields? vvvvv
-    public static final int REMOTE_FLUSH_LOG_EXTRA_FIELDS_LEN = Long.BYTES + Integer.BYTES + Integer.BYTES;
+    int ALL_RECORD_HEADER_LEN = LOG_SOURCE_LEN + TYPE_LEN + TxnId.BYTES;
+    int ENTITYCOMMIT_UPDATE_HEADER_LEN = RS_PARTITION_LEN + DatasetId.BYTES + PKHASH_LEN + PKSZ_LEN;
+    int UPDATE_LSN_HEADER = RSID_LEN + LOGRCD_SZ_LEN;
+    int UPDATE_BODY_HEADER = FLDCNT_LEN + NEWOP_LEN + NEWVALSZ_LEN;
 
-    // How are the following computed?
-    public static final int JOB_TERMINATE_LOG_SIZE = ALL_RECORD_HEADER_LEN + CHKSUM_LEN;
-    public static final int ENTITY_COMMIT_LOG_BASE_SIZE = 30; // ALL_RECORD_HEADER_LEN + CHKSUM_LEN +?
-    public static final int UPDATE_LOG_BASE_SIZE = 51; // ALL_RECORD_HEADER_LEN + CHKSUM_LEN +?
-    public static final int FLUSH_LOG_SIZE = 18; // ALL_RECORD_HEADER_LEN + CHKSUM_LEN +?
-    public static final int WAIT_LOG_SIZE = ALL_RECORD_HEADER_LEN + CHKSUM_LEN;
-    public static final int MARKER_BASE_LOG_SIZE =
+    int JOB_TERMINATE_LOG_SIZE = ALL_RECORD_HEADER_LEN + CHKSUM_LEN;
+    int ENTITY_COMMIT_LOG_BASE_SIZE = ALL_RECORD_HEADER_LEN + ENTITYCOMMIT_UPDATE_HEADER_LEN + CHKSUM_LEN;
+    int UPDATE_LOG_BASE_SIZE = ENTITY_COMMIT_LOG_BASE_SIZE + UPDATE_LSN_HEADER + UPDATE_BODY_HEADER;
+    int FLUSH_LOG_SIZE = ALL_RECORD_HEADER_LEN + DatasetId.BYTES + CHKSUM_LEN;
+    int WAIT_LOG_SIZE = ALL_RECORD_HEADER_LEN + CHKSUM_LEN;
+    int MARKER_BASE_LOG_SIZE =
             ALL_RECORD_HEADER_LEN + CHKSUM_LEN + DS_LEN + RS_PARTITION_LEN + PRVLSN_LEN + LOGRCD_SZ_LEN;
 
     public RecordReadStatus readLogRecord(ByteBuffer buffer);
@@ -80,9 +76,9 @@
 
     public void setLogType(byte logType);
 
-    public int getJobId();
+    long getTxnId();
 
-    public void setJobId(int jobId);
+    void setTxnId(long jobId);
 
     public int getDatasetId();
 
@@ -132,20 +128,14 @@
 
     public void setPKValue(ITupleReference PKValue);
 
-    public String getNodeId();
-
     public void readRemoteLog(ByteBuffer buffer);
 
-    public void setReplicationThread(IReplicationThread replicationThread);
-
     public void setLogSource(byte logSource);
 
     public byte getLogSource();
 
     public int getRemoteLogSize();
 
-    public void setNodeId(String nodeId);
-
     public int getResourcePartition();
 
     public void setResourcePartition(int resourcePartition);
@@ -153,7 +143,7 @@
     public void setReplicated(boolean replicated);
 
     /**
-     * @return a flag indicating whether the log record should be sent to remote replicas
+     * @return a flag indicating whether the log was replicated
      */
     public boolean isReplicated();
 
@@ -172,4 +162,18 @@
     public void logAppended(long lsn);
 
     public long getPreviousMarkerLSN();
+
+    /**
+     * Sets flag indicating if this log should be replicated or not
+     *
+     * @param replicate
+     */
+    void setReplicate(boolean replicate);
+
+    /**
+     * Gets a flag indicating if this log should be replicated or not
+     *
+     * @return the flag
+     */
+    boolean isReplicate();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRequester.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRequester.java
new file mode 100644
index 0000000..8e874a2
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILogRequester.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.transactions;
+
+public interface ILogRequester {
+
+    /**
+     * Sends a notification to the log requester that {@code logRecord} has been flushed.
+     *
+     * @param logRecord The log that has been flushed.
+     */
+    void notifyFlushed(ILogRecord logRecord);
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILongBlockFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILongBlockFactory.java
new file mode 100644
index 0000000..b5ee0a8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ILongBlockFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.transactions;
+
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+
+public interface ILongBlockFactory {
+    /**
+     * Ensures future blocks are allocated larger than the supplied value
+     *
+     * @param value
+     *            the value to ensure future blocks are larger than
+     */
+    void ensureMinimum(long value) throws AlgebricksException;
+
+    /**
+     * Allocates a block of longs of specified block size
+     *
+     * @param blockSize
+     *            The size of the block of longs to reserve
+     * @return the start of the reserved block
+     */
+    long getBlock(int blockSize) throws AlgebricksException;
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IRecoveryManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IRecoveryManager.java
index 7965aa5..bfe7963 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IRecoveryManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/IRecoveryManager.java
@@ -98,13 +98,13 @@
     /**
      * Creates a temporary file to be used during recovery
      *
-     * @param jobId
+     * @param txnId
      * @param fileName
      * @return A file to the created temporary file
      * @throws IOException
-     *             if the file for the specified {@code jobId} with the {@code fileName} already exists
+     *             if the file for the specified {@code txnId} with the {@code fileName} already exists
      */
-    File createJobRecoveryFile(int jobId, String fileName) throws IOException;
+    File createJobRecoveryFile(long txnId, String fileName) throws IOException;
 
     /**
      * Deletes all temporary recovery files
@@ -119,4 +119,15 @@
      * @throws ACIDException
      */
     void startLocalRecovery(Set<Integer> partitions) throws IOException, ACIDException;
+
+    /**
+     * Replay the commited transactions' logs belonging to {@code partitions}. if {@code flush} is true,
+     * all datasets are flushed after the logs are replayed.
+     *
+     * @param partitions
+     * @param flush
+     * @throws HyracksDataException
+     */
+    void replayReplicaPartitionLogs(Set<Integer> partitions, boolean flush) throws HyracksDataException;
+
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
index 20ede18..a3d5bc5 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionContext.java
@@ -19,41 +19,140 @@
 package org.apache.asterix.common.transactions;
 
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
 
+/**
+ * A typical transaction lifecycle goes through the following steps:
+ * 1. {@link ITransactionContext#register(long, ILSMIndex, IModificationOperationCallback, boolean)}
+ * 2. {@link ITransactionContext#beforeOperation(long)}
+ * 3. {@link ITransactionContext#notifyUpdateCommitted(long)}
+ * 4. {@link ITransactionContext#notifyEntityCommitted}
+ * 5. {@link ITransactionContext#afterOperation(long)}
+ * 6. {@link ITransactionContext#complete()}
+ */
 public interface ITransactionContext {
 
-    public void registerIndexAndCallback(long resourceId, ILSMIndex index, AbstractOperationCallback callback,
-            boolean isPrimaryIndex);
+    /**
+     * Registers {@link ILSMIndex} in the transaction. Registering an index
+     * must be done before any operation is performed on the index by this
+     * transaction.
+     *
+     * @param resourceId
+     * @param partition
+     * @param index
+     * @param callback
+     * @param primaryIndex
+     */
+    void register(long resourceId, int partition, ILSMIndex index, IModificationOperationCallback callback,
+            boolean primaryIndex);
 
-    public JobId getJobId();
+    /**
+     * Gets the unique transaction id.
+     *
+     * @return the unique transaction id
+     */
+    TxnId getTxnId();
 
-    public void setTimeout(boolean isTimeout);
+    /**
+     * Sets a flag indicating that the transaction timed out.
+     *
+     * @param isTimeout
+     */
+    void setTimeout(boolean isTimeout);
 
-    public boolean isTimeout();
+    /**
+     * Tests if the transaction was timed out.
+     *
+     * @return true if this transaction timed out. Otherwise false.
+     */
+    boolean isTimeout();
 
-    public void setTxnState(int txnState);
+    /**
+     * Sets the state if this transaction.
+     *
+     * @param txnState
+     */
+    void setTxnState(int txnState);
 
-    public int getTxnState();
+    /**
+     * Gets the current state of this transaction.
+     *
+     * @return the current state of this transaction
+     */
+    int getTxnState();
 
-    public long getFirstLSN();
+    /**
+     * Gets the first log sequence number of this transaction.
+     *
+     * @return the first log sequence number
+     */
+    long getFirstLSN();
 
-    public long getLastLSN();
+    /**
+     * Gets the last log sequence number of this transactions.
+     *
+     * @return the last log sequence number
+     */
+    long getLastLSN();
 
-    public void setLastLSN(long LSN);
+    /**
+     * Sets the last log sequence number of this transactions.
+     *
+     * @param newValue
+     */
+    void setLastLSN(long newValue);
 
-    public boolean isWriteTxn();
+    /**
+     * Tests if this is a write transaction.
+     *
+     * @return true if this is a write transaction, otherwise false.
+     */
+    boolean isWriteTxn();
 
-    public void setWriteTxn(boolean isWriterTxn);
+    /**
+     * Sets a flag indication that this is a write transaction.
+     *
+     * @param isWriterTxn
+     */
+    void setWriteTxn(boolean isWriterTxn);
 
-    public String prettyPrint();
+    /**
+     * Called before an operation is performed on index
+     * with resource id {@code resourceId}.
+     *
+     * @param resourceId
+     */
+    void beforeOperation(long resourceId);
 
-    public void setMetadataTransaction(boolean isMetadataTxn);
+    /**
+     * Called to notify the transaction that an update log belonging
+     * to this transaction on index with {@code resourceId} has been
+     * flushed to disk.
+     *
+     * @param resourceId
+     */
+    void notifyUpdateCommitted(long resourceId);
 
-    public boolean isMetadataTransaction();
+    /**
+     * Called to notify the transaction that an entity commit
+     * log belonging to this transaction has been flushed to
+     * disk.
+     *
+     * @param partition
+     */
+    void notifyEntityCommitted(int partition);
 
-    public void notifyOptracker(boolean isJobLevelCommit);
+    /**
+     * Called after an operation is performed on index
+     * with resource id {@code resourceId}.
+     *
+     * @param resourceId
+     */
+    void afterOperation(long resourceId);
 
-    public void incrementNumActiveOperations();
-
-    public void decrementNumActiveOperations();
+    /**
+     * Called when no further operations will be performed by the transaction
+     * so that any resources held by the transaction may be released
+     */
+    void complete();
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionManager.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionManager.java
index 0123814..396d3f6 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionManager.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionManager.java
@@ -24,109 +24,88 @@
  * Provides APIs for managing life cycle of a transaction, that is beginning a
  * transaction and aborting/committing the transaction.
  */
-
 public interface ITransactionManager {
 
     /**
      * A transaction may be in any of the following states ACTIVE: The
-     * transaction is ongoing and has not yet committed/aborted. COMMITTD: The
+     * transaction is ongoing and has not yet committed/aborted. COMMITTED: The
      * transaction has committed. ABORTED: The transaction has aborted.
      * TIMED_OUT: The transaction has timed out waiting to acquire a lock.
      */
-    public static final int ACTIVE = 0;
-    public static final int COMMITTED = 1;
-    public static final int ABORTED = 2;
-    public static final int TIMED_OUT = 3;
+    int ACTIVE = 0;
+    int COMMITTED = 1;
+    int ABORTED = 2;
+    int TIMED_OUT = 3;
+
+    enum AtomicityLevel {
+        /**
+         * all records are committed or nothing
+         */
+        ATOMIC,
+        /**
+         * any record with entity commit log
+         */
+        ENTITY_LEVEL
+    }
+
+    enum TransactionMode {
+        /**
+         * Transaction performs only read operations
+         */
+        READ,
+        /**
+         * Transaction may perform read and write operations
+         */
+        READ_WRITE
+    }
 
     /**
      * Begins a transaction identified by a transaction id and returns the
      * associated transaction context.
      *
-     * @param jobId
-     *            a unique value for the transaction id.
-     * @return the transaction context associated with the initiated transaction
-     * @see ITransactionContext
+     * @param txnId
+     * @param options
+     * @return The transaction context
      * @throws ACIDException
      */
-    public ITransactionContext beginTransaction(JobId jobId) throws ACIDException;
+    ITransactionContext beginTransaction(TxnId txnId, TransactionOptions options) throws ACIDException;
 
     /**
      * Returns the transaction context of an active transaction given the
      * transaction id.
      *
-     * @param jobId
-     *            a unique value for the transaction id.
-     * @param createIfNotExist
-     *            TODO
-     * @return
+     * @param txnId
+     * @return The transaction context
      * @throws ACIDException
      */
-    public ITransactionContext getTransactionContext(JobId jobId, boolean createIfNotExist) throws ACIDException;
+    ITransactionContext getTransactionContext(TxnId txnId) throws ACIDException;
 
     /**
-     * Commits a transaction.
+     * Commit a transactions
      *
-     * @param txnContext
-     *            the transaction context associated with the transaction
-     * @param datasetId
-     *            TODO
-     * @param pkHash
-     *            TODO
+     * @param txnId
      * @throws ACIDException
-     * @see ITransactionContextimport org.apache.hyracks.api.job.JobId;
-     * @see ACIDException
      */
-    public void commitTransaction(ITransactionContext txnContext, DatasetId datasetId, int pkHash)
-            throws ACIDException;
+    void commitTransaction(TxnId txnId) throws ACIDException;
 
     /**
      * Aborts a transaction.
      *
-     * @param txnContext
-     *            the transaction context associated with the transaction
-     * @param datasetId
-     *            TODO
-     * @param pkHash
-     *            TODO
-     * @throws ACIDException
-     * @see ITransactionContext
-     * @see ACIDException
-     */
-    public void abortTransaction(ITransactionContext txnContext, DatasetId datasetId, int pkHash)
-            throws ACIDException;
-
-    /**
-     * Indicates end of all activity for a transaction. In other words, all
-     * participating threads in the transaction have completed the intended
-     * task.
-     *
-     * @param txnContext
-     *            the transaction context associated with the transaction
-     * @param datasetId
-     *            TODO
-     * @param pkHash
-     *            TODO
-     * @param success
-     *            indicates the success or failure. The transaction is committed
-     *            or aborted accordingly.
+     * @param txnId
      * @throws ACIDException
      */
-    public void completedTransaction(ITransactionContext txnContext, DatasetId datasetId, int pkHash,
-            boolean success) throws ACIDException;
+    void abortTransaction(TxnId txnId) throws ACIDException;
 
     /**
-     * Returns the Transaction Provider for the transaction eco-system. A
-     * transaction eco-system consists of a Log Manager, a Recovery Manager, a
-     * Transaction Manager and a Lock Manager.
+     * @return The current max txn id.
+     */
+    long getMaxTxnId();
+
+    /**
+     * Sets the maximum txn id to the bigger value of {@code txnId} and its current value.
      *
-     * @see ITransactionSubsystem
-     * @return TransactionProvider
+     * @param txnId
      */
-    public ITransactionSubsystem getTransactionSubsystem();
-
-    /**
-     * @return The current max job id.
-     */
-    int getMaxJobId();
+    void ensureMaxTxnId(long txnId);
 
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionSubsystem.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionSubsystem.java
index 7bd55e8..3642a71 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionSubsystem.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITransactionSubsystem.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.common.transactions;
 
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.TransactionProperties;
 
 /**
@@ -34,7 +35,7 @@
 
     IRecoveryManager getRecoveryManager();
 
-    IAppRuntimeContextProvider getAsterixAppRuntimeContextProvider();
+    INcApplicationContext getApplicationContext();
 
     String getId();
 
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdBlockProvider.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdBlockProvider.java
new file mode 100644
index 0000000..94ca848
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdBlockProvider.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.common.transactions;
+
+import java.io.Serializable;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface ITxnIdBlockProvider extends Remote, Serializable {
+
+    /**
+     * Ensures that future transaction blocks will be of a value larger than the supplied value
+     *
+     * @param maxId
+     *            The txn id to ensure future txn ids are larger than
+     * @throws RemoteException
+     */
+    void ensureMinimumTxnId(long maxId) throws RemoteException;
+
+    /**
+     * Allocates a block of transaction ids of specified block size
+     *
+     * @param blockSize
+     *            The size of the transaction id block to reserve
+     * @return the start of the reserved block
+     * @throws RemoteException
+     */
+    long reserveTxnIdBlock(int blockSize) throws RemoteException;
+
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdFactory.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdFactory.java
new file mode 100644
index 0000000..be4a1f8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/ITxnIdFactory.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.transactions;
+
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+
+public interface ITxnIdFactory {
+    /**
+     * Creates a new unique transaction id.  The implementation must ensure this id is unique within the cluster
+     *
+     * @return the new transaction id
+     */
+    TxnId create() throws AlgebricksException;
+
+    long getIdBlock(int blockSize);
+
+    /**
+     * Ensure that future transaction ids are larger than the supplied id
+     *
+     * @param id
+     *            the value to ensure future created transaction ids are larger than
+     */
+    void ensureMinimumId(long id) throws AlgebricksException;
+
+    /**
+     * The highest transaction id this factory has created
+     *
+     * @return the max transaction id
+     */
+    long getMaxTxnId();
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/JobId.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/JobId.java
deleted file mode 100644
index 9654a92..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/JobId.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.transactions;
-
-import java.io.Serializable;
-
-public class JobId implements Serializable {
-    private static final long serialVersionUID = 1L;
-    /**
-     * The number of bytes used to represent {@link JobId} value.
-     */
-    public static final int BYTES = Integer.BYTES;
-
-    private int id;
-
-    public JobId(int id) {
-        this.id = id;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    @Override
-    public int hashCode() {
-        return id;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof JobId)) {
-            return false;
-        }
-        return ((JobId) o).id == id;
-    }
-
-    @Override
-    public String toString() {
-        return "JID:" + id;
-    }
-
-    public void setId(int jobId) {
-        id = jobId;
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/LogRecord.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/LogRecord.java
index e80cfa6..743a3fe 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/LogRecord.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/LogRecord.java
@@ -24,7 +24,6 @@
 import java.util.zip.CRC32;
 
 import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
-import org.apache.asterix.common.replication.IReplicationThread;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.common.tuples.SimpleTupleReference;
 import org.apache.hyracks.storage.am.common.tuples.SimpleTupleWriter;
@@ -32,10 +31,10 @@
 /**
  * == LogRecordFormat ==
  * ---------------------------
- * [Header1] (6 bytes) : for all log types
+ * [Header1] (10 bytes) : for all log types
  * LogSource(1)
  * LogType(1)
- * JobId(4)
+ * TxnId(8)
  * ---------------------------
  * [Header2] (16 bytes + PKValueSize) : for entity_commit, upsert_entity_commit, and update log types
  * DatasetId(4) //stored in dataset_dataset in Metadata Node
@@ -57,16 +56,6 @@
  * [Tail] (8 bytes) : for all log types
  * Checksum(8)
  * ---------------------------
- * = LogSize =
- * 1) JOB_COMMIT_LOG_SIZE: 14 bytes (Header1(6) + Tail(8))
- * 2) ENTITY_COMMIT || UPSERT_ENTITY_COMMIT: (Header1(6) + Header2(16) + Tail(8)) + PKValueSize
- * --> ENTITY_COMMIT_LOG_BASE_SIZE = 30
- * 3) UPDATE: (Header1(6) + Header2(16) + + Header3(20) + Body(9) + Tail(8)) + PKValueSize + NewValueSize
- * --> UPDATE_LOG_BASE_SIZE = 59
- * 4) FLUSH: 18 bytes (Header1(6) + DatasetId(4) + Tail(8))
- * 5) WAIT_LOG_SIZE: 14 bytes (Header1(6) + Tail(8))
- * --> WAIT_LOG only requires LogType Field, but in order to conform the log reader protocol
- * it also includes LogSource and JobId fields.
  */
 
 public class LogRecord implements ILogRecord {
@@ -74,7 +63,7 @@
     // ------------- fields in a log record (begin) ------------//
     private byte logSource;
     private byte logType;
-    private int jobId;
+    private long txnId;
     private int datasetId;
     private int PKHashValue;
     private int PKValueSize;
@@ -104,18 +93,19 @@
     private final CRC32 checksumGen;
     private int[] PKFields;
     private PrimaryIndexOperationTracker opTracker;
-    private IReplicationThread replicationThread;
+
     /**
      * The fields (numOfFlushedIndexes and nodeId) are used for remote flush logs only
      * to indicate the source of the log and how many indexes were flushed using its LSN.
      */
-    private int numOfFlushedIndexes;
-    private String nodeId;
-    private boolean replicated = false;
+    private final AtomicBoolean replicated;
+    private boolean replicate = false;
+    private ILogRequester requester;
 
     public LogRecord(ILogMarkerCallback callback) {
         this.callback = callback;
         isFlushed = new AtomicBoolean(false);
+        replicated = new AtomicBoolean(false);
         readPKValue = new PrimaryKeyTupleReference();
         readNewValue = SimpleTupleWriter.INSTANCE.createTupleReference();
         readOldValue = SimpleTupleWriter.INSTANCE.createTupleReference();
@@ -130,7 +120,7 @@
     private void doWriteLogRecord(ByteBuffer buffer) {
         buffer.put(logSource);
         buffer.put(logType);
-        buffer.putInt(jobId);
+        buffer.putLong(txnId);
         switch (logType) {
             case LogType.ENTITY_COMMIT:
                 writeEntityInfo(buffer);
@@ -188,9 +178,6 @@
         doWriteLogRecord(buffer);
         if (logType == LogType.FLUSH) {
             buffer.putLong(LSN);
-            buffer.putInt(numOfFlushedIndexes);
-            buffer.putInt(nodeId.length());
-            buffer.put(nodeId.getBytes());
         }
     }
 
@@ -248,7 +235,7 @@
         }
         logSource = buffer.get();
         logType = buffer.get();
-        jobId = buffer.getInt();
+        txnId = buffer.getLong();
         switch (logType) {
             case LogType.FLUSH:
                 if (buffer.remaining() < ILogRecord.DS_LEN) {
@@ -367,12 +354,6 @@
 
         if (logType == LogType.FLUSH) {
             LSN = buffer.getLong();
-            numOfFlushedIndexes = buffer.getInt();
-            //read serialized node id
-            int nodeIdLength = buffer.getInt();
-            byte[] nodeIdBytes = new byte[nodeIdLength];
-            buffer.get(nodeIdBytes);
-            nodeId = new String(nodeIdBytes);
         }
     }
 
@@ -454,7 +435,7 @@
         builder.append(" LSN : ").append(LSN);
         builder.append(" LogType : ").append(LogType.toString(logType));
         builder.append(" LogSize : ").append(logSize);
-        builder.append(" JobId : ").append(jobId);
+        builder.append(" TxnId : ").append(txnId);
         if (logType == LogType.ENTITY_COMMIT || logType == LogType.UPDATE) {
             builder.append(" DatasetId : ").append(datasetId);
             builder.append(" ResourcePartition : ").append(resourcePartition);
@@ -503,13 +484,13 @@
     }
 
     @Override
-    public int getJobId() {
-        return jobId;
+    public long getTxnId() {
+        return txnId;
     }
 
     @Override
-    public void setJobId(int jobId) {
-        this.jobId = jobId;
+    public void setTxnId(long jobId) {
+        this.txnId = jobId;
     }
 
     @Override
@@ -553,10 +534,6 @@
         if (logType == LogType.FLUSH) {
             //LSN
             remoteLogSize += Long.BYTES;
-            //num of indexes
-            remoteLogSize += Integer.BYTES;
-            //serialized node id String
-            remoteLogSize += Integer.BYTES + nodeId.length();
         }
         remoteLogSize -= CHKSUM_LEN;
         return remoteLogSize;
@@ -639,25 +616,6 @@
     }
 
     @Override
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    @Override
-    public void setNodeId(String nodeId) {
-        this.nodeId = nodeId;
-    }
-
-    public IReplicationThread getReplicationThread() {
-        return replicationThread;
-    }
-
-    @Override
-    public void setReplicationThread(IReplicationThread replicationThread) {
-        this.replicationThread = replicationThread;
-    }
-
-    @Override
     public void setLogSource(byte logSource) {
         this.logSource = logSource;
     }
@@ -667,14 +625,6 @@
         return logSource;
     }
 
-    public int getNumOfFlushedIndexes() {
-        return numOfFlushedIndexes;
-    }
-
-    public void setNumOfFlushedIndexes(int numOfFlushedIndexes) {
-        this.numOfFlushedIndexes = numOfFlushedIndexes;
-    }
-
     public void setPKFieldCnt(int pKFieldCnt) {
         PKFieldCnt = pKFieldCnt;
     }
@@ -694,13 +644,13 @@
     }
 
     @Override
-    public void setReplicated(boolean replicate) {
-        this.replicated = replicate;
+    public void setReplicated(boolean replicated) {
+        this.replicated.set(replicated);
     }
 
     @Override
     public boolean isReplicated() {
-        return replicated;
+        return replicated.get();
     }
 
     @Override
@@ -742,4 +692,22 @@
     public ByteBuffer getMarker() {
         return marker;
     }
+
+    @Override
+    public void setReplicate(boolean replicate) {
+        this.replicate = replicate;
+    }
+
+    @Override
+    public boolean isReplicate() {
+        return replicate;
+    }
+
+    public ILogRequester getRequester() {
+        return requester;
+    }
+
+    public void setRequester(ILogRequester requester) {
+        this.requester = requester;
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TransactionOptions.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TransactionOptions.java
new file mode 100644
index 0000000..48dc452
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TransactionOptions.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.transactions;
+
+import static org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel;
+
+public class TransactionOptions {
+
+    private final AtomicityLevel atomicityLevel;
+
+    // TODO add TransactionMode(READ/WRITE) to options
+    public TransactionOptions(AtomicityLevel atomicityLevel) {
+        this.atomicityLevel = atomicityLevel;
+    }
+
+    public AtomicityLevel getAtomicityLevel() {
+        return atomicityLevel;
+    }
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TxnId.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TxnId.java
new file mode 100644
index 0000000..b0d38b8
--- /dev/null
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/transactions/TxnId.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.common.transactions;
+
+import java.io.Serializable;
+
+public class TxnId implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * The number of bytes used to represent {@link TxnId} value.
+     */
+    public static final int BYTES = Long.BYTES;
+
+    protected long id;
+
+    public TxnId(long id) {
+        this.id = id;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public int hashCode() {
+        return Long.hashCode(id);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (!(o instanceof TxnId)) {
+            return false;
+        }
+        return ((TxnId) o).id == id;
+    }
+
+    @Override
+    public String toString() {
+        return "TxnId:" + id;
+    }
+
+}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/ConfigUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/ConfigUtil.java
deleted file mode 100644
index 5db1693..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/ConfigUtil.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.utils;
-
-import java.util.ArrayList;
-
-import org.apache.asterix.common.config.AsterixExtension;
-import org.apache.asterix.common.configuration.Extension;
-import org.apache.asterix.common.configuration.Property;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-
-public class ConfigUtil {
-
-    private ConfigUtil() {
-    }
-
-    public static AsterixExtension toAsterixExtension(Extension ext) {
-        String className = ext.getExtensionClassName();
-        ArrayList<Pair<String, String>> args = new ArrayList<>();
-        for (Property property : ext.getProperty()) {
-            args.add(new Pair<>(property.getName(), property.getValue()));
-        }
-        return new AsterixExtension(className, args);
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/InterruptUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/InterruptUtil.java
deleted file mode 100644
index 4c65c66..0000000
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/InterruptUtil.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.common.utils;
-
-public class InterruptUtil {
-    /**
-     * Executes the passed interruptible, retrying if the operation is interrupted. Once the interruptible
-     * completes, the current thread will be re-interrupted, if the original operation was interrupted.
-     */
-    public static void doUninterruptibly(Interruptible interruptible) {
-        boolean interrupted = false;
-        try {
-            while (true) {
-                try {
-                    interruptible.run();
-                    break;
-                } catch (InterruptedException e) { // NOSONAR- we will re-interrupt the thread during unwind
-                    interrupted = true;
-                }
-            }
-        } finally {
-            if (interrupted) {
-                Thread.currentThread().interrupt();
-            }
-        }
-    }
-
-    /**
-     * Executes the passed interruptible, retrying if the operation is interrupted. Once the interruptible
-     * completes, the current thread will be re-interrupted, if the original operation was interrupted.
-     */
-    public static void doExUninterruptibly(ThrowingInterruptible interruptible) throws Exception {
-        boolean interrupted = false;
-        try {
-            while (true) {
-                try {
-                    interruptible.run();
-                    break;
-                } catch (InterruptedException e) { // NOSONAR- we will re-interrupt the thread during unwind
-                    interrupted = true;
-                }
-            }
-        } finally {
-            if (interrupted) {
-                Thread.currentThread().interrupt();
-            }
-        }
-    }
-
-    /**
-     * Executes the passed interruptible, retrying if the operation is interrupted.
-     *
-     * @return true if the original operation was interrupted, otherwise false
-     */
-    public static boolean doUninterruptiblyGet(Interruptible interruptible) {
-        boolean interrupted = false;
-        while (true) {
-            try {
-                interruptible.run();
-                break;
-            } catch (InterruptedException e) { // NOSONAR- contract states caller must handle
-                interrupted = true;
-            }
-        }
-        return interrupted;
-    }
-
-    /**
-     * Executes the passed interruptible, retrying if the operation is interrupted.  If the operation throws an
-     * exception after being previously interrupted, the current thread will be re-interrupted.
-     *
-     * @return true if the original operation was interrupted, otherwise false
-     */
-    public static boolean doExUninterruptiblyGet(ThrowingInterruptible interruptible) throws Exception {
-        boolean interrupted = false;
-        boolean success = false;
-        while (true) {
-            try {
-                interruptible.run();
-                success = true;
-                break;
-            } catch (InterruptedException e) { // NOSONAR- contract states caller must handle
-                interrupted = true;
-            } finally {
-                if (!success && interrupted) {
-                    Thread.currentThread().interrupt();
-                }
-            }
-        }
-        return interrupted;
-    }
-
-    @FunctionalInterface
-    public interface Interruptible {
-        void run() throws InterruptedException;
-    }
-
-    @FunctionalInterface
-    public interface ThrowingInterruptible {
-        void run() throws Exception; // NOSONAR
-    }
-}
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/PrintUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/PrintUtil.java
index 8c0e4ff..d02ef7c 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/PrintUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/PrintUtil.java
@@ -38,7 +38,7 @@
             sb.append(entry.getKey());
             sb.append('=');
             sb.append(Arrays.toString(entry.getValue()));
-            if (! iter.hasNext()) {
+            if (!iter.hasNext()) {
                 break;
             }
             sb.append(',').append(' ');
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java
index 0f7ab4d..1ac3ffa 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/Servlets.java
@@ -42,7 +42,12 @@
     public static final String CLUSTER_STATE_CC_DETAIL = "/admin/cluster/cc/*";
     public static final String DIAGNOSTICS = "/admin/diagnostics";
     public static final String ACTIVE_STATS = "/admin/active/*";
+    public static final String STORAGE = "/admin/storage/*";
 
     private Servlets() {
     }
+
+    public static String getAbsolutePath(String servlet) {
+        return servlet.replaceAll("/\\*$", "");
+    }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
index 49d64d6..265c9fd 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StorageConstants.java
@@ -19,18 +19,41 @@
 package org.apache.asterix.common.utils;
 
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrame;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
 
 /**
  * A static class that stores storage constants
  */
 public class StorageConstants {
-    public static final String METADATA_ROOT = "root_metadata";
-    /** The storage version of AsterixDB related artifacts (e.g. log files, checkpoint files, etc..). */
-    private static final int LOCAL_STORAGE_VERSION = 1;
 
-    /** The storage version of AsterixDB stack. */
+    public static final String STORAGE_ROOT_DIR_NAME = "storage";
+    public static final String PARTITION_DIR_PREFIX = "partition_";
+    /**
+     * Any file that shares the same directory as the LSM index files must
+     * begin with ".". Otherwise {@link AbstractLSMIndexFileManager} will try to
+     * use them as index files.
+     */
+    public static final String INDEX_CHECKPOINT_FILE_PREFIX = ".idx_checkpoint_";
+    public static final String METADATA_FILE_NAME = ".metadata";
+    public static final String MASK_FILE_PREFIX = ".mask_";
+    public static final String COMPONENT_MASK_FILE_PREFIX = MASK_FILE_PREFIX + "C_";
+    public static final String LEGACY_DATASET_INDEX_NAME_SEPARATOR = "_idx_";
+
+    /**
+     * The storage version of AsterixDB related artifacts (e.g. log files, checkpoint files, etc..).
+     */
+    private static final int LOCAL_STORAGE_VERSION = 2;
+
+    /**
+     * The storage version of AsterixDB stack.
+     */
     public static final int VERSION = LOCAL_STORAGE_VERSION + ITreeIndexFrame.Constants.VERSION;
 
+    /**
+     * The storage version in which the rebalance storage structure was introduced
+     */
+    public static final int REBALANCE_STORAGE_VERSION = 8;
+
     private StorageConstants() {
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
index 0b9b94b..6b13468 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/StoragePathUtil.java
@@ -19,8 +19,12 @@
 package org.apache.asterix.common.utils;
 
 import java.io.File;
+import java.nio.file.Paths;
+import java.util.function.Function;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.asterix.common.storage.IndexPathElements;
+import org.apache.asterix.common.storage.ResourceReference;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
 import org.apache.hyracks.algebricks.common.utils.Pair;
@@ -29,14 +33,12 @@
 import org.apache.hyracks.api.io.MappedFileSplit;
 import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
 import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class StoragePathUtil {
-    private static final Logger LOGGER = Logger.getLogger(StoragePathUtil.class.getName());
-    public static final String PARTITION_DIR_PREFIX = "partition_";
-    public static final String TEMP_DATASETS_STORAGE_FOLDER = "temp";
-    public static final String DATASET_INDEX_NAME_SEPARATOR = "_idx_";
+
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private StoragePathUtil() {
     }
@@ -56,8 +58,9 @@
         return new MappedFileSplit(partition.getActiveNodeId(), relativePath, partition.getIODeviceNum());
     }
 
-    public static String prepareStoragePartitionPath(String storageDirName, int partitonId) {
-        return storageDirName + File.separator + StoragePathUtil.PARTITION_DIR_PREFIX + partitonId;
+    public static String prepareStoragePartitionPath(int partitonId) {
+        return Paths.get(StorageConstants.STORAGE_ROOT_DIR_NAME, StorageConstants.PARTITION_DIR_PREFIX + partitonId)
+                .toString();
     }
 
     public static String prepareDataverseIndexName(String dataverseName, String datasetName, String idxName,
@@ -70,29 +73,30 @@
     }
 
     private static String prepareFullIndexName(String datasetName, String idxName, long rebalanceCount) {
-        return (rebalanceCount == 0 ? "" : rebalanceCount + File.separator) + datasetName + DATASET_INDEX_NAME_SEPARATOR
-                + idxName;
-    }
-
-    public static int getPartitionNumFromName(String name) {
-        return Integer.parseInt(name.substring(PARTITION_DIR_PREFIX.length()));
+        return datasetName + File.separator + rebalanceCount + File.separator + idxName;
     }
 
     public static int getPartitionNumFromRelativePath(String relativePath) {
-        int startIdx = relativePath.indexOf(PARTITION_DIR_PREFIX) + PARTITION_DIR_PREFIX.length();
+        int startIdx = relativePath.indexOf(StorageConstants.PARTITION_DIR_PREFIX)
+                + StorageConstants.PARTITION_DIR_PREFIX.length();
         String partition = relativePath.substring(startIdx, relativePath.indexOf(File.separatorChar, startIdx));
         return Integer.parseInt(partition);
     }
 
     /**
      * @param fileAbsolutePath
-     * @return the file relative path starting from the partition directory
+     * @return the file's index relative path starting from the storage directory
      */
     public static String getIndexFileRelativePath(String fileAbsolutePath) {
-        String[] tokens = fileAbsolutePath.split(File.separator);
-        //partition/dataverse/idx/fileName
-        return tokens[tokens.length - 4] + File.separator + tokens[tokens.length - 3] + File.separator
-                + tokens[tokens.length - 2] + File.separator + tokens[tokens.length - 1];
+        return ResourceReference.of(fileAbsolutePath).getRelativePath().toString();
+    }
+
+    /**
+     * @param fileAbsolutePath
+     * @return the file's relative path starting from the storage directory
+     */
+    public static String getFileRelativePath(String fileAbsolutePath) {
+        return ResourceReference.of(fileAbsolutePath).getFileRelativePath().toString();
     }
 
     /**
@@ -117,7 +121,7 @@
                 if (!success) {
                     throw new HyracksDataException("Unable to create spill file " + fileName);
                 } else {
-                    if (LOGGER.isEnabledFor(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Created spill file " + file.getAbsolutePath());
                     }
                 }
@@ -137,7 +141,6 @@
      * @return The index name
      */
     public static String getIndexNameFromPath(String path) {
-        int idx = path.lastIndexOf(DATASET_INDEX_NAME_SEPARATOR);
-        return idx != -1 ? path.substring(idx + DATASET_INDEX_NAME_SEPARATOR.length()) : path;
+        return Paths.get(path).getFileName().toString();
     }
 }
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/TransactionUtil.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/TransactionUtil.java
index e9f96f9..c3af0f3 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/TransactionUtil.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/utils/TransactionUtil.java
@@ -34,25 +34,22 @@
 
     public static void formJobTerminateLogRecord(ITransactionContext txnCtx, LogRecord logRecord, boolean isCommit) {
         logRecord.setTxnCtx(txnCtx);
-        TransactionUtil.formJobTerminateLogRecord(logRecord, txnCtx.getJobId().getId(), isCommit);
+        TransactionUtil.formJobTerminateLogRecord(logRecord, txnCtx.getTxnId().getId(), isCommit);
     }
 
-    public static void formJobTerminateLogRecord(LogRecord logRecord, int jobId, boolean isCommit) {
+    public static void formJobTerminateLogRecord(LogRecord logRecord, long txnId, boolean isCommit) {
         logRecord.setLogType(isCommit ? LogType.JOB_COMMIT : LogType.ABORT);
         logRecord.setDatasetId(-1);
         logRecord.setPKHashValue(-1);
-        logRecord.setJobId(jobId);
+        logRecord.setTxnId(txnId);
         logRecord.computeAndSetLogSize();
     }
 
-    public static void formFlushLogRecord(LogRecord logRecord, int datasetId, PrimaryIndexOperationTracker opTracker,
-            String nodeId, int numberOfIndexes) {
+    public static void formFlushLogRecord(LogRecord logRecord, int datasetId, PrimaryIndexOperationTracker opTracker) {
         logRecord.setLogType(LogType.FLUSH);
-        logRecord.setJobId(-1);
+        logRecord.setTxnId(-1);
         logRecord.setDatasetId(datasetId);
         logRecord.setOpTracker(opTracker);
-        logRecord.setNumOfFlushedIndexes(numberOfIndexes);
-        logRecord.setNodeId(nodeId);
         logRecord.computeAndSetLogSize();
     }
 
@@ -60,7 +57,7 @@
             int PKHashValue, ITupleReference PKValue, int[] PKFields, int resourcePartition, byte entityCommitType) {
         logRecord.setTxnCtx(txnCtx);
         logRecord.setLogType(entityCommitType);
-        logRecord.setJobId(txnCtx.getJobId().getId());
+        logRecord.setTxnId(txnCtx.getTxnId().getId());
         logRecord.setDatasetId(datasetId);
         logRecord.setPKHashValue(PKHashValue);
         logRecord.setPKFieldCnt(PKFields.length);
@@ -76,7 +73,7 @@
         logRecord.setTxnCtx(txnCtx);
         logRecord.setLogSource(LogSource.LOCAL);
         logRecord.setLogType(LogType.MARKER);
-        logRecord.setJobId(txnCtx.getJobId().getId());
+        logRecord.setTxnId(txnCtx.getTxnId().getId());
         logRecord.setDatasetId(datasetId);
         logRecord.setResourcePartition(resourcePartition);
         marker.get(); // read the first byte since it is not part of the marker object
diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
index e428721..8341a33 100644
--- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
+++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties
@@ -61,7 +61,7 @@
 25 = Polygon must have at least 3 points
 26 = %1$s can not be an instance of polygon
 27 = Operation not supported
-28 = Invalid duration %1$s
+28 = Invalid duration \"%1$s\"
 29 = Unknown duration unit %1$s
 30 = Query timed out and will be cancelled
 
@@ -118,6 +118,14 @@
 1053 = Cannot create primary index on external dataset.
 1054 = Compilation failed due to some problem in the query plan.
 1055 = Incompatible function language. Expect %1$s, but %2$s found.
+1056 = Too many options were specified for %1$s
+1057 = Expression of type %1$s is not supported in constant record
+1058 = Literal of type %1$s is not supported in constant record
+1059 = Field \"%1$s\" unsupported in the with clause
+1060 = Field \"%1$s\" in the with clause must be of type %2$s
+1061 = Field \"%1$s\" in the with clause must contain sub field \"%2$s\"
+1062 = Merge policy parameters cannot be of type %1$s
+1063 = There is no dataverse with name \"%1$s\"
 
 # Feed Errors
 3001 = Illegal state.
@@ -229,6 +237,7 @@
 3109 = Function %1$s is being used. It cannot be dropped
 3110 = Feed failed while reading a new record
 3111 = Feed %1$s is not connected to any dataset
+3112 = Array/Multiset item cannot be null
 
 # Lifecycle management errors
 4000 = Partition id %1$d for node %2$s already in use by node %3$s
diff --git a/asterixdb/asterix-common/src/main/resources/schema/asterix-conf.xsd b/asterixdb/asterix-common/src/main/resources/schema/asterix-conf.xsd
deleted file mode 100644
index d6a35cd..0000000
--- a/asterixdb/asterix-common/src/main/resources/schema/asterix-conf.xsd
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema
-    xmlns:xs="http://www.w3.org/2001/XMLSchema"
-    xmlns:mg="asterixconf"
-    targetNamespace="asterixconf"
-    elementFormDefault="qualified">
-
-    <!-- definition of simple types -->
-    <xs:element
-        name="instanceName"
-        type="xs:string" />
-    <xs:element
-        name="version"
-        type="xs:string" />
-    <xs:element
-        name="metadataNode"
-        type="xs:string" />
-    <xs:element
-        name="coredumpPath"
-        type="xs:string" />
-    <xs:element
-        name="storeDirs"
-        type="xs:string" />
-    <xs:element
-        name="ncId"
-        type="xs:string" />
-    <xs:element
-        name="name"
-        type="xs:string" />
-    <xs:element
-        name="value"
-        type="xs:string" />
-    <xs:element
-        name="description"
-        type="xs:string" />
-    <xs:element
-        name="txnLogDirPath"
-        type="xs:string" />
-    <xs:element
-        name="extensionClassName"
-        type="xs:string" />
-
-    <!-- definition of complex elements -->
-    <xs:element name="store">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:ncId" />
-                <xs:element ref="mg:storeDirs" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="coredump">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:ncId" />
-                <xs:element ref="mg:coredumpPath" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="transactionLogDir">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:ncId" />
-                <xs:element ref="mg:txnLogDirPath" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="property">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:name" />
-                <xs:element ref="mg:value" />
-                <xs:element ref="mg:description" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="extension">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:extensionClassName"
-                maxOccurs="1"
-                minOccurs="1"/>
-                <xs:element ref="mg:property"
-                    minOccurs="0"
-                    maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="extensions">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="mg:extension"
-                    minOccurs="0"
-                    maxOccurs="unbounded">
-                </xs:element>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="asterixConfiguration">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element
-                    ref="mg:instanceName"
-                    minOccurs="0" />
-                <xs:element
-                    ref="mg:version"
-                    minOccurs="0" />
-                <xs:element
-                    ref="mg:metadataNode"
-                    minOccurs="0" />
-                <xs:element
-                    ref="mg:store"
-                    maxOccurs="unbounded" />
-                <xs:element
-                    ref="mg:coredump"
-                    maxOccurs="unbounded" />
-                <xs:element
-                    ref="mg:transactionLogDir"
-                    maxOccurs="unbounded" />
-                <xs:element ref="mg:extensions"
-                    minOccurs="0"
-                    maxOccurs="1" />
-                <xs:element
-                    ref="mg:property"
-                    minOccurs="0"
-                    maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-</xs:schema>
diff --git a/asterixdb/asterix-common/src/main/resources/schema/cluster.xsd b/asterixdb/asterix-common/src/main/resources/schema/cluster.xsd
deleted file mode 100644
index 8cd7b42..0000000
--- a/asterixdb/asterix-common/src/main/resources/schema/cluster.xsd
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-    xmlns:cl="cluster" targetNamespace="cluster" elementFormDefault="qualified">
-
-    <!-- definition of simple types -->
-    <xs:element name="instance_name" type="xs:string" />
-    <xs:element name="cluster_name" type="xs:string" />
-    <xs:element name="log_dir" type="xs:string" />
-    <xs:element name="txn_log_dir" type="xs:string" />
-    <xs:element name="id" type="xs:string" />
-    <xs:element name="client_ip" type="xs:string" />
-    <xs:element name="cluster_ip" type="xs:string" />
-    <xs:element name="key" type="xs:string" />
-    <xs:element name="value" type="xs:string" />
-    <xs:element name="dir" type="xs:string" />
-    <xs:element name="NFS" type="xs:boolean" />
-    <xs:element name="store" type="xs:string" />
-    <xs:element name="iodevices" type="xs:string" />
-    <xs:element name="java_home" type="xs:string" />
-    <xs:element name="username" type="xs:string" />
-    <xs:element name="web_port" type="xs:string" />
-    <xs:element name="client_port" type="xs:integer" />
-    <xs:element name="cluster_port" type="xs:integer" />
-    <xs:element name="http_port" type="xs:integer" />
-    <xs:element name="debug_port" type="xs:integer" />
-    <xs:element name="metadata_node" type="xs:string" />
-    <xs:element name="enabled" type="xs:string" />
-    <xs:element name="replication_port" type="xs:integer" />
-    <xs:element name="replication_factor" type="xs:integer" />
-    <xs:element name="auto_failover" type="xs:boolean" />
-    <xs:element name="replication_time_out" type="xs:integer" />
-    <xs:element name="heartbeat_period" type="xs:integer" />
-    <xs:element name="max_heartbeat_lapse_periods" type="xs:integer" />
-    <xs:element name="profile_dump_period" type="xs:integer" />
-    <xs:element name="job_history_size" type="xs:integer" />
-    <xs:element name="result_time_to_live" type="xs:long" />
-    <xs:element name="result_sweep_threshold" type="xs:long" />
-    <xs:element name="cc_root" type="xs:string" />
-    <xs:element name="strategy" type="xs:string" />
-    <xs:element name="node_id" type="xs:string" />
-
-    <!-- definition of complex elements -->
-    <xs:element name="working_dir">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:dir" />
-                <xs:element ref="cl:NFS" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="master_node">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:id" />
-                <xs:element ref="cl:client_ip" />
-                <xs:element ref="cl:cluster_ip" />
-                <xs:element ref="cl:java_home" minOccurs="0" />
-                <xs:element ref="cl:log_dir" minOccurs="0" />
-                <xs:element ref="cl:client_port" />
-                <xs:element ref="cl:cluster_port" />
-                <xs:element ref="cl:http_port" />
-                <xs:element ref="cl:debug_port" minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="data_replication">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:strategy" />
-                <xs:element ref="cl:replication_port" />
-                <xs:element ref="cl:replication_factor" />
-                <xs:element ref="cl:replication_time_out" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="fault_tolerance">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:strategy" />
-                <xs:element ref="cl:replica" minOccurs="0"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="high_availability">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:enabled" minOccurs="0"/>
-                <xs:element ref="cl:data_replication" minOccurs="0"/>
-                <xs:element ref="cl:fault_tolerance" minOccurs="0"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="property">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:key" />
-                <xs:element ref="cl:value" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="env">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:property" minOccurs="0" maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="node">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:id" />
-                <xs:element ref="cl:cluster_ip" />
-                <xs:element ref="cl:java_home" minOccurs="0" />
-                <xs:element ref="cl:log_dir" minOccurs="0" />
-                <xs:element ref="cl:txn_log_dir" minOccurs="0" />
-                <xs:element ref="cl:iodevices" minOccurs="0" />
-                <xs:element ref="cl:debug_port" minOccurs="0" />
-                <xs:element ref="cl:replication_port" minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="substitute_nodes">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:node" maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="replica">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:node_id" maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="cluster">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:instance_name" />
-                <xs:element ref="cl:cluster_name" />
-                <xs:element ref="cl:username" />
-                <xs:element ref="cl:env" minOccurs="0" />
-                <xs:element ref="cl:java_home" minOccurs="0" />
-                <xs:element ref="cl:log_dir" minOccurs="0" />
-                <xs:element ref="cl:txn_log_dir" minOccurs="0" />
-                <xs:element ref="cl:store" minOccurs="0" />
-                <xs:element ref="cl:iodevices" minOccurs="0" />
-                <xs:element ref="cl:working_dir" />
-                <xs:element ref="cl:metadata_node" />
-                <xs:element ref="cl:high_availability" minOccurs="0" />
-                <xs:element ref="cl:master_node" />
-                <xs:element ref="cl:node" maxOccurs="unbounded" />
-                <xs:element ref="cl:substitute_nodes" />
-                <xs:element ref="cl:heartbeat_period" minOccurs="0" />
-                <xs:element ref="cl:max_heartbeat_lapse_periods" minOccurs="0" />
-                <xs:element ref="cl:profile_dump_period" minOccurs="0" />
-                <xs:element ref="cl:job_history_size" minOccurs="0" />
-                <xs:element ref="cl:result_time_to_live" minOccurs="0" />
-                <xs:element ref="cl:result_sweep_threshold" minOccurs="0" />
-                <xs:element ref="cl:cc_root" minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-</xs:schema>
diff --git a/asterixdb/asterix-common/src/main/resources/schema/jaxb-bindings.xjb b/asterixdb/asterix-common/src/main/resources/schema/jaxb-bindings.xjb
deleted file mode 100644
index 0b191a6..0000000
--- a/asterixdb/asterix-common/src/main/resources/schema/jaxb-bindings.xjb
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<jxb:bindings version="1.0"
-xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
-xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<jxb:globalBindings>
-  <jxb:serializable uid="1"/>
-</jxb:globalBindings>
-
-</jxb:bindings>
diff --git a/asterixdb/asterix-common/src/main/resources/schema/yarn_cluster.xsd b/asterixdb/asterix-common/src/main/resources/schema/yarn_cluster.xsd
deleted file mode 100644
index 4292509..0000000
--- a/asterixdb/asterix-common/src/main/resources/schema/yarn_cluster.xsd
+++ /dev/null
@@ -1,211 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema
-    xmlns:xs="http://www.w3.org/2001/XMLSchema"
-    xmlns:cl="yarn_cluster"
-    targetNamespace="yarn_cluster"
-    elementFormDefault="qualified">
-
-    <!-- definition of simple types -->
-    <xs:element
-        name="instance_name"
-        type="xs:string" />
-    <xs:element
-        name="cluster_name"
-        type="xs:string" />
-    <xs:element
-        name="log_dir"
-        type="xs:string" />
-    <xs:element
-        name="txn_log_dir"
-        type="xs:string" />
-    <xs:element
-        name="id"
-        type="xs:string" />
-    <xs:element
-        name="client_ip"
-        type="xs:string" />
-    <xs:element
-        name="cluster_ip"
-        type="xs:string" />
-    <xs:element
-        name="key"
-        type="xs:string" />
-    <xs:element
-        name="value"
-        type="xs:string" />
-    <xs:element
-        name="store"
-        type="xs:string" />
-    <xs:element
-        name="iodevices"
-        type="xs:string" />
-    <xs:element
-        name="web_port"
-        type="xs:string" />
-    <xs:element
-        name="client_port"
-        type="xs:integer" />
-    <xs:element
-        name="cluster_port"
-        type="xs:integer" />
-    <xs:element
-        name="http_port"
-        type="xs:integer" />
-    <xs:element
-        name="debug_port"
-        type="xs:integer" />
-    <xs:element
-        name="metadata_node"
-        type="xs:string" />
-    <xs:element
-        name="cc_container_mem"
-        type="xs:string" />
-    <xs:element
-        name="nc_container_mem"
-        type="xs:string" />
-    <xs:element name="heartbeat_period" type="xs:integer" />
-    <xs:element name="max_heartbeat_lapse_periods" type="xs:integer" />
-    <xs:element name="profile_dump_period" type="xs:integer" />
-    <xs:element name="default_max_job_attempts" type="xs:integer" />
-    <xs:element name="job_history_size" type="xs:integer" />
-    <xs:element name="result_time_to_live" type="xs:long" />
-    <xs:element name="result_sweep_threshold" type="xs:long" />
-    <xs:element name="cc_root" type="xs:string" />
-
-    <!-- definition of complex elements -->
-
-    <xs:element name="master_node">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:id" />
-                <xs:element ref="cl:client_ip" />
-                <xs:element ref="cl:cluster_ip" />
-                <xs:element
-                    ref="cl:log_dir"
-                    minOccurs="0" />
-                <xs:element ref="cl:client_port" />
-                <xs:element ref="cl:cluster_port" />
-                <xs:element ref="cl:http_port" />
-                <xs:element
-                    ref="cl:debug_port"
-                    minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="property">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:key" />
-                <xs:element ref="cl:value" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="env">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element
-                    ref="cl:property"
-                    minOccurs="0"
-                    maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="node">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:id" />
-                <xs:element ref="cl:cluster_ip" />
-                <xs:element
-                    ref="cl:log_dir"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:txn_log_dir"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:iodevices"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:debug_port"
-                    minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="substitute_nodes">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element
-                    ref="cl:node"
-                    maxOccurs="unbounded" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="cluster">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element ref="cl:instance_name" />
-                <xs:element ref="cl:cluster_name" />
-                <xs:element
-                    ref="cl:cc_container_mem"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:nc_container_mem"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:env"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:log_dir"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:txn_log_dir"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:store"
-                    minOccurs="0" />
-                <xs:element
-                    ref="cl:iodevices"
-                    minOccurs="0" />
-                <xs:element ref="cl:metadata_node" />
-                <xs:element ref="cl:master_node" />
-                <xs:element
-                    ref="cl:node"
-                    maxOccurs="unbounded" />
-                <xs:element ref="cl:substitute_nodes" />
-                <xs:element ref="cl:heartbeat_period" minOccurs="0" />
-                <xs:element ref="cl:max_heartbeat_lapse_periods" minOccurs="0" />
-                <xs:element ref="cl:profile_dump_period" minOccurs="0" />
-                <xs:element ref="cl:default_max_job_attempts" minOccurs="0" />
-                <xs:element ref="cl:job_history_size" minOccurs="0" />
-                <xs:element ref="cl:result_time_to_live" minOccurs="0" />
-                <xs:element ref="cl:result_sweep_threshold" minOccurs="0" />
-                <xs:element ref="cl:cc_root" minOccurs="0" />
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-</xs:schema>
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/base/RetainLogsRule.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/base/RetainLogsRule.java
index 2077ad5..1fe7dc2 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/base/RetainLogsRule.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/base/RetainLogsRule.java
@@ -49,12 +49,12 @@
 
     @Override
     protected void failed(Throwable e, Description description) {
-        File reportDir = new File(destDir, description.getTestClass().getSimpleName() + "." + description.getMethodName());
+        File reportDir =
+                new File(destDir, description.getTestClass().getSimpleName() + "." + description.getMethodName());
         reportDir.mkdirs();
         try {
             AsterixTestHelper.deepSelectiveCopy(baseDir, reportDir,
-                    pathname -> pathname.getName().endsWith("log") &&
-                            pathname.lastModified() > startTime);
+                    pathname -> pathname.getName().endsWith("log") && pathname.lastModified() > startTime);
         } catch (Exception e1) {
             e1.printStackTrace();
         }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/client/FileFeedSocketAdapterClient.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/client/FileFeedSocketAdapterClient.java
index 852173c..0e24b12 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/client/FileFeedSocketAdapterClient.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/client/FileFeedSocketAdapterClient.java
@@ -25,8 +25,10 @@
 import java.net.Socket;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FileFeedSocketAdapterClient implements ITestClient {
     private final int port;
@@ -37,7 +39,7 @@
     private int batchSize;
     private int maxCount;
     private OutputStream out = null;
-    static final Logger LOGGER = Logger.getLogger(FileFeedSocketAdapterClient.class.getName());
+    static final Logger LOGGER = LogManager.getLogger();
 
     // expected args: url, source-file-path, max-count, batch-size, wait
     public FileFeedSocketAdapterClient(int port, String[] args) throws Exception {
@@ -61,7 +63,7 @@
         try {
             socket = new Socket(url, port);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Problem in creating socket against host " + url + " on the port " + port, e);
+            LOGGER.log(Level.WARN, "Problem in creating socket against host " + url + " on the port " + port, e);
             throw e;
         }
 
@@ -78,7 +80,7 @@
                 }
                 out.write(b.array(), 0, b.limit());
                 recordCount++;
-                LOGGER.log(Level.FINE, "One record filed into feed");
+                LOGGER.log(Level.DEBUG, "One record filed into feed");
                 if (recordCount == maxCount) {
                     break;
                 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/CorrelatedPrefixMergePolicyTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/CorrelatedPrefixMergePolicyTest.java
index 9f071bb..f9f742a 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/CorrelatedPrefixMergePolicyTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/context/CorrelatedPrefixMergePolicyTest.java
@@ -22,26 +22,25 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.context.CorrelatedPrefixMergePolicy;
 import org.apache.asterix.common.context.DatasetInfo;
 import org.apache.asterix.common.context.IndexInfo;
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
-import org.apache.hyracks.storage.am.lsm.common.impls.LSMDiskComponentId;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentId;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
+import org.apache.hyracks.storage.common.LocalResource;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -60,17 +59,18 @@
 
     private final int DATASET_ID = 1;
 
+    private long nextResourceId = 0;
+
     @Test
     public void testBasic() {
         try {
-            List<ILSMDiskComponentId> componentIDs =
-                    Arrays.asList(new LSMDiskComponentId(5, 5), new LSMDiskComponentId(4, 4),
-                            new LSMDiskComponentId(3, 3), new LSMDiskComponentId(2, 2), new LSMDiskComponentId(1, 1));
+            List<ILSMComponentId> componentIDs = Arrays.asList(new LSMComponentId(5, 5), new LSMComponentId(4, 4),
+                    new LSMComponentId(3, 3), new LSMComponentId(2, 2), new LSMComponentId(1, 1));
 
-            List<ILSMDiskComponentId> resultPrimaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultPrimaryIDs = new ArrayList<>();
             IndexInfo primary = mockIndex(true, componentIDs, resultPrimaryIDs, 0);
 
-            List<ILSMDiskComponentId> resultSecondaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultSecondaryIDs = new ArrayList<>();
             IndexInfo secondary = mockIndex(false, componentIDs, resultSecondaryIDs, 0);
 
             ILSMMergePolicy policy = mockMergePolicy(primary, secondary);
@@ -80,10 +80,10 @@
 
             policy.diskComponentAdded(primary.getIndex(), false);
 
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(4, 4), new LSMDiskComponentId(3, 3),
-                    new LSMDiskComponentId(2, 2), new LSMDiskComponentId(1, 1)), resultPrimaryIDs);
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(4, 4), new LSMDiskComponentId(3, 3),
-                    new LSMDiskComponentId(2, 2), new LSMDiskComponentId(1, 1)), resultSecondaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(4, 4), new LSMComponentId(3, 3),
+                    new LSMComponentId(2, 2), new LSMComponentId(1, 1)), resultPrimaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(4, 4), new LSMComponentId(3, 3),
+                    new LSMComponentId(2, 2), new LSMComponentId(1, 1)), resultSecondaryIDs);
 
         } catch (HyracksDataException e) {
             Assert.fail(e.getMessage());
@@ -94,14 +94,13 @@
     @Test
     public void testIDIntervals() {
         try {
-            List<ILSMDiskComponentId> componentIDs = Arrays.asList(new LSMDiskComponentId(40, 50),
-                    new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29), new LSMDiskComponentId(20, 24),
-                    new LSMDiskComponentId(10, 19));
+            List<ILSMComponentId> componentIDs = Arrays.asList(new LSMComponentId(40, 50), new LSMComponentId(30, 35),
+                    new LSMComponentId(25, 29), new LSMComponentId(20, 24), new LSMComponentId(10, 19));
 
-            List<ILSMDiskComponentId> resultPrimaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultPrimaryIDs = new ArrayList<>();
             IndexInfo primary = mockIndex(true, componentIDs, resultPrimaryIDs, 0);
 
-            List<ILSMDiskComponentId> resultSecondaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultSecondaryIDs = new ArrayList<>();
             IndexInfo secondary = mockIndex(false, componentIDs, resultSecondaryIDs, 0);
 
             ILSMMergePolicy policy = mockMergePolicy(primary, secondary);
@@ -111,10 +110,10 @@
 
             policy.diskComponentAdded(primary.getIndex(), false);
 
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24), new LSMDiskComponentId(10, 19)), resultPrimaryIDs);
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24), new LSMDiskComponentId(10, 19)), resultSecondaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                    new LSMComponentId(20, 24), new LSMComponentId(10, 19)), resultPrimaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                    new LSMComponentId(20, 24), new LSMComponentId(10, 19)), resultSecondaryIDs);
 
         } catch (HyracksDataException e) {
             Assert.fail(e.getMessage());
@@ -124,15 +123,15 @@
     @Test
     public void testSecondaryMissing() {
         try {
-            List<ILSMDiskComponentId> primaryComponentIDs = Arrays.asList(new LSMDiskComponentId(40, 50),
-                    new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29), new LSMDiskComponentId(20, 24),
-                    new LSMDiskComponentId(10, 19));
-            List<ILSMDiskComponentId> resultPrimaryIDs = new ArrayList<>();
+            List<ILSMComponentId> primaryComponentIDs =
+                    Arrays.asList(new LSMComponentId(40, 50), new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                            new LSMComponentId(20, 24), new LSMComponentId(10, 19));
+            List<ILSMComponentId> resultPrimaryIDs = new ArrayList<>();
             IndexInfo primary = mockIndex(true, primaryComponentIDs, resultPrimaryIDs, 0);
 
-            List<ILSMDiskComponentId> secondaryComponentIDs = Arrays.asList(new LSMDiskComponentId(30, 35),
-                    new LSMDiskComponentId(25, 29), new LSMDiskComponentId(20, 24));
-            List<ILSMDiskComponentId> resultSecondaryIDs = new ArrayList<>();
+            List<ILSMComponentId> secondaryComponentIDs =
+                    Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29), new LSMComponentId(20, 24));
+            List<ILSMComponentId> resultSecondaryIDs = new ArrayList<>();
             IndexInfo secondary = mockIndex(false, secondaryComponentIDs, resultSecondaryIDs, 0);
 
             ILSMMergePolicy policy = mockMergePolicy(primary, secondary);
@@ -142,10 +141,11 @@
             Assert.assertTrue(resultSecondaryIDs.isEmpty());
 
             policy.diskComponentAdded(primary.getIndex(), false);
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24), new LSMDiskComponentId(10, 19)), resultPrimaryIDs);
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24)), resultSecondaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                    new LSMComponentId(20, 24), new LSMComponentId(10, 19)), resultPrimaryIDs);
+            Assert.assertEquals(
+                    Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29), new LSMComponentId(20, 24)),
+                    resultSecondaryIDs);
 
         } catch (HyracksDataException e) {
             Assert.fail(e.getMessage());
@@ -155,17 +155,16 @@
     @Test
     public void testMultiPartition() {
         try {
-            List<ILSMDiskComponentId> componentIDs = Arrays.asList(new LSMDiskComponentId(40, 50),
-                    new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29), new LSMDiskComponentId(20, 24),
-                    new LSMDiskComponentId(10, 19));
+            List<ILSMComponentId> componentIDs = Arrays.asList(new LSMComponentId(40, 50), new LSMComponentId(30, 35),
+                    new LSMComponentId(25, 29), new LSMComponentId(20, 24), new LSMComponentId(10, 19));
 
-            List<ILSMDiskComponentId> resultPrimaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultPrimaryIDs = new ArrayList<>();
             IndexInfo primary = mockIndex(true, componentIDs, resultPrimaryIDs, 0);
 
-            List<ILSMDiskComponentId> resultSecondaryIDs = new ArrayList<>();
+            List<ILSMComponentId> resultSecondaryIDs = new ArrayList<>();
             IndexInfo secondary = mockIndex(false, componentIDs, resultSecondaryIDs, 0);
 
-            List<ILSMDiskComponentId> resultSecondaryIDs1 = new ArrayList<>();
+            List<ILSMComponentId> resultSecondaryIDs1 = new ArrayList<>();
             IndexInfo secondary1 = mockIndex(false, componentIDs, resultSecondaryIDs, 1);
 
             ILSMMergePolicy policy = mockMergePolicy(primary, secondary, secondary1);
@@ -175,29 +174,25 @@
 
             policy.diskComponentAdded(primary.getIndex(), false);
 
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24), new LSMDiskComponentId(10, 19)), resultPrimaryIDs);
-            Assert.assertEquals(Arrays.asList(new LSMDiskComponentId(30, 35), new LSMDiskComponentId(25, 29),
-                    new LSMDiskComponentId(20, 24), new LSMDiskComponentId(10, 19)), resultSecondaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                    new LSMComponentId(20, 24), new LSMComponentId(10, 19)), resultPrimaryIDs);
+            Assert.assertEquals(Arrays.asList(new LSMComponentId(30, 35), new LSMComponentId(25, 29),
+                    new LSMComponentId(20, 24), new LSMComponentId(10, 19)), resultSecondaryIDs);
             Assert.assertTrue(resultSecondaryIDs1.isEmpty());
         } catch (HyracksDataException e) {
             Assert.fail(e.getMessage());
         }
     }
 
-    private ILSMMergePolicy mockMergePolicy(IndexInfo... indexes) {
+    private ILSMMergePolicy mockMergePolicy(IndexInfo... indexInfos) {
         Map<String, String> properties = new HashMap<>();
         properties.put("max-tolerance-component-count", String.valueOf(MAX_COMPONENT_COUNT));
         properties.put("max-mergable-component-size", String.valueOf(MAX_COMPONENT_SIZE));
 
-        Set<IndexInfo> indexInfos = new HashSet<>();
-        for (IndexInfo info : indexes) {
-            indexInfos.add(info);
+        DatasetInfo dsInfo = new DatasetInfo(DATASET_ID);
+        for (IndexInfo index : indexInfos) {
+            dsInfo.addIndex(index.getResourceId(), index);
         }
-
-        DatasetInfo dsInfo = Mockito.mock(DatasetInfo.class);
-        Mockito.when(dsInfo.getDatsetIndexInfos()).thenReturn(indexInfos);
-
         IDatasetLifecycleManager manager = Mockito.mock(IDatasetLifecycleManager.class);
         Mockito.when(manager.getDatasetInfo(DATASET_ID)).thenReturn(dsInfo);
 
@@ -206,12 +201,12 @@
         return policy;
     }
 
-    private IndexInfo mockIndex(boolean isPrimary, List<ILSMDiskComponentId> componentIDs,
-            List<ILSMDiskComponentId> resultComponentIDs, int partition) throws HyracksDataException {
+    private IndexInfo mockIndex(boolean isPrimary, List<ILSMComponentId> componentIDs,
+            List<ILSMComponentId> resultComponentIDs, int partition) throws HyracksDataException {
         List<ILSMDiskComponent> components = new ArrayList<>();
-        for (ILSMDiskComponentId id : componentIDs) {
+        for (ILSMComponentId id : componentIDs) {
             ILSMDiskComponent component = Mockito.mock(ILSMDiskComponent.class);
-            Mockito.when(component.getComponentId()).thenReturn(id);
+            Mockito.when(component.getId()).thenReturn(id);
             Mockito.when(component.getComponentSize()).thenReturn(DEFAULT_COMPONENT_SIZE);
             Mockito.when(component.getState()).thenReturn(ComponentState.READABLE_UNWRITABLE);
             components.add(component);
@@ -228,7 +223,7 @@
                 List<ILSMDiskComponent> mergedComponents = invocation.getArgumentAt(1, List.class);
                 mergedComponents.forEach(component -> {
                     try {
-                        resultComponentIDs.add(component.getComponentId());
+                        resultComponentIDs.add(component.getId());
                     } catch (HyracksDataException e) {
                         e.printStackTrace();
                     }
@@ -238,11 +233,18 @@
         }).when(accessor).scheduleMerge(Mockito.any(ILSMIOOperationCallback.class),
                 Mockito.anyListOf(ILSMDiskComponent.class));
 
-        Mockito.when(index.createAccessor(Mockito.any(IModificationOperationCallback.class),
-                Mockito.any(ISearchOperationCallback.class))).thenReturn(accessor);
+        Mockito.when(index.createAccessor(Mockito.any(IIndexAccessParameters.class))).thenReturn(accessor);
         Mockito.when(index.isPrimaryIndex()).thenReturn(isPrimary);
-
-        return new IndexInfo(index, DATASET_ID, 0, partition);
+        if (isPrimary) {
+            PrimaryIndexOperationTracker opTracker = Mockito.mock(PrimaryIndexOperationTracker.class);
+            Mockito.when(opTracker.getPartition()).thenReturn(partition);
+            Mockito.when(index.getOperationTracker()).thenReturn(opTracker);
+        }
+        final LocalResource localResource = Mockito.mock(LocalResource.class);
+        Mockito.when(localResource.getId()).thenReturn(nextResourceId++);
+        IndexInfo indexInfo = new IndexInfo(index, DATASET_ID, localResource, partition);
+        indexInfo.setOpen(true);
+        return indexInfo;
     }
 
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/AbstractLSMIOOperationCallbackTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/AbstractLSMIOOperationCallbackTest.java
new file mode 100644
index 0000000..1c57d1b
--- /dev/null
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/AbstractLSMIOOperationCallbackTest.java
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.test.ioopcallbacks;
+
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
+import org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallback;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMMemoryComponent;
+import org.apache.hyracks.storage.am.lsm.common.impls.DiskComponentMetadata;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import junit.framework.TestCase;
+
+public abstract class AbstractLSMIOOperationCallbackTest extends TestCase {
+
+    @Test
+    public void testNormalSequence() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(Mockito.mock(AbstractLSMMemoryComponent.class));
+        LSMBTreeIOOperationCallback callback = new LSMBTreeIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
+
+        //request to flush first component
+        callback.updateLastLSN(1);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        //request to flush second component
+        callback.updateLastLSN(2);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        Assert.assertEquals(1, callback.getComponentLSN(null));
+        final ILSMDiskComponent diskComponent1 = mockDiskComponent();
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent1);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent1);
+
+        Assert.assertEquals(2, callback.getComponentLSN(null));
+        final ILSMDiskComponent diskComponent2 = mockDiskComponent();
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent2);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent2);
+    }
+
+    @Test
+    public void testOverWrittenLSN() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(Mockito.mock(AbstractLSMMemoryComponent.class));
+
+        LSMBTreeIOOperationCallback callback = new LSMBTreeIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
+
+        //request to flush first component
+        callback.updateLastLSN(1);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        //request to flush second component
+        callback.updateLastLSN(2);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        //request to flush first component again
+        //this call should fail
+        callback.updateLastLSN(3);
+        //there is no corresponding beforeOperation, since the first component is being flush
+        //the scheduleFlush request would fail this time
+
+        Assert.assertEquals(1, callback.getComponentLSN(null));
+        final ILSMDiskComponent diskComponent1 = mockDiskComponent();
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent1);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent1);
+        final ILSMDiskComponent diskComponent2 = mockDiskComponent();
+        Assert.assertEquals(2, callback.getComponentLSN(null));
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent2);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent2);
+    }
+
+    @Test
+    public void testLostLSN() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(Mockito.mock(AbstractLSMMemoryComponent.class));
+
+        LSMBTreeIOOperationCallback callback = new LSMBTreeIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
+        //request to flush first component
+        callback.updateLastLSN(1);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        //request to flush second component
+        callback.updateLastLSN(2);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+
+        Assert.assertEquals(1, callback.getComponentLSN(null));
+
+        // the first flush is finished, but has not finalized yet (in codebase, these two calls
+        // are not synchronized)
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, mockDiskComponent());
+
+        //request to flush first component again
+        callback.updateLastLSN(3);
+
+        // the first flush is finalized (it may be called after afterOperation for a while)
+        callback.afterFinalize(LSMIOOperationType.FLUSH, mockDiskComponent());
+
+        // the second flush gets LSN 2
+        Assert.assertEquals(2, callback.getComponentLSN(null));
+        // the second flush is finished
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, mockDiskComponent());
+        callback.afterFinalize(LSMIOOperationType.FLUSH, mockDiskComponent());
+
+        // it should get new LSN 3
+        Assert.assertEquals(3, callback.getComponentLSN(null));
+    }
+
+    @Test
+    public void testAllocateComponentId() throws HyracksDataException {
+        ILSMComponentIdGenerator idGenerator = new LSMComponentIdGenerator();
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        ILSMMemoryComponent mockComponent = Mockito.mock(AbstractLSMMemoryComponent.class);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(mockComponent);
+
+        LSMBTreeIOOperationCallback callback =
+                new LSMBTreeIOOperationCallback(mockIndex, idGenerator, mockIndexCheckpointManagerProvider());
+
+        ILSMComponentId initialId = idGenerator.getId();
+        // simulate a partition is flushed before allocated
+        idGenerator.refresh();
+        callback.updateLastLSN(0);
+
+        callback.allocated(mockComponent);
+        checkMemoryComponent(initialId, mockComponent);
+    }
+
+    @Test
+    public void testRecycleComponentId() throws HyracksDataException {
+        ILSMComponentIdGenerator idGenerator = new LSMComponentIdGenerator();
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        ILSMMemoryComponent mockComponent = Mockito.mock(AbstractLSMMemoryComponent.class);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(mockComponent);
+        LSMBTreeIOOperationCallback callback =
+                new LSMBTreeIOOperationCallback(mockIndex, idGenerator, mockIndexCheckpointManagerProvider());
+
+        ILSMComponentId id = idGenerator.getId();
+        callback.allocated(mockComponent);
+        checkMemoryComponent(id, mockComponent);
+
+        Mockito.when(mockIndex.isMemoryComponentsAllocated()).thenReturn(true);
+        for (int i = 0; i < 100; i++) {
+            // schedule a flush
+            idGenerator.refresh();
+            ILSMComponentId expectedId = idGenerator.getId();
+
+            callback.updateLastLSN(0);
+            callback.beforeOperation(LSMIOOperationType.FLUSH);
+            callback.recycled(mockComponent, true);
+
+            final ILSMDiskComponent diskComponent = mockDiskComponent();
+            callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent);
+            callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent);
+            checkMemoryComponent(expectedId, mockComponent);
+        }
+    }
+
+    @Test
+    public void testRecycleWithoutSwitch() throws HyracksDataException {
+        ILSMComponentIdGenerator idGenerator = new LSMComponentIdGenerator();
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        ILSMMemoryComponent mockComponent = Mockito.mock(AbstractLSMMemoryComponent.class);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(mockComponent);
+        LSMBTreeIOOperationCallback callback =
+                new LSMBTreeIOOperationCallback(mockIndex, idGenerator, mockIndexCheckpointManagerProvider());
+
+        ILSMComponentId id = idGenerator.getId();
+        callback.allocated(mockComponent);
+        checkMemoryComponent(id, mockComponent);
+
+        Mockito.when(mockIndex.isMemoryComponentsAllocated()).thenReturn(true);
+
+        for (int i = 0; i < 10; i++) {
+            idGenerator.refresh();
+            id = idGenerator.getId();
+            callback.updateLastLSN(0);
+            callback.recycled(mockComponent, false);
+            callback.afterFinalize(LSMIOOperationType.FLUSH, null);
+            checkMemoryComponent(id, mockComponent);
+        }
+    }
+
+    @Test
+    public void testConcurrentRecycleComponentId() throws HyracksDataException {
+        ILSMComponentIdGenerator idGenerator = new LSMComponentIdGenerator();
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        ILSMMemoryComponent mockComponent = Mockito.mock(AbstractLSMMemoryComponent.class);
+        Mockito.when(mockIndex.getCurrentMemoryComponent()).thenReturn(mockComponent);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        LSMBTreeIOOperationCallback callback =
+                new LSMBTreeIOOperationCallback(mockIndex, idGenerator, mockIndexCheckpointManagerProvider());
+
+        ILSMComponentId id = idGenerator.getId();
+        callback.allocated(mockComponent);
+        checkMemoryComponent(id, mockComponent);
+
+        Mockito.when(mockIndex.isMemoryComponentsAllocated()).thenReturn(true);
+
+        // schedule a flush
+        idGenerator.refresh();
+        ILSMComponentId expectedId = idGenerator.getId();
+
+        callback.updateLastLSN(0);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+        final ILSMDiskComponent diskComponent = mockDiskComponent();
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent);
+
+        // another flush is to be scheduled before the component is recycled
+        idGenerator.refresh();
+        ILSMComponentId nextId = idGenerator.getId();
+
+        // recycle the component
+        callback.recycled(mockComponent, true);
+        checkMemoryComponent(expectedId, mockComponent);
+
+        // schedule the next flush
+        callback.updateLastLSN(0);
+        callback.beforeOperation(LSMIOOperationType.FLUSH);
+        final ILSMDiskComponent diskComponent2 = mockDiskComponent();
+        callback.afterOperation(LSMIOOperationType.FLUSH, null, diskComponent2);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, diskComponent2);
+        callback.recycled(mockComponent, true);
+        checkMemoryComponent(nextId, mockComponent);
+    }
+
+    private void checkMemoryComponent(ILSMComponentId expected, ILSMMemoryComponent memoryComponent)
+            throws HyracksDataException {
+        ArgumentCaptor<ILSMComponentId> argument = ArgumentCaptor.forClass(ILSMComponentId.class);
+        Mockito.verify(memoryComponent).resetId(argument.capture());
+        assertEquals(expected, argument.getValue());
+
+        Mockito.reset(memoryComponent);
+    }
+
+    private ILSMDiskComponent mockDiskComponent() {
+        ILSMDiskComponent component = Mockito.mock(ILSMDiskComponent.class);
+        Mockito.when(component.getMetadata()).thenReturn(Mockito.mock(DiskComponentMetadata.class));
+        return component;
+    }
+
+    protected IIndexCheckpointManagerProvider mockIndexCheckpointManagerProvider() throws HyracksDataException {
+        IIndexCheckpointManagerProvider indexCheckpointManagerProvider =
+                Mockito.mock(IIndexCheckpointManagerProvider.class);
+        IIndexCheckpointManager indexCheckpointManager = Mockito.mock(IIndexCheckpointManager.class);
+        Mockito.doNothing().when(indexCheckpointManager).flushed(Mockito.any(), Mockito.anyLong());
+        Mockito.doReturn(indexCheckpointManager).when(indexCheckpointManagerProvider).get(Mockito.any());
+        return indexCheckpointManagerProvider;
+    }
+
+    protected abstract AbstractLSMIOOperationCallback getIoCallback() throws HyracksDataException;
+}
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
index 8d4cd51..a4bc399 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeIOOperationCallbackTest.java
@@ -19,69 +19,21 @@
 
 package org.apache.asterix.test.ioopcallbacks;
 
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
 import org.apache.asterix.common.ioopcallbacks.LSMBTreeIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.junit.Assert;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
 import org.mockito.Mockito;
 
-import junit.framework.TestCase;
+public class LSMBTreeIOOperationCallbackTest extends AbstractLSMIOOperationCallbackTest {
 
-public class LSMBTreeIOOperationCallbackTest extends TestCase {
-
-    public void testNormalSequence() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMBTreeIOOperationCallback callback = new LSMBTreeIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
-    }
-
-    public void testOverWrittenLSN() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMBTreeIOOperationCallback callback = new LSMBTreeIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush first component again
-            //this call should fail
-            callback.updateLastLSN(3);
-            //there is no corresponding beforeOperation, since the first component is being flush
-            //the scheduleFlush request would fail this time
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
+    @Override
+    protected AbstractLSMIOOperationCallback getIoCallback() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        return new LSMBTreeIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
     }
 
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
index ec1aba2..5f37c78 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMBTreeWithBuddyIOOperationCallbackTest.java
@@ -19,69 +19,21 @@
 
 package org.apache.asterix.test.ioopcallbacks;
 
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
 import org.apache.asterix.common.ioopcallbacks.LSMBTreeWithBuddyIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.junit.Assert;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
 import org.mockito.Mockito;
 
-import junit.framework.TestCase;
+public class LSMBTreeWithBuddyIOOperationCallbackTest extends AbstractLSMIOOperationCallbackTest {
 
-public class LSMBTreeWithBuddyIOOperationCallbackTest extends TestCase {
-
-    public void testNormalSequence() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMBTreeWithBuddyIOOperationCallback callback = new LSMBTreeWithBuddyIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
-    }
-
-    public void testOverWrittenLSN() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMBTreeWithBuddyIOOperationCallback callback = new LSMBTreeWithBuddyIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush first component again
-            //this call should fail
-            callback.updateLastLSN(3);
-            //there is no corresponding beforeOperation, since the first component is being flush
-            //the scheduleFlush request would fail this time
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
+    @Override
+    protected AbstractLSMIOOperationCallback getIoCallback() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        return new LSMBTreeWithBuddyIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
     }
 
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
index 1711bc2..343bc59 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMInvertedIndexIOOperationCallbackTest.java
@@ -19,69 +19,21 @@
 
 package org.apache.asterix.test.ioopcallbacks;
 
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
 import org.apache.asterix.common.ioopcallbacks.LSMInvertedIndexIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.junit.Assert;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
 import org.mockito.Mockito;
 
-import junit.framework.TestCase;
+public class LSMInvertedIndexIOOperationCallbackTest extends AbstractLSMIOOperationCallbackTest {
 
-public class LSMInvertedIndexIOOperationCallbackTest extends TestCase {
-
-    public void testNormalSequence() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMInvertedIndexIOOperationCallback callback = new LSMInvertedIndexIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
-    }
-
-    public void testOverWrittenLSN() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMInvertedIndexIOOperationCallback callback = new LSMInvertedIndexIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush first component again
-            //this call should fail
-            callback.updateLastLSN(3);
-            //there is no corresponding beforeOperation, since the first component is being flush
-            //the scheduleFlush request would fail this time
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
+    @Override
+    protected AbstractLSMIOOperationCallback getIoCallback() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        return new LSMInvertedIndexIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
     }
 
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
index bb33f3d..10d95d8 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/ioopcallbacks/LSMRTreeIOOperationCallbackTest.java
@@ -19,69 +19,21 @@
 
 package org.apache.asterix.test.ioopcallbacks;
 
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
 import org.apache.asterix.common.ioopcallbacks.LSMRTreeIOOperationCallback;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.junit.Assert;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentIdGenerator;
 import org.mockito.Mockito;
 
-import junit.framework.TestCase;
+public class LSMRTreeIOOperationCallbackTest extends AbstractLSMIOOperationCallbackTest {
 
-public class LSMRTreeIOOperationCallbackTest extends TestCase {
-
-    public void testNormalSequence() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMRTreeIOOperationCallback callback = new LSMRTreeIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
-    }
-
-    public void testOverWrittenLSN() {
-        try {
-            ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
-            Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
-            LSMRTreeIOOperationCallback callback = new LSMRTreeIOOperationCallback(mockIndex);
-
-            //request to flush first component
-            callback.updateLastLSN(1);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush second component
-            callback.updateLastLSN(2);
-            callback.beforeOperation(LSMOperationType.FLUSH);
-
-            //request to flush first component again
-            //this call should fail
-            callback.updateLastLSN(3);
-            //there is no corresponding beforeOperation, since the first component is being flush
-            //the scheduleFlush request would fail this time
-
-            Assert.assertEquals(1, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-
-            Assert.assertEquals(2, callback.getComponentLSN(null));
-            callback.afterFinalize(LSMOperationType.FLUSH, Mockito.mock(ILSMDiskComponent.class));
-        } catch (Exception e) {
-            Assert.fail();
-        }
+    @Override
+    protected AbstractLSMIOOperationCallback getIoCallback() throws HyracksDataException {
+        ILSMIndex mockIndex = Mockito.mock(ILSMIndex.class);
+        Mockito.when(mockIndex.getNumberOfAllMemoryComponents()).thenReturn(2);
+        return new LSMRTreeIOOperationCallback(mockIndex, new LSMComponentIdGenerator(),
+                mockIndexCheckpointManagerProvider());
     }
 
 }
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
index 9be5837..0243a63 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/memory/ConcurrentFramePoolUnitTest.java
@@ -60,8 +60,8 @@
     public void testMemoryManager() {
         ActiveProperties afp = Mockito.mock(ActiveProperties.class);
         Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-        ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                DEFAULT_FRAME_SIZE);
+        ConcurrentFramePool fmm =
+                new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
         int i = 0;
         while (fmm.get() != null) {
             i++;
@@ -75,8 +75,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             FixedSizeAllocator[] runners = new FixedSizeAllocator[NUM_THREADS];
             Thread[] threads = new Thread[NUM_THREADS];
             Arrays.parallelSetAll(runners, (int i) -> new FixedSizeAllocator(fmm));
@@ -106,8 +106,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             Random random = new Random();
             int i = 0;
             int req;
@@ -141,8 +141,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
 
             VarSizeAllocator[] runners = new VarSizeAllocator[NUM_THREADS];
             Thread[] threads = new Thread[NUM_THREADS];
@@ -180,8 +180,8 @@
     public void testAcquireReleaseMemoryManager() throws HyracksDataException {
         ActiveProperties afp = Mockito.mock(ActiveProperties.class);
         Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-        ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                DEFAULT_FRAME_SIZE);
+        ConcurrentFramePool fmm =
+                new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
         Random random = new Random();
         ArrayDeque<ByteBuffer> stack = new ArrayDeque<>();
         while (true) {
@@ -213,8 +213,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             FixedSizeGoodAllocator[] runners = new FixedSizeGoodAllocator[NUM_THREADS];
             Thread[] threads = new Thread[NUM_THREADS];
             Arrays.parallelSetAll(runners, (int i) -> new FixedSizeGoodAllocator(fmm));
@@ -244,8 +244,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             Random random = new Random();
             ArrayDeque<ByteBuffer> stack = new ArrayDeque<>();
             int i = 0;
@@ -297,8 +297,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             VarSizeGoodAllocator[] runners = new VarSizeGoodAllocator[NUM_THREADS];
             Thread[] threads = new Thread[NUM_THREADS];
             Arrays.parallelSetAll(runners, (int i) -> new VarSizeGoodAllocator(fmm));
@@ -333,8 +333,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             int i = 0;
             ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_FRAME_SIZE);
             LinkedBlockingDeque<ByteBuffer> buffers = new LinkedBlockingDeque<>();
@@ -399,8 +399,8 @@
         try {
             ActiveProperties afp = Mockito.mock(ActiveProperties.class);
             Mockito.when(afp.getMemoryComponentGlobalBudget()).thenReturn(FEED_MEM_BUDGET);
-            ConcurrentFramePool fmm = new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(),
-                    DEFAULT_FRAME_SIZE);
+            ConcurrentFramePool fmm =
+                    new ConcurrentFramePool("TestNode", afp.getMemoryComponentGlobalBudget(), DEFAULT_FRAME_SIZE);
             int i = 0;
             ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_FRAME_SIZE);
             LinkedBlockingDeque<ByteBuffer> buffers = new LinkedBlockingDeque<>();
diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
index 2ebed83..639e036 100644
--- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
+++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/server/RSSFeedServlet.java
@@ -25,13 +25,13 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
 
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
 
 import com.rometools.rome.feed.synd.SyndContent;
 import com.rometools.rome.feed.synd.SyndContentImpl;
@@ -71,7 +71,7 @@
             SyndFeedOutput output = new SyndFeedOutput();
             output.output(feed, res.writer());
         } catch (FeedException | ParseException ex) {
-            GlobalConfig.ASTERIX_LOGGER.log(Level.WARNING, ex.getMessage(), ex);
+            GlobalConfig.ASTERIX_LOGGER.log(Level.WARN, ex.getMessage(), ex);
             String msg = COULD_NOT_GENERATE_FEED_ERROR;
             res.writer().print(msg);
             res.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
diff --git a/asterixdb/asterix-coverage/pom.xml b/asterixdb/asterix-coverage/pom.xml
index 50bc9a3..1f578b2 100644
--- a/asterixdb/asterix-coverage/pom.xml
+++ b/asterixdb/asterix-coverage/pom.xml
@@ -29,6 +29,10 @@
     <version>0.9.4-SNAPSHOT</version>
   </parent>
 
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
+
   <profiles>
     <profile>
       <id>coverage</id>
diff --git a/asterixdb/asterix-dashboard/pom.xml b/asterixdb/asterix-dashboard/pom.xml
new file mode 100644
index 0000000..7e49934
--- /dev/null
+++ b/asterixdb/asterix-dashboard/pom.xml
@@ -0,0 +1,85 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>apache-asterixdb</artifactId>
+    <groupId>org.apache.asterix</groupId>
+    <version>0.9.4-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>asterix-dashboard</artifactId>
+
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-http</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.asterix</groupId>
+      <artifactId>asterix-common</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+            <configuration>
+              <licenses combine.children="append">
+                <license
+                    implementation="org.apache.rat.analysis.license.MITLicense"/>
+              </licenses>
+              <excludes combine.children="append">
+                <exclude>src/main/resources/dashboard/static/*
+                </exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java b/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
new file mode 100644
index 0000000..598d802
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/java/org/apache/asterix/api/http/server/QueryWebInterfaceServlet.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.api.http.server;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.asterix.common.config.ExternalProperties;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.hyracks.http.api.IServletRequest;
+import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.hyracks.http.server.StaticResourceServlet;
+import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import io.netty.handler.codec.http.HttpResponseStatus;
+
+public class QueryWebInterfaceServlet extends StaticResourceServlet {
+    private static final Logger LOGGER = LogManager.getLogger();
+    private ICcApplicationContext appCtx;
+
+    public QueryWebInterfaceServlet(ICcApplicationContext appCtx, ConcurrentMap<String, Object> ctx, String[] paths) {
+        super(ctx, paths);
+        this.appCtx = appCtx;
+    }
+
+    @Override
+    protected void get(IServletRequest request, IServletResponse response) throws IOException {
+        String requestURI = request.getHttpRequest().uri();
+        if ("/".equals(requestURI)) {
+            HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML);
+            // Dashboard Administration Console
+            deliverResource("/dashboard/static/index.html", response);
+        } else {
+            deliverResource(requestURI, response);
+        }
+    }
+
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) throws IOException {
+        HttpUtil.setContentType(response, HttpUtil.ContentType.APPLICATION_JSON, HttpUtil.Encoding.UTF8);
+        ExternalProperties externalProperties = appCtx.getExternalProperties();
+        response.setStatus(HttpResponseStatus.OK);
+        ObjectNode obj = OBJECT_MAPPER.createObjectNode();
+        try {
+            PrintWriter out = response.writer();
+            obj.put("api_port", String.valueOf(externalProperties.getAPIServerPort()));
+            out.println(obj.toString());
+            return;
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Failure writing response", e);
+        }
+        try {
+            response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Failure setting response status", e);
+        }
+    }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json
new file mode 100755
index 0000000..7e41979
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.angular-cli.json
@@ -0,0 +1,69 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "project": {
+    "name": "asterixdb-web-console"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "static",
+      "assets": [
+        "assets",
+        "favicon.ico"
+      ],
+      "index": "index.html",
+      "main": "main.ts",
+      "polyfills": "polyfills.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.app.json",
+      "testTsconfig": "tsconfig.spec.json",
+      "prefix": "app",
+      "styles": [
+        "main.scss",
+        "../node_modules/codemirror/lib/codemirror.css",
+        "../node_modules/codemirror/theme/monokai.css",
+        "../node_modules/primeng/resources/themes/omega/theme.css",
+        "../node_modules/primeng/resources/primeng.min.css"
+      ],
+      "scripts": [
+        "../node_modules/codemirror/lib/codemirror.js"
+      ],
+      "environmentSource": "environments/environment.ts",
+      "environments": {
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "lint": [
+    {
+      "project": "src/tsconfig.app.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "src/tsconfig.spec.json",
+      "exclude": "**/node_modules/**"
+    },
+    {
+      "project": "e2e/tsconfig.e2e.json",
+      "exclude": "**/node_modules/**"
+    }
+  ],
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "css",
+    "class": {
+      "spec": false
+    },
+    "component": {}
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig
new file mode 100755
index 0000000..ba060b8
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.editorconfig
@@ -0,0 +1,25 @@
+# Editor configuration, see http://editorconfig.org
+#/*
+#Licensed under the Apache License, Version 2.0 (the "License");
+#you may not use this file except in compliance with the License.
+#You may obtain a copy of the License at
+
+#    http://www.apache.org/licenses/LICENSE-2.0
+
+#Unless required by applicable law or agreed to in writing, software
+#Distributed under the License is distributed on an "AS IS" BASIS,
+#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#See the License for the specific language governing permissions and
+#limitations under the License.
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore
new file mode 100755
index 0000000..fc1e2ce
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/.gitignore
@@ -0,0 +1,47 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/tmp
+/out-tsc
+
+# dependencies
+/node_modules
+/documents
+# /static
+/dist
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+# System Files
+.DS_Store
+Thumbs.db
+
+# Others
+package-lock.json
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md b/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md
new file mode 100755
index 0000000..14f16fc
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/README.md
@@ -0,0 +1,47 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+# AsterixDB Web Administration Console
+
+AsterixDB Administration Console is an Angular 5 HTML/CSS/Typescript web application using predictable state containers, immutable data updates with Redux/NGRx frameworks, observable patterns, and standard Open Sourced UI widgets for data, metadata manipulation and visualization through SQL++ AsterixDB Query language.
+
+The main goal is create a baseline solution with unopinionated UI/UX design and SW architecture with two differentiated isolated, indepent minimal coupled levels between the UI components and application core or internal core, easily extensible and scalable by the AsterixDB community.
+
+## Development
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.4.9.
+
+## Installation
+
+Install node and npm, any of the latest versions will do.
+
+Run `npm install` to download all the dependency packages an recreate the node_modules directory.
+
+## Development server
+
+The development version uses the webpack proxy to avoid CORS problems in Angular see:  
+
+`https://daveceddia.com/access-control-allow-origin-cors-errors-in-angular`. 
+
+Please check `proxy.config.js` to see how it's configured.
+
+Run `ng serve` or `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
+
+A technical document describing the internals and architecture exist, here:
+
+`https://github.com/EmilioMobile/asterixdb-dashboard/blob/master/documents/AsterixDB%20Architecture%20v1.0.pdf?raw=true`
+
+A brief user guide document describing how to use it, here:
+
+`https://github.com/EmilioMobile/asterixdb-dashboard/blob/master/documents/AsterixDB%20User%20Guide%20v1.0.pptx?raw=true`
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts
new file mode 100755
index 0000000..e75aa02
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.e2e-spec.ts
@@ -0,0 +1,27 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { AppPage } from './app.po';
+
+describe('asterixdb-dashboard', () => {
+  let page: AppPage;
+
+  beforeEach(() => {
+    page = new AppPage();
+  });
+
+  it('should display welcome message', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('Welcome to AsterixDB Dashboard!');
+  });
+});
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts
new file mode 100755
index 0000000..37d3de9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/app.po.ts
@@ -0,0 +1,24 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { browser, by, element } from 'protractor';
+
+export class AppPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
new file mode 100755
index 0000000..41b7fc0
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/e2e/tsconfig.e2e.json
@@ -0,0 +1,27 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/e2e",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "jasminewd2",
+      "node"
+    ]
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js
new file mode 100755
index 0000000..c9da2c5
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/karma.conf.js
@@ -0,0 +1,47 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+  config.set({
+    basePath: '',
+    frameworks: ['jasmine', '@angular/cli'],
+    plugins: [
+      require('karma-jasmine'),
+      require('karma-chrome-launcher'),
+      require('karma-jasmine-html-reporter'),
+      require('karma-coverage-istanbul-reporter'),
+      require('@angular/cli/plugins/karma')
+    ],
+    client:{
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
+    },
+    coverageIstanbulReporter: {
+      reports: [ 'html', 'lcovonly' ],
+      fixWebpackSourcePaths: true
+    },
+    angularCli: {
+      environment: 'dev'
+    },
+    reporters: ['progress', 'kjhtml'],
+    port: 9876,
+    colors: true,
+    logLevel: config.LOG_INFO,
+    autoWatch: true,
+    browsers: ['Chrome'],
+    singleRun: false
+  });
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json
new file mode 100755
index 0000000..3073159
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/package.json
@@ -0,0 +1,60 @@
+{
+  "name": "asterixdb-web-console",
+  "version": "1.0.0",
+  "license": "Apache License, Version 2.0",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve --proxy-config proxy.config.js --host 0.0.0.0",
+    "build": "ng build",
+    "test": "ng test",
+    "lint": "ng lint",
+    "e2e": "ng e2e"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^5.0.3",
+    "@angular/cdk": "^5.0.0-rc.2",
+    "@angular/common": "^5.0.3",
+    "@angular/compiler": "^5.0.3",
+    "@angular/core": "^5.0.3",
+    "@angular/forms": "^5.0.3",
+    "@angular/http": "^5.0.3",
+    "@angular/material": "^5.0.0-rc.2",
+    "@angular/platform-browser": "^5.0.3",
+    "@angular/platform-browser-dynamic": "^5.0.3",
+    "@angular/router": "^5.0.3",
+    "@ngrx/db": "^2.0.2",
+    "@ngrx/effects": "^4.1.0",
+    "@ngrx/entity": "^4.1.0",
+    "@ngrx/store": "^4.1.0",
+    "@ngrx/store-devtools": "^4.0.0",
+    "codemirror": "^5.31.0",
+    "core-js": "^2.4.1",
+    "file-saver": "^1.3.3",
+    "hammerjs": "^2.0.8",
+    "primeng": "^4.3.0",
+    "rxjs": "^5.5.2",
+    "zone.js": "^0.8.18"
+  },
+  "devDependencies": {
+    "@angular/cli": "1.5.4",
+    "@angular/compiler-cli": "^5.0.3",
+    "@angular/language-service": "^5.0.0",
+    "@types/file-saver": "^1.3.0",
+    "@types/jasmine": "~2.5.53",
+    "@types/jasminewd2": "~2.0.2",
+    "@types/node": "~6.0.60",
+    "jasmine-core": "~2.6.2",
+    "jasmine-spec-reporter": "~4.1.0",
+    "karma": "~1.7.0",
+    "karma-chrome-launcher": "~2.1.1",
+    "karma-cli": "~1.0.1",
+    "karma-coverage-istanbul-reporter": "^1.2.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "^0.2.2",
+    "protractor": "~5.1.2",
+    "ts-node": "^3.2.2",
+    "tslint": "^5.7.0",
+    "typescript": "^2.4.2"
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js
new file mode 100755
index 0000000..ac4c723
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/protractor.conf.js
@@ -0,0 +1,41 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Protractor configuration file, see link for more information
+// https://github.com/angular/protractor/blob/master/lib/config.ts
+
+const { SpecReporter } = require('jasmine-spec-reporter');
+
+exports.config = {
+  allScriptsTimeout: 11000,
+  specs: [
+    './e2e/**/*.e2e-spec.ts'
+  ],
+  capabilities: {
+    'browserName': 'chrome'
+  },
+  directConnect: true,
+  baseUrl: 'http://localhost:4200/',
+  framework: 'jasmine',
+  jasmineNodeOpts: {
+    showColors: true,
+    defaultTimeoutInterval: 30000,
+    print: function() {}
+  },
+  onPrepare() {
+    require('ts-node').register({
+      project: 'e2e/tsconfig.e2e.json'
+    });
+    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
+  }
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js
new file mode 100755
index 0000000..58752c3
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/proxy.config.js
@@ -0,0 +1,23 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+const PROXY_CONFIG = {
+    "/query-service/*": {
+        "target": "http://localhost:19002",
+        "secure": false,
+        logLevel: "debug",
+        pathRewrite: function (path) { return path.replace('/query-service', '/query/service')}
+    }
+}
+
+module.exports = PROXY_CONFIG;
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
new file mode 100755
index 0000000..87a0c2b
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app-config.service.ts
@@ -0,0 +1,75 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import {
+  Http,
+  Headers,
+  RequestOptions
+}                     from '@angular/http';
+
+@Injectable()
+export class ConfigService {
+
+  private config: Object
+  private env: Object
+
+  constructor(private http: Http) {}
+
+  /**
+   * Loads the environment config file first. Reads the environment variable from the file
+   * and based on that loads the appropriate configuration file - development or production
+   */
+  load() {
+    return new Promise((resolve, reject) => {
+      let headers = new Headers({ 'Accept': 'application/json', 'Content-Type': 'application/json', 'DataType': 'application/json' });
+      let options = new RequestOptions({ headers: headers });
+
+      this.http.get('/config/env.json')
+      .map(res => res.json())
+      .subscribe((env_data) => {
+        this.env = env_data;
+
+        this.http.get('/config/' + env_data.env + '.json')
+          .map(res => res.json())
+          .catch((error: any) => {
+            return Observable.throw(error.json().error || 'Server error');
+          })
+          .subscribe((data) => {
+            this.config = data;
+            resolve(true);
+          });
+      });
+
+    });
+  }
+
+  /**
+   * Returns environment variable based on given key
+   *
+   * @param key
+   */
+  getEnv(key: any) {
+    return this.env[key];
+  }
+
+  /**
+   * Returns configuration value based on given key
+   *
+   * @param key
+   */
+  get(key: any) {
+    return this.config[key];
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
new file mode 100755
index 0000000..58481be
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.html
@@ -0,0 +1,15 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<awc-bar></awc-bar>
+<awc-tab></awc-tab>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
new file mode 100755
index 0000000..b01fcf5
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.scss
@@ -0,0 +1,14 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Place holder for future expansion
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
new file mode 100755
index 0000000..a913109
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.component.ts
@@ -0,0 +1,31 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component } from '@angular/core';
+import { AppCoreService } from './shared/services/app-core.service'
+
+/*
+ * Root component
+ * Defines AsterixDB Dashboard application's layout
+ */
+@Component({
+  selector: 'awc-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.scss']
+})
+export class AppComponent {
+  title = 'Asterix DB Web Console';
+
+  constructor(private appCoreService: AppCoreService) {
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
new file mode 100755
index 0000000..11c8602
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/app.module.ts
@@ -0,0 +1,121 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { BrowserModule } from '@angular/platform-browser';
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { HttpClientModule } from '@angular/common/http';
+import { EffectsModule } from '@ngrx/effects';
+import { DataverseEffects } from './shared/effects/dataverse.effects';
+import { DatasetEffects } from './shared/effects/dataset.effects';
+import { DatatypeEffects } from './shared/effects/datatype.effects';
+import { IndexEffects } from './shared/effects/index.effects';
+import { SQLQueryEffects } from './shared/effects/query.effects';
+import { MetadataEffects } from './shared/effects/metadata.effects';
+import { AppComponent } from './app.component';
+import { AppBarComponent }  from './dashboard/appbar.component';
+import { DataverseCollection } from './dashboard/metadata/dataverses-collection/dataverses.component';
+import { DatasetCollection } from './dashboard/metadata/datasets-collection/datasets.component';
+import { DatatypeCollection } from './dashboard/metadata/datatypes-collection/datatypes.component';
+import { CodemirrorComponent } from './dashboard/query/codemirror.component';
+import { CodemirrorMetadataComponent } from './dashboard/metadata/codemirror-metadata.component';
+import { IndexCollection } from './dashboard/metadata/indexes-collection/indexes.component';
+import { MetadataContainerComponent }  from './dashboard/metadata/metadata-container.component';
+import { MetadataComponent }  from './dashboard/query/metadata.component';
+import { QueryContainerComponent }  from './dashboard/query/query-container.component';
+import { InputQueryComponent }  from './dashboard/query/input.component';
+import { InputQueryMetadataComponent }  from './dashboard/metadata/input-metadata.component';
+import { QueryOutputComponent, SafeHtmlPipe }  from './dashboard/query/ouput.component';
+import { AppTabComponent }  from './dashboard/apptab.component';
+import { KeysPipe } from './shared/pipes/keys.pipe';
+import { ObjectTypePipe } from './shared/pipes/objectType.pipe';
+import { ObjectArrayTypePipe } from './shared/pipes/objectArrayType.pipe';
+import { reducers } from './shared/reducers';
+import { SQLService } from './shared/services/async-query.service'
+import { AppCoreService } from './shared/services/app-core.service'
+import { MetadataService } from './shared/services/async-metadata.service'
+import { DBModule } from '@ngrx/db';
+import { FormsModule } from '@angular/forms';
+import { MaterialModule } from './material.module';
+import { NgModule } from '@angular/core';
+import { StoreModule,  } from '@ngrx/store';
+import { StoreDevtoolsModule } from '@ngrx/store-devtools';
+import { schema } from './db';
+import { DataTableModule, SharedModule } from 'primeng/primeng';
+import { TreeModule, TreeNode} from 'primeng/primeng';
+import { DialogCreateDataverse, DialogDropDataverse } from './dashboard/metadata/dataverses-collection/dataverses.component';
+import { DialogCreateDataset, DialogDropDataset } from './dashboard/metadata/datasets-collection/datasets.component';
+import { DialogCreateDatatype, DialogDropDatatype } from './dashboard/metadata/datatypes-collection/datatypes.component';
+import { DialogCreateIndex, DialogDropIndex } from './dashboard/metadata/indexes-collection/indexes.component';
+
+
+
+@NgModule({
+  declarations: [
+    AppComponent,
+    AppBarComponent,
+    InputQueryComponent,
+    InputQueryMetadataComponent,
+		QueryOutputComponent,
+    CodemirrorComponent,
+    CodemirrorMetadataComponent,
+		DataverseCollection,
+		DatasetCollection,
+		DatatypeCollection,
+		IndexCollection,
+    KeysPipe,
+		MetadataContainerComponent,
+    MetadataComponent,
+    QueryContainerComponent,
+		AppTabComponent,
+		ObjectTypePipe,
+    ObjectArrayTypePipe,
+    DialogCreateDataverse,
+    DialogDropDataverse,
+    DialogCreateDataset,
+    DialogDropDataset,
+    DialogCreateDatatype,
+    DialogDropDatatype,
+    DialogCreateIndex,
+    DialogDropIndex,
+    SafeHtmlPipe
+  ],
+  imports: [
+    TreeModule,
+    DataTableModule,
+    SharedModule,
+    FormsModule,
+    BrowserModule,
+		BrowserAnimationsModule,
+		DBModule.provideDB(schema),
+		EffectsModule.forRoot([MetadataEffects, DataverseEffects, DatasetEffects, DatatypeEffects, IndexEffects, SQLQueryEffects]),
+    HttpClientModule,
+    MaterialModule,
+		StoreModule.forRoot(reducers),
+		StoreDevtoolsModule.instrument({
+			maxAge: 10
+		})
+  ],
+  entryComponents: [
+    DialogCreateDataverse, 
+    DialogDropDataverse, 
+    DialogCreateDataset, 
+    DialogDropDataset , 
+    DialogCreateDatatype, 
+    DialogDropDatatype,
+    DialogCreateIndex, 
+    DialogDropIndex 
+  ],
+  providers: [AppCoreService, SQLService, MetadataService],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
new file mode 100755
index 0000000..62cf771
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.html
@@ -0,0 +1,45 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<header class="awc-navbar">
+    <nav class="awc-navbar-header">
+      <a mat-button class="awc-button" routerLink="/" aria-label="AsterixDB Web Console">
+      <img class="awc-asterixDB-logo"
+            src="assets/asterixdb_tm.png"
+            alt="AsterixDB">
+            <span>Administration Console</span>
+      </a>
+      <div class="flex-spacer"></div>
+      <a mat-button class="awc-button awc-navbar-hide-small" href="https://asterixDB.apache.org"
+         aria-label="WEBSITE">
+        WEBSITE
+      </a>
+      <a mat-button class="awc-button awc-navbar-hide-small" href="https://issues.apache.org/jira/browse/ASTERIXDB"
+         aria-label="FILE ISSUES">
+        FILE ISSUES
+      </a>
+      <a mat-button class="awc-button awc-navbar-hide-small" href="https://ci.apache.org/projects/asterixdb/index.html"
+         aria-label="DOCUMENTATION">
+        DOCUMENTATION
+      </a>
+      <a mat-button class="awc-button docs-navbar-hide-small" href="https://asterixdb.apache.org/community.html"
+         aria-label="CONTACT">
+        CONTACT
+      </a>
+
+      <a mat-button class="awc-button docs-navbar-hide-small" href="https://github.com/apache/asterixdb/"
+         aria-label="GITHUB">
+        GITHUB
+      </a>
+    </nav>
+</header>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
new file mode 100755
index 0000000..8a764e6
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.scss
@@ -0,0 +1,62 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.awc-navbar {
+  a {
+    //color: #f0f0f0;
+    text-decoration: none;
+  }
+
+  border-bottom: 1px solid  hsla(0,0%,0%,.10);
+  overflow: hidden;
+}
+
+.awc-navbar-header {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  padding: 8px 16px;
+
+  > .mat-button {
+    &:last-child {
+      margin-left: auto;
+    }
+  }
+}
+
+.flex-spacer {
+  flex-grow: 1;
+}
+
+.awc-asterixDB-logo {
+  height: 26px;
+  margin: 0 4px 3px 0;
+  vertical-align: middle;
+}
+
+.awc-github-logo {
+  height: 21px;
+  margin: 0 7px 2px 0;
+  vertical-align: middle;
+}
+
+.awc-navbar-link {
+  text-decoration: inherit;
+  flex: 1;
+}
+
+/*
+* Rules for when the device is detected to be a small screen.
+* Moves content two rows instead of one.
+*/
+//@media (max-width: 720px) {}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
new file mode 100755
index 0000000..563ed11
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/appbar.component.ts
@@ -0,0 +1,25 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component } from '@angular/core';
+
+@Component({
+	moduleId: module.id,
+	selector: 'awc-bar',
+  templateUrl: 'appbar.component.html',
+	styleUrls: ['appbar.component.scss']
+})
+
+export class AppBarComponent {
+	constructor() {}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
new file mode 100755
index 0000000..bd5c963
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.html
@@ -0,0 +1,23 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<div class="content">
+  <mat-tab-group class="menu">
+    <mat-tab label=">_ QUERY">
+      <awc-query-container></awc-query-container>
+    </mat-tab>
+    <mat-tab label="METADATA">
+      <awc-metadata-container></awc-metadata-container>
+    </mat-tab>
+  </mat-tab-group>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
new file mode 100755
index 0000000..4d6fb7b
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.scss
@@ -0,0 +1,26 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.content {
+  width:95%;
+  margin: 0 auto;
+}
+
+.menu {    
+  /deep/ .mat-tab-label {
+      font-size: 0.80rem !important;
+      font-weight: 500  !important;
+  }
+}
+
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
new file mode 100755
index 0000000..b4db7f4
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/apptab.component.ts
@@ -0,0 +1,25 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component } from '@angular/core';
+import { Store } from '@ngrx/store';
+
+@Component({
+  selector: 'awc-tab',
+  templateUrl: 'apptab.component.html',
+  styleUrls: ['apptab.component.scss']
+})
+
+export class AppTabComponent {
+  constructor(private store: Store<any>) {};
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
new file mode 100755
index 0000000..9812ecb
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.scss
@@ -0,0 +1,27 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.textarea-metadata {
+    background-color: red !important;
+    border: 1px solid black !important;
+    padding: 0;
+	margin: 0;
+}
+
+codemirror-metadata {
+    border: 1px solid #eee;
+    height: auto;
+    background-color: blue !important;
+    padding: 0;
+	margin: 0;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
new file mode 100755
index 0000000..aed6ddf
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/codemirror-metadata.component.ts
@@ -0,0 +1,244 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/**
+ * Integrating codemirror (using ng2-codemirror) with our application
+ *
+ * component from "https://runkit.com/npm/ng2-codemirror"
+ *                "https://www.npmjs.com/package/ng2-codemirror"
+ * copy component from /src/codemirror.component.ts
+ * and modified for custom mode (asterix aql, sql++ code hilighting)
+ *
+ * therefore, actually we don't need to "npm install ng2-codemirror"
+ *
+ * Because on the outside of this component,
+ * It was hard to access the codemirror instance that 'ng-codemirror' use
+ * So, we copied the component in our application and modified it
+ *
+ * 'codemirror.js(^5.23.0)' is included in the 'index.html'
+ * And in this component(codemirror.component.ts)
+ * add statement like "declare var CodeMirror: any;"
+ *
+ * I don't know whether this is right way
+ *
+ * ref 1) usage : https://embed.plnkr.co/8e9gxss9u10VeFrv29Zt/
+ * ref 2) custom mode : http://jsfiddle.net/TcqAf/99/
+ * ref 3) integrating : http://stackoverflow.com/questions/37092142/integrating-codemirror-with-angular2-typescript
+ * ref 3) integrating :  https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.8ok74uvwg
+ */
+import {
+    Component,
+    Input,
+    Output,
+    ElementRef,
+    ViewChild,
+    EventEmitter,
+    forwardRef,
+    AfterViewInit,
+    OnDestroy,
+    ChangeDetectionStrategy
+  } from '@angular/core';
+  import { NG_VALUE_ACCESSOR } from '@angular/forms';
+  import * as CodeMirrorMetadata from 'codemirror';
+ 
+ /**
+  * CodeMirror component
+  * Usage :
+  * <codemirror [(ngModel)]="data" [config]="{...}"></codemirror>
+  */
+ @Component({
+   moduleId: module.id,
+   selector: 'codemirror-metadata',
+   providers: [
+     {
+       provide: NG_VALUE_ACCESSOR,
+       useExisting: forwardRef(() => CodemirrorMetadataComponent),
+       multi: true
+     }
+   ],
+   styleUrls: ['codemirror-metadata.component.scss'],
+   template: `<textarea class="textarea-metadata" #hostMetadata></textarea>`,//,
+ })
+ 
+export class CodemirrorMetadataComponent implements AfterViewInit, OnDestroy {
+  @Input() config;
+  @Output() change = new EventEmitter();
+  @Output() focus = new EventEmitter();
+  @Output() blur = new EventEmitter();
+  @Output() instance = null;
+  @ViewChild('hostMetadata') hostMetadata;
+  _value = '';
+ 
+  /**
+  * Constructor
+  */
+  constructor(){
+      /**
+      * Custom mode for AsterixDB
+      */
+      CodeMirrorMetadata.defineMode("asterix", function(){
+        var KEYWORD_MATCH = [
+              // AQL
+              "drop", "dataverse", "dataset",
+              "if", "exists", "create",
+              "use", "type", "as", "closed",
+              "primary", "key",  "hints", "cardinality",
+              "index", "on", "btree", "rtree", "keyword",
+              "for", "in", "Metadata", "Dataset",
+              "return", "Index", "load", "using", "localfs", "path", "format",
+              // Query (not perfect)
+              "from", "in", "with", "group", "by", "select",
+              "let", "where", "order", "asc", "desc", "limit",
+              "keeping", "offset", "distinct", "or", "and",
+              // Built in functions (TODO)
+              // Built in functions (TODO)
+              // Built in functions (TODO)
+              // Asterix Data Model
+              // Primitive type
+              "boolean",
+              "tinyint", "smallint", "integer", "bigint",
+              "float", "double",
+              "string",
+              "binary", "hex", "base64",
+              "point", "line", "rectangle", "circle", "polygon",
+              "date", "time", "datetime", "duration", "interval", "uuid",
+              // Incomplete information type
+              "null", "missing",
+              // Derived type
+              // object {}, array [], multiset {{}}
+              // SQL++
+              "DROP", "DATAVERSE", "IF", "EXISTS", "CREATE", "USE", "TYPE", "AS", "DATASET", "PRIMARY", "KEY",
+              "INDEX", "SELECT", "VALUE", "INSERT", "INTO", "FROM", "WHERE", "AND", "SOME", "IN", "SATISFIES", "IS", "UNKNOWN", "NOT", "EVERY",
+              "GROUP", "BY", "ORDER", "DESC", "LIMIT", "OR", "SET", "DELETE", "LOAD", "USING",
+          ];
+
+          //"(", ")","{{", "}}", "[", "]",	"{", "}",  ";", ",", ":","?", "=",
+        var VAR_MATCH = /[$][a-zA-Z]+(\d*)/;
+        var DOT_MATCH = /[.](\S)*/;
+        var DOUBLE_QUOTE_MATCH = /["].*["]/;
+        var SINGLE_QUOTE_MATCH = /['].*[']/;
+        var BREAK_POINT = /(\s)/;
+
+        return {
+            startState: function() {return {inString: false};},
+            token: function(stream, state) {
+                if (state.newLine == undefined)state.newLine = true;
+
+                //match variable reference
+                if (stream.match(VAR_MATCH)) {
+                    return "variable";
+                }
+
+                if (stream.match(DOT_MATCH)) {
+                    return "dot-variable";
+                }
+
+                //string variable match
+                if (stream.match(DOUBLE_QUOTE_MATCH)) {
+                    return "string";
+                }
+                if (stream.match(SINGLE_QUOTE_MATCH)) {
+                    return "string";
+                }
+
+                //keyword match
+                for (var i in KEYWORD_MATCH){
+                    if (state.newLine && stream.match(KEYWORD_MATCH[i])){
+                            return "keyword";
+                    }
+                }
+
+                if (stream.peek() === " " || stream.peek() === null){
+                    state.newLine = true;
+                }else{
+                    state.newLine = false;
+                }
+                stream.next();
+                return null;
+            }
+        };
+      });
+   }
+ 
+  get value() { return this._value; };
+ 
+  @Input() set value(v) {
+    if (v !== this._value) {
+      this._value = v;
+      this.onChange(v);
+    }
+  }
+
+  /**
+  * On component destroy
+  */
+  ngOnDestroy() {}
+ 
+   /**
+    * On component view init
+    */
+  ngAfterViewInit() {
+  this.config = this.config || {};
+  this.codemirrorInit(this.config); 
+  }
+
+  /**
+  * Initialize codemirror
+  */
+  codemirrorMetadataConfig = 	{ 	mode: "asterix",
+    //lineNumbers: true,
+    lineWrapping: true,
+    showCursorWhenSelecting: true,
+    autofocus: true
+  };
+
+  codemirrorInit(config){
+    this.instance = CodeMirrorMetadata.fromTextArea(this.hostMetadata.nativeElement, this.codemirrorMetadataConfig);
+    this.instance.setSize("100%" , "100px");
+    this.instance.on('change', () => {
+      this.updateValue(this.instance.getValue());
+    });
+
+    this.instance.on('focus', () => {
+      this.focus.emit();
+    });
+
+    this.instance.on('blur', () => {
+      this.blur.emit();
+    });
+  }
+ 
+  /**
+  * Value update process
+  */
+  updateValue(value){
+    this.value = value;
+    this.onTouched();
+    this.change.emit(value);
+  }
+ 
+  /**
+  * Implements ControlValueAccessor
+  */
+  writeValue(value){
+    this._value = value || '';
+    if (this.instance) {
+      this.instance.setValue(this._value);
+    }
+  }
+ 
+  onChange(_) {}
+  onTouched() {}
+  registerOnChange(fn){this.onChange = fn;}
+  registerOnTouched(fn){this.onTouched = fn;}
+} 
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
new file mode 100755
index 0000000..ef88719
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.html
@@ -0,0 +1,14 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<!-- Place holder for future expansion -->
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
new file mode 100755
index 0000000..c969489
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-create-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.dataset-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
new file mode 100755
index 0000000..517006c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.html
@@ -0,0 +1,26 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<div class="dataset-dialog">
+    <p mat-dialog-title>DROP DATASET</p>
+    <mat-dialog-content>
+        <p>PLEASE GIVE THE NAME OF THE DATASET TO DROP</p>
+    </mat-dialog-content>
+        <mat-form-field>
+            <input matInput tabindex="0" [(ngModel)]="data.datasetName">
+        </mat-form-field>
+    <mat-dialog-actions>
+        <button mat-button (click)="onClick()" tabindex="1">DROP</button>
+        <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+    </mat-dialog-actions>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
new file mode 100755
index 0000000..c969489
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/dataset-drop-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.dataset-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
new file mode 100755
index 0000000..f556951
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.html
@@ -0,0 +1,112 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<div class="container" (click)="onClick()">
+  <div class="master">
+      <mat-card class="datasets-card" *ngIf="loaded$ | async as ld">
+        <mat-toolbar color="primary" class="datasets-selector">
+            <mat-icon class="icon">menu</mat-icon>
+            <span>DATASETS - METADATA</span>
+            <span class="spacer"></span>
+        </mat-toolbar>
+        <mat-card-content class="datasets-content">
+            <mat-table #table [dataSource]="dataSource" class="datasets-table">
+                <!-- CompactionPolicy Column -->
+                <ng-container matColumnDef="CompactionPolicy">
+                  <mat-header-cell *matHeaderCellDef class="header-compactionpolicy-cell">Compaction Policy</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-compactionpolicy-cell"> {{element.CompactionPolicy}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetId Column -->
+                <ng-container matColumnDef="DatasetId">
+                  <mat-header-cell *matHeaderCellDef class="header-datasetid-cell">Dataset Id</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-datasetid-cell"> {{element.DatasetId}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetName Column -->
+                <ng-container matColumnDef="DatasetName">
+                  <mat-header-cell *matHeaderCellDef class="header-datasetname-cell">Dataset Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-datasetname-cell"> {{element.DatasetName}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetType Column -->
+                <ng-container matColumnDef="DatasetType">
+                  <mat-header-cell *matHeaderCellDef class="header-datasettype-cell">Dataset Type</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-datasettype-cell"> {{element.DatasetType}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatatypeDataverseName Column -->
+                <ng-container matColumnDef="DatatypeDataverseName">
+                  <mat-header-cell *matHeaderCellDef class="header-datatypedataversename-cell">Datatype Dataverse Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-datatypedataversename-cell"> {{element.DatatypeDataverseName}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatatypeName Column -->
+                <ng-container matColumnDef="DatatypeName">
+                  <mat-header-cell *matHeaderCellDef class="header-datatypename-cell">Datatype Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-datatypename-cell"> {{element.DatatypeName}} </mat-cell>
+                </ng-container>
+    
+                <!-- DataverseName Column -->
+                <ng-container matColumnDef="DataverseName">
+                  <mat-header-cell *matHeaderCellDef class="header-dataversename-cell">Dataverse Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-dataversename-cell"> {{element.DataverseName}} </mat-cell>
+                </ng-container>
+    
+                <!-- GroupName Column -->
+                <ng-container matColumnDef="GroupName">
+                  <mat-header-cell *matHeaderCellDef class="header-groupname-cell">Group Name</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-groupname-cell"> {{element.GroupName}} </mat-cell>
+                </ng-container>
+    
+                <!-- PendingOp Column -->
+                <ng-container matColumnDef="PendingOp">
+                  <mat-header-cell *matHeaderCellDef class="header-pendingop-cell">Pending Op</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-pendingop-cell"> {{element.PendingOp}} </mat-cell>
+                </ng-container>
+    
+                <!-- DatasetType Column -->
+                <ng-container matColumnDef="Timestamp">
+                  <mat-header-cell *matHeaderCellDef class="header-timestamp-cell">Timestamp</mat-header-cell>
+                  <mat-cell *matCellDef="let element" class="dataset-timestamp-cell"> {{element.Timestamp}} </mat-cell>
+                </ng-container>
+    
+                <mat-header-row *matHeaderRowDef="['DatasetName', 'DataverseName', 'DatatypeName', 'Timestamp']"></mat-header-row>
+                <mat-row *matRowDef="let row; columns: ['DatasetName', 'DataverseName', 'DatatypeName', 'Timestamp'];"
+                  [ngClass]="{'highlight': selectedRowIndex == row.id}"
+                  (click)="highlight(row)">
+                </mat-row>
+            </mat-table>
+        </mat-card-content>
+        <mat-card-actions class="actions">
+            <button class="refresh-button" mat-button (click)="openDropDatasetDialog()">DROP</button>
+            <span class="error-message">{{errorMessage}}</span>
+            <span class="spacer"></span>
+            <button class="refresh-button" mat-button (click)="getDatasets()">REFRESH</button>
+        </mat-card-actions>
+      </mat-card>
+      <awc-query-metadata #querymetadata class="query"></awc-query-metadata>
+  </div>
+  <div class="detail">
+      <mat-card class="datasets-details-card">
+          <mat-toolbar color="primary" class="datasets-selector">
+              <mat-icon class="icon">menu</mat-icon>
+              <span>DATASET - METADATA - DETAILS</span>
+              <span class="spacer"></span>
+          </mat-toolbar>
+          <mat-card-content class="datasets-content output">
+            <span><pre>{{output}}</pre></span>
+          </mat-card-content>
+        </mat-card>
+  </div>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
new file mode 100755
index 0000000..38a8272
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.scss
@@ -0,0 +1,415 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$datasets-spacing-unit: 8px;
+
+.container {
+  display: flex;
+	flex-flow: row;
+	padding: 0;
+  margin: 0;
+}
+
+.master {
+  width: 60%;
+  overflow: hidden;
+}
+
+.detail {
+  width: 40%;
+  overflow: hidden;
+}
+
+.datasets-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin-top: ($datasets-spacing-unit * 2);
+  min-height: 450px;
+  max-height: 450px;
+  //min-width: 98%; //(100vw / 2);
+  //max-width: 98%; // (100vw / 2);
+  width: 95%; // 98%;
+  overflow: hidden;
+}
+
+.datasets-details-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin: ($datasets-spacing-unit * 2);
+  min-height: 716px;
+  max-height: 716px;
+  //min-width: 95%; //(100vw / 2);
+  //max-width: 95%; // (100vw / 2);
+  overflow: hidden;
+}
+
+.icon {
+	padding: 0 14px 0 0;
+	margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.datasets-selector {
+	min-height: 42px;
+	max-height: 42px;
+	justify-content: center;
+	font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.datasets-content {
+  position:relative;
+  top: 0;
+  left: 0;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+}
+
+.datasets-table {
+  margin: $datasets-spacing-unit !important;
+  height: 330px;
+  overflow: auto;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.example-header {
+  min-height: 64px;
+  display: flex;
+  align-items: center;
+  padding-left: 24px;
+  font-size: 20px;
+}
+
+.mat-table {
+  overflow: auto;
+}
+
+.customWidthClass{
+   flex: 0 0 250px;
+}
+
+.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-header-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.header-compactionpolicy-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-compactionpolicy-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasetid-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasetid-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datasettype-cell {
+  border: none;
+  font-size: 12px;
+  //letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datasettype-cell {
+  border: none;
+  font-size: 12px;
+  //letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datatypedataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datatypedataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+
+.header-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.dataset-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datasets-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datasets-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.example-header {
+  min-height: 56px;
+  max-height: 56px;
+  display: flex;
+  align-items: center;
+  padding: 8px 24px 0;
+  font-size: 20px;
+  justify-content: space-between;
+  border-bottom: 1px solid transparent;
+}
+
+.mat-form-field {
+  font-size: 14px;
+  flex-grow: 1;
+  margin-top: 8px;
+}
+
+.example-no-results {
+  display: flex;
+  justify-content: center;
+  padding: 24px;
+  font-size: 12px;
+  font-style: italic;
+}
+
+.actions {
+  display: flex;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  padding: $datasets-spacing-unit;
+  margin: 0;
+}
+
+.error-message {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding-top: 10px;  
+  padding-left: 20px;
+  text-overflow: ellipsis;
+}
+
+.output {
+  padding-left: ($datasets-spacing-unit * 2);
+}
+
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.ts
new file mode 100755
index 0000000..0fe8c74
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datasets-collection/datasets.component.ts
@@ -0,0 +1,231 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ElementRef, ViewChild, Inject, Input } from '@angular/core';
+import { Dataset } from '../../../shared/models/asterixDB.model'
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as datasetActions from '../../../shared/actions/dataset.actions'
+import {DataSource} from '@angular/cdk/collections';
+import {BehaviorSubject} from 'rxjs/BehaviorSubject';
+import { Subscription } from "rxjs/Rx";
+import { State } from '../../../shared/reducers/dataset.reducer';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { MatPaginator } from '@angular/material';
+import { SelectionModel } from '@angular/cdk/collections';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+/**
+ * Root component
+ * Defines our application's layout
+ */
+@Component({
+  selector: 'awc-datasets',
+  templateUrl: 'datasets.component.html',
+  styleUrls: ['datasets.component.scss']
+})
+
+export class DatasetCollection {
+  displayedColumns = "['CompactionPolicy', 'DatasetId', 'DatasetName', 'DatasetType', 'DatatypeDataverseName', 'DatatypeName', 'DataverseName', 'GroupName', 'PendingOp', 'Timestamp']"
+
+/*
+  compactionPolicy: string;
+  compactionPolicyProperties: CompactionPolicyProperties[]; *
+  datasetId: string;
+  datasetName: string;
+  datasetType:string;
+  datatypeDataverseName: string;
+  datatypeName: string;
+  dataverseName: string;
+  groupName:string;
+  hints: string[]; *
+  internalDetails: InternalDetails; *
+  pendingOp: string;
+  timestamp: string; */
+  datasetName: string;  
+  dataSource: DatasetDataSource | null;
+  loaded$: Observable<any>
+  @Input('message') errorMessage: string = ""
+  dsName = "";
+
+  constructor(private store: Store<any>, public dialog: MatDialog) {
+    this.loaded$ = this.store.select('dataset');
+
+    // Watching the name of the latest create dataset
+    this.store.select(s => s.dataset.createDatasetName).subscribe((data: any) => {
+      this.dsName = data;
+    })
+
+    // Watching the name of the latest drop dataset
+    this.store.select(s => s.dataset.dropDatasetName).subscribe((data: any) => {
+      this.dsName = data;
+    })
+
+    // Watching for the if there is a change in the collection
+		this.store.select(s => s.dataset.createDatasetSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDatasets();
+        this.errorMessage = "SUCCEED: CREATE DATASET " + this.dsName;
+      }  
+    })
+
+    // Watching for the if there is a error in a create dataset operation 
+		this.store.select(s => s.dataset.createDatasetError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+
+
+    // Watching for the success message in a drop dataset operation 
+    this.store.select(s => s.dataset.dropDatasetSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDatasets();
+        this.errorMessage = "SUCCEED: DROP DATASET " + this.dsName;
+      }  
+    })
+
+    // Watching for the if there is a error in a drop dataset operation 
+		this.store.select(s => s.dataset.dropDatasetError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+  }
+
+  getDatasets() {
+    // Trigger the effect to refresh the dataset
+    this.store.dispatch(new datasetActions.SelectDatasets('-'));
+  }
+
+  ngOnInit() {
+    // Assign the datasource for the table 
+    this.dataSource = new DatasetDataSource(this.store);
+  }
+
+  /* 
+  * opens the create dataverse dialog
+  */
+  openCreateDatasetDialog(): void {
+    let dialogRef = this.dialog.open(DialogCreateDataset, {
+      width: '420px',
+      data: { name: this.datasetName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.datasetName = result;
+    });
+  }
+
+  /* 
+  * opens the drop dataverse dialog
+  */
+  openDropDatasetDialog(): void {
+    let dialogRef = this.dialog.open(DialogDropDataset, {
+      width: '420px',
+      data: { name: this.datasetName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.datasetName = result;
+    });
+  }
+
+  /* 
+  * Clean up the error message on the screen
+  */
+  onClick(): void {
+    this.errorMessage = "";
+  }
+
+  output: any;
+
+  highlight(row){
+    this.output = JSON.stringify(row, null, 2);
+  }
+
+  @ViewChild('querymetadata') inputQuery;
+  
+  /* Cleans up error message */
+  cleanUp() {
+    this.errorMessage = ""; 
+    // Cascading   
+    this.inputQuery.cleanUp(); 
+  }
+}
+
+@Component({
+  selector: 'dataset-create-dialog',
+  templateUrl: 'dataset-create-dialog.component.html',
+  styleUrls: ['dataset-create-dialog.component.scss']
+})
+
+export class DialogCreateDataset {
+  constructor(  private store: Store<any>,
+                public dialogCreateDsRef: MatDialogRef<DialogCreateDataset>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new datasetActions.CreateDataset(this.data.datasetName));
+    this.dialogCreateDsRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogCreateDsRef.close();
+  }
+}
+
+@Component({
+  selector: 'dataset-drop-dialog',
+  templateUrl: 'dataset-drop-dialog.component.html',
+  styleUrls: ['dataset-drop-dialog.component.scss']
+})
+
+export class DialogDropDataset {
+  constructor(  private store: Store<any>,
+                public dialogDropDsRef: MatDialogRef<DialogDropDataset>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new datasetActions.DropDataset(this.data.datasetName));
+    this.dialogDropDsRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogDropDsRef.close();
+  }
+}
+
+export class DatasetDataSource extends DataSource<any> {
+  private datasets$: Observable<any>
+  constructor(private store: Store<any>) {
+    super();
+    this.datasets$ = this.store.select(s => s.dataset.datasets.results);
+  }
+
+  /** Connect function called by the table to retrieve one stream containing the data to render. */
+  connect(): Observable<Dataset[]> {
+      const displayDataChanges = [
+        this.datasets$,
+      ];
+
+    return this.datasets$;
+  }
+
+  disconnect() {}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.html
new file mode 100755
index 0000000..aca06fd
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.html
@@ -0,0 +1,14 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<!-- Place holder for future expansion -->
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.scss
new file mode 100755
index 0000000..9502a7e
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-create-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.datatype-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.html
new file mode 100755
index 0000000..1157261
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.html
@@ -0,0 +1,26 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<div class="datatype-dialog">
+    <p mat-dialog-title>DROP DATATYPE</p>
+    <mat-dialog-content>
+        <p>PLEASE GIVE THE NAME OF THE DATATYPE TO DROP</p>
+    </mat-dialog-content>
+        <mat-form-field>
+            <input matInput tabindex="0" [(ngModel)]="data.datatypeName">
+        </mat-form-field>
+    <mat-dialog-actions>
+        <button mat-button (click)="onClick()" tabindex="1">DROP</button>
+        <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+    </mat-dialog-actions>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.scss
new file mode 100755
index 0000000..9502a7e
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatype-drop-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.datatype-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.html
new file mode 100755
index 0000000..e580a54
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.html
@@ -0,0 +1,70 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<div class="container" (click)="onClick()">
+  <div class="master">
+   <mat-card class="datatypes-card" *ngIf="loaded$ | async as ld">
+      <mat-toolbar color="primary" class="datatypes-selector">
+          <mat-icon class="icon">menu</mat-icon>
+          <span>DATATYPES - METADATA</span>
+          <span class="spacer"></span>
+      </mat-toolbar>
+      <mat-card-content class="datatypes-content">
+        <mat-table #table [dataSource]="dataSource" class="datatypes-table" role="treegrid">
+            <!-- Datatype Name -->
+            <ng-container matColumnDef="DatatypeName">
+              <mat-header-cell *matHeaderCellDef class="header-datatypename-cell">Datatype Name</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="datatypes-datatypename-cell">{{element.DatatypeName}} </mat-cell>
+            </ng-container>
+
+            <!-- Data Type Dataverse Name -->
+            <ng-container matColumnDef="DataverseName">
+              <mat-header-cell *matHeaderCellDef class="header-dataversename-cell">Dataverse Name </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="datatypes-dataversename-cell">{{element.DataverseName}} </mat-cell>
+            </ng-container>
+
+            <!-- Timestamp Column -->
+            <ng-container matColumnDef="Timestamp">
+              <mat-header-cell *matHeaderCellDef class="header-timestamp-cell">Timestamp</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="datatypes-timestamp-cell">{{element.Timestamp}}</mat-cell>
+            </ng-container>
+
+            <mat-header-row *matHeaderRowDef="['DatatypeName', 'DataverseName', 'Timestamp']"></mat-header-row>
+            <mat-row *matRowDef="let row; columns: ['DatatypeName', 'DataverseName', 'Timestamp'];"
+                [ngClass]="{'highlight': selectedRowIndex == row.id}"
+                (click)="highlight(row)">
+            </mat-row>
+        </mat-table>
+      </mat-card-content>
+      <mat-card-actions class="actions">
+          <button class="refresh-button" mat-button (click)="openDropDatatypeDialog()">DROP</button>
+          <span class="error-message">{{errorMessage}}</span>
+          <span class="spacer"></span>
+          <button class="refresh-button" mat-button (click)="getDatatypes()">REFRESH</button>
+      </mat-card-actions>
+    </mat-card> 
+    <awc-query-metadata #querymetadata class="query"></awc-query-metadata>
+  </div>
+  <div class="detail">
+      <mat-card class="datatypes-details-card">
+          <mat-toolbar color="primary" class="datatypes-selector">
+              <mat-icon class="icon">menu</mat-icon>
+              <span>DATATYPE - METADATA - DETAILS</span>
+              <span class="spacer"></span>
+          </mat-toolbar>
+          <mat-card-content class="datatypes-content output">
+            <span><pre>{{output}}</pre></span>
+          </mat-card-content>
+        </mat-card>
+  </div>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.scss
new file mode 100755
index 0000000..d4aeffc
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.scss
@@ -0,0 +1,267 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$datatypes-spacing-unit: 8px;
+
+.container {
+  display: flex;
+	flex-flow: row;
+	padding: 0;
+  margin: 0;
+}
+
+.master {
+  width: 60%;
+  overflow: hidden;
+}
+
+.detail {
+  width: 40%;
+  overflow: hidden;
+}
+
+.datatypes-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin-top: ($datatypes-spacing-unit * 2);
+  min-height: 450px;
+  max-height: 450px;
+  //min-width: 98%; //(100vw / 2);
+  //max-width: 98%; // (100vw / 2);
+  width: 95%; // 98%;
+  overflow: hidden;
+}
+
+.datatypes-details-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin: ($datatypes-spacing-unit * 2);
+  min-height: 716px;
+  max-height: 716px;
+  //min-width: 95%; //(100vw / 2);
+  //max-width: 95%; // (100vw / 2);
+  overflow: hidden;
+}
+
+.icon {
+	padding: 0 14px 0 0;
+	margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.datatypes-selector {
+	min-height: 42px;
+	max-height: 42px;
+	justify-content: center;
+	//align-items: center;
+	font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.datatypes-content {
+  position:relative;
+  top: 0;
+  left: 0;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+}
+
+.datatypes-table {
+  margin: $datatypes-spacing-unit !important;
+  height: 330px;
+  overflow: auto;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.datatypes-toolbar {
+	display: block;
+  min-height: 56px;
+	height: 56px;
+//	width: 250px;
+  font-size: 12px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+	letter-spacing: 1px;
+	font-weight: 400;
+	background: rgba(0,0,1, .80);
+}
+
+.example-header {
+  min-height: 64px;
+  display: flex;
+  align-items: center;
+  padding-left: 24px;
+  font-size: 20px;
+}
+
+.mat-table {
+  overflow: auto;
+}
+
+.customWidthClass{
+   flex: 0 0 75px;
+}
+
+.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-header-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.header-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 400px;
+}
+
+.datatypes-datatypename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 400px;
+}
+
+.header-dataversename-cell {
+  display: flex;
+  justify-content: center;
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.datatypes-dataversename-cell {
+  display: flex;
+  justify-content: center;
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  flex: 0 0 250px;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.datatypes-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $datatypes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($datatypes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.example-header {
+  min-height: 56px;
+  max-height: 56px;
+  display: flex;
+  align-items: center;
+  padding: 8px 24px 0;
+  font-size: 20px;
+  justify-content: space-between;
+  border-bottom: 1px solid transparent;
+}
+
+.mat-form-field {
+  font-size: 14px;
+  flex-grow: 1;
+  margin-top: 8px;
+}
+
+.example-no-results {
+  display: flex;
+  justify-content: center;
+  padding: 24px;
+  font-size: 12px;
+  font-style: italic;
+}
+
+.actions {
+  display: flex;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  padding: $datatypes-spacing-unit;
+  margin: 0;
+}
+
+.error-message {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding-top: 10px;  
+  padding-left: 20px;
+  text-overflow: ellipsis;
+}
+
+.output {
+  padding-left: ($datatypes-spacing-unit * 2);
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.ts
new file mode 100755
index 0000000..953a27e
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/datatypes-collection/datatypes.component.ts
@@ -0,0 +1,220 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ChangeDetectionStrategy, Inject, Input } from '@angular/core';
+import { Datatype } from '../../../shared/models/asterixDB.model'
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as datatypeActions from '../../../shared/actions/datatype.actions'
+import { ElementRef, ViewChild} from '@angular/core';
+import {DataSource} from '@angular/cdk/collections';
+import {BehaviorSubject} from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from "rxjs/Rx";
+import { State } from '../../../shared/reducers/datatype.reducer';
+import { MatPaginator } from '@angular/material';
+import { SelectionModel } from '@angular/cdk/collections';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+@Component({
+  selector: 'awc-datatypes',
+  templateUrl: 'datatypes.component.html',
+  styleUrls: ['datatypes.component.scss']
+})
+
+export class DatatypeCollection {
+  displayedColumns = "['datatypeName', 'dataverseName', 'timeStamp']"
+  /*
+  datatypeName: string;
+  dataverseName: string;
+  derived: DatatypeDerived;
+  timeStamp: string;
+  */
+  datatypeName: string;
+  dataSource: DatatypeDataSource | null;
+  loaded$: Observable<any>;
+  @ViewChild(MatPaginator) paginator: MatPaginator;
+  @ViewChild('filter') filter: ElementRef;
+  selection = new SelectionModel<string>(true, []);
+  @Input('message') errorMessage: string = ""
+  dtName = "";
+  
+  constructor(private store: Store<any>, public dialog: MatDialog) {
+    this.loaded$ = this.store.select('datatype');
+    // Watching the name of the latest create datatype
+    this.store.select(s => s.datatype.createDatatypeName).subscribe((data: any) => {
+      this.dtName = data;
+    })
+
+    // Watching the name of the latest drop datatype
+    this.store.select(s => s.datatype.dropDatatypeName).subscribe((data: any) => {
+      this.dtName = data;
+    })
+
+    // Watching for the if there is a change in the collection
+		this.store.select(s => s.datatype.createDatatypeSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDatatypes();
+        this.errorMessage = "SUCCEED: CREATE DATATYPE " + this.dtName;
+      }  
+    })
+
+    // Watching for the if there is a error in a create datatype operation 
+		this.store.select(s => s.datatype.createDatatypeError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+
+    // Watching for the success message in a drop datatype operation 
+    this.store.select(s => s.datatype.dropDatatypeSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDatatypes();
+        this.errorMessage = "SUCCEED: DROP DATATYPE " + this.dtName;
+      }  
+    })
+
+    // Watching for the if there is a error in a drop datatype operation 
+		this.store.select(s => s.datatype.dropDatatypeError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+  }
+
+  getDatatypes() {
+    // Triggers the effect to refresg the datatypes
+    this.store.dispatch(new datatypeActions.SelectDatatypes('-'));
+  }
+
+  ngOnInit() {
+    // Assign the datasource for the table 
+    this.dataSource = new DatatypeDataSource(this.store);
+  }
+
+   /* 
+  * opens the create datatype dialog
+  */
+  openCreateDatatypeDialog(): void {
+    let dialogRef = this.dialog.open(DialogCreateDatatype, {
+      width: '420px',
+      data: { name: this.datatypeName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.datatypeName = result;
+    });
+  }
+
+  /* 
+  * opens the drop datatype dialog
+  */
+  openDropDatatypeDialog(): void {
+    let dialogRef = this.dialog.open(DialogDropDatatype, {
+      width: '420px',
+      data: { name: this.datatypeName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.datatypeName = result;
+    });
+  }
+
+  onClick(): void {
+    this.errorMessage = "";
+  }
+
+  /* Showing all the datatype metadata information */
+  output: any;
+  
+  highlight(row){
+    this.output = JSON.stringify(row, null, 2);
+  }
+
+  @ViewChild('querymetadata') inputQuery;
+
+  /* Cleans up error message */
+  cleanUp() {
+    this.errorMessage = ""; 
+    // Cascading   
+    this.inputQuery.cleanUp();    
+  }
+}
+
+@Component({
+  selector: 'datatype-create-dialog',
+  templateUrl: 'datatype-create-dialog.component.html',
+  styleUrls: ['datatype-create-dialog.component.scss']
+})
+
+export class DialogCreateDatatype {
+  constructor(  private store: Store<any>,
+                public dialogCreateDtRef: MatDialogRef<DialogCreateDatatype>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new datatypeActions.CreateDatatype(this.data.datasetName));
+    this.dialogCreateDtRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogCreateDtRef.close();
+  }
+}
+
+@Component({
+  selector: 'datatypes-drop-dialog',
+  templateUrl: 'datatype-drop-dialog.component.html',
+  styleUrls: ['datatype-drop-dialog.component.scss']
+})
+
+export class DialogDropDatatype {
+  constructor(  private store: Store<any>,
+                public dialogDropDtRef: MatDialogRef<DialogDropDatatype>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new datatypeActions.DropDatatype(this.data.datatypeName));
+    this.dialogDropDtRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogDropDtRef.close();
+  }
+}
+
+export class DatatypeDataSource extends DataSource<any> {
+    private datatypes$: Observable<any>
+
+    constructor(private store: Store<any>) {
+      super();
+      this.datatypes$ = this.store.select(s => s.datatype.datatypes.results);
+    }
+
+    /** Connect function called by the table to retrieve one stream containing the data to render. */
+    connect(): Observable<Datatype[]> {
+        const displayDataChanges = [
+          this.datatypes$,
+        //  this._filterChange,
+        ];
+
+      return this.datatypes$;
+    }
+
+    disconnect() {}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.html
new file mode 100755
index 0000000..5159e38
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.html
@@ -0,0 +1,27 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<div class="dataverse-dialog">
+    <p mat-dialog-title>CREATE DATAVERSE</p>
+    <mat-dialog-content>
+        <p>GIVE A NAME TO THE NEW DATAVERSE</p>
+    </mat-dialog-content>
+    <mat-form-field>
+        <input matInput tabindex="0" [(ngModel)]="data.dataverseName">
+    </mat-form-field>
+    </div>
+    <div mat-dialog-actions>
+    <button mat-button [mat-dialog-close]="data.dataverseName" (click)="onClick()" tabindex="1">CREATE</button>
+    <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+</div>
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.scss
new file mode 100755
index 0000000..6371068
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-create-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.dataverse-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.html
new file mode 100755
index 0000000..b546a70
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.html
@@ -0,0 +1,26 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<div class="dataverse-dialog">
+    <p mat-dialog-title>DROP DATAVERSE</p>
+    <mat-dialog-content>
+        <p>PLEASE GIVE THE NAME OF THE DATAVERSE TO DROP</p>
+    </mat-dialog-content>
+        <mat-form-field>
+            <input matInput tabindex="0" [(ngModel)]="data.dataverseName">
+        </mat-form-field>
+    <mat-dialog-actions>
+        <button mat-button (click)="onClick()" tabindex="1">DROP</button>
+        <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+    </mat-dialog-actions>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.scss
new file mode 100755
index 0000000..6371068
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses-drop-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.dataverse-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.html
new file mode 100755
index 0000000..4099704
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.html
@@ -0,0 +1,77 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<div class="container" (click)="onClick()">
+  <div class="master">
+    <mat-card class="dataverses-card">
+      <mat-toolbar color="primary" class="dataverses-selector">
+          <mat-icon class="icon">menu</mat-icon>
+          <span>DATAVERSES - METADATA</span>
+          <span class="spacer"></span>
+      </mat-toolbar>
+      <mat-card-content class="dataverses-content">
+        <mat-table #table [dataSource]="dataSource" class="dataverses-table" *ngIf="loaded$ | async as ld">
+            <!-- Dataverse Name Column -->
+            <ng-container matColumnDef="DataverseName">
+              <mat-header-cell *matHeaderCellDef class="header-name-cell">Dataverse Name</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="dataverse-name-cell">{{element.DataverseName}}</mat-cell>
+            </ng-container>
+
+            <!-- Data Format Column -->
+            <ng-container matColumnDef="DataFormat">
+              <mat-header-cell *matHeaderCellDef class="header-dataformat-cell">Data Format</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="dataverse-dataformat-cell">{{element.DataFormat}}</mat-cell>
+            </ng-container>
+
+            <!-- Pending Ops -->
+            <ng-container matColumnDef="PendingOp">
+              <mat-header-cell *matHeaderCellDef class="header-pendingop-cell">Pending Ops</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="dataverse-pendingop-cell">{{element.PendingOp}}</mat-cell>
+            </ng-container>
+
+            <!-- Timestamp Column -->
+            <ng-container matColumnDef="Timestamp">
+              <mat-header-cell *matHeaderCellDef class="header-timestamp-cell">Timestamp</mat-header-cell>
+              <mat-cell *matCellDef="let element" class="dataverse-timestamp-cell">{{element.Timestamp}}</mat-cell>
+            </ng-container>
+
+            <mat-header-row *matHeaderRowDef="['DataverseName',  'DataFormat', 'Timestamp']"></mat-header-row>
+            <mat-row *matRowDef="let row; columns: ['DataverseName', 'DataFormat', 'Timestamp'];"
+              [ngClass]="{'highlight': selectedRowIndex == row.id}"
+              (click)="highlight(row)">
+            </mat-row>
+        </mat-table>
+      </mat-card-content>
+      <mat-card-actions class="actions">
+          <button class="refresh-button" mat-button (click)="openCreateDataverseDialog()">CREATE</button>
+          <button class="refresh-button" mat-button (click)="openDropDataverseDialog()">DROP</button>
+          <span class="error-message">{{errorMessage}}</span>
+          <span class="spacer"></span>
+          <button class="refresh-button" mat-button (click)="getDataverse()">REFRESH</button>
+      </mat-card-actions>
+    </mat-card>
+  <awc-query-metadata #querymetadata class="query"></awc-query-metadata>  
+  </div>
+  <div class="detail">
+      <mat-card class="dataverses-details-card">
+          <mat-toolbar color="primary" class="dataverses-selector">
+              <mat-icon class="icon">menu</mat-icon>
+              <span>DATAVERSE - METADATA - DETAILS</span>
+              <span class="spacer"></span>
+          </mat-toolbar>
+          <mat-card-content class="dataverses-content output">
+            <span><pre>{{output}}</pre></span>
+          </mat-card-content>
+        </mat-card>
+  </div>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.scss
new file mode 100755
index 0000000..2821766
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.scss
@@ -0,0 +1,259 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$dataverses-spacing-unit: 8px;
+
+.container {
+  display: flex;
+	flex-flow: row;
+	padding: 0;
+  margin: 0;
+}
+
+.master {
+  width: 60%;
+}
+
+.detail {
+  width: 40%;
+}
+
+.dataverses-card {
+  display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin-top: ($dataverses-spacing-unit * 2);
+  min-height: 450px;
+  max-height: 450px;
+  //min-width: 98%; //(100vw / 2);
+  //max-width: 98%; // (100vw / 2);
+  width: 95%; // 98%;
+  overflow: hidden;
+}
+
+.dataverses-details-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin: ($dataverses-spacing-unit * 2);
+  min-height: 716px;
+  max-height: 716px;
+  //min-width: 95%; //(100vw / 2);
+  //max-width: 95%; // (100vw / 2);
+  overflow: hidden;
+}
+
+.icon {
+	padding: 0 14px 0 0;
+	margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.dataverses-selector {
+	min-height: 42px;
+	max-height: 42px;
+	justify-content: center;
+	font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+//.metadata-content-area {
+//	padding: ($dataverses-spacing-unit * 2);
+//	margin: 0;
+//	overflow: auto;
+//}
+
+
+.dataverses-content {
+  position:relative;
+  top: 0;
+  left: 0;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+}
+
+.dataverses-table {
+  margin: $dataverses-spacing-unit !important;
+  height: 330px;
+  overflow: auto;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.example-header {
+  min-height: 64px;
+  display: flex;
+  align-items: center;
+  padding-left: 24px;
+  font-size: 20px;
+}
+
+.mat-table {
+  overflow: auto;
+}
+
+.customWidthClass{
+   flex: 0 0 75px;
+}
+
+.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-header-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.header-name-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+  text-transform: uppercase;
+}
+
+.header-dataformat-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 400px;
+  text-transform: uppercase;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+  text-transform: uppercase;
+}
+
+.dataverse-name-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.dataverse-dataformat-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 400px;
+}
+
+.dataverse-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $dataverses-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($dataverses-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.example-header {
+  min-height: 56px;
+  max-height: 56px;
+  display: flex;
+  align-items: center;
+  padding: 8px 24px 0;
+  font-size: 20px;
+  justify-content: space-between;
+  border-bottom: 1px solid transparent;
+}
+
+.mat-form-field {
+  font-size: 14px;
+  flex-grow: 1;
+  margin-top: 8px;
+}
+
+.example-no-results {
+  display: flex;
+  justify-content: center;
+  padding: 24px;
+  font-size: 12px;
+  font-style: italic;
+}
+
+.actions {
+  display: flex;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  padding: $dataverses-spacing-unit;
+  margin: 0;
+}
+
+.error-message {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding-top: 10px;  
+  padding-left: 20px;
+  text-overflow: ellipsis;
+}
+
+.highlight{
+  background: #42A948; /* green */
+}
+
+.output {
+  padding-left: ($dataverses-spacing-unit * 2);
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.ts
new file mode 100755
index 0000000..981f029
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/dataverses-collection/dataverses.component.ts
@@ -0,0 +1,234 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ChangeDetectionStrategy, Inject, OnInit, AfterViewChecked, AfterViewInit, Input} from '@angular/core';
+import { Dataverse } from '../../../shared/models/asterixDB.model'
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as dataverseActions from '../../../shared/actions/dataverse.actions'
+import { ElementRef, ViewChild} from '@angular/core';
+import { DataSource } from '@angular/cdk/collections';
+import { BehaviorSubject } from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from "rxjs/Rx";
+import * as fromRoot from '../../../shared/reducers/dataverse.reducer';
+import { State } from '../../../shared/reducers/dataverse.reducer';
+import { MatPaginator } from '@angular/material';
+import { SelectionModel } from '@angular/cdk/collections';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+@Component({
+  selector: 'awc-dataverses',
+  templateUrl: 'dataverses.component.html',
+  styleUrls: ['dataverses.component.scss'],
+})
+
+export class DataverseCollection implements OnInit, AfterViewChecked, AfterViewInit {
+  dataverseName: string;
+  displayedColumns = ['DataverseName', 'Dataformat', 'Timestamp', 'PendingOp'];
+  dataSource: DataversesDataSource | null;
+  loaded$: Observable<any>;
+  selection = new SelectionModel<string>(true, []);
+  @Input('message') errorMessage: string = ""
+  dvName = "";
+
+  constructor(private store: Store<any>, public dialog: MatDialog) {
+    this.loaded$ = this.store.select('dataverse');
+    
+    // Watching the name of the latest created dataset
+    this.store.select(s => s.dataverse.createDataverseName).subscribe((data: any) => {
+      this.dvName = data;
+    })
+
+    // Watching for the success message in a drop dataset operation 
+    this.store.select(s => s.dataverse.dropDataverseName).subscribe((data: any) => {
+      this.dvName = data;
+    })
+
+    // Watching for the if there is a change in the collection
+		this.store.select(s => s.dataverse.createDataverseSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDataverse();
+        this.errorMessage = "SUCCEED: CREATED DATAVERSE " + this.dvName + " ";
+      }  
+    })
+
+    // Watching for the if there is a error in a create dataverse operation 
+		this.store.select(s => s.dataverse.createDataverseError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+
+    // Watching for the if there is a change in the collection
+		this.store.select(s => s.dataverse.dropDataverseSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getDataverse();
+        this.errorMessage = "SUCCEED: DROP DATAVERSE " + this.dvName;
+      }  
+    })
+
+    // Watching for the if there is a error in a drop dataverse operation 
+		this.store.select(s => s.dataverse.dropDataverseError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+  }
+
+  getDataverse() {
+    // Triggers the effect to refresg the dataverse
+    this.store.dispatch(new dataverseActions.SelectDataverses('-'));
+  }
+
+  ngOnInit() {
+    // Assign the datasource for the table 
+    this.dataSource = new DataversesDataSource(this.store);
+  }
+
+  ngAfterViewChecked() {}
+
+  ngAfterViewInit() {}
+
+
+  /* 
+  * opens the create dataverse dialog
+  */
+  openCreateDataverseDialog(): void {
+    let dialogRef = this.dialog.open(DialogCreateDataverse, {
+      width: '420px',
+      data: { name: this.dataverseName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      //reference code
+      //this.dvName = result;
+    });
+  }
+
+  /* 
+  * opens the drop dataverse dialog
+  */
+  openDropDataverseDialog(): void {
+    let dialogRef = this.dialog.open(DialogDropDataverse, {
+      width: '420px',
+      data: { name: this.dataverseName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.dataverseName = result;
+    });
+  }
+
+   /* 
+  * Clean up the error message on the screen
+  */
+  onClick(): void {
+    this.errorMessage = "";
+  }
+
+  selectedRowIndex: number = -1;
+
+  /* Showing all the datatype metadata information */
+  output: any;
+  
+  highlight(row){
+    this.output = JSON.stringify(row, null, 2);
+  }
+
+  @ViewChild('querymetadata') inputQuery;
+
+  /* Cleans up error message */
+  cleanUp() {
+    this.errorMessage = "";   
+    // Cascading   
+    this.inputQuery.cleanUp();  
+  }
+}
+
+@Component({
+  selector: 'dataverse-create-dialog',
+  templateUrl: 'dataverses-create-dialog.component.html',
+  styleUrls: ['dataverses-create-dialog.component.scss']
+})
+
+export class DialogCreateDataverse {
+  constructor(  private store: Store<any>,
+                public dialogCreateDvRef: MatDialogRef<DialogCreateDataverse>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new dataverseActions.CreateDataverse(this.data.dataverseName));
+    this.dialogCreateDvRef.close(this.data.dataverseName);
+  }
+
+  onNoClick(): void {
+    this.dialogCreateDvRef.close();
+  }
+}
+
+@Component({
+  selector: 'dataverse-drop-dialog',
+  templateUrl: 'dataverses-drop-dialog.component.html',
+  styleUrls: ['dataverses-drop-dialog.component.scss']
+})
+
+export class DialogDropDataverse {
+  constructor(  private store: Store<any>,
+                public dialogDropDvRef: MatDialogRef<DialogDropDataverse>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new dataverseActions.DropDataverse(this.data.dataverseName));
+    this.dialogDropDvRef.close(this.data.dataverseName);
+  }
+
+  onNoClick(): void {
+    this.dialogDropDvRef.close();
+  }
+}
+
+/**
+ * Data source to provide what data should be rendered in the table. Note that the data source
+ * can retrieve its data in any way. In this case, the data source is provided a reference
+ * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage
+ * the underlying data. Instead, it only needs to take the data and send the table exactly what
+ * should be rendered.
+ */
+ export class DataversesDataSource extends DataSource<any> {
+    dataverse$: Observable<any>
+    _filterChange = new BehaviorSubject('');
+    get filter(): string { return this._filterChange.value; }
+    set filter(filter: string) { this._filterChange.next(filter); }
+
+    constructor(private store: Store<any>) {
+      super();
+      this.dataverse$ = this.store.select(s => s.dataverse.dataverses.results);
+    }
+
+    /** Connect function called by the table to retrieve one stream containing the data to render. */
+    connect(): Observable<Dataverse[]> {
+        const displayDataChanges = [
+          this.dataverse$,
+        ];
+
+      return this.dataverse$;
+    }
+
+    disconnect() {}
+  }
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.html
new file mode 100755
index 0000000..aca06fd
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.html
@@ -0,0 +1,14 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<!-- Place holder for future expansion -->
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.scss
new file mode 100755
index 0000000..039dcf1
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-create-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.index-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.html
new file mode 100755
index 0000000..5e675d8
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.html
@@ -0,0 +1,26 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<div class="index-dialog">
+    <p mat-dialog-title>DROP INDEX</p>
+    <mat-dialog-content>
+        <p>PLEASE GIVE THE DATAVERSENAME.INDEXNAME OF THE INDEX TO DROP</p>
+    </mat-dialog-content>
+        <mat-form-field>
+            <input matInput tabindex="0" [(ngModel)]="data.indexName">
+        </mat-form-field>
+    <mat-dialog-actions>
+        <button mat-button (click)="onClick()" tabindex="1">DROP</button>
+        <button mat-button (click)="onNoClick()" tabindex="2">CANCEL</button>
+    </mat-dialog-actions>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.scss
new file mode 100755
index 0000000..039dcf1
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/index-drop-dialog.component.scss
@@ -0,0 +1,18 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+.index-dialog {    
+    font-family: "Roboto Mono", monospace;
+    font-size: 0.80rem;
+    font-weight: 500;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.html
new file mode 100755
index 0000000..c63b254
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.html
@@ -0,0 +1,94 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<div class="container"  (click)="onClick()">
+  <div class="master">
+    <mat-card class="indexes-card" *ngIf="loaded$ | async as ld">
+      <mat-toolbar color="primary" class="indexes-selector">
+          <mat-icon class="icon">menu</mat-icon>
+          <span>INDEXES - METADATA</span>
+          <span class="spacer"></span>
+      </mat-toolbar>
+      <mat-card-content class="indexes-content">
+        <mat-table #table [dataSource]="dataSource" class="indexes-table">
+            <!-- Dataverse Name -->
+            <ng-container matColumnDef="DataverseName">
+              <mat-header-cell *matHeaderCellDef class="header-dataversename-cell"> Dataverse Name </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-dataversename-cell"> {{element.DataverseName}} </mat-cell>
+            </ng-container>
+
+            <!-- Dataset Name -->
+            <ng-container matColumnDef="DatasetName">
+              <mat-header-cell *matHeaderCellDef class="header-datasetname-cell"> Dataset Name </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-datasetname-cell"> {{element.DatasetName}} </mat-cell>
+            </ng-container>
+
+            <!-- Index Name -->
+            <ng-container matColumnDef="IndexName">
+              <mat-header-cell *matHeaderCellDef class="header-indexname-cell"> Index Name </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-indexname-cell"> {{element.IndexName}} </mat-cell>
+            </ng-container>
+
+            <!-- Index Structure -->
+            <ng-container matColumnDef="IndexStructure">
+              <mat-header-cell *matHeaderCellDef class="header-indexestructure-cell"> Index Structure </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-indexstructure-cell"> {{element.IndexStructure}} </mat-cell>
+            </ng-container>
+
+            <!-- IsPrimary  -->
+            <ng-container matColumnDef="IsPrimary">
+              <mat-header-cell *matHeaderCellDef class="header-isprimary-cell"> Is Primary </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-isprimary-cell"> {{element.IsPrimary}} </mat-cell>
+            </ng-container>
+
+            <!-- Timestamp Column -->
+            <ng-container matColumnDef="Timestamp">
+              <mat-header-cell *matHeaderCellDef class="header-timestamp-cell"> Timestamp </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-timestamp-cell"> {{element.Timestamp}} </mat-cell>
+            </ng-container>
+
+            <!-- Pending Op Column -->
+            <ng-container matColumnDef="PendingOp">
+              <mat-header-cell *matHeaderCellDef class="header-pendingop-cell"> PendingOp </mat-header-cell>
+              <mat-cell *matCellDef="let element" class="indexes-dataverse-cell"> {{element.PendingOp}} </mat-cell>
+            </ng-container>
+
+            <mat-header-row *matHeaderRowDef="['IndexName', 'DatasetName', 'DataverseName', 'IndexStructure', 'IsPrimary', 'Timestamp']"></mat-header-row>
+            <mat-row *matRowDef="let row; columns: ['IndexName', 'DatasetName', 'DataverseName', 'IndexStructure', 'IsPrimary', 'Timestamp'];"
+              [ngClass]="{'highlight': selectedRowIndex == row.id}"
+              (click)="highlight(row)">
+            </mat-row>
+        </mat-table>
+      </mat-card-content>
+      <mat-card-actions class="actions">
+          <button class="refresh-button" mat-button (click)="openDropIndexDialog()">DROP</button>
+          <span class="error-message">{{errorMessage}}</span>
+          <span class="spacer"></span>
+          <button class="refresh-button" mat-button (click)="getIndexes()">REFRESH</button>
+      </mat-card-actions>
+    </mat-card>
+    <awc-query-metadata #querymetadata class="query"></awc-query-metadata>  
+  </div>
+  <div class="detail">
+      <mat-card class="indexes-details-card">
+          <mat-toolbar color="primary" class="indexes-selector">
+              <mat-icon class="icon">menu</mat-icon>
+              <span>INDEX - METADATA - DETAILS</span>
+              <span class="spacer"></span>
+          </mat-toolbar>
+          <mat-card-content class="indexes-content output">
+            <span><pre>{{output}}</pre></span>
+          </mat-card-content>
+        </mat-card>
+  </div>
+</div>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.scss
new file mode 100755
index 0000000..15b364a
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.scss
@@ -0,0 +1,398 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$indexes-spacing-unit: 8px;
+
+.container {
+  display: flex;
+	flex-flow: row;
+	padding: 0;
+  margin: 0;
+}
+
+.master {
+  width: 60%;
+}
+
+.detail {
+  width: 40%;
+}
+
+.indexes-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin-top: ($indexes-spacing-unit * 2);
+  min-height: 450px;
+  max-height: 450px;
+  //min-width: 98%; //(100vw / 2);
+  //max-width: 98%; // (100vw / 2);
+  width: 95%; // 98%;
+  overflow: hidden;
+}
+
+.indexes-details-card {
+	display: flex;
+	flex-flow: column;
+  padding: 0;
+  margin:0 auto;
+  margin: ($indexes-spacing-unit * 2);
+  min-height: 716px;
+  max-height: 716px;
+  //min-width: 95%; //(100vw / 2);
+  //max-width: 95%; // (100vw / 2);
+  overflow: hidden;
+}
+
+.icon {
+	padding: 0 14px 0 0;
+	margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.indexes-selector {
+	min-height: 42px;
+	max-height: 42px;
+	justify-content: center;
+	//align-items: center;
+	font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.indexes-content {
+  position:relative;
+  top: 0;
+  left: 0;
+  margin: 0px;
+  padding: 0px;
+  overflow: auto;
+}
+
+.indexes-table {
+  margin: $indexes-spacing-unit !important;
+  height: 330px;
+  overflow: auto;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+//.indexes-toolbar {
+//	display: block;
+//  min-height: 56px;
+//	height: 56px;
+	//width: 250px;
+//  font-size: 12px;
+//  white-space: nowrap;
+//  overflow: hidden;
+//  text-overflow: ellipsis;
+//	letter-spacing: 1px;
+//	font-weight: 400;
+//	background: rgba(0,0,1, .80);
+//}
+
+.example-header {
+  min-height: 64px;
+  display: flex;
+  align-items: center;
+  padding-left: 24px;
+  font-size: 20px;
+}
+
+.mat-table {
+  overflow: auto;
+}
+
+.customWidthClass{
+   flex: 0 0 75px;
+}
+
+.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-header-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.mat-cell.mat-column-DataverseName {
+  text-align: left;
+}
+
+.header-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-dataversename-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-datasetname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-indexname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-indexname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-indexestructure-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-indexstructure-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-isprimary-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-isprimary-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: center;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 150px;
+}
+
+.indexes-groupname-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 150px;
+}
+
+.header-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  text-transform: uppercase;
+  flex: 0 0 250px;
+}
+
+.indexes-timestamp-cell {
+  border: none;
+  font-size: 12px;
+  letter-spacing: 1px;
+  line-height: $indexes-spacing-unit * 3;
+  font-weight: 400;
+  margin: 0;
+  padding: 0 ($indexes-spacing-unit * 2);
+  text-align: left;
+  color: hsla(0,0%,0%,.87);
+  flex: 0 0 250px;
+}
+
+.example-header {
+  min-height: 56px;
+  max-height: 56px;
+  display: flex;
+  align-items: center;
+  padding: 8px 24px 0;
+  font-size: 20px;
+  justify-content: space-between;
+  border-bottom: 1px solid transparent;
+}
+
+.mat-form-field {
+  font-size: 14px;
+  flex-grow: 1;
+  margin-top: 8px;
+}
+
+.example-no-results {
+  display: flex;
+  justify-content: center;
+  padding: 24px;
+  font-size: 12px;
+  font-style: italic;
+}
+
+.actions {
+  display: flex;
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  padding: $indexes-spacing-unit;
+  margin: 0;
+}
+
+.error-message {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding-top: 10px;  
+  padding-left: 20px;
+  text-overflow: ellipsis;
+}
+
+.output {
+  padding-left: ($indexes-spacing-unit * 2);
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.ts
new file mode 100755
index 0000000..2913470
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/indexes-collection/indexes.component.ts
@@ -0,0 +1,230 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, Inject, Input } from '@angular/core';
+import { Index } from '../../../shared/models/asterixDB.model'
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as indexActions from '../../../shared/actions/index.actions'
+import { ElementRef, ViewChild} from '@angular/core';
+import {DataSource} from '@angular/cdk/collections';
+import {BehaviorSubject} from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from "rxjs/Rx";
+import { State } from '../../../shared/reducers/index.reducer';
+import { MatPaginator } from '@angular/material';
+import { SelectionModel } from '@angular/cdk/collections';
+import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
+
+/**
+ * Root component
+ * Defines our application's layout
+ */
+@Component({
+  selector: 'awc-indexes',
+  templateUrl: 'indexes.component.html',
+  styleUrls: ['indexes.component.scss']
+})
+
+export class IndexCollection {
+  displayedColumns = "['dataverseName', 'datasetName', 'indexName', 'indexStructure', 'isPrimary', 'timestamp', 'pendingOp']"
+  /*
+  dataverseName: string;
+  datasetName: string;
+  indexName: string;
+  indexStructure: string;
+  searchKey: string[];
+  isPrimary: boolean;
+  timestamp: string;
+  pendingOp: string;
+  */
+  indexName: string;
+  dataSource: IndexDataSource | null;
+  loaded$: Observable<any>;
+  @Input('message') errorMessage: string = ""
+  
+  idxName = "";
+
+  constructor(private store: Store<any>, public dialog: MatDialog) {
+    this.loaded$ = this.store.select('index');
+    // Watching the name of the latest create index
+    this.store.select(s => s.index.createIndexName).subscribe((data: any) => {
+      this.idxName = data;
+    })
+
+    // Watching the name of the latest drop index
+    this.store.select(s => s.index.dropIndexName).subscribe((data: any) => {
+      this.idxName = data;
+    })
+
+    // Watching for the if there is a change in the collection
+		this.store.select(s => s.index.createIndexSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getIndexes();
+        this.errorMessage = "SUCCEED: CREATE INDEX " + this.idxName;
+      }  
+    })
+
+    // Watching for the if there is a error in a create index operation 
+		this.store.select(s => s.index.createIndexError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+
+    // Watching for the success message in a drop index operation 
+    this.store.select(s => s.index.dropIndexSuccess).subscribe((data: any) => {
+      if (data === true) {
+        this.getIndexes();
+        this.errorMessage = "SUCCEED: DROP INDEX " + this.idxName;
+      }  
+    })
+
+    // Watching for the if there is a error in a drop index operation 
+		this.store.select(s => s.index.dropIndexError).subscribe((data: any) => {
+      if (data.errors) {
+        this.errorMessage = "ERROR: " + data.errors[0].msg;
+      }  
+    })
+  }
+
+  getIndexes() {
+    // Triggers the effect to refresg the indexes
+    this.store.dispatch(new indexActions.SelectIndexes('-'));
+  }
+
+  ngOnInit() {
+    // Assign the datasource for the table 
+    this.dataSource = new IndexDataSource(this.store);
+  }  
+
+  /* 
+  * opens the create index dialog
+  */
+  openCreateIndexDialog(): void {
+    let dialogRef = this.dialog.open(DialogCreateIndex, {
+      width: '420px',
+      data: { name: this.indexName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.indexName = result;
+    });
+  }
+
+
+   /* 
+  * opens the drop index dialog
+  */
+  openDropIndexDialog(): void {
+    let dialogRef = this.dialog.open(DialogDropIndex, {
+      width: '420px',
+      data: { name: this.indexName }
+    });
+
+    dialogRef.afterClosed().subscribe(result => {
+      this.indexName = result;
+    });
+  }
+
+  /* 
+  * Clean up the error message on the screen
+  */
+  onClick(): void {
+    this.errorMessage = "";
+  }
+
+   /* Showing all the index metadata information */
+   output: any;
+   
+   highlight(row){
+     this.output = JSON.stringify(row, null, 2);
+   }
+
+  @ViewChild('querymetadata') inputQuery;
+
+  /* Cleans up error message */
+  cleanUp() {
+    this.errorMessage = ""; 
+    // Cascading   
+    this.inputQuery.cleanUp(); 
+  }
+}
+
+@Component({
+  selector: 'index-create-dialog',
+  templateUrl: 'index-create-dialog.component.html',
+  styleUrls: ['index-create-dialog.component.scss']
+})
+
+export class DialogCreateIndex {
+  constructor(  private store: Store<any>,
+                public dialogCreateIdxRef: MatDialogRef<DialogCreateIndex>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    this.store.dispatch(new indexActions.CreateIndex(this.data.indexName));
+    this.dialogCreateIdxRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogCreateIdxRef.close();
+  }
+}
+
+@Component({
+  selector: 'index-drop-dialog',
+  templateUrl: 'index-drop-dialog.component.html',
+  styleUrls: ['index-drop-dialog.component.scss']
+})
+
+export class DialogDropIndex {
+  constructor(  private store: Store<any>,
+                public dialogDropIdxRef: MatDialogRef<DialogDropIndex>,
+                @Inject(MAT_DIALOG_DATA) public data: any) { }
+
+  onClick(): void {
+    console.log(this.data.indexName)
+    this.store.dispatch(new indexActions.DropIndex(this.data.indexName));
+    this.dialogDropIdxRef.close();
+  }
+
+  onNoClick(): void {
+    this.dialogDropIdxRef.close();
+  }
+}
+
+export class IndexDataSource extends DataSource<any> {
+  private indexes$: Observable<any>
+
+  constructor(private store: Store<any>) {
+    super();
+    this.indexes$ = this.store.select(s => s.index.indexes.results);
+  }
+
+  /** Connect function called by the table to retrieve one stream containing the data to render. */
+  connect(): Observable<Index[]> {
+      const displayDataChanges = [
+        this.indexes$,
+      ];
+
+    return this.indexes$;
+  }
+
+  disconnect() {}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.html
new file mode 100755
index 0000000..939ab06
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.html
@@ -0,0 +1,31 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<mat-card class="input-card" (click)="onClick()">
+    <mat-toolbar color="primary" class="input-selector">
+            <mat-icon class="toolbar-icon">menu</mat-icon>
+            <span>INPUT: SQL++</span>	
+            <span class="spacer"></span>
+    </mat-toolbar>
+    <mat-card-content class="content-area">
+        <div class="codemirror-container">
+           <codemirror-metadata class="code" [(ngModel)]="queryMetadataString" [config]="codemirrorMetadataConfig">
+            </codemirror-metadata>  
+        </div>
+    </mat-card-content>
+    <mat-card-actions class="actions">
+        <button mat-button class="query-button" (click)="executeQuery()">RUN</button>
+        <span class="error-message">{{errorMessage}}</span>
+        <span class="spacer"></span>
+    </mat-card-actions>
+</mat-card>
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.scss
new file mode 100755
index 0000000..b98080c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.scss
@@ -0,0 +1,78 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$query-spacing-unit: 8px;
+
+.input-card {
+	display: flex;
+	flex-flow: column;
+	padding: 0;
+	margin: 0 auto;
+	margin-top: $query-spacing-unit;
+	height: 250px;
+	width: 95%;
+	overflow: hidden;
+}
+  
+.toolbar-icon {
+	padding: 0 14px 0 0;	
+	margin: 0;
+}
+
+.spacer {
+	flex: 1 1 auto;
+}
+  
+.input-selector {
+	max-height: 42px;
+	min-height: 42px;
+	justify-content: center;
+	//align-items: center;
+	font-size: 0.80rem;
+	font-weight: 500;
+	background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.content-area {
+	position: relative;
+	color: hsla(0,0%,0%,.87);
+	height: 120px;
+	padding: 0;
+	margin: $query-spacing-unit * 2;
+	overflow: none;
+}
+
+.codemirror-container {
+	width: 100%;
+	height: 100%;
+	padding: 0;
+	margin: 0;
+	font-size: 14px;
+	line-height: 1.8;
+}
+
+.actions {
+	border-top: 1px solid rgba(0, 0, 0, 0.1);
+	color: rgba(54, 147, 209, 0.87);
+	padding: $query-spacing-unit;
+	margin: 0;
+}
+
+.error-message {
+	border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+	color: rgba(209, 54, 54, 0.87);
+	padding-top: 10px;  
+	padding-left: 20px;
+	text-overflow: ellipsis;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.ts
new file mode 100755
index 0000000..06b9375
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/input-metadata.component.ts
@@ -0,0 +1,111 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ViewChild, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { Store } from '@ngrx/store';
+import * as sqlQueryActions from '../../shared/actions/query.actions'
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypeActions from '../../shared/actions/datatype.actions'
+import * as indexActions from '../../shared/actions/index.actions'
+
+
+import * as CodeMirror from 'codemirror';
+
+/*
+ * Query metadata component
+ * has editor (codemirror) for writing some query
+ */
+@Component({
+	moduleId: module.id,
+	selector: 'awc-query-metadata',
+	templateUrl:'input-metadata.component.html',
+	styleUrls: ['input-metadata.component.scss'],
+})
+
+export class InputQueryMetadataComponent {
+	private dataverses$: Observable<any>;
+	private datatypes$: Observable<any>;
+	private datasets$: Observable<any>;
+	private indexes$: Observable<any>;
+	dataverses = [];
+	datatypes = [];
+	datasets = [];
+	indexes = [];
+	queryMetadataString: string = "";
+	loaded$: Observable<any>;
+	errorMessage: string = "";
+
+  /**
+  * Initialize codemirror
+  */
+  codemirrorMetadataConfig = 	{ 	mode: "asterix",
+    //lineNumbers: true,
+    lineWrapping: true,
+    showCursorWhenSelecting: true,
+    autofocus: true
+  };
+
+	constructor(private store: Store<any>, private changeDetector: ChangeDetectorRef) {
+		this.store.select("sqlMetadataQuery").subscribe((data: any) => {
+			if (data.success === false){
+				if (data.sqlQueryMetadataError.errors){
+					this.errorMessage = "ERROR: " + data.sqlQueryMetadataError.errors[0].msg
+					this.changeDetector.detectChanges();
+				}
+			} else {
+				this.errorMessage = "SUCCEED";
+
+				// Refresh the tables automatically
+				let stringQuery = data.sqlQueryMetadataString;
+				stringQuery = stringQuery.toUpperCase();
+
+				if (stringQuery.includes("CREATE DATAVERSE") || stringQuery.includes("DROP DATAVERSE") ){
+    				this.store.dispatch(new dataverseActions.SelectDataverses('-'));
+				}
+				else if (stringQuery.includes("CREATE DATASET") || stringQuery.includes("DROP DATASET")){
+    				this.store.dispatch(new datasetActions.SelectDatasets('-'));
+				}
+				else if (stringQuery.includes("CREATE TYPE") || stringQuery.includes("DROP TYPE")){
+    				this.store.dispatch(new datatypeActions.SelectDatatypes('-'));
+				}
+				else if (stringQuery.includes("CREATE INDEX") || stringQuery.includes("DROP INDEX")){
+    				this.store.dispatch(new indexActions.SelectIndexes('-'));
+				}
+
+				this.changeDetector.detectChanges();
+			}
+
+		})
+	}
+
+	getQueryResults(queryMetadataString: string) {
+    	this.store.dispatch(new sqlQueryActions.ExecuteMetadataQuery(queryMetadataString));
+	  }
+
+	executeQuery() {
+		this.getQueryResults(this.queryMetadataString.replace(/\n/g, " "));
+		// Component View Refresh
+
+	}
+
+	onClick() {
+		this.errorMessage = "";
+	}
+
+	/* Cleans up error message */
+	cleanUp() {
+		this.errorMessage = "";
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.html
new file mode 100755
index 0000000..a2f3a73
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.html
@@ -0,0 +1,36 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<mat-tab-group class="metadata-menu" (selectedTabChange)="tabChange()">
+    <mat-tab label="DATAVERSES" class="submenu">
+        <div class="dataverses">
+            <awc-dataverses #dataverses [message]="message" class="dataverses"></awc-dataverses>
+        </div>
+    </mat-tab>
+    <mat-tab label="DATASETS">
+        <div class="datasets">
+            <awc-datasets #datasets [message]="message" class="datasets"></awc-datasets>
+        </div>  
+    </mat-tab>
+    <mat-tab label="DATATYPES">
+        <div class="datatypes">
+            <awc-datatypes #datatypes [message]="message" class="datatypes"></awc-datatypes>
+        </div>
+    </mat-tab>
+    <mat-tab label="INDEXES" class="indexes">
+        <div class="indexes">
+            <awc-indexes #indexes [message]="message" class="indexes"></awc-indexes>
+        </div>
+    </mat-tab>
+</mat-tab-group>
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.scss
new file mode 100755
index 0000000..3857d74
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.scss
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ .dataverses {
+    margin: 0;
+    min-height: 750px;
+    max-height: 750px;
+    width: 100%;
+    overflow: hidden;
+ }
+
+.datasets {
+    margin: 0;
+    min-height: 750px;
+    max-height: 750px;
+    width: 100%;
+    overflow: hidden;
+}
+
+.datatypes {
+    margin: 0;
+    min-height: 750px;
+    max-height: 750px;
+    width: 100%;
+    overflow: hidden;
+}
+
+.indexes {
+    margin: 0;
+    min-height: 750px;
+    max-height: 750px;
+    width: 100%;
+    overflow: hidden;
+}
+
+.metadata-menu {    
+    /deep/ .mat-tab-label {
+        font-size: 0.80rem !important;
+        font-weight: 500  !important;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.ts
new file mode 100755
index 0000000..c8382cf
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/metadata/metadata-container.component.ts
@@ -0,0 +1,41 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ViewChild } from '@angular/core';
+
+@Component({
+	moduleId: module.id,
+	selector: 'awc-metadata-container',
+	templateUrl: 'metadata-container.component.html',
+	styleUrls: ['metadata-container.component.scss']
+})
+
+export class MetadataContainerComponent {
+
+	@ViewChild('dataverses') dataverses ;
+	@ViewChild('datasets') datasets ;
+	@ViewChild('datatypes') datatypes ;
+	@ViewChild('indexes') indexes ;
+	message = "";
+
+	constructor() {}
+
+	tabChange() {
+		this.indexes.cleanUp();
+		this.datasets.cleanUp();
+		this.datatypes.cleanUp();
+		this.dataverses.cleanUp();
+	}
+
+	
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.scss
new file mode 100755
index 0000000..ba795c2
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.scss
@@ -0,0 +1,23 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/* -- Place holder for future expansion --> */
+code {
+	width: 100%;
+	height: 100%;
+	padding: 10%;
+    margin: 0; 
+    overflow-wrap: break-word;
+    word-break: break-all;
+    background-color: pink;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.ts
new file mode 100755
index 0000000..91b711d
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/codemirror.component.ts
@@ -0,0 +1,237 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/**
+ * Integrating codemirror (using ng2-codemirror) with our application
+ *
+ * component from "https://runkit.com/npm/ng2-codemirror"
+ *                "https://www.npmjs.com/package/ng2-codemirror"
+ * copy component from /src/codemirror.component.ts
+ * and modified for custom mode (asterix aql, sql++ code hilighting)
+ *
+ * therefore, actually we don't need to "npm install ng2-codemirror"
+ *
+ * Because on the outside of this component,
+ * It was hard to access the codemirror instance that 'ng-codemirror' use
+ * So, we copied the component in our application and modified it
+ *
+ * 'codemirror.js(^5.23.0)' is included in the 'index.html'
+ * And in this component(codemirror.component.ts)
+ * add statement like "declare var CodeMirror: any;"
+ *
+ * I don't know whether this is right way
+ *
+ * ref 1) usage : https://embed.plnkr.co/8e9gxss9u10VeFrv29Zt/
+ * ref 2) custom mode : http://jsfiddle.net/TcqAf/99/
+ * ref 3) integrating : http://stackoverflow.com/questions/37092142/integrating-codemirror-with-angular2-typescript
+ * ref 3) integrating :  https://medium.com/@s_eschweiler/using-external-libraries-with-angular-2-87e06db8e5d1#.8ok74uvwg
+ */
+ import {
+   Component,
+   Input,
+   Output,
+   ElementRef,
+   ViewChild,
+   EventEmitter,
+   forwardRef,
+   AfterViewInit,
+   OnDestroy
+ } from '@angular/core';
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
+ import * as CodeMirror from 'codemirror';
+
+/**
+ * CodeMirror component
+ * Usage :
+ * <codemirror [(ngModel)]="data" [config]="{...}"></codemirror>
+ */
+@Component({
+  moduleId: module.id,
+  selector: 'codemirror',
+  providers: [
+    {
+      provide: NG_VALUE_ACCESSOR,
+      useExisting: forwardRef(() => CodemirrorComponent),
+      multi: true
+    }
+  ],
+  styleUrls: ['codemirror.component.scss'],
+  template: `<textarea class="code" #host></textarea>`,//,
+})
+
+export class CodemirrorComponent implements AfterViewInit, OnDestroy {
+  @Input() config;
+  @Output() change = new EventEmitter();
+  @Output() focus = new EventEmitter();
+  @Output() blur = new EventEmitter();
+  @Output() instance = null;
+  @ViewChild('host') host;
+  _value = '';
+
+  /**
+   * Constructor
+   */
+  constructor(){
+		/**
+		 * Custom mode for AsterixDB
+		 */
+		CodeMirror.defineMode("asterix", function(){
+		  var KEYWORD_MATCH = [
+				// AQL
+				"drop", "dataverse", "dataset",
+				"if", "exists", "create",
+				"use", "type", "as", "closed",
+				"primary", "key",  "hints", "cardinality",
+				"index", "on", "btree", "rtree", "keyword",
+				"for", "in", "Metadata", "Dataset",
+				"return", "Index", "load", "using", "localfs", "path", "format",
+				// Query (not perfect)
+				"from", "in", "with", "group", "by", "select",
+				"let", "where", "order", "asc", "desc", "limit",
+				"keeping", "offset", "distinct", "or", "and",
+				// Built in functions (TODO)
+				// Built in functions (TODO)
+				// Built in functions (TODO)
+				// Asterix Data Model
+				// Primitive type
+				"boolean",
+				"tinyint", "smallint", "integer", "bigint",
+				"float", "double",
+				"string",
+				"binary", "hex", "base64",
+				"point", "line", "rectangle", "circle", "polygon",
+				"date", "time", "datetime", "duration", "interval", "uuid",
+				// Incomplete information type
+				"null", "missing",
+				// Derived type
+				// object {}, array [], multiset {{}}
+				// SQL++
+				"DROP", "DATAVERSE", "IF", "EXISTS", "CREATE", "USE", "TYPE", "AS", "DATASET", "PRIMARY", "KEY",
+				"INDEX", "SELECT", "VALUE", "INSERT", "INTO", "FROM", "WHERE", "AND", "SOME", "IN", "SATISFIES", "IS", "UNKNOWN", "NOT", "EVERY",
+				"GROUP", "BY", "ORDER", "DESC", "LIMIT", "OR", "SET", "DELETE", "LOAD", "USING",
+			];
+
+			//"(", ")","{{", "}}", "[", "]",	"{", "}",  ";", ",", ":","?", "=",
+      var VAR_MATCH = /[$][a-zA-Z]+(\d*)/;
+			var DOT_MATCH = /[.](\S)*/;
+			var DOUBLE_QUOTE_MATCH = /["].*["]/;
+			var SINGLE_QUOTE_MATCH = /['].*[']/;
+			var BREAK_POINT = /(\s)/;
+
+			return {
+				startState: function() {return {inString: false};},
+				token: function(stream, state) {
+					if (state.newLine == undefined)state.newLine = true;
+
+					//match variable reference
+					if (stream.match(VAR_MATCH)) {
+						return "variable";
+					}
+
+					if (stream.match(DOT_MATCH)) {
+						return "dot-variable";
+					}
+
+					//string variable match
+					if (stream.match(DOUBLE_QUOTE_MATCH)) {
+						return "string";
+					}
+					if (stream.match(SINGLE_QUOTE_MATCH)) {
+						return "string";
+					}
+
+					//keyword match
+					for (var i in KEYWORD_MATCH){
+						if (state.newLine && stream.match(KEYWORD_MATCH[i])){
+								return "keyword";
+						 }
+					}
+
+					if (stream.peek() === " " || stream.peek() === null){
+						state.newLine = true;
+					}else{
+						state.newLine = false;
+					}
+					stream.next();
+					return null;
+				}
+			};
+		});
+	}
+
+  get value() { return this._value; };
+
+  @Input() set value(v) {
+    if (v !== this._value) {
+      this._value = v;
+      this.onChange(v);
+    }
+  }
+
+  /**
+   * On component destroy
+   */
+  ngOnDestroy() {}
+
+  /**
+   * On component view init
+   */
+  ngAfterViewInit() {
+    this.config = this.config || {};
+    this.codemirrorInit(this.config);
+  }
+
+  /**
+   * Initialize codemirror
+   */
+  codemirrorInit(config){
+    this.instance = CodeMirror.fromTextArea(this.host.nativeElement, config);
+    this.instance.setValue(this._value);
+    this.instance.setSize(null, 90);
+    this.instance.on('change', () => {
+      this.updateValue(this.instance.getValue());
+    });
+
+    this.instance.on('focus', () => {
+      this.focus.emit();
+    });
+
+    this.instance.on('blur', () => {
+      this.blur.emit();
+    });
+  }
+
+  /**
+   * Value update process
+   */
+  updateValue(value){
+    this.value = value;
+    this.onTouched();
+    this.change.emit(value);
+  }
+
+  /**
+   * Implements ControlValueAccessor
+   */
+  writeValue(value){
+    this._value = value || '';
+    if (this.instance) {
+      this.instance.setValue(this._value);
+    }
+  }
+
+  onChange(_) {}
+  onTouched() {}
+  registerOnChange(fn){this.onChange = fn;}
+  registerOnTouched(fn){this.onTouched = fn;}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.html
new file mode 100755
index 0000000..2eec6b7
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.html
@@ -0,0 +1,28 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<mat-card class="input-card">
+	 <mat-toolbar color="primary" class="input-selector">
+			<mat-icon class="toolbar-icon">menu</mat-icon>
+			<span>INPUT: SQL++</span>	
+			<span class="spacer"></span>
+	</mat-toolbar>
+	<mat-card-content class="content-area">
+		<div class="codemirror-container">
+			<codemirror class="code" #host [(ngModel)]="queryString" [config]="codemirrorConfig"></codemirror>
+		</div>
+	</mat-card-content>
+	<mat-card-actions class="actions">
+		<button mat-button class="query-button" (click)="onClick()">RUN</button>
+	</mat-card-actions>
+</mat-card>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.scss
new file mode 100755
index 0000000..437ff58
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.scss
@@ -0,0 +1,82 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$query-spacing-unit: 5px;
+
+.input-card {
+	display: flex;
+	flex-flow: column;
+	padding: 0;
+	margin: ($query-spacing-unit * 2);
+	height: 200px;
+	width: 100%;
+	min-height: 150px; 
+
+	//background-color: orange;
+}
+  
+.toolbar-icon {
+	padding: 0 14px 0 0;	
+	margin: 0;
+}
+
+.spacer {
+	flex: 1 1 auto;
+}
+  
+.input-selector {
+	max-height: 42px;
+	min-height: 42px;
+	justify-content: center;
+	//align-items: center;
+	font-size: 0.80rem;
+	font-weight: 500;
+	background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.content-area {
+	//position: relative;
+	color: hsla(0,0%,0%,.87);
+	//height: 102px;
+	padding: 0;
+	margin: 0;
+	overflow: none;
+  }
+
+.codemirror-container {
+	width: 95%;
+	height: 98%;
+	padding: 0; // ($query-spacing-unit * 2);
+	margin: 0 auto;
+	font-size: 14px;
+	//letter-spacing: 3px;
+	line-height: 1.8;
+	background-color: red;
+}
+
+//.code {
+//	width: 100%;
+//	height: 100%;
+//	padding: 0;
+//	margin: 0; 
+//	overflow-wrap: break-word;
+//	word-break: break-all;
+//}
+
+.actions {
+	border-top: 1px solid rgba(0, 0, 0, 0.1);
+	color: rgba(54, 147, 209, 0.87);
+	padding-left: $query-spacing-unit;
+	margin: 0;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.ts
new file mode 100755
index 0000000..9be9bd9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/input.component.ts
@@ -0,0 +1,90 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, ViewChild } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { Store } from '@ngrx/store';
+import * as sqlQueryActions from '../../shared/actions/query.actions'
+import * as CodeMirror from 'codemirror';
+
+/*
+ * query component
+ * has editor (codemirror) for writing some query
+ */
+@Component({
+	moduleId: module.id,
+	selector: 'awc-query',
+	templateUrl:'input.component.html',
+	styleUrls: ['input.component.scss']
+})
+
+export class InputQueryComponent {
+	private guideSelectedDataset$: Observable<any>;		
+	private dataverses$: Observable<any>;	
+	private datatypes$: Observable<any>;
+	private datasets$: Observable<any>;	
+	private indexes$: Observable<any>;	
+	dataverses = [];
+	datatypes = [];
+	datasets = [];
+	indexes = [];
+	datasetName = "";
+	dataverseName = "";
+	queryString: string = ""
+	
+	/* Codemirror configuration
+	*/
+	codemirrorConfig = 	{ 	mode: "asterix",
+							lineWrapping: true,
+							showCursorWhenSelecting: true,
+							autofocus: true
+						}	;
+
+	loaded$: Observable<any>
+
+	constructor(private store: Store<any>) {
+		// Watching for guide selected or clicked dataset
+		this.guideSelectedDataset$ = this.store.select(s => s.dataset.guideSelectsDataset);
+		this.guideSelectedDataset$.subscribe((data: any) => {
+			if (data) {
+				this.datasetName = data;
+				for (let i = 0; i < this.datasets.length; i++) {
+					if ( this.datasets[i]['DatasetName'] === this.datasetName ) {
+						this.dataverseName = this.datasets[i]['DataverseName'];
+					}
+				}
+				this.queryString = "USE " + this.dataverseName + "; SELECT * FROM " + this.datasetName;
+			}
+		});
+
+		// Watching for Datatypes
+		this.dataverses$ = this.store.select(s => s.dataverse.dataverses.results);
+		this.dataverses$.subscribe((data: any[]) => {
+			this.dataverses = data;
+		});
+
+		// Watching for Datasets
+		this.datasets$ = this.store.select(s => s.dataset.datasets.results);
+		this.datasets$.subscribe((data: any[]) => {
+			this.datasets = data;
+		});
+	}
+
+	getQueryResults(queryString: string) {
+    	this.store.dispatch(new sqlQueryActions.ExecuteQuery(queryString));
+  	}
+
+	onClick() {
+		this.getQueryResults(this.queryString.replace(/\n/g, " "));
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.html
new file mode 100755
index 0000000..4641426
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.html
@@ -0,0 +1,44 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<mat-card class="metadata-card">
+  <mat-toolbar color="primary" class="metadata-selector">
+    <mat-icon class="example-icon">menu</mat-icon>
+    <span>METADATA GUIDE</span>
+    <span class="spacer"></span>
+  </mat-toolbar>
+    <div class="metadata-content-area">
+    <div class="metadata-tree">
+      <div class="metadata-all">
+          <p-tree [style]="{'width':'100%', 'border': 'none', 'font-family': 'Roboto Mono', 'font-size': '0.80rem',
+          'font-weight': '500'}" selectionMode="single" [value]="nodesAll" (onNodeSelect)="nodeSelectAll($event)"></p-tree>
+      </div>
+      <div class="metadata-datasets">
+          <p-tree [style]="{'width':'100%', 'border': 'none', 'font-family': 'Roboto Mono', 'font-size': '0.80rem',
+          'font-weight': '500'}" selectionMode="single" [value]="nodesDatasets" (onNodeSelect)="nodeSelectDataset($event)"></p-tree>
+      </div>
+      <div class="metadata-datatypes">
+          <p-tree [style]="{'width':'100%', 'border': 'none', 'font-family': 'Roboto Mono', 'font-size': '0.80rem',
+          'font-weight': '500'}" selectionMode="single" [value]="nodesDatatypes"></p-tree>
+      </div>
+      <div class="metadata-index">
+          <p-tree [style]="{'width':'100%', 'border': 'none', 'font-family': 'Roboto Mono', 'font-size': '0.80rem',
+          'font-weight': '500'}" selectionMode="single" [value]="nodesIndexes"></p-tree>
+      </div>
+
+    </div>
+  </div>
+  <!--<mat-card-actions class="actions">
+     <button mat-button class="refresh-button" (click)="menuRefresh()">COLLAPSE</button>
+  </mat-card-actions> -->
+</mat-card>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.scss
new file mode 100755
index 0000000..4ee2339
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.scss
@@ -0,0 +1,97 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$metadata-spacing-unit: 5px;
+
+.metadata-card {
+	display: flex;
+	flex-flow: column;
+	padding: 0;
+	margin: 0 auto; //($metadata-spacing-unit * 2);
+	margin-top: ($metadata-spacing-unit * 2);
+	margin-bottom: ($metadata-spacing-unit * 2);
+	min-height: 150px;
+	box-shadow: none !important;
+	width: 92%;
+	overflow: hidden;
+}
+
+.example-icon {
+	padding: 0 14px 0 0;
+	margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.metadata-selector {
+	min-height: 42px;
+	max-height: 42px;
+	justify-content: center;
+	//align-items: center;
+	font-size: 0.80rem;
+	font-weight: 500;
+	background-color: white;
+	border: 1px solid rgba(54, 147, 209, 0.87);
+}
+
+.metadata-content-area {
+	padding: ($metadata-spacing-unit * 2);
+	margin: 0;
+}
+
+.metadata-tree {
+	min-height: 30px;
+	font-size: 0.80rem;
+	font-weight: 500;
+}
+
+.metadata-datasets {
+	margin-top: ($metadata-spacing-unit * 2);
+	margin-bottom: ($metadata-spacing-unit * 2);
+}
+
+.metadata-datatypes {
+	margin-top: ($metadata-spacing-unit * 2);
+	margin-bottom: ($metadata-spacing-unit * 2);
+}
+
+.metadata-dataindexes {
+	margin-top: ($metadata-spacing-unit * 2);
+	margin-bottom: ($metadata-spacing-unit * 2);
+}
+
+
+.metadata-tree.ui-tree {
+	//width: 260px !important;
+	font-size: 0.80rem;
+	font-weight: 500;
+	border: none !important;
+	background-color: red;
+}
+
+.refresh-button {
+	float: left;
+	margin-top: $metadata-spacing-unit;
+}
+
+.actions {
+	border-top: 1px solid rgba(0, 0, 0, 0.1);
+	color: rgba(54, 147, 209, 0.87);
+	padding: $metadata-spacing-unit;
+	margin: 0;
+}
+
+
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.ts
new file mode 100755
index 0000000..e60c9de
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/metadata.component.ts
@@ -0,0 +1,209 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
+import { Router } from '@angular/router';
+import { Dataverse } from '../../shared/models/asterixDB.model';
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as dataverseActions from '../../shared/actions/dataverse.actions';
+import * as datasetActions from '../../shared/actions/dataset.actions';
+import * as datatypesActions from '../../shared/actions/datatype.actions';
+import * as indexesActions from '../../shared/actions/index.actions';
+import * as metadataActions from '../../shared/actions/metadata.actions';
+import * as datasetsActions from '../../shared/actions/dataset.actions';
+import { ElementRef, ViewChild} from '@angular/core';
+import {DataSource} from '@angular/cdk/collections';
+import {BehaviorSubject} from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from 'rxjs/Rx';
+import * as fromRoot from '../../shared/reducers/dataverse.reducer';
+import { State } from '../../shared/reducers/dataverse.reducer';
+import { TreeModule, TreeNode} from 'primeng/primeng';
+
+
+/**
+ * query component
+ * has editor (codemirror) for writing some query
+ */
+@Component({
+	moduleId: module.id,
+	selector: 'awc-metadata',
+	templateUrl: 'metadata.component.html',
+	styleUrls: ['metadata.component.scss']
+})
+
+export class MetadataComponent implements OnInit {
+	nodesAll = [];
+	nodesDatasets = [];
+	nodesDatatypes = [];
+	nodesIndexes = [];
+
+	constructor(private store: Store<any>, private changeDetector: ChangeDetectorRef) {}
+
+	ngOnInit(): void {
+
+		// Watching for the metadata tree
+		this.store.select(s => s.metadata.tree).subscribe((data: any[]) => {
+			
+			this.nodesAll = [];
+			this.nodesDatasets = [];
+			this.nodesDatatypes = [];
+			this.nodesIndexes = [];
+			const indexesMenu = [];
+			const datatypesMenu = [];
+			const datasetsMenu = [];
+			const dataversesRoot = { label: '', children: []};
+			dataversesRoot.label = 'DATAVERSES';
+			dataversesRoot.children = [];
+
+			for (let i = 0; i < data.length; i++) {
+
+				// Don't want to show metadata system datasets, datatypes or indexes
+			// if (data[i]['DataverseName'] && data[i]['DataverseName'] !== "Metadata" )
+			//	{
+					// Counting dataverses to align the menu identifiers
+			    	const dataverse = { label: '', children: [] }; 
+					dataverse.label = data[i]['DataverseName'];
+					dataversesRoot.children.push(dataverse);
+
+					// Adding the datasets to correspondent dataverse
+					if (data[i]['Datasets'].length) {
+						const datasetRoot = { label: '', children: [] }; 
+						datasetRoot.label = 'DATASETS';
+						dataverse.children.push(datasetRoot);
+						for (let j = 0; j < data[i]['Datasets'].length; j++) {
+							const dataset = { label: '', children: [] }; 
+							dataset.label = data[i]['Datasets'][j]['DatasetName'];
+
+							//
+							// Adding the datatype to correspondent dataset
+							//
+							if (data[i]['Datasets'][j]['Datatype']) {
+								const datatypeRoot = { label: '', children: [] };
+								datatypeRoot.label = 'Datatype: ' + data[i]['Datasets'][j]['Datatype']['DatatypeName'];
+								//
+								// Looking for the datatype fields
+								//
+								if (data[i]['Datasets'][j]['Datatype']['Derived']) {
+									if (data[i]['Datasets'][j]['Datatype']['Derived']['Record']) { 
+										const datatypeFieldsRoot = { label: '', leaf: true, expanded: true, children: [] };
+										datatypeFieldsRoot.label = 'FIELDS';
+										for (let k = 0; k < data[i]['Datasets'][j]['Datatype']['Derived']['Record']['Fields'].length; k++) {
+											const datatypeField = { label: '', children: [] }; 
+											datatypeField.label = data[i]['Datasets'][j]['Datatype']['Derived']['Record']['Fields'][k]['FieldName'] + ": " + data[i]['Datasets'][j]['Datatype']['Derived']['Record']['Fields'][k]['FieldType'];
+											datatypeFieldsRoot.children.push(datatypeField);
+										}
+										datatypeRoot.children.push(datatypeFieldsRoot);
+
+									}
+								}
+								dataset.children.push(datatypeRoot);
+
+								datatypeRoot.label = data[i]['Datasets'][j]['Datatype']['DatatypeName'];
+								datatypesMenu.push(datatypeRoot);
+							}
+
+							//
+							// Adding the indexes to correspondent dataset
+							//
+							if (data[i]['Datasets'][j]['Indexes'].length) {
+								const indexRoot = { label: '', children: [] }; 
+								indexRoot.label = 'INDEXES';
+								
+								for (let k = 0; k < data[i]['Datasets'][j]['Indexes'].length; k++) {
+									const indexChild = { label: '', children: [] }; 
+									indexChild.label = data[i]['Datasets'][j]['Indexes'][k]['IndexName'];
+
+									// is Primary
+									const indexIsPrimaryRoot = { label: '', children: [] };
+									indexIsPrimaryRoot.label = 'isPrimary' + ': ' + data[i]['Datasets'][j]['Indexes'][k]['IsPrimary'];
+									indexChild.children.push(indexIsPrimaryRoot);
+								
+									// SearchKey
+									if (data[i]['Datasets'][j]['Indexes'][k]['SearchKey']) {
+										const indexSearchKeyRoot = { label: '', children: [] };
+										indexSearchKeyRoot.label = 'SEARCH KEY';
+										for (let l = 0; l < data[i]['Datasets'][j]['Indexes'][k]['SearchKey'].length; l++) {
+											const indexsearchKeyField = { label: '', children: [] };
+											indexsearchKeyField.label = data[i]['Datasets'][j]['Indexes'][k]['SearchKey'][l]
+											indexSearchKeyRoot.children.push(indexsearchKeyField);
+										}
+
+										indexChild.children.push(indexSearchKeyRoot);
+										indexesMenu.push(indexChild);
+									}
+
+									indexRoot.children.push(indexChild);
+								}
+
+								dataset.children.push(indexRoot);
+								datasetRoot.children.push(dataset);
+								datasetsMenu.push(dataset);
+							}
+						}
+					}
+			//	}
+			}
+			
+			this.nodesAll.push(dataversesRoot);
+
+			/*
+			* Making the rest of the stand alone submenus
+			*/
+
+			// Adding the DATASET stand alone submenu
+			const datasetMenuRoot = { label: '', children: [] };
+			datasetMenuRoot.label = 'DATASETS';
+			datasetMenuRoot.children = datasetsMenu;
+			this.nodesDatasets.push(datasetMenuRoot);
+
+			// Adding the DATATYPES stand alone submenu
+			const datatypeMenuRoot = { label: '', children: [] };
+			datatypeMenuRoot.label = 'DATATYPES';
+			datatypeMenuRoot.children = datatypesMenu;
+			this.nodesDatatypes.push(datatypeMenuRoot);
+
+			// Adding the DATATYPE stand alone submenu
+			const indexesMenuRoot = { label: '', children: [] };
+			indexesMenuRoot.label = 'INDEXES';
+			indexesMenuRoot.children = indexesMenu;
+			this.nodesIndexes.push(indexesMenuRoot);
+
+			// Component View Refresh
+			this.changeDetector.detectChanges();
+		});
+	}
+
+	/*
+	* UI helpers to select dataverses from the guide menu
+	*/
+	nodeSelectAll(event) {
+		if (event.node.parent && event.node.parent.label === 'DATASETS') {
+			const datasetName = event.node.label.replace(/-;-/g);
+			this.store.dispatch(new datasetsActions.GuideSelectDatasets(datasetName));
+		}
+	}
+	
+	nodeSelectDataset(event) {
+		if (event.node.parent && event.node.parent.label === 'DATASETS') {
+			const datasetName = event.node.label.replace(/-;-/g);
+			this.store.dispatch(new datasetsActions.GuideSelectDatasets(datasetName));
+		}
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/ouput.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/ouput.component.ts
new file mode 100755
index 0000000..fcfc235
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/ouput.component.ts
@@ -0,0 +1,278 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, OnInit, ViewChild,  AfterViewInit, ChangeDetectorRef, Pipe, PipeTransform } from '@angular/core';
+import { Observable } from 'rxjs/Observable';
+import { Store } from '@ngrx/store';
+import * as sqlQueryActions from '../../shared/actions/query.actions'
+import { saveAs } from 'file-saver';
+import { DomSanitizer } from '@angular/platform-browser';
+import {TreeModule,TreeNode} from 'primeng/primeng';
+
+/**
+ * query component
+ * has editor (codemirror) for writing some query
+ */
+
+@Pipe({ name: 'safeHtml'})
+export class SafeHtmlPipe implements PipeTransform  {
+  constructor(private sanitized: DomSanitizer) {}
+  transform(value) {
+    return this.sanitized.bypassSecurityTrustHtml(value);
+  }
+}
+
+@Component({
+	moduleId: module.id,
+	selector: 'awc-results',
+	templateUrl:'output.component.html',
+	styleUrls: ['output.component.scss']
+})
+
+
+export class QueryOutputComponent implements OnInit {
+	queryMessage: string;
+	treeData = [];
+	flattenData = [];
+	dataColumns = [];
+	query_message: string;
+	execution_time: number;
+	loaded$: Observable<any>
+	data: any[];
+	loading: Boolean;
+	jsonOutput = "";
+	selectedOutputView = "NONE";
+	outputQueryString = "";
+	toogleExpand = "EXPAND TREE"
+	
+	/* Codemirror configuration */
+	codemirrorConfig = 	{ 	mode: "asterix",
+		lineWrapping: true,
+		showCursorWhenSelecting: true
+	};
+
+	generateTreeMenu(node, rootMenu): any {
+
+		// Check in case the root object is not defined properly
+		if (rootMenu === undefined) {
+			rootMenu = { label: '', children: []};
+		}
+
+		let nodeArray = [];
+		
+		// Going through all the keys in a node looking for objects or array of key values
+		// and create a sub menu if is an object.
+		Object.keys(node).map((k) => {		
+
+			if (typeof node[k] === 'object') {
+				let nodeObject = { label: '', children: []};
+				nodeObject = { label: '', children: []};
+				nodeObject.label = k;
+				// if this is an object then a new node is created and
+				// recursive call to find and fill with the nested elements
+				let newNodeObject = this.generateTreeMenu(node[k], nodeObject);
+
+				// if this is the first node, then will become the root.
+				if (rootMenu.children) {
+					rootMenu.children.push(newNodeObject)
+				} else {
+					rootMenu = newNodeObject
+				}
+			}
+			else {
+				// Array of key values converted into a unique string with a : separator 
+				let nodeKeyValue = { label: '', children: []};
+				nodeKeyValue.label = k + " : " + node[k]
+				nodeArray.push(nodeKeyValue);
+			}
+		})
+
+		// The array will be added as value to a parent key.
+		if (nodeArray.length > 0) {
+			rootMenu.children = nodeArray.concat(rootMenu.children)
+		}
+		
+		return rootMenu 
+	}
+
+	constructor(private store: Store<any>, private changeDetector: ChangeDetectorRef) {
+		this.loaded$ = this.store.select(s => s.sqlQuery.loaded);
+		this.store.select("sqlQuery").subscribe((data: any) => {
+			// Set the output toolbar query string and default view settings
+			if (data.loaded) {
+				this.selectedOutputView = "TABLE";
+				this.loading = true;
+				this.data = data.sqlQueryResult.results;
+				this.treeData = [];
+				let stringQuery = data.sqlQueryString;
+	
+				// Preparing the toolbar 
+				if (stringQuery.length > 150) {
+					this.outputQueryString = ": " + stringQuery.slice(0, 150) + " (..)"
+				} else {
+					this.outputQueryString = ": " + stringQuery;
+				}
+
+				// Processing the results 
+				if (data.sqlQueryResult.results && data.sqlQueryResult.results.length > 0 && this.data[0]) {
+
+					/* Removing the root object, disabled for the time being 
+					var resultKeyList = Object.keys(this.data[0]);
+					var resultKey: string = resultKeyList[0]; 
+					*/
+
+					for (let i = 0; i < this.data.length; i++) {
+
+						/* Removing the root object, disabled for the time being 
+						if (this.data[i][resultKey] instanceof Object) {	
+							this.data[i] = this.data[i][resultKey];
+						}*/	
+
+						let nodeContent = { label:"[" + i + "]" , children: []};
+						this.treeData.push(this.generateTreeMenu(this.data[i], nodeContent))
+					}
+
+					this.loading = false;
+				} 
+	
+				// JSON OUTPUT
+				// Making into a JSON String for JSON String Output
+				this.jsonOutput = JSON.stringify(data.sqlQueryResult.results, null, 2)
+				
+				// TABLE OUTPUT
+				if (this.data && this.data.length > 0) {
+
+					this.collapseAll();
+					// Normalize the data ( removing the first key if is an object )
+					// TODO: Move it into a recursive function.
+					this.dataColumns = [];
+
+					var resultKeyList = Object.keys(this.data[0]);
+					var resultKey: string = resultKeyList[0]; 
+					if (this.data[0][resultKey] instanceof Object) {	
+						// is a SQL++ Query Results 
+						var nestedKeyList = Object.keys(this.data[0][resultKey]);
+						for (let i = 0; i < nestedKeyList.length; i++) {
+							if (typeof this.data[0][resultKey][nestedKeyList[i]] === 'object') {
+								// Creating a key to display a nested type
+								this.dataColumns.push({field: 'nestedString' + i, header: nestedKeyList[i]})
+								 				
+							} else {
+								this.dataColumns.push({field: nestedKeyList[i], header: nestedKeyList[i] })
+							}
+							
+						}
+					}
+					else { // is a SQL++ Metadata Results and there is an Array
+						for (let i = 0; i < resultKeyList.length; i++) {
+							this.dataColumns.push({field: resultKeyList[i], header: resultKeyList[i] })
+						}
+					}
+
+					// Now prepare the data ( SQL++ Query, Metatada Queries no need to change anything ).
+					// TODO: Move it into a recursive function.
+					if (this.data[0][resultKey] instanceof Object) {	
+						// is a SQL++ Query Results 
+						for (let i = 0; i < this.data.length; i++) {
+
+							// // is a SQL++ Query Results 
+							var nestedKeyList = Object.keys(this.data[i][resultKey]);
+							for (let k = 0; k < nestedKeyList.length; k++) {
+								if ( typeof this.data[i][resultKey][nestedKeyList[k]] === 'object' ){
+										// Creating a display value to for a nested type JSON.stringify(jsObj, 
+										var nestedObjectStr = JSON.stringify(this.data[i][resultKey][nestedKeyList[k]], null, '\n');
+										var nestedKey = 'nestedString' + k;
+										this.data[i][resultKey][nestedKey] = nestedObjectStr; 				
+								} 
+							}
+
+							this.data[i] = this.data[i][resultKey];
+						}	
+					}
+				}
+			}
+      	});
+	}
+
+	/* 
+	* Subscribing to store values
+	*/
+	ngOnInit(): void {
+		this.loaded$ = this.store.select('sqlQuery');
+		this.store.select("sqlQuery").subscribe((data: any) => {
+			if (data.sqlQueryError.errors){
+				this.queryMessage = data.sqlQueryError.errors[0].msg
+			}else{
+				this.queryMessage = ""
+			}
+		})
+	}
+
+	/* 
+	* Changes view mode [ TABLE, TREE, JSON VIEW ]
+	*/
+	onSelect(value: any) {
+		this.selectedOutputView = value;		
+	}
+
+	/* 
+	* Export to CSV 
+	*/
+    exportToCSV(){
+		var blob = new Blob([this.jsonOutput], {type: "text/csv;charset=utf-8"});
+		saveAs(blob, "Asterix-results.csv");
+	}
+	
+	/*
+	*  Export to plain text
+	*/
+    exportToText(){
+		var exportOutput = this.jsonOutput;
+		var blob = new Blob([exportOutput], {type: "text/plain;charset=utf-8"});
+		saveAs(blob, "Asterix-results.txt");
+	}
+	
+	/*
+	*  Expand/Collapse Tree
+	*/
+    expandTree(){
+		if (this.toogleExpand === "EXPAND TREE"){
+			this.expandAll();
+		} else {
+			this.collapseAll();
+		}
+	}
+	
+	expandAll(){
+		this.toogleExpand = "TREE COLLAPSE";
+        this.treeData.forEach( node => {
+            this.expandRecursive(node, true);
+        } );
+    }
+
+    collapseAll(){
+		this.toogleExpand = "EXPAND TREE";
+        this.treeData.forEach( node => {
+            this.expandRecursive(node, false);
+        } );
+    }
+    
+    private expandRecursive(node:TreeNode, isExpand:boolean){
+        node.expanded = isExpand;
+        if(node.children){
+            node.children.forEach( childNode => {
+                this.expandRecursive(childNode, isExpand);
+            } );
+        }
+    }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.html
new file mode 100755
index 0000000..f7c4b43
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.html
@@ -0,0 +1,68 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+<mat-card class="sql-results-card">
+	<mat-toolbar color="primary" class="results-selector">
+		<mat-icon class="toolbar-icon">menu</mat-icon>
+	    <span class="output-query-string">OUTPUT{{outputQueryString}}</span>
+		<span class="spacer"></span>
+	</mat-toolbar>
+  	<mat-card-content class="content-area">
+		<div *ngIf="loaded$ | async as ld">
+			<div *ngIf="selectedOutputView=='TABLE'">				
+				<p-dataTable [style]="{'width':'100%', 'overflow':'hidden'}" id='review-table' [responsive]="true" [hidden]="loading" [value]="data" [rows]="20" [paginator]="true" [pageLinks]="3" [rowsPerPageOptions]="[5,10,20, 30, 40, 50]" >
+					<p-column [style]="{'text-align':'left',
+					'text-overflow': 'ellipsis', 'word-wrap': 'break-word', 'word-break': 'break-all'}"
+					
+					[footerStyle]="{'color':'blue'}" [headerStyleClass]="datatable-header" *ngFor="let node of dataColumns;" [field]="node.field" 
+					[header]="node.header" [sortable]="true">
+					</p-column>
+				</p-dataTable>
+			</div>
+		</div>
+		<div *ngIf="loaded$ | async as ld">	
+			<div *ngIf="ld.sqlQueryError.metrics" class="queryErrorMessage">
+				<span>ERROR:</span>
+				<span>{{queryMessage}}</span>
+			</div>	
+			 <div [hidden]="selectedOutputView!='TREE'" class="data-viewer-container">
+				<button mat-button class="button-expand" (click)="expandTree()">{{toogleExpand}}</button>
+				<p-tree [style]="{'width':'100%', 'border': 'none', 'font-family': 'Roboto Mono', 'font-size': '0.80rem',
+					'font-weight': '500'}" [value]="treeData"></p-tree>
+			</div>
+			<div *ngIf="loaded$ | async as ld">	
+				<div *ngIf="selectedOutputView=='JSON'" class="data-viewer-container">
+					<button mat-button class="button-export" (click)="exportToText()">EXPORT</button>
+					<pre class="json-output">{{jsonOutput}}</pre>
+				</div>
+			</div>
+		</div>
+	</mat-card-content>
+	<mat-card-actions class="actions">
+		<div *ngIf="loaded$ | async as ld">
+			<span *ngIf="ld.sqlQueryResult.metrics" class="metrics">
+				<span class="span-results">SUCCESS:</span>
+				<span class="span-results">Count: {{ld.sqlQueryResult.metrics.resultCount}}</span>
+				<span class="span-results">Size: {{ld.sqlQueryResult.metrics.resultSize}}</span>
+				<span class="span-results">Elapsed time: {{ld.sqlQueryResult.metrics.elapsedTime}}</span>
+				<span class="span-results">Execution time: {{ld.sqlQueryResult.metrics.executionTime}}</span>
+				<span class="spacer"></span>
+				<mat-button-toggle-group #group="matButtonToggleGroup" class="output-group" value={{selectedOutput}} (change)="onSelect(group.value)">
+					<mat-button-toggle mat-button  value="TABLE">TABLE</mat-button-toggle>
+					<mat-button-toggle mat-button  value="TREE">TREE</mat-button-toggle>
+					<mat-button-toggle mat-button  value="JSON">JSON</mat-button-toggle>
+				</mat-button-toggle-group>
+			</span>
+		</div>
+	</mat-card-actions>
+</mat-card>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.scss
new file mode 100755
index 0000000..099ca87
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/output.component.scss
@@ -0,0 +1,169 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+$results-spacing-unit: 5px;
+
+.sql-results-card {
+  display: flex;
+	flex-flow: column;
+  padding: 0;
+  height: 600px;
+  width: 100%; // 1350px;
+	margin: ($results-spacing-unit * 2);
+	min-height: 150px; 
+}
+
+.toolbar-icon {
+  padding: 0 14px 0 0;
+  margin: 0;
+}
+
+.spacer {
+  flex: 1 1 auto;
+}
+
+.results-selector {
+	max-height: 42px;
+  min-height: 42px;
+  justify-content: center;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+  font-size: 0.80rem;
+  font-weight: 500;
+  background-color: white;
+  border: 1px solid rgba(54, 147, 209, 0.87);
+  overflow-wrap: break-word;
+	word-break: break-all;
+}
+
+.content-area {
+  position: relative;
+  color: hsla(0,0%,0%,.87);
+  height: 500px;
+  padding: 0;
+  margin: 0;
+  overflow: auto;
+  font-size: 0.80rem;
+  font-weight: 500;
+  font-family: "Roboto", monospace;
+}
+
+.root-closed {
+  list-style-type:none;
+}
+
+.root-open {
+  list-style-type:none;
+}
+
+.leaf-list-open {
+  list-style-type:none;
+  // padding-top: ($results-spacing-unit) * 2;
+  padding-left: 25px;
+  color: red;
+}
+
+.leaf-list-open.div
+//.leaf-list-open.ul
+.leaf-list-open.li {
+  margin-left: ($results-spacing-unit * 10) !important;
+  color: green;
+}
+
+.leaf {
+  color: blue;
+}
+
+.leaf-list-closed {
+  list-style-type:none;
+  display: none;
+}
+
+ul > .root-closed::before {
+  content:'+'
+}
+
+ul > .root-open::before {
+  content:'-'
+}
+
+.queryErrorMessage {
+  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(209, 54, 54, 0.87);
+  padding: $results-spacing-unit;
+  padding-left: ($results-spacing-unit * 2);
+}
+
+.metrics {
+  display: flex;
+  color: rgba(54, 147, 209, 0.87);
+  font-size: 0.80rem;
+  font-weight: 500;
+}
+
+.span-results {
+  padding-top: ($results-spacing-unit * 2);
+  padding-left: ($results-spacing-unit * 2);
+}
+
+.actions {
+  border-top: 1px solid rgba(0, 0, 0, 0.1);
+  color: rgba(54, 147, 209, 0.87);
+  margin: 0;
+}
+
+//someID\:review-table
+th {
+  text-align: left !important;
+}
+
+.datatable-header {
+  color: red !important;
+  background-color: blue;
+}
+
+.data-viewer-container {
+  padding: ($results-spacing-unit * 4);
+  padding-bottom: ($results-spacing-unit * 8);
+  height: 100%;
+  overflow: hidden;
+}
+
+.output-group {
+  margin-right: ($results-spacing-unit * 4);
+}
+
+.menu-export {
+  font-size: 0.80rem !important;
+  font-weight: 500 !important;
+}
+
+.button-export {
+  margin-right: ($results-spacing-unit * 4);
+  color: rgba(54, 147, 209, 0.87);
+}
+
+.button-expand {
+  margin-right: ($results-spacing-unit * 4);
+  color: rgba(54, 147, 209, 0.87);
+}
+
+.ui-datatable-data> tr> td {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  max-width: 150px;
+  color: red;
+}
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.html
new file mode 100755
index 0000000..6dd3ef3
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.html
@@ -0,0 +1,24 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/ -->
+
+<div class="query-container">
+  <div class="metadata">   
+    <awc-metadata class="metadata-card"></awc-metadata>
+  </div>
+  <div class="vertical">
+    <awc-query class="query-card"></awc-query>
+    <awc-results class="output-card"></awc-results>
+  </div>
+</div> 
+
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.scss
new file mode 100755
index 0000000..d6b530b
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.scss
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ .query-container {
+    display: flex;
+    flex-direction: row;
+    //background-color: red;
+    width: 100%; 
+    margin:0;
+    padding:0;
+    overflow: hidden;
+ }
+
+.metadata {
+    display: flex;
+    flex-direction: row;
+    width: 20%;
+   // background-color: rgb(0, 255, 42);
+    margin:0;
+    padding: 0;
+   // padding-right: 10px;
+    border-right: 1px solid hsla(0,0%,0%,.20);
+}
+
+.vertical {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    width: 80%;
+    overflow: hidden;
+    margin:0;
+    padding: 1px0;
+   // background-color: rgb(38, 0, 255);
+}
+
+.metadata-card {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;     
+    width: 100%;
+    overflow: hidden;
+    margin:0;
+    padding: 0;
+   // background-color: green;
+}
+
+.query-card {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;     
+    width: 100%;
+    overflow: hidden;
+    margin:0;
+    padding: 0;
+    //background-color: green;
+}
+
+.output-card {
+    display: flex;
+    flex-direction: row;
+    justify-content: center;     
+    width: 100%;
+    overflow: hidden;
+    margin:0;
+    padding: 0;
+    //background-color: yellow;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.ts
new file mode 100755
index 0000000..776e184
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/dashboard/query/query-container.component.ts
@@ -0,0 +1,74 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { Dataverse } from '../../shared/models/asterixDB.model'
+import { Store } from '@ngrx/store';
+import { Observable } from 'rxjs/Observable';
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypesActions from '../../shared/actions/datatype.actions'
+import * as indexesActions from '../../shared/actions/index.actions'
+import * as metadataActions from '../../shared/actions/metadata.actions'
+import { ElementRef, ViewChild} from '@angular/core';
+import {DataSource} from '@angular/cdk/collections';
+import {BehaviorSubject} from 'rxjs/BehaviorSubject';
+import 'rxjs/add/operator/startWith';
+import 'rxjs/add/observable/merge';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/debounceTime';
+import 'rxjs/add/operator/distinctUntilChanged';
+import 'rxjs/add/observable/fromEvent';
+import { Subscription } from "rxjs/Rx";
+import * as fromRoot from '../../shared/reducers/dataverse.reducer';
+import { State } from '../../shared/reducers/dataverse.reducer';
+import * as sqlQueryActions from '../../shared/actions/query.actions'
+/*
+ * query component
+ * has editor (codemirror) for writing some query
+ */
+@Component({
+	moduleId: module.id,
+	selector: 'awc-query-container',
+	templateUrl:'query-container.component.html',
+	styleUrls: ['query-container.component.scss']
+})
+
+export class QueryContainerComponent {
+	nodes = []
+	constructor(private store: Store<any>) {
+
+		this.store.select(s => s.metadata.tree).subscribe((data: any[]) => {
+			this.nodes = []
+			for (let i = 0; i < data.length; i++) {
+				if (data[i]['DataverseName']) {
+				    let node = { id: 0, name:"", children:[] };
+				    node.id = i;
+				    node.name = data[i]['DataverseName'];
+						for (let j = 0; j < data[i]['Datasets'].length; j++) {
+							let children = { id: 0, name:"", children:[] };
+							children.id = j
+							children.name = data[i]['Datasets'][j]['DatasetName'];
+							node.children.push(children)
+						}
+						this.nodes.push(node)
+				}
+			}
+		});
+	}
+
+	treeCalc() {
+		this.store.dispatch(new metadataActions.UpdateMetadataTree());
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/db.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/db.ts
new file mode 100755
index 0000000..8f51b00
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/db.ts
@@ -0,0 +1,23 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { DBSchema } from '@ngrx/db';
+
+/*
+* Persistent storage capability to the dashboard in case is needed.
+*/
+export const schema: DBSchema = {
+  version: 1,
+  name: 'asterixDB_app',
+  stores: {},
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/material.module.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/material.module.ts
new file mode 100755
index 0000000..3bb67d9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/material.module.ts
@@ -0,0 +1,105 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import {NgModule} from '@angular/core';
+import {
+  MatAutocompleteModule,
+  MatButtonModule,
+  MatButtonToggleModule,
+  MatCardModule,
+  MatCheckboxModule,
+  MatChipsModule,
+  MatDatepickerModule,
+  MatDialogModule,
+  MatExpansionModule,
+  MatFormFieldModule,
+  MatGridListModule,
+  MatIconModule,
+  MatInputModule,
+  MatListModule,
+  MatMenuModule,
+  MatPaginatorModule,
+  MatProgressBarModule,
+  MatProgressSpinnerModule,
+  MatRadioModule,
+  MatSelectModule,
+  MatSidenavModule,
+  MatSliderModule,
+  MatSlideToggleModule,
+  MatSnackBarModule,
+  MatSortModule,
+  MatTableModule,
+  MatTabsModule,
+  MatToolbarModule,
+  MatTooltipModule,
+  MatStepperModule,
+} from '@angular/material';
+import {MatNativeDateModule, MatRippleModule} from '@angular/material';
+import {CdkTableModule} from '@angular/cdk/table';
+//import {CdkAccordionModule} from '@angular/cdk/accordion';
+import {A11yModule} from '@angular/cdk/a11y';
+import {BidiModule} from '@angular/cdk/bidi';
+import {OverlayModule} from '@angular/cdk/overlay';
+import {PlatformModule} from '@angular/cdk/platform';
+import {ObserversModule} from '@angular/cdk/observers';
+import {PortalModule} from '@angular/cdk/portal';
+
+/*
+* NgModule that includes all Material modules that are required to
+* serve AsterixDB Dashboard
+*/
+@NgModule({
+  exports: [
+    MatAutocompleteModule,
+    MatButtonModule,
+    MatButtonToggleModule,
+    MatCardModule,
+    MatCheckboxModule,
+    MatChipsModule,
+    MatTableModule,
+    MatDatepickerModule,
+    MatDialogModule,
+    MatExpansionModule,
+    MatFormFieldModule,
+    MatGridListModule,
+    MatIconModule,
+    MatInputModule,
+    MatListModule,
+    MatMenuModule,
+    MatPaginatorModule,
+    MatProgressBarModule,
+    MatProgressSpinnerModule,
+    MatRadioModule,
+    MatRippleModule,
+    MatSelectModule,
+    MatSidenavModule,
+    MatSlideToggleModule,
+    MatSliderModule,
+    MatSnackBarModule,
+    MatSortModule,
+    MatStepperModule,
+    MatTabsModule,
+    MatToolbarModule,
+    MatTooltipModule,
+    MatNativeDateModule,
+    CdkTableModule,
+    A11yModule,
+    BidiModule,
+  //  CdkAccordionModule,
+    ObserversModule,
+    OverlayModule,
+    PlatformModule,
+    PortalModule,
+  ]
+})
+export class MaterialModule {}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/app.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/app.actions.ts
new file mode 100755
index 0000000..29da05f
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/app.actions.ts
@@ -0,0 +1,33 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { AsterixDBQueryMessage, Dataset } from '../models/asterixDB.model';
+
+/*
+* Definition of App Actions
+*/
+export const APP_MODE_CHANGE = '[App State] App Mode Change';
+
+/*
+* Guide Select Datasets for UI Helpers
+*/
+export class ChangeMode implements Action {
+  readonly type = APP_MODE_CHANGE;
+  constructor(public payload: string) {}
+}
+
+/*
+* Exports of datasets actions
+*/
+export type All = ChangeMode;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataset.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataset.actions.ts
new file mode 100755
index 0000000..a49e07c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataset.actions.ts
@@ -0,0 +1,130 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { AsterixDBQueryMessage, Dataset } from '../models/asterixDB.model';
+
+/*
+* Definition of Datasets Actions
+*/
+export const SELECT_DATASETS          = '[Dataset Collection] Select Dataset';
+export const SELECT_DATASETS_SUCCESS  = '[Dataset Collection] Select Dataset Success';
+export const SELECT_DATASETS_FAIL     = '[Dataset Collection] Select Dataset Fail';
+export const CREATE_DATASET           = '[Dataset Collection] Create Dataset';
+export const CREATE_DATASET_SUCCESS   = '[Dataset Collection] Create Dataset Success';
+export const CREATE_DATASET_FAIL      = '[Dataset Collection] Create Dataset Fail';
+export const UPDATE_DATASET           = '[Dataset Collection] Update Dataset';
+export const UPDATE_DATASET_SUCCESS   = '[Dataset Collection] Update Dataset Success';
+export const UPDATE_DATASET_FAIL      = '[Dataset Collection] Update Dataset Fail';
+export const DROP_DATASET             = '[Dataset Collection] Drop Dataset';
+export const DROP_DATASET_SUCCESS     = '[Dataset Collection] Drop Dataset Success';
+export const DROP_DATASET_FAIL        = '[Dataset Collection] Drop Dataset Fail';
+export const GUIDE_SELECT_DATASET     = '[Dataset Collection] Guide Select Dataset';
+
+
+/*
+* Guide Select Datasets for UI Helpers
+*/
+export class GuideSelectDatasets implements Action {
+  readonly type = GUIDE_SELECT_DATASET;
+  constructor(public payload: string) {}
+}
+
+/*
+* Select Datasets
+*/
+export class SelectDatasets implements Action {
+  readonly type = SELECT_DATASETS;
+  constructor(public payload: string) {}
+}
+
+export class SelectDatasetsSuccess implements Action {
+  readonly type = SELECT_DATASETS_SUCCESS;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+export class SelectDatasetsFail implements Action {
+  readonly type = SELECT_DATASETS_FAIL;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+/*
+* Create Dataset
+*/
+export class CreateDataset implements Action {
+  readonly type = CREATE_DATASET;
+  constructor(public payload: string) {}
+}
+
+export class CreateDatasetSuccess implements Action {
+  readonly type = CREATE_DATASET_SUCCESS;
+  constructor(public payload: Dataset[]) {}
+}
+
+export class CreateDatasetFail implements Action {
+  readonly type = CREATE_DATASET_FAIL;
+  constructor(public payload: Dataset) {}
+}
+
+/*
+* Update Dataset
+*/
+export class UpdateDataset implements Action {
+  readonly type = UPDATE_DATASET;
+  constructor(public payload: Dataset) {}
+}
+
+export class UpdateDatasetSuccess implements Action {
+  readonly type = UPDATE_DATASET_SUCCESS;
+  constructor(public payload: Dataset[]) {}
+}
+
+export class UpdateDatasetFail implements Action {
+  readonly type = UPDATE_DATASET_FAIL;
+  constructor(public payload: Dataset) {}
+}
+
+/*
+* Drop Dataset
+*/
+export class DropDataset implements Action {
+  readonly type = DROP_DATASET;
+  constructor(public payload: string) {}
+}
+
+export class DropDatasetSuccess implements Action {
+  readonly type = DROP_DATASET_SUCCESS;
+  constructor(public payload: Dataset[]) {}
+}
+
+export class DropDatasetFail implements Action {
+  readonly type = DROP_DATASET_FAIL;
+  constructor(public payload: Dataset) {}
+}
+
+/*
+* Exports of datasets actions
+*/
+export type All = SelectDatasets |
+  SelectDatasetsSuccess |
+  SelectDatasetsFail |
+  CreateDataset |
+  CreateDatasetSuccess |
+  CreateDatasetFail |
+  UpdateDataset |
+  UpdateDatasetSuccess |
+  UpdateDatasetFail |
+  DropDataset |
+  DropDatasetSuccess |
+  DropDatasetFail | 
+  GuideSelectDatasets;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/datatype.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/datatype.actions.ts
new file mode 100755
index 0000000..5543a7a
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/datatype.actions.ts
@@ -0,0 +1,122 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { AsterixDBQueryMessage, Datatype } from '../models/asterixDB.model';
+
+/*
+* Definition of Datatypes Actions
+*/
+export const SELECT_DATATYPES         = '[Datatype Collection] Select Datatypes';
+export const SELECT_DATATYPES_SUCCESS = '[Datatype Collection] Select Datatypes Success';
+export const SELECT_DATATYPES_FAIL    = '[Datatype Collection] Select Datatypes Fail';
+export const CREATE_DATATYPE          = '[Datatype Collection] Create Datatypes';
+export const CREATE_DATATYPE_SUCCESS  = '[Datatype Collection] Create Datatypes Success';
+export const CREATE_DATATYPE_FAIL     = '[Datatype Collection] Create Datatypes Fail';
+export const UPDATE_DATATYPE          = '[Datatype Collection] Update Datatype';
+export const UPDATE_DATATYPE_SUCCESS  = '[Datatype Collection] Update Datatype Success';
+export const UPDATE_DATATYPE_FAIL     = '[Datatype Collection] Update Datatype Fail';
+export const DROP_DATATYPE            = '[Datatype Collection] Drop Datatypes';
+export const DROP_DATATYPE_SUCCESS    = '[Datatype Collection] Drop Datatypes Success';
+export const DROP_DATATYPE_FAIL       = '[Datatype Collection] Drop Datatypes Fail';
+
+/*
+* Select Datatypes
+*/
+export class SelectDatatypes implements Action {
+  readonly type = SELECT_DATATYPES;
+  constructor(public payload: string) {}
+}
+
+export class SelectDatatypesSuccess implements Action {
+  readonly type = SELECT_DATATYPES_SUCCESS;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+export class SelectDatatypesFail implements Action {
+  readonly type = SELECT_DATATYPES_FAIL;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+/*
+* Create Datatype
+*/
+export class CreateDatatype implements Action {
+  readonly type = CREATE_DATATYPE;
+  constructor(public payload: string) {}
+}
+
+export class CreateDatatypeSuccess implements Action {
+  readonly type = CREATE_DATATYPE_SUCCESS;
+  constructor(public payload: Datatype[]) {}
+}
+
+export class CreateDatatypeFail implements Action {
+  readonly type = CREATE_DATATYPE_FAIL;
+  constructor(public payload: Datatype) {}
+}
+
+/*
+* Update Datatype
+*/
+export class UpdateDatatype implements Action {
+  readonly type = UPDATE_DATATYPE;
+  constructor(public payload: Datatype) {}
+}
+
+export class UpdateDatatypeSuccess implements Action {
+  readonly type = UPDATE_DATATYPE_SUCCESS;
+  constructor(public payload: Datatype[]) {}
+}
+
+export class UpdateDatatypeFail implements Action {
+  readonly type = UPDATE_DATATYPE_FAIL;
+  constructor(public payload: Datatype) {}
+}
+
+/*
+* Drop Datatype
+*/
+export class DropDatatype implements Action {
+  readonly type = DROP_DATATYPE;
+
+  constructor(public payload: string) {}
+}
+
+export class DropDatatypeSuccess implements Action {
+  readonly type = DROP_DATATYPE_SUCCESS;
+
+  constructor(public payload: Datatype[]) {}
+}
+
+export class DropDatatypeFail implements Action {
+  readonly type = DROP_DATATYPE_FAIL;
+
+  constructor(public payload: Datatype) {}
+}
+
+/*
+* Exports of datastypes actions
+*/
+export type All = SelectDatatypes |
+  SelectDatatypesSuccess |
+  SelectDatatypesFail |
+  CreateDatatype |
+  CreateDatatypeSuccess |
+  CreateDatatypeFail |
+  UpdateDatatype |
+  UpdateDatatypeSuccess |
+  UpdateDatatypeFail |
+  DropDatatype |
+  DropDatatypeSuccess |
+  DropDatatypeFail;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataverse.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataverse.actions.ts
new file mode 100755
index 0000000..dc33c0a
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/dataverse.actions.ts
@@ -0,0 +1,119 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { AsterixDBQueryMessage, Dataverse } from '../models/asterixDB.model';
+
+/*
+* Definition of Dataverses Actions
+*/
+export const SELECT_DATAVERSES          = '[Dataverse Collection] Select Dataverses';
+export const SELECT_DATAVERSES_SUCCESS  = '[Dataverse Collection] Select Dataverses Success';
+export const SELECT_DATAVERSES_FAIL     = '[Dataverse Collection] Select Dataverses Fail';
+export const CREATE_DATAVERSE           = '[Dataverse Collection] Create Dataverse';
+export const CREATE_DATAVERSE_SUCCESS   = '[Dataverse Collection] Create Dataverse Success';
+export const CREATE_DATAVERSE_FAIL      = '[Dataverse Collection] Create Dataverse Fail';
+export const UPDATE_DATAVERSE           = '[Dataverse Collection] Update Dataverse';
+export const UPDATE_DATAVERSE_SUCCESS   = '[Dataverse Collection] Update Dataverse Success';
+export const UPDATE_DATAVERSE_FAIL      = '[Dataverse Collection] Update Dataverse Fail';
+export const DROP_DATAVERSE             = '[Dataverse Collection] Drop Dataverses';
+export const DROP_DATAVERSE_SUCCESS     = '[Dataverse Collection] Drop Dataverses Success';
+export const DROP_DATAVERSE_FAIL        = '[Dataverse Collection] Drop Dataverses Fail';
+
+/*
+* Select Dataverses
+*/
+export class SelectDataverses implements Action {
+  readonly type = SELECT_DATAVERSES;
+  constructor(public payload: string) {}
+}
+
+export class SelectDataversesSuccess implements Action {
+  readonly type = SELECT_DATAVERSES_SUCCESS;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+export class SelectDataversesFail implements Action {
+  readonly type = SELECT_DATAVERSES_FAIL;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+/*
+* Create Dataverse
+*/
+export class CreateDataverse implements Action {
+  readonly type = CREATE_DATAVERSE;
+  constructor(public payload: string) {}
+}
+
+export class CreateDataverseSuccess implements Action {
+  readonly type = CREATE_DATAVERSE_SUCCESS;
+  constructor(public payload: Dataverse[]) {}
+}
+
+export class CreateDataverseFail implements Action {
+  readonly type = CREATE_DATAVERSE_FAIL;
+  constructor(public payload: Dataverse) {}
+}
+
+/*
+* Update Dataverse
+*/
+export class UpdateDataverse implements Action {
+  readonly type = UPDATE_DATAVERSE;
+  constructor(public payload: Dataverse) {}
+}
+
+export class UpdateDataverseSuccess implements Action {
+  readonly type = UPDATE_DATAVERSE_SUCCESS;
+  constructor(public payload: Dataverse[]) {}
+}
+
+export class UpdateDataverseFail implements Action {
+  readonly type = UPDATE_DATAVERSE_FAIL;
+  constructor(public payload: Dataverse) {}
+}
+
+/*
+* Drop Dataverse
+*/
+export class DropDataverse implements Action {
+  readonly type = DROP_DATAVERSE;
+  constructor(public payload: string) {}
+}
+
+export class DropDataverseSuccess implements Action {
+  readonly type = DROP_DATAVERSE_SUCCESS;
+  constructor(public payload: Dataverse[]) {}
+}
+
+export class DropDataverseFail implements Action {
+  readonly type = DROP_DATAVERSE_FAIL;
+  constructor(public payload: Dataverse) {}
+}
+
+/*
+* Exports of datasverses actions
+*/
+export type All = SelectDataverses |
+  SelectDataversesSuccess |
+  SelectDataversesFail |
+  CreateDataverse |
+  CreateDataverseSuccess |
+  CreateDataverseFail |
+  UpdateDataverse |
+  UpdateDataverseSuccess |
+  UpdateDataverseFail |
+  DropDataverse |
+  DropDataverseSuccess |
+  DropDataverseFail;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/index.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/index.actions.ts
new file mode 100755
index 0000000..1304644
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/index.actions.ts
@@ -0,0 +1,119 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { Index } from '../models/asterixDB.model';
+
+/*
+* Definition of Index Actions
+*/
+export const SELECT_INDEXES         = '[Index Collection] Select Indexes';
+export const SELECT_INDEXES_SUCCESS = '[Index Collection] Select Indexes Success';
+export const SELECT_INDEXES_FAIL    = '[Index Collection] Select Indexes Fail';
+export const CREATE_INDEX           = '[Index Collection] Create Index';
+export const CREATE_INDEX_SUCCESS   = '[Index Collection] Create Index Success';
+export const CREATE_INDEX_FAIL      = '[Index Collection] Create Index Fail';
+export const UPDATE_INDEX           = '[Index Collection] Update Index';
+export const UPDATE_INDEX_SUCCESS   = '[Index Collection] Update Index Success';
+export const UPDATE_INDEX_FAIL      = '[Index Collection] Update Index Fail';
+export const DROP_INDEX             = '[Index Collection] Drop Indexes';
+export const DROP_INDEX_SUCCESS     = '[Index Collection] Drop Indexes Success';
+export const DROP_INDEX_FAIL        = '[Index Collection] Drop Indexes Fail';
+
+/*
+* Select Indexes
+*/
+export class SelectIndexes implements Action {
+  readonly type = SELECT_INDEXES;
+  constructor(public payload: string) {}
+}
+
+export class SelectIndexesSuccess implements Action {
+  readonly type = SELECT_INDEXES_SUCCESS;
+  constructor(public payload: Index[]) {}
+}
+
+export class SelectIndexesFail implements Action {
+  readonly type = SELECT_INDEXES_FAIL;
+  constructor(public payload: Index[]) {}
+}
+
+/*
+* Create Index
+*/
+export class CreateIndex implements Action {
+  readonly type = CREATE_INDEX;
+  constructor(public payload: string) {}
+}
+
+export class CreateIndexSuccess implements Action {
+  readonly type = CREATE_INDEX_SUCCESS;
+  constructor(public payload: Index[]) {}
+}
+
+export class CreateIndexFail implements Action {
+  readonly type = CREATE_INDEX_FAIL;
+  constructor(public payload: Index) {}
+}
+
+/*
+* Update Index
+*/
+export class UpdateIndex implements Action {
+  readonly type = UPDATE_INDEX;
+  constructor(public payload: Index) {}
+}
+
+export class UpdateIndexSuccess implements Action {
+  readonly type = UPDATE_INDEX_SUCCESS;
+  constructor(public payload: Index[]) {}
+}
+
+export class UpdateIndexFail implements Action {
+  readonly type = UPDATE_INDEX_FAIL;
+  constructor(public payload: Index) {}
+}
+
+/*
+* Remove Index
+*/
+export class DropIndex implements Action {
+  readonly type = DROP_INDEX;
+  constructor(public payload: string) {}
+}
+
+export class DropIndexSuccess implements Action {
+  readonly type = DROP_INDEX_SUCCESS;
+  constructor(public payload: Index[]) {}
+}
+
+export class DropIndexFail implements Action {
+  readonly type = DROP_INDEX_FAIL;
+  constructor(public payload: Index) {}
+}
+
+/*
+* Exports of indexes actions
+*/
+export type All = SelectIndexes |
+  SelectIndexesSuccess |
+  SelectIndexesFail |
+  CreateIndex |
+  CreateIndexSuccess |
+  CreateIndexFail |
+  UpdateIndex |
+  UpdateIndexSuccess |
+  UpdateIndexFail |
+  DropIndex |
+  DropIndexSuccess |
+  DropIndexFail;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/metadata.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/metadata.actions.ts
new file mode 100755
index 0000000..4a3c125
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/metadata.actions.ts
@@ -0,0 +1,46 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+
+/*
+* Definition of Metadata Tree Actions
+*/
+export const UPDATE_METADATA_TREE         = '[Metadata Tree Query] UPDATE Metadata tree';
+export const UPDATE_METADATA_TREE_SUCCESS = '[Metadata Tree Query] UPDATE Metadata tree Success';
+export const UPDATE_METADATA_TREE_FAIL    = '[Metadata Tree Query] UPDATE Metadata tree Fail';
+
+/*
+* Construct Metadata Tree Actions
+*/
+export class UpdateMetadataTree implements Action {
+  readonly type = UPDATE_METADATA_TREE
+  constructor() {}
+}
+
+export class UpdateMetadataTreeSuccess implements Action {
+  readonly type = UPDATE_METADATA_TREE_SUCCESS;
+  constructor(public payload: any) {}
+}
+
+export class UpdateMetadataTreeFail implements Action {
+  readonly type = UPDATE_METADATA_TREE_FAIL;
+  constructor(public payload: any) {}
+}
+
+/*
+* Exports of Metatada Tree actions
+*/
+export type All = UpdateMetadataTree |
+    UpdateMetadataTreeSuccess |
+    UpdateMetadataTreeFail;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/query.actions.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/query.actions.ts
new file mode 100755
index 0000000..866b3e9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/actions/query.actions.ts
@@ -0,0 +1,71 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Action } from '@ngrx/store';
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+
+/*
+* Definition of SQL++ Actions
+*/
+export const EXECUTE_QUERY                  = '[Query] Execute SQL++ Query';
+export const EXECUTE_QUERY_SUCCESS          = '[Query] Execute SQL++ Query Success';
+export const EXECUTE_QUERY_FAIL             = '[Query] Execute SQL++ Query Fail';
+export const EXECUTE_METADATA_QUERY         = '[Query] Execute Metadata SQL++ Query';
+export const EXECUTE_METADATA_QUERY_SUCCESS = '[Query] Execute Metadata SQL++ Query Success';
+export const EXECUTE_METADATA_QUERY_FAIL     = '[Query] Execute Metadata SQL++ Query Fail';
+
+/*
+* Execute SQL++ Query
+*/
+export class ExecuteQuery implements Action {
+  readonly type = EXECUTE_QUERY;
+  constructor(public payload: string) {} // the AsterixDB Query String
+}
+
+export class ExecuteQuerySuccess implements Action {
+  readonly type = EXECUTE_QUERY_SUCCESS;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+export class ExecuteQueryFail implements Action {
+  readonly type = EXECUTE_QUERY_FAIL;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+/*
+* Execute Metadata SQL++ Query
+*/
+export class ExecuteMetadataQuery implements Action {
+  readonly type = EXECUTE_METADATA_QUERY;
+  constructor(public payload: string) {} // the AsterixDB Query String
+}
+
+export class ExecuteMetadataQuerySuccess implements Action {
+  readonly type = EXECUTE_METADATA_QUERY_SUCCESS;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+export class ExecuteMetadataQueryFail implements Action {
+  readonly type = EXECUTE_METADATA_QUERY_FAIL;
+  constructor(public payload: AsterixDBQueryMessage[]) {}
+}
+
+/*
+* Exports of SQL++ actions
+*/
+export type All = ExecuteQuery |
+  ExecuteQuerySuccess |
+  ExecuteQueryFail |
+  ExecuteMetadataQuery |
+  ExecuteMetadataQuerySuccess |
+  ExecuteMetadataQueryFail;
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataset.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataset.effects.ts
new file mode 100755
index 0000000..b5624a4
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataset.effects.ts
@@ -0,0 +1,65 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Action } from '@ngrx/store';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import * as datasetActions from '../actions/dataset.actions';
+import { SQLService } from '../services/async-query.service';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = datasetActions.All
+
+@Injectable()
+export class DatasetEffects {
+    constructor(private actions: Actions,
+        private sqlService: SQLService) {}
+
+    /* Effect to load a collection of all Datasets from AsterixDB
+    */
+    @Effect()
+    selectDatasets$: Observable<Action> = this.actions
+        .ofType(datasetActions.SELECT_DATASETS)
+        .switchMap(query => {
+            return this.sqlService.selectDatasets()
+            .map(dataset => new datasetActions.SelectDatasetsSuccess(dataset))
+            .catch(err => of(new datasetActions.SelectDatasetsFail(err)));
+    });
+
+    /* Effect to create a Datasets from AsterixDB
+    */
+    @Effect()
+    createDatasets$: Observable<Action> = this.actions
+        .ofType(datasetActions.CREATE_DATASET)
+        .switchMap(dataset => {
+            return this.sqlService.createDataset((dataset as any).payload)
+            .map(dataset => new datasetActions.CreateDatasetSuccess(dataset))
+            .catch(err => of(new datasetActions.CreateDatasetFail(err)));
+    });
+
+    /* Effect to drop a Datasets from AsterixDB
+    */
+    @Effect()
+    dropDatasets$: Observable<Action> = this.actions
+        .ofType(datasetActions.DROP_DATASET)
+        .switchMap(dataset => {
+            console.log((dataset as any).payload)
+            return this.sqlService.dropDataset((dataset as any).payload)
+            .map(dataset => new datasetActions.DropDatasetSuccess(dataset))
+            .catch(err => of(new datasetActions.DropDatasetFail(err)));
+    });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/datatype.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/datatype.effects.ts
new file mode 100755
index 0000000..4fa187f
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/datatype.effects.ts
@@ -0,0 +1,63 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import * as datatypeActions from '../actions/datatype.actions';
+import { SQLService } from '../services/async-query.service';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = datatypeActions.All
+
+@Injectable()
+export class DatatypeEffects {
+  constructor(private actions: Actions,
+      private sqlService: SQLService) {}
+
+  /* Effect to load a collection of all Datatypes from AsterixDB
+  */
+  @Effect()
+  selectDatatypes$: Observable<Action> = this.actions
+    .ofType(datatypeActions.SELECT_DATATYPES)
+    .switchMap(query => {
+        return this.sqlService.selectDatatypes()
+           .map(datatype => new datatypeActions.SelectDatatypesSuccess(datatype))
+           .catch(err => of(new datatypeActions.SelectDatatypesFail(err)));
+  });
+
+  /* Effect to create a Datatype from AsterixDB
+  */
+  @Effect()
+  createDatatypes$: Observable<Action> = this.actions
+    .ofType(datatypeActions.CREATE_DATATYPE)
+    .switchMap(datatype => {
+        return this.sqlService.createDatatype((datatype as any).payload)
+           .map(datatype => new datatypeActions.CreateDatatypeSuccess(datatype))
+           .catch(err => of(new datatypeActions.CreateDatatypeFail(err)));
+  });
+
+  /* Effect to drop a Datatype from AsterixDB
+  */
+  @Effect()
+  dropDatatypes$: Observable<Action> = this.actions
+    .ofType(datatypeActions.DROP_DATATYPE)
+    .switchMap(datatype => {
+        return this.sqlService.dropDatatype((datatype as any).payload)
+           .map(datatype => new datatypeActions.DropDatatypeSuccess(datatype))
+           .catch(err => of(new datatypeActions.DropDatatypeFail(err)));
+  });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataverse.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataverse.effects.ts
new file mode 100755
index 0000000..d917420
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/dataverse.effects.ts
@@ -0,0 +1,63 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import * as dataverseActions from '../actions/dataverse.actions';
+import { SQLService } from '../services/async-query.service';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = dataverseActions.All
+
+@Injectable()
+export class DataverseEffects {
+  constructor(private actions: Actions,
+      private sqlService: SQLService) {}
+
+  /* Effect to load a collection of all Dataverses from AsterixDB
+  */
+  @Effect()
+    selectDataverses$: Observable<Action> = this.actions
+        .ofType(dataverseActions.SELECT_DATAVERSES)
+        .switchMap(query => {
+            return this.sqlService.selectDataverses()
+            .map(dataverse => new dataverseActions.SelectDataversesSuccess(dataverse))
+            .catch(err => of(new dataverseActions.SelectDataversesFail(err)));
+    });
+
+    /* Effect to create Dataverse from AsterixDB
+    */
+    @Effect()
+    createDataverses$: Observable<Action> = this.actions
+        .ofType(dataverseActions.CREATE_DATAVERSE)
+        .switchMap(dataverseName => {
+            return this.sqlService.createDataverse((dataverseName as any).payload)
+            .map(dataverse => new dataverseActions.CreateDataverseSuccess(dataverse))
+            .catch(err => of(new dataverseActions.CreateDataverseFail(err)));
+    });
+
+    /* Effect to drop a Dataverse from AsterixDB
+    */
+    @Effect()
+    dropDataverses$: Observable<Action> = this.actions
+        .ofType(dataverseActions.DROP_DATAVERSE)
+        .switchMap(dataverseName => {
+            return this.sqlService.dropDataverse((dataverseName as any).payload)
+            .map(dataverse => new dataverseActions.DropDataverseSuccess(dataverse))
+            .catch(err => of(new dataverseActions.DropDataverseFail(err)));
+    });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/index.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/index.effects.ts
new file mode 100755
index 0000000..8491392
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/index.effects.ts
@@ -0,0 +1,63 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import * as indexActions from '../actions/index.actions';
+import { SQLService } from '../services/async-query.service';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = indexActions.All
+
+@Injectable()
+export class IndexEffects {
+  constructor(private actions: Actions,
+      private sqlService: SQLService) {}
+
+  /* Effect to load a collection of all Index from AsterixDB
+  */
+  @Effect()
+  selectIndexes$: Observable<Action> = this.actions
+    .ofType(indexActions.SELECT_INDEXES)
+    .switchMap(query => {
+        return this.sqlService.selectIndexes()
+           .map(index => new indexActions.SelectIndexesSuccess(index))
+           .catch(err => of(new indexActions.SelectIndexesFail(err)));
+  });
+
+  /* Effect to create a Index
+  */
+  @Effect()
+  createIndexes$: Observable<Action> = this.actions
+    .ofType(indexActions.CREATE_INDEX)
+    .switchMap(index => {
+        return this.sqlService.createIndex((index as any).payload)
+           .map(index => new indexActions.CreateIndexSuccess(index))
+           .catch(err => of(new indexActions.CreateIndexFail(err)));
+  });
+
+  /* Effect to drop a Index
+  */
+  @Effect()
+  dropIndexes$: Observable<Action> = this.actions
+    .ofType(indexActions.DROP_INDEX)
+    .switchMap(index => {
+        return this.sqlService.dropIndex((index as any).payload)
+           .map(index => new indexActions.DropIndexSuccess(index))
+           .catch(err => of(new indexActions.DropIndexFail(err)));
+  });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/metadata.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/metadata.effects.ts
new file mode 100755
index 0000000..ddcdb27
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/metadata.effects.ts
@@ -0,0 +1,41 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Action } from '@ngrx/store';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import { MetadataService } from '../services/async-metadata.service';
+import * as metadataActions from '../actions/metadata.actions';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = metadataActions.All
+
+@Injectable()
+export class MetadataEffects {
+  constructor(private actions: Actions,
+      private metadataService: MetadataService) {}
+
+  /* Effect to update and retrieve the Metadata Tree
+  */
+  @Effect()
+  calculateDBTree$: Observable<Action> = this.actions
+    .ofType(metadataActions.UPDATE_METADATA_TREE)
+    .switchMap(() => {
+        return this.metadataService.getMetadataTree()
+          .map(tree => new metadataActions.UpdateMetadataTreeSuccess(tree))
+    });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/query.effects.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/query.effects.ts
new file mode 100755
index 0000000..cb78255
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/effects/query.effects.ts
@@ -0,0 +1,53 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Action } from '@ngrx/store';
+import { Effect, Actions } from '@ngrx/effects';
+import { Observable } from 'rxjs/Observable';
+import { of } from 'rxjs/observable/of';
+import { SQLService } from '../services/async-query.service';
+import * as sqlQueryActions from '../actions/query.actions';
+import 'rxjs/add/operator/map';
+import 'rxjs/add/operator/switchMap';
+import 'rxjs/add/operator/catch';
+
+export type Action = sqlQueryActions.All
+
+@Injectable()
+export class SQLQueryEffects {
+  constructor(private actions: Actions,
+      private sqlService: SQLService) {}
+
+  /* Effect to Execute an SQL++ Query against the AsterixDB
+  */
+  @Effect()
+  executeQuery$: Observable<Action> = this.actions
+    .ofType(sqlQueryActions.EXECUTE_QUERY)
+    .switchMap(query => {
+        return this.sqlService.executeSQLQuery((query as any).payload)
+           .map(sqlQueryResult => new sqlQueryActions.ExecuteQuerySuccess(sqlQueryResult))
+           .catch(sqlQueryError => of(new sqlQueryActions.ExecuteQueryFail(sqlQueryError)));
+  });
+
+  /* Effect to Execute an SQL++ Metadata Query against the AsterixDB
+  */
+  @Effect()
+  executeMetadataQuery$: Observable<Action> = this.actions
+    .ofType(sqlQueryActions.EXECUTE_METADATA_QUERY)
+    .switchMap(query => {
+        return this.sqlService.executeSQLQuery((query as any).payload)
+           .map(sqlMetadataQueryResult => new sqlQueryActions.ExecuteMetadataQuerySuccess(sqlMetadataQueryResult))
+           .catch(sqlMetadataQueryError => of(new sqlQueryActions.ExecuteMetadataQueryFail(sqlMetadataQueryError)));
+  });
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/models/asterixDB.model.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/models/asterixDB.model.ts
new file mode 100755
index 0000000..bbdabe2
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/models/asterixDB.model.ts
@@ -0,0 +1,112 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/*
+* Interfaces representing AsterixDB data model structures.
+*/
+
+export interface Dataverse {
+  dataFormat: string;
+  dataverseName: string;
+  pendingOp: string;
+  timeStamp: string;
+};
+
+export interface ResultsM {
+  dataFormat: string;
+  dataverseName: string;
+  pendingOp: string;
+  timeStamp: string;
+};
+
+export interface Dataset {
+  compactionPolicy: string;
+  compactionPolicyProperties: CompactionPolicyProperties[];
+  datasetId: string;
+  datasetName: string;
+  datasetType:string;
+  datatypeDataverseName: string;
+  datatypeName: string;
+  dataverseName: string;
+  groupName:string;
+  hints: string[];
+  internalDetails: InternalDetails;
+  pendingOp: string;
+  timestamp: string;
+};
+
+export interface CompactionPolicyProperties {
+  name: string;
+  value: string;
+};
+
+export interface InternalDetails {
+  autogenerated: string;
+  fileStructure: string;
+  partitioningKey: string;
+  partitioningStrategy: string;
+  primaryKey: string[];
+};
+
+// Message format coming back from AsterixDB REST API
+export interface AsterixDBQueryMessage {
+  metrics: Metrics;
+  requestId: string;
+  results: any[];
+  signature: string;
+  status: string;
+};
+
+export interface Metrics {
+  elapsedTime: string;
+  executionTime: string;
+  resultCount: string;
+  resultSize: string;
+};
+
+// Datatype Data Model comming from AsterixDB REST API
+export interface Datatype {
+  datatypeName: string;
+  dataverseName: string;
+  derived: DatatypeDerived;
+  timeStamp: string;
+};
+
+export interface DatatypeDerived {
+  isAnonymous: boolean;
+  record: DatatypeDerivedRecord;
+  tag: string;
+};
+
+export interface DatatypeDerivedRecord {
+  Fields: DatatypeDerivedRecordField[];
+  isOpen: boolean;
+};
+
+export interface DatatypeDerivedRecordField {
+  fieldName: string;
+  fieldType: "string";
+  isNullable: boolean;
+}
+
+// Index Data Model comming from AsterixDB REST API
+export interface Index {
+  dataverseName: string;
+  datasetName: string;
+  indexName: string;
+  indexStructure: string;
+  searchKey: string[];
+  isPrimary: boolean;
+  timestamp: string;
+  pendingOp: string;
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/keys.pipe.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/keys.pipe.ts
new file mode 100755
index 0000000..77cac5a
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/keys.pipe.ts
@@ -0,0 +1,25 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { PipeTransform, Pipe } from '@angular/core';
+
+@Pipe({name: 'keys'})
+export class KeysPipe implements PipeTransform {
+  transform(value, args:string[]) : any {
+    let keys = [];
+    for (let key in value) {
+      keys.push(key);
+    }
+    return keys;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectArrayType.pipe.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectArrayType.pipe.ts
new file mode 100755
index 0000000..220b53c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectArrayType.pipe.ts
@@ -0,0 +1,23 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// Detecting if an object is an array
+import { PipeTransform, Pipe } from '@angular/core';
+
+@Pipe({name: 'isObjectArray'})
+export class ObjectArrayTypePipe implements PipeTransform {
+  transform(value, args:string[]) : any {
+		return value && (value.constructor.toString().indexOf("Array") != -1)
+					&& value[0] && (value[0].constructor.toString().indexOf("Object") != -1);
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectType.pipe.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectType.pipe.ts
new file mode 100755
index 0000000..5b8f795
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/pipes/objectType.pipe.ts
@@ -0,0 +1,21 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { PipeTransform, Pipe } from '@angular/core';
+
+@Pipe({name: 'isObject'})
+export class ObjectTypePipe implements PipeTransform {
+  transform(value, args:string[]) : any {
+		return value && (value.constructor.toString().indexOf("Object") != -1);
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/app.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/app.reducer.ts
new file mode 100755
index 0000000..01c65ac
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/app.reducer.ts
@@ -0,0 +1,73 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+import * as appActions from '../actions/app.actions';
+
+export type Action = appActions.All;
+
+/*
+** Interfaces for app state in store/state
+*/
+export interface State {
+  loading: boolean,
+  loaded: boolean,
+  success: boolean,
+  sqlQueryString: string,
+  sqlQueryResult: AsterixDBQueryMessage[],
+  sqlQueryError: AsterixDBQueryMessage[],
+  sqlMetadataQueryString: string,
+  sqlMetadataQueryResult: AsterixDBQueryMessage[],
+  sqlMetadataQueryError: AsterixDBQueryMessage[]
+};
+
+const initialState: State = {
+  loading: false,
+  loaded: false,
+  success: false,
+  sqlQueryString: "",
+  sqlQueryResult: [],
+  sqlQueryError: [],
+  sqlMetadataQueryString: "",
+  sqlMetadataQueryResult: [],
+  sqlMetadataQueryError: [],
+};
+
+/*
+** Reducer function for app state in store/state
+*/
+export function appReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true, and clear previous results
+    * to signaling that a EXECUTE a SQL++ Query is ongoing
+    */
+    case appActions.APP_MODE_CHANGE: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryString: action.payload,
+        sqlQueryResult: [],
+        sqlQueryError: []
+      });
+    }
+    
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataset.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataset.reducer.ts
new file mode 100755
index 0000000..25d09b9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataset.reducer.ts
@@ -0,0 +1,177 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Dataset } from '../models/asterixDB.model';
+import * as DatasetAction from '../actions/dataset.actions';
+
+export type Action = DatasetAction.All;
+
+/*
+** Interfaces for datasets in store/state
+*/
+export interface State {
+  loaded: boolean,
+  loading: boolean,
+  datasets: any[],
+  createDataset: any[],
+  createDatasetError: any[],
+  createDatasetSuccess: boolean,
+  createDatasetFailed: boolean,
+  dropDataset: any[],
+  dropDatasetError: any[],
+  dropDatasetSuccess: boolean,
+  dropDatasetFailed: boolean,
+  guideSelectsDataset: string,
+};
+
+const initialState: State = {
+  loaded: false,
+  loading: false,
+  datasets: [],
+  createDataset: [],
+  createDatasetError: [],
+  createDatasetSuccess: false,
+  createDatasetFailed: false,
+  dropDataset: [],
+  dropDatasetError: [],
+  dropDatasetSuccess: false,
+  dropDatasetFailed: false,
+  guideSelectsDataset: ""
+};
+
+/*
+** Reducer function for datasets in store/state
+*/
+export function datasetReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the selected dataset state to true to signaling
+    * UI from metadata guide 
+    */
+    case DatasetAction.GUIDE_SELECT_DATASET: {
+      return Object.assign({}, state, { guideSelectsDataset: action.payload });
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a SELECT Query is ongoing
+    */
+    case DatasetAction.SELECT_DATASETS: {
+        return Object.assign({}, state, { loading: true });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a SELECT Query is success and there is datasets available in the
+    * store
+    */
+    case DatasetAction.SELECT_DATASETS_SUCCESS: {
+      return Object.assign({}, state, {
+        loaded: true,
+        loading: false,
+        datasets: action.payload
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a CREATE a Dataset Query is ongoing
+    */
+    case DatasetAction.CREATE_DATASET: {
+      return Object.assign({}, state, { 
+        createDataset: [],
+        createDatasetError: [],
+        createDatasetSuccess: false,
+        createDatasetFailed: false,
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Dataset Query is success and there is datasets available in the
+    * store
+    */
+    case DatasetAction.CREATE_DATASET_SUCCESS: {
+      return Object.assign({}, state, {
+        createDataset: action.payload,
+        createDatasetName: action.payload,        
+        createDatasetError: [],
+        createDatasetSuccess: true,
+        createDatasetFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Dataset Query is failed and there is an error message available in the
+    * store
+    */
+    case DatasetAction.CREATE_DATASET_FAIL: {
+      return Object.assign({}, state, {
+        createDataset: [],
+        createDatasetError: action.payload,
+        createDatasetSuccess: false,
+        createDatasetFailed: true
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a DROP a Dataset Query is ongoing
+    */
+    case DatasetAction.DROP_DATASET: {
+      return Object.assign({}, state, { 
+        dropDataset: [],
+        dropDatasetError: [],
+        dropDatasetName: action.payload,
+        dropDatasetSuccess: false,
+        dropDatasetFailed: false
+       });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Dataset Query is success and there is datasets available in the
+    * store
+    */
+    case DatasetAction.DROP_DATASET_SUCCESS: {
+      return Object.assign({}, state, {
+        dropDataset: action.payload,
+        dropDatasetError: [],
+        dropDatasetSuccess: true,
+        dropDatasetFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Dataset Query is failed and there is an error message available in the
+    * store
+    */
+    case DatasetAction.DROP_DATASET_FAIL: {
+      return Object.assign({}, state, {
+        dropDataset: [],
+        dropDatasetError: action.payload,
+        dropDatasetSuccess: false,
+        dropDatasetFailed: true
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/datatype.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/datatype.reducer.ts
new file mode 100755
index 0000000..1036fdb
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/datatype.reducer.ts
@@ -0,0 +1,167 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Datatype } from '../models/asterixDB.model';
+import * as DatatypeAction from '../actions/datatype.actions';
+
+export type Action = DatatypeAction.All;
+
+/*
+** Interfaces for datatype in store/state
+*/
+export interface State {
+  loaded: boolean,
+  loading: boolean,
+  datatypes: Datatype[],
+  createDatatype: any[],
+  createDatatypeError: any[],
+  createDatatypeSuccess: boolean,
+  createDatatypeFailed: boolean,
+  dropDatatype: any[],
+  dropDatatypeError: any[],
+  dropDatatypeSuccess: boolean,
+  dropDatatypeFailed: boolean
+};
+
+const initialState: State = {
+  loaded: false,
+  loading: false,
+  datatypes: [],
+  createDatatype: [],
+  createDatatypeError: [],
+  createDatatypeSuccess: false,
+  createDatatypeFailed: false,
+  dropDatatype: [],
+  dropDatatypeError: [],
+  dropDatatypeSuccess: false,
+  dropDatatypeFailed: false
+};
+
+/*
+** Reducer function for datatypes in store/state
+*/
+export function datatypeReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true to signaling
+    * that a SELECT Query is ongoing
+    */
+    case DatatypeAction.SELECT_DATATYPES: {
+        return Object.assign({}, state, { loading: true });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a SELECT Query is success and there is datatypes available in the
+    * store
+    */
+    case DatatypeAction.SELECT_DATATYPES_SUCCESS: {
+      return Object.assign({}, state, {
+        loaded: true,
+        loading: false,
+        datatypes: action.payload
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a CREATE a Datatype Query is ongoing
+    */
+    case DatatypeAction.CREATE_DATATYPE: {
+      return Object.assign({}, state, { 
+        createDatatype: [],
+        createDatatypeName: action.payload,        
+        createDatatypeError: [],
+        createDatatypeSuccess: false,
+        createDatatypeFailed: false,
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Datatype Query is success and there is datasets available in the
+    * store
+    */
+    case DatatypeAction.CREATE_DATATYPE_SUCCESS: {
+      return Object.assign({}, state, {
+        createDatatype: action.payload,
+        createDatatypeError: [],
+        createDatatypeSuccess: true,
+        createDatatypeFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Datatype Query is failed and there is an error message available in the
+    * store
+    */
+    case DatatypeAction.CREATE_DATATYPE_FAIL: {
+      return Object.assign({}, state, {
+        createDatatype: [],
+        createDatatypeError: action.payload,
+        createDatatypeSuccess: false,
+        createDatatypeFailed: true
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a DROP a Datatype Query is ongoing
+    */
+    case DatatypeAction.DROP_DATATYPE: {
+      return Object.assign({}, state, { 
+        dropDatatype: [],
+        dropDatatypeName: action.payload,       
+        dropDatatypeError: [],
+        dropDatatypeSuccess: false,
+        dropDatatypeFailed: false
+        });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Datatype Query is success and there is datasets available in the
+    * store
+    */
+    case DatatypeAction.DROP_DATATYPE_SUCCESS: {
+      return Object.assign({}, state, {
+        dropDatatype: action.payload,
+        dropDatatypeError: [],
+        dropDatatypeSuccess: true,
+        dropDatatypeFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Datatype Query is failed and there is an error message available in the
+    * store
+    */
+    case DatatypeAction.DROP_DATATYPE_FAIL: {
+      return Object.assign({}, state, {
+        dropDatatype: [],
+        dropDatatypeError: action.payload,
+        dropDatatypeSuccess: false,
+        dropDatatypeFailed: true
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataverse.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataverse.reducer.ts
new file mode 100755
index 0000000..7ac78ea
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/dataverse.reducer.ts
@@ -0,0 +1,171 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Dataverse } from '../models/asterixDB.model';
+import * as DataverseAction from '../actions/dataverse.actions';
+
+export type Action = DataverseAction.All;
+
+/*
+** Interfaces for dataverses in store/state
+*/
+export interface State {
+  loaded: boolean,
+  loading: boolean,
+  dataverses: any[],
+  createDataverse: any[],
+  createDataverseName: string,
+  createDataverseError: any[],
+  createDataverseSuccess: boolean,
+  createDataverseFailed: boolean
+  dropDataverse: any[],
+  dropDataverseName: string;
+  dropDataverseError: any[],
+  dropDataverseSuccess: boolean,
+  dropDataverseFailed: boolean
+};
+
+const initialState: State = {
+  loaded: false,
+  loading: false,
+  dataverses: [],
+  createDataverse: [],
+  createDataverseName: "",
+  createDataverseError: [],
+  createDataverseSuccess: false,
+  createDataverseFailed: false,
+  dropDataverse: [],
+  dropDataverseName: "",
+  dropDataverseError: [],
+  dropDataverseSuccess: false,
+  dropDataverseFailed: false
+};
+
+/*
+** Reducer function for dataverses in store/state
+*/
+export function dataverseReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true to signaling
+    * that a SELECT Query is ongoing
+    */
+    case DataverseAction.SELECT_DATAVERSES: {
+        return Object.assign({}, state, { loading: true });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a SELECT Query is success and there is dataverses available in the
+    * store
+    */
+    case DataverseAction.SELECT_DATAVERSES_SUCCESS: {
+      return Object.assign({}, state, {
+        loaded: true,
+        loading: false,
+        dataverses: action.payload //  _.sortBy(_.values(action.payload), 'dataverseName')
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a CREATE a Dataset Query is ongoing
+    */
+    case DataverseAction.CREATE_DATAVERSE: {
+      return Object.assign({}, state, { 
+        createDataverse: [],
+        createDataverseName: action.payload,
+        createDataverseError: [],
+        createDataverseSuccess: false,
+        createDataverseFailed: false
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Dataverse Query is success and there is a success message available in the
+    * store
+    */
+    case DataverseAction.CREATE_DATAVERSE_SUCCESS: {
+      return Object.assign({}, state, {
+        createDataverse: action.payload,
+        createDataverseError: [],        
+        createDataverseSuccess: true,
+        createDataverseFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Dataverse Query is failed and there is an error message available in the
+    * store
+    */
+    case DataverseAction.CREATE_DATAVERSE_FAIL: {
+      return Object.assign({}, state, {
+        createDataverse: [],
+        createDataverseError: action.payload,
+        createDataverseSuccess: false,
+        createDataverseFailed: true
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a DROP a Dataverse Query is ongoing
+    */
+    case DataverseAction.DROP_DATAVERSE: {
+      return Object.assign({}, state, { 
+        dropDataverse: [],
+        dropDataverseName: action.payload,
+        dropDataverseError: [],
+        dropDataverseSuccess: false,
+        dropDataverseFailed: false
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Dataverse Query is success and there is success message available in the
+    * store
+    */
+    case DataverseAction.DROP_DATAVERSE_SUCCESS: {
+      return Object.assign({}, state, {
+        dropDataverse: action.payload,
+        dropDataverseError: [],
+        dropDataverseSuccess: true,
+        dropDataverseFailed: false
+      })
+    }
+
+     /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Dataverse Query is failed and there is an error message available in the
+    * store
+    */
+    case DataverseAction.DROP_DATAVERSE_FAIL: {
+      return Object.assign({}, state, {
+        dropDataverse: [],
+        dropDataverseError: action.payload,
+        dropDataverseSuccess: false,
+        dropDataverseFailed: true
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
new file mode 100755
index 0000000..792abc7
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.reducer.ts
@@ -0,0 +1,167 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Index } from '../models/asterixDB.model';
+import * as IndexAction from '../actions/index.actions';
+
+export type Action = IndexAction.All;
+
+/*
+** Interfaces for indexes in store/state
+*/
+export interface State {
+  loaded: boolean,
+  loading: boolean,
+  indexes: Index[],
+  createIndex: any[],
+  createIndexError: any[],
+  createIndexSuccess: boolean,
+  createIndexFailed: boolean,
+  dropIndex: any[],
+  dropIndexError: any[],
+  dropIndexSuccess: boolean,
+  dropIndexFailed: boolean
+};
+
+const initialState: State = {
+  loaded: false,
+  loading: false,
+  indexes: [],
+  createIndex: [],
+  createIndexError: [],
+  createIndexSuccess: false,
+  createIndexFailed: false,
+  dropIndex: [],
+  dropIndexError: [],
+  dropIndexSuccess: false,
+  dropIndexFailed: false
+};
+
+/*
+** Reducer function for indexes in store/state
+*/
+export function indexReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true to signaling
+    * that a SELECT Query is ongoing
+    */
+    case IndexAction.SELECT_INDEXES: {
+      return Object.assign({}, state, { loading: true });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a SELECT Query is success and there is indexes available in the
+    * store
+    */
+    case IndexAction.SELECT_INDEXES_SUCCESS: {
+      return Object.assign({}, state, {
+        loaded: true,
+        loading: false,
+        indexes: action.payload
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a CREATE a Index Query is ongoing
+    */
+    case IndexAction.CREATE_INDEX: {
+      return Object.assign({}, state, { 
+        createIndex: [],
+        createIndexName: action.payload,       
+        createIndexError: [],
+        createIndexSuccess: false,
+        createIndexFailed: false
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Index Query is success and there is datasets available in the
+    * store
+    */
+    case IndexAction.CREATE_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        createIndex: [],
+        createIndexError: [],
+        createIndexSuccess: true,
+        createIndexFailed: false
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a CREATE a Index Query is success and there is datasets available in the
+    * store
+    */
+    case IndexAction.CREATE_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        createIndex: action.payload,
+        createIndexError: [],
+        createIndexSuccess: false,
+        createIndexFailed: true
+      })
+    }
+
+    /*
+    * Change the load state to true to signaling
+    * that a DROP a Index Query is ongoing
+    */
+    case IndexAction.DROP_INDEX: {
+      return Object.assign({}, state, { 
+        dropIndex: [],
+        dropIndexError: [],
+        dropIndexName: action.payload,               
+        dropIndexSuccess: false,
+        dropIndexFailed: false 
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Index Query is success and there is datasets available in the
+    * store
+    */
+    case IndexAction.DROP_INDEX_SUCCESS: {
+      return Object.assign({}, state, {
+        dropIndex: action.payload,
+        dropIndexError: [],
+        dropIndexSuccess: true,
+        dropIndexFailed: false 
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a DROP a Index Query is failed and there is an error message available in the
+    * store
+    */
+    case IndexAction.DROP_INDEX_FAIL: {
+      return Object.assign({}, state, {
+        dropIndex: [],
+        dropIndexError: action.payload,
+        dropIndexSuccess: false,
+        dropIndexFailed: true 
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.ts
new file mode 100755
index 0000000..1965d8c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/index.ts
@@ -0,0 +1,49 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { ActionReducer } from '@ngrx/store';
+import * as fromDataverse from './dataverse.reducer';
+import * as fromDataset from './dataset.reducer';
+import * as fromDatatype from './datatype.reducer';
+import * as fromIndex from './index.reducer';
+import * as fromQuery from './query.reducer';
+import * as fromQueryMetadata from './query-metadata.reducer';
+import * as fromMetadata from './metadata.reducer';
+import * as fromAppState from './app.reducer';
+
+/*
+** Global Interfaces store/state
+*/
+export interface ModelState {
+  dataverse: fromDataverse.State,
+  dataset: fromDataset.State,
+  datatype: fromDatatype.State,
+  index: fromIndex.State,
+  sqlQuery: fromQuery.State,
+  sqlMetadataQuery: fromQueryMetadata.State,
+  metadata: fromMetadata.State,
+  appState: fromAppState.State,
+}
+
+/*
+** Global Reducers configuration
+*/
+export const reducers = {
+  dataverse: fromDataverse.dataverseReducer,
+  dataset: fromDataset.datasetReducer,
+  datatype: fromDatatype.datatypeReducer,
+  index: fromIndex.indexReducer,
+  sqlQuery: fromQuery.sqlReducer,
+  sqlMetadataQuery: fromQueryMetadata.sqlMetadataReducer,
+  metadata: fromMetadata.metadataTreeReducer
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
new file mode 100755
index 0000000..52b88f2
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/metadata.reducer.ts
@@ -0,0 +1,56 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import * as metadataTreeActions from '../actions/metadata.actions';
+
+export type Action = metadataTreeActions.All;
+
+/*
+** Interfaces for the metadata tree in store/state
+*/
+export interface State {
+  tree: any[],
+  loading: boolean,
+  loaded: boolean,
+};
+
+const initialState: State = {
+  tree: [],
+  loading: false,
+  loaded: false
+};
+
+export function metadataTreeReducer(state = initialState, action: Action) {
+  switch (action.type) {
+    case metadataTreeActions.UPDATE_METADATA_TREE: {
+      return Object.assign({}, state, {
+        tree: [],
+        loading: true,
+        loaded: false
+      });
+    }
+
+    case metadataTreeActions.UPDATE_METADATA_TREE_SUCCESS: {
+      return Object.assign({}, state, {
+        tree: [...state.tree, action.payload],
+        loading: false,
+        loaded: true
+      });
+    }
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
new file mode 100755
index 0000000..e360e95
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query-metadata.reducer.ts
@@ -0,0 +1,96 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+import * as sqlQueryActions from '../actions/query.actions';
+
+export type Action = sqlQueryActions.All;
+
+/*
+** Interfaces for sql++ queries in store/state
+*/
+export interface State {
+  loading: boolean,
+  loaded: boolean,
+  success: boolean,
+  sqlQueryMetadataString: string,
+  sqlQueryMetadataResult: AsterixDBQueryMessage[],
+  sqlQueryMetadataError: AsterixDBQueryMessage[]
+};
+
+const initialState: State = {
+  loading: false,
+  loaded: false,
+  success: false,
+  sqlQueryMetadataString: "",
+  sqlQueryMetadataResult: [],
+  sqlQueryMetadataError: [],
+};
+
+/*
+** Reducer function for sql++ queries in store/state
+*/
+export function sqlMetadataReducer(state = initialState, action: Action) {
+  switch (action.type) {
+    /*
+    * Change the load state to true, and clear previous results
+    * to signaling that a METADATA EXECUTE a SQL++ Query is ongoing
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryMetadataString: action.payload,
+        sqlQueryMetadataResult: [],
+        sqlQueryMetadataError: []
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a  METADATA EXECUTE Query is success and there is data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY_SUCCESS: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: true,
+        sqlQueryMetadataResult: action.payload,
+        sqlQueryMetadataError: []
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a  METADATA EXECUTE Query is failed and there is error data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_METADATA_QUERY_FAIL: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryMetadataResult: [],
+        sqlQueryMetadataError: action.payload
+      })
+    }
+
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
new file mode 100755
index 0000000..5c8ad08
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/reducers/query.reducer.ts
@@ -0,0 +1,97 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { AsterixDBQueryMessage } from '../models/asterixDB.model';
+import * as sqlQueryActions from '../actions/query.actions';
+
+export type Action = sqlQueryActions.All;
+
+/*
+** Interfaces for sql++ queries in store/state
+*/
+export interface State {
+  loading: boolean,
+  loaded: boolean,
+  success: boolean,
+  sqlQueryString: string,
+  sqlQueryResult: AsterixDBQueryMessage[],
+  sqlQueryError: AsterixDBQueryMessage[]
+};
+
+const initialState: State = {
+  loading: false,
+  loaded: false,
+  success: false,
+  sqlQueryString: "",
+  sqlQueryResult: [],
+  sqlQueryError: []
+};
+
+/*
+** Reducer function for sql++ queries in store/state
+*/
+export function sqlReducer(state = initialState, action: Action) {
+  switch (action.type) {
+
+    /*
+    * Change the load state to true, and clear previous results
+    * to signaling that a EXECUTE a SQL++ Query is ongoing
+    */
+    case sqlQueryActions.EXECUTE_QUERY: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryString: action.payload,
+        sqlQueryResult: [],
+        sqlQueryError: []
+      });
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a EXECUTE Query is success and there is data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_QUERY_SUCCESS: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: true,
+        sqlQueryResult: action.payload,
+        sqlQueryError: []
+      })
+    }
+
+    /*
+    * Change the load state to false, and loaded to true to signaling
+    * that a EXECUTE Query is failed and there is error data available in the
+    * store
+    */
+    case sqlQueryActions.EXECUTE_QUERY_FAIL: {
+      return Object.assign({}, state, {
+        loading: false,
+        loaded: true,
+        success: false,
+        sqlQueryResult: [],
+        sqlQueryError: action.payload
+      })
+    }
+    
+    /*
+    * Just returns the current store/state object
+    */
+    default:
+      return state;
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
new file mode 100755
index 0000000..ed38c26
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/app-core.service.ts
@@ -0,0 +1,38 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { Store } from '@ngrx/store';
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypesActions from '../../shared/actions/datatype.actions'
+import * as indexesActions from '../../shared/actions/index.actions'
+import * as metadataActions from '../../shared/actions/metadata.actions'
+
+/*
+* Main application service to initialize,
+* load, set App status and initial data, and synchronize app level functionality
+*/
+@Injectable()
+export class AppCoreService {
+	/*
+  	* Initialize and load metadata store structures
+	*/
+	constructor(private store: Store<any>) {
+		console.log('AsterixDB Web Console Core Service')
+		this.store.dispatch(new dataverseActions.SelectDataverses('-'));
+		this.store.dispatch(new datasetActions.SelectDatasets('-'));
+		this.store.dispatch(new datatypesActions.SelectDatatypes('-'));
+		this.store.dispatch(new indexesActions.SelectIndexes('-'));
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
new file mode 100755
index 0000000..8492a54
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-metadata.service.ts
@@ -0,0 +1,120 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable, ApplicationRef  } from '@angular/core';
+import { Store } from '@ngrx/store';
+import { Observable } from "rxjs/Observable";
+import 'rxjs/add/operator/map';
+import 'rxjs/add/observable/from';
+import * as dataverseActions from '../../shared/actions/dataverse.actions'
+import * as datasetActions from '../../shared/actions/dataset.actions'
+import * as datatypesActions from '../../shared/actions/datatype.actions'
+import * as indexesActions from '../../shared/actions/index.actions'
+import * as metadataActions from '../../shared/actions/metadata.actions'
+
+/*
+	Metadata service watch any changes in Dataverses, Datasets, Datatypes, indexes
+	state in store and builds a tree state structure with datasets->dataverse->datatype->index relationship
+*/
+@Injectable()
+export class MetadataService {
+
+	/* Arrays to expose updated dataverses, datasets, datatypes,
+	indexes collections*/
+	dv = [];
+	ds = [];
+	dt = [];
+	idx = [];
+
+	/*
+	* contructor will initialize the store state watchers
+	*/
+	constructor(private store: Store<any>, private ref: ApplicationRef ) {
+
+		/* Watching changes in dataverse collection */
+		this.store.select(s => s.dataverse.dataverses).subscribe((data: any) => {
+			if (data.results) {
+				this.dv = []
+				for (let i = 0; i < data.results.length; i++) {
+						let node = { id: 0, DataverseName: "", Datasets:[] }
+						node.id = i
+						node.DataverseName = data.results[i]['DataverseName']
+						this.dv.push(node)
+				}
+				this.updateMetadataTree();
+			}
+		})
+
+		/* Watching changes in datasets collections */
+		this.store.select(s => s.dataset.datasets).subscribe((data: any) => {
+			if (data.results) {
+				this.ds = data.results;
+				this.updateMetadataTree();
+			}
+		})
+
+		/* Watching changes in datatypes collections */
+		this.store.select(s => s.datatype.datatypes).subscribe((data: any) => {
+			if (data.results) {
+				this.dt = data.results;
+				this.updateMetadataTree();
+			}
+		})
+
+		/* Watching changes in index collections */
+		this.store.select(s => s.index.indexes).subscribe((data: any) => {
+			if (data.results) {
+				this.idx = data.results;
+				this.updateMetadataTree();
+			}
+		})
+	}
+
+	/*
+	*	convenience function to update and return the metadata tree.
+	*/
+  	getMetadataTree(): Observable<any[]> {
+		return Observable.from(this.dv);
+	}
+	  
+  	updateMetadataTree() {
+	for (let i = 0; i < this.dv.length; i++) {
+		// Filling datasets
+		this.dv[i]['Datasets'] = [];
+		for (let j = 0; j < this.ds.length; j++) {
+			if (this.ds[j]['DataverseName'] === this.dv[i]['DataverseName']){
+
+				// Filling datatypes, there is one datatype per dataset
+				this.ds[j]['Datatype'] = [];
+				for (let k = 0; k < this.dt.length; k++) {
+					if (this.dt[k]['DatatypeName'] === this.ds[j]['DatatypeName']){
+						this.ds[j]['Datatype'] = this.dt[k]; // push(this.dt[k])
+					}
+				}
+
+				// Filling indexes
+				this.ds[j]['Indexes'] = [];
+				for (let l = 0; l < this.idx.length; l++) {
+					if (this.idx[l]['DatasetName'] === this.ds[j]['DatasetName']){
+						this.ds[j]['Indexes'].push(this.idx[l])
+					}
+				}
+
+				this.dv[i]['Datasets'].push(this.ds[j])
+			}
+		}
+	}
+
+	this.store.dispatch(new metadataActions.UpdateMetadataTree());
+	}	
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
new file mode 100755
index 0000000..e37872e
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/app/shared/services/async-query.service.ts
@@ -0,0 +1,190 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Store } from '@ngrx/store';
+import { Observable } from "rxjs/Observable";
+import 'rxjs/add/operator/map';
+
+var AsterixRestApiUrl = 'http://localhost:19002/query/service'; 
+//var AsterixRestApiUrl = '/query-service'; 
+
+/*
+* SQL query service using AsterixDB REST API /query/service
+*/
+@Injectable()
+export class SQLService {
+
+	/*
+	* SQLQueryService constructor using
+	* HttpClient from Angular 4
+	*/
+	constructor(private http: HttpClient) {}
+
+ 	/*
+ 	* sends a select sql++ query to return all the dataverses
+	* from AsterixDB Metadata
+ 	*/
+	selectDataverses() : Observable<any[]> {
+		 let query = "SELECT VALUE dv FROM Metadata.`Dataverse` dv"
+		 return this.executeSQLQuery(query);
+  	}
+
+	/*
+	* sends a select sql++ query to return all the datasets
+	* from AsterixDB Metadata
+	*/
+  	selectDatasets() : Observable<any[]> {
+		let query = "SELECT VALUE ds FROM Metadata.`Dataset` ds"
+		return this.executeSQLQuery(query);
+  	}
+
+	/*
+	* sends a select sql++ query to return all the datatypes
+	* from AsterixDB Metadata
+	*/
+  	selectDatatypes() : Observable<any[]> {
+    	let query = "SELECT VALUE dt FROM Metadata.`Datatype` dt"
+		return this.executeSQLQuery(query);
+  	}
+
+	/*
+	* sends a select sql++ query to return all the indexes
+	* from AsterixDB Metadata
+	*/
+  	selectIndexes() : Observable<any[]> {
+    	let query = "SELECT VALUE ix FROM Metadata.`Index` ix"
+		return this.executeSQLQuery(query);
+	}
+
+	/*
+	* creates a sql++ ddl query to create a Dataverse
+	* from AsterixDB Metadata
+	*/
+	createDataverse(dataverse: string) : Observable<any[]> {
+    	let ddlQuery = "CREATE DATAVERSE " + dataverse + ";";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to drop a Dataverse
+	* from AsterixDB Metadata
+	*/
+	dropDataverse(dataverse: string) : Observable<any[]> {
+		let ddlQuery = "DROP DATAVERSE " + dataverse; // " IF EXISTS;";
+		return this.executeDDLSQLQuery(ddlQuery);
+	  }
+
+	/*
+	* creates a sql++ ddl query to create a Dataset
+	* from AsterixDB Metadata
+	*/
+	createDataset(dataset: string) : Observable<any[]> {
+		let ddlQuery = "CREATE DATASET " + dataset + ";";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to drop a Dataset
+	* from AsterixDB Metadata
+	*/
+	dropDataset(dataset: string) : Observable<any[]> {
+		let ddlQuery = "DROP DATASET " + dataset; //" IF EXISTS;";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to create a Datatype
+	* from AsterixDB Metadata
+	*/
+	createDatatype(datatype: string) : Observable<any[]> {
+    	let ddlQuery = "CREATE DATATYPE " + datatype + ";";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to drop a Datatype
+	* from AsterixDB Metadata
+	*/
+	dropDatatype(datatype: string) : Observable<any[]> {
+		let ddlQuery = "DROP TYPE " + datatype; //" IF EXISTS;";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to create a Index
+	* from AsterixDB Metadata
+	*/
+	createIndex(index: string) : Observable<any[]> {
+		let ddlQuery = "CREATE INDEX " + index + ";";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* creates a sql++ ddl query to drop a Index
+	* from AsterixDB Metadata
+	*/
+	dropIndex(index: string) : Observable<any[]> {
+		let ddlQuery = "DROP INDEX " + index; // + " IF EXISTS;";
+		return this.executeDDLSQLQuery(ddlQuery);
+	}
+
+	/*
+	* Executes a sql++ ddl query against AsterixDB
+	* response is a JSON object with following structure:
+		  metrics: Metrics;
+		  requestId: string;
+		  results: any[];
+		  signature: string;
+		  status: string;
+	*/
+	executeDDLSQLQuery(ddlQuery: string): Observable<any[]> {
+    const apiUrl = AsterixRestApiUrl;
+		return this.http.post(apiUrl, {statement: ddlQuery})
+			.map((response: Response) => { return response })
+			.catch((error: any) => this.handleExecuteQueryError(error));
+	}
+
+	/*
+	* Executes a sql++ query against AsterixDB
+	* response is a JSON object with following structure:
+		  metrics: Metrics;
+		  requestId: string;
+		  results: any[];
+		  signature: string;
+		  status: string;
+	*/
+	executeSQLQuery(query: string): Observable<any[]> {
+    const apiUrl = AsterixRestApiUrl;
+		return this.http.post(apiUrl, {statement: query})
+			.map((response: Response) => { return response })
+			.catch((error: any) => this.handleExecuteQueryError(error));
+	}
+
+	/*
+	* AsterixDB query-service API raises HTTP errors if the sql++ query has some
+	* syntax error, or some elements in the query are not found
+	* this function extract the error JSON object with the relevant information
+		response is a JSON object with following structure:
+		  metrics: Metrics;
+		  requestId: string;
+		  errors: any[];
+		  signature: string;
+		  status: string;
+	*/
+	private handleExecuteQueryError(error: any): Promise<any> {
+		console.log(error)
+		return Promise.reject(error.error || error);
+	}
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/assets/asterixdb_tm.png b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/assets/asterixdb_tm.png
new file mode 100755
index 0000000..0fa2ff0
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/assets/asterixdb_tm.png
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.prod.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.prod.ts
new file mode 100755
index 0000000..ca15503
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.prod.ts
@@ -0,0 +1,16 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+export const environment = {
+  production: true
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.ts
new file mode 100755
index 0000000..2750f0a
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/environments/environment.ts
@@ -0,0 +1,21 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `.angular-cli.json`.
+
+export const environment = {
+  production: false
+};
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/favicon.ico b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/favicon.ico
new file mode 100755
index 0000000..282c28d
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/favicon.ico
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/index.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/index.html
new file mode 100755
index 0000000..8dab418
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/index.html
@@ -0,0 +1,30 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/-->
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <title>AsterixDb Administration Console</title>
+    <base href="/">
+    <link rel="icon" type="image/x-icon" href="favicon.ico">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Mono">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+  </head>
+  <body>
+    <awc-root></awc-root>
+  </body>
+</html>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.scss
new file mode 100755
index 0000000..cc02584
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.scss
@@ -0,0 +1,29 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+@import './styles/general';
+
+// Include material core styles.
+@import '~@angular/material/theming';
+@include mat-core();
+
+// Define the light theme.
+$primary: mat-palette($mat-grey);
+$accent:  mat-palette($mat-orange, A200, A100, A400);
+
+$theme: mat-light-theme($primary, $accent);
+@include angular-material-theme($theme);
+
+* {
+    font-family: Roboto, "Helvetica Neue", sans-serif;
+  }
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.ts
new file mode 100755
index 0000000..446a9dc
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/main.ts
@@ -0,0 +1,26 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+import './polyfills.ts';
+import 'hammerjs';
+import { enableProdMode } from '@angular/core';
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { AppModule } from './app/app.module';
+import { environment } from './environments/environment';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule)
+  .catch(err => console.log(err));
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/polyfills.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/polyfills.ts
new file mode 100755
index 0000000..20d4075
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/polyfills.ts
@@ -0,0 +1,76 @@
+/**
+ * This file includes polyfills needed by Angular and is loaded before the app.
+ * You can add your own extra polyfills to this file.
+ *
+ * This file is divided into 2 sections:
+ *   1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
+ *   2. Application imports. Files imported after ZoneJS that should be loaded before your main
+ *      file.
+ *
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
+ *
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
+ */
+
+/***************************************************************************************************
+ * BROWSER POLYFILLS
+ */
+
+/** IE9, IE10 and IE11 requires all of the following polyfills. **/
+// import 'core-js/es6/symbol';
+// import 'core-js/es6/object';
+// import 'core-js/es6/function';
+// import 'core-js/es6/parse-int';
+// import 'core-js/es6/parse-float';
+// import 'core-js/es6/number';
+// import 'core-js/es6/math';
+// import 'core-js/es6/string';
+// import 'core-js/es6/date';
+// import 'core-js/es6/array';
+// import 'core-js/es6/regexp';
+// import 'core-js/es6/map';
+// import 'core-js/es6/weak-map';
+// import 'core-js/es6/set';
+
+/** IE10 and IE11 requires the following for NgClass support on SVG elements */
+// import 'classlist.js';  // Run `npm install --save classlist.js`.
+
+/** IE10 and IE11 requires the following for the Reflect API. */
+// import 'core-js/es6/reflect';
+
+
+/** Evergreen browsers require these. **/
+// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
+import 'core-js/es7/reflect';
+
+
+/**
+ * Required to support Web Animations `@angular/platform-browser/animations`.
+ * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
+ **/
+// import 'web-animations-js';  // Run `npm install --save web-animations-js`.
+
+
+
+/***************************************************************************************************
+ * Zone JS is required by Angular itself.
+ */
+import 'zone.js/dist/zone';  // Included with Angular CLI.
+
+
+
+/***************************************************************************************************
+ * APPLICATION IMPORTS
+ */
+
+/**
+ * Date, currency, decimal and percent pipes.
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
+ */
+// import 'intl';  // Run `npm install --save intl`.
+/**
+ * Need to import at least one locale-data with intl.
+ */
+// import 'intl/locale-data/jsonp/en';
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_constants.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_constants.scss
new file mode 100755
index 0000000..b3a5d07
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_constants.scss
@@ -0,0 +1,21 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+@import '../../node_modules/@angular/material/theming';
+
+$small-breakpoint-width: 720px;
+
+/* For desktop, the content should be aligned with the page title. */
+$content-padding-side: 70px;
+$content-padding-side-xs: 15px;
+$awc-spacing-unit: 8px;
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_general.scss b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_general.scss
new file mode 100755
index 0000000..9691cf8
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/styles/_general.scss
@@ -0,0 +1,32 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+html {
+  box-sizing: border-box;
+}
+
+body {
+  font-family: "Roboto Mono", monospace;
+  font-size: 0.80rem;
+	font-weight: 500;
+}
+
+// Tree and table styling
+
+.ui-datatable{
+  //overflow : auto
+}
+
+.ui-datatable .ui-sortable-column div.ui-dt-c {
+  padding-right: 15px !important;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/test.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/test.ts
new file mode 100755
index 0000000..6edcb85
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/test.ts
@@ -0,0 +1,46 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare const __karma__: any;
+declare const require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+  BrowserDynamicTestingModule,
+  platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.app.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.app.json
new file mode 100755
index 0000000..54434df
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.app.json
@@ -0,0 +1,26 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/app",
+    "baseUrl": "./",
+    "module": "es2015",
+    "types": []
+  },
+  "exclude": [
+    "test.ts",
+    "**/*.spec.ts"
+  ]
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.spec.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.spec.json
new file mode 100755
index 0000000..15bcf37
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/tsconfig.spec.json
@@ -0,0 +1,33 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+{
+  "extends": "../tsconfig.json",
+  "compilerOptions": {
+    "outDir": "../out-tsc/spec",
+    "baseUrl": "./",
+    "module": "commonjs",
+    "target": "es5",
+    "types": [
+      "jasmine",
+      "node"
+    ]
+  },
+  "files": [
+    "test.ts"
+  ],
+  "include": [
+    "**/*.spec.ts",
+    "**/*.d.ts"
+  ]
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/typings.d.ts b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/typings.d.ts
new file mode 100755
index 0000000..ef5c7bd
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+  id: string;
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/3rdpartylicenses.txt b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/3rdpartylicenses.txt
new file mode 100644
index 0000000..03758a4
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/3rdpartylicenses.txt
@@ -0,0 +1,222 @@
+@angular/animations@5.1.1
+MIT
+MIT
+
+@angular/common@5.1.1
+MIT
+MIT
+
+@angular/core@5.1.1
+MIT
+MIT
+
+@angular/platform-browser@5.1.1
+MIT
+MIT
+
+@ngrx/store-devtools@4.1.1
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+codemirror@5.32.0
+MIT
+MIT License
+
+Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+core-js@2.5.3
+MIT
+Copyright (c) 2014-2017 Denis Pushkarev
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+file-saver@1.3.3
+MIT
+The MIT License
+
+Copyright © 2016 [Eli Grey][1].
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+  [1]: http://eligrey.com
+
+hammerjs@2.0.8
+MIT
+The MIT License (MIT)
+
+Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+primeng@4.3.0
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2016-2017 PrimeTek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@angular/forms@5.1.1
+MIT
+MIT
+
+@ngrx/store@4.1.1
+MIT
+The MIT License (MIT)
+
+Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+webpack@3.8.1
+MIT
+Copyright JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+zone.js@0.8.18
+MIT
+The MIT License
+
+Copyright (c) 2016 Google, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/assets/asterixdb_tm.png b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/assets/asterixdb_tm.png
new file mode 100644
index 0000000..0fa2ff0
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/assets/asterixdb_tm.png
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
new file mode 100644
index 0000000..561cdd9
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/color.c7a33805ffda0d32bd2a.png
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/favicon.ico b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/favicon.ico
new file mode 100644
index 0000000..282c28d
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/favicon.ico
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/index.html b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/index.html
new file mode 100644
index 0000000..c34009b
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/index.html
@@ -0,0 +1,13 @@
+<!--/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/--><!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>AsterixDb Administration Console</title><base href="/dashboard/static/"><link rel="icon" type="image/x-icon" href="favicon.ico"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Mono"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500"><link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"><link href="styles.9f50282210bba5318775.bundle.css" rel="stylesheet"/></head><body><awc-root></awc-root><script type="text/javascript" src="inline.66bd6b83f86cf773a001.bundle.js"></script><script type="text/javascript" src="polyfills.32ca5670d6503e090789.bundle.js"></script><script type="text/javascript" src="scripts.da68998bdd77aff4e764.bundle.js"></script><script type="text/javascript" src="main.37b7b7cad656490b195a.bundle.js"></script></body></html>
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
new file mode 100644
index 0000000..1868b98
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/inline.66bd6b83f86cf773a001.bundle.js
@@ -0,0 +1 @@
+!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)o[i=t[l]]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(r&&r(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=n(n.s=a[l]);return f};var t={},o={3:0};n.e=function(e){function r(){u.onerror=u.onload=null,clearTimeout(i);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var a=document.getElementsByTagName("head")[0],u=document.createElement("script");u.type="text/javascript",u.charset="utf-8",u.async=!0,u.timeout=12e4,n.nc&&u.setAttribute("nonce",n.nc),u.src=n.p+""+e+"."+{0:"37b7b7cad656490b195a",1:"32ca5670d6503e090789",2:"bd9c51474f663c9da388"}[e]+".chunk.js";var i=setTimeout(r,12e4);return u.onerror=u.onload=r,a.appendChild(u),c},n.m=e,n.c=t,n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
new file mode 100644
index 0000000..64e2280
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/line.567f57385ea3dde2c9ae.gif
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/main.37b7b7cad656490b195a.bundle.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/main.37b7b7cad656490b195a.bundle.js
new file mode 100644
index 0000000..43d0410
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/main.37b7b7cad656490b195a.bundle.js
@@ -0,0 +1 @@
+webpackJsonp([0],{"+GRi":function(e,t,n){var r=n("Wo2w"),i=n("Wy9r");e.exports=function(e){return r(i(e))}},"+iEx":function(e,t,n){n("fHxy"),n("5GJ3"),n("X0O/"),n("HCkn"),n("ncNB"),n("soMw"),n("8sYH"),n("IJ3P"),n("t6ta"),e.exports=n("b4gG").Reflect},"+pQw":function(e,t,n){var r=n("JXkd");e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},"/zAi":function(e,t,n){"use strict";var r=n("6Xbx").__decorate,i=n("6Xbx").__metadata;Object.defineProperty(t,"__esModule",{value:!0});var o=n("LMZF"),l=n("Un6q"),a=n("LMZF"),s=function(){};s=r([a.Component({selector:"p-header",template:"<ng-content></ng-content>"})],s),t.Header=s;var u=function(){};u=r([a.Component({selector:"p-footer",template:"<ng-content></ng-content>"})],u),t.Footer=u;var c=function(){function e(e){this.template=e}return e.prototype.getType=function(){return this.name},e}();r([o.Input(),i("design:type",String)],c.prototype,"type",void 0),r([o.Input("pTemplate"),i("design:type",String)],c.prototype,"name",void 0),c=r([o.Directive({selector:"[pTemplate]",host:{}})],c),t.PrimeTemplate=c;var d=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.templateRef,{$implicit:this.item,index:this.index})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],d.prototype,"item",void 0),r([o.Input(),i("design:type",Number)],d.prototype,"index",void 0),r([o.Input("pTemplateWrapper"),i("design:type",o.TemplateRef)],d.prototype,"templateRef",void 0),d=r([o.Directive({selector:"[pTemplateWrapper]"})],d),t.TemplateWrapper=d;var p=function(){function e(){this.filterType="text",this.exportable=!0,this.sortFunction=new o.EventEmitter}return e.prototype.ngAfterContentInit=function(){var e=this;this.templates.forEach(function(t){switch(t.getType()){case"header":e.headerTemplate=t.template;break;case"body":e.bodyTemplate=t.template;break;case"footer":e.footerTemplate=t.template;break;case"filter":e.filterTemplate=t.template;break;case"editor":e.editorTemplate=t.template;break;default:e.bodyTemplate=t.template}})},e}();r([o.Input(),i("design:type",String)],p.prototype,"field",void 0),r([o.Input(),i("design:type",String)],p.prototype,"colId",void 0),r([o.Input(),i("design:type",String)],p.prototype,"sortField",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterField",void 0),r([o.Input(),i("design:type",String)],p.prototype,"header",void 0),r([o.Input(),i("design:type",String)],p.prototype,"footer",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"sortable",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"editable",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"filter",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterMatchMode",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterType",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"excludeGlobalFilter",void 0),r([o.Input(),i("design:type",Number)],p.prototype,"rowspan",void 0),r([o.Input(),i("design:type",Number)],p.prototype,"colspan",void 0),r([o.Input(),i("design:type",String)],p.prototype,"scope",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"style",void 0),r([o.Input(),i("design:type",String)],p.prototype,"styleClass",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"exportable",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"headerStyle",void 0),r([o.Input(),i("design:type",String)],p.prototype,"headerStyleClass",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"bodyStyle",void 0),r([o.Input(),i("design:type",String)],p.prototype,"bodyStyleClass",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"footerStyle",void 0),r([o.Input(),i("design:type",String)],p.prototype,"footerStyleClass",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"hidden",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"expander",void 0),r([o.Input(),i("design:type",String)],p.prototype,"selectionMode",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterPlaceholder",void 0),r([o.Input(),i("design:type",Number)],p.prototype,"filterMaxlength",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"frozen",void 0),r([o.Output(),i("design:type",o.EventEmitter)],p.prototype,"sortFunction",void 0),r([o.ContentChildren(c),i("design:type",o.QueryList)],p.prototype,"templates",void 0),r([o.ContentChild(o.TemplateRef),i("design:type",o.TemplateRef)],p.prototype,"template",void 0),p=r([a.Component({selector:"p-column",template:""})],p),t.Column=p;var f=function(){};r([o.ContentChildren(p),i("design:type",o.QueryList)],f.prototype,"columns",void 0),f=r([a.Component({selector:"p-row",template:""})],f),t.Row=f;var h=function(){};r([o.Input(),i("design:type",Boolean)],h.prototype,"frozen",void 0),r([o.ContentChildren(f),i("design:type",o.QueryList)],h.prototype,"rows",void 0),h=r([a.Component({selector:"p-headerColumnGroup",template:""})],h),t.HeaderColumnGroup=h;var m=function(){};r([o.Input(),i("design:type",Boolean)],m.prototype,"frozen",void 0),r([o.ContentChildren(f),i("design:type",o.QueryList)],m.prototype,"rows",void 0),m=r([a.Component({selector:"p-footerColumnGroup",template:""})],m),t.FooterColumnGroup=m;var g=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.column.bodyTemplate,{$implicit:this.column,rowData:this.rowData,rowIndex:this.rowIndex})},e.prototype.ngOnChanges=function(e){this.view&&"rowIndex"in e&&(this.view.context.rowIndex=e.rowIndex.currentValue)},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],g.prototype,"column",void 0),r([o.Input(),i("design:type",Object)],g.prototype,"rowData",void 0),r([o.Input(),i("design:type",Number)],g.prototype,"rowIndex",void 0),g=r([a.Component({selector:"p-columnBodyTemplateLoader",template:""})],g),t.ColumnBodyTemplateLoader=g;var y=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.column.headerTemplate,{$implicit:this.column})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],y.prototype,"column",void 0),y=r([a.Component({selector:"p-columnHeaderTemplateLoader",template:""})],y),t.ColumnHeaderTemplateLoader=y;var v=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.column.footerTemplate,{$implicit:this.column})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],v.prototype,"column",void 0),v=r([a.Component({selector:"p-columnFooterTemplateLoader",template:""})],v),t.ColumnFooterTemplateLoader=v;var b=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.column.filterTemplate,{$implicit:this.column})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],b.prototype,"column",void 0),b=r([a.Component({selector:"p-columnFilterTemplateLoader",template:""})],b),t.ColumnFilterTemplateLoader=b;var _=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.column.editorTemplate,{$implicit:this.column,rowData:this.rowData,rowIndex:this.rowIndex})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([o.Input(),i("design:type",Object)],_.prototype,"column",void 0),r([o.Input(),i("design:type",Object)],_.prototype,"rowData",void 0),r([o.Input(),i("design:type",Object)],_.prototype,"rowIndex",void 0),_=r([a.Component({selector:"p-columnEditorTemplateLoader",template:""})],_),t.ColumnEditorTemplateLoader=_;var w=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.template&&(this.view=this.viewContainer.createEmbeddedView(this.template,{$implicit:this.data}))},e.prototype.ngOnDestroy=function(){this.view&&this.view.destroy()},e}();r([o.Input(),i("design:type",o.TemplateRef)],w.prototype,"template",void 0),r([o.Input(),i("design:type",Object)],w.prototype,"data",void 0),w=r([a.Component({selector:"p-templateLoader",template:""})],w),t.TemplateLoader=w;var x=function(){};x=r([o.NgModule({imports:[l.CommonModule],exports:[s,u,p,d,y,g,v,b,c,w,f,h,m,_],declarations:[s,u,p,d,y,g,v,b,c,w,f,h,m,_]})],x),t.SharedModule=x},0:function(e,t,n){e.exports=n("cDNt")},"0l2a":function(e,t,n){"use strict";var r=n("6Xbx"),i=n("E9/g"),o=function(){function e(e){this.total=e}return e.prototype.call=function(e,t){return t.subscribe(new l(e,this.total))},e}(),l=function(e){function t(t,n){e.call(this,t),this.total=n,this.count=0}return Object(r.__extends)(t,e),t.prototype._next=function(e){++this.count>this.total&&this.destination.next(e)},t}(i.a);t.a=function(e){return function(e){return function(t){return t.lift(new o(e))}}(e)(this)}},"0nO6":function(e,t,n){"use strict";function r(e){return null==e||0===e.length}function i(e){return null!=e}function o(e){var t=Object(D["\u0275isPromise"])(e)?R(e):e;if(!Object(D["\u0275isObservable"])(t))throw new Error("Expected validator to return Promise or Observable.");return t}function l(e){var t=e.reduce(function(e,t){return null!=t?Object(k.__assign)({},e,t):e},{});return 0===Object.keys(t).length?null:t}function a(e){return e.validate?function(t){return e.validate(t)}:e}function s(e){return e.validate?function(t){return e.validate(t)}:e}function u(){throw new Error("unimplemented")}function c(e,t){return null==e?""+t:(t&&"object"==typeof t&&(t="Object"),(e+": "+t).slice(0,50))}function d(e,t){return null==e?""+t:("string"==typeof t&&(t="'"+t+"'"),t&&"object"==typeof t&&(t="Object"),(e+": "+t).slice(0,50))}function p(e,t){return t.path.concat([e])}function f(e,t){e||y(t,"Cannot find control with"),t.valueAccessor||y(t,"No value accessor for form control with"),e.validator=V.compose([e.validator,t.validator]),e.asyncValidator=V.composeAsync([e.asyncValidator,t.asyncValidator]),t.valueAccessor.writeValue(e.value),function(e,t){t.valueAccessor.registerOnChange(function(n){e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&h(e,t)})}(e,t),function(t,n){e.registerOnChange(function(e,t){n.valueAccessor.writeValue(e),t&&n.viewToModelUpdate(e)})}(0,t),function(e,t){t.valueAccessor.registerOnTouched(function(){e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&h(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),t.valueAccessor.setDisabledState&&e.registerOnDisabledChange(function(e){t.valueAccessor.setDisabledState(e)}),t._rawValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(function(){return e.updateValueAndValidity()})}),t._rawAsyncValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(function(){return e.updateValueAndValidity()})})}function h(e,t){t.viewToModelUpdate(e._pendingValue),e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),e._pendingChange=!1}function m(e,t){null==e&&y(t,"Cannot find control with"),e.validator=V.compose([e.validator,t.validator]),e.asyncValidator=V.composeAsync([e.asyncValidator,t.asyncValidator])}function g(e){return y(e,"There is no FormControl instance attached to form control element with")}function y(e,t){var n;throw n=e.path.length>1?"path: '"+e.path.join(" -> ")+"'":e.path[0]?"name: '"+e.path+"'":"unspecified name attribute",new Error(t+" "+n)}function v(e){return null!=e?V.compose(e.map(a)):null}function b(e){return null!=e?V.composeAsync(e.map(s)):null}function _(e,t){if(!e.hasOwnProperty("model"))return!1;var n=e.model;return!!n.isFirstChange()||!Object(D["\u0275looseIdentical"])(t,n.currentValue)}function w(e,t){e._syncPendingControls(),t.forEach(function(e){var t=e.control;"submit"===t.updateOn&&t._pendingChange&&(e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1)})}function x(e,t){if(!t)return null;var n=void 0,r=void 0,i=void 0;return t.forEach(function(t){t.constructor===U?n=t:function(e){return le.some(function(t){return e.constructor===t})}(t)?(r&&y(e,"More than one built-in value accessor matches form control with"),r=t):(i&&y(e,"More than one custom value accessor matches form control with"),i=t)}),i||r||n||(y(e,"No valid value accessor for form control with"),null)}function C(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}function E(e){var t=O(e)?e.validators:e;return Array.isArray(t)?v(t):t||null}function S(e,t){var n=O(t)?t.asyncValidators:e;return Array.isArray(n)?b(n):n||null}function O(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}function T(e){return!(e instanceof je||e instanceof Le||e instanceof ze)}Object.defineProperty(t,"__esModule",{value:!0});var k=n("6Xbx"),D=n("LMZF"),I=n("Jsyr"),R=n("KRwF").a.create,M=n("dmC+"),P=n("RyBE");n.d(t,"AbstractControlDirective",function(){return N}),n.d(t,"AbstractFormGroupDirective",function(){return ae}),n.d(t,"CheckboxControlValueAccessor",function(){return H}),n.d(t,"ControlContainer",function(){return A}),n.d(t,"NG_VALUE_ACCESSOR",function(){return z}),n.d(t,"COMPOSITION_BUFFER_MODE",function(){return q}),n.d(t,"DefaultValueAccessor",function(){return U}),n.d(t,"NgControl",function(){return $}),n.d(t,"NgControlStatus",function(){return ce}),n.d(t,"NgControlStatusGroup",function(){return de}),n.d(t,"NgForm",function(){return xe}),n.d(t,"NgModel",function(){return Re}),n.d(t,"NgModelGroup",function(){return ke}),n.d(t,"RadioControlValueAccessor",function(){return Y}),n.d(t,"FormControlDirective",function(){return Ne}),n.d(t,"FormControlName",function(){return He}),n.d(t,"FormGroupDirective",function(){return Le}),n.d(t,"FormArrayName",function(){return ze}),n.d(t,"FormGroupName",function(){return je}),n.d(t,"NgSelectOption",function(){return ne}),n.d(t,"SelectControlValueAccessor",function(){return te}),n.d(t,"SelectMultipleControlValueAccessor",function(){return ie}),n.d(t,"CheckboxRequiredValidator",function(){return Ge}),n.d(t,"EmailValidator",function(){return $e}),n.d(t,"MaxLengthValidator",function(){return Xe}),n.d(t,"MinLengthValidator",function(){return Qe}),n.d(t,"PatternValidator",function(){return et}),n.d(t,"RequiredValidator",function(){return Ue}),n.d(t,"FormBuilder",function(){return tt}),n.d(t,"AbstractControl",function(){return ge}),n.d(t,"FormArray",function(){return be}),n.d(t,"FormControl",function(){return ye}),n.d(t,"FormGroup",function(){return ve}),n.d(t,"NG_ASYNC_VALIDATORS",function(){return F}),n.d(t,"NG_VALIDATORS",function(){return L}),n.d(t,"Validators",function(){return V}),n.d(t,"VERSION",function(){return nt}),n.d(t,"FormsModule",function(){return st}),n.d(t,"ReactiveFormsModule",function(){return ut}),n.d(t,"\u0275ba",function(){return at}),n.d(t,"\u0275z",function(){return lt}),n.d(t,"\u0275x",function(){return it}),n.d(t,"\u0275y",function(){return ot}),n.d(t,"\u0275a",function(){return B}),n.d(t,"\u0275b",function(){return W}),n.d(t,"\u0275c",function(){return se}),n.d(t,"\u0275d",function(){return ue}),n.d(t,"\u0275e",function(){return _e}),n.d(t,"\u0275f",function(){return De}),n.d(t,"\u0275g",function(){return Te}),n.d(t,"\u0275bf",function(){return rt}),n.d(t,"\u0275bb",function(){return G}),n.d(t,"\u0275bc",function(){return K}),n.d(t,"\u0275h",function(){return Z}),n.d(t,"\u0275i",function(){return Q}),n.d(t,"\u0275bd",function(){return X}),n.d(t,"\u0275be",function(){return J}),n.d(t,"\u0275j",function(){return Pe}),n.d(t,"\u0275k",function(){return Be}),n.d(t,"\u0275l",function(){return Ae}),n.d(t,"\u0275n",function(){return Ve}),n.d(t,"\u0275m",function(){return Fe}),n.d(t,"\u0275o",function(){return ee}),n.d(t,"\u0275q",function(){return oe}),n.d(t,"\u0275p",function(){return re}),n.d(t,"\u0275s",function(){return qe}),n.d(t,"\u0275t",function(){return Ke}),n.d(t,"\u0275v",function(){return Ye}),n.d(t,"\u0275u",function(){return Ze}),n.d(t,"\u0275w",function(){return Je}),n.d(t,"\u0275r",function(){return We});var N=function(){function e(){}return Object.defineProperty(e.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),e.prototype.reset=function(e){void 0===e&&(e=void 0),this.control&&this.control.reset(e)},e.prototype.hasError=function(e,t){return!!this.control&&this.control.hasError(e,t)},e.prototype.getError=function(e,t){return this.control?this.control.getError(e,t):null},e}(),A=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(k.__extends)(t,e),Object.defineProperty(t.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t}(N),L=new D.InjectionToken("NgValidators"),F=new D.InjectionToken("NgAsyncValidators"),j=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,V=function(){function e(){}return e.min=function(e){return function(t){if(r(t.value)||r(e))return null;var n=parseFloat(t.value);return!isNaN(n)&&n<e?{min:{min:e,actual:t.value}}:null}},e.max=function(e){return function(t){if(r(t.value)||r(e))return null;var n=parseFloat(t.value);return!isNaN(n)&&n>e?{max:{max:e,actual:t.value}}:null}},e.required=function(e){return r(e.value)?{required:!0}:null},e.requiredTrue=function(e){return!0===e.value?null:{required:!0}},e.email=function(e){return j.test(e.value)?null:{email:!0}},e.minLength=function(e){return function(t){if(r(t.value))return null;var n=t.value?t.value.length:0;return n<e?{minlength:{requiredLength:e,actualLength:n}}:null}},e.maxLength=function(e){return function(t){var n=t.value?t.value.length:0;return n>e?{maxlength:{requiredLength:e,actualLength:n}}:null}},e.pattern=function(t){if(!t)return e.nullValidator;var n,i;return"string"==typeof t?(i="^"+t+"$",n=new RegExp(i)):(i=t.toString(),n=t),function(e){if(r(e.value))return null;var t=e.value;return n.test(t)?null:{pattern:{requiredPattern:i,actualValue:t}}}},e.nullValidator=function(e){return null},e.compose=function(e){if(!e)return null;var t=e.filter(i);return 0==t.length?null:function(e){return l(function(e,n){return t.map(function(t){return t(e)})}(e))}},e.composeAsync=function(e){if(!e)return null;var t=e.filter(i);return 0==t.length?null:function(e){var n=function(e,n){return t.map(function(t){return t(e)})}(e).map(o);return M.a.call(Object(I.a)(n),l)}},e}(),z=new D.InjectionToken("NgValueAccessor"),B={provide:z,useExisting:Object(D.forwardRef)(function(){return H}),multi:!0},H=function(){function e(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return e.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"checked",e)},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e}(),W={provide:z,useExisting:Object(D.forwardRef)(function(){return U}),multi:!0},q=new D.InjectionToken("CompositionEventMode"),U=function(){function e(e,t,n){this._renderer=e,this._elementRef=t,this._compositionMode=n,this.onChange=function(e){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function(){var e=Object(P.s)()?Object(P.s)().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}return e.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==e?"":e)},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e.prototype._handleInput=function(e){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(e)},e.prototype._compositionStart=function(){this._composing=!0},e.prototype._compositionEnd=function(e){this._composing=!1,this._compositionMode&&this.onChange(e)},e}(),G={provide:z,useExisting:Object(D.forwardRef)(function(){return K}),multi:!0},K=function(){function e(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return e.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==e?"":e)},e.prototype.registerOnChange=function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e}(),$=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._parent=null,t.name=null,t.valueAccessor=null,t._rawValidators=[],t._rawAsyncValidators=[],t}return Object(k.__extends)(t,e),Object.defineProperty(t.prototype,"validator",{get:function(){return u()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return u()},enumerable:!0,configurable:!0}),t}(N),Z={provide:z,useExisting:Object(D.forwardRef)(function(){return Y}),multi:!0},Q=function(){function e(){this._accessors=[]}return e.prototype.add=function(e,t){this._accessors.push([e,t])},e.prototype.remove=function(e){for(var t=this._accessors.length-1;t>=0;--t)if(this._accessors[t][1]===e)return void this._accessors.splice(t,1)},e.prototype.select=function(e){var t=this;this._accessors.forEach(function(n){t._isSameGroup(n,e)&&n[1]!==e&&n[1].fireUncheck(e.value)})},e.prototype._isSameGroup=function(e,t){return!!e[0].control&&e[0]._parent===t._control._parent&&e[1].name===t.name},e}(),Y=function(){function e(e,t,n,r){this._renderer=e,this._elementRef=t,this._registry=n,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return e.prototype.ngOnInit=function(){this._control=this._injector.get($),this._checkName(),this._registry.add(this._control,this)},e.prototype.ngOnDestroy=function(){this._registry.remove(this)},e.prototype.writeValue=function(e){this._state=e===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},e.prototype.registerOnChange=function(e){var t=this;this._fn=e,this.onChange=function(){e(t.value),t._registry.select(t)}},e.prototype.fireUncheck=function(e){this.writeValue(e)},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},e.prototype._throwNameError=function(){throw new Error('\n      If you define both a name and a formControlName attribute on your radio button, their values\n      must match. Ex: <input type="radio" formControlName="food" name="food">\n    ')},e}(),X={provide:z,useExisting:Object(D.forwardRef)(function(){return J}),multi:!0},J=function(){function e(e,t){this._renderer=e,this._elementRef=t,this.onChange=function(e){},this.onTouched=function(){}}return e.prototype.writeValue=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(e))},e.prototype.registerOnChange=function(e){this.onChange=function(t){e(""==t?null:parseFloat(t))}},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e}(),ee={provide:z,useExisting:Object(D.forwardRef)(function(){return te}),multi:!0},te=function(){function e(e,t){this._renderer=e,this._elementRef=t,this._optionMap=new Map,this._idCounter=0,this.onChange=function(e){},this.onTouched=function(){},this._compareWith=D["\u0275looseIdentical"]}return Object.defineProperty(e.prototype,"compareWith",{set:function(e){if("function"!=typeof e)throw new Error("compareWith must be a function, but received "+JSON.stringify(e));this._compareWith=e},enumerable:!0,configurable:!0}),e.prototype.writeValue=function(e){this.value=e;var t=this._getOptionId(e);null==t&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=c(t,e);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)},e.prototype.registerOnChange=function(e){var t=this;this.onChange=function(n){t.value=t._getOptionValue(n),e(t.value)}},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e.prototype._registerOption=function(){return(this._idCounter++).toString()},e.prototype._getOptionId=function(e){for(var t=0,n=Array.from(this._optionMap.keys());t<n.length;t++){var r=n[t];if(this._compareWith(this._optionMap.get(r),e))return r}return null},e.prototype._getOptionValue=function(e){var t=e.split(":")[0];return this._optionMap.has(t)?this._optionMap.get(t):e},e}(),ne=function(){function e(e,t,n){this._element=e,this._renderer=t,this._select=n,this._select&&(this.id=this._select._registerOption())}return Object.defineProperty(e.prototype,"ngValue",{set:function(e){null!=this._select&&(this._select._optionMap.set(this.id,e),this._setElementValue(c(this.id,e)),this._select.writeValue(this._select.value))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{set:function(e){this._setElementValue(e),this._select&&this._select.writeValue(this._select.value)},enumerable:!0,configurable:!0}),e.prototype._setElementValue=function(e){this._renderer.setProperty(this._element.nativeElement,"value",e)},e.prototype.ngOnDestroy=function(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))},e}(),re={provide:z,useExisting:Object(D.forwardRef)(function(){return ie}),multi:!0},ie=function(){function e(e,t){this._renderer=e,this._elementRef=t,this._optionMap=new Map,this._idCounter=0,this.onChange=function(e){},this.onTouched=function(){},this._compareWith=D["\u0275looseIdentical"]}return Object.defineProperty(e.prototype,"compareWith",{set:function(e){if("function"!=typeof e)throw new Error("compareWith must be a function, but received "+JSON.stringify(e));this._compareWith=e},enumerable:!0,configurable:!0}),e.prototype.writeValue=function(e){var t=this;this.value=e;var n;if(Array.isArray(e)){var r=e.map(function(e){return t._getOptionId(e)});n=function(e,t){e._setSelected(r.indexOf(t.toString())>-1)}}else n=function(e,t){e._setSelected(!1)};this._optionMap.forEach(n)},e.prototype.registerOnChange=function(e){var t=this;this.onChange=function(n){var r=[];if(n.hasOwnProperty("selectedOptions"))for(var i=n.selectedOptions,o=0;o<i.length;o++){var l=i.item(o),a=t._getOptionValue(l.value);r.push(a)}else for(i=n.options,o=0;o<i.length;o++)(l=i.item(o)).selected&&(a=t._getOptionValue(l.value),r.push(a));t.value=r,e(r)}},e.prototype.registerOnTouched=function(e){this.onTouched=e},e.prototype.setDisabledState=function(e){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",e)},e.prototype._registerOption=function(e){var t=(this._idCounter++).toString();return this._optionMap.set(t,e),t},e.prototype._getOptionId=function(e){for(var t=0,n=Array.from(this._optionMap.keys());t<n.length;t++){var r=n[t];if(this._compareWith(this._optionMap.get(r)._value,e))return r}return null},e.prototype._getOptionValue=function(e){var t=e.split(":")[0];return this._optionMap.has(t)?this._optionMap.get(t)._value:e},e}(),oe=function(){function e(e,t,n){this._element=e,this._renderer=t,this._select=n,this._select&&(this.id=this._select._registerOption(this))}return Object.defineProperty(e.prototype,"ngValue",{set:function(e){null!=this._select&&(this._value=e,this._setElementValue(d(this.id,e)),this._select.writeValue(this._select.value))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{set:function(e){this._select?(this._value=e,this._setElementValue(d(this.id,e)),this._select.writeValue(this._select.value)):this._setElementValue(e)},enumerable:!0,configurable:!0}),e.prototype._setElementValue=function(e){this._renderer.setProperty(this._element.nativeElement,"value",e)},e.prototype._setSelected=function(e){this._renderer.setProperty(this._element.nativeElement,"selected",e)},e.prototype.ngOnDestroy=function(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))},e}(),le=[H,J,K,te,ie,Y],ae=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(k.__extends)(t,e),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return p(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return v(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return b(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){},t}(A),se=function(){function e(e){this._cd=e}return Object.defineProperty(e.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),e}(),ue={"[class.ng-untouched]":"ngClassUntouched","[class.ng-touched]":"ngClassTouched","[class.ng-pristine]":"ngClassPristine","[class.ng-dirty]":"ngClassDirty","[class.ng-valid]":"ngClassValid","[class.ng-invalid]":"ngClassInvalid","[class.ng-pending]":"ngClassPending"},ce=function(e){function t(t){return e.call(this,t)||this}return Object(k.__extends)(t,e),t}(se),de=function(e){function t(t){return e.call(this,t)||this}return Object(k.__extends)(t,e),t}(se),pe="VALID",fe="INVALID",he="PENDING",me="DISABLED",ge=function(){function e(e,t){this.validator=e,this.asyncValidator=t,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"valid",{get:function(){return this.status===pe},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"invalid",{get:function(){return this.status===fe},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"pending",{get:function(){return this.status==he},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disabled",{get:function(){return this.status===me},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"enabled",{get:function(){return this.status!==me},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),e.prototype.setValidators=function(e){this.validator=E(e)},e.prototype.setAsyncValidators=function(e){this.asyncValidator=S(e)},e.prototype.clearValidators=function(){this.validator=null},e.prototype.clearAsyncValidators=function(){this.asyncValidator=null},e.prototype.markAsTouched=function(e){void 0===e&&(e={}),this.touched=!0,this._parent&&!e.onlySelf&&this._parent.markAsTouched(e)},e.prototype.markAsUntouched=function(e){void 0===e&&(e={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(e){e.markAsUntouched({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)},e.prototype.markAsDirty=function(e){void 0===e&&(e={}),this.pristine=!1,this._parent&&!e.onlySelf&&this._parent.markAsDirty(e)},e.prototype.markAsPristine=function(e){void 0===e&&(e={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(e){e.markAsPristine({onlySelf:!0})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)},e.prototype.markAsPending=function(e){void 0===e&&(e={}),this.status=he,this._parent&&!e.onlySelf&&this._parent.markAsPending(e)},e.prototype.disable=function(e){void 0===e&&(e={}),this.status=me,this.errors=null,this._forEachChild(function(e){e.disable({onlySelf:!0})}),this._updateValue(),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(!!e.onlySelf),this._onDisabledChange.forEach(function(e){return e(!0)})},e.prototype.enable=function(e){void 0===e&&(e={}),this.status=pe,this._forEachChild(function(e){e.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(!!e.onlySelf),this._onDisabledChange.forEach(function(e){return e(!1)})},e.prototype._updateAncestors=function(e){this._parent&&!e&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},e.prototype.setParent=function(e){this._parent=e},e.prototype.updateValueAndValidity=function(e){void 0===e&&(e={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),this.status!==pe&&this.status!==he||this._runAsyncValidator(e.emitEvent)),!1!==e.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(e)},e.prototype._updateTreeValidity=function(e){void 0===e&&(e={emitEvent:!0}),this._forEachChild(function(t){return t._updateTreeValidity(e)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})},e.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?me:pe},e.prototype._runValidator=function(){return this.validator?this.validator(this):null},e.prototype._runAsyncValidator=function(e){var t=this;if(this.asyncValidator){this.status=he;var n=o(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){return t.setErrors(n,{emitEvent:e})})}},e.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},e.prototype.setErrors=function(e,t){void 0===t&&(t={}),this.errors=e,this._updateControlsErrors(!1!==t.emitEvent)},e.prototype.get=function(e){return function(e,t,n){return null==t?null:(t instanceof Array||(t=t.split(".")),t instanceof Array&&0===t.length?null:t.reduce(function(e,t){return e instanceof ve?e.controls[t]||null:e instanceof be?e.at(t)||null:null},e))}(this,e)},e.prototype.getError=function(e,t){var n=t?this.get(t):this;return n&&n.errors?n.errors[e]:null},e.prototype.hasError=function(e,t){return!!this.getError(e,t)},Object.defineProperty(e.prototype,"root",{get:function(){for(var e=this;e._parent;)e=e._parent;return e},enumerable:!0,configurable:!0}),e.prototype._updateControlsErrors=function(e){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(e)},e.prototype._initObservables=function(){this.valueChanges=new D.EventEmitter,this.statusChanges=new D.EventEmitter},e.prototype._calculateStatus=function(){return this._allControlsDisabled()?me:this.errors?fe:this._anyControlsHaveStatus(he)?he:this._anyControlsHaveStatus(fe)?fe:pe},e.prototype._anyControlsHaveStatus=function(e){return this._anyControls(function(t){return t.status===e})},e.prototype._anyControlsDirty=function(){return this._anyControls(function(e){return e.dirty})},e.prototype._anyControlsTouched=function(){return this._anyControls(function(e){return e.touched})},e.prototype._updatePristine=function(e){void 0===e&&(e={}),this.pristine=!this._anyControlsDirty(),this._parent&&!e.onlySelf&&this._parent._updatePristine(e)},e.prototype._updateTouched=function(e){void 0===e&&(e={}),this.touched=this._anyControlsTouched(),this._parent&&!e.onlySelf&&this._parent._updateTouched(e)},e.prototype._isBoxedValue=function(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e},e.prototype._registerOnCollectionChange=function(e){this._onCollectionChange=e},e.prototype._setUpdateStrategy=function(e){O(e)&&null!=e.updateOn&&(this._updateOn=e.updateOn)},e}(),ye=function(e){function t(t,n,r){void 0===t&&(t=null);var i=e.call(this,E(n),S(r,n))||this;return i._onChange=[],i._applyFormState(t),i._setUpdateStrategy(n),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i._initObservables(),i}return Object(k.__extends)(t,e),t.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this.value=this._pendingValue=e,this._onChange.length&&!1!==t.emitModelToViewChange&&this._onChange.forEach(function(e){return e(n.value,!1!==t.emitViewToModelChange)}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(e,t){void 0===t&&(t={}),this.setValue(e,t)},t.prototype.reset=function(e,t){void 0===e&&(e=null),void 0===t&&(t={}),this._applyFormState(e),this.markAsPristine(t),this.markAsUntouched(t),this.setValue(this.value,t),this._pendingChange=!1},t.prototype._updateValue=function(){},t.prototype._anyControls=function(e){return!1},t.prototype._allControlsDisabled=function(){return this.disabled},t.prototype.registerOnChange=function(e){this._onChange.push(e)},t.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},t.prototype.registerOnDisabledChange=function(e){this._onDisabledChange.push(e)},t.prototype._forEachChild=function(e){},t.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},t.prototype._applyFormState=function(e){this._isBoxedValue(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e},t}(ge),ve=function(e){function t(t,n,r){var i=e.call(this,E(n),S(r,n))||this;return i.controls=t,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(k.__extends)(t,e),t.prototype.registerControl=function(e,t){return this.controls[e]?this.controls[e]:(this.controls[e]=t,t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange),t)},t.prototype.addControl=function(e,t){this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeControl=function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),delete this.controls[e],t&&this.registerControl(e,t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.contains=function(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled},t.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this._checkAllValuesPresent(e),Object.keys(e).forEach(function(r){n._throwIfControlMissing(r),n.controls[r].setValue(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(e,t){var n=this;void 0===t&&(t={}),Object.keys(e).forEach(function(r){n.controls[r]&&n.controls[r].patchValue(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this._forEachChild(function(n,r){n.reset(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this._reduceChildren({},function(e,t,n){return e[n]=t instanceof ye?t.value:t.getRawValue(),e})},t.prototype._syncPendingControls=function(){var e=this._reduceChildren(!1,function(e,t){return!!t._syncPendingControls()||e});return e&&this.updateValueAndValidity({onlySelf:!0}),e},t.prototype._throwIfControlMissing=function(e){if(!Object.keys(this.controls).length)throw new Error("\n        There are no form controls registered with this group yet.  If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.controls[e])throw new Error("Cannot find form control with name: "+e+".")},t.prototype._forEachChild=function(e){var t=this;Object.keys(this.controls).forEach(function(n){return e(t.controls[n],n)})},t.prototype._setUpControls=function(){var e=this;this._forEachChild(function(t){t.setParent(e),t._registerOnCollectionChange(e._onCollectionChange)})},t.prototype._updateValue=function(){this.value=this._reduceValue()},t.prototype._anyControls=function(e){var t=this,n=!1;return this._forEachChild(function(r,i){n=n||t.contains(i)&&e(r)}),n},t.prototype._reduceValue=function(){var e=this;return this._reduceChildren({},function(t,n,r){return(n.enabled||e.disabled)&&(t[r]=n.value),t})},t.prototype._reduceChildren=function(e,t){var n=e;return this._forEachChild(function(e,r){n=t(n,e,r)}),n},t.prototype._allControlsDisabled=function(){for(var e=0,t=Object.keys(this.controls);e<t.length;e++)if(this.controls[t[e]].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled},t.prototype._checkAllValuesPresent=function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control with name: '"+n+"'.")})},t}(ge),be=function(e){function t(t,n,r){var i=e.call(this,E(n),S(r,n))||this;return i.controls=t,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(k.__extends)(t,e),t.prototype.at=function(e){return this.controls[e]},t.prototype.push=function(e){this.controls.push(e),this._registerControl(e),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.insert=function(e,t){this.controls.splice(e,0,t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.removeAt=function(e){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),this.updateValueAndValidity(),this._onCollectionChange()},t.prototype.setControl=function(e,t){this.controls[e]&&this.controls[e]._registerOnCollectionChange(function(){}),this.controls.splice(e,1),t&&(this.controls.splice(e,0,t),this._registerControl(t)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(t.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),t.prototype.setValue=function(e,t){var n=this;void 0===t&&(t={}),this._checkAllValuesPresent(e),e.forEach(function(e,r){n._throwIfControlMissing(r),n.at(r).setValue(e,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.patchValue=function(e,t){var n=this;void 0===t&&(t={}),e.forEach(function(e,r){n.at(r)&&n.at(r).patchValue(e,{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t)},t.prototype.reset=function(e,t){void 0===e&&(e=[]),void 0===t&&(t={}),this._forEachChild(function(n,r){n.reset(e[r],{onlySelf:!0,emitEvent:t.emitEvent})}),this.updateValueAndValidity(t),this._updatePristine(t),this._updateTouched(t)},t.prototype.getRawValue=function(){return this.controls.map(function(e){return e instanceof ye?e.value:e.getRawValue()})},t.prototype._syncPendingControls=function(){var e=this.controls.reduce(function(e,t){return!!t._syncPendingControls()||e},!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e},t.prototype._throwIfControlMissing=function(e){if(!this.controls.length)throw new Error("\n        There are no form controls registered with this array yet.  If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.at(e))throw new Error("Cannot find form control at index "+e)},t.prototype._forEachChild=function(e){this.controls.forEach(function(t,n){e(t,n)})},t.prototype._updateValue=function(){var e=this;this.value=this.controls.filter(function(t){return t.enabled||e.disabled}).map(function(e){return e.value})},t.prototype._anyControls=function(e){return this.controls.some(function(t){return t.enabled&&e(t)})},t.prototype._setUpControls=function(){var e=this;this._forEachChild(function(t){return e._registerControl(t)})},t.prototype._checkAllValuesPresent=function(e){this._forEachChild(function(t,n){if(void 0===e[n])throw new Error("Must supply a value for form control at index: "+n+".")})},t.prototype._allControlsDisabled=function(){for(var e=0,t=this.controls;e<t.length;e++)if(t[e].enabled)return!1;return this.controls.length>0||this.disabled},t.prototype._registerControl=function(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)},t}(ge),_e={provide:A,useExisting:Object(D.forwardRef)(function(){return xe})},we=Promise.resolve(null),xe=function(e){function t(t,n){var r=e.call(this)||this;return r.submitted=!1,r._directives=[],r.ngSubmit=new D.EventEmitter,r.form=new ve({},v(t),b(n)),r}return Object(k.__extends)(t,e),t.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),t.prototype.addControl=function(e){var t=this;we.then(function(){var n=t._findContainer(e.path);e.control=n.registerControl(e.name,e.control),f(e.control,e),e.control.updateValueAndValidity({emitEvent:!1}),t._directives.push(e)})},t.prototype.getControl=function(e){return this.form.get(e.path)},t.prototype.removeControl=function(e){var t=this;we.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name),C(t._directives,e)})},t.prototype.addFormGroup=function(e){var t=this;we.then(function(){var n=t._findContainer(e.path),r=new ve({});m(r,e),n.registerControl(e.name,r),r.updateValueAndValidity({emitEvent:!1})})},t.prototype.removeFormGroup=function(e){var t=this;we.then(function(){var n=t._findContainer(e.path);n&&n.removeControl(e.name)})},t.prototype.getFormGroup=function(e){return this.form.get(e.path)},t.prototype.updateModel=function(e,t){var n=this;we.then(function(){n.form.get(e.path).setValue(t)})},t.prototype.setValue=function(e){this.control.setValue(e)},t.prototype.onSubmit=function(e){return this.submitted=!0,w(this.form,this._directives),this.ngSubmit.emit(e),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(e){void 0===e&&(e=void 0),this.form.reset(e),this.submitted=!1},t.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},t.prototype._findContainer=function(e){return e.pop(),e.length?this.form.get(e):this.form},t}(A),Ce='\n    <div [formGroup]="myGroup">\n      <input formControlName="firstName">\n    </div>\n\n    In your class:\n\n    this.myGroup = new FormGroup({\n       firstName: new FormControl()\n    });',Ee='\n    <div [formGroup]="myGroup">\n       <div formGroupName="person">\n          <input formControlName="firstName">\n       </div>\n    </div>\n\n    In your class:\n\n    this.myGroup = new FormGroup({\n       person: new FormGroup({ firstName: new FormControl() })\n    });',Se='\n    <form>\n       <div ngModelGroup="person">\n          <input [(ngModel)]="person.name" name="firstName">\n       </div>\n    </form>',Oe=function(){function e(){}return e.modelParentException=function(){throw new Error('\n      ngModel cannot be used to register form controls with a parent formGroup directive.  Try using\n      formGroup\'s partner directive "formControlName" instead.  Example:\n\n      '+Ce+'\n\n      Or, if you\'d like to avoid registering this form control, indicate that it\'s standalone in ngModelOptions:\n\n      Example:\n\n      \n    <div [formGroup]="myGroup">\n       <input formControlName="firstName">\n       <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">\n    </div>\n  ')},e.formGroupNameException=function(){throw new Error("\n      ngModel cannot be used to register form controls with a parent formGroupName or formArrayName directive.\n\n      Option 1: Use formControlName instead of ngModel (reactive strategy):\n\n      "+Ee+"\n\n      Option 2:  Update ngModel's parent be ngModelGroup (template-driven strategy):\n\n      "+Se)},e.missingNameException=function(){throw new Error('If ngModel is used within a form tag, either the name attribute must be set or the form\n      control must be defined as \'standalone\' in ngModelOptions.\n\n      Example 1: <input [(ngModel)]="person.firstName" name="first">\n      Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">')},e.modelGroupParentException=function(){throw new Error("\n      ngModelGroup cannot be used with a parent formGroup directive.\n\n      Option 1: Use formGroupName instead of ngModelGroup (reactive strategy):\n\n      "+Ee+"\n\n      Option 2:  Use a regular form tag instead of the formGroup directive (template-driven strategy):\n\n      "+Se)},e}(),Te={provide:A,useExisting:Object(D.forwardRef)(function(){return ke})},ke=function(e){function t(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return Object(k.__extends)(t,e),t.prototype._checkParentType=function(){this._parent instanceof t||this._parent instanceof xe||Oe.modelGroupParentException()},t}(ae),De={provide:$,useExisting:Object(D.forwardRef)(function(){return Re})},Ie=Promise.resolve(null),Re=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o.control=new ye,o._registered=!1,o.update=new D.EventEmitter,o._parent=t,o._rawValidators=n||[],o._rawAsyncValidators=r||[],o.valueAccessor=x(o,i),o}return Object(k.__extends)(t,e),t.prototype.ngOnChanges=function(e){this._checkForErrors(),this._registered||this._setUpControl(),"isDisabled"in e&&this._updateDisabled(e),_(e,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},Object.defineProperty(t.prototype,"path",{get:function(){return this._parent?p(this.name,this._parent):[this.name]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return v(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return b(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),t.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},t.prototype._setUpControl=function(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0},t.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)},t.prototype._isStandalone=function(){return!this._parent||!(!this.options||!this.options.standalone)},t.prototype._setUpStandalone=function(){f(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})},t.prototype._checkForErrors=function(){this._isStandalone()||this._checkParentType(),this._checkName()},t.prototype._checkParentType=function(){!(this._parent instanceof ke)&&this._parent instanceof ae?Oe.formGroupNameException():this._parent instanceof ke||this._parent instanceof xe||Oe.modelParentException()},t.prototype._checkName=function(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()||this.name||Oe.missingNameException()},t.prototype._updateValue=function(e){var t=this;Ie.then(function(){t.control.setValue(e,{emitViewToModelChange:!1})})},t.prototype._updateDisabled=function(e){var t=this,n=e.isDisabled.currentValue,r=""===n||n&&"false"!==n;Ie.then(function(){r&&!t.control.disabled?t.control.disable():!r&&t.control.disabled&&t.control.enable()})},t}($),Me=function(){function e(){}return e.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive.  You'll want to add a formGroup\n       directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      Example:\n\n      "+Ce)},e.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n       that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n       Option 1:  Update the parent to be formGroupName (reactive form strategy)\n\n        '+Ee+"\n\n        Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n        "+Se)},e.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n       Example:\n\n       "+Ce)},e.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive.  You'll want to add a formGroup\n      directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      Example:\n\n      "+Ee)},e.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive.  You\'ll want to add a formGroup\n       directive and pass it an existing FormGroup instance (you can create one in your class).\n\n        Example:\n\n        \n    <div [formGroup]="myGroup">\n      <div formArrayName="cities">\n        <div *ngFor="let city of cityArray.controls; index as i">\n          <input [formControlName]="i">\n        </div>\n      </div>\n    </div>\n\n    In your class:\n\n    this.cityArray = new FormArray([new FormControl(\'SF\')]);\n    this.myGroup = new FormGroup({\n      cities: this.cityArray\n    });')},e.disabledAttrWarning=function(){console.warn("\n      It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n      when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n      you. We recommend using this approach to avoid 'changed after checked' errors.\n       \n      Example: \n      form = new FormGroup({\n        first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n        last: new FormControl('Drew', Validators.required)\n      });\n    ")},e}(),Pe={provide:$,useExisting:Object(D.forwardRef)(function(){return Ne})},Ne=function(e){function t(t,n,r){var i=e.call(this)||this;return i.update=new D.EventEmitter,i._rawValidators=t||[],i._rawAsyncValidators=n||[],i.valueAccessor=x(i,r),i}return Object(k.__extends)(t,e),Object.defineProperty(t.prototype,"isDisabled",{set:function(e){Me.disabledAttrWarning()},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(e){this._isControlChanged(e)&&(f(this.form,this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this.form.updateValueAndValidity({emitEvent:!1})),_(e,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)},Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return v(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return b(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),t.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},t.prototype._isControlChanged=function(e){return e.hasOwnProperty("form")},t}($),Ae={provide:A,useExisting:Object(D.forwardRef)(function(){return Le})},Le=function(e){function t(t,n){var r=e.call(this)||this;return r._validators=t,r._asyncValidators=n,r.submitted=!1,r.directives=[],r.form=null,r.ngSubmit=new D.EventEmitter,r}return Object(k.__extends)(t,e),t.prototype.ngOnChanges=function(e){this._checkFormPresent(),e.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(t.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),t.prototype.addControl=function(e){var t=this.form.get(e.path);return f(t,e),t.updateValueAndValidity({emitEvent:!1}),this.directives.push(e),t},t.prototype.getControl=function(e){return this.form.get(e.path)},t.prototype.removeControl=function(e){C(this.directives,e)},t.prototype.addFormGroup=function(e){var t=this.form.get(e.path);m(t,e),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormGroup=function(e){},t.prototype.getFormGroup=function(e){return this.form.get(e.path)},t.prototype.addFormArray=function(e){var t=this.form.get(e.path);m(t,e),t.updateValueAndValidity({emitEvent:!1})},t.prototype.removeFormArray=function(e){},t.prototype.getFormArray=function(e){return this.form.get(e.path)},t.prototype.updateModel=function(e,t){this.form.get(e.path).setValue(t)},t.prototype.onSubmit=function(e){return this.submitted=!0,w(this.form,this.directives),this.ngSubmit.emit(e),!1},t.prototype.onReset=function(){this.resetForm()},t.prototype.resetForm=function(e){void 0===e&&(e=void 0),this.form.reset(e),this.submitted=!1},t.prototype._updateDomValue=function(){var e=this;this.directives.forEach(function(t){var n=e.form.get(t.path);t.control!==n&&(function(e,t){t.valueAccessor.registerOnChange(function(){return g(t)}),t.valueAccessor.registerOnTouched(function(){return g(t)}),t._rawValidators.forEach(function(e){e.registerOnValidatorChange&&e.registerOnValidatorChange(null)}),t._rawAsyncValidators.forEach(function(e){e.registerOnValidatorChange&&e.registerOnValidatorChange(null)}),e&&e._clearChangeFns()}(t.control,t),n&&f(n,t),t.control=n)}),this.form._updateTreeValidity({emitEvent:!1})},t.prototype._updateRegistrations=function(){var e=this;this.form._registerOnCollectionChange(function(){return e._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},t.prototype._updateValidators=function(){var e=v(this._validators);this.form.validator=V.compose([this.form.validator,e]);var t=b(this._asyncValidators);this.form.asyncValidator=V.composeAsync([this.form.asyncValidator,t])},t.prototype._checkFormPresent=function(){this.form||Me.missingFormException()},t}(A),Fe={provide:A,useExisting:Object(D.forwardRef)(function(){return je})},je=function(e){function t(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return Object(k.__extends)(t,e),t.prototype._checkParentType=function(){T(this._parent)&&Me.groupParentException()},t}(ae),Ve={provide:A,useExisting:Object(D.forwardRef)(function(){return ze})},ze=function(e){function t(t,n,r){var i=e.call(this)||this;return i._parent=t,i._validators=n,i._asyncValidators=r,i}return Object(k.__extends)(t,e),t.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(t.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return p(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return v(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return b(this._asyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){T(this._parent)&&Me.arrayParentException()},t}(A),Be={provide:$,useExisting:Object(D.forwardRef)(function(){return He})},He=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o._added=!1,o.update=new D.EventEmitter,o._parent=t,o._rawValidators=n||[],o._rawAsyncValidators=r||[],o.valueAccessor=x(o,i),o}return Object(k.__extends)(t,e),Object.defineProperty(t.prototype,"isDisabled",{set:function(e){Me.disabledAttrWarning()},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(e){this._added||this._setUpControl(),_(e,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},t.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},t.prototype.viewToModelUpdate=function(e){this.viewModel=e,this.update.emit(e)},Object.defineProperty(t.prototype,"path",{get:function(){return p(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"validator",{get:function(){return v(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"asyncValidator",{get:function(){return b(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),t.prototype._checkParentType=function(){!(this._parent instanceof je)&&this._parent instanceof ae?Me.ngModelGroupException():this._parent instanceof je||this._parent instanceof Le||this._parent instanceof ze||Me.controlParentException()},t.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},t}($),We={provide:L,useExisting:Object(D.forwardRef)(function(){return Ue}),multi:!0},qe={provide:L,useExisting:Object(D.forwardRef)(function(){return Ge}),multi:!0},Ue=function(){function e(){}return Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(e){this._required=null!=e&&!1!==e&&""+e!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),e.prototype.validate=function(e){return this.required?V.required(e):null},e.prototype.registerOnValidatorChange=function(e){this._onChange=e},e}(),Ge=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(k.__extends)(t,e),t.prototype.validate=function(e){return this.required?V.requiredTrue(e):null},t}(Ue),Ke={provide:L,useExisting:Object(D.forwardRef)(function(){return $e}),multi:!0},$e=function(){function e(){}return Object.defineProperty(e.prototype,"email",{set:function(e){this._enabled=""===e||!0===e||"true"===e,this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),e.prototype.validate=function(e){return this._enabled?V.email(e):null},e.prototype.registerOnValidatorChange=function(e){this._onChange=e},e}(),Ze={provide:L,useExisting:Object(D.forwardRef)(function(){return Qe}),multi:!0},Qe=function(){function e(){}return e.prototype.ngOnChanges=function(e){"minlength"in e&&(this._createValidator(),this._onChange&&this._onChange())},e.prototype.validate=function(e){return null==this.minlength?null:this._validator(e)},e.prototype.registerOnValidatorChange=function(e){this._onChange=e},e.prototype._createValidator=function(){this._validator=V.minLength(parseInt(this.minlength,10))},e}(),Ye={provide:L,useExisting:Object(D.forwardRef)(function(){return Xe}),multi:!0},Xe=function(){function e(){}return e.prototype.ngOnChanges=function(e){"maxlength"in e&&(this._createValidator(),this._onChange&&this._onChange())},e.prototype.validate=function(e){return null!=this.maxlength?this._validator(e):null},e.prototype.registerOnValidatorChange=function(e){this._onChange=e},e.prototype._createValidator=function(){this._validator=V.maxLength(parseInt(this.maxlength,10))},e}(),Je={provide:L,useExisting:Object(D.forwardRef)(function(){return et}),multi:!0},et=function(){function e(){}return e.prototype.ngOnChanges=function(e){"pattern"in e&&(this._createValidator(),this._onChange&&this._onChange())},e.prototype.validate=function(e){return this._validator(e)},e.prototype.registerOnValidatorChange=function(e){this._onChange=e},e.prototype._createValidator=function(){this._validator=V.pattern(this.pattern)},e}(),tt=function(){function e(){}return e.prototype.group=function(e,t){void 0===t&&(t=null);var n=this._reduceControls(e);return new ve(n,null!=t?t.validator:null,null!=t?t.asyncValidator:null)},e.prototype.control=function(e,t,n){return new ye(e,t,n)},e.prototype.array=function(e,t,n){var r=this,i=e.map(function(e){return r._createControl(e)});return new be(i,t,n)},e.prototype._reduceControls=function(e){var t=this,n={};return Object.keys(e).forEach(function(r){n[r]=t._createControl(e[r])}),n},e.prototype._createControl=function(e){return e instanceof ye||e instanceof ve||e instanceof be?e:Array.isArray(e)?this.control(e[0],e.length>1?e[1]:null,e.length>2?e[2]:null):this.control(e)},e}(),nt=new D.Version("5.1.1"),rt=function(){},it=[rt,ne,oe,U,K,J,H,te,ie,Y,ce,de,Ue,Qe,Xe,et,Ge,$e],ot=[Re,ke,xe],lt=[Ne,Le,He,je,ze],at=function(){},st=function(){},ut=function(){}},"1j/l":function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=Array.isArray||function(e){return e&&"number"==typeof e.length}},"2Fuj":function(e,t,n){var r=n("R5c1"),i=n("a/Sk");e.exports=Object.keys||function(e){return r(e,i)}},"2kLc":function(e,t,n){"use strict";t.a=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var n=Number.POSITIVE_INFINITY,a=null,s=e[e.length-1];return Object(o.a)(s)?(a=e.pop(),e.length>1&&"number"==typeof e[e.length-1]&&(n=e.pop())):"number"==typeof s&&(n=e.pop()),null===a&&1===e.length&&e[0]instanceof r.a?e[0]:Object(l.a)(n)(new i.a(e,a))};var r=n("AP4T"),i=n("Oryw"),o=n("3iOE"),l=n("bywS")},"3LDD":function(e,t,n){"use strict";var r=n("tose").f,i=n("51pc"),o=n("pBmS"),l=n("pa70"),a=n("Lcie"),s=n("p/bR"),u=n("WsSm"),c=n("w/BM"),d=n("KpXt"),p=n("V+0c"),f=n("xI8H").fastKey,h=n("Y5fy"),m=p?"_s":"size",g=function(e,t){var n,r=f(t);if("F"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,u){var c=e(function(e,r){a(e,c,t,"_i"),e._t=t,e._i=i(null),e._f=void 0,e._l=void 0,e[m]=0,void 0!=r&&s(r,n,e[u],e)});return o(c.prototype,{clear:function(){for(var e=h(this,t),n=e._i,r=e._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];e._f=e._l=void 0,e[m]=0},delete:function(e){var n=h(this,t),r=g(n,e);if(r){var i=r.n,o=r.p;delete n._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),n._f==r&&(n._f=i),n._l==r&&(n._l=o),n[m]--}return!!r},forEach:function(e){h(this,t);for(var n,r=l(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!g(h(this,t),e)}}),p&&r(c.prototype,"size",{get:function(){return h(this,t)[m]}}),c},def:function(e,t,n){var r,i,o=g(e,t);return o?o.v=n:(e._l=o={i:i=f(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=o),r&&(r.n=o),e[m]++,"F"!==i&&(e._i[i]=o)),e},getEntry:g,setStrong:function(e,t,n){u(e,t,function(e,n){this._t=h(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?c(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,c(1))},n?"entries":"values",!n,!0),d(t)}}},"3iOE":function(e,t,n){"use strict";t.a=function(e){return e&&"function"==typeof e.schedule}},"3k/+":function(e,t,n){"use strict";function r(e,t){var n=!1;return arguments.length>=2&&(n=!0),function(r){return r.lift(new l(e,t,n))}}var i=n("6Xbx"),o=n("E9/g"),l=function(){function e(e,t,n){void 0===n&&(n=!1),this.accumulator=e,this.seed=t,this.hasSeed=n}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.accumulator,this.seed,this.hasSeed))},e}(),a=function(e){function t(t,n,r,i){e.call(this,t),this.accumulator=n,this._seed=r,this.hasSeed=i,this.index=0}return Object(i.__extends)(t,e),Object.defineProperty(t.prototype,"seed",{get:function(){return this._seed},set:function(e){this.hasSeed=!0,this._seed=e},enumerable:!0,configurable:!0}),t.prototype._next=function(e){if(this.hasSeed)return this._tryNext(e);this.seed=e,this.destination.next(e)},t.prototype._tryNext=function(e){var t,n=this.index++;try{t=this.accumulator(this.seed,e,n)}catch(e){this.destination.error(e)}this.seed=t,this.destination.next(t)},t}(o.a);t.a=function(e,t){return arguments.length>=2?r(e,t)(this):r(e)(this)}},"3m71":function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=n("Ecq+").a.create},"3r0D":function(e,t,n){var r=n("Iclu")("wks"),i=n("c09d"),o=n("ptrv").Symbol,l="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=l&&o[e]||(l?o:i)("Symbol."+e))}).store=r},"4cOY":function(e,t,n){"use strict";var r=n("6Xbx").__decorate;Object.defineProperty(t,"__esModule",{value:!0});var i=n("LMZF"),o=function(){function e(){this.calculatedScrollbarWidth=null}return e.prototype.addClass=function(e,t){e.classList?e.classList.add(t):e.className+=" "+t},e.prototype.addMultipleClasses=function(e,t){if(e.classList)for(var n=t.split(" "),r=0;r<n.length;r++)e.classList.add(n[r]);else for(n=t.split(" "),r=0;r<n.length;r++)e.className+=" "+n[r]},e.prototype.removeClass=function(e,t){e.classList?e.classList.remove(t):e.className=e.className.replace(new RegExp("(^|\\b)"+t.split(" ").join("|")+"(\\b|$)","gi")," ")},e.prototype.hasClass=function(e,t){return e.classList?e.classList.contains(t):new RegExp("(^| )"+t+"( |$)","gi").test(e.className)},e.prototype.siblings=function(e){return Array.prototype.filter.call(e.parentNode.children,function(t){return t!==e})},e.prototype.find=function(e,t){return e.querySelectorAll(t)},e.prototype.findSingle=function(e,t){return e.querySelector(t)},e.prototype.index=function(e){for(var t=e.parentNode.childNodes,n=0,r=0;r<t.length;r++){if(t[r]==e)return n;1==t[r].nodeType&&n++}return-1},e.prototype.relativePosition=function(e,t){var n,r,i=e.offsetParent?{width:e.offsetWidth,height:e.offsetHeight}:this.getHiddenElementDimensions(e),o=t.offsetHeight,l=t.offsetWidth,a=t.getBoundingClientRect(),s=(this.getWindowScrollTop(),this.getViewport());a.top+o+i.height>s.height?a.top+(n=-1*i.height)<0&&(n=0):n=o,r=a.left+i.width>s.width?l-i.width:0,e.style.top=n+"px",e.style.left=r+"px"},e.prototype.absolutePosition=function(e,t){var n,r,i=e.offsetParent?{width:e.offsetWidth,height:e.offsetHeight}:this.getHiddenElementDimensions(e),o=i.height,l=i.width,a=t.offsetHeight,s=t.offsetWidth,u=t.getBoundingClientRect(),c=this.getWindowScrollTop(),d=this.getWindowScrollLeft(),p=this.getViewport();u.top+a+o>p.height?(n=u.top+c-o)<0&&(n=0+c):n=a+u.top+c,r=u.left+s+l>p.width?u.left+d+s-l:u.left+d,e.style.top=n+"px",e.style.left=r+"px"},e.prototype.getHiddenElementOuterHeight=function(e){e.style.visibility="hidden",e.style.display="block";var t=e.offsetHeight;return e.style.display="none",e.style.visibility="visible",t},e.prototype.getHiddenElementOuterWidth=function(e){e.style.visibility="hidden",e.style.display="block";var t=e.offsetWidth;return e.style.display="none",e.style.visibility="visible",t},e.prototype.getHiddenElementDimensions=function(e){var t={};return e.style.visibility="hidden",e.style.display="block",t.width=e.offsetWidth,t.height=e.offsetHeight,e.style.display="none",e.style.visibility="visible",t},e.prototype.scrollInView=function(e,t){var n=getComputedStyle(e).getPropertyValue("borderTopWidth"),r=n?parseFloat(n):0,i=getComputedStyle(e).getPropertyValue("paddingTop"),o=i?parseFloat(i):0,l=e.getBoundingClientRect(),a=t.getBoundingClientRect().top+document.body.scrollTop-(l.top+document.body.scrollTop)-r-o,s=e.scrollTop,u=e.clientHeight,c=this.getOuterHeight(t);a<0?e.scrollTop=s+a:a+c>u&&(e.scrollTop=s+a-u+c)},e.prototype.fadeIn=function(e,t){e.style.opacity=0;var n=+new Date,r=0,i=function(){r=+e.style.opacity+((new Date).getTime()-n)/t,e.style.opacity=r,n=+new Date,+r<1&&(window.requestAnimationFrame&&requestAnimationFrame(i)||setTimeout(i,16))};i()},e.prototype.fadeOut=function(e,t){var n=1,r=50/t,i=setInterval(function(){(n-=r)<=0&&(n=0,clearInterval(i)),e.style.opacity=n},50)},e.prototype.getWindowScrollTop=function(){var e=document.documentElement;return(window.pageYOffset||e.scrollTop)-(e.clientTop||0)},e.prototype.getWindowScrollLeft=function(){var e=document.documentElement;return(window.pageXOffset||e.scrollLeft)-(e.clientLeft||0)},e.prototype.matches=function(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(e){return-1!==[].indexOf.call(document.querySelectorAll(e),this)}).call(e,t)},e.prototype.getOuterWidth=function(e,t){var n=e.offsetWidth;if(t){var r=getComputedStyle(e);n+=parseFloat(r.marginLeft)+parseFloat(r.marginRight)}return n},e.prototype.getHorizontalPadding=function(e){var t=getComputedStyle(e);return parseFloat(t.paddingLeft)+parseFloat(t.paddingRight)},e.prototype.getHorizontalMargin=function(e){var t=getComputedStyle(e);return parseFloat(t.marginLeft)+parseFloat(t.marginRight)},e.prototype.innerWidth=function(e){var t=e.offsetWidth,n=getComputedStyle(e);return t+=parseFloat(n.paddingLeft)+parseFloat(n.paddingRight)},e.prototype.width=function(e){var t=e.offsetWidth,n=getComputedStyle(e);return t-=parseFloat(n.paddingLeft)+parseFloat(n.paddingRight)},e.prototype.getInnerHeight=function(e){var t=e.offsetHeight,n=getComputedStyle(e);return t+=parseFloat(n.paddingTop)+parseFloat(n.paddingBottom)},e.prototype.getOuterHeight=function(e,t){var n=e.offsetHeight;if(t){var r=getComputedStyle(e);n+=parseFloat(r.marginTop)+parseFloat(r.marginBottom)}return n},e.prototype.getHeight=function(e){var t=e.offsetHeight,n=getComputedStyle(e);return t-=parseFloat(n.paddingTop)+parseFloat(n.paddingBottom)+parseFloat(n.borderTopWidth)+parseFloat(n.borderBottomWidth)},e.prototype.getWidth=function(e){var t=e.offsetWidth,n=getComputedStyle(e);return t-=parseFloat(n.paddingLeft)+parseFloat(n.paddingRight)+parseFloat(n.borderLeftWidth)+parseFloat(n.borderRightWidth)},e.prototype.getViewport=function(){var e=window,t=document,n=t.documentElement,r=t.getElementsByTagName("body")[0];return{width:e.innerWidth||n.clientWidth||r.clientWidth,height:e.innerHeight||n.clientHeight||r.clientHeight}},e.prototype.getOffset=function(e){var t=e.getBoundingClientRect();return{top:t.top+document.body.scrollTop,left:t.left+document.body.scrollLeft}},e.prototype.getUserAgent=function(){return navigator.userAgent},e.prototype.isIE=function(){var e=window.navigator.userAgent;return e.indexOf("MSIE ")>0||(e.indexOf("Trident/")>0?(e.indexOf("rv:"),!0):e.indexOf("Edge/")>0)},e.prototype.appendChild=function(e,t){if(this.isElement(t))t.appendChild(e);else{if(!t.el||!t.el.nativeElement)throw"Cannot append "+t+" to "+e;t.el.nativeElement.appendChild(e)}},e.prototype.removeChild=function(e,t){if(this.isElement(t))t.removeChild(e);else{if(!t.el||!t.el.nativeElement)throw"Cannot remove "+e+" from "+t;t.el.nativeElement.removeChild(e)}},e.prototype.isElement=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&null!==e&&1===e.nodeType&&"string"==typeof e.nodeName},e.prototype.calculateScrollbarWidth=function(){if(null!==this.calculatedScrollbarWidth)return this.calculatedScrollbarWidth;var e=document.createElement("div");e.className="ui-scrollbar-measure",document.body.appendChild(e);var t=e.offsetWidth-e.clientWidth;return document.body.removeChild(e),this.calculatedScrollbarWidth=t,t},e.prototype.invokeElementMethod=function(e,t,n){e[t].apply(e,n)},e.prototype.clearSelection=function(){if(window.getSelection)window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().rangeCount>0&&window.getSelection().getRangeAt(0).getClientRects().length>0&&window.getSelection().removeAllRanges();else if(document.selection&&document.selection.empty)try{document.selection.empty()}catch(e){}},e.zindex=1e3,e}();o=r([i.Injectable()],o),t.DomHandler=o},"51pc":function(e,t,n){var r=n("+pQw"),i=n("ewdp"),o=n("a/Sk"),l=n("yIWP")("IE_PROTO"),a=function(){},s=function(){var e,t=n("BQSv")("iframe"),r=o.length;for(t.style.display="none",n("Ed9o").appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),s=e.F;r--;)delete s.prototype[o[r]];return s()};e.exports=Object.create||function(e,t){var n;return null!==e?(a.prototype=r(e),n=new a,a.prototype=null,n[l]=e):n=s(),void 0===t?n:i(n,t)}},"5GJ3":function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=r.key,l=r.map,a=r.store;r.exp({deleteMetadata:function(e,t){var n=arguments.length<3?void 0:o(arguments[2]),r=l(i(t),n,!1);if(void 0===r||!r.delete(e))return!1;if(r.size)return!0;var s=a.get(t);return s.delete(n),!!s.size||a.delete(t)}})},"5O0w":function(e,t,n){"use strict";t.a=function(e){return function(t){return t.lift(new l(e))}};var r=n("6Xbx"),i=n("lI6h"),o=n("qgI0"),l=function(){function e(e){this.notifier=e}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.notifier))},e}(),a=function(e){function t(t,n){e.call(this,t),this.notifier=n,this.add(Object(o.a)(this,n))}return Object(r.__extends)(t,e),t.prototype.notifyNext=function(e,t,n,r,i){this.complete()},t.prototype.notifyComplete=function(){},t}(i.a)},"5jKg":function(e,t,n){"use strict";t.a=function(e,t){return function(n){return n.lift(new l(e,t))}};var r=n("6Xbx"),i=n("lI6h"),o=n("qgI0"),l=function(){function e(e,t){this.project=e,this.resultSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.project,this.resultSelector))},e}(),a=function(e){function t(t,n,r){e.call(this,t),this.project=n,this.resultSelector=r,this.index=0}return Object(r.__extends)(t,e),t.prototype._next=function(e){var t,n=this.index++;try{t=this.project(e,n)}catch(e){return void this.destination.error(e)}this._innerSub(t,e,n)},t.prototype._innerSub=function(e,t,n){var r=this.innerSubscription;r&&r.unsubscribe(),this.add(this.innerSubscription=Object(o.a)(this,e,t,n))},t.prototype._complete=function(){var t=this.innerSubscription;t&&!t.closed||e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){this.innerSubscription=null},t.prototype.notifyComplete=function(t){this.remove(t),this.innerSubscription=null,this.isStopped&&e.prototype._complete.call(this)},t.prototype.notifyNext=function(e,t,n,r,i){this.resultSelector?this._tryNotifyNext(e,t,n,r):this.destination.next(t)},t.prototype._tryNotifyNext=function(e,t,n,r){var i;try{i=this.resultSelector(e,t,n,r)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t}(i.a)},"5oDA":function(e,t,n){var r=n("JXkd"),i=n("+pQw"),o=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,r){try{(r=n("pa70")(Function.call,n("6De9").f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return o(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:o}},"5q5V":function(e,t,n){"use strict";n.d(t,"a",function(){return c});var r=n("6Xbx"),i=n("TO51"),o=n("Gcw1"),l=n("qLnt"),a=n("YRqN"),s=n("Upor"),u=n("jaVc"),c=function(e){function t(t,n,r){void 0===t&&(t=Number.POSITIVE_INFINITY),void 0===n&&(n=Number.POSITIVE_INFINITY),e.call(this),this.scheduler=r,this._events=[],this._bufferSize=t<1?1:t,this._windowTime=n<1?1:n}return Object(r.__extends)(t,e),t.prototype.next=function(t){var n=this._getNow();this._events.push(new d(n,t)),this._trimBufferThenGetEvents(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){var t,n=this._trimBufferThenGetEvents(),r=this.scheduler;if(this.closed)throw new s.a;this.hasError?t=l.a.EMPTY:this.isStopped?t=l.a.EMPTY:(this.observers.push(e),t=new u.a(this,e)),r&&e.add(e=new a.a(e,r));for(var i=n.length,o=0;o<i&&!e.closed;o++)e.next(n[o].value);return this.hasError?e.error(this.thrownError):this.isStopped&&e.complete(),t},t.prototype._getNow=function(){return(this.scheduler||o.a).now()},t.prototype._trimBufferThenGetEvents=function(){for(var e=this._getNow(),t=this._bufferSize,n=this._windowTime,r=this._events,i=r.length,o=0;o<i&&!(e-r[o].time<n);)o++;return i>t&&(o=Math.max(o,i-t)),o>0&&r.splice(0,o),r},t}(i.Subject),d=function(e,t){this.time=e,this.value=t}},"6De9":function(e,t,n){var r=n("9e9+"),i=n("piOq"),o=n("+GRi"),l=n("A1WY"),a=n("rMsi"),s=n("gNkH"),u=Object.getOwnPropertyDescriptor;t.f=n("V+0c")?u:function(e,t){if(e=o(e),t=l(t,!0),s)try{return u(e,t)}catch(e){}if(a(e,t))return i(!r.f.call(e,t),e[t])}},"6S6c":function(e,t,n){"use strict";t.a=function(e,t){return Object(r.a)(e,t)(this)};var r=n("LaOa")},"6Xbx":function(e,t,n){"use strict";function r(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function i(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),l=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)l.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return l}function o(e){return this instanceof o?(this.v=e,this):new o(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.__extends=function(e,t){function n(){this.constructor=e}l(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)},n.d(t,"__assign",function(){return a}),t.__rest=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);i<r.length;i++)t.indexOf(r[i])<0&&(n[r[i]]=e[r[i]])}return n},t.__decorate=function(e,t,n,r){var i,o=arguments.length,l=o<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(l=(o<3?i(l):o>3?i(t,n,l):i(t,n))||l);return o>3&&l&&Object.defineProperty(t,n,l),l},t.__param=function(e,t){return function(n,r){t(n,r,e)}},t.__metadata=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)},t.__awaiter=function(e,t,n,r){return new(n||(n=Promise))(function(i,o){function l(e){try{s(r.next(e))}catch(e){o(e)}}function a(e){try{s(r.throw(e))}catch(e){o(e)}}function s(e){e.done?i(e.value):new n(function(t){t(e.value)}).then(l,a)}s((r=r.apply(e,t||[])).next())})},t.__generator=function(e,t){function n(n){return function(l){return function(n){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,i&&(o=i[2&n[0]?"return":n[0]?"throw":"next"])&&!(o=o.call(i,n[1])).done)return o;switch(i=0,o&&(n=[0,o.value]),n[0]){case 0:case 1:o=n;break;case 4:return a.label++,{value:n[1],done:!1};case 5:a.label++,i=n[1],n=[0];continue;case 7:n=a.ops.pop(),a.trys.pop();continue;default:if(o=a.trys,!(o=o.length>0&&o[o.length-1])&&(6===n[0]||2===n[0])){a=0;continue}if(3===n[0]&&(!o||n[1]>o[0]&&n[1]<o[3])){a.label=n[1];break}if(6===n[0]&&a.label<o[1]){a.label=o[1],o=n;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(n);break}o[2]&&a.ops.pop(),a.trys.pop();continue}n=t.call(e,a)}catch(e){n=[6,e],i=0}finally{r=o=0}if(5&n[0])throw n[1];return{value:n[0]?n[1]:void 0,done:!0}}([n,l])}}var r,i,o,l,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return l={next:n(0),throw:n(1),return:n(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l},t.__exportStar=function(e,t){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])},t.__values=r,t.__read=i,t.__spread=function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(i(arguments[t]));return e},t.__await=o,t.__asyncGenerator=function(e,t,n){function r(e){c[e]&&(u[e]=function(t){return new Promise(function(n,r){d.push([e,t,n,r])>1||i(e,t)})})}function i(e,t){try{!function(e){e.value instanceof o?Promise.resolve(e.value.v).then(l,a):s(d[0][2],e)}(c[e](t))}catch(e){s(d[0][3],e)}}function l(e){i("next",e)}function a(e){i("throw",e)}function s(e,t){e(t),d.shift(),d.length&&i(d[0][0],d[0][1])}if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var u,c=n.apply(e,t||[]),d=[];return u={},r("next"),r("throw"),r("return"),u[Symbol.asyncIterator]=function(){return this},u},t.__asyncDelegator=function(e){function t(t,i){e[t]&&(n[t]=function(n){return(r=!r)?{value:o(e[t](n)),done:"return"===t}:i?i(n):n})}var n,r;return n={},t("next"),t("throw",function(e){throw e}),t("return"),n[Symbol.iterator]=function(){return this},n},t.__asyncValues=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator];return t?t.call(e):r(e)},t.__makeTemplateObject=function(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e};var l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++){t=arguments[n];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e}},"6y8h":function(e,t,n){"use strict";var r=n("6Xbx"),i=n("E9/g"),o=n("8ofh"),l=n("NePw"),a=function(){function e(e,t){this.compare=e,this.keySelector=t}return e.prototype.call=function(e,t){return t.subscribe(new s(e,this.compare,this.keySelector))},e}(),s=function(e){function t(t,n,r){e.call(this,t),this.keySelector=r,this.hasKey=!1,"function"==typeof n&&(this.compare=n)}return Object(r.__extends)(t,e),t.prototype.compare=function(e,t){return e===t},t.prototype._next=function(e){var t=e;if(this.keySelector&&(t=Object(o.a)(this.keySelector)(e))===l.a)return this.destination.error(l.a.e);var n=!1;if(this.hasKey){if((n=Object(o.a)(this.compare)(this.key,t))===l.a)return this.destination.error(l.a.e)}else this.hasKey=!0;!1===Boolean(n)&&(this.key=t,this.destination.next(e))},t}(i.a);t.a=function(e,t){return function(e,t){return function(n){return n.lift(new a(e,t))}}(e,t)(this)}},"8Ut3":function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("6Xbx"),i=function(e){function t(t,n){e.call(this),this.value=t,this.scheduler=n,this._isScalar=!0,n&&(this._isScalar=!1)}return Object(r.__extends)(t,e),t.create=function(e,n){return new t(e,n)},t.dispatch=function(e){var t=e.value,n=e.subscriber;e.done?n.complete():(n.next(t),n.closed||(e.done=!0,this.schedule(e)))},t.prototype._subscribe=function(e){var n=this.value,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{done:!1,value:n,subscriber:e});e.next(n),e.closed||e.complete()},t}(n("AP4T").a)},"8ofh":function(e,t,n){"use strict";function r(){try{return i.apply(this,arguments)}catch(e){return o.a.e=e,o.a}}t.a=function(e){return i=e,r};var i,o=n("NePw")},"8sYH":function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=n("TJLg"),l=r.has,a=r.key,s=function(e,t,n){if(l(e,t,n))return!0;var r=o(t);return null!==r&&s(e,r,n)};r.exp({hasMetadata:function(e,t){return s(e,i(t),arguments.length<3?void 0:a(arguments[2]))}})},"9ScN":function(e,t,n){"use strict";var r=n("51pc"),i=n("piOq"),o=n("P6IN"),l={};n("gxdV")(l,n("3r0D")("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(l,{next:i(1,n)}),o(e,t+" Iterator")}},"9e9+":function(e,t){t.f={}.propertyIsEnumerable},"9wYb":function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},A1WY:function(e,t,n){var r=n("JXkd");e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},ADVA:function(e,t,n){"use strict";function r(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var n=e.length;if(0===n)throw new Error("list of properties cannot be empty.");return function(t){return Object(_.a)(function(e,t){return function(n){for(var r=n,i=0;i<t;i++){var o=r[e[i]];if(void 0===o)return;r=o}return r}}(e,n))(t)}}.apply(void 0,e)(this)}function i(e,t){void 0===t&&(t={});for(var n=Object.keys(e),r={},i=0;i<n.length;i++){var o=n[i];"function"==typeof e[o]&&(r[o]=e[o])}var l=Object.keys(r);return function(e,n){e=e||t;for(var i=!1,o={},a=0;a<l.length;a++){var s=l[a],u=e[s],c=(0,r[s])(u,n);o[s]=c,i=i||c!==u}return i?o:e}}function o(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return function(t){if(0===e.length)return t;var n=e[e.length-1];return e.slice(0,-1).reduceRight(function(e,t){return t(e)},n(t))}}function l(e,t){return Array.isArray(t)&&t.length>0?o.apply(null,t.concat([e])):e}function a(e,t){void 0===e&&(e={state:void 0});var n=t[0];return{state:(0,t[1])(e.state,n),action:n}}function s(e,t,n){return t instanceof d.InjectionToken?e.get(t):t}function u(e,t,n){return t.map(function(t,n){return t instanceof d.InjectionToken?e.get(t):t})}function c(e){return"function"==typeof e?e():e}var d=n("LMZF"),p=n("eoFs"),f=n("AP4T"),h=n("TO51"),m=n("Gcw1"),g=n("ozyc"),y=n("ThPn"),v=n("3k/+"),b=n("dmC+"),_=n("qqDE"),w=n("6y8h");n.d(t,"n",function(){return X}),n.d(t,"m",function(){return $}),n.d(t,"w",function(){return i}),n.d(t,"x",function(){return o}),n.d(t,"y",function(){return l}),n.d(t,"a",function(){return L}),n.d(t,"b",function(){return A}),n.d(t,"g",function(){return B}),n.d(t,"i",function(){return j}),n.d(t,"h",function(){return V}),n.d(t,"p",function(){return z}),n.d(t,"j",function(){return W}),n.d(t,"k",function(){return G}),n.d(t,"l",function(){return U}),n.d(t,"d",function(){return E}),n.d(t,"s",function(){return O}),n.d(t,"f",function(){return S}),n.d(t,"q",function(){return k}),n.d(t,"c",function(){return T}),n.d(t,"r",function(){return C}),n.d(t,"e",function(){return D}),n.d(t,"t",function(){return R}),n.d(t,"o",function(){return Q}),n.d(t,"v",function(){return c}),n.d(t,"u",function(){return s});var x=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),C=new d.InjectionToken("@ngrx/store Internal Initial State"),E=new d.InjectionToken("@ngrx/store Initial State"),S=new d.InjectionToken("@ngrx/store Reducer Factory"),O=new d.InjectionToken("@ngrx/store Reducer Factory Provider"),T=new d.InjectionToken("@ngrx/store Initial Reducers"),k=new d.InjectionToken("@ngrx/store Internal Initial Reducers"),D=new d.InjectionToken("@ngrx/store Meta Reducers"),I=new d.InjectionToken("@ngrx/store Store Features"),R=new d.InjectionToken("@ngrx/store Internal Store Reducers"),M=new d.InjectionToken("@ngrx/store Internal Feature Reducers"),P=new d.InjectionToken("@ngrx/store Internal Feature Reducers Token"),N=new d.InjectionToken("@ngrx/store Feature Reducers"),A="@ngrx/store/init",L=function(e){function t(){return e.call(this,{type:A})||this}return x(t,e),t.prototype.next=function(t){if(void 0===t)throw new TypeError("Actions must be objects");if(void 0===t.type)throw new TypeError("Actions must have a type property");e.prototype.next.call(this,t)},t.prototype.complete=function(){},t.prototype.ngOnDestroy=function(){e.prototype.complete.call(this)},t}(p.a),F=[L],j=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return x(t,e),t}(f.a),V=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return x(t,e),t}(L),z="@ngrx/store/update-reducers",B=function(e){function t(t,n,r,i){var o=e.call(this,i(r,n))||this;return o.dispatcher=t,o.initialState=n,o.reducers=r,o.reducerFactory=i,o}return x(t,e),t.prototype.addFeature=function(e){var t=e.reducers,n=e.initialState,r=e.key,i="function"==typeof t?function(e,r){return t(e||n,r)}:l(e.reducerFactory,e.metaReducers)(t,n);this.addReducer(r,i)},t.prototype.removeFeature=function(e){this.removeReducer(e.key)},t.prototype.addReducer=function(e,t){this.reducers=Object.assign({},this.reducers,(n={},n[e]=t,n)),this.updateReducers();var n},t.prototype.removeReducer=function(e){this.reducers=function(e,t){return Object.keys(e).filter(function(e){return e!==t}).reduce(function(t,n){return Object.assign(t,(r={},r[n]=e[n],r));var r},{})}(this.reducers,e),this.updateReducers()},t.prototype.updateReducers=function(){this.next(this.reducerFactory(this.reducers,this.initialState)),this.dispatcher.next({type:z})},t.prototype.ngOnDestroy=function(){this.complete()},t}(p.a),H=[B,{provide:j,useExisting:B},{provide:V,useExisting:L}],W=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return x(t,e),t.prototype.ngOnDestroy=function(){this.complete()},t}(h.Subject),q=[W],U=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return x(t,e),t}(f.a),G=function(e){function t(t,n,r,i){var o=e.call(this,i)||this,l=g.a.call(t,m.a),s=y.a.call(l,n),u=v.a.call(s,a,{state:i});return o.stateSubscription=u.subscribe({next:function(e){var t=e.action;o.next(e.state),r.next(t)}}),o}return x(t,e),t.prototype.ngOnDestroy=function(){this.stateSubscription.unsubscribe(),this.complete()},t}(p.a);G.INIT=A;var K=[G,{provide:U,useExisting:G}],$=function(e){function t(t,n,r){var i=e.call(this)||this;return i.actionsObserver=n,i.reducerManager=r,i.source=t,i}return x(t,e),t.prototype.select=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var i;if("string"==typeof e)i=r.call.apply(r,[this,e].concat(t));else{if("function"!=typeof e)throw new TypeError("Unexpected type '"+typeof e+"' in select operator, expected 'string' or 'function'");i=b.a.call(this,e)}return w.a.call(i)},t.prototype.lift=function(e){var n=new t(this,this.actionsObserver,this.reducerManager);return n.operator=e,n},t.prototype.dispatch=function(e){this.actionsObserver.next(e)},t.prototype.next=function(e){this.actionsObserver.next(e)},t.prototype.error=function(e){this.actionsObserver.error(e)},t.prototype.complete=function(){this.actionsObserver.complete()},t.prototype.addReducer=function(e,t){this.reducerManager.addReducer(e,t)},t.prototype.removeReducer=function(e){this.reducerManager.removeReducer(e)},t}(f.a),Z=[$],Q=function(e,t,n){},Y=function(){function e(e,t,n){this.features=e,this.featureReducers=t,this.reducerManager=n,e.map(function(e,n){var r=t.shift()[n];return Object.assign({},e,{reducers:r,initialState:c(e.initialState)})}).forEach(function(e){return n.addFeature(e)})}return e.prototype.ngOnDestroy=function(){var e=this;this.features.forEach(function(t){return e.reducerManager.removeFeature(t)})},e}(),X=function(){function e(){}return e.forRoot=function(e,t){return void 0===t&&(t={}),{ngModule:Q,providers:[{provide:C,useValue:t.initialState},{provide:E,useFactory:c,deps:[C]},{provide:k,useValue:e},{provide:R,useExisting:e instanceof d.InjectionToken?e:k},{provide:T,deps:[d.Injector,k,[new d.Inject(R)]],useFactory:s},{provide:D,useValue:t.metaReducers?t.metaReducers:[]},{provide:O,useValue:t.reducerFactory?t.reducerFactory:i},{provide:S,deps:[O,D],useFactory:l},F,H,q,K,Z]}},e.forFeature=function(e,t,n){return void 0===n&&(n={}),{ngModule:Y,providers:[{provide:I,multi:!0,useValue:{key:e,reducerFactory:n.reducerFactory?n.reducerFactory:i,metaReducers:n.metaReducers?n.metaReducers:[],initialState:n.initialState}},{provide:M,multi:!0,useValue:t},{provide:P,multi:!0,useExisting:t instanceof d.InjectionToken?t:M},{provide:N,multi:!0,deps:[d.Injector,M,[new d.Inject(P)]],useFactory:u}]}},e}()},AP4T:function(e,t,n){"use strict";var r=n("xIGM"),i=n("E9/g"),o=n("V7AE"),l=n("grVA"),a=n("mz3w"),s=n("PR+T");n.d(t,"a",function(){return u});var u=function(){function e(e){this._isScalar=!1,e&&(this._subscribe=e)}return e.prototype.lift=function(t){var n=new e;return n.source=this,n.operator=t,n},e.prototype.subscribe=function(e,t,n){var r=this.operator,a=function(e,t,n){if(e){if(e instanceof i.a)return e;if(e[o.a])return e[o.a]()}return e||t||n?new i.a(e,t,n):new i.a(l.a)}(e,t,n);if(r?r.call(a,this.source):a.add(this.source?this._subscribe(a):this._trySubscribe(a)),a.syncErrorThrowable&&(a.syncErrorThrowable=!1,a.syncErrorThrown))throw a.syncErrorValue;return a},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.syncErrorThrown=!0,e.syncErrorValue=t,e.error(t)}},e.prototype.forEach=function(e,t){var n=this;if(t||(r.a.Rx&&r.a.Rx.config&&r.a.Rx.config.Promise?t=r.a.Rx.config.Promise:r.a.Promise&&(t=r.a.Promise)),!t)throw new Error("no Promise impl found");return new t(function(t,r){var i;i=n.subscribe(function(t){if(i)try{e(t)}catch(e){r(e),i.unsubscribe()}else e(t)},r,t)})},e.prototype._subscribe=function(e){return this.source.subscribe(e)},e.prototype[a.a]=function(){return this},e.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return 0===e.length?this:function(e){return e?1===e.length?e[0]:function(t){return e.reduce(function(e,t){return t(e)},t)}:s.a}(e)(this)},e.prototype.toPromise=function(e){var t=this;if(e||(r.a.Rx&&r.a.Rx.config&&r.a.Rx.config.Promise?e=r.a.Rx.config.Promise:r.a.Promise&&(e=r.a.Promise)),!e)throw new Error("no Promise impl found");return new e(function(e,n){var r;t.subscribe(function(e){return r=e},function(e){return n(e)},function(){return e(r)})})},e.create=function(t){return new e(t)},e}()},B1iP:function(e,t,n){"use strict";t.a=function(e){return"function"==typeof e}},BCYq:function(e,t,n){var r=n("pa70"),i=n("Wo2w"),o=n("RT4T"),l=n("rppw"),a=n("UKZQ");e.exports=function(e,t){var n=1==e,s=2==e,u=3==e,c=4==e,d=6==e,p=5==e||d,f=t||a;return function(t,a,h){for(var m,g,y=o(t),v=i(y),b=r(a,h,3),_=l(v.length),w=0,x=n?f(t,_):s?f(t,0):void 0;_>w;w++)if((p||w in v)&&(m=v[w],g=b(m,w,y),e))if(n)x[w]=g;else if(g)switch(e){case 3:return!0;case 5:return m;case 6:return w;case 2:x.push(m)}else if(c)return!1;return d?-1:u||c?c:x}}},BQSv:function(e,t,n){var r=n("JXkd"),i=n("ptrv").document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},BThc:function(e,t,n){"use strict";var r=n("2kLc");t.a=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){return t.lift.call(r.a.apply(void 0,[t].concat(e)))}}.apply(void 0,e)(this)},n.d(t,!1,function(){return r.a})},CDXM:function(e,t,n){var r=n("ptrv"),i=n("b4gG"),o=n("gxdV"),l=n("lfBE"),a=n("pa70"),s=function(e,t,n){var u,c,d,p,f=e&s.F,h=e&s.G,m=e&s.P,g=e&s.B,y=h?r:e&s.S?r[t]||(r[t]={}):(r[t]||{}).prototype,v=h?i:i[t]||(i[t]={}),b=v.prototype||(v.prototype={});h&&(n=t);for(u in n)d=((c=!f&&y&&void 0!==y[u])?y:n)[u],p=g&&c?a(d,r):m&&"function"==typeof d?a(Function.call,d):d,y&&l(y,u,d,e&s.U),v[u]!=d&&o(v,u,p),m&&b[u]!=d&&(b[u]=d)};r.core=i,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},"E9/g":function(e,t,n){"use strict";n.d(t,"a",function(){return s});var r=n("6Xbx"),i=n("B1iP"),o=n("qLnt"),l=n("grVA"),a=n("V7AE"),s=function(e){function t(n,r,i){switch(e.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=l.a;break;case 1:if(!n){this.destination=l.a;break}if("object"==typeof n){n instanceof t?(this.destination=n,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,n));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,n,r,i)}}return Object(r.__extends)(t,e),t.prototype[a.a]=function(){return this},t.create=function(e,n,r){var i=new t(e,n,r);return i.syncErrorThrowable=!1,i},t.prototype.next=function(e){this.isStopped||this._next(e)},t.prototype.error=function(e){this.isStopped||(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this))},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){this.destination.error(e),this.unsubscribe()},t.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},t.prototype._unsubscribeAndRecycle=function(){var e=this._parent,t=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=e,this._parents=t,this},t}(o.a),u=function(e){function t(t,n,r,o){e.call(this),this._parentSubscriber=t;var a,s=this;Object(i.a)(n)?a=n:n&&(a=n.next,r=n.error,o=n.complete,n!==l.a&&(s=Object.create(n),Object(i.a)(s.unsubscribe)&&this.add(s.unsubscribe.bind(s)),s.unsubscribe=this.unsubscribe.bind(this))),this._context=s,this._next=a,this._error=r,this._complete=o}return Object(r.__extends)(t,e),t.prototype.next=function(e){if(!this.isStopped&&this._next){var t=this._parentSubscriber;t.syncErrorThrowable?this.__tryOrSetError(t,this._next,e)&&this.unsubscribe():this.__tryOrUnsub(this._next,e)}},t.prototype.error=function(e){if(!this.isStopped){var t=this._parentSubscriber;if(this._error)t.syncErrorThrowable?(this.__tryOrSetError(t,this._error,e),this.unsubscribe()):(this.__tryOrUnsub(this._error,e),this.unsubscribe());else{if(!t.syncErrorThrowable)throw this.unsubscribe(),e;t.syncErrorValue=e,t.syncErrorThrown=!0,this.unsubscribe()}}},t.prototype.complete=function(){var e=this;if(!this.isStopped){var t=this._parentSubscriber;if(this._complete){var n=function(){return e._complete.call(e._context)};t.syncErrorThrowable?(this.__tryOrSetError(t,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}},t.prototype.__tryOrUnsub=function(e,t){try{e.call(this._context,t)}catch(e){throw this.unsubscribe(),e}},t.prototype.__tryOrSetError=function(e,t,n){try{t.call(this._context,n)}catch(t){return e.syncErrorValue=t,e.syncErrorThrown=!0,!0}return!1},t.prototype._unsubscribe=function(){var e=this._parentSubscriber;this._context=null,this._parentSubscriber=null,e.unsubscribe()},t}(s)},"Ecq+":function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("6Xbx"),i=function(e){function t(t){e.call(this),this.scheduler=t}return Object(r.__extends)(t,e),t.create=function(e){return new t(e)},t.dispatch=function(e){e.subscriber.complete()},t.prototype._subscribe=function(e){var n=this.scheduler;if(n)return n.schedule(t.dispatch,0,{subscriber:e});e.complete()},t}(n("AP4T").a)},Ed9o:function(e,t,n){var r=n("ptrv").document;e.exports=r&&r.documentElement},GTlS:function(e,t,n){"use strict";var r=n("6Xbx"),i=n("xIGM"),o=function(e){function t(t,n){e.call(this)}return Object(r.__extends)(t,e),t.prototype.schedule=function(e,t){return void 0===t&&(t=0),this},t}(n("qLnt").a);n.d(t,"a",function(){return l});var l=function(e){function t(t,n){e.call(this,t,n),this.scheduler=t,this.work=n,this.pending=!1}return Object(r.__extends)(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e,this.pending=!0;var n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,t)),this.delay=t,this.id=this.id||this.requestAsyncId(r,this.id,t),this},t.prototype.requestAsyncId=function(e,t,n){return void 0===n&&(n=0),i.a.setInterval(e.flush.bind(e,this),n)},t.prototype.recycleAsyncId=function(e,t,n){if(void 0===n&&(n=0),null!==n&&this.delay===n&&!1===this.pending)return t;i.a.clearInterval(t)},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(e,t);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var n=!1,r=void 0;try{this.work(e)}catch(e){n=!0,r=!!e&&e||new Error(e)}if(n)return this.unsubscribe(),r},t.prototype._unsubscribe=function(){var e=this.id,t=this.scheduler,n=t.actions,r=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==r&&n.splice(r,1),null!=e&&(this.id=this.recycleAsyncId(t,e,null)),this.delay=null},t}(o)},Gcw1:function(e,t,n){"use strict";var r=n("6Xbx"),i=function(e){function t(t,n){e.call(this,t,n),this.scheduler=t,this.work=n}return Object(r.__extends)(t,e),t.prototype.schedule=function(t,n){return void 0===n&&(n=0),n>0?e.prototype.schedule.call(this,t,n):(this.delay=n,this.state=t,this.scheduler.flush(this),this)},t.prototype.execute=function(t,n){return n>0||this.closed?e.prototype.execute.call(this,t,n):this._execute(t,n)},t.prototype.requestAsyncId=function(t,n,r){return void 0===r&&(r=0),null!==r&&r>0||null===r&&this.delay>0?e.prototype.requestAsyncId.call(this,t,n,r):t.flush(this)},t}(n("GTlS").a),o=function(e){function t(){e.apply(this,arguments)}return Object(r.__extends)(t,e),t}(n("wclm").a);n.d(t,"a",function(){return l});var l=new o(i)},GpNi:function(e,t,n){"use strict";t.a=function(e,t){return Object(r.a)(e,t)(this)};var r=n("5jKg")},H0Ur:function(e,t,n){"use strict";var r=n("6Xbx").__decorate;Object.defineProperty(t,"__esModule",{value:!0});var i=n("LMZF"),o=n("TO51"),l=function(){function e(){this.dragStartSource=new o.Subject,this.dragStopSource=new o.Subject,this.dragStart$=this.dragStartSource.asObservable(),this.dragStop$=this.dragStopSource.asObservable()}return e.prototype.startDrag=function(e){this.dragStartSource.next(e)},e.prototype.stopDrag=function(e){this.dragStopSource.next(e)},e}();l=r([i.Injectable()],l),t.TreeDragDropService=l},HCkn:function(e,t,n){var r=n("Ps07"),i=n("WGJ/"),o=n("gBtn"),l=n("+pQw"),a=n("TJLg"),s=o.keys,u=o.key,c=function(e,t){var n=s(e,t),o=a(e);if(null===o)return n;var l=c(o,t);return l.length?n.length?i(new r(n.concat(l))):l:n};o.exp({getMetadataKeys:function(e){return c(l(e),arguments.length<2?void 0:u(arguments[1]))}})},IJ3P:function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=r.has,l=r.key;r.exp({hasOwnMetadata:function(e,t){return o(e,i(t),arguments.length<3?void 0:l(arguments[2]))}})},Iclu:function(e,t,n){var r=n("ptrv"),i="__core-js_shared__",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},JXkd:function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},Jsyr:function(e,t,n){"use strict";var r=n("6Xbx"),i=n("AP4T"),o=n("Ecq+"),l=n("1j/l"),a=n("qgI0"),s=n("lI6h"),u=function(e){function t(t,n){e.call(this),this.sources=t,this.resultSelector=n}return Object(r.__extends)(t,e),t.create=function(){for(var e=[],n=0;n<arguments.length;n++)e[n-0]=arguments[n];if(null===e||0===arguments.length)return new o.a;var r=null;return"function"==typeof e[e.length-1]&&(r=e.pop()),1===e.length&&Object(l.a)(e[0])&&(e=e[0]),0===e.length?new o.a:new t(e,r)},t.prototype._subscribe=function(e){return new c(e,this.sources,this.resultSelector)},t}(i.a),c=function(e){function t(t,n,r){e.call(this,t),this.sources=n,this.resultSelector=r,this.completed=0,this.haveValues=0;var i=n.length;this.total=i,this.values=new Array(i);for(var o=0;o<i;o++){var l=n[o],s=Object(a.a)(this,l,null,o);s&&(s.outerIndex=o,this.add(s))}}return Object(r.__extends)(t,e),t.prototype.notifyNext=function(e,t,n,r,i){this.values[n]=t,i._hasValue||(i._hasValue=!0,this.haveValues++)},t.prototype.notifyComplete=function(e){var t=this.destination,n=this.haveValues,r=this.resultSelector,i=this.values,o=i.length;if(e._hasValue){if(this.completed++,this.completed===o){if(n===o){var l=r?r.apply(this,i):i;t.next(l)}t.complete()}}else t.complete()},t}(s.a);n.d(t,"a",function(){return d});var d=u.create},KGrn:function(e,t){e.exports=!1},KM3d:function(e,t,n){var r=n("9wYb"),i=Math.max,o=Math.min;e.exports=function(e,t){return(e=r(e))<0?i(e+t,0):o(e,t)}},KRwF:function(e,t,n){"use strict";function r(e){var t=e.subscriber;t.closed||(t.next(e.value),t.complete())}function i(e){var t=e.subscriber;t.closed||t.error(e.err)}n.d(t,"a",function(){return a});var o=n("6Xbx"),l=n("xIGM"),a=function(e){function t(t,n){e.call(this),this.promise=t,this.scheduler=n}return Object(o.__extends)(t,e),t.create=function(e,n){return new t(e,n)},t.prototype._subscribe=function(e){var t=this,n=this.promise,o=this.scheduler;if(null==o)this._isScalar?e.closed||(e.next(this.value),e.complete()):n.then(function(n){t.value=n,t._isScalar=!0,e.closed||(e.next(n),e.complete())},function(t){e.closed||e.error(t)}).then(null,function(e){l.a.setTimeout(function(){throw e})});else if(this._isScalar){if(!e.closed)return o.schedule(r,0,{value:this.value,subscriber:e})}else n.then(function(n){t.value=n,t._isScalar=!0,e.closed||e.add(o.schedule(r,0,{value:n,subscriber:e}))},function(t){e.closed||e.add(o.schedule(i,0,{err:t,subscriber:e}))}).then(null,function(e){l.a.setTimeout(function(){throw e})})},t}(n("AP4T").a)},"KpI+":function(e,t,n){var r=n("lexG"),i=n("3r0D")("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},KpXt:function(e,t,n){"use strict";var r=n("ptrv"),i=n("tose"),o=n("V+0c"),l=n("3r0D")("species");e.exports=function(e){var t=r[e];o&&t&&!t[l]&&i.f(t,l,{configurable:!0,get:function(){return this}})}},LMZF:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function r(e,t,n,r){function o(e){if(this instanceof o)return l.call(this,e),this;var t=new o(e),n=function(e){return(e.hasOwnProperty(Pr)?e[Pr]:Object.defineProperty(e,Pr,{value:[]})[Pr]).push(t),e};return r&&r(n),n}var l=i(t);return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=e,o.annotationCls=o,o}function i(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(e){var r=e.apply(void 0,t);for(var i in r)this[i]=r[i]}}}function o(e,t,n){function r(){function e(e,t,n){for(var r=e.hasOwnProperty(Nr)?e[Nr]:Object.defineProperty(e,Nr,{value:[]})[Nr];r.length<=n;)r.push(null);return(r[n]=r[n]||[]).push(i),e}for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];if(this instanceof r)return o.apply(this,t),this;var i=new((l=r).bind.apply(l,[void 0].concat(t)));return e.annotation=i,e;var l}var o=i(t);return n&&(r.prototype=Object.create(n.prototype)),r.prototype.ngMetadataName=e,r.annotationCls=r,r}function l(e,t,n){function r(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(this instanceof r)return o.apply(this,e),this;var n=new((i=r).bind.apply(i,[void 0].concat(e)));return function(e,t){var r=e.constructor,i=r.hasOwnProperty(Ar)?r[Ar]:Object.defineProperty(r,Ar,{value:{}})[Ar];i[t]=i.hasOwnProperty(t)&&i[t]||[],i[t].unshift(n)};var i}var o=i(t);return n&&(r.prototype=Object.create(n.prototype)),r.prototype.ngMetadataName=e,r.annotationCls=r,r}function a(e){return null==e||e===Wr.Default}function s(){if(!fi){var e=pi.Symbol;if(e&&e.iterator)fi=e.iterator;else for(var t=Object.getOwnPropertyNames(Map.prototype),n=0;n<t.length;++n){var r=t[n];"entries"!==r&&"size"!==r&&Map.prototype[r]===Map.prototype.entries&&(fi=r)}}return fi}function u(e){Zone.current.scheduleMicroTask("scheduleMicrotask",e)}function c(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)}function d(e){if("string"==typeof e)return e;if(e instanceof Array)return"["+e.map(d).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return""+e.overriddenName;if(e.name)return""+e.name;var t=e.toString();if(null==t)return""+t;var n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function p(e){return e.__forward_ref__=p,e.toString=function(){return d(this())},e}function f(e){return"function"==typeof e&&e.hasOwnProperty("__forward_ref__")&&e.__forward_ref__===p?e():e}function h(e){return v("Cannot mix multi providers and regular providers",e)}function m(e,t){if(t)if((t=f(t))instanceof Array)for(var n=0;n<t.length;n++)m(e,t[n]);else{if("function"==typeof t)throw v("Function/Class not supported",t);if(!t||"object"!=typeof t||!t.provide)throw v("Unexpected provider",t);var r=f(t.provide),i=function(e){var t=function(e){var t=bi,n=e.deps;if(n&&n.length){t=[];for(var r=0;r<n.length;r++){var i=6;if((s=f(n[r]))instanceof Array)for(var o=0,l=s;o<l.length;o++){var a=l[o];a instanceof oi||a==oi?i|=1:a instanceof si||a==si?i&=-3:a instanceof ai||a==ai?i&=-5:s=a instanceof ii?a.token:f(a)}t.push({token:s,options:i})}}else if(e.useExisting){var s;t=[{token:s=f(e.useExisting),options:6}]}else if(!(n||Ei in e))throw v("'deps' required",e);return t}(e),n=vi,r=bi,i=!1,o=f(e.provide);if(Ei in e)r=e.useValue;else if(e.useFactory)n=e.useFactory;else if(e.useExisting);else if(e.useClass)i=!0,n=f(e.useClass);else{if("function"!=typeof o)throw v("StaticProvider does not have [useValue|useFactory|useExisting|useClass] or [provide] is not newable",e);i=!0,n=o}return{deps:t,fn:n,useNew:i,value:r}}(t);if(!0===t.multi){var o=e.get(r);if(o){if(o.fn!==wi)throw h(r)}else e.set(r,o={token:t.provide,deps:[],useNew:!1,fn:wi,value:bi});o.deps.push({token:r=t,options:6})}var l=e.get(r);if(l&&l.fn==wi)throw h(r);e.set(r,i)}}function g(e,t,n,r,i){try{return function(e,t,n,r,i){var o;if(t){if((o=t.value)==_i)throw Error(ki+"Circular dependency");if(o===bi){t.value=_i;var l=t.useNew,a=t.fn,s=t.deps,u=bi;if(s.length){u=[];for(var c=0;c<s.length;c++){var d=s[c],p=d.options,f=2&p?n.get(d.token):void 0;u.push(g(d.token,f,n,f||4&p?r:Oi,1&p?null:yi.THROW_IF_NOT_FOUND))}}t.value=o=l?new((h=a).bind.apply(h,[void 0].concat(u))):a.apply(void 0,u)}}else o=r.get(e,i);return o;var h}(e,t,n,r,i)}catch(n){throw n instanceof Error||(n=new Error(n)),(n[Si]=n[Si]||[]).unshift(e),t&&t.value==_i&&(t.value=bi),n}}function y(e,t){e=e&&"\n"===e.charAt(0)&&e.charAt(1)==ki?e.substr(2):e;var n=d(t);if(t instanceof Array)n=t.map(d).join(" -> ");else if("object"==typeof t){var r=[];for(var i in t)if(t.hasOwnProperty(i)){var o=t[i];r.push(i+":"+("string"==typeof o?JSON.stringify(o):d(o)))}n="{"+r.join(", ")+"}"}return"StaticInjectorError["+n+"]: "+e.replace(Ti,"\n  ")}function v(e,t){return new Error(y(e,t))}function b(e){return e[Ii]}function _(e){return e[Ri]}function w(e){return e.length>1?" ("+function(e){for(var t=[],n=0;n<e.length;++n){if(t.indexOf(e[n])>-1)return t.push(e[n]),t;t.push(e[n])}return t}(e.slice().reverse()).map(function(e){return d(e.token)}).join(" -> ")+")":""}function x(e,t,n,r){var i=[t],o=n(i),l=r?function(e,t){var n=o+" caused by: "+(t instanceof Error?t.message:t),r=Error(n);return r[Ri]=t,r}(0,r):Error(o);return l.addKey=C,l.keys=i,l.injectors=[e],l.constructResolvingMessage=n,l[Ri]=r,l}function C(e,t){this.injectors.push(e),this.keys.push(t),this.message=this.constructResolvingMessage(this.keys)}function E(e,t){for(var n=[],r=0,i=t.length;r<i;r++){var o=t[r];n.push(o&&0!=o.length?o.map(d).join(" "):"?")}return Error("Cannot resolve all parameters for '"+d(e)+"'("+n.join(", ")+"). Make sure that all the parameters are decorated with Inject or have valid type annotations and that '"+d(e)+"' is decorated with Injectable.")}function S(e,t){return Error("Cannot mix multi providers and regular providers, got: "+e+" "+t)}function O(e){return"function"==typeof e}function T(e){return e?e.map(function(e){var t=e.type.annotationCls;return new(t.bind.apply(t,[void 0].concat(e.args?e.args:[])))}):[]}function k(e){var t=Object.getPrototypeOf(e.prototype);return(t?t.constructor:null)||Object}function D(e){return new Hi(Ni.get(e.provide),[function(e){var t,n;if(e.useClass){var r=f(e.useClass);t=Vi.factory(r),n=M(r)}else e.useExisting?(t=function(e){return e},n=[zi.fromKey(Ni.get(e.useExisting))]):e.useFactory?(t=e.useFactory,n=function(e,t){if(t){var n=t.map(function(e){return[e]});return t.map(function(t){return P(e,t,n)})}return M(e)}(e.useFactory,e.deps)):(t=function(){return e.useValue},n=Bi);return new Wi(t,n)}(e)],e.multi||!1)}function I(e){var t=function(e,t){for(var n=0;n<e.length;n++){var r=e[n],i=t.get(r.key.id);if(i){if(r.multiProvider!==i.multiProvider)throw S(i,r);if(r.multiProvider)for(var o=0;o<r.resolvedFactories.length;o++)i.resolvedFactories.push(r.resolvedFactories[o]);else t.set(r.key.id,r)}else{var l=void 0;l=r.multiProvider?new Hi(r.key,r.resolvedFactories.slice(),r.multiProvider):r,t.set(r.key.id,l)}}return t}(R(e,[]).map(D),new Map);return Array.from(t.values())}function R(e,t){return e.forEach(function(e){if(e instanceof Li)t.push({provide:e,useClass:e});else if(e&&"object"==typeof e&&void 0!==e.provide)t.push(e);else{if(!(e instanceof Array))throw function(e){return Error("Invalid provider - only instances of Provider and Type are allowed, got: "+e)}(e);R(e,t)}}),t}function M(e){var t=Vi.parameters(e);if(!t)return[];if(t.some(function(e){return null==e}))throw E(e,t);return t.map(function(n){return P(e,n,t)})}function P(e,t,n){var r=null,i=!1;if(!Array.isArray(t))return N(t instanceof ii?t.token:t,i,null);for(var o=null,l=0;l<t.length;++l){var a=t[l];a instanceof Li?r=a:a instanceof ii?r=a.token:a instanceof oi?i=!0:a instanceof ai||a instanceof si?o=a:a instanceof Mr&&(r=a)}if(null!=(r=f(r)))return N(r,i,o);throw E(e,n)}function N(e,t,n){return new zi(Ni.get(e),t,n)}function A(e){return!!e&&"function"==typeof e.then}function L(e){return!!e&&"function"==typeof e.subscribe}function F(){return""+j()+j()+j()}function j(){return String.fromCharCode(97+Math.floor(25*Math.random()))}function V(){throw new Error("Runtime compiler is not loaded")}function z(e){var t=Error("No component factory found for "+d(e)+". Did you add it to @NgModule.entryComponents?");return t[so]=e,t}function B(){var e=pi.wtf;return!(!e||!(wr=e.trace)||(xr=wr.events,0))}function H(e,t){return void 0===t&&(t=null),xr.createScope(e,t)}function W(e,t){return wr.leaveScope(e,t),t}function q(e,t){return wr.beginTimeRange(e,t)}function U(e){wr.endTimeRange(e)}function G(e,t){return null}function K(){}function $(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(function(){return e.onStable.emit(null)})}finally{e.isStable=!0}}}function Z(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function Q(e){e._nesting--,$(e)}function Y(e){To=e}function X(){if(Do)throw new Error("Cannot enable prod mode after platform setup.");ko=!1}function J(){return Do=!0,ko}function ee(e){if(Cr&&!Cr.destroyed&&!Cr.injector.get(Io,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");Cr=e.get(Mo);var t=e.get(Yi,null);return t&&t.forEach(function(e){return e()}),Cr}function te(e,t,n){void 0===n&&(n=[]);var r=new Mr("Platform: "+t);return function(t){void 0===t&&(t=[]);var i=ie();return i&&!i.injector.get(Io,!1)||(e?e(n.concat(t).concat({provide:r,useValue:!0})):ee(yi.create(n.concat(t).concat({provide:r,useValue:!0})))),ne(r)}}function ne(e){var t=ie();if(!t)throw new Error("No platform exists!");if(!t.injector.get(e,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return t}function re(){Cr&&!Cr.destroyed&&Cr.destroy()}function ie(){return Cr&&!Cr.destroyed?Cr:null}function oe(e,t){return e=Array.isArray(t)?t.reduce(oe,e):Object(Tr.__assign)({},e,t)}function le(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}function ae(e,t){var n=Wo.get(e);if(n)throw new Error("Duplicate module registered for "+e+" - "+n.moduleType.name+" vs "+t.moduleType.name);Wo.set(e,t)}function se(e){var t=Wo.get(e);if(!t)throw new Error("No module with ID "+e+" loaded");return t}function ue(e){return e.reduce(function(e,t){var n=Array.isArray(t)?ue(t):t;return e.concat(n)},[])}function ce(e,t,n){if(!e)throw new Error("Cannot find '"+n+"' in '"+t+"'");return e}function de(e){return e.map(function(e){return e.nativeElement})}function pe(e,t,n){e.childNodes.forEach(function(e){e instanceof el&&(t(e)&&n.push(e),pe(e,t,n))})}function fe(e,t,n){e instanceof el&&e.childNodes.forEach(function(e){t(e)&&n.push(e),e instanceof el&&fe(e,t,n)})}function he(e){return tl.get(e)||null}function me(e){tl.set(e.nativeNode,e)}function ge(e,t){var n=ye(e),r=ye(t);return n&&r?function(t,n,r){for(var i=e[s()](),o=n[s()]();;){var l=i.next(),a=o.next();if(l.done&&a.done)return!0;if(l.done||a.done)return!1;if(!r(l.value,a.value))return!1}}(0,t,ge):!(n||!e||"object"!=typeof e&&"function"!=typeof e||r||!t||"object"!=typeof t&&"function"!=typeof t)||c(e,t)}function ye(e){return!!ve(e)&&(Array.isArray(e)||!(e instanceof Map)&&s()in e)}function ve(e){return null!==e&&("function"==typeof e||"object"==typeof e)}function be(e,t,n){var r=e.previousIndex;if(null===r)return r;var i=0;return n&&r<n.length&&(i=n[r]),r+t+i}function _e(){return yl}function we(){return vl}function xe(e){return e||"en-US"}function Ce(e,t,n){var r=e.state,i=1792&r;return i===t?(e.state=-1793&r|n,e.initIndex=-1,!0):i===n}function Ee(e,t,n){return(1792&e.state)===t&&e.initIndex<=n&&(e.initIndex=n+1,!0)}function Se(e,t){return e.nodes[t]}function Oe(e,t){return e.nodes[t]}function Te(e,t){return e.nodes[t]}function ke(e,t){return e.nodes[t]}function De(e,t){return e.nodes[t]}function Ie(e,t,n,r){var i="ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '"+t+"'. Current value: '"+n+"'.";return r&&(i+=" It seems like the view has been created after its parent and its children have been dirty checked. Has it been created in a change detection hook ?"),function(e,t){var n=new Error(e);return Re(n,t),n}(i,e)}function Re(e,t){e[Ii]=t,e[Mi]=t.logError.bind(t)}function Me(e){return new Error("ViewDestroyedError: Attempt to use a destroyed view: "+e)}function Pe(e){var t=Il.get(e);return t||(t=d(e)+"_"+Il.size,Il.set(e,t)),t}function Ne(e,t,n,r){if(r instanceof nl){r=r.wrapped;var i=e.def.nodes[t].bindingIndex+n,o=e.oldValues[i];o instanceof nl&&(o=o.wrapped),e.oldValues[i]=new nl(o)}return r}function Ae(e){return{id:Rl,styles:e.styles,encapsulation:e.encapsulation,data:e.data}}function Le(e,t,n,r){return!(!(2&e.state)&&c(e.oldValues[t.bindingIndex+n],r))}function Fe(e,t,n,r){return!!Le(e,t,n,r)&&(e.oldValues[t.bindingIndex+n]=r,!0)}function je(e,t,n,r){var i=e.oldValues[t.bindingIndex+n];if(1&e.state||!ge(i,r))throw Ie(kl.createDebugContext(e,t.nodeIndex),i,r,0!=(1&e.state))}function Ve(e){for(var t=e;t;)2&t.def.flags&&(t.state|=8),t=t.viewContainerParent||t.parent}function ze(e,t){for(var n=e;n&&n!==t;)n.state|=64,n=n.viewContainerParent||n.parent}function Be(e,t,n,r){try{return Ve(33554432&e.def.nodes[t].flags?Oe(e,t).componentView:e),kl.handleEvent(e,t,n,r)}catch(t){e.root.errorHandler.handleError(t)}}function He(e){return e.parent?Oe(e.parent,e.parentNodeDef.nodeIndex):null}function We(e){return e.parent?e.parentNodeDef.parent:null}function qe(e,t){switch(201347067&t.flags){case 1:return Oe(e,t.nodeIndex).renderElement;case 2:return Se(e,t.nodeIndex).renderText}}function Ue(e,t){return e?e+":"+t:t}function Ge(e){return!!e.parent&&!!(32768&e.parentNodeDef.flags)}function Ke(e){return!(!e.parent||32768&e.parentNodeDef.flags)}function $e(e){return 1<<e%32}function Ze(e){var t={},n=0,r={};return e&&e.forEach(function(e){var i=e[0],o=e[1];"number"==typeof i?(t[i]=o,n|=$e(i)):r[i]=o}),{matchedQueries:t,references:r,matchedQueryIds:n}}function Qe(e){return e.map(function(e){var t,n;return Array.isArray(e)?(n=e[0],t=e[1]):(n=0,t=e),{flags:n,token:t,tokenKey:Pe(t)}})}function Ye(e,t,n){var r=n.renderParent;return r?0==(1&r.flags)||0==(33554432&r.flags)||r.element.componentRendererType&&r.element.componentRendererType.encapsulation===ti.Native?Oe(e,n.renderParent.nodeIndex).renderElement:void 0:t}function Xe(e){var t=Nl.get(e);return t||((t=e(function(){return Dl})).factory=e,Nl.set(e,t)),t}function Je(e,t,n,r,i){3===t&&(n=e.renderer.parentNode(qe(e,e.def.lastRenderRootNode))),et(e,t,0,e.def.nodes.length-1,n,r,i)}function et(e,t,n,r,i,o,l){for(var a=n;a<=r;a++){var s=e.def.nodes[a];11&s.flags&&nt(e,s,t,i,o,l),a+=s.childCount}}function tt(e,t,n,r,i,o){for(var l=e;l&&!Ge(l);)l=l.parent;for(var a=l.parent,s=We(l),u=s.nodeIndex+s.childCount,c=s.nodeIndex+1;c<=u;c++){var d=a.def.nodes[c];d.ngContentIndex===t&&nt(a,d,n,r,i,o),c+=d.childCount}if(!a.parent){var p=e.root.projectableNodes[t];if(p)for(c=0;c<p.length;c++)rt(e,p[c],n,r,i,o)}}function nt(e,t,n,r,i,o){if(8&t.flags)tt(e,t.ngContent.index,n,r,i,o);else{var l=qe(e,t);if(3===n&&33554432&t.flags&&48&t.bindingFlags?(16&t.bindingFlags&&rt(e,l,n,r,i,o),32&t.bindingFlags&&rt(Oe(e,t.nodeIndex).componentView,l,n,r,i,o)):rt(e,l,n,r,i,o),16777216&t.flags)for(var a=Oe(e,t.nodeIndex).viewContainer._embeddedViews,s=0;s<a.length;s++)Je(a[s],n,r,i,o);1&t.flags&&!t.element.name&&et(e,n,t.nodeIndex+1,t.nodeIndex+t.childCount,r,i,o)}}function rt(e,t,n,r,i,o){var l=e.renderer;switch(n){case 1:l.appendChild(r,t);break;case 2:l.insertBefore(r,t,i);break;case 3:l.removeChild(r,t);break;case 0:o.push(t)}}function it(e){if(":"===e[0]){var t=e.match(Al);return[t[1],t[2]]}return["",e]}function ot(e){for(var t=0,n=0;n<e.length;n++)t|=e[n].flags;return t}function lt(e,t){for(var n="",r=0;r<2*e;r+=2)n=n+t[r]+st(t[r+1]);return n+t[2*e]}function at(e,t,n,r,i,o,l,a,s,u,c,d,p,f,h,m,g,y,v,b){switch(e){case 1:return t+st(n)+r;case 2:return t+st(n)+r+st(i)+o;case 3:return t+st(n)+r+st(i)+o+st(l)+a;case 4:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u;case 5:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u+st(c)+d;case 6:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u+st(c)+d+st(p)+f;case 7:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u+st(c)+d+st(p)+f+st(h)+m;case 8:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u+st(c)+d+st(p)+f+st(h)+m+st(g)+y;case 9:return t+st(n)+r+st(i)+o+st(l)+a+st(s)+u+st(c)+d+st(p)+f+st(h)+m+st(g)+y+st(v)+b;default:throw new Error("Does not support more than 9 expressions")}}function st(e){return null!=e?e.toString():""}function ut(e,t,n,r,i,o){e|=1;var l=Ze(t);return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,flags:e,checkIndex:-1,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:l.matchedQueries,matchedQueryIds:l.matchedQueryIds,references:l.references,ngContentIndex:n,childCount:r,bindings:[],bindingFlags:0,outputs:[],element:{ns:null,name:null,attrs:null,template:o?Xe(o):null,componentProvider:null,componentView:null,componentRendererType:null,publicProviders:null,allProviders:null,handleEvent:i||Dl},provider:null,text:null,query:null,ngContent:null}}function ct(e,t,n,r,i,o,l,a,s,u,c,d){void 0===l&&(l=[]),u||(u=Dl);var p=Ze(n),f=p.matchedQueries,h=p.references,m=p.matchedQueryIds,g=null,y=null;o&&(g=(I=it(o))[0],y=I[1]),a=a||[];for(var v=new Array(a.length),b=0;b<a.length;b++){var _=a[b],w=_[0],x=_[2],C=it(_[1]),E=C[1],S=void 0,O=void 0;switch(15&w){case 4:O=x;break;case 1:case 8:S=x}v[b]={flags:w,ns:C[0],name:E,nonMinifiedName:E,securityContext:S,suffix:O}}s=s||[];var T=new Array(s.length);for(b=0;b<s.length;b++){var k=s[b];T[b]={type:0,target:k[0],eventName:k[1],propName:null}}var D=(l=l||[]).map(function(e){var t=e[1],n=it(e[0]);return[n[0],n[1],t]});return d=function(e){if(e&&e.id===Rl){var t=null!=e.encapsulation&&e.encapsulation!==ti.None||e.styles.length||Object.keys(e.data).length;e.id=t?"c"+Pl++:Ml}return e&&e.id===Ml&&(e=null),e||null}(d),c&&(t|=33554432),t|=1,{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:e,flags:t,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:f,matchedQueryIds:m,references:h,ngContentIndex:r,childCount:i,bindings:v,bindingFlags:ot(v),outputs:T,element:{ns:g,name:y,attrs:D,template:null,componentProvider:null,componentView:c||null,componentRendererType:d,publicProviders:null,allProviders:null,handleEvent:u||Dl},provider:null,text:null,query:null,ngContent:null};var I}function dt(e,t,n){var r,i=n.element,o=e.root.selectorOrNode,l=e.renderer;if(e.parent||!o){r=i.name?l.createElement(i.name,i.ns):l.createComment("");var a=Ye(e,t,n);a&&l.appendChild(a,r)}else r=l.selectRootElement(o);if(i.attrs)for(var s=0;s<i.attrs.length;s++){var u=i.attrs[s];l.setAttribute(r,u[1],u[2],u[0])}return r}function pt(e,t,n,r){for(var i=0;i<n.outputs.length;i++){var o=n.outputs[i],l=function(e,t,n){return function(r){return Be(e,t,n,r)}}(e,n.nodeIndex,Ue(o.target,o.eventName)),a=o.target,s=e;"component"===o.target&&(a=null,s=t);var u=s.renderer.listen(a||r,o.eventName,l);e.disposables[n.outputIndex+i]=u}}function ft(e,t,n,r){if(!Fe(e,t,n,r))return!1;var i=t.bindings[n],o=Oe(e,t.nodeIndex),l=o.renderElement,a=i.name;switch(15&i.flags){case 1:!function(e,t,n,r,o,l){var a=i.securityContext,s=a?e.root.sanitizer.sanitize(a,l):l;s=null!=s?s.toString():null;var u=e.renderer;null!=l?u.setAttribute(n,o,s,r):u.removeAttribute(n,o,r)}(e,0,l,i.ns,a,r);break;case 2:!function(t,n,i,o){var l=e.renderer;r?l.addClass(n,i):l.removeClass(n,i)}(0,l,a);break;case 4:!function(e,t,n,i,o){var l=e.root.sanitizer.sanitize(Sl.STYLE,r);if(null!=l){l=l.toString();var a=t.suffix;null!=a&&(l+=a)}else l=null;var s=e.renderer;null!=l?s.setStyle(n,i,l):s.removeStyle(n,i)}(e,i,l,a);break;case 8:!function(e,t,n,r,o){var l=i.securityContext,a=l?e.root.sanitizer.sanitize(l,o):o;e.renderer.setProperty(n,r,a)}(33554432&t.flags&&32&i.flags?o.componentView:e,0,l,a,r)}return!0}function ht(e,t,n,r){return n=f(n),{index:-1,deps:Qe(r),flags:e,token:t,value:n}}function mt(e){for(var t={},n=0;n<e.length;n++){var r=e[n];r.index=n,t[Pe(r.token)]=r}return{factory:null,providersByKey:t,providers:e}}function gt(e,t,n){if(void 0===n&&(n=yi.THROW_IF_NOT_FOUND),8&t.flags)return t.token;if(2&t.flags&&(n=null),1&t.flags)return e._parent.get(t.token,n);var r=t.tokenKey;switch(r){case Vl:case zl:return e}var i=e._def.providersByKey[r];if(i){var o=e._providers[i.index];return void 0===o&&(o=e._providers[i.index]=yt(e,i)),o===jl?void 0:o}return e._parent.get(t.token,n)}function yt(e,t){var n;switch(201347067&t.flags){case 512:n=function(e,t,n){var r=n.length;switch(r){case 0:return new t;case 1:return new t(gt(e,n[0]));case 2:return new t(gt(e,n[0]),gt(e,n[1]));case 3:return new t(gt(e,n[0]),gt(e,n[1]),gt(e,n[2]));default:for(var i=new Array(r),o=0;o<r;o++)i[o]=gt(e,n[o]);return new(t.bind.apply(t,[void 0].concat(i)))}}(e,t.value,t.deps);break;case 1024:n=function(e,t,n){var r=n.length;switch(r){case 0:return t();case 1:return t(gt(e,n[0]));case 2:return t(gt(e,n[0]),gt(e,n[1]));case 3:return t(gt(e,n[0]),gt(e,n[1]),gt(e,n[2]));default:for(var i=Array(r),o=0;o<r;o++)i[o]=gt(e,n[o]);return t.apply(void 0,i)}}(e,t.value,t.deps);break;case 2048:n=gt(e,t.deps[0]);break;case 256:n=t.value}return void 0===n?jl:n}function vt(e,t){var n=e.viewContainer._embeddedViews;if((null==t||t>=n.length)&&(t=n.length-1),t<0)return null;var r=n[t];return r.viewContainerParent=null,xt(n,t),kl.dirtyParentQueries(r),_t(r),r}function bt(e,t,n){var r=t?qe(t,t.def.lastRenderRootNode):e.renderElement;Je(n,2,n.renderer.parentNode(r),n.renderer.nextSibling(r),void 0)}function _t(e){Je(e,3,null,null,void 0)}function wt(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function xt(e,t){t>=e.length-1?e.pop():e.splice(t,1)}function Ct(e,t,n,r,i,o){return new Hl(e,t,n,r,i,o)}function Et(e){return e.viewDefFactory}function St(e,t,n){return new ql(e,t,n)}function Ot(e){return new Ul(e)}function Tt(e,t){return new Gl(e,t)}function kt(e,t){return new Kl(e,t)}function Dt(e,t){var n=e.def.nodes[t];if(1&n.flags){var r=Oe(e,n.nodeIndex);return n.element.template?r.template:r.renderElement}if(2&n.flags)return Se(e,n.nodeIndex).renderText;if(20240&n.flags)return Te(e,n.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+t)}function It(e){return new $l(e.renderer)}function Rt(e,t,n,r){return new Zl(e,t,n,r)}function Mt(e,t,n,r,i,o,l,a){var s=[];if(l)for(var u in l){var c=l[u];s[c[0]]={flags:8,name:u,nonMinifiedName:c[1],ns:null,securityContext:null,suffix:null}}var d=[];if(a)for(var p in a)d.push({type:1,propName:p,target:null,eventName:a[p]});return t|=16384,At(e,t,n,r,i,i,o,s,d)}function Pt(e,t,n){return e|=16,At(-1,e,null,0,t,t,n)}function Nt(e,t,n,r,i){return At(-1,e,t,0,n,r,i)}function At(e,t,n,r,i,o,l,a,s){var u=Ze(n),c=u.matchedQueries,d=u.references,p=u.matchedQueryIds;s||(s=[]),a||(a=[]),o=f(o);var h=Qe(l);return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:e,flags:t,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:c,matchedQueryIds:p,references:d,ngContentIndex:-1,childCount:r,bindings:a,bindingFlags:ot(a),outputs:s,element:null,provider:{token:i,value:o,deps:h},text:null,query:null,ngContent:null}}function Lt(e,t){return Vt(e,t)}function Ft(e,t){for(var n=e;n.parent&&!Ge(n);)n=n.parent;return zt(n.parent,We(n),!0,t.provider.value,t.provider.deps)}function jt(e,t){var n=zt(e,t.parent,(32768&t.flags)>0,t.provider.value,t.provider.deps);if(t.outputs.length)for(var r=0;r<t.outputs.length;r++){var i=t.outputs[r],o=n[i.propName].subscribe(function(e,t,n){return function(r){return Be(e,t,n,r)}}(e,t.parent.nodeIndex,i.eventName));e.disposables[t.outputIndex+r]=o.unsubscribe.bind(o)}return n}function Vt(e,t){var n=(8192&t.flags)>0,r=t.provider;switch(201347067&t.flags){case 512:return zt(e,t.parent,n,r.value,r.deps);case 1024:return function(e,t,n,r,i){var o=i.length;switch(o){case 0:return r();case 1:return r(Bt(e,t,n,i[0]));case 2:return r(Bt(e,t,n,i[0]),Bt(e,t,n,i[1]));case 3:return r(Bt(e,t,n,i[0]),Bt(e,t,n,i[1]),Bt(e,t,n,i[2]));default:for(var l=Array(o),a=0;a<o;a++)l[a]=Bt(e,t,n,i[a]);return r.apply(void 0,l)}}(e,t.parent,n,r.value,r.deps);case 2048:return Bt(e,t.parent,n,r.deps[0]);case 256:return r.value}}function zt(e,t,n,r,i){var o=i.length;switch(o){case 0:return new r;case 1:return new r(Bt(e,t,n,i[0]));case 2:return new r(Bt(e,t,n,i[0]),Bt(e,t,n,i[1]));case 3:return new r(Bt(e,t,n,i[0]),Bt(e,t,n,i[1]),Bt(e,t,n,i[2]));default:for(var l=new Array(o),a=0;a<o;a++)l[a]=Bt(e,t,n,i[a]);return new(r.bind.apply(r,[void 0].concat(l)))}}function Bt(e,t,n,r,i){if(void 0===i&&(i=yi.THROW_IF_NOT_FOUND),8&r.flags)return r.token;var o=e;2&r.flags&&(i=null);var l=r.tokenKey;for(l===ta&&(n=!(!t||!t.element.componentView)),t&&1&r.flags&&(n=!1,t=t.parent);e;){if(t)switch(l){case Ql:return It(Ht(e,t,n));case Yl:return Ht(e,t,n).renderer;case Xl:return new Bo(Oe(e,t.nodeIndex).renderElement);case Jl:return Oe(e,t.nodeIndex).viewContainer;case ea:if(t.element.template)return Oe(e,t.nodeIndex).template;break;case ta:return Ot(Ht(e,t,n));case na:return kt(e,t);default:var a=(n?t.element.allProviders:t.element.publicProviders)[l];if(a){var s=Te(e,a.nodeIndex);return s||(s={instance:Vt(e,a)},e.nodes[a.nodeIndex]=s),s.instance}}n=Ge(e),t=We(e),e=e.parent}var u=o.root.injector.get(r.token,ra);return u!==ra||i===ra?u:o.root.ngModule.injector.get(r.token,i)}function Ht(e,t,n){var r;if(n)r=Oe(e,t.nodeIndex).componentView;else for(r=e;r.parent&&!Ge(r);)r=r.parent;return r}function Wt(e,t,n,r,i,o){if(32768&n.flags){var l=Oe(e,n.parent.nodeIndex).componentView;2&l.def.flags&&(l.state|=8)}if(t.instance[n.bindings[r].name]=i,524288&n.flags){o=o||{};var a=e.oldValues[n.bindingIndex+r];a instanceof nl&&(a=a.wrapped),o[n.bindings[r].nonMinifiedName]=new il(a,i,0!=(2&e.state))}return e.oldValues[n.bindingIndex+r]=i,o}function qt(e,t){if(e.def.nodeFlags&t)for(var n=e.def.nodes,r=0,i=0;i<n.length;i++){var o=n[i],l=o.parent;for(!l&&o.flags&t&&Ut(e,i,o.flags&t,r++),0==(o.childFlags&t)&&(i+=o.childCount);l&&1&l.flags&&i===l.nodeIndex+l.childCount;)l.directChildFlags&t&&(r=function(e,t,n,r){for(var i=t.nodeIndex+1;i<=t.nodeIndex+t.childCount;i++){var o=e.def.nodes[i];o.flags&n&&Ut(e,i,o.flags&n,r++),i+=o.childCount}return r}(e,l,t,r)),l=l.parent}}function Ut(e,t,n,r){var i=Te(e,t);if(i){var o=i.instance;o&&(kl.setCurrentNode(e,t),1048576&n&&Ee(e,512,r)&&o.ngAfterContentInit(),2097152&n&&o.ngAfterContentChecked(),4194304&n&&Ee(e,768,r)&&o.ngAfterViewInit(),8388608&n&&o.ngAfterViewChecked(),131072&n&&o.ngOnDestroy())}}function Gt(e,t,n){var r=[];for(var i in n)r.push({propName:i,bindingType:n[i]});return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:-1,flags:e,childFlags:0,directChildFlags:0,childMatchedQueries:0,ngContentIndex:-1,matchedQueries:{},matchedQueryIds:0,references:{},childCount:0,bindings:[],bindingFlags:0,outputs:[],element:null,provider:null,text:null,query:{id:t,filterId:$e(t),bindings:r},ngContent:null}}function Kt(){return new qo}function $t(e){for(var t=e.def.nodeMatchedQueries;e.parent&&Ke(e);){var n=e.parentNodeDef;e=e.parent;for(var r=n.nodeIndex+n.childCount,i=0;i<=r;i++)67108864&(o=e.def.nodes[i]).flags&&536870912&o.flags&&(o.query.filterId&t)===o.query.filterId&&De(e,i).setDirty(),!(1&o.flags&&i+o.childCount<n.nodeIndex)&&67108864&o.childFlags&&536870912&o.childFlags||(i+=o.childCount)}if(134217728&e.def.nodeFlags)for(i=0;i<e.def.nodes.length;i++){var o;134217728&(o=e.def.nodes[i]).flags&&536870912&o.flags&&De(e,i).setDirty(),i+=o.childCount}}function Zt(e,t){var n=De(e,t.nodeIndex);if(n.dirty){var r,i=void 0;if(67108864&t.flags){var o=t.parent.parent;i=Qt(e,o.nodeIndex,o.nodeIndex+o.childCount,t.query,[]),r=Te(e,t.parent.nodeIndex).instance}else 134217728&t.flags&&(i=Qt(e,0,e.def.nodes.length-1,t.query,[]),r=e.component);n.reset(i);for(var l=t.query.bindings,a=!1,s=0;s<l.length;s++){var u=l[s],c=void 0;switch(u.bindingType){case 0:c=n.first;break;case 1:c=n,a=!0}r[u.propName]=c}a&&n.notifyOnChanges()}}function Qt(e,t,n,r,i){for(var o=t;o<=n;o++){var l=e.def.nodes[o],a=l.matchedQueries[r.id];if(null!=a&&i.push(Yt(e,l,a)),1&l.flags&&l.element.template&&(l.element.template.nodeMatchedQueries&r.filterId)===r.filterId){var s=Oe(e,o);if((l.childMatchedQueries&r.filterId)===r.filterId&&(Qt(e,o+1,o+l.childCount,r,i),o+=l.childCount),16777216&l.flags)for(var u=s.viewContainer._embeddedViews,c=0;c<u.length;c++){var d=u[c],p=He(d);p&&p===s&&Qt(d,0,d.def.nodes.length-1,r,i)}var f=s.template._projectedViews;if(f)for(c=0;c<f.length;c++){var h=f[c];Qt(h,0,h.def.nodes.length-1,r,i)}}(l.childMatchedQueries&r.filterId)!==r.filterId&&(o+=l.childCount)}return i}function Yt(e,t,n){if(null!=n)switch(n){case 1:return Oe(e,t.nodeIndex).renderElement;case 0:return new Bo(Oe(e,t.nodeIndex).renderElement);case 2:return Oe(e,t.nodeIndex).template;case 3:return Oe(e,t.nodeIndex).viewContainer;case 4:return Te(e,t.nodeIndex).instance}}function Xt(e,t){return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:-1,flags:8,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:e,childCount:0,bindings:[],bindingFlags:0,outputs:[],element:null,provider:null,text:null,query:null,ngContent:{index:t}}}function Jt(e,t,n){var r=Ye(e,t,n);r&&tt(e,n.ngContent.index,1,r,null,void 0)}function en(e,t){return rn(128,e,new Array(t+1))}function tn(e,t){return rn(32,e,new Array(t))}function nn(e,t){for(var n=Object.keys(t),r=n.length,i=new Array(r),o=0;o<r;o++){var l=n[o];i[t[l]]=l}return rn(64,e,i)}function rn(e,t,n){for(var r=new Array(n.length),i=0;i<n.length;i++){var o=n[i];r[i]={flags:8,name:o,ns:null,nonMinifiedName:o,securityContext:null,suffix:null}}return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:t,flags:e,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:-1,childCount:0,bindings:r,bindingFlags:ot(r),outputs:[],element:null,provider:null,text:null,query:null,ngContent:null}}function on(e,t,n){for(var r=new Array(n.length-1),i=1;i<n.length;i++)r[i-1]={flags:8,name:null,ns:null,nonMinifiedName:null,securityContext:null,suffix:n[i]};return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:e,flags:2,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:t,childCount:0,bindings:r,bindingFlags:8,outputs:[],element:null,provider:null,text:{prefix:n[0]},query:null,ngContent:null}}function ln(e,t,n){var r,i=e.renderer;r=i.createText(n.text.prefix);var o=Ye(e,t,n);return o&&i.appendChild(o,r),{renderText:r}}function an(e,t){return(null!=e?e.toString():"")+t.suffix}function sn(e,t,n,r){for(var i=0,o=0,l=0,a=0,s=0,u=null,c=null,d=!1,p=!1,f=null,h=0;h<t.length;h++){var m=t[h];if(m.nodeIndex=h,m.parent=u,m.bindingIndex=i,m.outputIndex=o,m.renderParent=c,l|=m.flags,s|=m.matchedQueryIds,m.element){var g=m.element;g.publicProviders=u?u.element.publicProviders:Object.create(null),g.allProviders=g.publicProviders,d=!1,p=!1,m.element.template&&(s|=m.element.template.nodeMatchedQueries)}if(function(e,t,n){var r=t.element&&t.element.template;if(r){if(!r.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(r.lastRenderRootNode&&16777216&r.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+t.nodeIndex+"!")}if(20224&t.flags&&0==(1&(e?e.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+t.nodeIndex+"!");if(t.query){if(67108864&t.flags&&(!e||0==(16384&e.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+t.nodeIndex+"!");if(134217728&t.flags&&e)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+t.nodeIndex+"!")}if(t.childCount){var i=e?e.nodeIndex+e.childCount:n-1;if(t.nodeIndex<=i&&t.nodeIndex+t.childCount>i)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+t.nodeIndex+"!")}}(u,m,t.length),i+=m.bindings.length,o+=m.outputs.length,!c&&3&m.flags&&(f=m),20224&m.flags){d||(d=!0,u.element.publicProviders=Object.create(u.element.publicProviders),u.element.allProviders=u.element.publicProviders);var y=0!=(32768&m.flags);0==(8192&m.flags)||y?u.element.publicProviders[Pe(m.provider.token)]=m:(p||(p=!0,u.element.allProviders=Object.create(u.element.publicProviders)),u.element.allProviders[Pe(m.provider.token)]=m),y&&(u.element.componentProvider=m)}if(u?(u.childFlags|=m.flags,u.directChildFlags|=m.flags,u.childMatchedQueries|=m.matchedQueryIds,m.element&&m.element.template&&(u.childMatchedQueries|=m.element.template.nodeMatchedQueries)):a|=m.flags,m.childCount>0)u=m,un(m)||(c=m);else for(;u&&h===u.nodeIndex+u.childCount;){var v=u.parent;v&&(v.childFlags|=u.childFlags,v.childMatchedQueries|=u.childMatchedQueries),c=(u=v)&&un(u)?u.renderParent:u}}return{factory:null,nodeFlags:l,rootNodeFlags:a,nodeMatchedQueries:s,flags:e,nodes:t,updateDirectives:n||Dl,updateRenderer:r||Dl,handleEvent:function(e,n,r,i){return t[n].element.handleEvent(e,r,i)},bindingCount:i,outputCount:o,lastRenderRootNode:f}}function un(e){return 0!=(1&e.flags)&&null===e.element.name}function cn(e,t,n,r){var i=fn(e.root,e.renderer,e,t,n);return hn(i,e.component,r),mn(i),i}function dn(e,t,n){var r=fn(e,e.renderer,null,null,t);return hn(r,n,n),mn(r),r}function pn(e,t,n,r){var i,o=t.element.componentRendererType;return i=o?e.root.rendererFactory.createRenderer(r,o):e.root.renderer,fn(e.root,i,e,t.element.componentProvider,n)}function fn(e,t,n,r,i){var o=new Array(i.nodes.length),l=i.outputCount?new Array(i.outputCount):null;return{def:i,parent:n,viewContainerParent:null,parentNodeDef:r,context:null,component:null,nodes:o,state:13,root:e,renderer:t,oldValues:new Array(i.bindingCount),disposables:l,initIndex:-1}}function hn(e,t,n){e.component=t,e.context=n}function mn(e){var t;Ge(e)&&(t=Oe(e.parent,e.parentNodeDef.parent.nodeIndex).renderElement);for(var n=e.def,r=e.nodes,i=0;i<n.nodes.length;i++){var o=n.nodes[i];kl.setCurrentNode(e,i);var l=void 0;switch(201347067&o.flags){case 1:var a=dt(e,t,o),s=void 0;if(33554432&o.flags){var u=Xe(o.element.componentView);s=kl.createComponentView(e,o,u,a)}pt(e,s,o,a),l={renderElement:a,componentView:s,viewContainer:null,template:o.element.template?Tt(e,o):void 0},16777216&o.flags&&(l.viewContainer=St(e,o,l));break;case 2:l=ln(e,t,o);break;case 512:case 1024:case 2048:case 256:(l=r[i])||4096&o.flags||(l={instance:Lt(e,o)});break;case 16:l={instance:Ft(e,o)};break;case 16384:(l=r[i])||(l={instance:jt(e,o)}),32768&o.flags&&hn(Oe(e,o.parent.nodeIndex).componentView,l.instance,l.instance);break;case 32:case 64:case 128:l={value:void 0};break;case 67108864:case 134217728:l=Kt();break;case 8:Jt(e,t,o),l=void 0}r[i]=l}Cn(e,ia.CreateViewNodes),Tn(e,201326592,268435456,0)}function gn(e){bn(e),kl.updateDirectives(e,1),En(e,ia.CheckNoChanges),kl.updateRenderer(e,1),Cn(e,ia.CheckNoChanges),e.state&=-97}function yn(e){1&e.state?(e.state&=-2,e.state|=2):e.state&=-3,Ce(e,0,256),bn(e),kl.updateDirectives(e,0),En(e,ia.CheckAndUpdate),Tn(e,67108864,536870912,0);var t=Ce(e,256,512);qt(e,2097152|(t?1048576:0)),kl.updateRenderer(e,0),Cn(e,ia.CheckAndUpdate),Tn(e,134217728,536870912,0),qt(e,8388608|((t=Ce(e,512,768))?4194304:0)),2&e.def.flags&&(e.state&=-9),e.state&=-97,Ce(e,768,1024)}function vn(e,t,n,r,i,o,l,a,s,u,c,d,p){return 0===n?function(e,t,n,r,i,o,l,a,s,u,c,d){switch(201347067&t.flags){case 1:return function(e,t,r,i,o,l,a,s,u,c,d,p){var f=t.bindings.length,h=!1;return f>0&&ft(e,t,0,n)&&(h=!0),f>1&&ft(e,t,1,i)&&(h=!0),f>2&&ft(e,t,2,o)&&(h=!0),f>3&&ft(e,t,3,l)&&(h=!0),f>4&&ft(e,t,4,a)&&(h=!0),f>5&&ft(e,t,5,s)&&(h=!0),f>6&&ft(e,t,6,u)&&(h=!0),f>7&&ft(e,t,7,c)&&(h=!0),f>8&&ft(e,t,8,d)&&(h=!0),f>9&&ft(e,t,9,p)&&(h=!0),h}(e,t,0,r,i,o,l,a,s,u,c,d);case 2:return function(e,t,n,r,i,o,l,a,s,u,c,d){var p=!1,f=t.bindings,h=f.length;if(h>0&&Fe(e,t,0,n)&&(p=!0),h>1&&Fe(e,t,1,r)&&(p=!0),h>2&&Fe(e,t,2,i)&&(p=!0),h>3&&Fe(e,t,3,o)&&(p=!0),h>4&&Fe(e,t,4,l)&&(p=!0),h>5&&Fe(e,t,5,a)&&(p=!0),h>6&&Fe(e,t,6,s)&&(p=!0),h>7&&Fe(e,t,7,u)&&(p=!0),h>8&&Fe(e,t,8,c)&&(p=!0),h>9&&Fe(e,t,9,d)&&(p=!0),p){var m=t.text.prefix;h>0&&(m+=an(n,f[0])),h>1&&(m+=an(r,f[1])),h>2&&(m+=an(i,f[2])),h>3&&(m+=an(o,f[3])),h>4&&(m+=an(l,f[4])),h>5&&(m+=an(a,f[5])),h>6&&(m+=an(s,f[6])),h>7&&(m+=an(u,f[7])),h>8&&(m+=an(c,f[8])),h>9&&(m+=an(d,f[9]));var g=Se(e,t.nodeIndex).renderText;e.renderer.setValue(g,m)}return p}(e,t,n,r,i,o,l,a,s,u,c,d);case 16384:return function(e,t,n,r,i,o,l,a,s,u,c,d){var p=Te(e,t.nodeIndex),f=p.instance,h=!1,m=void 0,g=t.bindings.length;return g>0&&Le(e,t,0,n)&&(h=!0,m=Wt(e,p,t,0,n,m)),g>1&&Le(e,t,1,r)&&(h=!0,m=Wt(e,p,t,1,r,m)),g>2&&Le(e,t,2,i)&&(h=!0,m=Wt(e,p,t,2,i,m)),g>3&&Le(e,t,3,o)&&(h=!0,m=Wt(e,p,t,3,o,m)),g>4&&Le(e,t,4,l)&&(h=!0,m=Wt(e,p,t,4,l,m)),g>5&&Le(e,t,5,a)&&(h=!0,m=Wt(e,p,t,5,a,m)),g>6&&Le(e,t,6,s)&&(h=!0,m=Wt(e,p,t,6,s,m)),g>7&&Le(e,t,7,u)&&(h=!0,m=Wt(e,p,t,7,u,m)),g>8&&Le(e,t,8,c)&&(h=!0,m=Wt(e,p,t,8,c,m)),g>9&&Le(e,t,9,d)&&(h=!0,m=Wt(e,p,t,9,d,m)),m&&f.ngOnChanges(m),65536&t.flags&&Ee(e,256,t.nodeIndex)&&f.ngOnInit(),262144&t.flags&&f.ngDoCheck(),h}(e,t,n,r,i,o,l,a,s,u,c,d);case 32:case 64:case 128:return function(e,t,n,r,i,o,l,a,s,u,c,d){var p=t.bindings,f=!1,h=p.length;if(h>0&&Fe(e,t,0,n)&&(f=!0),h>1&&Fe(e,t,1,r)&&(f=!0),h>2&&Fe(e,t,2,i)&&(f=!0),h>3&&Fe(e,t,3,o)&&(f=!0),h>4&&Fe(e,t,4,l)&&(f=!0),h>5&&Fe(e,t,5,a)&&(f=!0),h>6&&Fe(e,t,6,s)&&(f=!0),h>7&&Fe(e,t,7,u)&&(f=!0),h>8&&Fe(e,t,8,c)&&(f=!0),h>9&&Fe(e,t,9,d)&&(f=!0),f){var m=ke(e,t.nodeIndex),g=void 0;switch(201347067&t.flags){case 32:g=new Array(p.length),h>0&&(g[0]=n),h>1&&(g[1]=r),h>2&&(g[2]=i),h>3&&(g[3]=o),h>4&&(g[4]=l),h>5&&(g[5]=a),h>6&&(g[6]=s),h>7&&(g[7]=u),h>8&&(g[8]=c),h>9&&(g[9]=d);break;case 64:g={},h>0&&(g[p[0].name]=n),h>1&&(g[p[1].name]=r),h>2&&(g[p[2].name]=i),h>3&&(g[p[3].name]=o),h>4&&(g[p[4].name]=l),h>5&&(g[p[5].name]=a),h>6&&(g[p[6].name]=s),h>7&&(g[p[7].name]=u),h>8&&(g[p[8].name]=c),h>9&&(g[p[9].name]=d);break;case 128:var y=n;switch(h){case 1:g=y.transform(n);break;case 2:g=y.transform(r);break;case 3:g=y.transform(r,i);break;case 4:g=y.transform(r,i,o);break;case 5:g=y.transform(r,i,o,l);break;case 6:g=y.transform(r,i,o,l,a);break;case 7:g=y.transform(r,i,o,l,a,s);break;case 8:g=y.transform(r,i,o,l,a,s,u);break;case 9:g=y.transform(r,i,o,l,a,s,u,c);break;case 10:g=y.transform(r,i,o,l,a,s,u,c,d)}}m.value=g}return f}(e,t,n,r,i,o,l,a,s,u,c,d);default:throw"unreachable"}}(e,t,r,i,o,l,a,s,u,c,d,p):function(e,t,n){switch(201347067&t.flags){case 1:return function(e,t,n){for(var r=!1,i=0;i<n.length;i++)ft(e,t,i,n[i])&&(r=!0);return r}(e,t,n);case 2:return function(e,t,n){for(var r=t.bindings,i=!1,o=0;o<n.length;o++)Fe(e,t,o,n[o])&&(i=!0);if(i){var l="";for(o=0;o<n.length;o++)l+=an(n[o],r[o]);l=t.text.prefix+l;var a=Se(e,t.nodeIndex).renderText;e.renderer.setValue(a,l)}return i}(e,t,n);case 16384:return function(e,t,n){for(var r=Te(e,t.nodeIndex),i=r.instance,o=!1,l=void 0,a=0;a<n.length;a++)Le(e,t,a,n[a])&&(o=!0,l=Wt(e,r,t,a,n[a],l));return l&&i.ngOnChanges(l),65536&t.flags&&Ee(e,256,t.nodeIndex)&&i.ngOnInit(),262144&t.flags&&i.ngDoCheck(),o}(e,t,n);case 32:case 64:case 128:return function(e,t,n){for(var r=t.bindings,i=!1,o=0;o<n.length;o++)Fe(e,t,o,n[o])&&(i=!0);if(i){var l=ke(e,t.nodeIndex),a=void 0;switch(201347067&t.flags){case 32:a=n;break;case 64:for(a={},o=0;o<n.length;o++)a[r[o].name]=n[o];break;case 128:var s=n[0],u=n.slice(1);a=s.transform.apply(s,u)}l.value=a}return i}(e,t,n);default:throw"unreachable"}}(e,t,r)}function bn(e){var t=e.def;if(4&t.nodeFlags)for(var n=0;n<t.nodes.length;n++){var r=t.nodes[n];if(4&r.flags){var i=Oe(e,n).template._projectedViews;if(i)for(var o=0;o<i.length;o++){var l=i[o];l.state|=32,ze(l,e)}}else 0==(4&r.childFlags)&&(n+=r.childCount)}}function _n(e,t,n,r,i,o,l,a,s,u,c,d,p){return 0===n?function(e,t,n,i,o,l,a,s,u,c,d,p){var f=t.bindings.length;f>0&&je(e,t,0,r),f>1&&je(e,t,1,i),f>2&&je(e,t,2,o),f>3&&je(e,t,3,l),f>4&&je(e,t,4,a),f>5&&je(e,t,5,s),f>6&&je(e,t,6,u),f>7&&je(e,t,7,c),f>8&&je(e,t,8,d),f>9&&je(e,t,9,p)}(e,t,0,i,o,l,a,s,u,c,d,p):function(e,t,n){for(var r=0;r<n.length;r++)je(e,t,r,n[r])}(e,t,r),!1}function wn(e,t){if(De(e,t.nodeIndex).dirty)throw Ie(kl.createDebugContext(e,t.nodeIndex),"Query "+t.query.id+" not dirty","Query "+t.query.id+" dirty",0!=(1&e.state))}function xn(e){if(!(128&e.state)){if(En(e,ia.Destroy),Cn(e,ia.Destroy),qt(e,131072),e.disposables)for(var t=0;t<e.disposables.length;t++)e.disposables[t]();!function(e){if(16&e.state){var t=He(e);if(t){var n=t.template._projectedViews;n&&(xt(n,n.indexOf(e)),kl.dirtyParentQueries(e))}}}(e),e.renderer.destroyNode&&function(e){for(var t=e.def.nodes.length,n=0;n<t;n++){var r=e.def.nodes[n];1&r.flags?e.renderer.destroyNode(Oe(e,n).renderElement):2&r.flags?e.renderer.destroyNode(Se(e,n).renderText):(67108864&r.flags||134217728&r.flags)&&De(e,n).destroy()}}(e),Ge(e)&&e.renderer.destroy(),e.state|=128}}function Cn(e,t){var n=e.def;if(33554432&n.nodeFlags)for(var r=0;r<n.nodes.length;r++){var i=n.nodes[r];33554432&i.flags?Sn(Oe(e,r).componentView,t):0==(33554432&i.childFlags)&&(r+=i.childCount)}}function En(e,t){var n=e.def;if(16777216&n.nodeFlags)for(var r=0;r<n.nodes.length;r++){var i=n.nodes[r];if(16777216&i.flags)for(var o=Oe(e,r).viewContainer._embeddedViews,l=0;l<o.length;l++)Sn(o[l],t);else 0==(16777216&i.childFlags)&&(r+=i.childCount)}}function Sn(e,t){var n=e.state;switch(t){case ia.CheckNoChanges:0==(128&n)&&(12==(12&n)?gn(e):64&n&&On(e,ia.CheckNoChangesProjectedViews));break;case ia.CheckNoChangesProjectedViews:0==(128&n)&&(32&n?gn(e):64&n&&On(e,t));break;case ia.CheckAndUpdate:0==(128&n)&&(12==(12&n)?yn(e):64&n&&On(e,ia.CheckAndUpdateProjectedViews));break;case ia.CheckAndUpdateProjectedViews:0==(128&n)&&(32&n?yn(e):64&n&&On(e,t));break;case ia.Destroy:xn(e);break;case ia.CreateViewNodes:mn(e)}}function On(e,t){En(e,t),Cn(e,t)}function Tn(e,t,n,r){if(e.def.nodeFlags&t&&e.def.nodeFlags&n)for(var i=e.def.nodes.length,o=0;o<i;o++){var l=e.def.nodes[o];if(l.flags&t&&l.flags&n)switch(kl.setCurrentNode(e,l.nodeIndex),r){case 0:Zt(e,l);break;case 1:wn(e,l)}l.childFlags&t&&l.childFlags&n||(o+=l.childCount)}}function kn(){if(!oa){oa=!0;var e=J()?{setCurrentNode:qn,createRootView:In,createEmbeddedView:Mn,createComponentView:Pn,createNgModuleRef:Nn,overrideProvider:An,overrideComponentView:Ln,clearOverrides:Fn,checkAndUpdateView:Bn,checkNoChangesView:Hn,destroyView:Wn,createDebugContext:function(e,t){return new ca(e,t)},handleEvent:Un,updateDirectives:Gn,updateRenderer:Kn}:{setCurrentNode:function(){},createRootView:Dn,createEmbeddedView:cn,createComponentView:pn,createNgModuleRef:Rt,overrideProvider:Dl,overrideComponentView:Dl,clearOverrides:Dl,checkAndUpdateView:yn,checkNoChangesView:gn,destroyView:xn,createDebugContext:function(e,t){return new ca(e,t)},handleEvent:function(e,t,n,r){return e.def.handleEvent(e,t,n,r)},updateDirectives:function(e,t){return e.def.updateDirectives(0===t?Vn:zn,e)},updateRenderer:function(e,t){return e.def.updateRenderer(0===t?Vn:zn,e)}};kl.setCurrentNode=e.setCurrentNode,kl.createRootView=e.createRootView,kl.createEmbeddedView=e.createEmbeddedView,kl.createComponentView=e.createComponentView,kl.createNgModuleRef=e.createNgModuleRef,kl.overrideProvider=e.overrideProvider,kl.overrideComponentView=e.overrideComponentView,kl.clearOverrides=e.clearOverrides,kl.checkAndUpdateView=e.checkAndUpdateView,kl.checkNoChangesView=e.checkNoChangesView,kl.destroyView=e.destroyView,kl.resolveDep=Bt,kl.createDebugContext=e.createDebugContext,kl.handleEvent=e.handleEvent,kl.updateDirectives=e.updateDirectives,kl.updateRenderer=e.updateRenderer,kl.dirtyParentQueries=$t}}function Dn(e,t,n,r,i,o){return dn(Rn(e,i,i.injector.get(jo),t,n),r,o)}function In(e,t,n,r,i,o){var l=i.injector.get(jo),a=Rn(e,i,new da(l),t,n),s=jn(r);return Jn(sa.create,dn,null,[a,s,o])}function Rn(e,t,n,r,i){var o=t.injector.get(Ol),l=t.injector.get(Pi);return{ngModule:t,injector:e,projectableNodes:r,selectorOrNode:i,sanitizer:o,rendererFactory:n,renderer:n.createRenderer(null,null),errorHandler:l}}function Mn(e,t,n,r){var i=jn(n);return Jn(sa.create,cn,null,[e,t,i,r])}function Pn(e,t,n,r){return n=aa.get(t.element.componentProvider.provider.token)||jn(n),Jn(sa.create,pn,null,[e,t,n,r])}function Nn(e,t,n,r){return Rt(e,t,n,function(e){var t=function(t){var n=!1,r=!1;return 0===la.size?{hasOverrides:n,hasDeprecatedOverrides:r}:(e.providers.forEach(function(e){var t=la.get(e.token);3840&e.flags&&t&&(n=!0,r=r||t.deprecatedBehavior)}),{hasOverrides:n,hasDeprecatedOverrides:r})}(),n=t.hasDeprecatedOverrides;return t.hasOverrides?(e=e.factory(function(){return Dl}),function(e){for(var t=0;t<e.providers.length;t++){var r=e.providers[t];n&&(r.flags|=4096);var i=la.get(r.token);i&&(r.flags=-3841&r.flags|i.flags,r.deps=Qe(i.deps),r.value=i.value)}}(e),e):e}(r))}function An(e){la.set(e.token,e)}function Ln(e,t){var n=Xe(Xe(Et(t)).nodes[0].element.componentView);aa.set(e,n)}function Fn(){la.clear(),aa.clear()}function jn(e){if(0===la.size)return e;var t=function(e){for(var t=[],n=null,r=0;r<e.nodes.length;r++){var i=e.nodes[r];1&i.flags&&(n=i),n&&3840&i.flags&&la.has(i.provider.token)&&(t.push(n.nodeIndex),n=null)}return t}(e);if(0===t.length)return e;e=e.factory(function(){return Dl});for(var n=0;n<t.length;n++)!function(e,r){for(var i=t[n]+1;i<e.nodes.length;i++){var o=e.nodes[i];if(1&o.flags)return;if(3840&o.flags){var l=o.provider,a=la.get(l.token);a&&(o.flags=-3841&o.flags|a.flags,l.deps=Qe(a.deps),l.value=a.value)}}}(e);return e}function Vn(e,t,n,r,i,o,l,a,s,u,c,d,p){var f=e.def.nodes[t];return vn(e,f,n,r,i,o,l,a,s,u,c,d,p),224&f.flags?ke(e,t).value:void 0}function zn(e,t,n,r,i,o,l,a,s,u,c,d,p){var f=e.def.nodes[t];return _n(e,f,n,r,i,o,l,a,s,u,c,d,p),224&f.flags?ke(e,t).value:void 0}function Bn(e){return Jn(sa.detectChanges,yn,null,[e])}function Hn(e){return Jn(sa.checkNoChanges,gn,null,[e])}function Wn(e){return Jn(sa.destroy,xn,null,[e])}function qn(e,t){Sr=e,Or=t}function Un(e,t,n,r){return qn(e,t),Jn(sa.handleEvent,e.def.handleEvent,null,[e,t,n,r])}function Gn(e,t){if(128&e.state)throw Me(sa[Er]);return qn(e,Qn(e,0)),e.def.updateDirectives(function(e,n,r){for(var i=[],o=3;o<arguments.length;o++)i[o-3]=arguments[o];var l=e.def.nodes[n];return 0===t?$n(e,l,r,i):Zn(e,l,r,i),16384&l.flags&&qn(e,Qn(e,n)),224&l.flags?ke(e,l.nodeIndex).value:void 0},e)}function Kn(e,t){if(128&e.state)throw Me(sa[Er]);return qn(e,Yn(e,0)),e.def.updateRenderer(function(e,n,r){for(var i=[],o=3;o<arguments.length;o++)i[o-3]=arguments[o];var l=e.def.nodes[n];return 0===t?$n(e,l,r,i):Zn(e,l,r,i),3&l.flags&&qn(e,Yn(e,n)),224&l.flags?ke(e,l.nodeIndex).value:void 0},e)}function $n(e,t,n,r){if(vn.apply(void 0,[e,t,n].concat(r))){var i=1===n?r[0]:r;if(16384&t.flags){for(var o={},l=0;l<t.bindings.length;l++){var a=t.bindings[l],s=i[l];8&a.flags&&(o[function(e){return"ng-reflect-"+(e=e.replace(/[$@]/g,"_").replace(ua,function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return"-"+e[1].toLowerCase()}))}(a.nonMinifiedName)]=function(e){try{return null!=e?e.toString().slice(0,30):e}catch(e){return"[ERROR] Exception while trying to serialize the value"}}(s))}var u=t.parent,c=Oe(e,u.nodeIndex).renderElement;if(u.element.name)for(var d in o)null!=(s=o[d])?e.renderer.setAttribute(c,d,s):e.renderer.removeAttribute(c,d);else e.renderer.setValue(c,"bindings="+JSON.stringify(o,null,2))}}}function Zn(e,t,n,r){_n.apply(void 0,[e,t,n].concat(r))}function Qn(e,t){for(var n=t;n<e.def.nodes.length;n++){var r=e.def.nodes[n];if(16384&r.flags&&r.bindings&&r.bindings.length)return n}return null}function Yn(e,t){for(var n=t;n<e.def.nodes.length;n++){var r=e.def.nodes[n];if(3&r.flags&&r.bindings&&r.bindings.length)return n}return null}function Xn(e,t,n){for(var r in t.references)n[r]=Yt(e,t,t.references[r])}function Jn(e,t,n,r){var i=Er,o=Sr,l=Or;try{Er=e;var a=t.apply(n,r);return Sr=o,Or=l,Er=i,a}catch(e){if(b(e)||!Sr)throw e;throw function(e,t){return e instanceof Error||(e=new Error(e.toString())),Re(e,t),e}(e,er())}}function er(){return Sr?new ca(Sr,Or):null}function tr(e){return kn(),kl.overrideProvider(e)}function nr(e,t){return kn(),kl.overrideComponentView(e,t)}function rr(){return kn(),kl.clearOverrides()}function ir(e,t,n){return new fa(e,t,n)}function or(e,t){return{type:7,name:e,definitions:t,options:{}}}function lr(e,t){return void 0===t&&(t=null),{type:4,styles:t,timings:e}}function ar(e,t){return void 0===t&&(t=null),{type:3,steps:e,options:t}}function sr(e,t){return void 0===t&&(t=null),{type:2,steps:e,options:t}}function ur(e){return{type:6,styles:e,offset:null}}function cr(e,t,n){return{type:0,name:e,styles:t,options:n}}function dr(e){return{type:5,steps:e}}function pr(e,t,n){return void 0===n&&(n=null),{type:1,expr:e,animation:t,options:n}}function fr(e,t){return or(e,t)}function hr(e,t){return lr(e,t)}function mr(e){return ar(e)}function gr(e){return sr(e)}function yr(e){return ur(e)}function vr(e,t){return cr(e,t)}function br(e){return dr(e)}function _r(e,t){return pr(e,t)}n.d(t,"createPlatform",function(){return ee}),n.d(t,"assertPlatform",function(){return ne}),n.d(t,"destroyPlatform",function(){return re}),n.d(t,"getPlatform",function(){return ie}),n.d(t,"PlatformRef",function(){return Mo}),n.d(t,"ApplicationRef",function(){return Po}),n.d(t,"enableProdMode",function(){return X}),n.d(t,"isDevMode",function(){return J}),n.d(t,"createPlatformFactory",function(){return te}),n.d(t,"NgProbeToken",function(){return Ro}),n.d(t,"APP_ID",function(){return Zi}),n.d(t,"PACKAGE_ROOT_URL",function(){return eo}),n.d(t,"PLATFORM_INITIALIZER",function(){return Yi}),n.d(t,"PLATFORM_ID",function(){return Xi}),n.d(t,"APP_BOOTSTRAP_LISTENER",function(){return Ji}),n.d(t,"APP_INITIALIZER",function(){return Ki}),n.d(t,"ApplicationInitStatus",function(){return $i}),n.d(t,"DebugElement",function(){return el}),n.d(t,"DebugNode",function(){return Jo}),n.d(t,"asNativeElements",function(){return de}),n.d(t,"getDebugNode",function(){return he}),n.d(t,"Testability",function(){return So}),n.d(t,"TestabilityRegistry",function(){return Oo}),n.d(t,"setTestabilityGetter",function(){return Y}),n.d(t,"TRANSLATIONS",function(){return wl}),n.d(t,"TRANSLATIONS_FORMAT",function(){return xl}),n.d(t,"LOCALE_ID",function(){return _l}),n.d(t,"MissingTranslationStrategy",function(){return Cl}),n.d(t,"ApplicationModule",function(){return El}),n.d(t,"wtfCreateScope",function(){return yo}),n.d(t,"wtfLeave",function(){return vo}),n.d(t,"wtfStartTimeRange",function(){return bo}),n.d(t,"wtfEndTimeRange",function(){return _o}),n.d(t,"Type",function(){return Li}),n.d(t,"EventEmitter",function(){return wo}),n.d(t,"ErrorHandler",function(){return Pi}),n.d(t,"Sanitizer",function(){return Ol}),n.d(t,"SecurityContext",function(){return Sl}),n.d(t,"ANALYZE_FOR_ENTRY_COMPONENTS",function(){return Lr}),n.d(t,"Attribute",function(){return Fr}),n.d(t,"ContentChild",function(){return zr}),n.d(t,"ContentChildren",function(){return Vr}),n.d(t,"Query",function(){return jr}),n.d(t,"ViewChild",function(){return Hr}),n.d(t,"ViewChildren",function(){return Br}),n.d(t,"Component",function(){return Gr}),n.d(t,"Directive",function(){return Ur}),n.d(t,"HostBinding",function(){return Qr}),n.d(t,"HostListener",function(){return Yr}),n.d(t,"Input",function(){return $r}),n.d(t,"Output",function(){return Zr}),n.d(t,"Pipe",function(){return Kr}),n.d(t,"CUSTOM_ELEMENTS_SCHEMA",function(){return Xr}),n.d(t,"NO_ERRORS_SCHEMA",function(){return Jr}),n.d(t,"NgModule",function(){return ei}),n.d(t,"ViewEncapsulation",function(){return ti}),n.d(t,"Version",function(){return ni}),n.d(t,"VERSION",function(){return ri}),n.d(t,"forwardRef",function(){return p}),n.d(t,"resolveForwardRef",function(){return f}),n.d(t,"Injector",function(){return yi}),n.d(t,"ReflectiveInjector",function(){return Ui}),n.d(t,"ResolvedReflectiveFactory",function(){return Wi}),n.d(t,"ReflectiveKey",function(){return Ni}),n.d(t,"InjectionToken",function(){return Mr}),n.d(t,"Inject",function(){return ii}),n.d(t,"Optional",function(){return oi}),n.d(t,"Injectable",function(){return li}),n.d(t,"Self",function(){return ai}),n.d(t,"SkipSelf",function(){return si}),n.d(t,"Host",function(){return ui}),n.d(t,"NgZone",function(){return xo}),n.d(t,"RenderComponentType",function(){return No}),n.d(t,"Renderer",function(){return Lo}),n.d(t,"Renderer2",function(){return zo}),n.d(t,"RendererFactory2",function(){return jo}),n.d(t,"RendererStyleFlags2",function(){return Vo}),n.d(t,"RootRenderer",function(){return Fo}),n.d(t,"COMPILER_OPTIONS",function(){return io}),n.d(t,"Compiler",function(){return ro}),n.d(t,"CompilerFactory",function(){return oo}),n.d(t,"ModuleWithComponentFactories",function(){return no}),n.d(t,"ComponentFactory",function(){return ao}),n.d(t,"ComponentRef",function(){return lo}),n.d(t,"ComponentFactoryResolver",function(){return co}),n.d(t,"ElementRef",function(){return Bo}),n.d(t,"NgModuleFactory",function(){return mo}),n.d(t,"NgModuleRef",function(){return ho}),n.d(t,"NgModuleFactoryLoader",function(){return Ho}),n.d(t,"getModuleFactory",function(){return se}),n.d(t,"QueryList",function(){return qo}),n.d(t,"SystemJsNgModuleLoader",function(){return Ko}),n.d(t,"SystemJsNgModuleLoaderConfig",function(){return Uo}),n.d(t,"TemplateRef",function(){return $o}),n.d(t,"ViewContainerRef",function(){return Zo}),n.d(t,"EmbeddedViewRef",function(){return Xo}),n.d(t,"ViewRef",function(){return Yo}),n.d(t,"ChangeDetectionStrategy",function(){return Wr}),n.d(t,"ChangeDetectorRef",function(){return Qo}),n.d(t,"DefaultIterableDiffer",function(){return al}),n.d(t,"IterableDiffers",function(){return hl}),n.d(t,"KeyValueDiffers",function(){return ml}),n.d(t,"SimpleChange",function(){return il}),n.d(t,"WrappedValue",function(){return nl}),n.d(t,"platformCore",function(){return bl}),n.d(t,"\u0275ALLOW_MULTIPLE_PLATFORMS",function(){return Io}),n.d(t,"\u0275APP_ID_RANDOM_PROVIDER",function(){return Qi}),n.d(t,"\u0275ValueUnwrapper",function(){return rl}),n.d(t,"\u0275devModeEqual",function(){return ge}),n.d(t,"\u0275isListLikeIterable",function(){return ye}),n.d(t,"\u0275ChangeDetectorStatus",function(){return qr}),n.d(t,"\u0275isDefaultChangeDetectionStrategy",function(){return a}),n.d(t,"\u0275Console",function(){return to}),n.d(t,"\u0275ComponentFactory",function(){return ao}),n.d(t,"\u0275CodegenComponentFactoryResolver",function(){return po}),n.d(t,"\u0275ReflectionCapabilities",function(){return ji}),n.d(t,"\u0275RenderDebugInfo",function(){return Ao}),n.d(t,"\u0275global",function(){return pi}),n.d(t,"\u0275looseIdentical",function(){return c}),n.d(t,"\u0275stringify",function(){return d}),n.d(t,"\u0275makeDecorator",function(){return r}),n.d(t,"\u0275isObservable",function(){return L}),n.d(t,"\u0275isPromise",function(){return A}),n.d(t,"\u0275clearOverrides",function(){return rr}),n.d(t,"\u0275overrideComponentView",function(){return nr}),n.d(t,"\u0275overrideProvider",function(){return tr}),n.d(t,"\u0275NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR",function(){return ra}),n.d(t,"\u0275registerModuleFactory",function(){return ae}),n.d(t,"\u0275EMPTY_ARRAY",function(){return Ll}),n.d(t,"\u0275EMPTY_MAP",function(){return Fl}),n.d(t,"\u0275and",function(){return ut}),n.d(t,"\u0275ccf",function(){return Ct}),n.d(t,"\u0275cmf",function(){return ir}),n.d(t,"\u0275crt",function(){return Ae}),n.d(t,"\u0275did",function(){return Mt}),n.d(t,"\u0275eld",function(){return ct}),n.d(t,"\u0275elementEventFullName",function(){return Ue}),n.d(t,"\u0275getComponentViewDefinitionFactory",function(){return Et}),n.d(t,"\u0275inlineInterpolate",function(){return at}),n.d(t,"\u0275interpolate",function(){return lt}),n.d(t,"\u0275mod",function(){return mt}),n.d(t,"\u0275mpd",function(){return ht}),n.d(t,"\u0275ncd",function(){return Xt}),n.d(t,"\u0275nov",function(){return Dt}),n.d(t,"\u0275pid",function(){return Pt}),n.d(t,"\u0275prd",function(){return Nt}),n.d(t,"\u0275pad",function(){return tn}),n.d(t,"\u0275pod",function(){return nn}),n.d(t,"\u0275ppd",function(){return en}),n.d(t,"\u0275qud",function(){return Gt}),n.d(t,"\u0275ted",function(){return on}),n.d(t,"\u0275unv",function(){return Ne}),n.d(t,"\u0275vid",function(){return sn}),n.d(t,"AUTO_STYLE",function(){return ha}),n.d(t,"trigger",function(){return fr}),n.d(t,"animate",function(){return hr}),n.d(t,"group",function(){return mr}),n.d(t,"sequence",function(){return gr}),n.d(t,"style",function(){return yr}),n.d(t,"state",function(){return vr}),n.d(t,"keyframes",function(){return br}),n.d(t,"transition",function(){return _r}),n.d(t,"\u0275x",function(){return lr}),n.d(t,"\u0275y",function(){return ar}),n.d(t,"\u0275bc",function(){return dr}),n.d(t,"\u0275z",function(){return sr}),n.d(t,"\u0275bb",function(){return cr}),n.d(t,"\u0275ba",function(){return ur}),n.d(t,"\u0275bd",function(){return pr}),n.d(t,"\u0275w",function(){return or}),n.d(t,"\u0275k",function(){return _e}),n.d(t,"\u0275l",function(){return we}),n.d(t,"\u0275m",function(){return xe}),n.d(t,"\u0275f",function(){return F}),n.d(t,"\u0275g",function(){return yl}),n.d(t,"\u0275h",function(){return vl}),n.d(t,"\u0275i",function(){return ol}),n.d(t,"\u0275j",function(){return dl}),n.d(t,"\u0275b",function(){return Di}),n.d(t,"\u0275c",function(){return Gi}),n.d(t,"\u0275d",function(){return zi}),n.d(t,"\u0275e",function(){return I}),n.d(t,"\u0275n",function(){return go}),n.d(t,"\u0275p",function(){return H}),n.d(t,"\u0275o",function(){return B}),n.d(t,"\u0275s",function(){return U}),n.d(t,"\u0275q",function(){return W}),n.d(t,"\u0275r",function(){return q}),n.d(t,"\u0275a",function(){return o}),n.d(t,"\u0275t",function(){return At}),n.d(t,"\u0275u",function(){return Tl});var wr,xr,Cr,Er,Sr,Or,Tr=n("6Xbx"),kr=n("AP4T"),Dr=n("2kLc"),Ir=n("URbD"),Rr=n("TO51"),Mr=function(){function e(e){this._desc=e,this.ngMetadataName="InjectionToken"}return e.prototype.toString=function(){return"InjectionToken "+this._desc},e}(),Pr="__annotations__",Nr="__paramaters__",Ar="__prop__metadata__",Lr=new Mr("AnalyzeForEntryComponents"),Fr=o("Attribute",function(e){return{attributeName:e}}),jr=function(){},Vr=l("ContentChildren",function(e,t){return void 0===t&&(t={}),Object(Tr.__assign)({selector:e,first:!1,isViewQuery:!1,descendants:!1},t)},jr),zr=l("ContentChild",function(e,t){return void 0===t&&(t={}),Object(Tr.__assign)({selector:e,first:!0,isViewQuery:!1,descendants:!0},t)},jr),Br=l("ViewChildren",function(e,t){return void 0===t&&(t={}),Object(Tr.__assign)({selector:e,first:!1,isViewQuery:!0,descendants:!0},t)},jr),Hr=l("ViewChild",function(e,t){return Object(Tr.__assign)({selector:e,first:!0,isViewQuery:!0,descendants:!0},t)},jr),Wr=function(){var e={OnPush:0,Default:1};return e[e.OnPush]="OnPush",e[e.Default]="Default",e}(),qr=function(){var e={CheckOnce:0,Checked:1,CheckAlways:2,Detached:3,Errored:4,Destroyed:5};return e[e.CheckOnce]="CheckOnce",e[e.Checked]="Checked",e[e.CheckAlways]="CheckAlways",e[e.Detached]="Detached",e[e.Errored]="Errored",e[e.Destroyed]="Destroyed",e}(),Ur=r("Directive",function(e){return void 0===e&&(e={}),e}),Gr=r("Component",function(e){return void 0===e&&(e={}),Object(Tr.__assign)({changeDetection:Wr.Default},e)},Ur),Kr=r("Pipe",function(e){return Object(Tr.__assign)({pure:!0},e)}),$r=l("Input",function(e){return{bindingPropertyName:e}}),Zr=l("Output",function(e){return{bindingPropertyName:e}}),Qr=l("HostBinding",function(e){return{hostPropertyName:e}}),Yr=l("HostListener",function(e,t){return{eventName:e,args:t}}),Xr={name:"custom-elements"},Jr={name:"no-errors-schema"},ei=r("NgModule",function(e){return e}),ti=function(){var e={Emulated:0,Native:1,None:2};return e[e.Emulated]="Emulated",e[e.Native]="Native",e[e.None]="None",e}(),ni=function(e){this.full=e,this.major=e.split(".")[0],this.minor=e.split(".")[1],this.patch=e.split(".").slice(2).join(".")},ri=new ni("5.1.1"),ii=o("Inject",function(e){return{token:e}}),oi=o("Optional"),li=r("Injectable"),ai=o("Self"),si=o("SkipSelf"),ui=o("Host"),ci="undefined"!=typeof window&&window,di="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,pi=ci||void 0!==e&&e||di,fi=null,hi=new Object,mi=hi,gi=function(){function e(){}return e.prototype.get=function(e,t){if(void 0===t&&(t=hi),t===hi)throw new Error("NullInjectorError: No provider for "+d(e)+"!");return t},e}(),yi=function(){function e(){}return e.create=function(e,t){return new Di(e,t)},e.THROW_IF_NOT_FOUND=hi,e.NULL=new gi,e}(),vi=function(e){return e},bi=[],_i=vi,wi=function(){return Array.prototype.slice.call(arguments)},xi={},Ci=xi,Ei=function(e){for(var t in e)if(e[t]===xi)return t;throw Error("!prop")}({provide:String,useValue:Ci}),Si="ngTempTokenPath",Oi=yi.NULL,Ti=/\n/gm,ki="\u0275",Di=function(){function e(e,t){void 0===t&&(t=Oi),this.parent=t;var n=this._records=new Map;n.set(yi,{token:yi,fn:vi,deps:bi,value:this,useNew:!1}),m(n,e)}return e.prototype.get=function(e,t){var n=this._records.get(e);try{return g(e,n,this._records,this.parent,t)}catch(e){var r=e[Si];throw e.message=y("\n"+e.message,r),e.ngTokenPath=r,e[Si]=null,e}},e.prototype.toString=function(){var e=[];return this._records.forEach(function(t,n){return e.push(d(n))}),"StaticInjector["+e.join(", ")+"]"},e}(),Ii="ngDebugContext",Ri="ngOriginalError",Mi="ngErrorLogger",Pi=function(){function e(){this._console=console}return e.prototype.handleError=function(e){var t=this._findOriginalError(e),n=this._findContext(e),r=e[Mi]||function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];e.error.apply(e,t)};r(this._console,"ERROR",e),t&&r(this._console,"ORIGINAL ERROR",t),n&&r(this._console,"ERROR CONTEXT",n)},e.prototype._findContext=function(e){return e?b(e)?b(e):this._findContext(_(e)):null},e.prototype._findOriginalError=function(e){for(var t=_(e);t&&_(t);)t=_(t);return t},e}(),Ni=function(){function e(e,t){if(this.token=e,this.id=t,!e)throw new Error("Token must be defined!");this.displayName=d(this.token)}return e.get=function(e){return Ai.get(f(e))},Object.defineProperty(e,"numberOfKeys",{get:function(){return Ai.numberOfKeys},enumerable:!0,configurable:!0}),e}(),Ai=new(function(){function e(){this._allKeys=new Map}return e.prototype.get=function(e){if(e instanceof Ni)return e;if(this._allKeys.has(e))return this._allKeys.get(e);var t=new Ni(e,Ni.numberOfKeys);return this._allKeys.set(e,t),t},Object.defineProperty(e.prototype,"numberOfKeys",{get:function(){return this._allKeys.size},enumerable:!0,configurable:!0}),e}()),Li=Function,Fi=/^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*arguments\)/,ji=function(){function e(e){this._reflect=e||pi.Reflect}return e.prototype.isReflectionEnabled=function(){return!0},e.prototype.factory=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return new(e.bind.apply(e,[void 0].concat(t)))}},e.prototype._zipTypesAndAnnotations=function(e,t){var n;n=void 0===e?new Array(t.length):new Array(e.length);for(var r=0;r<n.length;r++)n[r]=void 0===e?[]:e[r]!=Object?[e[r]]:[],t&&null!=t[r]&&(n[r]=n[r].concat(t[r]));return n},e.prototype._ownParameters=function(e,t){if(Fi.exec(e.toString()))return null;if(e.parameters&&e.parameters!==t.parameters)return e.parameters;var n=e.ctorParameters;if(n&&n!==t.ctorParameters){var r="function"==typeof n?n():n,i=r.map(function(e){return e&&e.type}),o=r.map(function(e){return e&&T(e.decorators)});return this._zipTypesAndAnnotations(i,o)}var l=e.hasOwnProperty(Nr)&&e[Nr],a=this._reflect&&this._reflect.getOwnMetadata&&this._reflect.getOwnMetadata("design:paramtypes",e);return a||l?this._zipTypesAndAnnotations(a,l):new Array(e.length).fill(void 0)},e.prototype.parameters=function(e){if(!O(e))return[];var t=k(e),n=this._ownParameters(e,t);return n||t===Object||(n=this.parameters(t)),n||[]},e.prototype._ownAnnotations=function(e,t){if(e.annotations&&e.annotations!==t.annotations){var n=e.annotations;return"function"==typeof n&&n.annotations&&(n=n.annotations),n}return e.decorators&&e.decorators!==t.decorators?T(e.decorators):e.hasOwnProperty(Pr)?e[Pr]:null},e.prototype.annotations=function(e){if(!O(e))return[];var t=k(e),n=this._ownAnnotations(e,t)||[];return(t!==Object?this.annotations(t):[]).concat(n)},e.prototype._ownPropMetadata=function(e,t){if(e.propMetadata&&e.propMetadata!==t.propMetadata){var n=e.propMetadata;return"function"==typeof n&&n.propMetadata&&(n=n.propMetadata),n}if(e.propDecorators&&e.propDecorators!==t.propDecorators){var r=e.propDecorators,i={};return Object.keys(r).forEach(function(e){i[e]=T(r[e])}),i}return e.hasOwnProperty(Ar)?e[Ar]:null},e.prototype.propMetadata=function(e){if(!O(e))return{};var t=k(e),n={};if(t!==Object){var r=this.propMetadata(t);Object.keys(r).forEach(function(e){n[e]=r[e]})}var i=this._ownPropMetadata(e,t);return i&&Object.keys(i).forEach(function(e){var t=[];n.hasOwnProperty(e)&&t.push.apply(t,n[e]),t.push.apply(t,i[e]),n[e]=t}),n},e.prototype.hasLifecycleHook=function(e,t){return e instanceof Li&&t in e.prototype},e.prototype.getter=function(e){return new Function("o","return o."+e+";")},e.prototype.setter=function(e){return new Function("o","v","return o."+e+" = v;")},e.prototype.method=function(e){var t="if (!o."+e+") throw new Error('\""+e+"\" is undefined');\n        return o."+e+".apply(o, args);";return new Function("o","args",t)},e.prototype.importUri=function(e){return"object"==typeof e&&e.filePath?e.filePath:"./"+d(e)},e.prototype.resourceUri=function(e){return"./"+d(e)},e.prototype.resolveIdentifier=function(e,t,n,r){return r},e.prototype.resolveEnum=function(e,t){return e[t]},e}(),Vi=new(function(){function e(e){this.reflectionCapabilities=e}return e.prototype.updateCapabilities=function(e){this.reflectionCapabilities=e},e.prototype.factory=function(e){return this.reflectionCapabilities.factory(e)},e.prototype.parameters=function(e){return this.reflectionCapabilities.parameters(e)},e.prototype.annotations=function(e){return this.reflectionCapabilities.annotations(e)},e.prototype.propMetadata=function(e){return this.reflectionCapabilities.propMetadata(e)},e.prototype.hasLifecycleHook=function(e,t){return this.reflectionCapabilities.hasLifecycleHook(e,t)},e.prototype.getter=function(e){return this.reflectionCapabilities.getter(e)},e.prototype.setter=function(e){return this.reflectionCapabilities.setter(e)},e.prototype.method=function(e){return this.reflectionCapabilities.method(e)},e.prototype.importUri=function(e){return this.reflectionCapabilities.importUri(e)},e.prototype.resourceUri=function(e){return this.reflectionCapabilities.resourceUri(e)},e.prototype.resolveIdentifier=function(e,t,n,r){return this.reflectionCapabilities.resolveIdentifier(e,t,n,r)},e.prototype.resolveEnum=function(e,t){return this.reflectionCapabilities.resolveEnum(e,t)},e}())(new ji),zi=function(){function e(e,t,n){this.key=e,this.optional=t,this.visibility=n}return e.fromKey=function(t){return new e(t,!1,null)},e}(),Bi=[],Hi=function(){function e(e,t,n){this.key=e,this.resolvedFactories=t,this.multiProvider=n}return Object.defineProperty(e.prototype,"resolvedFactory",{get:function(){return this.resolvedFactories[0]},enumerable:!0,configurable:!0}),e}(),Wi=function(e,t){this.factory=e,this.dependencies=t},qi=new Object,Ui=function(){function e(){}return e.resolve=function(e){return I(e)},e.resolveAndCreate=function(t,n){var r=e.resolve(t);return e.fromResolvedProviders(r,n)},e.fromResolvedProviders=function(e,t){return new Gi(e,t)},e}(),Gi=function(){function e(e,t){this._constructionCounter=0,this._providers=e,this.parent=t||null;var n=e.length;this.keyIds=new Array(n),this.objs=new Array(n);for(var r=0;r<n;r++)this.keyIds[r]=e[r].key.id,this.objs[r]=qi}return e.prototype.get=function(e,t){return void 0===t&&(t=mi),this._getByKey(Ni.get(e),null,t)},e.prototype.resolveAndCreateChild=function(e){var t=Ui.resolve(e);return this.createChildFromResolved(t)},e.prototype.createChildFromResolved=function(t){var n=new e(t);return n.parent=this,n},e.prototype.resolveAndInstantiate=function(e){return this.instantiateResolved(Ui.resolve([e])[0])},e.prototype.instantiateResolved=function(e){return this._instantiateProvider(e)},e.prototype.getProviderAtIndex=function(e){if(e<0||e>=this._providers.length)throw function(e){return Error("Index "+e+" is out-of-bounds.")}(e);return this._providers[e]},e.prototype._new=function(e){if(this._constructionCounter++>this._getMaxNumberOfObjects())throw function(t,n){return x(t,e.key,function(e){return"Cannot instantiate cyclic dependency!"+w(e)})}(this);return this._instantiateProvider(e)},e.prototype._getMaxNumberOfObjects=function(){return this.objs.length},e.prototype._instantiateProvider=function(e){if(e.multiProvider){for(var t=new Array(e.resolvedFactories.length),n=0;n<e.resolvedFactories.length;++n)t[n]=this._instantiate(e,e.resolvedFactories[n]);return t}return this._instantiate(e,e.resolvedFactories[0])},e.prototype._instantiate=function(e,t){var n,r=this,i=t.factory;try{n=t.dependencies.map(function(e){return r._getByReflectiveDependency(e)})}catch(t){throw t.addKey&&t.addKey(this,e.key),t}var o;try{o=i.apply(void 0,n)}catch(t){throw function(t,n,r,i){return x(t,e.key,function(e){var t=d(e[0].token);return n.message+": Error during instantiation of "+t+"!"+w(e)+"."},n)}(this,t)}return o},e.prototype._getByReflectiveDependency=function(e){return this._getByKey(e.key,e.visibility,e.optional?null:mi)},e.prototype._getByKey=function(t,n,r){return t===e.INJECTOR_KEY?this:n instanceof ai?this._getByKeySelf(t,r):this._getByKeyDefault(t,r,n)},e.prototype._getObjByKeyId=function(e){for(var t=0;t<this.keyIds.length;t++)if(this.keyIds[t]===e)return this.objs[t]===qi&&(this.objs[t]=this._new(this._providers[t])),this.objs[t];return qi},e.prototype._throwOrNull=function(e,t){if(t!==mi)return t;throw function(t,n){return x(t,e,function(e){return"No provider for "+d(e[0].token)+"!"+w(e)})}(this)},e.prototype._getByKeySelf=function(e,t){var n=this._getObjByKeyId(e.id);return n!==qi?n:this._throwOrNull(e,t)},e.prototype._getByKeyDefault=function(t,n,r){var i;for(i=r instanceof si?this.parent:this;i instanceof e;){var o=i,l=o._getObjByKeyId(t.id);if(l!==qi)return l;i=o.parent}return null!==i?i.get(t.token,n):this._throwOrNull(t,n)},Object.defineProperty(e.prototype,"displayName",{get:function(){return"ReflectiveInjector(providers: ["+function(e,t){for(var n=new Array(e._providers.length),r=0;r<e._providers.length;++r)n[r]=t(e.getProviderAtIndex(r));return n}(this,function(e){return' "'+e.key.displayName+'" '}).join(", ")+"])"},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.displayName},e.INJECTOR_KEY=Ni.get(yi),e}(),Ki=new Mr("Application Initializer"),$i=function(){function e(e){var t=this;this.appInits=e,this.initialized=!1,this.done=!1,this.donePromise=new Promise(function(e,n){t.resolve=e,t.reject=n})}return e.prototype.runInitializers=function(){var e=this;if(!this.initialized){var t=[],n=function(){e.done=!0,e.resolve()};if(this.appInits)for(var r=0;r<this.appInits.length;r++){var i=this.appInits[r]();A(i)&&t.push(i)}Promise.all(t).then(function(){n()}).catch(function(t){e.reject(t)}),0===t.length&&n(),this.initialized=!0}},e}(),Zi=new Mr("AppId"),Qi={provide:Zi,useFactory:F,deps:[]},Yi=new Mr("Platform Initializer"),Xi=new Mr("Platform ID"),Ji=new Mr("appBootstrapListener"),eo=new Mr("Application Packages Root URL"),to=function(){function e(){}return e.prototype.log=function(e){console.log(e)},e.prototype.warn=function(e){console.warn(e)},e.ctorParameters=function(){return[]},e}(),no=function(e,t){this.ngModuleFactory=e,this.componentFactories=t},ro=function(){function e(){}return e.prototype.compileModuleSync=function(e){throw V()},e.prototype.compileModuleAsync=function(e){throw V()},e.prototype.compileModuleAndAllComponentsSync=function(e){throw V()},e.prototype.compileModuleAndAllComponentsAsync=function(e){throw V()},e.prototype.clearCache=function(){},e.prototype.clearCacheFor=function(e){},e}(),io=new Mr("compilerOptions"),oo=function(){},lo=function(){},ao=function(){},so="ngComponent",uo=function(){function e(){}return e.prototype.resolveComponentFactory=function(e){throw z(e)},e}(),co=function(){function e(){}return e.NULL=new uo,e}(),po=function(){function e(e,t,n){this._parent=t,this._ngModule=n,this._factories=new Map;for(var r=0;r<e.length;r++){var i=e[r];this._factories.set(i.componentType,i)}}return e.prototype.resolveComponentFactory=function(e){var t=this._factories.get(e);if(!t&&this._parent&&(t=this._parent.resolveComponentFactory(e)),!t)throw z(e);return new fo(t,this._ngModule)},e}(),fo=function(e){function t(t,n){var r=e.call(this)||this;return r.factory=t,r.ngModule=n,r}return Object(Tr.__extends)(t,e),Object.defineProperty(t.prototype,"selector",{get:function(){return this.factory.selector},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return this.factory.componentType},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngContentSelectors",{get:function(){return this.factory.ngContentSelectors},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"inputs",{get:function(){return this.factory.inputs},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"outputs",{get:function(){return this.factory.outputs},enumerable:!0,configurable:!0}),t.prototype.create=function(e,t,n,r){return this.factory.create(e,t,n,r||this.ngModule)},t}(ao),ho=function(){},mo=function(){},go=B(),yo=go?H:function(e,t){return G},vo=go?W:function(e,t){return t},bo=go?q:function(e,t){return null},_o=go?U:function(e){return null},wo=function(e){function t(t){void 0===t&&(t=!1);var n=e.call(this)||this;return n.__isAsync=t,n}return Object(Tr.__extends)(t,e),t.prototype.emit=function(t){e.prototype.next.call(this,t)},t.prototype.subscribe=function(t,n,r){var i,o=function(e){return null},l=function(){return null};return t&&"object"==typeof t?(i=this.__isAsync?function(e){setTimeout(function(){return t.next(e)})}:function(e){t.next(e)},t.error&&(o=this.__isAsync?function(e){setTimeout(function(){return t.error(e)})}:function(e){t.error(e)}),t.complete&&(l=this.__isAsync?function(){setTimeout(function(){return t.complete()})}:function(){t.complete()})):(i=this.__isAsync?function(e){setTimeout(function(){return t(e)})}:function(e){t(e)},n&&(o=this.__isAsync?function(e){setTimeout(function(){return n(e)})}:function(e){n(e)}),r&&(l=this.__isAsync?function(){setTimeout(function(){return r()})}:function(){r()})),e.prototype.subscribe.call(this,i,o,l)},t}(Rr.Subject),xo=function(){function e(e){var t=e.enableLongStackTrace,n=void 0!==t&&t;if(this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new wo(!1),this.onMicrotaskEmpty=new wo(!1),this.onStable=new wo(!1),this.onError=new wo(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched(),this._nesting=0,this._outer=this._inner=Zone.current,Zone.wtfZoneSpec&&(this._inner=this._inner.fork(Zone.wtfZoneSpec)),n&&Zone.longStackTraceZoneSpec&&(this._inner=this._inner.fork(Zone.longStackTraceZoneSpec)),function(e){e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:function(t,n,r,i,o,l){try{return Z(e),t.invokeTask(r,i,o,l)}finally{Q(e)}},onInvoke:function(t,n,r,i,o,l,a){try{return Z(e),t.invoke(r,i,o,l,a)}finally{Q(e)}},onHasTask:function(t,n,r,i){t.hasTask(r,i),n===r&&("microTask"==i.change?(e.hasPendingMicrotasks=i.microTask,$(e)):"macroTask"==i.change&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:function(t,n,r,i){return t.handleError(r,i),e.runOutsideAngular(function(){return e.onError.emit(i)}),!1}})}(this)}return e.isInAngularZone=function(){return!0===Zone.current.get("isAngularZone")},e.assertInAngularZone=function(){if(!e.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")},e.assertNotInAngularZone=function(){if(e.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")},e.prototype.run=function(e,t,n){return this._inner.run(e,t,n)},e.prototype.runTask=function(e,t,n,r){var i=this._inner,o=i.scheduleEventTask("NgZoneEvent: "+r,e,Co,K,K);try{return i.runTask(o,t,n)}finally{i.cancelTask(o)}},e.prototype.runGuarded=function(e,t,n){return this._inner.runGuarded(e,t,n)},e.prototype.runOutsideAngular=function(e){return this._outer.run(e)},e}(),Co={},Eo=function(){function e(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new wo,this.onMicrotaskEmpty=new wo,this.onStable=new wo,this.onError=new wo}return e.prototype.run=function(e){return e()},e.prototype.runGuarded=function(e){return e()},e.prototype.runOutsideAngular=function(e){return e()},e.prototype.runTask=function(e){return e()},e}(),So=function(){function e(e){this._ngZone=e,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this._watchAngularEvents()}return e.prototype._watchAngularEvents=function(){var e=this;this._ngZone.onUnstable.subscribe({next:function(){e._didWork=!0,e._isZoneStable=!1}}),this._ngZone.runOutsideAngular(function(){e._ngZone.onStable.subscribe({next:function(){xo.assertNotInAngularZone(),u(function(){e._isZoneStable=!0,e._runCallbacksIfReady()})}})})},e.prototype.increasePendingRequestCount=function(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount},e.prototype.decreasePendingRequestCount=function(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount},e.prototype.isStable=function(){return this._isZoneStable&&0==this._pendingCount&&!this._ngZone.hasPendingMacrotasks},e.prototype._runCallbacksIfReady=function(){var e=this;this.isStable()?u(function(){for(;0!==e._callbacks.length;)e._callbacks.pop()(e._didWork);e._didWork=!1}):this._didWork=!0},e.prototype.whenStable=function(e){this._callbacks.push(e),this._runCallbacksIfReady()},e.prototype.getPendingRequestCount=function(){return this._pendingCount},e.prototype.findProviders=function(e,t,n){return[]},e}(),Oo=function(){function e(){this._applications=new Map,To.addToWindow(this)}return e.prototype.registerApplication=function(e,t){this._applications.set(e,t)},e.prototype.unregisterApplication=function(e){this._applications.delete(e)},e.prototype.unregisterAllApplications=function(){this._applications.clear()},e.prototype.getTestability=function(e){return this._applications.get(e)||null},e.prototype.getAllTestabilities=function(){return Array.from(this._applications.values())},e.prototype.getAllRootElements=function(){return Array.from(this._applications.keys())},e.prototype.findTestabilityInTree=function(e,t){return void 0===t&&(t=!0),To.findTestabilityInTree(this,e,t)},e.ctorParameters=function(){return[]},e}(),To=new(function(){function e(){}return e.prototype.addToWindow=function(e){},e.prototype.findTestabilityInTree=function(e,t,n){return null},e}()),ko=!0,Do=!1,Io=new Mr("AllowMultipleToken"),Ro=function(e,t){this.name=e,this.token=t},Mo=function(){function e(e){this._injector=e,this._modules=[],this._destroyListeners=[],this._destroyed=!1}return e.prototype.bootstrapModuleFactory=function(e,t){var n=this,r=function(e){return"noop"===e?new Eo:("zone.js"===e?void 0:e)||new xo({enableLongStackTrace:J()})}(t?t.ngZone:void 0);return r.run(function(){var t=yi.create([{provide:xo,useValue:r}],n.injector),i=e.create(t),o=i.injector.get(Pi,null);if(!o)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return i.onDestroy(function(){return le(n._modules,i)}),r.runOutsideAngular(function(){return r.onError.subscribe({next:function(e){o.handleError(e)}})}),function(e,t,r){try{var o=function(){var e=i.injector.get($i);return e.runInitializers(),e.donePromise.then(function(){return n._moduleDoBootstrap(i),i})}();return A(o)?o.catch(function(n){throw t.runOutsideAngular(function(){return e.handleError(n)}),n}):o}catch(n){throw t.runOutsideAngular(function(){return e.handleError(n)}),n}}(o,r)})},e.prototype.bootstrapModule=function(e,t){var n=this;void 0===t&&(t=[]);var r=this.injector.get(oo),i=oe({},t);return r.createCompiler([i]).compileModuleAsync(e).then(function(e){return n.bootstrapModuleFactory(e,i)})},e.prototype._moduleDoBootstrap=function(e){var t=e.injector.get(Po);if(e._bootstrapComponents.length>0)e._bootstrapComponents.forEach(function(e){return t.bootstrap(e)});else{if(!e.instance.ngDoBootstrap)throw new Error("The module "+d(e.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');e.instance.ngDoBootstrap(t)}this._modules.push(e)},e.prototype.onDestroy=function(e){this._destroyListeners.push(e)},Object.defineProperty(e.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(e){return e.destroy()}),this._destroyListeners.forEach(function(e){return e()}),this._destroyed=!0},Object.defineProperty(e.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),e}(),Po=function(){function e(e,t,n,r,i,o){var l=this;this._zone=e,this._console=t,this._injector=n,this._exceptionHandler=r,this._componentFactoryResolver=i,this._initStatus=o,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=J(),this._zone.onMicrotaskEmpty.subscribe({next:function(){l._zone.run(function(){l.tick()})}});var a=new kr.a(function(e){l._stable=l._zone.isStable&&!l._zone.hasPendingMacrotasks&&!l._zone.hasPendingMicrotasks,l._zone.runOutsideAngular(function(){e.next(l._stable),e.complete()})}),s=new kr.a(function(e){var t;l._zone.runOutsideAngular(function(){t=l._zone.onStable.subscribe(function(){xo.assertNotInAngularZone(),u(function(){l._stable||l._zone.hasPendingMacrotasks||l._zone.hasPendingMicrotasks||(l._stable=!0,e.next(!0))})})});var n=l._zone.onUnstable.subscribe(function(){xo.assertInAngularZone(),l._stable&&(l._stable=!1,l._zone.runOutsideAngular(function(){e.next(!1)}))});return function(){t.unsubscribe(),n.unsubscribe()}});this.isStable=Object(Dr.a)(a,Ir.a.call(s))}return e.prototype.bootstrap=function(e,t){var n=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");var r;r=e instanceof ao?e:this._componentFactoryResolver.resolveComponentFactory(e),this.componentTypes.push(r.componentType);var i=r instanceof fo?null:this._injector.get(ho),o=r.create(yi.NULL,[],t||r.selector,i);o.onDestroy(function(){n._unloadComponent(o)});var l=o.injector.get(So,null);return l&&o.injector.get(Oo).registerApplication(o.location.nativeElement,l),this._loadComponent(o),J()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),o},e.prototype.tick=function(){var t=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var n=e._tickScope();try{this._runningTick=!0,this._views.forEach(function(e){return e.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(e){return e.checkNoChanges()})}catch(e){this._zone.runOutsideAngular(function(){return t._exceptionHandler.handleError(e)})}finally{this._runningTick=!1,vo(n)}},e.prototype.attachView=function(e){var t=e;this._views.push(t),t.attachToAppRef(this)},e.prototype.detachView=function(e){var t=e;le(this._views,t),t.detachFromAppRef()},e.prototype._loadComponent=function(e){this.attachView(e.hostView),this.tick(),this.components.push(e),this._injector.get(Ji,[]).concat(this._bootstrapListeners).forEach(function(t){return t(e)})},e.prototype._unloadComponent=function(e){this.detachView(e.hostView),le(this.components,e)},e.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(e){return e.destroy()})},Object.defineProperty(e.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),e._tickScope=yo("ApplicationRef#tick()"),e}(),No=function(e,t,n,r,i,o){this.id=e,this.templateUrl=t,this.slotCount=n,this.encapsulation=r,this.styles=i,this.animations=o},Ao=function(){},Lo=function(){},Fo=function(){},jo=function(){},Vo=function(){var e={Important:1,DashCase:2};return e[e.Important]="Important",e[e.DashCase]="DashCase",e}(),zo=function(){},Bo=function(e){this.nativeElement=e},Ho=function(){},Wo=new Map,qo=function(){function e(){this.dirty=!0,this._results=[],this.changes=new wo}return Object.defineProperty(e.prototype,"length",{get:function(){return this._results.length},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"first",{get:function(){return this._results[0]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"last",{get:function(){return this._results[this.length-1]},enumerable:!0,configurable:!0}),e.prototype.map=function(e){return this._results.map(e)},e.prototype.filter=function(e){return this._results.filter(e)},e.prototype.find=function(e){return this._results.find(e)},e.prototype.reduce=function(e,t){return this._results.reduce(e,t)},e.prototype.forEach=function(e){this._results.forEach(e)},e.prototype.some=function(e){return this._results.some(e)},e.prototype.toArray=function(){return this._results.slice()},e.prototype[s()]=function(){return this._results[s()]()},e.prototype.toString=function(){return this._results.toString()},e.prototype.reset=function(e){this._results=ue(e),this.dirty=!1},e.prototype.notifyOnChanges=function(){this.changes.emit(this)},e.prototype.setDirty=function(){this.dirty=!0},e.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},e}(),Uo=function(){},Go={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},Ko=function(){function e(e,t){this._compiler=e,this._config=t||Go}return e.prototype.load=function(e){return this._compiler instanceof ro?this.loadFactory(e):this.loadAndCompile(e)},e.prototype.loadAndCompile=function(e){var t=this,r=e.split("#"),i=r[0],o=r[1];return void 0===o&&(o="default"),n("YuZA")(i).then(function(e){return e[o]}).then(function(e){return ce(e,i,o)}).then(function(e){return t._compiler.compileModuleAsync(e)})},e.prototype.loadFactory=function(e){var t=e.split("#"),r=t[0],i=t[1],o="NgFactory";return void 0===i&&(i="default",o=""),n("YuZA")(this._config.factoryPathPrefix+r+this._config.factoryPathSuffix).then(function(e){return e[i+o]}).then(function(e){return ce(e,r,i)})},e}(),$o=function(){},Zo=function(){},Qo=function(){},Yo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(Tr.__extends)(t,e),t}(Qo),Xo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(Tr.__extends)(t,e),t}(Yo),Jo=function(){function e(e,t,n){this._debugContext=n,this.nativeNode=e,t&&t instanceof el?t.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(e.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),e}(),el=function(e){function t(t,n,r){var i=e.call(this,t,n,r)||this;return i.properties={},i.attributes={},i.classes={},i.styles={},i.childNodes=[],i.nativeElement=t,i}return Object(Tr.__extends)(t,e),t.prototype.addChild=function(e){e&&(this.childNodes.push(e),e.parent=this)},t.prototype.removeChild=function(e){var t=this.childNodes.indexOf(e);-1!==t&&(e.parent=null,this.childNodes.splice(t,1))},t.prototype.insertChildrenAfter=function(e,t){var n=this,r=this.childNodes.indexOf(e);-1!==r&&((i=this.childNodes).splice.apply(i,[r+1,0].concat(t)),t.forEach(function(e){e.parent&&e.parent.removeChild(e),e.parent=n}));var i},t.prototype.insertBefore=function(e,t){var n=this.childNodes.indexOf(e);-1===n?this.addChild(t):(t.parent&&t.parent.removeChild(t),t.parent=this,this.childNodes.splice(n,0,t))},t.prototype.query=function(e){return this.queryAll(e)[0]||null},t.prototype.queryAll=function(e){var t=[];return pe(this,e,t),t},t.prototype.queryAllNodes=function(e){var t=[];return fe(this,e,t),t},Object.defineProperty(t.prototype,"children",{get:function(){return this.childNodes.filter(function(e){return e instanceof t})},enumerable:!0,configurable:!0}),t.prototype.triggerEventHandler=function(e,t){this.listeners.forEach(function(n){n.name==e&&n.callback(t)})},t}(Jo),tl=new Map,nl=function(){function e(e){this.wrapped=e}return e.wrap=function(t){return new e(t)},e}(),rl=function(){function e(){this.hasWrappedValue=!1}return e.prototype.unwrap=function(e){return e instanceof nl?(this.hasWrappedValue=!0,e.wrapped):e},e.prototype.reset=function(){this.hasWrappedValue=!1},e}(),il=function(){function e(e,t,n){this.previousValue=e,this.currentValue=t,this.firstChange=n}return e.prototype.isFirstChange=function(){return this.firstChange},e}(),ol=function(){function e(){}return e.prototype.supports=function(e){return ye(e)},e.prototype.create=function(e){return new al(e)},e}(),ll=function(e,t){return t},al=function(){function e(e){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=e||ll}return e.prototype.forEachItem=function(e){var t;for(t=this._itHead;null!==t;t=t._next)e(t)},e.prototype.forEachOperation=function(e){for(var t=this._itHead,n=this._removalsHead,r=0,i=null;t||n;){var o=!n||t&&t.currentIndex<be(n,r,i)?t:n,l=be(o,r,i),a=o.currentIndex;if(o===n)r--,n=n._nextRemoved;else if(t=t._next,null==o.previousIndex)r++;else{i||(i=[]);var s=l-r,u=a-r;if(s!=u){for(var c=0;c<s;c++){var d=c<i.length?i[c]:i[c]=0,p=d+c;u<=p&&p<s&&(i[c]=d+1)}i[o.previousIndex]=u-s}}l!==a&&e(o,l,a)}},e.prototype.forEachPreviousItem=function(e){var t;for(t=this._previousItHead;null!==t;t=t._nextPrevious)e(t)},e.prototype.forEachAddedItem=function(e){var t;for(t=this._additionsHead;null!==t;t=t._nextAdded)e(t)},e.prototype.forEachMovedItem=function(e){var t;for(t=this._movesHead;null!==t;t=t._nextMoved)e(t)},e.prototype.forEachRemovedItem=function(e){var t;for(t=this._removalsHead;null!==t;t=t._nextRemoved)e(t)},e.prototype.forEachIdentityChange=function(e){var t;for(t=this._identityChangesHead;null!==t;t=t._nextIdentityChange)e(t)},e.prototype.diff=function(e){if(null==e&&(e=[]),!ye(e))throw new Error("Error trying to diff '"+d(e)+"'. Only arrays and iterables are allowed");return this.check(e)?this:null},e.prototype.onDestroy=function(){},e.prototype.check=function(e){var t=this;this._reset();var n,r,i,o=this._itHead,l=!1;if(Array.isArray(e)){this.length=e.length;for(var a=0;a<this.length;a++)i=this._trackByFn(a,r=e[a]),null!==o&&c(o.trackById,i)?(l&&(o=this._verifyReinsertion(o,r,i,a)),c(o.item,r)||this._addIdentityChange(o,r)):(o=this._mismatch(o,r,i,a),l=!0),o=o._next}else n=0,function(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++)t(e[n]);else for(var r=e[s()](),i=void 0;!(i=r.next()).done;)t(i.value)}(e,function(e){i=t._trackByFn(n,e),null!==o&&c(o.trackById,i)?(l&&(o=t._verifyReinsertion(o,e,i,n)),c(o.item,e)||t._addIdentityChange(o,e)):(o=t._mismatch(o,e,i,n),l=!0),o=o._next,n++}),this.length=n;return this._truncate(o),this.collection=e,this.isDirty},Object.defineProperty(e.prototype,"isDirty",{get:function(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead},enumerable:!0,configurable:!0}),e.prototype._reset=function(){if(this.isDirty){var e=void 0,t=void 0;for(e=this._previousItHead=this._itHead;null!==e;e=e._next)e._nextPrevious=e._next;for(e=this._additionsHead;null!==e;e=e._nextAdded)e.previousIndex=e.currentIndex;for(this._additionsHead=this._additionsTail=null,e=this._movesHead;null!==e;e=t)e.previousIndex=e.currentIndex,t=e._nextMoved;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}},e.prototype._mismatch=function(e,t,n,r){var i;return null===e?i=this._itTail:(i=e._prev,this._remove(e)),null!==(e=null===this._linkedRecords?null:this._linkedRecords.get(n,r))?(c(e.item,t)||this._addIdentityChange(e,t),this._moveAfter(e,i,r)):null!==(e=null===this._unlinkedRecords?null:this._unlinkedRecords.get(n,null))?(c(e.item,t)||this._addIdentityChange(e,t),this._reinsertAfter(e,i,r)):e=this._addAfter(new sl(t,n),i,r),e},e.prototype._verifyReinsertion=function(e,t,n,r){var i=null===this._unlinkedRecords?null:this._unlinkedRecords.get(n,null);return null!==i?e=this._reinsertAfter(i,e._prev,r):e.currentIndex!=r&&(e.currentIndex=r,this._addToMoves(e,r)),e},e.prototype._truncate=function(e){for(;null!==e;){var t=e._next;this._addToRemovals(this._unlink(e)),e=t}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)},e.prototype._reinsertAfter=function(e,t,n){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(e);var r=e._prevRemoved,i=e._nextRemoved;return null===r?this._removalsHead=i:r._nextRemoved=i,null===i?this._removalsTail=r:i._prevRemoved=r,this._insertAfter(e,t,n),this._addToMoves(e,n),e},e.prototype._moveAfter=function(e,t,n){return this._unlink(e),this._insertAfter(e,t,n),this._addToMoves(e,n),e},e.prototype._addAfter=function(e,t,n){return this._insertAfter(e,t,n),this._additionsTail=null===this._additionsTail?this._additionsHead=e:this._additionsTail._nextAdded=e,e},e.prototype._insertAfter=function(e,t,n){var r=null===t?this._itHead:t._next;return e._next=r,e._prev=t,null===r?this._itTail=e:r._prev=e,null===t?this._itHead=e:t._next=e,null===this._linkedRecords&&(this._linkedRecords=new cl),this._linkedRecords.put(e),e.currentIndex=n,e},e.prototype._remove=function(e){return this._addToRemovals(this._unlink(e))},e.prototype._unlink=function(e){null!==this._linkedRecords&&this._linkedRecords.remove(e);var t=e._prev,n=e._next;return null===t?this._itHead=n:t._next=n,null===n?this._itTail=t:n._prev=t,e},e.prototype._addToMoves=function(e,t){return e.previousIndex===t?e:(this._movesTail=null===this._movesTail?this._movesHead=e:this._movesTail._nextMoved=e,e)},e.prototype._addToRemovals=function(e){return null===this._unlinkedRecords&&(this._unlinkedRecords=new cl),this._unlinkedRecords.put(e),e.currentIndex=null,e._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=e,e._prevRemoved=null):(e._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=e),e},e.prototype._addIdentityChange=function(e,t){return e.item=t,this._identityChangesTail=null===this._identityChangesTail?this._identityChangesHead=e:this._identityChangesTail._nextIdentityChange=e,e},e}(),sl=function(e,t){this.item=e,this.trackById=t,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null},ul=function(){function e(){this._head=null,this._tail=null}return e.prototype.add=function(e){null===this._head?(this._head=this._tail=e,e._nextDup=null,e._prevDup=null):(this._tail._nextDup=e,e._prevDup=this._tail,e._nextDup=null,this._tail=e)},e.prototype.get=function(e,t){var n;for(n=this._head;null!==n;n=n._nextDup)if((null===t||t<=n.currentIndex)&&c(n.trackById,e))return n;return null},e.prototype.remove=function(e){var t=e._prevDup,n=e._nextDup;return null===t?this._head=n:t._nextDup=n,null===n?this._tail=t:n._prevDup=t,null===this._head},e}(),cl=function(){function e(){this.map=new Map}return e.prototype.put=function(e){var t=e.trackById,n=this.map.get(t);n||(n=new ul,this.map.set(t,n)),n.add(e)},e.prototype.get=function(e,t){var n=this.map.get(e);return n?n.get(e,t):null},e.prototype.remove=function(e){var t=e.trackById;return this.map.get(t).remove(e)&&this.map.delete(t),e},Object.defineProperty(e.prototype,"isEmpty",{get:function(){return 0===this.map.size},enumerable:!0,configurable:!0}),e.prototype.clear=function(){this.map.clear()},e}(),dl=function(){function e(){}return e.prototype.supports=function(e){return e instanceof Map||ve(e)},e.prototype.create=function(){return new pl},e}(),pl=function(){function e(){this._records=new Map,this._mapHead=null,this._appendAfter=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}return Object.defineProperty(e.prototype,"isDirty",{get:function(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead},enumerable:!0,configurable:!0}),e.prototype.forEachItem=function(e){var t;for(t=this._mapHead;null!==t;t=t._next)e(t)},e.prototype.forEachPreviousItem=function(e){var t;for(t=this._previousMapHead;null!==t;t=t._nextPrevious)e(t)},e.prototype.forEachChangedItem=function(e){var t;for(t=this._changesHead;null!==t;t=t._nextChanged)e(t)},e.prototype.forEachAddedItem=function(e){var t;for(t=this._additionsHead;null!==t;t=t._nextAdded)e(t)},e.prototype.forEachRemovedItem=function(e){var t;for(t=this._removalsHead;null!==t;t=t._nextRemoved)e(t)},e.prototype.diff=function(e){if(e){if(!(e instanceof Map||ve(e)))throw new Error("Error trying to diff '"+d(e)+"'. Only maps and objects are allowed")}else e=new Map;return this.check(e)?this:null},e.prototype.onDestroy=function(){},e.prototype.check=function(e){var t=this;this._reset();var n=this._mapHead;if(this._appendAfter=null,this._forEach(e,function(e,r){if(n&&n.key===r)t._maybeAddToChanges(n,e),t._appendAfter=n,n=n._next;else{var i=t._getOrCreateRecordForKey(r,e);n=t._insertBeforeOrAppend(n,i)}}),n){n._prev&&(n._prev._next=null),this._removalsHead=n;for(var r=n;null!==r;r=r._nextRemoved)r===this._mapHead&&(this._mapHead=null),this._records.delete(r.key),r._nextRemoved=r._next,r.previousValue=r.currentValue,r.currentValue=null,r._prev=null,r._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty},e.prototype._insertBeforeOrAppend=function(e,t){if(e){var n=e._prev;return t._next=e,t._prev=n,e._prev=t,n&&(n._next=t),e===this._mapHead&&(this._mapHead=t),this._appendAfter=e,e}return this._appendAfter?(this._appendAfter._next=t,t._prev=this._appendAfter):this._mapHead=t,this._appendAfter=t,null},e.prototype._getOrCreateRecordForKey=function(e,t){if(this._records.has(e)){var n=this._records.get(e);this._maybeAddToChanges(n,t);var r=n._prev,i=n._next;return r&&(r._next=i),i&&(i._prev=r),n._next=null,n._prev=null,n}var o=new fl(e);return this._records.set(e,o),o.currentValue=t,this._addToAdditions(o),o},e.prototype._reset=function(){if(this.isDirty){var e=void 0;for(this._previousMapHead=this._mapHead,e=this._previousMapHead;null!==e;e=e._next)e._nextPrevious=e._next;for(e=this._changesHead;null!==e;e=e._nextChanged)e.previousValue=e.currentValue;for(e=this._additionsHead;null!=e;e=e._nextAdded)e.previousValue=e.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}},e.prototype._maybeAddToChanges=function(e,t){c(t,e.currentValue)||(e.previousValue=e.currentValue,e.currentValue=t,this._addToChanges(e))},e.prototype._addToAdditions=function(e){null===this._additionsHead?this._additionsHead=this._additionsTail=e:(this._additionsTail._nextAdded=e,this._additionsTail=e)},e.prototype._addToChanges=function(e){null===this._changesHead?this._changesHead=this._changesTail=e:(this._changesTail._nextChanged=e,this._changesTail=e)},e.prototype._forEach=function(e,t){e instanceof Map?e.forEach(t):Object.keys(e).forEach(function(n){return t(e[n],n)})},e}(),fl=function(e){this.key=e,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null},hl=function(){function e(e){this.factories=e}return e.create=function(t,n){if(null!=n){var r=n.factories.slice();return t=t.concat(r),new e(t)}return new e(t)},e.extend=function(t){return{provide:e,useFactory:function(n){if(!n)throw new Error("Cannot extend IterableDiffers without a parent injector");return e.create(t,n)},deps:[[e,new si,new oi]]}},e.prototype.find=function(e){var t=this.factories.find(function(t){return t.supports(e)});if(null!=t)return t;throw new Error("Cannot find a differ supporting object '"+e+"' of type '"+(e.name||typeof e)+"'")},e}(),ml=function(){function e(e){this.factories=e}return e.create=function(t,n){if(n){var r=n.factories.slice();t=t.concat(r)}return new e(t)},e.extend=function(t){return{provide:e,useFactory:function(n){if(!n)throw new Error("Cannot extend KeyValueDiffers without a parent injector");return e.create(t,n)},deps:[[e,new si,new oi]]}},e.prototype.find=function(e){var t=this.factories.find(function(t){return t.supports(e)});if(t)return t;throw new Error("Cannot find a differ supporting object '"+e+"'")},e}(),gl=[new dl],yl=new hl([new ol]),vl=new ml(gl),bl=te(null,"core",[{provide:Xi,useValue:"unknown"},{provide:Mo,deps:[yi]},{provide:Oo,deps:[]},{provide:to,deps:[]}]),_l=new Mr("LocaleId"),wl=new Mr("Translations"),xl=new Mr("TranslationsFormat"),Cl=function(){var e={Error:0,Warning:1,Ignore:2};return e[e.Error]="Error",e[e.Warning]="Warning",e[e.Ignore]="Ignore",e}(),El=function(e){},Sl=function(){var e={NONE:0,HTML:1,STYLE:2,SCRIPT:3,URL:4,RESOURCE_URL:5};return e[e.NONE]="NONE",e[e.HTML]="HTML",e[e.STYLE]="STYLE",e[e.SCRIPT]="SCRIPT",e[e.URL]="URL",e[e.RESOURCE_URL]="RESOURCE_URL",e}(),Ol=function(){},Tl=function(){},kl={setCurrentNode:void 0,createRootView:void 0,createEmbeddedView:void 0,createComponentView:void 0,createNgModuleRef:void 0,overrideProvider:void 0,overrideComponentView:void 0,clearOverrides:void 0,checkAndUpdateView:void 0,checkNoChangesView:void 0,destroyView:void 0,resolveDep:void 0,createDebugContext:void 0,handleEvent:void 0,updateDirectives:void 0,updateRenderer:void 0,dirtyParentQueries:void 0},Dl=function(){},Il=new Map,Rl="$$undefined",Ml="$$empty",Pl=0,Nl=new WeakMap,Al=/^:([^:]+):(.+)$/,Ll=[],Fl={},jl=new Object,Vl=Pe(yi),zl=Pe(ho),Bl=new Object,Hl=function(e){function t(t,n,r,i,o,l){var a=e.call(this)||this;return a.selector=t,a.componentType=n,a._inputs=i,a._outputs=o,a.ngContentSelectors=l,a.viewDefFactory=r,a}return Object(Tr.__extends)(t,e),Object.defineProperty(t.prototype,"inputs",{get:function(){var e=[],t=this._inputs;for(var n in t)e.push({propName:n,templateName:t[n]});return e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"outputs",{get:function(){var e=[];for(var t in this._outputs)e.push({propName:t,templateName:this._outputs[t]});return e},enumerable:!0,configurable:!0}),t.prototype.create=function(e,t,n,r){if(!r)throw new Error("ngModule should be provided");var i=Xe(this.viewDefFactory),o=i.nodes[0].element.componentProvider.nodeIndex,l=kl.createRootView(e,t||[],n,i,r,Bl),a=Te(l,o).instance;return n&&l.renderer.setAttribute(Oe(l,0).renderElement,"ng-version",ri.full),new Wl(l,new Ul(l),a)},t}(ao),Wl=function(e){function t(t,n,r){var i=e.call(this)||this;return i._view=t,i._viewRef=n,i._component=r,i._elDef=i._view.def.nodes[0],i.hostView=n,i.changeDetectorRef=n,i.instance=r,i}return Object(Tr.__extends)(t,e),Object.defineProperty(t.prototype,"location",{get:function(){return new Bo(Oe(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Kl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._viewRef.destroy()},t.prototype.onDestroy=function(e){this._viewRef.onDestroy(e)},t}(lo),ql=function(){function e(e,t,n){this._view=e,this._elDef=t,this._data=n,this._embeddedViews=[]}return Object.defineProperty(e.prototype,"element",{get:function(){return new Bo(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return new Kl(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"parentInjector",{get:function(){for(var e=this._view,t=this._elDef.parent;!t&&e;)t=We(e),e=e.parent;return e?new Kl(e,t):new Kl(this._view,null)},enumerable:!0,configurable:!0}),e.prototype.clear=function(){for(var e=this._embeddedViews.length-1;e>=0;e--){var t=vt(this._data,e);kl.destroyView(t)}},e.prototype.get=function(e){var t=this._embeddedViews[e];if(t){var n=new Ul(t);return n.attachToViewContainerRef(this),n}return null},Object.defineProperty(e.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),e.prototype.createEmbeddedView=function(e,t,n){var r=e.createEmbeddedView(t||{});return this.insert(r,n),r},e.prototype.createComponent=function(e,t,n,r,i){var o=n||this.parentInjector;i||e instanceof fo||(i=o.get(ho));var l=e.create(o,r,void 0,i);return this.insert(l.hostView,t),l},e.prototype.insert=function(e,t){if(e.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var n=e;return function(e,t,n,r){var i=t.viewContainer._embeddedViews;null!==n&&void 0!==n||(n=i.length),r.viewContainerParent=e,wt(i,n,r),function(e,t){var n=He(t);if(n&&n!==e&&!(16&t.state)){t.state|=16;var r=n.template._projectedViews;r||(r=n.template._projectedViews=[]),r.push(t),function(e,n){if(!(4&n.flags)){t.parent.def.nodeFlags|=4,n.flags|=4;for(var r=n.parent;r;)r.childFlags|=4,r=r.parent}}(0,t.parentNodeDef)}}(t,r),kl.dirtyParentQueries(r),bt(t,n>0?i[n-1]:null,r)}(this._view,this._data,t,n._view),n.attachToViewContainerRef(this),e},e.prototype.move=function(e,t){if(e.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var n=this._embeddedViews.indexOf(e._view);return function(e,t,r){var i=e.viewContainer._embeddedViews,o=i[n];xt(i,n),null==r&&(r=i.length),wt(i,r,o),kl.dirtyParentQueries(o),_t(o),bt(e,r>0?i[r-1]:null,o)}(this._data,0,t),e},e.prototype.indexOf=function(e){return this._embeddedViews.indexOf(e._view)},e.prototype.remove=function(e){var t=vt(this._data,e);t&&kl.destroyView(t)},e.prototype.detach=function(e){var t=vt(this._data,e);return t?new Ul(t):null},e}(),Ul=function(){function e(e){this._view=e,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(e.prototype,"rootNodes",{get:function(){return function(e){var t=[];return Je(e,0,void 0,void 0,t),t}(this._view)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),e.prototype.markForCheck=function(){Ve(this._view)},e.prototype.detach=function(){this._view.state&=-5},e.prototype.detectChanges=function(){var e=this._view.root.rendererFactory;e.begin&&e.begin();try{kl.checkAndUpdateView(this._view)}finally{e.end&&e.end()}},e.prototype.checkNoChanges=function(){kl.checkNoChangesView(this._view)},e.prototype.reattach=function(){this._view.state|=4},e.prototype.onDestroy=function(e){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(e)},e.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),kl.destroyView(this._view)},e.prototype.detachFromAppRef=function(){this._appRef=null,_t(this._view),kl.dirtyParentQueries(this._view)},e.prototype.attachToAppRef=function(e){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=e},e.prototype.attachToViewContainerRef=function(e){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=e},e}(),Gl=function(e){function t(t,n){var r=e.call(this)||this;return r._parentView=t,r._def=n,r}return Object(Tr.__extends)(t,e),t.prototype.createEmbeddedView=function(e){return new Ul(kl.createEmbeddedView(this._parentView,this._def,this._def.element.template,e))},Object.defineProperty(t.prototype,"elementRef",{get:function(){return new Bo(Oe(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),t}($o),Kl=function(){function e(e,t){this.view=e,this.elDef=t}return e.prototype.get=function(e,t){return void 0===t&&(t=yi.THROW_IF_NOT_FOUND),kl.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:e,tokenKey:Pe(e)},t)},e}(),$l=function(){function e(e){this.delegate=e}return e.prototype.selectRootElement=function(e){return this.delegate.selectRootElement(e)},e.prototype.createElement=function(e,t){var n=it(t),r=this.delegate.createElement(n[1],n[0]);return e&&this.delegate.appendChild(e,r),r},e.prototype.createViewRoot=function(e){return e},e.prototype.createTemplateAnchor=function(e){var t=this.delegate.createComment("");return e&&this.delegate.appendChild(e,t),t},e.prototype.createText=function(e,t){var n=this.delegate.createText(t);return e&&this.delegate.appendChild(e,n),n},e.prototype.projectNodes=function(e,t){for(var n=0;n<t.length;n++)this.delegate.appendChild(e,t[n])},e.prototype.attachViewAfter=function(e,t){for(var n=this.delegate.parentNode(e),r=this.delegate.nextSibling(e),i=0;i<t.length;i++)this.delegate.insertBefore(n,t[i],r)},e.prototype.detachView=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=this.delegate.parentNode(n);this.delegate.removeChild(r,n)}},e.prototype.destroyView=function(e,t){for(var n=0;n<t.length;n++)this.delegate.destroyNode(t[n])},e.prototype.listen=function(e,t,n){return this.delegate.listen(e,t,n)},e.prototype.listenGlobal=function(e,t,n){return this.delegate.listen(e,t,n)},e.prototype.setElementProperty=function(e,t,n){this.delegate.setProperty(e,t,n)},e.prototype.setElementAttribute=function(e,t,n){var r=it(t),i=r[0],o=r[1];null!=n?this.delegate.setAttribute(e,o,n,i):this.delegate.removeAttribute(e,o,i)},e.prototype.setBindingDebugInfo=function(e,t,n){},e.prototype.setElementClass=function(e,t,n){n?this.delegate.addClass(e,t):this.delegate.removeClass(e,t)},e.prototype.setElementStyle=function(e,t,n){null!=n?this.delegate.setStyle(e,t,n):this.delegate.removeStyle(e,t)},e.prototype.invokeElementMethod=function(e,t,n){e[t].apply(e,n)},e.prototype.setText=function(e,t){this.delegate.setValue(e,t)},e.prototype.animate=function(){throw new Error("Renderer.animate is no longer supported!")},e}(),Zl=function(){function e(e,t,n,r){this._moduleType=e,this._parent=t,this._bootstrapComponents=n,this._def=r,this._destroyListeners=[],this._destroyed=!1,function(e){for(var t=e._def,n=e._providers=new Array(t.providers.length),r=0;r<t.providers.length;r++){var i=t.providers[r];4096&i.flags||(n[r]=yt(e,i))}}(this)}return e.prototype.get=function(e,t){return void 0===t&&(t=yi.THROW_IF_NOT_FOUND),gt(this,{token:e,tokenKey:Pe(e),flags:0},t)},Object.defineProperty(e.prototype,"instance",{get:function(){return this.get(this._moduleType)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentFactoryResolver",{get:function(){return this.get(co)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return this},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){if(this._destroyed)throw new Error("The ng module "+d(this.instance.constructor)+" has already been destroyed.");this._destroyed=!0,function(e,t){for(var n=e._def,r=0;r<n.providers.length;r++)if(131072&n.providers[r].flags){var i=e._providers[r];i&&i!==jl&&i.ngOnDestroy()}}(this),this._destroyListeners.forEach(function(e){return e()})},e.prototype.onDestroy=function(e){this._destroyListeners.push(e)},e}(),Ql=Pe(Lo),Yl=Pe(zo),Xl=Pe(Bo),Jl=Pe(Zo),ea=Pe($o),ta=Pe(Qo),na=Pe(yi),ra={},ia=function(){var e={CreateViewNodes:0,CheckNoChanges:1,CheckNoChangesProjectedViews:2,CheckAndUpdate:3,CheckAndUpdateProjectedViews:4,Destroy:5};return e[e.CreateViewNodes]="CreateViewNodes",e[e.CheckNoChanges]="CheckNoChanges",e[e.CheckNoChangesProjectedViews]="CheckNoChangesProjectedViews",e[e.CheckAndUpdate]="CheckAndUpdate",e[e.CheckAndUpdateProjectedViews]="CheckAndUpdateProjectedViews",e[e.Destroy]="Destroy",e}(),oa=!1,la=new Map,aa=new Map,sa=function(){var e={create:0,detectChanges:1,checkNoChanges:2,destroy:3,handleEvent:4};return e[e.create]="create",e[e.detectChanges]="detectChanges",e[e.checkNoChanges]="checkNoChanges",e[e.destroy]="destroy",e[e.handleEvent]="handleEvent",e}(),ua=/([A-Z])/g,ca=function(){function e(e,t){this.view=e,this.nodeIndex=t,null==t&&(this.nodeIndex=t=0),this.nodeDef=e.def.nodes[t];for(var n=this.nodeDef,r=e;n&&0==(1&n.flags);)n=n.parent;if(!n)for(;!n&&r;)n=We(r),r=r.parent;this.elDef=n,this.elView=r}return Object.defineProperty(e.prototype,"elOrCompView",{get:function(){return Oe(this.elView,this.elDef.nodeIndex).componentView||this.view},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return kt(this.elView,this.elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"component",{get:function(){return this.elOrCompView.component},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"context",{get:function(){return this.elOrCompView.context},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"providerTokens",{get:function(){var e=[];if(this.elDef)for(var t=this.elDef.nodeIndex+1;t<=this.elDef.nodeIndex+this.elDef.childCount;t++){var n=this.elView.def.nodes[t];20224&n.flags&&e.push(n.provider.token),t+=n.childCount}return e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"references",{get:function(){var e={};if(this.elDef){Xn(this.elView,this.elDef,e);for(var t=this.elDef.nodeIndex+1;t<=this.elDef.nodeIndex+this.elDef.childCount;t++){var n=this.elView.def.nodes[t];20224&n.flags&&Xn(this.elView,n,e),t+=n.childCount}}return e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentRenderElement",{get:function(){var e=function(e){for(;e&&!Ge(e);)e=e.parent;return e.parent?Oe(e.parent,We(e).nodeIndex):null}(this.elOrCompView);return e?e.renderElement:void 0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"renderNode",{get:function(){return 2&this.nodeDef.flags?qe(this.view,this.nodeDef):qe(this.elView,this.elDef)},enumerable:!0,configurable:!0}),e.prototype.logError=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r,i;2&this.nodeDef.flags?(r=this.view.def,i=this.nodeDef.nodeIndex):(r=this.elView.def,i=this.elDef.nodeIndex);var o=function(e,t){for(var n=-1,r=0;r<=t;r++)3&e.nodes[r].flags&&n++;return n}(r,i),l=-1;r.factory(function(){return++l===o?(n=e.error).bind.apply(n,[e].concat(t)):Dl;var n}),l<o&&(e.error("Illegal state: the ViewDefinitionFactory did not call the logger!"),e.error.apply(e,t))},e}(),da=function(){function e(e){this.delegate=e}return e.prototype.createRenderer=function(e,t){return new pa(this.delegate.createRenderer(e,t))},e.prototype.begin=function(){this.delegate.begin&&this.delegate.begin()},e.prototype.end=function(){this.delegate.end&&this.delegate.end()},e.prototype.whenRenderingDone=function(){return this.delegate.whenRenderingDone?this.delegate.whenRenderingDone():Promise.resolve(null)},e}(),pa=function(){function e(e){this.delegate=e}return Object.defineProperty(e.prototype,"data",{get:function(){return this.delegate.data},enumerable:!0,configurable:!0}),e.prototype.destroyNode=function(e){!function(e){tl.delete(e.nativeNode)}(he(e)),this.delegate.destroyNode&&this.delegate.destroyNode(e)},e.prototype.destroy=function(){this.delegate.destroy()},e.prototype.createElement=function(e,t){var n=this.delegate.createElement(e,t),r=er();if(r){var i=new el(n,null,r);i.name=e,me(i)}return n},e.prototype.createComment=function(e){var t=this.delegate.createComment(e),n=er();return n&&me(new Jo(t,null,n)),t},e.prototype.createText=function(e){var t=this.delegate.createText(e),n=er();return n&&me(new Jo(t,null,n)),t},e.prototype.appendChild=function(e,t){var n=he(e),r=he(t);n&&r&&n instanceof el&&n.addChild(r),this.delegate.appendChild(e,t)},e.prototype.insertBefore=function(e,t,n){var r=he(e),i=he(t),o=he(n);r&&i&&r instanceof el&&r.insertBefore(o,i),this.delegate.insertBefore(e,t,n)},e.prototype.removeChild=function(e,t){var n=he(e),r=he(t);n&&r&&n instanceof el&&n.removeChild(r),this.delegate.removeChild(e,t)},e.prototype.selectRootElement=function(e){var t=this.delegate.selectRootElement(e),n=er();return n&&me(new el(t,null,n)),t},e.prototype.setAttribute=function(e,t,n,r){var i=he(e);i&&i instanceof el&&(i.attributes[r?r+":"+t:t]=n),this.delegate.setAttribute(e,t,n,r)},e.prototype.removeAttribute=function(e,t,n){var r=he(e);r&&r instanceof el&&(r.attributes[n?n+":"+t:t]=null),this.delegate.removeAttribute(e,t,n)},e.prototype.addClass=function(e,t){var n=he(e);n&&n instanceof el&&(n.classes[t]=!0),this.delegate.addClass(e,t)},e.prototype.removeClass=function(e,t){var n=he(e);n&&n instanceof el&&(n.classes[t]=!1),this.delegate.removeClass(e,t)},e.prototype.setStyle=function(e,t,n,r){var i=he(e);i&&i instanceof el&&(i.styles[t]=n),this.delegate.setStyle(e,t,n,r)},e.prototype.removeStyle=function(e,t,n){var r=he(e);r&&r instanceof el&&(r.styles[t]=null),this.delegate.removeStyle(e,t,n)},e.prototype.setProperty=function(e,t,n){var r=he(e);r&&r instanceof el&&(r.properties[t]=n),this.delegate.setProperty(e,t,n)},e.prototype.listen=function(e,t,n){if("string"!=typeof e){var r=he(e);r&&r.listeners.push(new function(e,t){this.name=e,this.callback=t}(t,n))}return this.delegate.listen(e,t,n)},e.prototype.parentNode=function(e){return this.delegate.parentNode(e)},e.prototype.nextSibling=function(e){return this.delegate.nextSibling(e)},e.prototype.setValue=function(e,t){return this.delegate.setValue(e,t)},e}(),fa=function(e){function t(t,n,r){var i=e.call(this)||this;return i.moduleType=t,i._bootstrapComponents=n,i._ngModuleDefFactory=r,i}return Object(Tr.__extends)(t,e),t.prototype.create=function(e){kn();var t=Xe(this._ngModuleDefFactory);return kl.createNgModuleRef(this.moduleType,e||yi.NULL,this._bootstrapComponents,t)},t}(mo),ha="*"}.call(t,n("fRUx"))},LaOa:function(e,t,n){"use strict";t.a=function(e,t){return function(n){return n.lift(new o(e,t))}};var r=n("6Xbx"),i=n("E9/g"),o=function(){function e(e,t){this.predicate=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new l(e,this.predicate,this.thisArg))},e}(),l=function(e){function t(t,n,r){e.call(this,t),this.predicate=n,this.thisArg=r,this.count=0}return Object(r.__extends)(t,e),t.prototype._next=function(e){var t;try{t=this.predicate.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}t&&this.destination.next(e)},t}(i.a)},Lcie:function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},MwgA:function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},NGRF:function(e,t,n){"use strict";t.a=function(e){return null!=e&&"object"==typeof e}},NePw:function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r={e:{}}},Oryw:function(e,t,n){"use strict";n.d(t,"a",function(){return s});var r=n("6Xbx"),i=n("AP4T"),o=n("8Ut3"),l=n("Ecq+"),a=n("3iOE"),s=function(e){function t(t,n){e.call(this),this.array=t,this.scheduler=n,n||1!==t.length||(this._isScalar=!0,this.value=t[0])}return Object(r.__extends)(t,e),t.create=function(e,n){return new t(e,n)},t.of=function(){for(var e=[],n=0;n<arguments.length;n++)e[n-0]=arguments[n];var r=e[e.length-1];Object(a.a)(r)?e.pop():r=null;var i=e.length;return i>1?new t(e,r):1===i?new o.a(e[0],r):new l.a(r)},t.dispatch=function(e){var t=e.array,n=e.index,r=e.subscriber;n>=e.count?r.complete():(r.next(t[n]),r.closed||(e.index=n+1,this.schedule(e)))},t.prototype._subscribe=function(e){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(t.dispatch,0,{array:n,index:0,count:r,subscriber:e});for(var o=0;o<r&&!e.closed;o++)e.next(n[o]);e.complete()},t}(i.a)},P0cP:function(e,t,n){"use strict";var r=n("6Xbx").__decorate;Object.defineProperty(t,"__esModule",{value:!0});var i=n("LMZF"),o=function(){function e(){}return e.prototype.equals=function(e,t,n){return n?this.resolveFieldData(e,n)===this.resolveFieldData(t,n):this.equalsByValue(e,t)},e.prototype.equalsByValue=function(e,t){if(null==e&&null==t)return!0;if(null==e||null==t)return!1;if(e==t)return delete e._$visited,!0;if("object"==typeof e&&"object"==typeof t){e._$visited=!0;for(var n in e)if("_$visited"!==n){if(e.hasOwnProperty(n)!==t.hasOwnProperty(n))return!1;switch(typeof e[n]){case"object":if(e[n]&&e[n]._$visited||!this.equals(e[n],t[n]))return!1;break;case"function":if(void 0===t[n]||"compare"!=n&&e[n].toString()!=t[n].toString())return!1;break;default:if(e[n]!=t[n])return!1}}for(var n in t)if(void 0===e[n])return!1;return delete e._$visited,!0}return!1},e.prototype.resolveFieldData=function(e,t){if(e&&t){if(-1==t.indexOf("."))return e[t];for(var n=t.split("."),r=e,i=0,o=n.length;i<o;++i){if(null==r)return null;r=r[n[i]]}return r}return null},e.prototype.filter=function(e,t,n){var r=[];if(e)for(var i=0,o=e;i<o.length;i++)for(var l=o[i],a=0,s=t;a<s.length;a++){var u=s[a];if(String(this.resolveFieldData(l,u)).toLowerCase().indexOf(n.toLowerCase())>-1){r.push(l);break}}return r},e.prototype.reorderArray=function(e,t,n){var r;if(e&&t!==n){if(n>=e.length)for(r=n-e.length;1+r--;)e.push(void 0);e.splice(n,0,e.splice(t,1)[0])}},e.prototype.generateSelectItems=function(e,t){var n;if(e&&e.length){n=[];for(var r=0,i=e;r<i.length;r++){var o=i[r];n.push({label:this.resolveFieldData(o,t),value:o})}}return n},e}();o=r([i.Injectable()],o),t.ObjectUtils=o},P6IN:function(e,t,n){var r=n("tose").f,i=n("rMsi"),o=n("3r0D")("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},PAZ8:function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("AP4T"),i=function(){function e(e,t,n){this.kind=e,this.value=t,this.error=n,this.hasValue="N"===e}return e.prototype.observe=function(e){switch(this.kind){case"N":return e.next&&e.next(this.value);case"E":return e.error&&e.error(this.error);case"C":return e.complete&&e.complete()}},e.prototype.do=function(e,t,n){switch(this.kind){case"N":return e&&e(this.value);case"E":return t&&t(this.error);case"C":return n&&n()}},e.prototype.accept=function(e,t,n){return e&&"function"==typeof e.next?this.observe(e):this.do(e,t,n)},e.prototype.toObservable=function(){switch(this.kind){case"N":return r.a.of(this.value);case"E":return r.a.throw(this.error);case"C":return r.a.empty()}throw new Error("unexpected notification kind value")},e.createNext=function(t){return void 0!==t?new e("N",t):e.undefinedValueNotification},e.createError=function(t){return new e("E",void 0,t)},e.createComplete=function(){return e.completeNotification},e.completeNotification=new e("C"),e.undefinedValueNotification=new e("N",void 0),e}()},"PR+T":function(e,t,n){"use strict";t.a=function(){}},Ps07:function(e,t,n){"use strict";var r=n("3LDD"),i=n("Y5fy");e.exports=n("cpZ/")("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(i(this,"Set"),e=0===e?0:e,e)}},r)},QZhw:function(e,t,n){"use strict";var r,i=n("BCYq")(0),o=n("lfBE"),l=n("xI8H"),a=n("rIdM"),s=n("XRS9"),u=n("JXkd"),c=n("umMR"),d=n("Y5fy"),p=l.getWeak,f=Object.isExtensible,h=s.ufstore,m={},g=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},y={get:function(e){if(u(e)){var t=p(e);return!0===t?h(d(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return s.def(d(this,"WeakMap"),e,t)}},v=e.exports=n("cpZ/")("WeakMap",g,y,s,!0,!0);c(function(){return 7!=(new v).set((Object.freeze||Object)(m),7).get(m)})&&(a((r=s.getConstructor(g,"WeakMap")).prototype,y),l.NEED=!0,i(["delete","has","get","set"],function(e){var t=v.prototype,n=t[e];o(t,e,function(t,i){if(u(t)&&!f(t)){this._f||(this._f=new r);var o=this._f[e](t,i);return"set"==e?this:o}return n.call(this,t,i)})}))},QhpF:function(e,t,n){"use strict";var r=n("6Xbx").__decorate,i=n("6Xbx").__metadata,o=n("6Xbx").__param;Object.defineProperty(t,"__esModule",{value:!0});var l=n("LMZF"),a=n("LMZF"),s=n("Un6q"),u=n("/zAi"),c=n("/zAi"),d=(n("H0Ur"),function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.template,{$implicit:this.node})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}());r([l.Input(),i("design:type",Object)],d.prototype,"node",void 0),r([l.Input(),i("design:type",l.TemplateRef)],d.prototype,"template",void 0),d=r([l.Component({selector:"p-treeNodeTemplateLoader",template:""})],d),t.TreeNodeTemplateLoader=d;var p=m=function(){function e(e){this.tree=e}return e.prototype.ngOnInit=function(){this.node.parent=this.parentNode},e.prototype.getIcon=function(){var e;return e=this.node.icon?this.node.icon:this.node.expanded&&this.node.children&&this.node.children.length?this.node.expandedIcon:this.node.collapsedIcon,m.ICON_CLASS+" "+e},e.prototype.isLeaf=function(){return 0!=this.node.leaf&&!(this.node.children&&this.node.children.length)},e.prototype.toggle=function(e){this.node.expanded?this.tree.onNodeCollapse.emit({originalEvent:e,node:this.node}):this.tree.onNodeExpand.emit({originalEvent:e,node:this.node}),this.node.expanded=!this.node.expanded},e.prototype.onNodeClick=function(e){this.tree.onNodeClick(e,this.node)},e.prototype.onNodeTouchEnd=function(){this.tree.onNodeTouchEnd()},e.prototype.onNodeRightClick=function(e){this.tree.onNodeRightClick(e,this.node)},e.prototype.isSelected=function(){return this.tree.isSelected(this.node)},e.prototype.onDropPoint=function(e,t){e.preventDefault();var n=this.tree.dragNode,r=this.tree.dragNodeIndex,i=this.tree.dragNodeTree!==this.tree||1===t||r!==this.index-1;if(this.tree.allowDrop(n,this.node,this.tree.dragNodeScope)&&i){var o=this.node.parent?this.node.parent.children:this.tree.value;this.tree.dragNodeSubNodes.splice(r,1);var l=this.index;t<0?o.splice(l=this.tree.dragNodeSubNodes===o?this.tree.dragNodeIndex>this.index?this.index:this.index-1:this.index,0,n):(l=o.length,o.push(n)),this.tree.dragDropService.stopDrag({node:n,subNodes:this.node.parent?this.node.parent.children:this.tree.value,index:r}),this.tree.onNodeDrop.emit({originalEvent:e,dragNode:n,dropNode:this.node,dropIndex:l})}this.draghoverPrev=!1,this.draghoverNext=!1},e.prototype.onDropPointDragOver=function(e){e.dataTransfer.dropEffect="move",e.preventDefault()},e.prototype.onDropPointDragEnter=function(e,t){this.tree.allowDrop(this.tree.dragNode,this.node,this.tree.dragNodeScope)&&(t<0?this.draghoverPrev=!0:this.draghoverNext=!0)},e.prototype.onDropPointDragLeave=function(e){this.draghoverPrev=!1,this.draghoverNext=!1},e.prototype.onDragStart=function(e){this.tree.draggableNodes&&!1!==this.node.draggable?(e.dataTransfer.setData("text","data"),this.tree.dragDropService.startDrag({tree:this,node:this.node,subNodes:this.node.parent?this.node.parent.children:this.tree.value,index:this.index,scope:this.tree.draggableScope})):e.preventDefault()},e.prototype.onDragStop=function(e){this.tree.dragDropService.stopDrag({node:this.node,subNodes:this.node.parent?this.node.parent.children:this.tree.value,index:this.index})},e.prototype.onDropNodeDragOver=function(e){e.dataTransfer.dropEffect="move",this.tree.droppableNodes&&(e.preventDefault(),e.stopPropagation())},e.prototype.onDropNode=function(e){if(this.tree.droppableNodes&&!1!==this.node.droppable){e.preventDefault(),e.stopPropagation();var t=this.tree.dragNode;this.tree.allowDrop(t,this.node,this.tree.dragNodeScope)&&(this.tree.dragNodeSubNodes.splice(this.tree.dragNodeIndex,1),this.node.children?this.node.children.push(t):this.node.children=[t],this.tree.dragDropService.stopDrag({node:t,subNodes:this.node.parent?this.node.parent.children:this.tree.value,index:this.tree.dragNodeIndex}),this.tree.onNodeDrop.emit({originalEvent:e,dragNode:t,dropNode:this.node,index:this.index}))}this.draghoverNode=!1},e.prototype.onDropNodeDragEnter=function(e){this.tree.droppableNodes&&!1!==this.node.droppable&&this.tree.allowDrop(this.tree.dragNode,this.node,this.tree.dragNodeScope)&&(this.draghoverNode=!0)},e.prototype.onDropNodeDragLeave=function(e){if(this.tree.droppableNodes){var t=e.currentTarget.getBoundingClientRect();(e.x>t.left+t.width||e.x<t.left||e.y>=Math.floor(t.top+t.height)||e.y<t.top)&&(this.draghoverNode=!1)}},e}();p.ICON_CLASS="ui-treenode-icon fa fa-fw",r([l.Input(),i("design:type",Object)],p.prototype,"node",void 0),r([l.Input(),i("design:type",Object)],p.prototype,"parentNode",void 0),r([l.Input(),i("design:type",Boolean)],p.prototype,"root",void 0),r([l.Input(),i("design:type",Number)],p.prototype,"index",void 0),r([l.Input(),i("design:type",Boolean)],p.prototype,"firstChild",void 0),r([l.Input(),i("design:type",Boolean)],p.prototype,"lastChild",void 0),p=m=r([l.Component({selector:"p-treeNode",template:'\n        <ng-template [ngIf]="node">\n            <li *ngIf="tree.droppableNodes" class="ui-treenode-droppoint" [ngClass]="{\'ui-treenode-droppoint-active ui-state-highlight\':draghoverPrev}"\n            (drop)="onDropPoint($event,-1)" (dragover)="onDropPointDragOver($event)" (dragenter)="onDropPointDragEnter($event,-1)" (dragleave)="onDropPointDragLeave($event)"></li>\n            <li *ngIf="!tree.horizontal" [ngClass]="[\'ui-treenode\',node.styleClass||\'\', isLeaf() ? \'ui-treenode-leaf\': \'\']">\n                <div class="ui-treenode-content" (click)="onNodeClick($event)" (contextmenu)="onNodeRightClick($event)" (touchend)="onNodeTouchEnd()"\n                    (drop)="onDropNode($event)" (dragover)="onDropNodeDragOver($event)" (dragenter)="onDropNodeDragEnter($event)" (dragleave)="onDropNodeDragLeave($event)"\n                    [ngClass]="{\'ui-treenode-selectable\':tree.selectionMode && node.selectable !== false,\'ui-treenode-dragover\':draghoverNode, \'ui-treenode-content-selected\':isSelected()}" [draggable]="tree.draggableNodes" (dragstart)="onDragStart($event)" (dragend)="onDragStop($event)">\n                    <span class="ui-tree-toggler  fa fa-fw" [ngClass]="{\'fa-caret-right\':!node.expanded,\'fa-caret-down\':node.expanded}"\n                            (click)="toggle($event)"></span\n                    ><div class="ui-chkbox" *ngIf="tree.selectionMode == \'checkbox\'"><div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default">\n                        <span class="ui-chkbox-icon ui-clickable fa" \n                            [ngClass]="{\'fa-check\':isSelected(),\'fa-minus\':node.partialSelected}"></span></div></div\n                    ><span [class]="getIcon()" *ngIf="node.icon||node.expandedIcon||node.collapsedIcon"></span\n                    ><span class="ui-treenode-label ui-corner-all" \n                        [ngClass]="{\'ui-state-highlight\':isSelected()}">\n                            <span *ngIf="!tree.getTemplateForNode(node)">{{node.label}}</span>\n                            <span *ngIf="tree.getTemplateForNode(node)">\n                                <p-treeNodeTemplateLoader [node]="node" [template]="tree.getTemplateForNode(node)"></p-treeNodeTemplateLoader>\n                            </span>\n                    </span>\n                </div>\n                <ul class="ui-treenode-children" style="display: none;" *ngIf="node.children && node.expanded" [style.display]="node.expanded ? \'block\' : \'none\'">\n                    <p-treeNode *ngFor="let childNode of node.children;let firstChild=first;let lastChild=last; let index=index" [node]="childNode" [parentNode]="node"\n                        [firstChild]="firstChild" [lastChild]="lastChild" [index]="index"></p-treeNode>\n                </ul>\n            </li>\n            <li *ngIf="tree.droppableNodes&&lastChild" class="ui-treenode-droppoint" [ngClass]="{\'ui-treenode-droppoint-active ui-state-highlight\':draghoverNext}"\n            (drop)="onDropPoint($event,1)" (dragover)="onDropPointDragOver($event)" (dragenter)="onDropPointDragEnter($event,1)" (dragleave)="onDropPointDragLeave($event)"></li>\n            <table *ngIf="tree.horizontal" [class]="node.styleClass">\n                <tbody>\n                    <tr>\n                        <td class="ui-treenode-connector" *ngIf="!root">\n                            <table class="ui-treenode-connector-table">\n                                <tbody>\n                                    <tr>\n                                        <td [ngClass]="{\'ui-treenode-connector-line\':!firstChild}"></td>\n                                    </tr>\n                                    <tr>\n                                        <td [ngClass]="{\'ui-treenode-connector-line\':!lastChild}"></td>\n                                    </tr>\n                                </tbody>\n                            </table>\n                        </td>\n                        <td class="ui-treenode" [ngClass]="{\'ui-treenode-collapsed\':!node.expanded}">\n                            <div class="ui-treenode-content ui-state-default ui-corner-all" \n                                [ngClass]="{\'ui-treenode-selectable\':tree.selectionMode,\'ui-state-highlight\':isSelected()}" (click)="onNodeClick($event)" (contextmenu)="onNodeRightClick($event)"\n                                (touchend)="onNodeTouchEnd()">\n                                <span class="ui-tree-toggler fa fa-fw" [ngClass]="{\'fa-plus\':!node.expanded,\'fa-minus\':node.expanded}" *ngIf="!isLeaf()"\n                                        (click)="toggle($event)"></span\n                                ><span [class]="getIcon()" *ngIf="node.icon||node.expandedIcon||node.collapsedIcon"></span\n                                ><span class="ui-treenode-label ui-corner-all">\n                                        <span *ngIf="!tree.getTemplateForNode(node)">{{node.label}}</span>\n                                        <span *ngIf="tree.getTemplateForNode(node)">\n                                            <p-treeNodeTemplateLoader [node]="node" [template]="tree.getTemplateForNode(node)"></p-treeNodeTemplateLoader>\n                                        </span>\n                                </span>\n                            </div>\n                        </td>\n                        <td class="ui-treenode-children-container" *ngIf="node.children && node.expanded" [style.display]="node.expanded ? \'table-cell\' : \'none\'">\n                            <div class="ui-treenode-children">\n                                <p-treeNode *ngFor="let childNode of node.children;let firstChild=first;let lastChild=last;" [node]="childNode" \n                                        [firstChild]="firstChild" [lastChild]="lastChild"></p-treeNode>\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </ng-template>\n    '}),o(0,l.Inject(l.forwardRef(function(){return f})))],p),t.UITreeNode=p;var f=function(){function e(e){this.dragDropService=e,this.selectionChange=new l.EventEmitter,this.onNodeSelect=new l.EventEmitter,this.onNodeUnselect=new l.EventEmitter,this.onNodeExpand=new l.EventEmitter,this.onNodeCollapse=new l.EventEmitter,this.onNodeContextMenuSelect=new l.EventEmitter,this.onNodeDrop=new l.EventEmitter,this.layout="vertical",this.metaKeySelection=!0,this.propagateSelectionUp=!0,this.propagateSelectionDown=!0,this.loadingIcon="fa-circle-o-notch"}return e.prototype.ngOnInit=function(){var e=this;this.droppableNodes&&(this.dragStartSubscription=this.dragDropService.dragStart$.subscribe(function(t){e.dragNodeTree=t.tree,e.dragNode=t.node,e.dragNodeSubNodes=t.subNodes,e.dragNodeIndex=t.index,e.dragNodeScope=t.scope}),this.dragStopSubscription=this.dragDropService.dragStop$.subscribe(function(t){e.dragNodeTree=null,e.dragNode=null,e.dragNodeSubNodes=null,e.dragNodeIndex=null,e.dragNodeScope=null,e.dragHover=!1}))},Object.defineProperty(e.prototype,"horizontal",{get:function(){return"horizontal"==this.layout},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){var e=this;this.templates.length&&(this.templateMap={}),this.templates.forEach(function(t){e.templateMap[t.name]=t.template})},e.prototype.onNodeClick=function(e,t){var n=e.target;if(!n.className||0!==n.className.indexOf("ui-tree-toggler")){if(this.selectionMode){if(!1===t.selectable)return;var r=this.findIndexInSelection(t),i=r>=0;if(this.isCheckboxSelectionMode())i?(this.propagateSelectionDown?this.propagateDown(t,!1):this.selection=this.selection.filter(function(e,t){return t!=r}),this.propagateSelectionUp&&t.parent&&this.propagateUp(t.parent,!1),this.selectionChange.emit(this.selection),this.onNodeUnselect.emit({originalEvent:e,node:t})):(this.propagateSelectionDown?this.propagateDown(t,!0):this.selection=(this.selection||[]).concat([t]),this.propagateSelectionUp&&t.parent&&this.propagateUp(t.parent,!0),this.selectionChange.emit(this.selection),this.onNodeSelect.emit({originalEvent:e,node:t}));else if(!this.nodeTouched&&this.metaKeySelection){var o=e.metaKey||e.ctrlKey;i&&o?(this.isSingleSelectionMode()?this.selectionChange.emit(null):(this.selection=this.selection.filter(function(e,t){return t!=r}),this.selectionChange.emit(this.selection)),this.onNodeUnselect.emit({originalEvent:e,node:t})):(this.isSingleSelectionMode()?this.selectionChange.emit(t):this.isMultipleSelectionMode()&&(this.selection=o?this.selection||[]:[],this.selection=this.selection.concat([t]),this.selectionChange.emit(this.selection)),this.onNodeSelect.emit({originalEvent:e,node:t}))}else this.isSingleSelectionMode()?i?(this.selection=null,this.onNodeUnselect.emit({originalEvent:e,node:t})):(this.selection=t,this.onNodeSelect.emit({originalEvent:e,node:t})):i?(this.selection=this.selection.filter(function(e,t){return t!=r}),this.onNodeUnselect.emit({originalEvent:e,node:t})):(this.selection=(this.selection||[]).concat([t]),this.onNodeSelect.emit({originalEvent:e,node:t})),this.selectionChange.emit(this.selection)}this.nodeTouched=!1}},e.prototype.onNodeTouchEnd=function(){this.nodeTouched=!0},e.prototype.onNodeRightClick=function(e,t){if(this.contextMenu){var n=e.target;if(n.className&&0===n.className.indexOf("ui-tree-toggler"))return;this.findIndexInSelection(t)>=0||(this.isSingleSelectionMode()?this.selectionChange.emit(t):this.selectionChange.emit([t])),this.contextMenu.show(e),this.onNodeContextMenuSelect.emit({originalEvent:e,node:t})}},e.prototype.findIndexInSelection=function(e){var t=-1;if(this.selectionMode&&this.selection)if(this.isSingleSelectionMode())t=this.selection==e?0:-1;else for(var n=0;n<this.selection.length;n++)if(this.selection[n]==e){t=n;break}return t},e.prototype.propagateUp=function(e,t){if(e.children&&e.children.length){for(var n=0,r=!1,i=0,o=e.children;i<o.length;i++){var l=o[i];this.isSelected(l)?n++:l.partialSelected&&(r=!0)}if(t&&n==e.children.length)this.selection=(this.selection||[]).concat([e]),e.partialSelected=!1;else{if(!t){var a=this.findIndexInSelection(e);a>=0&&(this.selection=this.selection.filter(function(e,t){return t!=a}))}e.partialSelected=!!(r||n>0&&n!=e.children.length)}}var s=e.parent;s&&this.propagateUp(s,t)},e.prototype.propagateDown=function(e,t){var n=this.findIndexInSelection(e);if(t&&-1==n?this.selection=(this.selection||[]).concat([e]):!t&&n>-1&&(this.selection=this.selection.filter(function(e,t){return t!=n})),e.partialSelected=!1,e.children&&e.children.length)for(var r=0,i=e.children;r<i.length;r++)this.propagateDown(i[r],t)},e.prototype.isSelected=function(e){return-1!=this.findIndexInSelection(e)},e.prototype.isSingleSelectionMode=function(){return this.selectionMode&&"single"==this.selectionMode},e.prototype.isMultipleSelectionMode=function(){return this.selectionMode&&"multiple"==this.selectionMode},e.prototype.isCheckboxSelectionMode=function(){return this.selectionMode&&"checkbox"==this.selectionMode},e.prototype.getTemplateForNode=function(e){return this.templateMap?e.type?this.templateMap[e.type]:this.templateMap.default:null},e.prototype.onDragOver=function(e){!this.droppableNodes||this.value&&0!==this.value.length||(e.dataTransfer.dropEffect="move",e.preventDefault())},e.prototype.onDrop=function(e){if(this.droppableNodes&&(!this.value||0===this.value.length)){e.preventDefault();var t=this.dragNode;this.allowDrop(t,null,this.dragNodeScope)&&(this.dragNodeSubNodes.splice(this.dragNodeIndex,1),this.value=this.value||[],this.value.push(t),this.dragDropService.stopDrag({node:t}))}},e.prototype.onDragEnter=function(e){this.droppableNodes&&this.allowDrop(this.dragNode,null,this.dragNodeScope)&&(this.dragHover=!0)},e.prototype.onDragLeave=function(e){if(this.droppableNodes){var t=e.currentTarget.getBoundingClientRect();(e.x>t.left+t.width||e.x<t.left||e.y>t.top+t.height||e.y<t.top)&&(this.dragHover=!1)}},e.prototype.allowDrop=function(e,t,n){if(this.isValidDragScope(n)){var r=!0;if(t)if(e===t)r=!1;else for(var i=t.parent;null!=i;){if(i===e){r=!1;break}i=i.parent}return r}return!1},e.prototype.isValidDragScope=function(e){var t=this.droppableScope;if(t){if("string"==typeof t){if("string"==typeof e)return t===e;if(e instanceof Array)return-1!=e.indexOf(t)}else if(t instanceof Array){if("string"==typeof e)return-1!=t.indexOf(e);if(e instanceof Array)for(var n=0,r=t;n<r.length;n++)for(var i=r[n],o=0,l=e;o<l.length;o++)if(i===l[o])return!0}return!1}return!0},e.prototype.ngOnDestroy=function(){this.dragStartSubscription&&this.dragStartSubscription.unsubscribe(),this.dragStopSubscription&&this.dragStopSubscription.unsubscribe()},e}();r([l.Input(),i("design:type",Array)],f.prototype,"value",void 0),r([l.Input(),i("design:type",String)],f.prototype,"selectionMode",void 0),r([l.Input(),i("design:type",Object)],f.prototype,"selection",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"selectionChange",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeSelect",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeUnselect",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeExpand",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeCollapse",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeContextMenuSelect",void 0),r([l.Output(),i("design:type",l.EventEmitter)],f.prototype,"onNodeDrop",void 0),r([l.Input(),i("design:type",Object)],f.prototype,"style",void 0),r([l.Input(),i("design:type",String)],f.prototype,"styleClass",void 0),r([l.Input(),i("design:type",Object)],f.prototype,"contextMenu",void 0),r([l.Input(),i("design:type",String)],f.prototype,"layout",void 0),r([l.Input(),i("design:type",Object)],f.prototype,"draggableScope",void 0),r([l.Input(),i("design:type",Object)],f.prototype,"droppableScope",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"draggableNodes",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"droppableNodes",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"metaKeySelection",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"propagateSelectionUp",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"propagateSelectionDown",void 0),r([l.Input(),i("design:type",Boolean)],f.prototype,"loading",void 0),r([l.Input(),i("design:type",String)],f.prototype,"loadingIcon",void 0),r([l.ContentChildren(c.PrimeTemplate),i("design:type",l.QueryList)],f.prototype,"templates",void 0),f=r([l.Component({selector:"p-tree",template:'\n        <div [ngClass]="{\'ui-tree ui-widget ui-widget-content ui-corner-all\':true,\'ui-tree-selectable\':selectionMode,\'ui-treenode-dragover\':dragHover,\'ui-tree-loading\': loading}" [ngStyle]="style" [class]="styleClass" *ngIf="!horizontal"\n            (drop)="onDrop($event)" (dragover)="onDragOver($event)" (dragenter)="onDragEnter($event)" (dragleave)="onDragLeave($event)">\n            <div class="ui-tree-loading-mask ui-widget-overlay" *ngIf="loading"></div>\n            <div class="ui-tree-loading-content" *ngIf="loading">\n                <i [class]="\'fa fa-spin fa-2x \' + loadingIcon"></i>\n            </div>\n            <ul class="ui-tree-container">\n                <p-treeNode *ngFor="let node of value;let firstChild=first;let lastChild=last; let index=index" [node]="node" \n                [firstChild]="firstChild" [lastChild]="lastChild" [index]="index"></p-treeNode>\n            </ul>\n        </div>\n        <div [ngClass]="{\'ui-tree ui-tree-horizontal ui-widget ui-widget-content ui-corner-all\':true,\'ui-tree-selectable\':selectionMode}"  [ngStyle]="style" [class]="styleClass" *ngIf="horizontal">\n            <div class="ui-tree-loading ui-widget-overlay" *ngIf="loading"></div>\n            <div class="ui-tree-loading-content" *ngIf="loading">\n                <i [class]="\'fa fa-spin fa-2x \' + loadingIcon"></i>\n            </div>\n            <table *ngIf="value&&value[0]">\n                <p-treeNode [node]="value[0]" [root]="true"></p-treeNode>\n            </table>\n        </div>\n    '}),o(0,a.Optional())],f),t.Tree=f;var h=function(){};h=r([l.NgModule({imports:[s.CommonModule],exports:[f,u.SharedModule],declarations:[f,p,d]})],h),t.TreeModule=h;var m},R5c1:function(e,t,n){var r=n("rMsi"),i=n("+GRi"),o=n("vyV2")(!1),l=n("yIWP")("IE_PROTO");e.exports=function(e,t){var n,a=i(e),s=0,u=[];for(n in a)n!=l&&r(a,n)&&u.push(n);for(;t.length>s;)r(a,n=t[s++])&&(~o(u,n)||u.push(n));return u}},RT4T:function(e,t,n){var r=n("Wy9r");e.exports=function(e){return Object(r(e))}},Rs3a:function(e,t,n){"use strict";var r=n("6Xbx").__decorate,i=n("6Xbx").__metadata;Object.defineProperty(t,"__esModule",{value:!0});var o=n("LMZF"),l=n("Un6q"),a=n("0nO6"),s=n("wRXj"),u=function(){function e(){this.pageLinkSize=5,this.onPageChange=new o.EventEmitter,this.alwaysShow=!0,this._totalRecords=0,this._first=0,this._rows=0}return Object.defineProperty(e.prototype,"totalRecords",{get:function(){return this._totalRecords},set:function(e){this._totalRecords=e,this.updatePageLinks()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"first",{get:function(){return this._first},set:function(e){this._first=e,this.updatePageLinks()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rows",{get:function(){return this._rows},set:function(e){this._rows=e,this.updatePageLinks()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rowsPerPageOptions",{get:function(){return this._rowsPerPageOptions},set:function(e){if(this._rowsPerPageOptions=e,this._rowsPerPageOptions){this.rowsPerPageItems=[];for(var t=0,n=this._rowsPerPageOptions;t<n.length;t++){var r=n[t];this.rowsPerPageItems.push({label:String(r),value:r})}}},enumerable:!0,configurable:!0}),e.prototype.isFirstPage=function(){return 0===this.getPage()},e.prototype.isLastPage=function(){return this.getPage()===this.getPageCount()-1},e.prototype.getPageCount=function(){return Math.ceil(this.totalRecords/this.rows)||1},e.prototype.calculatePageLinkBoundaries=function(){var e=this.getPageCount(),t=Math.min(this.pageLinkSize,e),n=Math.max(0,Math.ceil(this.getPage()-t/2)),r=Math.min(e-1,n+t-1),i=this.pageLinkSize-(r-n+1);return n=Math.max(0,n-i),[n,r]},e.prototype.updatePageLinks=function(){this.pageLinks=[];for(var e=this.calculatePageLinkBoundaries(),t=e[1],n=e[0];n<=t;n++)this.pageLinks.push(n+1)},e.prototype.changePage=function(e){var t=this.getPageCount();if(e>=0&&e<t){this.first=this.rows*e;var n={page:e,first:this.first,rows:this.rows,pageCount:t};this.updatePageLinks(),this.onPageChange.emit(n)}},e.prototype.getPage=function(){return Math.floor(this.first/this.rows)},e.prototype.changePageToFirst=function(e){this.isFirstPage()||this.changePage(0),e.preventDefault()},e.prototype.changePageToPrev=function(e){this.changePage(this.getPage()-1),e.preventDefault()},e.prototype.changePageToNext=function(e){this.changePage(this.getPage()+1),e.preventDefault()},e.prototype.changePageToLast=function(e){this.isLastPage()||this.changePage(this.getPageCount()-1),e.preventDefault()},e.prototype.onPageLinkClick=function(e,t){this.changePage(t),e.preventDefault()},e.prototype.onRppChange=function(e){this.changePage(this.getPage())},e}();r([o.Input(),i("design:type",Number)],u.prototype,"pageLinkSize",void 0),r([o.Output(),i("design:type",o.EventEmitter)],u.prototype,"onPageChange",void 0),r([o.Input(),i("design:type",Object)],u.prototype,"style",void 0),r([o.Input(),i("design:type",String)],u.prototype,"styleClass",void 0),r([o.Input(),i("design:type",Boolean)],u.prototype,"alwaysShow",void 0),r([o.Input(),i("design:type",Number),i("design:paramtypes",[Number])],u.prototype,"totalRecords",null),r([o.Input(),i("design:type",Number),i("design:paramtypes",[Number])],u.prototype,"first",null),r([o.Input(),i("design:type",Number),i("design:paramtypes",[Number])],u.prototype,"rows",null),r([o.Input(),i("design:type",Array),i("design:paramtypes",[Array])],u.prototype,"rowsPerPageOptions",null),u=r([o.Component({selector:"p-paginator",template:'\n        <div [class]="styleClass" [ngStyle]="style" [ngClass]="\'ui-paginator ui-widget ui-widget-header ui-unselectable-text\'"\n            *ngIf="alwaysShow ? true : (pageLinks && pageLinks.length > 1)">\n            <a href="#" class="ui-paginator-first ui-paginator-element ui-state-default ui-corner-all"\n                    (click)="changePageToFirst($event)" [ngClass]="{\'ui-state-disabled\':isFirstPage()}" [tabindex]="isFirstPage() ? -1 : null">\n                <span class="fa fa-step-backward"></span>\n            </a>\n            <a href="#" class="ui-paginator-prev ui-paginator-element ui-state-default ui-corner-all"\n                    (click)="changePageToPrev($event)" [ngClass]="{\'ui-state-disabled\':isFirstPage()}" [tabindex]="isFirstPage() ? -1 : null">\n                <span class="fa fa-backward"></span>\n            </a>\n            <span class="ui-paginator-pages">\n                <a href="#" *ngFor="let pageLink of pageLinks" class="ui-paginator-page ui-paginator-element ui-state-default ui-corner-all"\n                    (click)="onPageLinkClick($event, pageLink - 1)" [ngClass]="{\'ui-state-active\': (pageLink-1 == getPage())}">{{pageLink}}</a>\n            </span>\n            <a href="#" class="ui-paginator-next ui-paginator-element ui-state-default ui-corner-all"\n                    (click)="changePageToNext($event)" [ngClass]="{\'ui-state-disabled\':isLastPage()}" [tabindex]="isLastPage() ? -1 : null">\n                <span class="fa fa-forward"></span>\n            </a>\n            <a href="#" class="ui-paginator-last ui-paginator-element ui-state-default ui-corner-all"\n                    (click)="changePageToLast($event)" [ngClass]="{\'ui-state-disabled\':isLastPage()}" [tabindex]="isLastPage() ? -1 : null">\n                <span class="fa fa-step-forward"></span>\n            </a>\n            <p-dropdown [options]="rowsPerPageItems" [(ngModel)]="rows" *ngIf="rowsPerPageOptions" \n                (onChange)="onRppChange($event)" [lazy]="false" [autoWidth]="false"></p-dropdown>\n        </div>\n    '})],u),t.Paginator=u;var c=function(){};c=r([o.NgModule({imports:[l.CommonModule,s.DropdownModule,a.FormsModule],exports:[u,s.DropdownModule,a.FormsModule],declarations:[u]})],c),t.PaginatorModule=c},RyBE:function(e,t,n){"use strict";function r(){return x}function i(){return!!window.history.pushState}function o(e,t){"undefined"!=typeof COMPILED&&COMPILED||((_["\u0275global"].ng=_["\u0275global"].ng||{})[e]=t)}function l(e){return Object(_.getDebugNode)(e)}function a(e){return o(j,l),o(V,Object(w.__assign)({},F,(e||[]).reduce(function(e,t){return e[t.name]=t.token,e},{}))),function(){return l}}function s(e,t,n){for(var r=0;r<t.length;r++){var i=t[r];Array.isArray(i)?s(e,i,n):(i=i.replace(G,e),n.push(i))}return n}function u(e){return function(t){!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}function c(e,t){if(e.charCodeAt(0)===Y)throw new Error("Found the synthetic "+t+" "+e+'. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.')}function d(e){return(e=String(e)).match(ye)||e.match(ve)?e:(Object(_.isDevMode)()&&r().log("WARNING: sanitizing unsafe URL value "+e+" (see http://g.co/ng/security#xss)"),"unsafe:"+e)}function p(e){for(var t={},n=0,r=e.split(",");n<r.length;n++)t[r[n]]=!0;return t}function f(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n={},r=0,i=e;r<i.length;r++){var o=i[r];for(var l in o)o.hasOwnProperty(l)&&(n[l]=!0)}return n}function h(e,t){if(t&&_e.contains(e,t))throw new Error("Failed to sanitize html because the element is clobbered: "+_e.getOuterHTML(e));return t}function m(e){return e.replace(/&/g,"&amp;").replace(Ie,function(e){return"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";"}).replace(Re,function(e){return"&#"+e.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function g(e){_e.attributeMap(e).forEach(function(t,n){"xmlns:ns1"!==n&&0!==n.indexOf("ns1:")||_e.removeAttribute(e,n)});for(var t=0,n=_e.childNodesAsList(e);t<n.length;t++){var r=n[t];_e.isElementNode(r)&&g(r)}}function y(){return new _.ErrorHandler}n.d(t,"a",function(){return qe}),n.d(t,"j",function(){return We}),n.d(t,"h",function(){return M}),n.d(t,"i",function(){return L}),n.d(t,"b",function(){return I}),n.d(t,"d",function(){return z}),n.d(t,"e",function(){return B}),n.d(t,"f",function(){return de}),n.d(t,"g",function(){return pe}),n.d(t,"c",function(){return Ne}),n.d(t,"s",function(){return r}),n.d(t,"l",function(){return Z}),n.d(t,"k",function(){return ue}),n.d(t,"n",function(){return fe}),n.d(t,"o",function(){return ge}),n.d(t,"m",function(){return q}),n.d(t,"p",function(){return W}),n.d(t,"q",function(){return y}),n.d(t,"t",function(){return a}),n.d(t,"r",function(){return Ae});var v,b=n("Un6q"),_=n("LMZF"),w=n("6Xbx"),x=null,C={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},E={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},S={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};_["\u0275global"].Node&&(v=_["\u0275global"].Node.prototype.contains||function(e){return!!(16&this.compareDocumentPosition(e))});var O,T,k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.parse=function(e){throw new Error("parse not implemented")},t.makeCurrent=function(){!function(e){x||(x=e)}(new t)},t.prototype.hasProperty=function(e,t){return t in e},t.prototype.setProperty=function(e,t,n){e[t]=n},t.prototype.getProperty=function(e,t){return e[t]},t.prototype.invoke=function(e,t,n){(r=e)[t].apply(r,n);var r},t.prototype.logError=function(e){window.console&&(console.error?console.error(e):console.log(e))},t.prototype.log=function(e){window.console&&window.console.log&&window.console.log(e)},t.prototype.logGroup=function(e){window.console&&window.console.group&&window.console.group(e)},t.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(t.prototype,"attrToPropMap",{get:function(){return C},enumerable:!0,configurable:!0}),t.prototype.contains=function(e,t){return v.call(e,t)},t.prototype.querySelector=function(e,t){return e.querySelector(t)},t.prototype.querySelectorAll=function(e,t){return e.querySelectorAll(t)},t.prototype.on=function(e,t,n){e.addEventListener(t,n,!1)},t.prototype.onAndCancel=function(e,t,n){return e.addEventListener(t,n,!1),function(){e.removeEventListener(t,n,!1)}},t.prototype.dispatchEvent=function(e,t){e.dispatchEvent(t)},t.prototype.createMouseEvent=function(e){var t=this.getDefaultDocument().createEvent("MouseEvent");return t.initEvent(e,!0,!0),t},t.prototype.createEvent=function(e){var t=this.getDefaultDocument().createEvent("Event");return t.initEvent(e,!0,!0),t},t.prototype.preventDefault=function(e){e.preventDefault(),e.returnValue=!1},t.prototype.isPrevented=function(e){return e.defaultPrevented||null!=e.returnValue&&!e.returnValue},t.prototype.getInnerHTML=function(e){return e.innerHTML},t.prototype.getTemplateContent=function(e){return"content"in e&&this.isTemplateElement(e)?e.content:null},t.prototype.getOuterHTML=function(e){return e.outerHTML},t.prototype.nodeName=function(e){return e.nodeName},t.prototype.nodeValue=function(e){return e.nodeValue},t.prototype.type=function(e){return e.type},t.prototype.content=function(e){return this.hasProperty(e,"content")?e.content:e},t.prototype.firstChild=function(e){return e.firstChild},t.prototype.nextSibling=function(e){return e.nextSibling},t.prototype.parentElement=function(e){return e.parentNode},t.prototype.childNodes=function(e){return e.childNodes},t.prototype.childNodesAsList=function(e){for(var t=e.childNodes,n=new Array(t.length),r=0;r<t.length;r++)n[r]=t[r];return n},t.prototype.clearNodes=function(e){for(;e.firstChild;)e.removeChild(e.firstChild)},t.prototype.appendChild=function(e,t){e.appendChild(t)},t.prototype.removeChild=function(e,t){e.removeChild(t)},t.prototype.replaceChild=function(e,t,n){e.replaceChild(t,n)},t.prototype.remove=function(e){return e.parentNode&&e.parentNode.removeChild(e),e},t.prototype.insertBefore=function(e,t,n){e.insertBefore(n,t)},t.prototype.insertAllBefore=function(e,t,n){n.forEach(function(n){return e.insertBefore(n,t)})},t.prototype.insertAfter=function(e,t,n){e.insertBefore(n,t.nextSibling)},t.prototype.setInnerHTML=function(e,t){e.innerHTML=t},t.prototype.getText=function(e){return e.textContent},t.prototype.setText=function(e,t){e.textContent=t},t.prototype.getValue=function(e){return e.value},t.prototype.setValue=function(e,t){e.value=t},t.prototype.getChecked=function(e){return e.checked},t.prototype.setChecked=function(e,t){e.checked=t},t.prototype.createComment=function(e){return this.getDefaultDocument().createComment(e)},t.prototype.createTemplate=function(e){var t=this.getDefaultDocument().createElement("template");return t.innerHTML=e,t},t.prototype.createElement=function(e,t){return(t=t||this.getDefaultDocument()).createElement(e)},t.prototype.createElementNS=function(e,t,n){return(n=n||this.getDefaultDocument()).createElementNS(e,t)},t.prototype.createTextNode=function(e,t){return(t=t||this.getDefaultDocument()).createTextNode(e)},t.prototype.createScriptTag=function(e,t,n){var r=(n=n||this.getDefaultDocument()).createElement("SCRIPT");return r.setAttribute(e,t),r},t.prototype.createStyleElement=function(e,t){var n=(t=t||this.getDefaultDocument()).createElement("style");return this.appendChild(n,this.createTextNode(e,t)),n},t.prototype.createShadowRoot=function(e){return e.createShadowRoot()},t.prototype.getShadowRoot=function(e){return e.shadowRoot},t.prototype.getHost=function(e){return e.host},t.prototype.clone=function(e){return e.cloneNode(!0)},t.prototype.getElementsByClassName=function(e,t){return e.getElementsByClassName(t)},t.prototype.getElementsByTagName=function(e,t){return e.getElementsByTagName(t)},t.prototype.classList=function(e){return Array.prototype.slice.call(e.classList,0)},t.prototype.addClass=function(e,t){e.classList.add(t)},t.prototype.removeClass=function(e,t){e.classList.remove(t)},t.prototype.hasClass=function(e,t){return e.classList.contains(t)},t.prototype.setStyle=function(e,t,n){e.style[t]=n},t.prototype.removeStyle=function(e,t){e.style[t]=""},t.prototype.getStyle=function(e,t){return e.style[t]},t.prototype.hasStyle=function(e,t,n){var r=this.getStyle(e,t)||"";return n?r==n:r.length>0},t.prototype.tagName=function(e){return e.tagName},t.prototype.attributeMap=function(e){for(var t=new Map,n=e.attributes,r=0;r<n.length;r++){var i=n.item(r);t.set(i.name,i.value)}return t},t.prototype.hasAttribute=function(e,t){return e.hasAttribute(t)},t.prototype.hasAttributeNS=function(e,t,n){return e.hasAttributeNS(t,n)},t.prototype.getAttribute=function(e,t){return e.getAttribute(t)},t.prototype.getAttributeNS=function(e,t,n){return e.getAttributeNS(t,n)},t.prototype.setAttribute=function(e,t,n){e.setAttribute(t,n)},t.prototype.setAttributeNS=function(e,t,n,r){e.setAttributeNS(t,n,r)},t.prototype.removeAttribute=function(e,t){e.removeAttribute(t)},t.prototype.removeAttributeNS=function(e,t,n){e.removeAttributeNS(t,n)},t.prototype.templateAwareRoot=function(e){return this.isTemplateElement(e)?this.content(e):e},t.prototype.createHtmlDocument=function(){return document.implementation.createHTMLDocument("fakeTitle")},t.prototype.getDefaultDocument=function(){return document},t.prototype.getBoundingClientRect=function(e){try{return e.getBoundingClientRect()}catch(e){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}},t.prototype.getTitle=function(e){return e.title},t.prototype.setTitle=function(e,t){e.title=t||""},t.prototype.elementMatches=function(e,t){return!!this.isElementNode(e)&&(e.matches&&e.matches(t)||e.msMatchesSelector&&e.msMatchesSelector(t)||e.webkitMatchesSelector&&e.webkitMatchesSelector(t))},t.prototype.isTemplateElement=function(e){return this.isElementNode(e)&&"TEMPLATE"===e.nodeName},t.prototype.isTextNode=function(e){return e.nodeType===Node.TEXT_NODE},t.prototype.isCommentNode=function(e){return e.nodeType===Node.COMMENT_NODE},t.prototype.isElementNode=function(e){return e.nodeType===Node.ELEMENT_NODE},t.prototype.hasShadowRoot=function(e){return null!=e.shadowRoot&&e instanceof HTMLElement},t.prototype.isShadowRoot=function(e){return e instanceof DocumentFragment},t.prototype.importIntoDoc=function(e){return document.importNode(this.templateAwareRoot(e),!0)},t.prototype.adoptNode=function(e){return document.adoptNode(e)},t.prototype.getHref=function(e){return e.getAttribute("href")},t.prototype.getEventKey=function(e){var t=e.key;if(null==t){if(null==(t=e.keyIdentifier))return"Unidentified";t.startsWith("U+")&&(t=String.fromCharCode(parseInt(t.substring(2),16)),3===e.location&&S.hasOwnProperty(t)&&(t=S[t]))}return E[t]||t},t.prototype.getGlobalEventTarget=function(e,t){return"window"===t?window:"document"===t?e:"body"===t?e.body:null},t.prototype.getHistory=function(){return window.history},t.prototype.getLocation=function(){return window.location},t.prototype.getBaseHref=function(e){var t=D||(D=document.querySelector("base"))?D.getAttribute("href"):null;return null==t?null:function(e){return O||(O=document.createElement("a")),O.setAttribute("href",e),"/"===O.pathname.charAt(0)?O.pathname:"/"+O.pathname}(t)},t.prototype.resetBaseElement=function(){D=null},t.prototype.getUserAgent=function(){return window.navigator.userAgent},t.prototype.setData=function(e,t,n){this.setAttribute(e,"data-"+t,n)},t.prototype.getData=function(e,t){return this.getAttribute(e,"data-"+t)},t.prototype.getComputedStyle=function(e){return getComputedStyle(e)},t.prototype.supportsWebAnimation=function(){return"function"==typeof Element.prototype.animate},t.prototype.performanceNow=function(){return window.performance&&window.performance.now?window.performance.now():(new Date).getTime()},t.prototype.supportsCookies=function(){return!0},t.prototype.getCookie=function(e){return Object(b["\u0275parseCookieValue"])(document.cookie,e)},t.prototype.setCookie=function(e,t){document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(t)},t}(function(e){function t(){var t=e.call(this)||this;t._animationPrefix=null,t._transitionEnd=null;try{var n=t.createElement("div",document);if(null!=t.getStyle(n,"animationName"))t._animationPrefix="";else for(var r=["Webkit","Moz","O","ms"],i=0;i<r.length;i++)if(null!=t.getStyle(n,r[i]+"AnimationName")){t._animationPrefix="-"+r[i].toLowerCase()+"-";break}var o={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};Object.keys(o).forEach(function(e){null!=t.getStyle(n,e)&&(t._transitionEnd=o[e])})}catch(e){t._animationPrefix=null,t._transitionEnd=null}return t}return Object(w.__extends)(t,e),t.prototype.getDistributedNodes=function(e){return e.getDistributedNodes()},t.prototype.resolveAndSetHref=function(e,t,n){e.href=null==n?t:t+"/../"+n},t.prototype.supportsDOMEvents=function(){return!0},t.prototype.supportsNativeShadowDOM=function(){return"function"==typeof document.body.createShadowRoot},t.prototype.getAnimationPrefix=function(){return this._animationPrefix?this._animationPrefix:""},t.prototype.getTransitionEnd=function(){return this._transitionEnd?this._transitionEnd:""},t.prototype.supportsAnimation=function(){return null!=this._animationPrefix&&null!=this._transitionEnd},t}(function(){function e(){this.resourceLoaderType=null}return Object.defineProperty(e.prototype,"attrToPropMap",{get:function(){return this._attrToPropMap},set:function(e){this._attrToPropMap=e},enumerable:!0,configurable:!0}),e}())),D=null,I=b.DOCUMENT,R=function(e){function t(t){var n=e.call(this)||this;return n._doc=t,n._init(),n}return Object(w.__extends)(t,e),t.prototype._init=function(){this.location=r().getLocation(),this._history=r().getHistory()},t.prototype.getBaseHrefFromDOM=function(){return r().getBaseHref(this._doc)},t.prototype.onPopState=function(e){r().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",e,!1)},t.prototype.onHashChange=function(e){r().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",e,!1)},Object.defineProperty(t.prototype,"pathname",{get:function(){return this.location.pathname},set:function(e){this.location.pathname=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"search",{get:function(){return this.location.search},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hash",{get:function(){return this.location.hash},enumerable:!0,configurable:!0}),t.prototype.pushState=function(e,t,n){i()?this._history.pushState(e,t,n):this.location.hash=n},t.prototype.replaceState=function(e,t,n){i()?this._history.replaceState(e,t,n):this.location.hash=n},t.prototype.forward=function(){this._history.forward()},t.prototype.back=function(){this._history.back()},t.ctorParameters=function(){return[{type:void 0,decorators:[{type:_.Inject,args:[I]}]}]},t}(b.PlatformLocation),M=function(){function e(e){this._doc=e,this._dom=r()}return e.prototype.addTag=function(e,t){return void 0===t&&(t=!1),e?this._getOrCreateElement(e,t):null},e.prototype.addTags=function(e,t){var n=this;return void 0===t&&(t=!1),e?e.reduce(function(e,r){return r&&e.push(n._getOrCreateElement(r,t)),e},[]):[]},e.prototype.getTag=function(e){return e?this._dom.querySelector(this._doc,"meta["+e+"]")||null:null},e.prototype.getTags=function(e){if(!e)return[];var t=this._dom.querySelectorAll(this._doc,"meta["+e+"]");return t?[].slice.call(t):[]},e.prototype.updateTag=function(e,t){if(!e)return null;t=t||this._parseSelector(e);var n=this.getTag(t);return n?this._setMetaElementAttributes(e,n):this._getOrCreateElement(e,!0)},e.prototype.removeTag=function(e){this.removeTagElement(this.getTag(e))},e.prototype.removeTagElement=function(e){e&&this._dom.remove(e)},e.prototype._getOrCreateElement=function(e,t){if(void 0===t&&(t=!1),!t){var n=this._parseSelector(e),r=this.getTag(n);if(r&&this._containsAttributes(e,r))return r}var i=this._dom.createElement("meta");this._setMetaElementAttributes(e,i);var o=this._dom.getElementsByTagName(this._doc,"head")[0];return this._dom.appendChild(o,i),i},e.prototype._setMetaElementAttributes=function(e,t){var n=this;return Object.keys(e).forEach(function(r){return n._dom.setAttribute(t,r,e[r])}),t},e.prototype._parseSelector=function(e){var t=e.name?"name":"property";return t+'="'+e[t]+'"'},e.prototype._containsAttributes=function(e,t){var n=this;return Object.keys(e).every(function(r){return n._dom.getAttribute(t,r)===e[r]})},e}(),P=new _.InjectionToken("TRANSITION_ID"),N=[{provide:_.APP_INITIALIZER,useFactory:function(e,t,n){return function(){n.get(_.ApplicationInitStatus).donePromise.then(function(){var n=r();Array.prototype.slice.apply(n.querySelectorAll(t,"style[ng-transition]")).filter(function(t){return n.getAttribute(t,"ng-transition")===e}).forEach(function(e){return n.remove(e)})})}},deps:[P,I,_.Injector],multi:!0}],A=function(){function e(){}return e.init=function(){Object(_.setTestabilityGetter)(new e)},e.prototype.addToWindow=function(e){_["\u0275global"].getAngularTestability=function(t,n){void 0===n&&(n=!0);var r=e.findTestabilityInTree(t,n);if(null==r)throw new Error("Could not find testability for element.");return r},_["\u0275global"].getAllAngularTestabilities=function(){return e.getAllTestabilities()},_["\u0275global"].getAllAngularRootElements=function(){return e.getAllRootElements()},_["\u0275global"].frameworkStabilizers||(_["\u0275global"].frameworkStabilizers=[]),_["\u0275global"].frameworkStabilizers.push(function(e){var t=_["\u0275global"].getAllAngularTestabilities(),n=t.length,r=!1,i=function(t){r=r||t,0==--n&&e(r)};t.forEach(function(e){e.whenStable(i)})})},e.prototype.findTestabilityInTree=function(e,t,n){if(null==t)return null;var i=e.getTestability(t);return null!=i?i:n?r().isShadowRoot(t)?this.findTestabilityInTree(e,r().getHost(t),!0):this.findTestabilityInTree(e,r().parentElement(t),!0):null},e}(),L=function(){function e(e){this._doc=e}return e.prototype.getTitle=function(){return r().getTitle(this._doc)},e.prototype.setTitle=function(e){r().setTitle(this._doc,e)},e}(),F={ApplicationRef:_.ApplicationRef,NgZone:_.NgZone},j="probe",V="coreTokens",z=new _.InjectionToken("EventManagerPlugins"),B=function(){function e(e,t){var n=this;this._zone=t,this._eventNameToPlugin=new Map,e.forEach(function(e){return e.manager=n}),this._plugins=e.slice().reverse()}return e.prototype.addEventListener=function(e,t,n){return this._findPluginFor(t).addEventListener(e,t,n)},e.prototype.addGlobalEventListener=function(e,t,n){return this._findPluginFor(t).addGlobalEventListener(e,t,n)},e.prototype.getZone=function(){return this._zone},e.prototype._findPluginFor=function(e){var t=this._eventNameToPlugin.get(e);if(t)return t;for(var n=this._plugins,r=0;r<n.length;r++){var i=n[r];if(i.supports(e))return this._eventNameToPlugin.set(e,i),i}throw new Error("No event manager plugin found for event "+e)},e}(),H=function(){function e(e){this._doc=e}return e.prototype.addGlobalEventListener=function(e,t,n){var i=r().getGlobalEventTarget(this._doc,e);if(!i)throw new Error("Unsupported event target "+i+" for event "+t);return this.addEventListener(i,t,n)},e}(),W=function(){function e(){this._stylesSet=new Set}return e.prototype.addStyles=function(e){var t=this,n=new Set;e.forEach(function(e){t._stylesSet.has(e)||(t._stylesSet.add(e),n.add(e))}),this.onStylesAdded(n)},e.prototype.onStylesAdded=function(e){},e.prototype.getAllStyles=function(){return Array.from(this._stylesSet)},e}(),q=function(e){function t(t){var n=e.call(this)||this;return n._doc=t,n._hostNodes=new Set,n._styleNodes=new Set,n._hostNodes.add(t.head),n}return Object(w.__extends)(t,e),t.prototype._addStylesToHost=function(e,t){var n=this;e.forEach(function(e){var r=n._doc.createElement("style");r.textContent=e,n._styleNodes.add(t.appendChild(r))})},t.prototype.addHost=function(e){this._addStylesToHost(this._stylesSet,e),this._hostNodes.add(e)},t.prototype.removeHost=function(e){this._hostNodes.delete(e)},t.prototype.onStylesAdded=function(e){var t=this;this._hostNodes.forEach(function(n){return t._addStylesToHost(e,n)})},t.prototype.ngOnDestroy=function(){this._styleNodes.forEach(function(e){return r().remove(e)})},t}(W),U={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},G=/%COMP%/g,K="_nghost-%COMP%",$="_ngcontent-%COMP%",Z=function(){function e(e,t){this.eventManager=e,this.sharedStylesHost=t,this.rendererByCompId=new Map,this.defaultRenderer=new Q(e)}return e.prototype.createRenderer=function(e,t){if(!e||!t)return this.defaultRenderer;switch(t.encapsulation){case _.ViewEncapsulation.Emulated:var n=this.rendererByCompId.get(t.id);return n||(n=new X(this.eventManager,this.sharedStylesHost,t),this.rendererByCompId.set(t.id,n)),n.applyToHost(e),n;case _.ViewEncapsulation.Native:return new J(this.eventManager,this.sharedStylesHost,e,t);default:if(!this.rendererByCompId.has(t.id)){var r=s(t.id,t.styles,[]);this.sharedStylesHost.addStyles(r),this.rendererByCompId.set(t.id,this.defaultRenderer)}return this.defaultRenderer}},e.prototype.begin=function(){},e.prototype.end=function(){},e}(),Q=function(){function e(e){this.eventManager=e,this.data=Object.create(null)}return e.prototype.destroy=function(){},e.prototype.createElement=function(e,t){return t?document.createElementNS(U[t],e):document.createElement(e)},e.prototype.createComment=function(e){return document.createComment(e)},e.prototype.createText=function(e){return document.createTextNode(e)},e.prototype.appendChild=function(e,t){e.appendChild(t)},e.prototype.insertBefore=function(e,t,n){e&&e.insertBefore(t,n)},e.prototype.removeChild=function(e,t){e&&e.removeChild(t)},e.prototype.selectRootElement=function(e){var t="string"==typeof e?document.querySelector(e):e;if(!t)throw new Error('The selector "'+e+'" did not match any elements');return t.textContent="",t},e.prototype.parentNode=function(e){return e.parentNode},e.prototype.nextSibling=function(e){return e.nextSibling},e.prototype.setAttribute=function(e,t,n,r){if(r){t=r+":"+t;var i=U[r];i?e.setAttributeNS(i,t,n):e.setAttribute(t,n)}else e.setAttribute(t,n)},e.prototype.removeAttribute=function(e,t,n){if(n){var r=U[n];r?e.removeAttributeNS(r,t):e.removeAttribute(n+":"+t)}else e.removeAttribute(t)},e.prototype.addClass=function(e,t){e.classList.add(t)},e.prototype.removeClass=function(e,t){e.classList.remove(t)},e.prototype.setStyle=function(e,t,n,r){r&_.RendererStyleFlags2.DashCase?e.style.setProperty(t,n,r&_.RendererStyleFlags2.Important?"important":""):e.style[t]=n},e.prototype.removeStyle=function(e,t,n){n&_.RendererStyleFlags2.DashCase?e.style.removeProperty(t):e.style[t]=""},e.prototype.setProperty=function(e,t,n){c(t,"property"),e[t]=n},e.prototype.setValue=function(e,t){e.nodeValue=t},e.prototype.listen=function(e,t,n){return c(t,"listener"),"string"==typeof e?this.eventManager.addGlobalEventListener(e,t,u(n)):this.eventManager.addEventListener(e,t,u(n))},e}(),Y="@".charCodeAt(0),X=function(e){function t(t,n,r){var i=e.call(this,t)||this;i.component=r;var o=s(r.id,r.styles,[]);return n.addStyles(o),i.contentAttr=$.replace(G,r.id),i.hostAttr=K.replace(G,r.id),i}return Object(w.__extends)(t,e),t.prototype.applyToHost=function(t){e.prototype.setAttribute.call(this,t,this.hostAttr,"")},t.prototype.createElement=function(t,n){var r=e.prototype.createElement.call(this,t,n);return e.prototype.setAttribute.call(this,r,this.contentAttr,""),r},t}(Q),J=function(e){function t(t,n,r,i){var o=e.call(this,t)||this;o.sharedStylesHost=n,o.hostEl=r,o.component=i,o.shadowRoot=r.createShadowRoot(),o.sharedStylesHost.addHost(o.shadowRoot);for(var l=s(i.id,i.styles,[]),a=0;a<l.length;a++){var u=document.createElement("style");u.textContent=l[a],o.shadowRoot.appendChild(u)}return o}return Object(w.__extends)(t,e),t.prototype.nodeOrShadowRoot=function(e){return e===this.hostEl?this.shadowRoot:e},t.prototype.destroy=function(){this.sharedStylesHost.removeHost(this.shadowRoot)},t.prototype.appendChild=function(t,n){return e.prototype.appendChild.call(this,this.nodeOrShadowRoot(t),n)},t.prototype.insertBefore=function(t,n,r){return e.prototype.insertBefore.call(this,this.nodeOrShadowRoot(t),n,r)},t.prototype.removeChild=function(t,n){return e.prototype.removeChild.call(this,this.nodeOrShadowRoot(t),n)},t.prototype.parentNode=function(t){return this.nodeOrShadowRoot(e.prototype.parentNode.call(this,this.nodeOrShadowRoot(t)))},t}(Q),ee="undefined"!=typeof Zone&&Zone.__symbol__||function(e){return"__zone_symbol__"+e},te=ee("addEventListener"),ne=ee("removeEventListener"),re={},ie="removeEventListener",oe="__zone_symbol__propagationStopped",le="__zone_symbol__stopImmediatePropagation";"undefined"!=typeof Zone&&Zone[ee("BLACK_LISTED_EVENTS")]&&(T={});var ae=function(e){return!!T&&T.hasOwnProperty(e)},se=function(e){var t=re[e.type];if(t){var n=this[t];if(n){var r=[e];if(1===n.length)return(l=n[0]).zone!==Zone.current?l.zone.run(l.handler,this,r):l.handler.apply(this,r);for(var i=n.slice(),o=0;o<i.length&&!0!==e[oe];o++){var l;(l=i[o]).zone!==Zone.current?l.zone.run(l.handler,this,r):l.handler.apply(this,r)}}}},ue=function(e){function t(t,n){var r=e.call(this,t)||this;return r.ngZone=n,r.patchEvent(),r}return Object(w.__extends)(t,e),t.prototype.patchEvent=function(){if(Event&&Event.prototype&&!Event.prototype[le]){var e=Event.prototype[le]=Event.prototype.stopImmediatePropagation;Event.prototype.stopImmediatePropagation=function(){this&&(this[oe]=!0),e&&e.apply(this,arguments)}}},t.prototype.supports=function(e){return!0},t.prototype.addEventListener=function(e,t,n){var r=this,i=n;if(!e[te]||_.NgZone.isInAngularZone()&&!ae(t))e.addEventListener(t,i,!1);else{var o=re[t];o||(o=re[t]=ee("ANGULAR"+t+"FALSE"));var l=e[o],a=l&&l.length>0;l||(l=e[o]=[]);var s=ae(t)?Zone.root:Zone.current;if(0===l.length)l.push({zone:s,handler:i});else{for(var u=!1,c=0;c<l.length;c++)if(l[c].handler===i){u=!0;break}u||l.push({zone:s,handler:i})}a||e[te](t,se,!1)}return function(){return r.removeEventListener(e,t,i)}},t.prototype.removeEventListener=function(e,t,n){var r=e[ne];if(!r)return e[ie].apply(e,[t,n,!1]);var i=re[t],o=i&&e[i];if(!o)return e[ie].apply(e,[t,n,!1]);for(var l=!1,a=0;a<o.length;a++)if(o[a].handler===n){l=!0,o.splice(a,1);break}l?0===o.length&&r.apply(e,[t,se,!1]):e[ie].apply(e,[t,n,!1])},t}(H),ce={pan:!0,panstart:!0,panmove:!0,panend:!0,pancancel:!0,panleft:!0,panright:!0,panup:!0,pandown:!0,pinch:!0,pinchstart:!0,pinchmove:!0,pinchend:!0,pinchcancel:!0,pinchin:!0,pinchout:!0,press:!0,pressup:!0,rotate:!0,rotatestart:!0,rotatemove:!0,rotateend:!0,rotatecancel:!0,swipe:!0,swipeleft:!0,swiperight:!0,swipeup:!0,swipedown:!0,tap:!0},de=new _.InjectionToken("HammerGestureConfig"),pe=function(){function e(){this.events=[],this.overrides={}}return e.prototype.buildHammer=function(e){var t=new Hammer(e);t.get("pinch").set({enable:!0}),t.get("rotate").set({enable:!0});for(var n in this.overrides)t.get(n).set(this.overrides[n]);return t},e}(),fe=function(e){function t(t,n){var r=e.call(this,t)||this;return r._config=n,r}return Object(w.__extends)(t,e),t.prototype.supports=function(e){if(!ce.hasOwnProperty(e.toLowerCase())&&!this.isCustomEvent(e))return!1;if(!window.Hammer)throw new Error("Hammer.js is not loaded, can not bind "+e+" event");return!0},t.prototype.addEventListener=function(e,t,n){var r=this,i=this.manager.getZone();return t=t.toLowerCase(),i.runOutsideAngular(function(){var o=r._config.buildHammer(e),l=function(e){i.runGuarded(function(){n(e)})};return o.on(t,l),function(){return o.off(t,l)}})},t.prototype.isCustomEvent=function(e){return this._config.events.indexOf(e)>-1},t}(H),he=["alt","control","meta","shift"],me={alt:function(e){return e.altKey},control:function(e){return e.ctrlKey},meta:function(e){return e.metaKey},shift:function(e){return e.shiftKey}},ge=function(e){function t(t){return e.call(this,t)||this}return Object(w.__extends)(t,e),t.prototype.supports=function(e){return null!=t.parseEventName(e)},t.prototype.addEventListener=function(e,n,i){var o=t.parseEventName(n),l=t.eventCallback(o.fullKey,i,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return r().onAndCancel(e,o.domEventName,l)})},t.parseEventName=function(e){var n=e.toLowerCase().split("."),r=n.shift();if(0===n.length||"keydown"!==r&&"keyup"!==r)return null;var i=t._normalizeKey(n.pop()),o="";if(he.forEach(function(e){var t=n.indexOf(e);t>-1&&(n.splice(t,1),o+=e+".")}),o+=i,0!=n.length||0===i.length)return null;var l={};return l.domEventName=r,l.fullKey=o,l},t.getEventFullKey=function(e){var t="",n=r().getEventKey(e);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),he.forEach(function(r){r!=n&&(0,me[r])(e)&&(t+=r+".")}),t+=n},t.eventCallback=function(e,n,r){return function(i){t.getEventFullKey(i)===e&&r.runGuarded(function(){return n(i)})}},t._normalizeKey=function(e){switch(e){case"esc":return"escape";default:return e}},t}(H),ye=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,ve=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i,be=null,_e=null,we=p("area,br,col,hr,img,wbr"),xe=p("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),Ce=p("rp,rt"),Ee=f(Ce,xe),Se=f(we,f(xe,p("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),f(Ce,p("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),Ee),Oe=p("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),Te=p("srcset"),ke=f(Oe,Te,p("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width")),De=function(){function e(){this.sanitizedSomething=!1,this.buf=[]}return e.prototype.sanitizeChildren=function(e){for(var t=e.firstChild;t;)if(_e.isElementNode(t)?this.startElement(t):_e.isTextNode(t)?this.chars(_e.nodeValue(t)):this.sanitizedSomething=!0,_e.firstChild(t))t=_e.firstChild(t);else for(;t;){_e.isElementNode(t)&&this.endElement(t);var n=h(t,_e.nextSibling(t));if(n){t=n;break}t=h(t,_e.parentElement(t))}return this.buf.join("")},e.prototype.startElement=function(e){var t=this,n=_e.nodeName(e).toLowerCase();Se.hasOwnProperty(n)?(this.buf.push("<"),this.buf.push(n),_e.attributeMap(e).forEach(function(e,n){var r=n.toLowerCase();ke.hasOwnProperty(r)?(Oe[r]&&(e=d(e)),Te[r]&&(e=function(e){return(e=String(e)).split(",").map(function(e){return d(e.trim())}).join(", ")}(e)),t.buf.push(" "),t.buf.push(n),t.buf.push('="'),t.buf.push(m(e)),t.buf.push('"')):t.sanitizedSomething=!0}),this.buf.push(">")):this.sanitizedSomething=!0},e.prototype.endElement=function(e){var t=_e.nodeName(e).toLowerCase();Se.hasOwnProperty(t)&&!we.hasOwnProperty(t)&&(this.buf.push("</"),this.buf.push(t),this.buf.push(">"))},e.prototype.chars=function(e){this.buf.push(m(e))},e}(),Ie=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Re=/([^\#-~ |!])/g,Me=new RegExp("^([-,.\"'%_!# a-zA-Z0-9]+|(?:(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|3d)?|(?:rgb|hsl)a?|(?:repeating-)?(?:linear|radial)-gradient|(?:calc|attr))\\([-0-9.%, #a-zA-Z]+\\))$","g"),Pe=/^url\(([^)]+)\)$/,Ne=function(){},Ae=function(e){function t(t){var n=e.call(this)||this;return n._doc=t,n}return Object(w.__extends)(t,e),t.prototype.sanitize=function(e,t){if(null==t)return null;switch(e){case _.SecurityContext.NONE:return t;case _.SecurityContext.HTML:return t instanceof Fe?t.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(t,"HTML"),function(e,t){try{var n=function(){if(be)return be;var e=(_e=r()).createElement("template");if("content"in e)return e;var t=_e.createHtmlDocument();if(null==(be=_e.querySelector(t,"body"))){var n=_e.createElement("html",t);be=_e.createElement("body",t),_e.appendChild(n,be),_e.appendChild(t,n)}return be}(),i=t?String(t):"",o=5,l=i;do{if(0===o)throw new Error("Failed to sanitize html because the input is unstable");o--,_e.setInnerHTML(n,i=l),e.documentMode&&g(n),l=_e.getInnerHTML(n)}while(i!==l);for(var a=new De,s=a.sanitizeChildren(_e.getTemplateContent(n)||n),u=_e.getTemplateContent(n)||n,c=0,d=_e.childNodesAsList(u);c<d.length;c++)_e.removeChild(u,d[c]);return Object(_.isDevMode)()&&a.sanitizedSomething&&_e.log("WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss)."),s}catch(e){throw be=null,e}}(this._doc,String(t)));case _.SecurityContext.STYLE:return t instanceof je?t.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(t,"Style"),function(e){if(!(e=String(e).trim()))return"";var t=e.match(Pe);return t&&d(t[1])===t[1]||e.match(Me)&&function(e){for(var t=!0,n=!0,r=0;r<e.length;r++){var i=e.charAt(r);"'"===i&&n?t=!t:'"'===i&&t&&(n=!n)}return t&&n}(e)?e:(Object(_.isDevMode)()&&r().log("WARNING: sanitizing unsafe style value "+e+" (see http://g.co/ng/security#xss)."),"unsafe")}(t));case _.SecurityContext.SCRIPT:if(t instanceof Ve)return t.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(t,"Script"),new Error("unsafe value used in a script context");case _.SecurityContext.URL:return t instanceof Be||t instanceof ze?t.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(t,"URL"),d(String(t)));case _.SecurityContext.RESOURCE_URL:if(t instanceof Be)return t.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(t,"ResourceURL"),new Error("unsafe value used in a resource URL context (see http://g.co/ng/security#xss)");default:throw new Error("Unexpected SecurityContext "+e+" (see http://g.co/ng/security#xss)")}},t.prototype.checkNotSafeValue=function(e,t){if(e instanceof Le)throw new Error("Required a safe "+t+", got a "+e.getTypeName()+" (see http://g.co/ng/security#xss)")},t.prototype.bypassSecurityTrustHtml=function(e){return new Fe(e)},t.prototype.bypassSecurityTrustStyle=function(e){return new je(e)},t.prototype.bypassSecurityTrustScript=function(e){return new Ve(e)},t.prototype.bypassSecurityTrustUrl=function(e){return new ze(e)},t.prototype.bypassSecurityTrustResourceUrl=function(e){return new Be(e)},t}(Ne),Le=function(){function e(e){this.changingThisBreaksApplicationSecurity=e}return e.prototype.toString=function(){return"SafeValue must use [property]=binding: "+this.changingThisBreaksApplicationSecurity+" (see http://g.co/ng/security#xss)"},e}(),Fe=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.getTypeName=function(){return"HTML"},t}(Le),je=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.getTypeName=function(){return"Style"},t}(Le),Ve=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.getTypeName=function(){return"Script"},t}(Le),ze=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.getTypeName=function(){return"URL"},t}(Le),Be=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(w.__extends)(t,e),t.prototype.getTypeName=function(){return"ResourceURL"},t}(Le),He=[{provide:_.PLATFORM_ID,useValue:b["\u0275PLATFORM_BROWSER_ID"]},{provide:_.PLATFORM_INITIALIZER,useValue:function(){k.makeCurrent(),A.init()},multi:!0},{provide:b.PlatformLocation,useClass:R,deps:[I]},{provide:I,useFactory:function(){return document},deps:[]}],We=Object(_.createPlatformFactory)(_.platformCore,"browser",He),qe=function(){function e(e){if(e)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}return e.withServerTransition=function(t){return{ngModule:e,providers:[{provide:_.APP_ID,useValue:t.appId},{provide:P,useExisting:_.APP_ID},N]}},e}();"undefined"!=typeof window&&window},TJLg:function(e,t,n){var r=n("rMsi"),i=n("RT4T"),o=n("yIWP")("IE_PROTO"),l=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?l:null}},TO51:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"SubjectSubscriber",function(){return c}),n.d(t,"Subject",function(){return d}),n.d(t,"AnonymousSubject",function(){return p});var r=n("6Xbx"),i=n("AP4T"),o=n("E9/g"),l=n("qLnt"),a=n("Upor"),s=n("jaVc"),u=n("V7AE"),c=function(e){function t(t){e.call(this,t),this.destination=t}return Object(r.__extends)(t,e),t}(o.a),d=function(e){function t(){e.call(this),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}return Object(r.__extends)(t,e),t.prototype[u.a]=function(){return new c(this)},t.prototype.lift=function(e){var t=new p(this,this);return t.operator=e,t},t.prototype.next=function(e){if(this.closed)throw new a.a;if(!this.isStopped)for(var t=this.observers,n=t.length,r=t.slice(),i=0;i<n;i++)r[i].next(e)},t.prototype.error=function(e){if(this.closed)throw new a.a;this.hasError=!0,this.thrownError=e,this.isStopped=!0;for(var t=this.observers,n=t.length,r=t.slice(),i=0;i<n;i++)r[i].error(e);this.observers.length=0},t.prototype.complete=function(){if(this.closed)throw new a.a;this.isStopped=!0;for(var e=this.observers,t=e.length,n=e.slice(),r=0;r<t;r++)n[r].complete();this.observers.length=0},t.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},t.prototype._trySubscribe=function(t){if(this.closed)throw new a.a;return e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){if(this.closed)throw new a.a;return this.hasError?(e.error(this.thrownError),l.a.EMPTY):this.isStopped?(e.complete(),l.a.EMPTY):(this.observers.push(e),new s.a(this,e))},t.prototype.asObservable=function(){var e=new i.a;return e.source=this,e},t.create=function(e,t){return new p(e,t)},t}(i.a),p=function(e){function t(t,n){e.call(this),this.destination=t,this.source=n}return Object(r.__extends)(t,e),t.prototype.next=function(e){var t=this.destination;t&&t.next&&t.next(e)},t.prototype.error=function(e){var t=this.destination;t&&t.error&&this.destination.error(e)},t.prototype.complete=function(){var e=this.destination;e&&e.complete&&this.destination.complete()},t.prototype._subscribe=function(e){return this.source?this.source.subscribe(e):l.a.EMPTY},t}(d)},"TU+8":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("+iEx"),i=(n.n(r),n("eFQL"));n.n(i)},ThPn:function(e,t,n){"use strict";var r=n("6Xbx"),i=n("lI6h"),o=n("qgI0"),l=function(){function e(e,t){this.observables=e,this.project=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.observables,this.project))},e}(),a=function(e){function t(t,n,r){e.call(this,t),this.observables=n,this.project=r,this.toRespond=[];var i=n.length;this.values=new Array(i);for(var l=0;l<i;l++)this.toRespond.push(l);for(l=0;l<i;l++){var a=n[l];this.add(Object(o.a)(this,a,a,l))}}return Object(r.__extends)(t,e),t.prototype.notifyNext=function(e,t,n,r,i){this.values[n]=t;var o=this.toRespond;if(o.length>0){var l=o.indexOf(n);-1!==l&&o.splice(l,1)}},t.prototype.notifyComplete=function(){},t.prototype._next=function(e){if(0===this.toRespond.length){var t=[e].concat(this.values);this.project?this._tryProject(t):this.destination.next(t)}},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.a);t.a=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){var n;return"function"==typeof e[e.length-1]&&(n=e.pop()),t.lift(new l(e,n))}}.apply(void 0,e)(this)}},UKZQ:function(e,t,n){var r=n("a7b8");e.exports=function(e,t){return new(r(e))(t)}},ULWX:function(e,t,n){var r=n("+pQw");e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},URbD:function(e,t,n){"use strict";t.a=function(){return Object(r.a)()(this)};var r=n("eIqN")},UlVq:function(e,t,n){var r=n("3r0D")("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],l=o[r]();l.next=function(){return{done:n=!0}},o[r]=function(){return l},e(o)}catch(e){}return n}},Ula3:function(e,t,n){var r=n("JXkd"),i=n("5oDA").set;e.exports=function(e,t,n){var o,l=t.constructor;return l!==n&&"function"==typeof l&&(o=l.prototype)!==n.prototype&&r(o)&&i&&i(e,o),e}},Un6q:function(e,t,n){"use strict";function r(e){return e.replace(/\/index.html$/,"")}function i(e,t,n){"string"!=typeof t&&(n=t,t=e[0]),t=t.toLowerCase().replace(/_/g,"-"),me[t]=e,n&&(me[t][18]=n)}function o(e){return S(e)[0]}function l(e,t,n){var r=S(e);return C(C([r[1],r[2]],t),n)}function a(e,t,n){var r=S(e);return C(C([r[3],r[4]],t),n)}function s(e,t,n){var r=S(e);return C(C([r[5],r[6]],t),n)}function u(e,t){return C(S(e)[7],t)}function c(e){return S(e)[8]}function d(e){return S(e)[9]}function p(e,t){return S(e)[10][t]}function f(e,t){return S(e)[11][t]}function h(e,t){return C(S(e)[12],t)}function m(e,t){var n=S(e),r=n[13][t];if(void 0===r){if(t===we.CurrencyDecimal)return n[13][we.Decimal];if(t===we.CurrencyGroup)return n[13][we.Group]}return r}function g(e,t){return S(e)[14][t]}function y(e){return S(e)[15]||null}function v(e){return S(e)[16]||null}function b(e){return S(e)[17]}function _(e){if(!e[18])throw new Error('Missing extra locale data for the locale "'+e[0]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function w(e){var t=S(e);return _(t),(t[18][2]||[]).map(function(e){return"string"==typeof e?E(e):[E(e[0]),E(e[1])]})}function x(e,t,n){var r=S(e);return _(r),C(C([r[18][0],r[18][1]],t)||[],n)||[]}function C(e,t){for(var n=t;n>-1;n--)if(void 0!==e[n])return e[n];throw new Error("Locale data API: locale data undefined")}function E(e){var t=e.split(":");return{hours:+t[0],minutes:+t[1]}}function S(e){var t=e.toLowerCase().replace(/_/g,"-"),n=me[t];if(n)return n;var r=t.split("-")[0];if(n=me[r])return n;if("en"===r)return he;throw new Error('Missing locale data for the locale "'+e+'".')}function O(e,t,n,r){var i="="+e;if(t.indexOf(i)>-1)return i;if(i=n.getPluralCategory(e,r),t.indexOf(i)>-1)return i;if(t.indexOf("other")>-1)return"other";throw new Error('No plural message found for value "'+e+'"')}function T(e,t){"string"==typeof t&&(t=parseInt(t,10));var n=t,r=n.toString().replace(/^[^.]*\.?/,""),i=Math.floor(Math.abs(n)),o=r.length,l=parseInt(r,10),a=parseInt(n.toString().replace(/^[^.]*\.?|0+$/g,""),10)||0;switch(e.split("-")[0].toLowerCase()){case"af":case"asa":case"az":case"bem":case"bez":case"bg":case"brx":case"ce":case"cgg":case"chr":case"ckb":case"ee":case"el":case"eo":case"es":case"eu":case"fo":case"fur":case"gsw":case"ha":case"haw":case"hu":case"jgo":case"jmc":case"ka":case"kk":case"kkj":case"kl":case"ks":case"ksb":case"ky":case"lb":case"lg":case"mas":case"mgo":case"ml":case"mn":case"nb":case"nd":case"ne":case"nn":case"nnh":case"nyn":case"om":case"or":case"os":case"ps":case"rm":case"rof":case"rwk":case"saq":case"seh":case"sn":case"so":case"sq":case"ta":case"te":case"teo":case"tk":case"tr":case"ug":case"uz":case"vo":case"vun":case"wae":case"xog":return 1===n?ye.One:ye.Other;case"ak":case"ln":case"mg":case"pa":case"ti":return n===Math.floor(n)&&n>=0&&n<=1?ye.One:ye.Other;case"am":case"as":case"bn":case"fa":case"gu":case"hi":case"kn":case"mr":case"zu":return 0===i||1===n?ye.One:ye.Other;case"ar":return 0===n?ye.Zero:1===n?ye.One:2===n?ye.Two:n%100===Math.floor(n%100)&&n%100>=3&&n%100<=10?ye.Few:n%100===Math.floor(n%100)&&n%100>=11&&n%100<=99?ye.Many:ye.Other;case"ast":case"ca":case"de":case"en":case"et":case"fi":case"fy":case"gl":case"it":case"nl":case"sv":case"sw":case"ur":case"yi":return 1===i&&0===o?ye.One:ye.Other;case"be":return n%10==1&&n%100!=11?ye.One:n%10===Math.floor(n%10)&&n%10>=2&&n%10<=4&&!(n%100>=12&&n%100<=14)?ye.Few:n%10==0||n%10===Math.floor(n%10)&&n%10>=5&&n%10<=9||n%100===Math.floor(n%100)&&n%100>=11&&n%100<=14?ye.Many:ye.Other;case"br":return n%10==1&&n%100!=11&&n%100!=71&&n%100!=91?ye.One:n%10==2&&n%100!=12&&n%100!=72&&n%100!=92?ye.Two:n%10===Math.floor(n%10)&&(n%10>=3&&n%10<=4||n%10==9)&&!(n%100>=10&&n%100<=19||n%100>=70&&n%100<=79||n%100>=90&&n%100<=99)?ye.Few:0!==n&&n%1e6==0?ye.Many:ye.Other;case"bs":case"hr":case"sr":return 0===o&&i%10==1&&i%100!=11||l%10==1&&l%100!=11?ye.One:0===o&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)||l%10===Math.floor(l%10)&&l%10>=2&&l%10<=4&&!(l%100>=12&&l%100<=14)?ye.Few:ye.Other;case"cs":case"sk":return 1===i&&0===o?ye.One:i===Math.floor(i)&&i>=2&&i<=4&&0===o?ye.Few:0!==o?ye.Many:ye.Other;case"cy":return 0===n?ye.Zero:1===n?ye.One:2===n?ye.Two:3===n?ye.Few:6===n?ye.Many:ye.Other;case"da":return 1===n||0!==a&&(0===i||1===i)?ye.One:ye.Other;case"dsb":case"hsb":return 0===o&&i%100==1||l%100==1?ye.One:0===o&&i%100==2||l%100==2?ye.Two:0===o&&i%100===Math.floor(i%100)&&i%100>=3&&i%100<=4||l%100===Math.floor(l%100)&&l%100>=3&&l%100<=4?ye.Few:ye.Other;case"ff":case"fr":case"hy":case"kab":return 0===i||1===i?ye.One:ye.Other;case"fil":return 0===o&&(1===i||2===i||3===i)||0===o&&i%10!=4&&i%10!=6&&i%10!=9||0!==o&&l%10!=4&&l%10!=6&&l%10!=9?ye.One:ye.Other;case"ga":return 1===n?ye.One:2===n?ye.Two:n===Math.floor(n)&&n>=3&&n<=6?ye.Few:n===Math.floor(n)&&n>=7&&n<=10?ye.Many:ye.Other;case"gd":return 1===n||11===n?ye.One:2===n||12===n?ye.Two:n===Math.floor(n)&&(n>=3&&n<=10||n>=13&&n<=19)?ye.Few:ye.Other;case"gv":return 0===o&&i%10==1?ye.One:0===o&&i%10==2?ye.Two:0!==o||i%100!=0&&i%100!=20&&i%100!=40&&i%100!=60&&i%100!=80?0!==o?ye.Many:ye.Other:ye.Few;case"he":return 1===i&&0===o?ye.One:2===i&&0===o?ye.Two:0!==o||n>=0&&n<=10||n%10!=0?ye.Other:ye.Many;case"is":return 0===a&&i%10==1&&i%100!=11||0!==a?ye.One:ye.Other;case"ksh":return 0===n?ye.Zero:1===n?ye.One:ye.Other;case"kw":case"naq":case"se":case"smn":return 1===n?ye.One:2===n?ye.Two:ye.Other;case"lag":return 0===n?ye.Zero:0!==i&&1!==i||0===n?ye.Other:ye.One;case"lt":return n%10!=1||n%100>=11&&n%100<=19?n%10===Math.floor(n%10)&&n%10>=2&&n%10<=9&&!(n%100>=11&&n%100<=19)?ye.Few:0!==l?ye.Many:ye.Other:ye.One;case"lv":case"prg":return n%10==0||n%100===Math.floor(n%100)&&n%100>=11&&n%100<=19||2===o&&l%100===Math.floor(l%100)&&l%100>=11&&l%100<=19?ye.Zero:n%10==1&&n%100!=11||2===o&&l%10==1&&l%100!=11||2!==o&&l%10==1?ye.One:ye.Other;case"mk":return 0===o&&i%10==1||l%10==1?ye.One:ye.Other;case"mt":return 1===n?ye.One:0===n||n%100===Math.floor(n%100)&&n%100>=2&&n%100<=10?ye.Few:n%100===Math.floor(n%100)&&n%100>=11&&n%100<=19?ye.Many:ye.Other;case"pl":return 1===i&&0===o?ye.One:0===o&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)?ye.Few:0===o&&1!==i&&i%10===Math.floor(i%10)&&i%10>=0&&i%10<=1||0===o&&i%10===Math.floor(i%10)&&i%10>=5&&i%10<=9||0===o&&i%100===Math.floor(i%100)&&i%100>=12&&i%100<=14?ye.Many:ye.Other;case"pt":return n===Math.floor(n)&&n>=0&&n<=2&&2!==n?ye.One:ye.Other;case"ro":return 1===i&&0===o?ye.One:0!==o||0===n||1!==n&&n%100===Math.floor(n%100)&&n%100>=1&&n%100<=19?ye.Few:ye.Other;case"ru":case"uk":return 0===o&&i%10==1&&i%100!=11?ye.One:0===o&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)?ye.Few:0===o&&i%10==0||0===o&&i%10===Math.floor(i%10)&&i%10>=5&&i%10<=9||0===o&&i%100===Math.floor(i%100)&&i%100>=11&&i%100<=14?ye.Many:ye.Other;case"shi":return 0===i||1===n?ye.One:n===Math.floor(n)&&n>=2&&n<=10?ye.Few:ye.Other;case"si":return 0===n||1===n||0===i&&1===l?ye.One:ye.Other;case"sl":return 0===o&&i%100==1?ye.One:0===o&&i%100==2?ye.Two:0===o&&i%100===Math.floor(i%100)&&i%100>=3&&i%100<=4||0!==o?ye.Few:ye.Other;case"tzm":return n===Math.floor(n)&&n>=0&&n<=1||n===Math.floor(n)&&n>=11&&n<=99?ye.One:ye.Other;default:return ye.Other}}function k(e,t){t=encodeURIComponent(t);for(var n=0,r=e.split(";");n<r.length;n++){var i=r[n],o=i.indexOf("="),l=-1==o?[i,""]:[i.slice(0,o),i.slice(o+1)],a=l[1];if(l[0].trim()===t)return decodeURIComponent(a)}return null}function D(e,t){var n=o(e);if(He[n]=He[n]||{},He[n][t])return He[n][t];var r="";switch(t){case"shortDate":r=p(e,_e.Short);break;case"mediumDate":r=p(e,_e.Medium);break;case"longDate":r=p(e,_e.Long);break;case"fullDate":r=p(e,_e.Full);break;case"shortTime":r=f(e,_e.Short);break;case"mediumTime":r=f(e,_e.Medium);break;case"longTime":r=f(e,_e.Long);break;case"fullTime":r=f(e,_e.Full);break;case"short":var i=D(e,"shortTime"),l=D(e,"shortDate");r=I(h(e,_e.Short),[i,l]);break;case"medium":var a=D(e,"mediumTime"),s=D(e,"mediumDate");r=I(h(e,_e.Medium),[a,s]);break;case"long":var u=D(e,"longTime"),c=D(e,"longDate");r=I(h(e,_e.Long),[u,c]);break;case"full":var d=D(e,"fullTime"),m=D(e,"fullDate");r=I(h(e,_e.Full),[d,m])}return r&&(He[n][t]=r),r}function I(e,t){return t&&(e=e.replace(/\{([^}]+)}/g,function(e,n){return null!=t&&n in t?t[n]:e})),e}function R(e,t,n,r,i){void 0===n&&(n="-");var o="";(e<0||i&&e<=0)&&(i?e=1-e:(e=-e,o=n));for(var l=""+e;l.length<t;)l="0"+l;return r&&(l=l.substr(l.length-t)),o+l}function M(e,t,n,r,i){return void 0===n&&(n=0),void 0===r&&(r=!1),void 0===i&&(i=!1),function(o,l){var a=function(e,t,n){switch(e){case Ue.FullYear:return t.getFullYear();case Ue.Month:return t.getMonth();case Ue.Date:return t.getDate();case Ue.Hours:return t.getHours();case Ue.Minutes:return t.getMinutes();case Ue.Seconds:return t.getSeconds();case Ue.Milliseconds:var r=1===n?100:2===n?10:1;return Math.round(t.getMilliseconds()/r);case Ue.Day:return t.getDay();default:throw new Error('Unknown DateType value "'+e+'".')}}(e,o,t);return(n>0||a>-n)&&(a+=n),e===Ue.Hours&&0===a&&-12===n&&(a=12),R(a,t,m(l,we.MinusSign),r,i)}}function P(e,t,n,r){return void 0===n&&(n=ve.Format),void 0===r&&(r=!1),function(i,o){return function(t,n,r,i,o,c){switch(e){case Ge.Months:return s(n,o,i)[t.getMonth()];case Ge.Days:return a(n,o,i)[t.getDay()];case Ge.DayPeriods:var d=t.getHours(),p=t.getMinutes();if(c){var f,h=w(n),m=x(n,o,i);if(h.forEach(function(e,t){if(Array.isArray(e)){var n=e[0],r=e[1],i=r.hours;d>=n.hours&&p>=n.minutes&&(d<i||d===i&&p<r.minutes)&&(f=m[t])}else e.hours===d&&e.minutes===p&&(f=m[t])}),f)return f}return l(n,o,i)[d<12?0:1];case Ge.Eras:return u(n,i)[t.getFullYear()<=0?0:1]}}(i,o,0,t,n,r)}}function N(e){return function(t,n,r){var i=-1*r,o=m(n,we.MinusSign),l=i>0?Math.floor(i/60):Math.ceil(i/60);switch(e){case qe.Short:return(i>=0?"+":"")+R(l,2,o)+R(Math.abs(i%60),2,o);case qe.ShortGMT:return"GMT"+(i>=0?"+":"")+R(l,1,o);case qe.Long:return"GMT"+(i>=0?"+":"")+R(l,2,o)+":"+R(Math.abs(i%60),2,o);case qe.Extended:return 0===r?"Z":(i>=0?"+":"")+R(l,2,o)+":"+R(Math.abs(i%60),2,o);default:throw new Error('Unknown zone width "'+e+'"')}}}function A(e,t){return void 0===t&&(t=!1),function(n,r){var i;if(t){var o=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,l=n.getDate();i=1+Math.floor((l+o)/7)}else{var a=function(e){var t=new Date(e,Ke,1).getDay();return new Date(e,0,1+(t<=$e?$e:$e+7)-t)}(n.getFullYear()),s=function(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate()+($e-e.getDay()))}(n).getTime()-a.getTime();i=1+Math.round(s/6048e5)}return R(i,e,m(r,we.MinusSign))}}function L(e,t){e=e.replace(/:/g,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+e)/6e4;return isNaN(n)?t:n}function F(e,t){return Error("InvalidPipeArgument: '"+t+"' for pipe '"+Object(ie["\u0275stringify"])(e)+"'")}function j(e){var t=new Date(0),n=0,r=0,i=e[8]?t.setUTCHours:t.setHours;e[9]&&(n=+(e[9]+e[10]),r=+(e[9]+e[11])),(e[8]?t.setUTCFullYear:t.setFullYear).call(t,+e[1],+e[2]-1,+e[3]);var o=+(e[4]||"0")-n,l=+(e[5]||"0")-r,a=+(e[6]||"0"),s=Math.round(1e3*parseFloat("0."+(e[7]||0)));return i.call(t,o,l,a,s),t}function V(e){return e instanceof Date&&!isNaN(e.valueOf())}function z(e){return function(t,n){var r=e(t,n);return 1==r.length?"0"+r:r}}function B(e){return function(t,n){return e(t,n).split(" ")[0]}}function H(e,t,n){return new Intl.DateTimeFormat(t,n).format(e).replace(/[\u200e\u200f]/g,"")}function W(e){var t={hour:"2-digit",hour12:!1,timeZoneName:e};return function(e,n){var r=H(e,n,t);return r?r.substring(3):""}}function q(e,t){return e.hour12=t,e}function U(e,t){return function(){var n={};return n[e]=2===t?"2-digit":"numeric",n}()}function G(e,t){var n={};return n[e]=t<4?t>1?"short":"narrow":"long",n}function K(e){return e.reduce(function(e,t){return Object(oe.__assign)({},e,t)},{})}function $(e){return function(t,n){return H(t,n,e)}}function Z(e){return e instanceof Date&&!isNaN(e.valueOf())}function Q(e,t,n,r,i){void 0===i&&(i=null);var o,l={str:null},a=g(t,n);if("string"!=typeof e||isNaN(+e-parseFloat(e))){if("number"!=typeof e)return l.error=e+" is not a number",l;o=e}else o=+e;n===ge.Percent&&(o*=100);var s=Math.abs(o)+"",u=function(e,t){void 0===t&&(t="-");var n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},r=e.split(ut),i=r[0],o=r[1],l=-1!==i.indexOf(at)?i.split(at):[i.substring(0,i.lastIndexOf(st)+1),i.substring(i.lastIndexOf(st)+1)],a=l[0],s=l[1]||"";n.posPre=a.substr(0,a.indexOf(dt));for(var u=0;u<s.length;u++){var c=s.charAt(u);c===st?n.minFrac=n.maxFrac=u+1:c===dt?n.maxFrac=u+1:n.posSuf+=c}var d=a.split(ct);if(n.gSize=d[1]?d[1].length:0,n.lgSize=d[2]||d[1]?(d[2]||d[1]).length:0,o){var p=i.length-n.posPre.length-n.posSuf.length,f=o.indexOf(dt);n.negPre=o.substr(0,f).replace(/'/g,""),n.negSuf=o.substr(f+p).replace(/'/g,"")}else n.negPre=t+n.posPre,n.negSuf=n.posSuf;return n}(a,m(t,we.MinusSign)),c="",d=!1;if(isFinite(o)){var p=function(e){var t,n,r,i,o,l=0;for((n=e.indexOf(at))>-1&&(e=e.replace(at,"")),(r=e.search(/e/i))>0?(n<0&&(n=r),n+=+e.slice(r+1),e=e.substring(0,r)):n<0&&(n=e.length),r=0;e.charAt(r)===st;r++);if(r===(o=e.length))t=[0],n=1;else{for(o--;e.charAt(o)===st;)o--;for(n-=r,t=[],i=0;r<=o;r++,i++)t[i]=+e.charAt(r)}return n>lt&&(t=t.splice(0,lt-1),l=n-1,n=1),{digits:t,exponent:l,integerLen:n}}(s),f=u.minInt,h=u.minFrac,y=u.maxFrac;if(r){var v=r.match(ot);if(null===v)return l.error=r+" is not a valid digit info",l;var b=v[1],_=v[3],w=v[5];null!=b&&(f=Y(b)),null!=_&&(h=Y(_)),null!=w?y=Y(w):null!=_&&h>y&&(y=h)}!function(e,t,n){if(t>n)throw new Error("The minimum number of digits after fraction ("+t+") is higher than the maximum ("+n+").");var r=e.digits,i=r.length-e.integerLen,o=Math.min(Math.max(t,i),n),l=o+e.integerLen,a=r[l];if(l>0){r.splice(Math.max(e.integerLen,l));for(var s=l;s<r.length;s++)r[s]=0}else{i=Math.max(0,i),e.integerLen=1,r.length=Math.max(1,l=o+1),r[0]=0;for(var u=1;u<l;u++)r[u]=0}if(a>=5)if(l-1<0){for(var c=0;c>l;c--)r.unshift(0),e.integerLen++;r.unshift(1),e.integerLen++}else r[l-1]++;for(;i<Math.max(0,o);i++)r.push(0);var d=r.reduceRight(function(e,t,n,r){return t+=e,r[n]=t%10,Math.floor(t/10)},0);d&&(r.unshift(d),e.integerLen++)}(p,h,y);var x=p.digits,C=p.integerLen,E=p.exponent,S=[];for(d=x.every(function(e){return!e});C<f;C++)x.unshift(0);for(;C<0;C++)x.unshift(0);C>0?S=x.splice(C,x.length):(S=x,x=[0]);var O=[];for(x.length>=u.lgSize&&O.unshift(x.splice(-u.lgSize,x.length).join(""));x.length>u.gSize;)O.unshift(x.splice(-u.gSize,x.length).join(""));x.length&&O.unshift(x.join("")),c=O.join(m(t,i?we.CurrencyGroup:we.Group)),S.length&&(c+=m(t,i?we.CurrencyDecimal:we.Decimal)+S.join("")),E&&(c+=m(t,we.Exponential)+"+"+E)}else c=m(t,we.Infinity);return c=o<0&&!d?u.negPre+c+u.negSuf:u.posPre+c+u.posSuf,n===ge.Currency&&null!==i?(l.str=c.replace(pt,i).replace(pt,""),l):n===ge.Percent?(l.str=c.replace(new RegExp(ft,"g"),m(t,we.PercentSign)),l):(l.str=c,l)}function Y(e){var t=parseInt(e);if(isNaN(t))throw new Error("Invalid integer literal when parsing "+e);return t}function X(e,t,n,r,i,o,l){if(void 0===o&&(o=null),void 0===l&&(l=!1),null==n)return null;if("number"!=typeof(n="string"!=typeof n||isNaN(+n-parseFloat(n))?n:+n))throw F(e,n);var a,s,u;if(r!==ge.Currency&&(a=1,s=0,u=3),i){var c=i.match(ot);if(null===c)throw new Error(i+" is not a valid digit info for number pipes");null!=c[1]&&(a=Y(c[1])),null!=c[3]&&(s=Y(c[3])),null!=c[5]&&(u=Y(c[5]))}return Xe.format(n,t,r,{minimumIntegerDigits:a,minimumFractionDigits:s,maximumFractionDigits:u,currency:o,currencyAsSymbol:l})}function J(e){return null==e||""===e||e!=e}function ee(e){return e===Ft}function te(e){return e===jt}function ne(e){return e===Vt}function re(e){return e===zt}Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"NgLocaleLocalization",function(){return Se}),n.d(t,"NgLocalization",function(){return Ee}),n.d(t,"registerLocaleData",function(){return i}),n.d(t,"Plural",function(){return ye}),n.d(t,"NumberFormatStyle",function(){return ge}),n.d(t,"FormStyle",function(){return ve}),n.d(t,"TranslationWidth",function(){return be}),n.d(t,"FormatWidth",function(){return _e}),n.d(t,"NumberSymbol",function(){return we}),n.d(t,"WeekDay",function(){return xe}),n.d(t,"getLocaleDayPeriods",function(){return l}),n.d(t,"getLocaleDayNames",function(){return a}),n.d(t,"getLocaleMonthNames",function(){return s}),n.d(t,"getLocaleId",function(){return o}),n.d(t,"getLocaleEraNames",function(){return u}),n.d(t,"getLocaleWeekEndRange",function(){return d}),n.d(t,"getLocaleFirstDayOfWeek",function(){return c}),n.d(t,"getLocaleDateFormat",function(){return p}),n.d(t,"getLocaleDateTimeFormat",function(){return h}),n.d(t,"getLocaleExtraDayPeriodRules",function(){return w}),n.d(t,"getLocaleExtraDayPeriods",function(){return x}),n.d(t,"getLocalePluralCase",function(){return b}),n.d(t,"getLocaleTimeFormat",function(){return f}),n.d(t,"getLocaleNumberSymbol",function(){return m}),n.d(t,"getLocaleNumberFormat",function(){return g}),n.d(t,"getLocaleCurrencyName",function(){return v}),n.d(t,"getLocaleCurrencySymbol",function(){return y}),n.d(t,"CURRENCIES",function(){return fe}),n.d(t,"\u0275parseCookieValue",function(){return k}),n.d(t,"CommonModule",function(){return Nt}),n.d(t,"DeprecatedI18NPipesModule",function(){return At}),n.d(t,"NgClass",function(){return Oe}),n.d(t,"NgForOf",function(){return De}),n.d(t,"NgForOfContext",function(){return ke}),n.d(t,"NgIf",function(){return Re}),n.d(t,"NgIfContext",function(){return Me}),n.d(t,"NgPlural",function(){return Fe}),n.d(t,"NgPluralCase",function(){return je}),n.d(t,"NgStyle",function(){return Ve}),n.d(t,"NgSwitch",function(){return Ne}),n.d(t,"NgSwitchCase",function(){return Ae}),n.d(t,"NgSwitchDefault",function(){return Le}),n.d(t,"NgTemplateOutlet",function(){return ze}),n.d(t,"NgComponentOutlet",function(){return Te}),n.d(t,"DOCUMENT",function(){return Lt}),n.d(t,"AsyncPipe",function(){return wt}),n.d(t,"DatePipe",function(){return Ye}),n.d(t,"I18nPluralPipe",function(){return Ot}),n.d(t,"I18nSelectPipe",function(){return Tt}),n.d(t,"JsonPipe",function(){return kt}),n.d(t,"LowerCasePipe",function(){return xt}),n.d(t,"CurrencyPipe",function(){return Rt}),n.d(t,"DecimalPipe",function(){return Dt}),n.d(t,"PercentPipe",function(){return It}),n.d(t,"SlicePipe",function(){return Mt}),n.d(t,"UpperCasePipe",function(){return Et}),n.d(t,"TitleCasePipe",function(){return Ct}),n.d(t,"DeprecatedDatePipe",function(){return it}),n.d(t,"DeprecatedCurrencyPipe",function(){return gt}),n.d(t,"DeprecatedDecimalPipe",function(){return ht}),n.d(t,"DeprecatedPercentPipe",function(){return mt}),n.d(t,"\u0275PLATFORM_BROWSER_ID",function(){return Ft}),n.d(t,"\u0275PLATFORM_SERVER_ID",function(){return jt}),n.d(t,"\u0275PLATFORM_WORKER_APP_ID",function(){return Vt}),n.d(t,"\u0275PLATFORM_WORKER_UI_ID",function(){return zt}),n.d(t,"isPlatformBrowser",function(){return ee}),n.d(t,"isPlatformServer",function(){return te}),n.d(t,"isPlatformWorkerApp",function(){return ne}),n.d(t,"isPlatformWorkerUi",function(){return re}),n.d(t,"VERSION",function(){return Bt}),n.d(t,"PlatformLocation",function(){return le}),n.d(t,"LOCATION_INITIALIZED",function(){return ae}),n.d(t,"LocationStrategy",function(){return se}),n.d(t,"APP_BASE_HREF",function(){return ue}),n.d(t,"HashLocationStrategy",function(){return de}),n.d(t,"PathLocationStrategy",function(){return pe}),n.d(t,"Location",function(){return ce}),n.d(t,"\u0275e",function(){return Be}),n.d(t,"\u0275d",function(){return S}),n.d(t,"\u0275a",function(){return Ce}),n.d(t,"\u0275b",function(){return T}),n.d(t,"\u0275g",function(){return yt}),n.d(t,"\u0275f",function(){return Pt});var ie=n("LMZF"),oe=n("6Xbx"),le=function(){},ae=new ie.InjectionToken("Location Initialized"),se=function(){},ue=new ie.InjectionToken("appBaseHref"),ce=function(){function e(t){var n=this;this._subject=new ie.EventEmitter,this._platformStrategy=t;var i=this._platformStrategy.getBaseHref();this._baseHref=e.stripTrailingSlash(r(i)),this._platformStrategy.onPopState(function(e){n._subject.emit({url:n.path(!0),pop:!0,type:e.type})})}return e.prototype.path=function(e){return void 0===e&&(e=!1),this.normalize(this._platformStrategy.path(e))},e.prototype.isCurrentPathEqualTo=function(t,n){return void 0===n&&(n=""),this.path()==this.normalize(t+e.normalizeQueryParams(n))},e.prototype.normalize=function(t){return e.stripTrailingSlash(function(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,r(t)))},e.prototype.prepareExternalUrl=function(e){return e&&"/"!==e[0]&&(e="/"+e),this._platformStrategy.prepareExternalUrl(e)},e.prototype.go=function(e,t){void 0===t&&(t=""),this._platformStrategy.pushState(null,"",e,t)},e.prototype.replaceState=function(e,t){void 0===t&&(t=""),this._platformStrategy.replaceState(null,"",e,t)},e.prototype.forward=function(){this._platformStrategy.forward()},e.prototype.back=function(){this._platformStrategy.back()},e.prototype.subscribe=function(e,t,n){return this._subject.subscribe({next:e,error:t,complete:n})},e.normalizeQueryParams=function(e){return e&&"?"!==e[0]?"?"+e:e},e.joinWithSlash=function(e,t){if(0==e.length)return t;if(0==t.length)return e;var n=0;return e.endsWith("/")&&n++,t.startsWith("/")&&n++,2==n?e+t.substring(1):1==n?e+t:e+"/"+t},e.stripTrailingSlash=function(e){var t=e.match(/#|\?|$/),n=t&&t.index||e.length;return e.slice(0,n-("/"===e[n-1]?1:0))+e.slice(n)},e}(),de=function(e){function t(t,n){var r=e.call(this)||this;return r._platformLocation=t,r._baseHref="",null!=n&&(r._baseHref=n),r}return Object(oe.__extends)(t,e),t.prototype.onPopState=function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.path=function(e){void 0===e&&(e=!1);var t=this._platformLocation.hash;return null==t&&(t="#"),t.length>0?t.substring(1):t},t.prototype.prepareExternalUrl=function(e){var t=ce.joinWithSlash(this._baseHref,e);return t.length>0?"#"+t:t},t.prototype.pushState=function(e,t,n,r){var i=this.prepareExternalUrl(n+ce.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.pushState(e,t,i)},t.prototype.replaceState=function(e,t,n,r){var i=this.prepareExternalUrl(n+ce.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.replaceState(e,t,i)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(se),pe=function(e){function t(t,n){var r=e.call(this)||this;if(r._platformLocation=t,null==n&&(n=r._platformLocation.getBaseHrefFromDOM()),null==n)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=n,r}return Object(oe.__extends)(t,e),t.prototype.onPopState=function(e){this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e)},t.prototype.getBaseHref=function(){return this._baseHref},t.prototype.prepareExternalUrl=function(e){return ce.joinWithSlash(this._baseHref,e)},t.prototype.path=function(e){void 0===e&&(e=!1);var t=this._platformLocation.pathname+ce.normalizeQueryParams(this._platformLocation.search),n=this._platformLocation.hash;return n&&e?""+t+n:t},t.prototype.pushState=function(e,t,n,r){var i=this.prepareExternalUrl(n+ce.normalizeQueryParams(r));this._platformLocation.pushState(e,t,i)},t.prototype.replaceState=function(e,t,n,r){var i=this.prepareExternalUrl(n+ce.normalizeQueryParams(r));this._platformLocation.replaceState(e,t,i)},t.prototype.forward=function(){this._platformLocation.forward()},t.prototype.back=function(){this._platformLocation.back()},t}(se),fe={AOA:[,"Kz"],ARS:[,"$"],AUD:["A$","$"],BAM:[,"KM"],BBD:[,"$"],BDT:[,"\u09f3"],BMD:[,"$"],BND:[,"$"],BOB:[,"Bs"],BRL:["R$"],BSD:[,"$"],BWP:[,"P"],BYN:[,"\u0440."],BZD:[,"$"],CAD:["CA$","$"],CLP:[,"$"],CNY:["CN\xa5","\xa5"],COP:[,"$"],CRC:[,"\u20a1"],CUC:[,"$"],CUP:[,"$"],CZK:[,"K\u010d"],DKK:[,"kr"],DOP:[,"$"],EGP:[,"E\xa3"],ESP:[,"\u20a7"],EUR:["\u20ac"],FJD:[,"$"],FKP:[,"\xa3"],GBP:["\xa3"],GEL:[,"\u20be"],GIP:[,"\xa3"],GNF:[,"FG"],GTQ:[,"Q"],GYD:[,"$"],HKD:["HK$","$"],HNL:[,"L"],HRK:[,"kn"],HUF:[,"Ft"],IDR:[,"Rp"],ILS:["\u20aa"],INR:["\u20b9"],ISK:[,"kr"],JMD:[,"$"],JPY:["\xa5"],KHR:[,"\u17db"],KMF:[,"CF"],KPW:[,"\u20a9"],KRW:["\u20a9"],KYD:[,"$"],KZT:[,"\u20b8"],LAK:[,"\u20ad"],LBP:[,"L\xa3"],LKR:[,"Rs"],LRD:[,"$"],LTL:[,"Lt"],LVL:[,"Ls"],MGA:[,"Ar"],MMK:[,"K"],MNT:[,"\u20ae"],MUR:[,"Rs"],MXN:["MX$","$"],MYR:[,"RM"],NAD:[,"$"],NGN:[,"\u20a6"],NIO:[,"C$"],NOK:[,"kr"],NPR:[,"Rs"],NZD:["NZ$","$"],PHP:[,"\u20b1"],PKR:[,"Rs"],PLN:[,"z\u0142"],PYG:[,"\u20b2"],RON:[,"lei"],RUB:[,"\u20bd"],RUR:[,"\u0440."],RWF:[,"RF"],SBD:[,"$"],SEK:[,"kr"],SGD:[,"$"],SHP:[,"\xa3"],SRD:[,"$"],SSP:[,"\xa3"],STD:[,"Db"],SYP:[,"\xa3"],THB:[,"\u0e3f"],TOP:[,"T$"],TRY:[,"\u20ba"],TTD:[,"$"],TWD:["NT$","$"],UAH:[,"\u20b4"],USD:["$"],UYU:[,"$"],VEF:[,"Bs"],VND:["\u20ab"],XAF:["FCFA"],XCD:["EC$","$"],XOF:["CFA"],XPF:["CFPF"],ZAR:[,"R"],ZMW:[,"ZK"]},he=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(e){var t=Math.floor(Math.abs(e)),n=e.toString().replace(/^[^.]*\.?/,"").length;return 1===t&&0===n?1:5}],me={},ge=function(){var e={Decimal:0,Percent:1,Currency:2,Scientific:3};return e[e.Decimal]="Decimal",e[e.Percent]="Percent",e[e.Currency]="Currency",e[e.Scientific]="Scientific",e}(),ye=function(){var e={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return e[e.Zero]="Zero",e[e.One]="One",e[e.Two]="Two",e[e.Few]="Few",e[e.Many]="Many",e[e.Other]="Other",e}(),ve=function(){var e={Format:0,Standalone:1};return e[e.Format]="Format",e[e.Standalone]="Standalone",e}(),be=function(){var e={Narrow:0,Abbreviated:1,Wide:2,Short:3};return e[e.Narrow]="Narrow",e[e.Abbreviated]="Abbreviated",e[e.Wide]="Wide",e[e.Short]="Short",e}(),_e=function(){var e={Short:0,Medium:1,Long:2,Full:3};return e[e.Short]="Short",e[e.Medium]="Medium",e[e.Long]="Long",e[e.Full]="Full",e}(),we=function(){var e={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return e[e.Decimal]="Decimal",e[e.Group]="Group",e[e.List]="List",e[e.PercentSign]="PercentSign",e[e.PlusSign]="PlusSign",e[e.MinusSign]="MinusSign",e[e.Exponential]="Exponential",e[e.SuperscriptingExponent]="SuperscriptingExponent",e[e.PerMille]="PerMille",e[e.Infinity]="Infinity",e[e.NaN]="NaN",e[e.TimeSeparator]="TimeSeparator",e[e.CurrencyDecimal]="CurrencyDecimal",e[e.CurrencyGroup]="CurrencyGroup",e}(),xe=function(){var e={Sunday:0,Monday:1,Tuesday:2,Wednesday:3,Thursday:4,Friday:5,Saturday:6};return e[e.Sunday]="Sunday",e[e.Monday]="Monday",e[e.Tuesday]="Tuesday",e[e.Wednesday]="Wednesday",e[e.Thursday]="Thursday",e[e.Friday]="Friday",e[e.Saturday]="Saturday",e}(),Ce=new ie.InjectionToken("UseV4Plurals"),Ee=function(){},Se=function(e){function t(t,n){var r=e.call(this)||this;return r.locale=t,r.deprecatedPluralFn=n,r}return Object(oe.__extends)(t,e),t.prototype.getPluralCategory=function(e,t){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(t||this.locale,e):b(t||this.locale)(e)){case ye.Zero:return"zero";case ye.One:return"one";case ye.Two:return"two";case ye.Few:return"few";case ye.Many:return"many";default:return"other"}},t}(Ee),Oe=function(){function e(e,t,n,r){this._iterableDiffers=e,this._keyValueDiffers=t,this._ngEl=n,this._renderer=r,this._initialClasses=[]}return Object.defineProperty(e.prototype,"klass",{set:function(e){this._applyInitialClasses(!0),this._initialClasses="string"==typeof e?e.split(/\s+/):[],this._applyInitialClasses(!1),this._applyClasses(this._rawClass,!1)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngClass",{set:function(e){this._cleanupClasses(this._rawClass),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof e?e.split(/\s+/):e,this._rawClass&&(Object(ie["\u0275isListLikeIterable"])(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())},enumerable:!0,configurable:!0}),e.prototype.ngDoCheck=function(){if(this._iterableDiffer){var e=this._iterableDiffer.diff(this._rawClass);e&&this._applyIterableChanges(e)}else if(this._keyValueDiffer){var t=this._keyValueDiffer.diff(this._rawClass);t&&this._applyKeyValueChanges(t)}},e.prototype._cleanupClasses=function(e){this._applyClasses(e,!0),this._applyInitialClasses(!1)},e.prototype._applyKeyValueChanges=function(e){var t=this;e.forEachAddedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachChangedItem(function(e){return t._toggleClass(e.key,e.currentValue)}),e.forEachRemovedItem(function(e){e.previousValue&&t._toggleClass(e.key,!1)})},e.prototype._applyIterableChanges=function(e){var t=this;e.forEachAddedItem(function(e){if("string"!=typeof e.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got "+Object(ie["\u0275stringify"])(e.item));t._toggleClass(e.item,!0)}),e.forEachRemovedItem(function(e){return t._toggleClass(e.item,!1)})},e.prototype._applyInitialClasses=function(e){var t=this;this._initialClasses.forEach(function(n){return t._toggleClass(n,!e)})},e.prototype._applyClasses=function(e,t){var n=this;e&&(Array.isArray(e)||e instanceof Set?e.forEach(function(e){return n._toggleClass(e,!t)}):Object.keys(e).forEach(function(r){null!=e[r]&&n._toggleClass(r,!t)}))},e.prototype._toggleClass=function(e,t){var n=this;(e=e.trim())&&e.split(/\s+/g).forEach(function(e){t?n._renderer.addClass(n._ngEl.nativeElement,e):n._renderer.removeClass(n._ngEl.nativeElement,e)})},e}(),Te=function(){function e(e){this._viewContainerRef=e,this._componentRef=null,this._moduleRef=null}return e.prototype.ngOnChanges=function(e){if(this._viewContainerRef.clear(),this._componentRef=null,this.ngComponentOutlet){var t=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;if(e.ngComponentOutletNgModuleFactory)if(this._moduleRef&&this._moduleRef.destroy(),this.ngComponentOutletNgModuleFactory){var n=t.get(ie.NgModuleRef);this._moduleRef=this.ngComponentOutletNgModuleFactory.create(n.injector)}else this._moduleRef=null;var r=(this._moduleRef?this._moduleRef.componentFactoryResolver:t.get(ie.ComponentFactoryResolver)).resolveComponentFactory(this.ngComponentOutlet);this._componentRef=this._viewContainerRef.createComponent(r,this._viewContainerRef.length,t,this.ngComponentOutletContent)}},e.prototype.ngOnDestroy=function(){this._moduleRef&&this._moduleRef.destroy()},e}(),ke=function(){function e(e,t,n,r){this.$implicit=e,this.ngForOf=t,this.index=n,this.count=r}return Object.defineProperty(e.prototype,"first",{get:function(){return 0===this.index},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"last",{get:function(){return this.index===this.count-1},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"even",{get:function(){return this.index%2==0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"odd",{get:function(){return!this.even},enumerable:!0,configurable:!0}),e}(),De=function(){function e(e,t,n){this._viewContainer=e,this._template=t,this._differs=n,this._differ=null}return Object.defineProperty(e.prototype,"ngForTrackBy",{get:function(){return this._trackByFn},set:function(e){Object(ie.isDevMode)()&&null!=e&&"function"!=typeof e&&console&&console.warn&&console.warn("trackBy must be a function, but received "+JSON.stringify(e)+". See https://angular.io/docs/ts/latest/api/common/index/NgFor-directive.html#!#change-propagation for more information."),this._trackByFn=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngForTemplate",{set:function(e){e&&(this._template=e)},enumerable:!0,configurable:!0}),e.prototype.ngOnChanges=function(e){if("ngForOf"in e){var t=e.ngForOf.currentValue;if(!this._differ&&t)try{this._differ=this._differs.find(t).create(this.ngForTrackBy)}catch(e){throw new Error("Cannot find a differ supporting object '"+t+"' of type '"+(t.name||typeof t)+"'. NgFor only supports binding to Iterables such as Arrays.")}}},e.prototype.ngDoCheck=function(){if(this._differ){var e=this._differ.diff(this.ngForOf);e&&this._applyChanges(e)}},e.prototype._applyChanges=function(e){var t=this,n=[];e.forEachOperation(function(e,r,i){if(null==e.previousIndex){var o=t._viewContainer.createEmbeddedView(t._template,new ke(null,t.ngForOf,-1,-1),i),l=new Ie(e,o);n.push(l)}else null==i?t._viewContainer.remove(r):(o=t._viewContainer.get(r),t._viewContainer.move(o,i),l=new Ie(e,o),n.push(l))});for(var r=0;r<n.length;r++)this._perViewChange(n[r].view,n[r].record);r=0;for(var i=this._viewContainer.length;r<i;r++){var o=this._viewContainer.get(r);o.context.index=r,o.context.count=i}e.forEachIdentityChange(function(e){t._viewContainer.get(e.currentIndex).context.$implicit=e.item})},e.prototype._perViewChange=function(e,t){e.context.$implicit=t.item},e}(),Ie=function(e,t){this.record=e,this.view=t},Re=function(){function e(e,t){this._viewContainer=e,this._context=new Me,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=t}return Object.defineProperty(e.prototype,"ngIf",{set:function(e){this._context.$implicit=this._context.ngIf=e,this._updateView()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngIfThen",{set:function(e){this._thenTemplateRef=e,this._thenViewRef=null,this._updateView()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"ngIfElse",{set:function(e){this._elseTemplateRef=e,this._elseViewRef=null,this._updateView()},enumerable:!0,configurable:!0}),e.prototype._updateView=function(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))},e}(),Me=function(){this.$implicit=null,this.ngIf=null},Pe=function(){function e(e,t){this._viewContainerRef=e,this._templateRef=t,this._created=!1}return e.prototype.create=function(){this._created=!0,this._viewContainerRef.createEmbeddedView(this._templateRef)},e.prototype.destroy=function(){this._created=!1,this._viewContainerRef.clear()},e.prototype.enforceState=function(e){e&&!this._created?this.create():!e&&this._created&&this.destroy()},e}(),Ne=function(){function e(){this._defaultUsed=!1,this._caseCount=0,this._lastCaseCheckIndex=0,this._lastCasesMatched=!1}return Object.defineProperty(e.prototype,"ngSwitch",{set:function(e){this._ngSwitch=e,0===this._caseCount&&this._updateDefaultCases(!0)},enumerable:!0,configurable:!0}),e.prototype._addCase=function(){return this._caseCount++},e.prototype._addDefault=function(e){this._defaultViews||(this._defaultViews=[]),this._defaultViews.push(e)},e.prototype._matchCase=function(e){var t=e==this._ngSwitch;return this._lastCasesMatched=this._lastCasesMatched||t,this._lastCaseCheckIndex++,this._lastCaseCheckIndex===this._caseCount&&(this._updateDefaultCases(!this._lastCasesMatched),this._lastCaseCheckIndex=0,this._lastCasesMatched=!1),t},e.prototype._updateDefaultCases=function(e){if(this._defaultViews&&e!==this._defaultUsed){this._defaultUsed=e;for(var t=0;t<this._defaultViews.length;t++)this._defaultViews[t].enforceState(e)}},e}(),Ae=function(){function e(e,t,n){this.ngSwitch=n,n._addCase(),this._view=new Pe(e,t)}return e.prototype.ngDoCheck=function(){this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase))},e}(),Le=function(){return function(e,t,n){n._addDefault(new Pe(e,t))}}(),Fe=function(){function e(e){this._localization=e,this._caseViews={}}return Object.defineProperty(e.prototype,"ngPlural",{set:function(e){this._switchValue=e,this._updateView()},enumerable:!0,configurable:!0}),e.prototype.addCase=function(e,t){this._caseViews[e]=t},e.prototype._updateView=function(){this._clearViews();var e=Object.keys(this._caseViews),t=O(this._switchValue,e,this._localization);this._activateView(this._caseViews[t])},e.prototype._clearViews=function(){this._activeView&&this._activeView.destroy()},e.prototype._activateView=function(e){e&&(this._activeView=e,this._activeView.create())},e}(),je=function(){return function(e,t,n,r){this.value=e;var i=!isNaN(Number(e));r.addCase(i?"="+e:e,new Pe(n,t))}}(),Ve=function(){function e(e,t,n){this._differs=e,this._ngEl=t,this._renderer=n}return Object.defineProperty(e.prototype,"ngStyle",{set:function(e){this._ngStyle=e,!this._differ&&e&&(this._differ=this._differs.find(e).create())},enumerable:!0,configurable:!0}),e.prototype.ngDoCheck=function(){if(this._differ){var e=this._differ.diff(this._ngStyle);e&&this._applyChanges(e)}},e.prototype._applyChanges=function(e){var t=this;e.forEachRemovedItem(function(e){return t._setStyle(e.key,null)}),e.forEachAddedItem(function(e){return t._setStyle(e.key,e.currentValue)}),e.forEachChangedItem(function(e){return t._setStyle(e.key,e.currentValue)})},e.prototype._setStyle=function(e,t){var n=e.split("."),r=n[1];this._renderer.setStyle(this._ngEl.nativeElement,n[0],t=null!=t&&r?""+t+r:t)},e}(),ze=function(){function e(e){this._viewContainerRef=e}return e.prototype.ngOnChanges=function(e){this._shouldRecreateView(e)?(this._viewRef&&this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef)),this.ngTemplateOutlet&&(this._viewRef=this._viewContainerRef.createEmbeddedView(this.ngTemplateOutlet,this.ngTemplateOutletContext))):this._viewRef&&this.ngTemplateOutletContext&&this._updateExistingContext(this.ngTemplateOutletContext)},e.prototype._shouldRecreateView=function(e){var t=e.ngTemplateOutletContext;return!!e.ngTemplateOutlet||t&&this._hasContextShapeChanged(t)},e.prototype._hasContextShapeChanged=function(e){var t=Object.keys(e.previousValue||{}),n=Object.keys(e.currentValue||{});if(t.length===n.length){for(var r=0,i=n;r<i.length;r++)if(-1===t.indexOf(i[r]))return!0;return!1}return!0},e.prototype._updateExistingContext=function(e){for(var t=0,n=Object.keys(e);t<n.length;t++){var r=n[t];this._viewRef.context[r]=this.ngTemplateOutletContext[r]}},e}(),Be=[Oe,Te,De,Re,ze,Ve,Ne,Ae,Le,Fe,je],He={},We=/((?:[^GyMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/,qe=function(){var e={Short:0,ShortGMT:1,Long:2,Extended:3};return e[e.Short]="Short",e[e.ShortGMT]="ShortGMT",e[e.Long]="Long",e[e.Extended]="Extended",e}(),Ue=function(){var e={FullYear:0,Month:1,Date:2,Hours:3,Minutes:4,Seconds:5,Milliseconds:6,Day:7};return e[e.FullYear]="FullYear",e[e.Month]="Month",e[e.Date]="Date",e[e.Hours]="Hours",e[e.Minutes]="Minutes",e[e.Seconds]="Seconds",e[e.Milliseconds]="Milliseconds",e[e.Day]="Day",e}(),Ge=function(){var e={DayPeriods:0,Days:1,Months:2,Eras:3};return e[e.DayPeriods]="DayPeriods",e[e.Days]="Days",e[e.Months]="Months",e[e.Eras]="Eras",e}(),Ke=0,$e=4,Ze={},Qe=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,Ye=function(){function e(e){this.locale=e}return e.prototype.transform=function(t,n,r,i){if(void 0===n&&(n="mediumDate"),null==t||""===t||t!=t)return null;"string"==typeof t&&(t=t.trim());var o;if(V(t))o=t;else if(isNaN(t-parseFloat(t)))if("string"==typeof t&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(t)){var l=t.split("-").map(function(e){return+e}),a=l[0],s=l[1],u=l[2];o=new Date(a,s-1,u)}else o=new Date(t);else o=new Date(parseFloat(t));if(!V(o)){var c=void 0;if("string"!=typeof t||!(c=t.match(Qe)))throw F(e,t);o=j(c)}return function(e,t,n,r){t=D(n,t)||t;for(var i,o=[];t;){if(!(i=We.exec(t))){o.push(t);break}var l=(o=o.concat(i.slice(1))).pop();if(!l)break;t=l}var a=e.getTimezoneOffset();r&&(a=L(r,a),e=function(e,t,n){var r=e.getTimezoneOffset();return function(e,t){return(e=new Date(e.getTime())).setMinutes(e.getMinutes()+t),e}(e,-1*(L(t,r)-r))}(e,r));var s="";return o.forEach(function(t){var r=function(e){if(Ze[e])return Ze[e];var t;switch(e){case"G":case"GG":case"GGG":t=P(Ge.Eras,be.Abbreviated);break;case"GGGG":t=P(Ge.Eras,be.Wide);break;case"GGGGG":t=P(Ge.Eras,be.Narrow);break;case"y":t=M(Ue.FullYear,1,0,!1,!0);break;case"yy":t=M(Ue.FullYear,2,0,!0,!0);break;case"yyy":t=M(Ue.FullYear,3,0,!1,!0);break;case"yyyy":t=M(Ue.FullYear,4,0,!1,!0);break;case"M":case"L":t=M(Ue.Month,1,1);break;case"MM":case"LL":t=M(Ue.Month,2,1);break;case"MMM":t=P(Ge.Months,be.Abbreviated);break;case"MMMM":t=P(Ge.Months,be.Wide);break;case"MMMMM":t=P(Ge.Months,be.Narrow);break;case"LLL":t=P(Ge.Months,be.Abbreviated,ve.Standalone);break;case"LLLL":t=P(Ge.Months,be.Wide,ve.Standalone);break;case"LLLLL":t=P(Ge.Months,be.Narrow,ve.Standalone);break;case"w":t=A(1);break;case"ww":t=A(2);break;case"W":t=A(1,!0);break;case"d":t=M(Ue.Date,1);break;case"dd":t=M(Ue.Date,2);break;case"E":case"EE":case"EEE":t=P(Ge.Days,be.Abbreviated);break;case"EEEE":t=P(Ge.Days,be.Wide);break;case"EEEEE":t=P(Ge.Days,be.Narrow);break;case"EEEEEE":t=P(Ge.Days,be.Short);break;case"a":case"aa":case"aaa":t=P(Ge.DayPeriods,be.Abbreviated);break;case"aaaa":t=P(Ge.DayPeriods,be.Wide);break;case"aaaaa":t=P(Ge.DayPeriods,be.Narrow);break;case"b":case"bb":case"bbb":t=P(Ge.DayPeriods,be.Abbreviated,ve.Standalone,!0);break;case"bbbb":t=P(Ge.DayPeriods,be.Wide,ve.Standalone,!0);break;case"bbbbb":t=P(Ge.DayPeriods,be.Narrow,ve.Standalone,!0);break;case"B":case"BB":case"BBB":t=P(Ge.DayPeriods,be.Abbreviated,ve.Format,!0);break;case"BBBB":t=P(Ge.DayPeriods,be.Wide,ve.Format,!0);break;case"BBBBB":t=P(Ge.DayPeriods,be.Narrow,ve.Format,!0);break;case"h":t=M(Ue.Hours,1,-12);break;case"hh":t=M(Ue.Hours,2,-12);break;case"H":t=M(Ue.Hours,1);break;case"HH":t=M(Ue.Hours,2);break;case"m":t=M(Ue.Minutes,1);break;case"mm":t=M(Ue.Minutes,2);break;case"s":t=M(Ue.Seconds,1);break;case"ss":t=M(Ue.Seconds,2);break;case"S":t=M(Ue.Milliseconds,1);break;case"SS":t=M(Ue.Milliseconds,2);break;case"SSS":t=M(Ue.Milliseconds,3);break;case"Z":case"ZZ":case"ZZZ":t=N(qe.Short);break;case"ZZZZZ":t=N(qe.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":t=N(qe.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":t=N(qe.Long);break;default:return null}return Ze[e]=t,t}(t);s+=r?r(e,n,a):"''"===t?"'":t.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),s}(o,n,i||this.locale,r)},e}(),Xe=function(){function e(){}return e.format=function(e,t,n,r){void 0===r&&(r={});var i=r.currency,o=r.currencyAsSymbol,l=void 0!==o&&o,a={minimumIntegerDigits:r.minimumIntegerDigits,minimumFractionDigits:r.minimumFractionDigits,maximumFractionDigits:r.maximumFractionDigits,style:ge[n].toLowerCase()};return n==ge.Currency&&(a.currency="string"==typeof i?i:void 0,a.currencyDisplay=l?"symbol":"code"),new Intl.NumberFormat(t,a).format(e)},e}(),Je=/((?:[^yMLdHhmsazZEwGjJ']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|J+|j+|m+|s+|a|z|Z|G+|w+))(.*)/,et={yMMMdjms:$(K([U("year",1),G("month",3),U("day",1),U("hour",1),U("minute",1),U("second",1)])),yMdjm:$(K([U("year",1),U("month",1),U("day",1),U("hour",1),U("minute",1)])),yMMMMEEEEd:$(K([U("year",1),G("month",4),G("weekday",4),U("day",1)])),yMMMMd:$(K([U("year",1),G("month",4),U("day",1)])),yMMMd:$(K([U("year",1),G("month",3),U("day",1)])),yMd:$(K([U("year",1),U("month",1),U("day",1)])),jms:$(K([U("hour",1),U("second",1),U("minute",1)])),jm:$(K([U("hour",1),U("minute",1)]))},tt={yyyy:$(U("year",4)),yy:$(U("year",2)),y:$(U("year",1)),MMMM:$(G("month",4)),MMM:$(G("month",3)),MM:$(U("month",2)),M:$(U("month",1)),LLLL:$(G("month",4)),L:$(G("month",1)),dd:$(U("day",2)),d:$(U("day",1)),HH:z(B($(q(U("hour",2),!1)))),H:B($(q(U("hour",1),!1))),hh:z(B($(q(U("hour",2),!0)))),h:B($(q(U("hour",1),!0))),jj:$(U("hour",2)),j:$(U("hour",1)),mm:z($(U("minute",2))),m:$(U("minute",1)),ss:z($(U("second",2))),s:$(U("second",1)),sss:$(U("second",3)),EEEE:$(G("weekday",4)),EEE:$(G("weekday",3)),EE:$(G("weekday",2)),E:$(G("weekday",1)),a:function(e){return function(t,n){return e(t,n).split(" ")[1]}}($(q(U("hour",1),!0))),Z:W("short"),z:W("long"),ww:$({}),w:$({}),G:$(G("era",1)),GG:$(G("era",2)),GGG:$(G("era",3)),GGGG:$(G("era",4))},nt=new Map,rt=function(){function e(){}return e.format=function(e,t,n){return function(e,t,n){var r=et[e];if(r)return r(t,n);var i=e,o=nt.get(i);if(!o){o=[];var l=void 0;Je.exec(e);for(var a=e;a;)(l=Je.exec(a))?a=(o=o.concat(l.slice(1))).pop():(o.push(a),a=null);nt.set(i,o)}return o.reduce(function(e,r){var i=tt[r];return e+(i?i(t,n):"''"===r?"'":r.replace(/(^'|'$)/g,"").replace(/''/g,"'"))},"")}(n,e,t)},e}(),it=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n){if(void 0===n&&(n="mediumDate"),null==t||""===t||t!=t)return null;var r;if("string"==typeof t&&(t=t.trim()),Z(t))r=t;else if(isNaN(t-parseFloat(t)))if("string"==typeof t&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(t)){var i=t.split("-").map(function(e){return parseInt(e,10)}),o=i[0],l=i[1],a=i[2];r=new Date(o,l-1,a)}else r=new Date(t);else r=new Date(parseFloat(t));if(!Z(r)){var s=void 0;if("string"!=typeof t||!(s=t.match(Qe)))throw F(e,t);r=j(s)}return rt.format(r,this._locale,e._ALIASES[n]||n)},e._ALIASES={medium:"yMMMdjms",short:"yMdjm",fullDate:"yMMMMEEEEd",longDate:"yMMMMd",mediumDate:"yMMMd",shortDate:"yMd",mediumTime:"jms",shortTime:"jm"},e}(),ot=/^(\d+)?\.((\d+)(-(\d+))?)?$/,lt=22,at=".",st="0",ut=";",ct=",",dt="#",pt="\xa4",ft="%",ht=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n){return X(e,this._locale,t,ge.Decimal,n)},e}(),mt=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n){return X(e,this._locale,t,ge.Percent,n)},e}(),gt=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n,r,i){return void 0===n&&(n="USD"),void 0===r&&(r=!1),X(e,this._locale,t,ge.Currency,i,n,r)},e}(),yt=[ht,mt,gt,it],vt=function(){function e(){}return e.prototype.createSubscription=function(e,t){return e.subscribe({next:t,error:function(e){throw e}})},e.prototype.dispose=function(e){e.unsubscribe()},e.prototype.onDestroy=function(e){e.unsubscribe()},e}(),bt=new(function(){function e(){}return e.prototype.createSubscription=function(e,t){return e.then(t,function(e){throw e})},e.prototype.dispose=function(e){},e.prototype.onDestroy=function(e){},e}()),_t=new vt,wt=function(){function e(e){this._ref=e,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return e.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},e.prototype.transform=function(e){return this._obj?e!==this._obj?(this._dispose(),this.transform(e)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,ie.WrappedValue.wrap(this._latestValue)):(e&&this._subscribe(e),this._latestReturnedValue=this._latestValue,this._latestValue)},e.prototype._subscribe=function(e){var t=this;this._obj=e,this._strategy=this._selectStrategy(e),this._subscription=this._strategy.createSubscription(e,function(n){return t._updateLatestValue(e,n)})},e.prototype._selectStrategy=function(t){if(Object(ie["\u0275isPromise"])(t))return bt;if(Object(ie["\u0275isObservable"])(t))return _t;throw F(e,t)},e.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},e.prototype._updateLatestValue=function(e,t){e===this._obj&&(this._latestValue=t,this._ref.markForCheck())},e}(),xt=function(){function e(){}return e.prototype.transform=function(t){if(!t)return t;if("string"!=typeof t)throw F(e,t);return t.toLowerCase()},e}(),Ct=function(){function e(){}return e.prototype.transform=function(t){if(!t)return t;if("string"!=typeof t)throw F(e,t);return t.split(/\b/g).map(function(e){return function(e){return e?e[0].toUpperCase()+e.substr(1).toLowerCase():e}(e)}).join("")},e}(),Et=function(){function e(){}return e.prototype.transform=function(t){if(!t)return t;if("string"!=typeof t)throw F(e,t);return t.toUpperCase()},e}(),St=/#/g,Ot=function(){function e(e){this._localization=e}return e.prototype.transform=function(t,n,r){if(null==t)return"";if("object"!=typeof n||null===n)throw F(e,n);return n[O(t,Object.keys(n),this._localization,r)].replace(St,t.toString())},e}(),Tt=function(){function e(){}return e.prototype.transform=function(t,n){if(null==t)return"";if("object"!=typeof n||"string"!=typeof t)throw F(e,n);return n.hasOwnProperty(t)?n[t]:n.hasOwnProperty("other")?n.other:""},e}(),kt=function(){function e(){}return e.prototype.transform=function(e){return JSON.stringify(e,null,2)},e}(),Dt=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n,r){if(J(t))return null;var i=Q(t,r=r||this._locale,ge.Decimal,n),o=i.str,l=i.error;if(l)throw F(e,l);return o},e}(),It=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n,r){if(J(t))return null;var i=Q(t,r=r||this._locale,ge.Percent,n),o=i.str,l=i.error;if(l)throw F(e,l);return o},e}(),Rt=function(){function e(e){this._locale=e}return e.prototype.transform=function(t,n,r,i,o){if(void 0===r&&(r="symbol"),J(t))return null;o=o||this._locale,"boolean"==typeof r&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),r=r?"symbol":"code");var l=n||"USD";"code"!==r&&(l=function(e,t){var n=fe[l]||{},i=n[0]||l;return"wide"==("symbol"===r?"wide":"narrow")?i:n[1]||i}());var a=Q(t,o,ge.Currency,i,l),s=a.str,u=a.error;if(u)throw F(e,u);return s},e}(),Mt=function(){function e(){}return e.prototype.transform=function(t,n,r){if(null==t)return t;if(!this.supports(t))throw F(e,t);return t.slice(n,r)},e.prototype.supports=function(e){return"string"==typeof e||Array.isArray(e)},e}(),Pt=[wt,Et,xt,kt,Mt,Dt,It,Ct,Rt,Ye,Ot,Tt],Nt=function(){},At=function(){},Lt=new ie.InjectionToken("DocumentToken"),Ft="browser",jt="server",Vt="browserWorkerApp",zt="browserWorkerUi",Bt=new ie.Version("5.1.1")},Upor:function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("6Xbx"),i=function(e){function t(){var t=e.call(this,"object unsubscribed");this.name=t.name="ObjectUnsubscribedError",this.stack=t.stack,this.message=t.message}return Object(r.__extends)(t,e),t}(Error)},"V+0c":function(e,t,n){e.exports=!n("umMR")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},V7AE:function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("xIGM").a.Symbol,i="function"==typeof r&&"function"==typeof r.for?r.for("rxSubscriber"):"@@rxSubscriber"},VceJ:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},"WGJ/":function(e,t,n){var r=n("p/bR");e.exports=function(e,t){var n=[];return r(e,!1,n.push,n,t),n}},Wo2w:function(e,t,n){var r=n("VceJ");e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},WsSm:function(e,t,n){"use strict";var r=n("KGrn"),i=n("CDXM"),o=n("lfBE"),l=n("gxdV"),a=n("rMsi"),s=n("lexG"),u=n("9ScN"),c=n("P6IN"),d=n("TJLg"),p=n("3r0D")("iterator"),f=!([].keys&&"next"in[].keys()),h=function(){return this};e.exports=function(e,t,n,m,g,y,v){u(n,t,m);var b,_,w,x=function(e){if(!f&&e in O)return O[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},C=t+" Iterator",E="values"==g,S=!1,O=e.prototype,T=O[p]||O["@@iterator"]||g&&O[g],k=!f&&T||x(g),D=g?E?x("entries"):k:void 0,I="Array"==t?O.entries||T:T;if(I&&(w=d(I.call(new e)))!==Object.prototype&&w.next&&(c(w,C,!0),r||a(w,p)||l(w,p,h)),E&&T&&"values"!==T.name&&(S=!0,k=function(){return T.call(this)}),r&&!v||!f&&!S&&O[p]||l(O,p,k),s[t]=k,s[C]=h,g)if(b={values:E?k:x("values"),keys:y?k:x("keys"),entries:D},v)for(_ in b)_ in O||o(O,_,b[_]);else i(i.P+i.F*(f||S),t,b);return b}},Wy9r:function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e}},"X0O/":function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=n("TJLg"),l=r.has,a=r.get,s=r.key,u=function(e,t,n){if(l(e,t,n))return a(e,t,n);var r=o(t);return null!==r?u(e,r,n):void 0};r.exp({getMetadata:function(e,t){return u(e,i(t),arguments.length<3?void 0:s(arguments[2]))}})},X3fp:function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=function(e){var t=e.Symbol;if("function"==typeof t)return t.iterator||(t.iterator=t("iterator polyfill")),t.iterator;var n=e.Set;if(n&&"function"==typeof(new n)["@@iterator"])return"@@iterator";var r=e.Map;if(r)for(var i=Object.getOwnPropertyNames(r.prototype),o=0;o<i.length;++o){var l=i[o];if("entries"!==l&&"size"!==l&&r.prototype[l]===r.prototype.entries)return l}return"@@iterator"}(n("xIGM").a)},XRS9:function(e,t,n){"use strict";var r=n("pBmS"),i=n("xI8H").getWeak,o=n("+pQw"),l=n("JXkd"),a=n("Lcie"),s=n("p/bR"),u=n("BCYq"),c=n("rMsi"),d=n("Y5fy"),p=u(5),f=u(6),h=0,m=function(e){return e._l||(e._l=new g)},g=function(){this.a=[]},y=function(e,t){return p(e.a,function(e){return e[0]===t})};g.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var n=y(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=f(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,o){var u=e(function(e,r){a(e,u,t,"_i"),e._t=t,e._i=h++,e._l=void 0,void 0!=r&&s(r,n,e[o],e)});return r(u.prototype,{delete:function(e){if(!l(e))return!1;var n=i(e);return!0===n?m(d(this,t)).delete(e):n&&c(n,this._i)&&delete n[this._i]},has:function(e){if(!l(e))return!1;var n=i(e);return!0===n?m(d(this,t)).has(e):n&&c(n,this._i)}}),u},def:function(e,t,n){var r=i(o(t),!0);return!0===r?m(e).set(t,n):r[e._i]=n,e},ufstore:m}},Y5fy:function(e,t,n){var r=n("JXkd");e.exports=function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},YRqN:function(e,t,n){"use strict";t.b=function(e,t){return void 0===t&&(t=0),function(n){return n.lift(new l(e,t))}},n.d(t,"a",function(){return a});var r=n("6Xbx"),i=n("E9/g"),o=n("PAZ8"),l=function(){function e(e,t){void 0===t&&(t=0),this.scheduler=e,this.delay=t}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.scheduler,this.delay))},e}(),a=function(e){function t(t,n,r){void 0===r&&(r=0),e.call(this,t),this.scheduler=n,this.delay=r}return Object(r.__extends)(t,e),t.dispatch=function(e){e.notification.observe(e.destination),this.unsubscribe()},t.prototype.scheduleMessage=function(e){this.add(this.scheduler.schedule(t.dispatch,this.delay,new s(e,this.destination)))},t.prototype._next=function(e){this.scheduleMessage(o.a.createNext(e))},t.prototype._error=function(e){this.scheduleMessage(o.a.createError(e))},t.prototype._complete=function(){this.scheduleMessage(o.a.createComplete())},t}(i.a),s=function(e,t){this.notification=e,this.destination=t}},YuZA:function(e,t){function n(e){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+e+"'.")})}n.keys=function(){return[]},n.resolve=n,e.exports=n,n.id="YuZA"},ZI9W:function(e,t,n){"use strict";var r=n("3LDD"),i=n("Y5fy");e.exports=n("cpZ/")("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(i(this,"Map"),e);return t&&t.v},set:function(e,t){return r.def(i(this,"Map"),0===e?0:e,t)}},r,!0)},"a/Sk":function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},a7b8:function(e,t,n){var r=n("JXkd"),i=n("rKhO"),o=n("3r0D")("species");e.exports=function(e){var t;return i(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!i(t.prototype)||(t=void 0),r(t)&&null===(t=t[o])&&(t=void 0)),void 0===t?Array:t}},b4gG:function(e,t){var n=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},bbdN:function(e,t,n){var r,i=i||function(e){"use strict";if(!(void 0===e||"undefined"!=typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent))){var t=function(){return e.URL||e.webkitURL||e},n=e.document.createElementNS("http://www.w3.org/1999/xhtml","a"),r="download"in n,i=/constructor/i.test(e.HTMLElement)||e.safari,o=/CriOS\/[\d]+/.test(navigator.userAgent),l=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},a=function(e){setTimeout(function(){"string"==typeof e?t().revokeObjectURL(e):e.remove()},4e4)},s=function(e){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e},u=function(u,c,d){d||(u=s(u));var p,f=this,h="application/octet-stream"===u.type,m=function(){!function(e,t,n){for(var r=(t=[].concat(t)).length;r--;){var i=e["on"+t[r]];if("function"==typeof i)try{i.call(e,e)}catch(e){l(e)}}}(f,"writestart progress write writeend".split(" "))};if(f.readyState=f.INIT,r)return p=t().createObjectURL(u),void setTimeout(function(){n.href=p,n.download=c,function(e){var t=new MouseEvent("click");e.dispatchEvent(t)}(n),m(),a(p),f.readyState=f.DONE});!function(){if((o||h&&i)&&e.FileReader){var n=new FileReader;return n.onloadend=function(){var t=o?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");e.open(t,"_blank")||(e.location.href=t),t=void 0,f.readyState=f.DONE,m()},n.readAsDataURL(u),void(f.readyState=f.INIT)}p||(p=t().createObjectURL(u)),h?e.location.href=p:e.open(p,"_blank")||(e.location.href=p),f.readyState=f.DONE,m(),a(p)}()},c=u.prototype;return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(e,t,n){return t=t||e.name||"download",n||(e=s(e)),navigator.msSaveOrOpenBlob(e,t)}:(c.abort=function(){},c.readyState=c.INIT=0,c.WRITING=1,c.DONE=2,c.error=c.onwritestart=c.onprogress=c.onwrite=c.onabort=c.onerror=c.onwriteend=null,function(e,t,n){return new u(e,t||e.name||"download",n)})}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);void 0!==e&&e.exports?e.exports.saveAs=i:null!==n("MwgA")&&null!==n("f8Ud")&&(void 0===(r=function(){return i}.call(t,n,t,e))||(e.exports=r))},bywS:function(e,t,n){"use strict";function r(e){return e}var i=n("wP3s");t.a=function(e){return void 0===e&&(e=Number.POSITIVE_INFINITY),Object(i.a)(r,null,e)}},c09d:function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},cDNt:function(e,t,n){"use strict";function r(){if(null==ol)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return ol=!0}}))}finally{ol=ol||!1}return ol}function i(){if(ll)return ll;if("object"!=typeof document||!document)return ll=new Set(fl);var e=document.createElement("input");return ll=new Set(fl.filter(function(t){return e.setAttribute("type",t),e.type===t}))}function o(e,t){return void 0===t&&(t=Tl),function(e){return function(t){return t.lift(new Il(e))}}(function(){return Nl(e,t)})}function l(e,t,n){return e||new Fl(t,n)}function a(e,t,n){return e||new jl(t,n)}function s(){throw Error("Host already has a portal attached")}function u(e){return function(t){return 0===e?new Jl.a:t.lift(new ea(e))}}function c(e){return null!=e&&""+e!="false"}function d(e,t){return void 0===t&&(t=0),isNaN(parseFloat(e))||isNaN(Number(e))?t:Number(e)}function p(e){return Array.isArray(e)?e:[e]}function f(){return Error("Scroll strategy has already been attached.")}function h(e,t){return t.some(function(t){return e.bottom<t.top||e.top>t.bottom||e.right<t.left||e.left>t.right})}function m(e,t){return t.some(function(t){return e.top<t.top||e.bottom>t.bottom||e.left<t.left||e.right>t.right})}function g(e){return"string"==typeof e?e:e+"px"}function y(e,t){return e||new pa(t)}function v(e,t){return e||new fa(t)}function b(e){return function(){return e.scrollStrategies.reposition()}}function _(e,t){return void 0===t&&(t=Tl),function(n){return n.lift(new ba(e,t))}}function w(e){e.debouncedNext()}function x(e,t,n){return function(r){return r.lift(new xa(e,t,n))}}function C(e){if(!e.hasAttribute("tabindex")||void 0===e.tabIndex)return!1;var t=e.getAttribute("tabindex");return"-32768"!=t&&!(!t||isNaN(parseInt(t,10)))}function E(e){if(!C(e))return null;var t=parseInt(e.getAttribute("tabindex")||"",10);return isNaN(t)?-1:t}function S(e,t){return(e.getAttribute(t)||"").match(/\S+/g)||[]}function O(e,t){return e||new Pa(t)}function T(e,t,n){return e||new Aa(t,n)}function k(e,t,n){return e||new La(t,n)}function D(e){return function(e){function t(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=e.apply(this,t)||this;return r._disabled=!1,r}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"disabled",{get:function(){return this._disabled},set:function(e){this._disabled=c(e)},enumerable:!0,configurable:!0}),t}(e)}function I(e,t){return function(e){function n(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var i=e.apply(this,n)||this;return i.color=t,i}return Object(bl.__extends)(n,e),Object.defineProperty(n.prototype,"color",{get:function(){return this._color},set:function(e){var n=e||t;n!==this._color&&(this._color&&this._elementRef.nativeElement.classList.remove("mat-"+this._color),n&&this._elementRef.nativeElement.classList.add("mat-"+n),this._color=n)},enumerable:!0,configurable:!0}),n}(e)}function R(e){return function(e){function t(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=e.apply(this,t)||this;return r._disableRipple=!1,r}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"disableRipple",{get:function(){return this._disableRipple},set:function(e){this._disableRipple=c(e)},enumerable:!0,configurable:!0}),t}(e)}function M(e,t){for(var n=Array(e),r=0;r<e;r++)n[r]=t(r);return n}function P(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return function(t){var n=e[e.length-1];Object(Pl.a)(n)?e.pop():n=null;var r=e.length;return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return 1===e.length||2===e.length&&Object(Pl.a)(e[1])?Ds(e[0]):Object(Is.a)(1)(vl.apply(void 0,e))}(1===r?new gs.a(e[0],n):r>1?new yl.a(e,n):new Jl.a(n),t)}}function N(){throw Error("Attempting to attach dialog content after content is already attached")}function A(e){return function(){return e.scrollStrategies.block()}}function L(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](0,null,null,0))],null,null)}function F(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{_portalOutlet:0}),(e()(),al["\u0275and"](16777216,null,null,1,null,L)),al["\u0275did"](2,212992,[[1,4]],0,$l,[al.ComponentFactoryResolver,al.ViewContainerRef],{portal:[0,"portal"]},null)],function(e,t){e(t,2,0,"")},null)}function j(e){return function(t){var n=new Ys(e),r=t.lift(n);return n.caught=r}}function V(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}function z(e){return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer}function B(e){return"undefined"!=typeof Blob&&e instanceof Blob}function H(e){return"undefined"!=typeof FormData&&e instanceof FormData}function W(e,t){return{body:t,headers:e.headers,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}function q(e,t){return void 0===t&&(t=[]),t?t.reduceRight(function(e,t){return new yu(e,t)},e):e}function U(e){return Error('Unable to find icon with the name "'+e+'"')}function G(e){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+e+'".')}function K(e,t,n){return e||new Nu(t,n)}function $(e){return e.cloneNode(!0)}function Z(e,t){return e+":"+t}function Q(e){return Error("A hint was already declared for 'align=\""+e+"\"'.")}function Y(e){return Error("MatDatepicker: No provider found for "+e+". You must import one of the following modules at your application root: MatNativeDateModule, MatMomentDateModule, or provide a custom implementation.")}function X(e){return function(){return e.scrollStrategies.reposition()}}function J(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),al["\u0275ncd"](null,0),(e()(),al["\u0275eld"](2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),al["\u0275did"](3,671744,null,0,ss,[al.ElementRef,al.NgZone,pl,[2,as]],{trigger:[0,"trigger"],centered:[1,"centered"],disabled:[2,"disabled"]},null),(e()(),al["\u0275eld"](4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(e,t){var n=t.component;e(t,3,0,n._getHostElement(),n._isIconButton,n._isRippleDisabled())},function(e,t){var n=t.component;e(t,2,0,n._isRoundButton||n._isIconButton,al["\u0275nov"](t,3).unbounded)})}function ee(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),al["\u0275ncd"](null,0),(e()(),al["\u0275eld"](2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),al["\u0275did"](3,671744,null,0,ss,[al.ElementRef,al.NgZone,pl,[2,as]],{trigger:[0,"trigger"],centered:[1,"centered"],disabled:[2,"disabled"]},null),(e()(),al["\u0275eld"](4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(e,t){var n=t.component;e(t,3,0,n._getHostElement(),n._isIconButton,n._isRippleDisabled())},function(e,t){var n=t.component;e(t,2,0,n._isRoundButton||n._isIconButton,al["\u0275nov"](t,3).unbounded)})}function te(e){return al["\u0275vid"](2,[al["\u0275ncd"](null,0)],null,null)}function ne(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-month-view",[],null,[[null,"selectedChange"],[null,"_userSelection"]],function(e,t,n){var r=!0,i=e.component;return"selectedChange"===t&&(r=!1!==i._dateSelected(n)&&r),"_userSelection"===t&&(r=!1!==i._userSelected()&&r),r},pe,uc)),al["\u0275did"](1,1097728,[[1,4]],0,Qu,[[2,Wa],[2,qa],al.ChangeDetectorRef],{activeDate:[0,"activeDate"],selected:[1,"selected"],dateFilter:[2,"dateFilter"]},{selectedChange:"selectedChange",_userSelection:"_userSelection"})],function(e,t){var n=t.component;e(t,1,0,n._activeDate,n.selected,n._dateFilterForViews)},null)}function re(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-year-view",[],null,[[null,"selectedChange"]],function(e,t,n){var r=!0;return"selectedChange"===t&&(r=!1!==e.component._monthSelected(n)&&r),r},fe,cc)),al["\u0275did"](1,1097728,[[2,4]],0,Yu,[[2,Wa],[2,qa],al.ChangeDetectorRef],{activeDate:[0,"activeDate"],selected:[1,"selected"],dateFilter:[2,"dateFilter"]},{selectedChange:"selectedChange"})],function(e,t){var n=t.component;e(t,1,0,n._activeDate,n.selected,n._dateFilterForViews)},null)}function ie(e){return al["\u0275vid"](2,[al["\u0275qud"](671088640,1,{monthView:0}),al["\u0275qud"](671088640,2,{yearView:0}),(e()(),al["\u0275eld"](2,0,null,null,13,"div",[["class","mat-calendar-header"]],null,null,null,null,null)),(e()(),al["\u0275eld"](3,0,null,null,12,"div",[["class","mat-calendar-controls"]],null,null,null,null,null)),(e()(),al["\u0275eld"](4,0,null,null,4,"button",[["class","mat-calendar-period-button mat-button"],["mat-button",""]],[[1,"aria-label",0],[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._currentPeriodClicked()&&r),r},J,nc)),al["\u0275did"](5,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](6,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](7,0,["",""])),(e()(),al["\u0275eld"](8,0,null,0,0,"div",[["class","mat-calendar-arrow"]],[[2,"mat-calendar-invert",null]],null,null,null,null)),(e()(),al["\u0275eld"](9,0,null,null,0,"div",[["class","mat-calendar-spacer"]],null,null,null,null,null)),(e()(),al["\u0275eld"](10,0,null,null,2,"button",[["class","mat-calendar-previous-button mat-icon-button"],["mat-icon-button",""]],[[1,"aria-label",0],[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._previousClicked()&&r),r},J,nc)),al["\u0275did"](11,180224,null,0,$s,[al.ElementRef,pl,La],{disabled:[0,"disabled"]},null),al["\u0275did"](12,16384,null,0,Ks,[],null,null),(e()(),al["\u0275eld"](13,0,null,null,2,"button",[["class","mat-calendar-next-button mat-icon-button"],["mat-icon-button",""]],[[1,"aria-label",0],[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._nextClicked()&&r),r},J,nc)),al["\u0275did"](14,180224,null,0,$s,[al.ElementRef,pl,La],{disabled:[0,"disabled"]},null),al["\u0275did"](15,16384,null,0,Ks,[],null,null),(e()(),al["\u0275eld"](16,0,null,null,6,"div",[["cdkMonitorSubtreeFocus",""],["class","mat-calendar-content"]],null,[[null,"keydown"]],function(e,t,n){var r=!0;return"keydown"===t&&(r=!1!==e.component._handleCalendarBodyKeydown(n)&&r),r},null,null)),al["\u0275did"](17,16384,null,0,cl.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),al["\u0275did"](18,147456,null,0,Fa,[al.ElementRef,La],null,null),(e()(),al["\u0275and"](16777216,null,null,1,null,ne)),al["\u0275did"](20,278528,null,0,cl.NgSwitchCase,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,re)),al["\u0275did"](22,16384,null,0,cl.NgSwitchDefault,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],null,null)],function(e,t){var n=t.component;e(t,11,0,!n._previousEnabled()),e(t,14,0,!n._nextEnabled()),e(t,17,0,n._monthView),e(t,20,0,!0)},function(e,t){var n=t.component;e(t,4,0,n._periodButtonLabel,al["\u0275nov"](t,5).disabled||null),e(t,7,0,n._periodButtonText),e(t,8,0,!n._monthView),e(t,10,0,n._prevButtonLabel,al["\u0275nov"](t,11).disabled||null),e(t,13,0,n._nextButtonLabel,al["\u0275nov"](t,14).disabled||null)})}function oe(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"tr",[["aria-hidden","true"]],null,null,null,null,null)),(e()(),al["\u0275eld"](1,0,null,null,1,"td",[["class","mat-calendar-body-label"]],[[1,"colspan",0],[4,"paddingTop","%"],[4,"paddingBottom","%"]],null,null,null,null)),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){var n=t.component;e(t,1,0,n.numCols,50*n.cellAspectRatio/n.numCols,50*n.cellAspectRatio/n.numCols),e(t,2,0,n.label)})}function le(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"td",[["aria-hidden","true"],["class","mat-calendar-body-label"]],[[1,"colspan",0],[4,"paddingTop","%"],[4,"paddingBottom","%"]],null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){var n=t.component;e(t,0,0,n._firstRowOffset,50*n.cellAspectRatio/n.numCols,50*n.cellAspectRatio/n.numCols),e(t,1,0,n._firstRowOffset>=n.labelMinRequiredCells?n.label:"")})}function ae(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"td",[["class","mat-calendar-body-cell"],["role","gridcell"]],[[8,"tabIndex",0],[2,"mat-calendar-body-disabled",null],[2,"mat-calendar-body-active",null],[1,"aria-label",0],[1,"aria-disabled",0],[4,"width","%"],[4,"paddingTop","%"],[4,"paddingBottom","%"]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._cellClicked(e.context.$implicit)&&r),r},null,null)),(e()(),al["\u0275eld"](1,0,null,null,1,"div",[["class","mat-calendar-body-cell-content"]],[[2,"mat-calendar-body-selected",null],[2,"mat-calendar-body-today",null]],null,null,null,null)),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){var n=t.component;e(t,0,0,n._isActiveCell(t.parent.context.index,t.context.index)?0:-1,!t.context.$implicit.enabled,n._isActiveCell(t.parent.context.index,t.context.index),t.context.$implicit.ariaLabel,!t.context.$implicit.enabled||null,100/n.numCols,50*n.cellAspectRatio/n.numCols,50*n.cellAspectRatio/n.numCols),e(t,1,0,n.selectedValue===t.context.$implicit.value,n.todayValue===t.context.$implicit.value),e(t,2,0,t.context.$implicit.displayValue)})}function se(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"tr",[["role","row"]],null,null,null,null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,le)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,ae)),al["\u0275did"](4,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],function(e,t){e(t,2,0,0===t.context.index&&t.component._firstRowOffset),e(t,4,0,t.context.$implicit)},null)}function ue(e){return al["\u0275vid"](2,[(e()(),al["\u0275and"](16777216,null,null,1,null,oe)),al["\u0275did"](1,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,se)),al["\u0275did"](3,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],function(e,t){var n=t.component;e(t,1,0,n._firstRowOffset<n.labelMinRequiredCells),e(t,3,0,n.rows)},null)}function ce(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_calendar:0}),(e()(),al["\u0275eld"](1,0,null,null,3,"mat-calendar",[["cdkTrapFocus",""],["class","mat-calendar"]],[[8,"id",0]],[[null,"selectedChange"],[null,"_userSelection"]],function(e,t,n){var r=!0,i=e.component;return"selectedChange"===t&&(r=!1!==i.datepicker._select(n)&&r),"_userSelection"===t&&(r=!1!==i.datepicker.close()&&r),r},ie,oc)),al["\u0275did"](2,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275did"](3,1196032,null,0,Ta,[al.ElementRef,Oa,cl.DOCUMENT],{enabled:[0,"enabled"]},null),al["\u0275did"](4,1753088,[[1,4]],0,Xu,[al.ElementRef,Ku,al.NgZone,[2,Wa],[2,qa],al.ChangeDetectorRef],{startAt:[0,"startAt"],startView:[1,"startView"],selected:[2,"selected"],minDate:[3,"minDate"],maxDate:[4,"maxDate"],dateFilter:[5,"dateFilter"]},{selectedChange:"selectedChange",_userSelection:"_userSelection"})],function(e,t){var n=t.component;e(t,2,0,n.datepicker.panelClass),e(t,3,0,""),e(t,4,0,n.datepicker.startAt,n.datepicker.startView,n.datepicker._selected,n.datepicker._minDate,n.datepicker._maxDate,n.datepicker._dateFilter)},function(e,t){e(t,1,0,t.component.datepicker.id)})}function de(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"th",[],[[1,"aria-label",0]],null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,0,0,t.context.$implicit.long),e(t,1,0,t.context.$implicit.narrow)})}function pe(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,null,null,8,"table",[["class","mat-calendar-table"]],null,null,null,null,null)),(e()(),al["\u0275eld"](1,0,null,null,5,"thead",[["class","mat-calendar-table-header"]],null,null,null,null,null)),(e()(),al["\u0275eld"](2,0,null,null,2,"tr",[],null,null,null,null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,de)),al["\u0275did"](4,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275eld"](5,0,null,null,1,"tr",[],null,null,null,null,null)),(e()(),al["\u0275eld"](6,0,null,null,0,"th",[["aria-hidden","true"],["class","mat-calendar-table-header-divider"],["colspan","7"]],null,null,null,null,null)),(e()(),al["\u0275eld"](7,0,null,null,1,"tbody",[["class","mat-calendar-body"],["mat-calendar-body",""],["role","grid"]],null,[[null,"selectedValueChange"]],function(e,t,n){var r=!0;return"selectedValueChange"===t&&(r=!1!==e.component._dateSelected(n)&&r),r},ue,lc)),al["\u0275did"](8,49152,null,0,Zu,[],{label:[0,"label"],rows:[1,"rows"],todayValue:[2,"todayValue"],selectedValue:[3,"selectedValue"],labelMinRequiredCells:[4,"labelMinRequiredCells"],activeCell:[5,"activeCell"]},{selectedValueChange:"selectedValueChange"})],function(e,t){var n=t.component;e(t,4,0,n._weekdays),e(t,8,0,n._monthLabel,n._weeks,n._todayDate,n._selectedDate,3,n._dateAdapter.getDate(n.activeDate)-1)},null)}function fe(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,null,null,5,"table",[["class","mat-calendar-table"]],null,null,null,null,null)),(e()(),al["\u0275eld"](1,0,null,null,2,"thead",[["class","mat-calendar-table-header"]],null,null,null,null,null)),(e()(),al["\u0275eld"](2,0,null,null,1,"tr",[],null,null,null,null,null)),(e()(),al["\u0275eld"](3,0,null,null,0,"th",[["class","mat-calendar-table-header-divider"],["colspan","4"]],null,null,null,null,null)),(e()(),al["\u0275eld"](4,0,null,null,1,"tbody",[["allowDisabledSelection","true"],["class","mat-calendar-body"],["mat-calendar-body",""],["role","grid"]],null,[[null,"selectedValueChange"]],function(e,t,n){var r=!0;return"selectedValueChange"===t&&(r=!1!==e.component._monthSelected(n)&&r),r},ue,lc)),al["\u0275did"](5,49152,null,0,Zu,[],{label:[0,"label"],rows:[1,"rows"],todayValue:[2,"todayValue"],selectedValue:[3,"selectedValue"],labelMinRequiredCells:[4,"labelMinRequiredCells"],numCols:[5,"numCols"],allowDisabledSelection:[6,"allowDisabledSelection"],activeCell:[7,"activeCell"],cellAspectRatio:[8,"cellAspectRatio"]},{selectedValueChange:"selectedValueChange"})],function(e,t){var n=t.component;e(t,5,0,n._yearLabel,n._months,n._todayMonth,n._selectedMonth,2,4,"true",n._dateAdapter.getMonth(n.activeDate),4/7)},null)}function he(e){return function(){return e.scrollStrategies.reposition({scrollThrottle:dc})}}function me(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(e,t,n){var r=!0,i=e.component;return"@state.start"===t&&(r=!1!==i._animationStart()&&r),"@state.done"===t&&(r=!1!==i._animationDone(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(e()(),al["\u0275ted"](2,null,["",""]))],function(e,t){e(t,1,0,"mat-tooltip",t.component.tooltipClass)},function(e,t){var n=t.component;e(t,0,0,n._transformOrigin,n._visibility),e(t,2,0,n.message)})}function ge(e){return{matches:"all"===e||""===e,media:e,addListener:function(){},removeListener:function(){}}}function ye(e){return Object(bl.__assign)({},new Tc,e)}function ve(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](0,null,null,0))],null,null)}function be(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_portalOutlet:0}),(e()(),al["\u0275and"](16777216,null,null,1,null,ve)),al["\u0275did"](2,212992,[[1,4]],0,$l,[al.ComponentFactoryResolver,al.ViewContainerRef],{portal:[0,"portal"]},null)],function(e,t){e(t,2,0,"")},null)}function _e(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"button",[["class","mat-simple-snackbar-action"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.action()&&r),r},null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.data.action)})}function we(e){return al["\u0275vid"](2,[(e()(),al["\u0275ted"](0,null,[""," "])),(e()(),al["\u0275and"](16777216,null,null,1,null,_e)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null)],function(e,t){e(t,2,0,t.component.hasAction)},function(e,t){e(t,0,0,t.component.data.message)})}function xe(e){return e||new Vc}function Ce(e){return Error('Could not find column with id "'+e+'".')}function Ee(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_rowPlaceholder:0}),al["\u0275qud"](402653184,2,{_headerRowPlaceholder:0}),(e()(),al["\u0275eld"](2,16777216,null,null,1,null,null,null,null,null,null,null)),al["\u0275did"](3,16384,[[2,4]],0,Zc,[al.ViewContainerRef],null,null),(e()(),al["\u0275eld"](4,16777216,null,null,1,null,null,null,null,null,null,null)),al["\u0275did"](5,16384,[[1,4]],0,$c,[al.ViewContainerRef],null,null)],null,null)}function Se(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,16777216,null,null,1,null,null,null,null,null,null,null)),al["\u0275did"](1,16384,null,0,qc,[al.ViewContainerRef],null,null)],null,null)}function Oe(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,16777216,null,null,1,null,null,null,null,null,null,null)),al["\u0275did"](1,16384,null,0,qc,[al.ViewContainerRef],null,null)],null,null)}function Te(e){return al["\u0275vid"](2,[al["\u0275ncd"](null,0),al["\u0275ncd"](null,1)],null,null)}function ke(e){return al["\u0275vid"](2,[al["\u0275ncd"](null,0),al["\u0275ncd"](null,1)],null,null)}function De(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{hostMetadata:0}),(e()(),al["\u0275eld"](1,0,[[1,0],["hostMetadata",1]],null,0,"textarea",[["class","textarea-metadata"]],null,null,null,null,null))],null,null)}function Ie(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,45,"mat-card",[["class","input-card mat-card"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},Te,gd)),al["\u0275did"](2,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](4,0,null,0,12,"mat-toolbar",[["class","input-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](5,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,1,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](8,0,null,0,2,"mat-icon",[["class","toolbar-icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](9,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](12,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["INPUT: SQL++"])),(e()(),al["\u0275ted"](-1,0,["\t\n            "])),(e()(),al["\u0275eld"](15,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](18,0,null,0,13,"mat-card-content",[["class","content-area mat-card-content"]],null,null,null,null,null)),al["\u0275did"](19,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](21,0,null,null,9,"div",[["class","codemirror-container"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n           "])),(e()(),al["\u0275eld"](23,0,null,null,6,"codemirror-metadata",[["class","code"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"ngModelChange"]],function(e,t,n){var r=!0;return"ngModelChange"===t&&(r=!1!==(e.component.queryMetadataString=n)&&r),r},De,xd)),al["\u0275did"](24,4374528,null,0,wd,[],{config:[0,"config"]},null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[wd]),al["\u0275did"](26,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](28,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["  \n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](33,0,null,0,12,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](34,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](36,0,null,null,3,"button",[["class","query-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.executeQuery()&&r),r},J,nc)),al["\u0275did"](37,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](38,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["RUN"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](41,0,null,null,1,"span",[["class","error-message"]],null,null,null,null,null)),(e()(),al["\u0275ted"](42,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](44,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,0,["\n"]))],function(e,t){var n=t.component;e(t,5,0,"primary"),e(t,9,0),e(t,24,0,n.codemirrorMetadataConfig),e(t,26,0,n.queryMetadataString)},function(e,t){var n=t.component;e(t,4,0,al["\u0275nov"](t,5)._toolbarRows.length,!al["\u0275nov"](t,5)._toolbarRows.length),e(t,23,0,al["\u0275nov"](t,28).ngClassUntouched,al["\u0275nov"](t,28).ngClassTouched,al["\u0275nov"](t,28).ngClassPristine,al["\u0275nov"](t,28).ngClassDirty,al["\u0275nov"](t,28).ngClassValid,al["\u0275nov"](t,28).ngClassInvalid,al["\u0275nov"](t,28).ngClassPending),e(t,33,0,"end"===al["\u0275nov"](t,34).align),e(t,36,0,al["\u0275nov"](t,37).disabled||null),e(t,42,0,n.errorMessage)})}function Re(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"div",[["class","mat-input-prefix mat-form-field-prefix"]],null,null,null,null,null)),al["\u0275ncd"](null,0)],null,null)}function Me(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,null,null,null,null,null,null,null)),al["\u0275ncd"](null,2),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.component._control.placeholder)})}function Pe(e){return al["\u0275vid"](0,[al["\u0275ncd"](null,3),(e()(),al["\u0275and"](0,null,null,0))],null,null)}function Ne(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["aria-hidden","true"],["class","mat-placeholder-required mat-form-field-required-marker"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\xa0*"]))],null,null)}function Ae(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[[4,0],["label",1]],null,7,"label",[["class","mat-form-field-label mat-input-placeholder mat-form-field-placeholder"]],[[1,"for",0],[1,"aria-owns",0],[2,"mat-empty",null],[2,"mat-form-field-empty",null],[2,"mat-accent",null],[2,"mat-warn",null]],null,null,null,null)),al["\u0275did"](1,16384,null,0,cl.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Me)),al["\u0275did"](3,278528,null,0,cl.NgSwitchCase,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Pe)),al["\u0275did"](5,278528,null,0,cl.NgSwitchCase,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Ne)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null)],function(e,t){var n=t.component;e(t,1,0,n._hasLabel()),e(t,3,0,!1),e(t,5,0,!0),e(t,7,0,!n.hideRequiredMarker&&n._control.required)},function(e,t){var n=t.component;e(t,0,0,n._control.id,n._control.id,n._control.empty&&!n._shouldAlwaysFloat,n._control.empty&&!n._shouldAlwaysFloat,"accent"==n.color,"warn"==n.color)})}function Le(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"div",[["class","mat-input-suffix mat-form-field-suffix"]],null,null,null,null,null)),al["\u0275ncd"](null,4)],null,null)}function Fe(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"div",[],[[24,"@transitionMessages",0]],null,null,null,null)),al["\u0275ncd"](null,5)],null,function(e,t){e(t,0,0,t.component._subscriptAnimationState)})}function je(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"div",[["class","mat-hint"]],[[8,"id",0]],null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){var n=t.component;e(t,0,0,n._hintLabelId),e(t,1,0,n.hintLabel)})}function Ve(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,5,"div",[["class","mat-input-hint-wrapper mat-form-field-hint-wrapper"]],[[24,"@transitionMessages",0]],null,null,null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,je)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275ncd"](null,6),(e()(),al["\u0275eld"](4,0,null,null,0,"div",[["class","mat-input-hint-spacer mat-form-field-hint-spacer"]],null,null,null,null,null)),al["\u0275ncd"](null,7)],function(e,t){e(t,2,0,t.component.hintLabel)},function(e,t){e(t,0,0,t.component._subscriptAnimationState)})}function ze(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{underlineRef:0}),al["\u0275qud"](402653184,2,{_connectionContainerRef:0}),al["\u0275qud"](402653184,3,{_inputContainerRef:0}),al["\u0275qud"](671088640,4,{_label:0}),(e()(),al["\u0275eld"](4,0,null,null,18,"div",[["class","mat-input-wrapper mat-form-field-wrapper"]],null,null,null,null,null)),(e()(),al["\u0275eld"](5,0,[[2,0],["connectionContainer",1]],null,9,"div",[["class","mat-input-flex mat-form-field-flex"]],null,[[null,"click"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==(i._control.onContainerClick&&i._control.onContainerClick(n))&&r),r},null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,Re)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275eld"](8,0,[[3,0],["inputContainer",1]],null,4,"div",[["class","mat-input-infix mat-form-field-infix"]],null,null,null,null,null)),al["\u0275ncd"](null,1),(e()(),al["\u0275eld"](10,0,null,null,2,"span",[["class","mat-form-field-label-wrapper mat-input-placeholder-wrapper mat-form-field-placeholder-wrapper"]],null,null,null,null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,Ae)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Le)),al["\u0275did"](14,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275eld"](15,0,[[1,0],["underline",1]],null,1,"div",[["class","mat-input-underline mat-form-field-underline"]],null,null,null,null,null)),(e()(),al["\u0275eld"](16,0,null,null,0,"span",[["class","mat-input-ripple mat-form-field-ripple"]],[[2,"mat-accent",null],[2,"mat-warn",null]],null,null,null,null)),(e()(),al["\u0275eld"](17,0,null,null,5,"div",[["class","mat-input-subscript-wrapper mat-form-field-subscript-wrapper"]],null,null,null,null,null)),al["\u0275did"](18,16384,null,0,cl.NgSwitch,[],{ngSwitch:[0,"ngSwitch"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Fe)),al["\u0275did"](20,278528,null,0,cl.NgSwitchCase,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,Ve)),al["\u0275did"](22,278528,null,0,cl.NgSwitchCase,[al.ViewContainerRef,al.TemplateRef,cl.NgSwitch],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(e,t){var n=t.component;e(t,7,0,n._prefixChildren.length),e(t,12,0,n._hasFloatingLabel()),e(t,14,0,n._suffixChildren.length),e(t,18,0,n._getDisplayedMessages()),e(t,20,0,"error"),e(t,22,0,"hint")},function(e,t){var n=t.component;e(t,16,0,"accent"==n.color,"warn"==n.color)})}function Be(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-name-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataverse Name"]))],null,null)}function He(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataverse-name-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.context.$implicit.DataverseName)})}function We(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-dataformat-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Data Format"]))],null,null)}function qe(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataverse-dataformat-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.context.$implicit.DataFormat)})}function Ue(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-pendingop-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Pending Ops"]))],null,null)}function Ge(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataverse-pendingop-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.context.$implicit.PendingOp)})}function Ke(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-timestamp-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Timestamp"]))],null,null)}function $e(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataverse-timestamp-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.context.$implicit.Timestamp)})}function Ze(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-header-row",[["class","mat-header-row"],["role","row"]],null,null,null,Se,cd)),al["\u0275did"](1,49152,null,0,ld,[],null,null)],null,null)}function Qe(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"mat-row",[["class","mat-row"],["role","row"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.highlight(e.context.$implicit)&&r),r},Oe,dd)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{highlight:0}),al["\u0275did"](3,49152,null,0,ad,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,1,0,e(t,2,0,t.component.selectedRowIndex==t.context.$implicit.id))},null)}function Ye(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,79,"mat-table",[["class","dataverses-table mat-table"]],null,null,null,Ee,ud)),al["\u0275did"](1,3391488,[["table",4]],3,Xc,[al.IterableDiffers,al.ChangeDetectorRef,al.ElementRef,[8,null]],{dataSource:[0,"dataSource"]},null),al["\u0275qud"](603979776,3,{_columnDefs:1}),al["\u0275qud"](335544320,4,{_headerDef:0}),al["\u0275qud"](603979776,5,{_rowDefs:1}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](7,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](8,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,6,{cell:0}),al["\u0275qud"](335544320,7,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Be)),al["\u0275did"](14,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[7,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,He)),al["\u0275did"](18,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[6,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](23,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](24,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,8,{cell:0}),al["\u0275qud"](335544320,9,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,We)),al["\u0275did"](30,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[9,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,qe)),al["\u0275did"](34,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[8,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](39,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](40,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,10,{cell:0}),al["\u0275qud"](335544320,11,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Ue)),al["\u0275did"](46,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[11,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Ge)),al["\u0275did"](50,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[10,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](55,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](56,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,12,{cell:0}),al["\u0275qud"](335544320,13,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Ke)),al["\u0275did"](62,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[13,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,$e)),al["\u0275did"](66,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[12,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,Ze)),al["\u0275did"](71,540672,null,0,id,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](72,3),al["\u0275prd"](2048,[[4,4]],Hc,null,[id]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,Qe)),al["\u0275did"](76,540672,null,0,od,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](77,3),al["\u0275prd"](2048,[[5,4]],Wc,null,[od]),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){e(t,1,0,t.component.dataSource),e(t,8,0,"DataverseName"),e(t,24,0,"DataFormat"),e(t,40,0,"PendingOp"),e(t,56,0,"Timestamp"),e(t,71,0,e(t,72,0,"DataverseName","DataFormat","Timestamp")),e(t,76,0,e(t,77,0,"DataverseName","DataFormat","Timestamp"))},null)}function Xe(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{inputQuery:0}),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](2,0,null,null,86,"div",[["class","container"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](4,0,null,null,54,"div",[["class","master"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](6,0,null,null,48,"mat-card",[["class","dataverses-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](7,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](9,0,null,0,12,"mat-toolbar",[["class","dataverses-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](10,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,2,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](13,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](14,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](17,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATAVERSES - METADATA"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](20,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](23,0,null,0,6,"mat-card-content",[["class","dataverses-content mat-card-content"]],null,null,null,null,null)),al["\u0275did"](24,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,2,null,Ye)),al["\u0275did"](27,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](31,0,null,0,22,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](32,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](34,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.openCreateDataverseDialog()&&r),r},J,nc)),al["\u0275did"](35,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](36,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CREATE"])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](39,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.openDropDataverseDialog()&&r),r},J,nc)),al["\u0275did"](40,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](41,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](44,0,null,null,1,"span",[["class","error-message"]],null,null,null,null,null)),(e()(),al["\u0275ted"](45,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](47,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](49,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.getDataverse()&&r),r},J,nc)),al["\u0275did"](50,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](51,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["REFRESH"])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](56,0,null,null,1,"awc-query-metadata",[["class","query"]],null,null,null,Ie,Xp)),al["\u0275did"](57,49152,[[1,4],["querymetadata",4]],0,Qp,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["  \n  "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](60,0,null,null,27,"div",[["class","detail"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](62,0,null,null,24,"mat-card",[["class","dataverses-details-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](63,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](65,0,null,0,12,"mat-toolbar",[["class","dataverses-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](66,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,14,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](69,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](70,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](73,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATAVERSE - METADATA - DETAILS"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](76,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](79,0,null,0,6,"mat-card-content",[["class","dataverses-content output mat-card-content"]],null,null,null,null,null)),al["\u0275did"](80,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](82,0,null,null,2,"span",[],null,null,null,null,null)),(e()(),al["\u0275eld"](83,0,null,null,1,"pre",[],null,null,null,null,null)),(e()(),al["\u0275ted"](84,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,10,0,"primary"),e(t,14,0),e(t,27,0,al["\u0275unv"](t,27,0,al["\u0275nov"](t,28).transform(n.loaded$))),e(t,66,0,"primary"),e(t,70,0)},function(e,t){var n=t.component;e(t,9,0,al["\u0275nov"](t,10)._toolbarRows.length,!al["\u0275nov"](t,10)._toolbarRows.length),e(t,31,0,"end"===al["\u0275nov"](t,32).align),e(t,34,0,al["\u0275nov"](t,35).disabled||null),e(t,39,0,al["\u0275nov"](t,40).disabled||null),e(t,45,0,n.errorMessage),e(t,49,0,al["\u0275nov"](t,50).disabled||null),e(t,65,0,al["\u0275nov"](t,66)._toolbarRows.length,!al["\u0275nov"](t,66)._toolbarRows.length),e(t,84,0,n.output)})}function Je(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,32,"div",[["class","dataverse-dialog"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,2,"p",[["class","mat-dialog-title"],["mat-dialog-title",""]],[[8,"id",0]],null,null,null,null)),al["\u0275did"](4,81920,null,0,zs,[[2,Ms]],null,null),(e()(),al["\u0275ted"](-1,null,["CREATE DATAVERSE"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),al["\u0275did"](8,16384,null,0,Bs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](10,0,null,null,1,"p",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["GIVE A NAME TO THE NEW DATAVERSE"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](14,0,null,null,18,"mat-form-field",[["class","mat-input-container mat-form-field"]],[[2,"mat-input-invalid",null],[2,"mat-form-field-invalid",null],[2,"mat-form-field-can-float",null],[2,"mat-form-field-should-float",null],[2,"mat-form-field-hide-placeholder",null],[2,"mat-form-field-disabled",null],[2,"mat-focused",null],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,ze,lf)),al["\u0275did"](15,7389184,null,7,zu,[al.ElementRef,al.ChangeDetectorRef,[2,ps]],null,null),al["\u0275qud"](335544320,1,{_control:0}),al["\u0275qud"](335544320,2,{_placeholderChild:0}),al["\u0275qud"](335544320,3,{_labelChild:0}),al["\u0275qud"](603979776,4,{_errorChildren:1}),al["\u0275qud"](603979776,5,{_hintChildren:1}),al["\u0275qud"](603979776,6,{_prefixChildren:1}),al["\u0275qud"](603979776,7,{_suffixChildren:1}),(e()(),al["\u0275ted"](-1,1,["\n        "])),(e()(),al["\u0275eld"](24,0,null,1,7,"input",[["class","mat-input-element mat-form-field-autofill-control"],["matInput",""],["tabindex","0"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,25)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionEnd(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!0)&&r),"input"===t&&(r=!1!==al["\u0275nov"](e,30)._onInput()&&r),"ngModelChange"===t&&(r=!1!==(i.data.dataverseName=n)&&r),r},null,null)),al["\u0275did"](25,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](27,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](29,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),al["\u0275did"](30,933888,null,0,Uu,[al.ElementRef,pl,[2,Fu.NgControl],[2,Fu.NgForm],[2,Fu.FormGroupDirective],es,[8,null]],null,null),al["\u0275prd"](2048,[[1,4]],ju,null,[Uu]),(e()(),al["\u0275ted"](-1,1,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](35,0,null,null,13,"div",[["class","mat-dialog-actions"],["mat-dialog-actions",""]],null,null,null,null,null)),al["\u0275did"](36,16384,null,0,Hs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](38,0,null,null,4,"button",[["class","mat-button"],["mat-button",""],["tabindex","1"],["type","button"]],[[8,"disabled",0],[1,"aria-label",0]],[[null,"click"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==al["\u0275nov"](e,41).dialogRef.close(al["\u0275nov"](e,41).dialogResult)&&r),"click"===t&&(r=!1!==i.onClick()&&r),r},J,nc)),al["\u0275did"](39,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](40,16384,null,0,Gs,[],null,null),al["\u0275did"](41,540672,null,0,Vs,[Ns],{dialogResult:[0,"dialogResult"]},null),(e()(),al["\u0275ted"](-1,0,["CREATE"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](44,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","2"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onNoClick()&&r),r},J,nc)),al["\u0275did"](45,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](46,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CANCEL"])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n\n"]))],function(e,t){var n=t.component;e(t,4,0),e(t,27,0,n.data.dataverseName),e(t,30,0),e(t,41,0,n.data.dataverseName)},function(e,t){e(t,3,0,al["\u0275nov"](t,4).id),e(t,14,1,[al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._canLabelFloat,al["\u0275nov"](t,15)._shouldLabelFloat(),al["\u0275nov"](t,15)._hideControlPlaceholder(),al["\u0275nov"](t,15)._control.disabled,al["\u0275nov"](t,15)._control.focused,"primary"==al["\u0275nov"](t,15).color,"accent"==al["\u0275nov"](t,15).color,"warn"==al["\u0275nov"](t,15).color,al["\u0275nov"](t,15)._shouldForward("untouched"),al["\u0275nov"](t,15)._shouldForward("touched"),al["\u0275nov"](t,15)._shouldForward("pristine"),al["\u0275nov"](t,15)._shouldForward("dirty"),al["\u0275nov"](t,15)._shouldForward("valid"),al["\u0275nov"](t,15)._shouldForward("invalid"),al["\u0275nov"](t,15)._shouldForward("pending")]),e(t,24,1,[al["\u0275nov"](t,29).ngClassUntouched,al["\u0275nov"](t,29).ngClassTouched,al["\u0275nov"](t,29).ngClassPristine,al["\u0275nov"](t,29).ngClassDirty,al["\u0275nov"](t,29).ngClassValid,al["\u0275nov"](t,29).ngClassInvalid,al["\u0275nov"](t,29).ngClassPending,al["\u0275nov"](t,30)._isServer,al["\u0275nov"](t,30).id,al["\u0275nov"](t,30).placeholder,al["\u0275nov"](t,30).disabled,al["\u0275nov"](t,30).required,al["\u0275nov"](t,30).readonly,al["\u0275nov"](t,30)._ariaDescribedby||null,al["\u0275nov"](t,30).errorState,al["\u0275nov"](t,30).required.toString()]),e(t,38,0,al["\u0275nov"](t,39).disabled||null,al["\u0275nov"](t,41).ariaLabel),e(t,44,0,al["\u0275nov"](t,45).disabled||null)})}function et(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,46,"div",[["class","dataverse-dialog"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,2,"p",[["class","mat-dialog-title"],["mat-dialog-title",""]],[[8,"id",0]],null,null,null,null)),al["\u0275did"](4,81920,null,0,zs,[[2,Ms]],null,null),(e()(),al["\u0275ted"](-1,null,["DROP DATAVERSE"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),al["\u0275did"](8,16384,null,0,Bs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](10,0,null,null,1,"p",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["PLEASE GIVE THE NAME OF THE DATAVERSE TO DROP"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](14,0,null,null,18,"mat-form-field",[["class","mat-input-container mat-form-field"]],[[2,"mat-input-invalid",null],[2,"mat-form-field-invalid",null],[2,"mat-form-field-can-float",null],[2,"mat-form-field-should-float",null],[2,"mat-form-field-hide-placeholder",null],[2,"mat-form-field-disabled",null],[2,"mat-focused",null],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,ze,lf)),al["\u0275did"](15,7389184,null,7,zu,[al.ElementRef,al.ChangeDetectorRef,[2,ps]],null,null),al["\u0275qud"](335544320,1,{_control:0}),al["\u0275qud"](335544320,2,{_placeholderChild:0}),al["\u0275qud"](335544320,3,{_labelChild:0}),al["\u0275qud"](603979776,4,{_errorChildren:1}),al["\u0275qud"](603979776,5,{_hintChildren:1}),al["\u0275qud"](603979776,6,{_prefixChildren:1}),al["\u0275qud"](603979776,7,{_suffixChildren:1}),(e()(),al["\u0275ted"](-1,1,["\n            "])),(e()(),al["\u0275eld"](24,0,null,1,7,"input",[["class","mat-input-element mat-form-field-autofill-control"],["matInput",""],["tabindex","0"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,25)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionEnd(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!0)&&r),"input"===t&&(r=!1!==al["\u0275nov"](e,30)._onInput()&&r),"ngModelChange"===t&&(r=!1!==(i.data.dataverseName=n)&&r),r},null,null)),al["\u0275did"](25,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](27,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](29,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),al["\u0275did"](30,933888,null,0,Uu,[al.ElementRef,pl,[2,Fu.NgControl],[2,Fu.NgForm],[2,Fu.FormGroupDirective],es,[8,null]],null,null),al["\u0275prd"](2048,[[1,4]],ju,null,[Uu]),(e()(),al["\u0275ted"](-1,1,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](34,0,null,null,12,"mat-dialog-actions",[["class","mat-dialog-actions"]],null,null,null,null,null)),al["\u0275did"](35,16384,null,0,Hs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](37,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","1"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},J,nc)),al["\u0275did"](38,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](39,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](42,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","2"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onNoClick()&&r),r},J,nc)),al["\u0275did"](43,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](44,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CANCEL"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,4,0),e(t,27,0,n.data.dataverseName),e(t,30,0)},function(e,t){e(t,3,0,al["\u0275nov"](t,4).id),e(t,14,1,[al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._canLabelFloat,al["\u0275nov"](t,15)._shouldLabelFloat(),al["\u0275nov"](t,15)._hideControlPlaceholder(),al["\u0275nov"](t,15)._control.disabled,al["\u0275nov"](t,15)._control.focused,"primary"==al["\u0275nov"](t,15).color,"accent"==al["\u0275nov"](t,15).color,"warn"==al["\u0275nov"](t,15).color,al["\u0275nov"](t,15)._shouldForward("untouched"),al["\u0275nov"](t,15)._shouldForward("touched"),al["\u0275nov"](t,15)._shouldForward("pristine"),al["\u0275nov"](t,15)._shouldForward("dirty"),al["\u0275nov"](t,15)._shouldForward("valid"),al["\u0275nov"](t,15)._shouldForward("invalid"),al["\u0275nov"](t,15)._shouldForward("pending")]),e(t,24,1,[al["\u0275nov"](t,29).ngClassUntouched,al["\u0275nov"](t,29).ngClassTouched,al["\u0275nov"](t,29).ngClassPristine,al["\u0275nov"](t,29).ngClassDirty,al["\u0275nov"](t,29).ngClassValid,al["\u0275nov"](t,29).ngClassInvalid,al["\u0275nov"](t,29).ngClassPending,al["\u0275nov"](t,30)._isServer,al["\u0275nov"](t,30).id,al["\u0275nov"](t,30).placeholder,al["\u0275nov"](t,30).disabled,al["\u0275nov"](t,30).required,al["\u0275nov"](t,30).readonly,al["\u0275nov"](t,30)._ariaDescribedby||null,al["\u0275nov"](t,30).errorState,al["\u0275nov"](t,30).required.toString()]),e(t,37,0,al["\u0275nov"](t,38).disabled||null),e(t,42,0,al["\u0275nov"](t,43).disabled||null)})}function tt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-compactionpolicy-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Compaction Policy"]))],null,null)}function nt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-compactionpolicy-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.CompactionPolicy)})}function rt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datasetid-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataset Id"]))],null,null)}function it(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-datasetid-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatasetId)})}function ot(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datasetname-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataset Name"]))],null,null)}function lt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-datasetname-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatasetName)})}function at(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datasettype-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataset Type"]))],null,null)}function st(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-datasettype-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatasetType)})}function ut(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datatypedataversename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Datatype Dataverse Name"]))],null,null)}function ct(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-datatypedataversename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatatypeDataverseName)})}function dt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datatypename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Datatype Name"]))],null,null)}function pt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-datatypename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatatypeName)})}function ft(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-dataversename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataverse Name"]))],null,null)}function ht(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-dataversename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DataverseName)})}function mt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-groupname-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Group Name"]))],null,null)}function gt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-groupname-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.GroupName)})}function yt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-pendingop-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Pending Op"]))],null,null)}function vt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-pendingop-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.PendingOp)})}function bt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-timestamp-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Timestamp"]))],null,null)}function _t(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","dataset-timestamp-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.Timestamp)})}function wt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-header-row",[["class","mat-header-row"],["role","row"]],null,null,null,Se,cd)),al["\u0275did"](1,49152,null,0,ld,[],null,null)],null,null)}function xt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"mat-row",[["class","mat-row"],["role","row"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.highlight(e.context.$implicit)&&r),r},Oe,dd)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{highlight:0}),al["\u0275did"](3,49152,null,0,ad,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n                "]))],function(e,t){e(t,1,0,e(t,2,0,t.component.selectedRowIndex==t.context.$implicit.id))},null)}function Ct(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,216,"mat-card",[["class","datasets-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](1,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](3,0,null,0,12,"mat-toolbar",[["class","datasets-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](4,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,2,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](7,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](8,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](11,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATASETS - METADATA"])),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](14,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](17,0,null,0,179,"mat-card-content",[["class","datasets-content mat-card-content"]],null,null,null,null,null)),al["\u0275did"](18,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](20,0,null,null,175,"mat-table",[["class","datasets-table mat-table"]],null,null,null,Ee,ud)),al["\u0275did"](21,3391488,[["table",4]],3,Xc,[al.IterableDiffers,al.ChangeDetectorRef,al.ElementRef,[8,null]],{dataSource:[0,"dataSource"]},null),al["\u0275qud"](603979776,3,{_columnDefs:1}),al["\u0275qud"](335544320,4,{_headerDef:0}),al["\u0275qud"](603979776,5,{_rowDefs:1}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](27,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](28,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,6,{cell:0}),al["\u0275qud"](335544320,7,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,tt)),al["\u0275did"](34,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[7,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,nt)),al["\u0275did"](38,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[6,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](43,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](44,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,8,{cell:0}),al["\u0275qud"](335544320,9,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,rt)),al["\u0275did"](50,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[9,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,it)),al["\u0275did"](54,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[8,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](59,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](60,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,10,{cell:0}),al["\u0275qud"](335544320,11,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,ot)),al["\u0275did"](66,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[11,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,lt)),al["\u0275did"](70,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[10,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](75,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](76,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,12,{cell:0}),al["\u0275qud"](335544320,13,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,at)),al["\u0275did"](82,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[13,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,st)),al["\u0275did"](86,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[12,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](91,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](92,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,14,{cell:0}),al["\u0275qud"](335544320,15,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,ut)),al["\u0275did"](98,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[15,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,ct)),al["\u0275did"](102,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[14,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](107,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](108,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,16,{cell:0}),al["\u0275qud"](335544320,17,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,dt)),al["\u0275did"](114,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[17,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,pt)),al["\u0275did"](118,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[16,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](123,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](124,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,18,{cell:0}),al["\u0275qud"](335544320,19,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,ft)),al["\u0275did"](130,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[19,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,ht)),al["\u0275did"](134,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[18,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](139,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](140,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,20,{cell:0}),al["\u0275qud"](335544320,21,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,mt)),al["\u0275did"](146,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[21,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,gt)),al["\u0275did"](150,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[20,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](155,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](156,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,22,{cell:0}),al["\u0275qud"](335544320,23,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,yt)),al["\u0275did"](162,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[23,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,vt)),al["\u0275did"](166,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[22,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](171,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](172,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,24,{cell:0}),al["\u0275qud"](335544320,25,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,bt)),al["\u0275did"](178,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[25,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n                  "])),(e()(),al["\u0275and"](0,null,null,2,null,_t)),al["\u0275did"](182,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[24,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n    \n                "])),(e()(),al["\u0275and"](0,null,null,3,null,wt)),al["\u0275did"](187,540672,null,0,id,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](188,4),al["\u0275prd"](2048,[[4,4]],Hc,null,[id]),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](0,null,null,3,null,xt)),al["\u0275did"](192,540672,null,0,od,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](193,4),al["\u0275prd"](2048,[[5,4]],Wc,null,[od]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](198,0,null,0,17,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](199,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](201,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.openDropDatasetDialog()&&r),r},J,nc)),al["\u0275did"](202,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](203,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](206,0,null,null,1,"span",[["class","error-message"]],null,null,null,null,null)),(e()(),al["\u0275ted"](207,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](209,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](211,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.getDatasets()&&r),r},J,nc)),al["\u0275did"](212,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](213,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["REFRESH"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n      "]))],function(e,t){var n=t.component;e(t,4,0,"primary"),e(t,8,0),e(t,21,0,n.dataSource),e(t,28,0,"CompactionPolicy"),e(t,44,0,"DatasetId"),e(t,60,0,"DatasetName"),e(t,76,0,"DatasetType"),e(t,92,0,"DatatypeDataverseName"),e(t,108,0,"DatatypeName"),e(t,124,0,"DataverseName"),e(t,140,0,"GroupName"),e(t,156,0,"PendingOp"),e(t,172,0,"Timestamp"),e(t,187,0,e(t,188,0,"DatasetName","DataverseName","DatatypeName","Timestamp")),e(t,192,0,e(t,193,0,"DatasetName","DataverseName","DatatypeName","Timestamp"))},function(e,t){var n=t.component;e(t,3,0,al["\u0275nov"](t,4)._toolbarRows.length,!al["\u0275nov"](t,4)._toolbarRows.length),e(t,198,0,"end"===al["\u0275nov"](t,199).align),e(t,201,0,al["\u0275nov"](t,202).disabled||null),e(t,207,0,n.errorMessage),e(t,211,0,al["\u0275nov"](t,212).disabled||null)})}function Et(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{inputQuery:0}),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](2,0,null,null,40,"div",[["class","container"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](4,0,null,null,8,"div",[["class","master"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275and"](16777216,null,null,2,null,Ct)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](10,0,null,null,1,"awc-query-metadata",[["class","query"]],null,null,null,Ie,Xp)),al["\u0275did"](11,49152,[[1,4],["querymetadata",4]],0,Qp,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](14,0,null,null,27,"div",[["class","detail"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](16,0,null,null,24,"mat-card",[["class","datasets-details-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](17,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](19,0,null,0,12,"mat-toolbar",[["class","datasets-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](20,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,26,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](23,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](24,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](27,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATASET - METADATA - DETAILS"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](30,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](33,0,null,0,6,"mat-card-content",[["class","datasets-content output mat-card-content"]],null,null,null,null,null)),al["\u0275did"](34,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](36,0,null,null,2,"span",[],null,null,null,null,null)),(e()(),al["\u0275eld"](37,0,null,null,1,"pre",[],null,null,null,null,null)),(e()(),al["\u0275ted"](38,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,7,0,al["\u0275unv"](t,7,0,al["\u0275nov"](t,8).transform(n.loaded$))),e(t,20,0,"primary"),e(t,24,0)},function(e,t){var n=t.component;e(t,19,0,al["\u0275nov"](t,20)._toolbarRows.length,!al["\u0275nov"](t,20)._toolbarRows.length),e(t,38,0,n.output)})}function St(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],null,null)}function Ot(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,46,"div",[["class","dataset-dialog"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,2,"p",[["class","mat-dialog-title"],["mat-dialog-title",""]],[[8,"id",0]],null,null,null,null)),al["\u0275did"](4,81920,null,0,zs,[[2,Ms]],null,null),(e()(),al["\u0275ted"](-1,null,["DROP DATASET"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),al["\u0275did"](8,16384,null,0,Bs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](10,0,null,null,1,"p",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["PLEASE GIVE THE NAME OF THE DATASET TO DROP"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](14,0,null,null,18,"mat-form-field",[["class","mat-input-container mat-form-field"]],[[2,"mat-input-invalid",null],[2,"mat-form-field-invalid",null],[2,"mat-form-field-can-float",null],[2,"mat-form-field-should-float",null],[2,"mat-form-field-hide-placeholder",null],[2,"mat-form-field-disabled",null],[2,"mat-focused",null],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,ze,lf)),al["\u0275did"](15,7389184,null,7,zu,[al.ElementRef,al.ChangeDetectorRef,[2,ps]],null,null),al["\u0275qud"](335544320,1,{_control:0}),al["\u0275qud"](335544320,2,{_placeholderChild:0}),al["\u0275qud"](335544320,3,{_labelChild:0}),al["\u0275qud"](603979776,4,{_errorChildren:1}),al["\u0275qud"](603979776,5,{_hintChildren:1}),al["\u0275qud"](603979776,6,{_prefixChildren:1}),al["\u0275qud"](603979776,7,{_suffixChildren:1}),(e()(),al["\u0275ted"](-1,1,["\n            "])),(e()(),al["\u0275eld"](24,0,null,1,7,"input",[["class","mat-input-element mat-form-field-autofill-control"],["matInput",""],["tabindex","0"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,25)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionEnd(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!0)&&r),"input"===t&&(r=!1!==al["\u0275nov"](e,30)._onInput()&&r),"ngModelChange"===t&&(r=!1!==(i.data.datasetName=n)&&r),r},null,null)),al["\u0275did"](25,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](27,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](29,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),al["\u0275did"](30,933888,null,0,Uu,[al.ElementRef,pl,[2,Fu.NgControl],[2,Fu.NgForm],[2,Fu.FormGroupDirective],es,[8,null]],null,null),al["\u0275prd"](2048,[[1,4]],ju,null,[Uu]),(e()(),al["\u0275ted"](-1,1,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](34,0,null,null,12,"mat-dialog-actions",[["class","mat-dialog-actions"]],null,null,null,null,null)),al["\u0275did"](35,16384,null,0,Hs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](37,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","1"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},J,nc)),al["\u0275did"](38,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](39,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](42,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","2"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onNoClick()&&r),r},J,nc)),al["\u0275did"](43,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](44,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CANCEL"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,4,0),e(t,27,0,n.data.datasetName),e(t,30,0)},function(e,t){e(t,3,0,al["\u0275nov"](t,4).id),e(t,14,1,[al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._canLabelFloat,al["\u0275nov"](t,15)._shouldLabelFloat(),al["\u0275nov"](t,15)._hideControlPlaceholder(),al["\u0275nov"](t,15)._control.disabled,al["\u0275nov"](t,15)._control.focused,"primary"==al["\u0275nov"](t,15).color,"accent"==al["\u0275nov"](t,15).color,"warn"==al["\u0275nov"](t,15).color,al["\u0275nov"](t,15)._shouldForward("untouched"),al["\u0275nov"](t,15)._shouldForward("touched"),al["\u0275nov"](t,15)._shouldForward("pristine"),al["\u0275nov"](t,15)._shouldForward("dirty"),al["\u0275nov"](t,15)._shouldForward("valid"),al["\u0275nov"](t,15)._shouldForward("invalid"),al["\u0275nov"](t,15)._shouldForward("pending")]),e(t,24,1,[al["\u0275nov"](t,29).ngClassUntouched,al["\u0275nov"](t,29).ngClassTouched,al["\u0275nov"](t,29).ngClassPristine,al["\u0275nov"](t,29).ngClassDirty,al["\u0275nov"](t,29).ngClassValid,al["\u0275nov"](t,29).ngClassInvalid,al["\u0275nov"](t,29).ngClassPending,al["\u0275nov"](t,30)._isServer,al["\u0275nov"](t,30).id,al["\u0275nov"](t,30).placeholder,al["\u0275nov"](t,30).disabled,al["\u0275nov"](t,30).required,al["\u0275nov"](t,30).readonly,al["\u0275nov"](t,30)._ariaDescribedby||null,al["\u0275nov"](t,30).errorState,al["\u0275nov"](t,30).required.toString()]),e(t,37,0,al["\u0275nov"](t,38).disabled||null),e(t,42,0,al["\u0275nov"](t,43).disabled||null)})}function Tt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datatypename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Datatype Name"]))],null,null)}function kt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","datatypes-datatypename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[""," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatatypeName)})}function Dt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-dataversename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Dataverse Name "]))],null,null)}function It(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","datatypes-dataversename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[""," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DataverseName)})}function Rt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-timestamp-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,["Timestamp"]))],null,null)}function Mt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","datatypes-timestamp-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,["",""]))],null,function(e,t){e(t,2,0,t.context.$implicit.Timestamp)})}function Pt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-header-row",[["class","mat-header-row"],["role","row"]],null,null,null,Se,cd)),al["\u0275did"](1,49152,null,0,ld,[],null,null)],null,null)}function Nt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"mat-row",[["class","mat-row"],["role","row"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.highlight(e.context.$implicit)&&r),r},Oe,dd)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{highlight:0}),al["\u0275did"](3,49152,null,0,ad,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,1,0,e(t,2,0,t.component.selectedRowIndex==t.context.$implicit.id))},null)}function At(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,104,"mat-card",[["class","datatypes-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](1,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](3,0,null,0,12,"mat-toolbar",[["class","datatypes-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](4,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,4,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](7,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](8,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](11,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATATYPES - METADATA"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](14,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](17,0,null,0,67,"mat-card-content",[["class","datatypes-content mat-card-content"]],null,null,null,null,null)),al["\u0275did"](18,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](20,0,null,null,63,"mat-table",[["class","datatypes-table mat-table"],["role","treegrid"]],null,null,null,Ee,ud)),al["\u0275did"](21,3391488,[["table",4]],3,Xc,[al.IterableDiffers,al.ChangeDetectorRef,al.ElementRef,[8,"treegrid"]],{dataSource:[0,"dataSource"]},null),al["\u0275qud"](603979776,5,{_columnDefs:1}),al["\u0275qud"](335544320,6,{_headerDef:0}),al["\u0275qud"](603979776,7,{_rowDefs:1}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](27,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](28,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,8,{cell:0}),al["\u0275qud"](335544320,9,{headerCell:0}),al["\u0275prd"](2048,[[5,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Tt)),al["\u0275did"](34,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[9,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,kt)),al["\u0275did"](38,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[8,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](43,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](44,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,10,{cell:0}),al["\u0275qud"](335544320,11,{headerCell:0}),al["\u0275prd"](2048,[[5,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Dt)),al["\u0275did"](50,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[11,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,It)),al["\u0275did"](54,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[10,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](59,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](60,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,12,{cell:0}),al["\u0275qud"](335544320,13,{headerCell:0}),al["\u0275prd"](2048,[[5,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Rt)),al["\u0275did"](66,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[13,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Mt)),al["\u0275did"](70,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[12,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,Pt)),al["\u0275did"](75,540672,null,0,id,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](76,3),al["\u0275prd"](2048,[[6,4]],Hc,null,[id]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,Nt)),al["\u0275did"](80,540672,null,0,od,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](81,3),al["\u0275prd"](2048,[[7,4]],Wc,null,[od]),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](86,0,null,0,17,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](87,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](89,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.openDropDatatypeDialog()&&r),r},J,nc)),al["\u0275did"](90,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](91,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](94,0,null,null,1,"span",[["class","error-message"]],null,null,null,null,null)),(e()(),al["\u0275ted"](95,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](97,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](99,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.getDatatypes()&&r),r},J,nc)),al["\u0275did"](100,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](101,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["REFRESH"])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n    "]))],function(e,t){var n=t.component;e(t,4,0,"primary"),e(t,8,0),e(t,21,0,n.dataSource),e(t,28,0,"DatatypeName"),e(t,44,0,"DataverseName"),e(t,60,0,"Timestamp"),e(t,75,0,e(t,76,0,"DatatypeName","DataverseName","Timestamp")),e(t,80,0,e(t,81,0,"DatatypeName","DataverseName","Timestamp"))},function(e,t){var n=t.component;e(t,3,0,al["\u0275nov"](t,4)._toolbarRows.length,!al["\u0275nov"](t,4)._toolbarRows.length),e(t,86,0,"end"===al["\u0275nov"](t,87).align),e(t,89,0,al["\u0275nov"](t,90).disabled||null),e(t,95,0,n.errorMessage),e(t,99,0,al["\u0275nov"](t,100).disabled||null)})}function Lt(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{paginator:0}),al["\u0275qud"](402653184,2,{filter:0}),al["\u0275qud"](402653184,3,{inputQuery:0}),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](4,0,null,null,40,"div",[["class","container"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](6,0,null,null,8,"div",[["class","master"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n   "])),(e()(),al["\u0275and"](16777216,null,null,2,null,At)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,[" \n    "])),(e()(),al["\u0275eld"](12,0,null,null,1,"awc-query-metadata",[["class","query"]],null,null,null,Ie,Xp)),al["\u0275did"](13,49152,[[3,4],["querymetadata",4]],0,Qp,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](16,0,null,null,27,"div",[["class","detail"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](18,0,null,null,24,"mat-card",[["class","datatypes-details-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](19,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](21,0,null,0,12,"mat-toolbar",[["class","datatypes-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](22,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,14,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](25,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](26,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](29,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["DATATYPE - METADATA - DETAILS"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](32,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](35,0,null,0,6,"mat-card-content",[["class","datatypes-content output mat-card-content"]],null,null,null,null,null)),al["\u0275did"](36,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](38,0,null,null,2,"span",[],null,null,null,null,null)),(e()(),al["\u0275eld"](39,0,null,null,1,"pre",[],null,null,null,null,null)),(e()(),al["\u0275ted"](40,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,9,0,al["\u0275unv"](t,9,0,al["\u0275nov"](t,10).transform(n.loaded$))),e(t,22,0,"primary"),e(t,26,0)},function(e,t){var n=t.component;e(t,21,0,al["\u0275nov"](t,22)._toolbarRows.length,!al["\u0275nov"](t,22)._toolbarRows.length),e(t,40,0,n.output)})}function Ft(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"]))],null,null)}function jt(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,46,"div",[["class","datatype-dialog"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,2,"p",[["class","mat-dialog-title"],["mat-dialog-title",""]],[[8,"id",0]],null,null,null,null)),al["\u0275did"](4,81920,null,0,zs,[[2,Ms]],null,null),(e()(),al["\u0275ted"](-1,null,["DROP DATATYPE"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),al["\u0275did"](8,16384,null,0,Bs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](10,0,null,null,1,"p",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["PLEASE GIVE THE NAME OF THE DATATYPE TO DROP"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](14,0,null,null,18,"mat-form-field",[["class","mat-input-container mat-form-field"]],[[2,"mat-input-invalid",null],[2,"mat-form-field-invalid",null],[2,"mat-form-field-can-float",null],[2,"mat-form-field-should-float",null],[2,"mat-form-field-hide-placeholder",null],[2,"mat-form-field-disabled",null],[2,"mat-focused",null],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,ze,lf)),al["\u0275did"](15,7389184,null,7,zu,[al.ElementRef,al.ChangeDetectorRef,[2,ps]],null,null),al["\u0275qud"](335544320,1,{_control:0}),al["\u0275qud"](335544320,2,{_placeholderChild:0}),al["\u0275qud"](335544320,3,{_labelChild:0}),al["\u0275qud"](603979776,4,{_errorChildren:1}),al["\u0275qud"](603979776,5,{_hintChildren:1}),al["\u0275qud"](603979776,6,{_prefixChildren:1}),al["\u0275qud"](603979776,7,{_suffixChildren:1}),(e()(),al["\u0275ted"](-1,1,["\n            "])),(e()(),al["\u0275eld"](24,0,null,1,7,"input",[["class","mat-input-element mat-form-field-autofill-control"],["matInput",""],["tabindex","0"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,25)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionEnd(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!0)&&r),"input"===t&&(r=!1!==al["\u0275nov"](e,30)._onInput()&&r),"ngModelChange"===t&&(r=!1!==(i.data.datatypeName=n)&&r),r},null,null)),al["\u0275did"](25,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](27,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](29,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),al["\u0275did"](30,933888,null,0,Uu,[al.ElementRef,pl,[2,Fu.NgControl],[2,Fu.NgForm],[2,Fu.FormGroupDirective],es,[8,null]],null,null),al["\u0275prd"](2048,[[1,4]],ju,null,[Uu]),(e()(),al["\u0275ted"](-1,1,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](34,0,null,null,12,"mat-dialog-actions",[["class","mat-dialog-actions"]],null,null,null,null,null)),al["\u0275did"](35,16384,null,0,Hs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](37,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","1"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},J,nc)),al["\u0275did"](38,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](39,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](42,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","2"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onNoClick()&&r),r},J,nc)),al["\u0275did"](43,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](44,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CANCEL"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,4,0),e(t,27,0,n.data.datatypeName),e(t,30,0)},function(e,t){e(t,3,0,al["\u0275nov"](t,4).id),e(t,14,1,[al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._canLabelFloat,al["\u0275nov"](t,15)._shouldLabelFloat(),al["\u0275nov"](t,15)._hideControlPlaceholder(),al["\u0275nov"](t,15)._control.disabled,al["\u0275nov"](t,15)._control.focused,"primary"==al["\u0275nov"](t,15).color,"accent"==al["\u0275nov"](t,15).color,"warn"==al["\u0275nov"](t,15).color,al["\u0275nov"](t,15)._shouldForward("untouched"),al["\u0275nov"](t,15)._shouldForward("touched"),al["\u0275nov"](t,15)._shouldForward("pristine"),al["\u0275nov"](t,15)._shouldForward("dirty"),al["\u0275nov"](t,15)._shouldForward("valid"),al["\u0275nov"](t,15)._shouldForward("invalid"),al["\u0275nov"](t,15)._shouldForward("pending")]),e(t,24,1,[al["\u0275nov"](t,29).ngClassUntouched,al["\u0275nov"](t,29).ngClassTouched,al["\u0275nov"](t,29).ngClassPristine,al["\u0275nov"](t,29).ngClassDirty,al["\u0275nov"](t,29).ngClassValid,al["\u0275nov"](t,29).ngClassInvalid,al["\u0275nov"](t,29).ngClassPending,al["\u0275nov"](t,30)._isServer,al["\u0275nov"](t,30).id,al["\u0275nov"](t,30).placeholder,al["\u0275nov"](t,30).disabled,al["\u0275nov"](t,30).required,al["\u0275nov"](t,30).readonly,al["\u0275nov"](t,30)._ariaDescribedby||null,al["\u0275nov"](t,30).errorState,al["\u0275nov"](t,30).required.toString()]),e(t,37,0,al["\u0275nov"](t,38).disabled||null),e(t,42,0,al["\u0275nov"](t,43).disabled||null)})}function Vt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-dataversename-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Dataverse Name "]))],null,null)}function zt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-dataversename-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DataverseName)})}function Bt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-datasetname-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Dataset Name "]))],null,null)}function Ht(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-datasetname-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.DatasetName)})}function Wt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-indexname-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Index Name "]))],null,null)}function qt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-indexname-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.IndexName)})}function Ut(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-indexestructure-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Index Structure "]))],null,null)}function Gt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-indexstructure-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.IndexStructure)})}function Kt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-isprimary-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Is Primary "]))],null,null)}function $t(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-isprimary-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.IsPrimary)})}function Zt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-timestamp-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" Timestamp "]))],null,null)}function Qt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-timestamp-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.Timestamp)})}function Yt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-header-cell",[["class","header-pendingop-cell mat-header-cell"],["role","columnheader"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,nd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](-1,null,[" PendingOp "]))],null,null)}function Xt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"mat-cell",[["class","indexes-dataverse-cell mat-cell"],["role","gridcell"]],null,null,null,null,null)),al["\u0275did"](1,16384,null,0,rd,[Kc,al.ElementRef],null,null),(e()(),al["\u0275ted"](2,null,[" "," "]))],null,function(e,t){e(t,2,0,t.context.$implicit.PendingOp)})}function Jt(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-header-row",[["class","mat-header-row"],["role","row"]],null,null,null,Se,cd)),al["\u0275did"](1,49152,null,0,ld,[],null,null)],null,null)}function en(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"mat-row",[["class","mat-row"],["role","row"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.highlight(e.context.$implicit)&&r),r},Oe,dd)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{highlight:0}),al["\u0275did"](3,49152,null,0,ad,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,1,0,e(t,2,0,t.component.selectedRowIndex==t.context.$implicit.id))},null)}function tn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,168,"mat-card",[["class","indexes-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](1,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](3,0,null,0,12,"mat-toolbar",[["class","indexes-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](4,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,2,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](7,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](8,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](11,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["INDEXES - METADATA"])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](14,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](17,0,null,0,131,"mat-card-content",[["class","indexes-content mat-card-content"]],null,null,null,null,null)),al["\u0275did"](18,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](20,0,null,null,127,"mat-table",[["class","indexes-table mat-table"]],null,null,null,Ee,ud)),al["\u0275did"](21,3391488,[["table",4]],3,Xc,[al.IterableDiffers,al.ChangeDetectorRef,al.ElementRef,[8,null]],{dataSource:[0,"dataSource"]},null),al["\u0275qud"](603979776,3,{_columnDefs:1}),al["\u0275qud"](335544320,4,{_headerDef:0}),al["\u0275qud"](603979776,5,{_rowDefs:1}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](27,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](28,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,6,{cell:0}),al["\u0275qud"](335544320,7,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Vt)),al["\u0275did"](34,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[7,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,zt)),al["\u0275did"](38,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[6,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](43,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](44,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,8,{cell:0}),al["\u0275qud"](335544320,9,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Bt)),al["\u0275did"](50,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[9,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Ht)),al["\u0275did"](54,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[8,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](59,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](60,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,10,{cell:0}),al["\u0275qud"](335544320,11,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Wt)),al["\u0275did"](66,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[11,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,qt)),al["\u0275did"](70,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[10,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](75,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](76,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,12,{cell:0}),al["\u0275qud"](335544320,13,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Ut)),al["\u0275did"](82,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[13,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Gt)),al["\u0275did"](86,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[12,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](91,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](92,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,14,{cell:0}),al["\u0275qud"](335544320,15,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Kt)),al["\u0275did"](98,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[15,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,$t)),al["\u0275did"](102,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[14,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](107,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](108,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,16,{cell:0}),al["\u0275qud"](335544320,17,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Zt)),al["\u0275did"](114,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[17,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Qt)),al["\u0275did"](118,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[16,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](123,0,null,null,13,null,null,null,null,null,null,null)),al["\u0275did"](124,16384,null,2,td,[],{name:[0,"name"]},null),al["\u0275qud"](335544320,18,{cell:0}),al["\u0275qud"](335544320,19,{headerCell:0}),al["\u0275prd"](2048,[[3,4]],Kc,null,[td]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Yt)),al["\u0275did"](130,16384,null,0,ed,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[19,4]],Gc,null,[ed]),(e()(),al["\u0275ted"](-1,null,["\n              "])),(e()(),al["\u0275and"](0,null,null,2,null,Xt)),al["\u0275did"](134,16384,null,0,Jc,[al.TemplateRef],null,null),al["\u0275prd"](2048,[[18,4]],Uc,null,[Jc]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,Jt)),al["\u0275did"](139,540672,null,0,id,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](140,6),al["\u0275prd"](2048,[[4,4]],Hc,null,[id]),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](0,null,null,3,null,en)),al["\u0275did"](144,540672,null,0,od,[al.TemplateRef,al.IterableDiffers],{columns:[0,"columns"]},null),al["\u0275pad"](145,6),al["\u0275prd"](2048,[[5,4]],Wc,null,[od]),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](150,0,null,0,17,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](151,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](153,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.openDropIndexDialog()&&r),r},J,nc)),al["\u0275did"](154,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](155,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](158,0,null,null,1,"span",[["class","error-message"]],null,null,null,null,null)),(e()(),al["\u0275ted"](159,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](161,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](163,0,null,null,3,"button",[["class","refresh-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.getIndexes()&&r),r},J,nc)),al["\u0275did"](164,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](165,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["REFRESH"])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,0,["\n    "]))],function(e,t){var n=t.component;e(t,4,0,"primary"),e(t,8,0),e(t,21,0,n.dataSource),e(t,28,0,"DataverseName"),e(t,44,0,"DatasetName"),e(t,60,0,"IndexName"),e(t,76,0,"IndexStructure"),e(t,92,0,"IsPrimary"),e(t,108,0,"Timestamp"),e(t,124,0,"PendingOp"),e(t,139,0,e(t,140,0,"IndexName","DatasetName","DataverseName","IndexStructure","IsPrimary","Timestamp")),e(t,144,0,e(t,145,0,"IndexName","DatasetName","DataverseName","IndexStructure","IsPrimary","Timestamp"))},function(e,t){var n=t.component;e(t,3,0,al["\u0275nov"](t,4)._toolbarRows.length,!al["\u0275nov"](t,4)._toolbarRows.length),e(t,150,0,"end"===al["\u0275nov"](t,151).align),e(t,153,0,al["\u0275nov"](t,154).disabled||null),e(t,159,0,n.errorMessage),e(t,163,0,al["\u0275nov"](t,164).disabled||null)})}function nn(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{inputQuery:0}),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](2,0,null,null,40,"div",[["class","container"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](4,0,null,null,8,"div",[["class","master"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275and"](16777216,null,null,2,null,tn)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](10,0,null,null,1,"awc-query-metadata",[["class","query"]],null,null,null,Ie,Xp)),al["\u0275did"](11,49152,[[1,4],["querymetadata",4]],0,Qp,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["  \n  "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](14,0,null,null,27,"div",[["class","detail"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](16,0,null,null,24,"mat-card",[["class","indexes-details-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](17,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](19,0,null,0,12,"mat-toolbar",[["class","indexes-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](20,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,20,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](23,0,null,0,2,"mat-icon",[["class","icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](24,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](27,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["INDEX - METADATA - DETAILS"])),(e()(),al["\u0275ted"](-1,0,["\n              "])),(e()(),al["\u0275eld"](30,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n          "])),(e()(),al["\u0275eld"](33,0,null,0,6,"mat-card-content",[["class","indexes-content output mat-card-content"]],null,null,null,null,null)),al["\u0275did"](34,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](36,0,null,null,2,"span",[],null,null,null,null,null)),(e()(),al["\u0275eld"](37,0,null,null,1,"pre",[],null,null,null,null,null)),(e()(),al["\u0275ted"](38,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,7,0,al["\u0275unv"](t,7,0,al["\u0275nov"](t,8).transform(n.loaded$))),e(t,20,0,"primary"),e(t,24,0)},function(e,t){var n=t.component;e(t,19,0,al["\u0275nov"](t,20)._toolbarRows.length,!al["\u0275nov"](t,20)._toolbarRows.length),e(t,38,0,n.output)})}function rn(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"]))],null,null)}function on(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,46,"div",[["class","index-dialog"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,2,"p",[["class","mat-dialog-title"],["mat-dialog-title",""]],[[8,"id",0]],null,null,null,null)),al["\u0275did"](4,81920,null,0,zs,[[2,Ms]],null,null),(e()(),al["\u0275ted"](-1,null,["DROP INDEX"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),al["\u0275did"](8,16384,null,0,Bs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](10,0,null,null,1,"p",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["PLEASE GIVE THE DATAVERSENAME.INDEXNAME OF THE INDEX TO DROP"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](14,0,null,null,18,"mat-form-field",[["class","mat-input-container mat-form-field"]],[[2,"mat-input-invalid",null],[2,"mat-form-field-invalid",null],[2,"mat-form-field-can-float",null],[2,"mat-form-field-should-float",null],[2,"mat-form-field-hide-placeholder",null],[2,"mat-form-field-disabled",null],[2,"mat-focused",null],[2,"mat-primary",null],[2,"mat-accent",null],[2,"mat-warn",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,ze,lf)),al["\u0275did"](15,7389184,null,7,zu,[al.ElementRef,al.ChangeDetectorRef,[2,ps]],null,null),al["\u0275qud"](335544320,1,{_control:0}),al["\u0275qud"](335544320,2,{_placeholderChild:0}),al["\u0275qud"](335544320,3,{_labelChild:0}),al["\u0275qud"](603979776,4,{_errorChildren:1}),al["\u0275qud"](603979776,5,{_hintChildren:1}),al["\u0275qud"](603979776,6,{_prefixChildren:1}),al["\u0275qud"](603979776,7,{_suffixChildren:1}),(e()(),al["\u0275ted"](-1,1,["\n            "])),(e()(),al["\u0275eld"](24,0,null,1,7,"input",[["class","mat-input-element mat-form-field-autofill-control"],["matInput",""],["tabindex","0"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null],[2,"mat-input-server",null],[1,"id",0],[8,"placeholder",0],[8,"disabled",0],[8,"required",0],[8,"readOnly",0],[1,"aria-describedby",0],[1,"aria-invalid",0],[1,"aria-required",0]],[[null,"ngModelChange"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,25)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,25).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,25)._compositionEnd(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!1)&&r),"focus"===t&&(r=!1!==al["\u0275nov"](e,30)._focusChanged(!0)&&r),"input"===t&&(r=!1!==al["\u0275nov"](e,30)._onInput()&&r),"ngModelChange"===t&&(r=!1!==(i.data.indexName=n)&&r),r},null,null)),al["\u0275did"](25,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](27,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](29,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),al["\u0275did"](30,933888,null,0,Uu,[al.ElementRef,pl,[2,Fu.NgControl],[2,Fu.NgForm],[2,Fu.FormGroupDirective],es,[8,null]],null,null),al["\u0275prd"](2048,[[1,4]],ju,null,[Uu]),(e()(),al["\u0275ted"](-1,1,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](34,0,null,null,12,"mat-dialog-actions",[["class","mat-dialog-actions"]],null,null,null,null,null)),al["\u0275did"](35,16384,null,0,Hs,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](37,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","1"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},J,nc)),al["\u0275did"](38,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](39,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["DROP"])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](42,0,null,null,3,"button",[["class","mat-button"],["mat-button",""],["tabindex","2"]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onNoClick()&&r),r},J,nc)),al["\u0275did"](43,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](44,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["CANCEL"])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,4,0),e(t,27,0,n.data.indexName),e(t,30,0)},function(e,t){e(t,3,0,al["\u0275nov"](t,4).id),e(t,14,1,[al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._control.errorState,al["\u0275nov"](t,15)._canLabelFloat,al["\u0275nov"](t,15)._shouldLabelFloat(),al["\u0275nov"](t,15)._hideControlPlaceholder(),al["\u0275nov"](t,15)._control.disabled,al["\u0275nov"](t,15)._control.focused,"primary"==al["\u0275nov"](t,15).color,"accent"==al["\u0275nov"](t,15).color,"warn"==al["\u0275nov"](t,15).color,al["\u0275nov"](t,15)._shouldForward("untouched"),al["\u0275nov"](t,15)._shouldForward("touched"),al["\u0275nov"](t,15)._shouldForward("pristine"),al["\u0275nov"](t,15)._shouldForward("dirty"),al["\u0275nov"](t,15)._shouldForward("valid"),al["\u0275nov"](t,15)._shouldForward("invalid"),al["\u0275nov"](t,15)._shouldForward("pending")]),e(t,24,1,[al["\u0275nov"](t,29).ngClassUntouched,al["\u0275nov"](t,29).ngClassTouched,al["\u0275nov"](t,29).ngClassPristine,al["\u0275nov"](t,29).ngClassDirty,al["\u0275nov"](t,29).ngClassValid,al["\u0275nov"](t,29).ngClassInvalid,al["\u0275nov"](t,29).ngClassPending,al["\u0275nov"](t,30)._isServer,al["\u0275nov"](t,30).id,al["\u0275nov"](t,30).placeholder,al["\u0275nov"](t,30).disabled,al["\u0275nov"](t,30).required,al["\u0275nov"](t,30).readonly,al["\u0275nov"](t,30)._ariaDescribedby||null,al["\u0275nov"](t,30).errorState,al["\u0275nov"](t,30).required.toString()]),e(t,37,0,al["\u0275nov"](t,38).disabled||null),e(t,42,0,al["\u0275nov"](t,43).disabled||null)})}function ln(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,41,"header",[["class","awc-navbar"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](3,0,null,null,38,"nav",[["class","awc-navbar-header"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](5,0,null,null,8,"a",[["aria-label","AsterixDB Web Console"],["class","awc-button mat-button"],["mat-button",""],["routerLink","/"]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,6)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](6,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](7,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](9,0,null,0,0,"img",[["alt","AsterixDB"],["class","awc-asterixDB-logo"],["src","assets/asterixdb_tm.png"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n            "])),(e()(),al["\u0275eld"](11,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["Administration Console"])),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](15,0,null,null,0,"div",[["class","flex-spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](17,0,null,null,3,"a",[["aria-label","WEBSITE"],["class","awc-button awc-navbar-hide-small mat-button"],["href","https://asterixDB.apache.org"],["mat-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,18)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](18,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](19,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        WEBSITE\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](22,0,null,null,3,"a",[["aria-label","FILE ISSUES"],["class","awc-button awc-navbar-hide-small mat-button"],["href","https://issues.apache.org/jira/browse/ASTERIXDB"],["mat-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,23)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](23,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](24,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        FILE ISSUES\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](27,0,null,null,3,"a",[["aria-label","DOCUMENTATION"],["class","awc-button awc-navbar-hide-small mat-button"],["href","https://ci.apache.org/projects/asterixdb/index.html"],["mat-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,28)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](28,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](29,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        DOCUMENTATION\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](32,0,null,null,3,"a",[["aria-label","CONTACT"],["class","awc-button docs-navbar-hide-small mat-button"],["href","https://asterixdb.apache.org/community.html"],["mat-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,33)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](33,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](34,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        CONTACT\n      "])),(e()(),al["\u0275ted"](-1,null,["\n\n      "])),(e()(),al["\u0275eld"](37,0,null,null,3,"a",[["aria-label","GITHUB"],["class","awc-button docs-navbar-hide-small mat-button"],["href","https://github.com/apache/asterixdb/"],["mat-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==al["\u0275nov"](e,38)._haltDisabledEvents(n)&&r),r},ee,rc)),al["\u0275did"](38,180224,null,0,Zs,[pl,La,al.ElementRef],null,null),al["\u0275did"](39,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n        GITHUB\n      "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],null,function(e,t){e(t,5,0,al["\u0275nov"](t,6).disabled?-1:0,al["\u0275nov"](t,6).disabled||null,al["\u0275nov"](t,6).disabled.toString()),e(t,17,0,al["\u0275nov"](t,18).disabled?-1:0,al["\u0275nov"](t,18).disabled||null,al["\u0275nov"](t,18).disabled.toString()),e(t,22,0,al["\u0275nov"](t,23).disabled?-1:0,al["\u0275nov"](t,23).disabled||null,al["\u0275nov"](t,23).disabled.toString()),e(t,27,0,al["\u0275nov"](t,28).disabled?-1:0,al["\u0275nov"](t,28).disabled||null,al["\u0275nov"](t,28).disabled.toString()),e(t,32,0,al["\u0275nov"](t,33).disabled?-1:0,al["\u0275nov"](t,33).disabled||null,al["\u0275nov"](t,33).disabled.toString()),e(t,37,0,al["\u0275nov"](t,38).disabled?-1:0,al["\u0275nov"](t,38).disabled||null,al["\u0275nov"](t,38).disabled.toString())})}function an(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](0,null,null,0))],null,null)}function sn(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](16777216,null,null,1,null,an)),al["\u0275did"](1,212992,null,0,$l,[al.ComponentFactoryResolver,al.ViewContainerRef],{portal:[0,"portal"]},null),(e()(),al["\u0275and"](0,null,null,0))],function(e,t){e(t,1,0,t.parent.context.$implicit.templateLabel)},null)}function un(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](0,null,["",""]))],null,function(e,t){e(t,0,0,t.parent.context.$implicit.textLabel)})}function cn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,6,"div",[["class","mat-tab-label mat-ripple"],["mat-ripple",""],["matTabLabelWrapper",""],["role","tab"]],[[8,"id",0],[1,"tabIndex",0],[1,"aria-controls",0],[1,"aria-selected",0],[2,"mat-tab-label-active",null],[2,"mat-ripple-unbounded",null],[2,"mat-tab-disabled",null]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._handleClick(e.context.$implicit,al["\u0275nov"](e.parent,2),e.context.index)&&r),r},null,null)),al["\u0275did"](1,671744,null,0,ss,[al.ElementRef,al.NgZone,pl,[2,as]],{disabled:[0,"disabled"]},null),al["\u0275did"](2,16384,[[2,4]],0,Jf,[al.ElementRef],{disabled:[0,"disabled"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,sn)),al["\u0275did"](4,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,un)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null)],function(e,t){e(t,1,0,t.context.$implicit.disabled||t.component.disableRipple),e(t,2,0,t.context.$implicit.disabled),e(t,4,0,t.context.$implicit.templateLabel),e(t,6,0,!t.context.$implicit.templateLabel)},function(e,t){var n=t.component;e(t,0,0,n._getTabLabelId(t.context.index),n._getTabIndex(t.context.$implicit,t.context.index),n._getTabContentId(t.context.index),n.selectedIndex==t.context.index,n.selectedIndex==t.context.index,al["\u0275nov"](t,1).unbounded,al["\u0275nov"](t,2).disabled)})}function dn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-tab-body",[["class","mat-tab-body"],["role","tabpanel"]],[[8,"id",0],[1,"aria-labelledby",0],[2,"mat-tab-body-active",null]],[[null,"_onCentered"],[null,"_onCentering"]],function(e,t,n){var r=!0,i=e.component;return"_onCentered"===t&&(r=!1!==i._removeTabBodyWrapperHeight()&&r),"_onCentering"===t&&(r=!1!==i._setTabBodyWrapperHeight(n)&&r),r},hn,rh)),al["\u0275did"](1,114688,null,0,Qf,[al.ElementRef,[2,Bl]],{_content:[0,"_content"],position:[1,"position"],origin:[2,"origin"]},{_onCentering:"_onCentering",_onCentered:"_onCentered"})],function(e,t){e(t,1,0,t.context.$implicit.content,t.context.$implicit.position,t.context.$implicit.origin)},function(e,t){var n=t.component;e(t,0,0,n._getTabContentId(t.context.index),n._getTabLabelId(t.context.index),n.selectedIndex==t.context.index)})}function pn(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_tabBodyWrapper:0}),(e()(),al["\u0275eld"](1,0,null,null,4,"mat-tab-header",[["class","mat-tab-header"]],[[2,"mat-tab-header-pagination-controls-enabled",null],[2,"mat-tab-header-rtl",null]],[[null,"indexFocused"],[null,"selectFocusedIndex"]],function(e,t,n){var r=!0,i=e.component;return"indexFocused"===t&&(r=!1!==i._focusChanged(n)&&r),"selectFocusedIndex"===t&&(r=!1!==(i.selectedIndex=n)&&r),r},mn,ih)),al["\u0275did"](2,3325952,[["tabHeader",4]],1,eh,[al.ElementRef,al.ChangeDetectorRef,jl,[2,Bl]],{disableRipple:[0,"disableRipple"],selectedIndex:[1,"selectedIndex"]},{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}),al["\u0275qud"](603979776,2,{_labelWrappers:1}),(e()(),al["\u0275and"](16777216,null,0,1,null,cn)),al["\u0275did"](5,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275eld"](6,0,[[1,0],["tabBodyWrapper",1]],null,2,"div",[["class","mat-tab-body-wrapper"]],null,null,null,null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,dn)),al["\u0275did"](8,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null)],function(e,t){var n=t.component;e(t,2,0,n.disableRipple,n.selectedIndex),e(t,5,0,n._tabs),e(t,8,0,n._tabs)},function(e,t){e(t,1,0,al["\u0275nov"](t,2)._showPaginationControls,"rtl"==al["\u0275nov"](t,2)._getLayoutDirection())})}function fn(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](0,null,null,0))],null,null)}function hn(e){return al["\u0275vid"](2,[(e()(),al["\u0275eld"](0,0,[["content",1]],null,2,"div",[["class","mat-tab-body-content"]],[[24,"@translateTab",0]],[[null,"@translateTab.start"],[null,"@translateTab.done"]],function(e,t,n){var r=!0,i=e.component;return"@translateTab.start"===t&&(r=!1!==i._onTranslateTabStarted(n)&&r),"@translateTab.done"===t&&(r=!1!==i._onTranslateTabComplete(n)&&r),r},null,null)),(e()(),al["\u0275and"](16777216,null,null,1,null,fn)),al["\u0275did"](2,212992,null,0,Zf,[al.ComponentFactoryResolver,al.ViewContainerRef,Qf],null,null)],function(e,t){e(t,2,0)},function(e,t){e(t,0,0,t.component._position)})}function mn(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_inkBar:0}),al["\u0275qud"](402653184,2,{_tabListContainer:0}),al["\u0275qud"](402653184,3,{_tabList:0}),(e()(),al["\u0275eld"](3,0,null,null,2,"div",[["aria-hidden","true"],["class","mat-tab-header-pagination mat-tab-header-pagination-before mat-elevation-z4 mat-ripple"],["mat-ripple",""]],[[2,"mat-tab-header-pagination-disabled",null],[2,"mat-ripple-unbounded",null]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._scrollHeader("before")&&r),r},null,null)),al["\u0275did"](4,671744,null,0,ss,[al.ElementRef,al.NgZone,pl,[2,as]],{disabled:[0,"disabled"]},null),(e()(),al["\u0275eld"](5,0,null,null,0,"div",[["class","mat-tab-header-pagination-chevron"]],null,null,null,null,null)),(e()(),al["\u0275eld"](6,0,[[2,0],["tabListContainer",1]],null,6,"div",[["class","mat-tab-label-container"]],null,[[null,"keydown"]],function(e,t,n){var r=!0;return"keydown"===t&&(r=!1!==e.component._handleKeydown(n)&&r),r},null,null)),(e()(),al["\u0275eld"](7,0,[[3,0],["tabList",1]],null,5,"div",[["class","mat-tab-list"],["role","tablist"]],null,[[null,"cdkObserveContent"]],function(e,t,n){var r=!0;return"cdkObserveContent"===t&&(r=!1!==e.component._onContentChanges()&&r),r},null,null)),al["\u0275did"](8,1196032,null,0,Uf,[qf,al.ElementRef,al.NgZone],null,{event:"cdkObserveContent"}),(e()(),al["\u0275eld"](9,0,null,null,1,"div",[["class","mat-tab-labels"]],null,null,null,null,null)),al["\u0275ncd"](null,0),(e()(),al["\u0275eld"](11,0,null,null,1,"mat-ink-bar",[["class","mat-ink-bar"]],null,null,null,null,null)),al["\u0275did"](12,16384,[[1,4]],0,Kf,[al.ElementRef,al.NgZone],null,null),(e()(),al["\u0275eld"](13,0,null,null,2,"div",[["aria-hidden","true"],["class","mat-tab-header-pagination mat-tab-header-pagination-after mat-elevation-z4 mat-ripple"],["mat-ripple",""]],[[2,"mat-tab-header-pagination-disabled",null],[2,"mat-ripple-unbounded",null]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component._scrollHeader("after")&&r),r},null,null)),al["\u0275did"](14,671744,null,0,ss,[al.ElementRef,al.NgZone,pl,[2,as]],{disabled:[0,"disabled"]},null),(e()(),al["\u0275eld"](15,0,null,null,0,"div",[["class","mat-tab-header-pagination-chevron"]],null,null,null,null,null))],function(e,t){var n=t.component;e(t,4,0,n._disableScrollBefore||n.disableRipple),e(t,14,0,n._disableScrollAfter||n.disableRipple)},function(e,t){var n=t.component;e(t,3,0,n._disableScrollBefore,al["\u0275nov"](t,4).unbounded),e(t,13,0,n._disableScrollAfter,al["\u0275nov"](t,14).unbounded)})}function gn(e){return al["\u0275vid"](0,[al["\u0275ncd"](null,0),(e()(),al["\u0275and"](0,null,null,0))],null,null)}function yn(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_content:0}),(e()(),al["\u0275and"](0,[[1,2]],null,0,null,gn))],null,null)}function vn(e){return al["\u0275vid"](0,[],null,null)}function bn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"li",[["class","ui-treenode-droppoint"]],null,[[null,"drop"],[null,"dragover"],[null,"dragenter"],[null,"dragleave"]],function(e,t,n){var r=!0,i=e.component;return"drop"===t&&(r=!1!==i.onDropPoint(n,-1)&&r),"dragover"===t&&(r=!1!==i.onDropPointDragOver(n)&&r),"dragenter"===t&&(r=!1!==i.onDropPointDragEnter(n,-1)&&r),"dragleave"===t&&(r=!1!==i.onDropPointDragLeave(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-treenode-droppoint-active ui-state-highlight":0})],function(e,t){e(t,1,0,"ui-treenode-droppoint",e(t,2,0,t.component.draghoverPrev))},null)}function _n(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,5,"div",[["class","ui-chkbox"]],null,null,null,null,null)),(e()(),al["\u0275eld"](1,0,null,null,4,"div",[["class","ui-chkbox-box ui-widget ui-corner-all ui-state-default"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275eld"](3,0,null,null,2,"span",[["class","ui-chkbox-icon ui-clickable fa"]],null,null,null,null,null)),al["\u0275did"](4,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](5,{"fa-check":0,"fa-minus":1})],function(e,t){var n=t.component;e(t,4,0,"ui-chkbox-icon ui-clickable fa",e(t,5,0,n.isSelected(),n.node.partialSelected))},null)}function wn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"span",[],[[8,"className",0]],null,null,null,null))],null,function(e,t){e(t,0,0,t.component.getIcon())})}function xn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.node.label)})}function Cn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-treeNodeTemplateLoader",[],null,null,null,vn,uh)),al["\u0275did"](3,245760,null,0,lh.TreeNodeTemplateLoader,[al.ViewContainerRef],{node:[0,"node"],template:[1,"template"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "]))],function(e,t){var n=t.component;e(t,3,0,n.node,n.tree.getTemplateForNode(n.node))},null)}function En(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-treeNode",[],null,null,null,Fn,ch)),al["\u0275did"](1,114688,null,0,lh.UITreeNode,[lh.Tree],{node:[0,"node"],parentNode:[1,"parentNode"],index:[2,"index"],firstChild:[3,"firstChild"],lastChild:[4,"lastChild"]},null)],function(e,t){e(t,1,0,t.context.$implicit,t.component.node,t.context.index,t.context.first,t.context.last)},null)}function Sn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"ul",[["class","ui-treenode-children"],["style","display: none;"]],[[4,"display",null]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,En)),al["\u0275did"](3,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "]))],function(e,t){e(t,3,0,t.component.node.children)},function(e,t){e(t,0,0,t.component.node.expanded?"block":"none")})}function On(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,29,"li",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pad"](2,3),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](4,0,null,null,21,"div",[["class","ui-treenode-content"]],[[8,"draggable",0]],[[null,"click"],[null,"contextmenu"],[null,"touchend"],[null,"drop"],[null,"dragover"],[null,"dragenter"],[null,"dragleave"],[null,"dragstart"],[null,"dragend"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.onNodeClick(n)&&r),"contextmenu"===t&&(r=!1!==i.onNodeRightClick(n)&&r),"touchend"===t&&(r=!1!==i.onNodeTouchEnd()&&r),"drop"===t&&(r=!1!==i.onDropNode(n)&&r),"dragover"===t&&(r=!1!==i.onDropNodeDragOver(n)&&r),"dragenter"===t&&(r=!1!==i.onDropNodeDragEnter(n)&&r),"dragleave"===t&&(r=!1!==i.onDropNodeDragLeave(n)&&r),"dragstart"===t&&(r=!1!==i.onDragStart(n)&&r),"dragend"===t&&(r=!1!==i.onDragStop(n)&&r),r},null,null)),al["\u0275did"](5,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](6,{"ui-treenode-selectable":0,"ui-treenode-dragover":1,"ui-treenode-content-selected":2}),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](8,0,null,null,2,"span",[["class","ui-tree-toggler  fa fa-fw"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.toggle(n)&&r),r},null,null)),al["\u0275did"](9,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](10,{"fa-caret-right":0,"fa-caret-down":1}),(e()(),al["\u0275and"](16777216,null,null,1,null,_n)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,wn)),al["\u0275did"](14,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275eld"](15,0,null,null,9,"span",[["class","ui-treenode-label ui-corner-all"]],null,null,null,null,null)),al["\u0275did"](16,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](17,{"ui-state-highlight":0}),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,xn)),al["\u0275did"](20,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Cn)),al["\u0275did"](23,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Sn)),al["\u0275did"](28,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,"ui-treenode",n.node.styleClass||"",n.isLeaf()?"ui-treenode-leaf":"")),e(t,5,0,"ui-treenode-content",e(t,6,0,n.tree.selectionMode&&!1!==n.node.selectable,n.draghoverNode,n.isSelected())),e(t,9,0,"ui-tree-toggler  fa fa-fw",e(t,10,0,!n.node.expanded,n.node.expanded)),e(t,12,0,"checkbox"==n.tree.selectionMode),e(t,14,0,n.node.icon||n.node.expandedIcon||n.node.collapsedIcon),e(t,16,0,"ui-treenode-label ui-corner-all",e(t,17,0,n.isSelected())),e(t,20,0,!n.tree.getTemplateForNode(n.node)),e(t,23,0,n.tree.getTemplateForNode(n.node)),e(t,28,0,n.node.children&&n.node.expanded)},function(e,t){e(t,4,0,t.component.tree.draggableNodes)})}function Tn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"li",[["class","ui-treenode-droppoint"]],null,[[null,"drop"],[null,"dragover"],[null,"dragenter"],[null,"dragleave"]],function(e,t,n){var r=!0,i=e.component;return"drop"===t&&(r=!1!==i.onDropPoint(n,1)&&r),"dragover"===t&&(r=!1!==i.onDropPointDragOver(n)&&r),"dragenter"===t&&(r=!1!==i.onDropPointDragEnter(n,1)&&r),"dragleave"===t&&(r=!1!==i.onDropPointDragLeave(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-treenode-droppoint-active ui-state-highlight":0})],function(e,t){e(t,1,0,"ui-treenode-droppoint",e(t,2,0,t.component.draghoverNext))},null)}function kn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,21,"td",[["class","ui-treenode-connector"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275eld"](2,0,null,null,18,"table",[["class","ui-treenode-connector-table"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275eld"](4,0,null,null,15,"tbody",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                    "])),(e()(),al["\u0275eld"](6,0,null,null,5,"tr",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                        "])),(e()(),al["\u0275eld"](8,0,null,null,2,"td",[],null,null,null,null,null)),al["\u0275did"](9,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](10,{"ui-treenode-connector-line":0}),(e()(),al["\u0275ted"](-1,null,["\n                                    "])),(e()(),al["\u0275ted"](-1,null,["\n                                    "])),(e()(),al["\u0275eld"](13,0,null,null,5,"tr",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                        "])),(e()(),al["\u0275eld"](15,0,null,null,2,"td",[],null,null,null,null,null)),al["\u0275did"](16,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](17,{"ui-treenode-connector-line":0}),(e()(),al["\u0275ted"](-1,null,["\n                                    "])),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){var n=t.component;e(t,9,0,e(t,10,0,!n.firstChild)),e(t,16,0,e(t,17,0,!n.lastChild))},null)}function Dn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"span",[["class","ui-tree-toggler fa fa-fw"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.toggle(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"fa-plus":0,"fa-minus":1})],function(e,t){var n=t.component;e(t,1,0,"ui-tree-toggler fa fa-fw",e(t,2,0,!n.node.expanded,n.node.expanded))},null)}function In(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"span",[],[[8,"className",0]],null,null,null,null))],null,function(e,t){e(t,0,0,t.component.getIcon())})}function Rn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.node.label)})}function Mn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                            "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-treeNodeTemplateLoader",[],null,null,null,vn,uh)),al["\u0275did"](3,245760,null,0,lh.TreeNodeTemplateLoader,[al.ViewContainerRef],{node:[0,"node"],template:[1,"template"]},null),(e()(),al["\u0275ted"](-1,null,["\n                                        "]))],function(e,t){var n=t.component;e(t,3,0,n.node,n.tree.getTemplateForNode(n.node))},null)}function Pn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-treeNode",[],null,null,null,Fn,ch)),al["\u0275did"](1,114688,null,0,lh.UITreeNode,[lh.Tree],{node:[0,"node"],firstChild:[1,"firstChild"],lastChild:[2,"lastChild"]},null)],function(e,t){e(t,1,0,t.context.$implicit,t.context.first,t.context.last)},null)}function Nn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,7,"td",[["class","ui-treenode-children-container"]],[[4,"display",null]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275eld"](2,0,null,null,4,"div",[["class","ui-treenode-children"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Pn)),al["\u0275did"](5,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,5,0,t.component.node.children)},function(e,t){e(t,0,0,t.component.node.expanded?"table-cell":"none")})}function An(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,36,"table",[],[[8,"className",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,33,"tbody",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](4,0,null,null,30,"tr",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,kn)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275eld"](9,0,null,null,21,"td",[["class","ui-treenode"]],null,null,null,null,null)),al["\u0275did"](10,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](11,{"ui-treenode-collapsed":0}),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275eld"](13,0,null,null,16,"div",[["class","ui-treenode-content ui-state-default ui-corner-all"]],null,[[null,"click"],[null,"contextmenu"],[null,"touchend"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.onNodeClick(n)&&r),"contextmenu"===t&&(r=!1!==i.onNodeRightClick(n)&&r),"touchend"===t&&(r=!1!==i.onNodeTouchEnd()&&r),r},null,null)),al["\u0275did"](14,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](15,{"ui-treenode-selectable":0,"ui-state-highlight":1}),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Dn)),al["\u0275did"](18,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275and"](16777216,null,null,1,null,In)),al["\u0275did"](20,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275eld"](21,0,null,null,7,"span",[["class","ui-treenode-label ui-corner-all"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Rn)),al["\u0275did"](24,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Mn)),al["\u0275did"](27,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                                "])),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Nn)),al["\u0275did"](33,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,7,0,!n.root),e(t,10,0,"ui-treenode",e(t,11,0,!n.node.expanded)),e(t,14,0,"ui-treenode-content ui-state-default ui-corner-all",e(t,15,0,n.tree.selectionMode,n.isSelected())),e(t,18,0,!n.isLeaf()),e(t,20,0,n.node.icon||n.node.expandedIcon||n.node.collapsedIcon),e(t,24,0,!n.tree.getTemplateForNode(n.node)),e(t,27,0,n.tree.getTemplateForNode(n.node)),e(t,33,0,n.node.children&&n.node.expanded)},function(e,t){e(t,0,0,t.component.node.styleClass)})}function Ln(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,bn)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,On)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Tn)),al["\u0275did"](8,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,An)),al["\u0275did"](11,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,2,0,n.tree.droppableNodes),e(t,5,0,!n.tree.horizontal),e(t,8,0,n.tree.droppableNodes&&n.lastChild),e(t,11,0,n.tree.horizontal)},null)}function Fn(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ln)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){e(t,2,0,t.component.node)},null)}function jn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"div",[["class","ui-tree-loading-mask ui-widget-overlay"]],null,null,null,null,null))],null,null)}function Vn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-tree-loading-content"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "]))],null,function(e,t){e(t,2,0,"fa fa-spin fa-2x "+t.component.loadingIcon)})}function zn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-treeNode",[],null,null,null,Fn,ch)),al["\u0275did"](1,114688,null,0,lh.UITreeNode,[lh.Tree],{node:[0,"node"],index:[1,"index"],firstChild:[2,"firstChild"],lastChild:[3,"lastChild"]},null)],function(e,t){e(t,1,0,t.context.$implicit,t.context.index,t.context.first,t.context.last)},null)}function Bn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,16,"div",[],null,[[null,"drop"],[null,"dragover"],[null,"dragenter"],[null,"dragleave"]],function(e,t,n){var r=!0,i=e.component;return"drop"===t&&(r=!1!==i.onDrop(n)&&r),"dragover"===t&&(r=!1!==i.onDragOver(n)&&r),"dragenter"===t&&(r=!1!==i.onDragEnter(n)&&r),"dragleave"===t&&(r=!1!==i.onDragLeave(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-tree ui-widget ui-widget-content ui-corner-all":0,"ui-tree-selectable":1,"ui-treenode-dragover":2,"ui-tree-loading":3}),al["\u0275did"](3,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,jn)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Vn)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](11,0,null,null,4,"ul",[["class","ui-tree-container"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,zn)),al["\u0275did"](14,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,1,0,n.styleClass,e(t,2,0,!0,n.selectionMode,n.dragHover,n.loading)),e(t,3,0,n.style),e(t,6,0,n.loading),e(t,9,0,n.loading),e(t,14,0,n.value)},null)}function Hn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"div",[["class","ui-tree-loading ui-widget-overlay"]],null,null,null,null,null))],null,null)}function Wn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-tree-loading-content"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "]))],null,function(e,t){e(t,2,0,"fa fa-spin fa-2x "+t.component.loadingIcon)})}function qn(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"table",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,1,"p-treeNode",[],null,null,null,Fn,ch)),al["\u0275did"](3,114688,null,0,lh.UITreeNode,[lh.Tree],{node:[0,"node"],root:[1,"root"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,3,0,t.component.value[0],!0)},null)}function Un(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,13,"div",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-tree ui-tree-horizontal ui-widget ui-widget-content ui-corner-all":0,"ui-tree-selectable":1}),al["\u0275did"](3,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Hn)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Wn)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,qn)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,1,0,n.styleClass,e(t,2,0,!0,n.selectionMode)),e(t,3,0,n.style),e(t,6,0,n.loading),e(t,9,0,n.loading),e(t,12,0,n.value&&n.value[0])},null)}function Gn(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Bn)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Un)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,2,0,!n.horizontal),e(t,5,0,n.horizontal)},null)}function Kn(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,55,"mat-card",[["class","metadata-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](2,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n  "])),(e()(),al["\u0275eld"](4,0,null,0,12,"mat-toolbar",[["class","metadata-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](5,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,1,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](8,0,null,0,2,"mat-icon",[["class","example-icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](9,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](12,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["METADATA GUIDE"])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](15,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n  "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275eld"](18,0,null,0,36,"div",[["class","metadata-content-area"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](20,0,null,null,33,"div",[["class","metadata-tree"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](22,0,null,null,6,"div",[["class","metadata-all"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](24,0,null,null,3,"p-tree",[["selectionMode","single"]],null,[[null,"onNodeSelect"]],function(e,t,n){var r=!0;return"onNodeSelect"===t&&(r=!1!==e.component.nodeSelectAll(n)&&r),r},Gn,dh)),al["\u0275did"](25,1294336,null,1,lh.Tree,[[2,sh.TreeDragDropService]],{value:[0,"value"],selectionMode:[1,"selectionMode"],style:[2,"style"]},{onNodeSelect:"onNodeSelect"}),al["\u0275qud"](603979776,2,{templates:1}),al["\u0275pod"](27,{width:0,border:1,"font-family":2,"font-size":3,"font-weight":4}),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](30,0,null,null,6,"div",[["class","metadata-datasets"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](32,0,null,null,3,"p-tree",[["selectionMode","single"]],null,[[null,"onNodeSelect"]],function(e,t,n){var r=!0;return"onNodeSelect"===t&&(r=!1!==e.component.nodeSelectDataset(n)&&r),r},Gn,dh)),al["\u0275did"](33,1294336,null,1,lh.Tree,[[2,sh.TreeDragDropService]],{value:[0,"value"],selectionMode:[1,"selectionMode"],style:[2,"style"]},{onNodeSelect:"onNodeSelect"}),al["\u0275qud"](603979776,3,{templates:1}),al["\u0275pod"](35,{width:0,border:1,"font-family":2,"font-size":3,"font-weight":4}),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](38,0,null,null,6,"div",[["class","metadata-datatypes"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](40,0,null,null,3,"p-tree",[["selectionMode","single"]],null,null,null,Gn,dh)),al["\u0275did"](41,1294336,null,1,lh.Tree,[[2,sh.TreeDragDropService]],{value:[0,"value"],selectionMode:[1,"selectionMode"],style:[2,"style"]},null),al["\u0275qud"](603979776,4,{templates:1}),al["\u0275pod"](43,{width:0,border:1,"font-family":2,"font-size":3,"font-weight":4}),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275eld"](46,0,null,null,6,"div",[["class","metadata-index"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n          "])),(e()(),al["\u0275eld"](48,0,null,null,3,"p-tree",[["selectionMode","single"]],null,null,null,Gn,dh)),al["\u0275did"](49,1294336,null,1,lh.Tree,[[2,sh.TreeDragDropService]],{value:[0,"value"],selectionMode:[1,"selectionMode"],style:[2,"style"]},null),al["\u0275qud"](603979776,5,{templates:1}),al["\u0275pod"](51,{width:0,border:1,"font-family":2,"font-size":3,"font-weight":4}),(e()(),al["\u0275ted"](-1,null,["\n      "])),(e()(),al["\u0275ted"](-1,null,["\n\n    "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,0,["\n  "])),(e()(),al["\u0275ted"](-1,0,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,5,0,"primary"),e(t,9,0),e(t,25,0,n.nodesAll,"single",e(t,27,0,"100%","none","Roboto Mono","0.80rem","500")),e(t,33,0,n.nodesDatasets,"single",e(t,35,0,"100%","none","Roboto Mono","0.80rem","500")),e(t,41,0,n.nodesDatatypes,"single",e(t,43,0,"100%","none","Roboto Mono","0.80rem","500")),e(t,49,0,n.nodesIndexes,"single",e(t,51,0,"100%","none","Roboto Mono","0.80rem","500"))},function(e,t){e(t,4,0,al["\u0275nov"](t,5)._toolbarRows.length,!al["\u0275nov"](t,5)._toolbarRows.length)})}function $n(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{host:0}),(e()(),al["\u0275eld"](1,0,[[1,0],["host",1]],null,0,"textarea",[["class","code"]],null,null,null,null,null))],null,null)}function Zn(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,39,"mat-card",[["class","input-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](2,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n\t "])),(e()(),al["\u0275eld"](4,0,null,0,12,"mat-toolbar",[["class","input-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](5,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,1,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n\t\t\t"])),(e()(),al["\u0275eld"](8,0,null,0,2,"mat-icon",[["class","toolbar-icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](9,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n\t\t\t"])),(e()(),al["\u0275eld"](12,0,null,0,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["INPUT: SQL++"])),(e()(),al["\u0275ted"](-1,0,["\t\n\t\t\t"])),(e()(),al["\u0275eld"](15,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275eld"](18,0,null,0,12,"mat-card-content",[["class","content-area mat-card-content"]],null,null,null,null,null)),al["\u0275did"](19,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275eld"](21,0,null,null,8,"div",[["class","codemirror-container"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"])),(e()(),al["\u0275eld"](23,0,null,null,5,"codemirror",[["class","code"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"ngModelChange"]],function(e,t,n){var r=!0;return"ngModelChange"===t&&(r=!1!==(e.component.queryString=n)&&r),r},$n,mh)),al["\u0275did"](24,4374528,[["host",4]],0,hh,[],{config:[0,"config"]},null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[hh]),al["\u0275did"](26,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](28,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275ted"](-1,null,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275eld"](32,0,null,0,7,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](33,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275eld"](35,0,null,null,3,"button",[["class","query-button mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onClick()&&r),r},J,nc)),al["\u0275did"](36,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](37,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["RUN"])),(e()(),al["\u0275ted"](-1,null,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,5,0,"primary"),e(t,9,0),e(t,24,0,n.codemirrorConfig),e(t,26,0,n.queryString)},function(e,t){e(t,4,0,al["\u0275nov"](t,5)._toolbarRows.length,!al["\u0275nov"](t,5)._toolbarRows.length),e(t,23,0,al["\u0275nov"](t,28).ngClassUntouched,al["\u0275nov"](t,28).ngClassTouched,al["\u0275nov"](t,28).ngClassPristine,al["\u0275nov"](t,28).ngClassDirty,al["\u0275nov"](t,28).ngClassValid,al["\u0275nov"](t,28).ngClassInvalid,al["\u0275nov"](t,28).ngClassPending),e(t,32,0,"end"===al["\u0275nov"](t,33).align),e(t,35,0,al["\u0275nov"](t,36).disabled||null)})}function Qn(e){return al["\u0275vid"](0,[],null,null)}function Yn(e){return al["\u0275vid"](0,[],null,null)}function Xn(e){return al["\u0275vid"](0,[],null,null)}function Jn(e){return al["\u0275vid"](0,[],null,null)}function er(e){return al["\u0275vid"](0,[],null,null)}function tr(e){return al["\u0275vid"](0,[],null,null)}function nr(e){return al["\u0275vid"](0,[],null,null)}function rr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"option",[],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.placeholder)})}function ir(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"option",[],[[8,"value",0],[8,"selected",0]],null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,0,0,t.context.$implicit.value,t.component.selectedOption==t.context.$implicit),e(t,1,0,t.context.$implicit.label)})}function or(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,10,"div",[["class","ui-helper-hidden-accessible"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,7,"select",[["aria-hidden","true"],["tabindex","-1"]],[[8,"required",0],[1,"name",0],[1,"aria-label",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,rr)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ir)),al["\u0275did"](8,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,5,0,n.placeholder),e(t,8,0,n.options)},function(e,t){var n=t.component;e(t,2,0,n.required,n.name,n.selectedOption?n.selectedOption.label:" ")})}function lr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"label",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{"ui-dropdown-label ui-inputtext ui-corner-all":0,"ui-dropdown-label-empty":1}),(e()(),al["\u0275ted"](3,null,["",""]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,!0,null==n.label||0===n.label.length))},function(e,t){e(t,3,0,t.component.label||"empty")})}function ar(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"label",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{"ui-dropdown-label ui-inputtext ui-corner-all ui-placeholder":0,"ui-dropdown-label-empty":1}),(e()(),al["\u0275ted"](3,null,["",""]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,!0,null==n.placeholder||0===n.placeholder.length))},function(e,t){e(t,3,0,t.component.placeholder||"empty")})}function sr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[[6,0],["editableInput",1]],null,0,"input",[["class","ui-dropdown-label ui-inputtext ui-corner-all"],["type","text"]],[[1,"aria-label",0],[8,"disabled",0],[1,"placeholder",0]],[[null,"click"],[null,"input"],[null,"focus"],[null,"blur"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.onEditableInputClick(n)&&r),"input"===t&&(r=!1!==i.onEditableInputChange(n)&&r),"focus"===t&&(r=!1!==i.onEditableInputFocus(n)&&r),"blur"===t&&(r=!1!==i.onInputBlur(n)&&r),r},null,null))],null,function(e,t){var n=t.component;e(t,0,0,n.selectedOption?n.selectedOption.label:" ",n.disabled,n.placeholder)})}function ur(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,5,"div",[["class","ui-dropdown-filter-container"]],null,[[null,"input"],[null,"click"]],function(e,t,n){var r=!0;return"input"===t&&(r=!1!==e.component.onFilter(n)&&r),"click"===t&&(r=!1!==n.stopPropagation()&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](2,0,[[4,0],["filter",1]],null,0,"input",[["autocomplete","off"],["class","ui-dropdown-filter ui-inputtext ui-widget ui-state-default ui-corner-all"],["type","text"]],[[1,"placeholder",0]],[[null,"keydown.enter"],[null,"keydown"]],function(e,t,n){var r=!0,i=e.component;return"keydown.enter"===t&&(r=!1!==n.preventDefault()&&r),"keydown"===t&&(r=!1!==i.onKeydown(n)&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](4,0,null,null,0,"span",[["class","fa fa-search"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "]))],null,function(e,t){e(t,2,0,t.component.filterPlaceholder)})}function cr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.parent.context.$implicit.label||"empty")})}function dr(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](0,null,null,0))],null,null)}function pr(e){return al["\u0275vid"](0,[(e()(),al["\u0275and"](16777216,null,null,1,null,dr)),al["\u0275did"](1,212992,null,0,ah.TemplateWrapper,[al.ViewContainerRef],{item:[0,"item"],templateRef:[1,"templateRef"]},null),(e()(),al["\u0275and"](0,null,null,0))],function(e,t){e(t,1,0,t.parent.context.$implicit,t.component.itemTemplate)},null)}function fr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,9,"li",[],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onItemClick(n,e.context.$implicit)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{"ui-dropdown-item ui-corner-all":0,"ui-state-highlight":1,"ui-dropdown-item-empty":2}),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,cr)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,pr)),al["\u0275did"](8,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,!0,n.selectedOption==t.context.$implicit,!t.context.$implicit.label||0===t.context.$implicit.label.length)),e(t,5,0,!n.itemTemplate),e(t,8,0,n.itemTemplate)},null)}function hr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"ul",[["class","ui-dropdown-items ui-dropdown-list ui-widget-content ui-widget ui-corner-all ui-helper-reset"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,fr)),al["\u0275did"](3,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "]))],function(e,t){e(t,3,0,t.component.optionsToDisplay)},null)}function mr(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{containerViewChild:0}),al["\u0275qud"](402653184,2,{panelViewChild:0}),al["\u0275qud"](402653184,3,{itemsWrapperViewChild:0}),al["\u0275qud"](671088640,4,{filterViewChild:0}),al["\u0275qud"](402653184,5,{focusViewChild:0}),al["\u0275qud"](671088640,6,{editableInputViewChild:0}),(e()(),al["\u0275ted"](-1,null,["\n         "])),(e()(),al["\u0275eld"](7,0,[[1,0],["container",1]],null,41,"div",[],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onMouseclick(n)&&r),r},null,null)),al["\u0275did"](8,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](9,{"ui-dropdown ui-widget ui-state-default ui-corner-all ui-helper-clearfix":0,"ui-state-disabled":1,"ui-dropdown-open":2,"ui-state-focus":3}),al["\u0275did"](10,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,or)),al["\u0275did"](13,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](15,0,null,null,3,"div",[["class","ui-helper-hidden-accessible"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](17,0,[[5,0],["in",1]],null,0,"input",[["readonly",""],["role","listbox"],["type","text"]],[[1,"id",0],[1,"aria-label",0],[8,"disabled",0],[1,"tabindex",0],[1,"autofocus",0]],[[null,"focus"],[null,"blur"],[null,"keydown"]],function(e,t,n){var r=!0,i=e.component;return"focus"===t&&(r=!1!==i.onInputFocus(n)&&r),"blur"===t&&(r=!1!==i.onInputBlur(n)&&r),"keydown"===t&&(r=!1!==i.onKeydown(n)&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,lr)),al["\u0275did"](21,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ar)),al["\u0275did"](24,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,sr)),al["\u0275did"](27,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](29,0,null,null,4,"div",[["class","ui-dropdown-trigger ui-state-default ui-corner-right"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](31,0,null,null,1,"span",[["class","ui-clickable"]],null,null,null,null,null)),al["\u0275did"](32,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](35,0,[[2,0],["panel",1]],null,12,"div",[],[[24,"@panelState",0],[4,"display",null]],null,null,null,null)),al["\u0275did"](36,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275did"](37,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ur)),al["\u0275did"](40,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](42,0,[[3,0],["itemswrapper",1]],null,4,"div",[["class","ui-dropdown-items-wrapper"]],[[4,"max-height",null]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,hr)),al["\u0275did"](45,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,8,0,n.styleClass,e(t,9,0,!0,n.disabled,n.panelVisible,n.focus)),e(t,10,0,n.style),e(t,13,0,n.autoWidth),e(t,21,0,!n.editable&&null!=n.label),e(t,24,0,!n.editable&&null==n.label),e(t,27,0,n.editable),e(t,32,0,"ui-clickable",n.dropdownIcon),e(t,36,0,n.panelStyleClass,"ui-dropdown-panel ui-widget-content ui-corner-all ui-shadow"),e(t,37,0,n.panelStyle),e(t,40,0,n.filter),e(t,45,0,!n.lazy||n.panelVisible)},function(e,t){var n=t.component;e(t,17,0,n.inputId,n.selectedOption?n.selectedOption.label:" ",n.disabled,n.tabindex,n.autofocus),e(t,35,0,n.panelVisible?"visible":"hidden",n.panelVisible?"block":"none"),e(t,42,0,n.scrollHeight||"auto")})}function gr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"a",[["class","ui-paginator-page ui-paginator-element ui-state-default ui-corner-all"],["href","#"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.onPageLinkClick(n,e.context.$implicit-1)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-state-active":0}),(e()(),al["\u0275ted"](3,null,["",""]))],function(e,t){e(t,1,0,"ui-paginator-page ui-paginator-element ui-state-default ui-corner-all",e(t,2,0,t.context.$implicit-1==t.component.getPage()))},function(e,t){e(t,3,0,t.context.$implicit)})}function yr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,8,"p-dropdown",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"ngModelChange"],[null,"onChange"]],function(e,t,n){var r=!0,i=e.component;return"ngModelChange"===t&&(r=!1!==(i.rows=n)&&r),"onChange"===t&&(r=!1!==i.onRppChange(n)&&r),r},mr,Ih)),al["\u0275prd"](512,null,kh.DomHandler,kh.DomHandler,[]),al["\u0275prd"](512,null,Dh.ObjectUtils,Dh.ObjectUtils,[]),al["\u0275did"](3,13877248,null,1,Oh.Dropdown,[al.ElementRef,kh.DomHandler,al.Renderer2,al.ChangeDetectorRef,Dh.ObjectUtils,al.NgZone],{autoWidth:[0,"autoWidth"],lazy:[1,"lazy"],options:[2,"options"]},{onChange:"onChange"}),al["\u0275qud"](603979776,1,{templates:1}),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Oh.Dropdown]),al["\u0275did"](6,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](8,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null)],function(e,t){var n=t.component;e(t,3,0,!1,!1,n.rowsPerPageItems),e(t,6,0,n.rows)},function(e,t){e(t,0,0,al["\u0275nov"](t,8).ngClassUntouched,al["\u0275nov"](t,8).ngClassTouched,al["\u0275nov"](t,8).ngClassPristine,al["\u0275nov"](t,8).ngClassDirty,al["\u0275nov"](t,8).ngClassValid,al["\u0275nov"](t,8).ngClassInvalid,al["\u0275nov"](t,8).ngClassPending)})}function vr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,40,"div",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275did"](2,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](4,0,null,null,5,"a",[["class","ui-paginator-first ui-paginator-element ui-state-default ui-corner-all"],["href","#"]],[[8,"tabIndex",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.changePageToFirst(n)&&r),r},null,null)),al["\u0275did"](5,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](6,{"ui-state-disabled":0}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](8,0,null,null,0,"span",[["class","fa fa-step-backward"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](11,0,null,null,5,"a",[["class","ui-paginator-prev ui-paginator-element ui-state-default ui-corner-all"],["href","#"]],[[8,"tabIndex",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.changePageToPrev(n)&&r),r},null,null)),al["\u0275did"](12,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](13,{"ui-state-disabled":0}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](15,0,null,null,0,"span",[["class","fa fa-backward"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](18,0,null,null,4,"span",[["class","ui-paginator-pages"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,gr)),al["\u0275did"](21,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](24,0,null,null,5,"a",[["class","ui-paginator-next ui-paginator-element ui-state-default ui-corner-all"],["href","#"]],[[8,"tabIndex",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.changePageToNext(n)&&r),r},null,null)),al["\u0275did"](25,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](26,{"ui-state-disabled":0}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](28,0,null,null,0,"span",[["class","fa fa-forward"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](31,0,null,null,5,"a",[["class","ui-paginator-last ui-paginator-element ui-state-default ui-corner-all"],["href","#"]],[[8,"tabIndex",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.changePageToLast(n)&&r),r},null,null)),al["\u0275did"](32,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](33,{"ui-state-disabled":0}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](35,0,null,null,0,"span",[["class","fa fa-step-forward"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,yr)),al["\u0275did"](39,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,1,0,n.styleClass,"ui-paginator ui-widget ui-widget-header ui-unselectable-text"),e(t,2,0,n.style),e(t,5,0,"ui-paginator-first ui-paginator-element ui-state-default ui-corner-all",e(t,6,0,n.isFirstPage())),e(t,12,0,"ui-paginator-prev ui-paginator-element ui-state-default ui-corner-all",e(t,13,0,n.isFirstPage())),e(t,21,0,n.pageLinks),e(t,25,0,"ui-paginator-next ui-paginator-element ui-state-default ui-corner-all",e(t,26,0,n.isLastPage())),e(t,32,0,"ui-paginator-last ui-paginator-element ui-state-default ui-corner-all",e(t,33,0,n.isLastPage())),e(t,39,0,n.rowsPerPageOptions)},function(e,t){var n=t.component;e(t,4,0,n.isFirstPage()?-1:null),e(t,11,0,n.isFirstPage()?-1:null),e(t,24,0,n.isLastPage()?-1:null),e(t,31,0,n.isLastPage()?-1:null)})}function br(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,vr)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,2,0,!!n.alwaysShow||n.pageLinks&&n.pageLinks.length>1)},null)}function _r(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](1,0,null,null,15,"div",[["class","ui-radiobutton ui-widget"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](3,0,null,null,3,"div",[["class","ui-helper-hidden-accessible"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](5,0,null,null,0,"input",[["type","radio"]],[[8,"checked",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](8,0,null,null,7,"div",[["class","ui-radiobutton-box ui-widget ui-radiobutton-relative ui-state-default"]],null,[[null,"click"],[null,"mouseenter"],[null,"mouseleave"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.handleClick(n)&&r),"mouseenter"===t&&(r=0!=(i.hover=!0)&&r),"mouseleave"===t&&(r=0!=(i.hover=!1)&&r),r},null,null)),al["\u0275did"](9,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](10,{"ui-state-hover":0,"ui-state-active":1}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](12,0,null,null,2,"span",[["class","ui-radiobutton-icon ui-clickable"]],null,null,null,null,null)),al["\u0275did"](13,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](14,{"fa fa-circle":0}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,9,0,"ui-radiobutton-box ui-widget ui-radiobutton-relative ui-state-default",e(t,10,0,n.hover,n.checked)),e(t,13,0,"ui-radiobutton-icon ui-clickable",e(t,14,0,n.checked))},function(e,t){e(t,5,0,t.component.checked)})}function wr(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](1,0,null,null,15,"div",[["class","ui-chkbox ui-widget"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](3,0,null,null,3,"div",[["class","ui-helper-hidden-accessible"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](5,0,null,null,0,"input",[["type","checkbox"]],[[8,"checked",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](8,0,null,null,7,"div",[["class","ui-chkbox-box ui-widget ui-corner-all ui-state-default"]],null,[[null,"click"],[null,"mouseover"],[null,"mouseout"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.handleClick(n)&&r),"mouseover"===t&&(r=0!=(i.hover=!0)&&r),"mouseout"===t&&(r=0!=(i.hover=!1)&&r),r},null,null)),al["\u0275did"](9,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](10,{"ui-state-hover":0,"ui-state-active":1,"ui-state-disabled":2}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](12,0,null,null,2,"span",[["class","ui-chkbox-icon ui-clickable"]],null,null,null,null,null)),al["\u0275did"](13,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](14,{"fa fa-check":0}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,9,0,"ui-chkbox-box ui-widget ui-corner-all ui-state-default",e(t,10,0,n.hover&&!n.disabled,n.checked&&!n.disabled,n.disabled)),e(t,13,0,"ui-chkbox-icon ui-clickable",e(t,14,0,n.checked))},function(e,t){e(t,5,0,t.component.checked)})}function xr(e){return al["\u0275vid"](0,[],null,null)}function Cr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"span",[["class","ui-column-resizer ui-clickable"]],null,[[null,"mousedown"]],function(e,t,n){var r=!0;return"mousedown"===t&&(r=!1!==e.component.dt.initColumnResize(n)&&r),r},null,null))],null,null)}function Er(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","ui-column-title"]],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.parent.context.$implicit.header)})}function Sr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"span",[["class","ui-column-title"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-columnHeaderTemplateLoader",[],null,null,null,Xn,_h)),al["\u0275did"](3,245760,null,0,ah.ColumnHeaderTemplateLoader,[al.ViewContainerRef],{column:[0,"column"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "]))],function(e,t){e(t,3,0,t.parent.context.$implicit)},null)}function Or(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,2,"span",[["class","ui-sortable-column-icon fa fa-fw fa-sort"]],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"fa-sort-desc":0,"fa-sort-asc":1})],function(e,t){var n=t.component;e(t,1,0,"ui-sortable-column-icon fa fa-fw fa-sort",e(t,2,0,-1==n.dt.getSortOrder(t.parent.context.$implicit),1==n.dt.getSortOrder(t.parent.context.$implicit)))},null)}function Tr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"input",[["class","ui-column-filter ui-inputtext ui-widget ui-state-default ui-corner-all"]],[[1,"type",0],[1,"maxlength",0],[1,"placeholder",0],[8,"value",0]],[[null,"click"],[null,"input"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.dt.onFilterInputClick(n)&&r),"input"===t&&(r=!1!==i.dt.onFilterKeyup(n.target.value,e.parent.context.$implicit.filterField||e.parent.context.$implicit.field,e.parent.context.$implicit.filterMatchMode)&&r),r},null,null))],null,function(e,t){var n=t.component;e(t,0,0,t.parent.context.$implicit.filterType,t.parent.context.$implicit.filterMaxlength,t.parent.context.$implicit.filterPlaceholder,n.dt.filters[t.parent.context.$implicit.filterField||t.parent.context.$implicit.field]?n.dt.filters[t.parent.context.$implicit.filterField||t.parent.context.$implicit.field].value:"")})}function kr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,16777216,null,null,1,"p-columnFilterTemplateLoader",[],null,null,null,er,xh)),al["\u0275did"](1,245760,null,0,ah.ColumnFilterTemplateLoader,[al.ViewContainerRef],{column:[0,"column"]},null),(e()(),al["\u0275and"](0,null,null,0))],function(e,t){e(t,1,0,t.parent.context.$implicit)},null)}function Dr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-dtCheckbox",[],null,[[null,"onChange"]],function(e,t,n){var r=!0;return"onChange"===t&&(r=!1!==e.component.dt.toggleRowsWithCheckbox(n)&&r),r},wr,Ph)),al["\u0275did"](1,49152,null,0,Sh.DTCheckbox,[],{checked:[0,"checked"],disabled:[1,"disabled"]},{onChange:"onChange"})],function(e,t){var n=t.component;e(t,1,0,n.dt.allSelected,n.dt.isEmpty())},null)}function Ir(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](1,0,[["headerCell",1]],null,25,"th",[],[[1,"id",0],[1,"colspan",0],[1,"rowspan",0],[1,"tabindex",0],[1,"scope",0]],[[null,"click"],[null,"dragstart"],[null,"dragleave"],[null,"drop"],[null,"mousedown"],[null,"keydown"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.dt.sort(n,e.context.$implicit)&&r),"dragstart"===t&&(r=!1!==i.dt.onColumnDragStart(n)&&r),"dragleave"===t&&(r=!1!==i.dt.onColumnDragleave(n)&&r),"drop"===t&&(r=!1!==i.dt.onColumnDrop(n)&&r),"mousedown"===t&&(r=!1!==i.dt.onHeaderMousedown(n,al["\u0275nov"](e,1))&&r),"keydown"===t&&(r=!1!==i.dt.onHeaderKeydown(n,e.context.$implicit)&&r),r},null,null)),al["\u0275did"](2,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](3,{"ui-state-default ui-unselectable-text":0,"ui-sortable-column":1,"ui-state-active":2,"ui-resizable-column":3,"ui-selection-column":4,"ui-helper-hidden":5}),al["\u0275did"](4,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Cr)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Er)),al["\u0275did"](10,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Sr)),al["\u0275did"](13,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Or)),al["\u0275did"](16,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Tr)),al["\u0275did"](19,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,kr)),al["\u0275did"](22,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Dr)),al["\u0275did"](25,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,2,0,t.context.$implicit.headerStyleClass||t.context.$implicit.styleClass,e(t,3,0,!0,t.context.$implicit.sortable,n.dt.isSorted(t.context.$implicit),n.dt.resizableColumns,t.context.$implicit.selectionMode,t.context.$implicit.hidden)),e(t,4,0,t.context.$implicit.headerStyle||t.context.$implicit.style),e(t,7,0,n.dt.resizableColumns&&("fit"==n.dt.columnResizeMode&&!t.context.last||"expand"==n.dt.columnResizeMode)),e(t,10,0,!t.context.$implicit.selectionMode&&!t.context.$implicit.headerTemplate),e(t,13,0,t.context.$implicit.headerTemplate),e(t,16,0,t.context.$implicit.sortable),e(t,19,0,t.context.$implicit.filter&&!t.context.$implicit.filterTemplate),e(t,22,0,t.context.$implicit.filter&&t.context.$implicit.filterTemplate),e(t,25,0,"multiple"==t.context.$implicit.selectionMode&&!0===n.dt.showHeaderCheckbox)},function(e,t){e(t,1,0,t.context.$implicit.colId,t.context.$implicit.colspan,t.context.$implicit.rowspan,t.context.$implicit.sortable?t.component.tabindex:null,t.context.$implicit.scope||(t.context.$implicit.colspan?"colgroup":"col"))})}function Rr(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ir)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){e(t,2,0,t.component.columns)},null)}function Mr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","ui-column-footer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.parent.context.$implicit.footer)})}function Pr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"span",[["class","ui-column-footer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-columnFooterTemplateLoader",[],null,null,null,Jn,wh)),al["\u0275did"](3,245760,null,0,ah.ColumnFooterTemplateLoader,[al.ViewContainerRef],{column:[0,"column"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,3,0,t.parent.context.$implicit)},null)}function Nr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,10,"td",[],[[1,"colspan",0],[1,"rowspan",0]],null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-state-default":0,"ui-helper-hidden":1}),al["\u0275did"](3,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Mr)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Pr)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){e(t,1,0,t.context.$implicit.footerStyleClass||t.context.$implicit.styleClass,e(t,2,0,!0,t.context.$implicit.hidden)),e(t,3,0,t.context.$implicit.footerStyle||t.context.$implicit.style),e(t,6,0,!t.context.$implicit.footerTemplate),e(t,9,0,t.context.$implicit.footerTemplate)},function(e,t){e(t,0,0,t.context.$implicit.colspan,t.context.$implicit.rowspan)})}function Ar(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Nr)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){e(t,2,0,t.component.columns)},null)}function Lr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"a",[["href","#"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.dt.toggleRowGroup(n,e.parent.parent.context.$implicit)&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275eld"](2,0,null,null,1,"span",[["class","fa fa-fw"]],null,null,null,null,null)),al["\u0275did"](3,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "]))],function(e,t){var n=t.component;e(t,3,0,"fa fa-fw",n.dt.isRowGroupExpanded(t.parent.parent.context.$implicit)?n.dt.expandedIcon:n.dt.collapsedIcon)},null)}function Fr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[["rowGroupElement",1]],null,15,"tr",[["class","ui-widget-header ui-rowgroup-header"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.dt.onRowGroupClick(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](2,{cursor:0}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](4,0,null,null,10,"td",[],[[1,"colspan",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Lr)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](9,0,null,null,4,"span",[["class","ui-rowgroup-header-name"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275eld"](11,16777216,null,null,1,"p-templateLoader",[],null,null,null,nr,Eh)),al["\u0275did"](12,245760,null,0,ah.TemplateLoader,[al.ViewContainerRef],{template:[0,"template"],data:[1,"data"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,n.dt.sortableRowGroup?"pointer":"auto")),e(t,7,0,n.dt.expandableRowGroups),e(t,12,0,n.dt.rowGroupHeaderTemplate,t.parent.context.$implicit)},function(e,t){e(t,4,0,t.component.dt.visibleColumns().length)})}function jr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","ui-column-title"]],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.parent.parent.context.$implicit.header)})}function Vr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[["class","ui-cell-data"]],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.dt.resolveFieldData(t.parent.parent.parent.parent.context.$implicit,t.parent.parent.context.$implicit.field))})}function zr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"span",[["class","ui-cell-data"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-columnBodyTemplateLoader",[],null,null,null,Yn,bh)),al["\u0275did"](3,770048,null,0,ah.ColumnBodyTemplateLoader,[al.ViewContainerRef],{column:[0,"column"],rowData:[1,"rowData"],rowIndex:[2,"rowIndex"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,3,0,t.parent.parent.context.$implicit,t.parent.parent.parent.parent.context.$implicit,t.parent.parent.parent.parent.context.index+t.component.dt.first)},null)}function Br(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,5,"input",[["class","ui-inputtext ui-widget ui-state-default ui-corner-all"],["type","text"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"ngModelChange"],[null,"keydown"],[null,"blur"],[null,"input"],[null,"change"],[null,"compositionstart"],[null,"compositionend"]],function(e,t,n){var r=!0,i=e.component;return"input"===t&&(r=!1!==al["\u0275nov"](e,1)._handleInput(n.target.value)&&r),"blur"===t&&(r=!1!==al["\u0275nov"](e,1).onTouched()&&r),"compositionstart"===t&&(r=!1!==al["\u0275nov"](e,1)._compositionStart()&&r),"compositionend"===t&&(r=!1!==al["\u0275nov"](e,1)._compositionEnd(n.target.value)&&r),"ngModelChange"===t&&(r=!1!==(e.parent.parent.parent.parent.parent.context.$implicit[e.parent.parent.parent.context.$implicit.field]=n)&&r),"keydown"===t&&(r=!1!==i.dt.onCellEditorKeydown(n,e.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.index)&&r),"blur"===t&&(r=!1!==i.dt.onCellEditorBlur(n,e.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.index)&&r),"input"===t&&(r=!1!==i.dt.onCellEditorInput(n,e.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.index)&&r),"change"===t&&(r=!1!==i.dt.onCellEditorChange(n,e.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.$implicit,e.parent.parent.parent.parent.parent.context.index)&&r),r},null,null)),al["\u0275did"](1,16384,null,0,Fu.DefaultValueAccessor,[al.Renderer2,al.ElementRef,[2,Fu.COMPOSITION_BUFFER_MODE]],null,null),al["\u0275prd"](1024,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Fu.DefaultValueAccessor]),al["\u0275did"](3,671744,null,0,Fu.NgModel,[[8,null],[8,null],[8,null],[2,Fu.NG_VALUE_ACCESSOR]],{model:[0,"model"]},{update:"ngModelChange"}),al["\u0275prd"](2048,null,Fu.NgControl,null,[Fu.NgModel]),al["\u0275did"](5,16384,null,0,Fu.NgControlStatus,[Fu.NgControl],null,null)],function(e,t){e(t,3,0,t.parent.parent.parent.parent.parent.context.$implicit[t.parent.parent.parent.context.$implicit.field])},function(e,t){e(t,0,0,al["\u0275nov"](t,5).ngClassUntouched,al["\u0275nov"](t,5).ngClassTouched,al["\u0275nov"](t,5).ngClassPristine,al["\u0275nov"](t,5).ngClassDirty,al["\u0275nov"](t,5).ngClassValid,al["\u0275nov"](t,5).ngClassInvalid,al["\u0275nov"](t,5).ngClassPending)})}function Hr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"a",[["class","ui-cell-editor-proxy-focus"],["href","#"]],null,[[null,"focus"]],function(e,t,n){var r=!0;return"focus"===t&&(r=!1!==e.component.dt.onCustomEditorFocusPrev(n,e.parent.parent.parent.context.index)&&r),r},null,null))],null,null)}function Wr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,16777216,null,null,1,"p-columnEditorTemplateLoader",[],null,null,null,tr,Ch)),al["\u0275did"](1,245760,null,0,ah.ColumnEditorTemplateLoader,[al.ViewContainerRef],{column:[0,"column"],rowData:[1,"rowData"],rowIndex:[2,"rowIndex"]},null),(e()(),al["\u0275and"](0,null,null,0))],function(e,t){e(t,1,0,t.parent.parent.parent.context.$implicit,t.parent.parent.parent.parent.parent.context.$implicit,t.parent.parent.parent.parent.parent.context.index)},null)}function qr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"a",[["class","ui-cell-editor-proxy-focus"],["href","#"]],null,[[null,"focus"]],function(e,t,n){var r=!0;return"focus"===t&&(r=!1!==e.component.dt.onCustomEditorFocusNext(n,e.parent.parent.parent.context.index)&&r),r},null,null))],null,null)}function Ur(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,13,"div",[["class","ui-cell-editor"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Br)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Hr)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Wr)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,qr)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,3,0,!t.parent.parent.context.$implicit.editorTemplate),e(t,6,0,t.parent.parent.context.$implicit.editorTemplate),e(t,9,0,t.parent.parent.context.$implicit.editorTemplate),e(t,12,0,t.parent.parent.context.$implicit.editorTemplate)},null)}function Gr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"a",[["href","#"]],null,[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.dt.toggleRow(e.parent.parent.parent.parent.context.$implicit,n)&&r),r},null,null)),(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275eld"](2,0,null,null,1,"span",[["class","ui-row-toggler fa fa-fw ui-clickable"]],null,null,null,null,null)),al["\u0275did"](3,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){var n=t.component;e(t,3,0,"ui-row-toggler fa fa-fw ui-clickable",n.dt.isRowExpanded(t.parent.parent.parent.parent.context.$implicit)?n.dt.expandedIcon:n.dt.collapsedIcon)},null)}function Kr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-dtRadioButton",[],null,[[null,"onClick"]],function(e,t,n){var r=!0;return"onClick"===t&&(r=!1!==e.component.dt.selectRowWithRadio(n,e.parent.parent.parent.parent.context.$implicit)&&r),r},_r,Mh)),al["\u0275did"](1,49152,null,0,Sh.DTRadioButton,[],{checked:[0,"checked"]},{onClick:"onClick"})],function(e,t){e(t,1,0,t.component.dt.isSelected(t.parent.parent.parent.parent.context.$implicit))},null)}function $r(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-dtCheckbox",[],null,[[null,"onChange"]],function(e,t,n){var r=!0;return"onChange"===t&&(r=!1!==e.component.dt.toggleRowWithCheckbox(n,e.parent.parent.parent.parent.context.$implicit)&&r),r},wr,Ph)),al["\u0275did"](1,49152,null,0,Sh.DTCheckbox,[],{checked:[0,"checked"]},{onChange:"onChange"})],function(e,t){e(t,1,0,t.component.dt.isSelected(t.parent.parent.parent.parent.context.$implicit))},null)}function Zr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[["cell",1]],null,25,"td",[],[[1,"rowspan",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.dt.switchCellToEditMode(al["\u0275nov"](e,0),e.parent.context.$implicit,e.parent.parent.parent.context.$implicit)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](2,{"ui-editable-column":0,"ui-selection-column":1,"ui-helper-hidden":2}),al["\u0275did"](3,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,jr)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Vr)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,zr)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ur)),al["\u0275did"](15,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Gr)),al["\u0275did"](18,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Kr)),al["\u0275did"](21,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,$r)),al["\u0275did"](24,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "]))],function(e,t){var n=t.component;e(t,1,0,t.parent.context.$implicit.bodyStyleClass||t.parent.context.$implicit.styleClass,e(t,2,0,t.parent.context.$implicit.editable,t.parent.context.$implicit.selectionMode,t.parent.context.$implicit.hidden)),e(t,3,0,t.parent.context.$implicit.bodyStyle||t.parent.context.$implicit.style),e(t,6,0,n.dt.responsive),e(t,9,0,!t.parent.context.$implicit.bodyTemplate&&!t.parent.context.$implicit.expander&&!t.parent.context.$implicit.selectionMode),e(t,12,0,t.parent.context.$implicit.bodyTemplate),e(t,15,0,t.parent.context.$implicit.editable),e(t,18,0,t.parent.context.$implicit.expander),e(t,21,0,"single"==t.parent.context.$implicit.selectionMode),e(t,24,0,"multiple"==t.parent.context.$implicit.selectionMode)},function(e,t){var n=t.component;e(t,0,0,"rowspan"==n.dt.rowGroupMode&&n.dt.sortField==t.parent.context.$implicit.field&&n.dt.rowGroupMetadata[n.dt.resolveFieldData(t.parent.parent.parent.context.$implicit,n.dt.sortField)].index==t.parent.parent.parent.context.index?n.dt.rowGroupMetadata[n.dt.resolveFieldData(t.parent.parent.parent.context.$implicit,n.dt.sortField)].size:null)})}function Qr(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Zr)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "]))],function(e,t){var n=t.component;e(t,2,0,!n.dt.rowGroupMode||"subheader"==n.dt.rowGroupMode||"rowspan"==n.dt.rowGroupMode&&(n.dt.sortField==t.context.$implicit.field&&n.dt.rowGroupMetadata[n.dt.resolveFieldData(t.parent.parent.context.$implicit,n.dt.sortField)].index==t.parent.parent.context.index||n.dt.sortField!=t.context.$implicit.field))},null)}function Yr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[["rowElement",1]],null,6,"tr",[],null,[[null,"click"],[null,"dblclick"],[null,"contextmenu"],[null,"touchend"]],function(e,t,n){var r=!0,i=e.component;return"click"===t&&(r=!1!==i.dt.handleRowClick(n,e.parent.context.$implicit,e.parent.context.index)&&r),"dblclick"===t&&(r=!1!==i.dt.rowDblclick(n,e.parent.context.$implicit)&&r),"contextmenu"===t&&(r=!1!==i.dt.onRowRightClick(n,e.parent.context.$implicit)&&r),"touchend"===t&&(r=!1!==i.dt.handleRowTouchEnd(n)&&r),r},null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pad"](2,5),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Qr)),al["\u0275did"](5,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,t.parent.context.even&&"rowspan"!=n.dt.rowGroupMode?"ui-datatable-even":"",t.parent.context.odd&&"rowspan"!=n.dt.rowGroupMode?"ui-datatable-odd":"",n.dt.isSelected(t.parent.context.$implicit)?"ui-state-highlight":"",n.dt.isRowExpanded(t.parent.context.$implicit)?"ui-expanded-row":"",n.dt.getRowStyleClass(t.parent.context.$implicit,t.parent.context.index))),e(t,5,0,n.columns)},null)}function Xr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,7,"tr",[["class","ui-expanded-row-content"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,4,"td",[],[[1,"colspan",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](4,16777216,null,null,1,"p-rowExpansionLoader",[],null,null,null,xr,Nh)),al["\u0275did"](5,245760,null,0,Sh.RowExpansionLoader,[al.ViewContainerRef],{template:[0,"template"],rowData:[1,"rowData"],rowIndex:[2,"rowIndex"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,5,0,t.component.dt.rowExpansionTemplate,t.parent.context.$implicit,t.parent.context.index)},function(e,t){e(t,2,0,t.component.dt.visibleColumns().length)})}function Jr(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"tr",[["class","ui-widget-header ui-rowgroup-footer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,16777216,null,null,1,"p-templateLoader",[["class","ui-helper-hidden"]],null,null,null,nr,Eh)),al["\u0275did"](3,245760,null,0,ah.TemplateLoader,[al.ViewContainerRef],{template:[0,"template"],data:[1,"data"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){e(t,3,0,t.component.dt.rowGroupFooterTemplate,t.parent.context.$implicit)},null)}function ei(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Fr)),al["\u0275did"](2,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Yr)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Xr)),al["\u0275did"](8,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Jr)),al["\u0275did"](11,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,2,0,"subheader"==n.dt.rowGroupMode&&(0===t.context.index||n.dt.resolveFieldData(t.context.$implicit,n.dt.groupField)!==n.dt.resolveFieldData(n.dt.dataToRender[t.context.index-1],n.dt.groupField))),e(t,5,0,!n.dt.expandableRowGroups||n.dt.isRowGroupExpanded(t.context.$implicit)),e(t,8,0,n.dt.expandableRows&&n.dt.isRowExpanded(t.context.$implicit)),e(t,11,0,n.dt.rowGroupFooterTemplate&&"subheader"==n.dt.rowGroupMode&&(t.context.index===n.dt.dataToRender.length-1||n.dt.resolveFieldData(t.context.$implicit,n.dt.groupField)!==n.dt.resolveFieldData(n.dt.dataToRender[t.context.index+1],n.dt.groupField))&&(!n.dt.expandableRowGroups||n.dt.isRowGroupExpanded(t.context.$implicit)))},null)}function ti(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](1,null,["",""]))],null,function(e,t){e(t,1,0,t.component.dt.emptyMessage)})}function ni(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,10,"tr",[["class","ui-widget-content ui-datatable-emptymessage-row"]],[[4,"visibility",null]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](2,0,null,null,7,"td",[["class","ui-datatable-emptymessage"]],[[1,"colspan",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ti)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](7,16777216,null,null,1,"p-templateLoader",[],null,null,null,nr,Eh)),al["\u0275did"](8,245760,null,0,ah.TemplateLoader,[al.ViewContainerRef],{template:[0,"template"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,5,0,!n.dt.emptyMessageTemplate),e(t,8,0,n.dt.emptyMessageTemplate)},function(e,t){var n=t.component;e(t,0,0,n.dt.loading?"hidden":"visible"),e(t,2,0,n.dt.visibleColumns().length)})}function ri(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ei)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"],ngForTrackBy:[1,"ngForTrackBy"]},null),(e()(),al["\u0275ted"](-1,null,["\n\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ni)),al["\u0275did"](5,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,2,0,n.data,n.dt.rowTrackBy),e(t,5,0,n.dt.isEmpty())},null)}function ii(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Rr,Ah)),al["\u0275did"](1,49152,null,0,Sh.ColumnHeaders,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.component.columns)},null)}function oi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Rr,Ah)),al["\u0275did"](1,49152,null,0,Sh.ColumnHeaders,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.context.$implicit.columns)},null)}function li(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,oi)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,2,0,t.component.headerColumnGroup.rows)},null)}function ai(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"tbody",[],null,null,null,ri,Fh)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{"ui-datatable-data ui-widget-content":0,"ui-datatable-hoverable-rows":1}),al["\u0275did"](3,49152,null,0,Sh.TableBody,[Sh.DataTable],{columns:[0,"columns"],data:[1,"data"]},null)],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,!0,n.dt.rowHover||n.dt.selectionMode)),e(t,3,0,n.columns,n.dt.frozenValue)},null)}function si(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"col",[],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](2,{"ui-helper-hidden":0}),al["\u0275did"](3,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null)],function(e,t){e(t,1,0,e(t,2,0,t.context.$implicit.hidden)),e(t,3,0,t.context.$implicit.headerStyle||t.context.$implicit.style)},null)}function ui(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Ar,Lh)),al["\u0275did"](1,49152,null,0,Sh.ColumnFooters,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.component.columns)},null)}function ci(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Ar,Lh)),al["\u0275did"](1,49152,null,0,Sh.ColumnFooters,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.context.$implicit.columns)},null)}function di(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ci)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,2,0,t.component.footerColumnGroup.rows)},null)}function pi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,[[6,0],["scrollFooter",1]],null,20,"div",[["class","ui-widget-header ui-datatable-scrollable-footer"]],null,null,null,null,null)),al["\u0275did"](1,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](2,{width:0}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](4,0,[[7,0],["scrollFooterBox",1]],null,15,"div",[["class","ui-datatable-scrollable-footer-box"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](6,0,null,null,12,"table",[],null,null,null,null,null)),al["\u0275did"](7,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275did"](8,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](10,0,null,null,7,"tfoot",[["class","ui-datatable-tfoot"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ui)),al["\u0275did"](13,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,di)),al["\u0275did"](16,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "]))],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,n.width)),e(t,7,0,n.dt.tableStyleClass),e(t,8,0,n.dt.tableStyle),e(t,13,0,!n.footerColumnGroup),e(t,16,0,n.footerColumnGroup)},null)}function fi(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{scrollHeaderViewChild:0}),al["\u0275qud"](402653184,2,{scrollHeaderBoxViewChild:0}),al["\u0275qud"](402653184,3,{scrollBodyViewChild:0}),al["\u0275qud"](402653184,4,{scrollTableViewChild:0}),al["\u0275qud"](402653184,5,{scrollTableWrapperViewChild:0}),al["\u0275qud"](671088640,6,{scrollFooterViewChild:0}),al["\u0275qud"](671088640,7,{scrollFooterBoxViewChild:0}),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](8,0,[[1,0],["scrollHeader",1]],null,23,"div",[["class","ui-widget-header ui-datatable-scrollable-header"]],null,null,null,null,null)),al["\u0275did"](9,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](10,{width:0}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](12,0,[[2,0],["scrollHeaderBox",1]],null,18,"div",[["class","ui-datatable-scrollable-header-box"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](14,0,null,null,15,"table",[],null,null,null,null,null)),al["\u0275did"](15,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275did"](16,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](18,0,null,null,7,"thead",[["class","ui-datatable-thead"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ii)),al["\u0275did"](21,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,li)),al["\u0275did"](24,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ai)),al["\u0275did"](28,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](33,0,[[3,0],["scrollBody",1]],null,23,"div",[["class","ui-datatable-scrollable-body"]],null,null,null,null,null)),al["\u0275did"](34,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](35,{width:0}),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](37,0,[[5,0],["scrollTableWrapper",1]],null,18,"div",[["class","ui-datatable-scrollable-table-wrapper"],["style","position:relative"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](39,0,[[4,0],["scrollTable",1]],null,15,"table",[["style","top:0px"]],null,null,null,null,null)),al["\u0275did"](40,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](41,{"ui-datatable-virtual-table":0}),al["\u0275did"](42,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](44,0,null,null,4,"colgroup",[["class","ui-datatable-scrollable-colgroup"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,si)),al["\u0275did"](47,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](50,0,null,null,3,"tbody",[],null,null,null,ri,Fh)),al["\u0275did"](51,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](52,{"ui-datatable-data ui-widget-content":0,"ui-datatable-hoverable-rows":1}),al["\u0275did"](53,49152,null,0,Sh.TableBody,[Sh.DataTable],{columns:[0,"columns"],data:[1,"data"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,pi)),al["\u0275did"](59,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,9,0,e(t,10,0,n.width)),e(t,15,0,n.dt.tableStyleClass),e(t,16,0,n.dt.tableStyle),e(t,21,0,!n.headerColumnGroup),e(t,24,0,n.headerColumnGroup),e(t,28,0,n.dt.frozenValue),e(t,34,0,e(t,35,0,n.width)),e(t,40,0,n.dt.tableStyleClass,e(t,41,0,n.virtualScroll)),e(t,42,0,n.dt.tableStyle),e(t,47,0,n.columns),e(t,51,0,e(t,52,0,!0,n.dt.rowHover||n.dt.selectionMode)),e(t,53,0,n.columns,n.dt.dataToRender),e(t,59,0,n.dt.hasFooter())},null)}function hi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,0,"div",[["class","ui-datatable-loading ui-widget-overlay"]],null,null,null,null,null))],null,null)}function mi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-datatable-loading-content"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,0,"i",[],[[8,"className",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "]))],null,function(e,t){e(t,2,0,"fa fa-spin fa-2x "+t.component.loadingIcon)})}function gi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-datatable-header ui-widget-header"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),al["\u0275ncd"](null,0),(e()(),al["\u0275ted"](-1,null,["\n            "]))],null,null)}function yi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-paginator",[["styleClass","ui-paginator-top"]],null,[[null,"onPageChange"]],function(e,t,n){var r=!0;return"onPageChange"===t&&(r=!1!==e.component.onPageChange(n)&&r),r},br,Rh)),al["\u0275did"](1,49152,null,0,Th.Paginator,[],{pageLinkSize:[0,"pageLinkSize"],styleClass:[1,"styleClass"],alwaysShow:[2,"alwaysShow"],totalRecords:[3,"totalRecords"],first:[4,"first"],rows:[5,"rows"],rowsPerPageOptions:[6,"rowsPerPageOptions"]},{onPageChange:"onPageChange"})],function(e,t){var n=t.component;e(t,1,0,n.pageLinks,"ui-paginator-top",n.alwaysShowPaginator,n.totalRecords,n.first,n.rows,n.rowsPerPageOptions)},null)}function vi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Rr,Ah)),al["\u0275did"](1,49152,null,0,Sh.ColumnHeaders,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.component.columns)},null)}function bi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Rr,Ah)),al["\u0275did"](1,49152,null,0,Sh.ColumnHeaders,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.context.$implicit.columns)},null)}function _i(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,bi)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,2,0,t.component.headerColumnGroups.first.rows)},null)}function wi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Ar,Lh)),al["\u0275did"](1,49152,null,0,Sh.ColumnFooters,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.component.columns)},null)}function xi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"tr",[["class","ui-state-default"]],null,null,null,Ar,Lh)),al["\u0275did"](1,49152,null,0,Sh.ColumnFooters,[Sh.DataTable],{columns:[0,"columns"]},null)],function(e,t){e(t,1,0,t.context.$implicit.columns)},null)}function Ci(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,xi)),al["\u0275did"](2,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "]))],function(e,t){e(t,2,0,t.component.footerColumnGroups.first.rows)},null)}function Ei(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,7,"tfoot",[["class","ui-datatable-tfoot"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,wi)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ci)),al["\u0275did"](6,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "]))],function(e,t){var n=t.component;e(t,3,0,!n.footerColumnGroups.first),e(t,6,0,n.footerColumnGroups.first)},null)}function Si(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,23,"div",[["class","ui-datatable-tablewrapper"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](2,0,null,null,20,"table",[],null,null,null,null,null)),al["\u0275did"](3,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275did"](4,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](6,0,null,null,7,"thead",[["class","ui-datatable-thead"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,vi)),al["\u0275did"](9,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                        "])),(e()(),al["\u0275and"](16777216,null,null,1,null,_i)),al["\u0275did"](12,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ei)),al["\u0275did"](16,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](18,0,null,null,3,"tbody",[],null,null,null,ri,Fh)),al["\u0275did"](19,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngClass:[0,"ngClass"]},null),al["\u0275pod"](20,{"ui-datatable-data ui-widget-content":0,"ui-datatable-hoverable-rows":1}),al["\u0275did"](21,49152,null,0,Sh.TableBody,[Sh.DataTable],{columns:[0,"columns"],data:[1,"data"]},null),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,3,0,n.tableStyleClass),e(t,4,0,n.tableStyle),e(t,9,0,!n.headerColumnGroups.first),e(t,12,0,n.headerColumnGroups.first),e(t,16,0,n.hasFooter()),e(t,19,0,e(t,20,0,!0,n.rowHover||n.selectionMode)),e(t,21,0,n.columns,n.dataToRender)},null)}function Oi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-datatable-scrollable-view ui-datatable-frozen-view"],["frozen","true"]],null,null,null,fi,jh)),al["\u0275did"](1,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](2,{width:0}),al["\u0275did"](3,12763136,null,0,Sh.ScrollableView,[Sh.DataTable,kh.DomHandler,al.ElementRef,al.Renderer2,al.NgZone],{columns:[0,"columns"],headerColumnGroup:[1,"headerColumnGroup"],footerColumnGroup:[2,"footerColumnGroup"],frozen:[3,"frozen"]},null)],function(e,t){var n=t.component;e(t,1,0,e(t,2,0,n.frozenWidth)),e(t,3,0,n.frozenColumns,n.frozenHeaderColumnGroup,n.frozenFooterColumnGroup,"true")},null)}function Ti(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275eld"](1,0,null,null,11,"div",[["class","ui-datatable-scrollable-wrapper ui-helper-clearfix"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Oi)),al["\u0275did"](4,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n                    "])),(e()(),al["\u0275eld"](6,0,null,null,5,"div",[["class","ui-datatable-scrollable-view"]],null,[[null,"onVirtualScroll"]],function(e,t,n){var r=!0;return"onVirtualScroll"===t&&(r=!1!==e.component.onVirtualScroll(n)&&r),r},fi,jh)),al["\u0275did"](7,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](8,{"ui-datatable-unfrozen-view":0}),al["\u0275did"](9,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),al["\u0275pod"](10,{width:0,left:1}),al["\u0275did"](11,12763136,null,0,Sh.ScrollableView,[Sh.DataTable,kh.DomHandler,al.ElementRef,al.Renderer2,al.NgZone],{columns:[0,"columns"],headerColumnGroup:[1,"headerColumnGroup"],footerColumnGroup:[2,"footerColumnGroup"],virtualScroll:[3,"virtualScroll"]},{onVirtualScroll:"onVirtualScroll"}),(e()(),al["\u0275ted"](-1,null,["\n                "])),(e()(),al["\u0275ted"](-1,null,["\n            "]))],function(e,t){var n=t.component;e(t,4,0,n.hasFrozenColumns()),e(t,7,0,"ui-datatable-scrollable-view",e(t,8,0,n.hasFrozenColumns())),e(t,9,0,e(t,10,0,n.unfrozenWidth,n.frozenWidth)),e(t,11,0,n.scrollableColumns,n.scrollableHeaderColumnGroup,n.scrollableFooterColumnGroup,n.virtualScroll)},null)}function ki(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"p-paginator",[["styleClass","ui-paginator-bottom"]],null,[[null,"onPageChange"]],function(e,t,n){var r=!0;return"onPageChange"===t&&(r=!1!==e.component.onPageChange(n)&&r),r},br,Rh)),al["\u0275did"](1,49152,null,0,Th.Paginator,[],{pageLinkSize:[0,"pageLinkSize"],styleClass:[1,"styleClass"],alwaysShow:[2,"alwaysShow"],totalRecords:[3,"totalRecords"],first:[4,"first"],rows:[5,"rows"],rowsPerPageOptions:[6,"rowsPerPageOptions"]},{onPageChange:"onPageChange"})],function(e,t){var n=t.component;e(t,1,0,n.pageLinks,"ui-paginator-bottom",n.alwaysShowPaginator,n.totalRecords,n.first,n.rows,n.rowsPerPageOptions)},null)}function Di(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,3,"div",[["class","ui-datatable-footer ui-widget-header"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n                "])),al["\u0275ncd"](null,1),(e()(),al["\u0275ted"](-1,null,["\n            "]))],null,null)}function Ii(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275eld"](1,0,null,null,34,"div",[],[[4,"width",null]],null,null,null,null)),al["\u0275did"](2,278528,null,0,cl.NgClass,[al.IterableDiffers,al.KeyValueDiffers,al.ElementRef,al.Renderer2],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),al["\u0275pod"](3,{"ui-datatable ui-widget":0,"ui-datatable-reflow":1,"ui-datatable-stacked":2,"ui-datatable-resizable":3,"ui-datatable-scrollable":4}),al["\u0275did"](4,278528,null,0,cl.NgStyle,[al.KeyValueDiffers,al.ElementRef,al.Renderer2],{ngStyle:[0,"ngStyle"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,hi)),al["\u0275did"](7,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,mi)),al["\u0275did"](10,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,gi)),al["\u0275did"](13,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,yi)),al["\u0275did"](16,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Si)),al["\u0275did"](19,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            \n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ti)),al["\u0275did"](22,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            \n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,ki)),al["\u0275did"](25,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275and"](16777216,null,null,1,null,Di)),al["\u0275did"](28,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n            \n            "])),(e()(),al["\u0275eld"](30,0,null,null,0,"div",[["class","ui-column-resizer-helper ui-state-highlight"],["style","display:none"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](32,0,null,null,0,"span",[["class","fa fa-arrow-down ui-datatable-reorder-indicator-up"],["style","position: absolute; display: none;"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](34,0,null,null,0,"span",[["class","fa fa-arrow-up ui-datatable-reorder-indicator-down"],["style","position: absolute; display: none;"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,null,["\n    "]))],function(e,t){var n=t.component;e(t,2,0,n.styleClass,e(t,3,0,!0,n.responsive,n.stacked,n.resizableColumns,n.scrollable)),e(t,4,0,n.style),e(t,7,0,n.loading),e(t,10,0,n.loading),e(t,13,0,n.header),e(t,16,0,n.paginator&&("top"===n.paginatorPosition||"both"==n.paginatorPosition)),e(t,19,0,!n.scrollable),e(t,22,0,n.scrollable),e(t,25,0,n.paginator&&("bottom"===n.paginatorPosition||"both"==n.paginatorPosition)),e(t,28,0,n.footer)},function(e,t){e(t,1,0,t.component.containerWidth)})}function Ri(e){return al["\u0275vid"](2,[al["\u0275qud"](402653184,1,{_inputElement:0}),(e()(),al["\u0275eld"](1,0,null,null,3,"label",[["class","mat-button-toggle-label"]],[[1,"for",0]],null,null,null,null)),(e()(),al["\u0275eld"](2,0,[[1,0],["input",1]],null,0,"input",[["class","mat-button-toggle-input cdk-visually-hidden"]],[[8,"type",0],[8,"id",0],[8,"checked",0],[8,"disabled",0],[8,"name",0],[1,"aria-label",0],[1,"aria-labelledby",0]],[[null,"change"],[null,"click"]],function(e,t,n){var r=!0,i=e.component;return"change"===t&&(r=!1!==i._onInputChange(n)&&r),"click"===t&&(r=!1!==i._onInputClick(n)&&r),r},null,null)),(e()(),al["\u0275eld"](3,0,null,null,1,"div",[["class","mat-button-toggle-label-content"]],null,null,null,null,null)),al["\u0275ncd"](null,0),(e()(),al["\u0275eld"](5,0,null,null,0,"div",[["class","mat-button-toggle-focus-overlay"]],null,null,null,null,null))],null,function(e,t){var n=t.component;e(t,1,0,n.inputId),e(t,2,0,n._type,n.inputId,n.checked,n.disabled||null,n.name,n.ariaLabel,n.ariaLabelledby)})}function Mi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,6,"p-column",[],null,null,null,Qn,vh)),al["\u0275did"](1,1097728,[[5,4]],2,ah.Column,[],{field:[0,"field"],header:[1,"header"],sortable:[2,"sortable"],style:[3,"style"],headerStyleClass:[4,"headerStyleClass"],footerStyle:[5,"footerStyle"]},null),al["\u0275qud"](603979776,8,{templates:1}),al["\u0275qud"](335544320,9,{template:0}),al["\u0275pod"](4,{"text-align":0,"text-overflow":1,"word-wrap":2,"word-break":3}),al["\u0275pod"](5,{color:0}),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"]))],function(e,t){var n=t.component;e(t,1,0,t.context.$implicit.field,t.context.$implicit.header,!0,e(t,4,0,"left","ellipsis","break-word","break-all"),n.datatable-n.header,e(t,5,0,"blue"))},null)}function Pi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,18,"div",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\t\t\t\t\n\t\t\t\t"])),(e()(),al["\u0275eld"](2,0,null,null,15,"p-dataTable",[["id","review-table"]],[[8,"hidden",0]],null,null,Ii,Vh)),al["\u0275prd"](512,null,kh.DomHandler,kh.DomHandler,[]),al["\u0275prd"](512,null,Dh.ObjectUtils,Dh.ObjectUtils,[]),al["\u0275did"](5,14139392,null,6,Sh.DataTable,[al.ElementRef,kh.DomHandler,al.IterableDiffers,al.Renderer2,al.ChangeDetectorRef,Dh.ObjectUtils,al.NgZone],{paginator:[0,"paginator"],rows:[1,"rows"],pageLinks:[2,"pageLinks"],rowsPerPageOptions:[3,"rowsPerPageOptions"],responsive:[4,"responsive"],style:[5,"style"],value:[6,"value"]},null),al["\u0275qud"](335544320,2,{header:0}),al["\u0275qud"](335544320,3,{footer:0}),al["\u0275qud"](603979776,4,{templates:1}),al["\u0275qud"](603979776,5,{cols:1}),al["\u0275qud"](603979776,6,{headerColumnGroups:1}),al["\u0275qud"](603979776,7,{footerColumnGroups:1}),al["\u0275pad"](12,6),al["\u0275pod"](13,{width:0,overflow:1}),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,1,null,Mi)),al["\u0275did"](16,802816,null,0,cl.NgForOf,[al.ViewContainerRef,al.TemplateRef,al.IterableDiffers],{ngForOf:[0,"ngForOf"]},null),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"]))],function(e,t){var n=t.component;e(t,5,0,!0,20,3,e(t,12,0,5,10,20,30,40,50),!0,e(t,13,0,"100%","hidden"),n.data),e(t,16,0,n.dataColumns)},function(e,t){e(t,2,0,t.component.loading)})}function Ni(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"div",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,1,null,Pi)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"]))],function(e,t){e(t,3,0,"TABLE"==t.component.selectedOutputView)},null)}function Ai(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,7,"div",[["class","queryErrorMessage"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](2,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["ERROR:"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](5,0,null,null,1,"span",[],null,null,null,null,null)),(e()(),al["\u0275ted"](6,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"]))],null,function(e,t){e(t,6,0,t.component.queryMessage)})}function Li(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,9,"div",[["class","data-viewer-container"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275eld"](2,0,null,null,3,"button",[["class","button-export mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.exportToText()&&r),r},J,nc)),al["\u0275did"](3,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](4,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](-1,0,["EXPORT"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275eld"](7,0,null,null,1,"pre",[["class","json-output"]],null,null,null,null,null)),(e()(),al["\u0275ted"](8,null,["",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"]))],null,function(e,t){var n=t.component;e(t,2,0,al["\u0275nov"](t,3).disabled||null),e(t,8,0,n.jsonOutput)})}function Fi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"div",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\t\n\t\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,1,null,Li)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"]))],function(e,t){e(t,3,0,"JSON"==t.component.selectedOutputView)},null)}function ji(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,21,"div",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\t\n\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,1,null,Ai)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\t\n\t\t\t "])),(e()(),al["\u0275eld"](5,0,null,null,11,"div",[["class","data-viewer-container"]],[[8,"hidden",0]],null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](7,0,null,null,3,"button",[["class","button-expand mat-button"],["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(e,t,n){var r=!0;return"click"===t&&(r=!1!==e.component.expandTree()&&r),r},J,nc)),al["\u0275did"](8,180224,null,0,$s,[al.ElementRef,pl,La],null,null),al["\u0275did"](9,16384,null,0,Gs,[],null,null),(e()(),al["\u0275ted"](10,0,["",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](12,0,null,null,3,"p-tree",[],null,null,null,Gn,dh)),al["\u0275did"](13,1294336,null,1,lh.Tree,[[2,sh.TreeDragDropService]],{value:[0,"value"],style:[1,"style"]},null),al["\u0275qud"](603979776,10,{templates:1}),al["\u0275pod"](15,{width:0,border:1,"font-family":2,"font-size":3,"font-weight":4}),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,2,null,Fi)),al["\u0275did"](19,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n\t\t"]))],function(e,t){var n=t.component;e(t,3,0,t.context.ngIf.sqlQueryError.metrics),e(t,13,0,n.treeData,e(t,15,0,"100%","none","Roboto Mono","0.80rem","500")),e(t,19,0,al["\u0275unv"](t,19,0,al["\u0275nov"](t,20).transform(n.loaded$)))},function(e,t){var n=t.component;e(t,5,0,"TREE"!=n.selectedOutputView),e(t,7,0,al["\u0275nov"](t,8).disabled||null),e(t,10,0,n.toogleExpand)})}function Vi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,36,"span",[["class","metrics"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](2,0,null,null,1,"span",[["class","span-results"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["SUCCESS:"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](5,0,null,null,1,"span",[["class","span-results"]],null,null,null,null,null)),(e()(),al["\u0275ted"](6,null,["Count: ",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](8,0,null,null,1,"span",[["class","span-results"]],null,null,null,null,null)),(e()(),al["\u0275ted"](9,null,["Size: ",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](11,0,null,null,1,"span",[["class","span-results"]],null,null,null,null,null)),(e()(),al["\u0275ted"](12,null,["Elapsed time: ",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](14,0,null,null,1,"span",[["class","span-results"]],null,null,null,null,null)),(e()(),al["\u0275ted"](15,null,["Execution time: ",""])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](17,0,null,null,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275eld"](19,0,null,null,16,"mat-button-toggle-group",[["class","output-group mat-button-toggle-group"],["role","radiogroup"]],[[2,"mat-button-toggle-vertical",null]],[[null,"change"]],function(e,t,n){var r=!0;return"change"===t&&(r=!1!==e.component.onSelect(al["\u0275nov"](e,21).value)&&r),r},null,null)),al["\u0275prd"](5120,null,Fu.NG_VALUE_ACCESSOR,function(e){return[e]},[Wh]),al["\u0275did"](21,16384,[["group",4]],1,Wh,[al.ChangeDetectorRef],{value:[0,"value"]},{change:"change"}),al["\u0275qud"](603979776,11,{_buttonToggles:1}),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275eld"](24,0,null,null,2,"mat-button-toggle",[["class","mat-button-toggle"],["mat-button",""],["value","TABLE"]],[[2,"mat-button-toggle-standalone",null],[2,"mat-button-toggle-checked",null],[2,"mat-button-toggle-disabled",null],[1,"id",0]],null,null,Ri,Kh)),al["\u0275did"](25,245760,[[11,4]],0,Uh,[[2,Wh],[2,qh],al.ChangeDetectorRef,Vc,al.ElementRef,La],{value:[0,"value"]},null),(e()(),al["\u0275ted"](-1,0,["TABLE"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275eld"](28,0,null,null,2,"mat-button-toggle",[["class","mat-button-toggle"],["mat-button",""],["value","TREE"]],[[2,"mat-button-toggle-standalone",null],[2,"mat-button-toggle-checked",null],[2,"mat-button-toggle-disabled",null],[1,"id",0]],null,null,Ri,Kh)),al["\u0275did"](29,245760,[[11,4]],0,Uh,[[2,Wh],[2,qh],al.ChangeDetectorRef,Vc,al.ElementRef,La],{value:[0,"value"]},null),(e()(),al["\u0275ted"](-1,0,["TREE"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t\t"])),(e()(),al["\u0275eld"](32,0,null,null,2,"mat-button-toggle",[["class","mat-button-toggle"],["mat-button",""],["value","JSON"]],[[2,"mat-button-toggle-standalone",null],[2,"mat-button-toggle-checked",null],[2,"mat-button-toggle-disabled",null],[1,"id",0]],null,null,Ri,Kh)),al["\u0275did"](33,245760,[[11,4]],0,Uh,[[2,Wh],[2,qh],al.ChangeDetectorRef,Vc,al.ElementRef,La],{value:[0,"value"]},null),(e()(),al["\u0275ted"](-1,0,["JSON"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t\t"])),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"]))],function(e,t){e(t,21,0,al["\u0275inlineInterpolate"](1,"",t.component.selectedOutput,"")),e(t,25,0,"TABLE"),e(t,29,0,"TREE"),e(t,33,0,"JSON")},function(e,t){e(t,6,0,t.parent.context.ngIf.sqlQueryResult.metrics.resultCount),e(t,9,0,t.parent.context.ngIf.sqlQueryResult.metrics.resultSize),e(t,12,0,t.parent.context.ngIf.sqlQueryResult.metrics.elapsedTime),e(t,15,0,t.parent.context.ngIf.sqlQueryResult.metrics.executionTime),e(t,19,0,al["\u0275nov"](t,21).vertical),e(t,24,0,!al["\u0275nov"](t,25).buttonToggleGroup&&!al["\u0275nov"](t,25).buttonToggleGroupMultiple,al["\u0275nov"](t,25).checked,al["\u0275nov"](t,25).disabled,al["\u0275nov"](t,25).id),e(t,28,0,!al["\u0275nov"](t,29).buttonToggleGroup&&!al["\u0275nov"](t,29).buttonToggleGroupMultiple,al["\u0275nov"](t,29).checked,al["\u0275nov"](t,29).disabled,al["\u0275nov"](t,29).id),e(t,32,0,!al["\u0275nov"](t,33).buttonToggleGroup&&!al["\u0275nov"](t,33).buttonToggleGroupMultiple,al["\u0275nov"](t,33).checked,al["\u0275nov"](t,33).disabled,al["\u0275nov"](t,33).id)})}function zi(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,4,"div",[],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n\t\t\t"])),(e()(),al["\u0275and"](16777216,null,null,1,null,Vi)),al["\u0275did"](3,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"]))],function(e,t){e(t,3,0,t.context.ngIf.sqlQueryResult.metrics)},null)}function Bi(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,36,"mat-card",[["class","sql-results-card mat-card"]],null,null,null,Te,gd)),al["\u0275did"](2,49152,null,0,hd,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275eld"](4,0,null,0,12,"mat-toolbar",[["class","results-selector mat-toolbar"],["color","primary"]],[[2,"mat-toolbar-multiple-rows",null],[2,"mat-toolbar-single-row",null]],null,null,ke,bd)),al["\u0275did"](5,4243456,null,1,yd,[al.ElementRef,pl],{color:[0,"color"]},null),al["\u0275qud"](603979776,1,{_toolbarRows:1}),(e()(),al["\u0275ted"](-1,0,["\n\t\t"])),(e()(),al["\u0275eld"](8,0,null,0,2,"mat-icon",[["class","toolbar-icon mat-icon"],["role","img"]],null,null,null,te,ic)),al["\u0275did"](9,638976,null,0,Au,[al.ElementRef,Nu,[8,null]],null,null),(e()(),al["\u0275ted"](-1,0,["menu"])),(e()(),al["\u0275ted"](-1,0,["\n\t    "])),(e()(),al["\u0275eld"](12,0,null,0,1,"span",[["class","output-query-string"]],null,null,null,null,null)),(e()(),al["\u0275ted"](13,null,["OUTPUT",""])),(e()(),al["\u0275ted"](-1,0,["\n\t\t"])),(e()(),al["\u0275eld"](15,0,null,0,0,"span",[["class","spacer"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n  \t"])),(e()(),al["\u0275eld"](18,0,null,0,10,"mat-card-content",[["class","content-area mat-card-content"]],null,null,null,null,null)),al["\u0275did"](19,16384,null,0,pd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275and"](16777216,null,null,2,null,Ni)),al["\u0275did"](22,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275and"](16777216,null,null,2,null,ji)),al["\u0275did"](26,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n\t"])),(e()(),al["\u0275eld"](30,0,null,0,6,"mat-card-actions",[["class","actions mat-card-actions"]],[[2,"mat-card-actions-align-end",null]],null,null,null,null)),al["\u0275did"](31,16384,null,0,fd,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n\t\t"])),(e()(),al["\u0275and"](16777216,null,null,2,null,zi)),al["\u0275did"](34,16384,null,0,cl.NgIf,[al.ViewContainerRef,al.TemplateRef],{ngIf:[0,"ngIf"]},null),al["\u0275pid"](131072,cl.AsyncPipe,[al.ChangeDetectorRef]),(e()(),al["\u0275ted"](-1,null,["\n\t"])),(e()(),al["\u0275ted"](-1,0,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){var n=t.component;e(t,5,0,"primary"),e(t,9,0),e(t,22,0,al["\u0275unv"](t,22,0,al["\u0275nov"](t,23).transform(n.loaded$))),e(t,26,0,al["\u0275unv"](t,26,0,al["\u0275nov"](t,27).transform(n.loaded$))),e(t,34,0,al["\u0275unv"](t,34,0,al["\u0275nov"](t,35).transform(n.loaded$)))},function(e,t){var n=t.component;e(t,4,0,al["\u0275nov"](t,5)._toolbarRows.length,!al["\u0275nov"](t,5)._toolbarRows.length),e(t,13,0,n.outputQueryString),e(t,30,0,"end"===al["\u0275nov"](t,31).align)})}function Hi(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n\n"])),(e()(),al["\u0275eld"](1,0,null,null,16,"div",[["class","query-container"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](3,0,null,null,4,"div",[["class","metadata"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["   \n    "])),(e()(),al["\u0275eld"](5,0,null,null,1,"awc-metadata",[["class","metadata-card"]],null,null,null,Kn,fh)),al["\u0275did"](6,114688,null,0,ph,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](9,0,null,null,7,"div",[["class","vertical"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](11,0,null,null,1,"awc-query",[["class","query-card"]],null,null,null,Zn,yh)),al["\u0275did"](12,49152,null,0,gh,[Yp.m],null,null),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](14,0,null,null,1,"awc-results",[["class","output-card"]],null,null,null,Bi,Qh)),al["\u0275did"](15,114688,null,0,Zh,[Yp.m,al.ChangeDetectorRef],null,null),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,[" \n\n"]))],function(e,t){e(t,6,0),e(t,15,0)},null)}function Wi(e){return al["\u0275vid"](0,[al["\u0275qud"](402653184,1,{dataverses:0}),al["\u0275qud"](402653184,2,{datasets:0}),al["\u0275qud"](402653184,3,{datatypes:0}),al["\u0275qud"](402653184,4,{indexes:0}),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](5,0,null,null,47,"mat-tab-group",[["class","metadata-menu mat-tab-group"]],[[2,"mat-tab-group-dynamic-height",null],[2,"mat-tab-group-inverted-header",null]],[[null,"selectedTabChange"]],function(e,t,n){var r=!0;return"selectedTabChange"===t&&(r=!1!==e.component.tabChange()&&r),r},pn,nh)),al["\u0275did"](6,3325952,null,1,Xf,[al.ElementRef,al.ChangeDetectorRef],null,{selectedTabChange:"selectedTabChange"}),al["\u0275qud"](603979776,5,{_tabs:1}),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](9,16777216,null,null,9,"mat-tab",[["class","submenu"],["label","DATAVERSES"]],null,null,null,yn,oh)),al["\u0275did"](10,770048,[[5,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,6,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](13,0,null,0,4,"div",[["class","dataverses"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](15,0,null,null,1,"awc-dataverses",[["class","dataverses"]],null,null,null,Xe,af)),al["\u0275did"](16,12697600,[[1,4],["dataverses",4]],0,tf,[Yp.m,Fs],{errorMessage:[0,"errorMessage"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](20,16777216,null,null,9,"mat-tab",[["label","DATASETS"]],null,null,null,yn,oh)),al["\u0275did"](21,770048,[[5,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,7,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](24,0,null,0,4,"div",[["class","datasets"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](26,0,null,null,1,"awc-datasets",[["class","datasets"]],null,null,null,Et,yf)),al["\u0275did"](27,114688,[[2,4],["datasets",4]],0,ff,[Yp.m,Fs],{errorMessage:[0,"errorMessage"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["  \n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](31,16777216,null,null,9,"mat-tab",[["label","DATATYPES"]],null,null,null,yn,oh)),al["\u0275did"](32,770048,[[5,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,8,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](35,0,null,0,4,"div",[["class","datatypes"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](37,0,null,null,1,"awc-datatypes",[["class","datatypes"]],null,null,null,Lt,Tf)),al["\u0275did"](38,114688,[[3,4],["datatypes",4]],0,Cf,[Yp.m,Fs],{errorMessage:[0,"errorMessage"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](42,16777216,null,null,9,"mat-tab",[["class","indexes"],["label","INDEXES"]],null,null,null,yn,oh)),al["\u0275did"](43,770048,[[5,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,9,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n        "])),(e()(),al["\u0275eld"](46,0,null,0,4,"div",[["class","indexes"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n            "])),(e()(),al["\u0275eld"](48,0,null,null,1,"awc-indexes",[["class","indexes"]],null,null,null,nn,Ff)),al["\u0275did"](49,114688,[[4,4],["indexes",4]],0,Pf,[Yp.m,Fs],{errorMessage:[0,"errorMessage"]},null),(e()(),al["\u0275ted"](-1,null,["\n        "])),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n\n"]))],function(e,t){var n=t.component;e(t,10,0,"DATAVERSES"),e(t,16,0,n.message),e(t,21,0,"DATASETS"),e(t,27,0,n.message),e(t,32,0,"DATATYPES"),e(t,38,0,n.message),e(t,43,0,"INDEXES"),e(t,49,0,n.message)},function(e,t){e(t,5,0,al["\u0275nov"](t,6).dynamicHeight,"below"===al["\u0275nov"](t,6).headerPosition)})}function qi(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,22,"div",[["class","content"]],null,null,null,null,null)),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275eld"](3,0,null,null,19,"mat-tab-group",[["class","menu mat-tab-group"]],[[2,"mat-tab-group-dynamic-height",null],[2,"mat-tab-group-inverted-header",null]],null,null,pn,nh)),al["\u0275did"](4,3325952,null,1,Xf,[al.ElementRef,al.ChangeDetectorRef],null,null),al["\u0275qud"](603979776,1,{_tabs:1}),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](7,16777216,null,null,6,"mat-tab",[["label",">_ QUERY"]],null,null,null,yn,oh)),al["\u0275did"](8,770048,[[1,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,2,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](11,0,null,0,1,"awc-query-container",[],null,null,null,Hi,nm)),al["\u0275did"](12,49152,null,0,tm,[Yp.m],null,null),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n    "])),(e()(),al["\u0275eld"](15,16777216,null,null,6,"mat-tab",[["label","METADATA"]],null,null,null,yn,oh)),al["\u0275did"](16,770048,[[1,4]],1,$f,[al.ViewContainerRef],{textLabel:[0,"textLabel"]},null),al["\u0275qud"](335544320,3,{templateLabel:0}),(e()(),al["\u0275ted"](-1,0,["\n      "])),(e()(),al["\u0275eld"](19,0,null,0,1,"awc-metadata-container",[],null,null,null,Wi,im)),al["\u0275did"](20,49152,null,0,rm,[],null,null),(e()(),al["\u0275ted"](-1,0,["\n    "])),(e()(),al["\u0275ted"](-1,null,["\n  "])),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275ted"](-1,null,["\n"]))],function(e,t){e(t,8,0,">_ QUERY"),e(t,16,0,"METADATA")},function(e,t){e(t,3,0,al["\u0275nov"](t,4).dynamicHeight,"below"===al["\u0275nov"](t,4).headerPosition)})}function Ui(e){return al["\u0275vid"](0,[(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](1,0,null,null,1,"awc-bar",[],null,null,null,ln,Wf)),al["\u0275did"](2,49152,null,0,Hf,[],null,null),(e()(),al["\u0275ted"](-1,null,["\n"])),(e()(),al["\u0275eld"](4,0,null,null,1,"awc-tab",[],null,null,null,qi,lm)),al["\u0275did"](5,49152,null,0,om,[Yp.m],null,null),(e()(),al["\u0275ted"](-1,null,["\n"]))],null,null)}function Gi(e){switch(e.length){case 0:return new Rs.NoopAnimationPlayer;case 1:return e[0];default:return new Rs["\u0275AnimationGroupPlayer"](e)}}function Ki(e,t,n,r,i,o){void 0===i&&(i={}),void 0===o&&(o={});var l=[],a=[],s=-1,u=null;if(r.forEach(function(e){var n=e.offset,r=n==s,c=r&&u||{};Object.keys(e).forEach(function(n){var r=n,a=e[n];if("offset"!==n)switch(r=t.normalizePropertyName(r,l),a){case Rs["\u0275PRE_STYLE"]:a=i[n];break;case Rs.AUTO_STYLE:a=o[n];break;default:a=t.normalizeStyleValue(n,r,a,l)}c[r]=a}),r||a.push(c),u=c,s=n}),l.length)throw new Error("Unable to animate due to the following errors:\n - "+l.join("\n - "));return a}function $i(e,t,n,r){switch(t){case"start":e.onStart(function(){return r(n&&Zi(n,"start",e.totalTime))});break;case"done":e.onDone(function(){return r(n&&Zi(n,"done",e.totalTime))});break;case"destroy":e.onDestroy(function(){return r(n&&Zi(n,"destroy",e.totalTime))})}}function Zi(e,t,n){var r=Qi(e.element,e.triggerName,e.fromState,e.toState,t||e.phaseName,void 0==n?e.totalTime:n),i=e._data;return null!=i&&(r._data=i),r}function Qi(e,t,n,r,i,o){return void 0===i&&(i=""),void 0===o&&(o=0),{element:e,triggerName:t,fromState:n,toState:r,phaseName:i,totalTime:o}}function Yi(e,t,n){var r;return e instanceof Map?(r=e.get(t))||e.set(t,r=n):(r=e[t])||(r=e[t]=n),r}function Xi(e){var t=e.indexOf(":");return[e.substring(1,t),e.substr(t+1)]}function Ji(e){mm||(mm=eo()||{},gm=!!mm.style&&"WebkitAppearance"in mm.style);var t=!0;return mm.style&&"ebkit"!=e.substring(1,6)&&!(t=e in mm.style)&&gm&&(t="Webkit"+e.charAt(0).toUpperCase()+e.substr(1)in mm.style),t}function eo(){return"undefined"!=typeof document?document.body:null}function to(e){if("number"==typeof e)return e;var t=e.match(/^(-?[\.\d]+)(m?s)/);return!t||t.length<2?0:no(parseFloat(t[1]),t[2])}function no(e,t){switch(t){case"s":return e*xm;default:return e}}function ro(e,t,n){return e.hasOwnProperty("duration")?e:function(e,t,n){var r,i=0,o="";if("string"==typeof e){var l=e.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===l)return t.push('The provided timing value "'+e+'" is invalid.'),{duration:0,delay:0,easing:""};r=no(parseFloat(l[1]),l[2]);var a=l[3];null!=a&&(i=no(Math.floor(parseFloat(a)),l[4]));var s=l[5];s&&(o=s)}else r=e;if(!n){var u=!1,c=t.length;r<0&&(t.push("Duration values below 0 are not allowed for this animation step."),u=!0),i<0&&(t.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&t.splice(c,0,'The provided timing value "'+e+'" is invalid.')}return{duration:r,delay:i,easing:o}}(e,t,n)}function io(e,t){return void 0===t&&(t={}),Object.keys(e).forEach(function(n){t[n]=e[n]}),t}function oo(e,t,n){if(void 0===n&&(n={}),t)for(var r in e)n[r]=e[r];else io(e,n);return n}function lo(e,t){e.style&&Object.keys(t).forEach(function(n){var r=fo(n);e.style[r]=t[n]})}function ao(e,t){e.style&&Object.keys(t).forEach(function(t){var n=fo(t);e.style[n]=""})}function so(e){return Array.isArray(e)?1==e.length?e[0]:Object(Rs.sequence)(e):e}function uo(e){var t=[];if("string"==typeof e){for(var n=e.toString(),r=void 0;r=Om.exec(n);)t.push(r[1]);Om.lastIndex=0}return t}function co(e,t,n){var r=e.toString(),i=r.replace(Om,function(e,r){var i=t[r];return t.hasOwnProperty(r)||(n.push("Please provide a value for the animation param "+r),i=""),i.toString()});return i==r?e:i}function po(e){for(var t=[],n=e.next();!n.done;)t.push(n.value),n=e.next();return t}function fo(e){return e.replace(Tm,function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e[1].toUpperCase()})}function ho(e,t,n){switch(t.type){case 7:return e.visitTrigger(t,n);case 0:return e.visitState(t,n);case 1:return e.visitTransition(t,n);case 2:return e.visitSequence(t,n);case 3:return e.visitGroup(t,n);case 4:return e.visitAnimate(t,n);case 5:return e.visitKeyframes(t,n);case 6:return e.visitStyle(t,n);case 8:return e.visitReference(t,n);case 9:return e.visitAnimateChild(t,n);case 10:return e.visitAnimateRef(t,n);case 11:return e.visitQuery(t,n);case 12:return e.visitStagger(t,n);default:throw new Error("Unable to resolve animation metadata node #"+t.type)}}function mo(e,t){var n=Dm.has(e)||Im.has(e),r=Dm.has(t)||Im.has(t);return function(i,o){var l=e==km||e==i,a=t==km||t==o;return!l&&n&&"boolean"==typeof i&&(l=i?Dm.has(e):Im.has(e)),!a&&r&&"boolean"==typeof o&&(a=o?Dm.has(t):Im.has(t)),l&&a}}function go(e,t,n){return new Mm(e).build(t,n)}function yo(e){return!Array.isArray(e)&&"object"==typeof e}function vo(e){return e?(e=io(e)).params&&(e.params=function(e){return e?io(e):null}(e.params)):e={},e}function bo(e,t,n){return{duration:e,delay:t,easing:n}}function _o(e,t,n,r,i,o,l,a){return void 0===l&&(l=null),void 0===a&&(a=!1),{type:1,element:e,keyframes:t,preStyleProps:n,postStyleProps:r,duration:i,delay:o,totalTime:i+o,easing:l,subTimeline:a}}function wo(e,t,n,r,i,o,l,a,s,u){return void 0===o&&(o={}),void 0===l&&(l={}),void 0===u&&(u=[]),(new Fm).buildKeyframes(e,t,n,r,i,o,l,a,s,u)}function xo(e,t){void 0===t&&(t=3);var n=Math.pow(10,t-1);return Math.round(e*n)/n}function Co(e,t,n,r,i,o,l,a,s,u,c,d){return{type:0,element:e,triggerName:t,isRemovalTransition:i,fromState:n,fromStyles:o,toState:r,toStyles:l,timelines:a,queriedElements:s,preStyleProps:u,postStyleProps:c,errors:d}}function Eo(e,t,n){e.hasOwnProperty(t)?e.hasOwnProperty(n)||(e[n]=e[t]):e.hasOwnProperty(n)&&(e[t]=e[n])}function So(e){return e&&1===e.nodeType}function Oo(e,t){var n=e.style.display;return e.style.display=null!=t?t:"none",n}function To(e,t,n,r,i){var o=[];n.forEach(function(e){return o.push(Oo(e))});var l=[];r.forEach(function(n,r){var o={};n.forEach(function(e){var n=o[e]=t.computeStyle(r,e,i);n&&0!=n.length||(r[ng]=tg,l.push(r))}),e.set(r,o)});var a=0;return n.forEach(function(e){return Oo(e,o[a++])}),l}function ko(e,t){function n(e){if(!e)return i;var t=l.get(e);if(t)return t;var a=e.parentNode;return t=r.has(a)?a:o.has(a)?i:n(a),l.set(e,t),t}var r=new Map;if(e.forEach(function(e){return r.set(e,[])}),0==t.length)return r;var i=1,o=new Set(t),l=new Map;return t.forEach(function(e){var t=n(e);t!==i&&r.get(t).push(e)}),r}function Do(e,t){if(e.classList)e.classList.add(t);else{var n=e[ug];n||(n=e[ug]={}),n[t]=!0}}function Io(e,t){if(e.classList)e.classList.remove(t);else{var n=e[ug];n&&delete n[t]}}function Ro(e,t){for(var n=0;n<e.length;n++){var r=e[n];r instanceof Rs["\u0275AnimationGroupPlayer"]?Ro(r.players,t):t.push(r)}}function Mo(e,t,n){var r=n.get(e);if(!r)return!1;var i=t.get(e);return i?r.forEach(function(e){return i.add(e)}):t.set(e,r),n.delete(e),!0}function Po(e,t){return window.getComputedStyle(e)[t]}function No(e,t,n,r,i){return e.setProperty(t,"@@"+n+":"+r,i)}function Ao(){return"undefined"!=typeof Element&&"function"==typeof Element.prototype.animate?new pg:new _m}function Lo(){return new Wm}function Fo(e,t,n){return new gg(e,t,n)}function jo(e,t,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),Object(nu.a)(e,t,n)(this)}function Vo(){return"undefined"!=typeof window?window.indexedDB:self.indexedDB}function zo(e){return function(){return e.scrollStrategies.reposition()}}function Bo(e){return function(){return e.scrollStrategies.reposition()}}function Ho(e){return function(){return e.scrollStrategies.reposition()}}function Wo(e){return e||new Ng}function qo(e){return e||new Lg}function Uo(e){var t=(void 0===e?{dispatch:!0}:e).dispatch;return function(e,n){!function(t,n){var r=e.constructor,i=r.hasOwnProperty(ly)?r[ly]:Object.defineProperty(r,ly,{value:[]})[ly];Array.prototype.push.apply(i,n)}(0,[{propertyName:n,dispatch:t}])}}function Go(e){return Object.getPrototypeOf(e)}function Ko(e){var t=function(e){var t=Go(e).constructor.name,n=ay(e).map(function(n){var r=n.propertyName,i=n.dispatch,o="function"==typeof e[r]?e[r]():e[r];if(!1===i)return function(){return function(e){return e.lift(new Wg)}(this)}.call(o);var l=function(){return function(e){return e.lift(new Ug)}(this)}.call(o);return iu.a.call(l,function(n){return{effect:e[r],notification:n,propertyName:r,sourceName:t,sourceInstance:e}})});return Ll.a.apply(void 0,n)}(e);return function(t){var n=Go(e);return sy in n&&"function"==typeof n[sy]}()?e.ngrxOnRunEffects(t):t}function $o(e){var t=e.propertyName;return'"'+e.sourceName+"."+t+("function"==typeof e.sourceInstance[t]?"()":"")+'"'}function Zo(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return e}function Qo(){return console}function Yo(e,t){switch(void 0===e&&(e=yy),t.type){case Ad:return Object.assign({},e,{loading:!0});case Ld:return Object.assign({},e,{loaded:!0,loading:!1,dataverses:t.payload});case Fd:return Object.assign({},e,{createDataverse:[],createDataverseName:t.payload,createDataverseError:[],createDataverseSuccess:!1,createDataverseFailed:!1});case jd:return Object.assign({},e,{createDataverse:t.payload,createDataverseError:[],createDataverseSuccess:!0,createDataverseFailed:!1});case Vd:return Object.assign({},e,{createDataverse:[],createDataverseError:t.payload,createDataverseSuccess:!1,createDataverseFailed:!0});case zd:return Object.assign({},e,{dropDataverse:[],dropDataverseName:t.payload,dropDataverseError:[],dropDataverseSuccess:!1,dropDataverseFailed:!1});case Bd:return Object.assign({},e,{dropDataverse:t.payload,dropDataverseError:[],dropDataverseSuccess:!0,dropDataverseFailed:!1});case Hd:return Object.assign({},e,{dropDataverse:[],dropDataverseError:t.payload,dropDataverseSuccess:!1,dropDataverseFailed:!0});default:return e}}function Xo(e,t){switch(void 0===e&&(e=vy),t.type){case lp:return Object.assign({},e,{guideSelectsDataset:t.payload});case Xd:return Object.assign({},e,{loading:!0});case Jd:return Object.assign({},e,{loaded:!0,loading:!1,datasets:t.payload});case ep:return Object.assign({},e,{createDataset:[],createDatasetError:[],createDatasetSuccess:!1,createDatasetFailed:!1});case tp:return Object.assign({},e,{createDataset:t.payload,createDatasetName:t.payload,createDatasetError:[],createDatasetSuccess:!0,createDatasetFailed:!1});case np:return Object.assign({},e,{createDataset:[],createDatasetError:t.payload,createDatasetSuccess:!1,createDatasetFailed:!0});case rp:return Object.assign({},e,{dropDataset:[],dropDatasetError:[],dropDatasetName:t.payload,dropDatasetSuccess:!1,dropDatasetFailed:!1});case ip:return Object.assign({},e,{dropDataset:t.payload,dropDatasetError:[],dropDatasetSuccess:!0,dropDatasetFailed:!1});case op:return Object.assign({},e,{dropDataset:[],dropDatasetError:t.payload,dropDatasetSuccess:!1,dropDatasetFailed:!0});default:return e}}function Jo(e,t){switch(void 0===e&&(e=by),t.type){case yp:return Object.assign({},e,{loading:!0});case vp:return Object.assign({},e,{loaded:!0,loading:!1,datatypes:t.payload});case bp:return Object.assign({},e,{createDatatype:[],createDatatypeName:t.payload,createDatatypeError:[],createDatatypeSuccess:!1,createDatatypeFailed:!1});case _p:return Object.assign({},e,{createDatatype:t.payload,createDatatypeError:[],createDatatypeSuccess:!0,createDatatypeFailed:!1});case wp:return Object.assign({},e,{createDatatype:[],createDatatypeError:t.payload,createDatatypeSuccess:!1,createDatatypeFailed:!0});case xp:return Object.assign({},e,{dropDatatype:[],dropDatatypeName:t.payload,dropDatatypeError:[],dropDatatypeSuccess:!1,dropDatatypeFailed:!1});case Cp:return Object.assign({},e,{dropDatatype:t.payload,dropDatatypeError:[],dropDatatypeSuccess:!0,dropDatatypeFailed:!1});case Ep:return Object.assign({},e,{dropDatatype:[],dropDatatypeError:t.payload,dropDatatypeSuccess:!1,dropDatatypeFailed:!0});default:return e}}function el(e,t){switch(void 0===e&&(e=_y),t.type){case Np:return Object.assign({},e,{loading:!0});case Ap:return Object.assign({},e,{loaded:!0,loading:!1,indexes:t.payload});case Lp:return Object.assign({},e,{createIndex:[],createIndexName:t.payload,createIndexError:[],createIndexSuccess:!1,createIndexFailed:!1});case Fp:return Object.assign({},e,{createIndex:[],createIndexError:[],createIndexSuccess:!0,createIndexFailed:!1});case Fp:return Object.assign({},e,{createIndex:t.payload,createIndexError:[],createIndexSuccess:!1,createIndexFailed:!0});case jp:return Object.assign({},e,{dropIndex:[],dropIndexError:[],dropIndexName:t.payload,dropIndexSuccess:!1,dropIndexFailed:!1});case Vp:return Object.assign({},e,{dropIndex:t.payload,dropIndexError:[],dropIndexSuccess:!0,dropIndexFailed:!1});case zp:return Object.assign({},e,{dropIndex:[],dropIndexError:t.payload,dropIndexSuccess:!1,dropIndexFailed:!0});default:return e}}function tl(e,t){switch(void 0===e&&(e=wy),t.type){case Cd:return Object.assign({},e,{loading:!1,loaded:!0,success:!1,sqlQueryString:t.payload,sqlQueryResult:[],sqlQueryError:[]});case Ed:return Object.assign({},e,{loading:!1,loaded:!0,success:!0,sqlQueryResult:t.payload,sqlQueryError:[]});case Sd:return Object.assign({},e,{loading:!1,loaded:!0,success:!1,sqlQueryResult:[],sqlQueryError:t.payload});default:return e}}function nl(e,t){switch(void 0===e&&(e=xy),t.type){case Od:return Object.assign({},e,{loading:!1,loaded:!0,success:!1,sqlQueryMetadataString:t.payload,sqlQueryMetadataResult:[],sqlQueryMetadataError:[]});case Td:return Object.assign({},e,{loading:!1,loaded:!0,success:!0,sqlQueryMetadataResult:t.payload,sqlQueryMetadataError:[]});case kd:return Object.assign({},e,{loading:!1,loaded:!0,success:!1,sqlQueryMetadataResult:[],sqlQueryMetadataError:t.payload});default:return e}}function rl(e,t){switch(void 0===e&&(e=Cy),t.type){case Yh:return Object.assign({},e,{tree:[],loading:!0,loaded:!1});case Xh:return Object.assign({},e,{tree:e.tree.concat([t.payload]),loading:!1,loaded:!0});default:return e}}function il(e){return j(e)(this)}Object.defineProperty(t,"__esModule",{value:!0}),n("TU+8"),n("rgUS");var ol,ll,al=n("LMZF"),sl=function(){},ul=function(e){this.appCoreService=e,this.title="Asterix DB Web Console"},cl=n("Un6q"),dl="undefined"!=typeof Intl&&Intl.v8BreakIterator,pl=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!dl)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}(),fl=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"],hl=function(){},ml=n("TO51"),gl=n("AP4T"),yl=n("Oryw"),vl=yl.a.of,bl=n("6Xbx"),_l=n("8ofh"),wl=n("B1iP"),xl=n("NePw"),Cl=n("qLnt"),El=Object.prototype.toString,Sl=function(e){function t(t,n,r,i){e.call(this),this.sourceObj=t,this.eventName=n,this.selector=r,this.options=i}return Object(bl.__extends)(t,e),t.create=function(e,n,r,i){return Object(wl.a)(r)&&(i=r,r=void 0),new t(e,n,i,r)},t.setupSubscription=function(e,n,r,i,o){var l;if(e&&"[object NodeList]"===El.call(e)||e&&"[object HTMLCollection]"===El.call(e))for(var a=0,s=e.length;a<s;a++)t.setupSubscription(e[a],n,r,i,o);else if(e&&"function"==typeof e.addEventListener&&"function"==typeof e.removeEventListener){var u=e;e.addEventListener(n,r,o),l=function(){return u.removeEventListener(n,r)}}else if(e&&"function"==typeof e.on&&"function"==typeof e.off){var c=e;e.on(n,r),l=function(){return c.off(n,r)}}else{if(!e||"function"!=typeof e.addListener||"function"!=typeof e.removeListener)throw new TypeError("Invalid event target");var d=e;e.addListener(n,r),l=function(){return d.removeListener(n,r)}}i.add(new Cl.a(l))},t.prototype._subscribe=function(e){var n=this.selector;t.setupSubscription(this.sourceObj,this.eventName,n?function(){for(var t=[],r=0;r<arguments.length;r++)t[r-0]=arguments[r];var i=Object(_l.a)(n).apply(void 0,t);i===xl.a?e.error(xl.a.e):e.next(i)}:function(t){return e.next(t)},e,this.options)},t}(gl.a).create,Ol=n("GTlS"),Tl=new(n("wclm").a)(Ol.a),kl=n("lI6h"),Dl=n("qgI0"),Il=function(){function e(e){this.durationSelector=e}return e.prototype.call=function(e,t){return t.subscribe(new Rl(e,this.durationSelector))},e}(),Rl=function(e){function t(t,n){e.call(this,t),this.durationSelector=n,this.hasValue=!1}return Object(bl.__extends)(t,e),t.prototype._next=function(e){if(this.value=e,this.hasValue=!0,!this.throttled){var t=Object(_l.a)(this.durationSelector)(e);if(t===xl.a)this.destination.error(xl.a.e);else{var n=Object(Dl.a)(this,t);n.closed?this.clearThrottle():this.add(this.throttled=n)}}},t.prototype.clearThrottle=function(){var e=this.value,t=this.hasValue,n=this.throttled;n&&(this.remove(n),this.throttled=null,n.unsubscribe()),t&&(this.value=null,this.hasValue=!1,this.destination.next(e))},t.prototype.notifyNext=function(e,t,n,r){this.clearThrottle()},t.prototype.notifyComplete=function(){this.clearThrottle()},t}(kl.a),Ml=n("1j/l"),Pl=n("3iOE"),Nl=function(e){function t(t,n,r){void 0===t&&(t=0),e.call(this),this.period=-1,this.dueTime=0,function(e){return!Object(Ml.a)(e)&&e-parseFloat(e)+1>=0}(n)?this.period=Number(n)<1?1:Number(n):Object(Pl.a)(n)&&(r=n),Object(Pl.a)(r)||(r=Tl),this.scheduler=r,this.dueTime=function(e){return e instanceof Date&&!isNaN(+e)}(t)?+t-this.scheduler.now():t}return Object(bl.__extends)(t,e),t.create=function(e,n,r){return void 0===e&&(e=0),new t(e,n,r)},t.dispatch=function(e){var t=e.index,n=e.period,r=e.subscriber;if(r.next(t),!r.closed){if(-1===n)return r.complete();e.index=t+1,this.schedule(e,n)}},t.prototype._subscribe=function(e){return this.scheduler.schedule(t.dispatch,this.dueTime,{index:0,period:this.period,subscriber:e})},t}(gl.a).create,Al=n("LaOa"),Ll=n("2kLc"),Fl=function(){function e(e,t){this._ngZone=e,this._platform=t,this._scrolled=new ml.Subject,this._globalSubscription=null,this._scrolledCount=0,this.scrollContainers=new Map}return e.prototype.register=function(e){var t=this,n=e.elementScrolled().subscribe(function(){return t._scrolled.next(e)});this.scrollContainers.set(e,n)},e.prototype.deregister=function(e){var t=this.scrollContainers.get(e);t&&(t.unsubscribe(),this.scrollContainers.delete(e))},e.prototype.scrolled=function(e){var t=this;return void 0===e&&(e=20),this._platform.isBrowser?gl.a.create(function(n){t._globalSubscription||t._addGlobalListener();var r=e>0?t._scrolled.pipe(o(e)).subscribe(n):t._scrolled.subscribe(n);return t._scrolledCount++,function(){r.unsubscribe(),t._scrolledCount--,t._globalSubscription&&!t._scrolledCount&&(t._globalSubscription.unsubscribe(),t._globalSubscription=null)}}):vl()},e.prototype.ancestorScrolled=function(e,t){var n=this.getAncestorScrollContainers(e);return this.scrolled(t).pipe(Object(Al.a)(function(e){return!e||n.indexOf(e)>-1}))},e.prototype.getAncestorScrollContainers=function(e){var t=this,n=[];return this.scrollContainers.forEach(function(r,i){t._scrollableContainsElement(i,e)&&n.push(i)}),n},e.prototype._scrollableContainsElement=function(e,t){var n=t.nativeElement,r=e.getElementRef().nativeElement;do{if(n==r)return!0}while(n=n.parentElement);return!1},e.prototype._addGlobalListener=function(){var e=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return Sl(window.document,"scroll").subscribe(function(){return e._scrolled.next()})})},e}(),jl=function(){function e(e,t){var n=this;this._change=e.isBrowser?t.runOutsideAngular(function(){return Object(Ll.a)(Sl(window,"resize"),Sl(window,"orientationchange"))}):vl(),this._invalidateCache=this.change().subscribe(function(){return n._updateViewportSize()})}return e.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},e.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},e.prototype.getViewportRect=function(){var e=this.getViewportScrollPosition(),t=this.getViewportSize(),n=t.width,r=t.height;return{top:e.top,left:e.left,bottom:e.top+r,right:e.left+n,height:r,width:n}},e.prototype.getViewportScrollPosition=function(){var e=document.documentElement.getBoundingClientRect();return{top:-e.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-e.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},e.prototype.change=function(e){return void 0===e&&(e=20),e>0?this._change.pipe(o(e)):this._change},e.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},e}(),Vl=function(){},zl=new al.InjectionToken("cdk-dir-doc"),Bl=function(){return function(e){this.value="ltr",this.change=new al.EventEmitter,e&&(this.value=(e.body?e.body.dir:null)||(e.documentElement?e.documentElement.dir:null)||"ltr")}}(),Hl=function(){},Wl=function(){function e(){}return e.prototype.attach=function(e){return null==e&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),e.hasAttached()&&s(),this._attachedHost=e,e.attach(this)},e.prototype.detach=function(){var e=this._attachedHost;null==e?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,e.detach())},Object.defineProperty(e.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),e.prototype.setAttachedHost=function(e){this._attachedHost=e},e}(),ql=function(e){function t(t,n,r){var i=e.call(this)||this;return i.component=t,i.viewContainerRef=n,i.injector=r,i}return Object(bl.__extends)(t,e),t}(Wl),Ul=function(e){function t(t,n,r){var i=e.call(this)||this;return i.templateRef=t,i.viewContainerRef=n,r&&(i.context=r),i}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),t.prototype.attach=function(t,n){return void 0===n&&(n=this.context),this.context=n,e.prototype.attach.call(this,t)},t.prototype.detach=function(){return this.context=void 0,e.prototype.detach.call(this)},t}(Wl),Gl=function(){function e(){this._isDisposed=!1}return e.prototype.hasAttached=function(){return!!this._attachedPortal},e.prototype.attach=function(e){return e||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&s(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),e instanceof ql?(this._attachedPortal=e,this.attachComponentPortal(e)):e instanceof Ul?(this._attachedPortal=e,this.attachTemplatePortal(e)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},e.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},e.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},e.prototype.setDisposeFn=function(e){this._disposeFn=e},e.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},e}(),Kl=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o._hostDomElement=t,o._componentFactoryResolver=n,o._appRef=r,o._defaultInjector=i,o}return Object(bl.__extends)(t,e),t.prototype.attachComponentPortal=function(e){var t,n=this,r=this._componentFactoryResolver.resolveComponentFactory(e.component);return e.viewContainerRef?(t=e.viewContainerRef.createComponent(r,e.viewContainerRef.length,e.injector||e.viewContainerRef.parentInjector),this.setDisposeFn(function(){return t.destroy()})):(t=r.create(e.injector||this._defaultInjector),this._appRef.attachView(t.hostView),this.setDisposeFn(function(){n._appRef.detachView(t.hostView),t.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(t)),t},t.prototype.attachTemplatePortal=function(e){var t=this,n=e.viewContainerRef,r=n.createEmbeddedView(e.templateRef,e.context);return r.detectChanges(),r.rootNodes.forEach(function(e){return t._hostDomElement.appendChild(e)}),this.setDisposeFn(function(){var e=n.indexOf(r);-1!==e&&n.remove(e)}),r},t.prototype.dispose=function(){e.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},t.prototype._getComponentRootNode=function(e){return e.hostView.rootNodes[0]},t}(Gl),$l=function(e){function t(t,n){var r=e.call(this)||this;return r._componentFactoryResolver=t,r._viewContainerRef=n,r._isInitialized=!1,r}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(e){this.portal=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(e){this.portal=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"portal",{get:function(){return this._attachedPortal},set:function(t){(!this.hasAttached()||t||this._isInitialized)&&(this.hasAttached()&&e.prototype.detach.call(this),t&&e.prototype.attach.call(this,t),this._attachedPortal=t)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){this._isInitialized=!0},t.prototype.ngOnDestroy=function(){e.prototype.dispose.call(this),this._attachedPortal=null},t.prototype.attachComponentPortal=function(t){t.setAttachedHost(this);var n=null!=t.viewContainerRef?t.viewContainerRef:this._viewContainerRef,r=this._componentFactoryResolver.resolveComponentFactory(t.component),i=n.createComponent(r,n.length,t.injector||n.parentInjector);return e.prototype.setDisposeFn.call(this,function(){return i.destroy()}),this._attachedPortal=t,i},t.prototype.attachTemplatePortal=function(t){var n=this;t.setAttachedHost(this);var r=this._viewContainerRef.createEmbeddedView(t.templateRef,t.context);return e.prototype.setDisposeFn.call(this,function(){return n._viewContainerRef.clear()}),this._attachedPortal=t,r},t}(Gl),Zl=function(){},Ql=function(){function e(e,t){this._parentInjector=e,this._customTokens=t}return e.prototype.get=function(e,t){var n=this._customTokens.get(e);return void 0!==n?n:this._parentInjector.get(e,t)},e}(),Yl=n("E9/g"),Xl=function(e){function t(){var t=e.call(this,"argument out of range");this.name=t.name="ArgumentOutOfRangeError",this.stack=t.stack,this.message=t.message}return Object(bl.__extends)(t,e),t}(Error),Jl=n("Ecq+"),ea=function(){function e(e){if(this.total=e,this.total<0)throw new Xl}return e.prototype.call=function(e,t){return t.subscribe(new ta(e,this.total))},e}(),ta=function(e){function t(t,n){e.call(this,t),this.total=n,this.count=0}return Object(bl.__extends)(t,e),t.prototype._next=function(e){var t=this.total,n=++this.count;n<=t&&(this.destination.next(e),n===t&&(this.destination.complete(),this.unsubscribe()))},t}(Yl.a),na=function(){function e(){}return e.prototype.enable=function(){},e.prototype.disable=function(){},e.prototype.attach=function(){},e}(),ra=function(){return function(e){var t=this;this.scrollStrategy=new na,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",e&&Object.keys(e).forEach(function(n){return t[n]=e[n]})}}(),ia=function(){function e(e,t){this._scrollDispatcher=e,this._ngZone=t,this._scrollSubscription=null}return e.prototype.attach=function(e){if(this._overlayRef)throw f();this._overlayRef=e},e.prototype.enable=function(){var e=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){e._ngZone.run(function(){e.disable(),e._overlayRef.hasAttached()&&e._overlayRef.detach()})}))},e.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},e}(),oa=function(){function e(e){this._viewportRuler=e,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return e.prototype.attach=function(){},e.prototype.enable=function(){if(this._canBeEnabled()){var e=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=-this._previousScrollPosition.left+"px",e.style.top=-this._previousScrollPosition.top+"px",e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},e.prototype.disable=function(){if(this._isEnabled){var e=document.documentElement,t=document.body,n=e.style.scrollBehavior||"",r=t.style.scrollBehavior||"";this._isEnabled=!1,e.style.left=this._previousHTMLStyles.left,e.style.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),e.style.scrollBehavior=t.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),e.style.scrollBehavior=n,t.style.scrollBehavior=r}},e.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var e=document.body,t=this._viewportRuler.getViewportSize();return e.scrollHeight>t.height||e.scrollWidth>t.width},e}(),la=function(){function e(e,t,n,r){this._scrollDispatcher=e,this._viewportRuler=t,this._ngZone=n,this._config=r,this._scrollSubscription=null}return e.prototype.attach=function(e){if(this._overlayRef)throw f();this._overlayRef=e},e.prototype.enable=function(){var e=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(e._overlayRef.updatePosition(),e._config&&e._config.autoClose){var t=e._overlayRef.overlayElement.getBoundingClientRect(),n=e._viewportRuler.getViewportSize(),r=n.width,i=n.height;h(t,[{width:r,height:i,bottom:i,right:r,top:0,left:0}])&&(e.disable(),e._ngZone.run(function(){return e._overlayRef.detach()}))}}))},e.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},e}(),aa=function(){return function(e,t,n){var r=this;this._scrollDispatcher=e,this._viewportRuler=t,this._ngZone=n,this.noop=function(){return new na},this.close=function(){return new ia(r._scrollDispatcher,r._ngZone)},this.block=function(){return new oa(r._viewportRuler)},this.reposition=function(e){return new la(r._scrollDispatcher,r._viewportRuler,r._ngZone,e)}}}(),sa=function(){function e(e,t,n,r,i){this._portalOutlet=e,this._pane=t,this._config=n,this._ngZone=r,this._keyboardDispatcher=i,this._backdropElement=null,this._backdropClick=new ml.Subject,this._attachments=new ml.Subject,this._detachments=new ml.Subject,this._keydownEvents=new ml.Subject,n.scrollStrategy&&n.scrollStrategy.attach(this)}return Object.defineProperty(e.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),e.prototype.attach=function(e){var t=this,n=this._portalOutlet.attach(e);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(u(1)).subscribe(function(){t.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(e){return t._pane.classList.add(e)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),n},e.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var e=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),e}},e.prototype.dispose=function(){var e=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),e&&this._detachments.next(),this._detachments.complete()},e.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},e.prototype.backdropClick=function(){return this._backdropClick.asObservable()},e.prototype.attachments=function(){return this._attachments.asObservable()},e.prototype.detachments=function(){return this._detachments.asObservable()},e.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},e.prototype.getConfig=function(){return this._config},e.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},e.prototype.updateSize=function(e){this._config=Object(bl.__assign)({},this._config,e),this._updateElementSize()},e.prototype.setDirection=function(e){this._config=Object(bl.__assign)({},this._config,{direction:e}),this._updateElementDirection()},e.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},e.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=g(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=g(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=g(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=g(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=g(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=g(this._config.maxHeight))},e.prototype._togglePointerEvents=function(e){this._pane.style.pointerEvents=e?"auto":"none"},e.prototype._attachBackdrop=function(){var e=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return e._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){e._backdropElement&&e._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},e.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},e.prototype.detachBackdrop=function(){var e=this,t=this._backdropElement;if(t){var n=function(){t&&t.parentNode&&t.parentNode.removeChild(t),e._backdropElement==t&&(e._backdropElement=null)};t.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&t.classList.remove(this._config.backdropClass),t.addEventListener("transitionend",n),t.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(n,500)})}},e}(),ua=function(){function e(e,t,n,r,i){this._connectedTo=n,this._viewportRuler=r,this._document=i,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=Cl.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new ml.Subject,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(e,t)}return Object.defineProperty(e.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),e.prototype.attach=function(e){var t=this;this._overlayRef=e,this._pane=e.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return t.apply()})},e.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},e.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},e.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var e,t,n=this._pane,r=this._origin.getBoundingClientRect(),i=n.getBoundingClientRect(),o=this._viewportRuler.getViewportSize(),l=0,a=this._preferredPositions;l<a.length;l++){var s=a[l],u=this._getOriginConnectionPoint(r,s),c=this._getOverlayPoint(u,i,o,s);if(c.fitsInViewport)return this._setElementPosition(n,i,c,s),void(this._lastConnectedPosition=s);(!e||e.visibleArea<c.visibleArea)&&(e=c,t=s)}this._setElementPosition(n,i,e,t)}},e.prototype.recalculateLastPosition=function(){if(this._lastConnectedPosition){var e=this._origin.getBoundingClientRect(),t=this._pane.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),r=this._lastConnectedPosition||this._preferredPositions[0],i=this._getOriginConnectionPoint(e,r),o=this._getOverlayPoint(i,t,n,r);this._setElementPosition(this._pane,t,o,r)}},e.prototype.withScrollableContainers=function(e){this.scrollables=e},e.prototype.withFallbackPosition=function(e,t,n,r){var i=new function(e,t,n,r){this.offsetX=n,this.offsetY=r,this.originX=e.originX,this.originY=e.originY,this.overlayX=t.overlayX,this.overlayY=t.overlayY}(e,t,n,r);return this._preferredPositions.push(i),this},e.prototype.withDirection=function(e){return this._dir=e,this},e.prototype.withOffsetX=function(e){return this._offsetX=e,this},e.prototype.withOffsetY=function(e){return this._offsetY=e,this},e.prototype.withLockedPosition=function(e){return this._positionLocked=e,this},e.prototype._getStartX=function(e){return this._isRtl?e.right:e.left},e.prototype._getEndX=function(e){return this._isRtl?e.left:e.right},e.prototype._getOriginConnectionPoint=function(e,t){var n,r=this._getStartX(e),i=this._getEndX(e);n="center"==t.originX?r+e.width/2:"start"==t.originX?r:i;var o;return o="center"==t.originY?e.top+e.height/2:"top"==t.originY?e.top:e.bottom,{x:n,y:o}},e.prototype._getOverlayPoint=function(e,t,n,r){var i;i="center"==r.overlayX?-t.width/2:"start"===r.overlayX?this._isRtl?-t.width:0:this._isRtl?0:-t.width;var o;o="center"==r.overlayY?-t.height/2:"top"==r.overlayY?0:-t.height;var l=e.x+i+(void 0===r.offsetX?this._offsetX:r.offsetX),a=e.y+o+(void 0===r.offsetY?this._offsetY:r.offsetY),s=0-a,u=a+t.height-n.height,c=this._subtractOverflows(t.width,0-l,l+t.width-n.width)*this._subtractOverflows(t.height,s,u);return{x:l,y:a,fitsInViewport:t.width*t.height===c,visibleArea:c}},e.prototype._getScrollVisibility=function(e){var t=this._origin.getBoundingClientRect(),n=e.getBoundingClientRect(),r=this.scrollables.map(function(e){return e.getElementRef().nativeElement.getBoundingClientRect()});return{isOriginClipped:m(t,r),isOriginOutsideView:h(t,r),isOverlayClipped:m(n,r),isOverlayOutsideView:h(n,r)}},e.prototype._setElementPosition=function(e,t,n,r){var i,o="bottom"===r.overlayY?"bottom":"top",l="top"===o?n.y:this._document.documentElement.clientHeight-(n.y+t.height),a="left"==(i="rtl"===this._dir?"end"===r.overlayX?"left":"right":"end"===r.overlayX?"right":"left")?n.x:this._document.documentElement.clientWidth-(n.x+t.width);["top","bottom","left","right"].forEach(function(t){return e.style[t]=null}),e.style[o]=l+"px",e.style[i]=a+"px";var s=new function(e,t){this.connectionPair=e,this.scrollableViewProperties=t}(r,this._getScrollVisibility(e));this._onPositionChange.next(s)},e.prototype._subtractOverflows=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return t.reduce(function(e,t){return e-Math.max(t,0)},e)},e}(),ca=function(){function e(e){this._document=e,this._cssPosition="static",this._topOffset="",this._bottomOffset="",this._leftOffset="",this._rightOffset="",this._alignItems="",this._justifyContent="",this._width="",this._height="",this._wrapper=null}return e.prototype.attach=function(e){this._overlayRef=e},e.prototype.top=function(e){return void 0===e&&(e=""),this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this},e.prototype.left=function(e){return void 0===e&&(e=""),this._rightOffset="",this._leftOffset=e,this._justifyContent="flex-start",this},e.prototype.bottom=function(e){return void 0===e&&(e=""),this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this},e.prototype.right=function(e){return void 0===e&&(e=""),this._leftOffset="",this._rightOffset=e,this._justifyContent="flex-end",this},e.prototype.width=function(e){return void 0===e&&(e=""),this._width=e,"100%"===e&&this.left("0px"),this},e.prototype.height=function(e){return void 0===e&&(e=""),this._height=e,"100%"===e&&this.top("0px"),this},e.prototype.centerHorizontally=function(e){return void 0===e&&(e=""),this.left(e),this._justifyContent="center",this},e.prototype.centerVertically=function(e){return void 0===e&&(e=""),this.top(e),this._alignItems="center",this},e.prototype.apply=function(){var e=this._overlayRef.overlayElement;!this._wrapper&&e.parentNode&&(this._wrapper=this._document.createElement("div"),this._wrapper.classList.add("cdk-global-overlay-wrapper"),e.parentNode.insertBefore(this._wrapper,e),this._wrapper.appendChild(e));var t=e.style,n=e.parentNode.style;t.position=this._cssPosition,t.marginTop=this._topOffset,t.marginLeft=this._leftOffset,t.marginBottom=this._bottomOffset,t.marginRight=this._rightOffset,t.width=this._width,t.height=this._height,n.justifyContent=this._justifyContent,n.alignItems=this._alignItems},e.prototype.dispose=function(){this._wrapper&&this._wrapper.parentNode&&(this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null)},e}(),da=function(){function e(e,t){this._viewportRuler=e,this._document=t}return e.prototype.global=function(){return new ca(this._document)},e.prototype.connectedTo=function(e,t,n){return new ua(t,n,e,this._viewportRuler,this._document)},e}(),pa=function(){function e(e){this._document=e,this._attachedOverlays=[]}return e.prototype.ngOnDestroy=function(){this._unsubscribeFromKeydownEvents()},e.prototype.add=function(e){this._keydownEventSubscription||this._subscribeToKeydownEvents(),this._attachedOverlays.push(e)},e.prototype.remove=function(e){var t=this._attachedOverlays.indexOf(e);t>-1&&this._attachedOverlays.splice(t,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},e.prototype._subscribeToKeydownEvents=function(){var e=this,t=Sl(this._document.body,"keydown");this._keydownEventSubscription=t.pipe(Object(Al.a)(function(){return!!e._attachedOverlays.length})).subscribe(function(t){e._selectOverlayFromEvent(t)._keydownEvents.next(t)})},e.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},e.prototype._selectOverlayFromEvent=function(e){return this._attachedOverlays.find(function(t){return t.overlayElement===e.target||t.overlayElement.contains(e.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},e}(),fa=function(){function e(e){this._document=e}return e.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},e.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},e.prototype._createContainer=function(){var e=this._document.createElement("div");e.classList.add("cdk-overlay-container"),this._document.body.appendChild(e),this._containerElement=e},e}(),ha=0,ma=new ra,ga=function(){function e(e,t,n,r,i,o,l,a,s){this.scrollStrategies=e,this._overlayContainer=t,this._componentFactoryResolver=n,this._positionBuilder=r,this._keyboardDispatcher=i,this._appRef=o,this._injector=l,this._ngZone=a,this._document=s}return e.prototype.create=function(e){void 0===e&&(e=ma);var t=this._createPaneElement(),n=this._createPortalOutlet(t);return new sa(n,t,e,this._ngZone,this._keyboardDispatcher)},e.prototype.position=function(){return this._positionBuilder},e.prototype._createPaneElement=function(){var e=this._document.createElement("div");return e.id="cdk-overlay-"+ha++,e.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(e),e},e.prototype._createPortalOutlet=function(e){return new Kl(e,this._componentFactoryResolver,this._appRef,this._injector)},e}(),ya=new al.InjectionToken("cdk-connected-overlay-scroll-strategy"),va=function(){},ba=function(){function e(e,t){this.dueTime=e,this.scheduler=t}return e.prototype.call=function(e,t){return t.subscribe(new _a(e,this.dueTime,this.scheduler))},e}(),_a=function(e){function t(t,n,r){e.call(this,t),this.dueTime=n,this.scheduler=r,this.debouncedSubscription=null,this.lastValue=null,this.hasValue=!1}return Object(bl.__extends)(t,e),t.prototype._next=function(e){this.clearDebounce(),this.lastValue=e,this.hasValue=!0,this.add(this.debouncedSubscription=this.scheduler.schedule(w,this.dueTime,this))},t.prototype._complete=function(){this.debouncedNext(),this.destination.complete()},t.prototype.debouncedNext=function(){this.clearDebounce(),this.hasValue&&(this.destination.next(this.lastValue),this.lastValue=null,this.hasValue=!1)},t.prototype.clearDebounce=function(){var e=this.debouncedSubscription;null!==e&&(this.remove(e),e.unsubscribe(),this.debouncedSubscription=null)},t}(Yl.a),wa=n("qqDE"),xa=function(){function e(e,t,n){this.nextOrObserver=e,this.error=t,this.complete=n}return e.prototype.call=function(e,t){return t.subscribe(new Ca(e,this.nextOrObserver,this.error,this.complete))},e}(),Ca=function(e){function t(t,n,r,i){e.call(this,t);var o=new Yl.a(n,r,i);o.syncErrorThrowable=!0,this.add(o),this.safeSubscriber=o}return Object(bl.__extends)(t,e),t.prototype._next=function(e){var t=this.safeSubscriber;t.next(e),t.syncErrorThrown?this.destination.error(t.syncErrorValue):this.destination.next(e)},t.prototype._error=function(e){var t=this.safeSubscriber;t.error(e),this.destination.error(t.syncErrorThrown?t.syncErrorValue:e)},t.prototype._complete=function(){var e=this.safeSubscriber;e.complete(),e.syncErrorThrown?this.destination.error(e.syncErrorValue):this.destination.complete()},t}(Yl.a),Ea=function(){function e(e){this._platform=e}return e.prototype.isDisabled=function(e){return e.hasAttribute("disabled")},e.prototype.isVisible=function(e){return!!(e.offsetWidth||e.offsetHeight||"function"==typeof e.getClientRects&&e.getClientRects().length)&&"visible"===getComputedStyle(e).visibility},e.prototype.isTabbable=function(e){if(!this._platform.isBrowser)return!1;var t=(e.ownerDocument.defaultView||window).frameElement;if(t){var n=t&&t.nodeName.toLowerCase();if(-1===E(t))return!1;if((this._platform.BLINK||this._platform.WEBKIT)&&"object"===n)return!1;if((this._platform.BLINK||this._platform.WEBKIT)&&!this.isVisible(t))return!1}var r=e.nodeName.toLowerCase(),i=E(e);if(e.hasAttribute("contenteditable"))return-1!==i;if("iframe"===r)return!1;if("audio"===r){if(!e.hasAttribute("controls"))return!1;if(this._platform.BLINK)return!0}if("video"===r){if(!e.hasAttribute("controls")&&this._platform.TRIDENT)return!1;if(this._platform.BLINK||this._platform.FIREFOX)return!0}return("object"!==r||!this._platform.BLINK&&!this._platform.WEBKIT)&&!(this._platform.WEBKIT&&this._platform.IOS&&!function(e){var t=e.nodeName.toLowerCase(),n="input"===t&&e.type;return"text"===n||"password"===n||"select"===t||"textarea"===t}(e))&&e.tabIndex>=0},e.prototype.isFocusable=function(e){return function(e){return!function(e){return"input"==e.nodeName.toLowerCase()&&"hidden"==e.type}(e)&&(function(t){var n=e.nodeName.toLowerCase();return"input"===n||"select"===n||"button"===n||"textarea"===n}()||function(e){return"a"==e.nodeName.toLowerCase()&&e.hasAttribute("href")}(e)||e.hasAttribute("contenteditable")||C(e))}(e)&&!this.isDisabled(e)&&this.isVisible(e)},e}(),Sa=function(){function e(e,t,n,r,i){void 0===i&&(i=!1),this._element=e,this._checker=t,this._ngZone=n,this._document=r,this._enabled=!0,i||this.attachAnchors()}return Object.defineProperty(e.prototype,"enabled",{get:function(){return this._enabled},set:function(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},e.prototype.attachAnchors=function(){var e=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){e._startAnchor.addEventListener("focus",function(){e.focusLastTabbableElement()}),e._endAnchor.addEventListener("focus",function(){e.focusFirstTabbableElement()}),e._element.parentNode&&(e._element.parentNode.insertBefore(e._startAnchor,e._element),e._element.parentNode.insertBefore(e._endAnchor,e._element.nextSibling))})},e.prototype.focusInitialElementWhenReady=function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusInitialElement())})})},e.prototype.focusFirstTabbableElementWhenReady=function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusFirstTabbableElement())})})},e.prototype.focusLastTabbableElementWhenReady=function(){var e=this;return new Promise(function(t){e._executeOnStable(function(){return t(e.focusLastTabbableElement())})})},e.prototype._getRegionBoundary=function(e){for(var t=this._element.querySelectorAll("[cdk-focus-region-"+e+"], [cdkFocusRegion"+e+"], [cdk-focus-"+e+"]"),n=0;n<t.length;n++)t[n].hasAttribute("cdk-focus-"+e)?console.warn("Found use of deprecated attribute 'cdk-focus-"+e+"', use 'cdkFocusRegion"+e+"' instead.",t[n]):t[n].hasAttribute("cdk-focus-region-"+e)&&console.warn("Found use of deprecated attribute 'cdk-focus-region-"+e+"', use 'cdkFocusRegion"+e+"' instead.",t[n]);return"start"==e?t.length?t[0]:this._getFirstTabbableElement(this._element):t.length?t[t.length-1]:this._getLastTabbableElement(this._element)},e.prototype.focusInitialElement=function(){var e=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");return this._element.hasAttribute("cdk-focus-initial")&&console.warn("Found use of deprecated attribute 'cdk-focus-initial', use 'cdkFocusInitial' instead.",this._element),e?(e.focus(),!0):this.focusFirstTabbableElement()},e.prototype.focusFirstTabbableElement=function(){var e=this._getRegionBoundary("start");return e&&e.focus(),!!e},e.prototype.focusLastTabbableElement=function(){var e=this._getRegionBoundary("end");return e&&e.focus(),!!e},e.prototype._getFirstTabbableElement=function(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;for(var t=e.children||e.childNodes,n=0;n<t.length;n++){var r=t[n].nodeType===Node.ELEMENT_NODE?this._getFirstTabbableElement(t[n]):null;if(r)return r}return null},e.prototype._getLastTabbableElement=function(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;for(var t=e.children||e.childNodes,n=t.length-1;n>=0;n--){var r=t[n].nodeType===Node.ELEMENT_NODE?this._getLastTabbableElement(t[n]):null;if(r)return r}return null},e.prototype._createAnchor=function(){var e=this._document.createElement("div");return e.tabIndex=this._enabled?0:-1,e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e},e.prototype._executeOnStable=function(e){this._ngZone.isStable?e():this._ngZone.onStable.asObservable().pipe(u(1)).subscribe(e)},e}(),Oa=function(){function e(e,t,n){this._checker=e,this._ngZone=t,this._document=n}return e.prototype.create=function(e,t){return void 0===t&&(t=!1),new Sa(e,this._checker,this._ngZone,this._document,t)},e}(),Ta=function(){function e(e,t,n){this._elementRef=e,this._focusTrapFactory=t,this._previouslyFocusedElement=null,this._document=n,this.focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement,!0)}return Object.defineProperty(e.prototype,"enabled",{get:function(){return this.focusTrap.enabled},set:function(e){this.focusTrap.enabled=c(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"autoCapture",{get:function(){return this._autoCapture},set:function(e){this._autoCapture=c(e)},enumerable:!0,configurable:!0}),e.prototype.ngOnDestroy=function(){this.focusTrap.destroy(),this._previouslyFocusedElement&&(this._previouslyFocusedElement.focus(),this._previouslyFocusedElement=null)},e.prototype.ngAfterContentInit=function(){this.focusTrap.attachAnchors(),this.autoCapture&&(this._previouslyFocusedElement=this._document.activeElement,this.focusTrap.focusInitialElementWhenReady())},e}(),ka="cdk-describedby-message",Da="cdk-describedby-host",Ia=0,Ra=new Map,Ma=null,Pa=function(){function e(e){this._document=e}return e.prototype.describe=function(e,t){t.trim()&&(Ra.has(t)||this._createMessageElement(t),this._isElementDescribedByMessage(e,t)||this._addMessageReference(e,t))},e.prototype.removeDescription=function(e,t){if(t.trim()){this._isElementDescribedByMessage(e,t)&&this._removeMessageReference(e,t);var n=Ra.get(t);n&&0===n.referenceCount&&this._deleteMessageElement(t),Ma&&0===Ma.childNodes.length&&this._deleteMessagesContainer()}},e.prototype.ngOnDestroy=function(){for(var e=this._document.querySelectorAll("["+Da+"]"),t=0;t<e.length;t++)this._removeCdkDescribedByReferenceIds(e[t]),e[t].removeAttribute(Da);Ma&&this._deleteMessagesContainer(),Ra.clear()},e.prototype._createMessageElement=function(e){var t=this._document.createElement("div");t.setAttribute("id",ka+"-"+Ia++),t.appendChild(this._document.createTextNode(e)),Ma||this._createMessagesContainer(),Ma.appendChild(t),Ra.set(e,{messageElement:t,referenceCount:0})},e.prototype._deleteMessageElement=function(e){var t=Ra.get(e),n=t&&t.messageElement;Ma&&n&&Ma.removeChild(n),Ra.delete(e)},e.prototype._createMessagesContainer=function(){(Ma=this._document.createElement("div")).setAttribute("id","cdk-describedby-message-container"),Ma.setAttribute("aria-hidden","true"),Ma.style.display="none",this._document.body.appendChild(Ma)},e.prototype._deleteMessagesContainer=function(){this._document.body.removeChild(Ma),Ma=null},e.prototype._removeCdkDescribedByReferenceIds=function(e){var t=S(e,"aria-describedby").filter(function(e){return 0!=e.indexOf(ka)});e.setAttribute("aria-describedby",t.join(" "))},e.prototype._addMessageReference=function(e,t){var n=Ra.get(t);!function(e,t,n){var r=S(e,"aria-describedby");r.some(function(e){return e.trim()==n.trim()})||(r.push(n.trim()),e.setAttribute("aria-describedby",r.join(" ")))}(e,0,n.messageElement.id),e.setAttribute(Da,""),n.referenceCount++},e.prototype._removeMessageReference=function(e,t){var n=Ra.get(t);n.referenceCount--,function(e,t,n){var r=S(e,"aria-describedby").filter(function(e){return e!=n.trim()});e.setAttribute("aria-describedby",r.join(" "))}(e,0,n.messageElement.id),e.removeAttribute(Da)},e.prototype._isElementDescribedByMessage=function(e,t){var n=S(e,"aria-describedby"),r=Ra.get(t),i=r&&r.messageElement.id;return!!i&&-1!=n.indexOf(i)},e}(),Na=new al.InjectionToken("liveAnnouncerElement"),Aa=function(){function e(e,t){this._document=t,this._liveElement=e||this._createLiveElement()}return e.prototype.announce=function(e,t){var n=this;void 0===t&&(t="polite"),this._liveElement.textContent="",this._liveElement.setAttribute("aria-live",t),setTimeout(function(){return n._liveElement.textContent=e},100)},e.prototype.ngOnDestroy=function(){this._liveElement&&this._liveElement.parentNode&&this._liveElement.parentNode.removeChild(this._liveElement)},e.prototype._createLiveElement=function(){var e=this._document.createElement("div");return e.classList.add("cdk-visually-hidden"),e.setAttribute("aria-atomic","true"),e.setAttribute("aria-live","polite"),this._document.body.appendChild(e),e},e}(),La=function(){function e(e,t){this._ngZone=e,this._platform=t,this._origin=null,this._windowFocused=!1,this._elementInfo=new WeakMap,this._unregisterGlobalListeners=function(){},this._monitoredElementCount=0}return e.prototype.monitor=function(e,t,n){var r=this;if(t instanceof al.Renderer2||(n=t),n=!!n,!this._platform.isBrowser)return vl(null);if(this._elementInfo.has(e)){var i=this._elementInfo.get(e);return i.checkChildren=n,i.subject.asObservable()}var o={unlisten:function(){},checkChildren:n,subject:new ml.Subject};this._elementInfo.set(e,o),this._incrementMonitoredElementCount();var l=function(t){return r._onFocus(t,e)},a=function(t){return r._onBlur(t,e)};return this._ngZone.runOutsideAngular(function(){e.addEventListener("focus",l,!0),e.addEventListener("blur",a,!0)}),o.unlisten=function(){e.removeEventListener("focus",l,!0),e.removeEventListener("blur",a,!0)},o.subject.asObservable()},e.prototype.stopMonitoring=function(e){var t=this._elementInfo.get(e);t&&(t.unlisten(),t.subject.complete(),this._setClasses(e),this._elementInfo.delete(e),this._decrementMonitoredElementCount())},e.prototype.focusVia=function(e,t){this._setOriginForCurrentEventQueue(t),e.focus()},e.prototype._registerGlobalListeners=function(){var e=this;if(this._platform.isBrowser){var t=function(){e._lastTouchTarget=null,e._setOriginForCurrentEventQueue("keyboard")},n=function(){e._lastTouchTarget||e._setOriginForCurrentEventQueue("mouse")},i=function(t){null!=e._touchTimeout&&clearTimeout(e._touchTimeout),e._lastTouchTarget=t.target,e._touchTimeout=setTimeout(function(){return e._lastTouchTarget=null},650)},o=function(){e._windowFocused=!0,setTimeout(function(){return e._windowFocused=!1},0)};this._ngZone.runOutsideAngular(function(){document.addEventListener("keydown",t,!0),document.addEventListener("mousedown",n,!0),document.addEventListener("touchstart",i,!r()||{passive:!0,capture:!0}),window.addEventListener("focus",o)}),this._unregisterGlobalListeners=function(){document.removeEventListener("keydown",t,!0),document.removeEventListener("mousedown",n,!0),document.removeEventListener("touchstart",i,!r()||{passive:!0,capture:!0}),window.removeEventListener("focus",o)}}},e.prototype._toggleClass=function(e,t,n){n?e.classList.add(t):e.classList.remove(t)},e.prototype._setClasses=function(e,t){this._elementInfo.get(e)&&(this._toggleClass(e,"cdk-focused",!!t),this._toggleClass(e,"cdk-touch-focused","touch"===t),this._toggleClass(e,"cdk-keyboard-focused","keyboard"===t),this._toggleClass(e,"cdk-mouse-focused","mouse"===t),this._toggleClass(e,"cdk-program-focused","program"===t))},e.prototype._setOriginForCurrentEventQueue=function(e){var t=this;this._origin=e,setTimeout(function(){return t._origin=null},0)},e.prototype._wasCausedByTouch=function(e){var t=e.target;return this._lastTouchTarget instanceof Node&&t instanceof Node&&(t===this._lastTouchTarget||t.contains(this._lastTouchTarget))},e.prototype._onFocus=function(e,t){var n=this._elementInfo.get(t);n&&(n.checkChildren||t===e.target)&&(this._origin||(this._origin=this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:this._wasCausedByTouch(e)?"touch":"program"),this._setClasses(t,this._origin),n.subject.next(this._origin),this._lastFocusOrigin=this._origin,this._origin=null)},e.prototype._onBlur=function(e,t){var n=this._elementInfo.get(t);!n||n.checkChildren&&e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||(this._setClasses(t),n.subject.next(null))},e.prototype._incrementMonitoredElementCount=function(){1==++this._monitoredElementCount&&this._registerGlobalListeners()},e.prototype._decrementMonitoredElementCount=function(){--this._monitoredElementCount||(this._unregisterGlobalListeners(),this._unregisterGlobalListeners=function(){})},e}(),Fa=function(){function e(e,t){var n=this;this._elementRef=e,this._focusMonitor=t,this.cdkFocusChange=new al.EventEmitter,this._monitorSubscription=this._focusMonitor.monitor(this._elementRef.nativeElement,this._elementRef.nativeElement.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(function(e){return n.cdkFocusChange.emit(e)})}return e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement),this._monitorSubscription.unsubscribe()},e}(),ja=function(){},Va=n("RyBE"),za=new al.InjectionToken("mat-sanity-checks"),Ba=function(){function e(e){this._sanityChecksEnabled=e,this._hasDoneGlobalChecks=!1,this._hasCheckedHammer=!1,this._document="object"==typeof document&&document?document:null,this._window="object"==typeof window&&window?window:null,this._areChecksEnabled()&&!this._hasDoneGlobalChecks&&(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._hasDoneGlobalChecks=!0)}return e.prototype._areChecksEnabled=function(){return this._sanityChecksEnabled&&Object(al.isDevMode)()&&!this._isTestEnv()},e.prototype._isTestEnv=function(){return this._window&&(this._window.__karma__||this._window.jasmine)},e.prototype._checkDoctypeIsDefined=function(){this._document&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")},e.prototype._checkThemeIsPresent=function(){if(this._document&&"function"==typeof getComputedStyle){var e=this._document.createElement("div");e.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(e);var t=getComputedStyle(e);t&&"none"!==t.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(e)}},e.prototype._checkHammerIsAvailable=function(){!this._hasCheckedHammer&&this._window&&(this._areChecksEnabled()&&!this._window.Hammer&&console.warn("Could not find HammerJS. Certain Angular Material components may not work correctly."),this._hasCheckedHammer=!0)},e}(),Ha=new al.InjectionToken("MAT_DATE_LOCALE"),Wa=function(){function e(){this._localeChanges=new ml.Subject}return Object.defineProperty(e.prototype,"localeChanges",{get:function(){return this._localeChanges},enumerable:!0,configurable:!0}),e.prototype.deserialize=function(e){return null==e||this.isDateInstance(e)&&this.isValid(e)?e:this.invalid()},e.prototype.setLocale=function(e){this.locale=e,this._localeChanges.next()},e.prototype.compareDate=function(e,t){return this.getYear(e)-this.getYear(t)||this.getMonth(e)-this.getMonth(t)||this.getDate(e)-this.getDate(t)},e.prototype.sameDate=function(e,t){if(e&&t){var n=this.isValid(e),r=this.isValid(t);return n&&r?!this.compareDate(e,t):n==r}return e==t},e.prototype.clampDate=function(e,t,n){return t&&this.compareDate(e,t)<0?t:n&&this.compareDate(e,n)>0?n:e},e}(),qa=new al.InjectionToken("mat-date-formats"),Ua="undefined"!=typeof Intl,Ga={long:["January","February","March","April","May","June","July","August","September","October","November","December"],short:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],narrow:["J","F","M","A","M","J","J","A","S","O","N","D"]},Ka=M(31,function(e){return String(e+1)}),$a={long:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],short:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],narrow:["S","M","T","W","T","F","S"]},Za=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|(?:(?:\+|-)\d{2}:\d{2}))?)?$/,Qa=function(e){function t(t){var n=e.call(this)||this;return e.prototype.setLocale.call(n,t),n.useUtcForDisplay=!("object"==typeof document&&document&&/(msie|trident)/i.test(navigator.userAgent)),n}return Object(bl.__extends)(t,e),t.prototype.getYear=function(e){return e.getFullYear()},t.prototype.getMonth=function(e){return e.getMonth()},t.prototype.getDate=function(e){return e.getDate()},t.prototype.getDayOfWeek=function(e){return e.getDay()},t.prototype.getMonthNames=function(e){var t=this;if(Ua){var n=new Intl.DateTimeFormat(this.locale,{month:e});return M(12,function(e){return t._stripDirectionalityCharacters(n.format(new Date(2017,e,1)))})}return Ga[e]},t.prototype.getDateNames=function(){var e=this;if(Ua){var t=new Intl.DateTimeFormat(this.locale,{day:"numeric"});return M(31,function(n){return e._stripDirectionalityCharacters(t.format(new Date(2017,0,n+1)))})}return Ka},t.prototype.getDayOfWeekNames=function(e){var t=this;if(Ua){var n=new Intl.DateTimeFormat(this.locale,{weekday:e});return M(7,function(e){return t._stripDirectionalityCharacters(n.format(new Date(2017,0,e+1)))})}return $a[e]},t.prototype.getYearName=function(e){if(Ua){var t=new Intl.DateTimeFormat(this.locale,{year:"numeric"});return this._stripDirectionalityCharacters(t.format(e))}return String(this.getYear(e))},t.prototype.getFirstDayOfWeek=function(){return 0},t.prototype.getNumDaysInMonth=function(e){return this.getDate(this._createDateWithOverflow(this.getYear(e),this.getMonth(e)+1,0))},t.prototype.clone=function(e){return this.createDate(this.getYear(e),this.getMonth(e),this.getDate(e))},t.prototype.createDate=function(e,t,n){if(t<0||t>11)throw Error('Invalid month index "'+t+'". Month index has to be between 0 and 11.');if(n<1)throw Error('Invalid date "'+n+'". Date has to be greater than 0.');var r=this._createDateWithOverflow(e,t,n);if(r.getMonth()!=t)throw Error('Invalid date "'+n+'" for month with index "'+t+'".');return r},t.prototype.today=function(){return new Date},t.prototype.parse=function(e){return"number"==typeof e?new Date(e):e?new Date(Date.parse(e)):null},t.prototype.format=function(e,t){if(!this.isValid(e))throw Error("NativeDateAdapter: Cannot format invalid date.");if(Ua){this.useUtcForDisplay&&(e=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds())),t=Object(bl.__assign)({},t,{timeZone:"utc"}));var n=new Intl.DateTimeFormat(this.locale,t);return this._stripDirectionalityCharacters(n.format(e))}return this._stripDirectionalityCharacters(e.toDateString())},t.prototype.addCalendarYears=function(e,t){return this.addCalendarMonths(e,12*t)},t.prototype.addCalendarMonths=function(e,t){var n=this._createDateWithOverflow(this.getYear(e),this.getMonth(e)+t,this.getDate(e));return this.getMonth(n)!=((this.getMonth(e)+t)%12+12)%12&&(n=this._createDateWithOverflow(this.getYear(n),this.getMonth(n),0)),n},t.prototype.addCalendarDays=function(e,t){return this._createDateWithOverflow(this.getYear(e),this.getMonth(e),this.getDate(e)+t)},t.prototype.toIso8601=function(e){return[e.getUTCFullYear(),this._2digit(e.getUTCMonth()+1),this._2digit(e.getUTCDate())].join("-")},t.prototype.deserialize=function(t){if("string"==typeof t){if(!t)return null;if(Za.test(t)){var n=new Date(t);if(this.isValid(n))return n}}return e.prototype.deserialize.call(this,t)},t.prototype.isDateInstance=function(e){return e instanceof Date},t.prototype.isValid=function(e){return!isNaN(e.getTime())},t.prototype.invalid=function(){return new Date(NaN)},t.prototype._createDateWithOverflow=function(e,t,n){var r=new Date(e,t,n);return e>=0&&e<100&&r.setFullYear(this.getYear(r)-1900),r},t.prototype._2digit=function(e){return("00"+e).slice(-2)},t.prototype._stripDirectionalityCharacters=function(e){return e.replace(/[\u200e\u200f]/g,"")},t}(Wa),Ya={parse:{dateInput:null},display:{dateInput:{year:"numeric",month:"numeric",day:"numeric"},monthYearLabel:{year:"numeric",month:"short"},dateA11yLabel:{year:"numeric",month:"long",day:"numeric"},monthYearA11yLabel:{year:"numeric",month:"long"}}},Xa=function(){},Ja=function(){},es=function(){function e(){}return e.prototype.isErrorState=function(e,t){return!!(e&&e.invalid&&(e.touched||t&&t.submitted))},e}(),ts=new al.InjectionToken("MAT_HAMMER_OPTIONS"),ns=function(e){function t(t,n){var r=e.call(this)||this;return r._hammerOptions=t,r._hammer="undefined"!=typeof window?window.Hammer:null,r.events=r._hammer?["longpress","slide","slidestart","slideend","slideright","slideleft"]:[],n&&n._checkHammerIsAvailable(),r}return Object(bl.__extends)(t,e),t.prototype.buildHammer=function(e){var t=new this._hammer(e,this._hammerOptions||void 0),n=new this._hammer.Pan,r=new this._hammer.Swipe,i=new this._hammer.Press,o=this._createRecognizer(n,{event:"slide",threshold:0},r),l=this._createRecognizer(i,{event:"longpress",time:500});return n.recognizeWith(r),t.add([r,i,n,o,l]),t},t.prototype._createRecognizer=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];var i=new e.constructor(t);return n.push(e),n.forEach(function(e){return i.recognizeWith(e)}),i},t}(Va.g),rs=function(){},is=function(){var e={FADING_IN:0,VISIBLE:1,FADING_OUT:2,HIDDEN:3};return e[e.FADING_IN]="FADING_IN",e[e.VISIBLE]="VISIBLE",e[e.FADING_OUT]="FADING_OUT",e[e.HIDDEN]="HIDDEN",e}(),os=function(){function e(e,t,n){this._renderer=e,this.element=t,this.config=n,this.state=is.HIDDEN}return e.prototype.fadeOut=function(){this._renderer.fadeOutRipple(this)},e}(),ls=function(){function e(e,t,n){this._ngZone=t,this._isPointerDown=!1,this._triggerEvents=new Map,this._activeRipples=new Set,this.rippleConfig={},this.rippleDisabled=!1,n.isBrowser&&(this._containerElement=e.nativeElement,this._triggerEvents.set("mousedown",this.onMousedown.bind(this)),this._triggerEvents.set("mouseup",this.onPointerUp.bind(this)),this._triggerEvents.set("mouseleave",this.onPointerUp.bind(this)),this._triggerEvents.set("touchstart",this.onTouchStart.bind(this)),this._triggerEvents.set("touchend",this.onPointerUp.bind(this)),this.setTriggerElement(this._containerElement))}return e.prototype.fadeInRipple=function(e,t,n){var r=this;void 0===n&&(n={});var i=this._containerElement.getBoundingClientRect();n.centered&&(e=i.left+i.width/2,t=i.top+i.height/2);var o=n.radius||function(e,t,n){var r=Math.max(Math.abs(e-n.left),Math.abs(e-n.right)),i=Math.max(Math.abs(t-n.top),Math.abs(t-n.bottom));return Math.sqrt(r*r+i*i)}(e,t,i),l=450/(n.speedFactor||1),a=e-i.left,s=t-i.top,u=document.createElement("div");u.classList.add("mat-ripple-element"),u.style.left=a-o+"px",u.style.top=s-o+"px",u.style.height=2*o+"px",u.style.width=2*o+"px",u.style.backgroundColor=n.color||null,u.style.transitionDuration=l+"ms",this._containerElement.appendChild(u),function(e){window.getComputedStyle(e).getPropertyValue("opacity")}(u),u.style.transform="scale(1)";var c=new os(this,u,n);return c.state=is.FADING_IN,this._activeRipples.add(c),this.runTimeoutOutsideZone(function(){c.state=is.VISIBLE,n.persistent||r._isPointerDown||c.fadeOut()},l),c},e.prototype.fadeOutRipple=function(e){if(this._activeRipples.delete(e)){var t=e.element;t.style.transitionDuration="400ms",t.style.opacity="0",e.state=is.FADING_OUT,this.runTimeoutOutsideZone(function(){e.state=is.HIDDEN,t.parentNode.removeChild(t)},400)}},e.prototype.fadeOutAll=function(){this._activeRipples.forEach(function(e){return e.fadeOut()})},e.prototype.setTriggerElement=function(e){var t=this;this._triggerElement&&this._triggerEvents.forEach(function(e,n){t._triggerElement.removeEventListener(n,e)}),e&&this._ngZone.runOutsideAngular(function(){t._triggerEvents.forEach(function(t,n){return e.addEventListener(n,t)})}),this._triggerElement=e},e.prototype.onMousedown=function(e){var t=this._lastTouchStartEvent&&Date.now()<this._lastTouchStartEvent+800;this.rippleDisabled||t||(this._isPointerDown=!0,this.fadeInRipple(e.clientX,e.clientY,this.rippleConfig))},e.prototype.onTouchStart=function(e){this.rippleDisabled||(this._lastTouchStartEvent=Date.now(),this._isPointerDown=!0,this.fadeInRipple(e.touches[0].clientX,e.touches[0].clientY,this.rippleConfig))},e.prototype.onPointerUp=function(){this._isPointerDown&&(this._isPointerDown=!1,this._activeRipples.forEach(function(e){e.config.persistent||e.state!==is.VISIBLE||e.fadeOut()}))},e.prototype.runTimeoutOutsideZone=function(e,t){void 0===t&&(t=0),this._ngZone.runOutsideAngular(function(){return setTimeout(e,t)})},e}(),as=new al.InjectionToken("mat-ripple-global-options"),ss=function(){function e(e,t,n,r){this.radius=0,this.speedFactor=1,this._rippleRenderer=new ls(e,t,n),this._globalOptions=r||{},this._updateRippleRenderer()}return e.prototype.ngOnChanges=function(e){e.trigger&&this.trigger&&this._rippleRenderer.setTriggerElement(this.trigger),this._updateRippleRenderer()},e.prototype.ngOnDestroy=function(){this._rippleRenderer.setTriggerElement(null)},e.prototype.launch=function(e,t,n){return void 0===n&&(n=this.rippleConfig),this._rippleRenderer.fadeInRipple(e,t,n)},e.prototype.fadeOutAll=function(){this._rippleRenderer.fadeOutAll()},Object.defineProperty(e.prototype,"rippleConfig",{get:function(){return{centered:this.centered,speedFactor:this.speedFactor*(this._globalOptions.baseSpeedFactor||1),radius:this.radius,color:this.color}},enumerable:!0,configurable:!0}),e.prototype._updateRippleRenderer=function(){this._rippleRenderer.rippleDisabled=this._globalOptions.disabled||this.disabled,this._rippleRenderer.rippleConfig=this.rippleConfig},e}(),us=function(){},cs=function(){},ds=function(){},ps=new al.InjectionToken("mat-label-global-options"),fs=function(e){function t(t){e.call(this),this.observableFactory=t}return Object(bl.__extends)(t,e),t.create=function(e){return new t(e)},t.prototype._subscribe=function(e){return new hs(e,this.observableFactory)},t}(gl.a),hs=function(e){function t(t,n){e.call(this,t),this.factory=n,this.tryDefer()}return Object(bl.__extends)(t,e),t.prototype.tryDefer=function(){try{this._callFactory()}catch(e){this._error(e)}},t.prototype._callFactory=function(){var e=this.factory();e&&this.add(Object(Dl.a)(this,e))},t}(kl.a),ms=fs.create,gs=n("8Ut3"),ys=n("kQVV"),vs=n("mHG6"),bs=n("KRwF"),_s=n("xIGM"),ws=n("X3fp"),xs=function(e){function t(t,n){if(e.call(this),this.scheduler=n,null==t)throw new Error("iterator cannot be null.");this.iterator=function(e){var t=e[ws.a];if(!t&&"string"==typeof e)return new Cs(e);if(!t&&void 0!==e.length)return new Es(e);if(!t)throw new TypeError("object is not iterable");return e[ws.a]()}(t)}return Object(bl.__extends)(t,e),t.create=function(e,n){return new t(e,n)},t.dispatch=function(e){var t=e.index,n=e.iterator,r=e.subscriber;if(e.hasError)r.error(e.error);else{var i=n.next();i.done?r.complete():(r.next(i.value),e.index=t+1,r.closed?"function"==typeof n.return&&n.return():this.schedule(e))}},t.prototype._subscribe=function(e){var n=this.iterator,r=this.scheduler;if(r)return r.schedule(t.dispatch,0,{index:0,iterator:n,subscriber:e});for(;;){var i=n.next();if(i.done){e.complete();break}if(e.next(i.value),e.closed){"function"==typeof n.return&&n.return();break}}},t}(gl.a),Cs=function(){function e(e,t,n){void 0===t&&(t=0),void 0===n&&(n=e.length),this.str=e,this.idx=t,this.len=n}return e.prototype[ws.a]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.str.charAt(this.idx++)}:{done:!0,value:void 0}},e}(),Es=function(){function e(e,t,n){void 0===t&&(t=0),void 0===n&&(n=function(t){var n=+e.length;return isNaN(n)?0:0!==n&&"number"==typeof n&&_s.a.isFinite(n)?(n=function(e){var t=+n;return 0===t?t:isNaN(t)?t:t<0?-1:1}()*Math.floor(Math.abs(n)))<=0?0:n>Ss?Ss:n:n}()),this.arr=e,this.idx=t,this.len=n}return e.prototype[ws.a]=function(){return this},e.prototype.next=function(){return this.idx<this.len?{done:!1,value:this.arr[this.idx++]}:{done:!0,value:void 0}},e}(),Ss=Math.pow(2,53)-1,Os=function(e){function t(t,n){e.call(this),this.arrayLike=t,this.scheduler=n,n||1!==t.length||(this._isScalar=!0,this.value=t[0])}return Object(bl.__extends)(t,e),t.create=function(e,n){var r=e.length;return 0===r?new Jl.a:1===r?new gs.a(e[0],n):new t(e,n)},t.dispatch=function(e){var t=e.arrayLike,n=e.index,r=e.subscriber;r.closed||(n>=e.length?r.complete():(r.next(t[n]),e.index=n+1,this.schedule(e)))},t.prototype._subscribe=function(e){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(t.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:e});for(var o=0;o<i&&!e.closed;o++)e.next(n[o]);e.complete()},t}(gl.a),Ts=n("YRqN"),ks=n("mz3w"),Ds=function(e){function t(t,n){e.call(this,null),this.ish=t,this.scheduler=n}return Object(bl.__extends)(t,e),t.create=function(e,n){if(null!=e){if("function"==typeof e[ks.a])return e instanceof gl.a&&!n?e:new t(e,n);if(Object(Ml.a)(e))return new yl.a(e,n);if(Object(vs.a)(e))return new bs.a(e,n);if("function"==typeof e[ws.a]||"string"==typeof e)return new xs(e,n);if(Object(ys.a)(e))return new Os(e,n)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")},t.prototype._subscribe=function(e){var t=this.ish,n=this.scheduler;return null==n?t[ks.a]().subscribe(e):t[ks.a]().subscribe(new Ts.a(e,n,0))},t}(gl.a).create,Is=n("bywS"),Rs=n("fAeS"),Ms=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o._elementRef=t,o._focusTrapFactory=n,o._changeDetectorRef=r,o._document=i,o._elementFocusedBeforeDialogWasOpened=null,o._state="enter",o._animationStateChanged=new al.EventEmitter,o._ariaLabelledBy=null,o}return Object(bl.__extends)(t,e),t.prototype.attachComponentPortal=function(e){return this._portalOutlet.hasAttached()&&N(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(e)},t.prototype.attachTemplatePortal=function(e){return this._portalOutlet.hasAttached()&&N(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(e)},t.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},t.prototype._restoreFocus=function(){var e=this._elementFocusedBeforeDialogWasOpened;e&&"function"==typeof e.focus&&e.focus(),this._focusTrap&&this._focusTrap.destroy()},t.prototype._savePreviouslyFocusedElement=function(){var e=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return e._elementRef.nativeElement.focus()}))},t.prototype._onAnimationDone=function(e){"enter"===e.toState?this._trapFocus():"exit"===e.toState&&this._restoreFocus(),this._animationStateChanged.emit(e)},t.prototype._onAnimationStart=function(e){this._animationStateChanged.emit(e)},t.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},t}(Gl),Ps=0,Ns=function(){function e(e,t,n){void 0===n&&(n="mat-dialog-"+Ps++);var r=this;this._overlayRef=e,this._containerInstance=t,this.id=n,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new ml.Subject,this._afterClosed=new ml.Subject,this._beforeClose=new ml.Subject,t._animationStateChanged.pipe(Object(Al.a)(function(e){return"done"===e.phaseName&&"enter"===e.toState}),u(1)).subscribe(function(){r._afterOpen.next(),r._afterOpen.complete()}),t._animationStateChanged.pipe(Object(Al.a)(function(e){return"done"===e.phaseName&&"exit"===e.toState}),u(1)).subscribe(function(){r._overlayRef.dispose(),r._afterClosed.next(r._result),r._afterClosed.complete(),r.componentInstance=null})}return e.prototype.close=function(e){var t=this;this._result=e,this._containerInstance._animationStateChanged.pipe(Object(Al.a)(function(e){return"start"===e.phaseName}),u(1)).subscribe(function(){t._beforeClose.next(e),t._beforeClose.complete(),t._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},e.prototype.afterOpen=function(){return this._afterOpen.asObservable()},e.prototype.afterClosed=function(){return this._afterClosed.asObservable()},e.prototype.beforeClose=function(){return this._beforeClose.asObservable()},e.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},e.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},e.prototype.updatePosition=function(e){var t=this._getPositionStrategy();return e&&(e.left||e.right)?e.left?t.left(e.left):t.right(e.right):t.centerHorizontally(),e&&(e.top||e.bottom)?e.top?t.top(e.top):t.bottom(e.bottom):t.centerVertically(),this._overlayRef.updatePosition(),this},e.prototype.updateSize=function(e,t){return void 0===e&&(e="auto"),void 0===t&&(t="auto"),this._getPositionStrategy().width(e).height(t),this._overlayRef.updatePosition(),this},e.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},e}(),As=new al.InjectionToken("MatDialogData"),Ls=new al.InjectionToken("mat-dialog-scroll-strategy"),Fs=function(){function e(e,t,n,r,i){var o=this;this._overlay=e,this._injector=t,this._scrollStrategy=r,this._parentDialog=i,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new ml.Subject,this._afterOpenAtThisLevel=new ml.Subject,this.afterAllClosed=ms(function(){return o.openDialogs.length?o._afterAllClosed:o._afterAllClosed.pipe(P(void 0))}),!i&&n&&n.subscribe(function(){return o.closeAll()})}return Object.defineProperty(e.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_afterAllClosed",{get:function(){var e=this._parentDialog;return e?e._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),e.prototype.open=function(e,t){var n=this;if((t=function(e){return Object(bl.__assign)({},new function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0},e)}(t)).id&&this.getDialogById(t.id))throw Error('Dialog with id "'+t.id+'" exists already. The dialog id must be unique.');var r=this._createOverlay(t),i=this._attachDialogContainer(r,t),o=this._attachDialogContent(e,i,r,t);return this.openDialogs.push(o),o.afterClosed().subscribe(function(){return n._removeOpenDialog(o)}),this.afterOpen.next(o),o},e.prototype.closeAll=function(){for(var e=this.openDialogs.length;e--;)this.openDialogs[e].close()},e.prototype.getDialogById=function(e){return this.openDialogs.find(function(t){return t.id===e})},e.prototype._createOverlay=function(e){var t=this._getOverlayConfig(e);return this._overlay.create(t)},e.prototype._getOverlayConfig=function(e){var t=new ra({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:e.panelClass,hasBackdrop:e.hasBackdrop,direction:e.direction,minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:e.maxWidth,maxHeight:e.maxHeight});return e.backdropClass&&(t.backdropClass=e.backdropClass),t},e.prototype._attachDialogContainer=function(e,t){var n=new ql(Ms,t.viewContainerRef),r=e.attach(n);return r.instance._config=t,r.instance},e.prototype._attachDialogContent=function(e,t,n,r){var i=new Ns(n,t,r.id);if(r.hasBackdrop&&n.backdropClick().subscribe(function(){i.disableClose||i.close()}),n.keydownEvents().pipe(Object(Al.a)(function(e){return 27===e.keyCode&&!i.disableClose})).subscribe(function(){return i.close()}),e instanceof al.TemplateRef)t.attachTemplatePortal(new Ul(e,null,{$implicit:r.data,dialogRef:i}));else{var o=this._createInjector(r,i,t),l=t.attachComponentPortal(new ql(e,void 0,o));i.componentInstance=l.instance}return i.updateSize(r.width,r.height).updatePosition(r.position),i},e.prototype._createInjector=function(e,t,n){var r=e&&e.viewContainerRef&&e.viewContainerRef.injector,i=new WeakMap;return i.set(Ns,t),i.set(Ms,n),i.set(As,e.data),i.set(Bl,{value:e.direction,change:vl()}),new Ql(r||this._injector,i)},e.prototype._removeOpenDialog=function(e){var t=this.openDialogs.indexOf(e);t>-1&&(this.openDialogs.splice(t,1),this.openDialogs.length||this._afterAllClosed.next())},e}(),js=0,Vs=function(){function e(e){this.dialogRef=e,this.ariaLabel="Close dialog"}return e.prototype.ngOnChanges=function(e){var t=e._matDialogClose||e._matDialogCloseResult;t&&(this.dialogResult=t.currentValue)},e}(),zs=function(){function e(e){this._container=e,this.id="mat-dialog-title-"+js++}return e.prototype.ngOnInit=function(){var e=this;this._container&&!this._container._ariaLabelledBy&&Promise.resolve().then(function(){return e._container._ariaLabelledBy=e.id})},e}(),Bs=function(){},Hs=function(){},Ws=function(){},qs=al["\u0275crt"]({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}}),Us=al["\u0275ccf"]("mat-dialog-container",Ms,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(e,t,n){var r=!0;return"component:@slideDialog.start"===t&&(r=!1!==al["\u0275nov"](e,1)._onAnimationStart(n)&&r),"component:@slideDialog.done"===t&&(r=!1!==al["\u0275nov"](e,1)._onAnimationDone(n)&&r),r},F,qs)),al["\u0275did"](1,49152,null,0,Ms,[al.ElementRef,Oa,al.ChangeDetectorRef,[2,cl.DOCUMENT]],null,null)],null,function(e,t){e(t,0,0,null==al["\u0275nov"](t,1)._config?null:al["\u0275nov"](t,1)._config.role,null!=al["\u0275nov"](t,1)._config&&al["\u0275nov"](t,1)._config.ariaLabel?null:al["\u0275nov"](t,1)._ariaLabelledBy,null==al["\u0275nov"](t,1)._config?null:al["\u0275nov"](t,1)._config.ariaLabel,(null==al["\u0275nov"](t,1)._config?null:al["\u0275nov"](t,1)._config.ariaDescribedBy)||null,al["\u0275nov"](t,1)._state)})},{},{},[]),Gs=function(){},Ks=function(){},$s=function(e){function t(t,n,r){var i=e.call(this,t)||this;return i._platform=n,i._focusMonitor=r,i._isRoundButton=i._hasHostAttributes("mat-fab","mat-mini-fab"),i._isIconButton=i._hasHostAttributes("mat-icon-button"),i._focusMonitor.monitor(i._elementRef.nativeElement,!0),i}return Object(bl.__extends)(t,e),t.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},t.prototype.focus=function(){this._getHostElement().focus()},t.prototype._getHostElement=function(){return this._elementRef.nativeElement},t.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},t.prototype._hasHostAttributes=function(){for(var e=this,t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return!!this._platform.isBrowser&&t.some(function(t){return e._getHostElement().hasAttribute(t)})},t}(I(D(R(function(e){this._elementRef=e})))),Zs=function(e){function t(t,n,r){return e.call(this,r,t,n)||this}return Object(bl.__extends)(t,e),t.prototype._haltDisabledEvents=function(e){this.disabled&&(e.preventDefault(),e.stopImmediatePropagation())},t}($s),Qs=function(){},Ys=function(){function e(e){this.selector=e}return e.prototype.call=function(e,t){return t.subscribe(new Xs(e,this.selector,this.caught))},e}(),Xs=function(e){function t(t,n,r){e.call(this,t),this.selector=n,this.caught=r}return Object(bl.__extends)(t,e),t.prototype.error=function(t){if(!this.isStopped){var n=void 0;try{n=this.selector(t,this.caught)}catch(t){return void e.prototype.error.call(this,t)}this._unsubscribeAndRecycle(),this.add(Object(Dl.a)(this,n))}},t}(kl.a),Js=function(){function e(e){this.callback=e}return e.prototype.call=function(e,t){return t.subscribe(new eu(e,this.callback))},e}(),eu=function(e){function t(t,n){e.call(this,t),this.add(new Cl.a(n))}return Object(bl.__extends)(t,e),t}(Yl.a),tu=n("eIqN"),nu=n("wP3s"),ru=n("6S6c"),iu=n("dmC+"),ou=function(){},lu=function(){},au=function(){function e(e){var t=this;this.normalizedNames=new Map,this.lazyUpdate=null,e?this.lazyInit="string"==typeof e?function(){t.headers=new Map,e.split("\n").forEach(function(e){var n=e.indexOf(":");if(n>0){var r=e.slice(0,n),i=r.toLowerCase(),o=e.slice(n+1).trim();t.maybeSetNormalizedName(r,i),t.headers.has(i)?t.headers.get(i).push(o):t.headers.set(i,[o])}})}:function(){t.headers=new Map,Object.keys(e).forEach(function(n){var r=e[n],i=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(t.headers.set(i,r),t.maybeSetNormalizedName(n,i))})}:this.headers=new Map}return e.prototype.has=function(e){return this.init(),this.headers.has(e.toLowerCase())},e.prototype.get=function(e){this.init();var t=this.headers.get(e.toLowerCase());return t&&t.length>0?t[0]:null},e.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},e.prototype.getAll=function(e){return this.init(),this.headers.get(e.toLowerCase())||null},e.prototype.append=function(e,t){return this.clone({name:e,value:t,op:"a"})},e.prototype.set=function(e,t){return this.clone({name:e,value:t,op:"s"})},e.prototype.delete=function(e,t){return this.clone({name:e,value:t,op:"d"})},e.prototype.maybeSetNormalizedName=function(e,t){this.normalizedNames.has(t)||this.normalizedNames.set(t,e)},e.prototype.init=function(){var t=this;this.lazyInit&&(this.lazyInit instanceof e?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(e){return t.applyUpdate(e)}),this.lazyUpdate=null))},e.prototype.copyFrom=function(e){var t=this;e.init(),Array.from(e.headers.keys()).forEach(function(n){t.headers.set(n,e.headers.get(n)),t.normalizedNames.set(n,e.normalizedNames.get(n))})},e.prototype.clone=function(t){var n=new e;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof e?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n},e.prototype.applyUpdate=function(e){var t=e.name.toLowerCase();switch(e.op){case"a":case"s":var n=e.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(e.name,t);var r=("a"===e.op?this.headers.get(t):void 0)||[];r.push.apply(r,n),this.headers.set(t,r);break;case"d":var i=e.value;if(i){var o=this.headers.get(t);if(!o)return;0===(o=o.filter(function(e){return-1===i.indexOf(e)})).length?(this.headers.delete(t),this.normalizedNames.delete(t)):this.headers.set(t,o)}else this.headers.delete(t),this.normalizedNames.delete(t)}},e.prototype.forEach=function(e){var t=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return e(t.normalizedNames.get(n),t.headers.get(n))})},e}(),su=function(){function e(){}return e.prototype.encodeKey=function(e){return V(e)},e.prototype.encodeValue=function(e){return V(e)},e.prototype.decodeKey=function(e){return decodeURIComponent(e)},e.prototype.decodeValue=function(e){return decodeURIComponent(e)},e}(),uu=function(){function e(e){void 0===e&&(e={});var t=this;if(this.updates=null,this.cloneFrom=null,this.encoder=e.encoder||new su,e.fromString){if(e.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function(e,t){var n=new Map;return e.length>0&&e.split("&").forEach(function(e){var r=e.indexOf("="),i=-1==r?[t.decodeKey(e),""]:[t.decodeKey(e.slice(0,r)),t.decodeValue(e.slice(r+1))],o=i[0],l=i[1],a=n.get(o)||[];a.push(l),n.set(o,a)}),n}(e.fromString,this.encoder)}else e.fromObject?(this.map=new Map,Object.keys(e.fromObject).forEach(function(n){var r=e.fromObject[n];t.map.set(n,Array.isArray(r)?r:[r])})):this.map=null}return e.prototype.has=function(e){return this.init(),this.map.has(e)},e.prototype.get=function(e){this.init();var t=this.map.get(e);return t?t[0]:null},e.prototype.getAll=function(e){return this.init(),this.map.get(e)||null},e.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},e.prototype.append=function(e,t){return this.clone({param:e,value:t,op:"a"})},e.prototype.set=function(e,t){return this.clone({param:e,value:t,op:"s"})},e.prototype.delete=function(e,t){return this.clone({param:e,value:t,op:"d"})},e.prototype.toString=function(){var e=this;return this.init(),this.keys().map(function(t){var n=e.encoder.encodeKey(t);return e.map.get(t).map(function(t){return n+"="+e.encoder.encodeValue(t)}).join("&")}).join("&")},e.prototype.clone=function(t){var n=new e({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([t]),n},e.prototype.init=function(){var e=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(t){return e.map.set(t,e.cloneFrom.map.get(t))}),this.updates.forEach(function(t){switch(t.op){case"a":case"s":var n=("a"===t.op?e.map.get(t.param):void 0)||[];n.push(t.value),e.map.set(t.param,n);break;case"d":if(void 0===t.value){e.map.delete(t.param);break}var r=e.map.get(t.param)||[],i=r.indexOf(t.value);-1!==i&&r.splice(i,1),r.length>0?e.map.set(t.param,r):e.map.delete(t.param)}}),this.cloneFrom=null)},e}(),cu=function(){function e(e,t,n,r){this.url=t,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=e.toUpperCase();var i;if(function(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==n?n:null,i=r):i=n,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.params&&(this.params=i.params)),this.headers||(this.headers=new au),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=t;else{var l=t.indexOf("?");this.urlWithParams=t+(-1===l?"?":l<t.length-1?"&":"")+o}}else this.params=new uu,this.urlWithParams=t}return e.prototype.serializeBody=function(){return null===this.body?null:z(this.body)||B(this.body)||H(this.body)||"string"==typeof this.body?this.body:this.body instanceof uu?this.body.toString():"object"==typeof this.body||"boolean"==typeof this.body||Array.isArray(this.body)?JSON.stringify(this.body):this.body.toString()},e.prototype.detectContentTypeHeader=function(){return null===this.body?null:H(this.body)?null:B(this.body)?this.body.type||null:z(this.body)?null:"string"==typeof this.body?"text/plain":this.body instanceof uu?"application/x-www-form-urlencoded;charset=UTF-8":"object"==typeof this.body||"number"==typeof this.body||Array.isArray(this.body)?"application/json":null},e.prototype.clone=function(t){void 0===t&&(t={});var n=t.method||this.method,r=t.url||this.url,i=t.responseType||this.responseType,o=void 0!==t.body?t.body:this.body,l=void 0!==t.withCredentials?t.withCredentials:this.withCredentials,a=void 0!==t.reportProgress?t.reportProgress:this.reportProgress,s=t.headers||this.headers,u=t.params||this.params;return void 0!==t.setHeaders&&(s=Object.keys(t.setHeaders).reduce(function(e,n){return e.set(n,t.setHeaders[n])},s)),t.setParams&&(u=Object.keys(t.setParams).reduce(function(e,n){return e.set(n,t.setParams[n])},u)),new e(n,r,o,{params:u,headers:s,reportProgress:a,responseType:i,withCredentials:l})},e}(),du=function(){var e={Sent:0,UploadProgress:1,ResponseHeader:2,DownloadProgress:3,Response:4,User:5};return e[e.Sent]="Sent",e[e.UploadProgress]="UploadProgress",e[e.ResponseHeader]="ResponseHeader",e[e.DownloadProgress]="DownloadProgress",e[e.Response]="Response",e[e.User]="User",e}(),pu=function(){return function(e,t,n){void 0===t&&(t=200),void 0===n&&(n="OK"),this.headers=e.headers||new au,this.status=void 0!==e.status?e.status:t,this.statusText=e.statusText||n,this.url=e.url||null,this.ok=this.status>=200&&this.status<300}}(),fu=function(e){function t(t){void 0===t&&(t={});var n=e.call(this,t)||this;return n.type=du.ResponseHeader,n}return Object(bl.__extends)(t,e),t.prototype.clone=function(e){return void 0===e&&(e={}),new t({headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})},t}(pu),hu=function(e){function t(t){void 0===t&&(t={});var n=e.call(this,t)||this;return n.type=du.Response,n.body=void 0!==t.body?t.body:null,n}return Object(bl.__extends)(t,e),t.prototype.clone=function(e){return void 0===e&&(e={}),new t({body:void 0!==e.body?e.body:this.body,headers:e.headers||this.headers,status:void 0!==e.status?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})},t}(pu),mu=function(e){function t(t){var n=e.call(this,t,0,"Unknown Error")||this;return n.name="HttpErrorResponse",n.ok=!1,n.message=n.status>=200&&n.status<300?"Http failure during parsing for "+(t.url||"(unknown url)"):"Http failure response for "+(t.url||"(unknown url)")+": "+t.status+" "+t.statusText,n.error=t.error||null,n}return Object(bl.__extends)(t,e),t}(pu),gu=function(){function e(e){this.handler=e}return e.prototype.request=function(e,t,n){var r=this;void 0===n&&(n={});var i;if(e instanceof cu)i=e;else{var o=void 0;o=n.headers instanceof au?n.headers:new au(n.headers);var l=void 0;n.params&&(l=n.params instanceof uu?n.params:new uu({fromObject:n.params})),i=new cu(e,t,void 0!==n.body?n.body:null,{headers:o,params:l,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials})}var a=function(e,t){return function(e,t){return Object(nu.a)(e,t,1)}(e,t)(this)}.call(vl(i),function(e){return r.handler.handle(e)});if(e instanceof cu||"events"===n.observe)return a;var s=ru.a.call(a,function(e){return e instanceof hu});switch(n.observe||"body"){case"body":switch(i.responseType){case"arraybuffer":return iu.a.call(s,function(e){if(null!==e.body&&!(e.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return e.body});case"blob":return iu.a.call(s,function(e){if(null!==e.body&&!(e.body instanceof Blob))throw new Error("Response is not a Blob.");return e.body});case"text":return iu.a.call(s,function(e){if(null!==e.body&&"string"!=typeof e.body)throw new Error("Response is not a string.");return e.body});case"json":default:return iu.a.call(s,function(e){return e.body})}case"response":return s;default:throw new Error("Unreachable: unhandled observe type "+n.observe+"}")}},e.prototype.delete=function(e,t){return void 0===t&&(t={}),this.request("DELETE",e,t)},e.prototype.get=function(e,t){return void 0===t&&(t={}),this.request("GET",e,t)},e.prototype.head=function(e,t){return void 0===t&&(t={}),this.request("HEAD",e,t)},e.prototype.jsonp=function(e,t){return this.request("JSONP",e,{params:(new uu).append(t,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},e.prototype.options=function(e,t){return void 0===t&&(t={}),this.request("OPTIONS",e,t)},e.prototype.patch=function(e,t,n){return void 0===n&&(n={}),this.request("PATCH",e,W(n,t))},e.prototype.post=function(e,t,n){return void 0===n&&(n={}),this.request("POST",e,W(n,t))},e.prototype.put=function(e,t,n){return void 0===n&&(n={}),this.request("PUT",e,W(n,t))},e}(),yu=function(){function e(e,t){this.next=e,this.interceptor=t}return e.prototype.handle=function(e){return this.interceptor.intercept(e,this.next)},e}(),vu=new al.InjectionToken("HTTP_INTERCEPTORS"),bu=function(){function e(){}return e.prototype.intercept=function(e,t){return t.handle(e)},e}(),_u=/^\)\]\}',?\n/,wu=function(){},xu=function(){function e(){}return e.prototype.build=function(){return new XMLHttpRequest},e}(),Cu=function(){function e(e){this.xhrFactory=e}return e.prototype.handle=function(e){var t=this;if("JSONP"===e.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new gl.a(function(n){var r=t.xhrFactory.build();if(r.open(e.method,e.urlWithParams),e.withCredentials&&(r.withCredentials=!0),e.headers.forEach(function(e,t){return r.setRequestHeader(e,t.join(","))}),e.headers.has("Accept")||r.setRequestHeader("Accept","application/json, text/plain, */*"),!e.headers.has("Content-Type")){var i=e.detectContentTypeHeader();null!==i&&r.setRequestHeader("Content-Type",i)}if(e.responseType){var o=e.responseType.toLowerCase();r.responseType="json"!==o?o:"text"}var l=e.serializeBody(),a=null,s=function(){if(null!==a)return a;var t=1223===r.status?204:r.status,n=r.statusText||"OK",i=new au(r.getAllResponseHeaders()),o=function(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(r)||e.url;return a=new fu({headers:i,status:t,statusText:n,url:o})},u=function(){var t=s(),i=t.headers,o=t.status,l=t.statusText,a=t.url,u=null;204!==o&&(u=void 0===r.response?r.responseText:r.response),0===o&&(o=u?200:0);var c=o>=200&&o<300;if("json"===e.responseType&&"string"==typeof u){var d=u;u=u.replace(_u,"");try{u=""!==u?JSON.parse(u):null}catch(e){u=d,c&&(c=!1,u={error:e,text:u})}}c?(n.next(new hu({body:u,headers:i,status:o,statusText:l,url:a||void 0})),n.complete()):n.error(new mu({error:u,headers:i,status:o,statusText:l,url:a||void 0}))},c=function(e){var t=new mu({error:e,status:r.status||0,statusText:r.statusText||"Unknown Error"});n.error(t)},d=!1,p=function(t){d||(n.next(s()),d=!0);var i={type:du.DownloadProgress,loaded:t.loaded};t.lengthComputable&&(i.total=t.total),"text"===e.responseType&&r.responseText&&(i.partialText=r.responseText),n.next(i)},f=function(e){var t={type:du.UploadProgress,loaded:e.loaded};e.lengthComputable&&(t.total=e.total),n.next(t)};return r.addEventListener("load",u),r.addEventListener("error",c),e.reportProgress&&(r.addEventListener("progress",p),null!==l&&r.upload&&r.upload.addEventListener("progress",f)),r.send(l),n.next({type:du.Sent}),function(){r.removeEventListener("error",c),r.removeEventListener("load",u),e.reportProgress&&(r.removeEventListener("progress",p),null!==l&&r.upload&&r.upload.removeEventListener("progress",f)),r.abort()}})},e}(),Eu=new al.InjectionToken("XSRF_COOKIE_NAME"),Su=new al.InjectionToken("XSRF_HEADER_NAME"),Ou=function(){},Tu=function(){function e(e,t,n){this.doc=e,this.platform=t,this.cookieName=n,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return e.prototype.getToken=function(){if("server"===this.platform)return null;var e=this.doc.cookie||"";return e!==this.lastCookieString&&(this.parseCount++,this.lastToken=Object(cl["\u0275parseCookieValue"])(e,this.cookieName),this.lastCookieString=e),this.lastToken},e}(),ku=function(){function e(e,t){this.tokenService=e,this.headerName=t}return e.prototype.intercept=function(e,t){var n=e.url.toLowerCase();if("GET"===e.method||"HEAD"===e.method||n.startsWith("http://")||n.startsWith("https://"))return t.handle(e);var r=this.tokenService.getToken();return null===r||e.headers.has(this.headerName)||(e=e.clone({headers:e.headers.set(this.headerName,r)})),t.handle(e)},e}(),Du=function(){function e(){}return e.disable=function(){return{ngModule:e,providers:[{provide:ku,useClass:bu}]}},e.withOptions=function(t){return void 0===t&&(t={}),{ngModule:e,providers:[t.cookieName?{provide:Eu,useValue:t.cookieName}:[],t.headerName?{provide:Su,useValue:t.headerName}:[]]}},e}(),Iu=function(){},Ru=n("Jsyr"),Mu=function(e){function t(t,n){e.call(this),this.error=t,this.scheduler=n}return Object(bl.__extends)(t,e),t.create=function(e,n){return new t(e,n)},t.dispatch=function(e){e.subscriber.error(e.error)},t.prototype._subscribe=function(e){var n=this.error,r=this.scheduler;if(e.syncErrorThrowable=!0,r)return r.schedule(t.dispatch,0,{error:n,subscriber:e});e.error(n)},t}(gl.a).create,Pu=function(e){this.url=e,this.svgElement=null},Nu=function(){function e(e,t){this._httpClient=e,this._sanitizer=t,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return e.prototype.addSvgIcon=function(e,t){return this.addSvgIconInNamespace("",e,t)},e.prototype.addSvgIconInNamespace=function(e,t,n){var r=Z(e,t);return this._svgIconConfigs.set(r,new Pu(n)),this},e.prototype.addSvgIconSet=function(e){return this.addSvgIconSetInNamespace("",e)},e.prototype.addSvgIconSetInNamespace=function(e,t){var n=new Pu(t),r=this._iconSetConfigs.get(e);return r?r.push(n):this._iconSetConfigs.set(e,[n]),this},e.prototype.registerFontClassAlias=function(e,t){return void 0===t&&(t=e),this._fontCssClassesByAlias.set(e,t),this},e.prototype.classNameForFontAlias=function(e){return this._fontCssClassesByAlias.get(e)||e},e.prototype.setDefaultFontSetClass=function(e){return this._defaultFontSetClass=e,this},e.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},e.prototype.getSvgIconFromUrl=function(e){var t=this,n=this._sanitizer.sanitize(al.SecurityContext.RESOURCE_URL,e);if(!n)throw G(e);var r=this._cachedIconsByUrl.get(n);return r?vl($(r)):this._loadSvgIconFromConfig(new Pu(e)).pipe(x(function(e){return t._cachedIconsByUrl.set(n,e)}),Object(wa.a)(function(e){return $(e)}))},e.prototype.getNamedSvgIcon=function(e,t){void 0===t&&(t="");var n=Z(t,e),r=this._svgIconConfigs.get(n);if(r)return this._getSvgFromConfig(r);var i=this._iconSetConfigs.get(t);return i?this._getSvgFromIconSetConfigs(e,i):Mu(U(n))},e.prototype._getSvgFromConfig=function(e){return e.svgElement?vl($(e.svgElement)):this._loadSvgIconFromConfig(e).pipe(x(function(t){return e.svgElement=t}),Object(wa.a)(function(e){return $(e)}))},e.prototype._getSvgFromIconSetConfigs=function(e,t){var n=this,r=this._extractIconWithNameFromAnySet(e,t);if(r)return vl(r);var i=t.filter(function(e){return!e.svgElement}).map(function(e){return n._loadSvgIconSetFromConfig(e).pipe(j(function(t){var r=n._sanitizer.sanitize(al.SecurityContext.RESOURCE_URL,e.url);return console.log("Loading icon set URL: "+r+" failed: "+t),vl(null)}),x(function(t){t&&(e.svgElement=t)}))});return Object(Ru.a)(i).pipe(Object(wa.a)(function(){var r=n._extractIconWithNameFromAnySet(e,t);if(!r)throw U(e);return r}))},e.prototype._extractIconWithNameFromAnySet=function(e,t){for(var n=t.length-1;n>=0;n--){var r=t[n];if(r.svgElement){var i=this._extractSvgIconFromSet(r.svgElement,e);if(i)return i}}return null},e.prototype._loadSvgIconFromConfig=function(e){var t=this;return this._fetchUrl(e.url).pipe(Object(wa.a)(function(e){return t._createSvgElementForSingleIcon(e)}))},e.prototype._loadSvgIconSetFromConfig=function(e){var t=this;return this._fetchUrl(e.url).pipe(Object(wa.a)(function(e){return t._svgElementFromString(e)}))},e.prototype._createSvgElementForSingleIcon=function(e){var t=this._svgElementFromString(e);return this._setSvgAttributes(t),t},e.prototype._extractSvgIconFromSet=function(e,t){var n=e.querySelector("#"+t);if(!n)return null;var r=n.cloneNode(!0);if(r.id="","svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r));var i=this._svgElementFromString("<svg></svg>");return i.appendChild(r),this._setSvgAttributes(i)},e.prototype._svgElementFromString=function(e){var t=document.createElement("DIV");t.innerHTML=e;var n=t.querySelector("svg");if(!n)throw Error("<svg> tag not found");return n},e.prototype._toSvgElement=function(e){for(var t=this._svgElementFromString("<svg></svg>"),n=0;n<e.childNodes.length;n++)e.childNodes[n].nodeType===Node.ELEMENT_NODE&&t.appendChild(e.childNodes[n].cloneNode(!0));return t},e.prototype._setSvgAttributes=function(e){return e.getAttribute("xmlns")||e.setAttribute("xmlns","http://www.w3.org/2000/svg"),e.setAttribute("fit",""),e.setAttribute("height","100%"),e.setAttribute("width","100%"),e.setAttribute("preserveAspectRatio","xMidYMid meet"),e.setAttribute("focusable","false"),e},e.prototype._fetchUrl=function(e){var t=this;if(!this._httpClient)throw Error("Could not find HttpClient provider for use with Angular Material icons. Please include the HttpClientModule from @angular/common/http in your app imports.");var n=this._sanitizer.sanitize(al.SecurityContext.RESOURCE_URL,e);if(!n)throw G(e);var r=this._inProgressUrlFetches.get(n);if(r)return r;var i=this._httpClient.get(n,{responseType:"text"}).pipe(function(e){return function(t){return t.lift(new Js(e))}}(function(){return t._inProgressUrlFetches.delete(n)}),Object(tu.a)());return this._inProgressUrlFetches.set(n,i),i},e}(),Au=function(e){function t(t,n,r){var i=e.call(this,t)||this;return i._iconRegistry=n,r||t.nativeElement.setAttribute("aria-hidden","true"),i}return Object(bl.__extends)(t,e),t.prototype._splitIconName=function(e){if(!e)return["",""];var t=e.split(":");switch(t.length){case 1:return["",t[0]];case 2:return t;default:throw Error('Invalid icon name: "'+e+'"')}},t.prototype.ngOnChanges=function(e){var t=this;if(e.svgIcon)if(this.svgIcon){var n=this._splitIconName(this.svgIcon);this._iconRegistry.getNamedSvgIcon(n[1],n[0]).pipe(u(1)).subscribe(function(e){return t._setSvgElement(e)},function(e){return console.log("Error retrieving icon: "+e.message)})}else this._clearSvgElement();this._usingFontIcon()&&this._updateFontIconClasses()},t.prototype.ngOnInit=function(){this._usingFontIcon()&&this._updateFontIconClasses()},t.prototype._usingFontIcon=function(){return!this.svgIcon},t.prototype._setSvgElement=function(e){this._clearSvgElement(),this._elementRef.nativeElement.appendChild(e)},t.prototype._clearSvgElement=function(){for(var e=this._elementRef.nativeElement,t=e.childNodes.length,n=0;n<t;n++)e.removeChild(e.childNodes[n])},t.prototype._updateFontIconClasses=function(){if(this._usingFontIcon()){var e=this._elementRef.nativeElement,t=this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet):this._iconRegistry.getDefaultFontSetClass();t!=this._previousFontSetClass&&(this._previousFontSetClass&&e.classList.remove(this._previousFontSetClass),t&&e.classList.add(t),this._previousFontSetClass=t),this.fontIcon!=this._previousFontIconClass&&(this._previousFontIconClass&&e.classList.remove(this._previousFontIconClass),this.fontIcon&&e.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}},t}(I(function(e){this._elementRef=e})),Lu=function(){},Fu=n("0nO6"),ju=function(){},Vu=0,zu=function(){function e(e,t,n){this._elementRef=e,this._changeDetectorRef=t,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+Vu++,this._labelOptions=n||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(e.prototype,"dividerColor",{get:function(){return this.color},set:function(e){this.color=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(e){this._hideRequiredMarker=c(e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(e){this._hintLabel=e,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(e){this.floatLabel=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(e){e!==this._floatLabel&&(this._floatLabel=e||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){var e=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(P(null)).subscribe(function(){e._validatePlaceholders(),e._syncDescribedByIds(),e._changeDetectorRef.markForCheck()});var t=this._control.ngControl;t&&t.valueChanges&&t.valueChanges.subscribe(function(){e._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(P(null)).subscribe(function(){e._processHints(),e._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(P(null)).subscribe(function(){e._syncDescribedByIds(),e._changeDetectorRef.markForCheck()})},e.prototype.ngAfterContentChecked=function(){this._validateControlChild()},e.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},e.prototype._shouldForward=function(e){var t=this._control?this._control.ngControl:null;return t&&t[e]},e.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},e.prototype._hasLabel=function(){return!!this._labelChild},e.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},e.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},e.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},e.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},e.prototype._animateAndLockLabel=function(){var e=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",Sl(this._label.nativeElement,"transitionend").pipe(u(1)).subscribe(function(){e._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},e.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},e.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},e.prototype._validateHints=function(){var e=this;if(this._hintChildren){var t,n;this._hintChildren.forEach(function(r){if("start"==r.align){if(t||e.hintLabel)throw Q("start");t=r}else if("end"==r.align){if(n)throw Q("end");n=r}})}},e.prototype._syncDescribedByIds=function(){if(this._control){var e=[];if("hint"===this._getDisplayedMessages()){var t=this._hintChildren?this._hintChildren.find(function(e){return"start"===e.align}):null,n=this._hintChildren?this._hintChildren.find(function(e){return"end"===e.align}):null;t?e.push(t.id):this._hintLabel&&e.push(this._hintLabelId),n&&e.push(n.id)}else this._errorChildren&&(e=this._errorChildren.map(function(e){return e.id}));this._control.setDescribedByIds(e)}},e.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},e}(),Bu=function(){},Hu=n("5O0w"),Wu=["button","checkbox","color","file","hidden","image","radio","range","reset","submit"],qu=0,Uu=function(e){function t(t,n,r,o,l,a,s){var u=e.call(this,a,o,l,r)||this;return u._elementRef=t,u._platform=n,u.ngControl=r,u._type="text",u._disabled=!1,u._required=!1,u._uid="mat-input-"+qu++,u._readonly=!1,u.focused=!1,u._isServer=!1,u.stateChanges=new ml.Subject,u.controlType="mat-input",u.placeholder="",u._neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(function(e){return i().has(e)}),u._inputValueAccessor=s||u._elementRef.nativeElement,u._previousNativeValue=u.value,u.id=u.id,n.IOS&&t.nativeElement.addEventListener("keyup",function(e){var t=e.target;t.value||t.selectionStart||t.selectionEnd||(t.setSelectionRange(1,1),t.setSelectionRange(0,0))}),u._isServer=!u._platform.isBrowser,u}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"disabled",{get:function(){return this.ngControl?this.ngControl.disabled:this._disabled},set:function(e){this._disabled=c(e),this.focused&&(this.focused=!1,this.stateChanges.next())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"id",{get:function(){return this._id},set:function(e){this._id=e||this._uid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(e){this._required=c(e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"type",{get:function(){return this._type},set:function(e){this._type=e||"text",this._validateType(),!this._isTextarea()&&i().has(this._type)&&(this._elementRef.nativeElement.type=this._type)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._inputValueAccessor.value},set:function(e){e!==this.value&&(this._inputValueAccessor.value=e,this.stateChanges.next())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"readonly",{get:function(){return this._readonly},set:function(e){this._readonly=c(e)},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(){this.stateChanges.next()},t.prototype.ngOnDestroy=function(){this.stateChanges.complete()},t.prototype.ngDoCheck=function(){this.ngControl?this.updateErrorState():this._dirtyCheckNativeValue()},t.prototype.focus=function(){this._elementRef.nativeElement.focus()},t.prototype._focusChanged=function(e){e===this.focused||this.readonly||(this.focused=e,this.stateChanges.next())},t.prototype._onInput=function(){},t.prototype._dirtyCheckNativeValue=function(){var e=this.value;this._previousNativeValue!==e&&(this._previousNativeValue=e,this.stateChanges.next())},t.prototype._validateType=function(){if(Wu.indexOf(this._type)>-1)throw function(e){return Error('Input type "'+e+"\" isn't supported by matInput.")}(this._type)},t.prototype._isNeverEmpty=function(){return this._neverEmptyInputTypes.indexOf(this._type)>-1},t.prototype._isBadInput=function(){var e=this._elementRef.nativeElement.validity;return e&&e.badInput},t.prototype._isTextarea=function(){var e=this._elementRef.nativeElement,t=this._platform.isBrowser?e.nodeName:e.name;return!!t&&"textarea"===t.toLowerCase()},Object.defineProperty(t.prototype,"empty",{get:function(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"shouldLabelFloat",{get:function(){return this.focused||!this.empty},enumerable:!0,configurable:!0}),t.prototype.setDescribedByIds=function(e){this._ariaDescribedby=e.join(" ")},t.prototype.onContainerClick=function(){this.focus()},t}(function(e){return function(e){function t(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=e.apply(this,t)||this;return r.errorState=!1,r.stateChanges=new ml.Subject,r}return Object(bl.__extends)(t,e),t.prototype.updateErrorState=function(){var e=this.errorState,t=(this.errorStateMatcher||this._defaultErrorStateMatcher).isErrorState(this.ngControl?this.ngControl.control:null,this._parentFormGroup||this._parentForm);t!==e&&(this.errorState=t,this.stateChanges.next())},t}(function(e,t,n,r){this._defaultErrorStateMatcher=e,this._parentForm=t,this._parentFormGroup=n,this.ngControl=r})}()),Gu=function(){},Ku=function(){return function(){this.changes=new ml.Subject,this.calendarLabel="Calendar",this.openCalendarLabel="Open calendar",this.prevMonthLabel="Previous month",this.nextMonthLabel="Next month",this.prevYearLabel="Previous year",this.nextYearLabel="Next year",this.switchToMonthViewLabel="Change to month view",this.switchToYearViewLabel="Change to year view"}}(),$u=function(e,t,n,r){this.value=e,this.displayValue=t,this.ariaLabel=n,this.enabled=r},Zu=function(){function e(){this.numCols=7,this.allowDisabledSelection=!1,this.activeCell=0,this.cellAspectRatio=1,this.selectedValueChange=new al.EventEmitter}return e.prototype._cellClicked=function(e){(this.allowDisabledSelection||e.enabled)&&this.selectedValueChange.emit(e.value)},Object.defineProperty(e.prototype,"_firstRowOffset",{get:function(){return this.rows&&this.rows.length&&this.rows[0].length?this.numCols-this.rows[0].length:0},enumerable:!0,configurable:!0}),e.prototype._isActiveCell=function(e,t){var n=e*this.numCols+t;return e&&(n-=this._firstRowOffset),n==this.activeCell},e}(),Qu=function(){function e(e,t,n){if(this._dateAdapter=e,this._dateFormats=t,this._changeDetectorRef=n,this.selectedChange=new al.EventEmitter,this._userSelection=new al.EventEmitter,!this._dateAdapter)throw Y("DateAdapter");if(!this._dateFormats)throw Y("MAT_DATE_FORMATS");var r=this._dateAdapter.getFirstDayOfWeek(),i=this._dateAdapter.getDayOfWeekNames("narrow"),o=this._dateAdapter.getDayOfWeekNames("long").map(function(e,t){return{long:e,narrow:i[t]}});this._weekdays=o.slice(r).concat(o.slice(0,r)),this._activeDate=this._dateAdapter.today()}return Object.defineProperty(e.prototype,"activeDate",{get:function(){return this._activeDate},set:function(e){var t=this._activeDate;this._activeDate=this._getValidDateOrNull(this._dateAdapter.deserialize(e))||this._dateAdapter.today(),this._hasSameMonthAndYear(t,this._activeDate)||this._init()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},set:function(e){this._selected=this._getValidDateOrNull(this._dateAdapter.deserialize(e)),this._selectedDate=this._getDateInCurrentMonth(this._selected)},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){this._init()},e.prototype._dateSelected=function(e){if(this._selectedDate!=e){var t=this._dateAdapter.getYear(this.activeDate),n=this._dateAdapter.getMonth(this.activeDate),r=this._dateAdapter.createDate(t,n,e);this.selectedChange.emit(r)}this._userSelection.emit()},e.prototype._init=function(){this._selectedDate=this._getDateInCurrentMonth(this.selected),this._todayDate=this._getDateInCurrentMonth(this._dateAdapter.today()),this._monthLabel=this._dateAdapter.getMonthNames("short")[this._dateAdapter.getMonth(this.activeDate)].toLocaleUpperCase();var e=this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),this._dateAdapter.getMonth(this.activeDate),1);this._firstWeekOffset=(7+this._dateAdapter.getDayOfWeek(e)-this._dateAdapter.getFirstDayOfWeek())%7,this._createWeekCells(),this._changeDetectorRef.markForCheck()},e.prototype._createWeekCells=function(){var e=this._dateAdapter.getNumDaysInMonth(this.activeDate),t=this._dateAdapter.getDateNames();this._weeks=[[]];for(var n=0,r=this._firstWeekOffset;n<e;n++,r++){7==r&&(this._weeks.push([]),r=0);var i=this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),this._dateAdapter.getMonth(this.activeDate),n+1),o=!this.dateFilter||this.dateFilter(i),l=this._dateAdapter.format(i,this._dateFormats.display.dateA11yLabel);this._weeks[this._weeks.length-1].push(new $u(n+1,t[n],l,o))}},e.prototype._getDateInCurrentMonth=function(e){return e&&this._hasSameMonthAndYear(e,this.activeDate)?this._dateAdapter.getDate(e):null},e.prototype._hasSameMonthAndYear=function(e,t){return!(!e||!t||this._dateAdapter.getMonth(e)!=this._dateAdapter.getMonth(t)||this._dateAdapter.getYear(e)!=this._dateAdapter.getYear(t))},e.prototype._getValidDateOrNull=function(e){return this._dateAdapter.isDateInstance(e)&&this._dateAdapter.isValid(e)?e:null},e}(),Yu=function(){function e(e,t,n){if(this._dateAdapter=e,this._dateFormats=t,this._changeDetectorRef=n,this.selectedChange=new al.EventEmitter,!this._dateAdapter)throw Y("DateAdapter");if(!this._dateFormats)throw Y("MAT_DATE_FORMATS");this._activeDate=this._dateAdapter.today()}return Object.defineProperty(e.prototype,"activeDate",{get:function(){return this._activeDate},set:function(e){var t=this._activeDate;this._activeDate=this._getValidDateOrNull(this._dateAdapter.deserialize(e))||this._dateAdapter.today(),this._dateAdapter.getYear(t)!=this._dateAdapter.getYear(this._activeDate)&&this._init()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},set:function(e){this._selected=this._getValidDateOrNull(this._dateAdapter.deserialize(e)),this._selectedMonth=this._getMonthInCurrentYear(this._selected)},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){this._init()},e.prototype._monthSelected=function(e){var t=this._dateAdapter.getNumDaysInMonth(this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),e,1));this.selectedChange.emit(this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),e,Math.min(this._dateAdapter.getDate(this.activeDate),t)))},e.prototype._init=function(){var e=this;this._selectedMonth=this._getMonthInCurrentYear(this.selected),this._todayMonth=this._getMonthInCurrentYear(this._dateAdapter.today()),this._yearLabel=this._dateAdapter.getYearName(this.activeDate);var t=this._dateAdapter.getMonthNames("short");this._months=[[0,1,2,3],[4,5,6,7],[8,9,10,11]].map(function(n){return n.map(function(n){return e._createCellForMonth(n,t[n])})}),this._changeDetectorRef.markForCheck()},e.prototype._getMonthInCurrentYear=function(e){return e&&this._dateAdapter.getYear(e)==this._dateAdapter.getYear(this.activeDate)?this._dateAdapter.getMonth(e):null},e.prototype._createCellForMonth=function(e,t){var n=this._dateAdapter.format(this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),e,1),this._dateFormats.display.monthYearA11yLabel);return new $u(e,t.toLocaleUpperCase(),n,this._isMonthEnabled(e))},e.prototype._isMonthEnabled=function(e){if(!this.dateFilter)return!0;for(var t=this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate),e,1);this._dateAdapter.getMonth(t)==e;t=this._dateAdapter.addCalendarDays(t,1))if(this.dateFilter(t))return!0;return!1},e.prototype._getValidDateOrNull=function(e){return this._dateAdapter.isDateInstance(e)&&this._dateAdapter.isValid(e)?e:null},e}(),Xu=function(){function e(e,t,n,r,i,o){var l=this;if(this._elementRef=e,this._intl=t,this._ngZone=n,this._dateAdapter=r,this._dateFormats=i,this.startView="month",this.selectedChange=new al.EventEmitter,this._userSelection=new al.EventEmitter,this._dateFilterForViews=function(e){return!!e&&(!l.dateFilter||l.dateFilter(e))&&(!l.minDate||l._dateAdapter.compareDate(e,l.minDate)>=0)&&(!l.maxDate||l._dateAdapter.compareDate(e,l.maxDate)<=0)},!this._dateAdapter)throw Y("DateAdapter");if(!this._dateFormats)throw Y("MAT_DATE_FORMATS");this._intlChanges=t.changes.subscribe(function(){return o.markForCheck()})}return Object.defineProperty(e.prototype,"startAt",{get:function(){return this._startAt},set:function(e){this._startAt=this._getValidDateOrNull(this._dateAdapter.deserialize(e))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected},set:function(e){this._selected=this._getValidDateOrNull(this._dateAdapter.deserialize(e))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"minDate",{get:function(){return this._minDate},set:function(e){this._minDate=this._getValidDateOrNull(this._dateAdapter.deserialize(e))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"maxDate",{get:function(){return this._maxDate},set:function(e){this._maxDate=this._getValidDateOrNull(this._dateAdapter.deserialize(e))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_activeDate",{get:function(){return this._clampedActiveDate},set:function(e){this._clampedActiveDate=this._dateAdapter.clampDate(e,this.minDate,this.maxDate)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_periodButtonText",{get:function(){return this._monthView?this._dateAdapter.format(this._activeDate,this._dateFormats.display.monthYearLabel).toLocaleUpperCase():this._dateAdapter.getYearName(this._activeDate)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_periodButtonLabel",{get:function(){return this._monthView?this._intl.switchToYearViewLabel:this._intl.switchToMonthViewLabel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_prevButtonLabel",{get:function(){return this._monthView?this._intl.prevMonthLabel:this._intl.prevYearLabel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_nextButtonLabel",{get:function(){return this._monthView?this._intl.nextMonthLabel:this._intl.nextYearLabel},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){this._activeDate=this.startAt||this._dateAdapter.today(),this._focusActiveCell(),this._monthView="year"!=this.startView},e.prototype.ngOnDestroy=function(){this._intlChanges.unsubscribe()},e.prototype.ngOnChanges=function(e){var t=e.minDate||e.maxDate||e.dateFilter;if(t&&!t.firstChange){var n=this.monthView||this.yearView;n&&n._init()}},e.prototype._dateSelected=function(e){this._dateAdapter.sameDate(e,this.selected)||this.selectedChange.emit(e)},e.prototype._userSelected=function(){this._userSelection.emit()},e.prototype._monthSelected=function(e){this._activeDate=e,this._monthView=!0},e.prototype._currentPeriodClicked=function(){this._monthView=!this._monthView},e.prototype._previousClicked=function(){this._activeDate=this._monthView?this._dateAdapter.addCalendarMonths(this._activeDate,-1):this._dateAdapter.addCalendarYears(this._activeDate,-1)},e.prototype._nextClicked=function(){this._activeDate=this._monthView?this._dateAdapter.addCalendarMonths(this._activeDate,1):this._dateAdapter.addCalendarYears(this._activeDate,1)},e.prototype._previousEnabled=function(){return!this.minDate||!this.minDate||!this._isSameView(this._activeDate,this.minDate)},e.prototype._nextEnabled=function(){return!this.maxDate||!this._isSameView(this._activeDate,this.maxDate)},e.prototype._handleCalendarBodyKeydown=function(e){this._monthView?this._handleCalendarBodyKeydownInMonthView(e):this._handleCalendarBodyKeydownInYearView(e)},e.prototype._focusActiveCell=function(){var e=this;this._ngZone.runOutsideAngular(function(){e._ngZone.onStable.asObservable().pipe(u(1)).subscribe(function(){e._elementRef.nativeElement.querySelector(".mat-calendar-body-active").focus()})})},e.prototype._isSameView=function(e,t){return this._monthView?this._dateAdapter.getYear(e)==this._dateAdapter.getYear(t)&&this._dateAdapter.getMonth(e)==this._dateAdapter.getMonth(t):this._dateAdapter.getYear(e)==this._dateAdapter.getYear(t)},e.prototype._handleCalendarBodyKeydownInMonthView=function(e){switch(e.keyCode){case 37:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,-1);break;case 39:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,1);break;case 38:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,-7);break;case 40:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,7);break;case 36:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,1-this._dateAdapter.getDate(this._activeDate));break;case 35:this._activeDate=this._dateAdapter.addCalendarDays(this._activeDate,this._dateAdapter.getNumDaysInMonth(this._activeDate)-this._dateAdapter.getDate(this._activeDate));break;case 33:this._activeDate=e.altKey?this._dateAdapter.addCalendarYears(this._activeDate,-1):this._dateAdapter.addCalendarMonths(this._activeDate,-1);break;case 34:this._activeDate=e.altKey?this._dateAdapter.addCalendarYears(this._activeDate,1):this._dateAdapter.addCalendarMonths(this._activeDate,1);break;case 13:return void(this._dateFilterForViews(this._activeDate)&&(this._dateSelected(this._activeDate),this._userSelected(),e.preventDefault()));default:return}this._focusActiveCell(),e.preventDefault()},e.prototype._handleCalendarBodyKeydownInYearView=function(e){switch(e.keyCode){case 37:this._activeDate=this._dateAdapter.addCalendarMonths(this._activeDate,-1);break;case 39:this._activeDate=this._dateAdapter.addCalendarMonths(this._activeDate,1);break;case 38:this._activeDate=this._prevMonthInSameCol(this._activeDate);break;case 40:this._activeDate=this._nextMonthInSameCol(this._activeDate);break;case 36:this._activeDate=this._dateAdapter.addCalendarMonths(this._activeDate,-this._dateAdapter.getMonth(this._activeDate));break;case 35:this._activeDate=this._dateAdapter.addCalendarMonths(this._activeDate,11-this._dateAdapter.getMonth(this._activeDate));break;case 33:this._activeDate=this._dateAdapter.addCalendarYears(this._activeDate,e.altKey?-10:-1);break;case 34:this._activeDate=this._dateAdapter.addCalendarYears(this._activeDate,e.altKey?10:1);break;case 13:this._monthSelected(this._activeDate);break;default:return}this._focusActiveCell(),e.preventDefault()},e.prototype._prevMonthInSameCol=function(e){return this._dateAdapter.addCalendarMonths(e,-4)},e.prototype._nextMonthInSameCol=function(e){return this._dateAdapter.addCalendarMonths(e,4)},e.prototype._getValidDateOrNull=function(e){return this._dateAdapter.isDateInstance(e)&&this._dateAdapter.isValid(e)?e:null},e}(),Ju=new al.InjectionToken("mat-datepicker-scroll-strategy"),ec=function(){function e(){}return e.prototype.ngAfterContentInit=function(){this._calendar._focusActiveCell()},e.prototype._handleKeydown=function(e){27===e.keyCode&&(this.datepicker.close(),e.preventDefault(),e.stopPropagation())},e}(),tc=function(){},nc=al["\u0275crt"]({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}}),rc=al["\u0275crt"]({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}}),ic=al["\u0275crt"]({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}}),oc=al["\u0275crt"]({encapsulation:2,styles:[".mat-calendar{display:block}.mat-calendar-header{padding:8px 8px 0 8px}.mat-calendar-content{padding:0 8px 8px 8px;outline:0}.mat-calendar-controls{display:flex;margin:5% calc(33% / 7 - 16px)}.mat-calendar-spacer{flex:1 1 auto}.mat-calendar-period-button{min-width:0}.mat-calendar-arrow{display:inline-block;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top-width:5px;border-top-style:solid;margin:0 0 0 5px;vertical-align:middle}.mat-calendar-arrow.mat-calendar-invert{transform:rotate(180deg)}[dir=rtl] .mat-calendar-arrow{margin:0 5px 0 0}.mat-calendar-next-button,.mat-calendar-previous-button{position:relative}.mat-calendar-next-button::after,.mat-calendar-previous-button::after{top:0;left:0;right:0;bottom:0;position:absolute;content:'';margin:15.5px;border:0 solid currentColor;border-top-width:2px}[dir=rtl] .mat-calendar-next-button,[dir=rtl] .mat-calendar-previous-button{transform:rotate(180deg)}.mat-calendar-previous-button::after{border-left-width:2px;transform:translateX(2px) rotate(-45deg)}.mat-calendar-next-button::after{border-right-width:2px;transform:translateX(-2px) rotate(45deg)}.mat-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mat-calendar-table-header th{text-align:center;padding:0 0 8px 0}.mat-calendar-table-header-divider{position:relative;height:1px}.mat-calendar-table-header-divider::after{content:'';position:absolute;top:0;left:-8px;right:-8px;height:1px}"],data:{}}),lc=al["\u0275crt"]({encapsulation:2,styles:[".mat-calendar-body{min-width:224px}.mat-calendar-body-label{height:0;line-height:0;text-align:left;padding-left:4.71429%;padding-right:4.71429%}.mat-calendar-body-cell{position:relative;height:0;line-height:0;text-align:center;outline:0;cursor:pointer}.mat-calendar-body-disabled{cursor:default}.mat-calendar-body-cell-content{position:absolute;top:5%;left:5%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-style:solid;border-radius:999px}[dir=rtl] .mat-calendar-body-label{text-align:right}"],data:{}}),ac=al["\u0275crt"]({encapsulation:2,styles:[".mat-datepicker-content{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);display:block}.mat-datepicker-content .mat-calendar{width:296px;height:354px}.mat-datepicker-content-touch{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);display:block;max-height:80vh;overflow:auto;margin:-24px}.mat-datepicker-content-touch .mat-calendar{min-width:250px;min-height:312px;max-width:750px;max-height:788px}@media all and (orientation:landscape){.mat-datepicker-content-touch .mat-calendar{width:64vh;height:80vh}}@media all and (orientation:portrait){.mat-datepicker-content-touch .mat-calendar{width:80vw;height:100vw}}"],data:{}}),sc=al["\u0275ccf"]("mat-datepicker-content",ec,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-datepicker-content",[["class","mat-datepicker-content"]],[[2,"mat-datepicker-content-touch",null]],[[null,"keydown"]],function(e,t,n){var r=!0;return"keydown"===t&&(r=!1!==al["\u0275nov"](e,1)._handleKeydown(n)&&r),r},ce,ac)),al["\u0275did"](1,1097728,null,0,ec,[],null,null)],null,function(e,t){e(t,0,0,al["\u0275nov"](t,1).datepicker.touchUi)})},{},{},[]),uc=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),cc=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),dc=20,pc=new al.InjectionToken("mat-tooltip-scroll-strategy"),fc=function(){function e(e){this._changeDetectorRef=e,this._visibility="initial",this._closeOnInteraction=!1,this._transformOrigin="bottom",this._onHide=new ml.Subject}return e.prototype.show=function(e,t){var n=this;this._hideTimeoutId&&clearTimeout(this._hideTimeoutId),this._closeOnInteraction=!0,this._position=e,this._showTimeoutId=setTimeout(function(){n._visibility="visible",n._markForCheck()},t)},e.prototype.hide=function(e){var t=this;this._showTimeoutId&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(function(){t._visibility="hidden",t._markForCheck()},e)},e.prototype.afterHidden=function(){return this._onHide.asObservable()},e.prototype.isVisible=function(){return"visible"===this._visibility},e.prototype._setTransformOrigin=function(e){var t="X"==("above"===this._position||"below"===this._position?"Y":"X")?e.overlayX:e.overlayY;if("top"===t||"bottom"===t)this._transformOrigin=t;else if("start"===t)this._transformOrigin="left";else{if("end"!==t)throw function(e){return Error('Tooltip position "'+e+'" is invalid.')}(this._position);this._transformOrigin="right"}},e.prototype._animationStart=function(){this._closeOnInteraction=!1},e.prototype._animationDone=function(e){var t=this,n=e.toState;"hidden"!==n||this.isVisible()||this._onHide.next(),"visible"!==n&&"hidden"!==n||Promise.resolve().then(function(){return t._closeOnInteraction=!0})},e.prototype._handleBodyInteraction=function(){this._closeOnInteraction&&this.hide(0)},e.prototype._markForCheck=function(){this._changeDetectorRef.markForCheck()},e}(),hc=function(){},mc=al["\u0275crt"]({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}}),gc=al["\u0275ccf"]("mat-tooltip-component",fc,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(e,t,n){var r=!0;return"body:click"===t&&(r=!1!==al["\u0275nov"](e,1)._handleBodyInteraction()&&r),r},me,mc)),al["\u0275did"](1,49152,null,0,fc,[al.ChangeDetectorRef],null,null)],null,function(e,t){e(t,0,0,"visible"===al["\u0275nov"](t,1)._visibility?1:null)})},{},{},[]),yc={},vc=function(){function e(e){this.project=e}return e.prototype.call=function(e,t){return t.subscribe(new bc(e,this.project))},e}(),bc=function(e){function t(t,n){e.call(this,t),this.project=n,this.active=0,this.values=[],this.observables=[]}return Object(bl.__extends)(t,e),t.prototype._next=function(e){this.values.push(yc),this.observables.push(e)},t.prototype._complete=function(){var e=this.observables,t=e.length;if(0===t)this.destination.complete();else{this.active=t,this.toRespond=t;for(var n=0;n<t;n++){var r=e[n];this.add(Object(Dl.a)(this,r,r,n))}}},t.prototype.notifyComplete=function(e){0==(this.active-=1)&&this.destination.complete()},t.prototype.notifyNext=function(e,t,n,r,i){var o=this.values,l=this.toRespond?o[n]===yc?--this.toRespond:this.toRespond:0;o[n]=t,0===l&&(this.project?this._tryProject(o):this.destination.next(o.slice()))},t.prototype._tryProject=function(e){var t;try{t=this.project.apply(this,e)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(kl.a),_c=function(e){function t(t,n,r){e.call(this),this.addHandler=t,this.removeHandler=n,this.selector=r}return Object(bl.__extends)(t,e),t.create=function(e,n,r){return new t(e,n,r)},t.prototype._subscribe=function(e){var t=this,n=this.removeHandler,r=this.selector?function(){for(var n=[],r=0;r<arguments.length;r++)n[r-0]=arguments[r];t._callSelector(e,n)}:function(t){e.next(t)},i=this._callAddHandler(r,e);Object(wl.a)(n)&&e.add(new Cl.a(function(){n(r,i)}))},t.prototype._callSelector=function(e,t){try{var n=this.selector.apply(this,t);e.next(n)}catch(t){e.error(t)}},t.prototype._callAddHandler=function(e,t){try{return this.addHandler(e)||null}catch(e){t.error(e)}},t}(gl.a).create,wc=new Map,xc=function(){function e(e){this.platform=e,this._matchMedia=this.platform.isBrowser?window.matchMedia.bind(window):ge}return e.prototype.matchMedia=function(e){return this.platform.WEBKIT&&function(e){if(!wc.has(e))try{var t=document.createElement("style");if(t.setAttribute("type","text/css"),!t.sheet){var n="@media "+e+" {.fx-query-test{ }}";t.appendChild(document.createTextNode(n))}document.getElementsByTagName("head")[0].appendChild(t),wc.set(e,t)}catch(e){console.error(e)}}(e),this._matchMedia(e)},e}(),Cc=function(){function e(e,t){this.mediaMatcher=e,this.zone=t,this._queries=new Map,this._destroySubject=new ml.Subject}return e.prototype.ngOnDestroy=function(){this._destroySubject.next(),this._destroySubject.complete()},e.prototype.isMatched=function(e){var t=this;return p(e).some(function(e){return t._registerQuery(e).mql.matches})},e.prototype.observe=function(e){var t=this;return function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];var n=null,r=null;return Object(Pl.a)(e[e.length-1])&&(r=e.pop()),"function"==typeof e[e.length-1]&&(n=e.pop()),1===e.length&&Object(Ml.a)(e[0])&&(e=e[0]),new yl.a(e,r).lift(new vc(n))}(p(e).map(function(e){return t._registerQuery(e).observable}),function(e,t){return{matches:!!(e&&e.matches||t&&t.matches)}})},e.prototype._registerQuery=function(e){var t=this;if(this._queries.has(e))return this._queries.get(e);var n=this.mediaMatcher.matchMedia(e),r={observable:_c(function(e){n.addListener(function(n){return t.zone.run(function(){return e(n)})})},function(e){n.removeListener(function(n){return t.zone.run(function(){return e(n)})})}).pipe(Object(Hu.a)(this._destroySubject),P(n),Object(wa.a)(function(e){return{matches:e.matches}})),mql:n};return this._queries.set(e,r),r},e}(),Ec=function(){},Sc=function(){function e(e,t){var n=this;this._overlayRef=t,this._afterClosed=new ml.Subject,this._afterOpened=new ml.Subject,this._onAction=new ml.Subject,this.containerInstance=e,this.onAction().subscribe(function(){return n.dismiss()}),e._onExit.subscribe(function(){return n._finishDismiss()})}return e.prototype.dismiss=function(){this._afterClosed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)},e.prototype.closeWithAction=function(){this._onAction.closed||(this._onAction.next(),this._onAction.complete())},e.prototype._dismissAfter=function(e){var t=this;this._durationTimeoutId=setTimeout(function(){return t.dismiss()},e)},e.prototype._open=function(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())},e.prototype._finishDismiss=function(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterClosed.next(),this._afterClosed.complete()},e.prototype.afterDismissed=function(){return this._afterClosed.asObservable()},e.prototype.afterOpened=function(){return this.containerInstance._onEnter},e.prototype.onAction=function(){return this._onAction.asObservable()},e}(),Oc=new al.InjectionToken("MatSnackBarData"),Tc=function(){this.politeness="assertive",this.announcementMessage="",this.duration=0,this.direction="ltr",this.data=null,this.horizontalPosition="center",this.verticalPosition="bottom"},kc=function(){function e(e,t){this.snackBarRef=e,this.data=t}return e.prototype.action=function(){this.snackBarRef.closeWithAction()},Object.defineProperty(e.prototype,"hasAction",{get:function(){return!!this.data.action},enumerable:!0,configurable:!0}),e}(),Dc=function(e){function t(t,n,r){var i=e.call(this)||this;return i._ngZone=t,i._elementRef=n,i._changeDetectorRef=r,i._destroyed=!1,i._onExit=new ml.Subject,i._onEnter=new ml.Subject,i._animationState="void",i}return Object(bl.__extends)(t,e),t.prototype.attachComponentPortal=function(e){if(this._portalOutlet.hasAttached())throw Error("Attempting to attach snack bar content after content is already attached");var t=this._elementRef.nativeElement;return(this.snackBarConfig.panelClass||this.snackBarConfig.extraClasses)&&(this._setCssClasses(this.snackBarConfig.panelClass),this._setCssClasses(this.snackBarConfig.extraClasses)),"center"===this.snackBarConfig.horizontalPosition&&t.classList.add("mat-snack-bar-center"),"top"===this.snackBarConfig.verticalPosition&&t.classList.add("mat-snack-bar-top"),this._portalOutlet.attachComponentPortal(e)},t.prototype.attachTemplatePortal=function(){throw Error("Not yet implemented")},t.prototype.onAnimationEnd=function(e){var t=e.toState;if(("void"===t&&"void"!==e.fromState||t.startsWith("hidden"))&&this._completeExit(),t.startsWith("visible")){var n=this._onEnter;this._ngZone.run(function(){n.next(),n.complete()})}},t.prototype.enter=function(){this._destroyed||(this._animationState="visible-"+this.snackBarConfig.verticalPosition,this._changeDetectorRef.detectChanges())},t.prototype.exit=function(){return this._animationState="hidden-"+this.snackBarConfig.verticalPosition,this._onExit},t.prototype.ngOnDestroy=function(){this._destroyed=!0,this._completeExit()},t.prototype._completeExit=function(){var e=this;this._ngZone.onMicrotaskEmpty.asObservable().pipe(u(1)).subscribe(function(){e._onExit.next(),e._onExit.complete()})},t.prototype._setCssClasses=function(e){if(e){var t=this._elementRef.nativeElement;Array.isArray(e)?e.forEach(function(e){return t.classList.add(e)}):t.classList.add(e)}},t}(Gl),Ic=function(){function e(e,t,n,r,i){this._overlay=e,this._live=t,this._injector=n,this._breakpointObserver=r,this._parentSnackBar=i,this._snackBarRefAtThisLevel=null}return Object.defineProperty(e.prototype,"_openedSnackBarRef",{get:function(){var e=this._parentSnackBar;return e?e._openedSnackBarRef:this._snackBarRefAtThisLevel},set:function(e){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=e:this._snackBarRefAtThisLevel=e},enumerable:!0,configurable:!0}),e.prototype.openFromComponent=function(e,t){var n=this,r=ye(t),i=this._attach(e,r);return i.afterDismissed().subscribe(function(){n._openedSnackBarRef==i&&(n._openedSnackBarRef=null)}),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(function(){i.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):i.containerInstance.enter(),r.duration&&r.duration>0&&i.afterOpened().subscribe(function(){return i._dismissAfter(r.duration)}),r.announcementMessage&&this._live.announce(r.announcementMessage,r.politeness),this._openedSnackBarRef=i,this._openedSnackBarRef},e.prototype.open=function(e,t,n){void 0===t&&(t="");var r=ye(n);return r.data={message:e,action:t},r.announcementMessage=e,this.openFromComponent(kc,r)},e.prototype.dismiss=function(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()},e.prototype._attachSnackBarContainer=function(e,t){var n=new ql(Dc,t.viewContainerRef),r=e.attach(n);return r.instance.snackBarConfig=t,r.instance},e.prototype._attach=function(e,t){var n=this._createOverlay(t),r=this._attachSnackBarContainer(n,t),i=new Sc(r,n),o=this._createInjector(t,i),l=new ql(e,void 0,o),a=r.attachComponentPortal(l);return i.instance=a.instance,this._breakpointObserver.observe("(max-width: 599px) and (orientation: portrait), (max-width: 959px) and (orientation: landscape)").pipe(Object(Hu.a)(n.detachments().pipe(u(1)))).subscribe(function(e){e.matches?n.overlayElement.classList.add("mat-snack-bar-handset"):n.overlayElement.classList.remove("mat-snack-bar-handset")}),i},e.prototype._createOverlay=function(e){var t=new ra;t.direction=e.direction;var n=this._overlay.position().global(),r="rtl"===e.direction,i="left"===e.horizontalPosition||"start"===e.horizontalPosition&&!r||"end"===e.horizontalPosition&&r,o=!i&&"center"!==e.horizontalPosition;return i?n.left("0"):o?n.right("0"):n.centerHorizontally(),"top"===e.verticalPosition?n.top("0"):n.bottom("0"),t.positionStrategy=n,this._overlay.create(t)},e.prototype._createInjector=function(e,t){var n=e&&e.viewContainerRef&&e.viewContainerRef.injector,r=new WeakMap;return r.set(Sc,t),r.set(Oc,e.data),new Ql(n||this._injector,r)},e}(),Rc=function(){},Mc=al["\u0275crt"]({encapsulation:2,styles:[".mat-snack-bar-container{border-radius:2px;box-sizing:border-box;display:block;margin:24px;max-width:568px;min-width:288px;padding:14px 24px;transform:translateY(100%) translateY(24px)}.mat-snack-bar-container.mat-snack-bar-center{margin:0;transform:translateY(100%)}.mat-snack-bar-container.mat-snack-bar-top{transform:translateY(-100%) translateY(-24px)}.mat-snack-bar-container.mat-snack-bar-top.mat-snack-bar-center{transform:translateY(-100%)}@media screen and (-ms-high-contrast:active){.mat-snack-bar-container{border:solid 1px}}.mat-snack-bar-handset{width:100%}.mat-snack-bar-handset .mat-snack-bar-container{margin:0;max-width:inherit;width:100%}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"visible-top, visible-bottom",styles:{type:6,styles:{transform:"translateY(0%)"},offset:null},options:void 0},{type:1,expr:"visible-top => hidden-top, visible-bottom => hidden-bottom",animation:{type:4,styles:null,timings:"195ms cubic-bezier(0.4,0.0,1,1)"},options:null},{type:1,expr:"void => visible-top, void => visible-bottom",animation:{type:4,styles:null,timings:"225ms cubic-bezier(0.0,0.0,0.2,1)"},options:null}],options:{}}]}}),Pc=al["\u0275ccf"]("snack-bar-container",Dc,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"snack-bar-container",[["class","mat-snack-bar-container"],["role","alert"]],[[40,"@state",0]],[["component","@state.done"]],function(e,t,n){var r=!0;return"component:@state.done"===t&&(r=!1!==al["\u0275nov"](e,1).onAnimationEnd(n)&&r),r},be,Mc)),al["\u0275did"](1,180224,null,0,Dc,[al.NgZone,al.ElementRef,al.ChangeDetectorRef],null,null)],null,function(e,t){e(t,0,0,al["\u0275nov"](t,1)._animationState)})},{},{},[]),Nc=al["\u0275crt"]({encapsulation:2,styles:[".mat-simple-snackbar{display:flex;justify-content:space-between;line-height:20px;opacity:1}.mat-simple-snackbar-action{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;background:0 0;flex-shrink:0;margin-left:48px}[dir=rtl] .mat-simple-snackbar-action{margin-right:48px;margin-left:0}"],data:{animation:[{type:7,name:"contentFade",definitions:[{type:1,expr:":enter",animation:[{type:6,styles:{opacity:"0"},offset:null},{type:4,styles:null,timings:"375ms cubic-bezier(0.4,0.0,0.2,1)"}],options:null}],options:{}}]}}),Ac=al["\u0275ccf"]("simple-snack-bar",kc,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"simple-snack-bar",[["class","mat-simple-snackbar"]],[[40,"@contentFade",0]],null,null,we,Nc)),al["\u0275did"](1,49152,null,0,kc,[Sc,Oc],null,null)],null,function(e,t){e(t,0,0,void 0)})},{},{},[]),Lc=function(){},Fc=function(){function e(e,t,n){void 0===e&&(e=!1),void 0===n&&(n=!0);var r=this;this._isMulti=e,this._emitChanges=n,this._selection=new Set,this._deselectedToEmit=[],this._selectedToEmit=[],this.onChange=this._emitChanges?new ml.Subject:null,t&&(e?t.forEach(function(e){return r._markSelected(e)}):this._markSelected(t[0]),this._selectedToEmit.length=0)}return Object.defineProperty(e.prototype,"selected",{get:function(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected},enumerable:!0,configurable:!0}),e.prototype.select=function(){for(var e=this,t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];this._verifyValueAssignment(t),t.forEach(function(t){return e._markSelected(t)}),this._emitChangeEvent()},e.prototype.deselect=function(){for(var e=this,t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];this._verifyValueAssignment(t),t.forEach(function(t){return e._unmarkSelected(t)}),this._emitChangeEvent()},e.prototype.toggle=function(e){this.isSelected(e)?this.deselect(e):this.select(e)},e.prototype.clear=function(){this._unmarkAll(),this._emitChangeEvent()},e.prototype.isSelected=function(e){return this._selection.has(e)},e.prototype.isEmpty=function(){return 0===this._selection.size},e.prototype.hasValue=function(){return!this.isEmpty()},e.prototype.sort=function(e){this._isMulti&&this._selected&&this._selected.sort(e)},e.prototype._emitChangeEvent=function(){if(this._selected=null,this._selectedToEmit.length||this._deselectedToEmit.length){var e=new jc(this._selectedToEmit,this._deselectedToEmit);this.onChange&&this.onChange.next(e),this._deselectedToEmit=[],this._selectedToEmit=[]}},e.prototype._markSelected=function(e){this.isSelected(e)||(this._isMulti||this._unmarkAll(),this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))},e.prototype._unmarkSelected=function(e){this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))},e.prototype._unmarkAll=function(){var e=this;this.isEmpty()||this._selection.forEach(function(t){return e._unmarkSelected(t)})},e.prototype._verifyValueAssignment=function(e){if(e.length>1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},e}(),jc=function(e,t){this.added=e,this.removed=t},Vc=function(){function e(){this._listeners=[]}return e.prototype.notify=function(e,t){for(var n=0,r=this._listeners;n<r.length;n++)(0,r[n])(e,t)},e.prototype.listen=function(e){var t=this;return this._listeners.push(e),function(){t._listeners=t._listeners.filter(function(t){return e!==t})}},e}(),zc=n("eoFs"),Bc=function(){function e(e,t){this.template=e,this._differs=t}return e.prototype.ngOnChanges=function(e){var t=e.columns.currentValue||[];this._columnsDiffer||(this._columnsDiffer=this._differs.find(t).create(),this._columnsDiffer.diff(t))},e.prototype.getColumnsDiff=function(){return this._columnsDiffer.diff(this.columns)},e}(),Hc=function(e){function t(t,n){return e.call(this,t,n)||this}return Object(bl.__extends)(t,e),t}(Bc),Wc=function(e){function t(t,n){return e.call(this,t,n)||this}return Object(bl.__extends)(t,e),t}(Bc),qc=function(){function e(t){this._viewContainer=t,e.mostRecentCellOutlet=this}return e.mostRecentCellOutlet=null,e}(),Uc=function(e){this.template=e},Gc=function(e){this.template=e},Kc=function(){function e(){}return Object.defineProperty(e.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e,this.cssClassFriendlyName=e.replace(/[^a-z0-9_-]/gi,"-")},enumerable:!0,configurable:!0}),e}(),$c=function(e){this.viewContainer=e},Zc=function(e){this.viewContainer=e},Qc=function(){function e(e,t,n,r){this._differs=e,this._changeDetectorRef=t,this._onDestroy=new ml.Subject,this._data=[],this._columnDefsByName=new Map,this.viewChange=new zc.a({start:0,end:Number.MAX_VALUE}),r||n.nativeElement.setAttribute("role","grid")}return Object.defineProperty(e.prototype,"trackBy",{get:function(){return this._trackByFn},set:function(e){Object(al.isDevMode)()&&null!=e&&"function"!=typeof e&&console&&console.warn&&console.warn("trackBy must be a function, but received "+JSON.stringify(e)+"."),this._trackByFn=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"dataSource",{get:function(){return this._dataSource},set:function(e){this._dataSource!==e&&this._switchDataSource(e)},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._dataDiffer=this._differs.find([]).create(this._trackByFn)},e.prototype.ngAfterContentInit=function(){var e=this;if(!this._headerDef&&!this._rowDefs.length)throw Error("Missing definitions for header and row, cannot determine which columns should be rendered.");this._cacheColumnDefsByName(),this._columnDefs.changes.subscribe(function(){return e._cacheColumnDefsByName()}),this._renderHeaderRow()},e.prototype.ngAfterContentChecked=function(){this._renderUpdatedColumns();var e=this._rowDefs.filter(function(e){return!e.when});if(e.length>1)throw Error("There can only be one default row without a when predicate function.");this._defaultRowDef=e[0],this.dataSource&&!this._renderChangeSubscription&&this._observeRenderChanges()},e.prototype.ngOnDestroy=function(){this._rowPlaceholder.viewContainer.clear(),this._headerRowPlaceholder.viewContainer.clear(),this._onDestroy.next(),this._onDestroy.complete(),this.dataSource&&this.dataSource.disconnect(this)},e.prototype._cacheColumnDefsByName=function(){var e=this;this._columnDefsByName.clear(),this._columnDefs.forEach(function(t){if(e._columnDefsByName.has(t.name))throw function(e){return Error('Duplicate column definition name provided: "'+e+'".')}(t.name);e._columnDefsByName.set(t.name,t)})},e.prototype._renderUpdatedColumns=function(){var e=this;this._rowDefs.forEach(function(t){t.getColumnsDiff()&&(e._dataDiffer.diff([]),e._rowPlaceholder.viewContainer.clear(),e._renderRowChanges())}),this._headerDef.getColumnsDiff()&&(this._headerRowPlaceholder.viewContainer.clear(),this._renderHeaderRow())},e.prototype._switchDataSource=function(e){this._data=[],this.dataSource&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),e||this._rowPlaceholder.viewContainer.clear(),this._dataSource=e},e.prototype._observeRenderChanges=function(){var e=this;this._renderChangeSubscription=this.dataSource.connect(this).pipe(Object(Hu.a)(this._onDestroy)).subscribe(function(t){e._data=t,e._renderRowChanges()})},e.prototype._renderHeaderRow=function(){var e=this._getHeaderCellTemplatesForRow(this._headerDef);e.length&&(this._headerRowPlaceholder.viewContainer.createEmbeddedView(this._headerDef.template,{cells:e}),e.forEach(function(e){qc.mostRecentCellOutlet&&qc.mostRecentCellOutlet._viewContainer.createEmbeddedView(e.template,{})}),this._changeDetectorRef.markForCheck())},e.prototype._renderRowChanges=function(){var e=this,t=this._dataDiffer.diff(this._data);if(t){var n=this._rowPlaceholder.viewContainer;t.forEachOperation(function(t,r,i){if(null==t.previousIndex)e._insertRow(t.item,i);else if(null==i)n.remove(r);else{var o=n.get(r);n.move(o,i)}}),this._updateRowIndexContext(),t.forEachIdentityChange(function(e){n.get(e.currentIndex).context.$implicit=e.item})}},e.prototype._getRowDef=function(e,t){if(1==this._rowDefs.length)return this._rowDefs.first;var n=this._rowDefs.find(function(n){return n.when&&n.when(t,e)})||this._defaultRowDef;if(!n)throw Error("Could not find a matching row definition for the provided row data.");return n},e.prototype._insertRow=function(e,t){var n=this._getRowDef(e,t),r={$implicit:e};this._rowPlaceholder.viewContainer.createEmbeddedView(n.template,r,t),this._getCellTemplatesForRow(n).forEach(function(e){qc.mostRecentCellOutlet&&qc.mostRecentCellOutlet._viewContainer.createEmbeddedView(e.template,r)}),this._changeDetectorRef.markForCheck()},e.prototype._updateRowIndexContext=function(){for(var e=this._rowPlaceholder.viewContainer,t=0,n=e.length;t<n;t++){var r=e.get(t);r.context.index=t,r.context.count=n,r.context.first=0===t,r.context.last=t===n-1,r.context.even=t%2==0,r.context.odd=!r.context.even}},e.prototype._getHeaderCellTemplatesForRow=function(e){var t=this;return e.columns?e.columns.map(function(e){var n=t._columnDefsByName.get(e);if(!n)throw Ce(e);return n.headerCell}):[]},e.prototype._getCellTemplatesForRow=function(e){var t=this;return e.columns?e.columns.map(function(e){var n=t._columnDefsByName.get(e);if(!n)throw Ce(e);return n.cell}):[]},e}(),Yc=function(){},Xc=(n("3m71"),function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Qc)),Jc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Uc),ed=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Gc),td=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Kc),nd=function(e){function t(t,n){var r=e.call(this,t,n)||this;return n.nativeElement.classList.add("mat-column-"+t.cssClassFriendlyName),r}return Object(bl.__extends)(t,e),t}(function(e,t){t.nativeElement.classList.add("cdk-column-"+e.cssClassFriendlyName)}),rd=function(e){function t(t,n){var r=e.call(this,t,n)||this;return n.nativeElement.classList.add("mat-column-"+t.cssClassFriendlyName),r}return Object(bl.__extends)(t,e),t}(function(e,t){t.nativeElement.classList.add("cdk-column-"+e.cssClassFriendlyName)}),id=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Hc),od=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(Wc),ld=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(function(){}),ad=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t}(function(){}),sd=function(){},ud=al["\u0275crt"]({encapsulation:2,styles:[".mat-table{display:block}.mat-header-row,.mat-row{display:flex;border-bottom-width:1px;border-bottom-style:solid;align-items:center;min-height:48px;padding:0 24px}.mat-cell,.mat-header-cell{flex:1;overflow:hidden;word-wrap:break-word}"],data:{}}),cd=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),dd=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),pd=function(){},fd=function(){this.align="start"},hd=function(){},md=function(){},gd=al["\u0275crt"]({encapsulation:2,styles:[".mat-card{transition:box-shadow 280ms cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:24px;border-radius:2px}.mat-card:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-card{outline:solid 1px}}.mat-card-flat{box-shadow:none}.mat-card-actions,.mat-card-content,.mat-card-subtitle,.mat-card-title{display:block;margin-bottom:16px}.mat-card-actions{margin-left:-16px;margin-right:-16px;padding:8px 0}.mat-card-actions-align-end{display:flex;justify-content:flex-end}.mat-card-image{width:calc(100% + 48px);margin:0 -24px 16px -24px}.mat-card-xl-image{width:240px;height:240px;margin:-8px}.mat-card-footer{display:block;margin:0 -24px -24px -24px}.mat-card-actions .mat-button,.mat-card-actions .mat-raised-button{margin:0 4px}.mat-card-header{display:flex;flex-direction:row}.mat-card-header-text{margin:0 8px}.mat-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0}.mat-card-lg-image,.mat-card-md-image,.mat-card-sm-image{margin:-8px 0}.mat-card-title-group{display:flex;justify-content:space-between;margin:0 -8px}.mat-card-sm-image{width:80px;height:80px}.mat-card-md-image{width:112px;height:112px}.mat-card-lg-image{width:152px;height:152px}@media (max-width:600px){.mat-card{padding:24px 16px}.mat-card-actions{margin-left:-8px;margin-right:-8px}.mat-card-image{width:calc(100% + 32px);margin:16px -16px}.mat-card-title-group{margin:0}.mat-card-xl-image{margin-left:0;margin-right:0}.mat-card-header{margin:-8px 0 0 0}.mat-card-footer{margin-left:-16px;margin-right:-16px}}.mat-card-content>:first-child,.mat-card>:first-child{margin-top:0}.mat-card-content>:last-child:not(.mat-card-footer),.mat-card>:last-child:not(.mat-card-footer){margin-bottom:0}.mat-card-image:first-child{margin-top:-24px}.mat-card>.mat-card-actions:last-child{margin-bottom:-16px;padding-bottom:0}.mat-card-actions .mat-button:first-child,.mat-card-actions .mat-raised-button:first-child{margin-left:0;margin-right:0}.mat-card-subtitle:not(:first-child),.mat-card-title:not(:first-child){margin-top:-4px}.mat-card-header .mat-card-subtitle:not(:first-child){margin-top:-8px}.mat-card>.mat-card-xl-image:first-child{margin-top:-8px}.mat-card>.mat-card-xl-image:last-child{margin-bottom:-8px}"],data:{}}),yd=function(e){function t(t,n){var r=e.call(this,t)||this;return r._platform=n,r}return Object(bl.__extends)(t,e),t.prototype.ngAfterViewInit=function(){var e=this;Object(al.isDevMode)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return e._checkToolbarMixedModes()}))},t.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(e){return!(e.classList&&e.classList.contains("mat-toolbar-row"))}).filter(function(e){return e.nodeType!==Node.COMMENT_NODE}).some(function(e){return e.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `<mat-toolbar-row>` elements explicitly or just place content inside of a `<mat-toolbar>` for a single row.")}()},t}(I(function(e){this._elementRef=e})),vd=function(){},bd=al["\u0275crt"]({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}}),_d=n("oiK7"),wd=function(){function e(){this.change=new al.EventEmitter,this.focus=new al.EventEmitter,this.blur=new al.EventEmitter,this.instance=null,this._value="",this.codemirrorMetadataConfig={mode:"asterix",lineWrapping:!0,showCursorWhenSelecting:!0,autofocus:!0},_d.defineMode("asterix",function(){var e=["drop","dataverse","dataset","if","exists","create","use","type","as","closed","primary","key","hints","cardinality","index","on","btree","rtree","keyword","for","in","Metadata","Dataset","return","Index","load","using","localfs","path","format","from","in","with","group","by","select","let","where","order","asc","desc","limit","keeping","offset","distinct","or","and","boolean","tinyint","smallint","integer","bigint","float","double","string","binary","hex","base64","point","line","rectangle","circle","polygon","date","time","datetime","duration","interval","uuid","null","missing","DROP","DATAVERSE","IF","EXISTS","CREATE","USE","TYPE","AS","DATASET","PRIMARY","KEY","INDEX","SELECT","VALUE","INSERT","INTO","FROM","WHERE","AND","SOME","IN","SATISFIES","IS","UNKNOWN","NOT","EVERY","GROUP","BY","ORDER","DESC","LIMIT","OR","SET","DELETE","LOAD","USING"],t=/[$][a-zA-Z]+(\d*)/,n=/[.](\S)*/,r=/["].*["]/,i=/['].*[']/;return{startState:function(){return{inString:!1}},token:function(o,l){if(void 0==l.newLine&&(l.newLine=!0),o.match(t))return"variable";if(o.match(n))return"dot-variable";if(o.match(r))return"string";if(o.match(i))return"string";for(var a in e)if(l.newLine&&o.match(e[a]))return"keyword";return l.newLine=" "===o.peek()||null===o.peek(),o.next(),null}}})}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){e!==this._value&&(this._value=e,this.onChange(e))},enumerable:!0,configurable:!0}),e.prototype.ngOnDestroy=function(){},e.prototype.ngAfterViewInit=function(){this.config=this.config||{},this.codemirrorInit(this.config)},e.prototype.codemirrorInit=function(e){var t=this;this.instance=_d.fromTextArea(this.hostMetadata.nativeElement,this.codemirrorMetadataConfig),this.instance.setSize("100%","100px"),this.instance.on("change",function(){t.updateValue(t.instance.getValue())}),this.instance.on("focus",function(){t.focus.emit()}),this.instance.on("blur",function(){t.blur.emit()})},e.prototype.updateValue=function(e){this.value=e,this.onTouched(),this.change.emit(e)},e.prototype.writeValue=function(e){this._value=e||"",this.instance&&this.instance.setValue(this._value)},e.prototype.onChange=function(e){},e.prototype.onTouched=function(){},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e}(),xd=al["\u0275crt"]({encapsulation:0,styles:[[".textarea-metadata[_ngcontent-%COMP%]{background-color:red!important;border:1px solid #000!important;padding:0;margin:0}codemirror-metadata[_ngcontent-%COMP%]{border:1px solid #eee;height:auto;background-color:blue!important;padding:0;margin:0}"]],data:{}}),Cd="[Query] Execute SQL++ Query",Ed="[Query] Execute SQL++ Query Success",Sd="[Query] Execute SQL++ Query Fail",Od="[Query] Execute Metadata SQL++ Query",Td="[Query] Execute Metadata SQL++ Query Success",kd="[Query] Execute Metadata SQL++ Query Fail",Dd=function(){return function(e){this.payload=e,this.type=Cd}}(),Id=function(){return function(e){this.payload=e,this.type=Ed}}(),Rd=function(){return function(e){this.payload=e,this.type=Sd}}(),Md=function(){return function(e){this.payload=e,this.type=Od}}(),Pd=function(){return function(e){this.payload=e,this.type=Td}}(),Nd=function(){return function(e){this.payload=e,this.type=kd}}(),Ad="[Dataverse Collection] Select Dataverses",Ld="[Dataverse Collection] Select Dataverses Success",Fd="[Dataverse Collection] Create Dataverse",jd="[Dataverse Collection] Create Dataverse Success",Vd="[Dataverse Collection] Create Dataverse Fail",zd="[Dataverse Collection] Drop Dataverses",Bd="[Dataverse Collection] Drop Dataverses Success",Hd="[Dataverse Collection] Drop Dataverses Fail",Wd=function(){return function(e){this.payload=e,this.type=Ad}}(),qd=function(){return function(e){this.payload=e,this.type=Ld}}(),Ud=function(e){this.payload=e,this.type="[Dataverse Collection] Select Dataverses Fail"},Gd=function(){return function(e){this.payload=e,this.type=Fd}}(),Kd=function(){return function(e){this.payload=e,this.type=jd}}(),$d=function(){return function(e){this.payload=e,this.type=Vd}}(),Zd=function(){return function(e){this.payload=e,this.type=zd}}(),Qd=function(){return function(e){this.payload=e,this.type=Bd}}(),Yd=function(){return function(e){this.payload=e,this.type=Hd}}(),Xd="[Dataset Collection] Select Dataset",Jd="[Dataset Collection] Select Dataset Success",ep="[Dataset Collection] Create Dataset",tp="[Dataset Collection] Create Dataset Success",np="[Dataset Collection] Create Dataset Fail",rp="[Dataset Collection] Drop Dataset",ip="[Dataset Collection] Drop Dataset Success",op="[Dataset Collection] Drop Dataset Fail",lp="[Dataset Collection] Guide Select Dataset",ap=function(){return function(e){this.payload=e,this.type=lp}}(),sp=function(){return function(e){this.payload=e,this.type=Xd}}(),up=function(){return function(e){this.payload=e,this.type=Jd}}(),cp=function(e){this.payload=e,this.type="[Dataset Collection] Select Dataset Fail"},dp=function(){return function(e){this.payload=e,this.type=ep}}(),pp=function(){return function(e){this.payload=e,this.type=tp}}(),fp=function(){return function(e){this.payload=e,this.type=np}}(),hp=function(){return function(e){this.payload=e,this.type=rp}}(),mp=function(){return function(e){this.payload=e,this.type=ip}}(),gp=function(){return function(e){this.payload=e,this.type=op}}(),yp="[Datatype Collection] Select Datatypes",vp="[Datatype Collection] Select Datatypes Success",bp="[Datatype Collection] Create Datatypes",_p="[Datatype Collection] Create Datatypes Success",wp="[Datatype Collection] Create Datatypes Fail",xp="[Datatype Collection] Drop Datatypes",Cp="[Datatype Collection] Drop Datatypes Success",Ep="[Datatype Collection] Drop Datatypes Fail",Sp=function(){return function(e){this.payload=e,this.type=yp}}(),Op=function(){return function(e){this.payload=e,this.type=vp}}(),Tp=function(e){this.payload=e,this.type="[Datatype Collection] Select Datatypes Fail"},kp=function(){return function(e){this.payload=e,this.type=bp}}(),Dp=function(){return function(e){this.payload=e,this.type=_p}}(),Ip=function(){return function(e){this.payload=e,this.type=wp}}(),Rp=function(){return function(e){this.payload=e,this.type=xp}}(),Mp=function(){return function(e){this.payload=e,this.type=Cp}}(),Pp=function(){return function(e){this.payload=e,this.type=Ep}}(),Np="[Index Collection] Select Indexes",Ap="[Index Collection] Select Indexes Success",Lp="[Index Collection] Create Index",Fp="[Index Collection] Create Index Success",jp="[Index Collection] Drop Indexes",Vp="[Index Collection] Drop Indexes Success",zp="[Index Collection] Drop Indexes Fail",Bp=function(){return function(e){this.payload=e,this.type=Np}}(),Hp=function(){return function(e){this.payload=e,this.type=Ap}}(),Wp=function(e){this.payload=e,this.type="[Index Collection] Select Indexes Fail"},qp=function(){return function(e){this.payload=e,this.type=Lp}}(),Up=function(){return function(e){this.payload=e,this.type=Fp}}(),Gp=function(e){this.payload=e,this.type="[Index Collection] Create Index Fail"},Kp=function(){return function(e){this.payload=e,this.type=jp}}(),$p=function(){return function(e){this.payload=e,this.type=Vp}}(),Zp=function(){return function(e){this.payload=e,this.type=zp}}(),Qp=function(){function e(e,t){var n=this;this.store=e,this.changeDetector=t,this.dataverses=[],this.datatypes=[],this.datasets=[],this.indexes=[],this.queryMetadataString="",this.errorMessage="",this.codemirrorMetadataConfig={mode:"asterix",lineWrapping:!0,showCursorWhenSelecting:!0,autofocus:!0},this.store.select("sqlMetadataQuery").subscribe(function(e){if(!1===e.success)e.sqlQueryMetadataError.errors&&(n.errorMessage="ERROR: "+e.sqlQueryMetadataError.errors[0].msg,n.changeDetector.detectChanges());else{n.errorMessage="SUCCEED";var t=e.sqlQueryMetadataString;(t=t.toUpperCase()).includes("CREATE DATAVERSE")||t.includes("DROP DATAVERSE")?n.store.dispatch(new Wd("-")):t.includes("CREATE DATASET")||t.includes("DROP DATASET")?n.store.dispatch(new sp("-")):t.includes("CREATE TYPE")||t.includes("DROP TYPE")?n.store.dispatch(new Sp("-")):(t.includes("CREATE INDEX")||t.includes("DROP INDEX"))&&n.store.dispatch(new Bp("-")),n.changeDetector.detectChanges()}})}return e.prototype.getQueryResults=function(e){this.store.dispatch(new Md(e))},e.prototype.executeQuery=function(){this.getQueryResults(this.queryMetadataString.replace(/\n/g," "))},e.prototype.onClick=function(){this.errorMessage=""},e.prototype.cleanUp=function(){this.errorMessage=""},e}(),Yp=n("ADVA"),Xp=al["\u0275crt"]({encapsulation:0,styles:[[".input-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;margin:0 auto;margin-top:8px;height:250px;width:95%;overflow:hidden}.toolbar-icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-selector[_ngcontent-%COMP%]{max-height:42px;min-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.content-area[_ngcontent-%COMP%]{position:relative;color:rgba(0,0,0,.87);height:120px;padding:0;margin:16px;overflow:none}.codemirror-container[_ngcontent-%COMP%]{width:100%;height:100%;padding:0;margin:0;font-size:14px;line-height:1.8}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:8px;margin:0}.error-message[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding-top:10px;padding-left:20px;text-overflow:ellipsis}"]],data:{}});gl.a.prototype.startWith=function(){for(var e=[],t=0;t<arguments.length;t++)e[t-0]=arguments[t];return P.apply(void 0,e)(this)},gl.a.merge=Ll.a,gl.a.prototype.map=iu.a,gl.a.prototype.debounceTime=function(e,t){return void 0===t&&(t=Tl),_(e,t)(this)};var Jp=n("6y8h");gl.a.prototype.distinctUntilChanged=Jp.a,gl.a.fromEvent=Sl;var ef=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),tf=function(){function e(e,t){var n=this;this.store=e,this.dialog=t,this.displayedColumns=["DataverseName","Dataformat","Timestamp","PendingOp"],this.selection=new Fc(!0,[]),this.errorMessage="",this.dvName="",this.selectedRowIndex=-1,this.loaded$=this.store.select("dataverse"),this.store.select(function(e){return e.dataverse.createDataverseName}).subscribe(function(e){n.dvName=e}),this.store.select(function(e){return e.dataverse.dropDataverseName}).subscribe(function(e){n.dvName=e}),this.store.select(function(e){return e.dataverse.createDataverseSuccess}).subscribe(function(e){!0===e&&(n.getDataverse(),n.errorMessage="SUCCEED: CREATED DATAVERSE "+n.dvName+" ")}),this.store.select(function(e){return e.dataverse.createDataverseError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)}),this.store.select(function(e){return e.dataverse.dropDataverseSuccess}).subscribe(function(e){!0===e&&(n.getDataverse(),n.errorMessage="SUCCEED: DROP DATAVERSE "+n.dvName)}),this.store.select(function(e){return e.dataverse.dropDataverseError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)})}return e.prototype.getDataverse=function(){this.store.dispatch(new Wd("-"))},e.prototype.ngOnInit=function(){this.dataSource=new of(this.store)},e.prototype.ngAfterViewChecked=function(){},e.prototype.ngAfterViewInit=function(){},e.prototype.openCreateDataverseDialog=function(){this.dialog.open(nf,{width:"420px",data:{name:this.dataverseName}}).afterClosed().subscribe(function(e){})},e.prototype.openDropDataverseDialog=function(){var e=this;this.dialog.open(rf,{width:"420px",data:{name:this.dataverseName}}).afterClosed().subscribe(function(t){e.dataverseName=t})},e.prototype.onClick=function(){this.errorMessage=""},e.prototype.highlight=function(e){this.output=JSON.stringify(e,null,2)},e.prototype.cleanUp=function(){this.errorMessage="",this.inputQuery.cleanUp()},e}(),nf=function(){function e(e,t,n){this.store=e,this.dialogCreateDvRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new Gd(this.data.dataverseName)),this.dialogCreateDvRef.close(this.data.dataverseName)},e.prototype.onNoClick=function(){this.dialogCreateDvRef.close()},e}(),rf=function(){function e(e,t,n){this.store=e,this.dialogDropDvRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new Zd(this.data.dataverseName)),this.dialogDropDvRef.close(this.data.dataverseName)},e.prototype.onNoClick=function(){this.dialogDropDvRef.close()},e}(),of=function(e){function t(t){var n=e.call(this)||this;return n.store=t,n._filterChange=new zc.a(""),n.dataverse$=n.store.select(function(e){return e.dataverse.dataverses.results}),n}return ef(t,e),Object.defineProperty(t.prototype,"filter",{get:function(){return this._filterChange.value},set:function(e){this._filterChange.next(e)},enumerable:!0,configurable:!0}),t.prototype.connect=function(){return this.dataverse$},t.prototype.disconnect=function(){},t}(Lc),lf=al["\u0275crt"]({encapsulation:2,styles:[".mat-form-field{display:inline-block;position:relative;text-align:left}[dir=rtl] .mat-form-field{text-align:right}.mat-form-field-wrapper{position:relative}.mat-form-field-flex{display:inline-flex;align-items:baseline;width:100%}.mat-form-field-prefix,.mat-form-field-suffix{white-space:nowrap;flex:none}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{width:1em}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{font:inherit;vertical-align:baseline}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{font-size:inherit}.mat-form-field-infix{display:block;position:relative;flex:auto;min-width:0;width:180px}.mat-form-field-label-wrapper{position:absolute;left:0;box-sizing:content-box;width:100%;height:100%;overflow:hidden;pointer-events:none}.mat-form-field-label{position:absolute;left:0;font:inherit;pointer-events:none;width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;transform:perspective(100px);-ms-transform:none;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),color .4s cubic-bezier(.25,.8,.25,1),width .4s cubic-bezier(.25,.8,.25,1);display:none}[dir=rtl] .mat-form-field-label{transform-origin:100% 0;left:auto;right:0}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-empty.mat-form-field-label{display:block}.mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:none}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{display:block;transition:none}.mat-input-server:focus+.mat-form-field-placeholder-wrapper .mat-form-field-placeholder,.mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-placeholder-wrapper .mat-form-field-placeholder{display:none}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-placeholder-wrapper .mat-form-field-placeholder,.mat-form-field-can-float .mat-input-server[placeholder]:not(:placeholder-shown)+.mat-form-field-placeholder-wrapper .mat-form-field-placeholder{display:block}.mat-form-field-label:not(.mat-form-field-empty){transition:none}.mat-form-field-underline{position:absolute;height:1px;width:100%}.mat-form-field-disabled .mat-form-field-underline{background-position:0;background-color:transparent}.mat-form-field-underline .mat-form-field-ripple{position:absolute;top:0;left:0;width:100%;height:2px;transform-origin:50%;transform:scaleX(.5);visibility:hidden;opacity:0;transition:background-color .3s cubic-bezier(.55,0,.55,.2)}.mat-form-field-invalid:not(.mat-focused) .mat-form-field-underline .mat-form-field-ripple{height:1px}.mat-focused .mat-form-field-underline .mat-form-field-ripple,.mat-form-field-invalid .mat-form-field-underline .mat-form-field-ripple{visibility:visible;opacity:1;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}.mat-form-field-subscript-wrapper{position:absolute;width:100%;overflow:hidden}.mat-form-field-label-wrapper .mat-icon,.mat-form-field-subscript-wrapper .mat-icon{width:1em;height:1em;font-size:inherit;vertical-align:baseline}.mat-form-field-hint-wrapper{display:flex}.mat-form-field-hint-spacer{flex:1 0 1em}.mat-error{display:block}",".mat-input-element{font:inherit;background:0 0;color:currentColor;border:none;outline:0;padding:0;margin:0;width:100%;max-width:100%;vertical-align:bottom}.mat-input-element:-moz-ui-invalid{box-shadow:none}.mat-input-element::-ms-clear,.mat-input-element::-ms-reveal{display:none}.mat-input-element[type=date]::after,.mat-input-element[type=datetime-local]::after,.mat-input-element[type=datetime]::after,.mat-input-element[type=month]::after,.mat-input-element[type=time]::after,.mat-input-element[type=week]::after{content:' ';white-space:pre;width:1px}.mat-input-element::placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-input-element::-moz-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-input-element::-webkit-input-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-input-element:-ms-input-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-input-element::placeholder{color:transparent!important;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-moz-placeholder{color:transparent!important;transition:none}.mat-form-field-hide-placeholder .mat-input-element::-webkit-input-placeholder{color:transparent!important;transition:none}.mat-form-field-hide-placeholder .mat-input-element:-ms-input-placeholder{color:transparent!important;transition:none}textarea.mat-input-element{resize:vertical;overflow:auto}textarea.mat-autosize{resize:none}"],data:{animation:[{type:7,name:"transitionMessages",definitions:[{type:0,name:"enter",styles:{type:6,styles:{opacity:1,transform:"translateY(0%)"},offset:null},options:void 0},{type:1,expr:"void => enter",animation:[{type:6,styles:{opacity:0,transform:"translateY(-100%)"},offset:null},{type:4,styles:null,timings:"300ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}}),af=al["\u0275crt"]({encapsulation:0,styles:[[".container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;padding:0;margin:0}.master[_ngcontent-%COMP%]{width:60%}.detail[_ngcontent-%COMP%]{width:40%}.dataverses-card[_ngcontent-%COMP%]{margin:0 auto;margin-top:16px;min-height:450px;max-height:450px;width:95%}.dataverses-card[_ngcontent-%COMP%], .dataverses-details-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;overflow:hidden}.dataverses-details-card[_ngcontent-%COMP%]{margin:0 auto;margin:16px;min-height:716px;max-height:716px}.icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.dataverses-selector[_ngcontent-%COMP%]{min-height:42px;max-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.dataverses-content[_ngcontent-%COMP%]{position:relative;top:0;left:0;margin:0;padding:0;overflow:auto}.dataverses-table[_ngcontent-%COMP%]{margin:8px!important;height:330px;overflow:auto}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.example-header[_ngcontent-%COMP%]{min-height:64px;padding-left:24px}.mat-table[_ngcontent-%COMP%]{overflow:auto}.customWidthClass[_ngcontent-%COMP%]{-webkit-box-flex:0;-ms-flex:0 0 75px;flex:0 0 75px}.mat-cell.mat-column-DataverseName[_ngcontent-%COMP%], .mat-column-DataverseName[_ngcontent-%COMP%], .mat-header-cell.mat-column-DataverseName[_ngcontent-%COMP%]{text-align:left}.header-name-cell[_ngcontent-%COMP%]{-ms-flex:0 0 150px;flex:0 0 150px}.header-dataformat-cell[_ngcontent-%COMP%], .header-name-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;text-transform:uppercase}.header-dataformat-cell[_ngcontent-%COMP%]{-ms-flex:0 0 400px;flex:0 0 400px}.header-timestamp-cell[_ngcontent-%COMP%]{-ms-flex:0 0 250px;flex:0 0 250px;text-transform:uppercase}.dataverse-name-cell[_ngcontent-%COMP%], .header-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0}.dataverse-name-cell[_ngcontent-%COMP%]{-ms-flex:0 0 150px;flex:0 0 150px}.dataverse-dataformat-cell[_ngcontent-%COMP%]{-ms-flex:0 0 400px;flex:0 0 400px}.dataverse-dataformat-cell[_ngcontent-%COMP%], .dataverse-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0}.dataverse-timestamp-cell[_ngcontent-%COMP%]{-ms-flex:0 0 250px;flex:0 0 250px}.example-header[_ngcontent-%COMP%]{min-height:56px;max-height:56px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 24px 0;font-size:20px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid transparent}.mat-form-field[_ngcontent-%COMP%]{font-size:14px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-top:8px}.example-no-results[_ngcontent-%COMP%]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;font-size:12px;font-style:italic}.actions[_ngcontent-%COMP%], .example-no-results[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:8px;margin:0}.error-message[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding-top:10px;padding-left:20px;text-overflow:ellipsis}.highlight[_ngcontent-%COMP%]{background:#42a948}.output[_ngcontent-%COMP%]{padding-left:16px}"]],data:{}}),sf=al["\u0275crt"]({encapsulation:0,styles:[[".dataverse-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),uf=al["\u0275ccf"]("dataverse-create-dialog",nf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"dataverse-create-dialog",[],null,null,null,Je,sf)),al["\u0275did"](1,49152,null,0,nf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),cf=al["\u0275crt"]({encapsulation:0,styles:[[".dataverse-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),df=al["\u0275ccf"]("dataverse-drop-dialog",rf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"dataverse-drop-dialog",[],null,null,null,et,cf)),al["\u0275did"](1,49152,null,0,rf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),pf=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),ff=function(){function e(e,t){var n=this;this.store=e,this.dialog=t,this.displayedColumns="['CompactionPolicy', 'DatasetId', 'DatasetName', 'DatasetType', 'DatatypeDataverseName', 'DatatypeName', 'DataverseName', 'GroupName', 'PendingOp', 'Timestamp']",this.errorMessage="",this.dsName="",this.loaded$=this.store.select("dataset"),this.store.select(function(e){return e.dataset.createDatasetName}).subscribe(function(e){n.dsName=e}),this.store.select(function(e){return e.dataset.dropDatasetName}).subscribe(function(e){n.dsName=e}),this.store.select(function(e){return e.dataset.createDatasetSuccess}).subscribe(function(e){!0===e&&(n.getDatasets(),n.errorMessage="SUCCEED: CREATE DATASET "+n.dsName)}),this.store.select(function(e){return e.dataset.createDatasetError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)}),this.store.select(function(e){return e.dataset.dropDatasetSuccess}).subscribe(function(e){!0===e&&(n.getDatasets(),n.errorMessage="SUCCEED: DROP DATASET "+n.dsName)}),this.store.select(function(e){return e.dataset.dropDatasetError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)})}return e.prototype.getDatasets=function(){this.store.dispatch(new sp("-"))},e.prototype.ngOnInit=function(){this.dataSource=new gf(this.store)},e.prototype.openCreateDatasetDialog=function(){var e=this;this.dialog.open(hf,{width:"420px",data:{name:this.datasetName}}).afterClosed().subscribe(function(t){e.datasetName=t})},e.prototype.openDropDatasetDialog=function(){var e=this;this.dialog.open(mf,{width:"420px",data:{name:this.datasetName}}).afterClosed().subscribe(function(t){e.datasetName=t})},e.prototype.onClick=function(){this.errorMessage=""},e.prototype.highlight=function(e){this.output=JSON.stringify(e,null,2)},e.prototype.cleanUp=function(){this.errorMessage="",this.inputQuery.cleanUp()},e}(),hf=function(){function e(e,t,n){this.store=e,this.dialogCreateDsRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new dp(this.data.datasetName)),this.dialogCreateDsRef.close()},e.prototype.onNoClick=function(){this.dialogCreateDsRef.close()},e}(),mf=function(){function e(e,t,n){this.store=e,this.dialogDropDsRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new hp(this.data.datasetName)),this.dialogDropDsRef.close()},e.prototype.onNoClick=function(){this.dialogDropDsRef.close()},e}(),gf=function(e){function t(t){var n=e.call(this)||this;return n.store=t,n.datasets$=n.store.select(function(e){return e.dataset.datasets.results}),n}return pf(t,e),t.prototype.connect=function(){return this.datasets$},t.prototype.disconnect=function(){},t}(Lc),yf=al["\u0275crt"]({encapsulation:0,styles:[[".container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;padding:0;margin:0}.master[_ngcontent-%COMP%]{width:60%;overflow:hidden}.detail[_ngcontent-%COMP%]{width:40%;overflow:hidden}.datasets-card[_ngcontent-%COMP%]{margin:0 auto;margin-top:16px;min-height:450px;max-height:450px;width:95%}.datasets-card[_ngcontent-%COMP%], .datasets-details-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;overflow:hidden}.datasets-details-card[_ngcontent-%COMP%]{margin:0 auto;margin:16px;min-height:716px;max-height:716px}.icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.datasets-selector[_ngcontent-%COMP%]{min-height:42px;max-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.datasets-content[_ngcontent-%COMP%]{position:relative;top:0;left:0;margin:0;padding:0;overflow:auto}.datasets-table[_ngcontent-%COMP%]{margin:8px!important;height:330px;overflow:auto}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.example-header[_ngcontent-%COMP%]{min-height:64px;padding-left:24px}.mat-table[_ngcontent-%COMP%]{overflow:auto}.customWidthClass[_ngcontent-%COMP%]{-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.mat-cell.mat-column-DataverseName[_ngcontent-%COMP%], .mat-column-DataverseName[_ngcontent-%COMP%], .mat-header-cell.mat-column-DataverseName[_ngcontent-%COMP%]{text-align:left}.header-compactionpolicy-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-compactionpolicy-cell[_ngcontent-%COMP%], .header-compactionpolicy-cell[_ngcontent-%COMP%], .header-datasetid-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-datasetid-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-datasetid-cell[_ngcontent-%COMP%], .header-datasetname-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-datasetname-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-datasetname-cell[_ngcontent-%COMP%]{letter-spacing:1px}.dataset-datasetname-cell[_ngcontent-%COMP%], .header-datasettype-cell[_ngcontent-%COMP%]{border:none;font-size:12px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-datasettype-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-datasettype-cell[_ngcontent-%COMP%]{border:none;font-size:12px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-datatypedataversename-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-datatypedataversename-cell[_ngcontent-%COMP%], .header-datatypedataversename-cell[_ngcontent-%COMP%], .header-datatypename-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-datatypename-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-datatypename-cell[_ngcontent-%COMP%], .header-dataversename-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-dataversename-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-dataversename-cell[_ngcontent-%COMP%], .header-groupname-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-groupname-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-groupname-cell[_ngcontent-%COMP%], .header-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-timestamp-cell[_ngcontent-%COMP%]{text-transform:uppercase}.dataset-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.example-header[_ngcontent-%COMP%]{min-height:56px;max-height:56px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 24px 0;font-size:20px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid transparent}.mat-form-field[_ngcontent-%COMP%]{font-size:14px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-top:8px}.example-no-results[_ngcontent-%COMP%]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;font-size:12px;font-style:italic}.actions[_ngcontent-%COMP%], .example-no-results[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:8px;margin:0}.error-message[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding-top:10px;padding-left:20px;text-overflow:ellipsis}.output[_ngcontent-%COMP%]{padding-left:16px}"]],data:{}}),vf=al["\u0275crt"]({encapsulation:0,styles:[[".dataset-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),bf=al["\u0275ccf"]("dataset-create-dialog",hf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"dataset-create-dialog",[],null,null,null,St,vf)),al["\u0275did"](1,49152,null,0,hf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),_f=al["\u0275crt"]({encapsulation:0,styles:[[".dataset-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),wf=al["\u0275ccf"]("dataset-drop-dialog",mf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"dataset-drop-dialog",[],null,null,null,Ot,_f)),al["\u0275did"](1,49152,null,0,mf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),xf=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Cf=function(){function e(e,t){var n=this;this.store=e,this.dialog=t,this.displayedColumns="['datatypeName', 'dataverseName', 'timeStamp']",this.selection=new Fc(!0,[]),this.errorMessage="",this.dtName="",this.loaded$=this.store.select("datatype"),this.store.select(function(e){return e.datatype.createDatatypeName}).subscribe(function(e){n.dtName=e}),this.store.select(function(e){return e.datatype.dropDatatypeName}).subscribe(function(e){n.dtName=e}),this.store.select(function(e){return e.datatype.createDatatypeSuccess}).subscribe(function(e){!0===e&&(n.getDatatypes(),n.errorMessage="SUCCEED: CREATE DATATYPE "+n.dtName)}),this.store.select(function(e){return e.datatype.createDatatypeError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)}),this.store.select(function(e){return e.datatype.dropDatatypeSuccess}).subscribe(function(e){!0===e&&(n.getDatatypes(),n.errorMessage="SUCCEED: DROP DATATYPE "+n.dtName)}),this.store.select(function(e){return e.datatype.dropDatatypeError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)})}return e.prototype.getDatatypes=function(){this.store.dispatch(new Sp("-"))},e.prototype.ngOnInit=function(){this.dataSource=new Of(this.store)},e.prototype.openCreateDatatypeDialog=function(){var e=this;this.dialog.open(Ef,{width:"420px",data:{name:this.datatypeName}}).afterClosed().subscribe(function(t){e.datatypeName=t})},e.prototype.openDropDatatypeDialog=function(){var e=this;this.dialog.open(Sf,{width:"420px",data:{name:this.datatypeName}}).afterClosed().subscribe(function(t){e.datatypeName=t})},e.prototype.onClick=function(){this.errorMessage=""},e.prototype.highlight=function(e){this.output=JSON.stringify(e,null,2)},e.prototype.cleanUp=function(){this.errorMessage="",this.inputQuery.cleanUp()},e}(),Ef=function(){function e(e,t,n){this.store=e,this.dialogCreateDtRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new kp(this.data.datasetName)),this.dialogCreateDtRef.close()},e.prototype.onNoClick=function(){this.dialogCreateDtRef.close()},e}(),Sf=function(){function e(e,t,n){this.store=e,this.dialogDropDtRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new Rp(this.data.datatypeName)),this.dialogDropDtRef.close()},e.prototype.onNoClick=function(){this.dialogDropDtRef.close()},e}(),Of=function(e){function t(t){var n=e.call(this)||this;return n.store=t,n.datatypes$=n.store.select(function(e){return e.datatype.datatypes.results}),n}return xf(t,e),t.prototype.connect=function(){return this.datatypes$},t.prototype.disconnect=function(){},t}(Lc),Tf=al["\u0275crt"]({encapsulation:0,styles:[[".container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;padding:0;margin:0}.master[_ngcontent-%COMP%]{width:60%;overflow:hidden}.detail[_ngcontent-%COMP%]{width:40%;overflow:hidden}.datatypes-card[_ngcontent-%COMP%]{margin:0 auto;margin-top:16px;min-height:450px;max-height:450px;width:95%}.datatypes-card[_ngcontent-%COMP%], .datatypes-details-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;overflow:hidden}.datatypes-details-card[_ngcontent-%COMP%]{margin:0 auto;margin:16px;min-height:716px;max-height:716px}.icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.datatypes-selector[_ngcontent-%COMP%]{min-height:42px;max-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.datatypes-content[_ngcontent-%COMP%]{position:relative;top:0;left:0;margin:0;padding:0;overflow:auto}.datatypes-table[_ngcontent-%COMP%]{margin:8px!important;height:330px;overflow:auto}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.datatypes-toolbar[_ngcontent-%COMP%]{display:block;min-height:56px;height:56px;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;letter-spacing:1px;font-weight:400;background:rgba(0,0,1,.8)}.example-header[_ngcontent-%COMP%]{min-height:64px;padding-left:24px}.mat-table[_ngcontent-%COMP%]{overflow:auto}.customWidthClass[_ngcontent-%COMP%]{-webkit-box-flex:0;-ms-flex:0 0 75px;flex:0 0 75px}.mat-cell.mat-column-DataverseName[_ngcontent-%COMP%], .mat-column-DataverseName[_ngcontent-%COMP%], .mat-header-cell.mat-column-DataverseName[_ngcontent-%COMP%]{text-align:left}.header-datatypename-cell[_ngcontent-%COMP%]{text-transform:uppercase}.datatypes-datatypename-cell[_ngcontent-%COMP%], .header-datatypename-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 400px;flex:0 0 400px}.header-dataversename-cell[_ngcontent-%COMP%]{text-align:center;color:rgba(0,0,0,.87);text-transform:uppercase}.datatypes-dataversename-cell[_ngcontent-%COMP%], .header-dataversename-cell[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.header-timestamp-cell[_ngcontent-%COMP%]{text-transform:uppercase}.datatypes-timestamp-cell[_ngcontent-%COMP%], .header-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:center;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.example-header[_ngcontent-%COMP%]{min-height:56px;max-height:56px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 24px 0;font-size:20px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid transparent}.mat-form-field[_ngcontent-%COMP%]{font-size:14px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-top:8px}.example-no-results[_ngcontent-%COMP%]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;font-size:12px;font-style:italic}.actions[_ngcontent-%COMP%], .example-no-results[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:8px;margin:0}.error-message[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding-top:10px;padding-left:20px;text-overflow:ellipsis}.output[_ngcontent-%COMP%]{padding-left:16px}"]],data:{}}),kf=al["\u0275crt"]({encapsulation:0,styles:[[".datatype-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),Df=al["\u0275ccf"]("datatype-create-dialog",Ef,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"datatype-create-dialog",[],null,null,null,Ft,kf)),al["\u0275did"](1,49152,null,0,Ef,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),If=al["\u0275crt"]({encapsulation:0,styles:[[".datatype-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),Rf=al["\u0275ccf"]("datatypes-drop-dialog",Sf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"datatypes-drop-dialog",[],null,null,null,jt,If)),al["\u0275did"](1,49152,null,0,Sf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),Mf=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Pf=function(){function e(e,t){var n=this;this.store=e,this.dialog=t,this.displayedColumns="['dataverseName', 'datasetName', 'indexName', 'indexStructure', 'isPrimary', 'timestamp', 'pendingOp']",this.errorMessage="",this.idxName="",this.loaded$=this.store.select("index"),this.store.select(function(e){return e.index.createIndexName}).subscribe(function(e){n.idxName=e}),this.store.select(function(e){return e.index.dropIndexName}).subscribe(function(e){n.idxName=e}),this.store.select(function(e){return e.index.createIndexSuccess}).subscribe(function(e){!0===e&&(n.getIndexes(),n.errorMessage="SUCCEED: CREATE INDEX "+n.idxName)}),this.store.select(function(e){return e.index.createIndexError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)}),this.store.select(function(e){return e.index.dropIndexSuccess}).subscribe(function(e){!0===e&&(n.getIndexes(),n.errorMessage="SUCCEED: DROP INDEX "+n.idxName)}),this.store.select(function(e){return e.index.dropIndexError}).subscribe(function(e){e.errors&&(n.errorMessage="ERROR: "+e.errors[0].msg)})}return e.prototype.getIndexes=function(){this.store.dispatch(new Bp("-"))},e.prototype.ngOnInit=function(){this.dataSource=new Lf(this.store)},e.prototype.openCreateIndexDialog=function(){var e=this;this.dialog.open(Nf,{width:"420px",data:{name:this.indexName}}).afterClosed().subscribe(function(t){e.indexName=t})},e.prototype.openDropIndexDialog=function(){var e=this;this.dialog.open(Af,{width:"420px",data:{name:this.indexName}}).afterClosed().subscribe(function(t){e.indexName=t})},e.prototype.onClick=function(){this.errorMessage=""},e.prototype.highlight=function(e){this.output=JSON.stringify(e,null,2)},e.prototype.cleanUp=function(){this.errorMessage="",this.inputQuery.cleanUp()},e}(),Nf=function(){function e(e,t,n){this.store=e,this.dialogCreateIdxRef=t,this.data=n}return e.prototype.onClick=function(){this.store.dispatch(new qp(this.data.indexName)),this.dialogCreateIdxRef.close()},e.prototype.onNoClick=function(){this.dialogCreateIdxRef.close()},e}(),Af=function(){function e(e,t,n){this.store=e,this.dialogDropIdxRef=t,this.data=n}return e.prototype.onClick=function(){console.log(this.data.indexName),this.store.dispatch(new Kp(this.data.indexName)),this.dialogDropIdxRef.close()},e.prototype.onNoClick=function(){this.dialogDropIdxRef.close()},e}(),Lf=function(e){function t(t){var n=e.call(this)||this;return n.store=t,n.indexes$=n.store.select(function(e){return e.index.indexes.results}),n}return Mf(t,e),t.prototype.connect=function(){return this.indexes$},t.prototype.disconnect=function(){},t}(Lc),Ff=al["\u0275crt"]({encapsulation:0,styles:[[".container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;padding:0;margin:0}.master[_ngcontent-%COMP%]{width:60%}.detail[_ngcontent-%COMP%]{width:40%}.indexes-card[_ngcontent-%COMP%]{margin:0 auto;margin-top:16px;min-height:450px;max-height:450px;width:95%}.indexes-card[_ngcontent-%COMP%], .indexes-details-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;overflow:hidden}.indexes-details-card[_ngcontent-%COMP%]{margin:0 auto;margin:16px;min-height:716px;max-height:716px}.icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.indexes-selector[_ngcontent-%COMP%]{min-height:42px;max-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.indexes-content[_ngcontent-%COMP%]{position:relative;top:0;left:0;margin:0;padding:0;overflow:auto}.indexes-table[_ngcontent-%COMP%]{margin:8px!important;height:330px;overflow:auto}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.example-header[_ngcontent-%COMP%]{min-height:64px;padding-left:24px}.mat-table[_ngcontent-%COMP%]{overflow:auto}.customWidthClass[_ngcontent-%COMP%]{-webkit-box-flex:0;-ms-flex:0 0 75px;flex:0 0 75px}.mat-cell.mat-column-DataverseName[_ngcontent-%COMP%], .mat-column-DataverseName[_ngcontent-%COMP%], .mat-header-cell.mat-column-DataverseName[_ngcontent-%COMP%]{text-align:left}.header-dataversename-cell[_ngcontent-%COMP%]{text-transform:uppercase}.header-datasetname-cell[_ngcontent-%COMP%], .header-dataversename-cell[_ngcontent-%COMP%], .indexes-dataversename-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 150px;flex:0 0 150px}.header-datasetname-cell[_ngcontent-%COMP%]{text-transform:uppercase}.header-indexname-cell[_ngcontent-%COMP%], .indexes-datasetname-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 150px;flex:0 0 150px}.header-indexname-cell[_ngcontent-%COMP%]{text-transform:uppercase}.indexes-indexname-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 150px;flex:0 0 150px}.header-indexestructure-cell[_ngcontent-%COMP%]{text-transform:uppercase}.header-indexestructure-cell[_ngcontent-%COMP%], .header-isprimary-cell[_ngcontent-%COMP%], .indexes-indexstructure-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:center;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 150px;flex:0 0 150px}.header-isprimary-cell[_ngcontent-%COMP%]{text-transform:uppercase}.indexes-isprimary-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:center;color:rgba(0,0,0,.87);-webkit-box-flex:0}.header-timestamp-cell[_ngcontent-%COMP%], .indexes-isprimary-cell[_ngcontent-%COMP%], .indexes-timestamp-cell[_ngcontent-%COMP%]{-ms-flex:0 0 150px;flex:0 0 150px}.header-groupname-cell[_ngcontent-%COMP%]{text-transform:uppercase}.header-groupname-cell[_ngcontent-%COMP%], .indexes-groupname-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 150px;flex:0 0 150px}.header-timestamp-cell[_ngcontent-%COMP%]{text-transform:uppercase}.header-timestamp-cell[_ngcontent-%COMP%], .indexes-timestamp-cell[_ngcontent-%COMP%]{border:none;font-size:12px;letter-spacing:1px;line-height:24px;font-weight:400;margin:0;padding:0 16px;text-align:left;color:rgba(0,0,0,.87);-webkit-box-flex:0;-ms-flex:0 0 250px;flex:0 0 250px}.example-header[_ngcontent-%COMP%]{min-height:56px;max-height:56px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 24px 0;font-size:20px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;border-bottom:1px solid transparent}.mat-form-field[_ngcontent-%COMP%]{font-size:14px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-top:8px}.example-no-results[_ngcontent-%COMP%]{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;font-size:12px;font-style:italic}.actions[_ngcontent-%COMP%], .example-no-results[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:8px;margin:0}.error-message[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding-top:10px;padding-left:20px;text-overflow:ellipsis}.output[_ngcontent-%COMP%]{padding-left:16px}"]],data:{}}),jf=al["\u0275crt"]({encapsulation:0,styles:[[".index-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),Vf=al["\u0275ccf"]("index-create-dialog",Nf,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"index-create-dialog",[],null,null,null,rn,jf)),al["\u0275did"](1,49152,null,0,Nf,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),zf=al["\u0275crt"]({encapsulation:0,styles:[[".index-dialog[_ngcontent-%COMP%]{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}"]],data:{}}),Bf=al["\u0275ccf"]("index-drop-dialog",Af,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"index-drop-dialog",[],null,null,null,on,zf)),al["\u0275did"](1,49152,null,0,Af,[Yp.m,Ns,As],null,null)],null,null)},{},{},[]),Hf=function(){},Wf=al["\u0275crt"]({encapsulation:0,styles:[[".awc-navbar[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);overflow:hidden}.awc-navbar[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{text-decoration:none}.awc-navbar-header[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:8px 16px}.awc-navbar-header[_ngcontent-%COMP%] > .mat-button[_ngcontent-%COMP%]:last-child{margin-left:auto}.flex-spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.awc-asterixDB-logo[_ngcontent-%COMP%]{height:26px;margin:0 4px 3px 0;vertical-align:middle}.awc-github-logo[_ngcontent-%COMP%]{height:21px;margin:0 7px 2px 0;vertical-align:middle}.awc-navbar-link[_ngcontent-%COMP%]{text-decoration:inherit;-webkit-box-flex:1;-ms-flex:1;flex:1}"]],data:{}}),qf=function(){function e(){}return e.prototype.create=function(e){return"undefined"==typeof MutationObserver?null:new MutationObserver(e)},e}(),Uf=function(){function e(e,t,n){this._mutationObserverFactory=e,this._elementRef=t,this._ngZone=n,this.event=new al.EventEmitter,this._debouncer=new ml.Subject}return e.prototype.ngAfterContentInit=function(){var e=this;this.debounce>0?this._ngZone.runOutsideAngular(function(){e._debouncer.pipe(_(e.debounce)).subscribe(function(t){return e.event.emit(t)})}):this._debouncer.subscribe(function(t){return e.event.emit(t)}),this._observer=this._ngZone.runOutsideAngular(function(){return e._mutationObserverFactory.create(function(t){e._debouncer.next(t)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},e.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},e}(),Gf=function(){},Kf=function(){function e(e,t){this._elementRef=e,this._ngZone=t}return e.prototype.alignToElement=function(e){var t=this;this.show(),"undefined"!=typeof requestAnimationFrame?this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){return t._setStyles(e)})}):this._setStyles(e)},e.prototype.show=function(){this._elementRef.nativeElement.style.visibility="visible"},e.prototype.hide=function(){this._elementRef.nativeElement.style.visibility="hidden"},e.prototype._setStyles=function(e){var t=this._elementRef.nativeElement;t.style.left=e?(e.offsetLeft||0)+"px":"0",t.style.width=e?(e.offsetWidth||0)+"px":"0"},e}(),$f=function(e){function t(t){var n=e.call(this)||this;return n._viewContainerRef=t,n.textLabel="",n._contentPortal=null,n._labelChange=new ml.Subject,n._disableChange=new ml.Subject,n.position=null,n.origin=null,n.isActive=!1,n}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"content",{get:function(){return this._contentPortal},enumerable:!0,configurable:!0}),t.prototype.ngOnChanges=function(e){e.hasOwnProperty("textLabel")&&this._labelChange.next(),e.hasOwnProperty("disabled")&&this._disableChange.next()},t.prototype.ngOnDestroy=function(){this._disableChange.complete(),this._labelChange.complete()},t.prototype.ngOnInit=function(){this._contentPortal=new Ul(this._content,this._viewContainerRef)},t}(D(function(){})),Zf=function(e){function t(t,n,r){var i=e.call(this,t,n)||this;return i._host=r,i}return Object(bl.__extends)(t,e),t.prototype.ngOnInit=function(){var e=this;this._host._isCenterPosition(this._host._position)&&this.attach(this._host._content),this._centeringSub=this._host._beforeCentering.subscribe(function(t){t&&(e.hasAttached()||e.attach(e._host._content))}),this._leavingSub=this._host._afterLeavingCenter.subscribe(function(){e.detach()})},t.prototype.ngOnDestroy=function(){this._centeringSub&&!this._centeringSub.closed&&this._centeringSub.unsubscribe(),this._leavingSub&&!this._leavingSub.closed&&this._leavingSub.unsubscribe()},t}($l),Qf=function(){function e(e,t){this._elementRef=e,this._dir=t,this._onCentering=new al.EventEmitter,this._beforeCentering=new al.EventEmitter,this._afterLeavingCenter=new al.EventEmitter,this._onCentered=new al.EventEmitter(!0)}return Object.defineProperty(e.prototype,"position",{set:function(e){this._position=e<0?"ltr"==this._getLayoutDirection()?"left":"right":e>0?"ltr"==this._getLayoutDirection()?"right":"left":"center"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"origin",{set:function(e){if(null!=e){var t=this._getLayoutDirection();this._origin="ltr"==t&&e<=0||"rtl"==t&&e>0?"left":"right"}},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){"center"==this._position&&this._origin&&(this._position="left"==this._origin?"left-origin-center":"right-origin-center")},e.prototype._onTranslateTabStarted=function(e){var t=this._isCenterPosition(e.toState);this._beforeCentering.emit(t),t&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)},e.prototype._onTranslateTabComplete=function(e){this._isCenterPosition(e.toState)&&this._isCenterPosition(this._position)&&this._onCentered.emit(),this._isCenterPosition(e.fromState)&&!this._isCenterPosition(this._position)&&this._afterLeavingCenter.emit()},e.prototype._getLayoutDirection=function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},e.prototype._isCenterPosition=function(e){return"center"==e||"left-origin-center"==e||"right-origin-center"==e},e}(),Yf=0,Xf=function(e){function t(t,n){var r=e.call(this,t)||this;return r._changeDetectorRef=n,r._indexToSelect=0,r._tabBodyWrapperHeight=0,r._tabsSubscription=Cl.a.EMPTY,r._tabLabelSubscription=Cl.a.EMPTY,r._dynamicHeight=!1,r._selectedIndex=null,r.headerPosition="above",r.selectedIndexChange=new al.EventEmitter,r.focusChange=new al.EventEmitter,r.selectedTabChange=new al.EventEmitter(!0),r.selectChange=r.selectedTabChange,r._groupId=Yf++,r}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"dynamicHeight",{get:function(){return this._dynamicHeight},set:function(e){this._dynamicHeight=c(e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_dynamicHeightDeprecated",{get:function(){return this._dynamicHeight},set:function(e){this._dynamicHeight=e},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selectedIndex",{get:function(){return this._selectedIndex},set:function(e){this._indexToSelect=d(e,null)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"backgroundColor",{get:function(){return this._backgroundColor},set:function(e){var t=this._elementRef.nativeElement;t.classList.remove("mat-background-"+this.backgroundColor),e&&t.classList.add("mat-background-"+e),this._backgroundColor=e},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentChecked=function(){var e=this,t=this._indexToSelect=Math.min(this._tabs.length-1,Math.max(this._indexToSelect||0,0));if(this._selectedIndex!=t&&null!=this._selectedIndex){var n=this._createChangeEvent(t);this.selectedTabChange.emit(n),Promise.resolve().then(function(){return e.selectedIndexChange.emit(t)})}this._tabs.forEach(function(n,r){n.position=r-t,n.isActive=r===t,null==e._selectedIndex||0!=n.position||n.origin||(n.origin=t-e._selectedIndex)}),this._selectedIndex!==t&&(this._selectedIndex=t,this._changeDetectorRef.markForCheck())},t.prototype.ngAfterContentInit=function(){var e=this;this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(function(){e._subscribeToTabLabels(),e._changeDetectorRef.markForCheck()})},t.prototype.ngOnDestroy=function(){this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe()},t.prototype._focusChanged=function(e){this.focusChange.emit(this._createChangeEvent(e))},t.prototype._createChangeEvent=function(e){var t=new function(){};return t.index=e,this._tabs&&this._tabs.length&&(t.tab=this._tabs.toArray()[e]),t},t.prototype._subscribeToTabLabels=function(){var e=this;this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Ll.a.apply(void 0,this._tabs.map(function(e){return e._disableChange}).concat(this._tabs.map(function(e){return e._labelChange}))).subscribe(function(){e._changeDetectorRef.markForCheck()})},t.prototype._getTabLabelId=function(e){return"mat-tab-label-"+this._groupId+"-"+e},t.prototype._getTabContentId=function(e){return"mat-tab-content-"+this._groupId+"-"+e},t.prototype._setTabBodyWrapperHeight=function(e){if(this._dynamicHeight&&this._tabBodyWrapperHeight){var t=this._tabBodyWrapper.nativeElement;t.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(t.style.height=e+"px")}},t.prototype._removeTabBodyWrapperHeight=function(){this._tabBodyWrapperHeight=this._tabBodyWrapper.nativeElement.clientHeight,this._tabBodyWrapper.nativeElement.style.height=""},t.prototype._handleClick=function(e,t,n){e.disabled||(this.selectedIndex=t.focusIndex=n)},t.prototype._getTabIndex=function(e,t){return e.disabled?null:this.selectedIndex===t?0:-1},t}(I(R(function(e){this._elementRef=e}),"primary")),Jf=function(e){function t(t){var n=e.call(this)||this;return n.elementRef=t,n}return Object(bl.__extends)(t,e),t.prototype.focus=function(){this.elementRef.nativeElement.focus()},t.prototype.getOffsetLeft=function(){return this.elementRef.nativeElement.offsetLeft},t.prototype.getOffsetWidth=function(){return this.elementRef.nativeElement.offsetWidth},t}(D(function(){})),eh=function(e){function t(t,n,r,i){var o=e.call(this)||this;return o._elementRef=t,o._changeDetectorRef=n,o._viewportRuler=r,o._dir=i,o._focusIndex=0,o._scrollDistance=0,o._selectedIndexChanged=!1,o._realignInkBar=Cl.a.EMPTY,o._showPaginationControls=!1,o._disableScrollAfter=!0,o._disableScrollBefore=!0,o._selectedIndex=0,o.selectFocusedIndex=new al.EventEmitter,o.indexFocused=new al.EventEmitter,o}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"selectedIndex",{get:function(){return this._selectedIndex},set:function(e){e=d(e),this._selectedIndexChanged=this._selectedIndex!=e,this._selectedIndex=e,this._focusIndex=e},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentChecked=function(){this._tabLabelCount!=this._labelWrappers.length&&(this._updatePagination(),this._tabLabelCount=this._labelWrappers.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())},t.prototype._handleKeydown=function(e){switch(e.keyCode){case 39:this._focusNextTab();break;case 37:this._focusPreviousTab();break;case 13:case 32:this.selectFocusedIndex.emit(this.focusIndex),e.preventDefault()}},t.prototype.ngAfterContentInit=function(){var e=this,t=this._dir?this._dir.change:vl(null),n=this._viewportRuler.change(150),r=function(){e._updatePagination(),e._alignInkBarToSelectedTab()};"undefined"!=typeof requestAnimationFrame?requestAnimationFrame(r):r(),this._realignInkBar=Object(Ll.a)(t,n).subscribe(r)},t.prototype.ngOnDestroy=function(){this._realignInkBar.unsubscribe()},t.prototype._onContentChanges=function(){this._updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()},t.prototype._updatePagination=function(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()},Object.defineProperty(t.prototype,"focusIndex",{get:function(){return this._focusIndex},set:function(e){this._isValidIndex(e)&&this._focusIndex!=e&&(this._focusIndex=e,this.indexFocused.emit(e),this._setTabFocus(e))},enumerable:!0,configurable:!0}),t.prototype._isValidIndex=function(e){if(!this._labelWrappers)return!0;var t=this._labelWrappers?this._labelWrappers.toArray()[e]:null;return!!t&&!t.disabled},t.prototype._setTabFocus=function(e){if(this._showPaginationControls&&this._scrollToLabel(e),this._labelWrappers&&this._labelWrappers.length){this._labelWrappers.toArray()[e].focus();var t=this._tabListContainer.nativeElement,n=this._getLayoutDirection();t.scrollLeft="ltr"==n?0:t.scrollWidth-t.offsetWidth}},t.prototype._moveFocus=function(e){if(this._labelWrappers)for(var t=this._labelWrappers.toArray(),n=this.focusIndex+e;n<t.length&&n>=0;n+=e)if(this._isValidIndex(n))return void(this.focusIndex=n)},t.prototype._focusNextTab=function(){this._moveFocus("ltr"==this._getLayoutDirection()?1:-1)},t.prototype._focusPreviousTab=function(){this._moveFocus("ltr"==this._getLayoutDirection()?-1:1)},t.prototype._getLayoutDirection=function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},t.prototype._updateTabScrollPosition=function(){var e=this.scrollDistance,t="ltr"===this._getLayoutDirection()?-e:e;this._tabList.nativeElement.style.transform="translate3d("+t+"px, 0, 0)"},Object.defineProperty(t.prototype,"scrollDistance",{get:function(){return this._scrollDistance},set:function(e){this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),e)),this._scrollDistanceChanged=!0,this._checkScrollingControls()},enumerable:!0,configurable:!0}),t.prototype._scrollHeader=function(e){this.scrollDistance+=("before"==e?-1:1)*this._tabListContainer.nativeElement.offsetWidth/3},t.prototype._scrollToLabel=function(e){var t=this._labelWrappers?this._labelWrappers.toArray()[e]:null;if(t){var n,r,i=this._tabListContainer.nativeElement.offsetWidth;"ltr"==this._getLayoutDirection()?r=(n=t.getOffsetLeft())+t.getOffsetWidth():n=(r=this._tabList.nativeElement.offsetWidth-t.getOffsetLeft())-t.getOffsetWidth();var o=this.scrollDistance,l=this.scrollDistance+i;n<o?this.scrollDistance-=o-n+60:r>l&&(this.scrollDistance+=r-l+60)}},t.prototype._checkPaginationEnabled=function(){var e=this._tabList.nativeElement.scrollWidth>this._elementRef.nativeElement.offsetWidth;e||(this.scrollDistance=0),e!==this._showPaginationControls&&this._changeDetectorRef.markForCheck(),this._showPaginationControls=e},t.prototype._checkScrollingControls=function(){this._disableScrollBefore=0==this.scrollDistance,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck()},t.prototype._getMaxScrollDistance=function(){return this._tabList.nativeElement.scrollWidth-this._tabListContainer.nativeElement.offsetWidth||0},t.prototype._alignInkBarToSelectedTab=function(){var e=this._labelWrappers&&this._labelWrappers.length?this._labelWrappers.toArray()[this.selectedIndex].elementRef.nativeElement:null;this._inkBar.alignToElement(e)},t}(R(function(){})),th=function(){},nh=al["\u0275crt"]({encapsulation:2,styles:[".mat-tab-group{display:flex;flex-direction:column}.mat-tab-group.mat-tab-group-inverted-header{flex-direction:column-reverse}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:0;opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}@media (max-width:600px){.mat-tab-label{padding:0 12px}}@media (max-width:960px){.mat-tab-label{padding:0 12px}}.mat-tab-group[mat-stretch-tabs] .mat-tab-label{flex-basis:0;flex-grow:1}.mat-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height .5s cubic-bezier(.35,0,.25,1)}.mat-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden}.mat-tab-body.mat-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-tab-group.mat-tab-group-dynamic-height .mat-tab-body.mat-tab-body-active{overflow-y:hidden}"],data:{}}),rh=al["\u0275crt"]({encapsulation:2,styles:[".mat-tab-body-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;height:100%;overflow:auto}.mat-tab-group-dynamic-height .mat-tab-body-content{overflow:hidden}"],data:{animation:[{type:7,name:"translateTab",definitions:[{type:0,name:"center, void, left-origin-center, right-origin-center",styles:{type:6,styles:{transform:"none"},offset:null},options:void 0},{type:0,name:"left",styles:{type:6,styles:{transform:"translate3d(-100%, 0, 0)"},offset:null},options:void 0},{type:0,name:"right",styles:{type:6,styles:{transform:"translate3d(100%, 0, 0)"},offset:null},options:void 0},{type:1,expr:"* => left, * => right, left => center, right => center",animation:{type:4,styles:null,timings:"500ms cubic-bezier(0.35, 0, 0.25, 1)"},options:null},{type:1,expr:"void => left-origin-center",animation:[{type:6,styles:{transform:"translate3d(-100%, 0, 0)"},offset:null},{type:4,styles:null,timings:"500ms cubic-bezier(0.35, 0, 0.25, 1)"}],options:null},{type:1,expr:"void => right-origin-center",animation:[{type:6,styles:{transform:"translate3d(100%, 0, 0)"},offset:null},{type:4,styles:null,timings:"500ms cubic-bezier(0.35, 0, 0.25, 1)"}],options:null}],options:{}}]}}),ih=al["\u0275crt"]({encapsulation:2,styles:[".mat-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-tab-label{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:inline-flex;justify-content:center;align-items:center;white-space:nowrap;position:relative}.mat-tab-label:focus{outline:0;opacity:1}.mat-tab-label.mat-tab-disabled{cursor:default}@media (max-width:600px){.mat-tab-label{min-width:72px}}.mat-ink-bar{position:absolute;bottom:0;height:2px;transition:.5s cubic-bezier(.35,0,.25,1)}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}.mat-tab-header-pagination{position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-tab-header-pagination-after,.mat-tab-header-rtl .mat-tab-header-pagination-before{padding-right:4px}.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;content:'';height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-list{flex-grow:1;position:relative;transition:transform .5s cubic-bezier(.35,0,.25,1)}.mat-tab-labels{display:flex}"],data:{}}),oh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),lh=n("QhpF"),ah=n("/zAi"),sh=n("H0Ur"),uh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),ch=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),dh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),ph=function(){function e(e,t){this.store=e,this.changeDetector=t,this.nodesAll=[],this.nodesDatasets=[],this.nodesDatatypes=[],this.nodesIndexes=[]}return e.prototype.ngOnInit=function(){var e=this;this.store.select(function(e){return e.metadata.tree}).subscribe(function(t){e.nodesAll=[],e.nodesDatasets=[],e.nodesDatatypes=[],e.nodesIndexes=[];var n=[],r=[],i=[],o={label:"",children:[]};o.label="DATAVERSES",o.children=[];for(var l=0;l<t.length;l++){var a={label:"",children:[]};if(a.label=t[l].DataverseName,o.children.push(a),t[l].Datasets.length){var s={label:"",children:[]};s.label="DATASETS",a.children.push(s);for(var u=0;u<t[l].Datasets.length;u++){var c={label:"",children:[]};if(c.label=t[l].Datasets[u].DatasetName,t[l].Datasets[u].Datatype){var d={label:"",children:[]};if(d.label="Datatype: "+t[l].Datasets[u].Datatype.DatatypeName,t[l].Datasets[u].Datatype.Derived&&t[l].Datasets[u].Datatype.Derived.Record){var p={label:"",leaf:!0,expanded:!0,children:[]};p.label="FIELDS";for(var f=0;f<t[l].Datasets[u].Datatype.Derived.Record.Fields.length;f++){var h={label:"",children:[]};h.label=t[l].Datasets[u].Datatype.Derived.Record.Fields[f].FieldName+": "+t[l].Datasets[u].Datatype.Derived.Record.Fields[f].FieldType,p.children.push(h)}d.children.push(p)}c.children.push(d),d.label=t[l].Datasets[u].Datatype.DatatypeName,r.push(d)}if(t[l].Datasets[u].Indexes.length){var m={label:"",children:[]};for(m.label="INDEXES",f=0;f<t[l].Datasets[u].Indexes.length;f++){var g={label:"",children:[]};g.label=t[l].Datasets[u].Indexes[f].IndexName;var y={label:"",children:[]};if(y.label="isPrimary: "+t[l].Datasets[u].Indexes[f].IsPrimary,g.children.push(y),t[l].Datasets[u].Indexes[f].SearchKey){var v={label:"",children:[]};v.label="SEARCH KEY";for(var b=0;b<t[l].Datasets[u].Indexes[f].SearchKey.length;b++){var _={label:"",children:[]};_.label=t[l].Datasets[u].Indexes[f].SearchKey[b],v.children.push(_)}g.children.push(v),n.push(g)}m.children.push(g)}c.children.push(m),s.children.push(c),i.push(c)}}}}e.nodesAll.push(o);var w={label:"",children:[]};w.label="DATASETS",w.children=i,e.nodesDatasets.push(w);var x={label:"",children:[]};x.label="DATATYPES",x.children=r,e.nodesDatatypes.push(x);var C={label:"",children:[]};C.label="INDEXES",C.children=n,e.nodesIndexes.push(C),e.changeDetector.detectChanges()})},e.prototype.nodeSelectAll=function(e){if(e.node.parent&&"DATASETS"===e.node.parent.label){var t=e.node.label.replace(/-;-/g);this.store.dispatch(new ap(t))}},e.prototype.nodeSelectDataset=function(e){if(e.node.parent&&"DATASETS"===e.node.parent.label){var t=e.node.label.replace(/-;-/g);this.store.dispatch(new ap(t))}},e}(),fh=al["\u0275crt"]({encapsulation:0,styles:[[".metadata-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;margin:0 auto;margin-top:10px;margin-bottom:10px;min-height:150px;box-shadow:none!important;width:92%;overflow:hidden}.example-icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.metadata-selector[_ngcontent-%COMP%]{min-height:42px;max-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.metadata-content-area[_ngcontent-%COMP%]{padding:10px;margin:0}.metadata-tree[_ngcontent-%COMP%]{min-height:30px;font-size:.8rem;font-weight:500}.metadata-dataindexes[_ngcontent-%COMP%], .metadata-datasets[_ngcontent-%COMP%], .metadata-datatypes[_ngcontent-%COMP%]{margin-top:10px;margin-bottom:10px}.metadata-tree.ui-tree[_ngcontent-%COMP%]{font-size:.8rem;font-weight:500;border:none!important;background-color:red}.refresh-button[_ngcontent-%COMP%]{float:left;margin-top:5px}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding:5px;margin:0}"]],data:{}}),hh=function(){function e(){this.change=new al.EventEmitter,this.focus=new al.EventEmitter,this.blur=new al.EventEmitter,this.instance=null,this._value="",_d.defineMode("asterix",function(){var e=["drop","dataverse","dataset","if","exists","create","use","type","as","closed","primary","key","hints","cardinality","index","on","btree","rtree","keyword","for","in","Metadata","Dataset","return","Index","load","using","localfs","path","format","from","in","with","group","by","select","let","where","order","asc","desc","limit","keeping","offset","distinct","or","and","boolean","tinyint","smallint","integer","bigint","float","double","string","binary","hex","base64","point","line","rectangle","circle","polygon","date","time","datetime","duration","interval","uuid","null","missing","DROP","DATAVERSE","IF","EXISTS","CREATE","USE","TYPE","AS","DATASET","PRIMARY","KEY","INDEX","SELECT","VALUE","INSERT","INTO","FROM","WHERE","AND","SOME","IN","SATISFIES","IS","UNKNOWN","NOT","EVERY","GROUP","BY","ORDER","DESC","LIMIT","OR","SET","DELETE","LOAD","USING"],t=/[$][a-zA-Z]+(\d*)/,n=/[.](\S)*/,r=/["].*["]/,i=/['].*[']/;return{startState:function(){return{inString:!1}},token:function(o,l){if(void 0==l.newLine&&(l.newLine=!0),o.match(t))return"variable";if(o.match(n))return"dot-variable";if(o.match(r))return"string";if(o.match(i))return"string";for(var a in e)if(l.newLine&&o.match(e[a]))return"keyword";return l.newLine=" "===o.peek()||null===o.peek(),o.next(),null}}})}return Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){e!==this._value&&(this._value=e,this.onChange(e))},enumerable:!0,configurable:!0}),e.prototype.ngOnDestroy=function(){},e.prototype.ngAfterViewInit=function(){this.config=this.config||{},this.codemirrorInit(this.config)},e.prototype.codemirrorInit=function(e){var t=this;this.instance=_d.fromTextArea(this.host.nativeElement,e),this.instance.setValue(this._value),this.instance.setSize(null,90),this.instance.on("change",function(){t.updateValue(t.instance.getValue())}),this.instance.on("focus",function(){t.focus.emit()}),this.instance.on("blur",function(){t.blur.emit()})},e.prototype.updateValue=function(e){this.value=e,this.onTouched(),this.change.emit(e)},e.prototype.writeValue=function(e){this._value=e||"",this.instance&&this.instance.setValue(this._value)},e.prototype.onChange=function(e){},e.prototype.onTouched=function(){},e.prototype.registerOnChange=function(e){this.onChange=e},e.prototype.registerOnTouched=function(e){this.onTouched=e},e}(),mh=al["\u0275crt"]({encapsulation:0,styles:[["code[_ngcontent-%COMP%]{width:100%;height:100%;padding:10%;margin:0;overflow-wrap:break-word;word-break:break-all;background-color:pink}"]],data:{}}),gh=function(){function e(e){var t=this;this.store=e,this.dataverses=[],this.datatypes=[],this.datasets=[],this.indexes=[],this.datasetName="",this.dataverseName="",this.queryString="",this.codemirrorConfig={mode:"asterix",lineWrapping:!0,showCursorWhenSelecting:!0,autofocus:!0},this.guideSelectedDataset$=this.store.select(function(e){return e.dataset.guideSelectsDataset}),this.guideSelectedDataset$.subscribe(function(e){if(e){t.datasetName=e;for(var n=0;n<t.datasets.length;n++)t.datasets[n].DatasetName===t.datasetName&&(t.dataverseName=t.datasets[n].DataverseName);t.queryString="USE "+t.dataverseName+"; SELECT * FROM "+t.datasetName}}),this.dataverses$=this.store.select(function(e){return e.dataverse.dataverses.results}),this.dataverses$.subscribe(function(e){t.dataverses=e}),this.datasets$=this.store.select(function(e){return e.dataset.datasets.results}),this.datasets$.subscribe(function(e){t.datasets=e})}return e.prototype.getQueryResults=function(e){this.store.dispatch(new Dd(e))},e.prototype.onClick=function(){this.getQueryResults(this.queryString.replace(/\n/g," "))},e}(),yh=al["\u0275crt"]({encapsulation:0,styles:[[".input-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;margin:10px;height:200px;width:100%;min-height:150px}.toolbar-icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-selector[_ngcontent-%COMP%]{max-height:42px;min-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87)}.content-area[_ngcontent-%COMP%]{color:rgba(0,0,0,.87);padding:0;margin:0;overflow:none}.codemirror-container[_ngcontent-%COMP%]{width:95%;height:98%;padding:0;margin:0 auto;font-size:14px;line-height:1.8;background-color:red}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);padding-left:5px;margin:0}"]],data:{}}),vh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),bh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),_h=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),wh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),xh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Ch=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Eh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Sh=n("pQo2"),Oh=n("wRXj"),Th=n("Rs3a"),kh=n("4cOY"),Dh=n("P0cP"),Ih=al["\u0275crt"]({encapsulation:2,styles:[],data:{animation:[{type:7,name:"panelState",definitions:[{type:0,name:"hidden",styles:{type:6,styles:{opacity:0},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"visible => hidden",animation:{type:4,styles:null,timings:"400ms ease-in"},options:null},{type:1,expr:"hidden => visible",animation:{type:4,styles:null,timings:"400ms ease-out"},options:null}],options:{}}]}}),Rh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Mh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Ph=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Nh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Ah=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Lh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Fh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),jh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),Vh=al["\u0275crt"]({encapsulation:2,styles:[],data:{}}),zh=D(function(){}),Bh=0,Hh=function(){},Wh=function(e){function t(t){var n=e.call(this)||this;return n._changeDetector=t,n._value=null,n._name="mat-button-toggle-group-"+Bh++,n._vertical=!1,n._selected=null,n._controlValueAccessorChangeFn=function(){},n._onTouched=function(){},n.valueChange=new al.EventEmitter,n.change=new al.EventEmitter,n}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},set:function(e){this._name=e,this._updateButtonToggleNames()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"vertical",{get:function(){return this._vertical},set:function(e){this._vertical=c(e)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"value",{get:function(){return this._value},set:function(e){this._value!=e&&(this._value=e,this.valueChange.emit(e),this._updateSelectedButtonToggleFromValue())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"selected",{get:function(){return this._selected},set:function(e){this._selected=e,this.value=e?e.value:null,e&&!e.checked&&(e.checked=!0)},enumerable:!0,configurable:!0}),t.prototype._updateButtonToggleNames=function(){var e=this;this._buttonToggles&&this._buttonToggles.forEach(function(t){t.name=e._name})},t.prototype._updateSelectedButtonToggleFromValue=function(){var e=this;if(null!=this._buttonToggles&&(null==this._selected||this._selected.value!=this._value)){var t=this._buttonToggles.filter(function(t){return t.value==e._value})[0];t?this.selected=t:null==this.value&&(this.selected=null,this._buttonToggles.forEach(function(e){e.checked=!1}))}},t.prototype._emitChangeEvent=function(){var e=new Hh;e.source=this._selected,e.value=this._value,this._controlValueAccessorChangeFn(e.value),this.change.emit(e)},t.prototype.writeValue=function(e){this.value=e,this._changeDetector.markForCheck()},t.prototype.registerOnChange=function(e){this._controlValueAccessorChangeFn=e},t.prototype.registerOnTouched=function(e){this._onTouched=e},t.prototype.setDisabledState=function(e){this.disabled=e,this._markButtonTogglesForCheck()},t.prototype._markButtonTogglesForCheck=function(){this._buttonToggles&&this._buttonToggles.forEach(function(e){return e._markForCheck()})},t}(zh),qh=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._vertical=!1,t}return Object(bl.__extends)(t,e),Object.defineProperty(t.prototype,"vertical",{get:function(){return this._vertical},set:function(e){this._vertical=c(e)},enumerable:!0,configurable:!0}),t}(zh),Uh=function(){function e(e,t,n,r,i,o){var l=this;this._changeDetectorRef=n,this._buttonToggleDispatcher=r,this._elementRef=i,this._focusMonitor=o,this.ariaLabel="",this.ariaLabelledby=null,this._checked=!1,this._disabled=!1,this._value=null,this._isSingleSelector=!1,this._removeUniqueSelectionListener=function(){},this.change=new al.EventEmitter,this.buttonToggleGroup=e,this.buttonToggleGroupMultiple=t,this.buttonToggleGroup?(this._removeUniqueSelectionListener=r.listen(function(e,t){e!=l.id&&t==l.name&&(l.checked=!1,l._changeDetectorRef.markForCheck())}),this._type="radio",this.name=this.buttonToggleGroup.name,this._isSingleSelector=!0):(this._type="checkbox",this._isSingleSelector=!1)}return Object.defineProperty(e.prototype,"inputId",{get:function(){return this.id+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"checked",{get:function(){return this._checked},set:function(e){this._isSingleSelector&&e&&(this._buttonToggleDispatcher.notify(this.id,this.name),this._changeDetectorRef.markForCheck()),this._checked=e,e&&this._isSingleSelector&&this.buttonToggleGroup.value!=this.value&&(this.buttonToggleGroup.selected=this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){this._value!=e&&(null!=this.buttonToggleGroup&&this.checked&&(this.buttonToggleGroup.value=e),this._value=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"disabled",{get:function(){return this._disabled||null!=this.buttonToggleGroup&&this.buttonToggleGroup.disabled||null!=this.buttonToggleGroupMultiple&&this.buttonToggleGroupMultiple.disabled},set:function(e){this._disabled=c(e)},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){null==this.id&&(this.id="mat-button-toggle-"+Bh++),this.buttonToggleGroup&&this._value==this.buttonToggleGroup.value&&(this._checked=!0),this._focusMonitor.monitor(this._elementRef.nativeElement,!0)},e.prototype.focus=function(){this._inputElement.nativeElement.focus()},e.prototype._toggle=function(){this.checked=!this.checked},e.prototype._onInputChange=function(e){if(e.stopPropagation(),this._isSingleSelector){var t=this.buttonToggleGroup.selected!=this;this.checked=!0,this.buttonToggleGroup.selected=this,this.buttonToggleGroup._onTouched(),t&&this.buttonToggleGroup._emitChangeEvent()}else this._toggle();this._emitChangeEvent()},e.prototype._onInputClick=function(e){e.stopPropagation()},e.prototype._emitChangeEvent=function(){var e=new Hh;e.source=this,e.value=this._value,this.change.emit(e)},e.prototype.ngOnDestroy=function(){this._removeUniqueSelectionListener()},e.prototype._markForCheck=function(){this._changeDetectorRef.markForCheck()},e}(),Gh=function(){},Kh=al["\u0275crt"]({encapsulation:2,styles:[".mat-button-toggle-group,.mat-button-toggle-standalone{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);position:relative;display:inline-flex;flex-direction:row;border-radius:2px;cursor:pointer;white-space:nowrap;overflow:hidden}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle-disabled .mat-button-toggle-label-content{cursor:default}.mat-button-toggle{white-space:nowrap;position:relative}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay,.mat-button-toggle.cdk-program-focused .mat-button-toggle-focus-overlay{opacity:1}.mat-button-toggle-label-content{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;line-height:36px;padding:0 16px;cursor:pointer}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{border-radius:inherit;pointer-events:none;opacity:0;top:0;left:0;right:0;bottom:0;position:absolute}"],data:{}}),$h=n("bbdN"),Zh=function(){function e(e,t){var n=this;this.store=e,this.changeDetector=t,this.treeData=[],this.flattenData=[],this.dataColumns=[],this.jsonOutput="",this.selectedOutputView="NONE",this.outputQueryString="",this.toogleExpand="EXPAND TREE",this.codemirrorConfig={mode:"asterix",lineWrapping:!0,showCursorWhenSelecting:!0},this.loaded$=this.store.select(function(e){return e.sqlQuery.loaded}),this.store.select("sqlQuery").subscribe(function(e){if(e.loaded){n.selectedOutputView="TABLE",n.loading=!0,n.data=e.sqlQueryResult.results,n.treeData=[];var t=e.sqlQueryString;if(n.outputQueryString=t.length>150?": "+t.slice(0,150)+" (..)":": "+t,e.sqlQueryResult.results&&e.sqlQueryResult.results.length>0&&n.data[0]){for(var r=0;r<n.data.length;r++)n.treeData.push(n.generateTreeMenu(n.data[r],{label:"["+r+"]",children:[]}));n.loading=!1}if(n.jsonOutput=JSON.stringify(e.sqlQueryResult.results,null,2),n.data&&n.data.length>0){n.collapseAll(),n.dataColumns=[];var i=Object.keys(n.data[0]),o=i[0];if(n.data[0][o]instanceof Object){var l=Object.keys(n.data[0][o]);for(r=0;r<l.length;r++)n.dataColumns.push("object"==typeof n.data[0][o][l[r]]?{field:"nestedString"+r,header:l[r]}:{field:l[r],header:l[r]})}else for(r=0;r<i.length;r++)n.dataColumns.push({field:i[r],header:i[r]});if(n.data[0][o]instanceof Object)for(r=0;r<n.data.length;r++){l=Object.keys(n.data[r][o]);for(var a=0;a<l.length;a++)if("object"==typeof n.data[r][o][l[a]]){var s=JSON.stringify(n.data[r][o][l[a]],null,"\n");n.data[r][o]["nestedString"+a]=s}n.data[r]=n.data[r][o]}}}})}return e.prototype.generateTreeMenu=function(e,t){var n=this;void 0===t&&(t={label:"",children:[]});var r=[];return Object.keys(e).map(function(i){if("object"==typeof e[i]){var o={label:"",children:[]};(o={label:"",children:[]}).label=i;var l=n.generateTreeMenu(e[i],o);t.children?t.children.push(l):t=l}else{var a={label:"",children:[]};a.label=i+" : "+e[i],r.push(a)}}),r.length>0&&(t.children=r.concat(t.children)),t},e.prototype.ngOnInit=function(){var e=this;this.loaded$=this.store.select("sqlQuery"),this.store.select("sqlQuery").subscribe(function(t){e.queryMessage=t.sqlQueryError.errors?t.sqlQueryError.errors[0].msg:""})},e.prototype.onSelect=function(e){this.selectedOutputView=e},e.prototype.exportToCSV=function(){var e=new Blob([this.jsonOutput],{type:"text/csv;charset=utf-8"});Object($h.saveAs)(e,"Asterix-results.csv")},e.prototype.exportToText=function(){var e=this.jsonOutput,t=new Blob([e],{type:"text/plain;charset=utf-8"});Object($h.saveAs)(t,"Asterix-results.txt")},e.prototype.expandTree=function(){"EXPAND TREE"===this.toogleExpand?this.expandAll():this.collapseAll()},e.prototype.expandAll=function(){var e=this;this.toogleExpand="TREE COLLAPSE",this.treeData.forEach(function(t){e.expandRecursive(t,!0)})},e.prototype.collapseAll=function(){var e=this;this.toogleExpand="EXPAND TREE",this.treeData.forEach(function(t){e.expandRecursive(t,!1)})},e.prototype.expandRecursive=function(e,t){var n=this;e.expanded=t,e.children&&e.children.forEach(function(e){n.expandRecursive(e,t)})},e}(),Qh=al["\u0275crt"]({encapsulation:0,styles:[['.sql-results-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;padding:0;height:600px;width:100%;margin:10px;min-height:150px}.toolbar-icon[_ngcontent-%COMP%]{padding:0 14px 0 0;margin:0}.spacer[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.results-selector[_ngcontent-%COMP%]{max-height:42px;min-height:42px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;font-size:.8rem;font-weight:500;background-color:#fff;border:1px solid rgba(54,147,209,.87);overflow-wrap:break-word;word-break:break-all}.content-area[_ngcontent-%COMP%]{position:relative;color:rgba(0,0,0,.87);height:500px;padding:0;margin:0;overflow:auto;font-size:.8rem;font-weight:500;font-family:Roboto,monospace}.leaf-list-open[_ngcontent-%COMP%], .root-closed[_ngcontent-%COMP%], .root-open[_ngcontent-%COMP%]{list-style-type:none}.leaf-list-open[_ngcontent-%COMP%]{padding-left:25px;color:red}.leaf-list-open.div[_ngcontent-%COMP%]   .leaf-list-open.li[_ngcontent-%COMP%]{margin-left:50px!important;color:green}.leaf[_ngcontent-%COMP%]{color:blue}.leaf-list-closed[_ngcontent-%COMP%]{list-style-type:none;display:none}ul[_ngcontent-%COMP%] > .root-closed[_ngcontent-%COMP%]:before{content:"+"}ul[_ngcontent-%COMP%] > .root-open[_ngcontent-%COMP%]:before{content:"-"}.queryErrorMessage[_ngcontent-%COMP%]{border-bottom:1px solid rgba(0,0,0,.1);color:rgba(209,54,54,.87);padding:5px;padding-left:10px}.metrics[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:rgba(54,147,209,.87);font-size:.8rem;font-weight:500}.span-results[_ngcontent-%COMP%]{padding-top:10px;padding-left:10px}.actions[_ngcontent-%COMP%]{border-top:1px solid rgba(0,0,0,.1);color:rgba(54,147,209,.87);margin:0}th[_ngcontent-%COMP%]{text-align:left!important}.datatable-header[_ngcontent-%COMP%]{color:red!important;background-color:blue}.data-viewer-container[_ngcontent-%COMP%]{padding:20px;padding-bottom:40px;height:100%;overflow:hidden}.output-group[_ngcontent-%COMP%]{margin-right:20px}.menu-export[_ngcontent-%COMP%]{font-size:.8rem!important;font-weight:500!important}.button-expand[_ngcontent-%COMP%], .button-export[_ngcontent-%COMP%]{margin-right:20px;color:rgba(54,147,209,.87)}.ui-datatable-data[_ngcontent-%COMP%] > tr[_ngcontent-%COMP%] > td[_ngcontent-%COMP%]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px;color:red}']],data:{}}),Yh="[Metadata Tree Query] UPDATE Metadata tree",Xh="[Metadata Tree Query] UPDATE Metadata tree Success",Jh=function(){return function(){this.type=Yh}}(),em=function(){return function(e){this.payload=e,this.type=Xh}}(),tm=function(){function e(e){var t=this;this.store=e,this.nodes=[],this.store.select(function(e){return e.metadata.tree}).subscribe(function(e){t.nodes=[];for(var n=0;n<e.length;n++)if(e[n].DataverseName){var r={id:0,name:"",children:[]};r.id=n,r.name=e[n].DataverseName;for(var i=0;i<e[n].Datasets.length;i++){var o={id:0,name:"",children:[]};o.id=i,o.name=e[n].Datasets[i].DatasetName,r.children.push(o)}t.nodes.push(r)}})}return e.prototype.treeCalc=function(){this.store.dispatch(new Jh)},e}(),nm=al["\u0275crt"]({encapsulation:0,styles:[[".query-container[_ngcontent-%COMP%]{width:100%;overflow:hidden}.metadata[_ngcontent-%COMP%], .query-container[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:0;padding:0}.metadata[_ngcontent-%COMP%]{width:20%;border-right:1px solid rgba(0,0,0,.2)}.vertical[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:80%;overflow:hidden;margin:0;padding:1px0}.metadata-card[_ngcontent-%COMP%], .output-card[_ngcontent-%COMP%], .query-card[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:100%;overflow:hidden;margin:0;padding:0}"]],data:{}}),rm=function(){function e(){this.message=""}return e.prototype.tabChange=function(){this.indexes.cleanUp(),this.datasets.cleanUp(),this.datatypes.cleanUp(),this.dataverses.cleanUp()},e}(),im=al["\u0275crt"]({encapsulation:0,styles:[[".datasets[_ngcontent-%COMP%], .datatypes[_ngcontent-%COMP%], .dataverses[_ngcontent-%COMP%], .indexes[_ngcontent-%COMP%]{margin:0;min-height:750px;max-height:750px;width:100%;overflow:hidden}.metadata-menu[_ngcontent-%COMP%]     .mat-tab-label{font-size:.8rem!important;font-weight:500!important}"]],data:{}}),om=function(e){this.store=e},lm=al["\u0275crt"]({encapsulation:0,styles:[[".content[_ngcontent-%COMP%]{width:95%;margin:0 auto}.menu[_ngcontent-%COMP%]     .mat-tab-label{font-size:.8rem!important;font-weight:500!important}"]],data:{}}),am=function(){return function(e){this.store=e,console.log("AsterixDB Web Console Core Service"),this.store.dispatch(new Wd("-")),this.store.dispatch(new sp("-")),this.store.dispatch(new Sp("-")),this.store.dispatch(new Bp("-"))}}(),sm=al["\u0275crt"]({encapsulation:0,styles:[[""]],data:{}}),um=al["\u0275ccf"]("awc-root",ul,function(e){return al["\u0275vid"](0,[(e()(),al["\u0275eld"](0,0,null,null,1,"awc-root",[],null,null,null,Ui,sm)),al["\u0275did"](1,49152,null,0,ul,[am],null,null)],null,null)},{},{},[]),cm=function(e,t){return!1},dm=function(e,t){return!1},pm=function(e,t,n){return[]};if("undefined"!=typeof Element){if(cm=function(e,t){return e.contains(t)},Element.prototype.matches)dm=function(e,t){return e.matches(t)};else{var fm=Element.prototype,hm=fm.matchesSelector||fm.mozMatchesSelector||fm.msMatchesSelector||fm.oMatchesSelector||fm.webkitMatchesSelector;hm&&(dm=function(e,t){return hm.apply(e,[t])})}pm=function(e,t,n){var r=[];if(n)r.push.apply(r,e.querySelectorAll(t));else{var i=e.querySelector(t);i&&r.push(i)}return r}}var mm=null,gm=!1,ym=dm,vm=cm,bm=pm,_m=function(){function e(){}return e.prototype.validateStyleProperty=function(e){return Ji(e)},e.prototype.matchesElement=function(e,t){return ym(e,t)},e.prototype.containsElement=function(e,t){return vm(e,t)},e.prototype.query=function(e,t,n){return bm(e,t,n)},e.prototype.computeStyle=function(e,t,n){return n||""},e.prototype.animate=function(e,t,n,r,i,o){return void 0===o&&(o=[]),new Rs.NoopAnimationPlayer},e}(),wm=function(){function e(){}return e.NOOP=new _m,e}(),xm=1e3,Cm="ng-trigger",Em=".ng-trigger",Sm=".ng-animating",Om=new RegExp("{{\\s*(.+?)\\s*}}","g"),Tm=/-+([a-z0-9])/g,km="*",Dm=new Set(["true","1"]),Im=new Set(["false","0"]),Rm=new RegExp("s*:selfs*,?","g"),Mm=function(){function e(e){this._driver=e}return e.prototype.build=function(e,t){var n=new Pm(t);return this._resetContextStyleTimingState(n),ho(this,so(e),n)},e.prototype._resetContextStyleTimingState=function(e){e.currentQuerySelector="",e.collectedStyles={},e.collectedStyles[""]={},e.currentTime=0},e.prototype.visitTrigger=function(e,t){var n=this,r=t.queryCount=0,i=t.depCount=0,o=[],l=[];return"@"==e.name.charAt(0)&&t.errors.push("animation triggers cannot be prefixed with an `@` sign (e.g. trigger('@foo', [...]))"),e.definitions.forEach(function(e){if(n._resetContextStyleTimingState(t),0==e.type){var a=e,s=a.name;s.split(/\s*,\s*/).forEach(function(e){a.name=e,o.push(n.visitState(a,t))}),a.name=s}else if(1==e.type){var u=n.visitTransition(e,t);r+=u.queryCount,i+=u.depCount,l.push(u)}else t.errors.push("only state() and transition() definitions can sit inside of a trigger()")}),{type:7,name:e.name,states:o,transitions:l,queryCount:r,depCount:i,options:null}},e.prototype.visitState=function(e,t){var n=this.visitStyle(e.styles,t),r=e.options&&e.options.params||null;if(n.containsDynamicStyles){var i=new Set,o=r||{};if(n.styles.forEach(function(e){if(yo(e)){var t=e;Object.keys(t).forEach(function(e){uo(t[e]).forEach(function(e){o.hasOwnProperty(e)||i.add(e)})})}}),i.size){var l=po(i.values());t.errors.push('state("'+e.name+'", ...) must define default values for all the following style substitutions: '+l.join(", "))}}return{type:0,name:e.name,style:n,options:r?{params:r}:null}},e.prototype.visitTransition=function(e,t){t.queryCount=0,t.depCount=0;var n=ho(this,so(e.animation),t);return{type:1,matchers:function(e,t){var n=[];return"string"==typeof e?e.split(/\s*,\s*/).forEach(function(e){return function(e,t,n){if(":"==e[0]){var r=function(e,t){switch(e){case":enter":return"void => *";case":leave":return"* => void";case":increment":return function(e,t){return parseFloat(t)>parseFloat(e)};case":decrement":return function(e,t){return parseFloat(t)<parseFloat(e)};default:return t.push('The transition alias value "'+e+'" is not supported'),"* => *"}}(e,n);if("function"==typeof r)return void t.push(r);e=r}var i=e.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);if(null==i||i.length<4)return n.push('The provided transition expression "'+e+'" is not supported'),t;var o=i[1],l=i[2],a=i[3];t.push(mo(o,a)),"<"!=l[0]||o==km&&a==km||t.push(mo(a,o))}(e,n,t)}):n.push(e),n}(e.expr,t.errors),animation:n,queryCount:t.queryCount,depCount:t.depCount,options:vo(e.options)}},e.prototype.visitSequence=function(e,t){var n=this;return{type:2,steps:e.steps.map(function(e){return ho(n,e,t)}),options:vo(e.options)}},e.prototype.visitGroup=function(e,t){var n=this,r=t.currentTime,i=0,o=e.steps.map(function(e){t.currentTime=r;var o=ho(n,e,t);return i=Math.max(i,t.currentTime),o});return t.currentTime=i,{type:3,steps:o,options:vo(e.options)}},e.prototype.visitAnimate=function(e,t){var n=function(e,t){var n=null;if(e.hasOwnProperty("duration"))n=e;else if("number"==typeof e)return bo(ro(e,t).duration,0,"");var r=e;if(r.split(/\s+/).some(function(e){return"{"==e.charAt(0)&&"{"==e.charAt(1)})){var i=bo(0,0,"");return i.dynamic=!0,i.strValue=r,i}return n=n||ro(r,t),bo(n.duration,n.delay,n.easing)}(e.timings,t.errors);t.currentAnimateTimings=n;var r,i=e.styles?e.styles:Object(Rs.style)({});if(5==i.type)r=this.visitKeyframes(i,t);else{var o=e.styles,l=!1;if(!o){l=!0;var a={};n.easing&&(a.easing=n.easing),o=Object(Rs.style)(a)}t.currentTime+=n.duration+n.delay;var s=this.visitStyle(o,t);s.isEmptyStep=l,r=s}return t.currentAnimateTimings=null,{type:4,timings:n,style:r,options:null}},e.prototype.visitStyle=function(e,t){var n=this._makeStyleAst(e,t);return this._validateStyleAst(n,t),n},e.prototype._makeStyleAst=function(e,t){var n=[];Array.isArray(e.styles)?e.styles.forEach(function(e){"string"==typeof e?e==Rs.AUTO_STYLE?n.push(e):t.errors.push("The provided style string value "+e+" is not allowed."):n.push(e)}):n.push(e.styles);var r=!1,i=null;return n.forEach(function(e){if(yo(e)){var t=e,n=t.easing;if(n&&(i=n,delete t.easing),!r)for(var o in t)if(t[o].toString().indexOf("{{")>=0){r=!0;break}}}),{type:6,styles:n,easing:i,offset:e.offset,containsDynamicStyles:r,options:null}},e.prototype._validateStyleAst=function(e,t){var n=this,r=t.currentAnimateTimings,i=t.currentTime,o=t.currentTime;r&&o>0&&(o-=r.duration+r.delay),e.styles.forEach(function(e){"string"!=typeof e&&Object.keys(e).forEach(function(r){if(n._driver.validateStyleProperty(r)){var l=t.collectedStyles[t.currentQuerySelector],a=l[r],s=!0;a&&(o!=i&&o>=a.startTime&&i<=a.endTime&&(t.errors.push('The CSS property "'+r+'" that exists between the times of "'+a.startTime+'ms" and "'+a.endTime+'ms" is also being animated in a parallel animation between the times of "'+o+'ms" and "'+i+'ms"'),s=!1),o=a.startTime),s&&(l[r]={startTime:o,endTime:i}),t.options&&function(n,i,o){var l=t.options.params||{},a=uo(e[r]);a.length&&a.forEach(function(e){l.hasOwnProperty(e)||o.push("Unable to resolve the local animation param "+e+" in the given list of values")})}(0,0,t.errors)}else t.errors.push('The provided animation property "'+r+'" is not a supported CSS property for animations')})})},e.prototype.visitKeyframes=function(e,t){var n=this,r={type:5,styles:[],options:null};if(!t.currentAnimateTimings)return t.errors.push("keyframes() must be placed inside of a call to animate()"),r;var i=0,o=[],l=!1,a=!1,s=0,u=e.steps.map(function(e){var r=n._makeStyleAst(e,t),u=null!=r.offset?r.offset:function(e){if("string"==typeof e)return null;var t=null;if(Array.isArray(e))e.forEach(function(e){if(yo(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}});else if(yo(e)&&e.hasOwnProperty("offset")){var n=e;t=parseFloat(n.offset),delete n.offset}return t}(r.styles),c=0;return null!=u&&(i++,c=r.offset=u),a=a||c<0||c>1,l=l||c<s,s=c,o.push(c),r});a&&t.errors.push("Please ensure that all keyframe offsets are between 0 and 1"),l&&t.errors.push("Please ensure that all keyframe offsets are in order");var c=e.steps.length,d=0;i>0&&i<c?t.errors.push("Not all style() steps within the declared keyframes() contain offsets"):0==i&&(d=1/(c-1));var p=c-1,f=t.currentTime,h=t.currentAnimateTimings,m=h.duration;return u.forEach(function(e,i){var l=d>0?i==p?1:d*i:o[i],a=l*m;t.currentTime=f+h.delay+a,h.duration=a,n._validateStyleAst(e,t),e.offset=l,r.styles.push(e)}),r},e.prototype.visitReference=function(e,t){return{type:8,animation:ho(this,so(e.animation),t),options:vo(e.options)}},e.prototype.visitAnimateChild=function(e,t){return t.depCount++,{type:9,options:vo(e.options)}},e.prototype.visitAnimateRef=function(e,t){return{type:10,animation:this.visitReference(e.animation,t),options:vo(e.options)}},e.prototype.visitQuery=function(e,t){var n=t.currentQuerySelector,r=e.options||{};t.queryCount++,t.currentQuery=e;var i=function(e){var t=!!e.split(/\s*,\s*/).find(function(e){return":self"==e});return t&&(e=e.replace(Rm,"")),e=e.replace(/@\*/g,Em).replace(/@\w+/g,function(e){return Em+"-"+e.substr(1)}).replace(/:animating/g,Sm),[e,t]}(e.selector),o=i[0],l=i[1];t.currentQuerySelector=n.length?n+" "+o:o,Yi(t.collectedStyles,t.currentQuerySelector,{});var a=ho(this,so(e.animation),t);return t.currentQuery=null,t.currentQuerySelector=n,{type:11,selector:o,limit:r.limit||0,optional:!!r.optional,includeSelf:l,animation:a,originalSelector:e.selector,options:vo(e.options)}},e.prototype.visitStagger=function(e,t){t.currentQuery||t.errors.push("stagger() can only be used inside of query()");var n="full"===e.timings?{duration:0,delay:0,easing:"full"}:ro(e.timings,t.errors,!0);return{type:12,animation:ho(this,so(e.animation),t),timings:n,options:null}},e}(),Pm=function(e){this.errors=e,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null},Nm=function(){function e(){this._map=new Map}return e.prototype.consume=function(e){var t=this._map.get(e);return t?this._map.delete(e):t=[],t},e.prototype.append=function(e,t){var n=this._map.get(e);n||this._map.set(e,n=[]),n.push.apply(n,t)},e.prototype.has=function(e){return this._map.has(e)},e.prototype.clear=function(){this._map.clear()},e}(),Am=new RegExp(":enter","g"),Lm=new RegExp(":leave","g"),Fm=function(){function e(){}return e.prototype.buildKeyframes=function(e,t,n,r,i,o,l,a,s,u){void 0===u&&(u=[]),s=s||new Nm;var c=new Vm(e,t,s,r,i,u,[]);c.options=a,c.currentTimeline.setStyles([o],null,c.errors,a),ho(this,n,c);var d=c.timelines.filter(function(e){return e.containsAnimation()});if(d.length&&Object.keys(l).length){var p=d[d.length-1];p.allowOnlyTimelineStyles()||p.setStyles([l],null,c.errors,a)}return d.length?d.map(function(e){return e.buildKeyframes()}):[_o(t,[],[],[],0,0,"",!1)]},e.prototype.visitTrigger=function(e,t){},e.prototype.visitState=function(e,t){},e.prototype.visitTransition=function(e,t){},e.prototype.visitAnimateChild=function(e,t){var n=t.subInstructions.consume(t.element);if(n){var r=t.createSubContext(e.options),i=t.currentTimeline.currentTime,o=this._visitSubInstructions(n,r,r.options);i!=o&&t.transformIntoNewTimeline(o)}t.previousNode=e},e.prototype.visitAnimateRef=function(e,t){var n=t.createSubContext(e.options);n.transformIntoNewTimeline(),this.visitReference(e.animation,n),t.transformIntoNewTimeline(n.currentTimeline.currentTime),t.previousNode=e},e.prototype._visitSubInstructions=function(e,t,n){var r=t.currentTimeline.currentTime,i=null!=n.duration?to(n.duration):null,o=null!=n.delay?to(n.delay):null;return 0!==i&&e.forEach(function(e){var n=t.appendInstructionToTimeline(e,i,o);r=Math.max(r,n.duration+n.delay)}),r},e.prototype.visitReference=function(e,t){t.updateOptions(e.options,!0),ho(this,e.animation,t),t.previousNode=e},e.prototype.visitSequence=function(e,t){var n=this,r=t.subContextCount,i=t,o=e.options;if(o&&(o.params||o.delay)&&((i=t.createSubContext(o)).transformIntoNewTimeline(),null!=o.delay)){6==i.previousNode.type&&(i.currentTimeline.snapshotCurrentStyles(),i.previousNode=jm);var l=to(o.delay);i.delayNextStep(l)}e.steps.length&&(e.steps.forEach(function(e){return ho(n,e,i)}),i.currentTimeline.applyStylesToKeyframe(),i.subContextCount>r&&i.transformIntoNewTimeline()),t.previousNode=e},e.prototype.visitGroup=function(e,t){var n=this,r=[],i=t.currentTimeline.currentTime,o=e.options&&e.options.delay?to(e.options.delay):0;e.steps.forEach(function(l){var a=t.createSubContext(e.options);o&&a.delayNextStep(o),ho(n,l,a),i=Math.max(i,a.currentTimeline.currentTime),r.push(a.currentTimeline)}),r.forEach(function(e){return t.currentTimeline.mergeTimelineCollectedStyles(e)}),t.transformIntoNewTimeline(i),t.previousNode=e},e.prototype._visitTiming=function(e,t){if(e.dynamic){var n=e.strValue;return ro(t.params?co(n,t.params,t.errors):n,t.errors)}return{duration:e.duration,delay:e.delay,easing:e.easing}},e.prototype.visitAnimate=function(e,t){var n=t.currentAnimateTimings=this._visitTiming(e.timings,t),r=t.currentTimeline;n.delay&&(t.incrementTime(n.delay),r.snapshotCurrentStyles());var i=e.style;5==i.type?this.visitKeyframes(i,t):(t.incrementTime(n.duration),this.visitStyle(i,t),r.applyStylesToKeyframe()),t.currentAnimateTimings=null,t.previousNode=e},e.prototype.visitStyle=function(e,t){var n=t.currentTimeline,r=t.currentAnimateTimings;!r&&n.getCurrentStyleProperties().length&&n.forwardFrame();var i=r&&r.easing||e.easing;e.isEmptyStep?n.applyEmptyStep(i):n.setStyles(e.styles,i,t.errors,t.options),t.previousNode=e},e.prototype.visitKeyframes=function(e,t){var n=t.currentAnimateTimings,r=t.currentTimeline.duration,i=n.duration,o=t.createSubContext().currentTimeline;o.easing=n.easing,e.styles.forEach(function(e){o.forwardTime((e.offset||0)*i),o.setStyles(e.styles,e.easing,t.errors,t.options),o.applyStylesToKeyframe()}),t.currentTimeline.mergeTimelineCollectedStyles(o),t.transformIntoNewTimeline(r+i),t.previousNode=e},e.prototype.visitQuery=function(e,t){var n=this,r=t.currentTimeline.currentTime,i=e.options||{},o=i.delay?to(i.delay):0;o&&(6===t.previousNode.type||0==r&&t.currentTimeline.getCurrentStyleProperties().length)&&(t.currentTimeline.snapshotCurrentStyles(),t.previousNode=jm);var l=r,a=t.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!i.optional,t.errors);t.currentQueryTotal=a.length;var s=null;a.forEach(function(r,i){t.currentQueryIndex=i;var a=t.createSubContext(e.options,r);o&&a.delayNextStep(o),r===t.element&&(s=a.currentTimeline),ho(n,e.animation,a),a.currentTimeline.applyStylesToKeyframe();var u=a.currentTimeline.currentTime;l=Math.max(l,u)}),t.currentQueryIndex=0,t.currentQueryTotal=0,t.transformIntoNewTimeline(l),s&&(t.currentTimeline.mergeTimelineCollectedStyles(s),t.currentTimeline.snapshotCurrentStyles()),t.previousNode=e},e.prototype.visitStagger=function(e,t){var n=t.parentContext,r=t.currentTimeline,i=e.timings,o=Math.abs(i.duration),l=o*t.currentQueryIndex;switch(i.duration<0?"reverse":i.easing){case"reverse":l=o*(t.currentQueryTotal-1)-l;break;case"full":l=n.currentStaggerTime}var a=t.currentTimeline;l&&a.delayNextStep(l);var s=a.currentTime;ho(this,e.animation,t),t.previousNode=e,n.currentStaggerTime=r.currentTime-s+(r.startTime-n.currentTimeline.startTime)},e}(),jm={},Vm=function(){function e(e,t,n,r,i,o,l,a){this._driver=e,this.element=t,this.subInstructions=n,this._enterClassName=r,this._leaveClassName=i,this.errors=o,this.timelines=l,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=jm,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=a||new zm(this._driver,t,0),l.push(this.currentTimeline)}return Object.defineProperty(e.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),e.prototype.updateOptions=function(e,t){var n=this;if(e){var r=e,i=this.options;null!=r.duration&&(i.duration=to(r.duration)),null!=r.delay&&(i.delay=to(r.delay));var o=r.params;if(o){var l=i.params;l||(l=this.options.params={}),Object.keys(o).forEach(function(e){t&&l.hasOwnProperty(e)||(l[e]=co(o[e],l,n.errors))})}}},e.prototype._copyOptions=function(){var e={};if(this.options){var t=this.options.params;if(t){var n=e.params={};Object.keys(t).forEach(function(e){n[e]=t[e]})}}return e},e.prototype.createSubContext=function(t,n,r){void 0===t&&(t=null);var i=n||this.element,o=new e(this._driver,i,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(i,r||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(t),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o},e.prototype.transformIntoNewTimeline=function(e){return this.previousNode=jm,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline},e.prototype.appendInstructionToTimeline=function(e,t,n){var r={duration:null!=t?t:e.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+e.delay,easing:""},i=new Bm(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,r,e.stretchStartingKeyframe);return this.timelines.push(i),r},e.prototype.incrementTime=function(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)},e.prototype.delayNextStep=function(e){e>0&&this.currentTimeline.delayNextStep(e)},e.prototype.invokeQuery=function(e,t,n,r,i,o){var l=[];if(r&&l.push(this.element),e.length>0){e=(e=e.replace(Am,"."+this._enterClassName)).replace(Lm,"."+this._leaveClassName);var a=this._driver.query(this.element,e,1!=n);0!==n&&(a=n<0?a.slice(a.length+n,a.length):a.slice(0,n)),l.push.apply(l,a)}return i||0!=l.length||o.push('`query("'+t+'")` returned zero elements. (Use `query("'+t+'", { optional: true })` if you wish to allow this.)'),l},e}(),zm=function(){function e(e,t,n,r){this._driver=e,this.element=t,this.startTime=n,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(t),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(t,this._localTimelineStyles)),this._loadKeyframe()}return e.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},e.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(e.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),e.prototype.delayNextStep=function(e){var t=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||t?(this.forwardTime(this.currentTime+e),t&&this.snapshotCurrentStyles()):this.startTime+=e},e.prototype.fork=function(t,n){return this.applyStylesToKeyframe(),new e(this._driver,t,n||this.currentTime,this._elementTimelineStylesLookup)},e.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},e.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},e.prototype.forwardTime=function(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()},e.prototype._updateStyle=function(e,t){this._localTimelineStyles[e]=t,this._globalTimelineStyles[e]=t,this._styleSummary[e]={time:this.currentTime,value:t}},e.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},e.prototype.applyEmptyStep=function(e){var t=this;e&&(this._previousKeyframe.easing=e),Object.keys(this._globalTimelineStyles).forEach(function(e){t._backFill[e]=t._globalTimelineStyles[e]||Rs.AUTO_STYLE,t._currentKeyframe[e]=Rs.AUTO_STYLE}),this._currentEmptyStepKeyframe=this._currentKeyframe},e.prototype.setStyles=function(e,t,n,r){var i=this;t&&(this._previousKeyframe.easing=t);var o=r&&r.params||{},l=function(t,n){var r,i={};return e.forEach(function(e){"*"===e?(r=r||Object.keys(n)).forEach(function(e){i[e]=Rs.AUTO_STYLE}):oo(e,!1,i)}),i}(0,this._globalTimelineStyles);Object.keys(l).forEach(function(e){var t=co(l[e],o,n);i._pendingStyles[e]=t,i._localTimelineStyles.hasOwnProperty(e)||(i._backFill[e]=i._globalTimelineStyles.hasOwnProperty(e)?i._globalTimelineStyles[e]:Rs.AUTO_STYLE),i._updateStyle(e,t)})},e.prototype.applyStylesToKeyframe=function(){var e=this,t=this._pendingStyles,n=Object.keys(t);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){e._currentKeyframe[n]=t[n]}),Object.keys(this._localTimelineStyles).forEach(function(t){e._currentKeyframe.hasOwnProperty(t)||(e._currentKeyframe[t]=e._localTimelineStyles[t])}))},e.prototype.snapshotCurrentStyles=function(){var e=this;Object.keys(this._localTimelineStyles).forEach(function(t){var n=e._localTimelineStyles[t];e._pendingStyles[t]=n,e._updateStyle(t,n)})},e.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(e.prototype,"properties",{get:function(){var e=[];for(var t in this._currentKeyframe)e.push(t);return e},enumerable:!0,configurable:!0}),e.prototype.mergeTimelineCollectedStyles=function(e){var t=this;Object.keys(e._styleSummary).forEach(function(n){var r=t._styleSummary[n],i=e._styleSummary[n];(!r||i.time>r.time)&&t._updateStyle(n,i.value)})},e.prototype.buildKeyframes=function(){var e=this;this.applyStylesToKeyframe();var t=new Set,n=new Set,r=1===this._keyframes.size&&0===this.duration,i=[];this._keyframes.forEach(function(o,l){var a=oo(o,!0);Object.keys(a).forEach(function(e){var r=a[e];r==Rs["\u0275PRE_STYLE"]?t.add(e):r==Rs.AUTO_STYLE&&n.add(e)}),r||(a.offset=l/e.duration),i.push(a)});var o=t.size?po(t.values()):[],l=n.size?po(n.values()):[];if(r){var a=i[0],s=io(a);a.offset=0,s.offset=1,i=[a,s]}return _o(this.element,i,o,l,this.duration,this.startTime,this.easing,!1)},e}(),Bm=function(e){function t(t,n,r,i,o,l,a){void 0===a&&(a=!1);var s=e.call(this,t,n,l.delay)||this;return s.element=n,s.keyframes=r,s.preStyleProps=i,s.postStyleProps=o,s._stretchStartingKeyframe=a,s.timings={duration:l.duration,delay:l.delay,easing:l.easing},s}return Object(bl.__extends)(t,e),t.prototype.containsAnimation=function(){return this.keyframes.length>1},t.prototype.buildKeyframes=function(){var e=this.keyframes,t=this.timings,n=t.delay,r=t.duration,i=t.easing;if(this._stretchStartingKeyframe&&n){var o=[],l=r+n,a=n/l,s=oo(e[0],!1);s.offset=0,o.push(s);var u=oo(e[0],!1);u.offset=xo(a),o.push(u);for(var c=e.length-1,d=1;d<=c;d++){var p=oo(e[d],!1);p.offset=xo((n+p.offset*r)/l),o.push(p)}r=l,n=0,i="",e=o}return _o(this.element,e,this.preStyleProps,this.postStyleProps,r,n,i,!0)},t}(zm),Hm=function(){},Wm=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Object(bl.__extends)(t,e),t.prototype.normalizePropertyName=function(e,t){return fo(e)},t.prototype.normalizeStyleValue=function(e,t,n,r){var i="",o=n.toString().trim();if(qm[t]&&0!==n&&"0"!==n)if("number"==typeof n)i="px";else{var l=n.match(/^[+-]?[\d\.]+([a-z]*)$/);l&&0==l[1].length&&r.push("Please provide a CSS unit value for "+e+":"+n)}return o+i},t}(Hm),qm=function(e){var t={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(e){return t[e]=!0}),t}(),Um={},Gm=function(){function e(e,t,n){this._triggerName=e,this.ast=t,this._stateStyles=n}return e.prototype.match=function(e,t){return function(e,t,n){return e.some(function(e){return e(t,n)})}(this.ast.matchers,e,t)},e.prototype.buildStyles=function(e,t,n){var r=this._stateStyles["*"],i=this._stateStyles[e],o=r?r.buildStyles(t,n):{};return i?i.buildStyles(t,n):o},e.prototype.build=function(e,t,n,r,i,o,l,a,s){var u=[],c=this.ast.options&&this.ast.options.params||Um,d=this.buildStyles(n,l&&l.params||Um,u),p=a&&a.params||Um,f=this.buildStyles(r,p,u),h=new Set,m=new Map,g=new Map,y="void"===r,v={params:Object(bl.__assign)({},c,p)},b=wo(e,t,this.ast.animation,i,o,d,f,v,s,u);if(u.length)return Co(t,this._triggerName,n,r,y,d,f,[],[],m,g,u);b.forEach(function(e){var n=e.element,r=Yi(m,n,{});e.preStyleProps.forEach(function(e){return r[e]=!0});var i=Yi(g,n,{});e.postStyleProps.forEach(function(e){return i[e]=!0}),n!==t&&h.add(n)});var _=po(h.values());return Co(t,this._triggerName,n,r,y,d,f,b,_,m,g)},e}(),Km=function(){function e(e,t){this.styles=e,this.defaultParams=t}return e.prototype.buildStyles=function(e,t){var n={},r=io(this.defaultParams);return Object.keys(e).forEach(function(t){var n=e[t];null!=n&&(r[t]=n)}),this.styles.styles.forEach(function(e){if("string"!=typeof e){var i=e;Object.keys(i).forEach(function(e){var o=i[e];o.length>1&&(o=co(o,r,t)),n[e]=o})}}),n},e}(),$m=function(){function e(e,t){var n=this;this.name=e,this.ast=t,this.transitionFactories=[],this.states={},t.states.forEach(function(e){n.states[e.name]=new Km(e.style,e.options&&e.options.params||{})}),Eo(this.states,"true","1"),Eo(this.states,"false","0"),t.transitions.forEach(function(t){n.transitionFactories.push(new Gm(e,t,n.states))}),this.fallbackTransition=function(t,n){return new Gm(e,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(e,t){return!0}],options:null,queryCount:0,depCount:0},n)}(0,this.states)}return Object.defineProperty(e.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),e.prototype.matchTransition=function(e,t){return this.transitionFactories.find(function(n){return n.match(e,t)})||null},e.prototype.matchStyles=function(e,t,n){return this.fallbackTransition.buildStyles(e,t,n)},e}(),Zm=new Nm,Qm=function(){function e(e,t){this._driver=e,this._normalizer=t,this._animations={},this._playersById={},this.players=[]}return e.prototype.register=function(e,t){var n=[],r=go(this._driver,t,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: "+n.join("\n"));this._animations[e]=r},e.prototype._buildPlayer=function(e,t,n){var r=e.element,i=Ki(0,this._normalizer,0,e.keyframes,t,n);return this._driver.animate(r,i,e.duration,e.delay,e.easing,[])},e.prototype.create=function(e,t,n){var r=this;void 0===n&&(n={});var i,o=[],l=this._animations[e],a=new Map;if(l?(i=wo(this._driver,t,l,"ng-enter","ng-leave",{},{},n,Zm,o)).forEach(function(e){var t=Yi(a,e.element,{});e.postStyleProps.forEach(function(e){return t[e]=null})}):(o.push("The requested animation doesn't exist or has already been destroyed"),i=[]),o.length)throw new Error("Unable to create the animation due to the following errors: "+o.join("\n"));a.forEach(function(e,t){Object.keys(e).forEach(function(n){e[n]=r._driver.computeStyle(t,n,Rs.AUTO_STYLE)})});var s=Gi(i.map(function(e){var t=a.get(e.element);return r._buildPlayer(e,{},t)}));return this._playersById[e]=s,s.onDestroy(function(){return r.destroy(e)}),this.players.push(s),s},e.prototype.destroy=function(e){var t=this._getPlayer(e);t.destroy(),delete this._playersById[e];var n=this.players.indexOf(t);n>=0&&this.players.splice(n,1)},e.prototype._getPlayer=function(e){var t=this._playersById[e];if(!t)throw new Error("Unable to find the timeline player referenced by "+e);return t},e.prototype.listen=function(e,t,n,r){var i=Qi(t,"","","");return $i(this._getPlayer(e),n,i,r),function(){}},e.prototype.command=function(e,t,n,r){if("register"!=n)if("create"!=n){var i=this._getPlayer(e);switch(n){case"play":i.play();break;case"pause":i.pause();break;case"reset":i.reset();break;case"restart":i.restart();break;case"finish":i.finish();break;case"init":i.init();break;case"setPosition":i.setPosition(parseFloat(r[0]));break;case"destroy":this.destroy(e)}}else this.create(e,t,r[0]||{});else this.register(e,r[0])},e}(),Ym="ng-animate-disabled",Xm=".ng-animate-disabled",Jm=[],eg={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},tg={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},ng="__ng_removed",rg=function(){function e(e,t){void 0===t&&(t=""),this.namespaceId=t;var n=e&&e.hasOwnProperty("value");if(this.value=function(e){return null!=e?e:null}(n?e.value:e),n){var r=io(e);delete r.value,this.options=r}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(e.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),e.prototype.absorbOptions=function(e){var t=e.params;if(t){var n=this.options.params;Object.keys(t).forEach(function(e){null==n[e]&&(n[e]=t[e])})}},e}(),ig=new rg("void"),og=new rg("DELETED"),lg=function(){function e(e,t,n){this.id=e,this.hostElement=t,this._engine=n,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+e,Do(t,this._hostClassName)}return e.prototype.listen=function(e,t,n,r){var i=this;if(!this._triggers.hasOwnProperty(t))throw new Error('Unable to listen on the animation trigger event "'+n+'" because the animation trigger "'+t+"\" doesn't exist!");if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'+t+'" because the provided event is undefined!');if("start"!=n&&"done"!=n)throw new Error('The provided animation trigger event "'+n+'" for the animation trigger "'+t+'" is not supported!');var o=Yi(this._elementListeners,e,[]),l={name:t,phase:n,callback:r};o.push(l);var a=Yi(this._engine.statesByElement,e,{});return a.hasOwnProperty(t)||(Do(e,Cm),Do(e,Cm+"-"+t),a[t]=ig),function(){i._engine.afterFlush(function(){var e=o.indexOf(l);e>=0&&o.splice(e,1),i._triggers[t]||delete a[t]})}},e.prototype.register=function(e,t){return!this._triggers[e]&&(this._triggers[e]=t,!0)},e.prototype._getTrigger=function(e){var t=this._triggers[e];if(!t)throw new Error('The provided animation trigger "'+e+'" has not been registered!');return t},e.prototype.trigger=function(e,t,n,r){var i=this;void 0===r&&(r=!0);var o=this._getTrigger(t),l=new sg(this.id,t,e),a=this._engine.statesByElement.get(e);a||(Do(e,Cm),Do(e,Cm+"-"+t),this._engine.statesByElement.set(e,a={}));var s=a[t],u=new rg(n,this.id);if(!(n&&n.hasOwnProperty("value"))&&s&&u.absorbOptions(s.options),a[t]=u,s){if(s===og)return l}else s=ig;if("void"===u.value||s.value!==u.value){var c=Yi(this._engine.playersByElement,e,[]);c.forEach(function(e){e.namespaceId==i.id&&e.triggerName==t&&e.queued&&e.destroy()});var d=o.matchTransition(s.value,u.value),p=!1;if(!d){if(!r)return;d=o.fallbackTransition,p=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:t,transition:d,fromState:s,toState:u,player:l,isFallbackTransition:p}),p||(Do(e,"ng-animate-queued"),l.onStart(function(){Io(e,"ng-animate-queued")})),l.onDone(function(){var t=i.players.indexOf(l);t>=0&&i.players.splice(t,1);var n=i._engine.playersByElement.get(e);if(n){var r=n.indexOf(l);r>=0&&n.splice(r,1)}}),this.players.push(l),c.push(l),l}if(!function(e,t){var n=Object.keys(e),r=Object.keys(t);if(n.length!=r.length)return!1;for(var i=0;i<n.length;i++){var o=n[i];if(!t.hasOwnProperty(o)||e[o]!==t[o])return!1}return!0}(s.params,u.params)){var f=[],h=o.matchStyles(s.value,s.params,f),m=o.matchStyles(u.value,u.params,f);f.length?this._engine.reportError(f):this._engine.afterFlush(function(){ao(e,h),lo(e,m)})}},e.prototype.deregister=function(e){var t=this;delete this._triggers[e],this._engine.statesByElement.forEach(function(t,n){delete t[e]}),this._elementListeners.forEach(function(n,r){t._elementListeners.set(r,n.filter(function(t){return t.name!=e}))})},e.prototype.clearElementCache=function(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);var t=this._engine.playersByElement.get(e);t&&(t.forEach(function(e){return e.destroy()}),this._engine.playersByElement.delete(e))},e.prototype._signalRemovalForInnerTriggers=function(e,t,n){var r=this;void 0===n&&(n=!1),this._engine.driver.query(e,Em,!0).forEach(function(e){if(!e[ng]){var n=r._engine.fetchNamespacesByElement(e);n.size?n.forEach(function(n){return n.triggerLeaveAnimation(e,t,!1,!0)}):r.clearElementCache(e)}})},e.prototype.triggerLeaveAnimation=function(e,t,n,r){var i=this,o=this._engine.statesByElement.get(e);if(o){var l=[];if(Object.keys(o).forEach(function(t){if(i._triggers[t]){var n=i.trigger(e,t,"void",r);n&&l.push(n)}}),l.length)return this._engine.markElementAsRemoved(this.id,e,!0,t),n&&Gi(l).onDone(function(){return i._engine.processLeaveNode(e)}),!0}return!1},e.prototype.prepareLeaveAnimationListeners=function(e){var t=this,n=this._elementListeners.get(e);if(n){var r=new Set;n.forEach(function(n){var i=n.name;if(!r.has(i)){r.add(i);var o=t._triggers[i].fallbackTransition,l=t._engine.statesByElement.get(e)[i]||ig,a=new rg("void"),s=new sg(t.id,i,e);t._engine.totalQueuedPlayers++,t._queue.push({element:e,triggerName:i,transition:o,fromState:l,toState:a,player:s,isFallbackTransition:!0})}})}},e.prototype.removeNode=function(e,t){var n=this,r=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,t,!0),!this.triggerLeaveAnimation(e,t,!0)){var i=!1;if(r.totalAnimations){var o=r.players.length?r.playersByQueriedElement.get(e):[];if(o&&o.length)i=!0;else for(var l=e;l=l.parentNode;)if(r.statesByElement.get(l)){i=!0;break}}this.prepareLeaveAnimationListeners(e),i?r.markElementAsRemoved(this.id,e,!1,t):(r.afterFlush(function(){return n.clearElementCache(e)}),r.destroyInnerAnimations(e),r._onRemovalComplete(e,t))}},e.prototype.insertNode=function(e,t){Do(e,this._hostClassName)},e.prototype.drainQueuedTransitions=function(e){var t=this,n=[];return this._queue.forEach(function(r){var i=r.player;if(!i.destroyed){var o=r.element,l=t._elementListeners.get(o);l&&l.forEach(function(t){if(t.name==r.triggerName){var n=Qi(o,r.triggerName,r.fromState.value,r.toState.value);n._data=e,$i(r.player,t.phase,n,t.callback)}}),i.markedForDestroy?t._engine.afterFlush(function(){i.destroy()}):n.push(r)}}),this._queue=[],n.sort(function(e,n){var r=e.transition.ast.depCount,i=n.transition.ast.depCount;return 0==r||0==i?r-i:t._engine.driver.containsElement(e.element,n.element)?1:-1})},e.prototype.destroy=function(e){this.players.forEach(function(e){return e.destroy()}),this._signalRemovalForInnerTriggers(this.hostElement,e)},e.prototype.elementContainsData=function(e){var t=!1;return this._elementListeners.has(e)&&(t=!0),t=!!this._queue.find(function(t){return t.element===e})||t},e}(),ag=function(){function e(e,t){this.driver=e,this._normalizer=t,this.players=[],this.newHostElements=new Map,this.playersByElement=new Map,this.playersByQueriedElement=new Map,this.statesByElement=new Map,this.disabledNodes=new Set,this.totalAnimations=0,this.totalQueuedPlayers=0,this._namespaceLookup={},this._namespaceList=[],this._flushFns=[],this._whenQuietFns=[],this.namespacesByHostElement=new Map,this.collectedEnterElements=[],this.collectedLeaveElements=[],this.onRemovalComplete=function(e,t){}}return e.prototype._onRemovalComplete=function(e,t){this.onRemovalComplete(e,t)},Object.defineProperty(e.prototype,"queuedPlayers",{get:function(){var e=[];return this._namespaceList.forEach(function(t){t.players.forEach(function(t){t.queued&&e.push(t)})}),e},enumerable:!0,configurable:!0}),e.prototype.createNamespace=function(e,t){var n=new lg(e,t,this);return t.parentNode?this._balanceNamespaceList(n,t):(this.newHostElements.set(t,n),this.collectEnterElement(t)),this._namespaceLookup[e]=n},e.prototype._balanceNamespaceList=function(e,t){var n=this._namespaceList.length-1;if(n>=0){for(var r=!1,i=n;i>=0;i--)if(this.driver.containsElement(this._namespaceList[i].hostElement,t)){this._namespaceList.splice(i+1,0,e),r=!0;break}r||this._namespaceList.splice(0,0,e)}else this._namespaceList.push(e);return this.namespacesByHostElement.set(t,e),e},e.prototype.register=function(e,t){var n=this._namespaceLookup[e];return n||(n=this.createNamespace(e,t)),n},e.prototype.registerTrigger=function(e,t,n){var r=this._namespaceLookup[e];r&&r.register(t,n)&&this.totalAnimations++},e.prototype.destroy=function(e,t){var n=this;if(e){var r=this._fetchNamespace(e);this.afterFlush(function(){n.namespacesByHostElement.delete(r.hostElement),delete n._namespaceLookup[e];var t=n._namespaceList.indexOf(r);t>=0&&n._namespaceList.splice(t,1)}),this.afterFlushAnimationsDone(function(){return r.destroy(t)})}},e.prototype._fetchNamespace=function(e){return this._namespaceLookup[e]},e.prototype.fetchNamespacesByElement=function(e){var t=new Set,n=this.statesByElement.get(e);if(n)for(var r=Object.keys(n),i=0;i<r.length;i++){var o=n[r[i]].namespaceId;if(o){var l=this._fetchNamespace(o);l&&t.add(l)}}return t},e.prototype.trigger=function(e,t,n,r){return!!So(t)&&(this._fetchNamespace(e).trigger(t,n,r),!0)},e.prototype.insertNode=function(e,t,n,r){if(So(t)){var i=t[ng];i&&i.setForRemoval&&(i.setForRemoval=!1),e&&this._fetchNamespace(e).insertNode(t,n),r&&this.collectEnterElement(t)}},e.prototype.collectEnterElement=function(e){this.collectedEnterElements.push(e)},e.prototype.markElementAsDisabled=function(e,t){t?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Do(e,Ym)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),Io(e,Ym))},e.prototype.removeNode=function(e,t,n){if(So(t)){var r=e?this._fetchNamespace(e):null;r?r.removeNode(t,n):this.markElementAsRemoved(e,t,!1,n)}else this._onRemovalComplete(t,n)},e.prototype.markElementAsRemoved=function(e,t,n,r){this.collectedLeaveElements.push(t),t[ng]={namespaceId:e,setForRemoval:r,hasAnimation:n,removedBeforeQueried:!1}},e.prototype.listen=function(e,t,n,r,i){return So(t)?this._fetchNamespace(e).listen(t,n,r,i):function(){}},e.prototype._buildInstruction=function(e,t,n,r){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,n,r,e.fromState.options,e.toState.options,t)},e.prototype.destroyInnerAnimations=function(e){var t=this,n=this.driver.query(e,Em,!0);n.forEach(function(e){return t.destroyActiveAnimationsForElement(e)}),0!=this.playersByQueriedElement.size&&(n=this.driver.query(e,Sm,!0)).forEach(function(e){return t.finishActiveQueriedAnimationOnElement(e)})},e.prototype.destroyActiveAnimationsForElement=function(e){var t=this.playersByElement.get(e);t&&t.forEach(function(e){e.queued?e.markedForDestroy=!0:e.destroy()});var n=this.statesByElement.get(e);n&&Object.keys(n).forEach(function(e){return n[e]=og})},e.prototype.finishActiveQueriedAnimationOnElement=function(e){var t=this.playersByQueriedElement.get(e);t&&t.forEach(function(e){return e.finish()})},e.prototype.whenRenderingDone=function(){var e=this;return new Promise(function(t){if(e.players.length)return Gi(e.players).onDone(function(){return t()});t()})},e.prototype.processLeaveNode=function(e){var t=this,n=e[ng];if(n&&n.setForRemoval){if(e[ng]=eg,n.namespaceId){this.destroyInnerAnimations(e);var r=this._fetchNamespace(n.namespaceId);r&&r.clearElementCache(e)}this._onRemovalComplete(e,n.setForRemoval)}this.driver.matchesElement(e,Xm)&&this.markElementAsDisabled(e,!1),this.driver.query(e,Xm,!0).forEach(function(n){t.markElementAsDisabled(e,!1)})},e.prototype.flush=function(e){var t=this;void 0===e&&(e=-1);var n=[];if(this.newHostElements.size&&(this.newHostElements.forEach(function(e,n){return t._balanceNamespaceList(e,n)}),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(var r=0;r<this.collectedEnterElements.length;r++)Do(this.collectedEnterElements[r],"ng-star-inserted");if(this._namespaceList.length&&(this.totalQueuedPlayers||this.collectedLeaveElements.length)){var i=[];try{n=this._flushAnimations(i,e)}finally{for(r=0;r<i.length;r++)i[r]()}}else for(r=0;r<this.collectedLeaveElements.length;r++)this.processLeaveNode(this.collectedLeaveElements[r]);if(this.totalQueuedPlayers=0,this.collectedEnterElements.length=0,this.collectedLeaveElements.length=0,this._flushFns.forEach(function(e){return e()}),this._flushFns=[],this._whenQuietFns.length){var o=this._whenQuietFns;this._whenQuietFns=[],n.length?Gi(n).onDone(function(){o.forEach(function(e){return e()})}):o.forEach(function(e){return e()})}},e.prototype.reportError=function(e){throw new Error("Unable to process animations due to the following failed trigger transitions\n "+e.join("\n"))},e.prototype._flushAnimations=function(e,t){var n=this,r=new Nm,i=[],o=new Map,l=[],a=new Map,s=new Map,u=new Map,c=new Set;this.disabledNodes.forEach(function(e){c.add(e);for(var t=n.driver.query(e,".ng-animate-queued",!0),r=0;r<t.length;r++)c.add(t[r])});var d=eo(),p=Array.from(this.statesByElement.keys()),f=ko(p,this.collectedEnterElements),h=new Map,m=0;f.forEach(function(e,t){var n="ng-enter"+m++;h.set(t,n),e.forEach(function(e){return Do(e,n)})});for(var g=[],y=new Set,v=new Set,b=0;b<this.collectedLeaveElements.length;b++)(L=(A=this.collectedLeaveElements[b])[ng])&&L.setForRemoval&&(g.push(A),y.add(A),L.hasAnimation?this.driver.query(A,".ng-star-inserted",!0).forEach(function(e){return y.add(e)}):v.add(A));var _=new Map,w=ko(p,Array.from(y));w.forEach(function(e,t){var n="ng-leave"+m++;_.set(t,n),e.forEach(function(e){return Do(e,n)})}),e.push(function(){f.forEach(function(e,t){var n=h.get(t);e.forEach(function(e){return Io(e,n)})}),w.forEach(function(e,t){var n=_.get(t);e.forEach(function(e){return Io(e,n)})}),g.forEach(function(e){n.processLeaveNode(e)})});for(var x=[],C=[],E=this._namespaceList.length-1;E>=0;E--)this._namespaceList[E].drainQueuedTransitions(t).forEach(function(e){var t=e.player;x.push(t);var o=e.element;if(d&&n.driver.containsElement(d,o)){var c=_.get(o),p=h.get(o),f=n._buildInstruction(e,r,p,c);if(f.errors&&f.errors.length)C.push(f);else{if(e.isFallbackTransition)return t.onStart(function(){return ao(o,f.fromStyles)}),t.onDestroy(function(){return lo(o,f.toStyles)}),void i.push(t);f.timelines.forEach(function(e){return e.stretchStartingKeyframe=!0}),r.append(o,f.timelines),l.push({instruction:f,player:t,element:o}),f.queriedElements.forEach(function(e){return Yi(a,e,[]).push(t)}),f.preStyleProps.forEach(function(e,t){var n=Object.keys(e);if(n.length){var r=s.get(t);r||s.set(t,r=new Set),n.forEach(function(e){return r.add(e)})}}),f.postStyleProps.forEach(function(e,t){var n=Object.keys(e),r=u.get(t);r||u.set(t,r=new Set),n.forEach(function(e){return r.add(e)})})}}else t.destroy()});if(C.length){var S=[];C.forEach(function(e){S.push("@"+e.triggerName+" has failed due to:\n"),e.errors.forEach(function(e){return S.push("- "+e+"\n")})}),x.forEach(function(e){return e.destroy()}),this.reportError(S)}var O=new Map,T=new Map;l.forEach(function(e){var t=e.element;r.has(t)&&(T.set(t,t),n._beforeAnimationBuild(e.player.namespaceId,e.instruction,O))}),i.forEach(function(e){var t=e.element;n._getPreviousPlayers(t,!1,e.namespaceId,e.triggerName,null).forEach(function(e){Yi(O,t,[]).push(e),e.destroy()})});var k=g.filter(function(e){return Mo(e,s,u)}),D=new Map;To(D,this.driver,v,u,Rs.AUTO_STYLE).forEach(function(e){Mo(e,s,u)&&k.push(e)});var I=new Map;f.forEach(function(e,t){To(I,n.driver,new Set(e),s,Rs["\u0275PRE_STYLE"])}),k.forEach(function(e){var t=D.get(e),n=I.get(e);D.set(e,Object(bl.__assign)({},t,n))});var R=[],M=[],P={};l.forEach(function(e){var t=e.element,l=e.player,a=e.instruction;if(r.has(t)){if(c.has(t))return l.onDestroy(function(){return lo(t,a.toStyles)}),void i.push(l);var s=P;if(T.size>1){for(var u=t,d=[];u=u.parentNode;){var p=T.get(u);if(p){s=p;break}d.push(u)}d.forEach(function(e){return T.set(e,s)})}var f=n._buildAnimation(l.namespaceId,a,O,o,I,D);if(l.setRealPlayer(f),s===P)R.push(l);else{var h=n.playersByElement.get(s);h&&h.length&&(l.parentPlayer=Gi(h)),i.push(l)}}else ao(t,a.fromStyles),l.onDestroy(function(){return lo(t,a.toStyles)}),M.push(l),c.has(t)&&i.push(l)}),M.forEach(function(e){var t=o.get(e.element);if(t&&t.length){var n=Gi(t);e.setRealPlayer(n)}}),i.forEach(function(e){e.parentPlayer?e.syncPlayerEvents(e.parentPlayer):e.destroy()});for(var N=0;N<g.length;N++){var A,L=(A=g[N])[ng];if(Io(A,"ng-leave"),!L||!L.hasAnimation){var F=[];if(a.size){var j=a.get(A);j&&j.length&&F.push.apply(F,j);for(var V=this.driver.query(A,Sm,!0),z=0;z<V.length;z++){var B=a.get(V[z]);B&&B.length&&F.push.apply(F,B)}}var H=F.filter(function(e){return!e.destroyed});H.length?function(e,t,n){Gi(H).onDone(function(){return e.processLeaveNode(t)})}(this,A):this.processLeaveNode(A)}}return g.length=0,R.forEach(function(e){n.players.push(e),e.onDone(function(){e.destroy();var t=n.players.indexOf(e);n.players.splice(t,1)}),e.play()}),R},e.prototype.elementContainsData=function(e,t){var n=!1,r=t[ng];return r&&r.setForRemoval&&(n=!0),this.playersByElement.has(t)&&(n=!0),this.playersByQueriedElement.has(t)&&(n=!0),this.statesByElement.has(t)&&(n=!0),this._fetchNamespace(e).elementContainsData(t)||n},e.prototype.afterFlush=function(e){this._flushFns.push(e)},e.prototype.afterFlushAnimationsDone=function(e){this._whenQuietFns.push(e)},e.prototype._getPreviousPlayers=function(e,t,n,r,i){var o=[];if(t){var l=this.playersByQueriedElement.get(e);l&&(o=l)}else{var a=this.playersByElement.get(e);if(a){var s=!i||"void"==i;a.forEach(function(e){e.queued||(s||e.triggerName==r)&&o.push(e)})}}return(n||r)&&(o=o.filter(function(e){return!(n&&n!=e.namespaceId||r&&r!=e.triggerName)})),o},e.prototype._beforeAnimationBuild=function(e,t,n){for(var r=t.element,i=t.isRemovalTransition?void 0:e,o=t.isRemovalTransition?void 0:t.triggerName,l=function(e){var l=e.element,s=l!==r,u=Yi(n,l,[]);a._getPreviousPlayers(l,s,i,o,t.toState).forEach(function(e){var t=e.getRealPlayer();t.beforeDestroy&&t.beforeDestroy(),e.destroy(),u.push(e)})},a=this,s=0,u=t.timelines;s<u.length;s++)l(u[s]);ao(r,t.fromStyles)},e.prototype._buildAnimation=function(e,t,n,r,i,o){var l=this,a=t.triggerName,s=t.element,u=[],c=new Set,d=new Set,p=t.timelines.map(function(t){var p=t.element;c.add(p);var f=p[ng];if(f&&f.removedBeforeQueried)return new Rs.NoopAnimationPlayer;var h=p!==s,m=function(e){var t=[];return Ro((n.get(p)||Jm).map(function(e){return e.getRealPlayer()}),t),t}().filter(function(e){return!!e.element&&e.element===p}),g=i.get(p),y=o.get(p),v=Ki(0,l._normalizer,0,t.keyframes,g,y),b=l._buildPlayer(t,v,m);if(t.subTimeline&&r&&d.add(p),h){var _=new sg(e,a,p);_.setRealPlayer(b),u.push(_)}return b});u.forEach(function(e){Yi(l.playersByQueriedElement,e.element,[]).push(e),e.onDone(function(){return function(e,t,n){var r;if(e instanceof Map){if(r=e.get(t)){if(r.length){var i=r.indexOf(n);r.splice(i,1)}0==r.length&&e.delete(t)}}else(r=e[t])&&(r.length&&(i=r.indexOf(n),r.splice(i,1)),0==r.length&&delete e[t]);return r}(l.playersByQueriedElement,e.element,e)})}),c.forEach(function(e){return Do(e,"ng-animating")});var f=Gi(p);return f.onDestroy(function(){c.forEach(function(e){return Io(e,"ng-animating")}),lo(s,t.toStyles)}),d.forEach(function(e){Yi(r,e,[]).push(f)}),f},e.prototype._buildPlayer=function(e,t,n){return t.length>0?this.driver.animate(e.element,t,e.duration,e.delay,e.easing,n):new Rs.NoopAnimationPlayer},e}(),sg=function(){function e(e,t,n){this.namespaceId=e,this.triggerName=t,this.element=n,this._player=new Rs.NoopAnimationPlayer,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1}return Object.defineProperty(e.prototype,"queued",{get:function(){return 0==this._containsRealPlayer},enumerable:!0,configurable:!0}),e.prototype.setRealPlayer=function(e){var t=this;this._containsRealPlayer||(this._player=e,Object.keys(this._queuedCallbacks).forEach(function(n){t._queuedCallbacks[n].forEach(function(t){return $i(e,n,void 0,t)})}),this._queuedCallbacks={},this._containsRealPlayer=!0)},e.prototype.getRealPlayer=function(){return this._player},e.prototype.syncPlayerEvents=function(e){var t=this,n=this._player;n.triggerCallback&&e.onStart(function(){return n.triggerCallback("start")}),e.onDone(function(){return t.finish()}),e.onDestroy(function(){return t.destroy()})},e.prototype._queueEvent=function(e,t){Yi(this._queuedCallbacks,e,[]).push(t)},e.prototype.onDone=function(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)},e.prototype.onStart=function(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)},e.prototype.onDestroy=function(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)},e.prototype.init=function(){this._player.init()},e.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},e.prototype.play=function(){!this.queued&&this._player.play()},e.prototype.pause=function(){!this.queued&&this._player.pause()},e.prototype.restart=function(){!this.queued&&this._player.restart()},e.prototype.finish=function(){this._player.finish()},e.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},e.prototype.reset=function(){!this.queued&&this._player.reset()},e.prototype.setPosition=function(e){this.queued||this._player.setPosition(e)},e.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(e.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),e.prototype.triggerCallback=function(e){var t=this._player;t.triggerCallback&&t.triggerCallback(e)},e}(),ug="$$classes",cg=function(){function e(e,t){var n=this;this._driver=e,this._triggerCache={},this.onRemovalComplete=function(e,t){},this._transitionEngine=new ag(e,t),this._timelineEngine=new Qm(e,t),this._transitionEngine.onRemovalComplete=function(e,t){return n.onRemovalComplete(e,t)}}return e.prototype.registerTrigger=function(e,t,n,r,i){var o=e+"-"+r,l=this._triggerCache[o];if(!l){var a=[],s=go(this._driver,i,a);if(a.length)throw new Error('The animation trigger "'+r+'" has failed to build due to the following errors:\n - '+a.join("\n - "));l=new $m(r,s),this._triggerCache[o]=l}this._transitionEngine.registerTrigger(t,r,l)},e.prototype.register=function(e,t){this._transitionEngine.register(e,t)},e.prototype.destroy=function(e,t){this._transitionEngine.destroy(e,t)},e.prototype.onInsert=function(e,t,n,r){this._transitionEngine.insertNode(e,t,n,r)},e.prototype.onRemove=function(e,t,n){this._transitionEngine.removeNode(e,t,n)},e.prototype.disableAnimations=function(e,t){this._transitionEngine.markElementAsDisabled(e,t)},e.prototype.process=function(e,t,n,r){if("@"==n.charAt(0)){var i=Xi(n);this._timelineEngine.command(i[0],t,i[1],r)}else this._transitionEngine.trigger(e,t,n,r)},e.prototype.listen=function(e,t,n,r,i){if("@"==n.charAt(0)){var o=Xi(n);return this._timelineEngine.listen(o[0],t,o[1],i)}return this._transitionEngine.listen(e,t,n,r,i)},e.prototype.flush=function(e){void 0===e&&(e=-1),this._transitionEngine.flush(e)},Object.defineProperty(e.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),e.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},e}(),dg=function(){function e(e,t,n,r){void 0===r&&(r=[]);var i=this;this.element=e,this.keyframes=t,this.options=n,this.previousPlayers=r,this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._initialized=!1,this._finished=!1,this._started=!1,this._destroyed=!1,this.time=0,this.parentPlayer=null,this.previousStyles={},this.currentSnapshot={},this._duration=n.duration,this._delay=n.delay||0,this.time=this._duration+this._delay,function(e,t){return 0===e||0===t}(this._duration,this._delay)&&r.forEach(function(e){var t=e.currentSnapshot;Object.keys(t).forEach(function(e){return i.previousStyles[e]=t[e]})})}return e.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},e.prototype.init=function(){this._buildPlayer(),this._preparePlayerBeforeStart()},e.prototype._buildPlayer=function(){var e=this;if(!this._initialized){this._initialized=!0;var t=this.keyframes.map(function(e){return oo(e,!1)}),n=Object.keys(this.previousStyles);if(n.length&&t.length){var r=t[0],i=[];if(n.forEach(function(t){r.hasOwnProperty(t)||i.push(t),r[t]=e.previousStyles[t]}),i.length)for(var o=this,l=function(){var e=t[a];i.forEach(function(t){e[t]=Po(o.element,t)})},a=1;a<t.length;a++)l()}this.domPlayer=this._triggerWebAnimation(this.element,t,this.options),this._finalKeyframe=t.length?t[t.length-1]:{},this.domPlayer.addEventListener("finish",function(){return e._onFinish()})}},e.prototype._preparePlayerBeforeStart=function(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()},e.prototype._triggerWebAnimation=function(e,t,n){return e.animate(t,n)},e.prototype.onStart=function(e){this._onStartFns.push(e)},e.prototype.onDone=function(e){this._onDoneFns.push(e)},e.prototype.onDestroy=function(e){this._onDestroyFns.push(e)},e.prototype.play=function(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[],this._started=!0),this.domPlayer.play()},e.prototype.pause=function(){this.init(),this.domPlayer.pause()},e.prototype.finish=function(){this.init(),this._onFinish(),this.domPlayer.finish()},e.prototype.reset=function(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1},e.prototype._resetDomPlayerState=function(){this.domPlayer&&this.domPlayer.cancel()},e.prototype.restart=function(){this.reset(),this.play()},e.prototype.hasStarted=function(){return this._started},e.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])},e.prototype.setPosition=function(e){this.domPlayer.currentTime=e*this.time},e.prototype.getPosition=function(){return this.domPlayer.currentTime/this.time},Object.defineProperty(e.prototype,"totalTime",{get:function(){return this._delay+this._duration},enumerable:!0,configurable:!0}),e.prototype.beforeDestroy=function(){var e=this,t={};this.hasStarted()&&Object.keys(this._finalKeyframe).forEach(function(n){"offset"!=n&&(t[n]=e._finished?e._finalKeyframe[n]:Po(e.element,n))}),this.currentSnapshot=t},e.prototype.triggerCallback=function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0},e}(),pg=function(){function e(){}return e.prototype.validateStyleProperty=function(e){return Ji(e)},e.prototype.matchesElement=function(e,t){return ym(e,t)},e.prototype.containsElement=function(e,t){return vm(e,t)},e.prototype.query=function(e,t,n){return bm(e,t,n)},e.prototype.computeStyle=function(e,t,n){return window.getComputedStyle(e)[t]},e.prototype.animate=function(e,t,n,r,i,o){void 0===o&&(o=[]);var l={duration:n,delay:r,fill:0==r?"both":"forwards"};i&&(l.easing=i);var a=o.filter(function(e){return e instanceof dg});return new dg(e,t,l,a)},e}(),fg=function(e){function t(t,n){var r=e.call(this)||this;return r._nextAnimationId=0,r._renderer=t.createRenderer(n.body,{id:"0",encapsulation:al.ViewEncapsulation.None,styles:[],data:{animation:[]}}),r}return Object(bl.__extends)(t,e),t.prototype.build=function(e){var t=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(e)?Object(Rs.sequence)(e):e;return No(this._renderer,null,t,"register",[n]),new hg(t,this._renderer)},t}(Rs.AnimationBuilder),hg=function(e){function t(t,n){var r=e.call(this)||this;return r._id=t,r._renderer=n,r}return Object(bl.__extends)(t,e),t.prototype.create=function(e,t){return new mg(this._id,e,t||{},this._renderer)},t}(Rs.AnimationFactory),mg=function(){function e(e,t,n,r){this.id=e,this.element=t,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return e.prototype._listen=function(e,t){return this._renderer.listen(this.element,"@@"+this.id+":"+e,t)},e.prototype._command=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return No(this._renderer,this.element,this.id,e,t)},e.prototype.onDone=function(e){this._listen("done",e)},e.prototype.onStart=function(e){this._listen("start",e)},e.prototype.onDestroy=function(e){this._listen("destroy",e)},e.prototype.init=function(){this._command("init")},e.prototype.hasStarted=function(){return this._started},e.prototype.play=function(){this._command("play"),this._started=!0},e.prototype.pause=function(){this._command("pause")},e.prototype.restart=function(){this._command("restart")},e.prototype.finish=function(){this._command("finish")},e.prototype.destroy=function(){this._command("destroy")},e.prototype.reset=function(){this._command("reset")},e.prototype.setPosition=function(e){this._command("setPosition",e)},e.prototype.getPosition=function(){return 0},e}(),gg=function(){function e(e,t,n){this.delegate=e,this.engine=t,this._zone=n,this._currentId=0,this._microtaskId=1,this._animationCallbacksBuffer=[],this._rendererCache=new Map,this._cdRecurDepth=0,t.onRemovalComplete=function(e,t){t&&t.parentNode(e)&&t.removeChild(e.parentNode,e)}}return e.prototype.createRenderer=function(e,t){var n=this,r=this.delegate.createRenderer(e,t);if(!(e&&t&&t.data&&t.data.animation)){var i=this._rendererCache.get(r);return i||(i=new yg("",r,this.engine),this._rendererCache.set(r,i)),i}var o=t.id,l=t.id+"-"+this._currentId;return this._currentId++,this.engine.register(l,e),t.data.animation.forEach(function(t){return n.engine.registerTrigger(o,l,e,t.name,t)}),new vg(this,l,r,this.engine)},e.prototype.begin=function(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()},e.prototype._scheduleCountTask=function(){var e=this;Zone.current.scheduleMicroTask("incremenet the animation microtask",function(){return e._microtaskId++})},e.prototype.scheduleListenerCallback=function(e,t,n){var r=this;e>=0&&e<this._microtaskId?this._zone.run(function(){return t(n)}):(0==this._animationCallbacksBuffer.length&&Promise.resolve(null).then(function(){r._zone.run(function(){r._animationCallbacksBuffer.forEach(function(e){(0,e[0])(e[1])}),r._animationCallbacksBuffer=[]})}),this._animationCallbacksBuffer.push([t,n]))},e.prototype.end=function(){var e=this;this._cdRecurDepth--,0==this._cdRecurDepth&&this._zone.runOutsideAngular(function(){e._scheduleCountTask(),e.engine.flush(e._microtaskId)}),this.delegate.end&&this.delegate.end()},e.prototype.whenRenderingDone=function(){return this.engine.whenRenderingDone()},e}(),yg=function(){function e(e,t,n){this.namespaceId=e,this.delegate=t,this.engine=n,this.destroyNode=this.delegate.destroyNode?function(e){return t.destroyNode(e)}:null}return Object.defineProperty(e.prototype,"data",{get:function(){return this.delegate.data},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this.engine.destroy(this.namespaceId,this.delegate),this.delegate.destroy()},e.prototype.createElement=function(e,t){return this.delegate.createElement(e,t)},e.prototype.createComment=function(e){return this.delegate.createComment(e)},e.prototype.createText=function(e){return this.delegate.createText(e)},e.prototype.appendChild=function(e,t){this.delegate.appendChild(e,t),this.engine.onInsert(this.namespaceId,t,e,!1)},e.prototype.insertBefore=function(e,t,n){this.delegate.insertBefore(e,t,n),this.engine.onInsert(this.namespaceId,t,e,!0)},e.prototype.removeChild=function(e,t){this.engine.onRemove(this.namespaceId,t,this.delegate)},e.prototype.selectRootElement=function(e){return this.delegate.selectRootElement(e)},e.prototype.parentNode=function(e){return this.delegate.parentNode(e)},e.prototype.nextSibling=function(e){return this.delegate.nextSibling(e)},e.prototype.setAttribute=function(e,t,n,r){this.delegate.setAttribute(e,t,n,r)},e.prototype.removeAttribute=function(e,t,n){this.delegate.removeAttribute(e,t,n)},e.prototype.addClass=function(e,t){this.delegate.addClass(e,t)},e.prototype.removeClass=function(e,t){this.delegate.removeClass(e,t)},e.prototype.setStyle=function(e,t,n,r){this.delegate.setStyle(e,t,n,r)},e.prototype.removeStyle=function(e,t,n){this.delegate.removeStyle(e,t,n)},e.prototype.setProperty=function(e,t,n){"@"==t.charAt(0)&&"@.disabled"==t?this.disableAnimations(e,!!n):this.delegate.setProperty(e,t,n)},e.prototype.setValue=function(e,t){this.delegate.setValue(e,t)},e.prototype.listen=function(e,t,n){return this.delegate.listen(e,t,n)},e.prototype.disableAnimations=function(e,t){this.engine.disableAnimations(e,t)},e}(),vg=function(e){function t(t,n,r,i){var o=e.call(this,n,r,i)||this;return o.factory=t,o.namespaceId=n,o}return Object(bl.__extends)(t,e),t.prototype.setProperty=function(e,t,n){"@"==t.charAt(0)?"."==t.charAt(1)&&"@.disabled"==t?this.disableAnimations(e,n=void 0===n||!!n):this.engine.process(this.namespaceId,e,t.substr(1),n):this.delegate.setProperty(e,t,n)},t.prototype.listen=function(e,t,n){var r=this;if("@"==t.charAt(0)){var i=function(e){switch(e){case"body":return document.body;case"document":return document;case"window":return window;default:return e}}(e),o=t.substr(1),l="";return"@"!=o.charAt(0)&&(o=(a=function(e){var t=e.indexOf(".");return[e.substring(0,t),e.substr(t+1)]}(o))[0],l=a[1]),this.engine.listen(this.namespaceId,i,o,l,function(e){r.factory.scheduleListenerCallback(e._data||-1,n,e)})}return this.delegate.listen(e,t,n);var a},t}(yg),bg=function(e){function t(t,n){return e.call(this,t,n)||this}return Object(bl.__extends)(t,e),t}(cg),_g=function(){},wg="success",xg=new al.InjectionToken("IndexedDBBackend"),Cg=new al.InjectionToken("IDB_SCHEMA"),Eg=function(){function e(e,t){this.changes=new ml.Subject,this._schema=t,this._idb=e}return e.prototype._mapRecord=function(e){return function(t){return e.primaryKey||(t.record.$key=t.$key),t.record}},e.prototype._upgradeDB=function(e,t){for(var n in this._schema.stores)t.objectStoreNames.contains(n)&&t.deleteObjectStore(n),this._createObjectStore(t,n,this._schema.stores[n]);e.next(t),e.complete()},e.prototype._createObjectStore=function(e,t,n){e.createObjectStore(t,{autoIncrement:!0,keyPath:n.primaryKey})},e.prototype.open=function(e,t,n){var r=this;void 0===t&&(t=1);var i=this._idb;return gl.a.create(function(t){var n=i.open(e,r._schema.version),o=function(e){t.next(e.target.result),t.complete()},l=function(e){console.log(e),t.error(e)},a=function(e){r._upgradeDB(t,e.target.result)};return n.addEventListener(wg,o),n.addEventListener("error",l),n.addEventListener("upgradeneeded",a),function(){n.removeEventListener(wg,o),n.removeEventListener("error",l),n.removeEventListener("upgradeneeded",a)}})},e.prototype.deleteDatabase=function(e){var t=this;return new gl.a(function(n){var r=t._idb.deleteDatabase(e),i=function(e){n.next(null),n.complete()},o=function(e){return n.error(e)};return r.addEventListener(wg,i),r.addEventListener("error",o),function(){r.removeEventListener(wg,i),r.removeEventListener("error",o)}})},e.prototype.insert=function(e,t,n){var r=this;void 0===n&&(n=!0);var i=this.executeWrite(e,"put",t);return function(e,t,n){return x(e,t,n)(this)}.call(i,function(e){return n?r.changes.next({type:"DB_INSERT",payload:e}):{}})},e.prototype.get=function(e,t){var n=this,r=this.open(this._schema.name);return jo.call(r,function(r){return new gl.a(function(i){n._mapRecord(n._schema.stores[e]);var o=r.transaction([e],"readonly"),l=o.objectStore(e).get(t),a=function(e){return i.error(e)},s=function(){return i.complete()},u=function(e){return i.next(l.result)};return o.addEventListener("complete",s),o.addEventListener("error",a),l.addEventListener(wg,u),l.addEventListener("error",a),function(){l.removeEventListener(wg,u),l.removeEventListener("error",a),o.removeEventListener("complete",s),o.removeEventListener("error",a)}})})},e.prototype.query=function(e,t){var n=this.open(this._schema.name);return jo.call(n,function(n){return new gl.a(function(r){var i=n.transaction([e],"readonly"),o=i.objectStore(e).openCursor(),l=function(e){return r.error(e)},a=function(e){var n=e.target.result;n?(t?t(n.value)&&r.next(n.value):r.next(n.value),n.continue()):r.complete()};return i.addEventListener("error",l),o.addEventListener(wg,a),o.addEventListener("error",l),function(){o.removeEventListener(wg,a),o.removeEventListener("error",l),i.removeEventListener("error",l)}})})},e.prototype.executeWrite=function(e,t,n){var r=this,i=this.open(this._schema.name);return jo.call(i,function(i){return new gl.a(function(o){var l=r._schema.stores[e],a=r._mapRecord(l),s=i.transaction([e],"readwrite"),u=s.objectStore(e),c=function(e){return o.error(e)},d=function(){return o.complete()};s.addEventListener("complete",d),s.addEventListener("error",c);var p=jo.call(Ds(n),function(e){return new gl.a(function(n){var r;if(l.primaryKey)r=u[t](e);else{var i=e.$key,o=Object.assign({},e);delete o.key,r=u[t](o,i)}r.addEventListener(wg,function(){n.next(a({$key:r.result,record:e}))}),r.addEventListener("error",function(e){n.error(e)})})}).subscribe(o);return function(){p.unsubscribe(),s.removeEventListener("complete",d),s.removeEventListener("error",c)}})})},e.prototype.compare=function(e,t){return this._idb.cmp(e,t)},e}(),Sg=function(){function e(){}return e.provideDB=function(t){return{ngModule:e,providers:[{provide:Cg,useValue:t}]}},e}(),Og=(n("5jKg"),n("PAZ8")),Tg=new al.InjectionToken("mat-autocomplete-scroll-strategy"),kg=function(){},Dg=new al.InjectionToken("mat-menu-default-options"),Ig=new al.InjectionToken("mat-menu-scroll-strategy"),Rg=function(){},Mg=new al.InjectionToken("mat-select-scroll-strategy"),Pg=function(){},Ng=function(){return function(){this.changes=new ml.Subject,this.itemsPerPageLabel="Items per page:",this.nextPageLabel="Next page",this.previousPageLabel="Previous page",this.getRangeLabel=function(e,t,n){if(0==n||0==t)return"0 of "+n;var r=e*t;return r+1+" - "+(r<(n=Math.max(n,0))?Math.min(r+t,n):r+t)+" of "+n}}}(),Ag=function(){},Lg=function(){return function(){this.changes=new ml.Subject,this.sortButtonLabel=function(e){return"Change sorting for "+e},this.sortDescriptionLabel=function(e,t){return"Sorted by "+e+" "+("asc"==t?"ascending":"descending")}}}(),Fg=function(){},jg=function(){},Vg=function(){return function(){this.changes=new ml.Subject,this.optionalLabel="Optional"}}(),zg=function(){},Bg=n("uIf7"),Hg=n("PR+T"),Wg=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new qg(e))},e}(),qg=function(e){function t(){e.apply(this,arguments)}return Object(bl.__extends)(t,e),t.prototype._next=function(e){Object(Hg.a)()},t}(Yl.a),Ug=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new Gg(e))},e}(),Gg=function(e){function t(t){e.call(this,t)}return Object(bl.__extends)(t,e),t.prototype._next=function(e){this.destination.next(Og.a.createNext(e))},t.prototype._error=function(e){var t=this.destination;t.next(Og.a.createError(e)),t.complete()},t.prototype._complete=function(){var e=this.destination;e.next(Og.a.createComplete()),e.complete()},t}(Yl.a),Kg=function(){function e(){this.size=0,this._values=[],this._keys=[]}return e.prototype.get=function(e){var t=this._keys.indexOf(e);return-1===t?void 0:this._values[t]},e.prototype.set=function(e,t){var n=this._keys.indexOf(e);return-1===n?(this._keys.push(e),this._values.push(t),this.size++):this._values[n]=t,this},e.prototype.delete=function(e){var t=this._keys.indexOf(e);return-1!==t&&(this._values.splice(t,1),this._keys.splice(t,1),this.size--,!0)},e.prototype.clear=function(){this._keys.length=0,this._values.length=0,this.size=0},e.prototype.forEach=function(e,t){for(var n=0;n<this.size;n++)e.call(t,this._values[n],this._keys[n])},e}(),$g=_s.a.Map||function(){return Kg}(),Zg=function(){function e(){this.values={}}return e.prototype.delete=function(e){return this.values[e]=null,!0},e.prototype.set=function(e,t){return this.values[e]=t,this},e.prototype.get=function(e){return this.values[e]},e.prototype.forEach=function(e,t){var n=this.values;for(var r in n)n.hasOwnProperty(r)&&null!==n[r]&&e.call(t,n[r],r)},e.prototype.clear=function(){this.values={}},e}(),Qg=function(){function e(e,t,n,r){this.keySelector=e,this.elementSelector=t,this.durationSelector=n,this.subjectSelector=r}return e.prototype.call=function(e,t){return t.subscribe(new Yg(e,this.keySelector,this.elementSelector,this.durationSelector,this.subjectSelector))},e}(),Yg=function(e){function t(t,n,r,i,o){e.call(this,t),this.keySelector=n,this.elementSelector=r,this.durationSelector=i,this.subjectSelector=o,this.groups=null,this.attemptedToUnsubscribe=!1,this.count=0}return Object(bl.__extends)(t,e),t.prototype._next=function(e){var t;try{t=this.keySelector(e)}catch(e){return void this.error(e)}this._group(e,t)},t.prototype._group=function(e,t){var n=this.groups;n||(n=this.groups="string"==typeof t?new Zg:new $g);var r,i=n.get(t);if(this.elementSelector)try{r=this.elementSelector(e)}catch(e){this.error(e)}else r=e;if(!i){i=this.subjectSelector?this.subjectSelector():new ml.Subject,n.set(t,i);var o=new Jg(t,i,this);if(this.destination.next(o),this.durationSelector){var l=void 0;try{l=this.durationSelector(new Jg(t,i))}catch(e){return void this.error(e)}this.add(l.subscribe(new Xg(t,i,this)))}}i.closed||i.next(r)},t.prototype._error=function(e){var t=this.groups;t&&(t.forEach(function(t,n){t.error(e)}),t.clear()),this.destination.error(e)},t.prototype._complete=function(){var e=this.groups;e&&(e.forEach(function(e,t){e.complete()}),e.clear()),this.destination.complete()},t.prototype.removeGroup=function(e){this.groups.delete(e)},t.prototype.unsubscribe=function(){this.closed||(this.attemptedToUnsubscribe=!0,0===this.count&&e.prototype.unsubscribe.call(this))},t}(Yl.a),Xg=function(e){function t(t,n,r){e.call(this,n),this.key=t,this.group=n,this.parent=r}return Object(bl.__extends)(t,e),t.prototype._next=function(e){this.complete()},t.prototype._unsubscribe=function(){var e=this.parent,t=this.key;this.key=this.parent=null,e&&e.removeGroup(t)},t}(Yl.a),Jg=function(e){function t(t,n,r){e.call(this),this.key=t,this.groupSubject=n,this.refCountSubscription=r}return Object(bl.__extends)(t,e),t.prototype._subscribe=function(e){var t=new Cl.a,n=this.refCountSubscription,r=this.groupSubject;return n&&!n.closed&&t.add(new ey(n)),t.add(r.subscribe(e)),t},t}(gl.a),ey=function(e){function t(t){e.call(this),this.parent=t,t.count++}return Object(bl.__extends)(t,e),t.prototype.unsubscribe=function(){var t=this.parent;t.closed||this.closed||(e.prototype.unsubscribe.call(this),t.count-=1,0===t.count&&t.attemptedToUnsubscribe&&t.unsubscribe())},t}(Cl.a),ty=function(){function e(e,t){this.project=e,this.resultSelector=t}return e.prototype.call=function(e,t){return t.subscribe(new ny(e,this.project,this.resultSelector))},e}(),ny=function(e){function t(t,n,r){e.call(this,t),this.project=n,this.resultSelector=r,this.hasSubscription=!1,this.hasCompleted=!1,this.index=0}return Object(bl.__extends)(t,e),t.prototype._next=function(e){this.hasSubscription||this.tryNext(e)},t.prototype.tryNext=function(e){var t=this.index++,n=this.destination;try{var r=this.project(e,t);this.hasSubscription=!0,this.add(Object(Dl.a)(this,r,e,t))}catch(e){n.error(e)}},t.prototype._complete=function(){this.hasCompleted=!0,this.hasSubscription||this.destination.complete()},t.prototype.notifyNext=function(e,t,n,r,i){var o=this.destination;this.resultSelector?this.trySelectResult(e,t,n,r):o.next(t)},t.prototype.trySelectResult=function(e,t,n,r){var i=this.resultSelector,o=this.destination;try{var l=i(e,t,n,r);o.next(l)}catch(e){o.error(e)}},t.prototype.notifyError=function(e){this.destination.error(e)},t.prototype.notifyComplete=function(e){this.remove(e),this.hasSubscription=!1,this.hasCompleted&&this.destination.complete()},t}(kl.a),ry=function(){function e(){}return e.prototype.call=function(e,t){return t.subscribe(new iy(e))},e}(),iy=function(e){function t(t){e.call(this,t)}return Object(bl.__extends)(t,e),t.prototype._next=function(e){e.observe(this.destination)},t}(Yl.a),oy=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),ly="__@ngrx/effects__",ay=Object(Yp.x)(function(e){return e.constructor[ly]||[]},Go),sy="ngrxOnRunEffects",uy=function(e){function t(t){var n=e.call(this)||this;return t&&(n.source=t),n}return oy(t,e),t.prototype.lift=function(e){var n=new t;return n.source=this,n.operator=e,n},t.prototype.ofType=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return ru.a.call(this,function(t){return e.some(function(e){return e===t.type})})},t}(gl.a),cy=(new al.InjectionToken("ngrx/effects: Immediate Effects"),new al.InjectionToken("ngrx/effects: Root Effects")),dy=(new al.InjectionToken("ngrx/effects: Feature Effects"),new al.InjectionToken("Browser Console")),py=function(){function e(e){this.console=e}return e.prototype.report=function(e,t){this.console.group(e);for(var n in t)this.console.error(n+":",t[n]);this.console.groupEnd()},e}(),fy=function(e){function t(t){var n=e.call(this)||this;return n.errorReporter=t,n}return oy(t,e),t.prototype.addEffects=function(e){this.next(e)},t.prototype.toActions=function(){var e=this;return jo.call(function(e,t,n,r){return function(e,t,n,r){return function(i){return i.lift(new Qg(e,t,n,r))}}(e,t,n,r)(this)}.call(this,Go),function(t){return function(){return function(e){return e.lift(new ry)}(this)}.call(ru.a.call(iu.a.call(function(e,t){return function(e,t){return function(n){return n.lift(new ty(e,t))}}(e,t)(this)}.call(t,Ko),function(t){return function(e,t){!function(e,t){if("E"===e.notification.kind){var n="Effect "+$o(e)+" threw an error";t.report(n,{Source:e.sourceInstance,Effect:e.effect,Error:e.notification.error,Notification:e.notification})}}(e,t),function(e,t){if("N"===e.notification.kind){var n=e.notification.value;if(!n||!n.type||"string"!=typeof n.type){var r="Effect "+$o(e)+" dispatched an invalid action";t.report(r,{Source:e.sourceInstance,Effect:e.effect,Dispatched:n,Notification:e.notification})}}}(e,t)}(t,e.errorReporter),t.notification}),function(e){return"N"===e.kind}))})},t}(ml.Subject),hy=function(){function e(e,t){this.effectSources=e,this.store=t,this.effectsSubscription=null}return e.prototype.start=function(){this.effectsSubscription||(this.effectsSubscription=this.effectSources.toActions().subscribe(this.store))},e.prototype.ngOnDestroy=function(){this.effectsSubscription&&(this.effectsSubscription.unsubscribe(),this.effectsSubscription=null)},e}(),my="@ngrx/effects/init",gy=function(){function e(e,t,n,r,i){this.sources=e,t.start(),r.forEach(function(t){return e.addEffects(t)}),n.dispatch({type:my})}return e.prototype.addEffects=function(e){this.sources.addEffects(e)},e}(),yy={loaded:!1,loading:!1,dataverses:[],createDataverse:[],createDataverseName:"",createDataverseError:[],createDataverseSuccess:!1,createDataverseFailed:!1,dropDataverse:[],dropDataverseName:"",dropDataverseError:[],dropDataverseSuccess:!1,dropDataverseFailed:!1},vy={loaded:!1,loading:!1,datasets:[],createDataset:[],createDatasetError:[],createDatasetSuccess:!1,createDatasetFailed:!1,dropDataset:[],dropDatasetError:[],dropDatasetSuccess:!1,dropDatasetFailed:!1,guideSelectsDataset:""},by={loaded:!1,loading:!1,datatypes:[],createDatatype:[],createDatatypeError:[],createDatatypeSuccess:!1,createDatatypeFailed:!1,dropDatatype:[],dropDatatypeError:[],dropDatatypeSuccess:!1,dropDatatypeFailed:!1},_y={loaded:!1,loading:!1,indexes:[],createIndex:[],createIndexError:[],createIndexSuccess:!1,createIndexFailed:!1,dropIndex:[],dropIndexError:[],dropIndexSuccess:!1,dropIndexFailed:!1},wy={loading:!1,loaded:!1,success:!1,sqlQueryString:"",sqlQueryResult:[],sqlQueryError:[]},xy={loading:!1,loaded:!1,success:!1,sqlQueryMetadataString:"",sqlQueryMetadataResult:[],sqlQueryMetadataError:[]},Cy={tree:[],loading:!1,loaded:!1};gl.a.from=Ds;var Ey=function(){function e(e,t){var n=this;this.store=e,this.ref=t,this.dv=[],this.ds=[],this.dt=[],this.idx=[],this.store.select(function(e){return e.dataverse.dataverses}).subscribe(function(e){if(e.results){n.dv=[];for(var t=0;t<e.results.length;t++){var r={id:0,DataverseName:"",Datasets:[]};r.id=t,r.DataverseName=e.results[t].DataverseName,n.dv.push(r)}n.updateMetadataTree()}}),this.store.select(function(e){return e.dataset.datasets}).subscribe(function(e){e.results&&(n.ds=e.results,n.updateMetadataTree())}),this.store.select(function(e){return e.datatype.datatypes}).subscribe(function(e){e.results&&(n.dt=e.results,n.updateMetadataTree())}),this.store.select(function(e){return e.index.indexes}).subscribe(function(e){e.results&&(n.idx=e.results,n.updateMetadataTree())})}return e.prototype.getMetadataTree=function(){return gl.a.from(this.dv)},e.prototype.updateMetadataTree=function(){for(var e=0;e<this.dv.length;e++){this.dv[e].Datasets=[];for(var t=0;t<this.ds.length;t++)if(this.ds[t].DataverseName===this.dv[e].DataverseName){this.ds[t].Datatype=[];for(var n=0;n<this.dt.length;n++)this.dt[n].DatatypeName===this.ds[t].DatatypeName&&(this.ds[t].Datatype=this.dt[n]);this.ds[t].Indexes=[];for(var r=0;r<this.idx.length;r++)this.idx[r].DatasetName===this.ds[t].DatasetName&&this.ds[t].Indexes.push(this.idx[r]);this.dv[e].Datasets.push(this.ds[t])}}this.store.dispatch(new Jh)},e}(),Sy=n("GpNi");gl.a.prototype.switchMap=Sy.a,gl.a.prototype.catch=il,gl.a.prototype._catch=il;var Oy=function(){function e(e,t){var n=this;this.actions=e,this.metadataService=t,this.calculateDBTree$=this.actions.ofType(Yh).switchMap(function(){return n.metadataService.getMetadataTree().map(function(e){return new em(e)})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"calculateDBTree$",void 0),e}(),Ty=function(){function e(e){this.http=e}return e.prototype.selectDataverses=function(){return this.executeSQLQuery("SELECT VALUE dv FROM Metadata.`Dataverse` dv")},e.prototype.selectDatasets=function(){return this.executeSQLQuery("SELECT VALUE ds FROM Metadata.`Dataset` ds")},e.prototype.selectDatatypes=function(){return this.executeSQLQuery("SELECT VALUE dt FROM Metadata.`Datatype` dt")},e.prototype.selectIndexes=function(){return this.executeSQLQuery("SELECT VALUE ix FROM Metadata.`Index` ix")},e.prototype.createDataverse=function(e){return this.executeDDLSQLQuery("CREATE DATAVERSE "+e+";")},e.prototype.dropDataverse=function(e){return this.executeDDLSQLQuery("DROP DATAVERSE "+e)},e.prototype.createDataset=function(e){return this.executeDDLSQLQuery("CREATE DATASET "+e+";")},e.prototype.dropDataset=function(e){return this.executeDDLSQLQuery("DROP DATASET "+e)},e.prototype.createDatatype=function(e){return this.executeDDLSQLQuery("CREATE DATATYPE "+e+";")},e.prototype.dropDatatype=function(e){return this.executeDDLSQLQuery("DROP TYPE "+e)},e.prototype.createIndex=function(e){return this.executeDDLSQLQuery("CREATE INDEX "+e+";")},e.prototype.dropIndex=function(e){return this.executeDDLSQLQuery("DROP INDEX "+e)},e.prototype.executeDDLSQLQuery=function(e){var t=this;return this.http.post("http://localhost:19002/query/service",{statement:e}).map(function(e){return e}).catch(function(e){return t.handleExecuteQueryError(e)})},e.prototype.executeSQLQuery=function(e){var t=this;return this.http.post("http://localhost:19002/query/service",{statement:e}).map(function(e){return e}).catch(function(e){return t.handleExecuteQueryError(e)})},e.prototype.handleExecuteQueryError=function(e){return console.log(e),Promise.reject(e.error||e)},e}(),ky=function(){function e(e,t){var n=this;this.actions=e,this.sqlService=t,this.selectDataverses$=this.actions.ofType(Ad).switchMap(function(e){return n.sqlService.selectDataverses().map(function(e){return new qd(e)}).catch(function(e){return vl(new Ud(e))})}),this.createDataverses$=this.actions.ofType(Fd).switchMap(function(e){return n.sqlService.createDataverse(e.payload).map(function(e){return new Kd(e)}).catch(function(e){return vl(new $d(e))})}),this.dropDataverses$=this.actions.ofType(zd).switchMap(function(e){return n.sqlService.dropDataverse(e.payload).map(function(e){return new Qd(e)}).catch(function(e){return vl(new Yd(e))})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"selectDataverses$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"createDataverses$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"dropDataverses$",void 0),e}(),Dy=function(){function e(e,t){var n=this;this.actions=e,this.sqlService=t,this.selectDatasets$=this.actions.ofType(Xd).switchMap(function(e){return n.sqlService.selectDatasets().map(function(e){return new up(e)}).catch(function(e){return vl(new cp(e))})}),this.createDatasets$=this.actions.ofType(ep).switchMap(function(e){return n.sqlService.createDataset(e.payload).map(function(e){return new pp(e)}).catch(function(e){return vl(new fp(e))})}),this.dropDatasets$=this.actions.ofType(rp).switchMap(function(e){return console.log(e.payload),n.sqlService.dropDataset(e.payload).map(function(e){return new mp(e)}).catch(function(e){return vl(new gp(e))})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"selectDatasets$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"createDatasets$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"dropDatasets$",void 0),e}(),Iy=function(){function e(e,t){var n=this;this.actions=e,this.sqlService=t,this.selectDatatypes$=this.actions.ofType(yp).switchMap(function(e){return n.sqlService.selectDatatypes().map(function(e){return new Op(e)}).catch(function(e){return vl(new Tp(e))})}),this.createDatatypes$=this.actions.ofType(bp).switchMap(function(e){return n.sqlService.createDatatype(e.payload).map(function(e){return new Dp(e)}).catch(function(e){return vl(new Ip(e))})}),this.dropDatatypes$=this.actions.ofType(xp).switchMap(function(e){return n.sqlService.dropDatatype(e.payload).map(function(e){return new Mp(e)}).catch(function(e){return vl(new Pp(e))})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"selectDatatypes$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"createDatatypes$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"dropDatatypes$",void 0),e}(),Ry=function(){function e(e,t){var n=this;this.actions=e,this.sqlService=t,this.selectIndexes$=this.actions.ofType(Np).switchMap(function(e){return n.sqlService.selectIndexes().map(function(e){return new Hp(e)}).catch(function(e){return vl(new Wp(e))})}),this.createIndexes$=this.actions.ofType(Lp).switchMap(function(e){return n.sqlService.createIndex(e.payload).map(function(e){return new Up(e)}).catch(function(e){return vl(new Gp(e))})}),this.dropIndexes$=this.actions.ofType(jp).switchMap(function(e){return n.sqlService.dropIndex(e.payload).map(function(e){return new $p(e)}).catch(function(e){return vl(new Zp(e))})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"selectIndexes$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"createIndexes$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"dropIndexes$",void 0),e}(),My=function(){function e(e,t){var n=this;this.actions=e,this.sqlService=t,this.executeQuery$=this.actions.ofType(Cd).switchMap(function(e){return n.sqlService.executeSQLQuery(e.payload).map(function(e){return new Id(e)}).catch(function(e){return vl(new Rd(e))})}),this.executeMetadataQuery$=this.actions.ofType(Od).switchMap(function(e){return n.sqlService.executeSQLQuery(e.payload).map(function(e){return new Pd(e)}).catch(function(e){return vl(new Nd(e))})})}return Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"executeQuery$",void 0),Object(bl.__decorate)([Uo(),Object(bl.__metadata)("design:type",gl.a)],e.prototype,"executeMetadataQuery$",void 0),e}(),Py=function(){},Ny=function(){},Ay=function(){},Ly=function(){},Fy=function(){},jy=function(){},Vy=function(){},zy=function(){},By=function(){},Hy=new al.InjectionToken("MAT_DRAWER_DEFAULT_AUTOSIZE"),Wy=function(){},qy=function(){},Uy=function(){},Gy=function(){},Ky=al["\u0275cmf"](sl,[ul],function(e){return al["\u0275mod"]([al["\u0275mpd"](512,al.ComponentFactoryResolver,al["\u0275CodegenComponentFactoryResolver"],[[8,[Us,sc,gc,Pc,Ac,uf,df,bf,wf,Df,Rf,Vf,Bf,um]],[3,al.ComponentFactoryResolver],al.NgModuleRef]),al["\u0275mpd"](5120,al.LOCALE_ID,al["\u0275m"],[[3,al.LOCALE_ID]]),al["\u0275mpd"](4608,cl.NgLocalization,cl.NgLocaleLocalization,[al.LOCALE_ID,[2,cl["\u0275a"]]]),al["\u0275mpd"](4608,Fu["\u0275i"],Fu["\u0275i"],[]),al["\u0275mpd"](4608,al.Compiler,al.Compiler,[]),al["\u0275mpd"](5120,al.APP_ID,al["\u0275f"],[]),al["\u0275mpd"](5120,al.IterableDiffers,al["\u0275k"],[]),al["\u0275mpd"](5120,al.KeyValueDiffers,al["\u0275l"],[]),al["\u0275mpd"](4608,Va.c,Va.r,[cl.DOCUMENT]),al["\u0275mpd"](6144,al.Sanitizer,null,[Va.c]),al["\u0275mpd"](4608,Va.f,ns,[[2,ts],[2,Ba]]),al["\u0275mpd"](5120,Va.d,function(e,t,n,r,i){return[new Va.k(e,t),new Va.o(n),new Va.n(r,i)]},[cl.DOCUMENT,al.NgZone,cl.DOCUMENT,cl.DOCUMENT,Va.f]),al["\u0275mpd"](4608,Va.e,Va.e,[Va.d,al.NgZone]),al["\u0275mpd"](135680,Va.m,Va.m,[cl.DOCUMENT]),al["\u0275mpd"](4608,Va.l,Va.l,[Va.e,Va.m]),al["\u0275mpd"](5120,wm,Ao,[]),al["\u0275mpd"](5120,Hm,Lo,[]),al["\u0275mpd"](4608,cg,bg,[wm,Hm]),al["\u0275mpd"](5120,al.RendererFactory2,Fo,[Va.l,cg,al.NgZone]),al["\u0275mpd"](6144,Va.p,null,[Va.m]),al["\u0275mpd"](4608,al.Testability,al.Testability,[al.NgZone]),al["\u0275mpd"](4608,Va.h,Va.h,[cl.DOCUMENT]),al["\u0275mpd"](4608,Va.i,Va.i,[cl.DOCUMENT]),al["\u0275mpd"](4608,Rs.AnimationBuilder,fg,[al.RendererFactory2,Va.b]),al["\u0275mpd"](5120,xg,Vo,[]),al["\u0275mpd"](4608,Eg,Eg,[xg,Cg]),al["\u0275mpd"](6144,zl,null,[cl.DOCUMENT]),al["\u0275mpd"](4608,Bl,Bl,[[2,zl]]),al["\u0275mpd"](4608,pl,pl,[]),al["\u0275mpd"](5120,Fl,l,[[3,Fl],al.NgZone,pl]),al["\u0275mpd"](5120,jl,a,[[3,jl],pl,al.NgZone]),al["\u0275mpd"](4608,aa,aa,[Fl,jl,al.NgZone]),al["\u0275mpd"](5120,fa,v,[[3,fa],cl.DOCUMENT]),al["\u0275mpd"](4608,da,da,[jl,cl.DOCUMENT]),al["\u0275mpd"](5120,pa,y,[[3,pa],cl.DOCUMENT]),al["\u0275mpd"](4608,ga,ga,[aa,fa,al.ComponentFactoryResolver,da,pa,al.ApplicationRef,al.Injector,al.NgZone,cl.DOCUMENT]),al["\u0275mpd"](5120,ya,b,[ga]),al["\u0275mpd"](5120,Tg,zo,[ga]),al["\u0275mpd"](4608,Ea,Ea,[pl]),al["\u0275mpd"](4608,Oa,Oa,[Ea,al.NgZone,cl.DOCUMENT]),al["\u0275mpd"](136192,Pa,O,[[3,Pa],cl.DOCUMENT]),al["\u0275mpd"](5120,Aa,T,[[3,Aa],[2,Na],cl.DOCUMENT]),al["\u0275mpd"](5120,La,k,[[3,La],al.NgZone,pl]),al["\u0275mpd"](5120,Vc,xe,[[3,Vc]]),al["\u0275mpd"](4608,qf,qf,[]),al["\u0275mpd"](4608,es,es,[]),al["\u0275mpd"](5120,Ls,A,[ga]),al["\u0275mpd"](4608,Fs,Fs,[ga,al.Injector,[2,cl.Location],Ls,[3,Fs]]),al["\u0275mpd"](5120,Nu,K,[[3,Nu],[2,gu],Va.c]),al["\u0275mpd"](4608,Ku,Ku,[]),al["\u0275mpd"](5120,Ju,X,[ga]),al["\u0275mpd"](5120,Ig,Bo,[ga]),al["\u0275mpd"](5120,Mg,Ho,[ga]),al["\u0275mpd"](5120,pc,he,[ga]),al["\u0275mpd"](5120,Ng,Wo,[[3,Ng]]),al["\u0275mpd"](4608,xc,xc,[pl]),al["\u0275mpd"](135680,Cc,Cc,[xc,al.NgZone]),al["\u0275mpd"](4608,Ic,Ic,[ga,Aa,al.Injector,Cc,[3,Ic]]),al["\u0275mpd"](5120,Lg,qo,[[3,Lg]]),al["\u0275mpd"](4608,Vg,Vg,[]),al["\u0275mpd"](6144,Ha,null,[al.LOCALE_ID]),al["\u0275mpd"](4608,Wa,Qa,[[2,Ha]]),al["\u0275mpd"](135680,Yp.k,Yp.k,[Yp.a,Yp.i,Yp.j,Yp.d]),al["\u0275mpd"](5120,Bg.c,Bg.d,[Bg.k,Bg.i]),al["\u0275mpd"](4608,am,am,[Yp.m]),al["\u0275mpd"](512,cl.CommonModule,cl.CommonModule,[]),al["\u0275mpd"](512,ah.SharedModule,ah.SharedModule,[]),al["\u0275mpd"](512,lh.TreeModule,lh.TreeModule,[]),al["\u0275mpd"](512,Oh.DropdownModule,Oh.DropdownModule,[]),al["\u0275mpd"](512,Fu["\u0275ba"],Fu["\u0275ba"],[]),al["\u0275mpd"](512,Fu.FormsModule,Fu.FormsModule,[]),al["\u0275mpd"](512,Th.PaginatorModule,Th.PaginatorModule,[]),al["\u0275mpd"](512,Sh.DataTableModule,Sh.DataTableModule,[]),al["\u0275mpd"](1024,al.ErrorHandler,Va.q,[]),al["\u0275mpd"](1024,al.APP_INITIALIZER,function(e){return[Va.t(e)]},[[2,al.NgProbeToken]]),al["\u0275mpd"](512,al.ApplicationInitStatus,al.ApplicationInitStatus,[[2,al.APP_INITIALIZER]]),al["\u0275mpd"](131584,al.ApplicationRef,al.ApplicationRef,[al.NgZone,al["\u0275Console"],al.Injector,al.ErrorHandler,al.ComponentFactoryResolver,al.ApplicationInitStatus]),al["\u0275mpd"](512,al.ApplicationModule,al.ApplicationModule,[al.ApplicationRef]),al["\u0275mpd"](512,Va.a,Va.a,[[3,Va.a]]),al["\u0275mpd"](512,_g,_g,[]),al["\u0275mpd"](512,Sg,Sg,[]),al["\u0275mpd"](1024,dy,Qo,[]),al["\u0275mpd"](512,py,py,[dy]),al["\u0275mpd"](512,fy,fy,[py]),al["\u0275mpd"](131584,Bg.h,Bg.h,[]),al["\u0275mpd"](131584,Yp.a,Yp.a,[]),al["\u0275mpd"](2048,Yp.h,null,[Bg.h]),al["\u0275mpd"](256,Yp.r,void 0,[]),al["\u0275mpd"](1024,Yp.d,Yp.v,[Yp.r]),al["\u0275mpd"](256,Yp.q,{dataverse:Yo,dataset:Xo,datatype:Jo,index:el,sqlQuery:tl,sqlMetadataQuery:nl,metadata:rl},[]),al["\u0275mpd"](2048,Yp.t,null,[Yp.q]),al["\u0275mpd"](1024,Yp.c,Yp.u,[al.Injector,Yp.q,Yp.t]),al["\u0275mpd"](256,Yp.s,Yp.w,[]),al["\u0275mpd"](256,Yp.e,[],[]),al["\u0275mpd"](1024,Yp.f,Yp.y,[Yp.s,Yp.e]),al["\u0275mpd"](131584,Yp.g,Yp.g,[Yp.h,Yp.d,Yp.c,Yp.f]),al["\u0275mpd"](2048,Yp.i,null,[Yp.g]),al["\u0275mpd"](1024,Bg.k,Bg.e,[]),al["\u0275mpd"](512,Bg.l,Bg.l,[Bg.k]),al["\u0275mpd"](131584,Yp.j,Yp.j,[]),al["\u0275mpd"](256,Bg.j,{maxAge:10},[]),al["\u0275mpd"](1024,Bg.i,Bg.g,[Bg.j]),al["\u0275mpd"](512,Bg.a,Bg.a,[Bg.h,Yp.a,Yp.i,Bg.l,Yp.j,Yp.d,Bg.i]),al["\u0275mpd"](1024,Yp.l,Bg.f,[Bg.a]),al["\u0275mpd"](512,Yp.m,Yp.m,[Yp.l,Yp.a,Yp.g]),al["\u0275mpd"](131584,hy,hy,[fy,Yp.m]),al["\u0275mpd"](512,uy,uy,[Yp.j]),al["\u0275mpd"](512,Ey,Ey,[Yp.m,al.ApplicationRef]),al["\u0275mpd"](512,Oy,Oy,[uy,Ey]),al["\u0275mpd"](512,xu,xu,[]),al["\u0275mpd"](2048,wu,null,[xu]),al["\u0275mpd"](512,Cu,Cu,[wu]),al["\u0275mpd"](2048,lu,null,[Cu]),al["\u0275mpd"](256,Eu,"XSRF-TOKEN",[]),al["\u0275mpd"](512,Ou,Tu,[cl.DOCUMENT,al.PLATFORM_ID,Eu]),al["\u0275mpd"](256,Su,"X-XSRF-TOKEN",[]),al["\u0275mpd"](512,ku,ku,[Ou,Su]),al["\u0275mpd"](1024,vu,function(e){return[e]},[ku]),al["\u0275mpd"](1024,ou,q,[lu,[2,vu]]),al["\u0275mpd"](512,gu,gu,[ou]),al["\u0275mpd"](512,Ty,Ty,[gu]),al["\u0275mpd"](512,ky,ky,[uy,Ty]),al["\u0275mpd"](512,Dy,Dy,[uy,Ty]),al["\u0275mpd"](512,Iy,Iy,[uy,Ty]),al["\u0275mpd"](512,Ry,Ry,[uy,Ty]),al["\u0275mpd"](512,My,My,[uy,Ty]),al["\u0275mpd"](1024,cy,Zo,[Oy,ky,Dy,Iy,Ry,My]),al["\u0275mpd"](512,gy,gy,[fy,hy,Yp.m,cy,[2,Yp.n]]),al["\u0275mpd"](512,Du,Du,[]),al["\u0275mpd"](512,Iu,Iu,[]),al["\u0275mpd"](512,Hl,Hl,[]),al["\u0275mpd"](256,za,!0,[]),al["\u0275mpd"](512,Ba,Ba,[[2,za]]),al["\u0275mpd"](512,hl,hl,[]),al["\u0275mpd"](512,us,us,[]),al["\u0275mpd"](512,cs,cs,[]),al["\u0275mpd"](512,ds,ds,[]),al["\u0275mpd"](512,Zl,Zl,[]),al["\u0275mpd"](512,Vl,Vl,[]),al["\u0275mpd"](512,va,va,[]),al["\u0275mpd"](512,kg,kg,[]),al["\u0275mpd"](512,ja,ja,[]),al["\u0275mpd"](512,Qs,Qs,[]),al["\u0275mpd"](512,Gh,Gh,[]),al["\u0275mpd"](512,md,md,[]),al["\u0275mpd"](512,Gf,Gf,[]),al["\u0275mpd"](512,Py,Py,[]),al["\u0275mpd"](512,Ny,Ny,[]),al["\u0275mpd"](512,Yc,Yc,[]),al["\u0275mpd"](512,sd,sd,[]),al["\u0275mpd"](512,Ws,Ws,[]),al["\u0275mpd"](512,Lu,Lu,[]),al["\u0275mpd"](512,tc,tc,[]),al["\u0275mpd"](512,Ay,Ay,[]),al["\u0275mpd"](512,Ly,Ly,[]),al["\u0275mpd"](512,Bu,Bu,[]),al["\u0275mpd"](512,rs,rs,[]),al["\u0275mpd"](512,Fy,Fy,[]),al["\u0275mpd"](512,Gu,Gu,[]),al["\u0275mpd"](512,jy,jy,[]),al["\u0275mpd"](512,Rg,Rg,[]),al["\u0275mpd"](512,Pg,Pg,[]),al["\u0275mpd"](512,hc,hc,[]),al["\u0275mpd"](512,Ag,Ag,[]),al["\u0275mpd"](512,Vy,Vy,[]),al["\u0275mpd"](512,zy,zy,[]),al["\u0275mpd"](512,By,By,[]),al["\u0275mpd"](512,Wy,Wy,[]),al["\u0275mpd"](512,qy,qy,[]),al["\u0275mpd"](512,Uy,Uy,[]),al["\u0275mpd"](512,Ec,Ec,[]),al["\u0275mpd"](512,Rc,Rc,[]),al["\u0275mpd"](512,Fg,Fg,[]),al["\u0275mpd"](512,jg,jg,[]),al["\u0275mpd"](512,zg,zg,[]),al["\u0275mpd"](512,th,th,[]),al["\u0275mpd"](512,vd,vd,[]),al["\u0275mpd"](512,Xa,Xa,[]),al["\u0275mpd"](512,Ja,Ja,[]),al["\u0275mpd"](512,Gy,Gy,[]),al["\u0275mpd"](512,Yp.o,Yp.o,[Yp.a,Yp.i,Yp.j]),al["\u0275mpd"](512,Bg.b,Bg.b,[]),al["\u0275mpd"](512,sl,sl,[]),al["\u0275mpd"](256,Cg,{version:1,name:"asterixDB_app",stores:{}},[]),al["\u0275mpd"](256,Dg,{overlapTrigger:!0,xPosition:"after",yPosition:"below"},[]),al["\u0275mpd"](256,Hy,!1,[]),al["\u0275mpd"](256,qa,Ya,[])])});Object(al.enableProdMode)(),Va.j().bootstrapModuleFactory(Ky).catch(function(e){return console.log(e)})},"cpZ/":function(e,t,n){"use strict";var r=n("ptrv"),i=n("CDXM"),o=n("lfBE"),l=n("pBmS"),a=n("xI8H"),s=n("p/bR"),u=n("Lcie"),c=n("JXkd"),d=n("umMR"),p=n("UlVq"),f=n("P6IN"),h=n("Ula3");e.exports=function(e,t,n,m,g,y){var v=r[e],b=v,_=g?"set":"add",w=b&&b.prototype,x={},C=function(e){var t=w[e];o(w,e,"delete"==e?function(e){return!(y&&!c(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(y&&!c(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return y&&!c(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof b&&(y||w.forEach&&!d(function(){(new b).entries().next()}))){var E=new b,S=E[_](y?{}:-0,1)!=E,O=d(function(){E.has(1)}),T=p(function(e){new b(e)}),k=!y&&d(function(){for(var e=new b,t=5;t--;)e[_](t,t);return!e.has(-0)});T||((b=t(function(t,n){u(t,b,e);var r=h(new v,t,b);return void 0!=n&&s(n,g,r[_],r),r})).prototype=w,w.constructor=b),(O||k)&&(C("delete"),C("has"),g&&C("get")),(k||S)&&C(_),y&&w.clear&&delete w.clear}else b=m.getConstructor(t,e,g,_),l(b.prototype,n),a.NEED=!0;return f(b,e),x[e]=b,i(i.G+i.W+i.F*(b!=v),x),y||m.setStrong(b,e,g),b}},"dXJ/":function(e,t,n){var r=n("VceJ"),i=n("3r0D")("toStringTag"),o="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,l;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:o?r(t):"Object"==(l=r(t))&&"function"==typeof t.callee?"Arguments":l}},"dmC+":function(e,t,n){"use strict";t.a=function(e,t){return Object(r.a)(e,t)(this)};var r=n("qqDE")},eFQL:function(e,t,n){(function(e){!function(){"use strict";function t(e,t){for(var n=e.length-1;n>=0;n--)typeof e[n]===v&&(e[n]=Zone.current.wrap(e[n],t+"_"+n));return e}function n(e){return!e||!1!==e.writable&&(typeof e.get!==v||typeof e.set!==b)}function r(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(!r&&n&&Object.getOwnPropertyDescriptor(n,t)&&(r={enumerable:!0,configurable:!0}),r&&r.configurable){delete r.writable,delete r.value;var i=r.get,o=t.substr(2),l=S[o];l||(l=S[o]=g("ON_PROPERTY"+o)),r.set=function(t){var n=this;n||e!==y||(n=y),n&&(n[l]&&n.removeEventListener(o,O),"function"==typeof t?(n[l]=t,n.addEventListener(o,O,!1)):n[l]=null)},r.get=function(){var n=this;if(n||e!==y||(n=y),!n)return null;var o=n[l];if(o)return o;if(i){var a=i&&i.apply(this);if(a)return r.set.apply(this,[a]),typeof n[_]===v&&n.removeAttribute(t),a}return null},Object.defineProperty(e,t,r)}}function i(e,t,n){if(t)for(var i=0;i<t.length;i++)r(e,"on"+t[i],n);else{var o=[];for(var l in e)"on"==l.substr(0,2)&&o.push(l);for(var a=0;a<o.length;a++)r(e,o[a],n)}}function o(e){var n=y[e];if(n){y[g(e)]=n,y[e]=function(){var r=t(arguments,e);switch(r.length){case 0:this[T]=new n;break;case 1:this[T]=new n(r[0]);break;case 2:this[T]=new n(r[0],r[1]);break;case 3:this[T]=new n(r[0],r[1],r[2]);break;case 4:this[T]=new n(r[0],r[1],r[2],r[3]);break;default:throw new Error("Arg list too long.")}},a(y[e],n);var r,i=new n(function(){});for(r in i)"XMLHttpRequest"===e&&"responseBlob"===r||function(t){"function"==typeof i[t]?y[e].prototype[t]=function(){return this[T][t].apply(this[T],arguments)}:Object.defineProperty(y[e].prototype,t,{set:function(n){"function"==typeof n?(this[T][t]=Zone.current.wrap(n,e+"."+t),a(this[T][t],n)):this[T][t]=n},get:function(){return this[T][t]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(y[e][r]=n[r])}}function l(e,t,r){for(var i=e;i&&!i.hasOwnProperty(t);)i=Object.getPrototypeOf(i);!i&&e[t]&&(i=e);var o,l=g(t);if(i&&!(o=i[l])&&(o=i[l]=i[t],n(i&&Object.getOwnPropertyDescriptor(i,t)))){var s=r(o,l,t);i[t]=function(){return s(this,arguments)},a(i[t],o)}return o}function a(e,t){e[g("OriginalDelegate")]=t}function s(e,t,n){function r(t,n){if(!t)return!1;var r=!0;n&&void 0!==n.useGlobalCallback&&(r=n.useGlobalCallback);var h=n&&n.validateHandler,v=!0;n&&void 0!==n.checkDuplicate&&(v=n.checkDuplicate);var b=!1;n&&void 0!==n.returnTarget&&(b=n.returnTarget);for(var _=t;_&&!_.hasOwnProperty(i);)_=Object.getPrototypeOf(_);if(!_&&t[i]&&(_=t),!_)return!1;if(_[c])return!1;var w,x={},C=_[c]=_[i],E=_[g(o)]=_[o],S=_[g(l)]=_[l],O=_[g(s)]=_[s];n&&n.prependEventListenerFnName&&(w=_[g(n.prependEventListenerFnName)]=_[n.prependEventListenerFnName]);var T=r?function(e){if(!e.isRemoved){var t=A[e.eventName],n=void 0;t&&(n=t[e.capture?M:P]);var r=n&&e.target[n];if(r)for(var i=0;i<r.length;i++)if(r[i]===e){r.splice(i,1),e.isRemoved=!0,0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return E.apply(e.target,[e.eventName,e.capture?y:m,e.options])}:function(e){return E.apply(e.target,[e.eventName,e.invoke,e.options])},k=n&&n.compareTaskCallbackVsDelegate?n.compareTaskCallbackVsDelegate:function(e,t){var n=typeof t;return n===j&&e.callback===t||n===V&&e.originalDelegate===t},D=function(t,n,i,o,l,a){return void 0===l&&(l=!1),void 0===a&&(a=!1),function(){var s=this||e,u=(Zone,arguments[1]);if(!u)return t.apply(this,arguments);var c=!1;if(typeof u!==j){if(!u.handleEvent)return t.apply(this,arguments);c=!0}if(!h||h(t,u,s,arguments)){var d,p=arguments[0],f=arguments[2],m=!1;void 0===f?d=!1:!0===f?d=!0:!1===f?d=!1:(d=!!f&&!!f.capture,m=!!f&&!!f.once);var g,y=Zone.current,b=A[p];if(b)g=b[d?M:P];else{var _=z+(p+P),w=z+(p+M);A[p]={},A[p][P]=_,A[p][M]=w,g=d?w:_}var C=s[g],E=!1;if(C){if(E=!0,v)for(var S=0;S<C.length;S++)if(k(C[S],u))return}else C=s[g]=[];var O,T=s.constructor[F],D=L[T];D&&(O=D[p]),O||(O=T+n+p),x.options=f,m&&(x.options.once=!1),x.target=s,x.capture=d,x.eventName=p,x.isExisting=E;var I=y.scheduleEventTask(O,u,r?N:null,i,o);return m&&(f.once=!0),I.options=f,I.target=s,I.capture=d,I.eventName=p,c&&(I.originalDelegate=u),a?C.unshift(I):C.push(I),l?s:void 0}}};return _[i]=D(C,d,r?function(e){if(!x.isExisting)return C.apply(x.target,[x.eventName,x.capture?y:m,x.options])}:function(e){return C.apply(x.target,[x.eventName,e.invoke,x.options])},T,b),w&&(_[p]=D(w,f,function(e){return w.apply(x.target,[x.eventName,e.invoke,x.options])},T,b,!0)),_[o]=function(){var t,n=this||e,r=arguments[0],i=arguments[2];t=void 0!==i&&(!0===i||!1!==i&&!!i&&!!i.capture);var o=arguments[1];if(!o)return E.apply(this,arguments);if(!h||h(E,o,n,arguments)){var l,a=A[r];a&&(l=a[t?M:P]);var s=l&&n[l];if(s)for(var u=0;u<s.length;u++){var c=s[u];if(k(c,o))return s.splice(u,1),c.isRemoved=!0,0===s.length&&(c.allRemoved=!0,n[l]=null),void c.zone.cancelTask(c)}}},_[l]=function(){for(var t=[],n=u(this||e,arguments[0]),r=0;r<n.length;r++){var i=n[r];t.push(i.originalDelegate?i.originalDelegate:i.callback)}return t},_[s]=function(){var t=this||e,n=arguments[0];if(n){var r=A[n];if(r){var i=t[r[P]],l=t[r[M]];if(i){var a=R(i);for(d=0;d<a.length;d++)this[o].apply(this,[n,(u=a[d]).originalDelegate?u.originalDelegate:u.callback,u.options])}if(l)for(a=R(l),d=0;d<a.length;d++){var u;this[o].apply(this,[n,(u=a[d]).originalDelegate?u.originalDelegate:u.callback,u.options])}}}else{for(var c=Object.keys(t),d=0;d<c.length;d++){var p=B.exec(c[d]),f=p&&p[1];f&&"removeListener"!==f&&this[s].apply(this,[f])}this[s].apply(this,["removeListener"])}},a(_[i],C),a(_[o],E),O&&a(_[s],O),S&&a(_[l],S),!0}for(var i=n&&n.addEventListenerFnName||"addEventListener",o=n&&n.removeEventListenerFnName||"removeEventListener",l=n&&n.listenersFnName||"eventListeners",s=n&&n.removeAllFnName||"removeAllListeners",c=g(i),d="."+i+":",p="prependListener",f="."+p+":",h=function(e,t,n){if(!e.isRemoved){var r=e.callback;typeof r===V&&r.handleEvent&&(e.callback=function(e){return r.handleEvent(e)},e.originalDelegate=r),e.invoke(e,t,[n]);var i=e.options;i&&"object"==typeof i&&i.once&&t[o].apply(t,[n.type,e.originalDelegate?e.originalDelegate:e.callback,i])}},m=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[A[t.type][P]];if(r)if(1===r.length)h(r[0],n,t);else for(var i=r.slice(),o=0;o<i.length&&(!t||!0!==t[H]);o++)h(i[o],n,t)}},y=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[A[t.type][M]];if(r)if(1===r.length)h(r[0],n,t);else for(var i=r.slice(),o=0;o<i.length&&(!t||!0!==t[H]);o++)h(i[o],n,t)}},v=[],b=0;b<t.length;b++)v[b]=r(t[b],n);return v}function u(e,t){var n=[];for(var r in e){var i=B.exec(r),o=i&&i[1];if(o&&(!t||o===t)){var l=e[r];if(l)for(var a=0;a<l.length;a++)n.push(l[a])}}return n}function c(e,t,n,r){function i(t){var n=t.data;return n.args[0]=function(){try{t.invoke.apply(this,arguments)}finally{typeof n.handleId===c?delete u[n.handleId]:n.handleId&&(n.handleId[W]=null)}},n.handleId=a.apply(e,n.args),t}function o(e){return s(e.data.handleId)}var a=null,s=null;n+=r;var u={},c="number";a=l(e,t+=r,function(n){return function(l,a){if("function"==typeof a[0]){var s=Zone.current.scheduleMacroTask(t,a[0],{handleId:null,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?a[1]||0:null,args:a},i,o);if(!s)return s;var d=s.data.handleId;return typeof d===c?u[d]=s:d&&(d[W]=s),d&&d.ref&&d.unref&&"function"==typeof d.ref&&"function"==typeof d.unref&&(s.ref=d.ref.bind(d),s.unref=d.unref.bind(d)),typeof d===c||d?d:s}return n.apply(e,a)}}),s=l(e,n,function(t){return function(n,r){var i,o=r[0];typeof o===c?i=u[o]:(i=o&&o[W])||(i=o),i&&"string"==typeof i.type?"notScheduled"!==i.state&&(i.cancelFn&&i.data.isPeriodic||0===i.runCount)&&(typeof o===c?delete u[o]:o&&(o[W]=null),i.zone.cancelTask(i)):t.apply(e,r)}})}function d(e,t){return e&&e[K]&&e[K][t]}function p(e,t,n){return n.configurable=!0,n.configurable||(e[K]||q(e,K,{writable:!0,value:{}}),e[K][t]=!0),n}function f(e,t,n,r){try{return q(e,t,n)}catch(o){if(!n.configurable)throw o;typeof r==$?delete n.configurable:n.configurable=r;try{return q(e,t,n)}catch(r){var i=null;try{i=JSON.stringify(n)}catch(e){i=i.toString()}console.log("Attempting to configure '"+t+"' with descriptor '"+i+"' on object '"+e+"' and got error, giving up: "+r)}}}function h(e,t,n,r){i(e,function(e,t,n){if(!n)return t;var r=n.filter(function(t){return t.target===e});if(!r||0===r.length)return t;var i=r[0].ignoreProperties;return t.filter(function(e){return-1===i.indexOf(e)})}(e,t,n),r)}!function(e){function t(e){a&&a.mark&&a.mark(e)}function n(e,t){a&&a.measure&&a.measure(e,t)}function r(t){0===M&&0===g.length&&(u||e[h]&&(u=e[h].resolve(0)),u?u[m](i):e[f](i,0)),t&&g.push(t)}function i(){if(!y){for(y=!0;g.length;){var e=g;g=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){D.onUnhandledError(e)}}}l("ignoreConsoleErrorUncaughtError"),D.microtaskDrainDone(),y=!1}}function o(){}function l(e){return"__zone_symbol__"+e}var a=e.performance;if(t("Zone"),e.Zone)throw new Error("Zone already loaded.");var s=function(){function r(e,t){this._properties=null,this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new d(this,this._parent&&this._parent._zoneDelegate,t)}return r.assertZonePatched=function(){if(e.Promise!==k.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(r,"root",{get:function(){for(var e=r.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(r,"current",{get:function(){return I.zone},enumerable:!0,configurable:!0}),Object.defineProperty(r,"currentTask",{get:function(){return R},enumerable:!0,configurable:!0}),r.__load_patch=function(i,o){if(k.hasOwnProperty(i))throw Error("Already loaded patch: "+i);if(!e["__Zone_disable_"+i]){var l="Zone:"+i;t(l),k[i]=o(e,r,D),n(l,l)}},Object.defineProperty(r.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),r.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},r.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},r.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},r.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},r.prototype.run=function(e,t,n,r){void 0===t&&(t=void 0),void 0===n&&(n=null),void 0===r&&(r=null),I={parent:I,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{I=I.parent}},r.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null),I={parent:I,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{I=I.parent}},r.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||v).name+"; Execution: "+this.name+")");if(e.state!==b||e.type!==T){var r=e.state!=x;r&&e._transitionTo(x,w),e.runCount++;var i=R;R=e,I={parent:I,zone:this};try{e.type==O&&e.data&&!e.data.isPeriodic&&(e.cancelFn=null);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==b&&e.state!==E&&(e.type==T||e.data&&e.data.isPeriodic?r&&e._transitionTo(w,x):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(b,x,b))),I=I.parent,R=i}}},r.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(_,b);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(E,_,b),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==_&&e._transitionTo(w,_),e},r.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new p(S,e,t,n,r,null))},r.prototype.scheduleMacroTask=function(e,t,n,r,i){return this.scheduleTask(new p(O,e,t,n,r,i))},r.prototype.scheduleEventTask=function(e,t,n,r,i){return this.scheduleTask(new p(T,e,t,n,r,i))},r.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||v).name+"; Execution: "+this.name+")");e._transitionTo(C,w,x);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(E,C),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(b,C),e.runCount=0,e},r.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},r}();s.__symbol__=l;var u,c={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,i,o){return e.invokeTask(n,r,i,o)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},d=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t.zone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t.zone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t.zone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t.zone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t.zone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t.zone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t.zone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:c,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new s(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,i){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,i):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=S)throw new Error("Task is missing scheduleFn.");r(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{return this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],i=n[e]=r+t;if(i<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=i||this.hasTask(this.zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),p=function(){function t(n,r,i,o,l,a){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=o,this.scheduleFn=l,this.cancelFn=a,this.callback=i;var s=this;this.invoke=n===T&&o&&o.isUsingGlobalCallback?t.invokeTask:function(){return t.invokeTask.apply(e,[s,this,arguments])}}return t.invokeTask=function(e,t,n){e||(e=this),M++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==M&&i(),M--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(b,_)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==b&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId:Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,invoke:this.invoke,scheduleFn:this.scheduleFn,cancelFn:this.cancelFn,runCount:this.runCount,callback:this.callback}},t}(),f=l("setTimeout"),h=l("Promise"),m=l("then"),g=[],y=!1,v={name:"NO ZONE"},b="notScheduled",_="scheduling",w="scheduled",x="running",C="canceling",E="unknown",S="microTask",O="macroTask",T="eventTask",k={},D={symbol:l,currentZoneFrame:function(){return I},onUnhandledError:o,microtaskDrainDone:o,scheduleMicroTask:r,showUncaughtError:function(){return!s[l("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:o,patchMethod:function(){return o},setNativePromise:function(e){u=e.resolve(0)}},I={parent:null,zone:new s(null,null)},R=null,M=0;n("Zone","Zone"),e.Zone=s}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||e);var m=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}};Zone.__load_patch("ZoneAwarePromise",function(e,t,n){function r(e){return e&&e.then}function i(e){return e}function o(e){return I.reject(e)}function l(e,t){return function(n){try{a(e,t,n)}catch(t){a(e,!1,t)}}}function a(e,r,i){var o=E();if(e===i)throw new TypeError(S);if(e[y]===_){var c=null;try{typeof i!==O&&typeof i!==T||(c=i&&i.then)}catch(t){return o(function(){a(e,!1,t)})(),e}if(r!==x&&i instanceof I&&i.hasOwnProperty(y)&&i.hasOwnProperty(v)&&i[y]!==_)s(i),a(e,i[y],i[v]);else if(r!==x&&typeof c===T)try{c.apply(i,[o(l(e,r)),o(l(e,!1))])}catch(t){o(function(){a(e,!1,t)})()}else{e[y]=r;var d=e[v];e[v]=i,r===x&&i instanceof Error&&(i[k]=t.currentTask);for(var f=0;f<d.length;)u(e,d[f++],d[f++],d[f++],d[f++]);if(0==d.length&&r==x){e[y]=C;try{throw new Error("Uncaught (in promise): "+i+(i&&i.stack?"\n"+i.stack:""))}catch(r){var h=r;h.rejection=i,h.promise=e,h.zone=t.current,h.task=t.currentTask,p.push(h),n.scheduleMicroTask()}}}}return e}function s(e){if(e[y]===C){try{var n=t[D];n&&typeof n===T&&n.apply(this,[{rejection:e[v],promise:e}])}catch(e){}e[y]=x;for(var r=0;r<p.length;r++)e===p[r].promise&&p.splice(r,1)}}function u(e,t,n,r,l){s(e);var u=e[y]?typeof r===T?r:i:typeof l===T?l:o;t.scheduleMicroTask(b,function(){try{a(n,!0,t.run(u,void 0,[e[v]]))}catch(e){a(n,!1,e)}})}function c(e){var t=e.prototype,n=t.then;t[h]=n;var r=Object.getOwnPropertyDescriptor(e.prototype,"then");r&&!1===r.writable&&r.configurable&&Object.defineProperty(e.prototype,"then",{writable:!0}),e.prototype.then=function(e,t){var r=this;return new I(function(e,t){n.call(r,e,t)}).then(e,t)},e[N]=!0}var d=n.symbol,p=[],f=d("Promise"),h=d("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(;p.length;)for(var e=function(){var e=p.shift();try{e.zone.runGuarded(function(){throw e})}catch(e){!function(e){n.onUnhandledError(e);try{var r=t[g];r&&"function"==typeof r&&r.apply(this,[e])}catch(e){}}(e)}};p.length;)e()};var g=d("unhandledPromiseRejectionHandler"),y=d("state"),v=d("value"),b="Promise.then",_=null,w=!0,x=!1,C=0,E=function(){var e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},S="Promise resolved with itself",O="object",T="function",k=d("currentTask"),D=d("rejectionHandledHandler"),I=function(){function e(t){if(!(this instanceof e))throw new Error("Must be an instanceof Promise.");this[y]=_,this[v]=[];try{t&&t(l(this,w),l(this,x))}catch(e){a(this,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return a(new this(null),w,e)},e.reject=function(e){return a(new this(null),x,e)},e.race=function(e){function t(e){l&&(l=i(e))}function n(e){l&&(l=o(e))}var i,o,l=new this(function(e,t){n=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),l=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)l.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return l}([e,t],2),i=n[0],o=n[1];var n});try{for(var a=m(e),s=a.next();!s.done;s=a.next()){var u=s.value;r(u)||(u=this.resolve(u)),u.then(t,n)}}catch(e){c={error:e}}finally{try{s&&!s.done&&(d=a.return)&&d.call(a)}finally{if(c)throw c.error}}return l;var c,d},e.all=function(e){var t,n,i=new this(function(e,r){t=e,n=r}),o=0,l=[];try{for(var a=m(e),s=a.next();!s.done;s=a.next()){var u=s.value;r(u)||(u=this.resolve(u)),u.then(function(e){return function(n){l[e]=n,--o||t(l)}}(o),n),o++}}catch(e){c={error:e}}finally{try{s&&!s.done&&(d=a.return)&&d.call(a)}finally{if(c)throw c.error}}return o||t(l),i;var c,d},e.prototype.then=function(e,n){var r=new this.constructor(null),i=t.current;return this[y]==_?this[v].push(i,r,e,n):u(this,i,r,e,n),r},e.prototype.catch=function(e){return this.then(null,e)},e}();I.resolve=I.resolve,I.reject=I.reject,I.race=I.race,I.all=I.all;var R=e[f]=e.Promise,M=t.__symbol__("ZoneAwarePromise"),P=Object.getOwnPropertyDescriptor(e,"Promise");P&&!P.configurable||(P&&delete P.writable,P&&delete P.value,P||(P={configurable:!0,enumerable:!0}),P.get=function(){return e[M]?e[M]:e[f]},P.set=function(t){t===I?e[M]=t:(e[f]=t,t.prototype[h]||c(t),n.setNativePromise(t))},Object.defineProperty(e,"Promise",P)),e.Promise=I;var N=d("thenPatched");if(R){c(R);var A=e.fetch;typeof A==T&&(e.fetch=function(e){return function(){var t=e.apply(this,arguments);if(t instanceof I)return t;var n=t.constructor;return n[N]||c(n),t}}(A))}return Promise[t.__symbol__("uncaughtPromiseErrors")]=p,I});var g=Zone.__symbol__,y="object"==typeof window&&window||"object"==typeof self&&self||e,v="function",b="undefined",_="removeAttribute",w="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,x=!("nw"in y)&&void 0!==y.process&&"[object process]"==={}.toString.call(y.process),C=!x&&!w&&!("undefined"==typeof window||!window.HTMLElement),E=void 0!==y.process&&"[object process]"==={}.toString.call(y.process)&&!w&&!("undefined"==typeof window||!window.HTMLElement),S={},O=function(e){if(e=e||y.event){var t=S[e.type];t||(t=S[e.type]=g("ON_PROPERTY"+e.type));var n=(this||e.target||y)[t],r=n&&n.apply(this,arguments);return void 0==r||r||e.preventDefault(),r}},T=g("originalInstance"),k=!1,D=!1;Zone.__load_patch("toString",function(e,t,n){var r=t.__zone_symbol__originalToString=Function.prototype.toString,i=g("OriginalDelegate"),o=g("Promise"),l=g("Error");Function.prototype.toString=function(){if("function"==typeof this){var t=this[i];if(t)return"function"==typeof t?r.apply(this[i],arguments):Object.prototype.toString.call(t);if(this===Promise){var n=e[o];if(n)return r.apply(n,arguments)}if(this===Error){var a=e[l];if(a)return r.apply(a,arguments)}}return r.apply(this,arguments)};var a=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":a.apply(this,arguments)}});var I=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),l=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)l.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return l},R=function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(I(arguments[t]));return e},M="true",P="false",N={isUsingGlobalCallback:!0},A={},L={},F="name",j="function",V="object",z="__zone_symbol__",B=/^__zone_symbol__(\w+)(true|false)$/,H="__zone_symbol__propagationStopped",W=g("zoneTask"),q=Object[g("defineProperty")]=Object.defineProperty,U=Object[g("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,G=Object.create,K=g("unconfigurables"),$="undefined",Z=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],Q=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],Y=["load"],X=["blur","error","focus","load","resize","scroll","messageerror"],J=["bounce","finish","start"],ee=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],te=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],ne=["close","error","open","message"],re=["error","message"],ie=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange"],Z,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]),oe=g("unbound");Zone.__load_patch("util",function(e,t,n){n.patchOnProperties=i,n.patchMethod=l}),Zone.__load_patch("timers",function(e,t,n){c(e,"set","clear","Timeout"),c(e,"set","clear","Interval"),c(e,"set","clear","Immediate")}),Zone.__load_patch("requestAnimationFrame",function(e,t,n){c(e,"request","cancel","AnimationFrame"),c(e,"mozRequest","mozCancel","AnimationFrame"),c(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,t,n){for(var r=["alert","prompt","confirm"],i=0;i<r.length;i++)l(e,r[i],function(n,r,i){return function(r,o){return t.current.run(n,e,o,i)}})}),Zone.__load_patch("EventTarget",function(e,t,n){(function(e,t){!function(n,r){var i=e.Event;i&&i.prototype&&t.patchMethod(i.prototype,"stopImmediatePropagation",function(e){return function(e,t){e[H]=!0}})}()})(e,n),function(e,t){var n="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video",r="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),i=[],o=e.wtf,l=n.split(",");o?i=l.map(function(e){return"HTML"+e+"Element"}).concat(r):e.EventTarget?i.push("EventTarget"):i=r;for(var a=e.__Zone_disable_IE_check||!1,u=e.__Zone_enable_cross_context_check||!1,c=function(){if(k)return D;k=!0;try{var e=window.navigator.userAgent;return e.indexOf("MSIE "),-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(D=!0),D}catch(e){}}(),d="[object FunctionWrapper]",p="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",f=0;f<ie.length;f++){var h=z+((b=ie[f])+P),m=z+(b+M);A[b]={},A[b][P]=h,A[b][M]=m}for(f=0;f<n.length;f++)for(var g=l[f],y=L[g]={},v=0;v<ie.length;v++){var b;y[b=ie[v]]=g+".addEventListener:"+b}var _=[];for(f=0;f<i.length;f++){var w=e[i[f]];_.push(w&&w.prototype)}s(e,_,{validateHandler:function(e,t,n,r){if(!a&&c)if(u)try{if((i=t.toString())===d||i==p)return e.apply(n,r),!1}catch(t){return e.apply(n,r),!1}else{var i;if((i=t.toString())===d||i==p)return e.apply(n,r),!1}else if(u)try{t.toString()}catch(t){return e.apply(n,r),!1}return!0}}),t.patchEventTarget=s}(e,n);var r=e.XMLHttpRequestEventTarget;r&&r.prototype&&n.patchEventTarget(e,[r.prototype]),o("MutationObserver"),o("WebKitMutationObserver"),o("IntersectionObserver"),o("FileReader")}),Zone.__load_patch("on_property",function(e,t,n){(function(e,t){if(!x||E){var n="undefined"!=typeof WebSocket;if(function(){if((C||E)&&!Object.getOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var e=Object.getOwnPropertyDescriptor(Element.prototype,"onclick");if(e&&!e.configurable)return!1}var t=Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype,"onreadystatechange");if(t){Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}});var n=!!(i=new XMLHttpRequest).onreadystatechange;return Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",t||{}),n}var r=g("fakeonreadystatechange");Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[r]},set:function(e){this[r]=e}});var i,o=function(){};(i=new XMLHttpRequest).onreadystatechange=o;n=i[r]===o;return i.onreadystatechange=null,n}()){var r=t.__Zone_ignore_on_properties;if(C){h(window,ie.concat(["messageerror"]),r,Object.getPrototypeOf(window)),h(Document.prototype,ie,r),void 0!==window.SVGElement&&h(window.SVGElement.prototype,ie,r),h(Element.prototype,ie,r),h(HTMLElement.prototype,ie,r),h(HTMLMediaElement.prototype,Q,r),h(HTMLFrameSetElement.prototype,Z.concat(X),r),h(HTMLBodyElement.prototype,Z.concat(X),r),h(HTMLFrameElement.prototype,Y,r),h(HTMLIFrameElement.prototype,Y,r);var l=window.HTMLMarqueeElement;l&&h(l.prototype,J,r);var a=window.Worker;a&&h(a.prototype,re,r)}h(XMLHttpRequest.prototype,ee,r);var u=t.XMLHttpRequestEventTarget;u&&h(u&&u.prototype,ee,r),"undefined"!=typeof IDBIndex&&(h(IDBIndex.prototype,te,r),h(IDBRequest.prototype,te,r),h(IDBOpenDBRequest.prototype,te,r),h(IDBDatabase.prototype,te,r),h(IDBTransaction.prototype,te,r),h(IDBCursor.prototype,te,r)),n&&h(WebSocket.prototype,ne,r)}else!function(){for(var e=function(e){var t=ie[e],n="on"+t;self.addEventListener(t,function(e){var t,r,i=e.target;for(r=i?i.constructor.name+"."+n:"unknown."+n;i;)i[n]&&!i[n][oe]&&((t=Zone.current.wrap(i[n],r))[oe]=i[n],i[n]=t),i=i.parentElement},!0)},t=0;t<ie.length;t++)e(t)}(),o("XMLHttpRequest"),n&&function(e,t){var n=t.WebSocket;t.EventTarget||s(t,[n.prototype]),t.WebSocket=function(e,t){var r,o,l=arguments.length>1?new n(e,t):new n(e),a=Object.getOwnPropertyDescriptor(l,"onmessage");return a&&!1===a.configurable?(r=Object.create(l),o=l,["addEventListener","removeEventListener","send","close"].forEach(function(e){r[e]=function(){var t=Array.prototype.slice.call(arguments);if("addEventListener"===e||"removeEventListener"===e){var n=t.length>0?t[0]:void 0;if(n){var i=Zone.__symbol__("ON_PROPERTY"+n);l[i]=r[i]}}return l[e].apply(l,t)}})):r=l,i(r,["close","error","message","open"],o),r};var r=t.WebSocket;for(var o in n)r[o]=n[o]}(0,t)}})(0,e),Object.defineProperty=function(e,t,n){if(d(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var r=n.configurable;return"prototype"!==t&&(n=p(e,t,n)),f(e,t,n,r)},Object.defineProperties=function(e,t){return Object.keys(t).forEach(function(n){Object.defineProperty(e,n,t[n])}),e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach(function(n){t[n]=p(e,n,t[n])}),G(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=U(e,t);return d(e,t)&&(n.configurable=!1),n},function(t){if((C||E)&&"registerElement"in e.document){var n=document.registerElement,r=["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"];document.registerElement=function(e,t){return t&&t.prototype&&r.forEach(function(e){var n="Document.registerElement::"+e;if(t.prototype.hasOwnProperty(e)){var r=Object.getOwnPropertyDescriptor(t.prototype,e);r&&r.value?(r.value=Zone.current.wrap(r.value,n),function(t,n,r){var i=r.configurable;f(t,e,r=p(t,e,r),i)}(t.prototype,0,r)):t.prototype[e]=Zone.current.wrap(t.prototype[e],n)}else t.prototype[e]&&(t.prototype[e]=Zone.current.wrap(t.prototype[e],n))}),n.apply(document,[e,t])},a(document.registerElement,n)}}()}),Zone.__load_patch("canvas",function(e,t,n){var r=e.HTMLCanvasElement;void 0!==r&&r.prototype&&r.prototype.toBlob&&function(e,t,n){function i(e){var t=e.data;return t.args[t.callbackIndex]=function(){e.invoke.apply(this,arguments)},o.apply(t.target,t.args),e}var o=null;o=l(r.prototype,"toBlob",function(e){return function(t,n){var r={name:"HTMLCanvasElement.toBlob",target:t,callbackIndex:0,args:n};return r.callbackIndex>=0&&"function"==typeof n[r.callbackIndex]?Zone.current.scheduleMacroTask(r.name,n[r.callbackIndex],r,i,null):e.apply(t,n)}})}()}),Zone.__load_patch("XHR",function(e,t,n){!function(e){function n(e){XMLHttpRequest[a]=!1;var t=e.data,n=t.target,i=n[o];f||(f=n[d],h=n[p]),i&&h.apply(n,[y,i]);var l=n[o]=function(){n.readyState===n.DONE&&!t.aborted&&XMLHttpRequest[a]&&e.state===v&&e.invoke()};return f.apply(n,[y,l]),n[r]||(n[r]=e),_.apply(n,t.args),XMLHttpRequest[a]=!0,e}function u(){}function c(e){var t=e.data;return t.aborted=!0,w.apply(t.target,t.args)}var d=g("addEventListener"),p=g("removeEventListener"),f=XMLHttpRequest.prototype[d],h=XMLHttpRequest.prototype[p];if(!f){var m=e.XMLHttpRequestEventTarget;m&&(f=m.prototype[d],h=m.prototype[p])}var y="readystatechange",v="scheduled",b=l(e.XMLHttpRequest.prototype,"open",function(){return function(e,t){return e[i]=0==t[2],e[s]=t[1],b.apply(e,t)}}),_=l(e.XMLHttpRequest.prototype,"send",function(){return function(e,r){var o=t.current;return e[i]?_.apply(e,r):o.scheduleMacroTask("XMLHttpRequest.send",u,{target:e,url:e[s],isPeriodic:!1,delay:null,args:r,aborted:!1},n,c)}}),w=l(e.XMLHttpRequest.prototype,"abort",function(e){return function(e,t){var n=e[r];if(n&&"string"==typeof n.type){if(null==n.cancelFn||n.data&&n.data.aborted)return;n.zone.cancelTask(n)}}})}(e);var r=g("xhrTask"),i=g("xhrSync"),o=g("xhrListener"),a=g("xhrScheduled"),s=g("xhrURL")}),Zone.__load_patch("geolocation",function(e,r,i){e.navigator&&e.navigator.geolocation&&function(e,r){for(var i=e.constructor.name,o=function(o){var l=r[o],s=e[l];if(s){if(!n(Object.getOwnPropertyDescriptor(e,l)))return"continue";e[l]=function(e){var n=function(){return e.apply(this,t(arguments,i+"."+l))};return a(n,e),n}(s)}},l=0;l<r.length;l++)o(l)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(e,t,n){function r(t){return function(n){u(e,t).forEach(function(r){var i=e.PromiseRejectionEvent;if(i){var o=new i(t,{promise:n.promise,reason:n.rejection});r.invoke(o)}})}}e.PromiseRejectionEvent&&(t[g("unhandledPromiseRejectionHandler")]=r("unhandledrejection"),t[g("rejectionHandledHandler")]=r("rejectionhandled"))})}()}).call(t,n("fRUx"))},eIqN:function(e,t,n){"use strict";function r(){return function(e){return e.lift(new c(e))}}function i(){return new l.Subject}var o=n("6Xbx"),l=n("TO51"),a=n("AP4T"),s=n("E9/g"),u=n("qLnt"),c=function(){function e(e){this.connectable=e}return e.prototype.call=function(e,t){var n=this.connectable;n._refCount++;var r=new d(e,n),i=t.subscribe(r);return r.closed||(r.connection=n.connect()),i},e}(),d=function(e){function t(t,n){e.call(this,t),this.connectable=n}return Object(o.__extends)(t,e),t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._refCount;if(t<=0)this.connection=null;else if(e._refCount=t-1,t>1)this.connection=null;else{var n=this.connection,r=e._connection;this.connection=null,!r||n&&r!==n||r.unsubscribe()}}else this.connection=null},t}(s.a),p=function(e){function t(t,n){e.call(this),this.source=t,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}return Object(o.__extends)(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype.connect=function(){var e=this._connection;return e||(this._isComplete=!1,(e=this._connection=new u.a).add(this.source.subscribe(new h(this.getSubject(),this))),e.closed?(this._connection=null,e=u.a.EMPTY):this._connection=e),e},t.prototype.refCount=function(){return r()(this)},t}(a.a).prototype,f={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:p._subscribe},_isComplete:{value:p._isComplete,writable:!0},getSubject:{value:p.getSubject},connect:{value:p.connect},refCount:{value:p.refCount}},h=function(e){function t(t,n){e.call(this,t),this.connectable=n}return Object(o.__extends)(t,e),t.prototype._error=function(t){this._unsubscribe(),e.prototype._error.call(this,t)},t.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),e.prototype._complete.call(this)},t.prototype._unsubscribe=function(){var e=this.connectable;if(e){this.connectable=null;var t=e._connection;e._refCount=0,e._subject=null,e._connection=null,t&&t.unsubscribe()}},t}(l.SubjectSubscriber);t.a=function(){return function(e){return r()(function(e,t){return function(t){var n;n="function"==typeof e?e:function(){return e};var r=Object.create(t,f);return r.source=t,r.subjectFactory=n,r}}(i)(e))}}},eoFs:function(e,t,n){"use strict";n.d(t,"a",function(){return l});var r=n("6Xbx"),i=n("TO51"),o=n("Upor"),l=function(e){function t(t){e.call(this),this._value=t}return Object(r.__extends)(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),t.prototype._subscribe=function(t){var n=e.prototype._subscribe.call(this,t);return n&&!n.closed&&t.next(this._value),n},t.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new o.a;return this._value},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(i.Subject)},ewdp:function(e,t,n){var r=n("tose"),i=n("+pQw"),o=n("2Fuj");e.exports=n("V+0c")?Object.defineProperties:function(e,t){i(e);for(var n,l=o(t),a=l.length,s=0;a>s;)r.f(e,n=l[s++],t[n]);return e}},f8Ud:function(e,t){(function(t){e.exports=t}).call(t,{})},fAeS:function(e,t,n){"use strict";function r(e,t){return{type:7,name:e,definitions:t,options:{}}}function i(e,t){return void 0===t&&(t=null),{type:4,styles:t,timings:e}}function o(e,t){return void 0===t&&(t=null),{type:3,steps:e,options:t}}function l(e,t){return void 0===t&&(t=null),{type:2,steps:e,options:t}}function a(e){return{type:6,styles:e,offset:null}}function s(e,t,n){return{type:0,name:e,styles:t,options:n}}function u(e){return{type:5,steps:e}}function c(e,t,n){return void 0===n&&(n=null),{type:1,expr:e,animation:t,options:n}}function d(e,t){return void 0===t&&(t=null),{type:8,animation:e,options:t}}function p(e){return void 0===e&&(e=null),{type:9,options:e}}function f(e,t){return void 0===t&&(t=null),{type:10,animation:e,options:t}}function h(e,t,n){return void 0===n&&(n=null),{type:11,selector:e,animation:t,options:n}}function m(e,t){return{type:12,timings:e,animation:t}}function g(e){Promise.resolve(null).then(e)}Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"AnimationBuilder",function(){return y}),n.d(t,"AnimationFactory",function(){return v}),n.d(t,"AUTO_STYLE",function(){return b}),n.d(t,"animate",function(){return i}),n.d(t,"animateChild",function(){return p}),n.d(t,"animation",function(){return d}),n.d(t,"group",function(){return o}),n.d(t,"keyframes",function(){return u}),n.d(t,"query",function(){return h}),n.d(t,"sequence",function(){return l}),n.d(t,"stagger",function(){return m}),n.d(t,"state",function(){return s}),n.d(t,"style",function(){return a}),n.d(t,"transition",function(){return c}),n.d(t,"trigger",function(){return r}),n.d(t,"useAnimation",function(){return f}),n.d(t,"NoopAnimationPlayer",function(){return _}),n.d(t,"\u0275AnimationGroupPlayer",function(){return w}),n.d(t,"\u0275PRE_STYLE",function(){return x});var y=function(){},v=function(){},b="*",_=function(){function e(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return e.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},e.prototype.onStart=function(e){this._onStartFns.push(e)},e.prototype.onDone=function(e){this._onDoneFns.push(e)},e.prototype.onDestroy=function(e){this._onDestroyFns.push(e)},e.prototype.hasStarted=function(){return this._started},e.prototype.init=function(){},e.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},e.prototype.triggerMicrotask=function(){var e=this;g(function(){return e._onFinish()})},e.prototype._onStart=function(){this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[]},e.prototype.pause=function(){},e.prototype.restart=function(){},e.prototype.finish=function(){this._onFinish()},e.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])},e.prototype.reset=function(){},e.prototype.setPosition=function(e){},e.prototype.getPosition=function(){return 0},e.prototype.triggerCallback=function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0},e}(),w=function(){function e(e){var t=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=e;var n=0,r=0,i=0,o=this.players.length;0==o?g(function(){return t._onFinish()}):this.players.forEach(function(e){e.onDone(function(){++n>=o&&t._onFinish()}),e.onDestroy(function(){++r>=o&&t._onDestroy()}),e.onStart(function(){++i>=o&&t._onStart()})}),this.totalTime=this.players.reduce(function(e,t){return Math.max(e,t.totalTime)},0)}return e.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(e){return e()}),this._onDoneFns=[])},e.prototype.init=function(){this.players.forEach(function(e){return e.init()})},e.prototype.onStart=function(e){this._onStartFns.push(e)},e.prototype._onStart=function(){this.hasStarted()||(this._onStartFns.forEach(function(e){return e()}),this._onStartFns=[],this._started=!0)},e.prototype.onDone=function(e){this._onDoneFns.push(e)},e.prototype.onDestroy=function(e){this._onDestroyFns.push(e)},e.prototype.hasStarted=function(){return this._started},e.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(e){return e.play()})},e.prototype.pause=function(){this.players.forEach(function(e){return e.pause()})},e.prototype.restart=function(){this.players.forEach(function(e){return e.restart()})},e.prototype.finish=function(){this._onFinish(),this.players.forEach(function(e){return e.finish()})},e.prototype.destroy=function(){this._onDestroy()},e.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(e){return e.destroy()}),this._onDestroyFns.forEach(function(e){return e()}),this._onDestroyFns=[])},e.prototype.reset=function(){this.players.forEach(function(e){return e.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},e.prototype.setPosition=function(e){var t=e*this.totalTime;this.players.forEach(function(e){var n=e.totalTime?Math.min(1,t/e.totalTime):1;e.setPosition(n)})},e.prototype.getPosition=function(){var e=0;return this.players.forEach(function(t){var n=t.getPosition();e=Math.min(n,e)}),e},e.prototype.beforeDestroy=function(){this.players.forEach(function(e){e.beforeDestroy&&e.beforeDestroy()})},e.prototype.triggerCallback=function(e){var t="start"==e?this._onStartFns:this._onDoneFns;t.forEach(function(e){return e()}),t.length=0},e}(),x="!"},fC8q:function(e,t,n){var r=n("dXJ/"),i=n("3r0D")("iterator"),o=n("lexG");e.exports=n("b4gG").getIteratorMethod=function(e){if(void 0!=e)return e[i]||e["@@iterator"]||o[r(e)]}},fHxy:function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=r.key,l=r.set;r.exp({defineMetadata:function(e,t,n,r){l(e,t,i(n),o(r))}})},fRUx:function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},gBtn:function(e,t,n){var r=n("ZI9W"),i=n("CDXM"),o=n("Iclu")("metadata"),l=o.store||(o.store=new(n("QZhw"))),a=function(e,t,n){var i=l.get(e);if(!i){if(!n)return;l.set(e,i=new r)}var o=i.get(t);if(!o){if(!n)return;i.set(t,o=new r)}return o};e.exports={store:l,map:a,has:function(e,t,n){var r=a(t,n,!1);return void 0!==r&&r.has(e)},get:function(e,t,n){var r=a(t,n,!1);return void 0===r?void 0:r.get(e)},set:function(e,t,n,r){a(n,r,!0).set(e,t)},keys:function(e,t){var n=a(e,t,!1),r=[];return n&&n.forEach(function(e,t){r.push(t)}),r},key:function(e){return void 0===e||"symbol"==typeof e?e:String(e)},exp:function(e){i(i.S,"Reflect",e)}}},gNkH:function(e,t,n){e.exports=!n("V+0c")&&!n("umMR")(function(){return 7!=Object.defineProperty(n("BQSv")("div"),"a",{get:function(){return 7}}).a})},grVA:function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r={closed:!0,next:function(e){},error:function(e){throw e},complete:function(){}}},gxdV:function(e,t,n){var r=n("tose"),i=n("piOq");e.exports=n("V+0c")?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},gy58:function(e,t,n){"use strict";t.a=function(e){return Object(r.a)(e)(this)};var r=n("5O0w")},jaVc:function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("6Xbx"),i=function(e){function t(t,n){e.call(this),this.subject=t,this.subscriber=n,this.closed=!1}return Object(r.__extends)(t,e),t.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var e=this.subject,t=e.observers;if(this.subject=null,t&&0!==t.length&&!e.isStopped&&!e.closed){var n=t.indexOf(this.subscriber);-1!==n&&t.splice(n,1)}}},t}(n("qLnt").a)},kQVV:function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=function(e){return e&&"number"==typeof e.length}},lI6h:function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n("6Xbx"),i=function(e){function t(){e.apply(this,arguments)}return Object(r.__extends)(t,e),t.prototype.notifyNext=function(e,t,n,r,i){this.destination.next(t)},t.prototype.notifyError=function(e,t){this.destination.error(e)},t.prototype.notifyComplete=function(e){this.destination.complete()},t}(n("E9/g").a)},lexG:function(e,t){e.exports={}},lfBE:function(e,t,n){var r=n("ptrv"),i=n("gxdV"),o=n("rMsi"),l=n("c09d")("src"),a=Function.toString,s=(""+a).split("toString");n("b4gG").inspectSource=function(e){return a.call(e)},(e.exports=function(e,t,n,a){var u="function"==typeof n;u&&(o(n,"name")||i(n,"name",t)),e[t]!==n&&(u&&(o(n,l)||i(n,l,e[t]?""+e[t]:s.join(String(t)))),e===r?e[t]=n:a?e[t]?e[t]=n:i(e,t,n):(delete e[t],i(e,t,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[l]||a.call(this)})},lzDK:function(e,t){t.f=Object.getOwnPropertySymbols},mHG6:function(e,t,n){"use strict";t.a=function(e){return e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}},mz3w:function(e,t,n){"use strict";n.d(t,"a",function(){return r});var r=function(e){var t,r=n("xIGM").a.Symbol;return"function"==typeof r?r.observable?t=r.observable:(t=r("observable"),r.observable=t):t="@@observable",t}()},ncNB:function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=r.get,l=r.key;r.exp({getOwnMetadata:function(e,t){return o(e,i(t),arguments.length<3?void 0:l(arguments[2]))}})},oiK7:function(e,t,n){e.exports=function(){"use strict";function e(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}function t(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function n(e,n){return t(e).appendChild(n)}function r(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function i(e,t,n,i){var o=r(e,t,n,i);return o.setAttribute("role","presentation"),o}function o(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function l(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function a(t,n){var r=t.className;e(n).test(r)||(t.className+=(r?" ":"")+n)}function s(t,n){for(var r=t.split(" "),i=0;i<r.length;i++)r[i]&&!e(r[i]).test(n)&&(n+=" "+r[i]);return n}function u(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function c(e,t,n){t||(t={});for(var r in e)!e.hasOwnProperty(r)||!1===n&&t.hasOwnProperty(r)||(t[r]=e[r]);return t}function d(e,t,n,r,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=r||0,l=i||0;;){var a=e.indexOf("\t",o);if(a<0||a>=t)return l+(t-o);l+=a-o,l+=n-l%n,o=a+1}}function p(e,t){for(var n=0;n<e.length;++n)if(e[n]==t)return n;return-1}function f(e,t,n){for(var r=0,i=0;;){var o=e.indexOf("\t",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||i+l>=t)return r+Math.min(l,t-i);if(i+=o-r,i+=n-i%n,r=o+1,i>=t)return r}}function h(e){for(;go.length<=e;)go.push(m(go)+" ");return go[e]}function m(e){return e[e.length-1]}function g(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r);return n}function y(){}function v(e,t){var n;return Object.create?n=Object.create(e):(y.prototype=e,n=new y),t&&c(t,n),n}function b(e){return/\w/.test(e)||e>"\x80"&&(e.toUpperCase()!=e.toLowerCase()||yo.test(e))}function _(e,t){return t?!!(t.source.indexOf("\\w")>-1&&b(e))||t.test(e):b(e)}function w(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function x(e){return e.charCodeAt(0)>=768&&vo.test(e)}function C(e,t,n){for(;(n<0?t>0:t<e.length)&&x(e.charAt(t));)t+=n;return t}function E(e,t,n){for(var r=t>n?-1:1;;){if(t==n)return t;var i=(t+n)/2,o=r<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:n;e(o)?n=o:t=o+r}}function S(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(t<o){n=i;break}t-=o}return n.lines[t]}function O(e,t,n){var r=[],i=t.line;return e.iter(t.line,n.line+1,function(e){var o=e.text;i==n.line&&(o=o.slice(0,n.ch)),i==t.line&&(o=o.slice(t.ch)),r.push(o),++i}),r}function T(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function k(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function D(e){if(null==e.parent)return null;for(var t=e.parent,n=p(t.lines,e),r=t.parent;r;t=r,r=r.parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function I(e,t){var n=e.first;e:do{for(var r=0;r<e.children.length;++r){var i=e.children[r],o=i.height;if(t<o){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var l=0;l<e.lines.length;++l){var a=e.lines[l].height;if(t<a)break;t-=a}return n+l}function R(e,t){return t>=e.first&&t<e.first+e.size}function M(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function P(e,t,n){if(void 0===n&&(n=null),!(this instanceof P))return new P(e,t,n);this.line=e,this.ch=t,this.sticky=n}function N(e,t){return e.line-t.line||e.ch-t.ch}function A(e,t){return e.sticky==t.sticky&&0==N(e,t)}function L(e){return P(e.line,e.ch)}function F(e,t){return N(e,t)<0?t:e}function j(e,t){return N(e,t)<0?e:t}function V(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function z(e,t){if(t.line<e.first)return P(e.first,0);var n=e.first+e.size-1;return t.line>n?P(n,S(e,n).text.length):function(e,t){var n=e.ch;return null==n||n>t?P(e.line,t):n<0?P(e.line,0):e}(t,S(e,t.line).text.length)}function B(e,t){for(var n=[],r=0;r<t.length;r++)n[r]=z(e,t[r]);return n}function H(e,t,n){this.marker=e,this.from=t,this.to=n}function W(e,t){if(e)for(var n=0;n<e.length;++n){var r=e[n];if(r.marker==t)return r}}function q(e,t){for(var n,r=0;r<e.length;++r)e[r]!=t&&(n||(n=[])).push(e[r]);return n}function U(e,t){if(t.full)return null;var n=R(e,t.from.line)&&S(e,t.from.line).markedSpans,r=R(e,t.to.line)&&S(e,t.to.line).markedSpans;if(!n&&!r)return null;var i=t.from.ch,o=t.to.ch,l=0==N(t.from,t.to),a=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;null!=o.from&&!(l.inclusiveLeft?o.from<=t:o.from<t)&&(o.from!=t||"bookmark"!=l.type||n&&o.marker.insertLeft)||(r||(r=[])).push(new H(l,o.from,null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)?null:o.to))}return r}(n,i,l),s=function(e,t,n){var r;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&"bookmark"==l.type&&(!n||o.marker.insertLeft))&&(r||(r=[])).push(new H(l,null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)?null:o.from-t,null==o.to?null:o.to-t))}return r}(r,o,l),u=1==t.text.length,c=m(t.text).length+(u?i:0);if(a)for(var d=0;d<a.length;++d){var p=a[d];if(null==p.to){var f=W(s,p.marker);f?u&&(p.to=null==f.to?null:f.to+c):p.to=i}}if(s)for(var h=0;h<s.length;++h){var g=s[h];null!=g.to&&(g.to+=c),null==g.from?W(a,g.marker)||(g.from=c,u&&(a||(a=[])).push(g)):(g.from+=c,u&&(a||(a=[])).push(g))}a&&(a=G(a)),s&&s!=a&&(s=G(s));var y=[a];if(!u){var v,b=t.text.length-2;if(b>0&&a)for(var _=0;_<a.length;++_)null==a[_].to&&(v||(v=[])).push(new H(a[_].marker,null,null));for(var w=0;w<b;++w)y.push(v);y.push(s)}return y}function G(e){for(var t=0;t<e.length;++t){var n=e[t];null!=n.from&&n.from==n.to&&!1!==n.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function K(e){var t=e.markedSpans;if(t){for(var n=0;n<t.length;++n)t[n].marker.detachLine(e);e.markedSpans=null}}function $(e,t){if(t){for(var n=0;n<t.length;++n)t[n].marker.attachLine(e);e.markedSpans=t}}function Z(e){return e.inclusiveLeft?-1:0}function Q(e){return e.inclusiveRight?1:0}function Y(e,t){var n=e.lines.length-t.lines.length;if(0!=n)return n;var r=e.find(),i=t.find(),o=N(r.from,i.from)||Z(e)-Z(t);if(o)return-o;return N(r.to,i.to)||Q(e)-Q(t)||t.id-e.id}function X(e,t){var n,r=_o&&e.markedSpans;if(r)for(var i=void 0,o=0;o<r.length;++o)(i=r[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!n||Y(n,i.marker)<0)&&(n=i.marker);return n}function J(e){return X(e,!0)}function ee(e){return X(e,!1)}function te(e,t,n,r,i){var o=S(e,t),l=_o&&o.markedSpans;if(l)for(var a=0;a<l.length;++a){var s=l[a];if(s.marker.collapsed){var u=s.marker.find(0),c=N(u.from,n)||Z(s.marker)-Z(i),d=N(u.to,r)||Q(s.marker)-Q(i);if(!(c>=0&&d<=0||c<=0&&d>=0)&&(c<=0&&(s.marker.inclusiveRight&&i.inclusiveLeft?N(u.to,n)>=0:N(u.to,n)>0)||c>=0&&(s.marker.inclusiveRight&&i.inclusiveLeft?N(u.from,r)<=0:N(u.from,r)<0)))return!0}}}function ne(e){for(var t;t=J(e);)e=t.find(-1,!0).line;return e}function re(e,t){var n=S(e,t),r=ne(n);return n==r?t:D(r)}function ie(e,t){if(t>e.lastLine())return t;var n,r=S(e,t);if(!oe(e,r))return t;for(;n=ee(r);)r=n.find(1,!0).line;return D(r)+1}function oe(e,t){var n=_o&&t.markedSpans;if(n)for(var r=void 0,i=0;i<n.length;++i)if((r=n[i]).marker.collapsed){if(null==r.from)return!0;if(!r.marker.widgetNode&&0==r.from&&r.marker.inclusiveLeft&&le(e,t,r))return!0}}function le(e,t,n){if(null==n.to){var r=n.marker.find(1,!0);return le(e,r.line,W(r.line.markedSpans,n.marker))}if(n.marker.inclusiveRight&&n.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==n.to&&(null==i.to||i.to!=n.from)&&(i.marker.inclusiveLeft||n.marker.inclusiveRight)&&le(e,t,i))return!0}function ae(e){for(var t=0,n=(e=ne(e)).parent,r=0;r<n.lines.length;++r){var i=n.lines[r];if(i==e)break;t+=i.height}for(var o=n.parent;o;n=o,o=n.parent)for(var l=0;l<o.children.length;++l){var a=o.children[l];if(a==n)break;t+=a.height}return t}function se(e){if(0==e.height)return 0;for(var t,n=e.text.length,r=e;t=J(r);){var i=t.find(0,!0);r=i.from.line,n+=i.from.ch-i.to.ch}for(r=e;t=ee(r);){var o=t.find(0,!0);n-=r.text.length-o.from.ch,n+=(r=o.to.line).text.length-o.to.ch}return n}function ue(e){var t=e.display,n=e.doc;t.maxLine=S(n,n.first),t.maxLineLength=se(t.maxLine),t.maxLineChanged=!0,n.iter(function(e){var n=se(e);n>t.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)})}function ce(e,t,n){var r;wo=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==n?r=i:wo=i),o.from==t&&(o.from!=o.to&&"before"!=n?r=i:wo=i)}return null!=r?r:wo}function de(e,t){var n=e.order;return null==n&&(n=e.order=xo(e.text,t)),n}function pe(e,t){return e._handlers&&e._handlers[t]||Co}function fe(e,t,n){if(e.removeEventListener)e.removeEventListener(t,n,!1);else if(e.detachEvent)e.detachEvent("on"+t,n);else{var r=e._handlers,i=r&&r[t];if(i){var o=p(i,n);o>-1&&(r[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function he(e,t){var n=pe(e,t);if(n.length)for(var r=Array.prototype.slice.call(arguments,2),i=0;i<n.length;++i)n[i].apply(null,r)}function me(e,t,n){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),he(e,n||t.type,e,t),we(t)||t.codemirrorIgnore}function ge(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var n=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),r=0;r<t.length;++r)-1==p(n,t[r])&&n.push(t[r])}function ye(e,t){return pe(e,t).length>0}function ve(e){e.prototype.on=function(e,t){Eo(this,e,t)},e.prototype.off=function(e,t){fe(this,e,t)}}function be(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function _e(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function we(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function xe(e){be(e),_e(e)}function Ce(e){return e.target||e.srcElement}function Ee(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),Xi&&e.ctrlKey&&1==t&&(t=3),t}function Se(e){if(null==so){var t=r("span","\u200b");n(e,r("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(so=t.offsetWidth<=1&&t.offsetHeight>2&&!(zi&&Bi<8))}var i=so?r("span","\u200b"):r("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px");return i.setAttribute("cm-text",""),i}function Oe(e){if(null!=uo)return uo;var r=n(e,document.createTextNode("A\u062eA")),i=no(r,0,1).getBoundingClientRect(),o=no(r,1,2).getBoundingClientRect();return t(e),!(!i||i.left==i.right)&&(uo=o.right-i.right<3)}function Te(e){if("string"==typeof e&&Ro.hasOwnProperty(e))e=Ro[e];else if(e&&"string"==typeof e.name&&Ro.hasOwnProperty(e.name)){var t=Ro[e.name];"string"==typeof t&&(t={name:t}),(e=v(t,e)).name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Te("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Te("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function ke(e,t){t=Te(t);var n=Io[t.name];if(!n)return ke(e,"text/plain");var r=n(e,t);if(Mo.hasOwnProperty(t.name)){var i=Mo[t.name];for(var o in i)i.hasOwnProperty(o)&&(r.hasOwnProperty(o)&&(r["_"+o]=r[o]),r[o]=i[o])}if(r.name=t.name,t.helperType&&(r.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)r[l]=t.modeProps[l];return r}function De(e,t){c(t,Mo.hasOwnProperty(e)?Mo[e]:Mo[e]={})}function Ie(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n}function Re(e,t){for(var n;e.innerMode&&(n=e.innerMode(t))&&n.mode!=e;)t=n.state,e=n.mode;return n||{mode:e,state:t}}function Me(e,t,n){return!e.startState||e.startState(t,n)}function Pe(e,t,n,r){var i=[e.state.modeGen],o={};Be(e,t.text,e.doc.mode,n,function(e,t){return i.push(e,t)},o,r);for(var l=n.state,a=function(r){n.baseTokens=i;var a=e.state.overlays[r],s=1,u=0;n.state=!0,Be(e,t.text,a.mode,n,function(e,t){for(var n=s;u<e;){var r=i[s];r>e&&i.splice(s,1,e,i[s+1],r),s+=2,u=Math.min(e,r)}if(t)if(a.opaque)i.splice(n,s-n,e,"overlay "+t),s=n+2;else for(;n<s;n+=2){var o=i[n+1];i[n+1]=(o?o+" ":"")+"overlay "+t}},o),n.state=l,n.baseTokens=null,n.baseTokenPos=1},s=0;s<e.state.overlays.length;++s)a(s);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Ne(e,t,n){if(!t.styles||t.styles[0]!=e.state.modeGen){var r=Ae(e,D(t)),i=t.text.length>e.options.maxHighlightLength&&Ie(e.doc.mode,r.state),o=Pe(e,t,r);i&&(r.state=i),t.stateAfter=r.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function Ae(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return new Ao(r,!0,t);var o=function(e,n,r){for(var i,o,l=e.doc,a=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>a;--s){if(s<=l.first)return l.first;var u=S(l,s-1),c=u.stateAfter;if(c&&(!r||s+(c instanceof No?c.lookAhead:0)<=l.modeFrontier))return s;var p=d(u.text,null,e.options.tabSize);(null==o||i>p)&&(o=s-1,i=p)}return o}(e,0,n),l=o>r.first&&S(r,o-1).stateAfter,a=l?Ao.fromSaved(r,l,o):new Ao(r,Me(r.mode),o);return r.iter(o,t,function(n){Le(e,n.text,a);var r=a.line;n.stateAfter=r==t-1||r%5==0||r>=i.viewFrom&&r<i.viewTo?a.save():null,a.nextLine()}),n&&(r.modeFrontier=a.line),a}function Le(e,t,n,r){var i=e.doc.mode,o=new Po(t,e.options.tabSize,n);for(o.start=o.pos=r||0,""==t&&Fe(i,n.state);!o.eol();)je(i,o,n.state),o.start=o.pos}function Fe(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var n=Re(e,t);return n.mode.blankLine?n.mode.blankLine(n.state):void 0}}function je(e,t,n,r){for(var i=0;i<10;i++){r&&(r[0]=Re(e,n).mode);var o=e.token(t,n);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}function Ve(e,t,n,r){var i,o,l=e.doc,a=l.mode,s=S(l,(t=z(l,t)).line),u=Ae(e,t.line,n),c=new Po(s.text,e.options.tabSize,u);for(r&&(o=[]);(r||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=je(a,c,u.state),r&&o.push(new Lo(c,i,Ie(l.mode,u.state)));return r?o:new Lo(c,i,u.state)}function ze(e,t){if(e)for(;;){var n=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!n)break;e=e.slice(0,n.index)+e.slice(n.index+n[0].length);var r=n[1]?"bgClass":"textClass";null==t[r]?t[r]=n[2]:new RegExp("(?:^|s)"+n[2]+"(?:$|s)").test(t[r])||(t[r]+=" "+n[2])}return e}function Be(e,t,n,r,i,o,l){var a=n.flattenSpans;null==a&&(a=e.options.flattenSpans);var s,u=0,c=null,d=new Po(t,e.options.tabSize,r),p=e.options.addModeClass&&[null];for(""==t&&ze(Fe(n,r.state),o);!d.eol();){if(d.pos>e.options.maxHighlightLength?(a=!1,l&&Le(e,t,r,d.pos),d.pos=t.length,s=null):s=ze(je(n,d,r.state,p),o),p){var f=p[0].name;f&&(s="m-"+(s?f+" "+s:f))}if(!a||c!=s){for(;u<d.start;)i(u=Math.min(d.start,u+5e3),c);c=s}d.start=d.pos}for(;u<d.pos;){var h=Math.min(d.pos,u+5e3);i(h,c),u=h}}function He(e){e.parent=null,K(e)}function We(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?zo:Vo;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function qe(e,t){var n=i("span",null,null,Hi?"padding-right: .1px":null),r={pre:i("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(zi||Hi)&&e.getOption("lineWrapping")};t.measure={};for(var o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,a=void 0;r.pos=0,r.addToken=Ge,Oe(e.display.measure)&&(a=de(l,e.doc.direction))&&(r.addToken=function(e,t){return function(n,r,i,o,l,a,s){i=i?i+" cm-force-border":"cm-force-border";for(var u=n.pos,c=u+r.length;;){for(var d=void 0,p=0;p<t.length&&!((d=t[p]).to>u&&d.from<=u);p++);if(d.to>=c)return e(n,r,i,o,l,a,s);e(n,r.slice(0,d.to-u),i,o,null,a,s),o=null,r=r.slice(d.to-u),u=d.to}}}(r.addToken,a)),r.map=[],function(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(r)for(var l,a,s,u,c,d,p,f=i.length,h=0,m=1,g="",y=0;;){if(y==h){s=u=c=d=a="",p=null,y=1/0;for(var v=[],b=void 0,_=0;_<r.length;++_){var w=r[_],x=w.marker;"bookmark"==x.type&&w.from==h&&x.widgetNode?v.push(x):w.from<=h&&(null==w.to||w.to>h||x.collapsed&&w.to==h&&w.from==h)?(null!=w.to&&w.to!=h&&y>w.to&&(y=w.to,u=""),x.className&&(s+=" "+x.className),x.css&&(a=(a?a+";":"")+x.css),x.startStyle&&w.from==h&&(c+=" "+x.startStyle),x.endStyle&&w.to==y&&(b||(b=[])).push(x.endStyle,w.to),x.title&&!d&&(d=x.title),x.collapsed&&(!p||Y(p.marker,x)<0)&&(p=w)):w.from>h&&y>w.from&&(y=w.from)}if(b)for(var C=0;C<b.length;C+=2)b[C+1]==y&&(u+=" "+b[C]);if(!p||p.from==h)for(var E=0;E<v.length;++E)Ke(t,0,v[E]);if(p&&(p.from||0)==h){if(Ke(t,(null==p.to?f+1:p.to)-h,p.marker,null==p.from),null==p.to)return;p.to==h&&(p=!1)}}if(h>=f)break;for(var S=Math.min(f,y);;){if(g){var O=h+g.length;if(!p){var T=O>S?g.slice(0,S-h):g;t.addToken(t,T,l?l+s:s,c,h+T.length==y?u:"",d,a)}if(O>=S){g=g.slice(S-h),h=S;break}h=O,c=""}g=i.slice(o,o=n[m++]),l=We(n[m++],t.cm.options)}}else for(var k=1;k<n.length;k+=2)t.addToken(t,i.slice(o,o=n[k]),We(n[k+1],t.cm.options))}(l,r,Ne(e,l,t!=e.display.externalMeasured&&D(l))),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=s(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=s(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(Se(e.display.measure))),0==o?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(Hi){var u=r.content.lastChild;(/\bcm-tab\b/.test(u.className)||u.querySelector&&u.querySelector(".cm-tab"))&&(r.content.className="cm-tab-wrap-hack")}return he(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=s(r.pre.className,r.textClass||"")),r}function Ue(e){var t=r("span","\u2022","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Ge(e,t,n,i,o,l,a){if(t){var s,u=e.splitSpaces?function(e,t){if(e.length>1&&!/  /.test(e))return e;for(var n=t,r="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!n||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o="\xa0"),r+=o,n=" "==o}return r}(t,e.trailingSpace):t,c=e.cm.state.specialChars,d=!1;if(c.test(t)){s=document.createDocumentFragment();for(var p=0;;){c.lastIndex=p;var f=c.exec(t),m=f?f.index-p:t.length-p;if(m){var g=document.createTextNode(u.slice(p,p+m));s.appendChild(zi&&Bi<9?r("span",[g]):g),e.map.push(e.pos,e.pos+m,g),e.col+=m,e.pos+=m}if(!f)break;p+=m+1;var y=void 0;if("\t"==f[0]){var v=e.cm.options.tabSize,b=v-e.col%v;(y=s.appendChild(r("span",h(b),"cm-tab"))).setAttribute("role","presentation"),y.setAttribute("cm-text","\t"),e.col+=b}else"\r"==f[0]||"\n"==f[0]?((y=s.appendChild(r("span","\r"==f[0]?"\u240d":"\u2424","cm-invalidchar"))).setAttribute("cm-text",f[0]),e.col+=1):((y=e.cm.options.specialCharPlaceholder(f[0])).setAttribute("cm-text",f[0]),s.appendChild(zi&&Bi<9?r("span",[y]):y),e.col+=1);e.map.push(e.pos,e.pos+1,y),e.pos++}}else e.col+=t.length,s=document.createTextNode(u),e.map.push(e.pos,e.pos+t.length,s),zi&&Bi<9&&(d=!0),e.pos+=t.length;if(e.trailingSpace=32==u.charCodeAt(t.length-1),n||i||o||d||a){var _=n||"";i&&(_+=i),o&&(_+=o);var w=r("span",[s],_,a);return l&&(w.title=l),e.content.appendChild(w)}e.content.appendChild(s)}}function Ke(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function $e(e,t,n){this.line=t,this.rest=function(e){for(var t,n;t=ee(e);)e=t.find(1,!0).line,(n||(n=[])).push(e);return n}(t),this.size=this.rest?D(m(this.rest))-n+1:1,this.node=this.text=null,this.hidden=oe(e,t)}function Ze(e,t,n){for(var r,i=[],o=t;o<n;o=r){var l=new $e(e.doc,S(e.doc,o),o);r=o+l.size,i.push(l)}return i}function Qe(e,t){var n=pe(e,t);if(n.length){var r,i=Array.prototype.slice.call(arguments,2);Bo?r=Bo.delayedCallbacks:Ho?r=Ho:(r=Ho=[],setTimeout(Ye,0));for(var o=function(e){r.push(function(){return n[e].apply(null,i)})},l=0;l<n.length;++l)o(l)}}function Ye(){var e=Ho;Ho=null;for(var t=0;t<e.length;++t)e[t]()}function Xe(e,t,n,r){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?function(e,t){var n=t.text.className,r=et(e,t);t.text==t.node&&(t.node=r.pre),t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,tt(e,t)):n&&(t.text.className=n)}(e,t):"gutter"==o?nt(e,t,n,r):"class"==o?tt(e,t):"widget"==o&&function(e,t,n){t.alignable&&(t.alignable=null);for(var r=t.node.firstChild,i=void 0;r;r=i)i=r.nextSibling,"CodeMirror-linewidget"==r.className&&t.node.removeChild(r);it(e,t,n)}(e,t,r)}t.changes=null}function Je(e){return e.node==e.text&&(e.node=r("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),zi&&Bi<8&&(e.node.style.zIndex=2)),e.node}function et(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):qe(e,t)}function tt(e,t){!function(e,t){var n=t.bgClass?t.bgClass+" "+(t.line.bgClass||""):t.line.bgClass;if(n&&(n+=" CodeMirror-linebackground"),t.background)n?t.background.className=n:(t.background.parentNode.removeChild(t.background),t.background=null);else if(n){var i=Je(t);t.background=i.insertBefore(r("div",null,n),i.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?Je(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className=""),t.text.className=(t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass)||""}function nt(e,t,n,i){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var o=Je(t);t.gutterBackground=r("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?i.fixedPos:-i.gutterTotalWidth)+"px; width: "+i.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),o.insertBefore(t.gutterBackground,t.text)}var l=t.line.gutterMarkers;if(e.options.lineNumbers||l){var a=Je(t),s=t.gutter=r("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?i.fixedPos:-i.gutterTotalWidth)+"px");if(e.display.input.setUneditable(s),a.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=" "+t.line.gutterClass),!e.options.lineNumbers||l&&l["CodeMirror-linenumbers"]||(t.lineNumber=s.appendChild(r("div",M(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+i.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),l)for(var u=0;u<e.options.gutters.length;++u){var c=e.options.gutters[u],d=l.hasOwnProperty(c)&&l[c];d&&s.appendChild(r("div",[d],"CodeMirror-gutter-elt","left: "+i.gutterLeft[c]+"px; width: "+i.gutterWidth[c]+"px"))}}}function rt(e,t,n,r){var i=et(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),tt(e,t),nt(e,t,n,r),it(e,t,r),t.node}function it(e,t,n){if(ot(e,t.line,t,n,!0),t.rest)for(var r=0;r<t.rest.length;r++)ot(e,t.rest[r],t,n,!1)}function ot(e,t,n,i,o){if(t.widgets)for(var l=Je(n),a=0,s=t.widgets;a<s.length;++a){var u=s[a],c=r("div",[u.node],"CodeMirror-linewidget");u.handleMouseEvents||c.setAttribute("cm-ignore-events","true"),function(e,t,r,i){if(e.noHScroll){(n.alignable||(n.alignable=[])).push(t);var o=i.wrapperWidth;t.style.left=i.fixedPos+"px",e.coverGutter||(o-=i.gutterTotalWidth,t.style.paddingLeft=i.gutterTotalWidth+"px"),t.style.width=o+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-i.gutterTotalWidth+"px"))}(u,c,0,i),e.display.input.setUneditable(c),o&&u.above?l.insertBefore(c,n.gutter||n.text):l.appendChild(c),Qe(u,"redraw")}}function lt(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!o(document.body,e.node)){var i="position: relative;";e.coverGutter&&(i+="margin-left: -"+t.display.gutters.offsetWidth+"px;"),e.noHScroll&&(i+="width: "+t.display.wrapper.clientWidth+"px;"),n(t.display.measure,r("div",[e.node],null,i))}return e.height=e.node.parentNode.offsetHeight}function at(e,t){for(var n=Ce(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return!0}function st(e){return e.lineSpace.offsetTop}function ut(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function ct(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=n(e.measure,r("pre","x")),i=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,o={left:parseInt(i.paddingLeft),right:parseInt(i.paddingRight)};return isNaN(o.left)||isNaN(o.right)||(e.cachedPaddingH=o),o}function dt(e){return co-e.display.nativeBarWidth}function pt(e){return e.display.scroller.clientWidth-dt(e)-e.display.barWidth}function ft(e){return e.display.scroller.clientHeight-dt(e)-e.display.barHeight}function ht(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;r<e.rest.length;r++)if(e.rest[r]==t)return{map:e.measure.maps[r],cache:e.measure.caches[r]};for(var i=0;i<e.rest.length;i++)if(D(e.rest[i])>n)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function mt(e,t,n,r){return vt(e,yt(e,t),n,r)}function gt(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[Wt(e,t)];var n=e.display.externalMeasured;return n&&t>=n.lineN&&t<n.lineN+n.size?n:void 0}function yt(e,t){var r=D(t),i=gt(e,r);i&&!i.text?i=null:i&&i.changes&&(Xe(e,i,r,jt(e)),e.curOp.forceUpdate=!0),i||(i=function(e,t){var r=D(t=ne(t)),i=e.display.externalMeasured=new $e(e.doc,t,r);i.lineN=r;var o=i.built=qe(e,i);return i.text=o.pre,n(e.display.lineMeasure,o.pre),i}(e,t));var o=ht(i,t,r);return{line:t,view:i,rect:null,map:o.map,cache:o.cache,before:o.before,hasHeights:!1}}function vt(e,t,i,o,l){t.before&&(i=-1);var a,s=i+(o||"");return t.cache.hasOwnProperty(s)?a=t.cache[s]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(function(t,n,r){var i=e.options.lineWrapping,o=i&&pt(e);if(!n.measure.heights||i&&n.measure.width!=o){var l=n.measure.heights=[];if(i){n.measure.width=o;for(var a=n.text.firstChild.getClientRects(),s=0;s<a.length-1;s++){var u=a[s],c=a[s+1];Math.abs(u.bottom-c.bottom)>2&&l.push((u.bottom+c.top)/2-r.top)}}l.push(r.bottom-r.top)}}(0,t.view,t.rect),t.hasHeights=!0),(a=function(e,t,o,l){var a,s=bt(t.map,i,l),u=s.node,c=s.start,d=s.end,p=s.collapse;if(3==u.nodeType){for(var f=0;f<4;f++){for(;c&&x(t.line.text.charAt(s.coverStart+c));)--c;for(;s.coverStart+d<s.coverEnd&&x(t.line.text.charAt(s.coverStart+d));)++d;if((a=zi&&Bi<9&&0==c&&d==s.coverEnd-s.coverStart?u.parentNode.getBoundingClientRect():function(e,t){var n=Wo;if("left"==l)for(var r=0;r<e.length&&(n=e[r]).left==n.right;r++);else for(var i=e.length-1;i>=0&&(n=e[i]).left==n.right;i--);return n}(no(u,c,d).getClientRects())).left||a.right||0==c)break;d=c,c-=1,p="right"}zi&&Bi<11&&(a=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Do)return Do;var t=n(e,r("span","x")),i=t.getBoundingClientRect(),o=no(t,0,1).getBoundingClientRect();return Do=Math.abs(i.left-o.left)>1}(e))return t;var i=screen.logicalXDPI/screen.deviceXDPI,o=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*i,right:t.right*i,top:t.top*o,bottom:t.bottom*o}}(e.display.measure,a))}else{c>0&&(p=l="right");var h;a=e.options.lineWrapping&&(h=u.getClientRects()).length>1?h["right"==l?h.length-1:0]:u.getBoundingClientRect()}if(zi&&Bi<9&&!c&&(!a||!a.left&&!a.right)){var m=u.parentNode.getClientRects()[0];a=m?{left:m.left,right:m.left+Ft(e.display),top:m.top,bottom:m.bottom}:Wo}for(var g=a.top-t.rect.top,y=a.bottom-t.rect.top,v=(g+y)/2,b=t.view.measure.heights,_=0;_<b.length-1&&!(v<b[_]);_++);var w={left:("right"==p?a.right:a.left)-t.rect.left,right:("left"==p?a.left:a.right)-t.rect.left,top:_?b[_-1]:0,bottom:b[_]};return a.left||a.right||(w.bogus=!0),e.options.singleCursorHeightPerLine||(w.rtop=g,w.rbottom=y),w}(e,t,0,o)).bogus||(t.cache[s]=a)),{left:a.left,right:a.right,top:l?a.rtop:a.top,bottom:l?a.rbottom:a.bottom}}function bt(e,t,n){for(var r,i,o,l,a,s,u=0;u<e.length;u+=3)if(a=e[u],s=e[u+1],t<a?(i=0,o=1,l="left"):t<s?o=1+(i=t-a):(u==e.length-3||t==s&&e[u+3]>t)&&(i=(o=s-a)-1,t>=s&&(l="right")),null!=i){if(r=e[u+2],a==s&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)r=e[2+(u-=3)],l="left";if("right"==n&&i==s-a)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)r=e[(u+=3)+2],l="right";break}return{node:r,start:i,end:o,collapse:l,coverStart:a,coverEnd:s}}function _t(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function wt(e){e.display.externalMeasure=null,t(e.display.lineMeasure);for(var n=0;n<e.display.view.length;n++)_t(e.display.view[n])}function xt(e){wt(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function Ct(){return qi&&Qi?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Et(){return qi&&Qi?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function St(e){var t=0;if(e.widgets)for(var n=0;n<e.widgets.length;++n)e.widgets[n].above&&(t+=lt(e.widgets[n]));return t}function Ot(e,t,n,r,i){if(!i){var o=St(t);n.top+=o,n.bottom+=o}if("line"==r)return n;r||(r="local");var l=ae(t);if("local"==r?l+=st(e.display):l-=e.display.viewOffset,"page"==r||"window"==r){var a=e.display.lineSpace.getBoundingClientRect();l+=a.top+("window"==r?0:Et());var s=a.left+("window"==r?0:Ct());n.left+=s,n.right+=s}return n.top+=l,n.bottom+=l,n}function Tt(e,t,n){if("div"==n)return t;var r=t.left,i=t.top;if("page"==n)r-=Ct(),i-=Et();else if("local"==n||!n){var o=e.display.sizer.getBoundingClientRect();r+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:r-l.left,top:i-l.top}}function kt(e,t,n,r,i){return r||(r=S(e.doc,t.line)),Ot(e,r,mt(e,r,t.ch,i),n)}function Dt(e,t,n,r,i,o){function l(t,l){var a=vt(e,i,t,l?"right":"left",o);return l?a.left=a.right:a.right=a.left,Ot(e,r,a,n)}function a(e,t,n){return l(n?e-1:e,1==s[t].level!=n)}r=r||S(e.doc,t.line),i||(i=yt(e,r));var s=de(r,e.doc.direction),u=t.ch,c=t.sticky;if(u>=r.text.length?(u=r.text.length,c="before"):u<=0&&(u=0,c="after"),!s)return l("before"==c?u-1:u,"before"==c);var d=ce(s,u,c),p=wo,f=a(u,d,"before"==c);return null!=p&&(f.other=a(u,p,"before"!=c)),f}function It(e,t){var n=0;t=z(e.doc,t),e.options.lineWrapping||(n=Ft(e.display)*t.ch);var r=S(e.doc,t.line),i=ae(r)+st(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function Rt(e,t,n,r,i){var o=P(e,t,n);return o.xRel=i,r&&(o.outside=!0),o}function Mt(e,t,n){var r=e.doc;if((n+=e.display.viewOffset)<0)return Rt(r.first,0,null,!0,-1);var i=I(r,n),o=r.first+r.size-1;if(i>o)return Rt(r.first+r.size-1,S(r,o).text.length,null,!0,1);t<0&&(t=0);for(var l=S(r,i);;){var a=function(e,t,n,r,i){i-=ae(t);var o=yt(e,t),l=St(t),a=0,s=t.text.length,u=!0,c=de(t,e.doc.direction);if(c){var d=(e.options.lineWrapping?function(e,t,n,r,i,o,l){var a=Pt(e,t,r,l),s=a.begin,u=a.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,d=null,p=0;p<i.length;p++){var f=i[p];if(!(f.from>=u||f.to<=s)){var h=vt(e,r,1!=f.level?Math.min(u,f.to)-1:Math.max(s,f.from)).right,m=h<o?o-h+1e9:h-o;(!c||d>m)&&(c=f,d=m)}}return c||(c=i[i.length-1]),c.from<s&&(c={from:s,to:c.to,level:c.level}),c.to>u&&(c={from:c.from,to:u,level:c.level}),c}:function(e,t,n,r,i,o,l){var a=E(function(a){var s=i[a],u=1!=s.level;return At(Dt(e,P(n,u?s.to:s.from,u?"before":"after"),"line",t,r),o,l,!0)},0,i.length-1),s=i[a];if(a>0){var u=1!=s.level,c=Dt(e,P(n,u?s.from:s.to,u?"after":"before"),"line",t,r);At(c,o,l,!0)&&c.top>l&&(s=i[a-1])}return s})(e,t,n,o,c,r,i);a=(u=1!=d.level)?d.from:d.to-1,s=u?d.to:d.from-1}var p,f,h=null,m=null,g=E(function(t){var n=vt(e,o,t);return n.top+=l,n.bottom+=l,!!At(n,r,i,!1)&&(n.top<=i&&n.left<=r&&(h=t,m=n),!0)},a,s),y=!1;if(m){var v=r-m.left<m.right-r,b=v==u;g=h+(b?0:1),f=b?"after":"before",p=v?m.left:m.right}else{u||g!=s&&g!=a||g++,f=0==g?"after":g==t.text.length?"before":vt(e,o,g-(u?1:0)).bottom+l<=i==u?"after":"before";var _=Dt(e,P(n,g,f),"line",t,o);p=_.left,y=i<_.top||i>=_.bottom}return g=C(t.text,g,1),Rt(n,g,f,y,r-p)}(e,l,i,t,n),s=ee(l),u=s&&s.find(0,!0);if(!s||!(a.ch>u.from.ch||a.ch==u.from.ch&&a.xRel>0))return a;i=D(l=u.to.line)}}function Pt(e,t,n,r){r-=St(t);var i=t.text.length,o=E(function(t){return vt(e,n,t-1).bottom<=r},i,0);return i=E(function(t){return vt(e,n,t).top>r},o,i),{begin:o,end:i}}function Nt(e,t,n,r){return n||(n=yt(e,t)),Pt(e,t,n,Ot(e,t,vt(e,n,r),"line").top)}function At(e,t,n,r){return!(e.bottom<=n)&&(e.top>n||(r?e.left:e.right)>t)}function Lt(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==jo){jo=r("pre");for(var i=0;i<49;++i)jo.appendChild(document.createTextNode("x")),jo.appendChild(r("br"));jo.appendChild(document.createTextNode("x"))}n(e.measure,jo);var o=jo.offsetHeight/50;return o>3&&(e.cachedTextHeight=o),t(e.measure),o||1}function Ft(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=r("span","xxxxxxxxxx"),i=r("pre",[t]);n(e.measure,i);var o=t.getBoundingClientRect(),l=(o.right-o.left)/10;return l>2&&(e.cachedCharWidth=l),l||10}function jt(e){for(var t=e.display,n={},r={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)n[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,r[e.options.gutters[l]]=o.clientWidth;return{fixedPos:Vt(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:n,gutterWidth:r,wrapperWidth:t.wrapper.clientWidth}}function Vt(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function zt(e){var t=Lt(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/Ft(e.display)-3);return function(i){if(oe(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return n?o+(Math.ceil(i.text.length/r)||1)*t:o+t}}function Bt(e){var t=e.doc,n=zt(e);t.iter(function(e){var t=n(e);t!=e.height&&k(e,t)})}function Ht(e,t,n,r){var i=e.display;if(!n&&"true"==Ce(t).getAttribute("cm-not-content"))return null;var o,l,a=i.lineSpace.getBoundingClientRect();try{o=t.clientX-a.left,l=t.clientY-a.top}catch(t){return null}var s,u=Mt(e,o,l);if(r&&1==u.xRel&&(s=S(e.doc,u.line).text).length==u.ch){var c=d(s,s.length,e.options.tabSize)-s.length;u=P(u.line,Math.max(0,Math.round((o-ct(e.display).left)/Ft(e.display))-c))}return u}function Wt(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var n=e.display.view,r=0;r<n.length;r++)if((t-=n[r].size)<0)return r}function qt(e){e.display.input.showSelection(e.display.input.prepareSelection())}function Ut(e,t){void 0===t&&(t=!0);for(var n=e.doc,i={},o=i.cursors=document.createDocumentFragment(),l=i.selection=document.createDocumentFragment(),a=0;a<n.sel.ranges.length;a++)if(t||a!=n.sel.primIndex){var s=n.sel.ranges[a];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var u=s.empty();(u||e.options.showCursorWhenSelecting)&&Gt(e,s.head,o),u||function(e,t,n){function i(e,t,n,i){t<0&&(t=0),t=Math.round(t),i=Math.round(i),s.appendChild(r("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n                             top: "+t+"px; width: "+(null==n?d-e:n)+"px;\n                             height: "+(i-t)+"px"))}function o(t,n,r){function o(n,r){return kt(e,P(t,n),"div",f,r)}function l(t,n,r){var i=Nt(e,f,null,t),l="ltr"==n==("after"==r)?"left":"right";return o("after"==r?i.begin:i.end-(/\s/.test(f.text.charAt(i.end-1))?2:1),l)[l]}var s,u,f=S(a,t),h=f.text.length,m=de(f,a.direction);return function(e,t,n,r){if(!e)return r(t,n,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<n&&l.to>t||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr",o),i=!0)}i||r(t,n,"ltr")}(m,n||0,null==r?h:r,function(e,t,a,f){var g="ltr"==a,y=o(e,g?"left":"right"),v=o(t-1,g?"right":"left"),b=null==n&&0==e,_=null==r&&t==h,w=0==f,x=!m||f==m.length-1;if(v.top-y.top<=3){var C=(p?b:_)&&w?c:(g?y:v).left;i(C,y.top,((p?_:b)&&x?d:(g?v:y).right)-C,y.bottom)}else{var E,S,O,T;g?(E=p&&b&&w?c:y.left,S=p?d:l(e,a,"before"),O=p?c:l(t,a,"after"),T=p&&_&&x?d:v.right):(E=p?l(e,a,"before"):c,S=!p&&b&&w?d:y.right,O=!p&&_&&x?c:v.left,T=p?l(t,a,"after"):d),i(E,y.top,S-E,y.bottom),y.bottom<v.top&&i(c,y.bottom,null,v.top),i(O,v.top,T-O,v.bottom)}(!s||Kt(y,s)<0)&&(s=y),Kt(v,s)<0&&(s=v),(!u||Kt(y,u)<0)&&(u=y),Kt(v,u)<0&&(u=v)}),{start:s,end:u}}var l=e.display,a=e.doc,s=document.createDocumentFragment(),u=ct(e.display),c=u.left,d=Math.max(l.sizerWidth,pt(e)-l.sizer.offsetLeft)-u.right,p="ltr"==a.direction,f=t.from(),h=t.to();if(f.line==h.line)o(f.line,f.ch,h.ch);else{var m=S(a,f.line),g=S(a,h.line),y=ne(m)==ne(g),v=o(f.line,f.ch,y?m.text.length+1:null).end,b=o(h.line,y?0:null,h.ch).start;y&&(v.top<b.top-2?(i(v.right,v.top,null,v.bottom),i(c,b.top,b.left,b.bottom)):i(v.right,v.top,b.left-v.right,v.bottom)),v.bottom<b.top&&i(c,v.bottom,null,b.top)}n.appendChild(s)}(e,s,l)}}return i}function Gt(e,t,n){var i=Dt(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=n.appendChild(r("div","\xa0","CodeMirror-cursor"));if(o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other){var l=n.appendChild(r("div","\xa0","CodeMirror-cursor CodeMirror-secondarycursor"));l.style.display="",l.style.left=i.other.left+"px",l.style.top=i.other.top+"px",l.style.height=.85*(i.other.bottom-i.other.top)+"px"}}function Kt(e,t){return e.top-t.top||e.left-t.left}function $t(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var n=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Zt(e){e.state.focused||(e.display.input.focus(),Yt(e))}function Qt(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Xt(e))},100)}function Yt(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(he(e,"focus",e,t),e.state.focused=!0,a(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),Hi&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),$t(e))}function Xt(e,t){e.state.delayingBlurEvent||(e.state.focused&&(he(e,"blur",e,t),e.state.focused=!1,oo(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Jt(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;r<t.view.length;r++){var i=t.view[r],o=void 0;if(!i.hidden){if(zi&&Bi<8){var l=i.node.offsetTop+i.node.offsetHeight;o=l-n,n=l}else{var a=i.node.getBoundingClientRect();o=a.bottom-a.top}var s=i.line.height-o;if(o<2&&(o=Lt(t)),(s>.005||s<-.005)&&(k(i.line,o),en(i.line),i.rest))for(var u=0;u<i.rest.length;u++)en(i.rest[u])}}}function en(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var n=e.widgets[t],r=n.node.parentNode;r&&(n.height=r.offsetHeight)}}function tn(e,t,n){var r=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop;r=Math.floor(r-st(e));var i=n&&null!=n.bottom?n.bottom:r+e.wrapper.clientHeight,o=I(t,r),l=I(t,i);if(n&&n.ensure){var a=n.ensure.from.line,s=n.ensure.to.line;a<o?(o=a,l=I(t,ae(S(t,a))+e.wrapper.clientHeight)):Math.min(s,t.lastLine())>=l&&(o=I(t,ae(S(t,s))-e.wrapper.clientHeight),l=s)}return{from:o,to:Math.max(l,o+1)}}function nn(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=Vt(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l<n.length;l++)if(!n[l].hidden){e.options.fixedGutter&&(n[l].gutter&&(n[l].gutter.style.left=o),n[l].gutterBackground&&(n[l].gutterBackground.style.left=o));var a=n[l].alignable;if(a)for(var s=0;s<a.length;s++)a[s].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=r+i+"px")}}function rn(e){if(!e.options.lineNumbers)return!1;var t=e.doc,n=M(e.options,t.first+t.size-1),i=e.display;if(n.length!=i.lineNumChars){var o=i.measure.appendChild(r("div",[r("div",n)],"CodeMirror-linenumber CodeMirror-gutter-elt")),l=o.firstChild.offsetWidth,a=o.offsetWidth-l;return i.lineGutter.style.width="",i.lineNumInnerWidth=Math.max(l,i.lineGutter.offsetWidth-a)+1,i.lineNumWidth=i.lineNumInnerWidth+a,i.lineNumChars=i.lineNumInnerWidth?n.length:-1,i.lineGutter.style.width=i.lineNumWidth+"px",Nn(e),!0}return!1}function on(e,t){var n=e.display,r=Lt(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:n.scroller.scrollTop,o=ft(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var a=e.doc.height+ut(n),s=t.bottom>a-r;if(t.top<i)l.scrollTop=t.top<r?0:t.top;else if(t.bottom>i+o){var u=Math.min(t.top,(s?a:t.bottom)-o);u!=i&&(l.scrollTop=u)}var c=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:n.scroller.scrollLeft,d=pt(e)-(e.options.fixedGutter?n.gutters.offsetWidth:0),p=t.right-t.left>d;return p&&(t.right=t.left+d),t.left<10?l.scrollLeft=0:t.left<c?l.scrollLeft=Math.max(0,t.left-(p?0:10)):t.right>d+c-3&&(l.scrollLeft=t.right+(p?0:10)-d),l}function ln(e,t){null!=t&&(un(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function an(e){un(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function sn(e,t,n){null==t&&null==n||un(e),null!=t&&(e.curOp.scrollLeft=t),null!=n&&(e.curOp.scrollTop=n)}function un(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,cn(e,It(e,t.from),It(e,t.to),t.margin))}function cn(e,t,n,r){var i=on(e,{left:Math.min(t.left,n.left),top:Math.min(t.top,n.top)-r,right:Math.max(t.right,n.right),bottom:Math.max(t.bottom,n.bottom)+r});sn(e,i.scrollLeft,i.scrollTop)}function dn(e,t){Math.abs(e.doc.scrollTop-t)<2||(Li||Pn(e,{top:t}),pn(e,t,!0),Li&&Pn(e),Dn(e,100))}function pn(e,t,n){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||n)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function fn(e,t,n,r){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(n?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!r||(e.doc.scrollLeft=t,nn(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function hn(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+ut(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+dt(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function mn(e,t){t||(t=hn(e));var n=e.display.barWidth,r=e.display.barHeight;gn(e,t);for(var i=0;i<4&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&Jt(e),gn(e,hn(e)),n=e.display.barWidth,r=e.display.barHeight}function gn(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}function yn(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&oo(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Go[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Eo(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,n){"horizontal"==n?fn(e,t):dn(e,t)},e),e.display.scrollbars.addClass&&a(e.display.wrapper,e.display.scrollbars.addClass)}function vn(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ko},function(e){Bo?Bo.ops.push(e):e.ownsGroup=Bo={ops:[e],delayedCallbacks:[]}}(e.curOp)}function bn(e){!function(t,n){var i=e.curOp.ownsGroup;if(i)try{!function(e){var t=e.delayedCallbacks,n=0;do{for(;n<t.length;n++)t[n].call(null);for(var r=0;r<e.ops.length;r++){var i=e.ops[r];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(n<t.length)}(i)}finally{Bo=null,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(t){for(var n=e.ops,i=0;i<n.length;i++)!function(e){var t=e.cm,n=t.display;(function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=dt(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=dt(e)+"px",t.scrollbarsClipped=!0)})(t),e.updateMaxLine&&ue(t),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<n.viewFrom||e.scrollToPos.to.line>=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new $o(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}(n[i]);for(var o=0;o<n.length;o++)!function(e){e.updatedDisplay=e.mustUpdate&&Rn(e.cm,e.update)}(n[o]);for(var a=0;a<n.length;a++)!function(e){var t=e.cm,n=t.display;e.updatedDisplay&&Jt(t),e.barMeasure=hn(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=mt(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+dt(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-pt(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}(n[a]);for(var s=0;s<n.length;s++)!function(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&fn(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var n=e.focus&&e.focus==l();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,n),(e.updatedDisplay||e.startHeight!=t.doc.height)&&mn(t,e.barMeasure),e.updatedDisplay&&An(t,e.barMeasure),e.selectionChanged&&$t(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),n&&Zt(e.cm)}(n[s]);for(var u=0;u<n.length;u++)!function(e){var t=e.cm,n=t.display,i=t.doc;if(e.updatedDisplay&&Mn(t,e.update),null==n.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(n.wheelStartX=n.wheelStartY=null),null!=e.scrollTop&&pn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&fn(t,e.scrollLeft,!0,!0),e.scrollToPos){!function(e,t){if(!me(e,"scrollCursorIntoView")){var n=e.display,i=n.sizer.getBoundingClientRect(),o=null;if(t.top+i.top<0?o=!0:t.bottom+i.top>(window.innerHeight||document.documentElement.clientHeight)&&(o=!1),null!=o&&!$i){var l=r("div","\u200b",null,"position: absolute;\n                         top: "+(t.top-n.viewOffset-st(e.display))+"px;\n                         height: "+(t.bottom-t.top+dt(e)+n.barHeight)+"px;\n                         left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(l),l.scrollIntoView(o),e.display.lineSpace.removeChild(l)}}}(t,function(e,t,n,r){null==r&&(r=0);var i;e.options.lineWrapping||t!=n||(n="before"==(t=t.ch?P(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t).sticky?P(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,a=Dt(e,t),s=n&&n!=t?Dt(e,n):a,u=on(e,i={left:Math.min(a.left,s.left),top:Math.min(a.top,s.top)-r,right:Math.max(a.left,s.left),bottom:Math.max(a.bottom,s.bottom)+r}),c=e.doc.scrollTop,d=e.doc.scrollLeft;if(null!=u.scrollTop&&(dn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(fn(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-d)>1&&(l=!0)),!l)break}return i}(t,z(i,e.scrollToPos.from),z(i,e.scrollToPos.to),e.scrollToPos.margin))}var o=e.maybeHiddenMarkers,l=e.maybeUnhiddenMarkers;if(o)for(var a=0;a<o.length;++a)o[a].lines.length||he(o[a],"hide");if(l)for(var s=0;s<l.length;++s)l[s].lines.length&&he(l[s],"unhide");n.wrapper.offsetHeight&&(i.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&he(t,"changes",t,e.changeObjs),e.update&&e.update.finish()}(n[u])}()}(i)}}()}function _n(e,t){if(e.curOp)return t();vn(e);try{return t()}finally{bn(e)}}function wn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);vn(e);try{return t.apply(e,arguments)}finally{bn(e)}}}function xn(e){return function(){if(this.curOp)return e.apply(this,arguments);vn(this);try{return e.apply(this,arguments)}finally{bn(this)}}}function Cn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);vn(t);try{return e.apply(this,arguments)}finally{bn(t)}}}function En(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r||(r=0);var i=e.display;if(r&&n<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)_o&&re(e.doc,t)<i.viewTo&&On(e);else if(n<=i.viewFrom)_o&&ie(e.doc,n+r)>i.viewFrom?On(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)On(e);else if(t<=i.viewFrom){var o=Tn(e,n,n+r,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=r):On(e)}else if(n>=i.viewTo){var l=Tn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):On(e)}else{var a=Tn(e,t,t,-1),s=Tn(e,n,n+r,1);a&&s?(i.view=i.view.slice(0,a.index).concat(Ze(e,a.lineN,s.lineN)).concat(i.view.slice(s.index)),i.viewTo+=r):On(e)}var u=i.externalMeasured;u&&(n<u.lineN?u.lineN+=r:t<u.lineN+u.size&&(i.externalMeasured=null))}function Sn(e,t,n){e.curOp.viewChanged=!0;var r=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(r.externalMeasured=null),!(t<r.viewFrom||t>=r.viewTo)){var o=r.view[Wt(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==p(l,n)&&l.push(n)}}}function On(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Tn(e,t,n,r){var i,o=Wt(e,t),l=e.display.view;if(!_o||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var a=e.display.viewFrom,s=0;s<o;s++)a+=l[s].size;if(a!=t){if(r>0){if(o==l.length-1)return null;i=a+l[o].size-t,o++}else i=a-t;t+=i,n+=i}for(;re(e.doc,n)!=n;){if(o==(r<0?0:l.length-1))return null;n+=r*l[o-(r<0?1:0)].size,o+=r}return{index:o,lineN:n}}function kn(e){for(var t=e.display.view,n=0,r=0;r<t.length;r++){var i=t[r];i.hidden||i.node&&!i.changes||++n}return n}function Dn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,u(In,e))}function In(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var n=+new Date+e.options.workTime,r=Ae(e,t.highlightFrontier),i=[];t.iter(r.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(r.line>=e.display.viewFrom){var l=o.styles,a=o.text.length>e.options.maxHighlightLength?Ie(t.mode,r.state):null,s=Pe(e,o,r,!0);a&&(r.state=a),o.styles=s.styles;var u=o.styleClasses,c=s.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var d=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),p=0;!d&&p<l.length;++p)d=l[p]!=o.styles[p];d&&i.push(r.line),o.stateAfter=r.save(),r.nextLine()}else o.text.length<=e.options.maxHighlightLength&&Le(e,o.text,r),o.stateAfter=r.line%5==0?r.save():null,r.nextLine();if(+new Date>n)return Dn(e,e.options.workDelay),!0}),t.highlightFrontier=r.line,t.modeFrontier=Math.max(t.modeFrontier,r.line),i.length&&_n(e,function(){for(var t=0;t<i.length;t++)Sn(e,i[t],"text")})}}function Rn(e,n){var r=e.display,i=e.doc;if(n.editorIsHidden)return On(e),!1;if(!n.force&&n.visible.from>=r.viewFrom&&n.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==kn(e))return!1;rn(e)&&(On(e),n.dims=jt(e));var a=i.first+i.size,s=Math.max(n.visible.from-e.options.viewportMargin,i.first),u=Math.min(a,n.visible.to+e.options.viewportMargin);r.viewFrom<s&&s-r.viewFrom<20&&(s=Math.max(i.first,r.viewFrom)),r.viewTo>u&&r.viewTo-u<20&&(u=Math.min(a,r.viewTo)),_o&&(s=re(e.doc,s),u=ie(e.doc,u));var c=s!=r.viewFrom||u!=r.viewTo||r.lastWrapHeight!=n.wrapperHeight||r.lastWrapWidth!=n.wrapperWidth;!function(e,t,n){var r=e.display;0==r.view.length||t>=r.viewTo||n<=r.viewFrom?(r.view=Ze(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=Ze(e,t,r.viewFrom).concat(r.view):r.viewFrom<t&&(r.view=r.view.slice(Wt(e,t))),r.viewFrom=t,r.viewTo<n?r.view=r.view.concat(Ze(e,r.viewTo,n)):r.viewTo>n&&(r.view=r.view.slice(0,Wt(e,n)))),r.viewTo=n}(e,s,u),r.viewOffset=ae(S(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+"px";var d=kn(e);if(!c&&0==d&&!n.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var f=function(e){if(e.hasFocus())return null;var t=l();if(!t||!o(e.display.lineDiv,t))return null;var n={activeElt:t};if(window.getSelection){var r=window.getSelection();r.anchorNode&&r.extend&&o(e.display.lineDiv,r.anchorNode)&&(n.anchorNode=r.anchorNode,n.anchorOffset=r.anchorOffset,n.focusNode=r.focusNode,n.focusOffset=r.focusOffset)}return n}(e);return d>4&&(r.lineDiv.style.display="none"),function(e,n,r){function i(t){var n=t.nextSibling;return Hi&&Xi&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),n}for(var o=e.display,l=e.options.lineNumbers,a=o.lineDiv,s=a.firstChild,u=o.view,c=o.viewFrom,d=0;d<u.length;d++){var f=u[d];if(f.hidden);else if(f.node&&f.node.parentNode==a){for(;s!=f.node;)s=i(s);var h=l&&null!=n&&n<=c&&f.lineNumber;f.changes&&(p(f.changes,"gutter")>-1&&(h=!1),Xe(e,f,c,r)),h&&(t(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(M(e.options,c)))),s=f.node.nextSibling}else{var m=rt(e,f,c,r);a.insertBefore(m,s)}c+=f.size}for(;s;)s=i(s)}(e,r.updateLineNumbers,n.dims),d>4&&(r.lineDiv.style.display=""),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=l()&&(e.activeElt.focus(),e.anchorNode&&o(document.body,e.anchorNode)&&o(document.body,e.focusNode))){var t=window.getSelection(),n=document.createRange();n.setEnd(e.anchorNode,e.anchorOffset),n.collapse(!1),t.removeAllRanges(),t.addRange(n),t.extend(e.focusNode,e.focusOffset)}}(f),t(r.cursorDiv),t(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,c&&(r.lastWrapHeight=n.wrapperHeight,r.lastWrapWidth=n.wrapperWidth,Dn(e,400)),r.updateLineNumbers=null,!0}function Mn(e,t){for(var n=t.viewport,r=!0;(r&&e.options.lineWrapping&&t.oldDisplayWidth!=pt(e)||(n&&null!=n.top&&(n={top:Math.min(e.doc.height+ut(e.display)-ft(e),n.top)}),t.visible=tn(e.display,e.doc,n),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&Rn(e,t);r=!1){Jt(e);var i=hn(e);qt(e),mn(e,i),An(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function Pn(e,t){var n=new $o(e,t);if(Rn(e,n)){Jt(e),Mn(e,n);var r=hn(e);qt(e),mn(e,r),An(e,r),n.finish()}}function Nn(e){e.display.sizer.style.marginLeft=e.display.gutters.offsetWidth+"px"}function An(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+dt(e)+"px"}function Ln(e){var n=e.display.gutters,i=e.options.gutters;t(n);for(var o=0;o<i.length;++o){var l=i[o],a=n.appendChild(r("div",null,"CodeMirror-gutter "+l));"CodeMirror-linenumbers"==l&&(e.display.lineGutter=a,a.style.width=(e.display.lineNumWidth||1)+"px")}n.style.display=o?"":"none",Nn(e)}function Fn(e){var t=p(e.gutters,"CodeMirror-linenumbers");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function jn(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}}function Vn(e){var t=jn(e);return t.x*=Qo,t.y*=Qo,t}function zn(e,t){var n=jn(t),r=n.x,i=n.y,o=e.display,l=o.scroller,a=l.scrollHeight>l.clientHeight;if(r&&l.scrollWidth>l.clientWidth||i&&a){if(i&&Xi&&Hi)e:for(var s=t.target,u=o.view;s!=l;s=s.parentNode)for(var c=0;c<u.length;c++)if(u[c].node==s){e.display.currentWheelTarget=s;break e}if(r&&!Li&&!Ui&&null!=Qo)return i&&a&&dn(e,Math.max(0,l.scrollTop+i*Qo)),fn(e,Math.max(0,l.scrollLeft+r*Qo)),(!i||i&&a)&&be(t),void(o.wheelStartX=null);if(i&&null!=Qo){var d=i*Qo,p=e.doc.scrollTop,f=p+o.wrapper.clientHeight;d<0?p=Math.max(0,p+d-50):f=Math.min(e.doc.height,f+d+50),Pn(e,{top:p,bottom:f})}Zo<20&&(null==o.wheelStartX?(o.wheelStartX=l.scrollLeft,o.wheelStartY=l.scrollTop,o.wheelDX=r,o.wheelDY=i,setTimeout(function(){if(null!=o.wheelStartX){var e=l.scrollLeft-o.wheelStartX,t=l.scrollTop-o.wheelStartY,n=t&&o.wheelDY&&t/o.wheelDY||e&&o.wheelDX&&e/o.wheelDX;o.wheelStartX=o.wheelStartY=null,n&&(Qo=(Qo*Zo+n)/(Zo+1),++Zo)}},200)):(o.wheelDX+=r,o.wheelDY+=i))}}function Bn(e,t){var n=e[t];e.sort(function(e,t){return N(e.from(),t.from())}),t=p(e,n);for(var r=1;r<e.length;r++){var i=e[r],o=e[r-1];if(N(o.to(),i.from())>=0){var l=j(o.from(),i.from()),a=F(o.to(),i.to()),s=o.empty()?i.from()==i.head:o.from()==o.head;r<=t&&--t,e.splice(--r,2,new Xo(s?a:l,s?l:a))}}return new Yo(e,t)}function Hn(e,t){return new Yo([new Xo(e,t||e)],0)}function Wn(e){return e.text?P(e.from.line+e.text.length-1,m(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function qn(e,t){if(N(e,t.from)<0)return e;if(N(e,t.to)<=0)return Wn(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=Wn(t).ch-t.to.ch),P(n,r)}function Un(e,t){for(var n=[],r=0;r<e.sel.ranges.length;r++){var i=e.sel.ranges[r];n.push(new Xo(qn(i.anchor,t),qn(i.head,t)))}return Bn(n,e.sel.primIndex)}function Gn(e,t,n){return e.line==t.line?P(n.line,e.ch-t.ch+n.ch):P(n.line+(e.line-t.line),e.ch)}function Kn(e){e.doc.mode=ke(e.options,e.doc.modeOption),$n(e)}function $n(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Dn(e,100),e.state.modeGen++,e.curOp&&En(e)}function Zn(e,t){return 0==t.from.ch&&0==t.to.ch&&""==m(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function Qn(e,t,n,r){function i(e){return n?n[e]:null}function o(e,n,i){!function(e,t,r,i){e.text=n,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),K(e),$(e,r);var o=i?i(e):1;o!=e.height&&k(e,o)}(e,0,i,r),Qe(e,"change",e,t)}function l(e,t){for(var n=[],o=e;o<t;++o)n.push(new Fo(u[o],i(o),r));return n}var a=t.from,s=t.to,u=t.text,c=S(e,a.line),d=S(e,s.line),p=m(u),f=i(u.length-1),h=s.line-a.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Zn(e,t)){var g=l(0,u.length-1);o(d,d.text,f),h&&e.remove(a.line,h),g.length&&e.insert(a.line,g)}else if(c==d)if(1==u.length)o(c,c.text.slice(0,a.ch)+p+c.text.slice(s.ch),f);else{var y=l(1,u.length-1);y.push(new Fo(p+c.text.slice(s.ch),f,r)),o(c,c.text.slice(0,a.ch)+u[0],i(0)),e.insert(a.line+1,y)}else if(1==u.length)o(c,c.text.slice(0,a.ch)+u[0]+d.text.slice(s.ch),i(0)),e.remove(a.line+1,h);else{o(c,c.text.slice(0,a.ch)+u[0],i(0)),o(d,p+d.text.slice(s.ch),f);var v=l(1,u.length-1);h>1&&e.remove(a.line+1,h-1),e.insert(a.line+1,v)}Qe(e,"change",e,t)}function Yn(e,t,n){function r(e,i,o){if(e.linked)for(var l=0;l<e.linked.length;++l){var a=e.linked[l];if(a.doc!=i){var s=o&&a.sharedHist;n&&!s||(t(a.doc,s),r(a.doc,e,s))}}}r(e,null,!0)}function Xn(e,t){if(t.cm)throw new Error("This document is already in use.");e.doc=t,t.cm=e,Bt(e),Kn(e),Jn(e),e.options.lineWrapping||ue(e),e.options.mode=t.modeOption,En(e)}function Jn(e){("rtl"==e.doc.direction?a:oo)(e.display.lineDiv,"CodeMirror-rtl")}function er(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function tr(e,t){var n={from:L(t.from),to:Wn(t),text:O(e,t.from,t.to)};return or(e,n,t.from.line,t.to.line+1),Yn(e,function(e){return or(e,n,t.from.line,t.to.line+1)},!0),n}function nr(e){for(;e.length&&m(e).ranges;)e.pop()}function rr(e,t,n,r){var i=e.history;i.undone.length=0;var o,l,a=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&e.cm&&i.lastModTime>a-e.cm.options.historyEventDelay||"*"==t.origin.charAt(0)))&&(o=function(e,t){return i.lastOp==r?(nr(e.done),m(e.done)):e.done.length&&!m(e.done).ranges?m(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),m(e.done)):void 0}(i)))l=m(o.changes),0==N(t.from,t.to)&&0==N(t.from,l.to)?l.to=Wn(t):o.changes.push(tr(e,t));else{var s=m(i.done);for(s&&s.ranges||ir(e.sel,i.done),o={changes:[tr(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,l||he(e,"historyAdded")}function ir(e,t){var n=m(t);n&&n.ranges&&n.equals(e)||t.push(e)}function or(e,t,n,r){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=n.markedSpans),++o})}function lr(e){if(!e)return null;for(var t,n=0;n<e.length;++n)e[n].marker.explicitlyCleared?t||(t=e.slice(0,n)):t&&t.push(e[n]);return t?t.length?t:null:e}function ar(e,t){var n=function(t,n){var r=n["spans_"+e.id];if(!r)return null;for(var i=[],o=0;o<n.text.length;++o)i.push(lr(r[o]));return i}(0,t),r=U(e,t);if(!n)return r;if(!r)return n;for(var i=0;i<n.length;++i){var o=n[i],l=r[i];if(o&&l)e:for(var a=0;a<l.length;++a){for(var s=l[a],u=0;u<o.length;++u)if(o[u].marker==s.marker)continue e;o.push(s)}else l&&(n[i]=l)}return n}function sr(e,t,n){for(var r=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)r.push(n?Yo.prototype.deepCopy.call(o):o);else{var l=o.changes,a=[];r.push({changes:a});for(var s=0;s<l.length;++s){var u=l[s],c=void 0;if(a.push({from:u.from,to:u.to,text:u.text}),t)for(var d in u)(c=d.match(/^spans_(\d+)$/))&&p(t,Number(c[1]))>-1&&(m(a)[d]=u[d],delete u[d])}}}return r}function ur(e,t,n,r){if(r){var i=e.anchor;if(n){var o=N(t,i)<0;o!=N(n,i)<0?(i=t,t=n):o!=N(t,n)<0&&(t=n)}return new Xo(i,t)}return new Xo(n||t,t)}function cr(e,t,n,r,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),mr(e,new Yo([ur(e.sel.primary(),t,n,i)],0),r)}function dr(e,t,n){for(var r=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)r[o]=ur(e.sel.ranges[o],t[o],null,i);mr(e,Bn(r,e.sel.primIndex),n)}function pr(e,t,n,r){var i=e.sel.ranges.slice(0);i[t]=n,mr(e,Bn(i,e.sel.primIndex),r)}function fr(e,t,n,r){mr(e,Hn(t,n),r)}function hr(e,t,n){var r=e.history.done,i=m(r);i&&i.ranges?(r[r.length-1]=t,gr(e,t,n)):mr(e,t,n)}function mr(e,t,n){gr(e,t,n),function(t,n,r,i){var o=e.history,l=i&&i.origin;r==o.lastSelOp||l&&o.lastSelOrigin==l&&(o.lastModTime==o.lastSelTime&&o.lastOrigin==l||function(e,t,n,r){var i=t.charAt(0);return"*"==i||"+"==i&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,l,m(o.done),n))?o.done[o.done.length-1]=n:ir(n,o.done),o.lastSelTime=+new Date,o.lastSelOrigin=l,o.lastSelOp=r,i&&!1!==i.clearRedo&&nr(o.undone)}(0,e.sel,e.cm?e.cm.curOp.id:NaN,n)}function gr(e,t,n){(ye(e,"beforeSelectionChange")||e.cm&&ye(e.cm,"beforeSelectionChange"))&&(t=function(e,t,r){var i={ranges:t.ranges,update:function(t){this.ranges=[];for(var n=0;n<t.length;n++)this.ranges[n]=new Xo(z(e,t[n].anchor),z(e,t[n].head))},origin:n&&n.origin};return he(e,"beforeSelectionChange",e,i),e.cm&&he(e.cm,"beforeSelectionChange",e.cm,i),i.ranges!=t.ranges?Bn(i.ranges,i.ranges.length-1):t}(e,t)),yr(e,br(e,t,n&&n.bias||(N(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),n&&!1===n.scroll||!e.cm||an(e.cm)}function yr(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,ge(e.cm)),Qe(e,"cursorActivity",e))}function vr(e){yr(e,br(e,e.sel,null,!1))}function br(e,t,n,r){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],a=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],s=wr(e,l.anchor,a&&a.anchor,n,r),u=wr(e,l.head,a&&a.head,n,r);(i||s!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new Xo(s,u))}return i?Bn(i,t.primIndex):t}function _r(e,t,n,r,i){var o=S(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var a=o.markedSpans[l],s=a.marker;if((null==a.from||(s.inclusiveLeft?a.from<=t.ch:a.from<t.ch))&&(null==a.to||(s.inclusiveRight?a.to>=t.ch:a.to>t.ch))){if(i&&(he(s,"beforeCursorEnter"),s.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!s.atomic)continue;if(n){var u=s.find(r<0?1:-1),c=void 0;if((r<0?s.inclusiveRight:s.inclusiveLeft)&&(u=xr(e,u,-r,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=N(u,n))&&(r<0?c<0:c>0))return _r(e,u,t,r,i)}var d=s.find(r<0?-1:1);return(r<0?s.inclusiveLeft:s.inclusiveRight)&&(d=xr(e,d,r,d.line==t.line?o:null)),d?_r(e,d,t,r,i):null}}return t}function wr(e,t,n,r,i){var o=r||1;return _r(e,t,n,o,i)||!i&&_r(e,t,n,o,!0)||_r(e,t,n,-o,i)||!i&&_r(e,t,n,-o,!0)||(e.cantEdit=!0,P(e.first,0))}function xr(e,t,n,r){return n<0&&0==t.ch?t.line>e.first?z(e,P(t.line-1)):null:n>0&&t.ch==(r||S(e,t.line)).text.length?t.line<e.first+e.size-1?P(t.line+1,0):null:new P(t.line,t.ch+n)}function Cr(e){e.setSelection(P(e.firstLine(),0),P(e.lastLine()),fo)}function Er(e,t,n){var r={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return r.canceled=!0}};return n&&(r.update=function(t,n,i,o){t&&(r.from=z(e,t)),n&&(r.to=z(e,n)),i&&(r.text=i),void 0!==o&&(r.origin=o)}),he(e,"beforeChange",e,r),e.cm&&he(e.cm,"beforeChange",e.cm,r),r.canceled?null:{from:r.from,to:r.to,text:r.text,origin:r.origin}}function Sr(e,t,n){if(e.cm){if(!e.cm.curOp)return wn(e.cm,Sr)(e,t,n);if(e.cm.state.suppressEdits)return}if(!(ye(e,"beforeChange")||e.cm&&ye(e.cm,"beforeChange"))||(t=Er(e,t,!0))){var r=bo&&!n&&function(t,n,r){var i=null;if(e.iter(n.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var n=e.markedSpans[t].marker;!n.readOnly||i&&-1!=p(i,n)||(i||(i=[])).push(n)}}),!i)return null;for(var o=[{from:n,to:r}],l=0;l<i.length;++l)for(var a=i[l],s=a.find(0),u=0;u<o.length;++u){var c=o[u];if(!(N(c.to,s.from)<0||N(c.from,s.to)>0)){var d=[u,1],f=N(c.from,s.from),h=N(c.to,s.to);(f<0||!a.inclusiveLeft&&!f)&&d.push({from:c.from,to:s.from}),(h>0||!a.inclusiveRight&&!h)&&d.push({from:s.to,to:c.to}),o.splice.apply(o,d),u+=d.length-3}}return o}(0,t.from,t.to);if(r)for(var i=r.length-1;i>=0;--i)Or(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text,origin:t.origin});else Or(e,t)}}function Or(e,t){if(1!=t.text.length||""!=t.text[0]||0!=N(t.from,t.to)){var n=Un(e,t);rr(e,t,n,e.cm?e.cm.curOp.id:NaN),Dr(e,t,n,U(e,t));var r=[];Yn(e,function(e,n){n||-1!=p(r,e.history)||(Pr(e.history,t),r.push(e.history)),Dr(e,t,null,U(e,t))})}}function Tr(e,t,n){if(!e.cm||!e.cm.state.suppressEdits||n){for(var r,i=e.history,o=e.sel,l="undo"==t?i.done:i.undone,a="undo"==t?i.undone:i.done,s=0;s<l.length&&(r=l[s],n?!r.ranges||r.equals(e.sel):r.ranges);s++);if(s!=l.length){for(i.lastOrigin=i.lastSelOrigin=null;(r=l.pop()).ranges;){if(ir(r,a),n&&!r.equals(e.sel))return void mr(e,r,{clearRedo:!1});o=r}var u=[];ir(o,a),a.push({changes:u,generation:i.generation}),i.generation=r.generation||++i.maxGeneration;for(var c=ye(e,"beforeChange")||e.cm&&ye(e.cm,"beforeChange"),d=function(n){var i=r.changes[n];if(i.origin=t,c&&!Er(e,i,!1))return l.length=0,{};u.push(tr(e,i));var o=n?Un(e,i):m(l);Dr(e,i,o,ar(e,i)),!n&&e.cm&&e.cm.scrollIntoView({from:i.from,to:Wn(i)});var a=[];Yn(e,function(e,t){t||-1!=p(a,e.history)||(Pr(e.history,i),a.push(e.history)),Dr(e,i,null,ar(e,i))})},f=r.changes.length-1;f>=0;--f){var h=d(f);if(h)return h.v}}}}function kr(e,t){if(0!=t&&(e.first+=t,e.sel=new Yo(g(e.sel.ranges,function(e){return new Xo(P(e.anchor.line+t,e.anchor.ch),P(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){En(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;r<n.viewTo;r++)Sn(e.cm,r,"gutter")}}function Dr(e,t,n,r){if(e.cm&&!e.cm.curOp)return wn(e.cm,Dr)(e,t,n,r);if(t.to.line<e.first)kr(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);kr(e,i),t={from:P(e.first,0),to:P(t.to.line+i,t.to.ch),text:[m(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:P(o,S(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=O(e,t.from,t.to),n||(n=Un(e,t)),e.cm?function(e,t,n){var r=e.doc,i=e.display,o=t.from,l=t.to,a=!1,s=o.line;e.options.lineWrapping||(s=D(ne(S(r,o.line))),r.iter(s,l.line+1,function(e){if(e==i.maxLine)return a=!0,!0})),r.sel.contains(t.from,t.to)>-1&&ge(e),Qn(r,t,n,zt(e)),e.options.lineWrapping||(r.iter(s,o.line+t.text.length,function(e){var t=se(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,a=!1)}),a&&(e.curOp.updateMaxLine=!0)),function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var n=e.first,r=t-1;r>n;r--){var i=S(e,r).stateAfter;if(i&&(!(i instanceof No)||r+i.lookAhead<t)){n=r+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,n)}}(r,o.line),Dn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?En(e):o.line!=l.line||1!=t.text.length||Zn(e.doc,t)?En(e,o.line,l.line+1,u):Sn(e,o.line,"text");var c=ye(e,"changes"),d=ye(e,"change");if(d||c){var p={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};d&&Qe(e,"change",e,p),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(p)}e.display.selForContextMenu=null}(e.cm,t,r):Qn(e,t,r),gr(e,n,fo)}}function Ir(e,t,n,r,i){if(r||(r=n),N(r,n)<0){var o;n=(o=[r,n])[0],r=o[1]}"string"==typeof t&&(t=e.splitLines(t)),Sr(e,{from:n,to:r,text:t,origin:i})}function Rr(e,t,n,r){n<e.line?e.line+=r:t<e.line&&(e.line=t,e.ch=0)}function Mr(e,t,n,r){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var a=0;a<o.ranges.length;a++)Rr(o.ranges[a].anchor,t,n,r),Rr(o.ranges[a].head,t,n,r)}else{for(var s=0;s<o.changes.length;++s){var u=o.changes[s];if(n<u.from.line)u.from=P(u.from.line+r,u.from.ch),u.to=P(u.to.line+r,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function Pr(e,t){var n=t.from.line,r=t.to.line,i=t.text.length-(r-n)-1;Mr(e.done,n,r,i),Mr(e.undone,n,r,i)}function Nr(e,t,n,r){var i=t,o=t;return"number"==typeof t?o=S(e,V(e,t)):i=D(t),null==i?null:(r(o,i)&&e.cm&&Sn(e.cm,i,n),o)}function Ar(e){this.lines=e,this.parent=null;for(var t=0,n=0;n<e.length;++n)e[n].parent=this,t+=e[n].height;this.height=t}function Lr(e){this.children=e;for(var t=0,n=0,r=0;r<e.length;++r){var i=e[r];t+=i.chunkSize(),n+=i.height,i.parent=this}this.size=t,this.height=n,this.parent=null}function Fr(e,t,n){ae(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&ln(e,n)}function jr(e,t,n,r,o){if(r&&r.shared)return function(e,t,n,r,i){(r=c(r)).shared=!1;var o=[jr(e,t,n,r,i)],l=o[0],a=r.widgetNode;return Yn(e,function(e){a&&(r.widgetNode=a.cloneNode(!0)),o.push(jr(e,z(e,t),z(e,n),r,i));for(var s=0;s<e.linked.length;++s)if(e.linked[s].isParent)return;l=m(o)}),new nl(o,l)}(e,t,n,r,o);if(e.cm&&!e.cm.curOp)return wn(e.cm,jr)(e,t,n,r,o);var l=new tl(e,o),a=N(t,n);if(r&&c(r,l,!1),a>0||0==a&&!1!==l.clearWhenEmpty)return l;if(l.replacedWith&&(l.collapsed=!0,l.widgetNode=i("span",[l.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||l.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(l.widgetNode.insertLeft=!0)),l.collapsed){if(te(e,t.line,t,n,l)||t.line!=n.line&&te(e,n.line,t,n,l))throw new Error("Inserting collapsed marker partially overlapping an existing one");_o=!0}l.addToHistory&&rr(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var s,u=t.line,d=e.cm;if(e.iter(u,n.line+1,function(e){d&&l.collapsed&&!d.options.lineWrapping&&ne(e)==d.display.maxLine&&(s=!0),l.collapsed&&u!=t.line&&k(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new H(l,u==t.line?t.ch:null,u==n.line?n.ch:null)),++u}),l.collapsed&&e.iter(t.line,n.line+1,function(t){oe(e,t)&&k(t,0)}),l.clearOnEnter&&Eo(l,"beforeCursorEnter",function(){return l.clear()}),l.readOnly&&(bo=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),l.collapsed&&(l.id=++el,l.atomic=!0),d){if(s&&(d.curOp.updateMaxLine=!0),l.collapsed)En(d,t.line,n.line+1);else if(l.className||l.title||l.startStyle||l.endStyle||l.css)for(var p=t.line;p<=n.line;p++)Sn(d,p,"text");l.atomic&&vr(d.doc),Qe(d,"markerAdded",d,l)}return l}function Vr(e){return e.findMarks(P(e.first,0),e.clipPos(P(e.lastLine())),function(e){return e.parent})}function zr(e){for(var t=function(t){var n=e[t],r=[n.primary.doc];Yn(n.primary.doc,function(e){return r.push(e)});for(var i=0;i<n.markers.length;i++){var o=n.markers[i];-1==p(r,o.doc)&&(o.parent=null,n.markers.splice(i--,1))}},n=0;n<e.length;n++)t(n)}function Br(e){var t=this;if(Hr(t),!me(t,e)&&!at(t.display,e)){be(e),zi&&(ol=+new Date);var n=Ht(t,e,!0),r=e.dataTransfer.files;if(n&&!t.isReadOnly())if(r&&r.length&&window.FileReader&&window.File)for(var i=r.length,o=Array(i),l=0,a=function(e,r){if(!t.options.allowDropFileTypes||-1!=p(t.options.allowDropFileTypes,e.type)){var a=new FileReader;a.onload=wn(t,function(){var e=a.result;if(/[\x00-\x08\x0e-\x1f]{2}/.test(e)&&(e=""),o[r]=e,++l==i){var s={from:n=z(t.doc,n),to:n,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:"paste"};Sr(t.doc,s),hr(t.doc,Hn(n,Wn(s)))}}),a.readAsText(e)}},s=0;s<i;++s)a(r[s],s);else{if(t.state.draggingText&&t.doc.sel.contains(n)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var u=e.dataTransfer.getData("Text");if(u){var c;if(t.state.draggingText&&!t.state.draggingText.copy&&(c=t.listSelections()),gr(t.doc,Hn(n,n)),c)for(var d=0;d<c.length;++d)Ir(t.doc,"",c[d].anchor,c[d].head,"drag");t.replaceSelection(u,"around","paste"),t.display.input.focus()}}catch(e){}}}}function Hr(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Wr(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName("CodeMirror"),n=0;n<t.length;n++){var r=t[n].CodeMirror;r&&e(r)}}function qr(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}function Ur(e){var t=e.split(/-(?!$)/);e=t[t.length-1];for(var n,r,i,o,l=0;l<t.length-1;l++){var a=t[l];if(/^(cmd|meta|m)$/i.test(a))o=!0;else if(/^a(lt)?$/i.test(a))n=!0;else if(/^(c|ctrl|control)$/i.test(a))r=!0;else{if(!/^s(hift)?$/i.test(a))throw new Error("Unrecognized modifier name: "+a);i=!0}}return n&&(e="Alt-"+e),r&&(e="Ctrl-"+e),o&&(e="Cmd-"+e),i&&(e="Shift-"+e),e}function Gr(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=g(n.split(" "),Ur),o=0;o<i.length;o++){var l=void 0,a=void 0;o==i.length-1?(a=i.join(" "),l=r):(a=i.slice(0,o+1).join(" "),l="...");var s=t[a];if(s){if(s!=l)throw new Error("Inconsistent bindings for "+a)}else t[a]=l}delete e[n]}for(var u in t)e[u]=t[u];return e}function Kr(e,t,n,r){var i=(t=Yr(t)).call?t.call(e,r):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&n(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return Kr(e,t.fallthrough,n,r);for(var o=0;o<t.fallthrough.length;o++){var l=Kr(e,t.fallthrough[o],n,r);if(l)return l}}}function $r(e){var t="string"==typeof e?e:al[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function Zr(e,t,n){var r=e;return t.altKey&&"Alt"!=r&&(e="Alt-"+e),(ro?t.metaKey:t.ctrlKey)&&"Ctrl"!=r&&(e="Ctrl-"+e),(ro?t.ctrlKey:t.metaKey)&&"Cmd"!=r&&(e="Cmd-"+e),!n&&t.shiftKey&&"Shift"!=r&&(e="Shift-"+e),e}function Qr(e,t){if(Ui&&34==e.keyCode&&e.char)return!1;var n=al[e.keyCode];return null!=n&&!e.altGraphKey&&Zr(n,e,t)}function Yr(e){return"string"==typeof e?dl[e]:e}function Xr(e,t){for(var n=e.doc.sel.ranges,r=[],i=0;i<n.length;i++){for(var o=t(n[i]);r.length&&N(o.from,m(r).to)<=0;){var l=r.pop();if(N(l.from,o.from)<0){o.from=l.from;break}}r.push(o)}_n(e,function(){for(var t=r.length-1;t>=0;t--)Ir(e.doc,"",r[t].from,r[t].to,"+delete");an(e)})}function Jr(e,t,n){var r=C(e.text,t+n,n);return r<0||r>e.text.length?null:r}function ei(e,t,n){var r=Jr(e,t.ch,n);return null==r?null:new P(t.line,r,n<0?"after":"before")}function ti(e,t,n,r,i){if(e){var o=de(n,t.doc.direction);if(o){var l,a=i<0?m(o):o[0],s=i<0==(1==a.level)?"after":"before";if(a.level>0||"rtl"==t.doc.direction){var u=yt(t,n),c=vt(t,u,l=i<0?n.text.length-1:0).top;l=E(function(e){return vt(t,u,e).top==c},i<0==(1==a.level)?a.from:a.to-1,l),"before"==s&&(l=Jr(n,l,1))}else l=i<0?a.to:a.from;return new P(r,l,s)}}return new P(r,i<0?n.text.length:0,i<0?"before":"after")}function ni(e,t){var n=S(e.doc,t),r=ne(n);return r!=n&&(t=D(r)),ti(!0,e,r,t,1)}function ri(e,t){var n=ni(e,t.line),r=S(e.doc,n.line),i=de(r,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,r.text.search(/\S/));return P(n.line,t.line==n.line&&t.ch<=o&&t.ch?0:o,n.sticky)}return n}function ii(e,t,n){if("string"==typeof t&&!(t=pl[t]))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=po}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}function oi(e,t,n,r){var i=e.state.keySeq;if(i){if($r(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:fl.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),li(e,i+" "+t,n,r))return!0}return li(e,t,n,r)}function li(e,t,n,r){var i=function(e,t,n){for(var r=0;r<e.state.keyMaps.length;r++){var i=Kr(t,e.state.keyMaps[r],n,e);if(i)return i}return e.options.extraKeys&&Kr(t,e.options.extraKeys,n,e)||Kr(t,e.options.keyMap,n,e)}(e,t,r);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&Qe(e,"keyHandled",e,t,n),"handled"!=i&&"multi"!=i||(be(n),$t(e)),!!i}function ai(e,t){var n=Qr(t,!0);return!!n&&(t.shiftKey&&!e.state.keySeq?oi(e,"Shift-"+n,t,function(t){return ii(e,t,!0)})||oi(e,n,t,function(t){if("string"==typeof t?/^go[A-Z]/.test(t):t.motion)return ii(e,t)}):oi(e,n,t,function(t){return ii(e,t)}))}function si(e){if(this.curOp.focus=l(),!me(this,e)){zi&&Bi<11&&27==e.keyCode&&(e.returnValue=!1);var t=e.keyCode;this.display.shift=16==t||e.shiftKey;var n=ai(this,e);Ui&&(hl=n?t:null,!n&&88==t&&!ko&&(Xi?e.metaKey:e.ctrlKey)&&this.replaceSelection("",null,"cut")),18!=t||/\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className)||function(e){function t(e){18!=e.keyCode&&e.altKey||(oo(n,"CodeMirror-crosshair"),fe(document,"keyup",t),fe(document,"mouseover",t))}var n=e.display.lineDiv;a(n,"CodeMirror-crosshair"),Eo(document,"keyup",t),Eo(document,"mouseover",t)}(this)}}function ui(e){16==e.keyCode&&(this.doc.sel.shift=!1),me(this,e)}function ci(e){if(!(at(this.display,e)||me(this,e)||e.ctrlKey&&!e.altKey||Xi&&e.metaKey)){var t=e.keyCode,n=e.charCode;if(Ui&&t==hl)return hl=null,void be(e);if(!Ui||e.which&&!(e.which<10)||!ai(this,e)){var r=String.fromCharCode(null==n?t:n);"\b"!=r&&(function(t,n,i){return oi(t,"'"+r+"'",e,function(e){return ii(t,e,!0)})}(this)||this.display.input.onKeyPress(e))}}}function di(e){var t=this.display;if(!(me(this,e)||t.activeTouch&&t.input.supportsTouch()))if(t.input.ensurePolled(),t.shift=e.shiftKey,at(t,e))Hi||(t.scroller.draggable=!1,setTimeout(function(){return t.scroller.draggable=!0},100));else if(!hi(this,e)){var n=Ht(this,e),r=Ee(e),i=n?function(e,t){var n=+new Date;return yl&&yl.compare(n,e,t)?(gl=yl=null,"triple"):gl&&gl.compare(n,e,t)?(yl=new ml(n,e,t),gl=null,"double"):(gl=new ml(n,e,t),yl=null,"single")}(n,r):"single";window.focus(),1==r&&this.state.selectingText&&this.state.selectingText(e),n&&function(e,t,n,o,l){var a="Click";return"double"==i?a="Double"+a:"triple"==i&&(a="Triple"+a),a=(1==r?"Left":2==r?"Middle":"Right")+a,oi(e,Zr(a,l),l,function(t){if("string"==typeof t&&(t=pl[t]),!t)return!1;var r=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r=t(e,n)!=po}finally{e.state.suppressEdits=!1}return r})}(this,0,n,0,e)||(1==r?n?function(e,t,n,r){zi?setTimeout(u(Zt,e),0):e.curOp.focus=l();var i,o=function(e,t,n){var r=e.getOption("configureMouse"),i=r?r(e,t,n):{};if(null==i.unit){i.unit=(Ji?n.shiftKey&&n.metaKey:n.altKey)?"rectangle":"single"==t?"char":"double"==t?"word":"line"}return(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||n.shiftKey),null==i.addNew&&(i.addNew=Xi?n.metaKey:n.ctrlKey),null==i.moveOnDrag&&(i.moveOnDrag=!(Xi?n.altKey:n.ctrlKey)),i}(e,n,r),a=e.doc.sel;e.options.dragDrop&&So&&!e.isReadOnly()&&"single"==n&&(i=a.contains(t))>-1&&(N((i=a.ranges[i]).from(),t)<0||t.xRel>0)&&(N(i.to(),t)>0||t.xRel<0)?function(e,t,n,r){var i=e.display,o=!1,l=wn(e,function(t){Hi&&(i.scroller.draggable=!1),e.state.draggingText=!1,fe(document,"mouseup",l),fe(document,"mousemove",a),fe(i.scroller,"dragstart",s),fe(i.scroller,"drop",l),o||(be(t),r.addNew||cr(e.doc,n,null,null,r.extend),Hi||zi&&9==Bi?setTimeout(function(){document.body.focus(),i.input.focus()},20):i.input.focus())}),a=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},s=function(){return o=!0};Hi&&(i.scroller.draggable=!0),e.state.draggingText=l,l.copy=!r.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop(),Eo(document,"mouseup",l),Eo(document,"mousemove",a),Eo(i.scroller,"dragstart",s),Eo(i.scroller,"drop",l),Qt(e),setTimeout(function(){return i.input.focus()},20)}(e,r,t,o):function(e,t,n,r){function i(t){var o=++v,h=Ht(e,t,!0,"rectangle"==r.unit);if(h)if(0!=N(h,g)){e.curOp.focus=l(),function(t){if(0!=N(g,t))if(g=t,"rectangle"==r.unit){for(var i=[],o=e.options.tabSize,l=d(S(s,n.line).text,n.ch,o),a=d(S(s,t.line).text,t.ch,o),h=Math.min(l,a),m=Math.max(l,a),y=Math.min(n.line,t.line),v=Math.min(e.lastLine(),Math.max(n.line,t.line));y<=v;y++){var b=S(s,y).text,_=f(b,h,o);h==m?i.push(new Xo(P(y,_),P(y,_))):b.length>_&&i.push(new Xo(P(y,_),P(y,f(b,m,o))))}i.length||i.push(new Xo(n,n)),mr(s,Bn(p.ranges.slice(0,c).concat(i),c),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var w,x=u,C=pi(e,t,r.unit),E=x.anchor;N(C.anchor,E)>0?(w=C.head,E=j(x.from(),C.anchor)):(w=C.anchor,E=F(x.to(),C.head));var O=p.ranges.slice(0);O[c]=function(e,t){var n=t.anchor,r=t.head,i=S(e.doc,n.line);if(0==N(n,r)&&n.sticky==r.sticky)return t;var o=de(i);if(!o)return t;var l=ce(o,n.ch,n.sticky),a=o[l];if(a.from!=n.ch&&a.to!=n.ch)return t;var s=l+(a.from==n.ch==(1!=a.level)?0:1);if(0==s||s==o.length)return t;var u;if(r.line!=n.line)u=(r.line-n.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=ce(o,r.ch,r.sticky),d=c-l||(r.ch-n.ch)*(1==a.level?-1:1);u=c==s-1||c==s?d<0:d>0}var p=o[s+(u?-1:0)],f=u==(1==p.level),h=f?p.from:p.to,m=f?"after":"before";return n.ch==h&&n.sticky==m?t:new Xo(new P(n.line,h,m),r)}(e,new Xo(z(s,E),w)),mr(s,Bn(O,c),ho)}}(h);var m=tn(a,s);(h.line>=m.to||h.line<m.from)&&setTimeout(wn(e,function(){v==o&&i(t)}),150)}else{var b=t.clientY<y.top?-20:t.clientY>y.bottom?20:0;b&&setTimeout(wn(e,function(){v==o&&(a.scroller.scrollTop+=b,i(t))}),50)}}function o(t){e.state.selectingText=!1,v=1/0,be(t),a.input.focus(),fe(document,"mousemove",b),fe(document,"mouseup",_),s.history.lastSelOrigin=null}var a=e.display,s=e.doc;be(t);var u,c,p=s.sel,h=p.ranges;if(r.addNew&&!r.extend?(c=s.sel.contains(n),u=c>-1?h[c]:new Xo(n,n)):(u=s.sel.primary(),c=s.sel.primIndex),"rectangle"==r.unit)r.addNew||(u=new Xo(n,n)),n=Ht(e,t,!0,!0),c=-1;else{var m=pi(e,n,r.unit);u=r.extend?ur(u,m.anchor,m.head,r.extend):m}r.addNew?-1==c?(c=h.length,mr(s,Bn(h.concat([u]),c),{scroll:!1,origin:"*mouse"})):h.length>1&&h[c].empty()&&"char"==r.unit&&!r.extend?(mr(s,Bn(h.slice(0,c).concat(h.slice(c+1)),0),{scroll:!1,origin:"*mouse"}),p=s.sel):pr(s,c,u,ho):(c=0,mr(s,new Yo([u],0),ho),p=s.sel);var g=n,y=a.wrapper.getBoundingClientRect(),v=0,b=wn(e,function(e){Ee(e)?i(e):o(e)}),_=wn(e,o);e.state.selectingText=_,Eo(document,"mousemove",b),Eo(document,"mouseup",_)}(e,r,t,o)}(this,n,i,e):Ce(e)==t.scroller&&be(e):2==r?(n&&cr(this.doc,n),setTimeout(function(){return t.input.focus()},20)):3==r&&(io?mi(this,e):Qt(this)))}}function pi(e,t,n){if("char"==n)return new Xo(t,t);if("word"==n)return e.findWordAt(t);if("line"==n)return new Xo(P(t.line,0),z(e.doc,P(t.line+1,0)));var r=n(e,t);return new Xo(r.from,r.to)}function fi(e,t,n,r){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&be(t);var l=e.display,a=l.lineDiv.getBoundingClientRect();if(o>a.bottom||!ye(e,n))return we(t);o-=a.top-l.viewOffset;for(var s=0;s<e.options.gutters.length;++s){var u=l.gutters.childNodes[s];if(u&&u.getBoundingClientRect().right>=i)return he(e,n,e,I(e.doc,o),e.options.gutters[s],t),we(t)}}function hi(e,t){return fi(e,t,"gutterClick",!0)}function mi(e,t){at(e.display,t)||function(e,t){return!!ye(e,"gutterContextMenu")&&fi(e,t,"gutterContextMenu",!1)}(e,t)||me(e,t,"contextmenu")||e.display.input.onContextMenu(t)}function gi(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),xt(e)}function yi(e){Ln(e),En(e),nn(e)}function vi(e,t,n){if(!t!=!(n&&n!=vl)){var r=e.display.dragFunctions,i=t?Eo:fe;i(e.display.scroller,"dragstart",r.start),i(e.display.scroller,"dragenter",r.enter),i(e.display.scroller,"dragover",r.over),i(e.display.scroller,"dragleave",r.leave),i(e.display.scroller,"drop",r.drop)}}function bi(e){e.options.lineWrapping?(a(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(oo(e.display.wrapper,"CodeMirror-wrap"),ue(e)),Bt(e),En(e),xt(e),setTimeout(function(){return mn(e)},100)}function _i(e,t){var o=this;if(!(this instanceof _i))return new _i(e,t);this.options=t=t?c(t):{},c(bl,t,!1),Fn(t);var l=t.value;"string"==typeof l&&(l=new il(l,t.mode,null,t.lineSeparator,t.direction)),this.doc=l;var a=new _i.inputStyles[t.inputStyle](this),s=this.display=new function(e,t,n){this.input=n,this.scrollbarFiller=r("div",null,"CodeMirror-scrollbar-filler"),this.scrollbarFiller.setAttribute("cm-not-content","true"),this.gutterFiller=r("div",null,"CodeMirror-gutter-filler"),this.gutterFiller.setAttribute("cm-not-content","true"),this.lineDiv=i("div",null,"CodeMirror-code"),this.selectionDiv=r("div",null,null,"position: relative; z-index: 1"),this.cursorDiv=r("div",null,"CodeMirror-cursors"),this.measure=r("div",null,"CodeMirror-measure"),this.lineMeasure=r("div",null,"CodeMirror-measure"),this.lineSpace=i("div",[this.measure,this.lineMeasure,this.selectionDiv,this.cursorDiv,this.lineDiv],null,"position: relative; outline: none");var o=i("div",[this.lineSpace],"CodeMirror-lines");this.mover=r("div",[o],null,"position: relative"),this.sizer=r("div",[this.mover],"CodeMirror-sizer"),this.sizerWidth=null,this.heightForcer=r("div",null,null,"position: absolute; height: "+co+"px; width: 1px;"),this.gutters=r("div",null,"CodeMirror-gutters"),this.lineGutter=null,this.scroller=r("div",[this.sizer,this.heightForcer,this.gutters],"CodeMirror-scroll"),this.scroller.setAttribute("tabIndex","-1"),this.wrapper=r("div",[this.scrollbarFiller,this.gutterFiller,this.scroller],"CodeMirror"),zi&&Bi<8&&(this.gutters.style.zIndex=-1,this.scroller.style.paddingRight=0),Hi||Li&&Yi||(this.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(this.wrapper):e(this.wrapper)),this.viewFrom=this.viewTo=t.first,this.reportedViewFrom=this.reportedViewTo=t.first,this.view=[],this.renderedView=null,this.externalMeasured=null,this.viewOffset=0,this.lastWrapHeight=this.lastWrapWidth=0,this.updateLineNumbers=null,this.nativeBarWidth=this.barHeight=this.barWidth=0,this.scrollbarsClipped=!1,this.lineNumWidth=this.lineNumInnerWidth=this.lineNumChars=null,this.alignWidgets=!1,this.cachedCharWidth=this.cachedTextHeight=this.cachedPaddingH=null,this.maxLine=null,this.maxLineLength=0,this.maxLineChanged=!1,this.wheelDX=this.wheelDY=this.wheelStartX=this.wheelStartY=null,this.shift=!1,this.selForContextMenu=null,this.activeTouch=null,n.init(this)}(e,l,a);s.wrapper.CodeMirror=this,Ln(this),gi(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),yn(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new ao,keySeq:null,specialChars:null},t.autofocus&&!Yi&&s.input.focus(),zi&&Bi<11&&setTimeout(function(){return o.display.input.reset(!0)},20),function(e){function t(){o.activeTouch&&(l=setTimeout(function(){return o.activeTouch=null},1e3),(a=o.activeTouch).end=+new Date)}function i(e,t){if(null==t.left)return!0;var n=t.left-e.left,r=t.top-e.top;return n*n+r*r>400}var o=e.display;Eo(o.scroller,"mousedown",wn(e,di)),Eo(o.scroller,"dblclick",zi&&Bi<11?wn(e,function(t){if(!me(e,t)){var n=Ht(e,t);if(n&&!hi(e,t)&&!at(e.display,t)){be(t);var r=e.findWordAt(n);cr(e.doc,r.anchor,r.head)}}}):function(t){return me(e,t)||be(t)}),io||Eo(o.scroller,"contextmenu",function(t){return mi(e,t)});var l,a={end:0};Eo(o.scroller,"touchstart",function(t){if(!me(e,t)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(t)&&!hi(e,t)){o.input.ensurePolled(),clearTimeout(l);var n=+new Date;o.activeTouch={start:n,moved:!1,prev:n-a.end<=300?a:null},1==t.touches.length&&(o.activeTouch.left=t.touches[0].pageX,o.activeTouch.top=t.touches[0].pageY)}}),Eo(o.scroller,"touchmove",function(){o.activeTouch&&(o.activeTouch.moved=!0)}),Eo(o.scroller,"touchend",function(n){var r=o.activeTouch;if(r&&!at(o,n)&&null!=r.left&&!r.moved&&new Date-r.start<300){var l,a=e.coordsChar(o.activeTouch,"page");l=!r.prev||i(r,r.prev)?new Xo(a,a):!r.prev.prev||i(r,r.prev.prev)?e.findWordAt(a):new Xo(P(a.line,0),z(e.doc,P(a.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),be(n)}t()}),Eo(o.scroller,"touchcancel",t),Eo(o.scroller,"scroll",function(){o.scroller.clientHeight&&(dn(e,o.scroller.scrollTop),fn(e,o.scroller.scrollLeft,!0),he(e,"scroll",e))}),Eo(o.scroller,"mousewheel",function(t){return zn(e,t)}),Eo(o.scroller,"DOMMouseScroll",function(t){return zn(e,t)}),Eo(o.wrapper,"scroll",function(){return o.wrapper.scrollTop=o.wrapper.scrollLeft=0}),o.dragFunctions={enter:function(t){me(e,t)||xe(t)},over:function(t){me(e,t)||(function(e,i){var o=Ht(e,t);if(o){var l=document.createDocumentFragment();Gt(e,o,l),e.display.dragCursor||(e.display.dragCursor=r("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),n(e.display.dragCursor,l)}}(e),xe(t))},start:function(t){return function(e,t){if(zi&&(!e.state.draggingText||+new Date-ol<100))xe(t);else if(!me(e,t)&&!at(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!Gi)){var n=r("img",null,null,"position: fixed; left: 0; top: 0;");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",Ui&&(n.width=n.height=1,e.display.wrapper.appendChild(n),n._top=n.offsetTop),t.dataTransfer.setDragImage(n,0,0),Ui&&n.parentNode.removeChild(n)}}(e,t)},drop:wn(e,Br),leave:function(t){me(e,t)||Hr(e)}};var s=o.input.getField();Eo(s,"keyup",function(t){return ui.call(e,t)}),Eo(s,"keydown",wn(e,si)),Eo(s,"keypress",wn(e,ci)),Eo(s,"focus",function(t){return Yt(e,t)}),Eo(s,"blur",function(t){return Xt(e,t)})}(this),ll||(function(){var e;Eo(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,Wr(qr)},100))}),Eo(window,"blur",function(){return Wr(Xt)})}(),ll=!0),vn(this),this.curOp.forceUpdate=!0,Xn(this,l),t.autofocus&&!Yi||this.hasFocus()?setTimeout(u(Yt,this),20):Xt(this);for(var d in _l)_l.hasOwnProperty(d)&&_l[d](o,t[d],vl);rn(this),t.finishInit&&t.finishInit(this);for(var p=0;p<wl.length;++p)wl[p](o);bn(this),Hi&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(s.lineDiv).textRendering&&(s.lineDiv.style.textRendering="auto")}function wi(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=Ae(e,t).state:n="prev");var l=e.options.tabSize,a=S(o,t),s=d(a.text,null,l);a.stateAfter&&(a.stateAfter=null);var u,c=a.text.match(/^\s*/)[0];if(r||/\S/.test(a.text)){if("smart"==n&&((u=o.mode.indent(i,a.text.slice(c.length),a.text))==po||u>150)){if(!r)return;n="prev"}}else u=0,n="not";"prev"==n?u=t>o.first?d(S(o,t-1).text,null,l):0:"add"==n?u=s+e.options.indentUnit:"subtract"==n?u=s-e.options.indentUnit:"number"==typeof n&&(u=s+n),u=Math.max(0,u);var p="",f=0;if(e.options.indentWithTabs)for(var m=Math.floor(u/l);m;--m)f+=l,p+="\t";if(f<u&&(p+=h(u-f)),p!=c)return Ir(o,p,P(t,0),P(t,c.length),"+input"),a.stateAfter=null,!0;for(var g=0;g<o.sel.ranges.length;g++){var y=o.sel.ranges[g];if(y.head.line==t&&y.head.ch<c.length){var v=P(t,c.length);pr(o,g,new Xo(v,v));break}}}function xi(e){xl=e}function Ci(e,t,n,r,i){var o=e.doc;e.display.shift=!1,r||(r=o.sel);var l=e.state.pasteIncoming||"paste"==i,a=Oo(t),s=null;if(l&&r.ranges.length>1)if(xl&&xl.text.join("\n")==t){if(r.ranges.length%xl.text.length==0){s=[];for(var u=0;u<xl.text.length;u++)s.push(o.splitLines(xl.text[u]))}}else a.length==r.ranges.length&&e.options.pasteLinesPerSelection&&(s=g(a,function(e){return[e]}));for(var c,d=r.ranges.length-1;d>=0;d--){var p=r.ranges[d],f=p.from(),h=p.to();p.empty()&&(n&&n>0?f=P(f.line,f.ch-n):e.state.overwrite&&!l?h=P(h.line,Math.min(S(o,h.line).text.length,h.ch+m(a).length)):xl&&xl.lineWise&&xl.text.join("\n")==t&&(f=h=P(f.line,0))),c=e.curOp.updateInput;var y={from:f,to:h,text:s?s[d%s.length]:a,origin:i||(l?"paste":e.state.cutIncoming?"cut":"+input")};Sr(e.doc,y),Qe(e,"inputRead",e,y)}t&&!l&&Si(e,t),an(e),e.curOp.updateInput=c,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Ei(e,t){var n=e.clipboardData&&e.clipboardData.getData("Text");if(n)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||_n(t,function(){return Ci(t,n,0,null,"paste")}),!0}function Si(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var a=0;a<o.electricChars.length;a++)if(t.indexOf(o.electricChars.charAt(a))>-1){l=wi(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(S(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=wi(e,i.head.line,"smart"));l&&Qe(e,"electricInput",e,i.head.line)}}}function Oi(e){for(var t=[],n=[],r=0;r<e.doc.sel.ranges.length;r++){var i=e.doc.sel.ranges[r].head.line,o={anchor:P(i,0),head:P(i+1,0)};n.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:n}}function Ti(e,t){e.setAttribute("autocorrect","off"),e.setAttribute("autocapitalize","off"),e.setAttribute("spellcheck",!!t)}function ki(){var e=r("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=r("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return Hi?e.style.width="1000px":e.setAttribute("wrap","off"),Zi&&(e.style.border="1px solid black"),Ti(e),t}function Di(e,t,n,r,i){function o(r){var o;if(null==(o=i?function(e,t,n,r){var i=de(t,e.doc.direction);if(!i)return ei(t,n,r);n.ch>=t.text.length?(n.ch=t.text.length,n.sticky="before"):n.ch<=0&&(n.ch=0,n.sticky="after");var o=ce(i,n.ch,n.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(r>0?l.to>n.ch:l.from<n.ch))return ei(t,n,r);var a,s=function(e,n){return Jr(t,e instanceof P?e.ch:e,n)},u=function(n){return e.options.lineWrapping?(a=a||yt(e,t),Nt(e,t,a,n)):{begin:0,end:t.text.length}},c=u("before"==n.sticky?s(n,-1):n.ch);if("rtl"==e.doc.direction||1==l.level){var d=1==l.level==r<0,p=s(n,d?1:-1);if(null!=p&&(d?p<=l.to&&p<=c.end:p>=l.from&&p>=c.begin))return new P(n.line,p,d?"before":"after")}var f=function(e,t,r){for(var o=function(e,t){return t?new P(n.line,s(e,1),"before"):new P(n.line,e,"after")};e>=0&&e<i.length;e+=t){var l=i[e],a=t>0==(1!=l.level),u=a?r.begin:s(r.end,-1);if(l.from<=u&&u<l.to)return o(u,a);if(u=a?l.from:s(l.to,-1),r.begin<=u&&u<r.end)return o(u,a)}},h=f(o+r,r,c);if(h)return h;var m=r>0?c.end:s(c.begin,-1);return null==m||r>0&&m==t.text.length||!(h=f(r>0?0:i.length-1,r,u(m)))?null:h}(e.cm,s,t,n):ei(s,t,n))){if(r||!function(){var r=t.line+n;return!(r<e.first||r>=e.first+e.size)&&(t=new P(r,t.ch,t.sticky),s=S(e,r))}())return!1;t=ti(i,e.cm,s,t.line,n)}else t=o;return!0}var l=t,a=n,s=S(e,t.line);if("char"==r)o();else if("column"==r)o(!0);else if("word"==r||"group"==r)for(var u=null,c="group"==r,d=e.cm&&e.cm.getHelper(t,"wordChars"),p=!0;!(n<0)||o(!p);p=!1){var f=s.text.charAt(t.ch)||"\n",h=_(f,d)?"w":c&&"\n"==f?"n":!c||/\s/.test(f)?null:"p";if(!c||p||h||(h="s"),u&&u!=h){n<0&&(n=1,o(),t.sticky="after");break}if(h&&(u=h),n>0&&!o(!p))break}var m=wr(e,t,l,a,!0);return A(l,m)&&(m.hitSide=!0),m}function Ii(e,t,n,r){var i,o=e.doc,l=t.left;if("page"==r){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),s=Math.max(a-.5*Lt(e.display),3);i=(n>0?t.bottom:t.top)+n*s}else"line"==r&&(i=n>0?t.bottom+3:t.top-3);for(var u;(u=Mt(e,l,i)).outside;){if(n<0?i<=0:i>=o.height){u.hitSide=!0;break}i+=5*n}return u}function Ri(e,t){var n=gt(e,t.line);if(!n||n.hidden)return null;var r=S(e.doc,t.line),i=ht(n,r,t.line),o=de(r,e.doc.direction),l="left";o&&(l=ce(o,t.ch)%2?"right":"left");var a=bt(i.map,t.ch,l);return a.offset="right"==a.collapse?a.end:a.start,a}function Mi(e,t){return t&&(e.bad=!0),e}function Pi(e,t,n){var r;if(t==e.display.lineDiv){if(!(r=e.display.lineDiv.childNodes[n]))return Mi(e.clipPos(P(e.display.viewTo-1)),!0);t=null,n=0}else for(r=t;;r=r.parentNode){if(!r||r==e.display.lineDiv)return null;if(r.parentNode&&r.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var l=e.display.view[i];if(l.node==r)return function(e,t,n){function r(t,n,r){for(var i=-1;i<(d?d.length:0);i++)for(var o=i<0?c.map:d[i],l=0;l<o.length;l+=3){var a=o[l+2];if(a==t||a==n){var s=D(i<0?e.line:e.rest[i]),u=o[l]+r;return(r<0||a!=t)&&(u=o[l+(r?1:0)]),P(s,u)}}}var i=e.text.firstChild,l=!1;if(!t||!o(i,t))return Mi(P(D(e.line),0),!0);if(t==i&&(l=!0,t=i.childNodes[n],n=0,!t)){var a=e.rest?m(e.rest):e.line;return Mi(P(D(a),a.text.length),l)}var s=3==t.nodeType?t:null,u=t;for(s||1!=t.childNodes.length||3!=t.firstChild.nodeType||(s=t.firstChild,n&&(n=s.nodeValue.length));u.parentNode!=i;)u=u.parentNode;var c=e.measure,d=c.maps,p=r(s,u,n);if(p)return Mi(p,l);for(var f=u.nextSibling,h=s?s.nodeValue.length-n:0;f;f=f.nextSibling){if(p=r(f,f.firstChild,0))return Mi(P(p.line,p.ch-h),l);h+=f.textContent.length}for(var g=u.previousSibling,y=n;g;g=g.previousSibling){if(p=r(g,g.firstChild,-1))return Mi(P(p.line,p.ch+y),l);y+=g.textContent.length}}(l,t,n)}}var Ni=navigator.userAgent,Ai=navigator.platform,Li=/gecko\/\d/i.test(Ni),Fi=/MSIE \d/.test(Ni),ji=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Ni),Vi=/Edge\/(\d+)/.exec(Ni),zi=Fi||ji||Vi,Bi=zi&&(Fi?document.documentMode||6:+(Vi||ji)[1]),Hi=!Vi&&/WebKit\//.test(Ni),Wi=Hi&&/Qt\/\d+\.\d+/.test(Ni),qi=!Vi&&/Chrome\//.test(Ni),Ui=/Opera\//.test(Ni),Gi=/Apple Computer/.test(navigator.vendor),Ki=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(Ni),$i=/PhantomJS/.test(Ni),Zi=!Vi&&/AppleWebKit/.test(Ni)&&/Mobile\/\w+/.test(Ni),Qi=/Android/.test(Ni),Yi=Zi||Qi||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(Ni),Xi=Zi||/Mac/.test(Ai),Ji=/\bCrOS\b/.test(Ni),eo=/win/i.test(Ai),to=Ui&&Ni.match(/Version\/(\d*\.\d*)/);to&&(to=Number(to[1])),to&&to>=15&&(Ui=!1,Hi=!0);var no,ro=Xi&&(Wi||Ui&&(null==to||to<12.11)),io=Li||zi&&Bi>=9,oo=function(t,n){var r=t.className,i=e(n).exec(r);if(i){var o=r.slice(i.index+i[0].length);t.className=r.slice(0,i.index)+(o?i[1]+o:"")}};no=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(e){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var lo=function(e){e.select()};Zi?lo=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:zi&&(lo=function(e){try{e.select()}catch(e){}});var ao=function(){this.id=null};ao.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var so,uo,co=30,po={toString:function(){return"CodeMirror.Pass"}},fo={scroll:!1},ho={origin:"*mouse"},mo={origin:"+move"},go=[""],yo=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,vo=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,bo=!1,_o=!1,wo=null,xo=function(){function e(e){return e<=247?n.charAt(e):1424<=e&&e<=1524?"R":1536<=e&&e<=1785?r.charAt(e-1536):1774<=e&&e<=2220?"r":8192<=e&&e<=8203?"w":8204==e?"b":"L"}function t(e,t,n){this.level=e,this.from=t,this.to=n}var n="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",r="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",i=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,o=/[stwN]/,l=/[LRr]/,a=/[Lb1n]/,s=/[1n]/;return function(n,r){var u="ltr"==r?"L":"R";if(0==n.length||"ltr"==r&&!i.test(n))return!1;for(var c=n.length,d=[],p=0;p<c;++p)d.push(e(n.charCodeAt(p)));for(var f=0,h=u;f<c;++f){var g=d[f];"m"==g?d[f]=h:h=g}for(var y=0,v=u;y<c;++y){var b=d[y];"1"==b&&"r"==v?d[y]="n":l.test(b)&&(v=b,"r"==b&&(d[y]="R"))}for(var _=1,w=d[0];_<c-1;++_){var x=d[_];"+"==x&&"1"==w&&"1"==d[_+1]?d[_]="1":","!=x||w!=d[_+1]||"1"!=w&&"n"!=w||(d[_]=w),w=x}for(var C=0;C<c;++C){var E=d[C];if(","==E)d[C]="N";else if("%"==E){var S=void 0;for(S=C+1;S<c&&"%"==d[S];++S);for(var O=C&&"!"==d[C-1]||S<c&&"1"==d[S]?"1":"N",T=C;T<S;++T)d[T]=O;C=S-1}}for(var k=0,D=u;k<c;++k){var I=d[k];"L"==D&&"1"==I?d[k]="L":l.test(I)&&(D=I)}for(var R=0;R<c;++R)if(o.test(d[R])){var M=void 0;for(M=R+1;M<c&&o.test(d[M]);++M);for(var P="L"==(R?d[R-1]:u),N=P==("L"==(M<c?d[M]:u))?P?"L":"R":u,A=R;A<M;++A)d[A]=N;R=M-1}for(var L,F=[],j=0;j<c;)if(a.test(d[j])){var V=j;for(++j;j<c&&a.test(d[j]);++j);F.push(new t(0,V,j))}else{var z=j,B=F.length;for(++j;j<c&&"L"!=d[j];++j);for(var H=z;H<j;)if(s.test(d[H])){z<H&&F.splice(B,0,new t(1,z,H));var W=H;for(++H;H<j&&s.test(d[H]);++H);F.splice(B,0,new t(2,W,H)),z=H}else++H;z<j&&F.splice(B,0,new t(1,z,j))}return"ltr"==r&&(1==F[0].level&&(L=n.match(/^\s+/))&&(F[0].from=L[0].length,F.unshift(new t(0,0,L[0].length))),1==m(F).level&&(L=n.match(/\s+$/))&&(m(F).to-=L[0].length,F.push(new t(0,c-L[0].length,c)))),"rtl"==r?F.reverse():F}}(),Co=[],Eo=function(e,t,n){if(e.addEventListener)e.addEventListener(t,n,!1);else if(e.attachEvent)e.attachEvent("on"+t,n);else{var r=e._handlers||(e._handlers={});r[t]=(r[t]||Co).concat(n)}},So=function(){if(zi&&Bi<9)return!1;var e=r("div");return"draggable"in e||"dragDrop"in e}(),Oo=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;t<=r;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},To=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},ko=function(){var e=r("div");return"oncopy"in e||(e.setAttribute("oncopy","return;"),"function"==typeof e.oncopy)}(),Do=null,Io={},Ro={},Mo={},Po=function(e,t,n){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=n};Po.prototype.eol=function(){return this.pos>=this.string.length},Po.prototype.sol=function(){return this.pos==this.lineStart},Po.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Po.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Po.prototype.eat=function(e){var t=this.string.charAt(this.pos);if("string"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},Po.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Po.prototype.eatSpace=function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Po.prototype.skipToEnd=function(){this.pos=this.string.length},Po.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Po.prototype.backUp=function(e){this.pos-=e},Po.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=d(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?d(this.string,this.lineStart,this.tabSize):0)},Po.prototype.indentation=function(){return d(this.string,null,this.tabSize)-(this.lineStart?d(this.string,this.lineStart,this.tabSize):0)},Po.prototype.match=function(e,t,n){if("string"!=typeof e){var r=this.string.slice(this.pos).match(e);return r&&r.index>0?null:(r&&!1!==t&&(this.pos+=r[0].length),r)}var i=function(e){return n?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Po.prototype.current=function(){return this.string.slice(this.start,this.pos)},Po.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Po.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Po.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var No=function(e,t){this.state=e,this.lookAhead=t},Ao=function(e,t,n,r){this.state=t,this.doc=e,this.line=n,this.maxLookAhead=r||0,this.baseTokens=null,this.baseTokenPos=1};Ao.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Ao.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},Ao.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Ao.fromSaved=function(e,t,n){return t instanceof No?new Ao(e,Ie(e.mode,t.state),n,t.lookAhead):new Ao(e,Ie(e.mode,t),n)},Ao.prototype.save=function(e){var t=!1!==e?Ie(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new No(t,this.maxLookAhead):t};var Lo=function(e,t,n){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=n},Fo=function(e,t,n){this.text=e,$(this,t),this.height=n?n(this):1};Fo.prototype.lineNo=function(){return D(this)},ve(Fo);var jo,Vo={},zo={},Bo=null,Ho=null,Wo={left:0,right:0,top:0,bottom:0},qo=function(e,t,n){this.cm=n;var i=this.vert=r("div",[r("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),o=this.horiz=r("div",[r("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e(i),e(o),Eo(i,"scroll",function(){i.clientHeight&&t(i.scrollTop,"vertical")}),Eo(o,"scroll",function(){o.clientWidth&&t(o.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,zi&&Bi<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};qo.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==r&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},qo.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},qo.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},qo.prototype.zeroWidthHack=function(){this.horiz.style.height=this.vert.style.width=Xi&&!Ki?"12px":"18px",this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new ao,this.disableVert=new ao},qo.prototype.enableZeroWidthBar=function(e,t,n){function r(){var i=e.getBoundingClientRect();("vert"==n?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,r)}e.style.pointerEvents="auto",t.set(1e3,r)},qo.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Uo=function(){};Uo.prototype.update=function(){return{bottom:0,right:0}},Uo.prototype.setScrollLeft=function(){},Uo.prototype.setScrollTop=function(){},Uo.prototype.clear=function(){};var Go={native:qo,null:Uo},Ko=0,$o=function(e,t,n){var r=e.display;this.viewport=t,this.visible=tn(r,e.doc,t),this.editorIsHidden=!r.wrapper.offsetWidth,this.wrapperHeight=r.wrapper.clientHeight,this.wrapperWidth=r.wrapper.clientWidth,this.oldDisplayWidth=pt(e),this.force=n,this.dims=jt(e),this.events=[]};$o.prototype.signal=function(e,t){ye(e,t)&&this.events.push(arguments)},$o.prototype.finish=function(){for(var e=0;e<this.events.length;e++)he.apply(null,this.events[e])};var Zo=0,Qo=null;zi?Qo=-.53:Li?Qo=15:qi?Qo=-.7:Gi&&(Qo=-1/3);var Yo=function(e,t){this.ranges=e,this.primIndex=t};Yo.prototype.primary=function(){return this.ranges[this.primIndex]},Yo.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var n=this.ranges[t],r=e.ranges[t];if(!A(n.anchor,r.anchor)||!A(n.head,r.head))return!1}return!0},Yo.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new Xo(L(this.ranges[t].anchor),L(this.ranges[t].head));return new Yo(e,this.primIndex)},Yo.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},Yo.prototype.contains=function(e,t){t||(t=e);for(var n=0;n<this.ranges.length;n++){var r=this.ranges[n];if(N(t,r.from())>=0&&N(e,r.to())<=0)return n}return-1};var Xo=function(e,t){this.anchor=e,this.head=t};Xo.prototype.from=function(){return j(this.anchor,this.head)},Xo.prototype.to=function(){return F(this.anchor,this.head)},Xo.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},Ar.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var n=e,r=e+t;n<r;++n){var i=this.lines[n];this.height-=i.height,He(i),Qe(i,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;r<t.length;++r)t[r].parent=this},iterN:function(e,t,n){for(var r=e+t;e<r;++e)if(n(this.lines[e]))return!0}},Lr.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n=0;n<this.children.length;++n){var r=this.children[n],i=r.chunkSize();if(e<i){var o=Math.min(t,i-e),l=r.height;if(r.removeInner(e,o),this.height-=l-r.height,i==o&&(this.children.splice(n--,1),r.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof Ar))){var a=[];this.collapse(a),this.children=[new Ar(a)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,n){this.size+=t.length,this.height+=n;for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,n),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,a=l;a<i.lines.length;){var s=new Ar(i.lines.slice(a,a+=25));i.height-=s.height,this.children.splice(++r,0,s),s.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new Lr(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var n=p(e.parent.children,e);e.parent.children.splice(n+1,0,t)}else{var r=new Lr(e.children);r.parent=e,e.children=[r,t],e=r}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;r<this.children.length;++r){var i=this.children[r],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var Jo=function(e,t,n){if(n)for(var r in n)n.hasOwnProperty(r)&&(this[r]=n[r]);this.doc=e,this.node=t};Jo.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,n=this.line,r=D(n);if(null!=r&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(n.widgets=null);var o=lt(this);k(n,Math.max(0,n.height-o)),e&&(_n(e,function(){Fr(e,n,-o),Sn(e,r,"widget")}),Qe(e,"lineWidgetCleared",e,this,r))}},Jo.prototype.changed=function(){var e=this,t=this.height,n=this.doc.cm,r=this.line;this.height=null;var i=lt(this)-t;i&&(k(r,r.height+i),n&&_n(n,function(){n.curOp.forceUpdate=!0,Fr(n,r,i),Qe(n,"lineWidgetChanged",n,e,D(r))}))},ve(Jo);var el=0,tl=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++el};tl.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&vn(e),ye(this,"clear")){var n=this.find();n&&Qe(this,"clear",n.from,n.to)}for(var r=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],a=W(l.markedSpans,this);e&&!this.collapsed?Sn(e,D(l),"text"):e&&(null!=a.to&&(i=D(l)),null!=a.from&&(r=D(l))),l.markedSpans=q(l.markedSpans,a),null==a.from&&this.collapsed&&!oe(this.doc,l)&&e&&k(l,Lt(e.display))}if(e&&this.collapsed&&!e.options.lineWrapping)for(var s=0;s<this.lines.length;++s){var u=ne(this.lines[s]),c=se(u);c>e.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=r&&e&&this.collapsed&&En(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&vr(e.doc)),e&&Qe(e,"markerCleared",e,this,r,i),t&&bn(e),this.parent&&this.parent.clear()}},tl.prototype.find=function(e,t){null==e&&"bookmark"==this.type&&(e=1);for(var n,r,i=0;i<this.lines.length;++i){var o=this.lines[i],l=W(o.markedSpans,this);if(null!=l.from&&(n=P(t?o:D(o),l.from),-1==e))return n;if(null!=l.to&&(r=P(t?o:D(o),l.to),1==e))return r}return n&&{from:n,to:r}},tl.prototype.changed=function(){var e=this,t=this.find(-1,!0),n=this,r=this.doc.cm;t&&r&&_n(r,function(){var i=t.line,o=D(t.line),l=gt(r,o);if(l&&(_t(l),r.curOp.selectionChanged=r.curOp.forceUpdate=!0),r.curOp.updateMaxLine=!0,!oe(n.doc,i)&&null!=n.height){var a=n.height;n.height=null;var s=lt(n)-a;s&&k(i,i.height+s)}Qe(r,"markerChanged",r,e)})},tl.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=p(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},tl.prototype.detachLine=function(e){if(this.lines.splice(p(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},ve(tl);var nl=function(e,t){this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=this};nl.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();Qe(this,"clear")}},nl.prototype.find=function(e,t){return this.primary.find(e,t)},ve(nl);var rl=0,il=function(e,t,n,r,i){if(!(this instanceof il))return new il(e,t,n,r,i);null==n&&(n=0),Lr.call(this,[new Ar([new Fo("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=n;var o=P(n,0);this.sel=Hn(o),this.history=new er(null),this.id=++rl,this.modeOption=t,this.lineSep=r,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),Qn(this,{from:o,to:o,text:e}),mr(this,Hn(o),fo)};il.prototype=v(Lr.prototype,{constructor:il,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r<t.length;++r)n+=t[r].height;this.insertInner(e-this.first,t,n)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=T(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Cn(function(e){var t=P(this.first,0),n=this.first+this.size-1;Sr(this,{from:t,to:P(n,S(this,n).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&sn(this.cm,0,0),mr(this,Hn(t),fo)}),replaceRange:function(e,t,n,r){Ir(this,e,t=z(this,t),n=n?z(this,n):t,r)},getRange:function(e,t,n){var r=O(this,z(this,e),z(this,t));return!1===n?r:r.join(n||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(R(this,e))return S(this,e)},getLineNumber:function(e){return D(e)},getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=S(this,e)),ne(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return z(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Cn(function(e,t,n){fr(this,z(this,"number"==typeof e?P(e,t||0):e),null,n)}),setSelection:Cn(function(e,t,n){fr(this,z(this,e),z(this,t||e),n)}),extendSelection:Cn(function(e,t,n){cr(this,z(this,e),t&&z(this,t),n)}),extendSelections:Cn(function(e,t){dr(this,B(this,e),t)}),extendSelectionsBy:Cn(function(e,t){dr(this,B(this,g(this.sel.ranges,e)),t)}),setSelections:Cn(function(e,t,n){if(e.length){for(var r=[],i=0;i<e.length;i++)r[i]=new Xo(z(this,e[i].anchor),z(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),mr(this,Bn(r,t),n)}}),addSelection:Cn(function(e,t,n){var r=this.sel.ranges.slice(0);r.push(new Xo(z(this,e),z(this,t||e))),mr(this,Bn(r,r.length-1),n)}),getSelection:function(e){for(var t,n=this.sel.ranges,r=0;r<n.length;r++){var i=O(this,n[r].from(),n[r].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],n=this.sel.ranges,r=0;r<n.length;r++){var i=O(this,n[r].from(),n[r].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[r]=i}return t},replaceSelection:function(e,t,n){for(var r=[],i=0;i<this.sel.ranges.length;i++)r[i]=e;this.replaceSelections(r,t,n||"+input")},replaceSelections:Cn(function(e,t,n){for(var r=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];r[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:n}}for(var a=t&&"end"!=t&&function(e,t,n){for(var r=[],i=P(e.first,0),o=i,l=0;l<t.length;l++){var a=t[l],s=Gn(a.from,i,o),u=Gn(Wn(a),i,o);if(i=a.to,o=u,"around"==n){var c=e.sel.ranges[l],d=N(c.head,c.anchor)<0;r[l]=new Xo(d?u:s,d?s:u)}else r[l]=new Xo(s,s)}return new Yo(r,e.sel.primIndex)}(this,r,t),s=r.length-1;s>=0;s--)Sr(this,r[s]);a?hr(this,a):this.cm&&an(this.cm)}),undo:Cn(function(){Tr(this,"undo")}),redo:Cn(function(){Tr(this,"redo")}),undoSelection:Cn(function(){Tr(this,"undo",!0)}),redoSelection:Cn(function(){Tr(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r<e.done.length;r++)e.done[r].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++n;return{undo:t,redo:n}},clearHistory:function(){this.history=new er(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:sr(this.history.done),undone:sr(this.history.undone)}},setHistory:function(e){var t=this.history=new er(this.history.maxGeneration);t.done=sr(e.done.slice(0),null,!0),t.undone=sr(e.undone.slice(0),null,!0)},setGutterMarker:Cn(function(e,t,n){return Nr(this,e,"gutter",function(e){var r=e.gutterMarkers||(e.gutterMarkers={});return r[t]=n,!n&&w(r)&&(e.gutterMarkers=null),!0})}),clearGutter:Cn(function(e){var t=this;this.iter(function(n){n.gutterMarkers&&n.gutterMarkers[e]&&Nr(t,n,"gutter",function(){return n.gutterMarkers[e]=null,w(n.gutterMarkers)&&(n.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!R(this,e))return null;if(t=e,!(e=S(this,e)))return null}else if(null==(t=D(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Cn(function(t,n,r){return Nr(this,t,"gutter"==n?"gutter":"class",function(t){var i="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass";if(t[i]){if(e(r).test(t[i]))return!1;t[i]+=" "+r}else t[i]=r;return!0})}),removeLineClass:Cn(function(t,n,r){return Nr(this,t,"gutter"==n?"gutter":"class",function(t){var i="text"==n?"textClass":"background"==n?"bgClass":"gutter"==n?"gutterClass":"wrapClass",o=t[i];if(!o)return!1;if(null==r)t[i]=null;else{var l=o.match(e(r));if(!l)return!1;var a=l.index+l[0].length;t[i]=o.slice(0,l.index)+(l.index&&a!=o.length?" ":"")+o.slice(a)||null}return!0})}),addLineWidget:Cn(function(e,t,n){return function(e,r,i,o){var l=new Jo(e,t,n),a=e.cm;return a&&l.noHScroll&&(a.display.alignWidgets=!0),Nr(e,r,"widget",function(t){var n=t.widgets||(t.widgets=[]);if(null==l.insertAt?n.push(l):n.splice(Math.min(n.length-1,Math.max(0,l.insertAt)),0,l),l.line=t,a&&!oe(e,t)){var r=ae(t)<e.scrollTop;k(t,t.height+lt(l)),r&&ln(a,l.height),a.curOp.forceUpdate=!0}return!0}),Qe(a,"lineWidgetAdded",a,l,"number"==typeof r?r:D(r)),l}(this,e)}),removeLineWidget:function(e){e.clear()},markText:function(e,t,n){return jr(this,z(this,e),z(this,t),n,n&&n.type||"range")},setBookmark:function(e,t){var n={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return e=z(this,e),jr(this,e,e,n,"bookmark")},findMarksAt:function(e){var t=[],n=S(this,(e=z(this,e)).line).markedSpans;if(n)for(var r=0;r<n.length;++r){var i=n[r];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=z(this,e),t=z(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var a=0;a<l.length;a++){var s=l[a];null!=s.to&&i==e.line&&e.ch>=s.to||null==s.from&&i!=e.line||null!=s.from&&i==t.line&&s.from>=t.ch||n&&!n(s.marker)||r.push(s.marker.parent||s.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;r<n.length;++r)null!=n[r].from&&e.push(n[r].marker)}),e},posFromIndex:function(e){var t,n=this.first,r=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+r;if(o>e)return t=e,!0;e-=o,++n}),z(this,P(n,t))},indexFromPos:function(e){var t=(e=z(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var n=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+n}),t},copy:function(e){var t=new il(T(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,n=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<n&&(n=e.to);var r=new il(T(this,t,n),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(r.history=this.history),(this.linked||(this.linked=[])).push({doc:r,sharedHist:e.sharedHist}),r.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n],i=r.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(N(o,l)){var a=jr(e,o,l,r.primary,r.primary.type);r.markers.push(a),a.parent=r}}}(r,Vr(this)),r},unlinkDoc:function(e){if(e instanceof _i&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t)if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),zr(Vr(this));break}if(e.history==this.history){var n=[e.id];Yn(e,function(e){return n.push(e.id)},!0),e.history=new er(null),e.history.done=sr(this.history.done,n),e.history.undone=sr(this.history.undone,n)}},iterLinkedDocs:function(e){Yn(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):Oo(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:Cn(function(e){"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&function(e){_n(e,function(){Jn(e),En(e)})}(this.cm))})}),il.prototype.eachLine=il.prototype.iter;for(var ol=0,ll=!1,al={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},sl=0;sl<10;sl++)al[sl+48]=al[sl+96]=String(sl);for(var ul=65;ul<=90;ul++)al[ul]=String.fromCharCode(ul);for(var cl=1;cl<=12;cl++)al[cl+111]=al[cl+63235]="F"+cl;var dl={};dl.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},dl.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},dl.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},dl.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},dl.default=Xi?dl.macDefault:dl.pcDefault;var pl={selectAll:Cr,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),fo)},killLine:function(e){return Xr(e,function(t){if(t.empty()){var n=S(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line<e.lastLine()?{from:t.head,to:P(t.head.line+1,0)}:{from:t.head,to:P(t.head.line,n)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Xr(e,function(t){return{from:P(t.from().line,0),to:z(e.doc,P(t.to().line+1,0))}})},delLineLeft:function(e){return Xr(e,function(e){return{from:P(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Xr(e,function(t){var n=e.charCoords(t.head,"div").top+5;return{from:e.coordsChar({left:0,top:n},"div"),to:t.from()}})},delWrappedLineRight:function(e){return Xr(e,function(t){var n=e.charCoords(t.head,"div").top+5,r=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:n},"div");return{from:t.from(),to:r}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(P(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(P(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return ni(e,t.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return ri(e,t.head)},{origin:"+move",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var n=S(e.doc,t),r=function(e){for(var t;t=ee(e);)e=t.find(1,!0).line;return e}(n);return r!=n&&(t=D(r)),ti(!0,e,n,t,-1)}(e,t.head.line)},{origin:"+move",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var n=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:n},"div")},mo)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var n=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:0,top:n},"div")},mo)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var n=e.cursorCoords(t.head,"div").top+5,r=e.coordsChar({left:0,top:n},"div");return r.ch<e.getLine(r.line).search(/\S/)?ri(e,t.head):r},mo)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"char")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],n=e.listSelections(),r=e.options.tabSize,i=0;i<n.length;i++){var o=n[i].from(),l=d(e.getLine(o.line),o.ch,r);t.push(h(r-l%r))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(e){return _n(e,function(){for(var t=e.listSelections(),n=[],r=0;r<t.length;r++)if(t[r].empty()){var i=t[r].head,o=S(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new P(i.line,i.ch-1)),i.ch>0)i=new P(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),P(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=S(e.doc,i.line-1).text;l&&(i=new P(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),P(i.line-1,l.length-1),i,"+transpose"))}n.push(new Xo(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){return _n(e,function(){for(var t=e.listSelections(),n=t.length-1;n>=0;n--)e.replaceRange(e.doc.lineSeparator(),t[n].anchor,t[n].head,"+input");t=e.listSelections();for(var r=0;r<t.length;r++)e.indentLine(t[r].from().line,null,!0);an(e)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}},fl=new ao,hl=null,ml=function(e,t,n){this.time=e,this.pos=t,this.button=n};ml.prototype.compare=function(e,t,n){return this.time+400>e&&0==N(t,this.pos)&&n==this.button};var gl,yl,vl={toString:function(){return"CodeMirror.Init"}},bl={},_l={};_i.defaults=bl,_i.optionHandlers=_l;var wl=[];_i.defineInitHook=function(e){return wl.push(e)};var xl=null,Cl=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new ao,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};Cl.prototype.init=function(e){function t(e){if(!me(i,e)){if(i.somethingSelected())xi({lineWise:!1,text:i.getSelections()}),"cut"==e.type&&i.replaceSelection("",null,"cut");else{if(!i.options.lineWiseCopyCut)return;var t=Oi(i);xi({lineWise:!0,text:t.text}),"cut"==e.type&&i.operation(function(){i.setSelections(t.ranges,0,fo),i.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var n=xl.text.join("\n");if(e.clipboardData.setData("Text",n),e.clipboardData.getData("Text")==n)return void e.preventDefault()}var l=ki(),a=l.firstChild;i.display.lineSpace.insertBefore(l,i.display.lineSpace.firstChild),a.value=xl.text.join("\n");var s=document.activeElement;lo(a),setTimeout(function(){i.display.lineSpace.removeChild(l),s.focus(),s==o&&r.showPrimarySelection()},50)}}var n=this,r=this,i=r.cm,o=r.div=e.lineDiv;Ti(o,i.options.spellcheck),Eo(o,"paste",function(e){me(i,e)||Ei(e,i)||Bi<=11&&setTimeout(wn(i,function(){return n.updateFromDOM()}),20)}),Eo(o,"compositionstart",function(e){n.composing={data:e.data,done:!1}}),Eo(o,"compositionupdate",function(e){n.composing||(n.composing={data:e.data,done:!1})}),Eo(o,"compositionend",function(e){n.composing&&(e.data!=n.composing.data&&n.readFromDOMSoon(),n.composing.done=!0)}),Eo(o,"touchstart",function(){return r.forceCompositionEnd()}),Eo(o,"input",function(){n.composing||n.readFromDOMSoon()}),Eo(o,"copy",t),Eo(o,"cut",t)},Cl.prototype.prepareSelection=function(){var e=Ut(this.cm,!1);return e.focus=this.cm.state.focused,e},Cl.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Cl.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,n=t.doc.sel.primary(),r=n.from(),i=n.to();if(t.display.viewTo==t.display.viewFrom||r.line>=t.display.viewTo||i.line<t.display.viewFrom)e.removeAllRanges();else{var o=Pi(t,e.anchorNode,e.anchorOffset),l=Pi(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=N(j(o,l),r)||0!=N(F(o,l),i)){var a=t.display.view,s=r.line>=t.display.viewFrom&&Ri(t,r)||{node:a[0].measure.map[2],offset:0},u=i.line<t.display.viewTo&&Ri(t,i);if(!u){var c=a[a.length-1].measure,d=c.maps?c.maps[c.maps.length-1]:c.map;u={node:d[d.length-1],offset:d[d.length-2]-d[d.length-3]}}if(s&&u){var p,f=e.rangeCount&&e.getRangeAt(0);try{p=no(s.node,s.offset,u.offset,u.node)}catch(e){}p&&(!Li&&t.state.focused?(e.collapse(s.node,s.offset),p.collapsed||(e.removeAllRanges(),e.addRange(p))):(e.removeAllRanges(),e.addRange(p)),f&&null==e.anchorNode?e.addRange(f):Li&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Cl.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Cl.prototype.showMultipleSelections=function(e){n(this.cm.display.cursorDiv,e.cursors),n(this.cm.display.selectionDiv,e.selection)},Cl.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Cl.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return o(this.div,t)},Cl.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Cl.prototype.blur=function(){this.div.blur()},Cl.prototype.getField=function(){return this.div},Cl.prototype.supportsTouch=function(){return!0},Cl.prototype.receivedFocus=function(){function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))}var t=this;this.selectionInEditor()?this.pollSelection():_n(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,e)},Cl.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Cl.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(Qi&&qi&&this.cm.options.gutters.length&&function(t){for(var n=e.anchorNode;n;n=n.parentNode)if(/CodeMirror-gutter-wrapper/.test(n.className))return!0;return!1}())return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var n=Pi(t,e.anchorNode,e.anchorOffset),r=Pi(t,e.focusNode,e.focusOffset);n&&r&&_n(t,function(){mr(t.doc,Hn(n,r),fo),(n.bad||r.bad)&&(t.curOp.selectionChanged=!0)})}}},Cl.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e=this.cm,t=e.display,n=e.doc.sel.primary(),r=n.from(),i=n.to();if(0==r.ch&&r.line>e.firstLine()&&(r=P(r.line-1,S(e.doc,r.line-1).length)),i.ch==S(e.doc,i.line).text.length&&i.line<e.lastLine()&&(i=P(i.line+1,0)),r.line<t.viewFrom||i.line>t.viewTo-1)return!1;var o,l,a;r.line==t.viewFrom||0==(o=Wt(e,r.line))?(l=D(t.view[0].line),a=t.view[0].node):(l=D(t.view[o].line),a=t.view[o-1].node.nextSibling);var s,u,c=Wt(e,i.line);if(c==t.view.length-1?(s=t.viewTo-1,u=t.lineDiv.lastChild):(s=D(t.view[c+1].line)-1,u=t.view[c+1].node.previousSibling),!a)return!1;for(var d=e.doc.splitLines(function(e,t,n,r,i){function o(){u&&(s+=c,u=!1)}function l(e){e&&(o(),s+=e)}function a(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(null!=n)return void l(n||t.textContent.replace(/\u200b/g,""));var s,d=t.getAttribute("cm-marker");if(d){var p=e.findMarks(P(r,0),P(i+1,0),function(e){return function(t){return t.id==e}}(+d));return void(p.length&&(s=p[0].find(0))&&l(O(e.doc,s.from,s.to).join(c)))}if("false"==t.getAttribute("contenteditable"))return;var f=/^(pre|div|p)$/i.test(t.nodeName);f&&o();for(var h=0;h<t.childNodes.length;h++)a(t.childNodes[h]);f&&(u=!0)}else 3==t.nodeType&&l(t.nodeValue)}for(var s="",u=!1,c=e.doc.lineSeparator();a(t),t!=n;)t=t.nextSibling;return s}(e,a,u,l,s)),p=O(e.doc,P(l,0),P(s,S(e.doc,s).text.length));d.length>1&&p.length>1;)if(m(d)==m(p))d.pop(),p.pop(),s--;else{if(d[0]!=p[0])break;d.shift(),p.shift(),l++}for(var f=0,h=0,g=d[0],y=p[0],v=Math.min(g.length,y.length);f<v&&g.charCodeAt(f)==y.charCodeAt(f);)++f;for(var b=m(d),_=m(p),w=Math.min(b.length-(1==d.length?f:0),_.length-(1==p.length?f:0));h<w&&b.charCodeAt(b.length-h-1)==_.charCodeAt(_.length-h-1);)++h;if(1==d.length&&1==p.length&&l==r.line)for(;f&&f>r.ch&&b.charCodeAt(b.length-h-1)==_.charCodeAt(_.length-h-1);)f--,h++;d[d.length-1]=b.slice(0,b.length-h).replace(/^\u200b+/,""),d[0]=d[0].slice(f).replace(/\u200b+$/,"");var x=P(l,f),C=P(s,p.length?m(p).length-h:0);return d.length>1||d[0]||N(x,C)?(Ir(e.doc,d,x,C,"+input"),!0):void 0},Cl.prototype.ensurePolled=function(){this.forceCompositionEnd()},Cl.prototype.reset=function(){this.forceCompositionEnd()},Cl.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Cl.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Cl.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||_n(this.cm,function(){return En(e.cm)})},Cl.prototype.setUneditable=function(e){e.contentEditable="false"},Cl.prototype.onKeyPress=function(e){0!=e.charCode&&(e.preventDefault(),this.cm.isReadOnly()||wn(this.cm,Ci)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Cl.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},Cl.prototype.onContextMenu=function(){},Cl.prototype.resetPosition=function(){},Cl.prototype.needsContentAttribute=!0;var El=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new ao,this.hasSelection=!1,this.composing=null};El.prototype.init=function(e){function t(e){if(!me(i,e)){if(i.somethingSelected())xi({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=Oi(i);xi({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,fo):(r.prevInput="",l.value=t.text.join("\n"),lo(l))}"cut"==e.type&&(i.state.cutIncoming=!0)}}var n=this,r=this,i=this.cm,o=this.wrapper=ki(),l=this.textarea=o.firstChild;e.wrapper.insertBefore(o,e.wrapper.firstChild),Zi&&(l.style.width="0px"),Eo(l,"input",function(){zi&&Bi>=9&&n.hasSelection&&(n.hasSelection=null),r.poll()}),Eo(l,"paste",function(e){me(i,e)||Ei(e,i)||(i.state.pasteIncoming=!0,r.fastPoll())}),Eo(l,"cut",t),Eo(l,"copy",t),Eo(e.scroller,"paste",function(t){at(e,t)||me(i,t)||(i.state.pasteIncoming=!0,r.focus())}),Eo(e.lineSpace,"selectstart",function(t){at(e,t)||be(t)}),Eo(l,"compositionstart",function(){var e=i.getCursor("from");r.composing&&r.composing.range.clear(),r.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),Eo(l,"compositionend",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},El.prototype.prepareSelection=function(){var e=this.cm,t=e.display,n=e.doc,r=Ut(e);if(e.options.moveInputWithCursor){var i=Dt(e,n.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return r},El.prototype.showSelection=function(e){var t=this.cm.display;n(t.cursorDiv,e.cursors),n(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},El.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var n=t.getSelection();this.textarea.value=n,t.state.focused&&lo(this.textarea),zi&&Bi>=9&&(this.hasSelection=n)}else e||(this.prevInput=this.textarea.value="",zi&&Bi>=9&&(this.hasSelection=null))}},El.prototype.getField=function(){return this.textarea},El.prototype.supportsTouch=function(){return!1},El.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!Yi||l()!=this.textarea))try{this.textarea.focus()}catch(e){}},El.prototype.blur=function(){this.textarea.blur()},El.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},El.prototype.receivedFocus=function(){this.slowPoll()},El.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},El.prototype.fastPoll=function(){function e(){n.poll()||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))}var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,e)},El.prototype.poll=function(){var e=this,t=this.cm,n=this.textarea,r=this.prevInput;if(this.contextMenuPending||!t.state.focused||To(n)&&!r&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=n.value;if(i==r&&!t.somethingSelected())return!1;if(zi&&Bi>=9&&this.hasSelection===i||Xi&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||r||(r="\u200b"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,a=Math.min(r.length,i.length);l<a&&r.charCodeAt(l)==i.charCodeAt(l);)++l;return _n(t,function(){Ci(t,i.slice(l),r.length-l,null,e.composing?"*compose":null),i.length>1e3||i.indexOf("\n")>-1?n.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},El.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},El.prototype.onKeyPress=function(){zi&&Bi>=9&&(this.hasSelection=null),this.fastPoll()},El.prototype.onContextMenu=function(e){function t(){if(null!=l.selectionStart){var e=i.somethingSelected(),t="\u200b"+(e?l.value:"");l.value="\u21da",l.value=t,r.prevInput=e?"":"\u200b",l.selectionStart=1,l.selectionEnd=t.length,o.selForContextMenu=i.doc.sel}}function n(){if(r.contextMenuPending=!1,r.wrapper.style.cssText=c,l.style.cssText=u,zi&&Bi<9&&o.scrollbars.setScrollTop(o.scroller.scrollTop=s),null!=l.selectionStart){(!zi||zi&&Bi<9)&&t();var e=0,n=function(){o.selForContextMenu==i.doc.sel&&0==l.selectionStart&&l.selectionEnd>0&&"\u200b"==r.prevInput?wn(i,Cr)(i):e++<10?o.detectingSelectAll=setTimeout(n,500):(o.selForContextMenu=null,o.input.reset())};o.detectingSelectAll=setTimeout(n,200)}}var r=this,i=r.cm,o=i.display,l=r.textarea,a=Ht(i,e),s=o.scroller.scrollTop;if(a&&!Ui){i.options.resetSelectionOnContextMenu&&-1==i.doc.sel.contains(a)&&wn(i,mr)(i.doc,Hn(a),fo);var u=l.style.cssText,c=r.wrapper.style.cssText;r.wrapper.style.cssText="position: absolute";var d=r.wrapper.getBoundingClientRect();l.style.cssText="position: absolute; width: 30px; height: 30px;\n      top: "+(e.clientY-d.top-5)+"px; left: "+(e.clientX-d.left-5)+"px;\n      z-index: 1000; background: "+(zi?"rgba(255, 255, 255, .05)":"transparent")+";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";var p;if(Hi&&(p=window.scrollY),o.input.focus(),Hi&&window.scrollTo(null,p),o.input.reset(),i.somethingSelected()||(l.value=r.prevInput=" "),r.contextMenuPending=!0,o.selForContextMenu=i.doc.sel,clearTimeout(o.detectingSelectAll),zi&&Bi>=9&&t(),io){xe(e);var f=function(){fe(window,"mouseup",f),setTimeout(n,20)};Eo(window,"mouseup",f)}else setTimeout(n,50)}},El.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},El.prototype.setUneditable=function(){},El.prototype.needsContentAttribute=!1,function(e){function t(t,r,i,o){e.defaults[t]=r,i&&(n[t]=o?function(e,t,n){n!=vl&&i(e,t,n)}:i)}var n=e.optionHandlers;e.defineOption=t,e.Init=vl,t("value","",function(e,t){return e.setValue(t)},!0),t("mode",null,function(e,t){e.doc.modeOption=t,Kn(e)},!0),t("indentUnit",2,Kn,!0),t("indentWithTabs",!1),t("smartIndent",!0),t("tabSize",4,function(e){$n(e),xt(e),En(e)},!0),t("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var n=[],r=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,n.push(P(r,o))}r++});for(var i=n.length-1;i>=0;i--)Ir(e.doc,t,n[i],P(n[i].line,n[i].ch+t.length))}}),t("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(e,t,n){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),n!=vl&&e.refresh()}),t("specialCharPlaceholder",Ue,function(e){return e.refresh()},!0),t("electricChars",!0),t("inputStyle",Yi?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),t("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),t("rtlMoveVisually",!eo),t("wholeLineUpdateBefore",!0),t("theme","default",function(e){gi(e),yi(e)},!0),t("keyMap","default",function(e,t,n){var r=Yr(t),i=n!=vl&&Yr(n);i&&i.detach&&i.detach(e,r),r.attach&&r.attach(e,i||null)}),t("extraKeys",null),t("configureMouse",null),t("lineWrapping",!1,bi,!0),t("gutters",[],function(e){Fn(e.options),yi(e)},!0),t("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?Vt(e.display)+"px":"0",e.refresh()},!0),t("coverGutterNextToScrollbar",!1,function(e){return mn(e)},!0),t("scrollbarStyle","native",function(e){yn(e),mn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),t("lineNumbers",!1,function(e){Fn(e.options),yi(e)},!0),t("firstLineNumber",1,yi,!0),t("lineNumberFormatter",function(e){return e},yi,!0),t("showCursorWhenSelecting",!1,qt,!0),t("resetSelectionOnContextMenu",!0),t("lineWiseCopyCut",!0),t("pasteLinesPerSelection",!0),t("readOnly",!1,function(e,t){"nocursor"==t&&(Xt(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),t("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),t("dragDrop",!0,vi),t("allowDropFileTypes",null),t("cursorBlinkRate",530),t("cursorScrollMargin",0),t("cursorHeight",1,qt,!0),t("singleCursorHeightPerLine",!0,qt,!0),t("workTime",100),t("workDelay",100),t("flattenSpans",!0,$n,!0),t("addModeClass",!1,$n,!0),t("pollInterval",100),t("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),t("historyEventDelay",1250),t("viewportMargin",10,function(e){return e.refresh()},!0),t("maxHighlightLength",1e4,$n,!0),t("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),t("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),t("autofocus",null),t("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0)}(_i),function(e){var t=e.optionHandlers,n=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,n){var r=this.options,i=r[e];r[e]==n&&"mode"!=e||(r[e]=n,t.hasOwnProperty(e)&&wn(this,t[e])(this,n,i),he(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Yr(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;n<t.length;++n)if(t[n]==e||t[n].name==e)return t.splice(n,1),!0},addOverlay:xn(function(t,n){var r=t.token?t:e.getMode(this.options,t);if(r.startState)throw new Error("Overlays may not be stateful.");!function(e,t,n){for(var r=0,i=n(t);r<e.length&&n(e[r])<=i;)r++;e.splice(r,0,t)}(this.state.overlays,{mode:r,modeSpec:t,opaque:n&&n.opaque,priority:n&&n.priority||0},function(e){return e.priority}),this.state.modeGen++,En(this)}),removeOverlay:xn(function(e){for(var t=this.state.overlays,n=0;n<t.length;++n){var r=t[n].modeSpec;if(r==e||"string"==typeof e&&r.name==e)return t.splice(n,1),this.state.modeGen++,void En(this)}}),indentLine:xn(function(e,t,n){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),R(this.doc,e)&&wi(this,e,t,n)}),indentSelection:xn(function(e){for(var t=this.doc.sel.ranges,n=-1,r=0;r<t.length;r++){var i=t[r];if(i.empty())i.head.line>n&&(wi(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&an(this));else{var o=i.from(),l=i.to(),a=Math.max(n,o.line);n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var s=a;s<n;++s)wi(this,s,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&u[r].from().ch>0&&pr(this.doc,r,new Xo(o,u[r].to()),fo)}}}),getTokenAt:function(e,t){return Ve(this,e,t)},getLineTokens:function(e,t){return Ve(this,P(e),t,!0)},getTokenTypeAt:function(e){e=z(this.doc,e);var t,n=Ne(this,S(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]<o)){t=n[2*l+2];break}r=l+1}}var a=t?t.indexOf("overlay "):-1;return a<0?t:0==a?null:t.slice(0,a-1)},getModeAt:function(t){var n=this.doc.mode;return n.innerMode?e.innerMode(n,this.getTokenAt(t).state).mode:n},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!n.hasOwnProperty(t))return r;var i=n[t],o=this.getModeAt(e);if("string"==typeof o[t])i[o[t]]&&r.push(i[o[t]]);else if(o[t])for(var l=0;l<o[t].length;l++){var a=i[o[t][l]];a&&r.push(a)}else o.helperType&&i[o.helperType]?r.push(i[o.helperType]):i[o.name]&&r.push(i[o.name]);for(var s=0;s<i._global.length;s++){var u=i._global[s];u.pred(o,this)&&-1==p(r,u.val)&&r.push(u.val)}return r},getStateAfter:function(e,t){var n=this.doc;return e=V(n,null==e?n.first+n.size-1:e),Ae(this,e+1,t).state},cursorCoords:function(e,t){var n,r=this.doc.sel.primary();return n=null==e?r.head:"object"==typeof e?z(this.doc,e):e?r.from():r.to(),Dt(this,n,t||"page")},charCoords:function(e,t){return kt(this,z(this.doc,e),t||"page")},coordsChar:function(e,t){return e=Tt(this,e,t||"page"),Mt(this,e.left,e.top)},lineAtHeight:function(e,t){return e=Tt(this,{top:e,left:0},t||"page").top,I(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,n){var r,i=!1;if("number"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),r=S(this.doc,e)}else r=e;return Ot(this,r,{top:0,left:0},t||"page",n||i).top+(i?this.doc.height-ae(r):0)},defaultTextHeight:function(){return Lt(this.display)},defaultCharWidth:function(){return Ft(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o=this.display,l=(e=Dt(this,z(this.doc,e))).bottom,a=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),o.sizer.appendChild(t),"over"==r)l=e.top;else if("above"==r||"near"==r){var s=Math.max(o.wrapper.clientHeight,this.doc.height),u=Math.max(o.sizer.clientWidth,o.lineSpace.clientWidth);("above"==r||e.bottom+t.offsetHeight>s)&&e.top>t.offsetHeight?l=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=s&&(l=e.bottom),a+t.offsetWidth>u&&(a=u-t.offsetWidth)}t.style.top=l+"px",t.style.left=t.style.right="","right"==i?(a=o.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?a=0:"middle"==i&&(a=(o.sizer.clientWidth-t.offsetWidth)/2),t.style.left=a+"px"),n&&function(e,n){var r=on(e,{left:a,top:l,right:a+t.offsetWidth,bottom:l+t.offsetHeight});null!=r.scrollTop&&dn(e,r.scrollTop),null!=r.scrollLeft&&fn(e,r.scrollLeft)}(this)},triggerOnKeyDown:xn(si),triggerOnKeyPress:xn(ci),triggerOnKeyUp:ui,triggerOnMouseDown:xn(di),execCommand:function(e){if(pl.hasOwnProperty(e))return pl[e].call(null,this)},triggerElectric:xn(function(e){Si(this,e)}),findPosH:function(e,t,n,r){var i=1;t<0&&(i=-1,t=-t);for(var o=z(this.doc,e),l=0;l<t&&!(o=Di(this.doc,o,i,n,r)).hitSide;++l);return o},moveH:xn(function(e,t){var n=this;this.extendSelectionsBy(function(r){return n.display.shift||n.doc.extend||r.empty()?Di(n.doc,r.head,e,t,n.options.rtlMoveVisually):e<0?r.from():r.to()},mo)}),deleteH:xn(function(e,t){var n=this.doc;this.doc.sel.somethingSelected()?n.replaceSelection("",null,"+delete"):Xr(this,function(r){var i=Di(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,n,r){var i=1,o=r;t<0&&(i=-1,t=-t);for(var l=z(this.doc,e),a=0;a<t;++a){var s=Dt(this,l,"div");if(null==o?o=s.left:s.left=o,(l=Ii(this,s,i,n)).hitSide)break}return l},moveV:xn(function(e,t){var n=this,r=this.doc,i=[],o=!this.display.shift&&!r.extend&&r.sel.somethingSelected();if(r.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var a=Dt(n,l.head,"div");null!=l.goalColumn&&(a.left=l.goalColumn),i.push(a.left);var s=Ii(n,a,e,t);return"page"==t&&l==r.sel.primary()&&ln(n,kt(n,s,"div").top-a.top),s},mo),i.length)for(var l=0;l<r.sel.ranges.length;l++)r.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=S(this.doc,e.line).text,n=e.ch,r=e.ch;if(t){var i=this.getHelper(e,"wordChars");"before"!=e.sticky&&r!=t.length||!n?++r:--n;for(var o=t.charAt(n),l=_(o,i)?function(e){return _(e,i)}:/\s/.test(o)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!_(e)};n>0&&l(t.charAt(n-1));)--n;for(;r<t.length&&l(t.charAt(r));)++r}return new Xo(P(e.line,n),P(e.line,r))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?a(this.display.cursorDiv,"CodeMirror-overwrite"):oo(this.display.cursorDiv,"CodeMirror-overwrite"),he(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==l()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:xn(function(e,t){sn(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-dt(this)-this.display.barHeight,width:e.scrollWidth-dt(this)-this.display.barWidth,clientHeight:ft(this),clientWidth:pt(this)}},scrollIntoView:xn(function(e,t){null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:P(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?function(e,t){un(e),e.curOp.scrollToPos=t}(this,e):cn(this,e.from,e.to,e.margin)}),setSize:xn(function(e,t){var n=this,r=function(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e};null!=e&&(this.display.wrapper.style.width=r(e)),null!=t&&(this.display.wrapper.style.height=r(t)),this.options.lineWrapping&&wt(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){Sn(n,i,"widget");break}++i}),this.curOp.forceUpdate=!0,he(this,"refresh",this)}),operation:function(e){return _n(this,e)},startOperation:function(){return vn(this)},endOperation:function(){return bn(this)},refresh:xn(function(){var e=this.display.cachedTextHeight;En(this),this.curOp.forceUpdate=!0,xt(this),sn(this,this.doc.scrollLeft,this.doc.scrollTop),Nn(this),(null==e||Math.abs(e-Lt(this.display))>.5)&&Bt(this),he(this,"refresh",this)}),swapDoc:xn(function(e){var t=this.doc;return t.cm=null,Xn(this,e),xt(this),this.display.input.reset(),sn(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,Qe(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},ve(e),e.registerHelper=function(t,r,i){n.hasOwnProperty(t)||(n[t]=e[t]={_global:[]}),n[t][r]=i},e.registerGlobalHelper=function(t,r,i,o){e.registerHelper(t,r,o),n[t]._global.push({pred:i,val:o})}}(_i);var Sl="iter insert remove copy getEditor constructor".split(" ");for(var Ol in il.prototype)il.prototype.hasOwnProperty(Ol)&&p(Sl,Ol)<0&&(_i.prototype[Ol]=function(e){return function(){return e.apply(this.doc,arguments)}}(il.prototype[Ol]));return ve(il),_i.inputStyles={textarea:El,contenteditable:Cl},_i.defineMode=function(e){_i.defaults.mode||"null"==e||(_i.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Io[e]=t}.apply(this,arguments)},_i.defineMIME=function(e,t){Ro[e]=t},_i.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),_i.defineMIME("text/plain","null"),_i.defineExtension=function(e,t){_i.prototype[e]=t},_i.defineDocExtension=function(e,t){il.prototype[e]=t},_i.fromTextArea=function(e,t){function n(){e.value=s.getValue()}if(t=t?c(t):{},t.value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=l();t.autofocus=r==e||null!=e.getAttribute("autofocus")&&r==document.body}var i;if(e.form&&(Eo(e.form,"submit",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var a=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=a}}catch(e){}}t.finishInit=function(t){t.save=n,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,n(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display="",e.form&&(fe(e.form,"submit",n),"function"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display="none";var s=_i(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=fe,e.on=Eo,e.wheelEventPixels=Vn,e.Doc=il,e.splitLines=Oo,e.countColumn=d,e.findColumn=f,e.isWordChar=b,e.Pass=po,e.signal=he,e.Line=Fo,e.changeEnd=Wn,e.scrollbarModel=Go,e.Pos=P,e.cmpPos=N,e.modes=Io,e.mimeModes=Ro,e.resolveMode=Te,e.getMode=ke,e.modeExtensions=Mo,e.extendMode=De,e.copyState=Ie,e.startState=Me,e.innerMode=Re,e.commands=pl,e.keyMap=dl,e.keyName=Qr,e.isModifierKey=$r,e.lookupKey=Kr,e.normalizeKeyMap=Gr,e.StringStream=Po,e.SharedTextMarker=nl,e.TextMarker=tl,e.LineWidget=Jo,e.e_preventDefault=be,e.e_stopPropagation=_e,e.e_stop=xe,e.addClass=a,e.contains=o,e.rmClass=oo,e.keyNames=al}(_i),_i.version="5.32.0",_i}()},ozyc:function(e,t,n){"use strict";t.a=function(e,t){return void 0===t&&(t=0),Object(r.b)(e,t)(this)};var r=n("YRqN")},"p/bR":function(e,t,n){var r=n("pa70"),i=n("ULWX"),o=n("KpI+"),l=n("+pQw"),a=n("rppw"),s=n("fC8q"),u={},c={};(t=e.exports=function(e,t,n,d,p){var f,h,m,g,y=p?function(){return e}:s(e),v=r(n,d,t?2:1),b=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(o(y)){for(f=a(e.length);f>b;b++)if((g=t?v(l(h=e[b])[0],h[1]):v(e[b]))===u||g===c)return g}else for(m=y.call(e);!(h=m.next()).done;)if((g=i(m,v,h.value,t))===u||g===c)return g}).BREAK=u,t.RETURN=c},pBmS:function(e,t,n){var r=n("lfBE");e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},pQo2:function(e,t,n){"use strict";var r=n("6Xbx").__decorate,i=n("6Xbx").__metadata,o=n("6Xbx").__param;Object.defineProperty(t,"__esModule",{value:!0});var l=n("LMZF"),a=n("Un6q"),s=n("0nO6"),u=n("/zAi"),c=n("Rs3a"),d=n("/zAi"),p=n("4cOY"),f=n("P0cP"),h=function(){function e(){this.onClick=new l.EventEmitter}return e.prototype.handleClick=function(e){this.onClick.emit(e)},e}();r([l.Input(),i("design:type",Boolean)],h.prototype,"checked",void 0),r([l.Output(),i("design:type",l.EventEmitter)],h.prototype,"onClick",void 0),h=r([l.Component({selector:"p-dtRadioButton",template:'\n        <div class="ui-radiobutton ui-widget">\n            <div class="ui-helper-hidden-accessible">\n                <input type="radio" [checked]="checked">\n            </div>\n            <div class="ui-radiobutton-box ui-widget ui-radiobutton-relative ui-state-default" (click)="handleClick($event)"\n                        (mouseenter)="hover=true" (mouseleave)="hover=false"\n                        [ngClass]="{\'ui-state-hover\':hover,\'ui-state-active\':checked}">\n                <span class="ui-radiobutton-icon ui-clickable" [ngClass]="{\'fa fa-circle\':checked}"></span>\n            </div>\n        </div>\n    '})],h),t.DTRadioButton=h;var m=function(){function e(){this.onChange=new l.EventEmitter}return e.prototype.handleClick=function(e){this.disabled||this.onChange.emit({originalEvent:e,checked:!this.checked})},e}();r([l.Input(),i("design:type",Boolean)],m.prototype,"checked",void 0),r([l.Input(),i("design:type",Boolean)],m.prototype,"disabled",void 0),r([l.Output(),i("design:type",l.EventEmitter)],m.prototype,"onChange",void 0),m=r([l.Component({selector:"p-dtCheckbox",template:'\n        <div class="ui-chkbox ui-widget">\n            <div class="ui-helper-hidden-accessible">\n                <input type="checkbox" [checked]="checked">\n            </div>\n            <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default" (click)="handleClick($event)"\n                        (mouseover)="hover=true" (mouseout)="hover=false"\n                        [ngClass]="{\'ui-state-hover\':hover&&!disabled,\'ui-state-active\':checked&&!disabled,\'ui-state-disabled\':disabled}">\n                <span class="ui-chkbox-icon ui-clickable" [ngClass]="{\'fa fa-check\':checked}"></span>\n            </div>\n        </div>\n    '})],m),t.DTCheckbox=m;var g=function(){function e(e){this.viewContainer=e}return e.prototype.ngOnInit=function(){this.view=this.viewContainer.createEmbeddedView(this.template,{$implicit:this.rowData,rowIndex:this.rowIndex})},e.prototype.ngOnDestroy=function(){this.view.destroy()},e}();r([l.Input(),i("design:type",l.TemplateRef)],g.prototype,"template",void 0),r([l.Input(),i("design:type",Object)],g.prototype,"rowData",void 0),r([l.Input(),i("design:type",Object)],g.prototype,"rowIndex",void 0),g=r([l.Component({selector:"p-rowExpansionLoader",template:""})],g),t.RowExpansionLoader=g;var y=function(e){this.dt=e};r([l.Input("pColumnHeaders"),i("design:type",Array)],y.prototype,"columns",void 0),y=r([l.Component({selector:"[pColumnHeaders]",template:'\n        <ng-template ngFor let-col [ngForOf]="columns" let-lastCol="last">\n            <th #headerCell [attr.id]="col.colId" [ngStyle]="col.headerStyle||col.style" [class]="col.headerStyleClass||col.styleClass" (click)="dt.sort($event,col)" [attr.colspan]="col.colspan" [attr.rowspan]="col.rowspan"\n                [ngClass]="{\'ui-state-default ui-unselectable-text\':true, \'ui-sortable-column\': col.sortable, \'ui-state-active\': dt.isSorted(col), \'ui-resizable-column\': dt.resizableColumns, \'ui-selection-column\':col.selectionMode,\n                            \'ui-helper-hidden\': col.hidden}"\n                (dragstart)="dt.onColumnDragStart($event)" (dragleave)="dt.onColumnDragleave($event)" (drop)="dt.onColumnDrop($event)" (mousedown)="dt.onHeaderMousedown($event,headerCell)"\n                [attr.tabindex]="col.sortable ? tabindex : null" (keydown)="dt.onHeaderKeydown($event,col)"\n                [attr.scope]="col.scope||(col.colspan ? \'colgroup\' : \'col\')">\n                <span class="ui-column-resizer ui-clickable" *ngIf="dt.resizableColumns && ((dt.columnResizeMode == \'fit\' && !lastCol) || dt.columnResizeMode == \'expand\')" (mousedown)="dt.initColumnResize($event)"></span>\n                <span class="ui-column-title" *ngIf="!col.selectionMode&&!col.headerTemplate">{{col.header}}</span>\n                <span class="ui-column-title" *ngIf="col.headerTemplate">\n                    <p-columnHeaderTemplateLoader [column]="col"></p-columnHeaderTemplateLoader>\n                </span>\n                <span class="ui-sortable-column-icon fa fa-fw fa-sort" *ngIf="col.sortable"\n                     [ngClass]="{\'fa-sort-desc\': (dt.getSortOrder(col) == -1),\'fa-sort-asc\': (dt.getSortOrder(col) == 1)}"></span>\n                <input [attr.type]="col.filterType" class="ui-column-filter ui-inputtext ui-widget ui-state-default ui-corner-all" [attr.maxlength]="col.filterMaxlength" [attr.placeholder]="col.filterPlaceholder" *ngIf="col.filter&&!col.filterTemplate" [value]="dt.filters[col.filterField||col.field] ? dt.filters[col.filterField||col.field].value : \'\'"\n                    (click)="dt.onFilterInputClick($event)" (input)="dt.onFilterKeyup($event.target.value, col.filterField||col.field, col.filterMatchMode)"/>\n                <p-columnFilterTemplateLoader [column]="col" *ngIf="col.filter&&col.filterTemplate"></p-columnFilterTemplateLoader>\n                <p-dtCheckbox *ngIf="col.selectionMode==\'multiple\' && dt.showHeaderCheckbox === true" (onChange)="dt.toggleRowsWithCheckbox($event)" [checked]="dt.allSelected" [disabled]="dt.isEmpty()"></p-dtCheckbox>\n            </th>\n        </ng-template>\n    '}),o(0,l.Inject(l.forwardRef(function(){return w})))],y),t.ColumnHeaders=y;var v=function(e){this.dt=e};r([l.Input("pColumnFooters"),i("design:type",Array)],v.prototype,"columns",void 0),v=r([l.Component({selector:"[pColumnFooters]",template:'\n        <td *ngFor="let col of columns" [ngStyle]="col.footerStyle||col.style" [class]="col.footerStyleClass||col.styleClass"\n            [attr.colspan]="col.colspan" [attr.rowspan]="col.rowspan"\n            [ngClass]="{\'ui-state-default\':true, \'ui-helper-hidden\': col.hidden}">\n            <span class="ui-column-footer" *ngIf="!col.footerTemplate">{{col.footer}}</span>\n            <span class="ui-column-footer" *ngIf="col.footerTemplate">\n                <p-columnFooterTemplateLoader [column]="col"></p-columnFooterTemplateLoader>\n            </span>\n        </td>\n    '}),o(0,l.Inject(l.forwardRef(function(){return w})))],v),t.ColumnFooters=v;var b=function(){function e(e){this.dt=e}return e.prototype.visibleColumns=function(){return this.columns?this.columns.filter(function(e){return!e.hidden}):[]},e}();r([l.Input("pTableBody"),i("design:type",Array)],b.prototype,"columns",void 0),r([l.Input(),i("design:type",Array)],b.prototype,"data",void 0),b=r([l.Component({selector:"[pTableBody]",template:'\n        <ng-template ngFor let-rowData [ngForOf]="data" let-even="even" let-odd="odd" let-rowIndex="index" [ngForTrackBy]="dt.rowTrackBy">\n            <tr #rowGroupElement class="ui-widget-header ui-rowgroup-header"\n                *ngIf="dt.rowGroupMode==\'subheader\' && (rowIndex === 0||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex - 1], dt.groupField)))"\n                (click)="dt.onRowGroupClick($event)" [ngStyle]="{\'cursor\': dt.sortableRowGroup ? \'pointer\' : \'auto\'}">\n                <td [attr.colspan]="dt.visibleColumns().length">\n                    <a href="#" *ngIf="dt.expandableRowGroups" (click)="dt.toggleRowGroup($event,rowData)">\n                        <span class="fa fa-fw" [ngClass]="dt.isRowGroupExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon"></span>\n                    </a>\n                    <span class="ui-rowgroup-header-name">\n                        <p-templateLoader [template]="dt.rowGroupHeaderTemplate" [data]="rowData"></p-templateLoader>\n                    </span>\n                </td>\n            </tr>\n            <tr #rowElement *ngIf="!dt.expandableRowGroups||dt.isRowGroupExpanded(rowData)"\n                    (click)="dt.handleRowClick($event, rowData, rowIndex)" (dblclick)="dt.rowDblclick($event,rowData)" (contextmenu)="dt.onRowRightClick($event,rowData)" (touchend)="dt.handleRowTouchEnd($event)"\n                    [ngClass]="[even&&dt.rowGroupMode!=\'rowspan\'? \'ui-datatable-even\':\'\',\n                                odd&&dt.rowGroupMode!=\'rowspan\'?\'ui-datatable-odd\':\'\',\n                                dt.isSelected(rowData)? \'ui-state-highlight\': \'\',\n                                dt.isRowExpanded(rowData) ? \'ui-expanded-row\': \'\',\n                                dt.getRowStyleClass(rowData,rowIndex)]">\n                <ng-template ngFor let-col [ngForOf]="columns" let-colIndex="index">\n                    <td #cell *ngIf="!dt.rowGroupMode || (dt.rowGroupMode == \'subheader\') ||\n                        (dt.rowGroupMode==\'rowspan\' && ((dt.sortField==col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) || (dt.sortField!=col.field)))"\n                        [ngStyle]="col.bodyStyle||col.style" [class]="col.bodyStyleClass||col.styleClass" (click)="dt.switchCellToEditMode(cell,col,rowData)"\n                        [ngClass]="{\'ui-editable-column\':col.editable,\'ui-selection-column\':col.selectionMode, \'ui-helper-hidden\': col.hidden}"\n                        [attr.rowspan]="(dt.rowGroupMode==\'rowspan\' && dt.sortField == col.field && dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].index == rowIndex) ? dt.rowGroupMetadata[dt.resolveFieldData(rowData,dt.sortField)].size : null">\n                        <span class="ui-column-title" *ngIf="dt.responsive">{{col.header}}</span>\n                        <span class="ui-cell-data" *ngIf="!col.bodyTemplate && !col.expander && !col.selectionMode">{{dt.resolveFieldData(rowData,col.field)}}</span>\n                        <span class="ui-cell-data" *ngIf="col.bodyTemplate">\n                            <p-columnBodyTemplateLoader [column]="col" [rowData]="rowData" [rowIndex]="rowIndex + dt.first"></p-columnBodyTemplateLoader>\n                        </span>\n                        <div class="ui-cell-editor" *ngIf="col.editable">\n                            <input *ngIf="!col.editorTemplate" type="text" [(ngModel)]="rowData[col.field]"\n                                (keydown)="dt.onCellEditorKeydown($event, col, rowData, rowIndex)" (blur)="dt.onCellEditorBlur($event, col, rowData, rowIndex)"\n                                (input)="dt.onCellEditorInput($event, col, rowData, rowIndex)" (change)="dt.onCellEditorChange($event, col, rowData, rowIndex)"\n                                class="ui-inputtext ui-widget ui-state-default ui-corner-all"/>\n                            <a *ngIf="col.editorTemplate" class="ui-cell-editor-proxy-focus" href="#" (focus)="dt.onCustomEditorFocusPrev($event, colIndex)"></a>\n                            <p-columnEditorTemplateLoader *ngIf="col.editorTemplate" [column]="col" [rowData]="rowData" [rowIndex]="rowIndex"></p-columnEditorTemplateLoader>\n                            <a *ngIf="col.editorTemplate" class="ui-cell-editor-proxy-focus" href="#" (focus)="dt.onCustomEditorFocusNext($event, colIndex)"></a>\n                        </div>\n                        <a href="#" *ngIf="col.expander" (click)="dt.toggleRow(rowData,$event)">\n                            <span class="ui-row-toggler fa fa-fw ui-clickable" [ngClass]="dt.isRowExpanded(rowData) ? dt.expandedIcon : dt.collapsedIcon"></span>\n                        </a>\n                        <p-dtRadioButton *ngIf="col.selectionMode==\'single\'" (onClick)="dt.selectRowWithRadio($event, rowData)" [checked]="dt.isSelected(rowData)"></p-dtRadioButton>\n                        <p-dtCheckbox *ngIf="col.selectionMode==\'multiple\'" (onChange)="dt.toggleRowWithCheckbox($event,rowData)" [checked]="dt.isSelected(rowData)"></p-dtCheckbox>\n                    </td>\n                </ng-template>\n            </tr>\n            <tr *ngIf="dt.expandableRows && dt.isRowExpanded(rowData)" class="ui-expanded-row-content">\n                <td [attr.colspan]="dt.visibleColumns().length">\n                    <p-rowExpansionLoader [rowData]="rowData" [rowIndex]="rowIndex" [template]="dt.rowExpansionTemplate"></p-rowExpansionLoader>\n                </td>\n            </tr>\n            <tr class="ui-widget-header ui-rowgroup-footer" *ngIf="dt.rowGroupFooterTemplate && dt.rowGroupMode==\'subheader\' && ((rowIndex === dt.dataToRender.length - 1)||(dt.resolveFieldData(rowData,dt.groupField) !== dt.resolveFieldData(dt.dataToRender[rowIndex + 1],dt.groupField))) && (!dt.expandableRowGroups || dt.isRowGroupExpanded(rowData))">\n                <p-templateLoader class="ui-helper-hidden" [data]="rowData" [template]="dt.rowGroupFooterTemplate"></p-templateLoader>\n            </tr>\n        </ng-template>\n\n        <tr *ngIf="dt.isEmpty()" class="ui-widget-content ui-datatable-emptymessage-row" [style.visibility]="dt.loading ? \'hidden\' : \'visible\'">\n            <td [attr.colspan]="dt.visibleColumns().length" class="ui-datatable-emptymessage">\n                <span *ngIf="!dt.emptyMessageTemplate">{{dt.emptyMessage}}</span>\n                <p-templateLoader [template]="dt.emptyMessageTemplate"></p-templateLoader>\n            </td>\n        </tr>\n    '}),o(0,l.Inject(l.forwardRef(function(){return w})))],b),t.TableBody=b;var _=function(){function e(e,t,n,r,i){this.dt=e,this.domHandler=t,this.el=n,this.renderer=r,this.zone=i,this.onVirtualScroll=new l.EventEmitter}return e.prototype.ngAfterViewInit=function(){this.initScrolling()},e.prototype.ngAfterViewChecked=function(){var e=this;if(this.virtualScroll&&!this.rowHeight){var t=this.domHandler.findSingle(this.scrollTable,"tr.ui-widget-content:not(.ui-datatable-emptymessage-row)");t&&(this.rowHeight=this.domHandler.getOuterHeight(t))}this.frozen||this.zone.runOutsideAngular(function(){setTimeout(function(){e.alignScrollBar()},1)})},e.prototype.initScrolling=function(){var e=this;this.scrollHeader=this.scrollHeaderViewChild.nativeElement,this.scrollHeaderBox=this.scrollHeaderBoxViewChild.nativeElement,this.scrollBody=this.scrollBodyViewChild.nativeElement,this.scrollTable=this.scrollTableViewChild.nativeElement,this.scrollTableWrapper=this.scrollTableWrapperViewChild.nativeElement,this.scrollFooter=this.scrollFooterViewChild?this.scrollFooterViewChild.nativeElement:null,this.scrollFooterBox=this.scrollFooterBoxViewChild?this.scrollFooterBoxViewChild.nativeElement:null,this.setScrollHeight(),this.frozen||this.zone.runOutsideAngular(function(){e.scrollHeader.addEventListener("scroll",e.onHeaderScroll.bind(e)),e.scrollBody.addEventListener("scroll",e.onBodyScroll.bind(e))}),this.frozen?this.scrollBody.style.paddingBottom=this.domHandler.calculateScrollbarWidth()+"px":this.alignScrollBar()},e.prototype.onBodyScroll=function(e){var t=this,n=this.el.nativeElement.previousElementSibling;if(n)var r=this.domHandler.findSingle(n,".ui-datatable-scrollable-body");if(this.scrollHeaderBox.style.marginLeft=-1*this.scrollBody.scrollLeft+"px",this.scrollFooterBox&&(this.scrollFooterBox.style.marginLeft=-1*this.scrollBody.scrollLeft+"px"),r&&(r.scrollTop=this.scrollBody.scrollTop),this.virtualScroll){var i=this.domHandler.getOuterHeight(this.scrollBody),o=this.domHandler.getOuterHeight(this.scrollTable),l=this.rowHeight*this.dt.rows,a=this.domHandler.getOuterHeight(this.scrollTableWrapper)/l||1;if(this.scrollBody.scrollTop+i>parseFloat(this.scrollTable.style.top)+o||this.scrollBody.scrollTop<parseFloat(this.scrollTable.style.top)){var s=Math.floor(this.scrollBody.scrollTop*a/this.scrollBody.scrollHeight)+1;this.onVirtualScroll.emit({page:s,callback:function(){t.scrollTable.style.top=(s-1)*l+"px"}})}}},e.prototype.setScrollHeight=function(){if(this.dt.scrollHeight)if(-1!==this.dt.scrollHeight.indexOf("%")){this.scrollBody.style.visibility="hidden",this.scrollBody.style.height="100px";var e=this.domHandler.getOuterHeight(this.dt.el.nativeElement.children[0]),t=this.domHandler.getOuterHeight(this.dt.el.nativeElement.parentElement)*parseInt(this.dt.scrollHeight)/100-(e-100);this.scrollBody.style.height="auto",this.scrollBody.style.maxHeight=t+"px",this.scrollBody.style.visibility="visible"}else this.scrollBody.style.maxHeight=this.dt.scrollHeight},e.prototype.onHeaderScroll=function(e){this.scrollHeader.scrollLeft=0},e.prototype.hasVerticalOverflow=function(){return this.domHandler.getOuterHeight(this.scrollTable)>this.domHandler.getOuterHeight(this.scrollBody)},e.prototype.alignScrollBar=function(){var e=this.hasVerticalOverflow()?this.domHandler.calculateScrollbarWidth():0;this.scrollHeaderBox.style.marginRight=e+"px",this.scrollFooterBox&&(this.scrollFooterBox.style.marginRight=e+"px")},e.prototype.ngOnDestroy=function(){this.scrollHeader.removeEventListener("scroll",this.onHeaderScroll),this.scrollBody.removeEventListener("scroll",this.onBodyScroll)},e}();r([l.Input("pScrollableView"),i("design:type",Array)],_.prototype,"columns",void 0),r([l.Input(),i("design:type",d.HeaderColumnGroup)],_.prototype,"headerColumnGroup",void 0),r([l.Input(),i("design:type",d.HeaderColumnGroup)],_.prototype,"footerColumnGroup",void 0),r([l.ViewChild("scrollHeader"),i("design:type",l.ElementRef)],_.prototype,"scrollHeaderViewChild",void 0),r([l.ViewChild("scrollHeaderBox"),i("design:type",l.ElementRef)],_.prototype,"scrollHeaderBoxViewChild",void 0),r([l.ViewChild("scrollBody"),i("design:type",l.ElementRef)],_.prototype,"scrollBodyViewChild",void 0),r([l.ViewChild("scrollTable"),i("design:type",l.ElementRef)],_.prototype,"scrollTableViewChild",void 0),r([l.ViewChild("scrollTableWrapper"),i("design:type",l.ElementRef)],_.prototype,"scrollTableWrapperViewChild",void 0),r([l.ViewChild("scrollFooter"),i("design:type",l.ElementRef)],_.prototype,"scrollFooterViewChild",void 0),r([l.ViewChild("scrollFooterBox"),i("design:type",l.ElementRef)],_.prototype,"scrollFooterBoxViewChild",void 0),r([l.Input(),i("design:type",Boolean)],_.prototype,"frozen",void 0),r([l.Input(),i("design:type",String)],_.prototype,"width",void 0),r([l.Input(),i("design:type",Boolean)],_.prototype,"virtualScroll",void 0),r([l.Output(),i("design:type",l.EventEmitter)],_.prototype,"onVirtualScroll",void 0),_=r([l.Component({selector:"[pScrollableView]",template:'\n        <div #scrollHeader class="ui-widget-header ui-datatable-scrollable-header" [ngStyle]="{\'width\': width}">\n            <div #scrollHeaderBox  class="ui-datatable-scrollable-header-box">\n                <table [ngClass]="dt.tableStyleClass" [ngStyle]="dt.tableStyle">\n                    <thead class="ui-datatable-thead">\n                        <tr *ngIf="!headerColumnGroup" class="ui-state-default" [pColumnHeaders]="columns"></tr>\n                        <ng-template [ngIf]="headerColumnGroup">\n                            <tr *ngFor="let headerRow of headerColumnGroup.rows" class="ui-state-default" [pColumnHeaders]="headerRow.columns"></tr>\n                        </ng-template>\n                    </thead>\n                    <tbody *ngIf="dt.frozenValue" [ngClass]="{\'ui-datatable-data ui-widget-content\': true, \'ui-datatable-hoverable-rows\': (dt.rowHover||dt.selectionMode)}" [pTableBody]="columns" [data]="dt.frozenValue"></tbody>\n                </table>\n            </div>\n        </div>\n        <div #scrollBody class="ui-datatable-scrollable-body" [ngStyle]="{\'width\': width}">\n            <div #scrollTableWrapper class="ui-datatable-scrollable-table-wrapper" style="position:relative">\n                <table #scrollTable [class]="dt.tableStyleClass" [ngStyle]="dt.tableStyle" [ngClass]="{\'ui-datatable-virtual-table\':virtualScroll}" style="top:0px">\n                    <colgroup class="ui-datatable-scrollable-colgroup">\n                        <col *ngFor="let col of columns" [ngStyle]="col.headerStyle||col.style" [ngClass]="{\'ui-helper-hidden\': col.hidden}"/>\n                    </colgroup>\n                    <tbody [ngClass]="{\'ui-datatable-data ui-widget-content\': true, \'ui-datatable-hoverable-rows\': (dt.rowHover||dt.selectionMode)}" [pTableBody]="columns" [data]="dt.dataToRender"></tbody>\n                </table>\n            </div>\n        </div>\n        <div #scrollFooter class="ui-widget-header ui-datatable-scrollable-footer" [ngStyle]="{\'width\': width}" *ngIf="dt.hasFooter()">\n            <div #scrollFooterBox  class="ui-datatable-scrollable-footer-box">\n                <table [ngClass]="dt.tableStyleClass" [ngStyle]="dt.tableStyle">\n                    <tfoot class="ui-datatable-tfoot">\n                        <tr *ngIf="!footerColumnGroup" [pColumnFooters]="columns" class="ui-state-default"></tr>\n                        <ng-template [ngIf]="footerColumnGroup">\n                            <tr *ngFor="let footerRow of footerColumnGroup.rows" class="ui-state-default" [pColumnFooters]="footerRow.columns"></tr>\n                        </ng-template>\n                    </tfoot>\n                </table>\n            </div>\n        </div>\n    '}),o(0,l.Inject(l.forwardRef(function(){return w})))],_),t.ScrollableView=_;var w=function(){function e(e,t,n,r,i,o,a){this.el=e,this.domHandler=t,this.differs=n,this.renderer=r,this.changeDetector=i,this.objectUtils=o,this.zone=a,this.pageLinks=5,this.selectionChange=new l.EventEmitter,this.showHeaderCheckbox=!0,this.onRowClick=new l.EventEmitter,this.onRowSelect=new l.EventEmitter,this.onRowUnselect=new l.EventEmitter,this.onRowDblclick=new l.EventEmitter,this.onHeaderCheckboxToggle=new l.EventEmitter,this.onContextMenuSelect=new l.EventEmitter,this.filterDelay=300,this.onLazyLoad=new l.EventEmitter,this.columnResizeMode="fit",this.onColResize=new l.EventEmitter,this.onColReorder=new l.EventEmitter,this.sortMode="single",this.defaultSortOrder=1,this.csvSeparator=",",this.exportFilename="download",this.emptyMessage="No records found",this.paginatorPosition="bottom",this.alwaysShowPaginator=!0,this.metaKeySelection=!0,this.rowTrackBy=function(e,t){return t},this.immutable=!0,this.compareSelectionBy="deepEquals",this.onEditInit=new l.EventEmitter,this.onEditComplete=new l.EventEmitter,this.onEdit=new l.EventEmitter,this.onEditCancel=new l.EventEmitter,this.onPage=new l.EventEmitter,this.onSort=new l.EventEmitter,this.onFilter=new l.EventEmitter,this.rowExpandMode="multiple",this.expandedIcon="fa-chevron-circle-down",this.collapsedIcon="fa-chevron-circle-right",this.tabindex=1,this.sortableRowGroup=!0,this.filters={},this.loadingIcon="fa-circle-o-notch",this.virtualScrollDelay=500,this.rowGroupExpandMode="multiple",this.valueChange=new l.EventEmitter,this.firstChange=new l.EventEmitter,this.onRowExpand=new l.EventEmitter,this.onRowCollapse=new l.EventEmitter,this.onRowGroupExpand=new l.EventEmitter,this.onRowGroupCollapse=new l.EventEmitter,this.page=0,this.columnsChanged=!1,this._first=0,this._sortOrder=1,this.filterConstraints={startsWith:function(e,t){if(void 0===t||null===t||""===t.trim())return!0;if(void 0===e||null===e)return!1;var n=t.toLowerCase();return e.toString().toLowerCase().slice(0,n.length)===n},contains:function(e,t){return void 0===t||null===t||"string"==typeof t&&""===t.trim()||void 0!==e&&null!==e&&-1!==e.toString().toLowerCase().indexOf(t.toLowerCase())},endsWith:function(e,t){if(void 0===t||null===t||""===t.trim())return!0;if(void 0===e||null===e)return!1;var n=t.toString().toLowerCase();return-1!==e.toString().toLowerCase().indexOf(n,e.toString().length-n.length)},equals:function(e,t){return void 0===t||null===t||"string"==typeof t&&""===t.trim()||void 0!==e&&null!==e&&e.toString().toLowerCase()==t.toString().toLowerCase()},notEquals:function(e,t){return!(void 0===t||null===t||"string"==typeof t&&""===t.trim()||void 0!==e&&null!==e&&e.toString().toLowerCase()==t.toString().toLowerCase())},in:function(e,t){if(void 0===t||null===t||0===t.length)return!0;if(void 0===e||null===e)return!1;for(var n=0;n<t.length;n++)if(t[n]===e)return!0;return!1}},this.differ=n.find([]).create(null)}return e.prototype.ngOnInit=function(){this.lazy&&this.onLazyLoad.emit(this.createLazyLoadMetadata())},e.prototype.ngAfterContentInit=function(){var e=this;this.initColumns(),this.initColumnGroups(),this.columnsSubscription=this.cols.changes.subscribe(function(t){e.initColumns(),e.changeDetector.markForCheck()}),this.templates.forEach(function(t){switch(t.getType()){case"rowexpansion":e.rowExpansionTemplate=t.template;break;case"rowgroupheader":e.rowGroupHeaderTemplate=t.template;break;case"rowgroupfooter":e.rowGroupFooterTemplate=t.template;break;case"emptymessage":e.emptyMessageTemplate=t.template}})},e.prototype.ngAfterViewChecked=function(){if(this.columnsChanged&&this.el.nativeElement.offsetParent&&(this.resizableColumns&&this.initResizableColumns(),this.reorderableColumns&&this.initColumnReordering(),this.columnsChanged=!1),this.totalRecordsChanged&&this.virtualScroll&&this.virtualScrollableTableWrapper&&this.virtualScrollableTableWrapper.offsetParent){var e=this.domHandler.findSingle(this.virtualScrollableTableWrapper,"tr.ui-widget-content"),t=this.domHandler.getOuterHeight(e);this.virtualTableHeight=this._totalRecords*t,this.virtualScrollableTableWrapper.style.height=this.virtualTableHeight+"px",this.totalRecordsChanged=!1}},e.prototype.ngAfterViewInit=function(){var e=this;this.globalFilter&&(this.globalFilterFunction=this.renderer.listen(this.globalFilter,"keyup",function(){e.filterTimeout&&clearTimeout(e.filterTimeout),e.filterTimeout=setTimeout(function(){e._filter(),e.filterTimeout=null},e.filterDelay)})),this.virtualScrollableTableWrapper=this.domHandler.findSingle(this.el.nativeElement,"div.ui-datatable-scrollable-table-wrapper"),this.initialized=!0},Object.defineProperty(e.prototype,"multiSortMeta",{get:function(){return this._multiSortMeta},set:function(e){this._multiSortMeta=e,"multiple"===this.sortMode&&this.sortMultiple()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sortField",{get:function(){return this._sortField},set:function(e){this._sortField=e,"single"===this.sortMode&&this.sortSingle()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sortOrder",{get:function(){return this._sortOrder},set:function(e){this._sortOrder=e,"single"===this.sortMode&&this.sortSingle()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(e){this.immutable?(this._value=e?e.slice():null,this.handleDataChange()):this._value=e,this.valueChange.emit(this.value)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"first",{get:function(){return this._first},set:function(e){var t=this.initialized&&this._first!==e;this._first=e,t&&this.paginate()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"totalRecords",{get:function(){return this._totalRecords},set:function(e){this._totalRecords=e,this.totalRecordsChanged=!0},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selection",{get:function(){return this._selection},set:function(e){if(this._selection=e,this.dataKey&&!this.preventSelectionKeysPropagation&&(this.selectionKeys={},this._selection))if(Array.isArray(this._selection))for(var t=0,n=this._selection;t<n.length;t++){var r=n[t];this.selectionKeys[String(this.objectUtils.resolveFieldData(r,this.dataKey))]=1}else this.selectionKeys[String(this.objectUtils.resolveFieldData(this._selection,this.dataKey))]=1;this.preventSelectionKeysPropagation=!1},enumerable:!0,configurable:!0}),e.prototype.ngDoCheck=function(){this.immutable||this.differ.diff(this.value)&&this.handleDataChange()},e.prototype.handleDataChange=function(){var e=this;this.paginator&&this.updatePaginator(),this.virtualScroll&&this.virtualScrollCallback&&this.virtualScrollCallback(),this.lazy||(this.hasFilter()&&this._filter(),this.preventSortPropagation?this.preventSortPropagation=!1:(this.sortField||this.multiSortMeta)&&(!this.sortColumn&&this.columns&&(this.sortColumn=this.columns.find(function(t){return t.field===e.sortField&&"custom"===t.sortable})),"single"==this.sortMode?this.sortSingle():"multiple"==this.sortMode&&this.sortMultiple())),this.updateDataToRender(this.filteredValue||this.value)},e.prototype.initColumns=function(){this.columns=this.cols.toArray(),this.initScrollableColumns(),this.columnsChanged=!0},e.prototype.initScrollableColumns=function(){this.scrollableColumns=[],this.frozenColumns=[];for(var e=0,t=this.columns;e<t.length;e++){var n=t[e];n.frozen?this.frozenColumns.push(n):this.scrollableColumns.push(n)}},e.prototype.initColumnGroups=function(){for(var e=this.headerColumnGroups.toArray(),t=this.footerColumnGroups.toArray(),n=0,r=e;n<r.length;n++)(l=r[n]).frozen?this.frozenHeaderColumnGroup=l:this.scrollableHeaderColumnGroup=l;for(var i=0,o=t;i<o.length;i++){var l;(l=o[i]).frozen?this.frozenFooterColumnGroup=l:this.scrollableFooterColumnGroup=l}},e.prototype.resolveFieldData=function(e,t){return this.objectUtils.resolveFieldData(e,t)},e.prototype.updateRowGroupMetadata=function(){if(this.rowGroupMetadata={},this.dataToRender)for(var e=0;e<this.dataToRender.length;e++){var t=this.resolveFieldData(this.dataToRender[e],this.sortField);0==e?this.rowGroupMetadata[t]={index:0,size:1}:t===this.resolveFieldData(this.dataToRender[e-1],this.sortField)?this.rowGroupMetadata[t].size++:this.rowGroupMetadata[t]={index:e,size:1}}},e.prototype.updatePaginator=function(){if(this.updateTotalRecords(),this.totalRecords&&this.first>=this.totalRecords){var e=Math.ceil(this.totalRecords/this.rows);this._first=Math.max((e-1)*this.rows,0)}},e.prototype.updateTotalRecords=function(){this.totalRecords=this.lazy?this.totalRecords:this.value?this.value.length:0},e.prototype.onPageChange=function(e){this._first=e.first,this.firstChange.emit(this.first),this.rows=e.rows,this.paginate()},e.prototype.paginate=function(){this.lazy?this.onLazyLoad.emit(this.createLazyLoadMetadata()):this.updateDataToRender(this.filteredValue||this.value),this.onPage.emit({first:this.first,rows:this.rows})},e.prototype.updateDataToRender=function(e){if((this.paginator||this.virtualScroll)&&e){this.dataToRender=[];for(var t=this.lazy?0:this.first,n=this.virtualScroll?this.first+2*this.rows:t+this.rows,r=t;r<n&&!(r>=e.length);r++)this.dataToRender.push(e[r])}else this.dataToRender=e;this.rowGroupMode&&this.updateRowGroupMetadata()},e.prototype.onVirtualScroll=function(e){var t=this;this._first=(e.page-1)*this.rows,this.virtualScrollCallback=e.callback,this.zone.run(function(){t.virtualScrollTimer&&clearTimeout(t.virtualScrollTimer),t.virtualScrollTimer=setTimeout(function(){t.lazy?t.onLazyLoad.emit(t.createLazyLoadMetadata()):t.updateDataToRender(t.filteredValue||t.value)},t.virtualScrollDelay)})},e.prototype.onHeaderKeydown=function(e,t){13==e.keyCode&&(this.sort(e,t),e.preventDefault())},e.prototype.onHeaderMousedown=function(e,t){this.reorderableColumns&&("INPUT"!==e.target.nodeName?t.draggable=!0:"INPUT"===e.target.nodeName&&(t.draggable=!1))},e.prototype.sort=function(e,t){if(t.sortable){var n=e.target.nodeName;if("TH"==n&&this.domHandler.hasClass(e.target,"ui-sortable-column")||("SPAN"==n||"DIV"==n)&&!this.domHandler.hasClass(e.target,"ui-clickable")){this.immutable||(this.preventSortPropagation=!0);var r=t.sortField||t.field;this._sortOrder=this.sortField===r?-1*this.sortOrder:this.defaultSortOrder,this._sortField=r,this.sortColumn=t,"multiple"==this.sortMode&&(this.multiSortMeta&&(e.metaKey||e.ctrlKey)||(this._multiSortMeta=[]),this.addSortMeta({field:this.sortField,order:this.sortOrder})),this.lazy?(this._first=0,this.onLazyLoad.emit(this.createLazyLoadMetadata())):"multiple"==this.sortMode?this.sortMultiple():this.sortSingle(),this.onSort.emit({field:this.sortField,order:this.sortOrder,multisortmeta:this.multiSortMeta})}this.updateDataToRender(this.filteredValue||this.value)}},e.prototype.sortSingle=function(){var e=this;this.value&&(this.sortColumn&&"custom"===this.sortColumn.sortable?(this.preventSortPropagation=!0,this.sortColumn.sortFunction.emit({field:this.sortField,order:this.sortOrder})):this.value.sort(function(t,n){var r=e.resolveFieldData(t,e.sortField),i=e.resolveFieldData(n,e.sortField),o=null;return o=null==r&&null!=i?-1:null!=r&&null==i?1:null==r&&null==i?0:"string"==typeof r&&"string"==typeof i?r.localeCompare(i):r<i?-1:r>i?1:0,e.sortOrder*o}),this._first=0,this.hasFilter()&&this._filter())},e.prototype.sortMultiple=function(){var e=this;this.value&&(this.value.sort(function(t,n){return e.multisortField(t,n,e.multiSortMeta,0)}),this.hasFilter()&&this._filter())},e.prototype.multisortField=function(e,t,n,r){var i=this.resolveFieldData(e,n[r].field),o=this.resolveFieldData(t,n[r].field),l=null;if("string"==typeof i||i instanceof String){if(i.localeCompare&&i!=o)return n[r].order*i.localeCompare(o)}else l=i<o?-1:1;return i==o?n.length-1>r?this.multisortField(e,t,n,r+1):0:n[r].order*l},e.prototype.addSortMeta=function(e){for(var t=-1,n=0;n<this.multiSortMeta.length;n++)if(this.multiSortMeta[n].field===e.field){t=n;break}t>=0?this.multiSortMeta[t]=e:this.multiSortMeta.push(e)},e.prototype.isSorted=function(e){if(!e.sortable)return!1;var t=e.sortField||e.field;if("single"===this.sortMode)return this.sortField&&t===this.sortField;if("multiple"===this.sortMode){var n=!1;if(this.multiSortMeta)for(var r=0;r<this.multiSortMeta.length;r++)if(this.multiSortMeta[r].field==t){n=!0;break}return n}},e.prototype.getSortOrder=function(e){var t=0,n=e.sortField||e.field;if("single"===this.sortMode)this.sortField&&n===this.sortField&&(t=this.sortOrder);else if("multiple"===this.sortMode&&this.multiSortMeta)for(var r=0;r<this.multiSortMeta.length;r++)if(this.multiSortMeta[r].field==n){t=this.multiSortMeta[r].order;break}return t},e.prototype.onRowGroupClick=function(e){if(this.rowGroupToggleClick)this.rowGroupToggleClick=!1;else if(this.sortableRowGroup){var t=e.target.nodeName;("TD"==t||"SPAN"==t&&!this.domHandler.hasClass(e.target,"ui-clickable"))&&(this.sortField!=this.groupField?(this._sortField=this.groupField,this.sortSingle()):(this._sortOrder=-1*this.sortOrder,this.sortSingle()))}},e.prototype.clearSelectionRange=function(){var e,t;this.rangeRowIndex>this.anchorRowIndex?(e=this.anchorRowIndex,t=this.rangeRowIndex):this.rangeRowIndex<this.anchorRowIndex?(e=this.rangeRowIndex,t=this.anchorRowIndex):(e=this.rangeRowIndex,t=this.rangeRowIndex);for(var n=function(e){var t=r.dataToRender[e],n=r.findIndexInSelection(t);r._selection=r.selection.filter(function(e,t){return t!=n});var i=r.dataKey?String(r.resolveFieldData(t,r.dataKey)):null;i&&delete r.selectionKeys[i],r.onRowUnselect.emit({originalEvent:event,data:t,type:"row"})},r=this,i=e;i<=t;i++)n(i)},e.prototype.selectRange=function(e){var t,n;this.anchorRowIndex>e?(t=e,n=this.anchorRowIndex):this.anchorRowIndex<e?(t=this.anchorRowIndex,n=e):(t=e,n=e);for(var r=t;r<=n;r++){var i=this.dataToRender[r];this._selection=this.selection.concat([i]),this.selectionChange.emit(this.selection);var o=this.dataKey?String(this.resolveFieldData(i,this.dataKey)):null;o&&(this.selectionKeys[o]=1),this.onRowSelect.emit({originalEvent:event,data:i,type:"row"})}},e.prototype.handleRowClick=function(e,t,n){if(this.preventRowClickPropagation)this.preventRowClickPropagation=!1;else{var r=e.target.nodeName;if("INPUT"!=r&&"BUTTON"!=r&&"A"!=r&&!this.domHandler.hasClass(e.target,"ui-clickable")){if(this.onRowClick.next({originalEvent:e,data:t}),this.selectionMode){if(this.isMultipleSelectionMode()&&e.shiftKey&&null!=this.anchorRowIndex)this.domHandler.clearSelection(),null!=this.rangeRowIndex&&this.clearSelectionRange(),this.rangeRowIndex=n,this.selectRange(n);else{var i=this.isSelected(t),o=!this.rowTouched&&this.metaKeySelection,l=this.dataKey?String(this.resolveFieldData(t,this.dataKey)):null;if(this.anchorRowIndex=n,this.rangeRowIndex=n,o){var a=e.metaKey||e.ctrlKey;if(i&&a){if(this.isSingleSelectionMode())this._selection=null,this.selectionKeys={},this.selectionChange.emit(null);else{var s=this.findIndexInSelection(t);this._selection=this.selection.filter(function(e,t){return t!=s}),this.selectionChange.emit(this.selection),l&&delete this.selectionKeys[l]}this.onRowUnselect.emit({originalEvent:e,data:t,type:"row"})}else this.isSingleSelectionMode()?(this._selection=t,this.selectionChange.emit(t),l&&(this.selectionKeys={},this.selectionKeys[l]=1)):this.isMultipleSelectionMode()&&(a?this._selection=this.selection||[]:(this._selection=[],this.selectionKeys={}),this._selection=this.selection.concat([t]),this.selectionChange.emit(this.selection),l&&(this.selectionKeys[l]=1)),this.onRowSelect.emit({originalEvent:e,data:t,type:"row"})}else if(this.isSingleSelectionMode())i?(this._selection=null,this.selectionKeys={},this.onRowUnselect.emit({originalEvent:e,data:t,type:"row"})):(this._selection=t,this.onRowSelect.emit({originalEvent:e,data:t,type:"row"}),l&&(this.selectionKeys={},this.selectionKeys[l]=1));else if(i){var u=this.findIndexInSelection(t);this._selection=this.selection.filter(function(e,t){return t!=u}),this.selectionChange.emit(this.selection),this.onRowUnselect.emit({originalEvent:e,data:t,type:"row"}),l&&delete this.selectionKeys[l]}else this._selection=(this.selection||[]).concat([t]),this.selectionChange.emit(this.selection),this.onRowSelect.emit({originalEvent:e,data:t,type:"row"}),l&&(this.selectionKeys[l]=1)}this.preventSelectionKeysPropagation=!0}this.rowTouched=!1}}},e.prototype.handleRowTouchEnd=function(e){this.rowTouched=!0},e.prototype.selectRowWithRadio=function(e,t){this.selection!=t?(this._selection=t,this.selectionChange.emit(this.selection),this.onRowSelect.emit({originalEvent:e,data:t,type:"radiobutton"}),this.dataKey&&(this.selectionKeys={},this.selectionKeys[String(this.resolveFieldData(t,this.dataKey))]=1)):(this._selection=null,this.selectionChange.emit(this.selection),this.onRowUnselect.emit({originalEvent:e,data:t,type:"radiobutton"})),this.preventSelectionKeysPropagation=!0,this.preventRowClickPropagation=!0},e.prototype.toggleRowWithCheckbox=function(e,t){var n=this.findIndexInSelection(t);this.selection=this.selection||[];var r=this.dataKey?String(this.resolveFieldData(t,this.dataKey)):null;-1!=n?(this._selection=this.selection.filter(function(e,t){return t!=n}),this.selectionChange.emit(this.selection),this.onRowUnselect.emit({originalEvent:e,data:t,type:"checkbox"}),r&&delete this.selectionKeys[r]):(this._selection=this.selection.concat([t]),this.selectionChange.emit(this.selection),this.onRowSelect.emit({originalEvent:e,data:t,type:"checkbox"}),r&&(this.selectionKeys[r]=1)),this.preventSelectionKeysPropagation=!0,this.preventRowClickPropagation=!0},e.prototype.toggleRowsWithCheckbox=function(e){this.selection=e.checked?this.headerCheckboxToggleAllPages?this.value.slice():this.dataToRender.slice():[],this.selectionChange.emit(this.selection),this.onHeaderCheckboxToggle.emit({originalEvent:e,checked:e.checked})},e.prototype.onRowRightClick=function(e,t){if(this.contextMenu){var n=-1!=this.findIndexInSelection(t);this.dataKey&&String(this.resolveFieldData(t,this.dataKey)),n||(this.isSingleSelectionMode()?(this.selection=t,this.selectionChange.emit(t)):this.isMultipleSelectionMode()&&(this.selection=[t],this.selectionChange.emit(this.selection)),this.dataKey&&(this.selectionKeys[String(this.resolveFieldData(t,this.dataKey))]=1,this.preventSelectionKeysPropagation=!0)),this.contextMenu.show(e),this.onContextMenuSelect.emit({originalEvent:e,data:t})}},e.prototype.rowDblclick=function(e,t){this.onRowDblclick.emit({originalEvent:e,data:t})},e.prototype.isSingleSelectionMode=function(){return"single"===this.selectionMode},e.prototype.isMultipleSelectionMode=function(){return"multiple"===this.selectionMode},e.prototype.findIndexInSelection=function(e){var t=-1;if(this.selection)for(var n=0;n<this.selection.length;n++)if(this.equals(e,this.selection[n])){t=n;break}return t},e.prototype.isSelected=function(e){return!(!e||!this.selection)&&(this.dataKey?void 0!==this.selectionKeys[this.objectUtils.resolveFieldData(e,this.dataKey)]:this.selection instanceof Array?this.findIndexInSelection(e)>-1:this.equals(e,this.selection))},e.prototype.equals=function(e,t){return"equals"===this.compareSelectionBy?e===t:this.objectUtils.equals(e,t,this.dataKey)},Object.defineProperty(e.prototype,"allSelected",{get:function(){if(this.headerCheckboxToggleAllPages)return this.selection&&this.value&&this.selection.length===this.value.length;var e=!0;if(this.dataToRender&&this.selection&&this.dataToRender.length<=this.selection.length){for(var t=0,n=this.dataToRender;t<n.length;t++)if(!this.isSelected(n[t])){e=!1;break}}else e=!1;return e},enumerable:!0,configurable:!0}),e.prototype.onFilterKeyup=function(e,t,n){var r=this;this.filterTimeout&&clearTimeout(this.filterTimeout),this.filterTimeout=setTimeout(function(){r.filter(e,t,n),r.filterTimeout=null},this.filterDelay)},e.prototype.filter=function(e,t,n){this.isFilterBlank(e)?this.filters[t]&&delete this.filters[t]:this.filters[t]={value:e,matchMode:n},this._filter()},e.prototype.isFilterBlank=function(e){return null===e||void 0===e||"string"==typeof e&&0==e.trim().length||e instanceof Array&&0==e.length},e.prototype._filter=function(){if(this._first=0,this.lazy)this.onLazyLoad.emit(this.createLazyLoadMetadata());else{if(!this.value||!this.columns)return;this.filteredValue=[];for(var e=0;e<this.value.length;e++){for(var t=!0,n=!1,r=0;r<this.columns.length;r++){var i=this.columns[r],o=this.filters[i.filterField||i.field];if(o){var l=o.value,a=o.matchMode||"startsWith",s=this.resolveFieldData(this.value[e],i.filterField||i.field);if((0,this.filterConstraints[a])(s,l)||(t=!1),!t)break}i.excludeGlobalFilter||!this.globalFilter||n||(n=this.filterConstraints.contains(this.resolveFieldData(this.value[e],i.filterField||i.field),this.globalFilter.value))}var u=t;this.globalFilter&&(u=t&&n),u&&this.filteredValue.push(this.value[e])}this.filteredValue.length===this.value.length&&(this.filteredValue=null),this.paginator&&(this.totalRecords=this.filteredValue?this.filteredValue.length:this.value?this.value.length:0),this.updateDataToRender(this.filteredValue||this.value)}this.onFilter.emit({filters:this.filters,filteredValue:this.filteredValue||this.value})},e.prototype.hasFilter=function(){var e=!0;for(var t in this.filters)if(this.filters.hasOwnProperty(t)){e=!1;break}return!e||this.globalFilter&&this.globalFilter.value&&this.globalFilter.value.trim().length},e.prototype.onFilterInputClick=function(e){e.stopPropagation()},e.prototype.switchCellToEditMode=function(e,t,n){var r=this;if(!this.selectionMode&&this.editable&&t.editable&&(this.editorClick=!0,this.bindDocumentEditListener(),e!=this.editingCell)){this.editingCell&&0==this.domHandler.find(this.editingCell,".ng-invalid.ng-dirty").length&&this.domHandler.removeClass(this.editingCell,"ui-cell-editing"),this.editingCell=e,this.onEditInit.emit({column:t,data:n}),this.domHandler.addClass(e,"ui-cell-editing");var i=this.domHandler.findSingle(e,".ui-cell-editor input");i&&setTimeout(function(){return r.domHandler.invokeElementMethod(i,"focus")},50)}},e.prototype.switchCellToViewMode=function(e){this.editingCell=null;var t=this.findCell(e);this.domHandler.removeClass(t,"ui-cell-editing"),this.unbindDocumentEditListener()},e.prototype.closeCell=function(){this.editingCell&&(this.domHandler.removeClass(this.editingCell,"ui-cell-editing"),this.editingCell=null,this.unbindDocumentEditListener())},e.prototype.bindDocumentEditListener=function(){var e=this;this.documentEditListener||(this.documentEditListener=this.renderer.listen("document","click",function(t){e.editorClick||e.closeCell(),e.editorClick=!1}))},e.prototype.unbindDocumentEditListener=function(){this.documentEditListener&&(this.documentEditListener(),this.documentEditListener=null)},e.prototype.onCellEditorKeydown=function(e,t,n,r){this.editable&&(13==e.keyCode?0==this.domHandler.find(this.editingCell,".ng-invalid.ng-dirty").length&&(this.switchCellToViewMode(e.target),e.preventDefault()):27==e.keyCode?(this.switchCellToViewMode(e.target),e.preventDefault()):9==e.keyCode&&(e.shiftKey?this.moveToPreviousCell(e):this.moveToNextCell(e)))},e.prototype.onCellEditorInput=function(e,t,n,r){this.editable&&this.onEdit.emit({originalEvent:e,column:t,data:n,index:r})},e.prototype.onCellEditorChange=function(e,t,n,r){this.editable&&(this.editChanged=!0,this.onEditComplete.emit({column:t,data:n,index:r}))},e.prototype.onCellEditorBlur=function(e,t,n,r){this.editable&&(this.editChanged?this.editChanged=!1:this.onEditCancel.emit({column:t,data:n,index:r}))},e.prototype.moveToPreviousCell=function(e){var t=this.findCell(e.target),n=this.findPreviousEditableColumn(t);n&&(this.domHandler.invokeElementMethod(n,"click"),e.preventDefault())},e.prototype.moveToNextCell=function(e){var t=this.findCell(e.target),n=this.findNextEditableColumn(t);n&&(this.domHandler.invokeElementMethod(n,"click"),e.preventDefault())},e.prototype.findPreviousEditableColumn=function(e){var t=e.previousElementSibling;if(!t){var n=e.parentElement.previousElementSibling;n&&(t=n.lastElementChild)}return t?this.domHandler.hasClass(t,"ui-editable-column")?t:this.findPreviousEditableColumn(t):null},e.prototype.findNextEditableColumn=function(e){var t=e.nextElementSibling;if(!t){var n=e.parentElement.nextElementSibling;n&&(t=n.firstElementChild)}return t?this.domHandler.hasClass(t,"ui-editable-column")?t:this.findNextEditableColumn(t):null},e.prototype.onCustomEditorFocusPrev=function(e){this.moveToPreviousCell(e)},e.prototype.onCustomEditorFocusNext=function(e){this.moveToNextCell(e)},e.prototype.findCell=function(e){if(e){for(var t=e;t&&"TD"!=t.tagName;)t=t.parentElement;return t}return null},e.prototype.initResizableColumns=function(){this.tbody=this.domHandler.findSingle(this.el.nativeElement,"tbody.ui-datatable-data"),this.resizerHelper=this.domHandler.findSingle(this.el.nativeElement,"div.ui-column-resizer-helper"),this.fixColumnWidths()},e.prototype.onDocumentMouseMove=function(e){this.columnResizing&&this.onColumnResize(e)},e.prototype.onDocumentMouseUp=function(e){this.columnResizing&&(this.columnResizing=!1,this.onColumnResizeEnd(e))},e.prototype.bindColumnResizeEvents=function(){var e=this;this.zone.runOutsideAngular(function(){window.document.addEventListener("mousemove",e.onDocumentMouseMove.bind(e))}),this.documentColumnResizeEndListener=this.renderer.listen("document","mouseup",function(t){e.columnResizing&&(e.columnResizing=!1,e.onColumnResizeEnd(t))})},e.prototype.unbindColumnResizeEvents=function(){window.document.removeEventListener("mousemove",this.onDocumentMouseMove),this.documentColumnResizeEndListener&&(this.documentColumnResizeEndListener(),this.documentColumnResizeEndListener=null)},e.prototype.initColumnResize=function(e){this.bindColumnResizeEvents();var t=this.el.nativeElement.children[0],n=this.domHandler.getOffset(t).left;this.resizeColumn=e.target.parentElement,this.columnResizing=!0,this.lastResizerHelperX=e.pageX-n+t.scrollLeft},e.prototype.onColumnResize=function(e){var t=this.el.nativeElement.children[0],n=this.domHandler.getOffset(t).left;this.domHandler.addClass(t,"ui-unselectable-text"),this.resizerHelper.style.height=t.offsetHeight+"px",this.resizerHelper.style.top="0px",this.resizerHelper.style.left=e.pageX-n+t.scrollLeft+"px",this.resizerHelper.style.display="block"},e.prototype.onColumnResizeEnd=function(e){var t=this.resizerHelper.offsetLeft-this.lastResizerHelperX,n=this.resizeColumn.offsetWidth,r=n+t,i=this.resizeColumn.style.minWidth||15;if(n+t>parseInt(i)){if("fit"===this.columnResizeMode){var o=this.resizeColumn.nextElementSibling,l=o.offsetWidth-t;if(r>15&&l>15&&(this.resizeColumn.style.width=r+"px",o&&(o.style.width=l+"px"),this.scrollable)){var a=this.domHandler.findSingle(this.el.nativeElement,"colgroup.ui-datatable-scrollable-colgroup"),s=this.domHandler.index(this.resizeColumn);a.children[s].style.width=r+"px",o&&(a.children[s+1].style.width=l+"px")}}else if("expand"===this.columnResizeMode){this.tbody.parentElement.style.width=this.tbody.parentElement.offsetWidth+t+"px",this.resizeColumn.style.width=r+"px";var u=this.tbody.parentElement.style.width;this.scrollable?(this.domHandler.findSingle(this.el.nativeElement,".ui-datatable-scrollable-header-box").children[0].style.width=u,a=this.domHandler.findSingle(this.el.nativeElement,"colgroup.ui-datatable-scrollable-colgroup"),s=this.domHandler.index(this.resizeColumn),a.children[s].style.width=r+"px"):this.el.nativeElement.children[0].style.width=u}this.onColResize.emit({element:this.resizeColumn,delta:t})}this.resizerHelper.style.display="none",this.resizeColumn=null,this.domHandler.removeClass(this.el.nativeElement.children[0],"ui-unselectable-text"),this.unbindColumnResizeEvents()},e.prototype.fixColumnWidths=function(){for(var e,t=this.domHandler.find(this.el.nativeElement,"th.ui-resizable-column"),n=0;n<t.length;n++)t[n].style.width=t[n].offsetWidth+"px";if(this.scrollable&&(e=this.domHandler.findSingle(this.el.nativeElement,"colgroup.ui-datatable-scrollable-colgroup").children))for(n=0;n<t.length;n++)e[n].style.width=t[n].offsetWidth+"px"},e.prototype.onColumnDragStart=function(e){var t=this;this.columnResizing?e.preventDefault():(this.draggedColumn=this.findParentHeader(e.target),e.dataTransfer.setData("text","b"),this.zone.runOutsideAngular(function(){window.document.addEventListener("dragover",t.onColumnDragover.bind(t))}))},e.prototype.onColumnDragover=function(e){var t=this.findParentHeader(e.target);if(this.reorderableColumns&&this.draggedColumn&&t){e.preventDefault();var n=this.domHandler.getOffset(this.el.nativeElement.children[0]),r=this.domHandler.getOffset(t);if(this.draggedColumn!=t){var i=r.left-n.left,o=r.left+t.offsetWidth/2;this.reorderIndicatorUp.style.top=r.top-n.top-(this.iconHeight-1)+"px",this.reorderIndicatorDown.style.top=r.top-n.top+t.offsetHeight+"px",e.pageX>o?(this.reorderIndicatorUp.style.left=i+t.offsetWidth-Math.ceil(this.iconWidth/2)+"px",this.reorderIndicatorDown.style.left=i+t.offsetWidth-Math.ceil(this.iconWidth/2)+"px",this.dropPosition=1):(this.reorderIndicatorUp.style.left=i-Math.ceil(this.iconWidth/2)+"px",this.reorderIndicatorDown.style.left=i-Math.ceil(this.iconWidth/2)+"px",this.dropPosition=-1),this.reorderIndicatorUp.style.display="block",this.reorderIndicatorDown.style.display="block"}else e.dataTransfer.dropEffect="none"}},e.prototype.onColumnDragleave=function(e){this.reorderableColumns&&this.draggedColumn&&(e.preventDefault(),this.reorderIndicatorUp.style.display="none",this.reorderIndicatorDown.style.display="none",window.document.removeEventListener("dragover",this.onColumnDragover))},e.prototype.onColumnDrop=function(e){if(e.preventDefault(),this.draggedColumn){var t=this.domHandler.index(this.draggedColumn),n=this.domHandler.index(this.findParentHeader(e.target)),r=t!=n;r&&(n-t==1&&-1===this.dropPosition||t-n==1&&1===this.dropPosition)&&(r=!1),r&&(this.objectUtils.reorderArray(this.columns,t,n),this.scrollable&&this.initScrollableColumns(),this.onColReorder.emit({dragIndex:t,dropIndex:n,columns:this.columns})),this.reorderIndicatorUp.style.display="none",this.reorderIndicatorDown.style.display="none",this.draggedColumn.draggable=!1,this.draggedColumn=null,this.dropPosition=null}},e.prototype.initColumnReordering=function(){this.reorderIndicatorUp=this.domHandler.findSingle(this.el.nativeElement.children[0],"span.ui-datatable-reorder-indicator-up"),this.reorderIndicatorDown=this.domHandler.findSingle(this.el.nativeElement.children[0],"span.ui-datatable-reorder-indicator-down"),this.iconWidth=this.domHandler.getHiddenElementOuterWidth(this.reorderIndicatorUp),this.iconHeight=this.domHandler.getHiddenElementOuterHeight(this.reorderIndicatorUp)},e.prototype.findParentHeader=function(e){if("TH"==e.nodeName)return e;for(var t=e.parentElement;"TH"!=t.nodeName&&(t=t.parentElement););return t},e.prototype.hasFooter=function(){if(this.footerColumnGroups.first)return!0;if(this.columns)for(var e=0;e<this.columns.length;e++)if(this.columns[e].footer||this.columns[e].footerTemplate)return!0;return!1},e.prototype.isEmpty=function(){return!this.dataToRender||0==this.dataToRender.length},e.prototype.createLazyLoadMetadata=function(){return{first:this.first,rows:this.virtualScroll?2*this.rows:this.rows,sortField:this.sortField,sortOrder:this.sortOrder,filters:this.filters,globalFilter:this.globalFilter?this.globalFilter.value:null,multiSortMeta:this.multiSortMeta}},e.prototype.toggleRow=function(e,t){this.expandedRows||(this.expandedRows=[]);var n=this.findExpandedRowIndex(e);-1!=n?(this.expandedRows.splice(n,1),this.onRowCollapse.emit({originalEvent:t,data:e})):("single"===this.rowExpandMode&&(this.expandedRows=[]),this.expandedRows.push(e),this.onRowExpand.emit({originalEvent:t,data:e})),t&&t.preventDefault()},e.prototype.findExpandedRowIndex=function(e){var t=-1;if(this.expandedRows)for(var n=0;n<this.expandedRows.length;n++)if(this.expandedRows[n]==e){t=n;break}return t},e.prototype.isRowExpanded=function(e){return-1!=this.findExpandedRowIndex(e)},e.prototype.findExpandedRowGroupIndex=function(e){var t=-1;if(this.expandedRowsGroups&&this.expandedRowsGroups.length)for(var n=0;n<this.expandedRowsGroups.length;n++){var r=this.expandedRowsGroups[n];if(this.resolveFieldData(e,this.groupField)===r){t=n;break}}return t},e.prototype.isRowGroupExpanded=function(e){return-1!=this.findExpandedRowGroupIndex(e)},e.prototype.toggleRowGroup=function(e,t){this.expandedRowsGroups||(this.expandedRowsGroups=[]),this.rowGroupToggleClick=!0;var n=this.findExpandedRowGroupIndex(t),r=this.resolveFieldData(t,this.groupField);n>=0?(this.expandedRowsGroups.splice(n,1),this.onRowGroupCollapse.emit({originalEvent:e,group:r})):("single"===this.rowGroupExpandMode&&(this.expandedRowsGroups=[]),this.expandedRowsGroups.push(r),this.onRowGroupExpand.emit({originalEvent:e,group:r})),e.preventDefault()},e.prototype.reset=function(){this._sortField=null,this._sortOrder=1,this.filteredValue=null,this.filters={},this._first=0,this.firstChange.emit(this._first),this.updateTotalRecords(),this.lazy?this.onLazyLoad.emit(this.createLazyLoadMetadata()):this.updateDataToRender(this.value)},e.prototype.exportCSV=function(e){var t=this,n=this.filteredValue||this.value,r="\ufeff";e&&e.selectionOnly&&(n=this.selection||[]);for(var i=0;i<this.columns.length;i++){var o=this.columns[i];o.exportable&&o.field&&(r+='"'+(o.header||o.field)+'"',i<this.columns.length-1&&(r+=this.csvSeparator))}n.forEach(function(e,n){r+="\n";for(var i=0;i<t.columns.length;i++){var o=t.columns[i];o.exportable&&o.field&&(r+='"'+t.resolveFieldData(e,o.field)+'"',i<t.columns.length-1&&(r+=t.csvSeparator))}});var l=new Blob([r],{type:"text/csv;charset=utf-8;"});if(window.navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(l,this.exportFilename+".csv");else{var a=document.createElement("a");a.style.display="none",document.body.appendChild(a),void 0!==a.download?(a.setAttribute("href",URL.createObjectURL(l)),a.setAttribute("download",this.exportFilename+".csv"),a.click()):(r="data:text/csv;charset=utf-8,"+r,window.open(encodeURI(r))),document.body.removeChild(a)}},e.prototype.getBlockableElement=function(){return this.el.nativeElement.children[0]},e.prototype.getRowStyleClass=function(e,t){var n="ui-widget-content";if(this.rowStyleClass)(r=this.rowStyleClass.call(this,e,t))&&(n+=" "+r);else if(this.rowStyleMap&&this.dataKey){var r;(r=this.rowStyleMap[e[this.dataKey]])&&(n+=" "+r)}return n},e.prototype.visibleColumns=function(){return this.columns?this.columns.filter(function(e){return!e.hidden}):[]},Object.defineProperty(e.prototype,"containerWidth",{get:function(){return this.scrollable?this.scrollWidth?this.scrollWidth:this.frozenWidth&&this.unfrozenWidth?parseFloat(this.frozenWidth)+parseFloat(this.unfrozenWidth)+"px":void 0:this.style?this.style.width:null},enumerable:!0,configurable:!0}),e.prototype.hasFrozenColumns=function(){return this.frozenColumns&&this.frozenColumns.length>0},e.prototype.ngOnDestroy=function(){this.globalFilterFunction&&this.globalFilterFunction(),this.resizableColumns&&this.unbindColumnResizeEvents(),this.unbindDocumentEditListener(),this.columnsSubscription&&this.columnsSubscription.unsubscribe(),this.virtualScrollCallback&&(this.virtualScrollCallback=null)},e}();r([l.Input(),i("design:type",Boolean)],w.prototype,"paginator",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"rows",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"pageLinks",void 0),r([l.Input(),i("design:type",Array)],w.prototype,"rowsPerPageOptions",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"responsive",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"stacked",void 0),r([l.Input(),i("design:type",String)],w.prototype,"selectionMode",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"selectionChange",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"editable",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"showHeaderCheckbox",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowClick",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowSelect",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowUnselect",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowDblclick",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onHeaderCheckboxToggle",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"headerCheckboxToggleAllPages",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onContextMenuSelect",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"filterDelay",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"lazy",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onLazyLoad",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"resizableColumns",void 0),r([l.Input(),i("design:type",String)],w.prototype,"columnResizeMode",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onColResize",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"reorderableColumns",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onColReorder",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"scrollable",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"virtualScroll",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"scrollHeight",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"scrollWidth",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"frozenWidth",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"unfrozenWidth",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"style",void 0),r([l.Input(),i("design:type",String)],w.prototype,"styleClass",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"tableStyle",void 0),r([l.Input(),i("design:type",String)],w.prototype,"tableStyleClass",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"globalFilter",void 0),r([l.Input(),i("design:type",String)],w.prototype,"sortMode",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"defaultSortOrder",void 0),r([l.Input(),i("design:type",String)],w.prototype,"groupField",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"contextMenu",void 0),r([l.Input(),i("design:type",String)],w.prototype,"csvSeparator",void 0),r([l.Input(),i("design:type",String)],w.prototype,"exportFilename",void 0),r([l.Input(),i("design:type",String)],w.prototype,"emptyMessage",void 0),r([l.Input(),i("design:type",String)],w.prototype,"paginatorPosition",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"alwaysShowPaginator",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"metaKeySelection",void 0),r([l.Input(),i("design:type",Function)],w.prototype,"rowTrackBy",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"immutable",void 0),r([l.Input(),i("design:type",Array)],w.prototype,"frozenValue",void 0),r([l.Input(),i("design:type",String)],w.prototype,"compareSelectionBy",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onEditInit",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onEditComplete",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onEdit",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onEditCancel",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onPage",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onSort",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onFilter",void 0),r([l.ContentChild(d.Header),i("design:type",Object)],w.prototype,"header",void 0),r([l.ContentChild(d.Footer),i("design:type",Object)],w.prototype,"footer",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"expandableRows",void 0),r([l.Input(),i("design:type",Array)],w.prototype,"expandedRows",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"expandableRowGroups",void 0),r([l.Input(),i("design:type",String)],w.prototype,"rowExpandMode",void 0),r([l.Input(),i("design:type",Array)],w.prototype,"expandedRowsGroups",void 0),r([l.Input(),i("design:type",String)],w.prototype,"expandedIcon",void 0),r([l.Input(),i("design:type",String)],w.prototype,"collapsedIcon",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"tabindex",void 0),r([l.Input(),i("design:type",Function)],w.prototype,"rowStyleClass",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"rowStyleMap",void 0),r([l.Input(),i("design:type",String)],w.prototype,"rowGroupMode",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"sortableRowGroup",void 0),r([l.Input(),i("design:type",String)],w.prototype,"sortFile",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"rowHover",void 0),r([l.Input(),i("design:type",Object)],w.prototype,"filters",void 0),r([l.Input(),i("design:type",String)],w.prototype,"dataKey",void 0),r([l.Input(),i("design:type",Boolean)],w.prototype,"loading",void 0),r([l.Input(),i("design:type",String)],w.prototype,"loadingIcon",void 0),r([l.Input(),i("design:type",Number)],w.prototype,"virtualScrollDelay",void 0),r([l.Input(),i("design:type",String)],w.prototype,"rowGroupExpandMode",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"valueChange",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"firstChange",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowExpand",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowCollapse",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowGroupExpand",void 0),r([l.Output(),i("design:type",l.EventEmitter)],w.prototype,"onRowGroupCollapse",void 0),r([l.ContentChildren(d.PrimeTemplate),i("design:type",l.QueryList)],w.prototype,"templates",void 0),r([l.ContentChildren(d.Column),i("design:type",l.QueryList)],w.prototype,"cols",void 0),r([l.ContentChildren(d.HeaderColumnGroup),i("design:type",l.QueryList)],w.prototype,"headerColumnGroups",void 0),r([l.ContentChildren(d.FooterColumnGroup),i("design:type",l.QueryList)],w.prototype,"footerColumnGroups",void 0),r([l.Input(),i("design:type",Array),i("design:paramtypes",[Array])],w.prototype,"multiSortMeta",null),r([l.Input(),i("design:type",String),i("design:paramtypes",[String])],w.prototype,"sortField",null),r([l.Input(),i("design:type",Number),i("design:paramtypes",[Number])],w.prototype,"sortOrder",null),r([l.Input(),i("design:type",Array),i("design:paramtypes",[Array])],w.prototype,"value",null),r([l.Input(),i("design:type",Number),i("design:paramtypes",[Number])],w.prototype,"first",null),r([l.Input(),i("design:type",Number),i("design:paramtypes",[Number])],w.prototype,"totalRecords",null),r([l.Input(),i("design:type",Object),i("design:paramtypes",[Object])],w.prototype,"selection",null),w=r([l.Component({selector:"p-dataTable",template:'\n        <div [ngStyle]="style" [class]="styleClass" [style.width]="containerWidth"\n            [ngClass]="{\'ui-datatable ui-widget\':true,\'ui-datatable-reflow\':responsive,\'ui-datatable-stacked\':stacked,\'ui-datatable-resizable\':resizableColumns,\'ui-datatable-scrollable\':scrollable}">\n            <div class="ui-datatable-loading ui-widget-overlay" *ngIf="loading"></div>\n            <div class="ui-datatable-loading-content" *ngIf="loading">\n                <i [class]="\'fa fa-spin fa-2x \' + loadingIcon"></i>\n            </div>\n            <div class="ui-datatable-header ui-widget-header" *ngIf="header">\n                <ng-content select="p-header"></ng-content>\n            </div>\n            <p-paginator [rows]="rows" [first]="first" [totalRecords]="totalRecords" [pageLinkSize]="pageLinks" styleClass="ui-paginator-top" [alwaysShow]="alwaysShowPaginator"\n                (onPageChange)="onPageChange($event)" [rowsPerPageOptions]="rowsPerPageOptions" *ngIf="paginator && (paginatorPosition === \'top\' || paginatorPosition ==\'both\')"></p-paginator>\n            <div class="ui-datatable-tablewrapper" *ngIf="!scrollable">\n                <table [ngClass]="tableStyleClass" [ngStyle]="tableStyle">\n                    <thead class="ui-datatable-thead">\n                        <tr *ngIf="!headerColumnGroups.first" class="ui-state-default" [pColumnHeaders]="columns"></tr>\n                        <ng-template [ngIf]="headerColumnGroups.first">\n                            <tr *ngFor="let headerRow of headerColumnGroups.first.rows" class="ui-state-default" [pColumnHeaders]="headerRow.columns"></tr>\n                        </ng-template>\n                    </thead>\n                    <tfoot *ngIf="hasFooter()" class="ui-datatable-tfoot">\n                        <tr *ngIf="!footerColumnGroups.first" class="ui-state-default" [pColumnFooters]="columns"></tr>\n                        <ng-template [ngIf]="footerColumnGroups.first">\n                            <tr *ngFor="let footerRow of footerColumnGroups.first.rows" class="ui-state-default" [pColumnFooters]="footerRow.columns"></tr>\n                        </ng-template>\n                    </tfoot>\n                    <tbody [ngClass]="{\'ui-datatable-data ui-widget-content\': true, \'ui-datatable-hoverable-rows\': (rowHover||selectionMode)}" [pTableBody]="columns" [data]="dataToRender"></tbody>\n                </table>\n            </div>\n            \n            <ng-template [ngIf]="scrollable">\n                <div class="ui-datatable-scrollable-wrapper ui-helper-clearfix">\n                    <div *ngIf="hasFrozenColumns()" [pScrollableView]="frozenColumns" frozen="true"\n                        [headerColumnGroup]="frozenHeaderColumnGroup" [footerColumnGroup]="frozenFooterColumnGroup"\n                        [ngStyle]="{\'width\':this.frozenWidth}" class="ui-datatable-scrollable-view ui-datatable-frozen-view"></div>\n                    <div [pScrollableView]="scrollableColumns" [ngStyle]="{\'width\':this.unfrozenWidth, \'left\': this.frozenWidth}"\n                        [headerColumnGroup]="scrollableHeaderColumnGroup" [footerColumnGroup]="scrollableFooterColumnGroup"\n                        class="ui-datatable-scrollable-view" [virtualScroll]="virtualScroll" (onVirtualScroll)="onVirtualScroll($event)"\n                        [ngClass]="{\'ui-datatable-unfrozen-view\': hasFrozenColumns()}"></div>\n                </div>\n            </ng-template>\n            \n            <p-paginator [rows]="rows" [first]="first" [totalRecords]="totalRecords" [pageLinkSize]="pageLinks" styleClass="ui-paginator-bottom" [alwaysShow]="alwaysShowPaginator"\n                (onPageChange)="onPageChange($event)" [rowsPerPageOptions]="rowsPerPageOptions" *ngIf="paginator && (paginatorPosition === \'bottom\' || paginatorPosition ==\'both\')"></p-paginator>\n            <div class="ui-datatable-footer ui-widget-header" *ngIf="footer">\n                <ng-content select="p-footer"></ng-content>\n            </div>\n            \n            <div class="ui-column-resizer-helper ui-state-highlight" style="display:none"></div>\n            <span class="fa fa-arrow-down ui-datatable-reorder-indicator-up" style="position: absolute; display: none;"></span>\n            <span class="fa fa-arrow-up ui-datatable-reorder-indicator-down" style="position: absolute; display: none;"></span>\n        </div>\n    ',providers:[p.DomHandler,f.ObjectUtils]})],w),t.DataTable=w;var x=function(){};x=r([l.NgModule({imports:[a.CommonModule,u.SharedModule,c.PaginatorModule,s.FormsModule],exports:[w,u.SharedModule],declarations:[w,h,m,y,v,b,_,g]})],x),t.DataTableModule=x},pa70:function(e,t,n){var r=n("uNkO");e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},piOq:function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},ptrv:function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},qLnt:function(e,t,n){"use strict";function r(e){return e.reduce(function(e,t){return e.concat(t instanceof c?t.errors:t)},[])}var i=n("1j/l"),o=n("NGRF"),l=n("B1iP"),a=n("8ofh"),s=n("NePw"),u=n("6Xbx"),c=function(e){function t(t){e.call(this),this.errors=t;var n=Error.call(this,t?t.length+" errors occurred during unsubscription:\n  "+t.map(function(e,t){return t+1+") "+e.toString()}).join("\n  "):"");this.name=n.name="UnsubscriptionError",this.stack=n.stack,this.message=n.message}return Object(u.__extends)(t,e),t}(Error);n.d(t,"a",function(){return d});var d=function(){function e(e){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,e&&(this._unsubscribe=e)}return e.prototype.unsubscribe=function(){var e,t=!1;if(!this.closed){var n=this._parent,u=this._parents,d=this._unsubscribe,p=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var f=-1,h=u?u.length:0;n;)n.remove(this),n=++f<h&&u[f]||null;if(Object(l.a)(d)&&Object(a.a)(d).call(this)===s.a&&(t=!0,e=e||(s.a.e instanceof c?r(s.a.e.errors):[s.a.e])),Object(i.a)(p))for(f=-1,h=p.length;++f<h;){var m=p[f];if(Object(o.a)(m)&&Object(a.a)(m.unsubscribe).call(m)===s.a){t=!0,e=e||[];var g=s.a.e;g instanceof c?e=e.concat(r(g.errors)):e.push(g)}}if(t)throw new c(e)}},e.prototype.add=function(t){if(!t||t===e.EMPTY)return e.EMPTY;if(t===this)return this;var n=t;switch(typeof t){case"function":n=new e(t);case"object":if(n.closed||"function"!=typeof n.unsubscribe)return n;if(this.closed)return n.unsubscribe(),n;if("function"!=typeof n._addParent){var r=n;(n=new e)._subscriptions=[r]}break;default:throw new Error("unrecognized teardown "+t+" added to Subscription.")}return(this._subscriptions||(this._subscriptions=[])).push(n),n._addParent(this),n},e.prototype.remove=function(e){var t=this._subscriptions;if(t){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}},e.prototype._addParent=function(e){var t=this._parent,n=this._parents;t&&t!==e?n?-1===n.indexOf(e)&&n.push(e):this._parents=[e]:this._parent=e},e.EMPTY=function(e){return e.closed=!0,e}(new e),e}()},qgI0:function(e,t,n){"use strict";var r=n("xIGM"),i=n("kQVV"),o=n("mHG6"),l=n("NGRF"),a=n("AP4T"),s=n("X3fp"),u=n("6Xbx"),c=function(e){function t(t,n,r){e.call(this),this.parent=t,this.outerValue=n,this.outerIndex=r,this.index=0}return Object(u.__extends)(t,e),t.prototype._next=function(e){this.parent.notifyNext(this.outerValue,e,this.outerIndex,this.index++,this)},t.prototype._error=function(e){this.parent.notifyError(e,this),this.unsubscribe()},t.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},t}(n("E9/g").a),d=n("mz3w");t.a=function(e,t,n,u){var p=new c(e,n,u);if(p.closed)return null;if(t instanceof a.a)return t._isScalar?(p.next(t.value),p.complete(),null):(p.syncErrorThrowable=!0,t.subscribe(p));if(Object(i.a)(t)){for(var f=0,h=t.length;f<h&&!p.closed;f++)p.next(t[f]);p.closed||p.complete()}else{if(Object(o.a)(t))return t.then(function(e){p.closed||(p.next(e),p.complete())},function(e){return p.error(e)}).then(null,function(e){r.a.setTimeout(function(){throw e})}),p;if(t&&"function"==typeof t[s.a])for(var m=t[s.a]();;){var g=m.next();if(g.done){p.complete();break}if(p.next(g.value),p.closed)break}else if(t&&"function"==typeof t[d.a]){var y=t[d.a]();if("function"==typeof y.subscribe)return y.subscribe(new c(e,n,u));p.error(new TypeError("Provided object does not correctly implement Symbol.observable"))}else{var v="You provided "+(Object(l.a)(t)?"an invalid object":"'"+t+"'")+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.";p.error(new TypeError(v))}}return null}},qqDE:function(e,t,n){"use strict";t.a=function(e,t){return function(n){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new o(e,t))}};var r=n("6Xbx"),i=n("E9/g"),o=function(){function e(e,t){this.project=e,this.thisArg=t}return e.prototype.call=function(e,t){return t.subscribe(new l(e,this.project,this.thisArg))},e}(),l=function(e){function t(t,n,r){e.call(this,t),this.project=n,this.count=0,this.thisArg=r||this}return Object(r.__extends)(t,e),t.prototype._next=function(e){var t;try{t=this.project.call(this.thisArg,e,this.count++)}catch(e){return void this.destination.error(e)}this.destination.next(t)},t}(i.a)},rIdM:function(e,t,n){"use strict";var r=n("2Fuj"),i=n("lzDK"),o=n("9e9+"),l=n("RT4T"),a=n("Wo2w"),s=Object.assign;e.exports=!s||n("umMR")(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=s({},e)[n]||Object.keys(s({},t)).join("")!=r})?function(e,t){for(var n=l(e),s=arguments.length,u=1,c=i.f,d=o.f;s>u;)for(var p,f=a(arguments[u++]),h=c?r(f).concat(c(f)):r(f),m=h.length,g=0;m>g;)d.call(f,p=h[g++])&&(n[p]=f[p]);return n}:s},rKhO:function(e,t,n){var r=n("VceJ");e.exports=Array.isArray||function(e){return"Array"==r(e)}},rMsi:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},rgUS:function(e,t,n){var r;!function(i,o,l,a){"use strict";function s(e,t,n){return setTimeout(f(e,n),t)}function u(e,t,n){return!!Array.isArray(e)&&(c(e,n[t],n),!0)}function c(e,t,n){var r;if(e)if(e.forEach)e.forEach(t,n);else if(e.length!==a)for(r=0;r<e.length;)t.call(n,e[r],r,e),r++;else for(r in e)e.hasOwnProperty(r)&&t.call(n,e[r],r,e)}function d(e,t,n){var r="DEPRECATED METHOD: "+t+"\n"+n+" AT \n";return function(){var t=new Error("get-stack-trace"),n=t&&t.stack?t.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=i.console&&(i.console.warn||i.console.log);return o&&o.call(i.console,r,n),e.apply(this,arguments)}}function p(e,t,n){var r,i=t.prototype;(r=e.prototype=Object.create(i)).constructor=e,r._super=i,n&&te(r,n)}function f(e,t){return function(){return e.apply(t,arguments)}}function h(e,t){return typeof e==ie?e.apply(t?t[0]||a:a,t):e}function m(e,t){return e===a?t:e}function g(e,t,n){c(_(t),function(t){e.addEventListener(t,n,!1)})}function y(e,t,n){c(_(t),function(t){e.removeEventListener(t,n,!1)})}function v(e,t){for(;e;){if(e==t)return!0;e=e.parentNode}return!1}function b(e,t){return e.indexOf(t)>-1}function _(e){return e.trim().split(/\s+/g)}function w(e,t,n){if(e.indexOf&&!n)return e.indexOf(t);for(var r=0;r<e.length;){if(n&&e[r][n]==t||!n&&e[r]===t)return r;r++}return-1}function x(e){return Array.prototype.slice.call(e,0)}function C(e,t,n){for(var r=[],i=[],o=0;o<e.length;){var l=t?e[o][t]:e[o];w(i,l)<0&&r.push(e[o]),i[o]=l,o++}return n&&(r=t?r.sort(function(e,n){return e[t]>n[t]}):r.sort()),r}function E(e,t){for(var n,r,i=t[0].toUpperCase()+t.slice(1),o=0;o<ne.length;){if(n=ne[o],(r=n?n+i:t)in e)return r;o++}return a}function S(e){var t=e.ownerDocument||e;return t.defaultView||t.parentWindow||i}function O(e,t){var n=this;this.manager=e,this.callback=t,this.element=e.element,this.target=e.options.inputTarget,this.domHandler=function(t){h(e.options.enable,[e])&&n.handler(t)},this.init()}function T(e,t,n){var r=n.pointers.length,i=n.changedPointers.length,o=t&me&&r-i==0,l=t&(ge|ye)&&r-i==0;n.isFirst=!!o,n.isFinal=!!l,o&&(e.session={}),n.eventType=t,function(e,t){var n=e.session,r=t.pointers,i=r.length;n.firstInput||(n.firstInput=k(t)),i>1&&!n.firstMultiple?n.firstMultiple=k(t):1===i&&(n.firstMultiple=!1);var o=n.firstInput,l=n.firstMultiple,s=l?l.center:o.center,u=t.center=D(r);t.timeStamp=ae(),t.deltaTime=t.timeStamp-o.timeStamp,t.angle=P(s,u),t.distance=M(s,u),function(e,t){var n=t.center,r=e.offsetDelta||{},i=e.prevDelta||{},o=e.prevInput||{};t.eventType!==me&&o.eventType!==ge||(i=e.prevDelta={x:o.deltaX||0,y:o.deltaY||0},r=e.offsetDelta={x:n.x,y:n.y}),t.deltaX=i.x+(n.x-r.x),t.deltaY=i.y+(n.y-r.y)}(n,t),t.offsetDirection=R(t.deltaX,t.deltaY);var c=I(t.deltaTime,t.deltaX,t.deltaY);t.overallVelocityX=c.x,t.overallVelocityY=c.y,t.overallVelocity=le(c.x)>le(c.y)?c.x:c.y,t.scale=l?function(e,t){return M(r[0],r[1],Te)/M(e[0],e[1],Te)}(l.pointers):1,t.rotation=l?function(e,t){return P(r[1],r[0],Te)+P(e[1],e[0],Te)}(l.pointers):0,t.maxPointers=n.prevInput?t.pointers.length>n.prevInput.maxPointers?t.pointers.length:n.prevInput.maxPointers:t.pointers.length,function(e,t){var n,r,i,o,l=e.lastInterval||t,s=t.timeStamp-l.timeStamp;if(t.eventType!=ye&&(s>he||l.velocity===a)){var u=t.deltaX-l.deltaX,c=t.deltaY-l.deltaY,d=I(s,u,c);r=d.x,i=d.y,n=le(d.x)>le(d.y)?d.x:d.y,o=R(u,c),e.lastInterval=t}else n=l.velocity,r=l.velocityX,i=l.velocityY,o=l.direction;t.velocity=n,t.velocityX=r,t.velocityY=i,t.direction=o}(n,t);var d=e.element;v(t.srcEvent.target,d)&&(d=t.srcEvent.target),t.target=d}(e,n),e.emit("hammer.input",n),e.recognize(n),e.session.prevInput=n}function k(e){for(var t=[],n=0;n<e.pointers.length;)t[n]={clientX:oe(e.pointers[n].clientX),clientY:oe(e.pointers[n].clientY)},n++;return{timeStamp:ae(),pointers:t,center:D(t),deltaX:e.deltaX,deltaY:e.deltaY}}function D(e){var t=e.length;if(1===t)return{x:oe(e[0].clientX),y:oe(e[0].clientY)};for(var n=0,r=0,i=0;i<t;)n+=e[i].clientX,r+=e[i].clientY,i++;return{x:oe(n/t),y:oe(r/t)}}function I(e,t,n){return{x:t/e||0,y:n/e||0}}function R(e,t){return e===t?ve:le(e)>=le(t)?e<0?be:_e:t<0?we:xe}function M(e,t,n){n||(n=Oe);var r=t[n[0]]-e[n[0]],i=t[n[1]]-e[n[1]];return Math.sqrt(r*r+i*i)}function P(e,t,n){n||(n=Oe);var r=t[n[0]]-e[n[0]],i=t[n[1]]-e[n[1]];return 180*Math.atan2(i,r)/Math.PI}function N(){this.evEl=De,this.evWin=Ie,this.pressed=!1,O.apply(this,arguments)}function A(){this.evEl=Pe,this.evWin=Ne,O.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function L(){this.evTarget=Le,this.evWin=Fe,this.started=!1,O.apply(this,arguments)}function F(){this.evTarget=Ve,this.targetIds={},O.apply(this,arguments)}function j(){O.apply(this,arguments);var e=f(this.handler,this);this.touch=new F(this.manager,e),this.mouse=new N(this.manager,e),this.primaryTouch=null,this.lastTouches=[]}function V(e){var t=e.changedPointers[0];if(t.identifier===this.primaryTouch){var n={x:t.clientX,y:t.clientY};this.lastTouches.push(n);var r=this.lastTouches,i=function(){var e=r.indexOf(n);e>-1&&r.splice(e,1)};setTimeout(i,ze)}}function z(e,t){this.manager=e,this.set(t)}function B(e){this.options=te({},this.defaults,e||{}),this.id=ce++,this.manager=null,this.options.enable=m(this.options.enable,!0),this.state=Ue,this.simultaneous={},this.requireFail=[]}function H(e){return e&Qe?"cancel":e&$e?"end":e&Ke?"move":e&Ge?"start":""}function W(e){return e==xe?"down":e==we?"up":e==be?"left":e==_e?"right":""}function q(e,t){var n=t.manager;return n?n.get(e):e}function U(){B.apply(this,arguments)}function G(){U.apply(this,arguments),this.pX=null,this.pY=null}function K(){U.apply(this,arguments)}function $(){B.apply(this,arguments),this._timer=null,this._input=null}function Z(){U.apply(this,arguments)}function Q(){U.apply(this,arguments)}function Y(){B.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function X(e,t){return t=t||{},t.recognizers=m(t.recognizers,X.defaults.preset),new J(e,t)}function J(e,t){this.options=te({},X.defaults,t||{}),this.options.inputTarget=this.options.inputTarget||e,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=e,this.input=function(e){return new(e.options.inputClass||(pe?A:fe?F:de?j:N))(e,T)}(this),this.touchAction=new z(this,this.options.touchAction),ee(this,!0),c(this.options.recognizers,function(e){var t=this.add(new e[0](e[1]));e[2]&&t.recognizeWith(e[2]),e[3]&&t.requireFailure(e[3])},this)}function ee(e,t){var n=e.element;if(n.style){var r;c(e.options.cssProps,function(i,o){r=E(n.style,o),t?(e.oldCssProps[r]=n.style[r],n.style[r]=i):n.style[r]=e.oldCssProps[r]||""}),t||(e.oldCssProps={})}}var te,ne=["","webkit","Moz","MS","ms","o"],re=o.createElement("div"),ie="function",oe=Math.round,le=Math.abs,ae=Date.now;te="function"!=typeof Object.assign?function(e){if(e===a||null===e)throw new TypeError("Cannot convert undefined or null to object");for(var t=Object(e),n=1;n<arguments.length;n++){var r=arguments[n];if(r!==a&&null!==r)for(var i in r)r.hasOwnProperty(i)&&(t[i]=r[i])}return t}:Object.assign;var se=d(function(e,t,n){for(var r=Object.keys(t),i=0;i<r.length;)(!n||n&&e[r[i]]===a)&&(e[r[i]]=t[r[i]]),i++;return e},"extend","Use `assign`."),ue=d(function(e,t){return se(e,t,!0)},"merge","Use `assign`."),ce=1,de="ontouchstart"in i,pe=E(i,"PointerEvent")!==a,fe=de&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),he=25,me=1,ge=4,ye=8,ve=1,be=2,_e=4,we=8,xe=16,Ce=be|_e,Ee=we|xe,Se=Ce|Ee,Oe=["x","y"],Te=["clientX","clientY"];O.prototype={handler:function(){},init:function(){this.evEl&&g(this.element,this.evEl,this.domHandler),this.evTarget&&g(this.target,this.evTarget,this.domHandler),this.evWin&&g(S(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&y(this.element,this.evEl,this.domHandler),this.evTarget&&y(this.target,this.evTarget,this.domHandler),this.evWin&&y(S(this.element),this.evWin,this.domHandler)}};var ke={mousedown:me,mousemove:2,mouseup:ge},De="mousedown",Ie="mousemove mouseup";p(N,O,{handler:function(e){var t=ke[e.type];t&me&&0===e.button&&(this.pressed=!0),2&t&&1!==e.which&&(t=ge),this.pressed&&(t&ge&&(this.pressed=!1),this.callback(this.manager,t,{pointers:[e],changedPointers:[e],pointerType:"mouse",srcEvent:e}))}});var Re={pointerdown:me,pointermove:2,pointerup:ge,pointercancel:ye,pointerout:ye},Me={2:"touch",3:"pen",4:"mouse",5:"kinect"},Pe="pointerdown",Ne="pointermove pointerup pointercancel";i.MSPointerEvent&&!i.PointerEvent&&(Pe="MSPointerDown",Ne="MSPointerMove MSPointerUp MSPointerCancel"),p(A,O,{handler:function(e){var t=this.store,n=!1,r=e.type.toLowerCase().replace("ms",""),i=Re[r],o=Me[e.pointerType]||e.pointerType,l="touch"==o,a=w(t,e.pointerId,"pointerId");i&me&&(0===e.button||l)?a<0&&(t.push(e),a=t.length-1):i&(ge|ye)&&(n=!0),a<0||(t[a]=e,this.callback(this.manager,i,{pointers:t,changedPointers:[e],pointerType:o,srcEvent:e}),n&&t.splice(a,1))}});var Ae={touchstart:me,touchmove:2,touchend:ge,touchcancel:ye},Le="touchstart",Fe="touchstart touchmove touchend touchcancel";p(L,O,{handler:function(e){var t=Ae[e.type];if(t===me&&(this.started=!0),this.started){var n=function(e,t){var n=x(e.touches),r=x(e.changedTouches);return t&(ge|ye)&&(n=C(n.concat(r),"identifier",!0)),[n,r]}.call(this,e,t);t&(ge|ye)&&n[0].length-n[1].length==0&&(this.started=!1),this.callback(this.manager,t,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:e})}}});var je={touchstart:me,touchmove:2,touchend:ge,touchcancel:ye},Ve="touchstart touchmove touchend touchcancel";p(F,O,{handler:function(e){var t=je[e.type],n=function(e,t){var n=x(e.touches),r=this.targetIds;if(t&(2|me)&&1===n.length)return r[n[0].identifier]=!0,[n,n];var i,o,l=x(e.changedTouches),a=[],s=this.target;if(o=n.filter(function(e){return v(e.target,s)}),t===me)for(i=0;i<o.length;)r[o[i].identifier]=!0,i++;for(i=0;i<l.length;)r[l[i].identifier]&&a.push(l[i]),t&(ge|ye)&&delete r[l[i].identifier],i++;return a.length?[C(o.concat(a),"identifier",!0),a]:void 0}.call(this,e,t);n&&this.callback(this.manager,t,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:e})}});var ze=2500;p(j,O,{handler:function(e,t,n){var r="mouse"==n.pointerType;if(!(r&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if("touch"==n.pointerType)(function(e,t){e&me?(this.primaryTouch=t.changedPointers[0].identifier,V.call(this,t)):e&(ge|ye)&&V.call(this,t)}).call(this,t,n);else if(r&&function(e){for(var t=e.srcEvent.clientX,n=e.srcEvent.clientY,r=0;r<this.lastTouches.length;r++){var i=this.lastTouches[r],o=Math.abs(t-i.x),l=Math.abs(n-i.y);if(o<=25&&l<=25)return!0}return!1}.call(this,n))return;this.callback(e,t,n)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var Be=E(re.style,"touchAction"),He=Be!==a,We="manipulation",qe=function(){if(!He)return!1;var e={},t=i.CSS&&i.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(n){e[n]=!t||i.CSS.supports("touch-action",n)}),e}();z.prototype={set:function(e){"compute"==e&&(e=this.compute()),He&&this.manager.element.style&&qe[e]&&(this.manager.element.style[Be]=e),this.actions=e.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var e=[];return c(this.manager.recognizers,function(t){h(t.options.enable,[t])&&(e=e.concat(t.getTouchAction()))}),function(e){if(b(e,"none"))return"none";var t=b(e,"pan-x"),n=b(e,"pan-y");return t&&n?"none":t||n?t?"pan-x":"pan-y":b(e,We)?We:"auto"}(e.join(" "))},preventDefaults:function(e){var t=e.srcEvent,n=e.offsetDirection;if(this.manager.session.prevented)t.preventDefault();else{var r=this.actions,i=b(r,"none")&&!qe.none,o=b(r,"pan-y")&&!qe["pan-y"],l=b(r,"pan-x")&&!qe["pan-x"];if(i&&1===e.pointers.length&&e.distance<2&&e.deltaTime<250)return;if(!l||!o)return i||o&&n&Ce||l&&n&Ee?this.preventSrc(t):void 0}},preventSrc:function(e){this.manager.session.prevented=!0,e.preventDefault()}};var Ue=1,Ge=2,Ke=4,$e=8,Ze=$e,Qe=16;B.prototype={defaults:{},set:function(e){return te(this.options,e),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(e){if(u(e,"recognizeWith",this))return this;var t=this.simultaneous;return e=q(e,this),t[e.id]||(t[e.id]=e,e.recognizeWith(this)),this},dropRecognizeWith:function(e){return u(e,"dropRecognizeWith",this)?this:(e=q(e,this),delete this.simultaneous[e.id],this)},requireFailure:function(e){if(u(e,"requireFailure",this))return this;var t=this.requireFail;return e=q(e,this),-1===w(t,e)&&(t.push(e),e.requireFailure(this)),this},dropRequireFailure:function(e){if(u(e,"dropRequireFailure",this))return this;e=q(e,this);var t=w(this.requireFail,e);return t>-1&&this.requireFail.splice(t,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(e){return!!this.simultaneous[e.id]},emit:function(e){function t(t){n.manager.emit(t,e)}var n=this,r=this.state;r<$e&&t(n.options.event+H(r)),t(n.options.event),e.additionalEvent&&t(e.additionalEvent),r>=$e&&t(n.options.event+H(r))},tryEmit:function(e){if(this.canEmit())return this.emit(e);this.state=32},canEmit:function(){for(var e=0;e<this.requireFail.length;){if(!(this.requireFail[e].state&(32|Ue)))return!1;e++}return!0},recognize:function(e){var t=te({},e);if(!h(this.options.enable,[this,t]))return this.reset(),void(this.state=32);this.state&(Ze|Qe|32)&&(this.state=Ue),this.state=this.process(t),this.state&(Ge|Ke|$e|Qe)&&this.tryEmit(t)},process:function(e){},getTouchAction:function(){},reset:function(){}},p(U,B,{defaults:{pointers:1},attrTest:function(e){var t=this.options.pointers;return 0===t||e.pointers.length===t},process:function(e){var t=this.state,n=e.eventType,r=t&(Ge|Ke),i=this.attrTest(e);return r&&(n&ye||!i)?t|Qe:r||i?n&ge?t|$e:t&Ge?t|Ke:Ge:32}}),p(G,U,{defaults:{event:"pan",threshold:10,pointers:1,direction:Se},getTouchAction:function(){var e=this.options.direction,t=[];return e&Ce&&t.push("pan-y"),e&Ee&&t.push("pan-x"),t},directionTest:function(e){var t=this.options,n=!0,r=e.distance,i=e.direction,o=e.deltaX,l=e.deltaY;return i&t.direction||(t.direction&Ce?(i=0===o?ve:o<0?be:_e,n=o!=this.pX,r=Math.abs(e.deltaX)):(i=0===l?ve:l<0?we:xe,n=l!=this.pY,r=Math.abs(e.deltaY))),e.direction=i,n&&r>t.threshold&&i&t.direction},attrTest:function(e){return U.prototype.attrTest.call(this,e)&&(this.state&Ge||!(this.state&Ge)&&this.directionTest(e))},emit:function(e){this.pX=e.deltaX,this.pY=e.deltaY;var t=W(e.direction);t&&(e.additionalEvent=this.options.event+t),this._super.emit.call(this,e)}}),p(K,U,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.scale-1)>this.options.threshold||this.state&Ge)},emit:function(e){1!==e.scale&&(e.additionalEvent=this.options.event+(e.scale<1?"in":"out")),this._super.emit.call(this,e)}}),p($,B,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,r=e.distance<t.threshold,i=e.deltaTime>t.time;if(this._input=e,!r||!n||e.eventType&(ge|ye)&&!i)this.reset();else if(e.eventType&me)this.reset(),this._timer=s(function(){this.state=Ze,this.tryEmit()},t.time,this);else if(e.eventType&ge)return Ze;return 32},reset:function(){clearTimeout(this._timer)},emit:function(e){this.state===Ze&&(e&&e.eventType&ge?this.manager.emit(this.options.event+"up",e):(this._input.timeStamp=ae(),this.manager.emit(this.options.event,this._input)))}}),p(Z,U,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(e){return this._super.attrTest.call(this,e)&&(Math.abs(e.rotation)>this.options.threshold||this.state&Ge)}}),p(Q,U,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ce|Ee,pointers:1},getTouchAction:function(){return G.prototype.getTouchAction.call(this)},attrTest:function(e){var t,n=this.options.direction;return n&(Ce|Ee)?t=e.overallVelocity:n&Ce?t=e.overallVelocityX:n&Ee&&(t=e.overallVelocityY),this._super.attrTest.call(this,e)&&n&e.offsetDirection&&e.distance>this.options.threshold&&e.maxPointers==this.options.pointers&&le(t)>this.options.velocity&&e.eventType&ge},emit:function(e){var t=W(e.offsetDirection);t&&this.manager.emit(this.options.event+t,e),this.manager.emit(this.options.event,e)}}),p(Y,B,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[We]},process:function(e){var t=this.options,n=e.pointers.length===t.pointers,r=e.distance<t.threshold,i=e.deltaTime<t.time;if(this.reset(),e.eventType&me&&0===this.count)return this.failTimeout();if(r&&i&&n){if(e.eventType!=ge)return this.failTimeout();var o=!this.pTime||e.timeStamp-this.pTime<t.interval,l=!this.pCenter||M(this.pCenter,e.center)<t.posThreshold;if(this.pTime=e.timeStamp,this.pCenter=e.center,l&&o?this.count+=1:this.count=1,this._input=e,0==this.count%t.taps)return this.hasRequireFailures()?(this._timer=s(function(){this.state=Ze,this.tryEmit()},t.interval,this),Ge):Ze}return 32},failTimeout:function(){return this._timer=s(function(){this.state=32},this.options.interval,this),32},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==Ze&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),X.VERSION="2.0.7",X.defaults={domEvents:!1,touchAction:"compute",enable:!0,inputTarget:null,inputClass:null,preset:[[Z,{enable:!1}],[K,{enable:!1},["rotate"]],[Q,{direction:Ce}],[G,{direction:Ce},["swipe"]],[Y],[Y,{event:"doubletap",taps:2},["tap"]],[$]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},J.prototype={set:function(e){return te(this.options,e),e.touchAction&&this.touchAction.update(),e.inputTarget&&(this.input.destroy(),this.input.target=e.inputTarget,this.input.init()),this},stop:function(e){this.session.stopped=e?2:1},recognize:function(e){var t=this.session;if(!t.stopped){this.touchAction.preventDefaults(e);var n,r=this.recognizers,i=t.curRecognizer;(!i||i&&i.state&Ze)&&(i=t.curRecognizer=null);for(var o=0;o<r.length;)n=r[o],2===t.stopped||i&&n!=i&&!n.canRecognizeWith(i)?n.reset():n.recognize(e),!i&&n.state&(Ge|Ke|$e)&&(i=t.curRecognizer=n),o++}},get:function(e){if(e instanceof B)return e;for(var t=this.recognizers,n=0;n<t.length;n++)if(t[n].options.event==e)return t[n];return null},add:function(e){if(u(e,"add",this))return this;var t=this.get(e.options.event);return t&&this.remove(t),this.recognizers.push(e),e.manager=this,this.touchAction.update(),e},remove:function(e){if(u(e,"remove",this))return this;if(e=this.get(e)){var t=this.recognizers,n=w(t,e);-1!==n&&(t.splice(n,1),this.touchAction.update())}return this},on:function(e,t){if(e!==a&&t!==a){var n=this.handlers;return c(_(e),function(e){n[e]=n[e]||[],n[e].push(t)}),this}},off:function(e,t){if(e!==a){var n=this.handlers;return c(_(e),function(e){t?n[e]&&n[e].splice(w(n[e],t),1):delete n[e]}),this}},emit:function(e,t){this.options.domEvents&&function(e,t){var n=o.createEvent("Event");n.initEvent(e,!0,!0),n.gesture=t,t.target.dispatchEvent(n)}(e,t);var n=this.handlers[e]&&this.handlers[e].slice();if(n&&n.length){t.type=e,t.preventDefault=function(){t.srcEvent.preventDefault()};for(var r=0;r<n.length;)n[r](t),r++}},destroy:function(){this.element&&ee(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},te(X,{INPUT_START:me,INPUT_MOVE:2,INPUT_END:ge,INPUT_CANCEL:ye,STATE_POSSIBLE:Ue,STATE_BEGAN:Ge,STATE_CHANGED:Ke,STATE_ENDED:$e,STATE_RECOGNIZED:Ze,STATE_CANCELLED:Qe,STATE_FAILED:32,DIRECTION_NONE:ve,DIRECTION_LEFT:be,DIRECTION_RIGHT:_e,DIRECTION_UP:we,DIRECTION_DOWN:xe,DIRECTION_HORIZONTAL:Ce,DIRECTION_VERTICAL:Ee,DIRECTION_ALL:Se,Manager:J,Input:O,TouchAction:z,TouchInput:F,MouseInput:N,PointerEventInput:A,TouchMouseInput:j,SingleTouchInput:L,Recognizer:B,AttrRecognizer:U,Tap:Y,Pan:G,Swipe:Q,Pinch:K,Rotate:Z,Press:$,on:g,off:y,each:c,merge:ue,extend:se,assign:te,inherit:p,bindFn:f,prefixed:E}),(void 0!==i?i:"undefined"!=typeof self?self:{}).Hammer=X,(r=function(){return X}.call(t,n,t,e))===a||(e.exports=r)}(window,document)},rppw:function(e,t,n){var r=n("9wYb"),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},soMw:function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=r.keys,l=r.key;r.exp({getOwnMetadataKeys:function(e){return o(i(e),arguments.length<2?void 0:l(arguments[1]))}})},t6ta:function(e,t,n){var r=n("gBtn"),i=n("+pQw"),o=n("uNkO"),l=r.key,a=r.set;r.exp({metadata:function(e,t){return function(n,r){a(e,t,(void 0!==r?i:o)(n),l(r))}}})},tose:function(e,t,n){var r=n("+pQw"),i=n("gNkH"),o=n("A1WY"),l=Object.defineProperty;t.f=n("V+0c")?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},uIf7:function(module,__webpack_exports__,__webpack_require__){"use strict";function difference(e,t){return e.filter(function(e){return t.indexOf(e)<0})}function unliftState(e){return e.computedStates[e.currentStateIndex].state}function liftAction(e){return new PerformAction(e)}function applyOperators(e,t){return t.reduce(function(e,t){var n=t[0],r=t.slice(1);return n.apply(e,r)},e)}function computeNextEntry(e,t,n,r){if(r)return{state:n,error:"Interrupted by an error up the chain"};var i,o=n;try{o=e(n,t)}catch(e){i=e.toString(),console.error(e.stack||e)}return{state:o,error:i}}function recomputeStates(e,t,n,r,i,o,l){if(t>=e.length&&e.length===o.length)return e;for(var a=e.slice(0,t),s=t;s<o.length;s++){var u=o[s],c=i[u].action,d=a[s-1],p=d?d.state:r,f=d?d.error:void 0,h=l.indexOf(u)>-1?d:computeNextEntry(n,c,p,f);a.push(h)}return a}function liftInitialState(e,t){return{monitorState:t(void 0,{}),nextActionId:1,actionsById:{0:liftAction(INIT_ACTION)},stagedActionIds:[0],skippedActionIds:[],committedState:e,currentStateIndex:0,computedStates:[]}}function liftReducerWith(e,t,n,r){return void 0===r&&(r={}),function(i){return function(o,l){function a(e){for(var t=e,n=p.slice(1,t+1),r=0;r<n.length;r++){if(g[r+1].error){n=p.slice(1,(t=r)+1);break}delete c[n[r]]}f=f.filter(function(e){return-1===n.indexOf(e)}),p=[0].concat(p.slice(t+1)),h=g[t].state,g=g.slice(t),m=m>t?m-t:0}var s=o||t,u=s.monitorState,c=s.actionsById,d=s.nextActionId,p=s.stagedActionIds,f=s.skippedActionIds,h=s.committedState,m=s.currentStateIndex,g=s.computedStates;o||(c=Object.create(c));var y=0;switch(l.type){case RESET:c={0:liftAction(INIT_ACTION)},d=1,p=[0],f=[],h=e,m=0,g=[];break;case COMMIT:c={0:liftAction(INIT_ACTION)},d=1,p=[0],f=[],h=g[m].state,m=0,g=[];break;case ROLLBACK:c={0:liftAction(INIT_ACTION)},d=1,p=[0],f=[],m=0,g=[];break;case TOGGLE_ACTION:var v=l.id,b=f.indexOf(v);f=-1===b?[v].concat(f):f.filter(function(e){return e!==v}),y=p.indexOf(v);break;case SET_ACTIONS_ACTIVE:for(var _=l.start,w=l.end,x=l.active,C=[],E=_;E<w;E++)C.push(E);f=x?difference(f,C):f.concat(C),y=p.indexOf(_);break;case JUMP_TO_STATE:m=l.index,y=1/0;break;case SWEEP:p=difference(p,f),f=[],m=Math.min(m,p.length-1);break;case PERFORM_ACTION:r.maxAge&&p.length===r.maxAge&&a(1),m===p.length-1&&m++;var S=d++;c[S]=l,y=(p=p.concat([S])).length-1;break;case IMPORT_STATE:u=(O=l.nextLiftedState).monitorState,c=O.actionsById,d=O.nextActionId,p=O.stagedActionIds,f=O.skippedActionIds,h=O.committedState,m=O.currentStateIndex,g=O.computedStates;break;case __WEBPACK_IMPORTED_MODULE_1__ngrx_store__.p:case __WEBPACK_IMPORTED_MODULE_1__ngrx_store__.b:y=0,r.maxAge&&p.length>r.maxAge&&(g=recomputeStates(g,y,i,h,c,p,f),a(p.length-r.maxAge),y=1/0);break;default:y=1/0}return g=recomputeStates(g,y,i,h,c,p,f),u=n(u,l),{monitorState:u,actionsById:c,nextActionId:d,stagedActionIds:p,skippedActionIds:f,committedState:h,currentStateIndex:m,computedStates:g};var O}}}function createIsExtensionOrMonitorPresent(e,t){return Boolean(e)||t.monitor!==noMonitor}function createReduxDevtoolsExtension(){var e="__REDUX_DEVTOOLS_EXTENSION__";return"object"==typeof window&&void 0!==window[e]?window[e]:null}function createStateObservable(e){return e.state}function noMonitor(){return null}function createConfig(e){var t={maxAge:!1,monitor:noMonitor},n="function"==typeof e?e():e,r=Object.assign({},t,n);if(r.maxAge&&r.maxAge<2)throw new Error("Devtools 'maxAge' cannot be less than 2, got "+r.maxAge);return r}__webpack_require__.d(__webpack_exports__,"b",function(){return StoreDevtoolsModule}),__webpack_require__.d(__webpack_exports__,"a",function(){return StoreDevtools}),__webpack_require__.d(__webpack_exports__,"j",function(){return INITIAL_OPTIONS}),__webpack_require__.d(__webpack_exports__,"i",function(){return STORE_DEVTOOLS_CONFIG}),__webpack_require__.d(__webpack_exports__,"h",function(){return DevtoolsDispatcher}),__webpack_require__.d(__webpack_exports__,"l",function(){return DevtoolsExtension}),__webpack_require__.d(__webpack_exports__,"k",function(){return REDUX_DEVTOOLS_EXTENSION}),__webpack_require__.d(__webpack_exports__,"c",function(){return IS_EXTENSION_OR_MONITOR_PRESENT}),__webpack_require__.d(__webpack_exports__,"g",function(){return createConfig}),__webpack_require__.d(__webpack_exports__,"d",function(){return createIsExtensionOrMonitorPresent}),__webpack_require__.d(__webpack_exports__,"e",function(){return createReduxDevtoolsExtension}),__webpack_require__.d(__webpack_exports__,"f",function(){return createStateObservable});var __WEBPACK_IMPORTED_MODULE_0__angular_core__=__webpack_require__("LMZF"),__WEBPACK_IMPORTED_MODULE_1__ngrx_store__=__webpack_require__("ADVA"),__WEBPACK_IMPORTED_MODULE_2_rxjs_ReplaySubject__=__webpack_require__("5q5V"),__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__=__webpack_require__("dmC+"),__WEBPACK_IMPORTED_MODULE_4_rxjs_operator_merge__=__webpack_require__("BThc"),__WEBPACK_IMPORTED_MODULE_5_rxjs_operator_observeOn__=__webpack_require__("ozyc"),__WEBPACK_IMPORTED_MODULE_6_rxjs_operator_scan__=__webpack_require__("3k/+"),__WEBPACK_IMPORTED_MODULE_7_rxjs_operator_skip__=__webpack_require__("0l2a"),__WEBPACK_IMPORTED_MODULE_8_rxjs_operator_withLatestFrom__=__webpack_require__("ThPn"),__WEBPACK_IMPORTED_MODULE_9_rxjs_scheduler_queue__=__webpack_require__("Gcw1"),__WEBPACK_IMPORTED_MODULE_10_rxjs_Observable__=__webpack_require__("AP4T"),__WEBPACK_IMPORTED_MODULE_11_rxjs_observable_empty__=__webpack_require__("3m71"),__WEBPACK_IMPORTED_MODULE_12_rxjs_operator_filter__=__webpack_require__("6S6c"),__WEBPACK_IMPORTED_MODULE_13_rxjs_operator_share__=__webpack_require__("URbD"),__WEBPACK_IMPORTED_MODULE_14_rxjs_operator_switchMap__=__webpack_require__("GpNi"),__WEBPACK_IMPORTED_MODULE_15_rxjs_operator_takeUntil__=__webpack_require__("gy58"),__extends=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])};return function(t,n){function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),PERFORM_ACTION="PERFORM_ACTION",RESET="RESET",ROLLBACK="ROLLBACK",COMMIT="COMMIT",SWEEP="SWEEP",TOGGLE_ACTION="TOGGLE_ACTION",SET_ACTIONS_ACTIVE="SET_ACTIONS_ACTIVE",JUMP_TO_STATE="JUMP_TO_STATE",IMPORT_STATE="IMPORT_STATE",PerformAction=function(){return function(e,t){if(this.action=e,this.timestamp=t,this.type=PERFORM_ACTION,void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?')}}(),Reset=function(){return function(e){this.timestamp=e,this.type=RESET}}(),Rollback=function(){return function(e){this.timestamp=e,this.type=ROLLBACK}}(),Commit=function(){return function(e){this.timestamp=e,this.type=COMMIT}}(),Sweep=function(){return function(){this.type=SWEEP}}(),ToggleAction=function(){return function(e){this.id=e,this.type=TOGGLE_ACTION}}(),JumpToState=function(){return function(e){this.index=e,this.type=JUMP_TO_STATE}}(),ImportState=function(){return function(e){this.nextLiftedState=e,this.type=IMPORT_STATE}}(),ExtensionActionTypes={START:"START",DISPATCH:"DISPATCH",STOP:"STOP",ACTION:"ACTION"},REDUX_DEVTOOLS_EXTENSION=new __WEBPACK_IMPORTED_MODULE_0__angular_core__.InjectionToken("Redux Devtools Extension"),DevtoolsExtension=function(){function DevtoolsExtension(e){this.instanceId="ngrx-store-"+Date.now(),this.devtoolsExtension=e,this.createActionStreams()}return DevtoolsExtension.prototype.notify=function(e,t){this.devtoolsExtension&&this.devtoolsExtension.send(null,t,{serialize:!1},this.instanceId)},DevtoolsExtension.prototype.createChangesObservable=function(){var e=this;return this.devtoolsExtension?new __WEBPACK_IMPORTED_MODULE_10_rxjs_Observable__.a(function(t){var n=e.devtoolsExtension.connect({instanceId:e.instanceId});return n.subscribe(function(e){return t.next(e)}),n.unsubscribe}):Object(__WEBPACK_IMPORTED_MODULE_11_rxjs_observable_empty__.a)()},DevtoolsExtension.prototype.createActionStreams=function(){var e=this,t=__WEBPACK_IMPORTED_MODULE_13_rxjs_operator_share__.a.call(this.createChangesObservable()),n=__WEBPACK_IMPORTED_MODULE_12_rxjs_operator_filter__.a.call(t,function(e){return e.type===ExtensionActionTypes.START}),r=__WEBPACK_IMPORTED_MODULE_12_rxjs_operator_filter__.a.call(t,function(e){return e.type===ExtensionActionTypes.STOP}),i=applyOperators(t,[[__WEBPACK_IMPORTED_MODULE_12_rxjs_operator_filter__.a,function(e){return e.type===ExtensionActionTypes.DISPATCH}],[__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__.a,function(t){return e.unwrapAction(t.payload)}]]),o=applyOperators(t,[[__WEBPACK_IMPORTED_MODULE_12_rxjs_operator_filter__.a,function(e){return e.type===ExtensionActionTypes.ACTION}],[__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__.a,function(t){return e.unwrapAction(t.payload)}]]),l=__WEBPACK_IMPORTED_MODULE_15_rxjs_operator_takeUntil__.a.call(o,r),a=__WEBPACK_IMPORTED_MODULE_15_rxjs_operator_takeUntil__.a.call(i,r);this.actions$=__WEBPACK_IMPORTED_MODULE_14_rxjs_operator_switchMap__.a.call(n,function(){return l}),this.liftedActions$=__WEBPACK_IMPORTED_MODULE_14_rxjs_operator_switchMap__.a.call(n,function(){return a})},DevtoolsExtension.prototype.unwrapAction=function(action){return"string"==typeof action?eval("("+action+")"):action},DevtoolsExtension}(),INIT_ACTION={type:__WEBPACK_IMPORTED_MODULE_1__ngrx_store__.b},StoreDevtoolsConfig=function(){},STORE_DEVTOOLS_CONFIG=new __WEBPACK_IMPORTED_MODULE_0__angular_core__.InjectionToken("@ngrx/devtools Options"),INITIAL_OPTIONS=new __WEBPACK_IMPORTED_MODULE_0__angular_core__.InjectionToken("@ngrx/devtools Initial Config"),DevtoolsDispatcher=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return __extends(t,e),t}(__WEBPACK_IMPORTED_MODULE_1__ngrx_store__.a),StoreDevtools=function(){function e(e,t,n,r,i,o,l){var a=liftInitialState(o,l.monitor),s=liftReducerWith(o,a,l.monitor,l.maxAge?{maxAge:l.maxAge}:{}),u=applyOperators(t.asObservable(),[[__WEBPACK_IMPORTED_MODULE_7_rxjs_operator_skip__.a,1],[__WEBPACK_IMPORTED_MODULE_4_rxjs_operator_merge__.a,r.actions$],[__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__.a,liftAction],[__WEBPACK_IMPORTED_MODULE_4_rxjs_operator_merge__.a,e,r.liftedActions$],[__WEBPACK_IMPORTED_MODULE_5_rxjs_operator_observeOn__.a,__WEBPACK_IMPORTED_MODULE_9_rxjs_scheduler_queue__.a]]),c=__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__.a.call(n,s),d=new __WEBPACK_IMPORTED_MODULE_2_rxjs_ReplaySubject__.a(1),p=applyOperators(u,[[__WEBPACK_IMPORTED_MODULE_8_rxjs_operator_withLatestFrom__.a,c],[__WEBPACK_IMPORTED_MODULE_6_rxjs_operator_scan__.a,function(e,t){var n=t[0],i=(0,t[1])(e.state,n);return r.notify(n,i),{state:i,action:n}},{state:a,action:null}]]).subscribe(function(e){var t=e.action;d.next(e.state),t.type===PERFORM_ACTION&&i.next(t.action)}),f=d.asObservable(),h=__WEBPACK_IMPORTED_MODULE_3_rxjs_operator_map__.a.call(f,unliftState);this.stateSubscription=p,this.dispatcher=e,this.liftedState=f,this.state=h}return e.prototype.dispatch=function(e){this.dispatcher.next(e)},e.prototype.next=function(e){this.dispatcher.next(e)},e.prototype.error=function(e){},e.prototype.complete=function(){},e.prototype.performAction=function(e){this.dispatch(new PerformAction(e))},e.prototype.reset=function(){this.dispatch(new Reset)},e.prototype.rollback=function(){this.dispatch(new Rollback)},e.prototype.commit=function(){this.dispatch(new Commit)},e.prototype.sweep=function(){this.dispatch(new Sweep)},e.prototype.toggleAction=function(e){this.dispatch(new ToggleAction(e))},e.prototype.jumpToState=function(e){this.dispatch(new JumpToState(e))},e.prototype.importState=function(e){this.dispatch(new ImportState(e))},e}(),IS_EXTENSION_OR_MONITOR_PRESENT=new __WEBPACK_IMPORTED_MODULE_0__angular_core__.InjectionToken("Is Devtools Extension or Monitor Present"),StoreDevtoolsModule=function(){function e(){}return e.instrument=function(t){return void 0===t&&(t={}),{ngModule:e,providers:[DevtoolsExtension,DevtoolsDispatcher,StoreDevtools,{provide:INITIAL_OPTIONS,useValue:t},{provide:IS_EXTENSION_OR_MONITOR_PRESENT,deps:[REDUX_DEVTOOLS_EXTENSION,STORE_DEVTOOLS_CONFIG],useFactory:createIsExtensionOrMonitorPresent},{provide:REDUX_DEVTOOLS_EXTENSION,useFactory:createReduxDevtoolsExtension},{provide:STORE_DEVTOOLS_CONFIG,deps:[INITIAL_OPTIONS],useFactory:createConfig},{provide:__WEBPACK_IMPORTED_MODULE_1__ngrx_store__.l,deps:[StoreDevtools],useFactory:createStateObservable},{provide:__WEBPACK_IMPORTED_MODULE_1__ngrx_store__.h,useExisting:DevtoolsDispatcher}]}},e}()},uNkO:function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},umMR:function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},vyV2:function(e,t,n){var r=n("+GRi"),i=n("rppw"),o=n("KM3d");e.exports=function(e){return function(t,n,l){var a,s=r(t),u=i(s.length),c=o(l,u);if(e&&n!=n){for(;u>c;)if((a=s[c++])!=a)return!0}else for(;u>c;c++)if((e||c in s)&&s[c]===n)return e||c||0;return!e&&-1}}},"w/BM":function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},wP3s:function(e,t,n){"use strict";t.a=function(e,t,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof t&&(n=t,t=null),r.lift(new l(e,t,n))}};var r=n("6Xbx"),i=n("qgI0"),o=n("lI6h"),l=function(){function e(e,t,n){void 0===n&&(n=Number.POSITIVE_INFINITY),this.project=e,this.resultSelector=t,this.concurrent=n}return e.prototype.call=function(e,t){return t.subscribe(new a(e,this.project,this.resultSelector,this.concurrent))},e}(),a=function(e){function t(t,n,r,i){void 0===i&&(i=Number.POSITIVE_INFINITY),e.call(this,t),this.project=n,this.resultSelector=r,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(r.__extends)(t,e),t.prototype._next=function(e){this.active<this.concurrent?this._tryNext(e):this.buffer.push(e)},t.prototype._tryNext=function(e){var t,n=this.index++;try{t=this.project(e,n)}catch(e){return void this.destination.error(e)}this.active++,this._innerSub(t,e,n)},t.prototype._innerSub=function(e,t,n){this.add(Object(i.a)(this,e,t,n))},t.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete()},t.prototype.notifyNext=function(e,t,n,r,i){this.resultSelector?this._notifyResultSelector(e,t,n,r):this.destination.next(t)},t.prototype._notifyResultSelector=function(e,t,n,r){var i;try{i=this.resultSelector(e,t,n,r)}catch(e){return void this.destination.error(e)}this.destination.next(i)},t.prototype.notifyComplete=function(e){var t=this.buffer;this.remove(e),this.active--,t.length>0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},t}(o.a)},wRXj:function(e,t,n){"use strict";var r=n("6Xbx").__decorate,i=n("6Xbx").__metadata;Object.defineProperty(t,"__esModule",{value:!0});var o=n("LMZF"),l=n("fAeS"),a=n("Un6q"),s=n("/zAi"),u=n("4cOY"),c=n("P0cP"),d=n("0nO6");t.DROPDOWN_VALUE_ACCESSOR={provide:d.NG_VALUE_ACCESSOR,useExisting:o.forwardRef(function(){return p}),multi:!0};var p=function(){function e(e,t,n,r,i,l){this.el=e,this.domHandler=t,this.renderer=n,this.cd=r,this.objectUtils=i,this.zone=l,this.scrollHeight="200px",this.autoWidth=!0,this.filterBy="label",this.lazy=!0,this.resetFilterOnHide=!1,this.dropdownIcon="fa fa-fw fa-caret-down",this.onChange=new o.EventEmitter,this.onFocus=new o.EventEmitter,this.onBlur=new o.EventEmitter,this.onModelChange=function(){},this.onModelTouched=function(){},this.panelVisible=!1}return e.prototype.ngAfterContentInit=function(){var e=this;this.templates.forEach(function(t){switch(t.getType()){case"item":default:e.itemTemplate=t.template}})},e.prototype.ngOnInit=function(){this.optionsToDisplay=this.options,this.updateSelectedOption(null)},Object.defineProperty(e.prototype,"options",{get:function(){return this._options},set:function(e){var t=this.optionLabel?this.objectUtils.generateSelectItems(e,this.optionLabel):e;this._options=t,this.optionsToDisplay=this._options,this.updateSelectedOption(this.value),this.optionsChanged=!0,this.filterValue&&this.filterValue.length&&this.activateFilter()},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){this.container=this.containerViewChild.nativeElement,this.panel=this.panelViewChild.nativeElement,this.itemsWrapper=this.itemsWrapperViewChild.nativeElement,this.editable&&this.updateEditableLabel(),this.updateDimensions(),this.initialized=!0,this.appendTo&&("body"===this.appendTo?document.body.appendChild(this.panel):this.domHandler.appendChild(this.panel,this.appendTo))},Object.defineProperty(e.prototype,"label",{get:function(){return this.selectedOption?this.selectedOption.label:null},enumerable:!0,configurable:!0}),e.prototype.updateEditableLabel=function(){this.editableInputViewChild&&this.editableInputViewChild.nativeElement&&(this.editableInputViewChild.nativeElement.value=this.selectedOption?this.selectedOption.label:this.value||"")},e.prototype.onItemClick=function(e,t){this.itemClick=!0,this.selectItem(e,t),this.focusViewChild.nativeElement.focus(),this.hide()},e.prototype.selectItem=function(e,t){this.selectedOption!=t&&(this.selectedOption=t,this.value=t.value,this.onModelChange(this.value),this.updateEditableLabel(),this.onChange.emit({originalEvent:e,value:this.value}))},e.prototype.ngAfterViewChecked=function(){var e=this;this.shown&&(this.onShow(),this.shown=!1),this.optionsChanged&&this.panelVisible&&(this.optionsChanged=!1,this.zone.runOutsideAngular(function(){setTimeout(function(){e.updateDimensions(),e.alignPanel()},1)})),this.selectedOptionUpdated&&this.itemsWrapper&&(this.domHandler.findSingle(this.panel,"li.ui-state-highlight")&&this.domHandler.scrollInView(this.itemsWrapper,this.domHandler.findSingle(this.panel,"li.ui-state-highlight")),this.selectedOptionUpdated=!1)},e.prototype.writeValue=function(e){this.filter&&this.resetFilter(),this.value=e,this.updateSelectedOption(e),this.updateEditableLabel(),this.cd.markForCheck()},e.prototype.resetFilter=function(){this.filterViewChild&&this.filterViewChild.nativeElement&&(this.filterViewChild.nativeElement.value=""),this.optionsToDisplay=this.options},e.prototype.updateSelectedOption=function(e){this.selectedOption=this.findOption(e,this.optionsToDisplay),this.placeholder||this.selectedOption||!this.optionsToDisplay||!this.optionsToDisplay.length||this.editable||(this.selectedOption=this.optionsToDisplay[0]),this.selectedOptionUpdated=!0},e.prototype.registerOnChange=function(e){this.onModelChange=e},e.prototype.registerOnTouched=function(e){this.onModelTouched=e},e.prototype.setDisabledState=function(e){this.disabled=e},e.prototype.updateDimensions=function(){if(this.autoWidth){var e=this.domHandler.findSingle(this.el.nativeElement,"select");this.style&&(this.style.width||this.style["min-width"])||(this.el.nativeElement.children[0].style.width=e.offsetWidth+30+"px")}},e.prototype.onMouseclick=function(e){var t=this;this.disabled||this.readonly||(this.selfClick=!0,this.itemClick||(this.focusViewChild.nativeElement.focus(),this.panelVisible?this.hide():(this.show(),void 0!=this.filterViewChild&&setTimeout(function(){t.filterViewChild.nativeElement.focus()},200))))},e.prototype.onEditableInputClick=function(e){this.itemClick=!0,this.bindDocumentClickListener()},e.prototype.onEditableInputFocus=function(e){this.focus=!0,this.hide()},e.prototype.onEditableInputChange=function(e){this.value=e.target.value,this.updateSelectedOption(this.value),this.onModelChange(this.value),this.onChange.emit({originalEvent:e,value:this.value})},e.prototype.onShow=function(){if(this.options&&this.options.length){this.alignPanel(),this.bindDocumentClickListener();var e=this.domHandler.findSingle(this.itemsWrapper,".ui-dropdown-item.ui-state-highlight");e&&this.domHandler.scrollInView(this.itemsWrapper,e)}},e.prototype.show=function(){this.appendTo&&(this.panel.style.minWidth=this.domHandler.getWidth(this.container)+"px"),this.panel.style.zIndex=String(++u.DomHandler.zindex),this.panelVisible=!0,this.shown=!0},e.prototype.hide=function(){this.panelVisible=!1,this.filter&&this.resetFilterOnHide&&this.resetFilter()},e.prototype.alignPanel=function(){this.appendTo?this.domHandler.absolutePosition(this.panel,this.container):this.domHandler.relativePosition(this.panel,this.container)},e.prototype.onInputFocus=function(e){this.focus=!0,this.onFocus.emit(e)},e.prototype.onInputBlur=function(e){this.focus=!1,this.onModelTouched(),this.onBlur.emit(e)},e.prototype.onKeydown=function(e){if(!this.readonly){var t=this.selectedOption?this.findOptionIndex(this.selectedOption.value,this.optionsToDisplay):-1;switch(e.which){case 40:if(!this.panelVisible&&e.altKey)this.show();else if(-1!==t){var n=t+1;n!=this.optionsToDisplay.length&&(this.selectItem(e,this.optionsToDisplay[n]),this.selectedOptionUpdated=!0)}else this.optionsToDisplay&&this.selectItem(e,this.optionsToDisplay[0]);e.preventDefault();break;case 38:t>0&&(this.selectItem(e,this.optionsToDisplay[t-1]),this.selectedOptionUpdated=!0),e.preventDefault();break;case 32:case 32:this.panelVisible||(this.show(),e.preventDefault());break;case 13:this.hide(),e.preventDefault();break;case 27:case 9:this.hide()}}},e.prototype.findOptionIndex=function(e,t){var n=-1;if(t)for(var r=0;r<t.length;r++)if(null==e&&null==t[r].value||this.objectUtils.equals(e,t[r].value,this.dataKey)){n=r;break}return n},e.prototype.findOption=function(e,t){var n=this.findOptionIndex(e,t);return-1!=n?t[n]:null},e.prototype.onFilter=function(e){var t=e.target.value.toLowerCase();t&&t.length?(this.filterValue=t,this.activateFilter()):(this.filterValue=null,this.optionsToDisplay=this.options),this.optionsChanged=!0},e.prototype.activateFilter=function(){var e=this.filterBy.split(",");this.options&&this.options.length&&(this.optionsToDisplay=this.objectUtils.filter(this.options,e,this.filterValue),this.optionsChanged=!0)},e.prototype.applyFocus=function(){this.editable?this.domHandler.findSingle(this.el.nativeElement,".ui-dropdown-label.ui-inputtext").focus():this.domHandler.findSingle(this.el.nativeElement,"input[readonly]").focus()},e.prototype.bindDocumentClickListener=function(){var e=this;this.documentClickListener||(this.documentClickListener=this.renderer.listen("document","click",function(){e.selfClick||e.itemClick||(e.panelVisible=!1,e.unbindDocumentClickListener()),e.selfClick=!1,e.itemClick=!1,e.cd.markForCheck()}))},e.prototype.unbindDocumentClickListener=function(){this.documentClickListener&&(this.documentClickListener(),this.documentClickListener=null)},e.prototype.ngOnDestroy=function(){this.initialized=!1,this.unbindDocumentClickListener(),this.appendTo&&this.el.nativeElement.appendChild(this.panel)},e}();r([o.Input(),i("design:type",String)],p.prototype,"scrollHeight",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"filter",void 0),r([o.Input(),i("design:type",String)],p.prototype,"name",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"style",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"panelStyle",void 0),r([o.Input(),i("design:type",String)],p.prototype,"styleClass",void 0),r([o.Input(),i("design:type",String)],p.prototype,"panelStyleClass",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"disabled",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"readonly",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"autoWidth",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"required",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"editable",void 0),r([o.Input(),i("design:type",Object)],p.prototype,"appendTo",void 0),r([o.Input(),i("design:type",Number)],p.prototype,"tabindex",void 0),r([o.Input(),i("design:type",String)],p.prototype,"placeholder",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterPlaceholder",void 0),r([o.Input(),i("design:type",String)],p.prototype,"inputId",void 0),r([o.Input(),i("design:type",String)],p.prototype,"dataKey",void 0),r([o.Input(),i("design:type",String)],p.prototype,"filterBy",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"lazy",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"autofocus",void 0),r([o.Input(),i("design:type",Boolean)],p.prototype,"resetFilterOnHide",void 0),r([o.Input(),i("design:type",String)],p.prototype,"dropdownIcon",void 0),r([o.Input(),i("design:type",String)],p.prototype,"optionLabel",void 0),r([o.Output(),i("design:type",o.EventEmitter)],p.prototype,"onChange",void 0),r([o.Output(),i("design:type",o.EventEmitter)],p.prototype,"onFocus",void 0),r([o.Output(),i("design:type",o.EventEmitter)],p.prototype,"onBlur",void 0),r([o.ViewChild("container"),i("design:type",o.ElementRef)],p.prototype,"containerViewChild",void 0),r([o.ViewChild("panel"),i("design:type",o.ElementRef)],p.prototype,"panelViewChild",void 0),r([o.ViewChild("itemswrapper"),i("design:type",o.ElementRef)],p.prototype,"itemsWrapperViewChild",void 0),r([o.ViewChild("filter"),i("design:type",o.ElementRef)],p.prototype,"filterViewChild",void 0),r([o.ViewChild("in"),i("design:type",o.ElementRef)],p.prototype,"focusViewChild",void 0),r([o.ViewChild("editableInput"),i("design:type",o.ElementRef)],p.prototype,"editableInputViewChild",void 0),r([o.ContentChildren(s.PrimeTemplate),i("design:type",o.QueryList)],p.prototype,"templates",void 0),r([o.Input(),i("design:type",Array),i("design:paramtypes",[Array])],p.prototype,"options",null),p=r([o.Component({selector:"p-dropdown",template:'\n         <div #container [ngClass]="{\'ui-dropdown ui-widget ui-state-default ui-corner-all ui-helper-clearfix\':true,\n            \'ui-state-disabled\':disabled,\'ui-dropdown-open\':panelVisible,\'ui-state-focus\':focus}"\n            (click)="onMouseclick($event)" [ngStyle]="style" [class]="styleClass">\n            <div class="ui-helper-hidden-accessible" *ngIf="autoWidth">\n                <select [required]="required" [attr.name]="name" [attr.aria-label]="selectedOption ? selectedOption.label : \' \'" tabindex="-1" aria-hidden="true">\n                    <option *ngIf="placeholder">{{placeholder}}</option>\n                    <option *ngFor="let option of options" [value]="option.value" [selected]="selectedOption == option">{{option.label}}</option>\n                </select>\n            </div>\n            <div class="ui-helper-hidden-accessible">\n                <input #in [attr.id]="inputId" type="text" [attr.aria-label]="selectedOption ? selectedOption.label : \' \'" readonly (focus)="onInputFocus($event)" role="listbox"\n                    (blur)="onInputBlur($event)" (keydown)="onKeydown($event)" [disabled]="disabled" [attr.tabindex]="tabindex" [attr.autofocus]="autofocus">\n            </div>\n            <label [ngClass]="{\'ui-dropdown-label ui-inputtext ui-corner-all\':true,\'ui-dropdown-label-empty\':(label == null || label.length === 0)}" *ngIf="!editable && (label != null)">{{label||\'empty\'}}</label>\n            <label [ngClass]="{\'ui-dropdown-label ui-inputtext ui-corner-all ui-placeholder\':true,\'ui-dropdown-label-empty\': (placeholder == null || placeholder.length === 0)}" *ngIf="!editable && (label == null)">{{placeholder||\'empty\'}}</label>\n            <input #editableInput type="text" [attr.aria-label]="selectedOption ? selectedOption.label : \' \'" class="ui-dropdown-label ui-inputtext ui-corner-all" *ngIf="editable" [disabled]="disabled" [attr.placeholder]="placeholder"\n                        (click)="onEditableInputClick($event)" (input)="onEditableInputChange($event)" (focus)="onEditableInputFocus($event)" (blur)="onInputBlur($event)">\n            <div class="ui-dropdown-trigger ui-state-default ui-corner-right">\n                <span class="ui-clickable" [ngClass]="dropdownIcon"></span>\n            </div>\n            <div #panel [ngClass]="\'ui-dropdown-panel ui-widget-content ui-corner-all ui-shadow\'" [@panelState]="panelVisible ? \'visible\' : \'hidden\'"\n                [style.display]="panelVisible ? \'block\' : \'none\'" [ngStyle]="panelStyle" [class]="panelStyleClass">\n                <div *ngIf="filter" class="ui-dropdown-filter-container" (input)="onFilter($event)" (click)="$event.stopPropagation()">\n                    <input #filter type="text" autocomplete="off" class="ui-dropdown-filter ui-inputtext ui-widget ui-state-default ui-corner-all" [attr.placeholder]="filterPlaceholder"\n                    (keydown.enter)="$event.preventDefault()" (keydown)="onKeydown($event)">\n                    <span class="fa fa-search"></span>\n                </div>\n                <div #itemswrapper class="ui-dropdown-items-wrapper" [style.max-height]="scrollHeight||\'auto\'">\n                    <ul class="ui-dropdown-items ui-dropdown-list ui-widget-content ui-widget ui-corner-all ui-helper-reset" *ngIf="lazy ? panelVisible : true">\n                        <li *ngFor="let option of optionsToDisplay;let i=index"\n                            [ngClass]="{\'ui-dropdown-item ui-corner-all\':true, \'ui-state-highlight\':(selectedOption == option),\n                            \'ui-dropdown-item-empty\':!option.label||option.label.length === 0}"\n                            (click)="onItemClick($event, option)">\n                            <span *ngIf="!itemTemplate">{{option.label||\'empty\'}}</span>\n                            <ng-template [pTemplateWrapper]="itemTemplate" [item]="option" *ngIf="itemTemplate"></ng-template>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </div>\n    ',animations:[l.trigger("panelState",[l.state("hidden",l.style({opacity:0})),l.state("visible",l.style({opacity:1})),l.transition("visible => hidden",l.animate("400ms ease-in")),l.transition("hidden => visible",l.animate("400ms ease-out"))])],providers:[u.DomHandler,c.ObjectUtils,t.DROPDOWN_VALUE_ACCESSOR]})],p),t.Dropdown=p;var f=function(){};f=r([o.NgModule({imports:[a.CommonModule,s.SharedModule],exports:[p,s.SharedModule],declarations:[p]})],f),t.DropdownModule=f},wclm:function(e,t,n){"use strict";var r=n("6Xbx"),i=function(){function e(t,n){void 0===n&&(n=e.now),this.SchedulerAction=t,this.now=n}return e.prototype.schedule=function(e,t,n){return void 0===t&&(t=0),new this.SchedulerAction(this,e).schedule(n,t)},e.now=Date.now?Date.now:function(){return+new Date},e}();n.d(t,"a",function(){return o});var o=function(e){function t(){e.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(r.__extends)(t,e),t.prototype.flush=function(e){var t=this.actions;if(this.active)t.push(e);else{var n;this.active=!0;do{if(n=e.execute(e.state,e.delay))break}while(e=t.shift());if(this.active=!1,n){for(;e=t.shift();)e.unsubscribe();throw n}}},t}(i)},xI8H:function(e,t,n){var r=n("c09d")("meta"),i=n("JXkd"),o=n("rMsi"),l=n("tose").f,a=0,s=Object.isExtensible||function(){return!0},u=!n("umMR")(function(){return s(Object.preventExtensions({}))}),c=function(e){l(e,r,{value:{i:"O"+ ++a,w:{}}})},d=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!i(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!o(e,r)){if(!s(e))return"F";if(!t)return"E";c(e)}return e[r].i},getWeak:function(e,t){if(!o(e,r)){if(!s(e))return!0;if(!t)return!1;c(e)}return e[r].w},onFreeze:function(e){return u&&d.NEED&&s(e)&&!o(e,r)&&c(e),e}}},xIGM:function(e,t,n){"use strict";(function(e){n.d(t,"a",function(){return o});var r="undefined"!=typeof window&&window,i="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,o=r||void 0!==e&&e||i}).call(t,n("fRUx"))},yIWP:function(e,t,n){var r=n("Iclu")("keys"),i=n("c09d");e.exports=function(e){return r[e]||(r[e]=i(e))}}},[0]);
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/polyfills.32ca5670d6503e090789.bundle.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
new file mode 100644
index 0000000..053fad1
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/polyfills.32ca5670d6503e090789.bundle.js
@@ -0,0 +1 @@
+webpackJsonp([1],{"+GRi":function(e,t,n){var r=n("Wo2w"),o=n("Wy9r");e.exports=function(e){return r(o(e))}},"+iEx":function(e,t,n){n("fHxy"),n("5GJ3"),n("X0O/"),n("HCkn"),n("ncNB"),n("soMw"),n("8sYH"),n("IJ3P"),n("t6ta"),e.exports=n("b4gG").Reflect},"+pQw":function(e,t,n){var r=n("JXkd");e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},1:function(e,t,n){e.exports=n("TU+8")},"2Fuj":function(e,t,n){var r=n("R5c1"),o=n("a/Sk");e.exports=Object.keys||function(e){return r(e,o)}},"3LDD":function(e,t,n){"use strict";var r=n("tose").f,o=n("51pc"),i=n("pBmS"),a=n("pa70"),c=n("Lcie"),u=n("p/bR"),s=n("WsSm"),l=n("w/BM"),f=n("KpXt"),p=n("V+0c"),h=n("xI8H").fastKey,d=n("Y5fy"),v=p?"_s":"size",y=function(e,t){var n,r=h(t);if("F"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,s){var l=e(function(e,r){c(e,l,t,"_i"),e._t=t,e._i=o(null),e._f=void 0,e._l=void 0,e[v]=0,void 0!=r&&u(r,n,e[s],e)});return i(l.prototype,{clear:function(){for(var e=d(this,t),n=e._i,r=e._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];e._f=e._l=void 0,e[v]=0},delete:function(e){var n=d(this,t),r=y(n,e);if(r){var o=r.n,i=r.p;delete n._i[r.i],r.r=!0,i&&(i.n=o),o&&(o.p=i),n._f==r&&(n._f=o),n._l==r&&(n._l=i),n[v]--}return!!r},forEach:function(e){d(this,t);for(var n,r=a(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!y(d(this,t),e)}}),p&&r(l.prototype,"size",{get:function(){return d(this,t)[v]}}),l},def:function(e,t,n){var r,o,i=y(e,t);return i?i.v=n:(e._l=i={i:o=h(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=i),r&&(r.n=i),e[v]++,"F"!==o&&(e._i[o]=i)),e},getEntry:y,setStrong:function(e,t,n){s(e,t,function(e,n){this._t=d(e,t),this._k=n,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))},n?"entries":"values",!n,!0),f(t)}}},"3r0D":function(e,t,n){var r=n("Iclu")("wks"),o=n("c09d"),i=n("ptrv").Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},"51pc":function(e,t,n){var r=n("+pQw"),o=n("ewdp"),i=n("a/Sk"),a=n("yIWP")("IE_PROTO"),c=function(){},u=function(){var e,t=n("BQSv")("iframe"),r=i.length;for(t.style.display="none",n("Ed9o").appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),u=e.F;r--;)delete u.prototype[i[r]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(c.prototype=r(e),n=new c,c.prototype=null,n[a]=e):n=u(),void 0===t?n:o(n,t)}},"5GJ3":function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=r.key,a=r.map,c=r.store;r.exp({deleteMetadata:function(e,t){var n=arguments.length<3?void 0:i(arguments[2]),r=a(o(t),n,!1);if(void 0===r||!r.delete(e))return!1;if(r.size)return!0;var u=c.get(t);return u.delete(n),!!u.size||c.delete(t)}})},"5oDA":function(e,t,n){var r=n("JXkd"),o=n("+pQw"),i=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,r){try{(r=n("pa70")(Function.call,n("6De9").f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return i(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:i}},"6De9":function(e,t,n){var r=n("9e9+"),o=n("piOq"),i=n("+GRi"),a=n("A1WY"),c=n("rMsi"),u=n("gNkH"),s=Object.getOwnPropertyDescriptor;t.f=n("V+0c")?s:function(e,t){if(e=i(e),t=a(t,!0),u)try{return s(e,t)}catch(e){}if(c(e,t))return o(!r.f.call(e,t),e[t])}},"8sYH":function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=n("TJLg"),a=r.has,c=r.key,u=function(e,t,n){if(a(e,t,n))return!0;var r=i(t);return null!==r&&u(e,r,n)};r.exp({hasMetadata:function(e,t){return u(e,o(t),arguments.length<3?void 0:c(arguments[2]))}})},"9ScN":function(e,t,n){"use strict";var r=n("51pc"),o=n("piOq"),i=n("P6IN"),a={};n("gxdV")(a,n("3r0D")("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},"9e9+":function(e,t){t.f={}.propertyIsEnumerable},"9wYb":function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},A1WY:function(e,t,n){var r=n("JXkd");e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},BCYq:function(e,t,n){var r=n("pa70"),o=n("Wo2w"),i=n("RT4T"),a=n("rppw"),c=n("UKZQ");e.exports=function(e,t){var n=1==e,u=2==e,s=3==e,l=4==e,f=6==e,p=5==e||f,h=t||c;return function(t,c,d){for(var v,y,g=i(t),k=o(g),m=r(c,d,3),_=a(k.length),b=0,w=n?h(t,_):u?h(t,0):void 0;_>b;b++)if((p||b in k)&&(v=k[b],y=m(v,b,g),e))if(n)w[b]=y;else if(y)switch(e){case 3:return!0;case 5:return v;case 6:return b;case 2:w.push(v)}else if(l)return!1;return f?-1:s||l?l:w}}},BQSv:function(e,t,n){var r=n("JXkd"),o=n("ptrv").document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},CDXM:function(e,t,n){var r=n("ptrv"),o=n("b4gG"),i=n("gxdV"),a=n("lfBE"),c=n("pa70"),u=function(e,t,n){var s,l,f,p,h=e&u.F,d=e&u.G,v=e&u.P,y=e&u.B,g=d?r:e&u.S?r[t]||(r[t]={}):(r[t]||{}).prototype,k=d?o:o[t]||(o[t]={}),m=k.prototype||(k.prototype={});d&&(n=t);for(s in n)f=((l=!h&&g&&void 0!==g[s])?g:n)[s],p=y&&l?c(f,r):v&&"function"==typeof f?c(Function.call,f):f,g&&a(g,s,f,e&u.U),k[s]!=f&&i(k,s,p),v&&m[s]!=f&&(m[s]=f)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},Ed9o:function(e,t,n){var r=n("ptrv").document;e.exports=r&&r.documentElement},HCkn:function(e,t,n){var r=n("Ps07"),o=n("WGJ/"),i=n("gBtn"),a=n("+pQw"),c=n("TJLg"),u=i.keys,s=i.key,l=function(e,t){var n=u(e,t),i=c(e);if(null===i)return n;var a=l(i,t);return a.length?n.length?o(new r(n.concat(a))):a:n};i.exp({getMetadataKeys:function(e){return l(a(e),arguments.length<2?void 0:s(arguments[1]))}})},IJ3P:function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=r.has,a=r.key;r.exp({hasOwnMetadata:function(e,t){return i(e,o(t),arguments.length<3?void 0:a(arguments[2]))}})},Iclu:function(e,t,n){var r=n("ptrv"),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});e.exports=function(e){return o[e]||(o[e]={})}},JXkd:function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},KGrn:function(e,t){e.exports=!1},KM3d:function(e,t,n){var r=n("9wYb"),o=Math.max,i=Math.min;e.exports=function(e,t){return(e=r(e))<0?o(e+t,0):i(e,t)}},"KpI+":function(e,t,n){var r=n("lexG"),o=n("3r0D")("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},KpXt:function(e,t,n){"use strict";var r=n("ptrv"),o=n("tose"),i=n("V+0c"),a=n("3r0D")("species");e.exports=function(e){var t=r[e];i&&t&&!t[a]&&o.f(t,a,{configurable:!0,get:function(){return this}})}},Lcie:function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},P6IN:function(e,t,n){var r=n("tose").f,o=n("rMsi"),i=n("3r0D")("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},Ps07:function(e,t,n){"use strict";var r=n("3LDD"),o=n("Y5fy");e.exports=n("cpZ/")("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(o(this,"Set"),e=0===e?0:e,e)}},r)},QZhw:function(e,t,n){"use strict";var r,o=n("BCYq")(0),i=n("lfBE"),a=n("xI8H"),c=n("rIdM"),u=n("XRS9"),s=n("JXkd"),l=n("umMR"),f=n("Y5fy"),p=a.getWeak,h=Object.isExtensible,d=u.ufstore,v={},y=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},g={get:function(e){if(s(e)){var t=p(e);return!0===t?d(f(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return u.def(f(this,"WeakMap"),e,t)}},k=e.exports=n("cpZ/")("WeakMap",y,g,u,!0,!0);l(function(){return 7!=(new k).set((Object.freeze||Object)(v),7).get(v)})&&(c((r=u.getConstructor(y,"WeakMap")).prototype,g),a.NEED=!0,o(["delete","has","get","set"],function(e){var t=k.prototype,n=t[e];i(t,e,function(t,o){if(s(t)&&!h(t)){this._f||(this._f=new r);var i=this._f[e](t,o);return"set"==e?this:i}return n.call(this,t,o)})}))},R5c1:function(e,t,n){var r=n("rMsi"),o=n("+GRi"),i=n("vyV2")(!1),a=n("yIWP")("IE_PROTO");e.exports=function(e,t){var n,c=o(e),u=0,s=[];for(n in c)n!=a&&r(c,n)&&s.push(n);for(;t.length>u;)r(c,n=t[u++])&&(~i(s,n)||s.push(n));return s}},RT4T:function(e,t,n){var r=n("Wy9r");e.exports=function(e){return Object(r(e))}},TJLg:function(e,t,n){var r=n("rMsi"),o=n("RT4T"),i=n("yIWP")("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},"TU+8":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("+iEx"),o=(n.n(r),n("eFQL"));n.n(o)},UKZQ:function(e,t,n){var r=n("a7b8");e.exports=function(e,t){return new(r(e))(t)}},ULWX:function(e,t,n){var r=n("+pQw");e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},UlVq:function(e,t,n){var r=n("3r0D")("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},Ula3:function(e,t,n){var r=n("JXkd"),o=n("5oDA").set;e.exports=function(e,t,n){var i,a=t.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&o&&o(e,i),e}},"V+0c":function(e,t,n){e.exports=!n("umMR")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},VceJ:function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},"WGJ/":function(e,t,n){var r=n("p/bR");e.exports=function(e,t){var n=[];return r(e,!1,n.push,n,t),n}},Wo2w:function(e,t,n){var r=n("VceJ");e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},WsSm:function(e,t,n){"use strict";var r=n("KGrn"),o=n("CDXM"),i=n("lfBE"),a=n("gxdV"),c=n("rMsi"),u=n("lexG"),s=n("9ScN"),l=n("P6IN"),f=n("TJLg"),p=n("3r0D")("iterator"),h=!([].keys&&"next"in[].keys()),d=function(){return this};e.exports=function(e,t,n,v,y,g,k){s(n,t,v);var m,_,b,w=function(e){if(!h&&e in x)return x[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},T=t+" Iterator",E="values"==y,O=!1,x=e.prototype,S=x[p]||x["@@iterator"]||y&&x[y],D=!h&&S||w(y),P=y?E?w("entries"):D:void 0,j="Array"==t?x.entries||S:S;if(j&&(b=f(j.call(new e)))!==Object.prototype&&b.next&&(l(b,T,!0),r||c(b,p)||a(b,p,d)),E&&S&&"values"!==S.name&&(O=!0,D=function(){return S.call(this)}),r&&!k||!h&&!O&&x[p]||a(x,p,D),u[t]=D,u[T]=d,y)if(m={values:E?D:w("values"),keys:g?D:w("keys"),entries:P},k)for(_ in m)_ in x||i(x,_,m[_]);else o(o.P+o.F*(h||O),t,m);return m}},Wy9r:function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e}},"X0O/":function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=n("TJLg"),a=r.has,c=r.get,u=r.key,s=function(e,t,n){if(a(e,t,n))return c(e,t,n);var r=i(t);return null!==r?s(e,r,n):void 0};r.exp({getMetadata:function(e,t){return s(e,o(t),arguments.length<3?void 0:u(arguments[2]))}})},XRS9:function(e,t,n){"use strict";var r=n("pBmS"),o=n("xI8H").getWeak,i=n("+pQw"),a=n("JXkd"),c=n("Lcie"),u=n("p/bR"),s=n("BCYq"),l=n("rMsi"),f=n("Y5fy"),p=s(5),h=s(6),d=0,v=function(e){return e._l||(e._l=new y)},y=function(){this.a=[]},g=function(e,t){return p(e.a,function(e){return e[0]===t})};y.prototype={get:function(e){var t=g(this,e);if(t)return t[1]},has:function(e){return!!g(this,e)},set:function(e,t){var n=g(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=h(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,i){var s=e(function(e,r){c(e,s,t,"_i"),e._t=t,e._i=d++,e._l=void 0,void 0!=r&&u(r,n,e[i],e)});return r(s.prototype,{delete:function(e){if(!a(e))return!1;var n=o(e);return!0===n?v(f(this,t)).delete(e):n&&l(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=o(e);return!0===n?v(f(this,t)).has(e):n&&l(n,this._i)}}),s},def:function(e,t,n){var r=o(i(t),!0);return!0===r?v(e).set(t,n):r[e._i]=n,e},ufstore:v}},Y5fy:function(e,t,n){var r=n("JXkd");e.exports=function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},ZI9W:function(e,t,n){"use strict";var r=n("3LDD"),o=n("Y5fy");e.exports=n("cpZ/")("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(o(this,"Map"),e);return t&&t.v},set:function(e,t){return r.def(o(this,"Map"),0===e?0:e,t)}},r,!0)},"a/Sk":function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},a7b8:function(e,t,n){var r=n("JXkd"),o=n("rKhO"),i=n("3r0D")("species");e.exports=function(e){var t;return o(e)&&("function"!=typeof(t=e.constructor)||t!==Array&&!o(t.prototype)||(t=void 0),r(t)&&null===(t=t[i])&&(t=void 0)),void 0===t?Array:t}},b4gG:function(e,t){var n=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},c09d:function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},"cpZ/":function(e,t,n){"use strict";var r=n("ptrv"),o=n("CDXM"),i=n("lfBE"),a=n("pBmS"),c=n("xI8H"),u=n("p/bR"),s=n("Lcie"),l=n("JXkd"),f=n("umMR"),p=n("UlVq"),h=n("P6IN"),d=n("Ula3");e.exports=function(e,t,n,v,y,g){var k=r[e],m=k,_=y?"set":"add",b=m&&m.prototype,w={},T=function(e){var t=b[e];i(b,e,"delete"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return g&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof m&&(g||b.forEach&&!f(function(){(new m).entries().next()}))){var E=new m,O=E[_](g?{}:-0,1)!=E,x=f(function(){E.has(1)}),S=p(function(e){new m(e)}),D=!g&&f(function(){for(var e=new m,t=5;t--;)e[_](t,t);return!e.has(-0)});S||((m=t(function(t,n){s(t,m,e);var r=d(new k,t,m);return void 0!=n&&u(n,y,r[_],r),r})).prototype=b,b.constructor=m),(x||D)&&(T("delete"),T("has"),y&&T("get")),(D||O)&&T(_),g&&b.clear&&delete b.clear}else m=v.getConstructor(t,e,y,_),a(m.prototype,n),c.NEED=!0;return h(m,e),w[e]=m,o(o.G+o.W+o.F*(m!=k),w),g||v.setStrong(m,e,y),m}},"dXJ/":function(e,t,n){var r=n("VceJ"),o=n("3r0D")("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?n:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},eFQL:function(e,t,n){(function(e){!function(){"use strict";function t(e,t){for(var n=e.length-1;n>=0;n--)typeof e[n]===k&&(e[n]=Zone.current.wrap(e[n],t+"_"+n));return e}function n(e){return!e||!1!==e.writable&&(typeof e.get!==k||typeof e.set!==m)}function r(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(!r&&n&&Object.getOwnPropertyDescriptor(n,t)&&(r={enumerable:!0,configurable:!0}),r&&r.configurable){delete r.writable,delete r.value;var o=r.get,i=t.substr(2),a=O[i];a||(a=O[i]=y("ON_PROPERTY"+i)),r.set=function(t){var n=this;n||e!==g||(n=g),n&&(n[a]&&n.removeEventListener(i,x),"function"==typeof t?(n[a]=t,n.addEventListener(i,x,!1)):n[a]=null)},r.get=function(){var n=this;if(n||e!==g||(n=g),!n)return null;var i=n[a];if(i)return i;if(o){var c=o&&o.apply(this);if(c)return r.set.apply(this,[c]),typeof n[_]===k&&n.removeAttribute(t),c}return null},Object.defineProperty(e,t,r)}}function o(e,t,n){if(t)for(var o=0;o<t.length;o++)r(e,"on"+t[o],n);else{var i=[];for(var a in e)"on"==a.substr(0,2)&&i.push(a);for(var c=0;c<i.length;c++)r(e,i[c],n)}}function i(e){var n=g[e];if(n){g[y(e)]=n,g[e]=function(){var r=t(arguments,e);switch(r.length){case 0:this[S]=new n;break;case 1:this[S]=new n(r[0]);break;case 2:this[S]=new n(r[0],r[1]);break;case 3:this[S]=new n(r[0],r[1],r[2]);break;case 4:this[S]=new n(r[0],r[1],r[2],r[3]);break;default:throw new Error("Arg list too long.")}},c(g[e],n);var r,o=new n(function(){});for(r in o)"XMLHttpRequest"===e&&"responseBlob"===r||function(t){"function"==typeof o[t]?g[e].prototype[t]=function(){return this[S][t].apply(this[S],arguments)}:Object.defineProperty(g[e].prototype,t,{set:function(n){"function"==typeof n?(this[S][t]=Zone.current.wrap(n,e+"."+t),c(this[S][t],n)):this[S][t]=n},get:function(){return this[S][t]}})}(r);for(r in n)"prototype"!==r&&n.hasOwnProperty(r)&&(g[e][r]=n[r])}}function a(e,t,r){for(var o=e;o&&!o.hasOwnProperty(t);)o=Object.getPrototypeOf(o);!o&&e[t]&&(o=e);var i,a=y(t);if(o&&!(i=o[a])&&(i=o[a]=o[t],n(o&&Object.getOwnPropertyDescriptor(o,t)))){var u=r(i,a,t);o[t]=function(){return u(this,arguments)},c(o[t],i)}return i}function c(e,t){e[y("OriginalDelegate")]=t}function u(e,t,n){function r(t,n){if(!t)return!1;var r=!0;n&&void 0!==n.useGlobalCallback&&(r=n.useGlobalCallback);var d=n&&n.validateHandler,k=!0;n&&void 0!==n.checkDuplicate&&(k=n.checkDuplicate);var m=!1;n&&void 0!==n.returnTarget&&(m=n.returnTarget);for(var _=t;_&&!_.hasOwnProperty(o);)_=Object.getPrototypeOf(_);if(!_&&t[o]&&(_=t),!_)return!1;if(_[l])return!1;var b,w={},T=_[l]=_[o],E=_[y(i)]=_[i],O=_[y(a)]=_[a],x=_[y(u)]=_[u];n&&n.prependEventListenerFnName&&(b=_[y(n.prependEventListenerFnName)]=_[n.prependEventListenerFnName]);var S=r?function(e){if(!e.isRemoved){var t=C[e.eventName],n=void 0;t&&(n=t[e.capture?Z:z]);var r=n&&e.target[n];if(r)for(var o=0;o<r.length;o++)if(r[o]===e){r.splice(o,1),e.isRemoved=!0,0===r.length&&(e.allRemoved=!0,e.target[n]=null);break}}if(e.allRemoved)return E.apply(e.target,[e.eventName,e.capture?g:v,e.options])}:function(e){return E.apply(e.target,[e.eventName,e.invoke,e.options])},D=n&&n.compareTaskCallbackVsDelegate?n.compareTaskCallbackVsDelegate:function(e,t){var n=typeof t;return n===H&&e.callback===t||n===F&&e.originalDelegate===t},P=function(t,n,o,i,a,c){return void 0===a&&(a=!1),void 0===c&&(c=!1),function(){var u=this||e,s=(Zone,arguments[1]);if(!s)return t.apply(this,arguments);var l=!1;if(typeof s!==H){if(!s.handleEvent)return t.apply(this,arguments);l=!0}if(!d||d(t,s,u,arguments)){var f,p=arguments[0],h=arguments[2],v=!1;void 0===h?f=!1:!0===h?f=!0:!1===h?f=!1:(f=!!h&&!!h.capture,v=!!h&&!!h.once);var y,g=Zone.current,m=C[p];if(m)y=m[f?Z:z];else{var _=B+(p+z),b=B+(p+Z);C[p]={},C[p][z]=_,C[p][Z]=b,y=f?b:_}var T=u[y],E=!1;if(T){if(E=!0,k)for(var O=0;O<T.length;O++)if(D(T[O],s))return}else T=u[y]=[];var x,S=u.constructor[L],P=R[S];P&&(x=P[p]),x||(x=S+n+p),w.options=h,v&&(w.options.once=!1),w.target=u,w.capture=f,w.eventName=p,w.isExisting=E;var j=g.scheduleEventTask(x,s,r?I:null,o,i);return v&&(h.once=!0),j.options=h,j.target=u,j.capture=f,j.eventName=p,l&&(j.originalDelegate=s),c?T.unshift(j):T.push(j),a?u:void 0}}};return _[o]=P(T,f,r?function(e){if(!w.isExisting)return T.apply(w.target,[w.eventName,w.capture?g:v,w.options])}:function(e){return T.apply(w.target,[w.eventName,e.invoke,w.options])},S,m),b&&(_[p]=P(b,h,function(e){return b.apply(w.target,[w.eventName,e.invoke,w.options])},S,m,!0)),_[i]=function(){var t,n=this||e,r=arguments[0],o=arguments[2];t=void 0!==o&&(!0===o||!1!==o&&!!o&&!!o.capture);var i=arguments[1];if(!i)return E.apply(this,arguments);if(!d||d(E,i,n,arguments)){var a,c=C[r];c&&(a=c[t?Z:z]);var u=a&&n[a];if(u)for(var s=0;s<u.length;s++){var l=u[s];if(D(l,i))return u.splice(s,1),l.isRemoved=!0,0===u.length&&(l.allRemoved=!0,n[a]=null),void l.zone.cancelTask(l)}}},_[a]=function(){for(var t=[],n=s(this||e,arguments[0]),r=0;r<n.length;r++){var o=n[r];t.push(o.originalDelegate?o.originalDelegate:o.callback)}return t},_[u]=function(){var t=this||e,n=arguments[0];if(n){var r=C[n];if(r){var o=t[r[z]],a=t[r[Z]];if(o){var c=M(o);for(f=0;f<c.length;f++)this[i].apply(this,[n,(s=c[f]).originalDelegate?s.originalDelegate:s.callback,s.options])}if(a)for(c=M(a),f=0;f<c.length;f++){var s;this[i].apply(this,[n,(s=c[f]).originalDelegate?s.originalDelegate:s.callback,s.options])}}}else{for(var l=Object.keys(t),f=0;f<l.length;f++){var p=q.exec(l[f]),h=p&&p[1];h&&"removeListener"!==h&&this[u].apply(this,[h])}this[u].apply(this,["removeListener"])}},c(_[o],T),c(_[i],E),x&&c(_[u],x),O&&c(_[a],O),!0}for(var o=n&&n.addEventListenerFnName||"addEventListener",i=n&&n.removeEventListenerFnName||"removeEventListener",a=n&&n.listenersFnName||"eventListeners",u=n&&n.removeAllFnName||"removeAllListeners",l=y(o),f="."+o+":",p="prependListener",h="."+p+":",d=function(e,t,n){if(!e.isRemoved){var r=e.callback;typeof r===F&&r.handleEvent&&(e.callback=function(e){return r.handleEvent(e)},e.originalDelegate=r),e.invoke(e,t,[n]);var o=e.options;o&&"object"==typeof o&&o.once&&t[i].apply(t,[n.type,e.originalDelegate?e.originalDelegate:e.callback,o])}},v=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[C[t.type][z]];if(r)if(1===r.length)d(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[N]);i++)d(o[i],n,t)}},g=function(t){if(t=t||e.event){var n=this||t.target||e,r=n[C[t.type][Z]];if(r)if(1===r.length)d(r[0],n,t);else for(var o=r.slice(),i=0;i<o.length&&(!t||!0!==t[N]);i++)d(o[i],n,t)}},k=[],m=0;m<t.length;m++)k[m]=r(t[m],n);return k}function s(e,t){var n=[];for(var r in e){var o=q.exec(r),i=o&&o[1];if(i&&(!t||i===t)){var a=e[r];if(a)for(var c=0;c<a.length;c++)n.push(a[c])}}return n}function l(e,t,n,r){function o(t){var n=t.data;return n.args[0]=function(){try{t.invoke.apply(this,arguments)}finally{typeof n.handleId===l?delete s[n.handleId]:n.handleId&&(n.handleId[W]=null)}},n.handleId=c.apply(e,n.args),t}function i(e){return u(e.data.handleId)}var c=null,u=null;n+=r;var s={},l="number";c=a(e,t+=r,function(n){return function(a,c){if("function"==typeof c[0]){var u=Zone.current.scheduleMacroTask(t,c[0],{handleId:null,isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?c[1]||0:null,args:c},o,i);if(!u)return u;var f=u.data.handleId;return typeof f===l?s[f]=u:f&&(f[W]=u),f&&f.ref&&f.unref&&"function"==typeof f.ref&&"function"==typeof f.unref&&(u.ref=f.ref.bind(f),u.unref=f.unref.bind(f)),typeof f===l||f?f:u}return n.apply(e,c)}}),u=a(e,n,function(t){return function(n,r){var o,i=r[0];typeof i===l?o=s[i]:(o=i&&i[W])||(o=i),o&&"string"==typeof o.type?"notScheduled"!==o.state&&(o.cancelFn&&o.data.isPeriodic||0===o.runCount)&&(typeof i===l?delete s[i]:i&&(i[W]=null),o.zone.cancelTask(o)):t.apply(e,r)}})}function f(e,t){return e&&e[U]&&e[U][t]}function p(e,t,n){return n.configurable=!0,n.configurable||(e[U]||X(e,U,{writable:!0,value:{}}),e[U][t]=!0),n}function h(e,t,n,r){try{return X(e,t,n)}catch(i){if(!n.configurable)throw i;typeof r==J?delete n.configurable:n.configurable=r;try{return X(e,t,n)}catch(r){var o=null;try{o=JSON.stringify(n)}catch(e){o=o.toString()}console.log("Attempting to configure '"+t+"' with descriptor '"+o+"' on object '"+e+"' and got error, giving up: "+r)}}}function d(e,t,n,r){o(e,function(e,t,n){if(!n)return t;var r=n.filter(function(t){return t.target===e});if(!r||0===r.length)return t;var o=r[0].ignoreProperties;return t.filter(function(e){return-1===o.indexOf(e)})}(e,t,n),r)}!function(e){function t(e){c&&c.mark&&c.mark(e)}function n(e,t){c&&c.measure&&c.measure(e,t)}function r(t){0===Z&&0===y.length&&(s||e[d]&&(s=e[d].resolve(0)),s?s[v](o):e[h](o,0)),t&&y.push(t)}function o(){if(!g){for(g=!0;y.length;){var e=y;y=[];for(var t=0;t<e.length;t++){var n=e[t];try{n.zone.runTask(n,null,null)}catch(e){P.onUnhandledError(e)}}}a("ignoreConsoleErrorUncaughtError"),P.microtaskDrainDone(),g=!1}}function i(){}function a(e){return"__zone_symbol__"+e}var c=e.performance;if(t("Zone"),e.Zone)throw new Error("Zone already loaded.");var u=function(){function r(e,t){this._properties=null,this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,t)}return r.assertZonePatched=function(){if(e.Promise!==D.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(r,"root",{get:function(){for(var e=r.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(r,"current",{get:function(){return j.zone},enumerable:!0,configurable:!0}),Object.defineProperty(r,"currentTask",{get:function(){return M},enumerable:!0,configurable:!0}),r.__load_patch=function(o,i){if(D.hasOwnProperty(o))throw Error("Already loaded patch: "+o);if(!e["__Zone_disable_"+o]){var a="Zone:"+o;t(a),D[o]=i(e,r,P),n(a,a)}},Object.defineProperty(r.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),r.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},r.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},r.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},r.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},r.prototype.run=function(e,t,n,r){void 0===t&&(t=void 0),void 0===n&&(n=null),void 0===r&&(r=null),j={parent:j,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{j=j.parent}},r.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),void 0===n&&(n=null),void 0===r&&(r=null),j={parent:j,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{j=j.parent}},r.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");if(e.state!==m||e.type!==S){var r=e.state!=w;r&&e._transitionTo(w,b),e.runCount++;var o=M;M=e,j={parent:j,zone:this};try{e.type==x&&e.data&&!e.data.isPeriodic&&(e.cancelFn=null);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(e){if(this._zoneDelegate.handleError(this,e))throw e}}finally{e.state!==m&&e.state!==E&&(e.type==S||e.data&&e.data.isPeriodic?r&&e._transitionTo(b,w):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(m,w,m))),j=j.parent,M=o}}},r.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(_,m);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(t){throw e._transitionTo(E,_,m),this._zoneDelegate.handleError(this,t),t}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==_&&e._transitionTo(b,_),e},r.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new p(O,e,t,n,r,null))},r.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new p(x,e,t,n,r,o))},r.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new p(S,e,t,n,r,o))},r.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||k).name+"; Execution: "+this.name+")");e._transitionTo(T,b,w);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(E,T),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(m,T),e.runCount=0,e},r.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},r}();u.__symbol__=a;var s,l={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,i){return e.invokeTask(n,r,o,i)},onCancelTask:function(e,t,n,r){return e.cancelTask(n,r)}},f=function(){function e(e,t,n){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=e,this._parentDelegate=t,this._forkZS=n&&(n&&n.onFork?n:t._forkZS),this._forkDlgt=n&&(n.onFork?t:t._forkDlgt),this._forkCurrZone=n&&(n.onFork?this.zone:t.zone),this._interceptZS=n&&(n.onIntercept?n:t._interceptZS),this._interceptDlgt=n&&(n.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=n&&(n.onIntercept?this.zone:t.zone),this._invokeZS=n&&(n.onInvoke?n:t._invokeZS),this._invokeDlgt=n&&(n.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=n&&(n.onInvoke?this.zone:t.zone),this._handleErrorZS=n&&(n.onHandleError?n:t._handleErrorZS),this._handleErrorDlgt=n&&(n.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=n&&(n.onHandleError?this.zone:t.zone),this._scheduleTaskZS=n&&(n.onScheduleTask?n:t._scheduleTaskZS),this._scheduleTaskDlgt=n&&(n.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=n&&(n.onScheduleTask?this.zone:t.zone),this._invokeTaskZS=n&&(n.onInvokeTask?n:t._invokeTaskZS),this._invokeTaskDlgt=n&&(n.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=n&&(n.onInvokeTask?this.zone:t.zone),this._cancelTaskZS=n&&(n.onCancelTask?n:t._cancelTaskZS),this._cancelTaskDlgt=n&&(n.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=n&&(n.onCancelTask?this.zone:t.zone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var r=n&&n.onHasTask;(r||t&&t._hasTaskZS)&&(this._hasTaskZS=r?n:l,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=e,n.onScheduleTask||(this._scheduleTaskZS=l,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),n.onInvokeTask||(this._invokeTaskZS=l,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),n.onCancelTask||(this._cancelTaskZS=l,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}return e.prototype.fork=function(e,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,e,t):new u(e,t)},e.prototype.intercept=function(e,t,n){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,e,t,n):t},e.prototype.invoke=function(e,t,n,r,o){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,e,t,n,r,o):t.apply(n,r)},e.prototype.handleError=function(e,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,e,t)},e.prototype.scheduleTask=function(e,t){var n=t;if(this._scheduleTaskZS)this._hasTaskZS&&n._zoneDelegates.push(this._hasTaskDlgtOwner),(n=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,e,t))||(n=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=O)throw new Error("Task is missing scheduleFn.");r(t)}return n},e.prototype.invokeTask=function(e,t,n,r){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,e,t,n,r):t.callback.apply(n,r)},e.prototype.cancelTask=function(e,t){var n;if(this._cancelTaskZS)n=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,e,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");n=t.cancelFn(t)}return n},e.prototype.hasTask=function(e,t){try{return this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,e,t)}catch(t){this.handleError(e,t)}},e.prototype._updateTaskCount=function(e,t){var n=this._taskCounts,r=n[e],o=n[e]=r+t;if(o<0)throw new Error("More tasks executed then were scheduled.");0!=r&&0!=o||this.hasTask(this.zone,{microTask:n.microTask>0,macroTask:n.macroTask>0,eventTask:n.eventTask>0,change:e})},e}(),p=function(){function t(n,r,o,i,a,c){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=n,this.source=r,this.data=i,this.scheduleFn=a,this.cancelFn=c,this.callback=o;var u=this;this.invoke=n===S&&i&&i.isUsingGlobalCallback?t.invokeTask:function(){return t.invokeTask.apply(e,[u,this,arguments])}}return t.invokeTask=function(e,t,n){e||(e=this),Z++;try{return e.runCount++,e.zone.runTask(e,t,n)}finally{1==Z&&o(),Z--}},Object.defineProperty(t.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),t.prototype.cancelScheduleRequest=function(){this._transitionTo(m,_)},t.prototype._transitionTo=function(e,t,n){if(this._state!==t&&this._state!==n)throw new Error(this.type+" '"+this.source+"': can not transition to '"+e+"', expecting state '"+t+"'"+(n?" or '"+n+"'":"")+", was '"+this._state+"'.");this._state=e,e==m&&(this._zoneDelegates=null)},t.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId:Object.prototype.toString.call(this)},t.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,invoke:this.invoke,scheduleFn:this.scheduleFn,cancelFn:this.cancelFn,runCount:this.runCount,callback:this.callback}},t}(),h=a("setTimeout"),d=a("Promise"),v=a("then"),y=[],g=!1,k={name:"NO ZONE"},m="notScheduled",_="scheduling",b="scheduled",w="running",T="canceling",E="unknown",O="microTask",x="macroTask",S="eventTask",D={},P={symbol:a,currentZoneFrame:function(){return j},onUnhandledError:i,microtaskDrainDone:i,scheduleMicroTask:r,showUncaughtError:function(){return!u[a("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:i,patchMethod:function(){return i},setNativePromise:function(e){s=e.resolve(0)}},j={parent:null,zone:new u(null,null)},M=null,Z=0;n("Zone","Zone"),e.Zone=u}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||e);var v=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}};Zone.__load_patch("ZoneAwarePromise",function(e,t,n){function r(e){return e&&e.then}function o(e){return e}function i(e){return j.reject(e)}function a(e,t){return function(n){try{c(e,t,n)}catch(t){c(e,!1,t)}}}function c(e,r,o){var i=E();if(e===o)throw new TypeError(O);if(e[g]===_){var l=null;try{typeof o!==x&&typeof o!==S||(l=o&&o.then)}catch(t){return i(function(){c(e,!1,t)})(),e}if(r!==w&&o instanceof j&&o.hasOwnProperty(g)&&o.hasOwnProperty(k)&&o[g]!==_)u(o),c(e,o[g],o[k]);else if(r!==w&&typeof l===S)try{l.apply(o,[i(a(e,r)),i(a(e,!1))])}catch(t){i(function(){c(e,!1,t)})()}else{e[g]=r;var f=e[k];e[k]=o,r===w&&o instanceof Error&&(o[D]=t.currentTask);for(var h=0;h<f.length;)s(e,f[h++],f[h++],f[h++],f[h++]);if(0==f.length&&r==w){e[g]=T;try{throw new Error("Uncaught (in promise): "+o+(o&&o.stack?"\n"+o.stack:""))}catch(r){var d=r;d.rejection=o,d.promise=e,d.zone=t.current,d.task=t.currentTask,p.push(d),n.scheduleMicroTask()}}}}return e}function u(e){if(e[g]===T){try{var n=t[P];n&&typeof n===S&&n.apply(this,[{rejection:e[k],promise:e}])}catch(e){}e[g]=w;for(var r=0;r<p.length;r++)e===p[r].promise&&p.splice(r,1)}}function s(e,t,n,r,a){u(e);var s=e[g]?typeof r===S?r:o:typeof a===S?a:i;t.scheduleMicroTask(m,function(){try{c(n,!0,t.run(s,void 0,[e[k]]))}catch(e){c(n,!1,e)}})}function l(e){var t=e.prototype,n=t.then;t[d]=n;var r=Object.getOwnPropertyDescriptor(e.prototype,"then");r&&!1===r.writable&&r.configurable&&Object.defineProperty(e.prototype,"then",{writable:!0}),e.prototype.then=function(e,t){var r=this;return new j(function(e,t){n.call(r,e,t)}).then(e,t)},e[I]=!0}var f=n.symbol,p=[],h=f("Promise"),d=f("then");n.onUnhandledError=function(e){if(n.showUncaughtError()){var t=e&&e.rejection;t?console.error("Unhandled Promise rejection:",t instanceof Error?t.message:t,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",t,t instanceof Error?t.stack:void 0):console.error(e)}},n.microtaskDrainDone=function(){for(;p.length;)for(var e=function(){var e=p.shift();try{e.zone.runGuarded(function(){throw e})}catch(e){!function(e){n.onUnhandledError(e);try{var r=t[y];r&&"function"==typeof r&&r.apply(this,[e])}catch(e){}}(e)}};p.length;)e()};var y=f("unhandledPromiseRejectionHandler"),g=f("state"),k=f("value"),m="Promise.then",_=null,b=!0,w=!1,T=0,E=function(){var e=!1;return function(t){return function(){e||(e=!0,t.apply(null,arguments))}}},O="Promise resolved with itself",x="object",S="function",D=f("currentTask"),P=f("rejectionHandledHandler"),j=function(){function e(t){if(!(this instanceof e))throw new Error("Must be an instanceof Promise.");this[g]=_,this[k]=[];try{t&&t(a(this,b),a(this,w))}catch(e){c(this,!1,e)}}return e.toString=function(){return"function ZoneAwarePromise() { [native code] }"},e.resolve=function(e){return c(new this(null),b,e)},e.reject=function(e){return c(new this(null),w,e)},e.race=function(e){function t(e){a&&(a=o(e))}function n(e){a&&(a=i(e))}var o,i,a=new this(function(e,t){n=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}([e,t],2),o=n[0],i=n[1];var n});try{for(var c=v(e),u=c.next();!u.done;u=c.next()){var s=u.value;r(s)||(s=this.resolve(s)),s.then(t,n)}}catch(e){l={error:e}}finally{try{u&&!u.done&&(f=c.return)&&f.call(c)}finally{if(l)throw l.error}}return a;var l,f},e.all=function(e){var t,n,o=new this(function(e,r){t=e,n=r}),i=0,a=[];try{for(var c=v(e),u=c.next();!u.done;u=c.next()){var s=u.value;r(s)||(s=this.resolve(s)),s.then(function(e){return function(n){a[e]=n,--i||t(a)}}(i),n),i++}}catch(e){l={error:e}}finally{try{u&&!u.done&&(f=c.return)&&f.call(c)}finally{if(l)throw l.error}}return i||t(a),o;var l,f},e.prototype.then=function(e,n){var r=new this.constructor(null),o=t.current;return this[g]==_?this[k].push(o,r,e,n):s(this,o,r,e,n),r},e.prototype.catch=function(e){return this.then(null,e)},e}();j.resolve=j.resolve,j.reject=j.reject,j.race=j.race,j.all=j.all;var M=e[h]=e.Promise,Z=t.__symbol__("ZoneAwarePromise"),z=Object.getOwnPropertyDescriptor(e,"Promise");z&&!z.configurable||(z&&delete z.writable,z&&delete z.value,z||(z={configurable:!0,enumerable:!0}),z.get=function(){return e[Z]?e[Z]:e[h]},z.set=function(t){t===j?e[Z]=t:(e[h]=t,t.prototype[d]||l(t),n.setNativePromise(t))},Object.defineProperty(e,"Promise",z)),e.Promise=j;var I=f("thenPatched");if(M){l(M);var C=e.fetch;typeof C==S&&(e.fetch=function(e){return function(){var t=e.apply(this,arguments);if(t instanceof j)return t;var n=t.constructor;return n[I]||l(n),t}}(C))}return Promise[t.__symbol__("uncaughtPromiseErrors")]=p,j});var y=Zone.__symbol__,g="object"==typeof window&&window||"object"==typeof self&&self||e,k="function",m="undefined",_="removeAttribute",b="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,w=!("nw"in g)&&void 0!==g.process&&"[object process]"==={}.toString.call(g.process),T=!w&&!b&&!("undefined"==typeof window||!window.HTMLElement),E=void 0!==g.process&&"[object process]"==={}.toString.call(g.process)&&!b&&!("undefined"==typeof window||!window.HTMLElement),O={},x=function(e){if(e=e||g.event){var t=O[e.type];t||(t=O[e.type]=y("ON_PROPERTY"+e.type));var n=(this||e.target||g)[t],r=n&&n.apply(this,arguments);return void 0==r||r||e.preventDefault(),r}},S=y("originalInstance"),D=!1,P=!1;Zone.__load_patch("toString",function(e,t,n){var r=t.__zone_symbol__originalToString=Function.prototype.toString,o=y("OriginalDelegate"),i=y("Promise"),a=y("Error");Function.prototype.toString=function(){if("function"==typeof this){var t=this[o];if(t)return"function"==typeof t?r.apply(this[o],arguments):Object.prototype.toString.call(t);if(this===Promise){var n=e[i];if(n)return r.apply(n,arguments)}if(this===Error){var c=e[a];if(c)return r.apply(c,arguments)}}return r.apply(this,arguments)};var c=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":c.apply(this,arguments)}});var j=function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},M=function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(j(arguments[t]));return e},Z="true",z="false",I={isUsingGlobalCallback:!0},C={},R={},L="name",H="function",F="object",B="__zone_symbol__",q=/^__zone_symbol__(\w+)(true|false)$/,N="__zone_symbol__propagationStopped",W=y("zoneTask"),X=Object[y("defineProperty")]=Object.defineProperty,A=Object[y("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,G=Object.create,U=y("unconfigurables"),J="undefined",V=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],Q=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],K=["load"],Y=["blur","error","focus","load","resize","scroll","messageerror"],$=["bounce","finish","start"],ee=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],te=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],ne=["close","error","open","message"],re=["error","message"],oe=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange"],V,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]),ie=y("unbound");Zone.__load_patch("util",function(e,t,n){n.patchOnProperties=o,n.patchMethod=a}),Zone.__load_patch("timers",function(e,t,n){l(e,"set","clear","Timeout"),l(e,"set","clear","Interval"),l(e,"set","clear","Immediate")}),Zone.__load_patch("requestAnimationFrame",function(e,t,n){l(e,"request","cancel","AnimationFrame"),l(e,"mozRequest","mozCancel","AnimationFrame"),l(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(e,t,n){for(var r=["alert","prompt","confirm"],o=0;o<r.length;o++)a(e,r[o],function(n,r,o){return function(r,i){return t.current.run(n,e,i,o)}})}),Zone.__load_patch("EventTarget",function(e,t,n){(function(e,t){!function(n,r){var o=e.Event;o&&o.prototype&&t.patchMethod(o.prototype,"stopImmediatePropagation",function(e){return function(e,t){e[N]=!0}})}()})(e,n),function(e,t){var n="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video",r="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),o=[],i=e.wtf,a=n.split(",");i?o=a.map(function(e){return"HTML"+e+"Element"}).concat(r):e.EventTarget?o.push("EventTarget"):o=r;for(var c=e.__Zone_disable_IE_check||!1,s=e.__Zone_enable_cross_context_check||!1,l=function(){if(D)return P;D=!0;try{var e=window.navigator.userAgent;return e.indexOf("MSIE "),-1===e.indexOf("MSIE ")&&-1===e.indexOf("Trident/")&&-1===e.indexOf("Edge/")||(P=!0),P}catch(e){}}(),f="[object FunctionWrapper]",p="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",h=0;h<oe.length;h++){var d=B+((m=oe[h])+z),v=B+(m+Z);C[m]={},C[m][z]=d,C[m][Z]=v}for(h=0;h<n.length;h++)for(var y=a[h],g=R[y]={},k=0;k<oe.length;k++){var m;g[m=oe[k]]=y+".addEventListener:"+m}var _=[];for(h=0;h<o.length;h++){var b=e[o[h]];_.push(b&&b.prototype)}u(e,_,{validateHandler:function(e,t,n,r){if(!c&&l)if(s)try{if((o=t.toString())===f||o==p)return e.apply(n,r),!1}catch(t){return e.apply(n,r),!1}else{var o;if((o=t.toString())===f||o==p)return e.apply(n,r),!1}else if(s)try{t.toString()}catch(t){return e.apply(n,r),!1}return!0}}),t.patchEventTarget=u}(e,n);var r=e.XMLHttpRequestEventTarget;r&&r.prototype&&n.patchEventTarget(e,[r.prototype]),i("MutationObserver"),i("WebKitMutationObserver"),i("IntersectionObserver"),i("FileReader")}),Zone.__load_patch("on_property",function(e,t,n){(function(e,t){if(!w||E){var n="undefined"!=typeof WebSocket;if(function(){if((T||E)&&!Object.getOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var e=Object.getOwnPropertyDescriptor(Element.prototype,"onclick");if(e&&!e.configurable)return!1}var t=Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype,"onreadystatechange");if(t){Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}});var n=!!(o=new XMLHttpRequest).onreadystatechange;return Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",t||{}),n}var r=y("fakeonreadystatechange");Object.defineProperty(XMLHttpRequest.prototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[r]},set:function(e){this[r]=e}});var o,i=function(){};(o=new XMLHttpRequest).onreadystatechange=i;n=o[r]===i;return o.onreadystatechange=null,n}()){var r=t.__Zone_ignore_on_properties;if(T){d(window,oe.concat(["messageerror"]),r,Object.getPrototypeOf(window)),d(Document.prototype,oe,r),void 0!==window.SVGElement&&d(window.SVGElement.prototype,oe,r),d(Element.prototype,oe,r),d(HTMLElement.prototype,oe,r),d(HTMLMediaElement.prototype,Q,r),d(HTMLFrameSetElement.prototype,V.concat(Y),r),d(HTMLBodyElement.prototype,V.concat(Y),r),d(HTMLFrameElement.prototype,K,r),d(HTMLIFrameElement.prototype,K,r);var a=window.HTMLMarqueeElement;a&&d(a.prototype,$,r);var c=window.Worker;c&&d(c.prototype,re,r)}d(XMLHttpRequest.prototype,ee,r);var s=t.XMLHttpRequestEventTarget;s&&d(s&&s.prototype,ee,r),"undefined"!=typeof IDBIndex&&(d(IDBIndex.prototype,te,r),d(IDBRequest.prototype,te,r),d(IDBOpenDBRequest.prototype,te,r),d(IDBDatabase.prototype,te,r),d(IDBTransaction.prototype,te,r),d(IDBCursor.prototype,te,r)),n&&d(WebSocket.prototype,ne,r)}else!function(){for(var e=function(e){var t=oe[e],n="on"+t;self.addEventListener(t,function(e){var t,r,o=e.target;for(r=o?o.constructor.name+"."+n:"unknown."+n;o;)o[n]&&!o[n][ie]&&((t=Zone.current.wrap(o[n],r))[ie]=o[n],o[n]=t),o=o.parentElement},!0)},t=0;t<oe.length;t++)e(t)}(),i("XMLHttpRequest"),n&&function(e,t){var n=t.WebSocket;t.EventTarget||u(t,[n.prototype]),t.WebSocket=function(e,t){var r,i,a=arguments.length>1?new n(e,t):new n(e),c=Object.getOwnPropertyDescriptor(a,"onmessage");return c&&!1===c.configurable?(r=Object.create(a),i=a,["addEventListener","removeEventListener","send","close"].forEach(function(e){r[e]=function(){var t=Array.prototype.slice.call(arguments);if("addEventListener"===e||"removeEventListener"===e){var n=t.length>0?t[0]:void 0;if(n){var o=Zone.__symbol__("ON_PROPERTY"+n);a[o]=r[o]}}return a[e].apply(a,t)}})):r=a,o(r,["close","error","message","open"],i),r};var r=t.WebSocket;for(var i in n)r[i]=n[i]}(0,t)}})(0,e),Object.defineProperty=function(e,t,n){if(f(e,t))throw new TypeError("Cannot assign to read only property '"+t+"' of "+e);var r=n.configurable;return"prototype"!==t&&(n=p(e,t,n)),h(e,t,n,r)},Object.defineProperties=function(e,t){return Object.keys(t).forEach(function(n){Object.defineProperty(e,n,t[n])}),e},Object.create=function(e,t){return"object"!=typeof t||Object.isFrozen(t)||Object.keys(t).forEach(function(n){t[n]=p(e,n,t[n])}),G(e,t)},Object.getOwnPropertyDescriptor=function(e,t){var n=A(e,t);return f(e,t)&&(n.configurable=!1),n},function(t){if((T||E)&&"registerElement"in e.document){var n=document.registerElement,r=["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"];document.registerElement=function(e,t){return t&&t.prototype&&r.forEach(function(e){var n="Document.registerElement::"+e;if(t.prototype.hasOwnProperty(e)){var r=Object.getOwnPropertyDescriptor(t.prototype,e);r&&r.value?(r.value=Zone.current.wrap(r.value,n),function(t,n,r){var o=r.configurable;h(t,e,r=p(t,e,r),o)}(t.prototype,0,r)):t.prototype[e]=Zone.current.wrap(t.prototype[e],n)}else t.prototype[e]&&(t.prototype[e]=Zone.current.wrap(t.prototype[e],n))}),n.apply(document,[e,t])},c(document.registerElement,n)}}()}),Zone.__load_patch("canvas",function(e,t,n){var r=e.HTMLCanvasElement;void 0!==r&&r.prototype&&r.prototype.toBlob&&function(e,t,n){function o(e){var t=e.data;return t.args[t.callbackIndex]=function(){e.invoke.apply(this,arguments)},i.apply(t.target,t.args),e}var i=null;i=a(r.prototype,"toBlob",function(e){return function(t,n){var r={name:"HTMLCanvasElement.toBlob",target:t,callbackIndex:0,args:n};return r.callbackIndex>=0&&"function"==typeof n[r.callbackIndex]?Zone.current.scheduleMacroTask(r.name,n[r.callbackIndex],r,o,null):e.apply(t,n)}})}()}),Zone.__load_patch("XHR",function(e,t,n){!function(e){function n(e){XMLHttpRequest[c]=!1;var t=e.data,n=t.target,o=n[i];h||(h=n[f],d=n[p]),o&&d.apply(n,[g,o]);var a=n[i]=function(){n.readyState===n.DONE&&!t.aborted&&XMLHttpRequest[c]&&e.state===k&&e.invoke()};return h.apply(n,[g,a]),n[r]||(n[r]=e),_.apply(n,t.args),XMLHttpRequest[c]=!0,e}function s(){}function l(e){var t=e.data;return t.aborted=!0,b.apply(t.target,t.args)}var f=y("addEventListener"),p=y("removeEventListener"),h=XMLHttpRequest.prototype[f],d=XMLHttpRequest.prototype[p];if(!h){var v=e.XMLHttpRequestEventTarget;v&&(h=v.prototype[f],d=v.prototype[p])}var g="readystatechange",k="scheduled",m=a(e.XMLHttpRequest.prototype,"open",function(){return function(e,t){return e[o]=0==t[2],e[u]=t[1],m.apply(e,t)}}),_=a(e.XMLHttpRequest.prototype,"send",function(){return function(e,r){var i=t.current;return e[o]?_.apply(e,r):i.scheduleMacroTask("XMLHttpRequest.send",s,{target:e,url:e[u],isPeriodic:!1,delay:null,args:r,aborted:!1},n,l)}}),b=a(e.XMLHttpRequest.prototype,"abort",function(e){return function(e,t){var n=e[r];if(n&&"string"==typeof n.type){if(null==n.cancelFn||n.data&&n.data.aborted)return;n.zone.cancelTask(n)}}})}(e);var r=y("xhrTask"),o=y("xhrSync"),i=y("xhrListener"),c=y("xhrScheduled"),u=y("xhrURL")}),Zone.__load_patch("geolocation",function(e,r,o){e.navigator&&e.navigator.geolocation&&function(e,r){for(var o=e.constructor.name,i=function(i){var a=r[i],u=e[a];if(u){if(!n(Object.getOwnPropertyDescriptor(e,a)))return"continue";e[a]=function(e){var n=function(){return e.apply(this,t(arguments,o+"."+a))};return c(n,e),n}(u)}},a=0;a<r.length;a++)i(a)}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(e,t,n){function r(t){return function(n){s(e,t).forEach(function(r){var o=e.PromiseRejectionEvent;if(o){var i=new o(t,{promise:n.promise,reason:n.rejection});r.invoke(i)}})}}e.PromiseRejectionEvent&&(t[y("unhandledPromiseRejectionHandler")]=r("unhandledrejection"),t[y("rejectionHandledHandler")]=r("rejectionhandled"))})}()}).call(t,n("fRUx"))},ewdp:function(e,t,n){var r=n("tose"),o=n("+pQw"),i=n("2Fuj");e.exports=n("V+0c")?Object.defineProperties:function(e,t){o(e);for(var n,a=i(t),c=a.length,u=0;c>u;)r.f(e,n=a[u++],t[n]);return e}},fC8q:function(e,t,n){var r=n("dXJ/"),o=n("3r0D")("iterator"),i=n("lexG");e.exports=n("b4gG").getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[r(e)]}},fHxy:function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=r.key,a=r.set;r.exp({defineMetadata:function(e,t,n,r){a(e,t,o(n),i(r))}})},fRUx:function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},gBtn:function(e,t,n){var r=n("ZI9W"),o=n("CDXM"),i=n("Iclu")("metadata"),a=i.store||(i.store=new(n("QZhw"))),c=function(e,t,n){var o=a.get(e);if(!o){if(!n)return;a.set(e,o=new r)}var i=o.get(t);if(!i){if(!n)return;o.set(t,i=new r)}return i};e.exports={store:a,map:c,has:function(e,t,n){var r=c(t,n,!1);return void 0!==r&&r.has(e)},get:function(e,t,n){var r=c(t,n,!1);return void 0===r?void 0:r.get(e)},set:function(e,t,n,r){c(n,r,!0).set(e,t)},keys:function(e,t){var n=c(e,t,!1),r=[];return n&&n.forEach(function(e,t){r.push(t)}),r},key:function(e){return void 0===e||"symbol"==typeof e?e:String(e)},exp:function(e){o(o.S,"Reflect",e)}}},gNkH:function(e,t,n){e.exports=!n("V+0c")&&!n("umMR")(function(){return 7!=Object.defineProperty(n("BQSv")("div"),"a",{get:function(){return 7}}).a})},gxdV:function(e,t,n){var r=n("tose"),o=n("piOq");e.exports=n("V+0c")?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},lexG:function(e,t){e.exports={}},lfBE:function(e,t,n){var r=n("ptrv"),o=n("gxdV"),i=n("rMsi"),a=n("c09d")("src"),c=Function.toString,u=(""+c).split("toString");n("b4gG").inspectSource=function(e){return c.call(e)},(e.exports=function(e,t,n,c){var s="function"==typeof n;s&&(i(n,"name")||o(n,"name",t)),e[t]!==n&&(s&&(i(n,a)||o(n,a,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=n:c?e[t]?e[t]=n:o(e,t,n):(delete e[t],o(e,t,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||c.call(this)})},lzDK:function(e,t){t.f=Object.getOwnPropertySymbols},ncNB:function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=r.get,a=r.key;r.exp({getOwnMetadata:function(e,t){return i(e,o(t),arguments.length<3?void 0:a(arguments[2]))}})},"p/bR":function(e,t,n){var r=n("pa70"),o=n("ULWX"),i=n("KpI+"),a=n("+pQw"),c=n("rppw"),u=n("fC8q"),s={},l={};(t=e.exports=function(e,t,n,f,p){var h,d,v,y,g=p?function(){return e}:u(e),k=r(n,f,t?2:1),m=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(h=c(e.length);h>m;m++)if((y=t?k(a(d=e[m])[0],d[1]):k(e[m]))===s||y===l)return y}else for(v=g.call(e);!(d=v.next()).done;)if((y=o(v,k,d.value,t))===s||y===l)return y}).BREAK=s,t.RETURN=l},pBmS:function(e,t,n){var r=n("lfBE");e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},pa70:function(e,t,n){var r=n("uNkO");e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},piOq:function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},ptrv:function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},rIdM:function(e,t,n){"use strict";var r=n("2Fuj"),o=n("lzDK"),i=n("9e9+"),a=n("RT4T"),c=n("Wo2w"),u=Object.assign;e.exports=!u||n("umMR")(function(){var e={},t={},n=Symbol();return e[n]=7,"abcdefghijklmnopqrst".split("").forEach(function(e){t[e]=e}),7!=u({},e)[n]||"abcdefghijklmnopqrst"!=Object.keys(u({},t)).join("")})?function(e,t){for(var n=a(e),u=arguments.length,s=1,l=o.f,f=i.f;u>s;)for(var p,h=c(arguments[s++]),d=l?r(h).concat(l(h)):r(h),v=d.length,y=0;v>y;)f.call(h,p=d[y++])&&(n[p]=h[p]);return n}:u},rKhO:function(e,t,n){var r=n("VceJ");e.exports=Array.isArray||function(e){return"Array"==r(e)}},rMsi:function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},rppw:function(e,t,n){var r=n("9wYb"),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},soMw:function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=r.keys,a=r.key;r.exp({getOwnMetadataKeys:function(e){return i(o(e),arguments.length<2?void 0:a(arguments[1]))}})},t6ta:function(e,t,n){var r=n("gBtn"),o=n("+pQw"),i=n("uNkO"),a=r.key,c=r.set;r.exp({metadata:function(e,t){return function(n,r){c(e,t,(void 0!==r?o:i)(n),a(r))}}})},tose:function(e,t,n){var r=n("+pQw"),o=n("gNkH"),i=n("A1WY"),a=Object.defineProperty;t.f=n("V+0c")?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},uNkO:function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},umMR:function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},vyV2:function(e,t,n){var r=n("+GRi"),o=n("rppw"),i=n("KM3d");e.exports=function(e){return function(t,n,a){var c,u=r(t),s=o(u.length),l=i(a,s);if(e&&n!=n){for(;s>l;)if((c=u[l++])!=c)return!0}else for(;s>l;l++)if((e||l in u)&&u[l]===n)return e||l||0;return!e&&-1}}},"w/BM":function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},xI8H:function(e,t,n){var r=n("c09d")("meta"),o=n("JXkd"),i=n("rMsi"),a=n("tose").f,c=0,u=Object.isExtensible||function(){return!0},s=!n("umMR")(function(){return u(Object.preventExtensions({}))}),l=function(e){a(e,r,{value:{i:"O"+ ++c,w:{}}})},f=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!u(e))return"F";if(!t)return"E";l(e)}return e[r].i},getWeak:function(e,t){if(!i(e,r)){if(!u(e))return!0;if(!t)return!1;l(e)}return e[r].w},onFreeze:function(e){return s&&f.NEED&&u(e)&&!i(e,r)&&l(e),e}}},yIWP:function(e,t,n){var r=n("Iclu")("keys"),o=n("c09d");e.exports=function(e){return r[e]||(r[e]=o(e))}}},[1]);
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.16e1d930cf13fb7a9563.woff b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.16e1d930cf13fb7a9563.woff
new file mode 100644
index 0000000..941dfa4
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.16e1d930cf13fb7a9563.woff
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.38861cba61c66739c145.ttf b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.38861cba61c66739c145.ttf
new file mode 100644
index 0000000..7b25f3c
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.38861cba61c66739c145.ttf
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.3d3a53586bd78d1069ae.svg b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.3d3a53586bd78d1069ae.svg
new file mode 100644
index 0000000..ed55c10
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.3d3a53586bd78d1069ae.svg
@@ -0,0 +1,308 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs >
+<font id="Roboto" horiz-adv-x="1157" ><font-face
+    font-family="Roboto"
+    units-per-em="2048"
+    panose-1="2 0 0 0 0 0 0 0 0 0"
+    ascent="1900"
+    descent="-500"
+    alphabetic="0" />
+<glyph unicode=" " horiz-adv-x="507" />
+<glyph unicode="!" horiz-adv-x="527" d="M347 411H180L167 1456H361L347 411ZM160 93Q160 138 187 168T269 199T351 169T379 93T351 19T269 -11T188 18T160 93Z" />
+<glyph unicode="&quot;" horiz-adv-x="655" d="M277 1400L247 1042H136L137 1536H277V1400ZM547 1400L517 1042H406L407 1536H547V1400Z" />
+<glyph unicode="#" horiz-adv-x="1261" d="M765 410H501L421 0H278L358 410H119V547H384L453 901H195V1040H480L562 1456H705L623 1040H887L969 1456H1113L1031 1040H1235V901H1004L935 547H1160V410H909L829 0H685L765 410ZM527 547H791L860 901H596L527 547Z" />
+<glyph unicode="$" horiz-adv-x="1150" d="M856 375Q856 467 792 530T574 644Q361 709 264 813T166 1079Q166 1243 261 1348T524 1473V1692H673V1472Q841 1449 934 1331T1028 1008H844Q844 1149 777 1232T596 1315Q477 1315 414 1254T351 1082Q351 980 417 920T636
+810T874 701T1000 562T1041 377Q1041 208 940 105T655 -17V-208H507V-17Q321 0 216 115T110 429H295Q295 290 368 215T575 140Q706 140 781 203T856 375Z" />
+<glyph unicode="%" horiz-adv-x="1500" d="M105 1176Q105 1307 188 1392T403 1477Q536 1477 618 1392T701 1170V1099Q701 967 618 884T405 800Q275 800 190 883T105 1106V1176ZM243 1099Q243 1021 287 971T405 920Q476 920 519 969T563 1103V1176Q563 1254 520
+1305T403 1356T286 1305T243 1172V1099ZM814 357Q814 488 897 572T1112 657T1327 573T1411 350V279Q1411 148 1328 64T1114 -21T899 62T814 285V357ZM952 279Q952 200 996 150T1114 99Q1186 99 1229 148T1272 283V357Q1272 436 1229 486T1112 536Q1041 536 997
+487T952 353V279ZM447 110L342 176L1053 1314L1158 1248L447 110Z" />
+<glyph unicode="&amp;" horiz-adv-x="1273" d="M101 391Q101 496 159 584T383 789Q286 907 253 979T220 1122Q220 1288 318 1382T584 1476Q734 1476 832 1389T930 1168Q930 1080 886 1006T730 849L623 770L947 383Q1015 513 1015 672H1182Q1182 417 1059 249L1267
+0H1045L948 115Q874 49 775 15T572 -20Q359 -20 230 93T101 391ZM572 131Q719 131 841 243L486 668L453 644Q286 521 286 391Q286 273 362 202T572 131ZM405 1128Q405 1032 523 888L641 971Q709 1019 734 1062T759 1168Q759 1235 709 1279T583 1324Q501 1324 453
+1269T405 1128Z" />
+<glyph unicode="&apos;" horiz-adv-x="357" d="M253 1425L232 1057H103L104 1536H253V1425Z" />
+<glyph unicode="(" horiz-adv-x="700" d="M133 591Q133 817 193 1025T374 1403T623 1643L661 1521Q515 1409 422 1179T319 664L318 579Q318 193 459 -91Q544 -261 661 -357L623 -470Q490 -396 369 -222Q133 118 133 591Z" />
+<glyph unicode=")" horiz-adv-x="712" d="M567 581Q567 358 509 154T330 -224T77 -470L38 -357Q192 -239 285 9T381 561V593Q381 803 337 983T215 1307T38 1530L77 1643Q209 1570 328 1399T507 1022T567 581Z" />
+<glyph unicode="*" horiz-adv-x="882" d="M330 983L28 1073L74 1224L376 1112L367 1456H520L510 1107L807 1217L853 1065L546 974L744 703L620 609L434 897L254 616L129 707L330 983Z" />
+<glyph unicode="+" horiz-adv-x="1161" d="M670 781H1076V606H670V146H484V606H78V781H484V1206H670V781Z" />
+<glyph unicode="," horiz-adv-x="402" d="M134 -290L29 -218Q123 -87 127 52V219H308V74Q308 -27 259 -128T134 -290Z" />
+<glyph unicode="-" horiz-adv-x="565" d="M525 543H37V694H525V543Z" />
+<glyph unicode="." horiz-adv-x="539" d="M144 97Q144 145 172 177T258 209T344 177T374 97Q374 51 345 20T258 -11T173 20T144 97Z" />
+<glyph unicode="/" horiz-adv-x="844" d="M177 -125H18L626 1456H784L177 -125Z" />
+<glyph unicode="0" horiz-adv-x="1150" d="M1034 621Q1034 296 923 138T576 -20Q343 -20 231 134T115 596V843Q115 1164 226 1320T574 1476Q809 1476 920 1326T1034 861V621ZM849 874Q849 1109 783 1216T574 1324Q432 1324 367 1217T300 888V592Q300 356 368 244T576
+131Q713 131 779 237T849 571V874Z" />
+<glyph unicode="1" horiz-adv-x="1150" d="M729 0H543V1233L170 1096V1264L700 1463H729V0Z" />
+<glyph unicode="2" horiz-adv-x="1150" d="M1075 0H121V133L625 693Q737 820 779 899T822 1064Q822 1178 753 1251T569 1324Q431 1324 355 1246T278 1027H93Q93 1228 222 1352T569 1476Q772 1476 890 1370T1008 1086Q1008 871 734 574L344 151H1075V0Z" />
+<glyph unicode="3" horiz-adv-x="1150" d="M390 818H529Q660 820 735 887T810 1068Q810 1324 555 1324Q435 1324 364 1256T292 1074H107Q107 1247 233 1361T555 1476Q761 1476 878 1367T995 1064Q995 969 934 880T766 747Q886 709 951 621T1017 406Q1017 210 889
+95T556 -20T223 91T94 384H280Q280 269 355 200T556 131Q690 131 761 201T832 402Q832 529 754 597T529 667H390V818Z" />
+<glyph unicode="4" horiz-adv-x="1150" d="M902 489H1104V338H902V0H716V338H53V447L705 1456H902V489ZM263 489H716V1203L694 1163L263 489Z" />
+<glyph unicode="5" horiz-adv-x="1150" d="M206 730L280 1456H1026V1285H437L393 888Q500 951 636 951Q835 951 952 820T1069 464Q1069 239 948 110T608 -20Q415 -20 293 87T154 383H329Q346 258 418 195T608 131Q737 131 810 219T884 462Q884 608 805 696T593
+785Q472 785 403 732L354 692L206 730Z" />
+<glyph unicode="6" horiz-adv-x="1150" d="M847 1457V1300H813Q597 1296 469 1172T321 823Q436 955 635 955Q825 955 938 821T1052 475Q1052 250 930 115T601 -20Q392 -20 262 140T132 554V625Q132 1027 303 1239T814 1457H847ZM604 801Q509 801 429 744T318 601V533Q318
+353 399 243T601 133Q726 133 797 225T869 466Q869 616 797 708T604 801Z" />
+<glyph unicode="7" horiz-adv-x="1150" d="M1061 1352L458 0H264L865 1304H77V1456H1061V1352Z" />
+<glyph unicode="8" horiz-adv-x="1150" d="M1004 1076Q1004 967 947 882T791 749Q905 700 971 606T1038 393Q1038 204 911 92T575 -20Q365 -20 239 92T112 393Q112 511 176 606T355 750Q258 798 202 883T146 1076Q146 1260 264 1368T575 1476Q767 1476 885 1368T1004
+1076ZM853 397Q853 519 776 596T573 673T373 597T297 397T370 202T575 131Q705 131 779 202T853 397ZM575 1324Q466 1324 399 1257T331 1073Q331 962 397 894T575 825T752 893T819 1073T750 1254T575 1324Z" />
+<glyph unicode="9" horiz-adv-x="1150" d="M830 640Q772 571 692 529T515 487Q389 487 296 549T151 723T100 972Q100 1118 155 1235T313 1414T551 1476Q767 1476 891 1315T1016 874V820Q1016 395 848 200T341 -1H305V155H344Q573 159 696 274T830 640ZM545 640Q638
+640 716 697T831 838V912Q831 1094 752 1208T552 1322Q430 1322 356 1229T282 982Q282 833 353 737T545 640Z" />
+<glyph unicode=":" horiz-adv-x="496" d="M390 97Q390 145 418 177T504 209T590 177T620 97Q620 51 591 20T504 -11T419 20T390 97ZM135 980Q135 1028 163 1060T249 1092T335 1060T365 980Q365 934 336 903T249 872T164 903T135 980Z" />
+<glyph unicode=";" horiz-adv-x="433" d="M111 980Q111 1028 139 1060T225 1092T311 1060T341 980Q341 934 312 903T225 872T140 903T111 980ZM146 -290L41 -218Q135 -87 139 52V219H320V74Q320 -27 271 -128T146 -290Z" />
+<glyph unicode="&lt;" horiz-adv-x="1041" d="M264 644L890 391V195L72 574V720L890 1098V902L264 644Z" />
+<glyph unicode="=" horiz-adv-x="1124" d="M986 814H152V975H986V814ZM986 399H152V559H986V399Z" />
+<glyph unicode="&gt;" horiz-adv-x="1070" d="M795 650L134 909V1099L988 721V575L134 196V388L795 650Z" />
+<glyph unicode="?" horiz-adv-x="967" d="M357 410Q359 529 384 598T486 751L617 886Q701 981 701 1090Q701 1195 646 1254T486 1314Q384 1314 322 1260T260 1115H75Q77 1277 190 1376T486 1476Q675 1476 780 1375T886 1096Q886 921 724 751L615 643Q542 562 542
+410H357ZM349 93Q349 138 376 168T458 199T540 169T568 93T540 19T458 -11T377 18T349 93Z" />
+<glyph unicode="@" horiz-adv-x="1839" d="M1738 502Q1726 260 1618 120T1329 -20Q1142 -20 1089 148Q1035 63 966 22T822 -20Q680 -20 607 96T553 417Q568 582 628 711T784 915T985 989Q1066 989 1130 968T1274 883L1222 329Q1203 98 1350 98Q1463 98 1533 210T1609
+502Q1628 891 1465 1095T967 1299Q766 1299 610 1200T364 912T263 478Q251 230 323 48T542 -231T899 -328Q989 -328 1079 -306T1230 -249L1267 -364Q1205 -403 1103 -428T895 -453Q645 -453 465 -341T196 -17T118 478Q130 753 241 972T542 1311T971 1431Q1220 1431
+1398 1319T1663 996T1738 502ZM712 417Q698 275 738 199T867 123Q927 123 982 174T1074 320L1075 329L1121 832Q1065 861 1001 861Q884 861 808 742T712 417Z" />
+<glyph unicode="A" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538Z" />
+<glyph unicode="B" horiz-adv-x="1275" d="M169 0V1456H645Q882 1456 1001 1358T1121 1068Q1121 966 1063 888T905 766Q1023 733 1091 641T1160 420Q1160 224 1033 112T674 0H169ZM361 681V157H678Q812 157 889 226T967 418Q967 681 681 681H361ZM361 835H651Q777
+835 852 898T928 1069Q928 1189 858 1243T645 1298H361V835Z" />
+<glyph unicode="C" horiz-adv-x="1333" d="M1240 462Q1213 231 1070 106T688 -20Q430 -20 275 165T119 660V800Q119 1003 191 1157T397 1393T705 1476Q937 1476 1077 1347T1240 988H1047Q1022 1162 939 1240T705 1318Q521 1318 417 1182T312 795V654Q312 417 411
+277T688 137Q848 137 933 209T1047 462H1240Z" />
+<glyph unicode="D" horiz-adv-x="1343" d="M169 0V1456H580Q770 1456 916 1372T1141 1133T1222 777V684Q1222 478 1143 323T916 85T572 0H169ZM361 1298V157H563Q785 157 908 295T1032 688V773Q1032 1021 916 1158T585 1298H361Z" />
+<glyph unicode="E" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673Z" />
+<glyph unicode="F" horiz-adv-x="1132" d="M972 643H361V0H169V1456H1071V1298H361V800H972V643Z" />
+<glyph unicode="G" horiz-adv-x="1395" d="M1244 191Q1170 85 1038 33T729 -20Q551 -20 413 63T200 301T122 658V785Q122 1114 275 1295T707 1476Q935 1476 1074 1360T1244 1029H1052Q998 1318 708 1318Q515 1318 416 1183T315 790V671Q315 426 427 282T730 137Q838
+137 919 161T1053 242V569H716V725H1244V191Z" />
+<glyph unicode="H" horiz-adv-x="1460" d="M1288 0H1095V673H361V0H169V1456H361V830H1095V1456H1288V0Z" />
+<glyph unicode="I" horiz-adv-x="557" d="M375 0H183V1456H375V0Z" />
+<glyph unicode="J" horiz-adv-x="1130" d="M779 1456H972V425Q972 216 847 98T512 -20Q295 -20 174 91T53 402H245Q245 277 313 207T512 137Q631 137 704 212T779 422V1456Z" />
+<glyph unicode="K" horiz-adv-x="1284" d="M539 677L361 492V0H169V1456H361V736L1008 1456H1240L667 813L1285 0H1055L539 677Z" />
+<glyph unicode="L" horiz-adv-x="1102" d="M362 157H1052V0H169V1456H362V157Z" />
+<glyph unicode="M" horiz-adv-x="1788" d="M417 1456L893 268L1369 1456H1618V0H1426V567L1444 1179L966 0H819L342 1176L361 567V0H169V1456H417Z" />
+<glyph unicode="N" horiz-adv-x="1460" d="M1288 0H1095L362 1122V0H169V1456H362L1097 329V1456H1288V0Z" />
+<glyph unicode="O" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521 1311
+417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775Z" />
+<glyph unicode="P" horiz-adv-x="1292" d="M361 570V0H169V1456H706Q945 1456 1080 1334T1216 1011Q1216 799 1084 685T704 570H361ZM361 727H706Q860 727 942 799T1024 1009Q1024 1139 942 1217T717 1298H361V727Z" />
+<glyph unicode="Q" horiz-adv-x="1408" d="M1281 681Q1281 470 1214 318T1026 79L1286 -125L1155 -246L848 -2Q776 -20 696 -20Q524 -20 391 64T185 305T109 668V773Q109 983 182 1144T388 1390T694 1476Q870 1476 1003 1391T1209 1147T1281 774V681ZM1089 775Q1089
+1032 987 1171T694 1311Q513 1311 409 1173T301 788V681Q301 431 405 287T696 143T984 278T1089 667V775Z" />
+<glyph unicode="R" horiz-adv-x="1261" d="M703 589H361V0H168V1456H650Q896 1456 1028 1344T1161 1018Q1161 882 1088 781T883 630L1225 12V0H1019L703 589ZM361 746H656Q799 746 883 820T968 1018Q968 1153 888 1225T655 1298H361V746Z" />
+<glyph unicode="S" horiz-adv-x="1215" d="M598 649Q351 720 239 823T126 1079Q126 1251 263 1363T621 1476Q771 1476 888 1418T1070 1258T1135 1035H942Q942 1167 858 1242T621 1318Q479 1318 400 1256T320 1082Q320 993 395 932T652 819T936 707T1088 563T1138
+370Q1138 193 1000 87T631 -20Q481 -20 351 37T151 195T80 422H273Q273 290 370 214T631 137Q783 137 864 199T945 368T870 533T598 649Z" />
+<glyph unicode="T" horiz-adv-x="1222" d="M1175 1298H707V0H516V1298H49V1456H1175V1298Z" />
+<glyph unicode="U" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194Z" />
+<glyph unicode="V" horiz-adv-x="1303" d="M651 255L1067 1456H1277L737 0H567L28 1456H237L651 255Z" />
+<glyph unicode="W" horiz-adv-x="1817" d="M483 459L511 267L552 440L840 1456H1002L1283 440L1323 264L1354 460L1580 1456H1773L1420 0H1245L945 1061L922 1172L899 1061L588 0H413L61 1456H253L483 459Z" />
+<glyph unicode="X" horiz-adv-x="1284" d="M644 898L993 1456H1219L759 734L1230 0H1002L644 568L284 0H57L529 734L68 1456H293L644 898Z" />
+<glyph unicode="Y" horiz-adv-x="1230" d="M613 725L993 1456H1211L709 543V0H517V543L15 1456H235L613 725Z" />
+<glyph unicode="Z" horiz-adv-x="1226" d="M313 157H1146V0H86V144L884 1298H99V1456H1114V1315L313 157Z" />
+<glyph unicode="[" horiz-adv-x="543" d="M523 1512H332V-160H523V-312H146V1664H523V1512Z" />
+<glyph unicode="\" horiz-adv-x="840" d="M40 1456H216L824 -125H648L40 1456Z" />
+<glyph unicode="]" horiz-adv-x="543" d="M9 1664H387V-312H9V-160H202V1512H9V1664Z" />
+<glyph unicode="^" horiz-adv-x="856" d="M426 1211L236 729H64L363 1456H490L788 729H617L426 1211Z" />
+<glyph unicode="_" horiz-adv-x="924" d="M920 -151H4V0H920V-151Z" />
+<glyph unicode="`" horiz-adv-x="633" d="M474 1240H315L57 1534H280L474 1240Z" />
+<glyph unicode="a" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141Z" />
+<glyph unicode="b" horiz-adv-x="1149" d="M1056 529Q1056 281 942 131T636 -20Q431 -20 319 125L310 0H140V1536H325V963Q437 1102 634 1102T943 953T1056 545V529ZM871 550Q871 739 798 842T588 945Q405 945 325 775V307Q410 137 590 137Q723 137 797 240T871 550Z" />
+<glyph unicode="c" horiz-adv-x="1072" d="M574 131Q673 131 747 191T829 341H1004Q999 248 940 164T783 30T574 -20Q353 -20 223 127T92 531V562Q92 720 150 843T316 1034T573 1102Q755 1102 875 993T1004 710H829Q821 815 750 882T573 950Q432 950 355 849T277
+555V520Q277 333 354 232T574 131Z" />
+<glyph unicode="d" horiz-adv-x="1155" d="M95 550Q95 799 213 950T522 1102Q712 1102 823 972V1536H1008V0H838L829 116Q718 -20 520 -20Q332 -20 214 134T95 536V550ZM280 529Q280 345 356 241T566 137Q742 137 823 295V792Q740 945 568 945Q432 945 356 840T280 529Z" />
+<glyph unicode="e" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378 869T284
+640H826V654Q818 795 750 872T566 950Z" />
+<glyph unicode="f" horiz-adv-x="711" d="M231 0V939H60V1082H231V1193Q231 1367 324 1462T587 1557Q651 1557 714 1540L704 1390Q657 1399 604 1399Q514 1399 465 1347T416 1196V1082H647V939H416V0H231Z" />
+<glyph unicode="g" horiz-adv-x="1149" d="M96 550Q96 803 213 952T523 1102Q721 1102 832 962L841 1082H1010V26Q1010 -184 886 -305T551 -426Q434 -426 322 -376T151 -239L247 -128Q366 -275 538 -275Q673 -275 748 -199T824 15V108Q713 -20 521 -20Q331 -20
+214 133T96 550ZM282 529Q282 346 357 242T567 137Q742 137 824 296V790Q739 945 569 945Q434 945 358 840T282 529Z" />
+<glyph unicode="h" horiz-adv-x="1128" d="M325 951Q448 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1536H325V951Z" />
+<glyph unicode="i" horiz-adv-x="497" d="M341 0H156V1082H341V0ZM141 1369Q141 1414 168 1445T250 1476T332 1445T360 1369T332 1294T250 1264T169 1294T141 1369Z" />
+<glyph unicode="j" horiz-adv-x="489" d="M331 1082V-125Q331 -437 48 -437Q-13 -437 -65 -419V-271Q-33 -279 19 -279Q81 -279 113 -246T146 -129V1082H331ZM127 1369Q127 1413 154 1444T235 1476Q289 1476 317 1445T345 1369T317 1294T235 1264T154 1294T127 1369Z" />
+<glyph unicode="k" horiz-adv-x="1038" d="M442 501L326 380V0H141V1536H326V607L425 726L762 1082H987L566 630L1036 0H819L442 501Z" />
+<glyph unicode="l" horiz-adv-x="497" d="M341 0H156V1536H341V0Z" />
+<glyph unicode="m" horiz-adv-x="1795" d="M314 1082L319 962Q438 1102 640 1102Q867 1102 949 928Q1003 1006 1089 1054T1294 1102Q1650 1102 1656 725V0H1471V714Q1471 830 1418 887T1240 945Q1137 945 1069 884T990 718V0H804V709Q804 945 573 945Q391 945
+324 790V0H139V1082H314Z" />
+<glyph unicode="n" horiz-adv-x="1130" d="M315 1082L321 946Q445 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1082H315Z" />
+<glyph unicode="o" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729 807
+839T582 950Q445 950 361 841T277 529Z" />
+<glyph unicode="p" horiz-adv-x="1149" d="M1054 529Q1054 282 941 131T635 -20Q438 -20 325 105V-416H140V1082H309L318 962Q431 1102 632 1102Q827 1102 940 955T1054 546V529ZM869 550Q869 733 791 839T577 945Q409 945 325 796V279Q408 131 579 131Q712 131
+790 236T869 550Z" />
+<glyph unicode="q" horiz-adv-x="1164" d="M95 550Q95 805 212 953T526 1102Q718 1102 829 973L837 1082H1007V-416H822V100Q710 -20 524 -20Q328 -20 212 132T95 537V550ZM280 529Q280 343 358 237T570 131Q735 131 822 277V807Q734 950 572 950Q438 950 359
+844T280 529Z" />
+<glyph unicode="r" horiz-adv-x="693" d="M663 916Q621 923 572 923Q390 923 325 768V0H140V1082H320L323 957Q414 1102 581 1102Q635 1102 663 1088V916Z" />
+<glyph unicode="s" horiz-adv-x="1056" d="M770 287Q770 362 714 403T517 475T294 547T172 647T132 785Q132 918 244 1010T532 1102Q716 1102 830 1007T945 764H759Q759 840 695 895T532 950Q431 950 374 906T317 791Q317 724 370 690T561 625T786 551T913 448T955
+300Q955 155 839 68T538 -20Q408 -20 308 26T152 154T95 333H280Q285 240 354 186T538 131Q643 131 706 173T770 287Z" />
+<glyph unicode="t" horiz-adv-x="669" d="M391 1344V1082H593V939H391V268Q391 203 418 171T510 138Q542 138 598 150V0Q525 -20 456 -20Q332 -20 269 55T206 268V939H9V1082H206V1344H391Z" />
+<glyph unicode="u" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107Z" />
+<glyph unicode="v" horiz-adv-x="992" d="M497 251L765 1082H954L566 0H425L33 1082H222L497 251Z" />
+<glyph unicode="w" horiz-adv-x="1539" d="M1098 255L1306 1082H1491L1176 0H1026L763 820L507 0H357L43 1082H227L440 272L692 1082H841L1098 255Z" />
+<glyph unicode="x" horiz-adv-x="1015" d="M503 687L743 1082H959L605 547L970 0H756L506 405L256 0H41L406 547L52 1082H266L503 687Z" />
+<glyph unicode="y" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271Z" />
+<glyph unicode="z" horiz-adv-x="1015" d="M314 151H947V0H88V136L685 929H97V1082H917V951L314 151Z" />
+<glyph unicode="{" horiz-adv-x="693" d="M632 -366Q455 -316 366 -202T276 101V300Q276 543 64 543V688Q276 688 276 930V1138Q278 1321 365 1433T632 1597L670 1482Q461 1415 461 1133V931Q461 704 294 615Q461 525 461 296V90Q464 -185 670 -251L632 -366Z" />
+<glyph unicode="|" horiz-adv-x="499" d="M324 -270H175V1456H324V-270Z" />
+<glyph unicode="}" horiz-adv-x="693" d="M19 -251Q222 -186 229 80V300Q229 531 410 615Q229 697 229 930V1133Q229 1415 20 1482L58 1597Q235 1547 324 1435T414 1137V927Q414 688 626 688V543Q414 543 414 300V98Q414 -90 324 -203T58 -366L19 -251Z" />
+<glyph unicode="~" horiz-adv-x="1393" d="M1263 777Q1263 619 1170 511T939 402Q867 402 803 428T655 529T533 621T454 639Q376 639 334 586T292 438L131 436Q131 596 223 699T454 802Q530 802 600 770T758 658T910 567L939 565Q1015 565 1062 623T1110 776L1263 777Z" />
+<glyph unicode="&#xa0;" horiz-adv-x="507" />
+<glyph unicode="&#xa1;" horiz-adv-x="499" d="M170 684H338L351 -360H157L170 684ZM358 996Q358 951 331 920T249 889T167 920T139 996T167 1071T249 1101T330 1071T358 996Z" />
+<glyph unicode="&#xa2;" horiz-adv-x="1120" d="M586 131Q686 131 760 191T842 341H1017Q1011 215 912 115T669 -12V-245H484V-11Q305 23 205 165T105 527V562Q105 774 206 916T484 1092V1318H669V1095Q819 1072 915 966T1017 710H842Q834 815 763 882T586 950Q445
+950 368 849T290 555V520Q290 333 367 232T586 131Z" />
+<glyph unicode="&#xa3;" horiz-adv-x="1190" d="M449 622L457 402Q457 248 395 157H1128L1127 0H95V157H172Q212 166 237 231T264 393V401L256 622H91V779H251L242 1039Q242 1238 364 1357T687 1476Q877 1476 988 1370T1099 1087H908Q908 1194 845 1256T670 1318Q565
+1318 500 1241T435 1039L444 779H763V622H449Z" />
+<glyph unicode="&#xa4;" horiz-adv-x="1460" d="M1103 112Q944 -20 735 -20Q528 -20 369 110L235 -26L105 109L244 250Q140 406 140 608Q140 814 252 977L105 1128L235 1264L382 1114Q540 1234 735 1234Q931 1234 1090 1113L1239 1265L1371 1128L1220 974Q1330
+811 1330 608Q1330 412 1228 253L1371 109L1239 -27L1103 112ZM311 608Q311 485 368 379T524 212T735 151T946 212T1100 379T1157 608Q1157 730 1101 835T946 1001T735 1062Q622 1062 524 1002T369 836T311 608Z" />
+<glyph unicode="&#xa5;" horiz-adv-x="1240" d="M614 782L978 1456H1197L779 736H1091V611H707V446H1091V322H707V0H514V322H136V446H514V611H136V736H449L31 1456H251L614 782Z" />
+<glyph unicode="&#xa6;" horiz-adv-x="491" d="M147 -270V521H333V-270H147ZM333 698H147V1456H333V698Z" />
+<glyph unicode="&#xa7;" horiz-adv-x="1256" d="M1145 431Q1145 242 959 157Q1028 108 1064 40T1100 -128Q1100 -296 970 -395T612 -495Q500 -495 400 -467T229 -382Q90 -269 90 -64L276 -62Q276 -192 366 -267T612 -343Q748 -343 831 -285T914 -130Q914 -41 843
+11T563 126Q381 174 285 229T143 362T96 551Q96 737 278 825Q212 874 177 942T141 1110Q141 1276 274 1376T630 1476Q862 1476 992 1363T1122 1045H937Q937 1170 853 1247T630 1325Q488 1325 408 1268T327 1112Q327 1043 355 1003T450 931T661 858T889 782T1030
+698T1116 585T1145 431ZM602 691Q512 715 437 742Q357 723 320 673T282 553Q282 483 309 443T402 370T611 296T797 238Q875 258 917 308T959 428Q959 516 890 570T602 691Z" />
+<glyph unicode="&#xa8;" horiz-adv-x="856" d="M102 1371Q102 1416 129 1446T211 1477T293 1447T321 1371T293 1296T211 1266T130 1296T102 1371ZM532 1369Q532 1414 559 1445T641 1476T723 1445T751 1369T723 1294T641 1264T560 1294T532 1369Z" />
+<glyph unicode="&#xa9;" horiz-adv-x="1609" d="M1119 597Q1119 444 1033 364T788 283Q631 283 537 388T442 676V786Q442 962 537 1067T788 1173Q948 1173 1034 1091T1120 860H974Q974 959 927 1001T788 1044Q694 1044 640 975T586 783V670Q586 550 640 481T788
+412Q880 412 926 454T973 597H1119ZM206 729Q206 557 286 411T503 181T801 98T1098 181T1315 410T1395 729Q1395 899 1316 1044T1100 1272T801 1356Q641 1356 503 1274T286 1045T206 729ZM91 729Q91 931 184 1104T443 1376T801 1476T1158 1377T1416 1104T1510 729Q1510
+532 1420 360T1165 84T801 -21Q604 -21 439 82T182 358T91 729Z" />
+<glyph unicode="&#xaa;" horiz-adv-x="915" d="M618 705Q606 739 600 777Q524 691 396 691Q277 691 212 753T147 918Q147 1029 230 1089T486 1149H594V1201Q594 1336 470 1336Q401 1336 362 1309T322 1231L161 1243Q161 1346 247 1411T470 1476Q603 1476 680 1405T757
+1199V883Q757 786 783 705H618ZM435 828Q478 828 522 848T594 895V1037H482Q399 1036 355 1005T310 922Q310 828 435 828Z" />
+<glyph unicode="&#xab;" horiz-adv-x="961" d="M536 804L794 407H653L358 795V814L653 1203H794L536 804ZM610 548L868 151H727L432 539V558L727 947H868L610 548Z" />
+<glyph unicode="&#xac;" horiz-adv-x="1134" d="M958 375H772V639H127V800H958V375Z" />
+<glyph unicode="&#xad;" horiz-adv-x="565" d="M525 543H37V694H525V543Z" />
+<glyph unicode="&#xae;" horiz-adv-x="1610" d="M90 729Q90 931 183 1104T442 1376T800 1476T1157 1377T1415 1104T1509 729Q1509 532 1419 360T1164 84T800 -21Q603 -21 438 82T181 358T90 729ZM205 729Q205 557 285 411T502 181T800 98Q961 98 1099 182T1315
+412T1394 729Q1394 900 1316 1044T1099 1272T800 1356Q640 1356 502 1274T285 1045T205 729ZM653 654V316H512V1165H788Q941 1165 1025 1100T1110 909Q1110 786 982 721Q1104 671 1105 517V456Q1105 370 1122 332V316H977Q963 352 963 444T960 554Q944 650 829
+654H653ZM653 782H809Q881 784 925 817T969 904Q969 977 930 1007T791 1038H653V782Z" />
+<glyph unicode="&#xaf;" horiz-adv-x="938" d="M834 1313H120V1456H834V1313Z" />
+<glyph unicode="&#xb0;" horiz-adv-x="765" d="M130 1216Q130 1320 204 1398T385 1476Q489 1476 562 1399T636 1216Q636 1110 563 1035T385 960Q280 960 205 1035T130 1216ZM385 1088Q439 1088 476 1123T513 1216Q513 1274 476 1311T385 1349Q330 1349 293 1310T255
+1216T292 1125T385 1088Z" />
+<glyph unicode="&#xb1;" horiz-adv-x="1094" d="M649 854H1013V703H649V289H482V703H97V854H482V1267H649V854ZM970 0H135V152H970V0Z" />
+<glyph unicode="&#xb2;" horiz-adv-x="751" d="M683 667H84V775L384 1057Q493 1159 493 1228Q493 1277 461 1307T369 1338Q294 1338 259 1300T223 1205H66Q66 1319 149 1393T365 1467T574 1404T651 1230Q651 1126 544 1019L460 940L284 795H683V667Z" />
+<glyph unicode="&#xb3;" horiz-adv-x="751" d="M265 1125H349Q423 1125 459 1155T495 1234Q495 1279 464 1308T362 1337Q305 1337 268 1312T230 1245H73Q73 1343 154 1404T360 1466Q497 1466 575 1406T653 1241Q653 1186 618 1141T517 1070Q666 1029 666 886Q666
+780 581 718T360 655Q228 655 145 718T62 888H220Q220 843 259 813T366 783Q436 783 472 813T509 894Q509 1007 353 1009H265V1125Z" />
+<glyph unicode="&#xb4;" horiz-adv-x="642" d="M316 1534H540L272 1240H123L316 1534Z" />
+<glyph unicode="&#xb5;" horiz-adv-x="1160" d="M339 1082V449Q340 286 391 208T559 130Q758 130 820 282V1082H1006V0H839L830 115Q737 -20 567 -20Q420 -20 339 53V-416H154V1082H339Z" />
+<glyph unicode="&#xb6;" horiz-adv-x="1001" d="M646 0V520H562Q332 520 200 647T67 988Q67 1201 200 1328T563 1456H832V0H646Z" />
+<glyph unicode="&#xb7;" horiz-adv-x="534" d="M147 729Q147 777 175 809T261 841T347 809T377 729Q377 682 348 651T261 619T176 650T147 729Z" />
+<glyph unicode="&#xb8;" horiz-adv-x="507" d="M285 0L273 -52Q426 -79 426 -225Q426 -322 346 -378T123 -435L116 -328Q195 -328 238 -302T282 -229Q282 -185 250 -164T120 -134L152 0H285Z" />
+<glyph unicode="&#xb9;" horiz-adv-x="751" d="M495 674H338V1275L122 1218V1346L477 1463H495V674Z" />
+<glyph unicode="&#xba;" horiz-adv-x="931" d="M122 1123Q122 1281 216 1378T464 1476Q619 1476 713 1380T807 1117V1043Q807 884 714 787T466 690T217 787T122 1049V1123ZM285 1043Q285 943 333 886T466 829Q549 829 596 886T644 1045V1123Q644 1222 596 1279T464
+1336Q383 1336 335 1281T285 1129V1043Z" />
+<glyph unicode="&#xbb;" horiz-adv-x="960" d="M244 949L539 560V541L244 152H102L360 550L102 949H244ZM593 949L888 560V541L593 152H451L709 550L451 949H593Z" />
+<glyph unicode="&#xbc;" horiz-adv-x="1500" d="M458 664H301V1265L85 1208V1336L440 1453H458V664ZM443 118L339 184L1050 1322L1154 1256L443 118ZM1318 299H1425V169H1318V0H1161V169H786L780 271L1157 789H1318V299ZM938 299H1161V588L1144 560L938 299Z" />
+<glyph unicode="&#xbd;" horiz-adv-x="1589" d="M399 118L295 184L1006 1322L1110 1256L399 118ZM453 664H296V1265L80 1208V1336L435 1453H453V664ZM1481 0H882V108L1182 390Q1291 492 1291 561Q1291 610 1259 640T1167 671Q1092 671 1057 633T1021 538H864Q864
+652 947 726T1163 800T1372 737T1449 563Q1449 459 1342 352L1258 273L1082 128H1481V0Z" />
+<glyph unicode="&#xbe;" horiz-adv-x="1593" d="M570 118L466 184L1177 1322L1281 1256L570 118ZM1410 299H1517V169H1410V0H1253V169H878L872 271L1249 789H1410V299ZM1030 299H1253V588L1236 560L1030 299ZM314 1126H398Q472 1126 508 1156T544 1235Q544 1280
+513 1309T411 1338Q354 1338 317 1313T279 1246H122Q122 1344 203 1405T409 1467Q546 1467 624 1407T702 1242Q702 1187 667 1142T566 1071Q715 1030 715 887Q715 781 630 719T409 656Q277 656 194 719T111 889H269Q269 844 308 814T415 784Q485 784 521 814T558
+895Q558 1008 402 1010H314V1126Z" />
+<glyph unicode="&#xbf;" horiz-adv-x="969" d="M588 680Q587 574 567 511T498 388T358 233T255 37L253 0Q253 -109 311 -166T478 -224Q578 -224 640 -168T703 -20H888Q886 -181 774 -283T478 -385Q282 -385 175 -285T68 -5Q68 168 228 343L337 456Q403 534 403
+680H588ZM596 997Q596 952 569 921T487 890T405 921T377 997Q377 1041 405 1071T487 1101T568 1071T596 997Z" />
+<glyph unicode="&#xc0;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM778 1550H619L361 1844H584L778 1550Z" />
+<glyph unicode="&#xc1;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM763 1844H987L719 1550H570L763 1844Z" />
+<glyph unicode="&#xc2;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM975 1572V1562H822L672 1732L523 1562H370V1574L616 1846H728L975 1572Z" />
+<glyph unicode="&#xc3;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM1027 1814Q1027 1706 966 1639T812 1572Q771 1572 741 1582T663 1623T593 1660T543 1667Q502 1667 473 1636T444 1555L320
+1562Q320 1669 380 1739T534 1809Q569 1809 597 1799T673 1760T746 1722T803 1713Q846 1713 874 1747T903 1826L1027 1814Z" />
+<glyph unicode="&#xc4;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM351 1681Q351 1726 378 1756T460 1787T542 1757T570 1681T542 1606T460 1576T379 1606T351 1681ZM781 1679Q781 1724
+808 1755T890 1786T972 1755T1000 1679T972 1604T890 1574T809 1604T781 1679Z" />
+<glyph unicode="&#xc5;" horiz-adv-x="1336" d="M973 380H363L226 0H28L584 1456H752L1309 0H1112L973 380ZM421 538H916L668 1219L421 538ZM887 1729Q887 1642 825 1584T672 1525Q580 1525 519 1584T457 1729T518 1876T672 1937T825 1876T887 1729ZM556 1729Q556
+1682 589 1648T672 1614Q720 1614 754 1647T788 1729T755 1812T672 1847Q622 1847 589 1812T556 1729Z" />
+<glyph unicode="&#xc6;" horiz-adv-x="1914" d="M1879 0H996L981 353H417L212 0H-14L866 1456H1817V1304H1126L1146 833H1736V682H1152L1174 151H1879V0ZM518 527H974L943 1260L518 527Z" />
+<glyph unicode="&#xc7;" horiz-adv-x="1333" d="M1240 462Q1213 231 1070 106T688 -20Q430 -20 275 165T119 660V800Q119 1003 191 1157T397 1393T705 1476Q937 1476 1077 1347T1240 988H1047Q1022 1162 939 1240T705 1318Q521 1318 417 1182T312 795V654Q312
+417 411 277T688 137Q848 137 933 209T1047 462H1240ZM751 -9L739 -61Q892 -88 892 -234Q892 -331 812 -387T589 -444L582 -337Q661 -337 704 -311T748 -238Q748 -194 716 -173T586 -143L618 -9H751Z" />
+<glyph unicode="&#xc8;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM725 1562H566L308 1856H531L725 1562Z" />
+<glyph unicode="&#xc9;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM710 1856H934L666 1562H517L710 1856Z" />
+<glyph unicode="&#xca;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM922 1584V1574H769L619 1744L470 1574H317V1586L563 1858H675L922 1584Z" />
+<glyph unicode="&#xcb;" horiz-adv-x="1164" d="M992 673H361V157H1094V0H169V1456H1084V1298H361V830H992V673ZM298 1693Q298 1738 325 1768T407 1799T489 1769T517 1693T489 1618T407 1588T326 1618T298 1693ZM728 1691Q728 1736 755 1767T837 1798T919 1767T947
+1691T919 1616T837 1586T756 1616T728 1691Z" />
+<glyph unicode="&#xcc;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM385 1562H226L-32 1856H191L385 1562Z" />
+<glyph unicode="&#xcd;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM369 1856H593L325 1562H176L369 1856Z" />
+<glyph unicode="&#xce;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM582 1584V1574H429L279 1744L130 1574H-23V1586L223 1858H335L582 1584Z" />
+<glyph unicode="&#xcf;" horiz-adv-x="557" d="M375 0H183V1456H375V0ZM-42 1693Q-42 1738 -15 1768T67 1799T149 1769T177 1693T149 1618T67 1588T-14 1618T-42 1693ZM388 1691Q388 1736 415 1767T497 1798T579 1767T607 1691T579 1616T497 1586T416 1616T388 1691Z" />
+<glyph unicode="&#xd0;" horiz-adv-x="1373" d="M199 0V666H37V817H199V1456H610Q800 1456 946 1372T1171 1133T1252 777V684Q1252 478 1173 323T946 85T602 0H199ZM673 666H391V157H592Q814 157 937 294T1062 680V773Q1062 1021 946 1158T615 1298H391V817H673V666Z" />
+<glyph unicode="&#xd1;" horiz-adv-x="1460" d="M1288 0H1095L362 1122V0H169V1456H362L1097 329V1456H1288V0ZM1081 1814Q1081 1706 1020 1639T866 1572Q825 1572 795 1582T717 1623T647 1660T597 1667Q556 1667 527 1636T498 1555L374 1562Q374 1669 434 1739T588
+1809Q623 1809 651 1799T727 1760T800 1722T857 1713Q900 1713 928 1747T957 1826L1081 1814Z" />
+<glyph unicode="&#xd2;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
+1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM812 1552H653L395 1846H618L812 1552Z" />
+<glyph unicode="&#xd3;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
+1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM797 1846H1021L753 1552H604L797 1846Z" />
+<glyph unicode="&#xd4;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
+1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM1009 1574V1564H856L706 1734L557 1564H404V1576L650 1848H762L1009 1574Z" />
+<glyph unicode="&#xd5;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
+1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM1061 1816Q1061 1708 1000 1641T846 1574Q805 1574 775 1584T697 1625T627 1662T577 1669Q536 1669 507 1638T478 1557L354 1564Q354 1671 414 1741T568 1811Q603 1811 631 1801T707
+1762T780 1724T837 1715Q880 1715 908 1749T937 1828L1061 1816Z" />
+<glyph unicode="&#xd6;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q533 -20 400 64T194 305T118 668V773Q118 983 191 1144T397 1390T703 1476Q878 1476 1011 1392T1217 1147T1289 773V681ZM1098 775Q1098 1034 994 1172T703 1311Q521
+1311 417 1173T309 788V681Q309 430 414 287T705 143Q891 143 993 278T1098 667V775ZM385 1683Q385 1728 412 1758T494 1789T576 1759T604 1683T576 1608T494 1578T413 1608T385 1683ZM815 1681Q815 1726 842 1757T924 1788T1006 1757T1034 1681T1006 1606T924
+1576T843 1606T815 1681Z" />
+<glyph unicode="&#xd7;" horiz-adv-x="1092" d="M89 329L419 665L91 1000L210 1123L539 788L868 1123L987 1000L659 665L989 329L870 206L539 543L208 206L89 329Z" />
+<glyph unicode="&#xd8;" horiz-adv-x="1408" d="M1289 681Q1289 467 1217 308T1013 64T705 -20Q534 -20 403 62L306 -93H164L308 138Q118 330 118 690V773Q118 983 191 1144T397 1390T703 1476Q917 1476 1065 1351L1168 1516H1309L1150 1261Q1287 1074 1289 780V681ZM309
+681Q309 437 407 296L971 1200Q869 1311 703 1311Q521 1311 417 1173T309 788V681ZM1098 775Q1098 957 1042 1088L493 207Q584 143 705 143Q891 143 993 278T1098 667V775Z" />
+<glyph unicode="&#xd9;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM773 1550H614L356 1844H579L773 1550Z" />
+<glyph unicode="&#xda;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM758 1844H982L714 1550H565L758 1844Z" />
+<glyph unicode="&#xdb;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM970 1572V1562H817L667 1732L518 1562H365V1574L611
+1846H723L970 1572Z" />
+<glyph unicode="&#xdc;" horiz-adv-x="1328" d="M1194 1456V466Q1193 260 1065 129T716 -18L665 -20Q426 -20 284 109T140 464V1456H330V470Q330 312 417 225T665 137Q828 137 914 224T1001 469V1456H1194ZM346 1681Q346 1726 373 1756T455 1787T537 1757T565
+1681T537 1606T455 1576T374 1606T346 1681ZM776 1679Q776 1724 803 1755T885 1786T967 1755T995 1679T967 1604T885 1574T804 1604T776 1679Z" />
+<glyph unicode="&#xdd;" horiz-adv-x="1230" d="M613 725L993 1456H1211L709 543V0H517V543L15 1456H235L613 725ZM708 1844H932L664 1550H515L708 1844Z" />
+<glyph unicode="&#xde;" horiz-adv-x="1210" d="M352 1456V1163H631Q778 1163 888 1111T1057 961T1117 738Q1117 544 985 429T626 313H352V0H166V1456H352ZM352 1011V465H629Q771 465 851 540T931 736Q931 859 851 934T635 1011H352Z" />
+<glyph unicode="&#xdf;" horiz-adv-x="1218" d="M324 0H139V1111Q139 1319 242 1436T532 1554Q712 1554 810 1465T909 1216Q909 1091 845 990T781 819Q781 768 818 721T950 601T1087 461T1130 317Q1130 158 1029 69T745 -20Q664 -20 574 2T445 52L488 207Q537
+175 604 153T725 131Q832 131 888 178T945 307Q945 359 908 407T777 528T639 671T595 821Q595 910 664 1013T734 1201Q734 1295 682 1348T542 1402Q324 1402 324 1109V0Z" />
+<glyph unicode="&#xe0;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM687 1240H528L270 1534H493L687 1240Z" />
+<glyph unicode="&#xe1;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM672 1534H896L628 1240H479L672 1534Z" />
+<glyph unicode="&#xe2;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM884 1262V1252H731L581 1422L432 1252H279V1264L525 1536H637L884 1262Z" />
+<glyph unicode="&#xe3;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM936 1504Q936 1396 875 1329T721 1262Q680 1262 650 1272T572 1313T502 1350T452 1357Q411 1357 382 1326T353 1245L229 1252Q229 1359 289
+1429T443 1499Q478 1499 506 1489T582 1450T655 1412T712 1403Q755 1403 783 1437T812 1516L936 1504Z" />
+<glyph unicode="&#xe4;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM260 1371Q260 1416 287 1446T369 1477T451 1447T479 1371T451 1296T369 1266T288 1296T260 1371ZM690 1369Q690 1414 717 1445T799 1476T881
+1445T909 1369T881 1294T799 1264T718 1294T690 1369Z" />
+<glyph unicode="&#xe5;" horiz-adv-x="1114" d="M808 0Q792 32 782 114Q653 -20 474 -20Q314 -20 212 70T109 300Q109 469 237 562T599 656H779V741Q779 838 721 895T550 953Q451 953 384 903T317 782H131Q131 863 188 938T344 1058T561 1102Q748 1102 854 1009T964
+751V253Q964 104 1002 16V0H808ZM501 141Q588 141 666 186T779 303V525H634Q294 525 294 326Q294 239 352 190T501 141ZM796 1419Q796 1332 734 1274T581 1215Q489 1215 428 1274T366 1419T427 1566T581 1627T734 1566T796 1419ZM465 1419Q465 1372 498 1338T581
+1304Q629 1304 663 1337T697 1419T664 1502T581 1537Q531 1537 498 1502T465 1419Z" />
+<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M1262 -20Q1001 -20 865 160Q800 74 687 27T433 -20Q266 -20 172 66T78 304Q78 461 191 548T526 635H749V720Q749 827 694 888T535 950Q430 950 360 895T290 759L106 778Q106 921 227 1011T535 1102Q650 1102 738
+1061T876 936Q939 1015 1026 1058T1218 1102Q1428 1102 1544 974T1660 612V497H932Q939 321 1026 226T1262 130Q1410 130 1531 206L1578 237L1642 101Q1484 -20 1262 -20ZM469 130Q541 130 620 167T749 258V495H521Q404 493 334 438T264 300Q264 223 317 177T469
+130ZM1218 950Q1103 950 1029 865T937 640H1475V671Q1475 803 1408 876T1218 950Z" />
+<glyph unicode="&#xe7;" horiz-adv-x="1072" d="M574 131Q673 131 747 191T829 341H1004Q999 248 940 164T783 30T574 -20Q353 -20 223 127T92 531V562Q92 720 150 843T316 1034T573 1102Q755 1102 875 993T1004 710H829Q821 815 750 882T573 950Q432 950 355
+849T277 555V520Q277 333 354 232T574 131ZM604 -9L592 -61Q745 -88 745 -234Q745 -331 665 -387T442 -444L435 -337Q514 -337 557 -311T601 -238Q601 -194 569 -173T439 -143L471 -9H604Z" />
+<glyph unicode="&#xe8;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
+869T284 640H826V654Q818 795 750 872T566 950ZM671 1240H512L254 1534H477L671 1240Z" />
+<glyph unicode="&#xe9;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
+869T284 640H826V654Q818 795 750 872T566 950ZM656 1534H880L612 1240H463L656 1534Z" />
+<glyph unicode="&#xea;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
+869T284 640H826V654Q818 795 750 872T566 950ZM868 1262V1252H715L565 1422L416 1252H263V1264L509 1536H621L868 1262Z" />
+<glyph unicode="&#xeb;" horiz-adv-x="1085" d="M589 -20Q369 -20 231 124T93 511V545Q93 706 154 832T326 1030T566 1102Q777 1102 894 963T1011 565V488H278Q282 328 371 230T599 131Q697 131 765 171T884 277L997 189Q861 -20 589 -20ZM566 950Q454 950 378
+869T284 640H826V654Q818 795 750 872T566 950ZM244 1371Q244 1416 271 1446T353 1477T435 1447T463 1371T435 1296T353 1266T272 1296T244 1371ZM674 1369Q674 1414 701 1445T783 1476T865 1445T893 1369T865 1294T783 1264T702 1294T674 1369Z" />
+<glyph unicode="&#xec;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM615 1495H456L198 1789H421L615 1495Z" />
+<glyph unicode="&#xed;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM343 1789H567L299 1495H150L343 1789Z" />
+<glyph unicode="&#xee;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM556 1261V1251H403L253 1421L104 1251H-49V1263L197 1535H309L556 1261Z" />
+<glyph unicode="&#xef;" horiz-adv-x="506" d="M341 0H155V1082H341V0ZM-68 1370Q-68 1415 -41 1445T41 1476T123 1446T151 1370T123 1295T41 1265T-40 1295T-68 1370ZM362 1368Q362 1413 389 1444T471 1475T553 1444T581 1368T553 1293T471 1263T390 1293T362 1368Z" />
+<glyph unicode="&#xf0;" horiz-adv-x="1200" d="M820 1301Q1069 1037 1069 628V535Q1069 377 1011 251T844 52T602 -20Q467 -20 357 44T187 221T126 467Q126 614 182 730T341 912T574 977Q737 977 858 863Q810 1058 669 1199L451 1051L378 1150L570 1281Q438 1372
+255 1421L312 1580Q551 1526 726 1387L915 1516L988 1416L820 1301ZM884 635L882 691Q849 752 780 788T618 825Q473 825 392 730T311 467Q311 327 394 229T606 131Q731 131 807 244T884 541V635Z" />
+<glyph unicode="&#xf1;" horiz-adv-x="1130" d="M315 1082L321 946Q445 1102 645 1102Q988 1102 991 715V0H806V716Q805 833 753 889T589 945Q499 945 431 897T325 771V0H140V1082H315ZM927 1504Q927 1396 866 1329T712 1262Q671 1262 641 1272T563 1313T493 1350T443
+1357Q402 1357 373 1326T344 1245L220 1252Q220 1359 280 1429T434 1499Q469 1499 497 1489T573 1450T646 1412T703 1403Q746 1403 774 1437T803 1516L927 1504Z" />
+<glyph unicode="&#xf2;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
+807 839T582 950Q445 950 361 841T277 529ZM681 1240H522L264 1534H487L681 1240Z" />
+<glyph unicode="&#xf3;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
+807 839T582 950Q445 950 361 841T277 529ZM666 1534H890L622 1240H473L666 1534Z" />
+<glyph unicode="&#xf4;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
+807 839T582 950Q445 950 361 841T277 529ZM878 1262V1252H725L575 1422L426 1252H273V1264L519 1536H631L878 1262Z" />
+<glyph unicode="&#xf5;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
+807 839T582 950Q445 950 361 841T277 529ZM930 1504Q930 1396 869 1329T715 1262Q674 1262 644 1272T566 1313T496 1350T446 1357Q405 1357 376 1326T347 1245L223 1252Q223 1359 283 1429T437 1499Q472 1499 500 1489T576 1450T649 1412T706 1403Q749 1403 777
+1437T806 1516L930 1504Z" />
+<glyph unicode="&#xf6;" horiz-adv-x="1168" d="M91 551Q91 710 153 837T327 1033T582 1102Q803 1102 939 949T1076 542V529Q1076 371 1016 246T843 50T584 -20Q364 -20 228 133T91 538V551ZM277 529Q277 349 360 240T584 131Q725 131 808 241T891 551Q891 729
+807 839T582 950Q445 950 361 841T277 529ZM254 1371Q254 1416 281 1446T363 1477T445 1447T473 1371T445 1296T363 1266T282 1296T254 1371ZM684 1369Q684 1414 711 1445T793 1476T875 1445T903 1369T875 1294T793 1264T712 1294T684 1369Z" />
+<glyph unicode="&#xf7;" horiz-adv-x="1169" d="M1069 600H71V784H1069V600ZM461 1098Q461 1146 489 1178T575 1210T661 1178T691 1098Q691 1051 662 1020T575 989T490 1020T461 1098ZM461 281Q461 329 489 361T575 393T661 361T691 281Q691 235 662 204T575 172T490
+203T461 281Z" />
+<glyph unicode="&#xf8;" horiz-adv-x="1160" d="M91 551Q91 710 152 836T326 1032T582 1102Q692 1102 786 1060L859 1208H983L881 1003Q1076 849 1076 529Q1076 371 1014 244T840 49T584 -20Q480 -20 394 15L320 -134H196L296 69Q91 218 91 551ZM276 529Q276 335
+373 224L716 918Q654 950 582 950Q444 950 360 841T276 529ZM890 551Q890 733 803 844L463 156Q518 131 584 131Q723 131 806 240T890 535V551Z" />
+<glyph unicode="&#xf9;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM673 1240H514L256 1534H479L673 1240Z" />
+<glyph unicode="&#xfa;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM658 1534H882L614 1240H465L658 1534Z" />
+<glyph unicode="&#xfb;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM870 1262V1252H717L567 1422L418 1252H265V1264L511 1536H623L870 1262Z" />
+<glyph unicode="&#xfc;" horiz-adv-x="1129" d="M808 107Q700 -20 491 -20Q318 -20 228 80T136 378V1082H321V383Q321 137 521 137Q733 137 803 295V1082H988V0H812L808 107ZM246 1371Q246 1416 273 1446T355 1477T437 1447T465 1371T437 1296T355 1266T274 1296T246
+1371ZM676 1369Q676 1414 703 1445T785 1476T867 1445T895 1369T867 1294T785 1264T704 1294T676 1369Z" />
+<glyph unicode="&#xfd;" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271ZM599 1534H823L555 1240H406L599 1534Z" />
+<glyph unicode="&#xfe;" horiz-adv-x="1180" d="M1063 529Q1063 282 950 131T644 -20Q447 -20 334 105V-416H149V1536H334V970Q447 1102 641 1102Q836 1102 949 955T1063 546V529ZM878 550Q878 733 800 839T586 945Q418 945 334 796V279Q417 131 588 131Q721 131
+799 236T878 550Z" />
+<glyph unicode="&#xff;" horiz-adv-x="969" d="M494 271L746 1082H944L509 -167Q408 -437 188 -437L153 -434L84 -421V-271L134 -275Q228 -275 280 -237T367 -98L408 12L22 1082H224L494 271ZM187 1371Q187 1416 214 1446T296 1477T378 1447T406 1371T378 1296T296
+1266T215 1296T187 1371ZM617 1369Q617 1414 644 1445T726 1476T808 1445T836 1369T808 1294T726 1264T645 1294T617 1369Z" />
+<glyph unicode="&#x2013;" horiz-adv-x="1344" d="M1421 651H419V802H1421V651Z" />
+<glyph unicode="&#x2014;" horiz-adv-x="1599" d="M1737 651H401V802H1737V651Z" />
+<glyph unicode="&#x2018;" horiz-adv-x="409" d="M270 1555L376 1483Q283 1356 280 1209V1073H96V1189Q96 1291 144 1391T270 1555Z" />
+<glyph unicode="&#x2019;" horiz-adv-x="409" d="M153 1046L48 1118Q141 1248 144 1392V1536H327V1406Q326 1306 278 1207T153 1046Z" />
+<glyph unicode="&#x201a;" horiz-adv-x="407" d="M141 -283L36 -210Q127 -83 130 63V181H315V81Q315 -20 266 -121T141 -283Z" />
+<glyph unicode="&#x201c;" horiz-adv-x="724" d="M278 1555L384 1483Q291 1356 288 1209V1073H104V1189Q104 1291 152 1391T278 1555ZM593 1555L699 1483Q606 1356 603 1209V1073H419V1189Q419 1291 467 1391T593 1555Z" />
+<glyph unicode="&#x201d;" horiz-adv-x="731" d="M165 1046L60 1118Q153 1248 156 1392V1536H339V1406Q338 1306 290 1207T165 1046ZM472 1046L367 1118Q460 1248 463 1392V1536H646V1406Q645 1306 597 1207T472 1046Z" />
+<glyph unicode="&#x201e;" horiz-adv-x="705" d="M141 -301L36 -229Q127 -92 130 61V246H315V82Q315 -26 266 -131T141 -301ZM437 -301L332 -229Q423 -92 426 61V246H612V82Q612 -25 564 -129T437 -301Z" />
+<glyph unicode="&#x2022;" horiz-adv-x="690" d="M138 772Q138 859 193 915T341 971Q432 971 489 917T546 769V732Q546 645 491 590T342 535Q249 535 194 590T138 734V772Z" />
+<glyph unicode="&#x2039;" horiz-adv-x="614" d="M286 550L544 153H403L108 541V560L403 949H544L286 550Z" />
+<glyph unicode="&#x203a;" horiz-adv-x="614" d="M231 949L526 560V541L231 152H89L347 550L89 949H231Z" />
+</font>
+</defs>
+</svg>
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.7e367be02cd17a96d513.woff2 b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.7e367be02cd17a96d513.woff2
new file mode 100644
index 0000000..120796b
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.7e367be02cd17a96d513.woff2
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot
new file mode 100644
index 0000000..d26bc8f
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot
Binary files differ
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/scripts.da68998bdd77aff4e764.bundle.js b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
new file mode 100644
index 0000000..73c64a5
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/scripts.da68998bdd77aff4e764.bundle.js
@@ -0,0 +1,6 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){"use strict";function e(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}function t(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function r(e,r){return t(e).appendChild(r)}function n(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function i(e,t,r,i){var o=n(e,t,r,i);return o.setAttribute("role","presentation"),o}function o(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function l(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function s(t,r){var n=t.className;e(r).test(n)||(t.className+=(n?" ":"")+r)}function a(t,r){for(var n=t.split(" "),i=0;i<n.length;i++)n[i]&&!e(n[i]).test(r)&&(r+=" "+n[i]);return r}function u(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function c(e,t,r){t||(t={});for(var n in e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function f(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\s\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf("\t",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}function h(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}function d(e,t,r){for(var n=0,i=0;;){var o=e.indexOf("\t",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,i+=r-i%r,n=o+1,i>=t)return n}}function p(e){for(;Yl.length<=e;)Yl.push(g(Yl)+" ");return Yl[e]}function g(e){return e[e.length-1]}function v(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function m(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}function y(){}function b(e,t){var r;return Object.create?r=Object.create(e):(y.prototype=e,r=new y),t&&c(t,r),r}function w(e){return/\w/.test(e)||e>"€"&&(e.toUpperCase()!=e.toLowerCase()||_l.test(e))}function x(e,t){return t?!!(t.source.indexOf("\\w")>-1&&w(e))||t.test(e):w(e)}function C(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function S(e){return e.charCodeAt(0)>=768&&ql.test(e)}function L(e,t,r){for(;(r<0?t>0:t<e.length)&&S(e.charAt(t));)t+=r;return t}function k(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}function T(e,t,r){var o=this;this.input=r,o.scrollbarFiller=n("div",null,"CodeMirror-scrollbar-filler"),o.scrollbarFiller.setAttribute("cm-not-content","true"),o.gutterFiller=n("div",null,"CodeMirror-gutter-filler"),o.gutterFiller.setAttribute("cm-not-content","true"),o.lineDiv=i("div",null,"CodeMirror-code"),o.selectionDiv=n("div",null,null,"position: relative; z-index: 1"),o.cursorDiv=n("div",null,"CodeMirror-cursors"),o.measure=n("div",null,"CodeMirror-measure"),o.lineMeasure=n("div",null,"CodeMirror-measure"),o.lineSpace=i("div",[o.measure,o.lineMeasure,o.selectionDiv,o.cursorDiv,o.lineDiv],null,"position: relative; outline: none");var l=i("div",[o.lineSpace],"CodeMirror-lines");o.mover=n("div",[l],null,"position: relative"),o.sizer=n("div",[o.mover],"CodeMirror-sizer"),o.sizerWidth=null,o.heightForcer=n("div",null,null,"position: absolute; height: "+Ul+"px; width: 1px;"),o.gutters=n("div",null,"CodeMirror-gutters"),o.lineGutter=null,o.scroller=n("div",[o.sizer,o.heightForcer,o.gutters],"CodeMirror-scroll"),o.scroller.setAttribute("tabIndex","-1"),o.wrapper=n("div",[o.scrollbarFiller,o.gutterFiller,o.scroller],"CodeMirror"),yl&&bl<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),wl||pl&&Ol||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,r.init(o)}function M(e,t){if((t-=e.first)<0||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function N(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function O(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function A(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function W(e){if(null==e.parent)return null;for(var t=e.parent,r=h(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function D(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l],a=s.height;if(t<a)break;t-=a}return r+l}function H(e,t){return t>=e.first&&t<e.first+e.size}function F(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function P(e,t,r){if(void 0===r&&(r=null),!(this instanceof P))return new P(e,t,r);this.line=e,this.ch=t,this.sticky=r}function E(e,t){return e.line-t.line||e.ch-t.ch}function z(e,t){return e.sticky==t.sticky&&0==E(e,t)}function I(e){return P(e.line,e.ch)}function R(e,t){return E(e,t)<0?t:e}function B(e,t){return E(e,t)<0?e:t}function G(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function U(e,t){if(t.line<e.first)return P(e.first,0);var r=e.first+e.size-1;return t.line>r?P(r,M(e,r).text.length):V(t,M(e,t.line).text.length)}function V(e,t){var r=e.ch;return null==r||r>t?P(e.line,t):r<0?P(e.line,0):e}function K(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=U(e,t[n]);return r}function j(){$l=!0}function X(){Zl=!0}function Y(e,t,r){this.marker=e,this.from=t,this.to=r}function _(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function q(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function $(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}function Z(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker,s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);if(s||o.from==t&&"bookmark"==l.type&&(!r||!o.marker.insertLeft)){var a=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new Y(l,o.from,a?null:o.to))}}return n}function Q(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker,s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);if(s||o.from==t&&"bookmark"==l.type&&(!r||o.marker.insertLeft)){var a=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new Y(l,a?null:o.from-t,null==o.to?null:o.to-t))}}return n}function J(e,t){if(t.full)return null;var r=H(e,t.from.line)&&M(e,t.from.line).markedSpans,n=H(e,t.to.line)&&M(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==E(t.from,t.to),s=Z(r,i,l),a=Q(n,o,l),u=1==t.text.length,c=g(t.text).length+(u?i:0);if(s)for(var f=0;f<s.length;++f){var h=s[f];if(null==h.to){var d=_(a,h.marker);d?u&&(h.to=null==d.to?null:d.to+c):h.to=i}}if(a)for(var p=0;p<a.length;++p){var v=a[p];if(null!=v.to&&(v.to+=c),null==v.from){var m=_(s,v.marker);m||(v.from=c,u&&(s||(s=[])).push(v))}else v.from+=c,u&&(s||(s=[])).push(v)}s&&(s=ee(s)),a&&a!=s&&(a=ee(a));var y=[s];if(!u){var b,w=t.text.length-2;if(w>0&&s)for(var x=0;x<s.length;++x)null==s[x].to&&(b||(b=[])).push(new Y(s[x].marker,null,null));for(var C=0;C<w;++C)y.push(b);y.push(a)}return y}function ee(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function te(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=h(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(E(u.to,s.from)<0||E(u.from,s.to)>0)){var c=[a,1],f=E(u.from,s.from),d=E(u.to,s.to);(f<0||!l.inclusiveLeft&&!f)&&c.push({from:u.from,to:s.from}),(d>0||!l.inclusiveRight&&!d)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}function re(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function ne(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function ie(e){return e.inclusiveLeft?-1:0}function oe(e){return e.inclusiveRight?1:0}function le(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=E(n.from,i.from)||ie(e)-ie(t);if(o)return-o;var l=E(n.to,i.to)||oe(e)-oe(t);return l||t.id-e.id}function se(e,t){var r,n=Zl&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)i=n[o],i.marker.collapsed&&null==(t?i.from:i.to)&&(!r||le(r,i.marker)<0)&&(r=i.marker);return r}function ae(e){return se(e,!0)}function ue(e){return se(e,!1)}function ce(e,t,r,n,i){var o=M(e,t),l=Zl&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=E(u.from,r)||ie(a.marker)-ie(i),f=E(u.to,n)||oe(a.marker)-oe(i);if(!(c>=0&&f<=0||c<=0&&f>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?E(u.to,r)>=0:E(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?E(u.from,n)<=0:E(u.from,n)<0)))return!0}}}function fe(e){for(var t;t=ae(e);)e=t.find(-1,!0).line;return e}function he(e){for(var t;t=ue(e);)e=t.find(1,!0).line;return e}function de(e){for(var t,r;t=ue(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}function pe(e,t){var r=M(e,t),n=fe(r);return r==n?t:W(n)}function ge(e,t){if(t>e.lastLine())return t;var r,n=M(e,t);if(!ve(e,n))return t;for(;r=ue(n);)n=r.find(1,!0).line;return W(n)+1}function ve(e,t){var r=Zl&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if(n=r[i],n.marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&me(e,t,n))return!0}}function me(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return me(e,n.line,_(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if(i=t.markedSpans[o],i.marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&me(e,t,i))return!0}function ye(e){e=fe(e);for(var t=0,r=e.parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;r=o,o=r.parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function be(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=ae(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=ue(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,n=o.to.line,r+=n.text.length-o.to.ch}return r}function we(e){var t=e.display,r=e.doc;t.maxLine=M(r,r.first),t.maxLineLength=be(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=be(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}function xe(e,t,r,n){if(!e)return n(t,r,"ltr",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?"rtl":"ltr",o),i=!0)}i||n(t,r,"ltr")}function Ce(e,t,r){var n;Ql=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&"before"==r?n=i:Ql=i),o.from==t&&(o.from!=o.to&&"before"!=r?n=i:Ql=i)}return null!=n?n:Ql}function Se(e,t){var r=e.order;return null==r&&(r=e.order=Jl(e.text,t)),r}function Le(e,t){return e._handlers&&e._handlers[t]||es}function ke(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent("on"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=h(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function Te(e,t){var r=Le(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function Me(e,t,r){return"string"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),Te(e,r||t.type,e,t),He(t)||t.codemirrorIgnore}function Ne(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==h(r,t[n])&&r.push(t[n])}function Oe(e,t){return Le(e,t).length>0}function Ae(e){e.prototype.on=function(e,t){ts(this,e,t)},e.prototype.off=function(e,t){ke(this,e,t)}}function We(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function De(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function He(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Fe(e){We(e),De(e)}function Pe(e){return e.target||e.srcElement}function Ee(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),Al&&e.ctrlKey&&1==t&&(t=3),t}function ze(e){if(null==Bl){var t=n("span","​");r(e,n("span",[t,document.createTextNode("x")])),0!=e.firstChild.offsetHeight&&(Bl=t.offsetWidth<=1&&t.offsetHeight>2&&!(yl&&bl<8))}var i=Bl?n("span","​"):n("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return i.setAttribute("cm-text",""),i}function Ie(e){if(null!=Gl)return Gl;var n=r(e,document.createTextNode("AخA")),i=Fl(n,0,1).getBoundingClientRect(),o=Fl(n,1,2).getBoundingClientRect();return t(e),!(!i||i.left==i.right)&&(Gl=o.right-i.right<3)}function Re(e){if(null!=ls)return ls;var t=r(e,n("span","x")),i=t.getBoundingClientRect(),o=Fl(t,0,1).getBoundingClientRect();return ls=Math.abs(i.left-o.left)>1}function Be(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),ss[e]=t}function Ge(e,t){as[e]=t}function Ue(e){if("string"==typeof e&&as.hasOwnProperty(e))e=as[e];else if(e&&"string"==typeof e.name&&as.hasOwnProperty(e.name)){var t=as[e.name];"string"==typeof t&&(t={name:t}),e=b(t,e),e.name=t.name}else{if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+xml$/.test(e))return Ue("application/xml");if("string"==typeof e&&/^[\w\-]+\/[\w\-]+\+json$/.test(e))return Ue("application/json")}return"string"==typeof e?{name:e}:e||{name:"null"}}function Ve(e,t){t=Ue(t);var r=ss[t.name];if(!r)return Ve(e,"text/plain");var n=r(e,t);if(us.hasOwnProperty(t.name)){var i=us[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n["_"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}function Ke(e,t){c(t,us.hasOwnProperty(e)?us[e]:us[e]={})}function je(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Xe(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Ye(e,t,r){return!e.startState||e.startState(t,r)}function _e(e,t,r,n){var i=[e.state.modeGen],o={};rt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=0;s<e.state.overlays.length;++s)!function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,rt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,"overlay "+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+" ":"")+"overlay "+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1}(s);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function qe(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=$e(e,W(t)),i=t.text.length>e.options.maxHighlightLength&&je(e.doc.mode,n.state),o=_e(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function $e(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new hs(n,!0,t);var o=nt(e,t,r),l=o>n.first&&M(n,o-1).stateAfter,s=l?hs.fromSaved(n,l,o):new hs(n,Ye(n.mode),o);return n.iter(o,t,function(r){Ze(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function Ze(e,t,r,n){var i=e.doc.mode,o=new cs(t,e.options.tabSize,r);for(o.start=o.pos=n||0,""==t&&Qe(i,r.state);!o.eol();)Je(i,o,r.state),o.start=o.pos}function Qe(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=Xe(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function Je(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=Xe(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error("Mode "+e.name+" failed to advance stream.")}function et(e,t,r,n){var i,o=e.doc,l=o.mode;t=U(o,t);var s,a=M(o,t.line),u=$e(e,t.line,r),c=new cs(a.text,e.options.tabSize,u);for(n&&(s=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Je(l,c,u.state),n&&s.push(new ds(c,i,je(o.mode,u.state)));return n?s:new ds(c,i,u.state)}function tt(e,t){if(e)for(;;){var r=e.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?"bgClass":"textClass";null==t[n]?t[n]=r[2]:new RegExp("(?:^|s)"+r[2]+"(?:$|s)").test(t[n])||(t[n]+=" "+r[2])}return e}function rt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,f=new cs(t,e.options.tabSize,n),h=e.options.addModeClass&&[null];for(""==t&&tt(Qe(r,n.state),o);!f.eol();){if(f.pos>e.options.maxHighlightLength?(s=!1,l&&Ze(e,t,n,f.pos),f.pos=t.length,a=null):a=tt(Je(r,f,n.state,h),o),h){var d=h[0].name;d&&(a="m-"+(a?d+" "+a:d))}if(!s||c!=a){for(;u<f.start;)u=Math.min(f.start,u+5e3),i(u,c);c=a}f.start=f.pos}for(;u<f.pos;){var p=Math.min(f.pos,u+5e3);i(p,c),u=p}}function nt(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=M(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof fs?u.lookAhead:0)<=o.modeFrontier))return s;var c=f(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}function it(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=M(e,n).stateAfter;if(i&&(!(i instanceof fs)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}}function ot(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),re(e),ne(e,r);var i=n?n(e):1;i!=e.height&&A(e,i)}function lt(e){e.parent=null,re(e)}function st(e,t){if(!e||/^\s*$/.test(e))return null;var r=t.addModeClass?ms:vs;return r[e]||(r[e]=e.replace(/\S+/g,"cm-$&"))}function at(e,t){var r=i("span",null,null,wl?"padding-right: .1px":null),n={pre:i("pre",[r],"CodeMirror-line"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(yl||wl)&&e.getOption("lineWrapping")};t.measure={};for(var o=0;o<=(t.rest?t.rest.length:0);o++){var l=o?t.rest[o-1]:t.line,s=void 0;n.pos=0,n.addToken=ct,Ie(e.display.measure)&&(s=Se(l,e.doc.direction))&&(n.addToken=ht(n.addToken,s)),n.map=[];pt(l,n,qe(e,l,t!=e.display.externalMeasured&&W(l))),l.styleClasses&&(l.styleClasses.bgClass&&(n.bgClass=a(l.styleClasses.bgClass,n.bgClass||"")),l.styleClasses.textClass&&(n.textClass=a(l.styleClasses.textClass,n.textClass||""))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(ze(e.display.measure))),0==o?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(wl){var u=n.content.lastChild;(/\bcm-tab\b/.test(u.className)||u.querySelector&&u.querySelector(".cm-tab"))&&(n.content.className="cm-tab-wrap-hack")}return Te(e,"renderLine",e,t.line,n.pre),n.pre.className&&(n.textClass=a(n.pre.className,n.textClass||"")),n}function ut(e){var t=n("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function ct(e,t,r,i,o,l,s){if(t){var a,u=e.splitSpaces?ft(t,e.trailingSpace):t,c=e.cm.state.specialChars,f=!1;if(c.test(t)){a=document.createDocumentFragment();for(var h=0;;){c.lastIndex=h;var d=c.exec(t),g=d?d.index-h:t.length-h;if(g){var v=document.createTextNode(u.slice(h,h+g));yl&&bl<9?a.appendChild(n("span",[v])):a.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!d)break;h+=g+1;var m=void 0;if("\t"==d[0]){var y=e.cm.options.tabSize,b=y-e.col%y;m=a.appendChild(n("span",p(b),"cm-tab")),m.setAttribute("role","presentation"),m.setAttribute("cm-text","\t"),e.col+=b}else"\r"==d[0]||"\n"==d[0]?(m=a.appendChild(n("span","\r"==d[0]?"␍":"␤","cm-invalidchar")),m.setAttribute("cm-text",d[0]),e.col+=1):(m=e.cm.options.specialCharPlaceholder(d[0]),m.setAttribute("cm-text",d[0]),yl&&bl<9?a.appendChild(n("span",[m])):a.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,a=document.createTextNode(u),e.map.push(e.pos,e.pos+t.length,a),yl&&bl<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==u.charCodeAt(t.length-1),r||i||o||f||s){var w=r||"";i&&(w+=i),o&&(w+=o);var x=n("span",[a],w,s);return l&&(x.title=l),e.content.appendChild(x)}e.content.appendChild(a)}}function ft(e,t){if(e.length>1&&!/  /.test(e))return e;for(var r=t,n="",i=0;i<e.length;i++){var o=e.charAt(i);" "!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=" "),n+=o,r=" "==o}return n}function ht(e,t){return function(r,n,i,o,l,s,a){i=i?i+" cm-force-border":"cm-force-border";for(var u=r.pos,c=u+n.length;;){for(var f=void 0,h=0;h<t.length&&(f=t[h],!(f.to>u&&f.from<=u));h++);if(f.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,f.to-u),i,o,null,s,a),o=null,n=n.slice(f.to-u),u=f.to}}}function dt(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function pt(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,f,h,d=i.length,p=0,g=1,v="",m=0;;){if(m==p){a=u=c=f=s="",h=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;"bookmark"==C.type&&x.from==p&&C.widgetNode?y.push(C):x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)?(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=""),C.className&&(a+=" "+C.className),C.css&&(s=(s?s+";":"")+C.css),C.startStyle&&x.from==p&&(c+=" "+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&!f&&(f=C.title),C.collapsed&&(!h||le(h.marker,C)<0)&&(h=x)):x.from>p&&m>x.from&&(m=x.from)}if(b)for(var S=0;S<b.length;S+=2)b[S+1]==m&&(u+=" "+b[S]);if(!h||h.from==p)for(var L=0;L<y.length;++L)dt(t,0,y[L]);if(h&&(h.from||0)==p){if(dt(t,(null==h.to?d+1:h.to)-p,h.marker,null==h.from),null==h.to)return;h.to==p&&(h=!1)}}if(p>=d)break;for(var k=Math.min(d,m);;){if(v){var T=p+v.length;if(!h){var M=T>k?v.slice(0,k-p):v;t.addToken(t,M,l?l+a:a,c,p+M.length==m?u:"",f,s)}if(T>=k){v=v.slice(k-p),p=k;break}p=T,c=""}v=i.slice(o,o=r[g++]),l=st(r[g++],t.cm.options)}}else for(var N=1;N<r.length;N+=2)t.addToken(t,i.slice(o,o=r[N]),st(r[N+1],t.cm.options))}function gt(e,t,r){this.line=t,this.rest=de(t),this.size=this.rest?W(g(this.rest))-r+1:1,this.node=this.text=null,this.hidden=ve(e,t)}function vt(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new gt(e.doc,M(e.doc,o),o);n=o+l.size,i.push(l)}return i}function mt(e){ys?ys.ops.push(e):e.ownsGroup=ys={ops:[e],delayedCallbacks:[]}}function yt(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}function bt(e,t){var r=e.ownsGroup;if(r)try{yt(r)}finally{ys=null,t(r)}}function wt(e,t){var r=Le(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);ys?n=ys.delayedCallbacks:bs?n=bs:(n=bs=[],setTimeout(xt,0));for(var o=0;o<r.length;++o)!function(e){n.push(function(){return r[e].apply(null,i)})}(o)}}function xt(){var e=bs;bs=null;for(var t=0;t<e.length;++t)e[t]()}function Ct(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];"text"==o?Tt(e,t):"gutter"==o?Nt(e,t,r,n):"class"==o?Mt(e,t):"widget"==o&&Ot(e,t,n)}t.changes=null}function St(e){return e.node==e.text&&(e.node=n("div",null,null,"position: relative"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),yl&&bl<8&&(e.node.style.zIndex=2)),e.node}function Lt(e,t){var r=t.bgClass?t.bgClass+" "+(t.line.bgClass||""):t.line.bgClass;if(r&&(r+=" CodeMirror-linebackground"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var i=St(t);t.background=i.insertBefore(n("div",null,r),i.firstChild),e.display.input.setUneditable(t.background)}}function kt(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):at(e,t)}function Tt(e,t){var r=t.text.className,n=kt(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,Mt(e,t)):r&&(t.text.className=r)}function Mt(e,t){Lt(e,t),t.line.wrapClass?St(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className="");var r=t.textClass?t.textClass+" "+(t.line.textClass||""):t.line.textClass;t.text.className=r||""}function Nt(e,t,r,i){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var o=St(t);t.gutterBackground=n("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?i.fixedPos:-i.gutterTotalWidth)+"px; width: "+i.gutterTotalWidth+"px"),e.display.input.setUneditable(t.gutterBackground),o.insertBefore(t.gutterBackground,t.text)}var l=t.line.gutterMarkers;if(e.options.lineNumbers||l){var s=St(t),a=t.gutter=n("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?i.fixedPos:-i.gutterTotalWidth)+"px");if(e.display.input.setUneditable(a),s.insertBefore(a,t.text),t.line.gutterClass&&(a.className+=" "+t.line.gutterClass),!e.options.lineNumbers||l&&l["CodeMirror-linenumbers"]||(t.lineNumber=a.appendChild(n("div",F(e.options,r),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+i.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),l)for(var u=0;u<e.options.gutters.length;++u){var c=e.options.gutters[u],f=l.hasOwnProperty(c)&&l[c];f&&a.appendChild(n("div",[f],"CodeMirror-gutter-elt","left: "+i.gutterLeft[c]+"px; width: "+i.gutterWidth[c]+"px"))}}}function Ot(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,"CodeMirror-linewidget"==n.className&&t.node.removeChild(n);Wt(e,t,r)}function At(e,t,r,n){var i=kt(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),Mt(e,t),Nt(e,t,r,n),Wt(e,t,n),t.node}function Wt(e,t,r){if(Dt(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)Dt(e,t.rest[n],t,r,!1)}function Dt(e,t,r,i,o){if(t.widgets)for(var l=St(r),s=0,a=t.widgets;s<a.length;++s){var u=a[s],c=n("div",[u.node],"CodeMirror-linewidget");u.handleMouseEvents||c.setAttribute("cm-ignore-events","true"),Ht(u,c,r,i),e.display.input.setUneditable(c),o&&u.above?l.insertBefore(c,r.gutter||r.text):l.appendChild(c),wt(u,"redraw")}}function Ht(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+"px",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+"px"),t.style.width=i+"px"}e.coverGutter&&(t.style.zIndex=5,t.style.position="relative",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+"px"))}function Ft(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!o(document.body,e.node)){var i="position: relative;";e.coverGutter&&(i+="margin-left: -"+t.display.gutters.offsetWidth+"px;"),e.noHScroll&&(i+="width: "+t.display.wrapper.clientWidth+"px;"),r(t.display.measure,n("div",[e.node],null,i))}return e.height=e.node.parentNode.offsetHeight}function Pt(e,t){for(var r=Pe(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&"true"==r.getAttribute("cm-ignore-events")||r.parentNode==e.sizer&&r!=e.mover)return!0}function Et(e){return e.lineSpace.offsetTop}function zt(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function It(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=r(e.measure,n("pre","x")),i=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,o={left:parseInt(i.paddingLeft),right:parseInt(i.paddingRight)};return isNaN(o.left)||isNaN(o.right)||(e.cachedPaddingH=o),o}function Rt(e){return Ul-e.display.nativeBarWidth}function Bt(e){return e.display.scroller.clientWidth-Rt(e)-e.display.barWidth}function Gt(e){return e.display.scroller.clientHeight-Rt(e)-e.display.barHeight}function Ut(e,t,r){var n=e.options.lineWrapping,i=n&&Bt(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}function Vt(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(W(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Kt(e,t){t=fe(t);var n=W(t),i=e.display.externalMeasured=new gt(e.doc,t,n);i.lineN=n;var o=i.built=at(e,i);return i.text=o.pre,r(e.display.lineMeasure,o.pre),i}function jt(e,t,r,n){return _t(e,Yt(e,t),r,n)}function Xt(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[kr(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Yt(e,t){var r=W(t),n=Xt(e,r);n&&!n.text?n=null:n&&n.changes&&(Ct(e,n,r,wr(e)),e.curOp.forceUpdate=!0),n||(n=Kt(e,t));var i=Vt(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function _t(e,t,r,n,i){t.before&&(r=-1);var o,l=r+(n||"");return t.cache.hasOwnProperty(l)?o=t.cache[l]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(Ut(e,t.view,t.rect),t.hasHeights=!0),o=Zt(e,t,r,n),o.bogus||(t.cache[l]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}function qt(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l="left"):t<a?(i=t-s,o=i+1):(u==e.length-3||t==a&&e[u+3]>t)&&(o=a-s,i=o-1,t>=a&&(l="right")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?"left":"right")&&(l=r),"left"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l="left";if("right"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l="right";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function $t(e,t){var r=ws;if("left"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Zt(e,t,r,n){var i,o=qt(t.map,r,n),l=o.node,s=o.start,a=o.end,u=o.collapse
+;if(3==l.nodeType){for(var c=0;c<4;c++){for(;s&&S(t.line.text.charAt(o.coverStart+s));)--s;for(;o.coverStart+a<o.coverEnd&&S(t.line.text.charAt(o.coverStart+a));)++a;if(i=yl&&bl<9&&0==s&&a==o.coverEnd-o.coverStart?l.parentNode.getBoundingClientRect():$t(Fl(l,s,a).getClientRects(),n),i.left||i.right||0==s)break;a=s,s-=1,u="right"}yl&&bl<11&&(i=Qt(e.display.measure,i))}else{s>0&&(u=n="right");var f;i=e.options.lineWrapping&&(f=l.getClientRects()).length>1?f["right"==n?f.length-1:0]:l.getBoundingClientRect()}if(yl&&bl<9&&!s&&(!i||!i.left&&!i.right)){var h=l.parentNode.getClientRects()[0];i=h?{left:h.left,right:h.left+br(e.display),top:h.top,bottom:h.bottom}:ws}for(var d=i.top-t.rect.top,p=i.bottom-t.rect.top,g=(d+p)/2,v=t.view.measure.heights,m=0;m<v.length-1&&!(g<v[m]);m++);var y=m?v[m-1]:0,b=v[m],w={left:("right"==u?i.right:i.left)-t.rect.left,right:("left"==u?i.left:i.right)-t.rect.left,top:y,bottom:b};return i.left||i.right||(w.bogus=!0),e.options.singleCursorHeightPerLine||(w.rtop=d,w.rbottom=p),w}function Qt(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!Re(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}function Jt(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function er(e){e.display.externalMeasure=null,t(e.display.lineMeasure);for(var r=0;r<e.display.view.length;r++)Jt(e.display.view[r])}function tr(e){er(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function rr(){return Cl&&Nl?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function nr(){return Cl&&Nl?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function ir(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=Ft(e.widgets[r]));return t}function or(e,t,r,n,i){if(!i){var o=ir(t);r.top+=o,r.bottom+=o}if("line"==n)return r;n||(n="local");var l=ye(t);if("local"==n?l+=Et(e.display):l-=e.display.viewOffset,"page"==n||"window"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+("window"==n?0:nr());var a=s.left+("window"==n?0:rr());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function lr(e,t,r){if("div"==r)return t;var n=t.left,i=t.top;if("page"==r)n-=rr(),i-=nr();else if("local"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function sr(e,t,r,n,i){return n||(n=M(e.doc,t.line)),or(e,n,jt(e,n,t.ch,i),r)}function ar(e,t,r,n,i,o){function l(t,l){var s=_t(e,i,t,l?"right":"left",o);return l?s.left=s.right:s.right=s.left,or(e,n,s,r)}function s(e,t,r){var n=a[t],i=1==n.level;return l(r?e-1:e,i!=r)}n=n||M(e.doc,t.line),i||(i=Yt(e,n));var a=Se(n,e.doc.direction),u=t.ch,c=t.sticky;if(u>=n.text.length?(u=n.text.length,c="before"):u<=0&&(u=0,c="after"),!a)return l("before"==c?u-1:u,"before"==c);var f=Ce(a,u,c),h=Ql,d=s(u,f,"before"==c);return null!=h&&(d.other=s(u,h,"before"!=c)),d}function ur(e,t){var r=0;t=U(e.doc,t),e.options.lineWrapping||(r=br(e.display)*t.ch);var n=M(e.doc,t.line),i=ye(n)+Et(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function cr(e,t,r,n,i){var o=P(e,t,r);return o.xRel=i,n&&(o.outside=!0),o}function fr(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return cr(n.first,0,null,!0,-1);var i=D(n,r),o=n.first+n.size-1;if(i>o)return cr(n.first+n.size-1,M(n,o).text.length,null,!0,1);t<0&&(t=0);for(var l=M(n,i);;){var s=gr(e,l,i,t,r),a=ue(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=W(l=u.to.line)}}function hr(e,t,r,n){n-=ir(t);var i=t.text.length,o=k(function(t){return _t(e,r,t-1).bottom<=n},i,0);return i=k(function(t){return _t(e,r,t).top>n},o,i),{begin:o,end:i}}function dr(e,t,r,n){return r||(r=Yt(e,t)),hr(e,t,r,or(e,t,_t(e,r,n),"line").top)}function pr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function gr(e,t,r,n,i){i-=ye(t);var o=Yt(e,t),l=ir(t),s=0,a=t.text.length,u=!0,c=Se(t,e.doc.direction);if(c){var f=(e.options.lineWrapping?mr:vr)(e,t,r,o,c,n,i);u=1!=f.level,s=u?f.from:f.to-1,a=u?f.to:f.from-1}var h,d,p=null,g=null,v=k(function(t){var r=_t(e,o,t);return r.top+=l,r.bottom+=l,!!pr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?"after":"before",h=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?"after":v==t.text.length?"before":_t(e,o,v-(u?1:0)).bottom+l<=i==u?"after":"before";var w=ar(e,P(r,v,d),"line",t,o);h=w.left,m=i<w.top||i>=w.bottom}return v=L(t.text,v,1),cr(r,v,d,m,n-h)}function vr(e,t,r,n,i,o,l){var s=k(function(s){var a=i[s],u=1!=a.level;return pr(ar(e,P(r,u?a.to:a.from,u?"before":"after"),"line",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=ar(e,P(r,u?a.from:a.to,u?"after":"before"),"line",t,n);pr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a}function mr(e,t,r,n,i,o,l){var s=hr(e,t,n,l),a=s.begin,u=s.end;/\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,f=null,h=0;h<i.length;h++){var d=i[h];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=_t(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||f>v)&&(c=d,f=v)}}return c||(c=i[i.length-1]),c.from<a&&(c={from:a,to:c.to,level:c.level}),c.to>u&&(c={from:c.from,to:u,level:c.level}),c}function yr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==gs){gs=n("pre");for(var i=0;i<49;++i)gs.appendChild(document.createTextNode("x")),gs.appendChild(n("br"));gs.appendChild(document.createTextNode("x"))}r(e.measure,gs);var o=gs.offsetHeight/50;return o>3&&(e.cachedTextHeight=o),t(e.measure),o||1}function br(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=n("span","xxxxxxxxxx"),i=n("pre",[t]);r(e.measure,i);var o=t.getBoundingClientRect(),l=(o.right-o.left)/10;return l>2&&(e.cachedCharWidth=l),l||10}function wr(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)r[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,n[e.options.gutters[l]]=o.clientWidth;return{fixedPos:xr(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function xr(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function Cr(e){var t=yr(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/br(e.display)-3);return function(i){if(ve(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function Sr(e){var t=e.doc,r=Cr(e);t.iter(function(e){var t=r(e);t!=e.height&&A(e,t)})}function Lr(e,t,r,n){var i=e.display;if(!r&&"true"==Pe(t).getAttribute("cm-not-content"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=fr(e,o,l);if(n&&1==u.xRel&&(a=M(e.doc,u.line).text).length==u.ch){var c=f(a,a.length,e.options.tabSize)-a.length;u=P(u.line,Math.max(0,Math.round((o-It(e.display).left)/br(e.display))-c))}return u}function kr(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function Tr(e){e.display.input.showSelection(e.display.input.prepareSelection())}function Mr(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&Nr(e,s.head,i),a||Ar(e,s,o)}}return n}function Nr(e,t,r){var i=ar(e,t,"div",null,null,!e.options.singleCursorHeightPerLine),o=r.appendChild(n("div"," ","CodeMirror-cursor"));if(o.style.left=i.left+"px",o.style.top=i.top+"px",o.style.height=Math.max(0,i.bottom-i.top)*e.options.cursorHeight+"px",i.other){var l=r.appendChild(n("div"," ","CodeMirror-cursor CodeMirror-secondarycursor"));l.style.display="",l.style.left=i.other.left+"px",l.style.top=i.other.top+"px",l.style.height=.85*(i.other.bottom-i.other.top)+"px"}}function Or(e,t){return e.top-t.top||e.left-t.left}function Ar(e,t,r){function i(e,t,r,i){t<0&&(t=0),t=Math.round(t),i=Math.round(i),a.appendChild(n("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px;\n                             top: "+t+"px; width: "+(null==r?f-e:r)+"px;\n                             height: "+(i-t)+"px"))}function o(t,r,n){function o(r,n){return sr(e,P(t,r),"div",d,n)}function l(t,r,n){var i=dr(e,d,null,t),l="ltr"==r==("after"==n)?"left":"right";return o("after"==n?i.begin:i.end-(/\s/.test(d.text.charAt(i.end-1))?2:1),l)[l]}var a,u,d=M(s,t),p=d.text.length,g=Se(d,s.direction);return xe(g,r||0,null==n?p:n,function(e,t,s,d){var v="ltr"==s,m=o(e,v?"left":"right"),y=o(t-1,v?"right":"left"),b=null==r&&0==e,w=null==n&&t==p,x=0==d,C=!g||d==g.length-1;if(y.top-m.top<=3){var S=(h?b:w)&&x,L=(h?w:b)&&C,k=S?c:(v?m:y).left,T=L?f:(v?y:m).right;i(k,m.top,T-k,m.bottom)}else{var M,N,O,A;v?(M=h&&b&&x?c:m.left,N=h?f:l(e,s,"before"),O=h?c:l(t,s,"after"),A=h&&w&&C?f:y.right):(M=h?l(e,s,"before"):c,N=!h&&b&&x?f:m.right,O=!h&&w&&C?c:y.left,A=h?l(t,s,"after"):f),i(M,m.top,N-M,m.bottom),m.bottom<y.top&&i(c,m.bottom,null,y.top),i(O,y.top,A-O,y.bottom)}(!a||Or(m,a)<0)&&(a=m),Or(y,a)<0&&(a=y),(!u||Or(m,u)<0)&&(u=m),Or(y,u)<0&&(u=y)}),{start:a,end:u}}var l=e.display,s=e.doc,a=document.createDocumentFragment(),u=It(e.display),c=u.left,f=Math.max(l.sizerWidth,Bt(e)-l.sizer.offsetLeft)-u.right,h="ltr"==s.direction,d=t.from(),p=t.to();if(d.line==p.line)o(d.line,d.ch,p.ch);else{var g=M(s,d.line),v=M(s,p.line),m=fe(g)==fe(v),y=o(d.line,d.ch,m?g.text.length+1:null).end,b=o(p.line,m?0:null,p.ch).start;m&&(y.top<b.top-2?(i(y.right,y.top,null,y.bottom),i(c,b.top,b.left,b.bottom)):i(y.right,y.top,b.left-y.right,y.bottom)),y.bottom<b.top&&i(c,y.bottom,null,b.top)}r.appendChild(a)}function Wr(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility="",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Dr(e){e.state.focused||(e.display.input.focus(),Fr(e))}function Hr(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Pr(e))},100)}function Fr(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Te(e,"focus",e,t),e.state.focused=!0,s(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),wl&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),Wr(e))}function Pr(e,t){e.state.delayingBlurEvent||(e.state.focused&&(Te(e,"blur",e,t),e.state.focused=!1,zl(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Er(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=void 0;if(!i.hidden){if(yl&&bl<8){var l=i.node.offsetTop+i.node.offsetHeight;o=l-r,r=l}else{var s=i.node.getBoundingClientRect();o=s.bottom-s.top}var a=i.line.height-o;if(o<2&&(o=yr(t)),(a>.005||a<-.005)&&(A(i.line,o),zr(i.line),i.rest))for(var u=0;u<i.rest.length;u++)zr(i.rest[u])}}}function zr(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function Ir(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-Et(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=D(t,n),l=D(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=D(t,ye(M(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=D(t,ye(M(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function Rr(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=xr(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+"px",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+"px")}}function Br(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=F(e.options,t.first+t.size-1),i=e.display;if(r.length!=i.lineNumChars){var o=i.measure.appendChild(n("div",[n("div",r)],"CodeMirror-linenumber CodeMirror-gutter-elt")),l=o.firstChild.offsetWidth,s=o.offsetWidth-l;return i.lineGutter.style.width="",i.lineNumInnerWidth=Math.max(l,i.lineGutter.offsetWidth-s)+1,i.lineNumWidth=i.lineNumInnerWidth+s,i.lineNumChars=i.lineNumInnerWidth?r.length:-1,i.lineGutter.style.width=i.lineNumWidth+"px",Dn(e),!0}return!1}function Gr(e,t){if(!Me(e,"scrollCursorIntoView")){var r=e.display,i=r.sizer.getBoundingClientRect(),o=null;if(t.top+i.top<0?o=!0:t.bottom+i.top>(window.innerHeight||document.documentElement.clientHeight)&&(o=!1),null!=o&&!Tl){var l=n("div","​",null,"position: absolute;\n                         top: "+(t.top-r.viewOffset-Et(e.display))+"px;\n                         height: "+(t.bottom-t.top+Rt(e)+r.barHeight)+"px;\n                         left: "+t.left+"px; width: "+Math.max(2,t.right-t.left)+"px;");e.display.lineSpace.appendChild(l),l.scrollIntoView(o),e.display.lineSpace.removeChild(l)}}}function Ur(e,t,r,n){null==n&&(n=0);var i;e.options.lineWrapping||t!=r||(t=t.ch?P(t.line,"before"==t.sticky?t.ch-1:t.ch,"after"):t,r="before"==t.sticky?P(t.line,t.ch+1,"before"):t);for(var o=0;o<5;o++){var l=!1,s=ar(e,t),a=r&&r!=t?ar(e,r):s;i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n};var u=Kr(e,i),c=e.doc.scrollTop,f=e.doc.scrollLeft;if(null!=u.scrollTop&&(Zr(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(Jr(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-f)>1&&(l=!0)),!l)break}return i}function Vr(e,t){var r=Kr(e,t);null!=r.scrollTop&&Zr(e,r.scrollTop),null!=r.scrollLeft&&Jr(e,r.scrollLeft)}function Kr(e,t){var r=e.display,n=yr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Gt(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+zt(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var f=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,h=Bt(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>h;return d&&(t.right=t.left+h),t.left<10?l.scrollLeft=0:t.left<f?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>h+f-3&&(l.scrollLeft=t.right+(d?0:10)-h),l}function jr(e,t){null!=t&&(qr(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Xr(e){qr(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Yr(e,t,r){null==t&&null==r||qr(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function _r(e,t){qr(e),e.curOp.scrollToPos=t}function qr(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;$r(e,ur(e,t.from),ur(e,t.to),t.margin)}}function $r(e,t,r,n){var i=Kr(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});Yr(e,i.scrollLeft,i.scrollTop)}function Zr(e,t){Math.abs(e.doc.scrollTop-t)<2||(pl||An(e,{top:t}),Qr(e,t,!0),pl&&An(e),Sn(e,100))}function Qr(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Jr(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,Rr(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function en(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+zt(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Rt(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}function tn(e,t){t||(t=en(e));var r=e.display.barWidth,n=e.display.barHeight;rn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&Er(e),rn(e,en(e)),r=e.display.barWidth,n=e.display.barHeight}function rn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+"px",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+"px",r.heightForcer.style.borderBottom=n.bottom+"px solid transparent",n.right&&n.bottom?(r.scrollbarFiller.style.display="block",r.scrollbarFiller.style.height=n.bottom+"px",r.scrollbarFiller.style.width=n.right+"px"):r.scrollbarFiller.style.display="",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display="block",r.gutterFiller.style.height=n.bottom+"px",r.gutterFiller.style.width=t.gutterWidth+"px"):r.gutterFiller.style.display=""}function nn(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&zl(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Ss[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),ts(t,"mousedown",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute("cm-not-content","true")},function(t,r){"horizontal"==r?Jr(e,t):Zr(e,t)},e),e.display.scrollbars.addClass&&s(e.display.wrapper,e.display.scrollbars.addClass)}function on(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ls},mt(e.curOp)}function ln(e){bt(e.curOp,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;sn(e)})}function sn(e){for(var t=e.ops,r=0;r<t.length;r++)an(t[r]);for(var n=0;n<t.length;n++)un(t[n]);for(var i=0;i<t.length;i++)cn(t[i]);for(var o=0;o<t.length;o++)fn(t[o]);for(var l=0;l<t.length;l++)hn(t[l])}function an(e){var t=e.cm,r=t.display;kn(t),e.updateMaxLine&&we(t),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<r.viewFrom||e.scrollToPos.to.line>=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new ks(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function un(e){e.updatedDisplay=e.mustUpdate&&Nn(e.cm,e.update)}function cn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Er(t),e.barMeasure=en(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=jt(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Rt(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Bt(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function fn(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<t.doc.scrollLeft&&Jr(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==l();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&tn(t,e.barMeasure),e.updatedDisplay&&Hn(t,e.barMeasure),e.selectionChanged&&Wr(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&Dr(e.cm)}function hn(e){var t=e.cm,r=t.display,n=t.doc;if(e.updatedDisplay&&On(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Qr(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&Jr(t,e.scrollLeft,!0,!0),e.scrollToPos){Gr(t,Ur(t,U(n,e.scrollToPos.from),U(n,e.scrollToPos.to),e.scrollToPos.margin))}var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||Te(i[l],"hide");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&Te(o[s],"unhide");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&Te(t,"changes",t,e.changeObjs),e.update&&e.update.finish()}function dn(e,t){if(e.curOp)return t();on(e);try{return t()}finally{ln(e)}}function pn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);on(e);try{return t.apply(e,arguments)}finally{ln(e)}}}function gn(e){return function(){if(this.curOp)return e.apply(this,arguments);on(this);try{return e.apply(this,arguments)}finally{ln(this)}}}function vn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);on(t);try{return e.apply(this,arguments)}finally{ln(t)}}}function mn(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Zl&&pe(e.doc,t)<i.viewTo&&bn(e);else if(r<=i.viewFrom)Zl&&ge(e.doc,r+n)>i.viewFrom?bn(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)bn(e);else if(t<=i.viewFrom){var o=wn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):bn(e)}else if(r>=i.viewTo){var l=wn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):bn(e)}else{var s=wn(e,t,t,-1),a=wn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(vt(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):bn(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function yn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[kr(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==h(l,r)&&l.push(r)}}}function bn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function wn(e,t,r,n){var i,o=kr(e,t),l=e.display.view;if(!Zl||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;pe(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function xn(e,t,r){var n=e.display;0==n.view.length||t>=n.viewTo||r<=n.viewFrom?(n.view=vt(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=vt(e,t,n.viewFrom).concat(n.view):n.viewFrom<t&&(n.view=n.view.slice(kr(e,t))),n.viewFrom=t,n.viewTo<r?n.view=n.view.concat(vt(e,n.viewTo,r)):n.viewTo>r&&(n.view=n.view.slice(0,kr(e,r)))),n.viewTo=r}function Cn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function Sn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,u(Ln,e))}function Ln(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=$e(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?je(t.mode,n.state):null,a=_e(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var f=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),h=0;!f&&h<l.length;++h)f=l[h]!=o.styles[h];f&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&Ze(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return Sn(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&dn(e,function(){for(var t=0;t<i.length;t++)yn(e,i[t],"text")})}}function kn(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=Rt(e)+"px",t.sizer.style.marginBottom=-t.nativeBarWidth+"px",t.sizer.style.borderRightWidth=Rt(e)+"px",t.scrollbarsClipped=!0)}function Tn(e){if(e.hasFocus())return null;var t=l();if(!t||!o(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&o(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}function Mn(e){if(e&&e.activeElt&&e.activeElt!=l()&&(e.activeElt.focus(),e.anchorNode&&o(document.body,e.anchorNode)&&o(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}function Nn(e,r){var n=e.display,i=e.doc;if(r.editorIsHidden)return bn(e),!1;if(!r.force&&r.visible.from>=n.viewFrom&&r.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==Cn(e))return!1;Br(e)&&(bn(e),r.dims=wr(e));var o=i.first+i.size,l=Math.max(r.visible.from-e.options.viewportMargin,i.first),s=Math.min(o,r.visible.to+e.options.viewportMargin);n.viewFrom<l&&l-n.viewFrom<20&&(l=Math.max(i.first,n.viewFrom)),n.viewTo>s&&n.viewTo-s<20&&(s=Math.min(o,n.viewTo)),Zl&&(l=pe(e.doc,l),s=ge(e.doc,s));var a=l!=n.viewFrom||s!=n.viewTo||n.lastWrapHeight!=r.wrapperHeight||n.lastWrapWidth!=r.wrapperWidth;xn(e,l,s),n.viewOffset=ye(M(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var u=Cn(e);if(!a&&0==u&&!r.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var c=Tn(e);return u>4&&(n.lineDiv.style.display="none"),Wn(e,n.updateLineNumbers,r.dims),u>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,Mn(c),t(n.cursorDiv),t(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,a&&(n.lastWrapHeight=r.wrapperHeight,n.lastWrapWidth=r.wrapperWidth,Sn(e,400)),n.updateLineNumbers=null,!0}function On(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Bt(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+zt(e.display)-Gt(e),r.top)}),t.visible=Ir(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&Nn(e,t);n=!1){Er(e);var i=en(e);Tr(e),tn(e,i),Hn(e,i),t.force=!1}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function An(e,t){var r=new ks(e,t);if(Nn(e,r)){Er(e),On(e,r);var n=en(e);Tr(e),tn(e,n),Hn(e,n),r.finish()}}function Wn(e,r,n){function i(t){var r=t.nextSibling;return wl&&Al&&e.display.currentWheelTarget==t?t.style.display="none":t.parentNode.removeChild(t),r}for(var o=e.display,l=e.options.lineNumbers,s=o.lineDiv,a=s.firstChild,u=o.view,c=o.viewFrom,f=0;f<u.length;f++){var d=u[f];if(d.hidden);else if(d.node&&d.node.parentNode==s){for(;a!=d.node;)a=i(a);var p=l&&null!=r&&r<=c&&d.lineNumber;d.changes&&(h(d.changes,"gutter")>-1&&(p=!1),Ct(e,d,c,n)),p&&(t(d.lineNumber),d.lineNumber.appendChild(document.createTextNode(F(e.options,c)))),a=d.node.nextSibling}else{var g=At(e,d,c,n);s.insertBefore(g,a)}c+=d.size}for(;a;)a=i(a)}function Dn(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+"px"}function Hn(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Rt(e)+"px"}function Fn(e){var r=e.display.gutters,i=e.options.gutters;t(r);for(var o=0;o<i.length;++o){var l=i[o],s=r.appendChild(n("div",null,"CodeMirror-gutter "+l));"CodeMirror-linenumbers"==l&&(e.display.lineGutter=s,s.style.width=(e.display.lineNumWidth||1)+"px")}r.style.display=o?"":"none",Dn(e)}function Pn(e){var t=h(e.gutters,"CodeMirror-linenumbers");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function En(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function zn(e){var t=En(e);return t.x*=Ms,t.y*=Ms,t}function In(e,t){var r=En(t),n=r.x,i=r.y,o=e.display,l=o.scroller,s=l.scrollWidth>l.clientWidth,a=l.scrollHeight>l.clientHeight;if(n&&s||i&&a){if(i&&Al&&wl)e:for(var u=t.target,c=o.view;u!=l;u=u.parentNode)for(var f=0;f<c.length;f++)if(c[f].node==u){e.display.currentWheelTarget=u;break e}if(n&&!pl&&!Sl&&null!=Ms)return i&&a&&Zr(e,Math.max(0,l.scrollTop+i*Ms)),Jr(e,Math.max(0,l.scrollLeft+n*Ms)),(!i||i&&a)&&We(t),void(o.wheelStartX=null);if(i&&null!=Ms){var h=i*Ms,d=e.doc.scrollTop,p=d+o.wrapper.clientHeight;h<0?d=Math.max(0,d+h-50):p=Math.min(e.doc.height,p+h+50),An(e,{top:d,bottom:p})}Ts<20&&(null==o.wheelStartX?(o.wheelStartX=l.scrollLeft,o.wheelStartY=l.scrollTop,o.wheelDX=n,o.wheelDY=i,setTimeout(function(){if(null!=o.wheelStartX){var e=l.scrollLeft-o.wheelStartX,t=l.scrollTop-o.wheelStartY,r=t&&o.wheelDY&&t/o.wheelDY||e&&o.wheelDX&&e/o.wheelDX;o.wheelStartX=o.wheelStartY=null,r&&(Ms=(Ms*Ts+r)/(Ts+1),++Ts)}},200)):(o.wheelDX+=n,o.wheelDY+=i))}}function Rn(e,t){var r=e[t];e.sort(function(e,t){return E(e.from(),t.from())}),t=h(e,r);for(var n=1;n<e.length;n++){var i=e[n],o=e[n-1];if(E(o.to(),i.from())>=0){var l=B(o.from(),i.from()),s=R(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;n<=t&&--t,e.splice(--n,2,new Os(a?s:l,a?l:s))}}return new Ns(e,t)}function Bn(e,t){return new Ns([new Os(e,t||e)],0)}function Gn(e){return e.text?P(e.from.line+e.text.length-1,g(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Un(e,t){if(E(e,t.from)<0)return e;if(E(e,t.to)<=0)return Gn(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Gn(t).ch-t.to.ch),P(r,n)}function Vn(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new Os(Un(i.anchor,t),Un(i.head,t)))}return Rn(r,e.sel.primIndex)}function Kn(e,t,r){return e.line==t.line?P(r.line,e.ch-t.ch+r.ch):P(r.line+(e.line-t.line),e.ch)}function jn(e,t,r){for(var n=[],i=P(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=Kn(s.from,i,o),u=Kn(Gn(s),i,o);if(i=s.to,o=u,"around"==r){var c=e.sel.ranges[l],f=E(c.head,c.anchor)<0;n[l]=new Os(f?u:a,f?a:u)}else n[l]=new Os(a,a)}return new Ns(n,e.sel.primIndex)}function Xn(e){e.doc.mode=Ve(e.options,e.doc.modeOption),Yn(e)}function Yn(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Sn(e,100),
+e.state.modeGen++,e.curOp&&mn(e)}function _n(e,t){return 0==t.from.ch&&0==t.to.ch&&""==g(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function qn(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){ot(e,r,i,n),wt(e,"change",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new ps(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=M(e,s.line),f=M(e,a.line),h=g(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(_n(e,t)){var v=l(0,u.length-1);o(f,f.text,d),p&&e.remove(s.line,p),v.length&&e.insert(s.line,v)}else if(c==f)if(1==u.length)o(c,c.text.slice(0,s.ch)+h+c.text.slice(a.ch),d);else{var m=l(1,u.length-1);m.push(new ps(h+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,m)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+f.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(f,h+f.text.slice(a.ch),d);var y=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,y)}wt(e,"change",e,t)}function $n(e,t,r){function n(e,i,o){if(e.linked)for(var l=0;l<e.linked.length;++l){var s=e.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),n(s.doc,e,a))}}}n(e,null,!0)}function Zn(e,t){if(t.cm)throw new Error("This document is already in use.");e.doc=t,t.cm=e,Sr(e),Xn(e),Qn(e),e.options.lineWrapping||we(e),e.options.mode=t.modeOption,mn(e)}function Qn(e){("rtl"==e.doc.direction?s:zl)(e.display.lineDiv,"CodeMirror-rtl")}function Jn(e){dn(e,function(){Qn(e),mn(e)})}function ei(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function ti(e,t){var r={from:I(t.from),to:Gn(t),text:N(e,t.from,t.to)};return ai(e,r,t.from.line,t.to.line+1),$n(e,function(e){return ai(e,r,t.from.line,t.to.line+1)},!0),r}function ri(e){for(;e.length;){if(!g(e).ranges)break;e.pop()}}function ni(e,t){return t?(ri(e.done),g(e.done)):e.done.length&&!g(e.done).ranges?g(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),g(e.done)):void 0}function ii(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&e.cm&&i.lastModTime>s-e.cm.options.historyEventDelay||"*"==t.origin.charAt(0)))&&(o=ni(i,i.lastOp==n)))l=g(o.changes),0==E(t.from,t.to)&&0==E(t.from,l.to)?l.to=Gn(t):o.changes.push(ti(e,t));else{var a=g(i.done);for(a&&a.ranges||si(e.sel,i.done),o={changes:[ti(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||Te(e,"historyAdded")}function oi(e,t,r,n){var i=t.charAt(0);return"*"==i||"+"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function li(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||oi(e,o,g(i.done),t))?i.done[i.done.length-1]=t:si(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&!1!==n.clearRedo&&ri(i.undone)}function si(e,t){var r=g(t);r&&r.ranges&&r.equals(e)||t.push(e)}function ai(e,t,r,n){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=r.markedSpans),++o})}function ui(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function ci(e,t){var r=t["spans_"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(ui(r[i]));return n}function fi(e,t){var r=ci(e,t),n=J(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function hi(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?Ns.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var f in u)(c=f.match(/^spans_(\d+)$/))&&h(t,Number(c[1]))>-1&&(g(s)[f]=u[f],delete u[f])}}}return n}function di(e,t,r,n){if(n){var i=e.anchor;if(r){var o=E(t,i)<0;o!=E(r,i)<0?(i=t,t=r):o!=E(t,r)<0&&(t=r)}return new Os(i,t)}return new Os(r||t,t)}function pi(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),wi(e,new Ns([di(e.sel.primary(),t,r,i)],0),n)}function gi(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=di(e.sel.ranges[o],t[o],null,i);wi(e,Rn(n,e.sel.primIndex),r)}function vi(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,wi(e,Rn(i,e.sel.primIndex),n)}function mi(e,t,r,n){wi(e,Bn(t,r),n)}function yi(e,t,r){var n={ranges:t.ranges,update:function(t){var r=this;this.ranges=[];for(var n=0;n<t.length;n++)r.ranges[n]=new Os(U(e,t[n].anchor),U(e,t[n].head))},origin:r&&r.origin};return Te(e,"beforeSelectionChange",e,n),e.cm&&Te(e.cm,"beforeSelectionChange",e.cm,n),n.ranges!=t.ranges?Rn(n.ranges,n.ranges.length-1):t}function bi(e,t,r){var n=e.history.done,i=g(n);i&&i.ranges?(n[n.length-1]=t,xi(e,t,r)):wi(e,t,r)}function wi(e,t,r){xi(e,t,r),li(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function xi(e,t,r){(Oe(e,"beforeSelectionChange")||e.cm&&Oe(e.cm,"beforeSelectionChange"))&&(t=yi(e,t,r)),Ci(e,Li(e,t,r&&r.bias||(E(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||Xr(e.cm)}function Ci(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,Ne(e.cm)),wt(e,"cursorActivity",e))}function Si(e){Ci(e,Li(e,e.sel,null,!1))}function Li(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Ti(e,l.anchor,s&&s.anchor,r,n),u=Ti(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new Os(a,u))}return i?Rn(i,t.primIndex):t}function ki(e,t,r,n,i){var o=M(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker;if((null==s.from||(a.inclusiveLeft?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(a.inclusiveRight?s.to>=t.ch:s.to>t.ch))){if(i&&(Te(a,"beforeCursorEnter"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var u=a.find(n<0?1:-1),c=void 0;if((n<0?a.inclusiveRight:a.inclusiveLeft)&&(u=Mi(e,u,-n,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=E(u,r))&&(n<0?c<0:c>0))return ki(e,u,t,n,i)}var f=a.find(n<0?-1:1);return(n<0?a.inclusiveLeft:a.inclusiveRight)&&(f=Mi(e,f,n,f.line==t.line?o:null)),f?ki(e,f,t,n,i):null}}return t}function Ti(e,t,r,n,i){var o=n||1,l=ki(e,t,r,o,i)||!i&&ki(e,t,r,o,!0)||ki(e,t,r,-o,i)||!i&&ki(e,t,r,-o,!0);return l||(e.cantEdit=!0,P(e.first,0))}function Mi(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?U(e,P(t.line-1)):null:r>0&&t.ch==(n||M(e,t.line)).text.length?t.line<e.first+e.size-1?P(t.line+1,0):null:new P(t.line,t.ch+r)}function Ni(e){e.setSelection(P(e.firstLine(),0),P(e.lastLine()),Kl)}function Oi(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=U(e,t)),r&&(n.to=U(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),Te(e,"beforeChange",e,n),e.cm&&Te(e.cm,"beforeChange",e.cm,n),n.canceled?null:{from:n.from,to:n.to,text:n.text,origin:n.origin}}function Ai(e,t,r){if(e.cm){if(!e.cm.curOp)return pn(e.cm,Ai)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(Oe(e,"beforeChange")||e.cm&&Oe(e.cm,"beforeChange"))||(t=Oi(e,t,!0))){var n=$l&&!r&&te(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)Wi(e,{from:n[i].from,to:n[i].to,text:i?[""]:t.text,origin:t.origin});else Wi(e,t)}}function Wi(e,t){if(1!=t.text.length||""!=t.text[0]||0!=E(t.from,t.to)){var r=Vn(e,t);ii(e,t,r,e.cm?e.cm.curOp.id:NaN),Fi(e,t,r,J(e,t));var n=[];$n(e,function(e,r){r||-1!=h(n,e.history)||(Ri(e.history,t),n.push(e.history)),Fi(e,t,null,J(e,t))})}}function Di(e,t,r){if(!e.cm||!e.cm.state.suppressEdits||r){for(var n,i=e.history,o=e.sel,l="undo"==t?i.done:i.undone,s="undo"==t?i.undone:i.done,a=0;a<l.length&&(n=l[a],r?!n.ranges||n.equals(e.sel):n.ranges);a++);if(a!=l.length){for(i.lastOrigin=i.lastSelOrigin=null;n=l.pop(),n.ranges;){if(si(n,s),r&&!n.equals(e.sel))return void wi(e,n,{clearRedo:!1});o=n}var u=[];si(o,s),s.push({changes:u,generation:i.generation}),i.generation=n.generation||++i.maxGeneration;for(var c=Oe(e,"beforeChange")||e.cm&&Oe(e.cm,"beforeChange"),f=n.changes.length-1;f>=0;--f){var d=function(r){var i=n.changes[r];if(i.origin=t,c&&!Oi(e,i,!1))return l.length=0,{};u.push(ti(e,i));var o=r?Vn(e,i):g(l);Fi(e,i,o,fi(e,i)),!r&&e.cm&&e.cm.scrollIntoView({from:i.from,to:Gn(i)});var s=[];$n(e,function(e,t){t||-1!=h(s,e.history)||(Ri(e.history,i),s.push(e.history)),Fi(e,i,null,fi(e,i))})}(f);if(d)return d.v}}}}function Hi(e,t){if(0!=t&&(e.first+=t,e.sel=new Ns(v(e.sel.ranges,function(e){return new Os(P(e.anchor.line+t,e.anchor.ch),P(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){mn(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)yn(e.cm,n,"gutter")}}function Fi(e,t,r,n){if(e.cm&&!e.cm.curOp)return pn(e.cm,Fi)(e,t,r,n);if(t.to.line<e.first)return void Hi(e,t.text.length-1-(t.to.line-t.from.line));if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);Hi(e,i),t={from:P(e.first,0),to:P(t.to.line+i,t.to.ch),text:[g(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:P(o,M(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=N(e,t.from,t.to),r||(r=Vn(e,t)),e.cm?Pi(e.cm,t,n):qn(e,t,n),xi(e,r,Kl)}}function Pi(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=W(fe(M(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0})),n.sel.contains(t.from,t.to)>-1&&Ne(e),qn(n,t,r,Cr(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=be(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0)),it(n,o.line),Sn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?mn(e):o.line!=l.line||1!=t.text.length||_n(e.doc,t)?mn(e,o.line,l.line+1,u):yn(e,o.line,"text");var c=Oe(e,"changes"),f=Oe(e,"change");if(f||c){var h={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};f&&wt(e,"change",e,h),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(h)}e.display.selForContextMenu=null}function Ei(e,t,r,n,i){if(n||(n=r),E(n,r)<0){var o;o=[n,r],r=o[0],n=o[1]}"string"==typeof t&&(t=e.splitLines(t)),Ai(e,{from:r,to:n,text:t,origin:i})}function zi(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function Ii(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||(o=e[i]=o.deepCopy(),o.copied=!0);for(var s=0;s<o.ranges.length;s++)zi(o.ranges[s].anchor,t,r,n),zi(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=P(u.from.line+n,u.from.ch),u.to=P(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function Ri(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;Ii(e.done,r,n,i),Ii(e.undone,r,n,i)}function Bi(e,t,r,n){var i=t,o=t;return"number"==typeof t?o=M(e,G(e,t)):i=W(t),null==i?null:(n(o,i)&&e.cm&&yn(e.cm,i,r),o)}function Gi(e){var t=this;this.lines=e,this.parent=null;for(var r=0,n=0;n<e.length;++n)e[n].parent=t,r+=e[n].height;this.height=r}function Ui(e){var t=this;this.children=e;for(var r=0,n=0,i=0;i<e.length;++i){var o=e[i];r+=o.chunkSize(),n+=o.height,o.parent=t}this.size=r,this.height=n,this.parent=null}function Vi(e,t,r){ye(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&jr(e,r)}function Ki(e,t,r,n){var i=new As(e,r,n),o=e.cm;return o&&i.noHScroll&&(o.display.alignWidgets=!0),Bi(e,t,"widget",function(t){var r=t.widgets||(t.widgets=[]);if(null==i.insertAt?r.push(i):r.splice(Math.min(r.length-1,Math.max(0,i.insertAt)),0,i),i.line=t,o&&!ve(e,t)){var n=ye(t)<e.scrollTop;A(t,t.height+Ft(i)),n&&jr(o,i.height),o.curOp.forceUpdate=!0}return!0}),wt(o,"lineWidgetAdded",o,i,"number"==typeof t?t:W(t)),i}function ji(e,t,r,n,o){if(n&&n.shared)return Xi(e,t,r,n,o);if(e.cm&&!e.cm.curOp)return pn(e.cm,ji)(e,t,r,n,o);var l=new Ds(e,o),s=E(t,r);if(n&&c(n,l,!1),s>0||0==s&&!1!==l.clearWhenEmpty)return l;if(l.replacedWith&&(l.collapsed=!0,l.widgetNode=i("span",[l.replacedWith],"CodeMirror-widget"),n.handleMouseEvents||l.widgetNode.setAttribute("cm-ignore-events","true"),n.insertLeft&&(l.widgetNode.insertLeft=!0)),l.collapsed){if(ce(e,t.line,t,r,l)||t.line!=r.line&&ce(e,r.line,t,r,l))throw new Error("Inserting collapsed marker partially overlapping an existing one");X()}l.addToHistory&&ii(e,{from:t,to:r,origin:"markText"},e.sel,NaN);var a,u=t.line,f=e.cm;if(e.iter(u,r.line+1,function(e){f&&l.collapsed&&!f.options.lineWrapping&&fe(e)==f.display.maxLine&&(a=!0),l.collapsed&&u!=t.line&&A(e,0),$(e,new Y(l,u==t.line?t.ch:null,u==r.line?r.ch:null)),++u}),l.collapsed&&e.iter(t.line,r.line+1,function(t){ve(e,t)&&A(t,0)}),l.clearOnEnter&&ts(l,"beforeCursorEnter",function(){return l.clear()}),l.readOnly&&(j(),(e.history.done.length||e.history.undone.length)&&e.clearHistory()),l.collapsed&&(l.id=++Ws,l.atomic=!0),f){if(a&&(f.curOp.updateMaxLine=!0),l.collapsed)mn(f,t.line,r.line+1);else if(l.className||l.title||l.startStyle||l.endStyle||l.css)for(var h=t.line;h<=r.line;h++)yn(f,h,"text");l.atomic&&Si(f.doc),wt(f,"markerAdded",f,l)}return l}function Xi(e,t,r,n,i){n=c(n),n.shared=!1;var o=[ji(e,t,r,n,i)],l=o[0],s=n.widgetNode;return $n(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(ji(e,U(e,t),U(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=g(o)}),new Hs(o,l)}function Yi(e){return e.findMarks(P(e.first,0),e.clipPos(P(e.lastLine())),function(e){return e.parent})}function _i(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(E(o,l)){var s=ji(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}function qi(e){for(var t=0;t<e.length;t++)!function(t){var r=e[t],n=[r.primary.doc];$n(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==h(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}}(t)}function $i(e){var t=this;if(Ji(t),!Me(t,e)&&!Pt(t.display,e)){We(e),yl&&(Es=+new Date);var r=Lr(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),l=0,s=0;s<i;++s)!function(e,n){if(!t.options.allowDropFileTypes||-1!=h(t.options.allowDropFileTypes,e.type)){var s=new FileReader;s.onload=pn(t,function(){var e=s.result;if(/[\x00-\x08\x0e-\x1f]{2}/.test(e)&&(e=""),o[n]=e,++l==i){r=U(t.doc,r);var a={from:r,to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:"paste"};Ai(t.doc,a),bi(t.doc,Bn(r,Gn(a)))}}),s.readAsText(e)}}(n[s],s);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var a=e.dataTransfer.getData("Text");if(a){var u;if(t.state.draggingText&&!t.state.draggingText.copy&&(u=t.listSelections()),xi(t.doc,Bn(r,r)),u)for(var c=0;c<u.length;++c)Ei(t.doc,"",u[c].anchor,u[c].head,"drag");t.replaceSelection(a,"around","paste"),t.display.input.focus()}}catch(e){}}}}function Zi(e,t){if(yl&&(!e.state.draggingText||+new Date-Es<100))return void Fe(t);if(!Me(e,t)&&!Pt(e.display,t)&&(t.dataTransfer.setData("Text",e.getSelection()),t.dataTransfer.effectAllowed="copyMove",t.dataTransfer.setDragImage&&!Ll)){var r=n("img",null,null,"position: fixed; left: 0; top: 0;");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",Sl&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),Sl&&r.parentNode.removeChild(r)}}function Qi(e,t){var i=Lr(e,t);if(i){var o=document.createDocumentFragment();Nr(e,i,o),e.display.dragCursor||(e.display.dragCursor=n("div",null,"CodeMirror-cursors CodeMirror-dragcursors"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),r(e.display.dragCursor,o)}}function Ji(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function eo(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName("CodeMirror"),r=0;r<t.length;r++){var n=t[r].CodeMirror;n&&e(n)}}function to(){zs||(ro(),zs=!0)}function ro(){var e;ts(window,"resize",function(){null==e&&(e=setTimeout(function(){e=null,eo(no)},100))}),ts(window,"blur",function(){return eo(Pr)})}function no(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}function io(e){var t=e.split(/-(?!$)/);e=t[t.length-1];for(var r,n,i,o,l=0;l<t.length-1;l++){var s=t[l];if(/^(cmd|meta|m)$/i.test(s))o=!0;else if(/^a(lt)?$/i.test(s))r=!0;else if(/^(c|ctrl|control)$/i.test(s))n=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error("Unrecognized modifier name: "+s);i=!0}}return r&&(e="Alt-"+e),n&&(e="Ctrl-"+e),o&&(e="Cmd-"+e),i&&(e="Shift-"+e),e}function oo(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if("..."==n){delete e[r];continue}for(var i=v(r.split(" "),io),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(" "),l=n):(s=i.slice(0,o+1).join(" "),l="...");var a=t[s];if(a){if(a!=l)throw new Error("Inconsistent bindings for "+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function lo(e,t,r,n){t=co(t);var i=t.call?t.call(e,n):t[e];if(!1===i)return"nothing";if("..."===i)return"multi";if(null!=i&&r(i))return"handled";if(t.fallthrough){if("[object Array]"!=Object.prototype.toString.call(t.fallthrough))return lo(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=lo(e,t.fallthrough[o],r,n);if(l)return l}}}function so(e){var t="string"==typeof e?e:Is[e.keyCode];return"Ctrl"==t||"Alt"==t||"Shift"==t||"Mod"==t}function ao(e,t,r){var n=e;return t.altKey&&"Alt"!=n&&(e="Alt-"+e),(Pl?t.metaKey:t.ctrlKey)&&"Ctrl"!=n&&(e="Ctrl-"+e),(Pl?t.ctrlKey:t.metaKey)&&"Cmd"!=n&&(e="Cmd-"+e),!r&&t.shiftKey&&"Shift"!=n&&(e="Shift-"+e),e}function uo(e,t){if(Sl&&34==e.keyCode&&e.char)return!1;var r=Is[e.keyCode];return null!=r&&!e.altGraphKey&&ao(r,e,t)}function co(e){return"string"==typeof e?Us[e]:e}function fo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&E(o.from,g(n).to)<=0;){var l=n.pop();if(E(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}dn(e,function(){for(var t=n.length-1;t>=0;t--)Ei(e.doc,"",n[t].from,n[t].to,"+delete");Xr(e)})}function ho(e,t,r){var n=L(e.text,t+r,r);return n<0||n>e.text.length?null:n}function po(e,t,r){var n=ho(e,t.ch,r);return null==n?null:new P(t.line,n,r<0?"after":"before")}function go(e,t,r,n,i){if(e){var o=Se(r,t.doc.direction);if(o){var l,s=i<0?g(o):o[0],a=i<0==(1==s.level),u=a?"after":"before";if(s.level>0||"rtl"==t.doc.direction){var c=Yt(t,r);l=i<0?r.text.length-1:0;var f=_t(t,c,l).top;l=k(function(e){return _t(t,c,e).top==f},i<0==(1==s.level)?s.from:s.to-1,l),"before"==u&&(l=ho(r,l,1))}else l=i<0?s.to:s.from;return new P(n,l,u)}}return new P(n,i<0?r.text.length:0,i<0?"before":"after")}function vo(e,t,r,n){var i=Se(t,e.doc.direction);if(!i)return po(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky="before"):r.ch<=0&&(r.ch=0,r.sticky="after");var o=Ce(i,r.ch,r.sticky),l=i[o];if("ltr"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return po(t,r,n);var s,a=function(e,r){return ho(t,e instanceof P?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Yt(e,t),dr(e,t,s,r)):{begin:0,end:t.text.length}},c=u("before"==r.sticky?a(r,-1):r.ch);if("rtl"==e.doc.direction||1==l.level){var f=1==l.level==n<0,h=a(r,f?1:-1);if(null!=h&&(f?h<=l.to&&h<=c.end:h>=l.from&&h>=c.begin)){var d=f?"before":"after";return new P(r.line,h,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new P(r.line,a(e,1),"before"):new P(r.line,e,"after")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}function mo(e,t){var r=M(e.doc,t),n=fe(r);return n!=r&&(t=W(n)),go(!0,e,n,t,1)}function yo(e,t){var r=M(e.doc,t),n=he(r);return n!=r&&(t=W(n)),go(!0,e,r,t,-1)}function bo(e,t){var r=mo(e,t.line),n=M(e.doc,r.line),i=Se(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return P(r.line,l?0:o,r.sticky)}return r}function wo(e,t,r){if("string"==typeof t&&!(t=Vs[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=Vl}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}function xo(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=lo(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&lo(t,e.options.extraKeys,r,e)||lo(t,e.options.keyMap,r,e)}function Co(e,t,r,n){var i=e.state.keySeq;if(i){if(so(t))return"handled";if(/\'$/.test(t)?e.state.keySeq=null:Ks.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),So(e,i+" "+t,r,n))return!0}return So(e,t,r,n)}function So(e,t,r,n){var i=xo(e,t,n);return"multi"==i&&(e.state.keySeq=t),"handled"==i&&wt(e,"keyHandled",e,t,r),"handled"!=i&&"multi"!=i||(We(r),Wr(e)),!!i}function Lo(e,t){var r=uo(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?Co(e,"Shift-"+r,t,function(t){return wo(e,t,!0)})||Co(e,r,t,function(t){if("string"==typeof t?/^go[A-Z]/.test(t):t.motion)return wo(e,t)}):Co(e,r,t,function(t){return wo(e,t)}))}function ko(e,t,r){return Co(e,"'"+r+"'",t,function(t){return wo(e,t,!0)})}function To(e){var t=this;if(t.curOp.focus=l(),!Me(t,e)){yl&&bl<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=Lo(t,e);Sl&&(js=n?r:null,!n&&88==r&&!os&&(Al?e.metaKey:e.ctrlKey)&&t.replaceSelection("",null,"cut")),18!=r||/\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className)||Mo(t)}}function Mo(e){function t(e){18!=e.keyCode&&e.altKey||(zl(r,"CodeMirror-crosshair"),ke(document,"keyup",t),ke(document,"mouseover",t))}var r=e.display.lineDiv;s(r,"CodeMirror-crosshair"),ts(document,"keyup",t),ts(document,"mouseover",t)}function No(e){16==e.keyCode&&(this.doc.sel.shift=!1),Me(this,e)}function Oo(e){var t=this;if(!(Pt(t.display,e)||Me(t,e)||e.ctrlKey&&!e.altKey||Al&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(Sl&&r==js)return js=null,void We(e);if(!Sl||e.which&&!(e.which<10)||!Lo(t,e)){var i=String.fromCharCode(null==n?r:n);"\b"!=i&&(ko(t,e,i)||t.display.input.onKeyPress(e))}}}function Ao(e,t){var r=+new Date;return _s&&_s.compare(r,e,t)?(Ys=_s=null,"triple"):Ys&&Ys.compare(r,e,t)?(_s=new Xs(r,e,t),Ys=null,"double"):(Ys=new Xs(r,e,t),_s=null,"single")}function Wo(e){var t=this,r=t.display;if(!(Me(t,e)||r.activeTouch&&r.input.supportsTouch())){if(r.input.ensurePolled(),r.shift=e.shiftKey,Pt(r,e))return void(wl||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100)));if(!Bo(t,e)){var n=Lr(t,e),i=Ee(e),o=n?Ao(n,i):"single";window.focus(),1==i&&t.state.selectingText&&t.state.selectingText(e),n&&Do(t,i,n,o,e)||(1==i?n?Fo(t,n,o,e):Pe(e)==r.scroller&&We(e):2==i?(n&&pi(t.doc,n),setTimeout(function(){return r.input.focus()},20)):3==i&&(El?Go(t,e):Hr(t)))}}}function Do(e,t,r,n,i){var o="Click";return"double"==n?o="Double"+o:"triple"==n&&(o="Triple"+o),o=(1==t?"Left":2==t?"Middle":"Right")+o,Co(e,ao(o,i),i,function(t){if("string"==typeof t&&(t=Vs[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=Vl}finally{e.state.suppressEdits=!1}return n})}function Ho(e,t,r){var n=e.getOption("configureMouse"),i=n?n(e,t,r):{};if(null==i.unit){var o=Wl?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?"rectangle":"single"==t?"char":"double"==t?"word":"line"}return(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey),null==i.addNew&&(i.addNew=Al?r.metaKey:r.ctrlKey),null==i.moveOnDrag&&(i.moveOnDrag=!(Al?r.altKey:r.ctrlKey)),i}function Fo(e,t,r,n){yl?setTimeout(u(Dr,e),0):e.curOp.focus=l();var i,o=Ho(e,r,n),s=e.doc.sel;e.options.dragDrop&&rs&&!e.isReadOnly()&&"single"==r&&(i=s.contains(t))>-1&&(E((i=s.ranges[i]).from(),t)<0||t.xRel>0)&&(E(i.to(),t)>0||t.xRel<0)?Po(e,n,t,o):zo(e,n,t,o)}function Po(e,t,r,n){var i=e.display,o=!1,l=pn(e,function(t){wl&&(i.scroller.draggable=!1),e.state.draggingText=!1,ke(document,"mouseup",l),ke(document,"mousemove",s),ke(i.scroller,"dragstart",a),ke(i.scroller,"drop",l),o||(We(t),n.addNew||pi(e.doc,r,null,null,n.extend),wl||yl&&9==bl?setTimeout(function(){document.body.focus(),i.input.focus()},20):i.input.focus())}),s=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},a=function(){return o=!0};wl&&(i.scroller.draggable=!0),e.state.draggingText=l,l.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop(),ts(document,"mouseup",l),ts(document,"mousemove",s),ts(i.scroller,"dragstart",a),ts(i.scroller,"drop",l),Hr(e),setTimeout(function(){return i.input.focus()},20)}function Eo(e,t,r){if("char"==r)return new Os(t,t);if("word"==r)return e.findWordAt(t);if("line"==r)return new Os(P(t.line,0),U(e.doc,P(t.line+1,0)));var n=r(e,t);return new Os(n.from,n.to)}function zo(e,t,r,n){function i(t){if(0!=E(m,t))if(m=t,"rectangle"==n.unit){for(var i=[],o=e.options.tabSize,l=f(M(u,r.line).text,r.ch,o),s=f(M(u,t.line).text,t.ch,o),a=Math.min(l,s),g=Math.max(l,s),v=Math.min(r.line,t.line),y=Math.min(e.lastLine(),Math.max(r.line,t.line));v<=y;v++){var b=M(u,v).text,w=d(b,a,o);a==g?i.push(new Os(P(v,w),P(v,w))):b.length>w&&i.push(new Os(P(v,w),P(v,d(b,g,o))))}i.length||i.push(new Os(r,r)),wi(u,Rn(p.ranges.slice(0,h).concat(i),h),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var x,C=c,S=Eo(e,t,n.unit),L=C.anchor;E(S.anchor,L)>0?(x=S.head,L=B(C.from(),S.anchor)):(x=S.anchor,L=R(C.to(),S.head));var k=p.ranges.slice(0);k[h]=Io(e,new Os(U(u,L),x)),wi(u,Rn(k,h),jl)}}function o(t){var r=++b,s=Lr(e,t,!0,"rectangle"==n.unit);if(s)if(0!=E(s,m)){e.curOp.focus=l(),i(s);var c=Ir(a,u);(s.line>=c.to||s.line<c.from)&&setTimeout(pn(e,function(){b==r&&o(t)}),150)}else{var f=t.clientY<y.top?-20:t.clientY>y.bottom?20:0;f&&setTimeout(pn(e,function(){b==r&&(a.scroller.scrollTop+=f,o(t))}),50)}}function s(t){e.state.selectingText=!1,b=1/0,We(t),a.input.focus(),ke(document,"mousemove",w),ke(document,"mouseup",x),u.history.lastSelOrigin=null}var a=e.display,u=e.doc;We(t);var c,h,p=u.sel,g=p.ranges;if(n.addNew&&!n.extend?(h=u.sel.contains(r),c=h>-1?g[h]:new Os(r,r)):(c=u.sel.primary(),h=u.sel.primIndex),"rectangle"==n.unit)n.addNew||(c=new Os(r,r)),r=Lr(e,t,!0,!0),h=-1;else{var v=Eo(e,r,n.unit);c=n.extend?di(c,v.anchor,v.head,n.extend):v}n.addNew?-1==h?(h=g.length,wi(u,Rn(g.concat([c]),h),{scroll:!1,origin:"*mouse"})):g.length>1&&g[h].empty()&&"char"==n.unit&&!n.extend?(wi(u,Rn(g.slice(0,h).concat(g.slice(h+1)),0),{scroll:!1,origin:"*mouse"}),p=u.sel):vi(u,h,c,jl):(h=0,wi(u,new Ns([c],0),jl),p=u.sel);var m=r,y=a.wrapper.getBoundingClientRect(),b=0,w=pn(e,function(e){Ee(e)?o(e):s(e)}),x=pn(e,s);e.state.selectingText=x,ts(document,"mousemove",w),ts(document,"mouseup",x)}function Io(e,t){var r=t.anchor,n=t.head,i=M(e.doc,r.line);if(0==E(r,n)&&r.sticky==n.sticky)return t;var o=Se(i);if(!o)return t;var l=Ce(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==a||a==o.length)return t;var u;if(n.line!=r.line)u=(n.line-r.line)*("ltr"==e.doc.direction?1:-1)>0;else{var c=Ce(o,n.ch,n.sticky),f=c-l||(n.ch-r.ch)*(1==s.level?-1:1);u=c==a-1||c==a?f<0:f>0}var h=o[a+(u?-1:0)],d=u==(1==h.level),p=d?h.from:h.to,g=d?"after":"before";return r.ch==p&&r.sticky==g?t:new Os(new P(r.line,p,g),n)}function Ro(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&We(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!Oe(e,r))return He(t);o-=s.top-l.viewOffset;for(var a=0;a<e.options.gutters.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i){return Te(e,r,e,D(e.doc,o),e.options.gutters[a],t),He(t)}}}function Bo(e,t){return Ro(e,t,"gutterClick",!0)}function Go(e,t){Pt(e.display,t)||Uo(e,t)||Me(e,t,"contextmenu")||e.display.input.onContextMenu(t)}function Uo(e,t){return!!Oe(e,"gutterContextMenu")&&Ro(e,t,"gutterContextMenu",!1)}function Vo(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+e.options.theme.replace(/(^|\s)\s*/g," cm-s-"),tr(e)}function Ko(e){Fn(e),mn(e),Rr(e)}function jo(e,t,r){if(!t!=!(r&&r!=qs)){var n=e.display.dragFunctions,i=t?ts:ke;i(e.display.scroller,"dragstart",n.start),i(e.display.scroller,"dragenter",n.enter),i(e.display.scroller,"dragover",n.over),i(e.display.scroller,"dragleave",n.leave),i(e.display.scroller,"drop",n.drop)}}function Xo(e){e.options.lineWrapping?(s(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(zl(e.display.wrapper,"CodeMirror-wrap"),we(e)),Sr(e),mn(e),tr(e),setTimeout(function(){return tn(e)},100)}function Yo(e,t){var r=this;if(!(this instanceof Yo))return new Yo(e,t);this.options=t=t?c(t):{},c($s,t,!1),Pn(t);var n=t.value;"string"==typeof n&&(n=new Ps(n,t.mode,null,t.lineSeparator,t.direction)),this.doc=n;var i=new Yo.inputStyles[t.inputStyle](this),o=this.display=new T(e,n,i);o.wrapper.CodeMirror=this,Fn(this),Vo(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),nn(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new Rl,keySeq:null,specialChars:null},t.autofocus&&!Ol&&o.input.focus(),yl&&bl<11&&setTimeout(function(){return r.display.input.reset(!0)},20),_o(this),to(),on(this),this.curOp.forceUpdate=!0,Zn(this,n),t.autofocus&&!Ol||this.hasFocus()?setTimeout(u(Fr,this),20):Pr(this);for(var l in Zs)Zs.hasOwnProperty(l)&&Zs[l](r,t[l],qs);Br(this),t.finishInit&&t.finishInit(this);for(var s=0;s<Qs.length;++s)Qs[s](r);ln(this),wl&&t.lineWrapping&&"optimizelegibility"==getComputedStyle(o.lineDiv).textRendering&&(o.lineDiv.style.textRendering="auto")}function _o(e){function t(){i.activeTouch&&(o=setTimeout(function(){return i.activeTouch=null},1e3),l=i.activeTouch,l.end=+new Date)}function r(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}function n(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}var i=e.display;ts(i.scroller,"mousedown",pn(e,Wo)),yl&&bl<11?ts(i.scroller,"dblclick",pn(e,function(t){if(!Me(e,t)){var r=Lr(e,t);if(r&&!Bo(e,t)&&!Pt(e.display,t)){We(t);var n=e.findWordAt(r);pi(e.doc,n.anchor,n.head)}}})):ts(i.scroller,"dblclick",function(t){return Me(e,t)||We(t)}),El||ts(i.scroller,"contextmenu",function(t){return Go(e,t)});var o,l={end:0};ts(i.scroller,"touchstart",function(t){if(!Me(e,t)&&!r(t)&&!Bo(e,t)){i.input.ensurePolled(),clearTimeout(o);var n=+new Date;i.activeTouch={start:n,moved:!1,prev:n-l.end<=300?l:null},1==t.touches.length&&(i.activeTouch.left=t.touches[0].pageX,i.activeTouch.top=t.touches[0].pageY)}}),ts(i.scroller,"touchmove",function(){i.activeTouch&&(i.activeTouch.moved=!0)}),
+ts(i.scroller,"touchend",function(r){var o=i.activeTouch;if(o&&!Pt(i,r)&&null!=o.left&&!o.moved&&new Date-o.start<300){var l,s=e.coordsChar(i.activeTouch,"page");l=!o.prev||n(o,o.prev)?new Os(s,s):!o.prev.prev||n(o,o.prev.prev)?e.findWordAt(s):new Os(P(s.line,0),U(e.doc,P(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),We(r)}t()}),ts(i.scroller,"touchcancel",t),ts(i.scroller,"scroll",function(){i.scroller.clientHeight&&(Zr(e,i.scroller.scrollTop),Jr(e,i.scroller.scrollLeft,!0),Te(e,"scroll",e))}),ts(i.scroller,"mousewheel",function(t){return In(e,t)}),ts(i.scroller,"DOMMouseScroll",function(t){return In(e,t)}),ts(i.wrapper,"scroll",function(){return i.wrapper.scrollTop=i.wrapper.scrollLeft=0}),i.dragFunctions={enter:function(t){Me(e,t)||Fe(t)},over:function(t){Me(e,t)||(Qi(e,t),Fe(t))},start:function(t){return Zi(e,t)},drop:pn(e,$i),leave:function(t){Me(e,t)||Ji(e)}};var s=i.input.getField();ts(s,"keyup",function(t){return No.call(e,t)}),ts(s,"keydown",pn(e,To)),ts(s,"keypress",pn(e,Oo)),ts(s,"focus",function(t){return Fr(e,t)}),ts(s,"blur",function(t){return Pr(e,t)})}function qo(e,t,r,n){var i,o=e.doc;null==r&&(r="add"),"smart"==r&&(o.mode.indent?i=$e(e,t).state:r="prev");var l=e.options.tabSize,s=M(o,t),a=f(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\s*/)[0];if(n||/\S/.test(s.text)){if("smart"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==Vl||u>150)){if(!n)return;r="prev"}}else u=0,r="not";"prev"==r?u=t>o.first?f(M(o,t-1).text,null,l):0:"add"==r?u=a+e.options.indentUnit:"subtract"==r?u=a-e.options.indentUnit:"number"==typeof r&&(u=a+r),u=Math.max(0,u);var h="",d=0;if(e.options.indentWithTabs)for(var g=Math.floor(u/l);g;--g)d+=l,h+="\t";if(d<u&&(h+=p(u-d)),h!=c)return Ei(o,h,P(t,0),P(t,c.length),"+input"),s.stateAfter=null,!0;for(var v=0;v<o.sel.ranges.length;v++){var m=o.sel.ranges[v];if(m.head.line==t&&m.head.ch<c.length){var y=P(t,c.length);vi(o,v,new Os(y,y));break}}}function $o(e){Js=e}function Zo(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l=e.state.pasteIncoming||"paste"==i,s=ns(t),a=null;if(l&&n.ranges.length>1)if(Js&&Js.text.join("\n")==t){if(n.ranges.length%Js.text.length==0){a=[];for(var u=0;u<Js.text.length;u++)a.push(o.splitLines(Js.text[u]))}}else s.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(a=v(s,function(e){return[e]}));for(var c,f=n.ranges.length-1;f>=0;f--){var h=n.ranges[f],d=h.from(),p=h.to();h.empty()&&(r&&r>0?d=P(d.line,d.ch-r):e.state.overwrite&&!l?p=P(p.line,Math.min(M(o,p.line).text.length,p.ch+g(s).length)):Js&&Js.lineWise&&Js.text.join("\n")==t&&(d=p=P(d.line,0))),c=e.curOp.updateInput;var m={from:d,to:p,text:a?a[f%a.length]:s,origin:i||(l?"paste":e.state.cutIncoming?"cut":"+input")};Ai(e.doc,m),wt(e,"inputRead",e,m)}t&&!l&&Jo(e,t),Xr(e),e.curOp.updateInput=c,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Qo(e,t){var r=e.clipboardData&&e.clipboardData.getData("Text");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||dn(t,function(){return Zo(t,r,0,null,"paste")}),!0}function Jo(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=qo(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(M(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=qo(e,i.head.line,"smart"));l&&wt(e,"electricInput",e,i.head.line)}}}function el(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:P(i,0),head:P(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function tl(e,t){e.setAttribute("autocorrect","off"),e.setAttribute("autocapitalize","off"),e.setAttribute("spellcheck",!!t)}function rl(){var e=n("textarea",null,null,"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"),t=n("div",[e],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");return wl?e.style.width="1000px":e.setAttribute("wrap","off"),Ml&&(e.style.border="1px solid black"),tl(e),t}function nl(e,t,r,n,i){function o(){var n=t.line+r;return!(n<e.first||n>=e.first+e.size)&&(t=new P(n,t.ch,t.sticky),u=M(e,n))}function l(n){var l;if(null==(l=i?vo(e.cm,u,t,r):po(u,t,r))){if(n||!o())return!1;t=go(i,e.cm,u,t.line,r)}else t=l;return!0}var s=t,a=r,u=M(e,t.line);if("char"==n)l();else if("column"==n)l(!0);else if("word"==n||"group"==n)for(var c=null,f="group"==n,h=e.cm&&e.cm.getHelper(t,"wordChars"),d=!0;!(r<0)||l(!d);d=!1){var p=u.text.charAt(t.ch)||"\n",g=x(p,h)?"w":f&&"\n"==p?"n":!f||/\s/.test(p)?null:"p";if(!f||d||g||(g="s"),c&&c!=g){r<0&&(r=1,l(),t.sticky="after");break}if(g&&(c=g),r>0&&!l(!d))break}var v=Ti(e,t,s,a,!0);return z(s,v)&&(v.hitSide=!0),v}function il(e,t,r,n){var i,o=e.doc,l=t.left;if("page"==n){var s=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),a=Math.max(s-.5*yr(e.display),3);i=(r>0?t.bottom:t.top)+r*a}else"line"==n&&(i=r>0?t.bottom+3:t.top-3);for(var u;u=fr(e,l,i),u.outside;){if(r<0?i<=0:i>=o.height){u.hitSide=!0;break}i+=5*r}return u}function ol(e,t){var r=Xt(e,t.line);if(!r||r.hidden)return null;var n=M(e.doc,t.line),i=Vt(r,n,t.line),o=Se(n,e.doc.direction),l="left";if(o){l=Ce(o,t.ch)%2?"right":"left"}var s=qt(i.map,t.ch,l);return s.offset="right"==s.collapse?s.end:s.start,s}function ll(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}function sl(e,t){return t&&(e.bad=!0),e}function al(e,t,r,n,i){function o(e){return function(t){return t.id==e}}function l(){c&&(u+=f,c=!1)}function s(e){e&&(l(),u+=e)}function a(t){if(1==t.nodeType){var r=t.getAttribute("cm-text");if(null!=r)return void s(r||t.textContent.replace(/\u200b/g,""));var u,h=t.getAttribute("cm-marker");if(h){var d=e.findMarks(P(n,0),P(i+1,0),o(+h));return void(d.length&&(u=d[0].find(0))&&s(N(e.doc,u.from,u.to).join(f)))}if("false"==t.getAttribute("contenteditable"))return;var p=/^(pre|div|p)$/i.test(t.nodeName);p&&l();for(var g=0;g<t.childNodes.length;g++)a(t.childNodes[g]);p&&(c=!0)}else 3==t.nodeType&&s(t.nodeValue)}for(var u="",c=!1,f=e.doc.lineSeparator();a(t),t!=r;)t=t.nextSibling;return u}function ul(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return sl(e.clipPos(P(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return cl(o,t,r)}}function cl(e,t,r){function n(t,r,n){for(var i=-1;i<(f?f.length:0);i++)for(var o=i<0?c.map:f[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var a=W(i<0?e.line:e.rest[i]),u=o[l]+n;return(n<0||s!=t)&&(u=o[l+(n?1:0)]),P(a,u)}}}var i=e.text.firstChild,l=!1;if(!t||!o(i,t))return sl(P(W(e.line),0),!0);if(t==i&&(l=!0,t=i.childNodes[r],r=0,!t)){var s=e.rest?g(e.rest):e.line;return sl(P(W(s),s.text.length),l)}var a=3==t.nodeType?t:null,u=t;for(a||1!=t.childNodes.length||3!=t.firstChild.nodeType||(a=t.firstChild,r&&(r=a.nodeValue.length));u.parentNode!=i;)u=u.parentNode;var c=e.measure,f=c.maps,h=n(a,u,r);if(h)return sl(h,l);for(var d=u.nextSibling,p=a?a.nodeValue.length-r:0;d;d=d.nextSibling){if(h=n(d,d.firstChild,0))return sl(P(h.line,h.ch-p),l);p+=d.textContent.length}for(var v=u.previousSibling,m=r;v;v=v.previousSibling){if(h=n(v,v.firstChild,-1))return sl(P(h.line,h.ch+m),l);m+=v.textContent.length}}function fl(e,t){function r(){e.value=a.getValue()}if(t=t?c(t):{},t.value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var n=l();t.autofocus=n==e||null!=e.getAttribute("autofocus")&&n==document.body}var i;if(e.form&&(ts(e.form,"submit",r),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var s=o.submit=function(){r(),o.submit=i,o.submit(),o.submit=s}}catch(e){}}t.finishInit=function(t){t.save=r,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,r(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display="",e.form&&(ke(e.form,"submit",r),"function"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display="none";var a=Yo(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return a}var hl=navigator.userAgent,dl=navigator.platform,pl=/gecko\/\d/i.test(hl),gl=/MSIE \d/.test(hl),vl=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(hl),ml=/Edge\/(\d+)/.exec(hl),yl=gl||vl||ml,bl=yl&&(gl?document.documentMode||6:+(ml||vl)[1]),wl=!ml&&/WebKit\//.test(hl),xl=wl&&/Qt\/\d+\.\d+/.test(hl),Cl=!ml&&/Chrome\//.test(hl),Sl=/Opera\//.test(hl),Ll=/Apple Computer/.test(navigator.vendor),kl=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(hl),Tl=/PhantomJS/.test(hl),Ml=!ml&&/AppleWebKit/.test(hl)&&/Mobile\/\w+/.test(hl),Nl=/Android/.test(hl),Ol=Ml||Nl||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(hl),Al=Ml||/Mac/.test(dl),Wl=/\bCrOS\b/.test(hl),Dl=/win/i.test(dl),Hl=Sl&&hl.match(/Version\/(\d*\.\d*)/);Hl&&(Hl=Number(Hl[1])),Hl&&Hl>=15&&(Sl=!1,wl=!0);var Fl,Pl=Al&&(xl||Sl&&(null==Hl||Hl<12.11)),El=pl||yl&&bl>=9,zl=function(t,r){var n=t.className,i=e(r).exec(n);if(i){var o=n.slice(i.index+i[0].length);t.className=n.slice(0,i.index)+(o?i[1]+o:"")}};Fl=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd("character",r),n.moveStart("character",t),n};var Il=function(e){e.select()};Ml?Il=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:yl&&(Il=function(e){try{e.select()}catch(e){}});var Rl=function(){this.id=null};Rl.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var Bl,Gl,Ul=30,Vl={toString:function(){return"CodeMirror.Pass"}},Kl={scroll:!1},jl={origin:"*mouse"},Xl={origin:"+move"},Yl=[""],_l=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,ql=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,$l=!1,Zl=!1,Ql=null,Jl=function(){function e(e){return e<=247?r.charAt(e):1424<=e&&e<=1524?"R":1536<=e&&e<=1785?n.charAt(e-1536):1774<=e&&e<=2220?"r":8192<=e&&e<=8203?"w":8204==e?"b":"L"}function t(e,t,r){this.level=e,this.from=t,this.to=r}var r="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",n="nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111",i=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,o=/[stwN]/,l=/[LRr]/,s=/[Lb1n]/,a=/[1n]/;return function(r,n){var u="ltr"==n?"L":"R";if(0==r.length||"ltr"==n&&!i.test(r))return!1;for(var c=r.length,f=[],h=0;h<c;++h)f.push(e(r.charCodeAt(h)));for(var d=0,p=u;d<c;++d){var v=f[d];"m"==v?f[d]=p:p=v}for(var m=0,y=u;m<c;++m){var b=f[m];"1"==b&&"r"==y?f[m]="n":l.test(b)&&(y=b,"r"==b&&(f[m]="R"))}for(var w=1,x=f[0];w<c-1;++w){var C=f[w];"+"==C&&"1"==x&&"1"==f[w+1]?f[w]="1":","!=C||x!=f[w+1]||"1"!=x&&"n"!=x||(f[w]=x),x=C}for(var S=0;S<c;++S){var L=f[S];if(","==L)f[S]="N";else if("%"==L){var k=void 0;for(k=S+1;k<c&&"%"==f[k];++k);for(var T=S&&"!"==f[S-1]||k<c&&"1"==f[k]?"1":"N",M=S;M<k;++M)f[M]=T;S=k-1}}for(var N=0,O=u;N<c;++N){var A=f[N];"L"==O&&"1"==A?f[N]="L":l.test(A)&&(O=A)}for(var W=0;W<c;++W)if(o.test(f[W])){var D=void 0;for(D=W+1;D<c&&o.test(f[D]);++D);for(var H="L"==(W?f[W-1]:u),F="L"==(D<c?f[D]:u),P=H==F?H?"L":"R":u,E=W;E<D;++E)f[E]=P;W=D-1}for(var z,I=[],R=0;R<c;)if(s.test(f[R])){var B=R;for(++R;R<c&&s.test(f[R]);++R);I.push(new t(0,B,R))}else{var G=R,U=I.length;for(++R;R<c&&"L"!=f[R];++R);for(var V=G;V<R;)if(a.test(f[V])){G<V&&I.splice(U,0,new t(1,G,V));var K=V;for(++V;V<R&&a.test(f[V]);++V);I.splice(U,0,new t(2,K,V)),G=V}else++V;G<R&&I.splice(U,0,new t(1,G,R))}return"ltr"==n&&(1==I[0].level&&(z=r.match(/^\s+/))&&(I[0].from=z[0].length,I.unshift(new t(0,0,z[0].length))),1==g(I).level&&(z=r.match(/\s+$/))&&(g(I).to-=z[0].length,I.push(new t(0,c-z[0].length,c)))),"rtl"==n?I.reverse():I}}(),es=[],ts=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent("on"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||es).concat(r)}},rs=function(){if(yl&&bl<9)return!1;var e=n("div");return"draggable"in e||"dragDrop"in e}(),ns=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\r\n?|\n/)},is=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints("StartToEnd",t)},os=function(){var e=n("div");return"oncopy"in e||(e.setAttribute("oncopy","return;"),"function"==typeof e.oncopy)}(),ls=null,ss={},as={},us={},cs=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};cs.prototype.eol=function(){return this.pos>=this.string.length},cs.prototype.sol=function(){return this.pos==this.lineStart},cs.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},cs.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},cs.prototype.eat=function(e){var t=this.string.charAt(this.pos);if("string"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},cs.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},cs.prototype.eatSpace=function(){for(var e=this,t=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++e.pos;return this.pos>t},cs.prototype.skipToEnd=function(){this.pos=this.string.length},cs.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},cs.prototype.backUp=function(e){this.pos-=e},cs.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=f(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?f(this.string,this.lineStart,this.tabSize):0)},cs.prototype.indentation=function(){return f(this.string,null,this.tabSize)-(this.lineStart?f(this.string,this.lineStart,this.tabSize):0)},cs.prototype.match=function(e,t,r){if("string"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},cs.prototype.current=function(){return this.string.slice(this.start,this.pos)},cs.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},cs.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},cs.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var fs=function(e,t){this.state=e,this.lookAhead=t},hs=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};hs.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},hs.prototype.baseToken=function(e){var t=this;if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)t.baseTokenPos+=2;var r=this.baseTokens[this.baseTokenPos+1];return{type:r&&r.replace(/( |^)overlay .*/,""),size:this.baseTokens[this.baseTokenPos]-e}},hs.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},hs.fromSaved=function(e,t,r){return t instanceof fs?new hs(e,je(e.mode,t.state),r,t.lookAhead):new hs(e,je(e.mode,t),r)},hs.prototype.save=function(e){var t=!1!==e?je(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new fs(t,this.maxLookAhead):t};var ds=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r},ps=function(e,t,r){this.text=e,ne(this,t),this.height=r?r(this):1};ps.prototype.lineNo=function(){return W(this)},Ae(ps);var gs,vs={},ms={},ys=null,bs=null,ws={left:0,right:0,top:0,bottom:0},xs=function(e,t,r){this.cm=r;var i=this.vert=n("div",[n("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),o=this.horiz=n("div",[n("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e(i),e(o),ts(i,"scroll",function(){i.clientHeight&&t(i.scrollTop,"vertical")}),ts(o,"scroll",function(){o.clientWidth&&t(o.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,yl&&bl<8&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")};xs.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display="block",this.vert.style.bottom=t?n+"px":"0";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=r?n+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},xs.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,"horiz")},xs.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,"vert")},xs.prototype.zeroWidthHack=function(){var e=Al&&!kl?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new Rl,this.disableVert=new Rl},xs.prototype.enableZeroWidthBar=function(e,t,r){function n(){var i=e.getBoundingClientRect();("vert"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents="none":t.set(1e3,n)}e.style.pointerEvents="auto",t.set(1e3,n)},xs.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Cs=function(){};Cs.prototype.update=function(){return{bottom:0,right:0}},Cs.prototype.setScrollLeft=function(){},Cs.prototype.setScrollTop=function(){},Cs.prototype.clear=function(){};var Ss={native:xs,null:Cs},Ls=0,ks=function(e,t,r){var n=e.display;this.viewport=t,this.visible=Ir(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Bt(e),this.force=r,this.dims=wr(e),this.events=[]};ks.prototype.signal=function(e,t){Oe(e,t)&&this.events.push(arguments)},ks.prototype.finish=function(){for(var e=this,t=0;t<this.events.length;t++)Te.apply(null,e.events[t])};var Ts=0,Ms=null;yl?Ms=-.53:pl?Ms=15:Cl?Ms=-.7:Ll&&(Ms=-1/3);var Ns=function(e,t){this.ranges=e,this.primIndex=t};Ns.prototype.primary=function(){return this.ranges[this.primIndex]},Ns.prototype.equals=function(e){var t=this;if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var r=0;r<this.ranges.length;r++){var n=t.ranges[r],i=e.ranges[r];if(!z(n.anchor,i.anchor)||!z(n.head,i.head))return!1}return!0},Ns.prototype.deepCopy=function(){for(var e=this,t=[],r=0;r<this.ranges.length;r++)t[r]=new Os(I(e.ranges[r].anchor),I(e.ranges[r].head));return new Ns(t,this.primIndex)},Ns.prototype.somethingSelected=function(){for(var e=this,t=0;t<this.ranges.length;t++)if(!e.ranges[t].empty())return!0;return!1},Ns.prototype.contains=function(e,t){var r=this;t||(t=e);for(var n=0;n<this.ranges.length;n++){var i=r.ranges[n];if(E(t,i.from())>=0&&E(e,i.to())<=0)return n}return-1};var Os=function(e,t){this.anchor=e,this.head=t};Os.prototype.from=function(){return B(this.anchor,this.head)},Os.prototype.to=function(){return R(this.anchor,this.head)},Os.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},Gi.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r=this,n=e,i=e+t;n<i;++n){var o=r.lines[n];r.height-=o.height,lt(o),wt(o,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){var n=this;this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var i=0;i<t.length;++i)t[i].parent=n},iterN:function(e,t,r){for(var n=this,i=e+t;e<i;++e)if(r(n.lines[e]))return!0}},Ui.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){var r=this;this.size-=t;for(var n=0;n<this.children.length;++n){var i=r.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e),s=i.height;if(i.removeInner(e,l),r.height-=s-i.height,o==l&&(r.children.splice(n--,1),i.parent=null),0==(t-=l))break;e=0}else e-=o}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof Gi))){var a=[];this.collapse(a),this.children=[new Gi(a)],this.children[0].parent=this}},collapse:function(e){for(var t=this,r=0;r<this.children.length;++r)t.children[r].collapse(e)},insertInner:function(e,t,r){var n=this;this.size+=t.length,this.height+=r;for(var i=0;i<this.children.length;++i){var o=n.children[i],l=o.chunkSize();if(e<=l){if(o.insertInner(e,t,r),o.lines&&o.lines.length>50){for(var s=o.lines.length%25+25,a=s;a<o.lines.length;){var u=new Gi(o.lines.slice(a,a+=25));o.height-=u.height,n.children.splice(++i,0,u),u.parent=n}o.lines=o.lines.slice(0,s),n.maybeSpill()}break}e-=l}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=e.children.splice(e.children.length-5,5),r=new Ui(t);if(e.parent){e.size-=r.size,e.height-=r.height;var n=h(e.parent.children,e);e.parent.children.splice(n+1,0,r)}else{var i=new Ui(e.children);i.parent=e,e.children=[i,r],e=i}r.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=this,i=0;i<this.children.length;++i){var o=n.children[i],l=o.chunkSize();if(e<l){var s=Math.min(t,l-e);if(o.iterN(e,s,r))return!0;if(0==(t-=s))break;e=0}else e-=l}}};var As=function(e,t,r){var n=this;if(r)for(var i in r)r.hasOwnProperty(i)&&(n[i]=r[i]);this.doc=e,this.node=t};As.prototype.clear=function(){var e=this,t=this.doc.cm,r=this.line.widgets,n=this.line,i=W(n);if(null!=i&&r){for(var o=0;o<r.length;++o)r[o]==e&&r.splice(o--,1);r.length||(n.widgets=null);var l=Ft(this);A(n,Math.max(0,n.height-l)),t&&(dn(t,function(){Vi(t,n,-l),yn(t,i,"widget")}),wt(t,"lineWidgetCleared",t,this,i))}},As.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=Ft(this)-t;i&&(A(n,n.height+i),r&&dn(r,function(){r.curOp.forceUpdate=!0,Vi(r,n,i),wt(r,"lineWidgetChanged",r,e,W(n))}))},Ae(As);var Ws=0,Ds=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++Ws};Ds.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){var t=this.doc.cm,r=t&&!t.curOp;if(r&&on(t),Oe(this,"clear")){var n=this.find();n&&wt(this,"clear",n.from,n.to)}for(var i=null,o=null,l=0;l<this.lines.length;++l){var s=e.lines[l],a=_(s.markedSpans,e);t&&!e.collapsed?yn(t,W(s),"text"):t&&(null!=a.to&&(o=W(s)),null!=a.from&&(i=W(s))),s.markedSpans=q(s.markedSpans,a),null==a.from&&e.collapsed&&!ve(e.doc,s)&&t&&A(s,yr(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var u=0;u<this.lines.length;++u){var c=fe(e.lines[u]),f=be(c);f>t.display.maxLineLength&&(t.display.maxLine=c,t.display.maxLineLength=f,t.display.maxLineChanged=!0)}null!=i&&t&&this.collapsed&&mn(t,i,o+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&Si(t.doc)),t&&wt(t,"markerCleared",t,this,i,o),r&&ln(t),this.parent&&this.parent.clear()}},Ds.prototype.find=function(e,t){var r=this;null==e&&"bookmark"==this.type&&(e=1);for(var n,i,o=0;o<this.lines.length;++o){var l=r.lines[o],s=_(l.markedSpans,r);if(null!=s.from&&(n=P(t?l:W(l),s.from),-1==e))return n;if(null!=s.to&&(i=P(t?l:W(l),s.to),1==e))return i}return n&&{from:n,to:i}},Ds.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&dn(n,function(){var i=t.line,o=W(t.line),l=Xt(n,o);if(l&&(Jt(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!ve(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=Ft(r)-s;a&&A(i,i.height+a)}wt(n,"markerChanged",n,e)})},Ds.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=h(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},Ds.prototype.detachLine=function(e){if(this.lines.splice(h(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},Ae(Ds);var Hs=function(e,t){var r=this;this.markers=e,this.primary=t;for(var n=0;n<e.length;++n)e[n].parent=r};Hs.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var t=0;t<this.markers.length;++t)e.markers[t].clear();wt(this,"clear")}},Hs.prototype.find=function(e,t){return this.primary.find(e,t)},Ae(Hs);var Fs=0,Ps=function(e,t,r,n,i){if(!(this instanceof Ps))return new Ps(e,t,r,n,i);null==r&&(r=0),Ui.call(this,[new Gi([new ps("",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=P(r,0);this.sel=Bn(o),this.history=new ei(null),this.id=++Fs,this.modeOption=t,this.lineSep=n,this.direction="rtl"==i?"rtl":"ltr",this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),qn(this,{from:o,to:o,text:e}),wi(this,Bn(o),Kl)};Ps.prototype=b(Ui.prototype,{constructor:Ps,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=O(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:vn(function(e){var t=P(this.first,0),r=this.first+this.size-1;Ai(this,{from:t,to:P(r,M(this,r).text.length),text:this.splitLines(e),origin:"setValue",full:!0},!0),this.cm&&Yr(this.cm,0,0),wi(this,Bn(t),Kl)}),replaceRange:function(e,t,r,n){t=U(this,t),r=r?U(this,r):t,Ei(this,e,t,r,n)},getRange:function(e,t,r){var n=N(this,U(this,e),U(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(H(this,e))return M(this,e)},getLineNumber:function(e){return W(e)},getLineHandleVisualStart:function(e){return"number"==typeof e&&(e=M(this,e)),fe(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return U(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||"head"==e?t.head:"anchor"==e?t.anchor:"end"==e||"to"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:vn(function(e,t,r){mi(this,U(this,"number"==typeof e?P(e,t||0):e),null,r)}),setSelection:vn(function(e,t,r){mi(this,U(this,e),U(this,t||e),r)}),extendSelection:vn(function(e,t,r){pi(this,U(this,e),t&&U(this,t),r)}),extendSelections:vn(function(e,t){gi(this,K(this,e),t)}),extendSelectionsBy:vn(function(e,t){gi(this,K(this,v(this.sel.ranges,e)),t)}),setSelections:vn(function(e,t,r){var n=this;if(e.length){for(var i=[],o=0;o<e.length;o++)i[o]=new Os(U(n,e[o].anchor),U(n,e[o].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),wi(this,Rn(i,t),r)}}),addSelection:vn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new Os(U(this,e),U(this,t||e))),wi(this,Rn(n,n.length-1),r)}),getSelection:function(e){for(var t,r=this,n=this.sel.ranges,i=0;i<n.length;i++){var o=N(r,n[i].from(),n[i].to());t=t?t.concat(o):o}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=this,r=[],n=this.sel.ranges,i=0;i<n.length;i++){var o=N(t,n[i].from(),n[i].to());!1!==e&&(o=o.join(e||t.lineSeparator())),r[i]=o}return r},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||"+input")},replaceSelections:vn(function(e,t,r){for(var n=this,i=[],o=this.sel,l=0;l<o.ranges.length;l++){var s=o.ranges[l];i[l]={from:s.from(),to:s.to(),text:n.splitLines(e[l]),origin:r}}for(var a=t&&"end"!=t&&jn(this,i,t),u=i.length-1;u>=0;u--)Ai(n,i[u]);a?bi(this,a):this.cm&&Xr(this.cm)}),undo:vn(function(){Di(this,"undo")}),redo:vn(function(){Di(this,"redo")}),undoSelection:vn(function(){Di(this,"undo",!0)}),redoSelection:vn(function(){Di(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new ei(this.history.maxGeneration)},
+markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:hi(this.history.done),undone:hi(this.history.undone)}},setHistory:function(e){var t=this.history=new ei(this.history.maxGeneration);t.done=hi(e.done.slice(0),null,!0),t.undone=hi(e.undone.slice(0),null,!0)},setGutterMarker:vn(function(e,t,r){return Bi(this,e,"gutter",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&C(n)&&(e.gutterMarkers=null),!0})}),clearGutter:vn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&Bi(t,r,"gutter",function(){return r.gutterMarkers[e]=null,C(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if("number"==typeof e){if(!H(this,e))return null;if(t=e,!(e=M(this,e)))return null}else if(null==(t=W(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:vn(function(t,r,n){return Bi(this,t,"gutter"==r?"gutter":"class",function(t){var i="text"==r?"textClass":"background"==r?"bgClass":"gutter"==r?"gutterClass":"wrapClass";if(t[i]){if(e(n).test(t[i]))return!1;t[i]+=" "+n}else t[i]=n;return!0})}),removeLineClass:vn(function(t,r,n){return Bi(this,t,"gutter"==r?"gutter":"class",function(t){var i="text"==r?"textClass":"background"==r?"bgClass":"gutter"==r?"gutterClass":"wrapClass",o=t[i];if(!o)return!1;if(null==n)t[i]=null;else{var l=o.match(e(n));if(!l)return!1;var s=l.index+l[0].length;t[i]=o.slice(0,l.index)+(l.index&&s!=o.length?" ":"")+o.slice(s)||null}return!0})}),addLineWidget:vn(function(e,t,r){return Ki(this,e,t,r)}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return ji(this,U(this,e),U(this,t),r,r&&r.type||"range")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return e=U(this,e),ji(this,e,e,r,"bookmark")},findMarksAt:function(e){e=U(this,e);var t=[],r=M(this,e.line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=U(this,e),t=U(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),U(this,P(r,t))},indexFromPos:function(e){e=U(this,e);var t=e.ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new Ps(O(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new Ps(O(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],_i(n,Yi(this)),n},unlinkDoc:function(e){var t=this;if(e instanceof Yo&&(e=e.doc),this.linked)for(var r=0;r<this.linked.length;++r){var n=t.linked[r];if(n.doc==e){t.linked.splice(r,1),e.unlinkDoc(t),qi(Yi(t));break}}if(e.history==this.history){var i=[e.id];$n(e,function(e){return i.push(e.id)},!0),e.history=new ei(null),e.history.done=hi(this.history.done,i),e.history.undone=hi(this.history.undone,i)}},iterLinkedDocs:function(e){$n(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):ns(e)},lineSeparator:function(){return this.lineSep||"\n"},setDirection:vn(function(e){"rtl"!=e&&(e="ltr"),e!=this.direction&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Jn(this.cm))})}),Ps.prototype.eachLine=Ps.prototype.iter;for(var Es=0,zs=!1,Is={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"},Rs=0;Rs<10;Rs++)Is[Rs+48]=Is[Rs+96]=String(Rs);for(var Bs=65;Bs<=90;Bs++)Is[Bs]=String.fromCharCode(Bs);for(var Gs=1;Gs<=12;Gs++)Is[Gs+111]=Is[Gs+63235]="F"+Gs;var Us={};Us.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Us.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Us.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars","Ctrl-O":"openLine"},Us.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Us.default=Al?Us.macDefault:Us.pcDefault;var Vs={selectAll:Ni,singleSelection:function(e){return e.setSelection(e.getCursor("anchor"),e.getCursor("head"),Kl)},killLine:function(e){return fo(e,function(t){if(t.empty()){var r=M(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:P(t.head.line+1,0)}:{from:t.head,to:P(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return fo(e,function(t){return{from:P(t.from().line,0),to:U(e.doc,P(t.to().line+1,0))}})},delLineLeft:function(e){return fo(e,function(e){return{from:P(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return fo(e,function(t){var r=e.charCoords(t.head,"div").top+5;return{from:e.coordsChar({left:0,top:r},"div"),to:t.from()}})},delWrappedLineRight:function(e){return fo(e,function(t){var r=e.charCoords(t.head,"div").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},"div");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(P(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(P(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return mo(e,t.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return bo(e,t.head)},{origin:"+move",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return yo(e,t.head.line)},{origin:"+move",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},"div")},Xl)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5;return e.coordsChar({left:0,top:r},"div")},Xl)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,"div").top+5,n=e.coordsChar({left:0,top:r},"div");return n.ch<e.getLine(n.line).search(/\S/)?bo(e,t.head):n},Xl)},goLineUp:function(e){return e.moveV(-1,"line")},goLineDown:function(e){return e.moveV(1,"line")},goPageUp:function(e){return e.moveV(-1,"page")},goPageDown:function(e){return e.moveV(1,"page")},goCharLeft:function(e){return e.moveH(-1,"char")},goCharRight:function(e){return e.moveH(1,"char")},goColumnLeft:function(e){return e.moveH(-1,"column")},goColumnRight:function(e){return e.moveH(1,"column")},goWordLeft:function(e){return e.moveH(-1,"word")},goGroupRight:function(e){return e.moveH(1,"group")},goGroupLeft:function(e){return e.moveH(-1,"group")},goWordRight:function(e){return e.moveH(1,"word")},delCharBefore:function(e){return e.deleteH(-1,"char")},delCharAfter:function(e){return e.deleteH(1,"char")},delWordBefore:function(e){return e.deleteH(-1,"word")},delWordAfter:function(e){return e.deleteH(1,"word")},delGroupBefore:function(e){return e.deleteH(-1,"group")},delGroupAfter:function(e){return e.deleteH(1,"group")},indentAuto:function(e){return e.indentSelection("smart")},indentMore:function(e){return e.indentSelection("add")},indentLess:function(e){return e.indentSelection("subtract")},insertTab:function(e){return e.replaceSelection("\t")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=f(e.getLine(o.line),o.ch,n);t.push(p(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection("add"):e.execCommand("insertTab")},transposeChars:function(e){return dn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=M(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new P(i.line,i.ch-1)),i.ch>0)i=new P(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),P(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=M(e.doc,i.line-1).text;l&&(i=new P(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),P(i.line-1,l.length-1),i,"+transpose"))}r.push(new Os(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return dn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,"+input");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);Xr(e)})},openLine:function(e){return e.replaceSelection("\n","start")},toggleOverwrite:function(e){return e.toggleOverwrite()}},Ks=new Rl,js=null,Xs=function(e,t,r){this.time=e,this.pos=t,this.button=r};Xs.prototype.compare=function(e,t,r){return this.time+400>e&&0==E(t,this.pos)&&r==this.button};var Ys,_s,qs={toString:function(){return"CodeMirror.Init"}},$s={},Zs={};Yo.defaults=$s,Yo.optionHandlers=Zs;var Qs=[];Yo.defineInitHook=function(e){return Qs.push(e)};var Js=null,ea=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new Rl,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};ea.prototype.init=function(e){function t(e){if(!Me(i,e)){if(i.somethingSelected())$o({lineWise:!1,text:i.getSelections()}),"cut"==e.type&&i.replaceSelection("",null,"cut");else{if(!i.options.lineWiseCopyCut)return;var t=el(i);$o({lineWise:!0,text:t.text}),"cut"==e.type&&i.operation(function(){i.setSelections(t.ranges,0,Kl),i.replaceSelection("",null,"cut")})}if(e.clipboardData){e.clipboardData.clearData();var r=Js.text.join("\n");if(e.clipboardData.setData("Text",r),e.clipboardData.getData("Text")==r)return void e.preventDefault()}var l=rl(),s=l.firstChild;i.display.lineSpace.insertBefore(l,i.display.lineSpace.firstChild),s.value=Js.text.join("\n");var a=document.activeElement;Il(s),setTimeout(function(){i.display.lineSpace.removeChild(l),a.focus(),a==o&&n.showPrimarySelection()},50)}}var r=this,n=this,i=n.cm,o=n.div=e.lineDiv;tl(o,i.options.spellcheck),ts(o,"paste",function(e){Me(i,e)||Qo(e,i)||bl<=11&&setTimeout(pn(i,function(){return r.updateFromDOM()}),20)}),ts(o,"compositionstart",function(e){r.composing={data:e.data,done:!1}}),ts(o,"compositionupdate",function(e){r.composing||(r.composing={data:e.data,done:!1})}),ts(o,"compositionend",function(e){r.composing&&(e.data!=r.composing.data&&r.readFromDOMSoon(),r.composing.done=!0)}),ts(o,"touchstart",function(){return n.forceCompositionEnd()}),ts(o,"input",function(){r.composing||r.readFromDOMSoon()}),ts(o,"copy",t),ts(o,"cut",t)},ea.prototype.prepareSelection=function(){var e=Mr(this.cm,!1);return e.focus=this.cm.state.focused,e},ea.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},ea.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,r=t.doc.sel.primary(),n=r.from(),i=r.to();if(t.display.viewTo==t.display.viewFrom||n.line>=t.display.viewTo||i.line<t.display.viewFrom)return void e.removeAllRanges();var o=ul(t,e.anchorNode,e.anchorOffset),l=ul(t,e.focusNode,e.focusOffset);if(!o||o.bad||!l||l.bad||0!=E(B(o,l),n)||0!=E(R(o,l),i)){var s=t.display.view,a=n.line>=t.display.viewFrom&&ol(t,n)||{node:s[0].measure.map[2],offset:0},u=i.line<t.display.viewTo&&ol(t,i);if(!u){var c=s[s.length-1].measure,f=c.maps?c.maps[c.maps.length-1]:c.map;u={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(!a||!u)return void e.removeAllRanges();var h,d=e.rangeCount&&e.getRangeAt(0);try{h=Fl(a.node,a.offset,u.offset,u.node)}catch(e){}h&&(!pl&&t.state.focused?(e.collapse(a.node,a.offset),h.collapsed||(e.removeAllRanges(),e.addRange(h))):(e.removeAllRanges(),e.addRange(h)),d&&null==e.anchorNode?e.addRange(d):pl&&this.startGracePeriod()),this.rememberSelection()}},ea.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},ea.prototype.showMultipleSelections=function(e){r(this.cm.display.cursorDiv,e.cursors),r(this.cm.display.selectionDiv,e.selection)},ea.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},ea.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return o(this.div,t)},ea.prototype.focus=function(){"nocursor"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},ea.prototype.blur=function(){this.div.blur()},ea.prototype.getField=function(){return this.div},ea.prototype.supportsTouch=function(){return!0},ea.prototype.receivedFocus=function(){function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))}var t=this;this.selectionInEditor()?this.pollSelection():dn(this.cm,function(){return t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,e)},ea.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},ea.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(Nl&&Cl&&this.cm.options.gutters.length&&ll(e.anchorNode))return this.cm.triggerOnKeyDown({type:"keydown",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=ul(t,e.anchorNode,e.anchorOffset),n=ul(t,e.focusNode,e.focusOffset);r&&n&&dn(t,function(){wi(t.doc,Bn(r,n),Kl),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},ea.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e=this.cm,t=e.display,r=e.doc.sel.primary(),n=r.from(),i=r.to();if(0==n.ch&&n.line>e.firstLine()&&(n=P(n.line-1,M(e.doc,n.line-1).length)),i.ch==M(e.doc,i.line).text.length&&i.line<e.lastLine()&&(i=P(i.line+1,0)),n.line<t.viewFrom||i.line>t.viewTo-1)return!1;var o,l,s;n.line==t.viewFrom||0==(o=kr(e,n.line))?(l=W(t.view[0].line),s=t.view[0].node):(l=W(t.view[o].line),s=t.view[o-1].node.nextSibling);var a,u,c=kr(e,i.line);if(c==t.view.length-1?(a=t.viewTo-1,u=t.lineDiv.lastChild):(a=W(t.view[c+1].line)-1,u=t.view[c+1].node.previousSibling),!s)return!1;for(var f=e.doc.splitLines(al(e,s,u,l,a)),h=N(e.doc,P(l,0),P(a,M(e.doc,a).text.length));f.length>1&&h.length>1;)if(g(f)==g(h))f.pop(),h.pop(),a--;else{if(f[0]!=h[0])break;f.shift(),h.shift(),l++}for(var d=0,p=0,v=f[0],m=h[0],y=Math.min(v.length,m.length);d<y&&v.charCodeAt(d)==m.charCodeAt(d);)++d;for(var b=g(f),w=g(h),x=Math.min(b.length-(1==f.length?d:0),w.length-(1==h.length?d:0));p<x&&b.charCodeAt(b.length-p-1)==w.charCodeAt(w.length-p-1);)++p;if(1==f.length&&1==h.length&&l==n.line)for(;d&&d>n.ch&&b.charCodeAt(b.length-p-1)==w.charCodeAt(w.length-p-1);)d--,p++;f[f.length-1]=b.slice(0,b.length-p).replace(/^\u200b+/,""),f[0]=f[0].slice(d).replace(/\u200b+$/,"");var C=P(l,d),S=P(a,h.length?g(h).length-p:0);return f.length>1||f[0]||E(C,S)?(Ei(e.doc,f,C,S,"+input"),!0):void 0},ea.prototype.ensurePolled=function(){this.forceCompositionEnd()},ea.prototype.reset=function(){this.forceCompositionEnd()},ea.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},ea.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},ea.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||dn(this.cm,function(){return mn(e.cm)})},ea.prototype.setUneditable=function(e){e.contentEditable="false"},ea.prototype.onKeyPress=function(e){0!=e.charCode&&(e.preventDefault(),this.cm.isReadOnly()||pn(this.cm,Zo)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},ea.prototype.readOnlyChanged=function(e){this.div.contentEditable=String("nocursor"!=e)},ea.prototype.onContextMenu=function(){},ea.prototype.resetPosition=function(){},ea.prototype.needsContentAttribute=!0;var ta=function(e){this.cm=e,this.prevInput="",this.pollingFast=!1,this.polling=new Rl,this.hasSelection=!1,this.composing=null};ta.prototype.init=function(e){function t(e){if(!Me(i,e)){if(i.somethingSelected())$o({lineWise:!1,text:i.getSelections()});else{if(!i.options.lineWiseCopyCut)return;var t=el(i);$o({lineWise:!0,text:t.text}),"cut"==e.type?i.setSelections(t.ranges,null,Kl):(n.prevInput="",l.value=t.text.join("\n"),Il(l))}"cut"==e.type&&(i.state.cutIncoming=!0)}}var r=this,n=this,i=this.cm,o=this.wrapper=rl(),l=this.textarea=o.firstChild;e.wrapper.insertBefore(o,e.wrapper.firstChild),Ml&&(l.style.width="0px"),ts(l,"input",function(){yl&&bl>=9&&r.hasSelection&&(r.hasSelection=null),n.poll()}),ts(l,"paste",function(e){Me(i,e)||Qo(e,i)||(i.state.pasteIncoming=!0,n.fastPoll())}),ts(l,"cut",t),ts(l,"copy",t),ts(e.scroller,"paste",function(t){Pt(e,t)||Me(i,t)||(i.state.pasteIncoming=!0,n.focus())}),ts(e.lineSpace,"selectstart",function(t){Pt(e,t)||We(t)}),ts(l,"compositionstart",function(){var e=i.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:e,range:i.markText(e,i.getCursor("to"),{className:"CodeMirror-composing"})}}),ts(l,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},ta.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=Mr(e);if(e.options.moveInputWithCursor){var i=ar(e,r.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},ta.prototype.showSelection=function(e){var t=this.cm,n=t.display;r(n.cursorDiv,e.cursors),r(n.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},ta.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput="";var r=t.getSelection();this.textarea.value=r,t.state.focused&&Il(this.textarea),yl&&bl>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value="",yl&&bl>=9&&(this.hasSelection=null))}},ta.prototype.getField=function(){return this.textarea},ta.prototype.supportsTouch=function(){return!1},ta.prototype.focus=function(){if("nocursor"!=this.cm.options.readOnly&&(!Ol||l()!=this.textarea))try{this.textarea.focus()}catch(e){}},ta.prototype.blur=function(){this.textarea.blur()},ta.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},ta.prototype.receivedFocus=function(){this.slowPoll()},ta.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},ta.prototype.fastPoll=function(){function e(){r.poll()||t?(r.pollingFast=!1,r.slowPoll()):(t=!0,r.polling.set(60,e))}var t=!1,r=this;r.pollingFast=!0,r.polling.set(20,e)},ta.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||is(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(yl&&bl>=9&&this.hasSelection===i||Al&&/[\uf700-\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n="​"),8666==o)return this.reset(),this.cm.execCommand("undo")}for(var l=0,s=Math.min(n.length,i.length);l<s&&n.charCodeAt(l)==i.charCodeAt(l);)++l;return dn(t,function(){Zo(t,i.slice(l),n.length-l,null,e.composing?"*compose":null),i.length>1e3||i.indexOf("\n")>-1?r.value=e.prevInput="":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ta.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},ta.prototype.onKeyPress=function(){yl&&bl>=9&&(this.hasSelection=null),this.fastPoll()},ta.prototype.onContextMenu=function(e){function t(){if(null!=l.selectionStart){var e=i.somethingSelected(),t="​"+(e?l.value:"");l.value="⇚",l.value=t,n.prevInput=e?"":"​",l.selectionStart=1,l.selectionEnd=t.length,o.selForContextMenu=i.doc.sel}}function r(){if(n.contextMenuPending=!1,n.wrapper.style.cssText=c,l.style.cssText=u,yl&&bl<9&&o.scrollbars.setScrollTop(o.scroller.scrollTop=a),null!=l.selectionStart){(!yl||yl&&bl<9)&&t();var e=0,r=function(){o.selForContextMenu==i.doc.sel&&0==l.selectionStart&&l.selectionEnd>0&&"​"==n.prevInput?pn(i,Ni)(i):e++<10?o.detectingSelectAll=setTimeout(r,500):(o.selForContextMenu=null,o.input.reset())};o.detectingSelectAll=setTimeout(r,200)}}var n=this,i=n.cm,o=i.display,l=n.textarea,s=Lr(i,e),a=o.scroller.scrollTop;if(s&&!Sl){i.options.resetSelectionOnContextMenu&&-1==i.doc.sel.contains(s)&&pn(i,wi)(i.doc,Bn(s),Kl);var u=l.style.cssText,c=n.wrapper.style.cssText;n.wrapper.style.cssText="position: absolute";var f=n.wrapper.getBoundingClientRect();l.style.cssText="position: absolute; width: 30px; height: 30px;\n      top: "+(e.clientY-f.top-5)+"px; left: "+(e.clientX-f.left-5)+"px;\n      z-index: 1000; background: "+(yl?"rgba(255, 255, 255, .05)":"transparent")+";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";var h;if(wl&&(h=window.scrollY),o.input.focus(),wl&&window.scrollTo(null,h),o.input.reset(),i.somethingSelected()||(l.value=n.prevInput=" "),n.contextMenuPending=!0,o.selForContextMenu=i.doc.sel,clearTimeout(o.detectingSelectAll),yl&&bl>=9&&t(),El){Fe(e);var d=function(){ke(window,"mouseup",d),setTimeout(r,20)};ts(window,"mouseup",d)}else setTimeout(r,50)}},ta.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled="nocursor"==e},ta.prototype.setUneditable=function(){},ta.prototype.needsContentAttribute=!1,function(e){function t(t,n,i,o){e.defaults[t]=n,i&&(r[t]=o?function(e,t,r){r!=qs&&i(e,t,r)}:i)}var r=e.optionHandlers;e.defineOption=t,e.Init=qs,t("value","",function(e,t){return e.setValue(t)},!0),t("mode",null,function(e,t){e.doc.modeOption=t,Xn(e)},!0),t("indentUnit",2,Xn,!0),t("indentWithTabs",!1),t("smartIndent",!0),t("tabSize",4,function(e){Yn(e),tr(e),mn(e)},!0),t("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(P(n,o))}n++});for(var i=r.length-1;i>=0;i--)Ei(e.doc,t,r[i],P(r[i].line,r[i].ch+t.length))}}),t("specialChars",/[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test("\t")?"":"|\t"),"g"),r!=qs&&e.refresh()}),t("specialCharPlaceholder",ut,function(e){return e.refresh()},!0),t("electricChars",!0),t("inputStyle",Ol?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),t("spellcheck",!1,function(e,t){return e.getInputField().spellcheck=t},!0),t("rtlMoveVisually",!Dl),t("wholeLineUpdateBefore",!0),t("theme","default",function(e){Vo(e),Ko(e)},!0),t("keyMap","default",function(e,t,r){var n=co(t),i=r!=qs&&co(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),t("extraKeys",null),t("configureMouse",null),t("lineWrapping",!1,Xo,!0),t("gutters",[],function(e){Pn(e.options),Ko(e)},!0),t("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?xr(e.display)+"px":"0",e.refresh()},!0),t("coverGutterNextToScrollbar",!1,function(e){return tn(e)},!0),t("scrollbarStyle","native",function(e){nn(e),tn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),t("lineNumbers",!1,function(e){Pn(e.options),Ko(e)},!0),t("firstLineNumber",1,Ko,!0),t("lineNumberFormatter",function(e){return e},Ko,!0),t("showCursorWhenSelecting",!1,Tr,!0),t("resetSelectionOnContextMenu",!0),t("lineWiseCopyCut",!0),t("pasteLinesPerSelection",!0),t("readOnly",!1,function(e,t){"nocursor"==t&&(Pr(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),t("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),t("dragDrop",!0,jo),t("allowDropFileTypes",null),t("cursorBlinkRate",530),t("cursorScrollMargin",0),t("cursorHeight",1,Tr,!0),t("singleCursorHeightPerLine",!0,Tr,!0),t("workTime",100),t("workDelay",100),t("flattenSpans",!0,Yn,!0),t("addModeClass",!1,Yn,!0),t("pollInterval",100),t("undoDepth",200,function(e,t){return e.doc.history.undoDepth=t}),t("historyEventDelay",1250),t("viewportMargin",10,function(e){return e.refresh()},!0),t("maxHighlightLength",1e4,Yn,!0),t("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),t("tabindex",null,function(e,t){return e.display.input.getField().tabIndex=t||""}),t("autofocus",null),t("direction","ltr",function(e,t){return e.doc.setDirection(t)},!0)}(Yo),function(e){var t=e.optionHandlers,r=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,r){var n=this.options,i=n[e];n[e]==r&&"mode"!=e||(n[e]=r,t.hasOwnProperty(e)&&pn(this,t[e])(this,r,i),Te(this,"optionChange",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](co(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:gn(function(t,r){var n=t.token?t:e.getMode(this.options,t);if(n.startState)throw new Error("Overlays may not be stateful.");m(this.state.overlays,{mode:n,modeSpec:t,opaque:r&&r.opaque,priority:r&&r.priority||0},function(e){return e.priority}),this.state.modeGen++,mn(this)}),removeOverlay:gn(function(e){for(var t=this,r=this.state.overlays,n=0;n<r.length;++n){var i=r[n].modeSpec;if(i==e||"string"==typeof e&&i.name==e)return r.splice(n,1),t.state.modeGen++,void mn(t)}}),indentLine:gn(function(e,t,r){"string"!=typeof t&&"number"!=typeof t&&(t=null==t?this.options.smartIndent?"smart":"prev":t?"add":"subtract"),H(this.doc,e)&&qo(this,e,t,r)}),indentSelection:gn(function(e){for(var t=this,r=this.doc.sel.ranges,n=-1,i=0;i<r.length;i++){var o=r[i];if(o.empty())o.head.line>n&&(qo(t,o.head.line,e,!0),n=o.head.line,i==t.doc.sel.primIndex&&Xr(t));else{var l=o.from(),s=o.to(),a=Math.max(n,l.line);n=Math.min(t.lastLine(),s.line-(s.ch?0:1))+1;for(var u=a;u<n;++u)qo(t,u,e);var c=t.doc.sel.ranges;0==l.ch&&r.length==c.length&&c[i].from().ch>0&&vi(t.doc,i,new Os(l,c[i].to()),Kl)}}}),getTokenAt:function(e,t){return et(this,e,t)},getLineTokens:function(e,t){return et(this,P(e),t,!0)},getTokenTypeAt:function(e){e=U(this.doc,e);var t,r=qe(this,M(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf("overlay "):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(t){var r=this.doc.mode;return r.innerMode?e.innerMode(r,this.getTokenAt(t).state).mode:r},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=this,i=[];if(!r.hasOwnProperty(t))return i;var o=r[t],l=this.getModeAt(e);if("string"==typeof l[t])o[l[t]]&&i.push(o[l[t]]);else if(l[t])for(var s=0;s<l[t].length;s++){var a=o[l[t][s]];a&&i.push(a)}else l.helperType&&o[l.helperType]?i.push(o[l.helperType]):o[l.name]&&i.push(o[l.name]);for(var u=0;u<o._global.length;u++){var c=o._global[u];c.pred(l,n)&&-1==h(i,c.val)&&i.push(c.val)}return i},getStateAfter:function(e,t){var r=this.doc;return e=G(r,null==e?r.first+r.size-1:e),$e(this,e+1,t).state},cursorCoords:function(e,t){var r,n=this.doc.sel.primary()
+;return r=null==e?n.head:"object"==typeof e?U(this.doc,e):e?n.from():n.to(),ar(this,r,t||"page")},charCoords:function(e,t){return sr(this,U(this.doc,e),t||"page")},coordsChar:function(e,t){return e=lr(this,e,t||"page"),fr(this,e.left,e.top)},lineAtHeight:function(e,t){return e=lr(this,{top:e,left:0},t||"page").top,D(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if("number"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=M(this.doc,e)}else n=e;return or(this,n,{top:0,left:0},t||"page",r||i).top+(i?this.doc.height-ye(n):0)},defaultTextHeight:function(){return yr(this.display)},defaultCharWidth:function(){return br(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o=this.display;e=ar(this,U(this.doc,e));var l=e.bottom,s=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),o.sizer.appendChild(t),"over"==n)l=e.top;else if("above"==n||"near"==n){var a=Math.max(o.wrapper.clientHeight,this.doc.height),u=Math.max(o.sizer.clientWidth,o.lineSpace.clientWidth);("above"==n||e.bottom+t.offsetHeight>a)&&e.top>t.offsetHeight?l=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=a&&(l=e.bottom),s+t.offsetWidth>u&&(s=u-t.offsetWidth)}t.style.top=l+"px",t.style.left=t.style.right="","right"==i?(s=o.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?s=0:"middle"==i&&(s=(o.sizer.clientWidth-t.offsetWidth)/2),t.style.left=s+"px"),r&&Vr(this,{left:s,top:l,right:s+t.offsetWidth,bottom:l+t.offsetHeight})},triggerOnKeyDown:gn(To),triggerOnKeyPress:gn(Oo),triggerOnKeyUp:No,triggerOnMouseDown:gn(Wo),execCommand:function(e){if(Vs.hasOwnProperty(e))return Vs[e].call(null,this)},triggerElectric:gn(function(e){Jo(this,e)}),findPosH:function(e,t,r,n){var i=this,o=1;t<0&&(o=-1,t=-t);for(var l=U(this.doc,e),s=0;s<t&&(l=nl(i.doc,l,o,r,n),!l.hitSide);++s);return l},moveH:gn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?nl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},Xl)}),deleteH:gn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection("",null,"+delete"):fo(this,function(r){var i=nl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=this,o=1,l=n;t<0&&(o=-1,t=-t);for(var s=U(this.doc,e),a=0;a<t;++a){var u=ar(i,s,"div");if(null==l?l=u.left:u.left=l,s=il(i,u,o,r),s.hitSide)break}return s},moveV:gn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=ar(r,l.head,"div");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=il(r,s,e,t);return"page"==t&&l==n.sel.primary()&&jr(r,sr(r,a,"div").top-s.top),a},Xl),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=this.doc,r=M(t,e.line).text,n=e.ch,i=e.ch;if(r){var o=this.getHelper(e,"wordChars");"before"!=e.sticky&&i!=r.length||!n?++i:--n;for(var l=r.charAt(n),s=x(l,o)?function(e){return x(e,o)}:/\s/.test(l)?function(e){return/\s/.test(e)}:function(e){return!/\s/.test(e)&&!x(e)};n>0&&s(r.charAt(n-1));)--n;for(;i<r.length&&s(r.charAt(i));)++i}return new Os(P(e.line,n),P(e.line,i))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?s(this.display.cursorDiv,"CodeMirror-overwrite"):zl(this.display.cursorDiv,"CodeMirror-overwrite"),Te(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==l()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:gn(function(e,t){Yr(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Rt(this)-this.display.barHeight,width:e.scrollWidth-Rt(this)-this.display.barWidth,clientHeight:Gt(this),clientWidth:Bt(this)}},scrollIntoView:gn(function(e,t){null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):"number"==typeof e?e={from:P(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?_r(this,e):$r(this,e.from,e.to,e.margin)}),setSize:gn(function(e,t){var r=this,n=function(e){return"number"==typeof e||/^\d+$/.test(String(e))?e+"px":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&er(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){yn(r,i,"widget");break}++i}),this.curOp.forceUpdate=!0,Te(this,"refresh",this)}),operation:function(e){return dn(this,e)},startOperation:function(){return on(this)},endOperation:function(){return ln(this)},refresh:gn(function(){var e=this.display.cachedTextHeight;mn(this),this.curOp.forceUpdate=!0,tr(this),Yr(this,this.doc.scrollLeft,this.doc.scrollTop),Dn(this),(null==e||Math.abs(e-yr(this.display))>.5)&&Sr(this),Te(this,"refresh",this)}),swapDoc:gn(function(e){var t=this.doc;return t.cm=null,Zn(this,e),tr(this),this.display.input.reset(),Yr(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,wt(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Ae(e),e.registerHelper=function(t,n,i){r.hasOwnProperty(t)||(r[t]=e[t]={_global:[]}),r[t][n]=i},e.registerGlobalHelper=function(t,n,i,o){e.registerHelper(t,n,o),r[t]._global.push({pred:i,val:o})}}(Yo);var ra="iter insert remove copy getEditor constructor".split(" ");for(var na in Ps.prototype)Ps.prototype.hasOwnProperty(na)&&h(ra,na)<0&&(Yo.prototype[na]=function(e){return function(){return e.apply(this.doc,arguments)}}(Ps.prototype[na]));return Ae(Ps),Yo.inputStyles={textarea:ta,contenteditable:ea},Yo.defineMode=function(e){Yo.defaults.mode||"null"==e||(Yo.defaults.mode=e),Be.apply(this,arguments)},Yo.defineMIME=Ge,Yo.defineMode("null",function(){return{token:function(e){return e.skipToEnd()}}}),Yo.defineMIME("text/plain","null"),Yo.defineExtension=function(e,t){Yo.prototype[e]=t},Yo.defineDocExtension=function(e,t){Ps.prototype[e]=t},Yo.fromTextArea=fl,function(e){e.off=ke,e.on=ts,e.wheelEventPixels=zn,e.Doc=Ps,e.splitLines=ns,e.countColumn=f,e.findColumn=d,e.isWordChar=w,e.Pass=Vl,e.signal=Te,e.Line=ps,e.changeEnd=Gn,e.scrollbarModel=Ss,e.Pos=P,e.cmpPos=E,e.modes=ss,e.mimeModes=as,e.resolveMode=Ue,e.getMode=Ve,e.modeExtensions=us,e.extendMode=Ke,e.copyState=je,e.startState=Ye,e.innerMode=Xe,e.commands=Vs,e.keyMap=Us,e.keyName=uo,e.isModifierKey=so,e.lookupKey=lo,e.normalizeKeyMap=oo,e.StringStream=cs,e.SharedTextMarker=Hs,e.TextMarker=Ds,e.LineWidget=As,e.e_preventDefault=We,e.e_stopPropagation=De,e.e_stop=Fe,e.addClass=s,e.contains=o,e.rmClass=zl,e.keyNames=Is}(Yo),Yo.version="5.32.0",Yo});
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/styles.9f50282210bba5318775.bundle.css b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/styles.9f50282210bba5318775.bundle.css
new file mode 100644
index 0000000..8b566dc
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/static/styles.9f50282210bba5318775.bundle.css
@@ -0,0 +1 @@
+html{box-sizing:border-box}body{font-family:Roboto Mono,monospace;font-size:.8rem;font-weight:500}.ui-datatable .ui-sortable-column div.ui-dt-c{padding-right:15px!important}.mat-elevation-z0{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,Helvetica Neue,sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,Helvetica Neue,sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,Helvetica Neue,sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font-size:11.62px}.mat-h5,.mat-h6,.mat-typography h5,.mat-typography h6{font-weight:400;font-family:Roboto,Helvetica Neue,sans-serif;line-height:20px;margin:0 0 12px}.mat-h6,.mat-typography h6{font-size:9.38px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,Helvetica Neue,sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,Helvetica Neue,sans-serif}.mat-body-1 p,.mat-body p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,Helvetica Neue,sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,Helvetica Neue,sans-serif;margin:0 0 56px;letter-spacing:-.05em}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,Helvetica Neue,sans-serif;margin:0 0 64px;letter-spacing:-.02em}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,Helvetica Neue,sans-serif;margin:0 0 64px;letter-spacing:-.005em}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,Helvetica Neue,sans-serif;margin:0 0 64px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,Helvetica Neue,sans-serif}.mat-card-title{font-size:24px;font-weight:400}.mat-card-content,.mat-card-header .mat-card-title,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,Helvetica Neue,sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:13px;line-height:18px}.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto,Helvetica Neue,sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell{font-size:14px}.mat-calendar{font-family:Roboto,Helvetica Neue,sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,Helvetica Neue,sans-serif}.mat-expansion-panel-header{font-family:Roboto,Helvetica Neue,sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,Helvetica Neue,sans-serif}.mat-form-field{font-family:Roboto,Helvetica Neue,sans-serif;font-size:inherit;font-weight:400;line-height:1.125}.mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.4375em 0;border-top:.84375em solid transparent}.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.28125em}.mat-form-field-underline{bottom:1.25em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.54166667em;top:calc(100% - 1.66666667em)}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,Helvetica Neue,sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font:400 14px/20px Roboto,Helvetica Neue,sans-serif}.mat-slider-thumb-label-text{font-size:12px;font-weight:500}.mat-slider-thumb-label-text,.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,Helvetica Neue,sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group,.mat-tab-label,.mat-tab-link{font-family:Roboto,Helvetica Neue,sans-serif}.mat-tab-label,.mat-tab-link{font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,Helvetica Neue,sans-serif;margin:0}.mat-tooltip{font-size:10px;padding-top:6px;padding-bottom:6px}.mat-list-item,.mat-list-option,.mat-tooltip{font-family:Roboto,Helvetica Neue,sans-serif}.mat-list .mat-list-item,.mat-nav-list .mat-list-item,.mat-selection-list .mat-list-item{font-size:16px}.mat-list .mat-list-item .mat-line,.mat-nav-list .mat-list-item .mat-line,.mat-selection-list .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-list-option,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-option{font-size:16px}.mat-list .mat-list-option .mat-line,.mat-nav-list .mat-list-option .mat-line,.mat-selection-list .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;font-weight:500}.mat-list[dense] .mat-list-item,.mat-nav-list[dense] .mat-list-item,.mat-selection-list[dense] .mat-list-item{font-size:12px}.mat-list[dense] .mat-list-item .mat-line,.mat-nav-list[dense] .mat-list-item .mat-line,.mat-selection-list[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list[dense] .mat-list-option,.mat-nav-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option,.mat-selection-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option{font-size:12px}.mat-list[dense] .mat-list-option .mat-line,.mat-nav-list[dense] .mat-list-option .mat-line,.mat-selection-list[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.mat-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list[dense] .mat-subheader,.mat-nav-list[dense] .mat-subheader,.mat-selection-list[dense] .mat-subheader{font-family:Roboto,Helvetica Neue,sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,Helvetica Neue,sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,Helvetica Neue,sans-serif}.mat-simple-snackbar{font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-ripple{overflow:hidden}@media screen and (-ms-high-contrast:active){.mat-ripple{display:none}}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,-webkit-transform 0ms cubic-bezier(0,0,.2,1);transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transition:opacity,transform 0ms cubic-bezier(0,0,.2,1),-webkit-transform 0ms cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:100%;box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-option-ripple{opacity:.5}}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}.mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{box-sizing:border-box}.cdk-overlay-backdrop,.cdk-overlay-pane{position:absolute;pointer-events:auto;z-index:1000}.cdk-overlay-backdrop{top:0;bottom:0;left:0;right:0;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.cdk-overlay-transparent-backdrop{background:none}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option{color:rgba(0,0,0,.87)}.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#9e9e9e}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffab40}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-option.mat-active,.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-optgroup-label{color:rgba(0,0,0,.54)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox:after{color:#fafafa}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffab40}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#9e9e9e}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button{background:transparent}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:hsla(0,0%,62%,.12)}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,171,64,.12)}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary{color:#9e9e9e}.mat-button.mat-accent,.mat-icon-button.mat-accent{color:#ffab40}.mat-button.mat-warn,.mat-icon-button.mat-warn{color:#f44336}.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary{color:rgba(0,0,0,.87)}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#9e9e9e}.mat-fab.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffab40}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{background-color:rgba(0,0,0,.12)}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element{background-color:rgba(0,0,0,.2)}.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.2)}.mat-button.mat-primary .mat-ripple-element{background-color:hsla(0,0%,62%,.1)}.mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,171,64,.1)}.mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.mat-icon-button.mat-primary .mat-ripple-element{background-color:hsla(0,0%,62%,.2)}.mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,171,64,.2)}.mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#9e9e9e}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffab40}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:hsla(0,0%,62%,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,171,64,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-primary{background-color:#9e9e9e;color:rgba(0,0,0,.87)}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-accent{background-color:#ffab40;color:rgba(0,0,0,.87)}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.mat-table{background:#fff}.mat-header-row,.mat-row{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell{color:rgba(0,0,0,.87)}.mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-calendar-next-button,.mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider:after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.mat-calendar-body-selected{background-color:#9e9e9e;color:rgba(0,0,0,.87)}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:hsla(0,0%,62%,.4)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.mat-calendar-body-today.mat-calendar-body-selected{box-shadow:inset 0 0 0 1px rgba(0,0,0,.87)}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.mat-dialog-container,.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator:after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.54)}.mat-focused .mat-form-field-label{color:#9e9e9e}.mat-focused .mat-form-field-label.mat-accent{color:#ffab40}.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffab40}.mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-disabled .mat-form-field-underline{background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.mat-form-field-ripple{background-color:#9e9e9e}.mat-form-field-ripple.mat-accent{background-color:#ffab40}.mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-invalid .mat-form-field-label,.mat-form-field-invalid .mat-form-field-label.mat-accent,.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker{color:#f44336}.mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.mat-error{color:#f44336}.mat-icon.mat-primary{color:#9e9e9e}.mat-icon.mat-accent{color:#ffab40}.mat-icon.mat-warn{color:#f44336}.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-list .mat-list-item,.mat-list .mat-list-option,.mat-nav-list .mat-list-item,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-item,.mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-nav-list .mat-list-item{outline:none}.mat-nav-list .mat-list-item.mat-list-item-focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-option{outline:none}.mat-list-option.mat-list-item-focus,.mat-list-option:hover{background:rgba(0,0,0,.04)}.mat-menu-panel{background:#fff}.mat-menu-item{background:transparent;color:rgba(0,0,0,.87)}.mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.mat-menu-item-submenu-trigger:after,.mat-menu-item .mat-icon:not([color]){color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item:focus:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27whitesmoke%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar-buffer{background-color:#f5f5f5}.mat-progress-bar-fill:after{background-color:#9e9e9e}.mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffd180%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-accent .mat-progress-bar-buffer{background-color:#ffd180}.mat-progress-bar.mat-accent .mat-progress-bar-fill:after{background-color:#ffab40}.mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill:after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#9e9e9e}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffab40}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#9e9e9e}.mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#9e9e9e}.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:hsla(0,0%,62%,.26)}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffab40}.mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffab40}.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,171,64,.26)}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-select-content,.mat-select-panel-done-animating{background:#fff}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#9e9e9e}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffab40}.mat-form-field.mat-focused.mat-warn .mat-select-arrow,.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{color:rgba(0,0,0,.87)}.mat-drawer,.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ff9800}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,152,0,.5)}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle .mat-ripple-element{background-color:rgba(255,152,0,.12)}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#9e9e9e}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:hsla(0,0%,62%,.5)}.mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-primary .mat-ripple-element{background-color:hsla(0,0%,62%,.12)}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.mat-slide-toggle-thumb{background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#9e9e9e}.mat-primary .mat-slider-thumb-label-text{color:rgba(0,0,0,.87)}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffab40}.mat-accent .mat-slider-thumb-label-text{color:rgba(0,0,0,.87)}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(255,171,64,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper:after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(90deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(180deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.mat-step-header .mat-step-icon{background-color:#9e9e9e;color:rgba(0,0,0,.87)}.mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:rgba(0,0,0,.87)}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line:before{border-left-color:rgba(0,0,0,.12)}.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label:focus,.mat-tab-group.mat-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:hsla(0,0%,96%,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#9e9e9e}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:rgba(0,0,0,.87)}.mat-tab-group.mat-accent .mat-tab-label:focus,.mat-tab-group.mat-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,209,128,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffab40}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:rgba(0,0,0,.87)}.mat-tab-group.mat-warn .mat-tab-label:focus,.mat-tab-group.mat-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label:focus,.mat-tab-group.mat-background-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:hsla(0,0%,96%,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#9e9e9e}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(0,0,0,.12)}.mat-tab-group.mat-background-accent .mat-tab-label:focus,.mat-tab-group.mat-background-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,209,128,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffab40}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(0,0,0,.12)}.mat-tab-group.mat-background-warn .mat-tab-label:focus,.mat-tab-group.mat-background-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:hsla(0,0%,100%,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:hsla(0,0%,100%,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#9e9e9e;color:rgba(0,0,0,.87)}.mat-toolbar.mat-accent{background:#ffab40;color:rgba(0,0,0,.87)}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-snack-bar-container{background:#323232;color:#fff}.mat-simple-snackbar-action{color:#ffab40}*{font-family:Roboto,Helvetica Neue,sans-serif}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5)}.cm-animate-fat-cursor,.cm-fat-cursor-mark{-webkit-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;background-color:#7e7}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.cm-s-monokai.CodeMirror{background:#272822;color:#f8f8f2}.cm-s-monokai div.CodeMirror-selected{background:#49483e}.cm-s-monokai .CodeMirror-line::selection,.cm-s-monokai .CodeMirror-line>span::selection,.cm-s-monokai .CodeMirror-line>span>span::selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-line::-moz-selection,.cm-s-monokai .CodeMirror-line>span::-moz-selection,.cm-s-monokai .CodeMirror-line>span>span::-moz-selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-gutters{background:#272822;border-right:0}.cm-s-monokai .CodeMirror-guttermarker{color:#fff}.cm-s-monokai .CodeMirror-guttermarker-subtle,.cm-s-monokai .CodeMirror-linenumber{color:#d0d0d0}.cm-s-monokai .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-monokai span.cm-comment{color:#75715e}.cm-s-monokai span.cm-atom,.cm-s-monokai span.cm-number{color:#ae81ff}.cm-s-monokai span.cm-attribute,.cm-s-monokai span.cm-property{color:#a6e22e}.cm-s-monokai span.cm-keyword{color:#f92672}.cm-s-monokai span.cm-builtin{color:#66d9ef}.cm-s-monokai span.cm-string{color:#e6db74}.cm-s-monokai span.cm-variable{color:#f8f8f2}.cm-s-monokai span.cm-variable-2{color:#9effff}.cm-s-monokai span.cm-type,.cm-s-monokai span.cm-variable-3{color:#66d9ef}.cm-s-monokai span.cm-def{color:#fd971f}.cm-s-monokai span.cm-bracket{color:#f8f8f2}.cm-s-monokai span.cm-tag{color:#f92672}.cm-s-monokai span.cm-header,.cm-s-monokai span.cm-link{color:#ae81ff}.cm-s-monokai span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-monokai .CodeMirror-activeline-background{background:#373831}.cm-s-monokai .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}@charset "UTF-8";.ui-widget,.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:Roboto,Trebuchet MS,Arial,Helvetica,sans-serif;font-size:1em}.ui-widget :active{outline:none}.ui-widget-content{border:1px solid #d5d5d5;background:#fff;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #d9d9d9;background:#f6f7f9;color:#1b1d1f;font-weight:400}.ui-widget-header a{color:#1b1d1f}.ui-widget-overlay{background:#666;opacity:.5;filter:Alpha(Opacity=50)}.ui-state-default{border:1px solid #d6d6d6;background:#fff;color:#555}.ui-state-default a{color:#555}.ui-state-active{border-color:#bebebe;background:#d6d6d6;color:#212121}.ui-state-active a{color:#212121}.ui-state-highlight{border-color:#156090;background:#186ba0;color:#fff}.ui-state-highlight a{color:#fff}.ui-state-focus{border-color:silver;background:#eee;color:#212121}.ui-state-focus a{color:#212121}.ui-state-error{border-color:#f44336;background:#f5554a;color:#cd0a0a}.ui-state-error a{color:#cd0a0a}.ui-state-disabled,.ui-widget:disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none;cursor:default!important}.ui-state-disabled *,.ui-widget:disabled *{cursor:default!important}.ui-inputtext:enabled:hover{border-color:silver}.ui-inputtext.ui-state-focus,.ui-inputtext:focus{outline:0 none;border-color:silver;box-shadow:0 0 5px silver}.ui-inputgroup .ui-inputgroup-addon{border-color:#d6d6d6;background-color:#f0f0f0;color:#222}.ui-inputgroup .ui-inputgroup-addon:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.ui-inputgroup .ui-inputgroup-addon:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.ui-inputgroup .ui-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.ui-inputgroup .ui-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.ui-float-label input.ng-dirty.ng-invalid~label{color:#cd0a0a}.ui-autocomplete .ui-autocomplete-multiple-container:not(.ui-state-disabled).ui-state-focus,.ui-autocomplete .ui-autocomplete-multiple-container:not(.ui-state-disabled):hover,.ui-chips>ul:not(.ui-state-disabled).ui-state-focus,.ui-chips>ul:not(.ui-state-disabled):hover{border-color:silver}.ui-button:enabled:hover,.ui-button:focus,.ui-fileupload-choose:not(.ui-state-disabled):hover{outline:0 none;border-color:silver;background:#eee;color:#212121}.ui-button:enabled:hover a,.ui-button:focus a,.ui-fileupload-choose:not(.ui-state-disabled):hover a{color:#212121}.ui-button:enabled:active,.ui-fileupload-choose:not(.ui-state-disabled):active{border-color:#bebebe;background:#d6d6d6;color:#212121}.ui-chkbox-box:not(.ui-state-disabled):not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-chkbox-box:not(.ui-state-disabled):not(.ui-state-active):hover a{color:#212121}.ui-radiobutton-box:not(.ui-state-disabled):not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-radiobutton-box:not(.ui-state-disabled):not(.ui-state-active):hover a{color:#212121}.ui-dropdown:not(.ui-state-disabled):hover{border-color:silver;background:#eee;color:#212121}.ui-dropdown:not(.ui-state-disabled):hover a{color:#212121}.ui-dropdown-panel .ui-dropdown-item:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-dropdown-panel .ui-dropdown-item:not(.ui-state-highlight):hover a{color:#212121}.ui-listbox .ui-listbox-header .ui-listbox-filter-container .fa{color:#222}.ui-listbox:not(.ui-state-disabled) .ui-listbox-item:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-listbox:not(.ui-state-disabled) .ui-listbox-item:not(.ui-state-highlight):hover a{color:#212121}.ui-listbox.ui-state-disabled .ui-chkbox-box:not(.ui-state-active):hover{border-color:#d6d6d6;background:#fff;color:#555}.ui-multiselect:not(.ui-state-disabled):hover{border-color:silver;background:#eee;color:#212121}.ui-multiselect:not(.ui-state-disabled):hover a{color:#212121}.ui-multiselect-panel .ui-multiselect-item:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-multiselect-panel .ui-multiselect-item:not(.ui-state-highlight):hover a{color:#212121}.ui-multiselect-panel .ui-multiselect-close{color:#1b1d1f}.ui-multiselect-panel .ui-multiselect-filter-container .fa{color:#222}.ui-spinner:not(.ui-state-disabled) .ui-spinner-button:enabled:hover{border-color:silver;background:#eee;color:#212121}.ui-spinner:not(.ui-state-disabled) .ui-spinner-button:enabled:hover a{color:#212121}.ui-spinner:not(.ui-state-disabled) .ui-spinner-button:enabled:active{border-color:#bebebe;background:#d6d6d6;color:#212121}.ui-selectbutton .ui-button:not(.ui-state-disabled):not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-selectbutton .ui-button:not(.ui-state-disabled):not(.ui-state-active):hover a{color:#212121}.ui-togglebutton:not(.ui-state-disabled):not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-togglebutton:not(.ui-state-disabled):not(.ui-state-active):hover a{color:#212121}.ui-paginator a:not(.ui-state-disabled):not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-paginator a:not(.ui-state-disabled):not(.ui-state-active):hover a{color:#212121}.ui-paginator a{color:#555}.ui-datatable .ui-rowgroup-header a{color:#1b1d1f}.ui-datatable .ui-sortable-column:not(.ui-state-active):hover{background:#eee;color:#212121}.ui-datatable .ui-row-toggler{color:#222}.ui-datatable tbody.ui-datatable-hoverable-rows>tr.ui-widget-content:not(.ui-state-highlight):hover{cursor:pointer;background:#eee;color:#212121}.ui-orderlist .ui-orderlist-item:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-orderlist .ui-orderlist-item:not(.ui-state-highlight):hover a{color:#212121}.ui-picklist .ui-picklist-item:not(.ui-state-disabled):not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-picklist .ui-picklist-item:not(.ui-state-disabled):not(.ui-state-highlight):hover a{color:#212121}.ui-picklist .ui-picklist-droppoint-highlight{border-color:#156090;background:#186ba0;color:#1f1f1f}.ui-picklist .ui-picklist-droppoint-highlight a{color:#1f1f1f}.ui-picklist .ui-picklist-highlight{border-color:#156090;color:#1f1f1f}.ui-picklist .ui-picklist-highlight a{color:#1f1f1f}.ui-tree.ui-treenode-dragover{border-color:#156090}.ui-tree .ui-treenode-content.ui-treenode-selectable .ui-treenode-label:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-tree .ui-treenode-content.ui-treenode-selectable .ui-treenode-label:not(.ui-state-highlight):hover a{color:#212121}.ui-tree .ui-treenode-content.ui-treenode-dragover{background:#d6d6d6;color:#212121}.ui-tree.ui-tree-horizontal .ui-treenode-content.ui-treenode-selectable .ui-treenode-label:not(.ui-state-highlight):hover{background-color:inherit;color:inherit}.ui-tree.ui-tree-horizontal .ui-treenode-content.ui-treenode-selectable:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-tree.ui-tree-horizontal .ui-treenode-content.ui-treenode-selectable:not(.ui-state-highlight):hover a{color:#212121}.ui-treetable .ui-treetable-row.ui-treetable-row-selectable:not(.ui-state-highlight):hover{background:#eee;color:#212121}.ui-organizationchart .ui-organizationchart-node-content.ui-organizationchart-selectable-node:not(.ui-state-highlight):hover{border-color:silver;background:#eee;color:#212121}.ui-organizationchart .ui-organizationchart-node-content.ui-organizationchart-selectable-node:not(.ui-state-highlight):hover a{color:#212121}.ui-accordion .ui-accordion-header:not(.ui-state-active):not(.ui-state-disabled):hover{border-color:silver;background:#eee;color:#212121}.ui-accordion .ui-accordion-header:not(.ui-state-active):not(.ui-state-disabled):hover a{color:#212121}.ui-fieldset.ui-fieldset-toggleable .ui-fieldset-legend:hover{border-color:silver;background:#eee;color:#212121}.ui-fieldset.ui-fieldset-toggleable .ui-fieldset-legend:hover a{color:#212121}.ui-panel .ui-panel-titlebar .ui-panel-titlebar-icon:hover{border-color:silver;background:#eee;color:#212121}.ui-panel .ui-panel-titlebar .ui-panel-titlebar-icon:hover a{color:#212121}.ui-tabview .ui-tabview-nav li:not(.ui-state-active):not(.ui-state-disabled):hover{border-color:silver;background:#eee;color:#212121}.ui-tabview .ui-tabview-nav li:not(.ui-state-active):not(.ui-state-disabled):hover a{color:#212121}.ui-dialog .ui-dialog-titlebar-icon{color:#1b1d1f}.ui-dialog .ui-dialog-titlebar-icon:hover{border-color:silver;background:#eee;color:#212121}.ui-dialog .ui-dialog-titlebar-icon:hover a{color:#212121}.ui-sidebar .ui-sidebar-close{color:#1b1d1f}.ui-sidebar .ui-sidebar-close:hover{border-color:silver;background:#eee;color:#212121}.ui-sidebar .ui-sidebar-close:hover a{color:#212121}.ui-overlaypanel .ui-overlaypanel-close:hover{border-color:silver;background:#eee;color:#212121}.ui-overlaypanel .ui-overlaypanel-close:hover a{color:#212121}.ui-inplace .ui-inplace-display:hover{border-color:silver;background:#eee;color:#212121}.ui-inplace .ui-inplace-display:hover a{color:#212121}.ui-breadcrumb a{color:#1b1d1f}.ui-menu .ui-menuitem .ui-menuitem-link{color:#222}.ui-menu .ui-menuitem .ui-menuitem-link:hover{border-color:silver;background:#eee;color:#212121;border-color:transparent}.ui-menu .ui-menuitem .ui-menuitem-link:hover a{color:#212121}.ui-menu .ui-menuitem.ui-menuitem-active>.ui-menuitem-link{border-color:silver;background:#eee;color:#212121;border-color:transparent}.ui-menu .ui-menuitem.ui-menuitem-active>.ui-menuitem-link a{color:#212121}.ui-tabmenu .ui-tabmenu-nav li:not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121}.ui-tabmenu .ui-tabmenu-nav li:not(.ui-state-active):hover a{color:#212121}.ui-steps .ui-steps-item:not(.ui-state-highlight):not(.ui-state-disabled):hover{border-color:silver;background:#eee;color:#212121}.ui-steps .ui-steps-item:not(.ui-state-highlight):not(.ui-state-disabled):hover a{color:#212121}.ui-panelmenu .ui-panelmenu-header:not(.ui-state-active):hover{border-color:silver;background:#eee;color:#212121;border-color:#d6d6d6}.ui-panelmenu .ui-panelmenu-header.ui-state-active a,.ui-panelmenu .ui-panelmenu-header:not(.ui-state-active):hover a{color:#212121}.ui-panelmenu .ui-panelmenu-content .ui-menuitem-link{color:#222}.ui-panelmenu .ui-panelmenu-content .ui-menuitem-link:hover{border-color:silver;background:#eee;color:#212121;border-color:transparent}.ui-panelmenu .ui-panelmenu-content .ui-menuitem-link:hover a{color:#212121}.ui-datepicker .ui-datepicker-header a{color:#1b1d1f}.ui-datepicker .ui-datepicker-header a:hover{border-color:silver;background:#eee;color:#212121}.ui-datepicker .ui-datepicker-header a:hover a{color:#212121}.ui-datepicker .ui-datepicker-calendar td:not(.ui-state-disabled) a:hover{border-color:silver;background:#eee;color:#212121}.ui-datepicker .ui-datepicker-calendar td:not(.ui-state-disabled) a:hover a{color:#212121}.fc .fc-toolbar .fc-prev-button .ui-icon-circle-triangle-w{margin-top:.3em;background:none!important;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-indent:0!important;text-align:center}.fc .fc-toolbar .fc-prev-button .ui-icon-circle-triangle-w:before{content:"\F053"}.fc .fc-toolbar .fc-next-button .ui-icon-circle-triangle-e{margin-top:.3em;background:none!important;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-indent:0!important;text-align:center}.fc .fc-toolbar .fc-next-button .ui-icon-circle-triangle-e:before{content:"\F054"}.ui-rating a{color:#222}.ui-organizationchart .ui-organizationchart-line-down{background-color:#bcbcbc}.ui-organizationchart .ui-organizationchart-line-left{border-right:1px solid #bcbcbc}.ui-organizationchart .ui-organizationchart-line-top{border-top:1px solid #bcbcbc}.ui-organizationchart .ui-organizationchart-node-content{border-color:#bcbcbc}.ui-organizationchart .ui-organizationchart-node-content .ui-node-toggler{color:#bcbcbc}.ui-inputtext.ng-dirty.ng-invalid,p-autocomplete.ng-dirty.ng-invalid>.ui-autocomplete>.ui-inputtext,p-calendar.ng-dirty.ng-invalid>.ui-calendar>.ui-inputtext,p-checkbox.ng-dirty.ng-invalid .ui-chkbox-box,p-chips.ng-dirty.ng-invalid>.ui-inputtext,p-dropdown.ng-dirty.ng-invalid>.ui-dropdown,p-inputmask.ng-dirty.ng-invalid>.ui-inputtext,p-inputswitch.ng-dirty.ng-invalid .ui-inputswitch,p-listbox.ng-dirty.ng-invalid .ui-inputtext,p-multiselect.ng-dirty.ng-invalid>.ui-multiselect,p-radiobutton.ng-dirty.ng-invalid .ui-radiobutton-box,p-selectbutton.ng-dirty.ng-invalid .ui-button,p-spinner.ng-dirty.ng-invalid>.ui-inputtext,p-togglebutton.ng-dirty.ng-invalid .ui-button{border-bottom-color:#f44336}.ui-corner-tl{border-top-left-radius:3px}.ui-corner-tr{border-top-right-radius:3px}.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-br{border-bottom-right-radius:3px}.ui-corner-top{border-top-left-radius:3px;border-top-right-radius:3px}.ui-corner-bottom{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.ui-corner-right{border-top-right-radius:3px;border-bottom-right-radius:3px}.ui-corner-left{border-top-left-radius:3px;border-bottom-left-radius:3px}.ui-corner-all{border-radius:3px}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:url(roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot);src:local("Roboto"),local("Roboto-Regular"),url(roboto-v15-latin-regular.9f916e330c478bbfa2a0.eot?#iefix) format("embedded-opentype"),url(roboto-v15-latin-regular.7e367be02cd17a96d513.woff2) format("woff2"),url(roboto-v15-latin-regular.16e1d930cf13fb7a9563.woff) format("woff"),url(roboto-v15-latin-regular.38861cba61c66739c145.ttf) format("truetype"),url(roboto-v15-latin-regular.3d3a53586bd78d1069ae.svg#Roboto) format("svg")}.ui-widget-header{background:#f6f7f9 0 0 repeat-x;background:linear-gradient(180deg,#f6f7f9 0,#ebedf0)}.ui-accordion .ui-accordion-header{background:#f6f7f9;border-top:1px solid #d9d9d9}.ui-accordion .ui-accordion-header a{color:#1b1d1f}.ui-accordion .ui-accordion-header:not(.ui-state-active):not(.ui-state-disabled):hover{background:#ededf0}.ui-accordion .ui-accordion-header.ui-state-active{background:#fff;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-radius:0}.ui-accordion .ui-accordion-content,.ui-tabview.ui-widget-content{border:0 none}.ui-tabview .ui-tabview-nav{background:transparent}.ui-tabview .ui-tabview-nav>li.ui-state-default{background:#f6f7f9}.ui-tabview .ui-tabview-nav>li.ui-state-active{background:#fff;font-weight:400;color:#555}.ui-tabview .ui-tabview-nav>li:not(.ui-state-active):not(.ui-state-disabled):hover{background:#ededf0}.ui-spinner:not(.ui-state-disabled) .ui-spinner-button:enabled:hover{border:1px solid #1f89ce;background:#1f89ce;outline:0 none;color:#fff}.ui-spinner:not(.ui-state-disabled) .ui-spinner-button:enabled:active{border:1px solid #156090;background:#186ba0;color:#fff}.ui-slider{position:relative;text-align:left;background:#838688;border:none;box-shadow:inset 0 1px 3px rgba(0,0,0,.6)}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:17px!important;height:21px!important;cursor:default;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAVCAYAAAAjODzXAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZBQjgwQThDRjQ4ODExRTBBMzgxQjZGRjMwN0M4RjFGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjZBQjgwQThERjQ4ODExRTBBMzgxQjZGRjMwN0M4RjFGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NkFCODBBOEFGNDg4MTFFMEEzODFCNkZGMzA3QzhGMUYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NkFCODBBOEJGNDg4MTFFMEEzODFCNkZGMzA3QzhGMUYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5U68QXAAAED0lEQVR42qyWzU9jVRjGz+29pdBSKJWAksmMGheTyAwLKCRE/gAXAq5MEHZujCtCov8CS5dOMgkLozALo0ZCYgTdkgyTAhqR8GUDmGKhQin97q3Pc3zP5FpnGJ16k6f33N7z/u77dc69lvrn4RwcHLxXq9XeKhaLt6vV6i3XdRO4/qVUKn0Ti8XuY05FXX/8Z4blHa+srLw2NDT0WVNTUyyTyaiTkxN1dnamQqGQCgaD+gzgw/X19XfHx8d3YVOrc+C5GT4B+AB4Y3h4+BEmxxzHUX6//7Es6y9/ASAoNjIy8mhhYaHXY98wQ//09/dHent7P8ekcLlc1gYtLS1ahCA61dzcrAKBgAb6fL7w4ODgp5xmvGiUQUf8s7OzH6J+N7LZrEJNVaVS0cZMIwEGaCCcA2jf8vLyR+yH/4NBSDgajb59eXmpbNvWqQNQTw6HwxrG2hKCplP5fF6LUbe3t78D+48ZUaMMOhKBZ7fYWPScN40ikYiGtLa2qkKhoPigXC6nx4wYdjdpT0caZdCREOoVMDcoAugxwWw6dr75H8vv8RjwJtrrGjfIoCMODIpIZYAp1ZsADNva2lRHR4dKJpOqu7tbR0SwiYg1xsGutLlsG2XQkcrp6Wm6q6vrJRqzuVhXnk2EjEaWncI8HQkh+/v7Z7CvktYog6vmanNzM07P0Tg6CjaVSa05p9NpHQnTyoZkdKurqw9pT21sbKw3wuAuE4WXb66trd3r6ekJcQI7npFwKRpDNiGjpLgCdnZ2Un19fe/D/geWRhifPAfjA9h/z/pW6TFS1DI6OnoHk22mjGIUhBHCZQc2YH7eK09NTd07Ojpahv1vrDMZe3t7rWNjY3fB8P0bxuTk5P3j4+PvyKAj7K7i7u7u1dLSkosd8tXOzs6AgfDM2mJV6J1xe3s7A8BCPB7/EnZbUF4YJTDyi4uLamBg4OXrGFtbW5cTExNfoJxfwe5nMmzZodlw2VQqdTE3N5fiNo0NKoRa20i5D5FUDw8Pc/Pz89vT09MPMO9bzN+ALsQJS96meTRtDowLZCiMngkKw0LDuolEIg/G3szMzNd4EZIRh/7g883bl03L9dwF3YZeh16BXuD2LUvsFPoV+kkykWIWPG9gMoLQDeiuMLhZdXgYfGgC+hHahI6hAoOxPJ8DtryAotCLUKeAHYn2Sh6ehNIG4HHEkge2if1NCSwkbDKy0O/iTFKu+X/NEUjN1BnKyPhcwJZcl8WZrIzduu+RmpQ4J44qKV1AsuVKP53L/bzM1wy7DlTzOOXKRDpXNPuFjCtP+CjycipiWxGnCxLAuShbV9a/faGZa0vK4Zjt2wM3D3Cv+Uw0ZXYkG/VZLT0po9Y1MKvuvjdjzzq89t6vOPdpnD8FGACiWVtxaofC7AAAAABJRU5ErkJggg==) 0 0 no-repeat;outline:none;border-radius:0;border:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background:#14a4ff;box-shadow:inset 0 1px 3px rgba(0,0,0,.6);border-radius:3px}.ui-slider .ui-slider-handle.ui-state-active{background-position:-17px 0}.ui-slider-horizontal{height:6px}.ui-slider-horizontal .ui-slider-handle{top:-2px!important;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.1em!important;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-progressbar.ui-progressbar-determinate .ui-progressbar-value{border:0 none;background:#8ec5fc}.ui-progressbar.ui-progressbar-determinate .ui-progressbar .ui-progressbar-label{color:#222}.ui-progressbar.ui-progressbar-indeterminate{background:#8ec5fc}.ui-progressbar.ui-progressbar-indeterminate .ui-progressbar-value{border:0 none;background-color:#186ba0}.ui-button,.ui-widget-content .ui-button,.ui-widget-header .ui-button,.ui-widget.ui-button{border:1px solid #2399e5;color:#fff;background:#2399e5;transition:background-color .2s}.ui-button:enabled:hover,.ui-button:focus,.ui-widget-content .ui-button:enabled:hover,.ui-widget-content .ui-button:focus,.ui-widget-header .ui-button:enabled:hover,.ui-widget-header .ui-button:focus,.ui-widget.ui-button:enabled:hover,.ui-widget.ui-button:focus{border:1px solid #1f89ce;background:#1f89ce;outline:0 none;color:#fff}.ui-button:enabled:active,.ui-widget-content .ui-button:enabled:active,.ui-widget-header .ui-button:enabled:active,.ui-widget.ui-button:enabled:active{border:1px solid #156090;background:#186ba0;color:#fff}.ui-fileupload-choose.ui-state-focus,.ui-fileupload-choose:not(.ui-state-disabled):hover{border:1px solid #1f89ce;background:#1f89ce;outline:0 none;color:#fff}.ui-chkbox-box.ui-state-active,.ui-fileupload-choose:not(.ui-state-disabled):active,.ui-radiobutton-box.ui-state-active{border:1px solid #156090;background:#186ba0;color:#fff}.ui-chkbox-box.ui-state-focus,.ui-radiobutton-box.ui-state-focus{box-shadow:0 0 5px #1f89ce}.ui-chkbox-box.ui-state-focus.ui-state-active{background:#186ba0}.ui-inputtext{background:#fff;color:#222;transition:.2s}.ui-inputtext.ui-state-focus,.ui-inputtext:focus{box-shadow:0 0 5px #1f89ce}.ui-inputswitch-on{background:#186ba0!important;color:#fff!important}.ui-paginator .ui-paginator-page.ui-state-active{background:#186ba0;color:#fff;border-color:#156090}.ui-datatable th.ui-state-default{background:#ebedf0;border-color:#d9d9d9}.ui-datatable th.ui-sortable-column:not(.ui-state-active):hover{background:#d3d5d8;border-color:#d9d9d9}.ui-datatable th.ui-state-active{background:#186ba0;color:#fff}.ui-datatable tbody>tr.ui-widget-content{border-color:#d9d9d9}.ui-datatable tbody>tr.ui-widget-content.ui-datatable-odd{background-color:#fafafb}.ui-datatable tbody>tr.ui-widget-content.ui-state-highlight{background-color:#186ba0;color:#fff}.ui-datatable tfoot td.ui-state-default{background:#ebedf0;border-color:#d9d9d9}.ui-panel.ui-widget{padding:0}.ui-panel.ui-widget .ui-panel-titlebar.ui-corner-all{-moz-border-radius-bottom-left:0;border-bottom-left-radius:0;-moz-border-radius-bottom-right:0;border-bottom-right-radius:0}.ui-panel.ui-widget .ui-panel-titlebar{border-width:0 0 1px 0}.ui-panel.ui-widget .ui-panel-titlebar-icon span{position:relative;top:1px}.ui-treetable th.ui-state-default{background:#ebedf0;border-color:#d9d9d9}.ui-selectbutton .ui-button.ui-state-default,.ui-togglebutton.ui-button.ui-state-default{border:1px solid #d6d6d6;background:#fff;font-weight:400;color:#555}.ui-selectbutton .ui-button.ui-state-focus,.ui-selectbutton .ui-button.ui-state-hover,.ui-togglebutton.ui-button.ui-state-focus,.ui-togglebutton.ui-button.ui-state-hover{border:1px solid silver;background:#eee;font-weight:400;color:#212121}.ui-selectbutton .ui-button.ui-state-focus.ui-state-active,.ui-togglebutton.ui-button.ui-state-focus{box-shadow:0 0 5px #1f89ce}.ui-selectbutton .ui-button.ui-state-active,.ui-togglebutton.ui-button.ui-state-active{border:1px solid #156090;background:#186ba0;color:#fff}.ui-multiselect .ui-multiselect-label{background-color:#fff}.ui-dropdown.ui-state-focus,.ui-multiselect.ui-state-focus{box-shadow:0 0 5px #1f89ce}.ui-growl-item-container.ui-state-highlight.ui-growl-message-info{background-color:#2196f3;border-color:#2196f3}.ui-growl-item-container.ui-state-highlight.ui-growl-message-error{background-color:#f44336;border-color:#f44336}.ui-growl-item-container.ui-state-highlight.ui-growl-message-warn{background-color:#ffb300;border-color:#ffb300}.ui-growl-item-container.ui-state-highlight.ui-growl-message-success{background-color:#4caf50;border-color:#4caf50}.ui-tabmenu{border:0 none}.ui-tabmenu .ui-tabmenu-nav{background:none}.ui-tabmenu .ui-tabmenu-nav>li.ui-state-default{background:#f6f7f9}.ui-tabmenu .ui-tabmenu-nav>li.ui-state-active{background:#fff;font-weight:400;color:#555}.ui-tabmenu .ui-tabmenu-nav>li:not(.ui-state-active):not(.ui-state-disabled):hover{background:#ededf0}.ui-menu,.ui-menu .ui-menu-child{border:1px solid #d9d9d9;color:#1b1d1f;background:#f6f7f9 0 0 repeat-x;background:linear-gradient(180deg,#f6f7f9 0,#ebedf0)}.ui-menu .ui-menuitem.ui-menuitem-active>.ui-menuitem-link,.ui-menu .ui-menuitem .ui-menuitem-link:hover{background-color:#a6a6a6;color:#fff}.ui-panelmenu .ui-panelmenu-header.ui-state-active,.ui-panelmenu .ui-panelmenu-header.ui-state-active a{border-color:#156090;background:#186ba0;color:#fff}.ui-datepicker.ui-widget{padding:0}.ui-datepicker.ui-widget .ui-datepicker-header{border-radius:0;border-top:0 none;border-left:0 none;border-right:0 none}.ui-datepicker.ui-widget .ui-datepicker-header a:hover{border-width:1px}.ui-datepicker.ui-widget .ui-datepicker-calendar{margin:0}.ui-datepicker.ui-widget .ui-datepicker-calendar thead th{background-color:#f6f8fa;padding:8px}.ui-datepicker.ui-widget .ui-datepicker-calendar td{border-bottom:1px solid hsla(0,0%,84%,.5);padding:0}.ui-datepicker.ui-widget .ui-datepicker-calendar td a{border:0 none;text-align:center;padding:8px}.ui-datepicker.ui-widget .ui-datepicker-calendar td a.ui-state-highlight{background-color:#d6d6d6;color:#212121}.ui-datepicker.ui-widget .ui-datepicker-calendar td a.ui-state-active{background-color:#186ba0;color:#fff}.ui-datepicker.ui-widget .ui-datepicker-calendar tr:last-child td{border-bottom:0 none}.ui-datepicker.ui-widget .ui-timepicker{border-bottom:0 none;border-left:0 none;border-right:0 none;border-radius:0}.ui-datepicker.ui-widget.ui-datepicker-timeonly .ui-timepicker{border-top:0 none}.ui-steps .ui-steps-item.ui-state-highlight .ui-menuitem-link{color:#fff}.ui-dialog.ui-widget .ui-dialog-titlebar{padding:1em 1.5em}.ui-dialog.ui-widget .ui-dialog-titlebar .ui-dialog-title{font-size:1.25em}.ui-dialog.ui-widget .ui-dialog-content{padding:1em 1.5em}.fc .fc-button-group .ui-state-active{border:1px solid #156090;background:#186ba0;color:#fff}.ui-widget,.ui-widget *{box-sizing:border-box}.ui-helper-hidden{display:none!important}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-hidden-accessible input,.ui-helper-hidden-accessible select{-webkit-transform:scale(0);transform:scale(0)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled,.ui-state-disabled a{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.3)}.ui-unselectable-text{-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none}.ui-scrollbar-measure{width:100px;height:100px;overflow:scroll;position:absolute;top:-9999px}.ui-overflow-hidden{overflow:hidden}::-webkit-input-placeholder{color:#898989}:-moz-placeholder,::-moz-placeholder{color:#898989;opacity:1}:-ms-input-placeholder,::-ms-input-placeholder{color:#898989}.ui-placeholder{color:#898989}.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-header a{display:block;padding:.5em .5em .5em 2em}.ui-accordion .ui-accordion-header>.fa{position:absolute;left:.5em;top:50%;margin-top:-.5em}.ui-accordion .ui-accordion-content{padding:1em;border-top:0;overflow:visible;zoom:1}.ui-accordion .ui-accordion-header.ui-state-disabled,.ui-accordion .ui-accordion-header.ui-state-disabled a{cursor:default}.ui-accordion-content-wrapper-overflown{overflow:hidden}.ui-rtl .ui-accordion .ui-accordion-header a{padding:.5em 2em .5em .5em}.ui-rtl .ui-accordion .ui-accordion-header>.fa{left:auto;right:.5em}.ui-rtl .ui-accordion .ui-accordion-header>.fa-caret-right:before{content:"\F0D9"}.ui-autocomplete{width:auto;zoom:1;cursor:pointer;box-shadow:none;position:relative;display:inline-block}.ui-autocomplete .ui-autocomplete-dropdown{height:100%;width:2em;margin-right:0;vertical-align:top}.ui-autocomplete .ui-autocomplete-input{padding-right:1.5em}.ui-autocomplete-loader{position:absolute;right:.25em;top:50%;margin-top:-.5em}.ui-autocomplete-query{font-weight:700}.ui-autocomplete-panel{position:absolute;overflow:auto}.ui-autocomplete-panel .ui-autocomplete-list{padding:.4em;border:0 none}.ui-autocomplete-panel .ui-autocomplete-list-item{border:0 none;cursor:pointer;font-weight:400;margin:1px 0;padding:.186em .313em;text-align:left}.ui-autocomplete .ui-button-icon-only,.ui-autocomplete .ui-button-icon-only:enabled:active,.ui-autocomplete .ui-button-icon-only:enabled:focus,.ui-autocomplete .ui-button-icon-only:enabled:hover{border-left:0 none}.ui-autocomplete-multiple-container{display:inline-block;vertical-align:middle}.ui-autocomplete-multiple-container.ui-inputtext{clear:left;cursor:text;list-style-type:none;margin:0;overflow:hidden;padding:0 1.5em 0 .25em}.ui-autocomplete-token{cursor:default;display:inline-block;vertical-align:middle;overflow:hidden;padding:.125em .5em;white-space:nowrap;position:relative;margin-right:.125em;border:0 none;font-size:.9em}.ui-autocomplete-token-label{display:block;margin-right:2em}.ui-autocomplete-token-icon{margin-top:-.5em;position:absolute;right:.2em;top:50%;cursor:pointer}.ui-autocomplete-input-token{display:inline-block;vertical-align:middle;list-style-type:none;margin:0 0 0 .125em;padding:.25em .25em .25em 0}.ui-autocomplete-input-token input{border:0 none;width:10em;outline:medium none;background-color:transparent;margin:0;padding:0;box-shadow:none;border-radius:0}.ui-autocomplete-dd .ui-autocomplete-loader{right:2.25em}.ui-autocomplete-dd .ui-autocomplete-multiple-container.ui-corner-all,.ui-autocomplete-dd input.ui-corner-all{border-top-right-radius:0;border-bottom-right-radius:0}.ui-autocomplete-dd .ui-autocomplete-dropdown.ui-corner-all{border-top-left-radius:0;border-bottom-left-radius:0}.ui-fluid .ui-autocomplete,.ui-fluid .ui-autocomplete-input,.ui-fluid p-autocomplete{width:100%}.ui-fluid .ui-autocomplete.ui-autocomplete-dd .ui-autocomplete-input,.ui-fluid .ui-autocomplete.ui-autocomplete-dd .ui-autocomplete-multiple-container{width:calc(100% - 2em)}.ui-fluid .ui-autocomplete .ui-autocomplete-dropdown.ui-button{width:2em}.ui-blockui{position:absolute;top:0;left:0;width:100%;height:100%}.ui-blockui-document{position:fixed}.ui-breadcrumb{margin:0;padding:0;padding:.3em}.ui-breadcrumb ul{margin:0;padding:0}.ui-breadcrumb ul li{display:inline-block;vertical-align:middle}.ui-breadcrumb ul li .ui-menuitem-link{text-decoration:none}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none!important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.25em 1em}.ui-button-icon-only .ui-button-text{padding:.25em;text-indent:-9999999px}.ui-button-text-icon-left .ui-button-text{padding:.25em 1em .25em 2.1em}.ui-button-text-icon-right .ui-button-text{padding:.25em 2.1em .25em 1em}.ui-button-icon-only .fa,.ui-button-text-icon-left .fa,.ui-button-text-icon-right .fa{position:absolute;top:50%;margin-top:-.5em}.ui-button-icon-only .fa{top:50%;left:50%;margin-top:-.5em;margin-left:-.6em}.ui-button-icon-left{left:.5em}.ui-button-icon-right{right:.5em}.ui-buttonset .ui-button{margin-left:0;margin-right:0}button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-fluid .ui-button{width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.ui-fluid .ui-button-text-icon-left .ui-button-text,.ui-fluid .ui-button-text-icon-right .ui-button-text{padding-left:1em;padding-right:1em}.ui-fluid .ui-buttonset,.ui-fluid .ui-buttonset.ui-buttonset-1 .ui-button{width:100%}.ui-fluid .ui-buttonset.ui-buttonset-2 .ui-button{width:50%}.ui-fluid .ui-buttonset.ui-buttonset-3 .ui-button{width:33.3%}.ui-fluid .ui-buttonset.ui-buttonset-4 .ui-button{width:25%}.ui-fluid .ui-buttonset.ui-buttonset-5 .ui-button{width:20%}.ui-fluid .ui-buttonset.ui-buttonset-6 .ui-button{width:16.6%}@media(max-width:640px){.ui-fluid .ui-buttonset.ui-buttonset-1 .ui-button,.ui-fluid .ui-buttonset.ui-buttonset-2 .ui-button,.ui-fluid .ui-buttonset.ui-buttonset-3 .ui-button,.ui-fluid .ui-buttonset.ui-buttonset-4 .ui-button,.ui-fluid .ui-buttonset.ui-buttonset-5 .ui-button,.ui-fluid .ui-buttonset.ui-buttonset-6 .ui-button{width:100%}}.ui-button.ui-button-secondary.ui-state-default,.ui-splitbutton.ui-button-secondary .ui-button.ui-state-default{background-color:#fff;border-color:#ccc;color:#373a3c}.ui-button.ui-button-secondary:enabled:hover,.ui-button.ui-button-secondary:focus,.ui-splitbutton.ui-button-secondary .ui-button:enabled:hover,.ui-splitbutton.ui-button-secondary .ui-button:focus{background-color:#f2f2f2;border-color:#ccc;color:#373a3c}.ui-button.ui-button-secondary:enabled:active,.ui-splitbutton.ui-button-secondary .ui-button:enabled:active{background-color:#e6e6e6;border-color:#ccc;color:#373a3c}.ui-button.ui-button-success.ui-state-default,.ui-splitbutton.ui-button-success .ui-button.ui-state-default{background-color:#5cb85c;border-color:#5cb85c;color:#fff}.ui-button.ui-button-success:enabled:hover,.ui-button.ui-button-success:focus,.ui-splitbutton.ui-button-success .ui-button:enabled:hover,.ui-splitbutton.ui-button-success .ui-button:focus{background-color:#4cae4c;border-color:#5cb85c}.ui-button.ui-button-success:enabled:active,.ui-splitbutton.ui-button-success .ui-button:enabled:active{background-color:#449d44;border-color:#5cb85c}.ui-button.ui-button-info.ui-state-default,.ui-splitbutton.ui-button-info .ui-button.ui-state-default{background-color:#5bc0de;border-color:#5bc0de;color:#fff}.ui-button.ui-button-info:enabled:hover,.ui-button.ui-button-info:focus,.ui-splitbutton.ui-button-info .ui-button:enabled:hover,.ui-splitbutton.ui-button-info .ui-button:focus{background-color:#46b8da;border-color:#5bc0de}.ui-button.ui-button-info:enabled:active,.ui-splitbutton.ui-button-info .ui-button:enabled:active{background-color:#31b0d5;border-color:#5bc0de}.ui-button.ui-button-warning.ui-state-default,.ui-splitbutton.ui-button-warning .ui-button.ui-state-default{background-color:#f0ad4e;border-color:#f0ad4e;color:#fff}.ui-button.ui-button-warning:enabled:hover,.ui-button.ui-button-warning:focus,.ui-splitbutton.ui-button-warning .ui-button:enabled:hover,.ui-splitbutton.ui-button-warning .ui-button:focus{background-color:#eea236;border-color:#f0ad4e}.ui-button.ui-button-warning:enabled:active,.ui-splitbutton.ui-button-warning .ui-button:enabled:active{background-color:#ec971f;border-color:#f0ad4e}.ui-button.ui-button-danger.ui-state-default,.ui-splitbutton.ui-button-danger .ui-button.ui-state-default{background-color:#d9534f;border-color:#d9534f;color:#fff}.ui-button.ui-button-danger:enabled:hover,.ui-button.ui-button-danger:focus,.ui-splitbutton.ui-button-danger .ui-button:enabled:hover,.ui-splitbutton.ui-button-danger .ui-button:focus{background-color:#d43f3a;border-color:#d9534f}.ui-button.ui-button-danger:enabled:active,.ui-splitbutton.ui-button-danger .ui-button:enabled:active{background-color:#c9302c;border-color:#d9534f}.ui-calendar{position:relative;display:inline-block}.ui-calendar .ui-calendar-button{position:absolute;height:100%;border-top-left-radius:0;border-bottom-left-radius:0;width:2em;border-left:0 none}.ui-calendar .ui-calendar-button:enabled:hover,.ui-calendar .ui-calendar-button:focus{border-left:0 none}.ui-fluid .ui-calendar{width:100%}.ui-fluid .ui-calendar-button{width:2em}.ui-fluid .ui-datepicker-buttonbar button{width:auto}.ui-fluid .ui-calendar.ui-calendar-w-btn .ui-inputtext{width:calc(100% - 2em)}.ui-datepicker{width:17em;padding:.2em;display:none;position:absolute}.ui-datepicker.ui-datepicker-inline{display:inline-block;position:static}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:.125em;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev{left:.125em}.ui-datepicker .ui-datepicker-next{right:.125em}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;top:50%;margin-top:-.5em}.ui-datepicker .ui-datepicker-prev span{margin-left:-.25em}.ui-datepicker .ui-datepicker-next span{margin-left:-.125em}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:.125em 0;vertical-align:middle}.ui-datepicker select.ui-datepicker-month{width:55%}.ui-datepicker select.ui-datepicker-year{width:35%}.ui-datepicker select.ui-datepicker-month{margin-right:.25em}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:.125em}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker .ui-datepicker-buttonbar{border-left:0 none;border-right:0 none;border-bottom:0 none;padding:.2em}.ui-datepicker .ui-datepicker-buttonbar>.ui-g>div:last-child{text-align:right}.ui-datepicker .ui-datepicker-buttonbar>.ui-g>div{padding:0}.ui-calendar.ui-calendar-w-btn input{border-top-right-radius:0;border-bottom-right-radius:0}.ui-timepicker{text-align:center;padding:.5em 0}.ui-timepicker>div{display:inline-block;margin-left:.5em;min-width:1.5em}.ui-timepicker>.ui-minute-picker,.ui-timepicker>.ui-second-picker{margin-left:0}.ui-timepicker>.ui-separator{margin-left:0;min-width:.75em}.ui-timepicker>.ui-separator a{visibility:hidden}.ui-timepicker>div a{display:block;opacity:.7;filter:Alpha(Opacity=70)}.ui-timepicker>div a:hover{display:block;opacity:1;filter:Alpha(Opacity=100)}.ui-carousel{position:relative;padding:.063em}.ui-carousel .ui-carousel-viewport .ui-carousel-items{list-style:none outside none;margin:0;padding:0;position:relative;width:32000px;left:0}.ui-carousel .ui-carousel-viewport .ui-carousel-items .ui-carousel-item{margin:1px;padding:0;float:left;box-sizing:border-box}.ui-carousel .ui-carousel-viewport{overflow:hidden;position:relative;border:0}.ui-carousel .ui-carousel-footer{margin:1px 1px 0 1px;padding:.5em;overflow:hidden}.ui-carousel .ui-carousel-header{margin:0 1px;overflow:hidden;padding:.625em}.ui-carousel .ui-carousel-header .ui-carousel-header-title{display:inline-block;overflow:hidden}.ui-carousel .ui-carousel-dropdown,.ui-carousel .ui-carousel-mobiledropdown{float:right;margin:0 .625em;background-image:none}.ui-carousel .ui-carousel-dropdown option,.ui-carousel .ui-carousel-mobiledropdown option{background-image:none;border:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.ui-carousel .ui-carousel-button{float:right;margin:.125em}.ui-carousel .ui-carousel-page-link{float:left;margin:0 .125em;text-decoration:none}.ui-carousel .ui-carousel-button,.ui-carousel .ui-carousel-page-link{cursor:pointer}.ui-carousel .ui-carousel-page-links{margin:0 .5em;margin-top:.125em;float:right}.ui-carousel .ui-carousel-mobiledropdown{display:none}.ui-chkbox{display:inline-block;cursor:pointer;vertical-align:middle;margin-right:.25em}.ui-chkbox .ui-chkbox-box{width:1.125em;height:1.125em;line-height:1.125em;border-radius:2px;text-align:center}.ui-chkbox .ui-chkbox-icon{display:block}.ui-chkbox-label{vertical-align:middle}.ui-chips>ul.ui-inputtext{clear:left;cursor:text;list-style-type:none;margin:0;overflow:hidden;padding:0 .25em}.ui-chips-token{cursor:default;display:inline-block;vertical-align:middle;overflow:hidden;padding:.125em .5em;white-space:nowrap;position:relative;margin-right:.125em;border:0 none;font-size:.9em}.ui-chips-token .ui-chips-token-label{display:block;margin-right:2em}.ui-chips>.ui-state-disabled .ui-chips-token-label{margin-right:0}.ui-chips-token .ui-chips-token-icon{margin-top:-.5em;position:absolute;right:.2em;top:50%;cursor:pointer}.ui-chips-input-token{display:inline-block;vertical-align:middle;list-style-type:none;margin:0 0 0 .125em;padding:.25em .25em .25em 0}.ui-chips-input-token input{border:0 none;width:10em;outline:medium none;background-color:transparent;margin:0;padding:0;box-shadow:none;border-radius:0}.ui-colorpicker{display:inline-block}.ui-colorpicker-dragging{cursor:pointer}.ui-colorpicker-overlay{position:relative}.ui-colorpicker-panel{position:relative;width:193px;height:166px;background-color:#323232;border-color:#191919}.ui-colorpicker-overlay-panel{display:none;position:absolute}.ui-colorpicker-preview{width:2em;cursor:pointer}.ui-colorpicker-panel .ui-colorpicker-content{position:relative}.ui-colorpicker-panel .ui-colorpicker-color-selector{width:150px;height:150px;top:8px;left:8px;position:absolute}.ui-colorpicker-panel .ui-colorpicker-color{width:150px;height:150px;background:transparent url(color.c7a33805ffda0d32bd2a.png) no-repeat 0 0}.ui-colorpicker-panel .ui-colorpicker-color-handle{position:absolute;top:0;left:150px;border-radius:100%;width:10px;height:10px;border:1px solid #fff;margin:-5px 0 0 -5px;cursor:pointer}.ui-colorpicker-panel .ui-colorpicker-hue{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAACWCAIAAAC3uvTNAAAA7ElEQVRYw+2YUQqDQAxEh9GWuqV6Be9/JT88RN0VRUuv0ElBwhKY3yF5m90kLKd+mF/975r6geNyjm9Fy0kgqTJ6nqoIdGKczjmPJU5tZxA8wWPL7YOHKhZAlcmTAVVcxSCrMbfgqY/H6JEOoASPe56tgSrqLR7U2zWojwWjJ3jq47HEiZoGTwJxP1RRXw8y9RZfCMhbhTHOVTxXnUFtPJ5rGjzu35y2KfKGQxWT2K4TQL1d2zz6KAH1kRU8wfOXx+37qY3Hct+aDaqot2u7R/wMuDS3qnj0z0HqK4X/+kRNHdfUwFP2Nisqe/sFuUZiVjC9HCUAAAAASUVORK5CYII=) no-repeat 0 0;width:17px;height:150px;top:8px;left:167px;position:absolute;opacity:.85}.ui-colorpicker-panel .ui-colorpicker-hue-handle{position:absolute;top:150px;left:0;width:21px;margin-left:-2px;margin-top:-5px;height:10px;border:2px solid #fff;opacity:.85;cursor:pointer}.ui-colorpicker-panel.ui-state-disabled .ui-colorpicker-color-handle,.ui-colorpicker-panel.ui-state-disabled .ui-colorpicker-hue-handle{opacity:.5}.ui-datagrid .ui-paginator{text-align:center;border-top:0 none}.ui-datagrid-column{padding:.25em}.ui-datagrid-content-empty{padding:.25em .625em}.ui-datagrid .ui-datagrid-footer,.ui-datagrid .ui-datagrid-header{text-align:center;padding:.5em .75em}.ui-datagrid .ui-datagrid-header{border-bottom:0 none}.ui-datagrid .ui-datagrid-footer{border-top:0 none}.ui-datagrid .ui-paginator-top{border-bottom:0 none}.ui-datagrid .ui-paginator-bottom{border-top:0 none}.ui-datalist .ui-datalist-footer,.ui-datalist .ui-datalist-header{text-align:center;padding:.5em .75em}.ui-datalist .ui-datalist-header{border-bottom:0 none}.ui-datalist .ui-datalist-footer,.ui-datalist .ui-paginator{border-top:0 none}.ui-datalist .ui-datalist-data{margin:0;padding:0}.ui-datalist .ui-datalist-data>li{list-style-type:none}.ui-datalist .ui-datalist-emptymessage{padding:.5em .75em}.ui-datalist.ui-datalist-scrollable .ui-datalist-content{overflow:auto}.ui-datascroller .ui-datascroller-header{text-align:center;padding:.5em .75em;border-bottom:0 none}.ui-datascroller .ui-datascroller-footer{text-align:center;padding:.25em .625em;border-top:0 none}.ui-datascroller .ui-datascroller-content{padding:.25em .625em}.ui-datascroller-inline .ui-datascroller-content{overflow:auto}.ui-datascroller .ui-datascroller-list{list-style-type:none;margin:0;padding:0}.ui-datatable{position:relative}.ui-datatable table{border-collapse:collapse;width:100%;table-layout:fixed}.ui-datatable .ui-datatable-caption,.ui-datatable .ui-datatable-footer,.ui-datatable .ui-datatable-header{text-align:center;padding:.5em .75em;box-sizing:border-box}.ui-datatable .ui-datatable-caption,.ui-datatable .ui-datatable-header{border-bottom:0 none}.ui-datatable .ui-datatable-footer{border-top:0 none}.ui-datatable tfoot td,.ui-datatable thead th{text-align:center}.ui-datatable thead tr{border-width:0}.ui-datatable .ui-datatable-data>tr>td,.ui-datatable .ui-datatable-tfoot>tr>td,.ui-datatable .ui-datatable-thead>tr>th{border-color:inherit;box-sizing:border-box;padding:.25em .5em;border-width:1px;border-style:solid}.ui-datatable.ui-datatable-resizable .ui-datatable-data>tr>td,.ui-datatable.ui-datatable-resizable .ui-datatable-tfoot>tr>td,.ui-datatable.ui-datatable-resizable .ui-datatable-thead>tr>th{overflow:hidden}.ui-datatable .ui-datatable-tfoot>tr>td,.ui-datatable .ui-datatable-thead>tr>th{font-weight:400}.ui-datatable tbody{outline:0}.ui-datatable .ui-sortable-column{cursor:pointer}.ui-datatable .ui-sortable-column-icon{display:inline-block;margin-left:.125em}.ui-datatable tr.ui-state-highlight{cursor:pointer}.ui-datatable-scrollable-body{overflow:auto;overflow-anchor:none}.ui-datatable-scrollable-header{overflow:hidden}.ui-datatable-scrollable .ui-datatable-scrollable-footer,.ui-datatable-scrollable .ui-datatable-scrollable-header{position:relative;border:0 none}.ui-datatable-scrollable .ui-datatable-scrollable-header td{font-weight:400}.ui-datatable .ui-datatable-scrollable-body{min-height:0}.ui-datatable .ui-datatable-data tr.ui-state-highlight,.ui-datatable .ui-datatable-data tr.ui-state-hover{border-color:inherit;font-weight:inherit;cursor:pointer}.ui-datatable .ui-datatable-data tr.ui-rowgroup-header td a,.ui-datatable .ui-datatable-data tr.ui-rowgroup-header td span.ui-rowgroup-header-name{display:inline-block;vertical-align:middle}.ui-datatable-scrollable-theadclone,.ui-datatable-scrollable-theadclone tr{height:0}.ui-datatable-scrollable-theadclone th.ui-state-default{height:0;border-bottom-width:0;border-top-width:0;padding-top:0;padding-bottom:0;outline:0 none}.ui-datatable-scrollable-theadclone th span.ui-column-title{display:block;height:0}.ui-datatable .ui-paginator{padding:.125em}.ui-datatable .ui-paginator-top{border-bottom-width:0}.ui-datatable .ui-paginator-bottom{border-top-width:0}.ui-datatable-rtl{direction:rtl}.ui-datatable-rtl.ui-datatable tfoot td,.ui-datatable-rtl.ui-datatable thead th{text-align:right}.ui-row-toggler{cursor:pointer}.ui-datatable .ui-column-resizer{display:block;position:absolute!important;top:0;right:0;margin:0;width:.5em;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.ui-datatable .ui-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.ui-datatable-resizable{padding-bottom:1px;overflow:auto}.ui-datatable-resizable tbody td,.ui-datatable-resizable tfoot td,.ui-datatable-resizable thead th{white-space:nowrap}.ui-datatable-resizable th.ui-resizable-column{background-clip:padding-box;position:relative}.ui-datatable-reflow .ui-datatable-data td .ui-column-title{display:none}.ui-datatable .ui-column-filter{display:block;width:100%;box-sizing:border-box;margin-top:.25em}.ui-datatable .ui-editable-column input{width:100%;outline:0}.ui-datatable .ui-datatable-data>tr>td.ui-editable-column{padding:.5em}.ui-datatable .ui-editable-column>.ui-cell-editor{display:none}.ui-datatable .ui-datatable-data>tr>td.ui-editable-column.ui-cell-editing{padding:1px}.ui-datatable .ui-editable-column.ui-cell-editing>.ui-cell-editor{display:block}.ui-datatable .ui-editable-column.ui-cell-editing>.ui-cell-data{display:none}.ui-datatable-stacked tfoot td,.ui-datatable-stacked thead th{display:none!important}.ui-datatable.ui-datatable-stacked .ui-datatable-data>tr>td{text-align:left;display:block;border:0 none;width:100%;box-sizing:border-box;float:left;clear:left}.ui-datatable.ui-datatable-stacked .ui-datatable-data.ui-widget-content{border:0 none}.ui-datatable-stacked .ui-datatable-data tr.ui-widget-content{border-left:0 none;border-right:0 none}.ui-datatable-stacked .ui-datatable-data td .ui-column-title{padding:.4em;min-width:30%;display:inline-block;margin:-.4em 1em -.4em -.4em;font-weight:700}.ui-datatable .ui-selection-column .ui-chkbox,.ui-datatable .ui-selection-column .ui-radiobutton{margin:0;display:block}.ui-datatable .ui-selection-column .ui-chkbox-box,.ui-datatable .ui-selection-column .ui-radiobutton-box{display:block;box-sizing:border-box;margin:0}.ui-datatable-scrollable-wrapper{position:relative}.ui-datatable-frozen-view .ui-datatable-scrollable-body{overflow:hidden}.ui-datatable-unfrozen-view{position:absolute;top:0}.ui-datatable .ui-datatable-load-status{width:100%;height:100%;top:0;left:0}.ui-datatable .ui-datatable-virtual-table{position:absolute;top:0;left:0}.ui-datatable .ui-datatable-loading{position:absolute;width:100%;height:100%;-ms-filter:"alpha(opacity=10)";opacity:.1;z-index:1}.ui-datatable .ui-datatable-loading-content{position:absolute;left:50%;top:25%;z-index:2}@media(max-width:35em){.ui-datatable-reflow tfoot td,.ui-datatable-reflow thead th{display:none!important}.ui-datatable-reflow .ui-datatable-data>tr>td{text-align:left;display:block;border:0 none;width:100%!important;box-sizing:border-box;float:left;clear:left}.ui-datatable-reflow .ui-datatable-data.ui-widget-content{border:0 none}.ui-datatable-reflow .ui-datatable-data tr.ui-widget-content{border-left:0 none;border-right:0 none}.ui-datatable-reflow .ui-datatable-data td .ui-column-title{padding:.4em;min-width:30%;display:inline-block;margin:-.4em 1em -.4em -.4em;font-weight:700}.ui-datatable-reflow.ui-datatable-scrollable .ui-datatable-scrollable-body colgroup{display:block}}.ui-dialog{position:fixed;padding:0}.ui-dialog .ui-dialog-content,.ui-dialog .ui-dialog-titlebar{padding:.5em .75em;position:relative;border:0}.ui-dialog .ui-dialog-content{background:0;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;float:right}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-dialog .ui-dialog-titlebar-icon{text-decoration:none}.ui-dialog .ui-dialog-titlebar-close{float:right;padding:.125em;cursor:pointer;border:1px solid transparent}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:0}.ui-dialog-footer{padding:1em;border-width:1px 0 0 0;text-align:right}.ui-dialog-mask{position:fixed;width:100%;height:100%}.ui-confirmdialog{width:30em}.ui-confirmdialog.ui-dialog .ui-dialog-content{padding:1em 2em}.ui-confirmdialog .ui-dialog-content .fa{font-size:1.5em;vertical-align:middle;margin-right:.5em}.ui-confirmdialog .ui-dialog-content .ui-confirmdialog-message{vertical-align:middle}.ui-fluid .ui-dialog-footer .ui-button{width:auto}.ui-rtl .ui-dialog .ui-dialog-titlebar-close{float:left}.ui-rtl .ui-dialog .ui-dialog-buttonpane button{text-align:right}@media screen and (max-width:40em){.ui-confirmdialog{width:90%}}.ui-dropdown{display:inline-block;position:relative;cursor:pointer;vertical-align:middle}.ui-dropdown .ui-dropdown-trigger{border-right:0;border-top:0;border-bottom:0;cursor:pointer;width:1.5em;height:100%;position:absolute;right:0;top:0;padding:0 .25em}.ui-dropdown .ui-dropdown-trigger .fa{margin-top:.3em;margin-left:-.125em}.ui-dropdown .ui-dropdown-label{display:block;border:0;white-space:nowrap;overflow:hidden;font-weight:400;width:100%;padding-right:1.5em}.ui-dropdown-item-empty,.ui-dropdown-label-empty{text-indent:-9999px}.ui-dropdown.ui-state-disabled .ui-dropdown-label,.ui-dropdown.ui-state-disabled .ui-dropdown-trigger{cursor:default}.ui-dropdown label.ui-dropdown-label{cursor:pointer}.ui-dropdown input.ui-dropdown-label{cursor:default}.ui-dropdown .ui-dropdown-panel{min-width:100%}.ui-dropdown-panel{position:absolute;height:auto;display:none}.ui-dropdown-panel .ui-dropdown-items-wrapper{overflow:auto}.ui-dropdown-panel .ui-dropdown-item{font-weight:400;border:0 none;cursor:pointer;margin:1px 0;padding:.125em .25em;text-align:left}.ui-dropdown-panel .ui-dropdown-item-group{font-weight:700}.ui-dropdown-panel .ui-dropdown-list{padding:.4em;border:0 none}.ui-dropdown-panel .ui-dropdown-filter{width:100%;box-sizing:border-box;padding-right:1.5em}.ui-dropdown-panel .ui-dropdown-filter-container{position:relative;margin:0;padding:.4em;display:inline-block;width:100%}.ui-dropdown-panel .ui-dropdown-filter-container .fa{position:absolute;top:.8em;right:1em}.ui-fluid .ui-dropdown{width:100%}.ui-fieldset,.ui-fieldset .ui-fieldset-legend{padding:.6em 1em}.ui-fieldset-toggleable .ui-fieldset-legend{padding:.5em 1em .5em .5em;cursor:pointer;white-space:nowrap}.ui-fieldset .ui-fieldset-toggler{margin-right:.1em;display:inline-block;vertical-align:middle}.ui-fieldset .ui-fieldset-content-wrapper-overflown{overflow:hidden}.ui-fileupload-buttonbar .ui-fileupload-choose.ui-state-disabled input{cursor:default}.ui-fileupload-buttonbar{padding:.5em;border-bottom:0 none}.ui-fileupload-buttonbar .ui-button{vertical-align:middle;margin-right:.25em}.ui-fileupload-content{padding:1em;position:relative;transition:border-color .3s}.ui-fileupload-content.ui-fileupload-highlight{border-color:#156090}.ui-fileupload-files img{border:0}.ui-fileupload-files{display:table}.ui-fileupload-row{display:table-row}.ui-fileupload-row>div{display:table-cell;padding:.5em 1em;vertical-align:middle}.ui-fileupload-content .ui-progressbar{width:100%;position:absolute;top:1px;left:0;height:.25em;border:0 none}.ui-fileupload-content .ui-progressbar-value{border-radius:0;border:0 none}.ui-fileupload-choose{position:relative;overflow:hidden}.ui-fileupload-choose input[type=file]{position:absolute;top:0;right:0;margin:0;opacity:0;min-height:100%;font-size:100px;text-align:right;filter:alpha(opacity=0);direction:ltr;cursor:pointer}.ui-fileupload-choose.ui-fileupload-choose-selected input[type=file]{display:none}.ui-fluid .ui-fileupload .ui-button{width:auto}.ui-fluid .ui-fileupload-content .ui-button-icon-only{width:2em}.ui-galleria{overflow:hidden;visibility:hidden;position:relative}.ui-galleria-panel-wrapper{position:relative;padding:0;margin:0}.ui-galleria-panel{-webkit-filter:inherit;filter:inherit;position:absolute;top:0;left:0;list-style-type:none}.ui-galleria-filmstrip-wrapper{overflow:hidden;margin:.25em auto;position:relative}.ui-galleria-filmstrip{list-style:none outside none;margin:0;padding:0;width:2340px;z-index:900;position:absolute;top:0;left:0}.ui-galleria-frame{float:left;margin-right:5px;opacity:.3;cursor:pointer}.ui-galleria-frame-active{opacity:1}.ui-galleria-frame-content{overflow:hidden}.ui-galleria-nav-next,.ui-galleria-nav-prev{cursor:pointer;position:absolute}.ui-galleria-nav-prev{left:5px}.ui-galleria-nav-next{right:5px}.ui-galleria-caption{position:absolute;left:1px;background-color:rgba(0,0,0,.5);display:none;color:#ededed;padding:.2em 1em}.ui-galleria-caption h4{color:#ededed}.ui-galleria-panel-content{padding:1em 1.4em}.ui-grid{clear:both;padding:0;margin:0}.ui-grid:after,.ui-grid:before{content:"";display:table}.ui-grid:after{clear:both}.ui-grid .ui-grid-row{display:-webkit-box;display:-ms-flexbox;display:flex;clear:both}.ui-grid-row:after{clear:both;content:"";display:table}.ui-grid-col-1,.ui-grid-col-2,.ui-grid-col-3,.ui-grid-col-4,.ui-grid-col-5,.ui-grid-col-6,.ui-grid-col-7,.ui-grid-col-8,.ui-grid-col-9,.ui-grid-col-10,.ui-grid-col-11,.ui-grid-col-12{float:left;box-sizing:border-box}.ui-grid-col-1{width:8.33333%}.ui-grid-col-2{width:16.66666%}.ui-grid-col-3{width:25%}.ui-grid-col-4{width:33.33333%}.ui-grid-col-5{width:41.66666%}.ui-grid-col-6{width:50%}.ui-grid-col-7{width:58.33333%}.ui-grid-col-8{width:66.66666%}.ui-grid-col-9{width:75%}.ui-grid-col-10{width:83.33333%}.ui-grid-col-11{width:91.66666%}.ui-grid-col-12{width:100%}@media(min-width:480px){.ui-grid-fixed{width:480px}}@media(min-width:768px){.ui-grid-fixed{width:768px}}@media(min-width:960px){.ui-grid-fixed{width:960px}}@media(min-width:1024px){.ui-grid-fixed{width:1024px}}.ui-grid.ui-grid-pad>.ui-grid-row>div{padding:.25em .5em}@media(max-width:640px){.ui-grid-responsive .ui-grid-row{display:block}.ui-grid-responsive .ui-grid-col-1,.ui-grid-responsive .ui-grid-col-2,.ui-grid-responsive .ui-grid-col-3,.ui-grid-responsive .ui-grid-col-4,.ui-grid-responsive .ui-grid-col-5,.ui-grid-responsive .ui-grid-col-6,.ui-grid-responsive .ui-grid-col-7,.ui-grid-responsive .ui-grid-col-8,.ui-grid-responsive .ui-grid-col-9,.ui-grid-responsive .ui-grid-col-10,.ui-grid-responsive .ui-grid-col-11,.ui-grid-responsive .ui-grid-col-12{width:100%;float:none}}.ui-g{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui-g:after{clear:both;content:"";display:table}.ui-g-1,.ui-g-2,.ui-g-3,.ui-g-4,.ui-g-5,.ui-g-6,.ui-g-7,.ui-g-8,.ui-g-9,.ui-g-10,.ui-g-11,.ui-g-12{float:left;box-sizing:border-box;padding:.5em}.ui-g-1{width:8.3333%}.ui-g-2{width:16.6667%}.ui-g-3{width:25%}.ui-g-4{width:33.3333%}.ui-g-5{width:41.6667%}.ui-g-6{width:50%}.ui-g-7{width:58.3333%}.ui-g-8{width:66.6667%}.ui-g-9{width:75%}.ui-g-10{width:83.3333%}.ui-g-11{width:91.6667%}.ui-g-12{width:100%}.ui-g-offset-12{margin-left:100%}.ui-g-offset-11{margin-left:91.66666667%}.ui-g-offset-10{margin-left:83.33333333%}.ui-g-offset-9{margin-left:75%}.ui-g-offset-8{margin-left:66.66666667%}.ui-g-offset-7{margin-left:58.33333333%}.ui-g-offset-6{margin-left:50%}.ui-g-offset-5{margin-left:41.66666667%}.ui-g-offset-4{margin-left:33.33333333%}.ui-g-offset-3{margin-left:25%}.ui-g-offset-2{margin-left:16.66666667%}.ui-g-offset-1{margin-left:8.33333333%}.ui-g-offset-0{margin-left:0}@media screen and (max-width:40em){.ui-sm-1,.ui-sm-2,.ui-sm-3,.ui-sm-4,.ui-sm-5,.ui-sm-6,.ui-sm-7,.ui-sm-8,.ui-sm-9,.ui-sm-10,.ui-sm-11,.ui-sm-12{padding:.5em}.ui-sm-1{width:8.3333%}.ui-sm-2{width:16.6667%}.ui-sm-3{width:25%}.ui-sm-4{width:33.3333%}.ui-sm-5{width:41.6667%}.ui-sm-6{width:50%}.ui-sm-7{width:58.3333%}.ui-sm-8{width:66.6667%}.ui-sm-9{width:75%}.ui-sm-10{width:83.3333%}.ui-sm-11{width:91.6667%}.ui-sm-12{width:100%}.ui-sm-offset-12{margin-left:100%}.ui-sm-offset-11{margin-left:91.66666667%}.ui-sm-offset-10{margin-left:83.33333333%}.ui-sm-offset-9{margin-left:75%}.ui-sm-offset-8{margin-left:66.66666667%}.ui-sm-offset-7{margin-left:58.33333333%}.ui-sm-offset-6{margin-left:50%}.ui-sm-offset-5{margin-left:41.66666667%}.ui-sm-offset-4{margin-left:33.33333333%}.ui-sm-offset-3{margin-left:25%}.ui-sm-offset-2{margin-left:16.66666667%}.ui-sm-offset-1{margin-left:8.33333333%}.ui-sm-offset-0{margin-left:0}}@media screen and (min-width:40.063em){.ui-md-1,.ui-md-2,.ui-md-3,.ui-md-4,.ui-md-5,.ui-md-6,.ui-md-7,.ui-md-8,.ui-md-9,.ui-md-10,.ui-md-11,.ui-md-12{padding:.5em}.ui-md-1{width:8.3333%}.ui-md-2{width:16.6667%}.ui-md-3{width:25%}.ui-md-4{width:33.3333%}.ui-md-5{width:41.6667%}.ui-md-6{width:50%}.ui-md-7{width:58.3333%}.ui-md-8{width:66.6667%}.ui-md-9{width:75%}.ui-md-10{width:83.3333%}.ui-md-11{width:91.6667%}.ui-md-12{width:100%}.ui-md-offset-12{margin-left:100%}.ui-md-offset-11{margin-left:91.66666667%}.ui-md-offset-10{margin-left:83.33333333%}.ui-md-offset-9{margin-left:75%}.ui-md-offset-8{margin-left:66.66666667%}.ui-md-offset-7{margin-left:58.33333333%}.ui-md-offset-6{margin-left:50%}.ui-md-offset-5{margin-left:41.66666667%}.ui-md-offset-4{margin-left:33.33333333%}.ui-md-offset-3{margin-left:25%}.ui-md-offset-2{margin-left:16.66666667%}.ui-md-offset-1{margin-left:8.33333333%}.ui-md-offset-0{margin-left:0}}@media screen and (min-width:64.063em){.ui-lg-1,.ui-lg-2,.ui-lg-3,.ui-lg-4,.ui-lg-5,.ui-lg-6,.ui-lg-7,.ui-lg-8,.ui-lg-9,.ui-lg-10,.ui-lg-11,.ui-lg-12{padding:.5em}.ui-lg-1{width:8.3333%}.ui-lg-2{width:16.6667%}.ui-lg-3{width:25%}.ui-lg-4{width:33.3333%}.ui-lg-5{width:41.6667%}.ui-lg-6{width:50%}.ui-lg-7{width:58.3333%}.ui-lg-8{width:66.6667%}.ui-lg-9{width:75%}.ui-lg-10{width:83.3333%}.ui-lg-11{width:91.6667%}.ui-lg-12{width:100%}.ui-lg-offset-12{margin-left:100%}.ui-lg-offset-11{margin-left:91.66666667%}.ui-lg-offset-10{margin-left:83.33333333%}.ui-lg-offset-9{margin-left:75%}.ui-lg-offset-8{margin-left:66.66666667%}.ui-lg-offset-7{margin-left:58.33333333%}.ui-lg-offset-6{margin-left:50%}.ui-lg-offset-5{margin-left:41.66666667%}.ui-lg-offset-4{margin-left:33.33333333%}.ui-lg-offset-3{margin-left:25%}.ui-lg-offset-2{margin-left:16.66666667%}.ui-lg-offset-1{margin-left:8.33333333%}.ui-lg-offset-0{margin-left:0}}@media screen and (min-width:90.063em){.ui-xl-1,.ui-xl-2,.ui-xl-3,.ui-xl-4,.ui-xl-5,.ui-xl-6,.ui-xl-7,.ui-xl-8,.ui-xl-9,.ui-xl-10,.ui-xl-11,.ui-xl-12{padding:.5em}.ui-xl-1{width:8.3333%}.ui-xl-2{width:16.6667%}.ui-xl-3{width:25%}.ui-xl-4{width:33.3333%}.ui-xl-5{width:41.6667%}.ui-xl-6{width:50%}.ui-xl-7{width:58.3333%}.ui-xl-8{width:66.6667%}.ui-xl-9{width:75%}.ui-xl-10{width:83.3333%}.ui-xl-11{width:91.6667%}.ui-xl-12{width:100%}.ui-xl-offset-12{margin-left:100%}.ui-xl-offset-11{margin-left:91.66666667%}.ui-xl-offset-10{margin-left:83.33333333%}.ui-xl-offset-9{margin-left:75%}.ui-xl-offset-8{margin-left:66.66666667%}.ui-xl-offset-7{margin-left:58.33333333%}.ui-xl-offset-6{margin-left:50%}.ui-xl-offset-5{margin-left:41.66666667%}.ui-xl-offset-4{margin-left:33.33333333%}.ui-xl-offset-3{margin-left:25%}.ui-xl-offset-2{margin-left:16.66666667%}.ui-xl-offset-1{margin-left:8.33333333%}.ui-xl-offset-0{margin-left:0}}.ui-g-nopad{padding:0}.ui-growl{position:fixed;top:20px;right:20px;width:20em}.ui-growl-item-container{position:relative;margin:0 0 10px 0;opacity:.95;filter:alpha(opacity=95)}.ui-growl-item{position:relative;display:block;padding:.5em 1em}.ui-growl-item p{padding:0;margin:0}.ui-growl-icon-close{position:absolute;top:4px;right:4px;cursor:pointer}.ui-growl-title{font-weight:700;padding:0 0 .5em 0;display:block}.ui-growl-image{position:absolute;display:inline-block;left:.5em;top:.25em;padding:0}.ui-growl-message{padding:0 0 .25em 0;margin-left:2.5em}.ui-growl-message p{font-weight:400}.ui-inplace .ui-inplace-display{display:inline;cursor:pointer;border:0 none;padding:.25em;font-weight:400}.ui-inplace .ui-inplace-content{display:inline}.ui-inputswitch{padding:0;position:relative;cursor:pointer;height:1.5em}.ui-inputswitch,.ui-inputswitch .ui-inputswitch-off,.ui-inputswitch .ui-inputswitch-on{display:inline-block;overflow:hidden;-ms-user-select:none;user-select:none;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none}.ui-inputswitch .ui-inputswitch-off,.ui-inputswitch .ui-inputswitch-on{white-space:nowrap;position:absolute;top:0;width:auto;font-weight:700;height:100%;line-height:1.5em}.ui-inputswitch .ui-inputswitch-on{left:0;border:0 none}.ui-inputswitch .ui-inputswitch-off{right:0;text-align:right}.ui-inputswitch .ui-inputswitch-off span,.ui-inputswitch .ui-inputswitch-on span{display:inline-block;text-align:center;height:100%;line-height:inherit}.ui-inputswitch .ui-inputswitch-handle{display:block;width:0;position:absolute;top:0;left:0;height:100%;border-top:0 none;border-bottom:0 none}.ui-inputtext{margin:0;outline:medium none;padding:.25em}.ui-inputtext,.ui-widget-content .ui-inputtext,.ui-widget-header .ui-inputtext{font-weight:400}.ui-fluid .ui-inputtext{width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.ui-inputgroup{display:-webkit-box;display:-ms-flexbox;display:flex}.ui-inputgroup .ui-inputgroup-addon{display:inline-block;text-align:center;min-width:1.5em;padding:.25em;border-width:1px;border-style:solid}.ui-inputgroup .ui-inputgroup-addon+.ui-inputgroup-addon{border-left:0 none}.ui-inputgroup .ui-inputtext{padding-left:.5em}.ui-inputgroup .ui-inputtext:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0;border-left:0 none}.ui-inputgroup .ui-inputtext:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-right:0 none}.ui-inputgroup .ui-button{margin-right:0;border-radius:0}.ui-fluid .ui-inputgroup .ui-button{width:auto}.ui-fluid .ui-inputgroup .ui-inputtext{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.ui-inputgroup .ui-chkbox,.ui-inputgroup .ui-radiobutton{margin-right:0;vertical-align:bottom}.ui-float-label{display:block;position:relative}.ui-float-label label{font-weight:400;position:absolute;pointer-events:none;left:.25em;top:50%;margin-top:-.5em;transition:all .3s ease;-moz-transition:.3s ease all;-webkit-transition:all .3s ease;color:#898989;line-height:1}.ui-float-label .ui-inputwrapper-filled~label,.ui-float-label .ui-inputwrapper-focus~label,.ui-float-label input.ui-state-filled~label,.ui-float-label input:focus~label{top:-.75em;font-size:12px}.ui-float-label .input:-webkit-autofill~label{top:-20px;font-size:12px}.ui-inputtextarea-resizable{overflow:hidden;resize:none}.ui-fluid .ui-inputtextarea{width:100%}.ui-float-label textarea.ui-state-filled~label,.ui-float-label textarea:-webkit-autofill~label,.ui-float-label textarea:focus~label{top:-.75em;font-size:12px}.ui-lightbox{position:fixed;display:none}.ui-lightbox-content-wrapper{position:relative}.ui-lightbox-content{position:relative;margin:0;padding:0;background-color:#000}.ui-lightbox-nav-left,.ui-lightbox-nav-right{position:absolute;top:50%;cursor:pointer}.ui-lightbox-nav-left{left:0}.ui-lightbox-nav-right{right:0}.ui-lightbox-loading .ui-lightbox-content{background:url(data:image/gif;base64,R0lGODlhIAAgAPYAAAAAAOLi4gMDAyMjIyAgIAEBATw8PHBwcGdnZzc3NwcHBxMTE2hoaHFxcVNTUxUVFX5+fpmZmW5ubhcXFwoKCnNzc1FRUUdHR7Gxsa6urqmpqYODgx4eHggICHV1dU5OTgUFBTAwMKysrIGBgREREVVVVXd3dzg4OCcnJ7Ozs7CwsEhISDExMSwsLA4ODiUlJbe3t0FBQTo6OkxMTAwMDICAgGBgYCEhIRgYGGpqatHR0dPT08HBwdXV1bm5uVhYWBoaGhwcHBAQEEVFRVdXV1xcXIqKimNjY15eXqOjo56enpqamqWlpaCgoGFhYSoqKqGhoaenpygoKDU1NZycnFpaWsrKyr6+vrW1tc7OztDQ0D4+PpGRkZeXl1BQUHx8fJOTk46OjomJiZCQkJWVlcPDw8XFxcfHx7y8vC4uLjMzM4WFhUBAQIeHh7q6ukpKSszMzIyMjMnJyXp6enl5eUNDQ8DAwGxsbKqqqmVlZdfX1wAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAFAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKECzk2NJOCDxchgwU1OjsSmQoQGCIWghQiOz01npALERkYGQ4AFBqtP4ILN0ACjgISGhkpGDIANjw+KABCKNEujxMbGiowowAEHIIT0SgUkBwjGiIzhkIvKDiSJCsxwYYdmI8KFB0FjfqLAgYMEiSUEJeoAJABBAgiGnCgQQUPJlgoIgGuWyICCBhoRNBCEbRoFhEVSODAwocTIBQVwEEgiMJEChSkzNTPRQdEFF46KsABxYtphUisAxLpW7QJgkDMxAFO5yIC0V5gEjrg5kcUQB098ElCEFQURAH4CiLvEQUFg25ECwKLpiCmKBC6ui0kYILcuXjz6t3Ld1IgACH5BAAFAAEALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Ohw8Tj44XKlhbk4sKEVZZXAWZgwsxLYMdTJ1RCqEAIA1JSjOCFKhaUSCCoI8kRkpMULIKVFZaXaALN0C6jAVHS01RTFMAVVc8XgBCKNsujwsmS1AaCIJSpQAT2ygUk0AeS0oXhkIvKDihQjEyy4QdNJMgOqxqxC9RCyJFkKwYiKgAkAEE2CWi4CChDSdSFJFQx0ERiCEWQlq4oUjbto6KgCQwIOOJAEUFcBAIInGRgIKsGrrogIhCzUcFgqB40a0QiXpAMj1QJ6kVLgA41P1kxGHbi39HB/A0iaKoo6MvSAgisC0pAGRBXk4SOOjGtiCDFXCGSodCSM6GC7ze3cu3r9+/gAcFAgAh+QQABQACACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjoYkTj8Uj40SPGUMlYsdSzxmSiCbg0IyKIM0TTxnTAqjACAIYGNDgh1Uq1CiAB2VLl9hZGAXsGSrXAUKEjNABY4FRGJjXV0sAD8+aB8ANmItKC6PJAxiXBFIAAIhIYJVUygolI8TCNIxhkAvKDijLidTzgx1oLEJxC5GAReRkLFixZSDhwoAGUBAXiIWQy6smMFBEQl4KDoqenKi5Al+iYSAFJmIwgAUL5opKoCDQBCLM189c9HrEAWcz4LADFeIhD4gmxaAnCDIoCAcIIEuEgqToNEBvVTCI+rIxYAXJAQRgIcUwIIbQQQUPHiD7KCEOhMBTIAnJG7EBVzt6t3Lt6/fvYEAACH5BAAFAAMALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2OhiRVDhSPjQhYPkeViwpjWG5dIJuDBTdBgxRkWGhKCqOCK18QW4IdXKsRogAPHY8FNl8bG2wAIEarRgUKDW4ROI8XHl9rbS0ADhkYbwBIWj1wU48uPx4QYg4ABS1pgm09ZUc0lQtE5SeGR1hEz5sUIWkFDAkAIq9SAQGOAjIC8YLFFBQIExUAMoAAJUU41oVQs0ARCRQgOSyaABKkC0VCSopUJADHjRsTFhXAQSDIRZmvErrodYjCTV9BULw4WYjECxRANn0EGbNYRBwlfzIiKVSe0Ru9UpqsRGHAABKCCIBMCmCBqYiPBKC9MZZUTkJUEIW8PVRgAdG5ePPq3ctXbyAAIfkEAAUABAAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6GQhZDHY+NSFEiRZWLCmtRGXEgm4QgCoMdYhoZYKajAA9ETmqCnRoqY6IACy6VCQgHDQkAIBAaGCMAChIpShyPTzYMDR4oADNQUUMAVXJZOj+PHRdOOR4rAAVST4Ij3joXlS7jOSyGNnA7YRSbHSgvhyAMvBHiqlEBgxNu3MCxqACQAQT2KXKBoiIKGopIWHQ20eJFRUI2NsShcMJIAkEkNixo0AWlQxRUPioQxB+vQiReoACySWNFk8MECMJhUSajCRVfYMx5g1LIijcdKSAwgIQgAhV56roBRGilAgcF3cg6KCxLAEhREDxbqACJqGwI48qdS7fuqEAAIfkEAAUABQAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6GLitsCo+NJRFUM5WLICYRTSMCm4kdc59iIIIgLw+VT2woggp0EVBrogtfblFSjhNeP0hpAAINEUl0AApfZWdyTr4rFkVOBAB1YBFsAD92zlZ1jiBTbw42WwAFL7ECRmZycEYUjxRqbyW9hUfwRiSbIEGCHKLwxoKQUY1AUCjQiAQBAhMWFWjRgkCHRRRQaERBQxGJjRwwbuSoSAhIRg9u3IioqAAOAkAuMmKIsFEBFzINUZi3qUAQFC9cGCKxDsimjxpZghAFAMdGno4eaHzRkeiNiyY1Cn0EgsAAfwAIaDQKYMENIEwr0QRwY+ygtTUUAUzQeDCuoQIkttrdy7ev3799AwEAIfkEAAUABgAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6GBQMDj45sI20ylIsgDG1jBwWaiQp3nl8ggiAyQxSPJCgPqZ1cdAIAJB4pbkeOCmoxF5MCR21cEgAKFTBodmO2jB0hqzM4ADIjRpkOKcw8P48cLAYrIQAFN5MFI252ZRutjiAELFschkVXZWskmgUkC4coXPjgQlQjEDj4MSJBgMCERRPA2MlgYJGCFygy0lCE5MwVH21QjcKoUREBNglY3GC04MaNh4oK4CAARIHBm4gKuOiAiAI8SgWCoHhRsBAJjEA0vcoIE8QzHBlR/Gz0IOOLjUdv8BQStWg8AjcUEsiYFEBLIM+ADrpBdlAonIIRJmQUAhcSCa918+rdy7evqEAAIfkEAAUABwAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6HIAKPjkFFP0CTjB8VXx+ZigI/FRAMkgACCWwdjwVCNIICRKMHkkJ3URlIj0FPITgABQ4VNUcFIDl4KiliposCLygtUyQAIXd0LQAzuClYDo9AKFIhN4ITmAV0GSkwX6uOIBziC4ZEKT4QQpmtr4YddStcfGoEYoI+RkIIEJiwaEIYNxpkLAIBDQWKfojy6NiYRIEiihYvKjrSo2QTEIsW3LjBUNEDD1SohBgIqlmjAi7eGaJA4VOBICheCCxEAhqmSSRCtowkCEfIno8eWHzxquiNVUJCDoVH4AY1AAQsHlUJpIDPQTfEDjJLc9AEiwcP2xYqQGKr3Lt48+rdizcQACH5BAAFAAgALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CHCmkhCpGLU0gMMpeJBUOaPwWCAiwyHZAdlgACF0g5NgIALkcRTSWPEy8DQgAFdUh3uCBOVFBMELKMBTcoKC8UAC8/CC8AQ11NTBozj0DOKA+CJOIFEtp4FaiOIBzPLoZeTHge8JAFLtGGHVt1NJ2MQEzoxUgIAQITFj1og4EJm0UCBoD7l8iGHCtWlIBQFHGiIhtZQmpcZPBGQkUPxIhY8hDgoQIUlDnCt84QBX33grwzROIFCiCRSIA7CUIZDnA4Gz1w9uJfzxuohICzx47ADRKCCDgDCmDBDRyjIoUF0OznoLEuJzgj6LJQARJUCtvKnUu3rt25gQAAIfkEAAUACQAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkIgkC5GMHEMzN5WKLBcOQ4MCL2oKkCAgggWdJR8FADREbWMfjyQvA0KCaRdEFwACJUZcXQ2ujRwoKC8UAEB1FhwABrJdS76OOMkoD4I0JIJOY11UOaWOIMgvNIYXZOTrkAUuzIYKJ1vwm4oCD0FCxomEECAwYRGQGhpUJPmSz5CAAdoaGrpjpyKPKzISFYCYTGIhBGZCmrFjQJELAjcKKnqwIQoTJk4E6DNUoIPNR/I6IGIxRGe8IMpcGCKR4EsbobW0qQQhE0A2KQ5QQHqQTB0AWzd0CtGW6xEIlN8AEEgGRNCCGzgA4hx0g+wgtfoTJiTrOrNQARJI6+rdy7evX76BAAAh+QQABQAKACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QiCACkYxCTywklYoEaTIsgwUcQJEgBYM3aQYygh1vHiYtj0IvN0KCnVtTAAUrJhBrDo8cKCgvFABCLQYTAGoVwGJbjzjFKA+CCjSCDl9rRkgKjyDEL9uFWxtxNuePBS7IhiAsJ/GbigILQED2iEIEBJop4jCHShImYlAkEjDAWrtDOVKkwEIRwilEBBwquuOmY0cIilwQuCEwEQ4ISpRQmUPgnqECHWJeZPSuwyEQQ4bYhFQgiDEXhhxo0TIG6CMS1gROEpQGih4dMSA9KGYOAIlaNoUYwKOHCCQQIzUByIiCFIAFMiqUdIeqmFleLhQHTSh2K26hAiSM2t3Lt6/fv5sCAQAh+QQABQALACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QiAWRjRQ3BAqUihwoKByEIJOQBaIABJ0vggoJRBeZjjQ3N0KCp1IDAAUyRzkHKI9BqBQAQgMoLgBSNgwNDZ+OOJ0oC4Igr3XMJl6ljCCcL8OFagd0Dh2RBS7hhSBPIeeaiwIkODjriC4EBBOLQAdjZLpAwJXoVCcaio4wicJQgwdFBlEgTJQng0WLDxNRIHCDn6IJHsiAAVPhWTxCBTp0eNUoHbxCAmLEeOmoQLAXyAoxsCLHSE5HJKR5BCFAUJgdWqywgfQAFUISL26cQ6IDqQNIIDiSqNUJCAAFDdyI8Thq0I2ugx4UPQlgQidabA4LFSDxM67du3jz6qUUCAAh+QQABQAMACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKECkBAApOJQCgoD5mDBQWDBJwcggUDUwSQHTc3QoKkKEGCTzMODjSPOJwvHQBCAwMUAEErDkVVLo8TnCgLggIggiwWRUd1kCAcKC/EhVJVeRcKkQUu34UCNwPln4kFQg8Pv4oUBAQTixN5NW1iDVYlkoVCV6IfZLp0iRAhhyKCBhEVaUKR4h17BG7oU/TgjpiPOWi9o6TAXaNz9dRt2ZLSUYEg3ZYVysPjyoaIjUg42wgCEwAjVs7YMQDpQS9dJF7c+FXESlAv2jKSiMUJCAAFErBwMWVu0I2qgxZMe9cMBayRhAqQkIm2rdu3cATjNgoEACH5BAAFAA0ALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQKQDgCk4k4KCgPmYMFBYMEnByDJBwUkB03N0KCpChBgkAsBiGQE5wvHQBCAwOqJCEydWyYjg+cKAuCAiCCHMUzuI8CHCgvqoU4dR8J0JAFLtuGOEHhn4gFNCQkyIkUBAQTiwtEBx4mSECKsSg0FH3YsKaNQST+lgVM5GDMmDAObSiSd6OeIhJHvnyZYwOHukIKFKRjNK6XIQpvLph8VCBINheGjrjBMufVIxLLLIIIKIALDzQ+6Ch4pCxbQBIvvrABgIQHjytYTjwCQeAGCVgoPJApoOBLmadeIokSdAMFka0AaHjAomTAJ10XFIiA4nD1UwESC0Z+3Mu3r9+/kAIBACH5BAAFAA4ALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQCEwsFk4k4KCgLmYOYgwScHIMULpEdBDdCgqMoQYITLyg4kBOcLx0AQgMDFLycLS+QC5ydggIgsigtakCQBRwoL8CFQi1TKKGPBS7WhkKXn4unHdyIFAQEE4tCK0VONh+tia8oNIoxBw0VFR5bFN3Ll+jCl4MHYyhSd6OdIiFEJNy54wAVOUIgMnZzscuQixVsOnYLQs0iIRsZNDQw2YjEMYdPSinggkUFngMiGT3IlQ+ICjQBq/jAggGPl0cgVpEQ9ELFjjEFQHgYimGEgGiDWvjYQQaTEAg+Uvz49OKKjiKm2IT8ROFIlZwXCOPKnUu3LqRAACH5BAAFAA8ALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQFJCSTijgoKAuYiASbHIMdHZEKHARCgqAoQYITLy+Xjw+bL6VCAwMUAEKbrZALv50AAiCvv6qPBRwoL7yFvig4kgUu0IYUNJ6MChTHixQEBBOLHVMrHytSi6wo24ksVUVISD/wn7/4h1MM/gw2XCgSd6PcwDdIbBBhx62QAAUClrkoZYhGDBkKIhUI4kxgoR9NIiDYx4jEr3ICWrgCIUYDFCp5KDaq5WxbDjlYDABwIEJDEiorHoEgcOMSBRU64BgpAEJCzyQmCkCSCoAEjKRhpLrwICKKBU9tkv4YRMEARk8TjvyQ2bCt27dwBONGCgQAIfkEAAUAEAAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAUkJJOKEygoC5iIBJscgyAgkQocBEKCoChBgg8vAzSQD5svHQBCAzcUuZsoOJALv50AAgKCmpuqjwUcKC+9hUKbwZEFLtKGFLOeiwIgBYwUBAQT3y9qCSzMiawo3Yg3dUMXFyeL7/GHUhb+FgYWUeBw45yiDgZmvIlxyVshAeKaucBliIYMNaUgFQgCzYUhL2PaVNHWiMSvcwKeAAEA4ksELnGqKHhUC9osBDxE4PtAJQKYODEegSBw4xIFPFbKbCgAIo8SnzkiOoooBEPSNuJo3KHS5Y2nEVZ4lBjUIc2UmZgm2HCA1qHbt3AF48qVFAgAIfkEAAUAEQAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAUkQpOKDygoC5iIBJscgyAFkQocBJcAoChBgg8vNx2Qmigvs0IDNxQAQpsoD5ALv50AAgKCE7+qjgUctryFQi8oOJIFLtGGHTSejAWljBQEBBOLBUADA0DIiqwo3YkPTy1padbuv/GIQTL+Mq4UUeBww5wiEC1OnJACwpshcJCwzdrG4knDiEFQSAlh6AIEDx8mOnKx6cgcYyFQGDvQpgadDxcbaXqDxQsAJz7wGAAwJE6bEXMSPALxQgwDARSS2IFhwliVMD9/QBJQDAcWOz7aIKPgxEibGJgWqMCqVZCCjTEjUVBix80dh4UQLuChkgZuoQck7Ordy5dQIAAh+QQABQASACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKEBSQuk4oPKCgkmIgEmxyDAgWRChwEQoKgKEGCDwMEIJCaKC8dAEIDNxS5mygLkAu/wQCkghO/qo8FHLa9hUIvKDiSBS7Qhh00noyljRQEBBOLBUC71YusKNyJw7/Zn7/tiO+b8YcUHDfkigVBLwak60bwWhABhkCguIEQUrMiWH4YksHAxhYFkIQgMLMDgrE0L4w5qXDnCJuGjWZY6QFnBoAiGZQkAGBgDsk8LR6lyeAmj4AOS1LguWPMyxwPEthAIvFAEAkmKUR8KdXBgok7UjA9jVrjm4AbrjC5aJIigwmChTxEfYOW0IISbwgwtp1Lt66gQAAh+QQABQATACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKEBUIuk4oPKCgkmIgEmxyDBZIKHARCgqAoQYIPAxwCkJooLx0AQgM3FLibKKmPC74LggKkABO+vI8FHLXLhEIvKDiSBS7QhR00nozHjBQEBBOLBUC6xIurKNyJwpu26r7tiEK+8YoUHDfkigU4BDgA60YQSAkZsgoJCILjm6MJSXrIKWEohIMVaRI6qrJDB5w5AAQ8uSFoho0SH1pAMqEjS5kVAIg0GcMCgBoENoh8ePCohYYUTgR0GBNliRMABergJAIEkpB0QpZEoXKAFIgtPwyAwBQ1ipIK3255okHG6x2Che54rYOWEIkPdQi2tp1Lt66gQAAh+QQABQAUACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKEBUIuk4oPKCgkmIgEmxyDBZIKHARCgqAoQYILN0ECkJooLx0AQgM3FLibKKmPC74LggKkABO+vI8FHLXLhEIvKDiSBS7QhR00nozHjBQEBBOLBUC6nYurKNyJwpsDsorr7YhCvvGLFBw35IoFOAhwqNetGw4HJ+QVInEp0gQlWXhYMHRDBosg3xodgSOnTAUABV60AnBixZYpIx15kGPGzRAAXrjUeAJAioUVbNSAePQECp4iAhSs6WKkBMgpXlac2PlICDEALsJ0iXOElIAXCaphchGnS5g8GbvREOPVRsFCR7waOBvtggGmbAbjyp0LIBAAIfkEAAUAFQAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAVCLpOKDygoJJiIBJscgwWSChwEQoKgKEGCCzdApI+aKC8dAEIDNxS4myi8jwu+C4ICshO+wI4FHLXKg0IvKDiSBS7PhB00noyyjBQEBBOLBUC6qYurKNuJJL433ogDagkxnYlC7/GHLWFNJrcSFcBBIAi7RR2E7ONGCAeRISAOubgUKUgXM24cGKIV6xGJMGWu+JAAoAABagBQhJCC4sEjByHdqFgB4EINCQMABDmxksAjCXbcpMgjQIGJNSZopuQpypGUCFGK3KJRYw0djSWBAFEAycU4QTQgrJlDhCEhCnPWfLFglpADtWoN2g6iIIOFALl48+YNBAAh+QQABQAWACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKEBUIuk4oPKCgkmIgEmxyDBZIKHARCgqAoQYILN0Ckj5ooLx0AQgM3FLibKLyPC74LggKyE77AjgUctcqDQi8oOJIFLs+EHTSejLKMuTcTiwVAupeKQmBKNRI3iiS+BIskKT09Ox/o8YwXTCk12AoVwEEgSMBDHVx442ZogoUYIA65OAcJyBgfKvIVgoci1iMhbXykEJEHADliAIAMe+QExkgodQBskVClFUcUohqB4JIiQxQHBUAwaODkhKAJ0h48YpBBg5OIFCQ0yBNTEAWKjSjIOKHA6p0GCIYwJAQiD9gtYwkZOOAkZ1qTHAeovZ1Ll24gACH5BAAFABcALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQFQi6Tig8oKCSYiASbHJ4ACkEEQoKgKEGCJARABZCaKC8dAEIDNxS3myi7jwu9C4ICsQATvb+OBRy0yoNCLyg4kgUuz4QdNJFCqI3GjCsYMGudiQVAuduKQhg772+KJL0EiyQZWVlwM+y9ootDmoiYg61QARwEghQ8pMAFuFGGHswwAOIQhYWLcLQRAeWCIRLSYD0SAgEPEypVWl0CAETYoyomlXAxAEDNjyHDhPQC4ghEGyZNuswoIIBIkRlSBD148cJbIydNIhCpSMNGkQ8sBnVQAKnDFDVcAXQoUsSLGoiEBHwoYgEFWkI4DS4kWPdW0MO6ePPWDQQAIfkEAAUAGAAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAVCLpOKDygoJJiIBJscngAKQQRCgqAoQYIkBEAFkJooLx0AQgM3FLebKLuPC70LggKxABO9v44FHLTKg0IvKDiSBS7PhB00kS6ojcaMQyIYI52JBUADBNiGQnhWcHAXiiS9oopCUWZmZW/49oxidEnigR0lHASCGDSkgAa4UYYWXEgg4BCFhYomzFHChY0hEtKAQHJRgQqZOF4E0VAgCEgvb40cLCETZoQaAFJipNklpNcERyDm0FwTo4CAIUPUUAPw4MUAjIaIhGnzpmKHGUOm3CMFAlKHEC2MgbgwJMFWiIJYDDkxDO0gBTcKfrqdS7euXUOBAAAh+QQABQAZACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjo+QkZKEBUIuk4oPKCgkmIgEmxyeAApBBEKCoChBgiQEQAWQMi0oLx0AQgM3FLibKLyPORC0C4ICsQATvsCOQFBfT8yDQi8oOJI4DsWHHTSPBS4kQgKNyIokXxoZIhuoiQVAAwS3iV52djw8ZQ7nvqKJM9wIFOhFkRBfrBKRoNMEypIGl97heKVgUSUSEUchIsEmBDlDFKQ5WnAgTo0EhkhUAwKJBoI4G+jUEaQAhCAgvtw1emNkwxwJTwAEeTLg1sFN2xgJkLDhS4UTAAqwoMUSwAN5FR3NcMqGnAA1tP4BOAZJgZQXyAqkoaqxEJAnLw1EtqWQta3du3jzKgoEACH5BAAFABoALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQFQi6Tig8oKCSYgx0FgwSbHJ4AaU0/QoKjKEGCJARAoY9zPSkGHQBCAzcUu5sov48SOz1GD4ICtBPBw444STtlT4ZCLyg4kjg/bLSFHTSPBTSWAo3fiSwbTUxJX52JBUADBLqIIEZY+zAwSIokgr3CtyGDQYMOFAkJBkRRiw1kyIxhEA9RARyyQCwCIUSIOFOJXCR4km4QhWePSDiZc6eFIRLYGj6iUIXOgTwJBIHQCABHsI+N2Jg4gODHDQAwB+hauGnBIyIHGCBxCaCVzAX1eDZSk6eImlAFbmwaCKBASUYTkonapA0kIV4EDRS4LWR2rt27ePMeCgQAIfkEAAUAGwAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAVCLpOKDygoJJiDFEKDBJscngAtTSlFgqMoQYIkBEAFkB5ZOlYGAEIDNxS7myi/jwxwWjsSggK0ABPBw444VHBnF4ZCLyg4khMlW8yFHTSPBTRCNOCK6Yhpc2RLER6hiQVAAwQdiSA1UVEaGniIKCIR7BUiAXSaKFQ4Q5GQYEAUSTHRps0IG/MQFcAhC8QiEC5cQDN1iEaaG+sEURjpyIWFPD9uGCKRLeIjEG+OVPmAQhAIjwBwBBvnCIWTKl5iPABAc0C+h5s6Fa1i4cIAVptsLrgHtJGCE2xkAihwY5PBsSkZCSDEYdMCkoUOKHDg0BWu3bt48+pdFAgAIfkEAAUAHAAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShAVCLpOKDygoJJiDNEKDBJscngAtUBlVgqMoQYIkBEAFkAdmVmUyAEIDNxS7myi/j0c8Z1Y5ggK0ABPBw44TZDx2dYZCLyg4khNeMsyFHTSPBRQuNOCK6YhSB2JhcTnjiQVAAwQKiQIVXV0RS0suKCIRDIi+O2MSJhyiSEhBRQMYmDDRwME8RAVwyAKxSAAFGh1MKerwwuAhCtAeUYjhhc0DQySymXx04kOdKdsAgOAIAMezRyRW1DnxZFzMASEdbrrkyAUbGWleAmhlcsGNIAIg2esEoMCNTa8ErZsUZNMCkYUUBJkwFq3bt3AF48pFFAgAIfkEAAUAHQAsAAAAACAAIAAAB/+AAIKDhIWGh4iJiouMjY6PkJGShA8XLpOECxOEX01SJJgAU0l4JYIUKkpSHKEVblduRAAUGWQoQYIkBEAFj04wbnZoBgBObTcUAEIozMmOD2EwaDwVghO9ABPMKM6ON9E+FoZCLyg4kg8fFwKHHTSQ7hTYi/OJL0dzEBBO74kFQAMIKEgkIM+aNm3EGGGjiMQ2IP6QfJk4kViiZcwgJuJQBQECJxe6HSqAYxeIRQI6UBgYSpECHEIQURDpCESIBE8uFSJRTuOjF1OeoNgEAMRJADi20XQZQuiLdzwHdFC2TWejAgNQvAAFgEBGQQtu4KjHSMECqzeY4RJEdhIQZgsPWhoSMOGa3Lt48+rdiykQACH5BAAFAB4ALAAAAAAgACAAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkoQLRTMKk4JCFyGEdDs6R5kCBxgiFoIUeDs9Jpk0XBkpKg4AFBqsRIIkBEAFjwwaGVgYMgA2PFgoAEIozhSPExsaKjASggQPghPOKNCPHCMaIjOGQi8oOJIkKzEChx00kAoUHb+M94pCFjkSEiXfEBUAMoAApkRDGlTw4MFEAkUkugFRFIOBRYss9ElU5IKNAwcfTnRQVABHLxCMFChAmWmRABcjD1EI+KgABxQvXBgigW4iJG7OJggCwRJHN5qMCDh7IY/ngJHNnkECgpMENmc+F9xQB6mAi4MAbjgLMihfS6MorLY0JOCB2rVwB+PKnUtXbiAAOwAAAAAAAAAAAA==) #000 50% no-repeat}.ui-lightbox-caption{padding:.2em .4em;display:none}.ui-lightbox-caption-text{margin:.3em 0 .1em 0;float:left}.ui-lightbox-close{float:right;margin:0;padding:.125em}.ui-lightbox-close.ui-state-hover{padding:0}.ui-lightbox-nav-left,.ui-lightbox-nav-right{opacity:.5}.ui-lightbox-nav-left:hover,.ui-lightbox-nav-right:hover{opacity:1}.ui-listbox{padding:.25em;width:10em}.ui-listbox .ui-listbox-list-wrapper{overflow:auto}.ui-listbox .ui-listbox-list{list-style-type:none;margin:0;padding:0}.ui-listbox .ui-listbox-item{padding:.25em;border:0 none;cursor:pointer;font-weight:400;margin-bottom:1px}.ui-listbox .ui-listbox-item>span{vertical-align:middle}.ui-listbox .ui-listbox-item:last-child{margin-bottom:0}.ui-listbox.ui-state-disabled .ui-listbox-item{cursor:default}.ui-listbox-header{margin-bottom:.3em;padding:.125em .2em;position:relative}.ui-listbox-header .ui-chkbox{display:inline-block;vertical-align:middle;cursor:pointer}.ui-listbox-header .ui-listbox-filter-container{display:inline-block;vertical-align:middle;position:relative;width:100%}.ui-listbox-header.ui-listbox-header-w-checkbox .ui-listbox-filter-container{width:calc(100% - 2em)}.ui-listbox-header .ui-listbox-filter-container .fa{position:absolute;top:.25em;left:.25em}.ui-listbox-header .ui-inputtext{padding:.125em .125em .125em 1.25em;width:100%}.ui-listbox-footer{padding:.125em .2em}.ui-menu{width:12.5em;padding:.25em;position:relative}.ui-menu-separator{border-width:1px 0 0 0}.ui-menu.ui-menu-dynamic{position:absolute;display:none;z-index:100000}.ui-menu-list{position:static}.ui-menu .ui-menu-list .ui-menuitem{border:0}.ui-menu .ui-menu-list .ui-widget-header{clear:both;float:left;width:100%;margin:.125em 0;padding:.25em .5em}.ui-menu .ui-menuitem,.ui-menu .ui-menuitem-parent{width:100%;clear:both;margin:.125em 0;padding:0}.ui-menu .ui-menuitem-link{display:block;width:100%;text-decoration:none;font-weight:400;border:1px solid transparent;line-height:1em;padding:.25em;cursor:pointer}.ui-menu .ui-menuitem-link .ui-menuitem-icon{display:inline-block;vertical-align:middle}.ui-menu .ui-menuitem-text{vertical-align:middle}.ui-menu .ui-widget-header h1,.ui-menu .ui-widget-header h2,.ui-menu .ui-widget-header h3,.ui-menu .ui-widget-header h4,.ui-menu .ui-widget-header h5,.ui-menu .ui-widget-header h6{font-size:1em;margin:0 auto}.ui-menu .ui-menu-parent .ui-menu-child{display:none;width:12.5em;padding:.25em;position:absolute;margin:0;text-decoration:none;list-style:none}.ui-menu .ui-menu-parent{position:relative}.ui-menu .ui-menu-parent .ui-submenu-icon{float:right;margin-right:-.25em}.ui-menubutton{padding:0}.ui-menubutton .ui-button{margin:0}.ui-menu.ui-menubar .ui-menubar-root-list>li>a>.ui-submenu-icon{float:none}.ui-menubar{width:auto}.ui-menubar .ui-menubar-root-list{list-style:none;padding:0;margin:0}.ui-menubar .ui-menubar-root-list>.ui-menuitem{display:inline-block;width:auto}.ui-menubar:not(.ui-megamenu-vertical) .ui-menubar-root-list>.ui-menu-separator{display:inline-block;border-width:0 0 0 1px;width:1px;text-indent:-9999999px}.ui-menubar:not(.ui-megamenu-vertical) .ui-menubar-root-list>.ui-menu-separator:before{content:"ui-menu-separator"}.ui-menubar .ui-menu-child .ui-menuitem{width:100%}.ui-menubar .ui-menuitem.ui-menuitem-custom{float:right;margin-top:.25em}.ui-menubar .ui-menubar-options{float:right}.ui-slidemenu .ui-slidemenu-wrapper{position:relative}.ui-slidemenu .ui-slidemenu-content{overflow-x:hidden;overflow-y:auto;position:relative}.ui-slidemenu .ui-menu-list{position:absolute;top:0}.ui-slidemenu .ui-menu-parent{position:static}.ui-slidemenu .ui-menu-child{box-shadow:none;border:0 none;background:none repeat scroll 0 0 transparent}.ui-slidemenu-backward{position:absolute;bottom:0;width:100%;padding:.2em;cursor:pointer;display:none}.ui-slidemenu-backward .fa,.ui-slidemenu-backward span{vertical-align:middle}.ui-slidemenu .ui-slidemenuitem-active>.ui-submenu>ul{display:block!important}.ui-megamenu .ui-g{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ui-megamenu .ui-megamenu-panel.ui-menu-child{width:auto}.ui-megamenu-vertical,.ui-megamenu .ui-megamenu-panel .ui-menu-list{width:12.5em}.ui-megamenu-vertical .ui-menu-list .ui-menuitem,.ui-megamenu-vertical .ui-menuitem-link{width:100%;box-sizing:border-box}.ui-megamenu-vertical>.ui-menubar-root-list>.ui-menuitem>.ui-menuitem-link>.ui-submenu-icon{float:right}.ui-panelmenu{width:auto}.ui-panelmenu .ui-panelmenu-panel{padding:0;margin:0}.ui-panelmenu .ui-panelmenu-header{cursor:pointer;position:relative;margin:-1px 0 0 0;zoom:1}.ui-panelmenu .ui-panelmenu-header a{display:block;padding:.25em .5em;text-decoration:none}.ui-panelmenu .fa{width:1em;text-align:center;vertical-align:middle;margin-right:.25em}.ui-panelmenu .ui-menuitem-text{margin-left:.125em}.ui-panelmenu span{vertical-align:middle}.ui-panelmenu .ui-panelmenu-content{padding:.2em 0;border-top:0;overflow:auto;zoom:1;outline:0;margin-bottom:1px}.ui-panelmenu .ui-panelmenu-content .ui-menu-parent{overflow:hidden}.ui-panelmenu .ui-panelmenu-content-wrapper{box-sizing:border-box}.ui-panelmenu .ui-panelmenu-content-wrapper-overflown{overflow:hidden}.ui-panelmenu .ui-panelmenu-header.ui-state-disabled,.ui-panelmenu .ui-panelmenu-header.ui-state-disabled a{cursor:default}.ui-panelmenu .ui-menu-list{position:static}.ui-panelmenu .ui-menuitem{margin:1px 0;padding:0}.ui-panelmenu .ui-menu-separator{width:95%;margin:0 auto}.ui-panelmenu .ui-menuitem-link{display:block;text-decoration:none;font-weight:400;border:1px solid transparent;line-height:1em;cursor:pointer;position:relative;padding:.25em .5em}.ui-panelmenu .ui-menu-parent .ui-menu-list{margin-left:1.5em}.ui-menuitem-active>.ui-megamenu-panel,.ui-menuitem-active>.ui-submenu>ul{display:block!important}.ui-menuitem-outline{outline:1px dotted;z-index:1}.ui-fluid .ui-menu:not(.ui-menu-dynamic){width:100%}.ui-message{border:1px solid;margin:0 .25em;padding:.25em .5em;display:inline-block}.ui-fluid .ui-message{display:block}.ui-messages{border:1px solid;margin:.5em 0;padding:1em 1em 1em .5em;display:none;position:relative}.ui-messages-icon{display:inline-block;padding:0;vertical-align:middle}.ui-messages-summary{font-weight:700;margin-left:.25em}.ui-messages-detail{margin-left:.25em}.ui-messages-success{color:#2c832f;background-color:#b4f0b6;border-color:#b4f0b6}.ui-messages-success .ui-messages-close{color:#2c832f}.ui-messages-info{color:#1765a3;background-color:#bfe0fa;border-color:#bfe0fa}.ui-messages-info .ui-messages-close{color:#1765a3}.ui-messages-warn{color:#8a6714;background-color:#ffe9b5;border-color:#ffe9b5}.ui-messages-warn .ui-messages-close{color:#8a6714}.ui-messages-error{color:#ab1a0f;background-color:#ffcbc8;border-color:#ffcbc8}.ui-messages-error .ui-messages-close{color:#ab1a0f}.ui-messages ul{margin:0;padding:0;list-style-type:none;display:inline-block;vertical-align:middle}.ui-messages.ui-messages-noicon ul{margin:0 1.5em 0 0}.ui-messages .ui-messages-close{cursor:pointer;position:absolute;top:5px;right:5px}.ui-multiselect{display:inline-block;position:relative;width:auto;cursor:pointer}.ui-multiselect .ui-multiselect-trigger{border-right:0;border-top:0;border-bottom:0;cursor:pointer;width:1.5em;height:100%;position:absolute;right:0;top:0;padding:0 .25em}.ui-multiselect .ui-multiselect-trigger .fa{margin-top:.4em;margin-left:-.125em}.ui-multiselect .ui-multiselect-label-container{overflow:hidden}.ui-multiselect .ui-multiselect-label{display:block;padding:.25em 2em .25em .25em;width:auto;border:0;cursor:pointer;text-overflow:ellipsis;overflow:hidden}.ui-multiselect.ui-state-disabled .ui-multiselect-label,.ui-multiselect.ui-state-disabled .ui-multiselect-trigger{cursor:auto}.ui-multiselect-panel{padding:.2em;position:absolute;min-width:12em}.ui-multiselect .ui-multiselect-panel{min-width:100%;display:none}.ui-multiselect-panel .ui-multiselect-items-wrapper{overflow:auto;position:relative;padding:.2em 0}.ui-multiselect-panel .ui-multiselect-list{border:0 none}.ui-multiselect-panel .ui-multiselect-item{border:0 none;cursor:pointer;font-weight:400;margin:1px 0;padding:.125em .25em;text-align:left;white-space:nowrap;display:block;position:relative}.ui-multiselect-panel .ui-multiselect-item .ui-chkbox,.ui-multiselect-panel .ui-multiselect-item label{display:inline-block;vertical-align:middle}.ui-multiselect-header{margin-bottom:.3em;padding:.25em;position:relative;text-align:left}.ui-multiselect-header .ui-chkbox{display:inline-block;vertical-align:middle;cursor:pointer}.ui-multiselect-header .ui-multiselect-filter-container{position:relative;display:inline-block;vertical-align:middle;width:65%}.ui-multiselect-header.ui-multiselect-header-no-toggleall .ui-multiselect-filter-container{width:85%}.ui-multiselect-header .ui-multiselect-filter-container .fa{position:absolute;top:.25em;left:.125em}.ui-multiselect-header .ui-inputtext{padding:.125em .125em .125em 1.25em;width:100%}.ui-multiselect-header .ui-multiselect-close{position:absolute;right:.375em;top:.375em;display:block;font-size:1em;border:0 none}.ui-multiselect-header a.ui-multiselect-all,.ui-multiselect-header a.ui-multiselect-none{float:left;margin-right:10px;display:block}.ui-multiselect-header .ui-multiselect-close.ui-state-hover{padding:0}.ui-fluid .ui-multiselect{width:100%;box-sizing:border-box}.ui-orderlist{display:table}.ui-orderlist .ui-orderlist-controls{height:12.5em;padding:0 .25em;vertical-align:middle;display:table-cell}.ui-orderlist .ui-orderlist-controls .ui-button{display:block;margin-bottom:.25em}.ui-orderlist .ui-orderlist-container{display:table-cell;vertical-align:top}.ui-orderlist .ui-orderlist-list{list-style-type:none;margin:0;padding:0;overflow:auto;height:12.5em;width:12.5em}.ui-orderlist .ui-orderlist-caption{text-align:center;padding:.5em .75em;border-bottom:0 none}.ui-orderlist .ui-orderlist-list .ui-orderlist-item{margin:1px;padding:.125em;cursor:pointer;border:0 none;font-weight:inherit}.ui-orderlist .ui-orderlist-filter-container{position:relative;width:100%;padding:.5em .6em;border-bottom:0 none}.ui-orderlist .ui-orderlist-filter-container .ui-inputtext{text-indent:1.1em;width:100%}.ui-orderlist .ui-orderlist-filter-container .fa{position:absolute;top:50%;left:1em;margin-top:-.6em}.ui-orderlist.ui-state-disabled .ui-button,.ui-orderlist.ui-state-disabled .ui-orderlist-item{cursor:default}.ui-orderlist.ui-state-disabled .ui-orderlist-list{overflow:hidden}.ui-orderlist.ui-orderlist-responsive{width:100%}.ui-orderlist.ui-orderlist-responsive .ui-orderlist-controls{width:16.66666%;padding-right:.5em}.ui-orderlist.ui-orderlist-responsive .ui-orderlist-list-container{width:83.33333%}.ui-orderlist.ui-orderlist-responsive .ui-orderlist-caption,.ui-orderlist.ui-orderlist-responsive .ui-orderlist-controls>.ui-button,.ui-orderlist.ui-orderlist-responsive .ui-orderlist-list{width:100%}.ui-orderlist .ui-orderlist-droppoint{height:6px;list-style-type:none}@media(max-width:40em){.ui-orderlist.ui-orderlist-responsive .ui-orderlist-controls{text-align:center;width:100%;display:inline-block;height:auto}.ui-orderlist.ui-orderlist-responsive .ui-orderlist-controls .ui-button{display:inline;width:20%;display:inline-block}.ui-orderlist.ui-orderlist-responsive .ui-orderlist-list-container{width:100%}}.ui-organizationchart .ui-organizationchart-table{border-spacing:0;border-collapse:separate}.ui-organizationchart .ui-organizationchart-table>tr>td{text-align:center;vertical-align:top;padding:0;padding:0 .75em}.ui-organizationchart .ui-organizationchart-node-content{padding:.5em .75em;display:inline-block;position:relative}.ui-organizationchart .ui-organizationchart-node-content .ui-node-toggler{position:absolute;bottom:-9px;margin-left:-8px;z-index:2;left:50%}.ui-organizationchart .ui-organizationchart-line-down{margin:0 auto;height:20px;width:1px;float:none}.ui-organizationchart .ui-organizationchart-line-left,.ui-organizationchart .ui-organizationchart-line-right{float:none;border-radius:0}.ui-organizationchart .ui-organizationchart-node-content.ui-organizationchart-selectable-node{cursor:pointer}.ui-overlaypanel{padding:0;margin:0;position:absolute}.ui-overlaypanel-content{padding:.5em 1em}.ui-overlaypanel-close{position:absolute;top:-.5em;right:-.5em;border-radius:100%}.ui-paginator{margin:0;text-align:center;padding:.125em}.ui-paginator .ui-paginator-top{border-bottom:0 none}.ui-paginator .ui-paginator-bottom{border-top:0 none}.ui-paginator .ui-paginator-current,.ui-paginator .ui-paginator-first,.ui-paginator .ui-paginator-last,.ui-paginator .ui-paginator-next,.ui-paginator .ui-paginator-page,.ui-paginator .ui-paginator-pages,.ui-paginator .ui-paginator-prev{display:inline-block;padding:.125em .375em;zoom:1;margin-left:.063em;margin-right:.063em;text-decoration:none;vertical-align:middle}.ui-paginator .ui-paginator-first,.ui-paginator .ui-paginator-last,.ui-paginator .ui-paginator-next,.ui-paginator .ui-paginator-page,.ui-paginator .ui-paginator-prev{cursor:pointer}.ui-paginator .ui-paginator-current,.ui-paginator .ui-paginator-rpp-options{margin-left:1em;margin-right:1em;background-image:none}.ui-paginator .ui-paginator-jtp-select option,.ui-paginator .ui-paginator-rpp-options option{background-image:none;border:0 none;box-shadow:none;-moz-box-shadow:none;-webkit-box-shadow:none}.ui-paginator a.ui-state-disabled{outline:0 none}.ui-paginator .ui-dropdown{min-width:4em;margin-left:.375em}.ui-panel{padding:.2em}.ui-panel .ui-panel-titlebar{padding:.5em .75em}.ui-panel .ui-panel-titlebar-icon{float:right;cursor:pointer;margin-left:.2em;margin-top:-.1em}.ui-panel .ui-panel-content{border:0;background:0;padding:.5em .75em}.ui-panel .ui-panel-footer{border-width:1px 0 0;padding:.25em .5em;text-align:left}.ui-panel-content-wrapper-overflown{overflow:hidden}.ui-password-panel{padding:.25em .5em;width:10em;margin-top:2px}.ui-password-panel .ui-password-meter{height:10px;background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAoCAYAAAAcwQPnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABb9JREFUeNrsnMtOI0cUhk9ffJVjZxIUg2aA2bBlZsmsshgpmuUom7xGHiO7kFfgCRLlBUZZIYFQyCKLMFJAIQwOGF/Gt3ZfnPNXU3YZsBQam5StOlKP2/1101Xn/FWu/q2xdXBw8GUURd8S0VsyYeLh8aNt29tuGIbb5XL5ZbFYNCkx8eBoNptvK5XKc9eyrJeZTIa63e4Quq5LjuOIfd/3iWe0BzNWMaVSKbHPYqYgCIaM2yAYXnENrtWRIcDQl8FgIBheZ5m3easFtARNuTjY7/fFDWTicBE29fhDGDqYTqdFQ9CJmw1CY3Ac13qepyVDgMlCgKmimkXe5rEWuJ8QNv7BbIUk4YZyJOJCVclJGUYONjBs8sZy5GSzWXE+Ot/r9bRkCDApKjB1BphF3ua1FvJvWvv7+wOpcjQK0el0xm6az+cTMRwHl7MiuDpyCoWCUDsa1Gq1hjOATgzHwHAOjoGpM0DS3Dw2e6xaQLhCcOqNjaiMqKaRtzFhGVEZUU1LVCJ/e3t7f/IJz82DsolpBYvs2GZRbfN+3aTDxJSiDk3xot7GHNY1+TAxpXjHmvoVzvt35XI5N6/Oe7PZpHq9Tmtra6akmjnvOZhbpZ0dudojWl6GQYHVHtH5OZH0bJIyHAPDOTgGpiwwaWmJeDUY719eEq8G/zPzXr8Wi9K7zD7jvGvgvNPxMaxlovV1oosLIphgJycjcSRlEBVYrYZexEx1tFdWiNrteDs7I2o07sXkE1BLEZxx3jVy3qlSIdrYiGcFPJIeHcVCQORyyRhGDBgEUa3GTPlOUggODcS9Ieyrq3sz6QLLjhrnXQ/n3ZXrFDHb8FpFiGB3l0g2CGuvra37MziwYBAbRgUY7iNjc3M0cx0eEp2eJmKNN2/E7hULT/orspN3eS/3ZdLPgpAm+VlgSPZd/pIuTPpZODbJz5pG3m4574TP3EnCuS+ToiqVJotqdXWycBIwY5Lq6rzPsagQRlT6Oe8+n+DOudMrOmlCL+f9Z+zPc0eMqPR03t/xm3OTDxPGeV9Mx3ohvkG47bx3f4lJ0OJV3qXyOcOLwuwyv/I6P+JFYQ+TW6Qfw3MImM3nDKKYDRR3P73EDxbXDr7H/QtbWjGv8I1YXMN7WiznPaxwC+pckA+jBNgZfuRY5xMumPf4keNkVEidGEQF5tdYTGHMIsU1z67wNe14657x4Glox/rpeBCo/6llMZx37/frYskW5PgZfiOevUJ+RG0dxUXTjVlOzFAgvxqzUHH3ITiIzOOB0znmv3GlJetlx79BWBzn/fT7UQJcXm892YpnMJ8LVtvlQgb6MbgkYBBb5McsUDyz4uZo5moccvVO9WTZZ9RwGsNvEBbLeb8pKjs1ucg6MCmqVGmyqHKrk4usC2NRUenFAjvvRlT/u6ikCIzzbsJ8g7DIzvuixIJ8gzB03n/gNz+ZspqYtvNufm3GxEycd/FrM39Ud0aLwfQSpa+d4Y53SX3FNU7K0k6B8pmleBEZtKijuPuOlaZCdpk/CmwKoz61euf82Rxpxyx+1gFzbHhFkWCh4u7PIm/zVotPM6/GnfcGDDuOQnaF/LAtto/dM/IU1zgpy7glSuVy1PYq1PPr3KCRu+/YGSrl17lzFxSEPW7HyaixGjGICqzn1ygahIKFirs/i7zNYy3yzg3nvc7CAkSycFO87yrOcFKWS38mNrBOvyoaNHQ3nBx9Xtjg8y85CR2qto54Jgi1Y5blCIYCdf2qYIHi7s8ib/Nai0KqN+6819rvRYPQjErjkD4qfssXxc1E7JPsMyqXXohR0ez+Rf80fxtNx26Rnj7ZIo9Hjec36O/aLs8EgXbMtlzBAk5aGPmC9RXPLGluHps9Vi2+evr1uEFavDbx7mpsEiY7IoQ7oSOOnZrYWB2YFFUmVZooqmnnbRbssWtxy3k3ojKimoaopPNufm3GxEycd/NrMyam7rz/K8AAIzeBeEI84y8AAAAASUVORK5CYII=) no-repeat 0 0;padding:0;margin:0}.ui-password-info{margin-top:.25em}.ui-password-panel-overlay{position:absolute}.ui-picklist>div{float:left}.ui-picklist .ui-picklist-buttons{height:12.5em;padding:0 .25em}.ui-picklist .ui-picklist-list{list-style-type:none;margin:0;padding:0;overflow:auto;height:12.5em;width:12.5em}.ui-picklist .ui-picklist-list li{margin:1px;padding:.125em}.ui-picklist .ui-button{display:block;margin-bottom:.25em}.ui-picklist .ui-button-text-icon-left{width:100%}.ui-picklist .ui-picklist-item{cursor:pointer;border:0 none;font-weight:inherit}.ui-picklist .ui-picklist-caption{text-align:center;padding:.5em .75em;border-bottom:0 none}.ui-picklist table{width:100%;border-collapse:collapse}.ui-picklist .ui-picklist-filter-container{position:relative;width:100%;padding:.5em .6em;border-bottom:0 none}.ui-picklist .ui-picklist-filter-container .ui-picklist-filter{text-indent:1.1em;width:100%}.ui-picklist .ui-picklist-filter-container .fa{position:absolute;top:50%;left:1em;margin-top:-.6em}.ui-picklist{display:table}.ui-picklist>div{float:none;display:table-cell;vertical-align:top}.ui-picklist .ui-picklist-buttons{vertical-align:middle}.ui-picklist.ui-picklist-vertical{display:table}.ui-picklist.ui-picklist-vertical>div{float:none;display:table-row;vertical-align:top}.ui-picklist.ui-picklist-vertical .ui-picklist-buttons{text-align:center;height:auto}.ui-picklist.ui-picklist-vertical .ui-picklist-buttons .ui-button{display:inline-block}.ui-picklist.ui-picklist-vertical .ui-button{margin-top:.25em}.ui-picklist-outline{outline:1px dotted #000;z-index:1}.ui-picklist .ui-picklist-droppoint{height:6px;list-style-type:none}.ui-picklist .ui-picklist-list .ui-picklist-droppoint-empty{height:100%;list-style-type:none}.ui-picklist-list.ui-picklist-source,.ui-picklist-list.ui-picklist-target{outline:0}.ui-picklist.ui-picklist-responsive *{box-sizing:border-box}.ui-picklist.ui-picklist-responsive{width:100%}.ui-picklist.ui-picklist-responsive .ui-picklist-listwrapper{width:35%}.ui-picklist.ui-picklist-responsive .ui-picklist-listwrapper.ui-picklist-listwrapper-nocontrols{width:45%}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons{width:10%}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons button{width:100%}.ui-picklist.ui-picklist-responsive .ui-picklist-list{width:auto}@media(max-width:40em){.ui-picklist.ui-picklist-responsive{display:block}.ui-picklist.ui-picklist-responsive>div{display:block;width:100%!important}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons{text-align:center;height:auto;padding:.4em 0}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons button{display:inline;width:20%;margin-bottom:0}.ui-picklist.ui-picklist-responsive .ui-picklist-source-controls.ui-picklist-buttons{padding-bottom:.4em}.ui-picklist.ui-picklist-responsive .ui-picklist-target-controls.ui-picklist-buttons{padding-top:.4em}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons .fa-angle-right:before{content:"\F107"}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons .fa-angle-double-right:before{content:"\F103"}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons .fa-angle-left:before{content:"\F106"}.ui-picklist.ui-picklist-responsive .ui-picklist-buttons .fa-angle-double-left:before{content:"\F102"}}.ui-progressbar{height:1.2em;text-align:left;position:relative;overflow:hidden}.ui-progressbar-determinate .ui-progressbar-value{height:100%;width:0;position:absolute;display:none;border:0 none}.ui-progressbar-determinate .ui-progressbar-value-animate{transition:width 1s ease-in-out}.ui-progressbar-determinate .ui-progressbar-label{text-align:center;height:100%;width:100%;position:absolute;display:none;font-weight:700}.ui-progressbar-indeterminate .ui-progressbar-value{border:0 none}.ui-progressbar-indeterminate .ui-progressbar-value:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;-webkit-animation:ui-progressbar-indeterminate-anim 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:ui-progressbar-indeterminate-anim 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.ui-progressbar-indeterminate .ui-progressbar-value:after{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;-webkit-animation:ui-progressbar-indeterminate-anim-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:ui-progressbar-indeterminate-anim-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes ui-progressbar-indeterminate-anim{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes ui-progressbar-indeterminate-anim{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes ui-progressbar-indeterminate-anim-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes ui-progressbar-indeterminate-anim-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.ui-progress-spinner{position:relative;margin:0 auto;width:100px;height:100px;display:inline-block}.ui-progress-spinner:before{content:"";display:block;padding-top:100%}.ui-progress-spinner-svg{-webkit-animation:ui-progress-spinner-rotate 2s linear infinite;animation:ui-progress-spinner-rotate 2s linear infinite;height:100%;-webkit-transform-origin:center center;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.ui-progress-spinner-circle{stroke-dasharray:1,200;stroke-dashoffset:0;-webkit-animation:ui-progress-spinner-dash 1.5s ease-in-out infinite,ui-progress-spinner-color 6s ease-in-out infinite;animation:ui-progress-spinner-dash 1.5s ease-in-out infinite,ui-progress-spinner-color 6s ease-in-out infinite;stroke-linecap:round}@-webkit-keyframes ui-progress-spinner-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes ui-progress-spinner-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes ui-progress-spinner-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes ui-progress-spinner-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes ui-progress-spinner-color{0%,to{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}@keyframes ui-progress-spinner-color{0%,to{stroke:#d62d20}40%{stroke:#0057e7}66%{stroke:#008744}80%,90%{stroke:#ffa700}}.ui-radiobutton{display:inline-block;cursor:pointer;vertical-align:middle;margin-right:.25em}.ui-radiobutton-box{width:1.125em;height:1.125em;line-height:1.125em;border-radius:100%;text-align:center}.ui-radiobutton-icon{display:block;font-size:.5em;line-height:inherit;margin-top:-1px}.ui-radiobutton,.ui-radiobutton-label{vertical-align:middle}.ui-fluid .fc .ui-button{width:auto}.ui-selectbutton{display:inline-block}.ui-selectbutton.ui-state-error{padding:0}.ui-selectbutton .ui-button.ui-state-focus{outline:0}.ui-sidebar{position:fixed;padding:.5em 1em;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ui-sidebar-left{top:0;left:0;width:20em;height:100%;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.ui-sidebar-right{top:0;right:0;width:20em;height:100%;-webkit-transform:translateX(100%);transform:translateX(100%)}.ui-sidebar-top{top:0;left:0;width:100%;height:10em;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.ui-sidebar-bottom{bottom:0;left:0;width:100%;height:10em;-webkit-transform:translateY(100%);transform:translateY(100%)}.ui-sidebar-full{width:100%;height:100%;left:0;transition:-webkit-transform 0s;transition:transform 0s;transition:transform 0s,-webkit-transform 0s}.ui-sidebar-left.ui-sidebar-active,.ui-sidebar-right.ui-sidebar-active{-webkit-transform:translateX(0);transform:translateX(0)}.ui-sidebar-left.ui-sidebar-sm,.ui-sidebar-right.ui-sidebar-sm{width:20em}.ui-sidebar-left.ui-sidebar-md,.ui-sidebar-right.ui-sidebar-md{width:40em}.ui-sidebar-left.ui-sidebar-lg,.ui-sidebar-right.ui-sidebar-lg{width:60em}.ui-sidebar-bottom.ui-sidebar-active,.ui-sidebar-top.ui-sidebar-active{-webkit-transform:translateY(0);transform:translateY(0)}.ui-sidebar-bottom.ui-sidebar-sm,.ui-sidebar-top.ui-sidebar-sm{height:10em}.ui-sidebar-bottom.ui-sidebar-md,.ui-sidebar-top.ui-sidebar-md{height:20em}.ui-sidebar-bottom.ui-sidebar-lg,.ui-sidebar-top.ui-sidebar-lg{height:30em}.ui-sidebar-mask{position:fixed;width:100%;height:100%}.ui-sidebar-close{float:right}@media screen and (max-width:64em){.ui-sidebar-left.ui-sidebar-lg,.ui-sidebar-left.ui-sidebar-md,.ui-sidebar-right.ui-sidebar-lg,.ui-sidebar-right.ui-sidebar-md{width:20em}}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none;z-index:1}.ui-slider .ui-slider-handle.ui-slider-handle-active{z-index:2}.ui-slider .ui-slider-range{position:absolute;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.25em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.25em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-slider-animate .ui-slider-handle{transition:left .3s}.ui-spinner{display:inline-block;overflow:visible;padding:0;position:relative;vertical-align:middle}.ui-spinner-input{vertical-align:middle;padding-right:1.5em}.ui-spinner-button{cursor:default;display:block;height:50%;margin:0;overflow:hidden;padding:0;position:absolute;right:0;text-align:center;vertical-align:middle;width:1.5em}.ui-spinner .fa{position:absolute;top:50%;left:50%;margin-top:-.5em;margin-left:-.5em;width:1em}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-fluid .ui-spinner{width:100%}.ui-fluid .ui-spinner .ui-spinner-input{padding-right:2em;width:100%}.ui-fluid .ui-spinner .ui-spinner-button{width:1.5em}.ui-fluid .ui-spinner .ui-spinner-button .fa{left:.7em}.ui-splitbutton{position:relative;display:inline-block;zoom:1}.ui-splitbutton .ui-button.ui-splitbutton-menubutton{width:2em}.ui-splitbutton.ui-state-disabled button{cursor:default}.ui-fluid .ui-splitbutton{width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.ui-fluid .ui-splitbutton .ui-button:first-child{width:calc(100% - 2em)}.ui-fluid .ui-splitbutton .ui-button.ui-splitbutton-menubutton{width:2em;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.ui-steps ul{list-style-type:none;padding:0;margin:0}.ui-steps .ui-steps-item{float:left;box-sizing:border-box;cursor:pointer}.ui-steps.ui-steps-readonly .ui-steps-item{cursor:auto}.ui-steps .ui-steps-item .ui-menuitem-link{text-decoration:none;display:block;padding:1em;position:relative;text-align:center}.ui-steps .ui-steps-item.ui-state-disabled .ui-menuitem-link,.ui-steps .ui-steps-item.ui-state-highlight .ui-menuitem-link{cursor:default}.ui-steps .ui-steps-number{font-size:200%;display:block}.ui-steps .ui-steps-title{display:block;white-space:nowrap}@media(max-width:40em){.ui-steps .ui-steps-item .ui-menuitem-link{padding:.5em}.ui-steps .ui-steps-item .ui-steps-title{display:none}}.ui-tabmenu .ui-tabmenu-nav{margin:0;padding:.25em .5em 0 .25em}.ui-tabmenu .ui-tabmenu-nav .ui-tabmenuitem{list-style:none;float:left;position:relative;margin:0 .2em 1px 0;padding:0;white-space:nowrap;display:block;border-bottom:0;top:1px}.ui-tabmenu .ui-tabmenu-nav .ui-tabmenuitem a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabmenu .ui-tabmenu-nav a{padding:.5em 1em}.ui-tabmenu .ui-tabmenu-nav .ui-tabmenuitem .ui-icon{float:left}.ui-tabmenu .ui-tabmenu-nav .ui-tabmenuitem.ui-state-disabled a{cursor:default}.ui-tabview{padding:.25em}.ui-tabview .ui-tabview-nav{margin:0}.ui-tabview .ui-tabview-nav li{list-style:none;float:left;position:relative;margin:0 .125em 1px 0;padding:0;white-space:nowrap}.ui-tabview .ui-tabview-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabview .ui-tabview-nav li.ui-state-disabled a,.ui-tabview .ui-tabview-nav li.ui-state-processing a,.ui-tabview .ui-tabview-nav li.ui-tabview-selected a{cursor:text}.ui-tabview.ui-tabview-collapsible .ui-tabview-nav li.ui-tabview-selected a,.ui-tabview .ui-tabview-nav li a{cursor:pointer}.ui-tabview .ui-tabview-panel{border-width:0;padding:1em;background:0}.ui-tabview .ui-tabview-nav li{display:block}.ui-tabview .ui-tabview-nav li .ui-tabview-left-icon,.ui-tabview .ui-tabview-nav li .ui-tabview-right-icon,.ui-tabview .ui-tabview-nav li .ui-tabview-title{vertical-align:middle}.ui-tabview .ui-tabview-nav li .ui-tabview-close{margin:.5em .3em 0 0;cursor:pointer}.ui-tabview.ui-tabview-top>.ui-tabview-nav li{border-bottom:0;top:1px}.ui-tabview.ui-tabview-top>.ui-tabview-nav{padding:.2em .2em 0}.ui-tabview.ui-tabview-bottom>.ui-tabview-nav{padding:0 .2em .2em}.ui-tabview.ui-tabview-bottom>.ui-tabview-nav li{border-top:0}.ui-tabview-left:after,.ui-tabview-right:after{clear:both;content:".";display:block;height:0;visibility:hidden}.ui-tabview-left>.ui-tabview-nav{float:left;width:25%;height:300px;background-image:none;padding-top:1px}.ui-tabview-left>.ui-tabview-panels{float:right;width:75%}.ui-tabview.ui-tabview-left>.ui-tabview-nav li,.ui-tabview.ui-tabview-right>.ui-tabview-nav li{display:block;float:right;white-space:normal;width:99%}.ui-tabview.ui-tabview-left>.ui-tabview-nav li{margin:0 0 1px 0;border-right:0 none}.ui-tabview.ui-tabview-right>.ui-tabview-nav{float:right;width:25%;height:300px;background-image:none;padding-top:1px}.ui-tabview.ui-tabview-right>.ui-tabview-panels{float:left;width:75%}.ui-tabview.ui-tabview-right>.ui-tabview-nav li{margin:0 0 1px 0;border-left:0 none}.ui-rtl .ui-tabview .ui-tabview-nav li{float:right}.ui-terminal{height:18em;overflow:auto;padding:.25em}.ui-terminal-input{border:0 none;background-color:transparent;color:inherit;padding:0;margin:0 0 0 .125em;width:75%;outline:0;vertical-align:baseline}.ui-terminal-command{margin-left:.125em;-moz-margin-start:.125em}.ui-terminal-input::-ms-clear{display:none}.ui-toolbar{padding:.25em .5em}.ui-toolbar-group-left{float:left}.ui-toolbar-group-right{float:right}.ui-tooltip{position:absolute;display:none;padding:.25em .5em;max-width:12.5em}.ui-tooltip.ui-tooltip-left,.ui-tooltip.ui-tooltip-right{padding:0 .25em}.ui-tooltip.ui-tooltip-bottom,.ui-tooltip.ui-tooltip-top{padding:.25em 0}.ui-tooltip .ui-tooltip-text{padding:.125em .5em;background-color:#4c4c4c;color:#fff;white-space:pre-line}.ui-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ui-tooltip-right .ui-tooltip-arrow{top:50%;left:0;margin-top:-.25em;border-width:.25em .25em .25em 0;border-right-color:#4c4c4c}.ui-tooltip-left .ui-tooltip-arrow{top:50%;right:0;margin-top:-.25em;border-width:.25em 0 .25em .25em;border-left-color:#4c4c4c}.ui-tooltip.ui-tooltip-top{padding:.25em 0}.ui-tooltip-top .ui-tooltip-arrow{bottom:0;left:50%;margin-left:-.25em;border-width:.25em .25em 0;border-top-color:#4c4c4c}.ui-tooltip-bottom .ui-tooltip-arrow{top:0;left:50%;margin-left:-.25em;border-width:0 .25em .25em;border-bottom-color:#4c4c4c}.ui-tree{width:18em}.ui-tree .ui-treenode-selectable.ui-treenode-content{cursor:pointer}.ui-tree .ui-tree-container{height:100%;margin:0;overflow:auto;padding:.25em;white-space:nowrap}.ui-tree .ui-treenode-children{margin:0;padding:0 0 0 1em}.ui-tree .ui-treenode{background-attachment:scroll;background-color:transparent;background-image:none;background-position:0 0;background-repeat:repeat-y;list-style:none outside none;margin:0;padding:.125em 0 0 0}.ui-tree .ui-treenode-droppoint{height:4px;list-style-type:none}.ui-tree .ui-treenode-droppoint-active{border:0 none}.ui-tree .ui-tree-toggler{cursor:pointer}.ui-tree .ui-tree-toggler,.ui-tree .ui-treenode-icon,.ui-tree .ui-treenode-label{display:inline-block;vertical-align:middle}.ui-tree .ui-treenode-label{padding:0 .25em}.ui-tree .ui-treenode-label.ui-state-highlight,.ui-tree .ui-treenode-label.ui-state-hover{font-weight:400;border:0 none}.ui-tree .ui-treenode.ui-treenode-leaf>.ui-treenode-content>.ui-tree-toggler{visibility:hidden}.ui-tree .ui-chkbox-box{cursor:pointer}.ui-tree .ui-chkbox{display:inline-block;vertical-align:middle}.ui-tree .ui-chkbox .ui-chkbox-icon{margin-left:1px}.ui-fluid .ui-tree{width:100%}.ui-tree-horizontal{width:auto;padding:.5em 0;overflow:auto}.ui-tree.ui-tree-horizontal table,.ui-tree.ui-tree-horizontal td,.ui-tree.ui-tree-horizontal tr{border-collapse:collapse;margin:0;padding:0;vertical-align:middle}.ui-tree.ui-tree-horizontal .ui-tree-toggler{vertical-align:middle;margin:0}.ui-tree-horizontal .ui-treenode-content{font-weight:400;padding:.4em 1em .4em .2em}.ui-tree.ui-tree-horizontal .ui-tree-node-label{margin:0}.ui-tree-horizontal .ui-treenode-parent .ui-treenode-content{font-weight:400;white-space:nowrap}.ui-tree.ui-tree-horizontal .ui-treenode{background:url(line.567f57385ea3dde2c9ae.gif) repeat-x scroll 50% transparent;padding:.25em 2.5em}.ui-tree.ui-tree-horizontal .ui-treenode.ui-treenode-collapsed,.ui-tree.ui-tree-horizontal .ui-treenode.ui-treenode-leaf{padding-right:0}.ui-tree.ui-tree-horizontal .ui-treenode-children{padding:0;margin:0}.ui-tree.ui-tree-horizontal .ui-treenode-connector{width:1px}.ui-tree.ui-tree-horizontal .ui-treenode-connector-table{height:100%;width:1px}.ui-tree.ui-tree-horizontal .ui-treenode-connector-line{background:url(line.567f57385ea3dde2c9ae.gif) repeat-y scroll 0 0 transparent;width:1px}.ui-tree.ui-tree-horizontal table{height:0}.ui-tree.ui-tree-horizontal .ui-chkbox{vertical-align:bottom;margin-right:.25em}.ui-tree.ui-tree-loading{position:relative;min-height:4em}.ui-tree .ui-tree-loading-mask{position:absolute;width:100%;height:100%;-ms-filter:"alpha(opacity=10)";opacity:.1;z-index:1}.ui-tree .ui-tree-loading-content{position:absolute;left:50%;top:50%;z-index:2;margin-top:-1em;margin-left:-1em}.ui-treetable{position:relative}.ui-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}.ui-treetable .ui-treetable-footer,.ui-treetable .ui-treetable-header{text-align:center;padding:.5em .75em}.ui-treetable .ui-treetable-header{border-bottom:0 none}.ui-treetable .ui-treetable-footer{border-top:0 none}.ui-treetable tfoot td,.ui-treetable th{text-align:center}.ui-treetable tbody td,.ui-treetable tfoot td,.ui-treetable thead th{padding:.25em .5em;overflow:hidden;white-space:nowrap;border-width:1px;border-style:solid}.ui-treetable tbody td{border-color:inherit}.ui-treetable tbody td:first-child span{vertical-align:middle}.ui-treetable .ui-treetable-toggler{vertical-align:middle;cursor:pointer;text-decoration:none}.ui-treetable .ui-treetable-checkbox{margin-right:.5em}.ui-treetable .ui-treetable-checkbox .ui-chkbox-icon{margin-left:1px}.ui-treetable .ui-treetable-row.ui-treetable-row-selectable{cursor:pointer}.ui-treetable .ui-treetable-row.ui-state-highlight{border:0 none}.ui-treetable tr.ui-state-hover{border-color:inherit;font-weight:inherit}.ui-treetable .ui-treetable-indent{width:1em;height:1em;float:left}.ui-treetable .ui-column-resizer{display:block;position:absolute!important;top:0;right:0;margin:0;width:.5em;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.ui-treetable .ui-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.ui-treetable-resizable{padding-bottom:1px;overflow:auto}.ui-treetable-resizable tbody td,.ui-treetable-resizable tfoot td,.ui-treetable-resizable thead th{white-space:nowrap}.ui-treetable-resizable th.ui-resizable-column{background-clip:padding-box;position:relative}.ui-treetable td.ui-treetable-child-table-container{padding:0;border:0 none}.ui-treetable .ui-treetable-row{display:table-row;border-bottom:0 transparent}.ui-treetable tbody .ui-treetable-row td{border:0 none}.ui-treetable tbody .ui-treetable-row td input{outline:0 none}
\ No newline at end of file
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/tsconfig.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/tsconfig.json
new file mode 100755
index 0000000..0897e9e
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/tsconfig.json
@@ -0,0 +1,32 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "outDir": "./dist/out-tsc",
+    "sourceMap": true,
+    "declaration": false,
+    "moduleResolution": "node",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es5",
+    "typeRoots": [
+      "node_modules/@types"
+    ],
+    "lib": [
+      "es2017",
+      "dom"
+    ]
+  }
+}
diff --git a/asterixdb/asterix-dashboard/src/main/resources/dashboard/tslint.json b/asterixdb/asterix-dashboard/src/main/resources/dashboard/tslint.json
new file mode 100755
index 0000000..1d02629
--- /dev/null
+++ b/asterixdb/asterix-dashboard/src/main/resources/dashboard/tslint.json
@@ -0,0 +1,154 @@
+/*
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+    "arrow-return-shorthand": true,
+    "callable-types": true,
+    "class-name": true,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
+    "curly": true,
+    "eofline": true,
+    "forin": true,
+    "import-blacklist": [
+      true,
+      "rxjs",
+      "rxjs/Rx"
+    ],
+    "import-spacing": true,
+    "indent": [
+      true,
+      "spaces"
+    ],
+    "interface-over-type-literal": true,
+    "label-position": true,
+    "max-line-length": [
+      true,
+      140
+    ],
+    "member-access": false,
+    "member-ordering": [
+      true,
+      {
+        "order": [
+          "static-field",
+          "instance-field",
+          "static-method",
+          "instance-method"
+        ]
+      }
+    ],
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-console": [
+      true,
+      "debug",
+      "info",
+      "time",
+      "timeEnd",
+      "trace"
+    ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-super": true,
+    "no-empty": false,
+    "no-empty-interface": true,
+    "no-eval": true,
+    "no-inferrable-types": [
+      true,
+      "ignore-params"
+    ],
+    "no-misused-new": true,
+    "no-non-null-assertion": true,
+    "no-shadowed-variable": true,
+    "no-string-literal": false,
+    "no-string-throw": true,
+    "no-switch-case-fall-through": true,
+    "no-trailing-whitespace": true,
+    "no-unnecessary-initializer": true,
+    "no-unused-expression": true,
+    "no-use-before-declare": true,
+    "no-var-keyword": true,
+    "object-literal-sort-keys": false,
+    "one-line": [
+      true,
+      "check-open-brace",
+      "check-catch",
+      "check-else",
+      "check-whitespace"
+    ],
+    "prefer-const": true,
+    "quotemark": [
+      true,
+      "single"
+    ],
+    "radix": true,
+    "semicolon": [
+      true,
+      "always"
+    ],
+    "triple-equals": [
+      true,
+      "allow-null-check"
+    ],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      }
+    ],
+    "typeof-compare": true,
+    "unified-signatures": true,
+    "variable-name": false,
+    "whitespace": [
+      true,
+      "check-branch",
+      "check-decl",
+      "check-operator",
+      "check-separator",
+      "check-type"
+    ],
+    "directive-selector": [
+      true,
+      "attribute",
+      "app",
+      "camelCase"
+    ],
+    "component-selector": [
+      true,
+      "element",
+      "app",
+      "kebab-case"
+    ],
+    "use-input-property-decorator": true,
+    "use-output-property-decorator": true,
+    "use-host-property-decorator": true,
+    "no-input-rename": true,
+    "no-output-rename": true,
+    "use-life-cycle-interface": true,
+    "use-pipe-transform-interface": true,
+    "component-class-suffix": true,
+    "directive-class-suffix": true,
+    "invoke-injectable": true
+  }
+}
diff --git a/asterixdb/asterix-doc/pom.xml b/asterixdb/asterix-doc/pom.xml
index a880934..a5284ad 100644
--- a/asterixdb/asterix-doc/pom.xml
+++ b/asterixdb/asterix-doc/pom.xml
@@ -36,7 +36,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <artifactId>asterix-doc</artifactId>
diff --git a/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md b/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md
index 95d0550..1f56c4c 100644
--- a/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md
+++ b/asterixdb/asterix-doc/src/main/markdown/builtins/2_string_common.md
@@ -211,8 +211,8 @@
     * `string` : a `string` that might contain the pattern,
     * `string_pattern` : a pattern `string` to be matched.
  * Return Value:
-    * the first position that `string_pattern` appears within `string`,
-      or -1 if it does not appear,
+    * the first position that `string_pattern` appears within `string`
+      (starting at 0), or -1 if it does not appear,
     * `missing` if any argument is a `missing` value,
     * `null` if any argument is a `null` value but no argument is a `missing` value,
     * any other non-string input value will cause a type error.
@@ -306,8 +306,8 @@
     * `string_flag` : (Optional) a `string` with flags to be used during regular expression matching.
         * The following modes are enabled with these flags: dotall (s), multiline (m), case_insensitive (i), and comments and whitespace (x).
  * Return Value:
-    * the first position that the regular expression `string_pattern` appears in `string`,
-      or -1 if it does not appear.
+    * the first position that the regular expression `string_pattern` appears in `string`
+      (starting at 0), or -1 if it does not appear.
     * `missing` if any argument is a `missing` value,
     * `null` if any argument is a `null` value but no argument is a `missing` value,
     * any other non-string input value will cause a type error.
@@ -363,7 +363,7 @@
  * Returns a string formed by repeating the input `string` `n` times.
  * Arguments:
     * `string` : a `string` to be repeated,
-    * `offset` : an `tinyint`/`smallint`/`integer`/`bigint` value as the starting offset of the substring in `string`.
+    * `n` : an `tinyint`/`smallint`/`integer`/`bigint` value - how many times the string should be repeated.
  * Return Value:
     * a string that repeats the input `string` `n` times,
     * `missing` if any argument is a `missing` value,
@@ -471,7 +471,8 @@
  * Returns the substring from the given string `string` based on the given start offset `offset` with the optional `length`.
  * Arguments:
     * `string` : a `string` to be extracted,
-    * `offset` : an `tinyint`/`smallint`/`integer`/`bigint` value as the starting offset of the substring in `string`,
+    * `offset` : an `tinyint`/`smallint`/`integer`/`bigint` value as the starting offset of the substring in `string`
+                 (starting at 0),
     * `length` : (Optional) an an `tinyint`/`smallint`/`integer`/`bigint` value as the length of the substring.
  * Return Value:
     * a `string` that represents the substring,
diff --git a/asterixdb/asterix-doc/src/main/markdown/builtins/3_binary.md b/asterixdb/asterix-doc/src/main/markdown/builtins/3_binary.md
index 2902496..82a68be 100644
--- a/asterixdb/asterix-doc/src/main/markdown/builtins/3_binary.md
+++ b/asterixdb/asterix-doc/src/main/markdown/builtins/3_binary.md
@@ -97,7 +97,7 @@
   * Arguments:
     * `binary` : a `binary` to be extracted,
     * `offset` : a `tinyint`, `smallint`, `integer`, or `bigint` value
-       as the starting offset of the sub binary in `binary`,
+       as the starting offset of the sub binary in `binary` (starting at 0),
     * `length` : (Optional) a `tinyint`, `smallint`, `integer`, or `bigint` value
                   as the length of the sub binary.
   * Return Value:
diff --git a/asterixdb/asterix-doc/src/main/markdown/sqlpp/2_expr.md b/asterixdb/asterix-doc/src/main/markdown/sqlpp/2_expr.md
index 281eb18..93e2f5d 100644
--- a/asterixdb/asterix-doc/src/main/markdown/sqlpp/2_expr.md
+++ b/asterixdb/asterix-doc/src/main/markdown/sqlpp/2_expr.md
@@ -53,7 +53,7 @@
 | *, /, %                                                                     |  Multiplication, division, modulo |
 | +, -                                                                        |  Addition, subtraction  |
 | &#124;&#124;                                                                          |  String concatenation |
-| IS NULL, IS NOT NULL, IS MISSING, IS NOT MISSING, <br/>IS UNKNOWN, IS NOT UNKNOWN| Unknown value comparison |
+| IS NULL, IS NOT NULL, IS MISSING, IS NOT MISSING, <br/>IS UNKNOWN, IS NOT UNKNOWN, IS VALUED, IS NOT VALUED | Unknown value comparison |
 | BETWEEN, NOT BETWEEN                                                        | Range comparison (inclusive on both sides) |
 | =, !=, <>, <, >, <=, >=, LIKE, NOT LIKE, IN, NOT IN                             | Comparison  |
 | NOT                                                                         | Logical negation |
@@ -111,6 +111,8 @@
 | IS NOT MISSING |  Test if a value is not MISSING                | SELECT * FROM ChirpMessages cm <br/>WHERE cm.user.name IS NOT MISSING;|
 | IS UNKNOWN     |  Test if a value is NULL or MISSING            | SELECT * FROM ChirpMessages cm <br/>WHERE cm.user.name IS UNKNOWN; |
 | IS NOT UNKNOWN |  Test if a value is neither NULL nor MISSING   | SELECT * FROM ChirpMessages cm <br/>WHERE cm.user.name IS NOT UNKNOWN;|
+| IS VALUED      |  Test if a value is neither NULL nor MISSING   | SELECT * FROM ChirpMessages cm <br/>WHERE cm.user.name IS VALUED; |
+| IS NOT VALUED  |  Test if a value is NULL or MISSING            | SELECT * FROM ChirpMessages cm <br/>WHERE cm.user.name IS NOT VALUED;|
 | BETWEEN        |  Test if a value is between a start value and <br/>a end value. The comparison is inclusive <br/>to both start and end values. |  SELECT * FROM ChirpMessages cm <br/>WHERE cm.chirpId BETWEEN 10 AND 20;|
 | =              |  Equality test                                 | SELECT * FROM ChirpMessages cm <br/>WHERE cm.chirpId=10; |
 | !=             |  Inequality test                               | SELECT * FROM ChirpMessages cm <br/>WHERE cm.chirpId!=10;|
@@ -132,6 +134,8 @@
 | IS NOT MISSING | TRUE | TRUE | FALSE |
 | IS UNKNOWN | FALSE | TRUE | TRUE |
 | IS NOT UNKNOWN | TRUE | FALSE | FALSE|
+| IS VALUED | TRUE | FALSE | FALSE |
+| IS NOT VALUED | FALSE | TRUE | TRUE |
 
 ### <a id="Logical_operators">Logical Operators</a>
 Logical operators perform logical `NOT`, `AND`, and `OR` operations over Boolean values (`TRUE` and `FALSE`) plus `NULL` and `MISSING`.
diff --git a/asterixdb/asterix-docker/pom.xml b/asterixdb/asterix-docker/pom.xml
index e4a32be..fd4a61f 100644
--- a/asterixdb/asterix-docker/pom.xml
+++ b/asterixdb/asterix-docker/pom.xml
@@ -25,8 +25,9 @@
     <version>0.9.4-SNAPSHOT</version>
   </parent>
   <artifactId>asterix-docker</artifactId>
+
   <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <licenses>
diff --git a/asterixdb/asterix-events/pom.xml b/asterixdb/asterix-events/pom.xml
deleted file mode 100644
index 40d2ed8..0000000
--- a/asterixdb/asterix-events/pom.xml
+++ /dev/null
@@ -1,171 +0,0 @@
-<!-- 
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>apache-asterixdb</artifactId>
-    <groupId>org.apache.asterix</groupId>
-    <version>0.9.4-SNAPSHOT</version>
-  </parent>
-  <groupId>org.apache.asterix</groupId>
-  <artifactId>asterix-events</artifactId>
-
-  <licenses>
-    <license>
-      <name>Apache License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-      <comments>A business-friendly OSS license</comments>
-    </license>
-  </licenses>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.jvnet.jaxb2.maven2</groupId>
-        <artifactId>maven-jaxb2-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>event</id>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-            <configuration>
-              <args>
-                <arg>-Xsetters</arg>
-                <arg>-Xvalue-constructor</arg>
-              </args>
-              <plugins>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-basics</artifactId>
-                  <version>0.6.2</version>
-                </plugin>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-value-constructor</artifactId>
-                  <version>3.0</version>
-                </plugin>
-              </plugins>
-              <schemaDirectory>src/main/resources/schema</schemaDirectory>
-              <schemaIncludes>
-                <include>event.xsd</include>
-              </schemaIncludes>
-              <generatePackage>org.apache.asterix.event.schema.event</generatePackage>
-              <generateDirectory>${project.build.directory}/generated-sources/event</generateDirectory>
-            </configuration>
-          </execution>
-          <execution>
-            <id>configuration</id>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-            <configuration>
-              <args>
-                <arg>-Xsetters</arg>
-                <arg>-Xvalue-constructor</arg>
-              </args>
-              <plugins>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-basics</artifactId>
-                  <version>0.6.2</version>
-                </plugin>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-value-constructor</artifactId>
-                  <version>3.0</version>
-                </plugin>
-              </plugins>
-              <schemaDirectory>src/main/resources/schema</schemaDirectory>
-              <schemaIncludes>
-                <include>installer-conf.xsd</include>
-              </schemaIncludes>
-              <generatePackage>org.apache.asterix.installer.schema.conf</generatePackage>
-              <generateDirectory>${project.build.directory}/generated-sources/configuration</generateDirectory>
-            </configuration>
-          </execution>
-          <execution>
-            <id>pattern</id>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-            <configuration>
-              <args>
-                <arg>-Xsetters</arg>
-                <arg>-Xvalue-constructor</arg>
-              </args>
-              <plugins>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-basics</artifactId>
-                  <version>0.6.2</version>
-                </plugin>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-value-constructor</artifactId>
-                  <version>3.0</version>
-                </plugin>
-              </plugins>
-              <schemaDirectory>src/main/resources/schema</schemaDirectory>
-              <schemaIncludes>
-                <include>pattern.xsd</include>
-              </schemaIncludes>
-              <generatePackage>org.apache.asterix.event.schema.pattern</generatePackage>
-              <generateDirectory>${project.build.directory}/generated-sources/pattern</generateDirectory>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>args4j</groupId>
-      <artifactId>args4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventConfig.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventConfig.java
deleted file mode 100644
index 33cb63b..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventConfig.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.driver;
-
-import org.kohsuke.args4j.Option;
-
-public class EventConfig {
-
-    @Option(name = "-h", required = false, usage = "Help")
-    public boolean help = false;
-
-    @Option(name = "-d", required = false, usage = "Show the execution on a timeline")
-    public boolean dryRun = false;
-
-    @Option(name = "-s", required = false, usage = "Seed for randomization")
-    public int seed = -1;
-
-    @Option(name = "-c", required = true, usage = "Path to cluster configuration (REQUIRED)")
-    public String clusterPath;
-
-    @Option(name = "-p", required = true, usage = "Path to pattern configuration (REQUIRED)")
-    public String patternPath;
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventDriver.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventDriver.java
deleted file mode 100644
index 415433e..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/driver/EventDriver.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.driver;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.management.EventUtil;
-import org.apache.asterix.event.management.Randomizer;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.cluster.Property;
-import org.apache.asterix.event.schema.event.Events;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.kohsuke.args4j.CmdLineParser;
-
-public class EventDriver {
-
-    public static final String CLIENT_NODE_ID = "client_node";
-    public static final String CLUSTER_IP = "127.0.0.1";
-    public static final Node CLIENT_NODE = new Node(CLIENT_NODE_ID, CLUSTER_IP, null, null, null, null, null, null);
-
-    private static String eventsDir;
-    private static Map<String, String> env = new HashMap<String, String>();
-    private static String scriptDirSuffix;
-
-    public static Map<String, String> getEnvironment() {
-        return env;
-    }
-
-    public static Cluster initializeCluster(String path) throws JAXBException, IOException {
-        Cluster cluster = EventUtil.getCluster(path);
-        for (Property p : cluster.getEnv().getProperty()) {
-            env.put(p.getKey(), p.getValue());
-        }
-        return cluster;
-    }
-
-    public static void main(String[] args) throws Exception {
-        String eventsHome = System.getenv("EVENT_HOME");
-        if (eventsHome == null) {
-            throw new IllegalStateException("EVENT_HOME is not set");
-        }
-        eventsDir = eventsHome + File.separator + EventUtil.EVENTS_DIR;
-        EventConfig eventConfig = new EventConfig();
-        CmdLineParser parser = new CmdLineParser(eventConfig);
-        try {
-            parser.parseArgument(args);
-            if (eventConfig.help) {
-                parser.printUsage(System.out);
-            }
-            if (eventConfig.seed > 0) {
-                Randomizer.getInstance(eventConfig.seed);
-            }
-            Cluster cluster = initializeCluster(eventConfig.clusterPath);
-
-            if (!eventConfig.dryRun) {
-                prepare(cluster);
-            }
-            if (!eventConfig.dryRun) {
-                cleanup(cluster);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            parser.printUsage(System.err);
-        }
-    }
-
-    private static void prepare(Cluster cluster) throws IOException, InterruptedException {
-
-        scriptDirSuffix = Long.toString(System.nanoTime());
-        List<String> args = new ArrayList<String>();
-        args.add(scriptDirSuffix);
-        Node clientNode = new Node();
-        clientNode.setId("client");
-        clientNode.setClusterIp(CLUSTER_IP);
-        for (Node node : cluster.getNode()) {
-            args.add(node.getClusterIp());
-        }
-        EventUtil.executeLocalScript(clientNode, eventsDir + "/" + "events" + "/" + "prepare.sh", args);
-    }
-
-    private static void cleanup(Cluster cluster) throws IOException, InterruptedException {
-        List<String> args = new ArrayList<String>();
-        args.add(scriptDirSuffix);
-        Node clientNode = new Node();
-        clientNode.setId("client");
-        clientNode.setClusterIp(CLUSTER_IP);
-        for (Node node : cluster.getNode()) {
-            args.add(node.getClusterIp());
-        }
-        EventUtil.executeLocalScript(clientNode, eventsDir + "/" + "events" + "/" + "cleanup.sh", args);
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/EventException.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/EventException.java
deleted file mode 100644
index 1c63f80..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/EventException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.error;
-
-public class EventException extends Exception {
-
-    private static final long serialVersionUID = 1L;
-
-    public EventException(String message) {
-        super(message);
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/OutputHandler.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/OutputHandler.java
deleted file mode 100644
index efb2ac4..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/OutputHandler.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.error;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.asterix.event.management.IOutputHandler;
-import org.apache.asterix.event.management.OutputAnalysis;
-import org.apache.asterix.event.model.EventList.EventType;
-import org.apache.asterix.event.schema.pattern.Event;
-
-public class OutputHandler implements IOutputHandler {
-
-    public static IOutputHandler INSTANCE = new OutputHandler();
-
-    private OutputHandler() {
-
-    }
-
-    @Override
-    public OutputAnalysis reportEventOutput(Event event, String output) {
-
-        EventType eventType = EventType.valueOf(event.getType().toUpperCase());
-        boolean ignore = true;
-        String trimmedOutput = output.trim();
-        StringBuilder errorMessage = new StringBuilder();
-        switch (eventType) {
-            case FILE_TRANSFER:
-                if (trimmedOutput.length() > 0) {
-                    if (output.contains("Permission denied") || output.contains("cannot find or open")) {
-                        ignore = false;
-                        break;
-                    }
-                }
-                break;
-
-            case BACKUP:
-            case RESTORE:
-                if (trimmedOutput.length() > 0) {
-                    if (trimmedOutput.contains("AccessControlException")) {
-                        errorMessage.append("Insufficient permissions on back up directory");
-                    }
-                    ignore = output.contains("does not exist") || output.contains("File exist")
-                            || (output.contains("No such file or directory"));
-                }
-                break;
-
-            case NODE_INFO:
-                Properties p = new Properties();
-                try {
-                    p.load(new ByteArrayInputStream(trimmedOutput.getBytes()));
-                } catch (IOException e) {
-                }
-                String javaVersion = (String) p.get("java_version");
-                if (p.get("java_version") == null) {
-                    errorMessage.append("Java not installed on " + event.getNodeid().getValue().getAbsvalue());
-                    ignore = false;
-                } else if (!javaVersion.contains("1.7")) {
-                    errorMessage.append("Asterix requires Java 1.7.x. Incompatible version found on  "
-                            + event.getNodeid().getValue().getAbsvalue() + "\n");
-                    ignore = false;
-                }
-                break;
-            default:
-                break;
-        }
-        return ignore ? new OutputAnalysis(true, null) : new OutputAnalysis(false, errorMessage.toString());
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/VerificationUtil.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/VerificationUtil.java
deleted file mode 100644
index 640422e..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/error/VerificationUtil.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.error;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.model.ProcessInfo;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-
-public class VerificationUtil {
-
-    private static final String VERIFY_SCRIPT_PATH = AsterixEventService.getEventHome() + File.separator + "scripts"
-            + File.separator + "verify.sh";
-
-    public static AsterixRuntimeState getAsterixRuntimeState(AsterixInstance instance) throws Exception {
-
-        Cluster cluster = instance.getCluster();
-        List<String> args = new ArrayList<String>();
-        args.add(instance.getName());
-        args.add(instance.getCluster().getMasterNode().getClusterIp());
-        for (Node node : cluster.getNode()) {
-            args.add(node.getClusterIp());
-            args.add(instance.getName() + "_" + node.getId());
-        }
-        Thread.sleep(2000);
-        String output = AsterixEventServiceUtil.executeLocalScript(VERIFY_SCRIPT_PATH, args);
-        boolean ccRunning = true;
-        List<String> failedNCs = new ArrayList<String>();
-        String[] infoFields;
-        List<ProcessInfo> processes = new ArrayList<ProcessInfo>();
-
-        for (String line : output.split("\n")) {
-            String nodeid = null;
-            infoFields = line.split(":");
-            try {
-                int pid = Integer.parseInt(infoFields[3]);
-                if (infoFields[0].equals("NC")) {
-                    nodeid = infoFields[2].split("_")[1];
-                } else {
-                    nodeid = instance.getCluster().getMasterNode().getId();
-                }
-                processes.add(new ProcessInfo(infoFields[0], infoFields[1], nodeid, pid));
-            } catch (Exception e) {
-                if (infoFields[0].equalsIgnoreCase("CC")) {
-                    ccRunning = false;
-                } else {
-                    failedNCs.add(infoFields[1]);
-                }
-            }
-        }
-        return new AsterixRuntimeState(processes, failedNCs, ccRunning);
-    }
-
-    public static void updateInstanceWithRuntimeDescription(AsterixInstance instance, AsterixRuntimeState state,
-            boolean expectedRunning) {
-        StringBuilder summary = new StringBuilder();
-        if (expectedRunning) {
-            if (!state.isCcRunning()) {
-                summary.append(
-                        "Cluster Controller not running at " + instance.getCluster().getMasterNode().getId() + "\n");
-                instance.setState(State.UNUSABLE);
-            }
-            if (state.getFailedNCs() != null && !state.getFailedNCs().isEmpty()) {
-                summary.append("Node Controller not running at the following nodes" + "\n");
-                for (String failedNC : state.getFailedNCs()) {
-                    summary.append(failedNC + "\n");
-                }
-                // instance.setState(State.UNUSABLE);
-            }
-            if (!(instance.getState().equals(State.UNUSABLE))) {
-                instance.setState(State.ACTIVE);
-            }
-        } else {
-            if (state.getProcesses() != null && state.getProcesses().size() > 0) {
-                summary.append("Following process still running " + "\n");
-                for (ProcessInfo pInfo : state.getProcesses()) {
-                    summary.append(pInfo + "\n");
-                }
-                // instance.setState(State.UNUSABLE);
-            } else {
-                // instance.setState(State.INACTIVE);
-            }
-        }
-        state.setSummary(summary.toString());
-        instance.setAsterixRuntimeStates(state);
-    }
-
-    public static void verifyBackupRestoreConfiguration(String hdfsUrl, String hadoopVersion, String hdfsBackupDir)
-            throws Exception {
-        StringBuilder errorCheck = new StringBuilder();
-        if (hdfsUrl == null || hdfsUrl.length() == 0) {
-            errorCheck.append("\n HDFS Url not configured");
-        }
-        if (hadoopVersion == null || hadoopVersion.length() == 0) {
-            errorCheck.append("\n HDFS version not configured");
-        }
-        if (hdfsBackupDir == null || hdfsBackupDir.length() == 0) {
-            errorCheck.append("\n HDFS backup directory not configured");
-        }
-        if (errorCheck.length() > 0) {
-            throw new Exception("Incomplete hdfs configuration" + errorCheck);
-        }
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/AsterixEventServiceClient.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/AsterixEventServiceClient.java
deleted file mode 100644
index 34c1837..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/AsterixEventServiceClient.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Logger;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.event.Events;
-import org.apache.asterix.event.schema.pattern.Event;
-import org.apache.asterix.event.schema.pattern.Nodeid;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.schema.pattern.Value;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.installer.schema.conf.Configuration;
-
-public class AsterixEventServiceClient {
-
-    private static final Logger LOGGER = Logger.getLogger(AsterixEventServiceClient.class.getName());
-
-    private EventTask[] tasks;
-    private boolean dryRun = false;
-    private LinkedBlockingQueue<EventTaskReport> msgInbox = new LinkedBlockingQueue<EventTaskReport>();
-    private AtomicInteger pendingTasks = new AtomicInteger(0);
-    private final Cluster cluster;
-    private IPatternListener listener;
-    private IOutputHandler outputHandler;
-    private Events events;
-    private String eventsHomeDir;
-    private Configuration configuration;
-
-    public AsterixEventServiceClient(Configuration configuration, String eventsHomeDir, Cluster cluster,
-            boolean transferArtifacts, boolean dryRun, IOutputHandler outputHandler) throws Exception {
-        this.eventsHomeDir = eventsHomeDir;
-        this.events = initializeEvents();
-        this.cluster = cluster;
-        this.dryRun = dryRun;
-        this.configuration = configuration;
-        this.outputHandler = outputHandler;
-        if (!dryRun && transferArtifacts) {
-            initializeCluster(getEventsDir());
-        }
-    }
-
-    public void submit(Patterns patterns) throws Exception {
-        if (patterns.getPattern().isEmpty()) {
-            return;
-        }
-        initTasks(patterns);
-        try {
-            waitForCompletion();
-        } catch (InterruptedException ie) {
-            LOGGER.info("Interrupted exception :" + ie);
-        } catch (Exception e) {
-            throw e;
-        }
-
-    }
-
-    public void submit(Patterns patterns, IPatternListener listener) throws Exception {
-        this.listener = listener;
-        initTasks(patterns);
-    }
-
-    private void initTasks(Patterns patterns) {
-        tasks = new EventTask[patterns.getPattern().size()];
-        pendingTasks.set(tasks.length);
-        int index = 0;
-        for (Pattern pattern : patterns.getPattern()) {
-            tasks[index] = new EventTask(pattern, this);
-            tasks[index].start();
-            index++;
-        }
-    }
-
-    public Cluster getCluster() {
-        return cluster;
-    }
-
-    public boolean isDryRun() {
-        return dryRun;
-    }
-
-    public Events getEvents() {
-        return events;
-    }
-
-    public String getEventsDir() {
-        return eventsHomeDir + File.separator + AsterixEventServiceUtil.EVENT_DIR;
-    }
-
-    public synchronized void notifyCompletion(EventTaskReport report) {
-
-        if (report.isSuccess()) {
-            if (listener != null) {
-                pendingTasks.decrementAndGet();
-                listener.eventCompleted(report);
-                if (pendingTasks.get() == 0) {
-                    listener.jobCompleted();
-                }
-            } else {
-                try {
-                    msgInbox.put(report);
-                } catch (InterruptedException e) {
-                }
-            }
-        } else {
-            for (EventTask t : tasks) {
-                if (t.getState() == EventTask.State.INITIALIZED || t.getState() == EventTask.State.IN_PROGRESS) {
-                    t.cancel();
-                }
-            }
-            if (listener != null) {
-                listener.jobFailed(report);
-            } else {
-                try {
-                    msgInbox.put(report);
-                } catch (InterruptedException e) {
-                }
-            }
-        }
-    }
-
-    private void waitForCompletion() throws Exception {
-        while (true) {
-            EventTaskReport report = msgInbox.take();
-            if (report.isSuccess()) {
-                if (pendingTasks.decrementAndGet() == 0) {
-                    break;
-                }
-            } else {
-                throw report.getException();
-            }
-        }
-    }
-
-    private void initializeCluster(String eventsDir) throws Exception {
-        Patterns patterns = initPattern(eventsDir);
-        submit(patterns);
-    }
-
-    private Patterns initPattern(String eventsDir) throws Exception {
-        Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-        List<Pattern> patternList = new ArrayList<Pattern>();
-        String workingDir = cluster.getWorkingDir().getDir();
-        String username = cluster.getUsername() == null ? System.getProperty("user.name") : cluster.getUsername();
-        patternList.add(getDirectoryTransferPattern(username, eventsDir, nodeid,
-                cluster.getMasterNode().getClusterIp(), workingDir));
-
-        JAXBContext ctx = JAXBContext.newInstance(Configuration.class);
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        String outputPathDir = System.getProperty("java.io.tmpdir") + File.separator + "conf-"
-                + System.getProperty("user.name");
-        new File(outputPathDir).mkdirs();
-        String outputPath = outputPathDir + File.separator + "configuration.xml";
-        marshaller.marshal(configuration, new FileOutputStream(outputPath));
-
-        patternList.add(getFileTransferPattern(username, outputPath, nodeid, cluster.getMasterNode().getClusterIp(),
-                workingDir));
-
-        if (!cluster.getWorkingDir().isNFS()) {
-            for (Node node : cluster.getNode()) {
-                patternList.add(getDirectoryTransferPattern(username, eventsDir, nodeid, node.getClusterIp(),
-                        workingDir));
-
-            }
-        }
-        return new Patterns(patternList);
-    }
-
-    private Pattern getDirectoryTransferPattern(String username, String src, Nodeid srcNode, String destNodeIp,
-            String destDir) {
-        String pargs = username + " " + src + " " + destNodeIp + " " + destDir;
-        Event event = new Event("directory_transfer", srcNode, pargs);
-        return new Pattern(null, 1, null, event);
-    }
-
-    private Pattern getFileTransferPattern(String username, String src, Nodeid srcNode, String destNodeIp,
-            String destDir) {
-        String pargs = username + " " + src + " " + destNodeIp + " " + destDir;
-        Event event = new Event("file_transfer", srcNode, pargs);
-        return new Pattern(null, 1, null, event);
-    }
-
-    public IOutputHandler getErrorHandler() {
-        return outputHandler;
-    }
-
-    private Events initializeEvents() throws JAXBException, FileNotFoundException {
-        File file = new File(getEventsDir() + File.separator + "events.xml");
-        JAXBContext eventCtx = JAXBContext.newInstance(Events.class);
-        Unmarshaller unmarshaller = eventCtx.createUnmarshaller();
-        events = (Events) unmarshaller.unmarshal(file);
-        return events;
-    }
-
-    public String getEventsHomeDir() {
-        return eventsHomeDir;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventExecutor.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventExecutor.java
deleted file mode 100644
index 5035072..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventExecutor.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.cluster.Property;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.commons.io.IOUtils;
-
-public class EventExecutor {
-
-    private static final String EXECUTE_SCRIPT = "execute.sh";
-    private static final String IP_LOCATION = "IP_LOCATION";
-    private static final String CLUSTER_ENV = "ENV";
-    private static final String SCRIPT = "SCRIPT";
-    private static final String ARGS = "ARGS";
-    private static final String DAEMON = "DAEMON";
-
-    public void executeEvent(Node node, String script, List<String> args, boolean isDaemon, Cluster cluster,
-            Pattern pattern, IOutputHandler outputHandler, AsterixEventServiceClient client) throws IOException {
-        List<String> pargs = new ArrayList<>();
-        pargs.add("/bin/bash");
-        pargs.add(client.getEventsHomeDir() + File.separator + AsterixEventServiceUtil.EVENT_DIR + File.separator
-                + EXECUTE_SCRIPT);
-        StringBuilder envBuffer = new StringBuilder(IP_LOCATION + "=" + node.getClusterIp() + " ");
-        boolean isMasterNode = node.getId().equals(cluster.getMasterNode().getId());
-
-        if (!node.getId().equals(EventDriver.CLIENT_NODE_ID) && cluster.getEnv() != null) {
-            for (Property p : cluster.getEnv().getProperty()) {
-                if (p.getKey().equals("JAVA_HOME")) {
-                    String val = node.getJavaHome() == null ? p.getValue() : node.getJavaHome();
-                    envBuffer.append(p.getKey() + "=" + val + " ");
-                } else if (p.getKey().equals(EventUtil.NC_JAVA_OPTS)) {
-                    if (!isMasterNode) {
-                        appendJavaOpts(node, envBuffer, p);
-                    }
-                } else if (p.getKey().equals(EventUtil.CC_JAVA_OPTS)) {
-                    if (isMasterNode) {
-                        appendJavaOpts(node, envBuffer, p);
-                    }
-                } else if (p.getKey().equals("LOG_DIR")) {
-                    String val = node.getLogDir() == null ? p.getValue() : node.getLogDir();
-                    envBuffer.append(p.getKey() + "=" + val + " ");
-                } else {
-                    envBuffer.append(p.getKey() + "=" + p.getValue() + " ");
-                }
-
-            }
-            pargs.add(cluster.getUsername() == null ? System.getProperty("user.name") : cluster.getUsername());
-        }
-
-        StringBuilder argBuffer = new StringBuilder();
-        if (args != null && args.size() > 0) {
-            for (String arg : args) {
-                argBuffer.append(arg + " ");
-            }
-        }
-
-        ProcessBuilder pb = new ProcessBuilder(pargs);
-        pb.environment().put(IP_LOCATION, node.getClusterIp());
-        pb.environment().put(CLUSTER_ENV, envBuffer.toString());
-        pb.environment().put(SCRIPT, script);
-        pb.environment().put(ARGS, argBuffer.toString());
-        pb.environment().put(DAEMON, Boolean.toString(isDaemon));
-        Process p = pb.start();
-        if (!isDaemon) {
-            BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
-            StringWriter writer = new StringWriter();
-            IOUtils.copy(bis, writer, "UTF-8");
-            String result = writer.getBuffer().toString();
-            OutputAnalysis analysis = outputHandler.reportEventOutput(pattern.getEvent(), result);
-            if (!analysis.isExpected()) {
-                throw new IOException(analysis.getErrorMessage() + result);
-            }
-        }
-    }
-
-    protected void appendJavaOpts(Node node, StringBuilder envBuffer, Property p) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("\"");
-        String javaOpts = p.getValue();
-        if (javaOpts != null) {
-            builder.append(javaOpts);
-        }
-        if (node.getDebugPort() != null) {
-            int debugPort = node.getDebugPort().intValue();
-            if (javaOpts == null || !javaOpts.contains("-Xdebug")) {
-                builder.append(" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=").append(debugPort);
-            }
-        }
-        builder.append("\"");
-        envBuffer.append("JAVA_OPTS=").append(builder.toString()).append(" ");
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTask.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTask.java
deleted file mode 100644
index afd53de..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTask.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.apache.log4j.Logger;
-
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.event.Event;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Period;
-
-public class EventTask extends TimerTask {
-
-    public static enum State {
-        INITIALIZED,
-        IN_PROGRESS,
-        COMPLETED,
-        FAILED
-    }
-
-    private static final Logger logger = Logger.getLogger(EventTask.class.getName());
-
-    private Pattern pattern;
-    private Event event;
-    private long interval = 0;
-    private long initialDelay = 0;
-    private int maxOccurs = Integer.MAX_VALUE;
-    private int occurrenceCount = 0;
-    private Timer timer;
-    private String taskScript;
-    private Node location;
-    private List<String> taskArgs;
-    private AsterixEventServiceClient client;
-    private List<Node> candidateLocations;
-    private boolean dynamicLocation = false;
-    private boolean reuseLocation = false;
-    private State state;
-
-    public EventTask(Pattern pattern, AsterixEventServiceClient client) {
-        this.pattern = pattern;
-        this.client = client;
-        Period period = pattern.getPeriod();
-        if (period != null && period.getAbsvalue() != null) {
-            this.interval = EventUtil.parseTimeInterval(period.getAbsvalue(), period.getUnit());
-        }
-        if (pattern.getDelay() != null) {
-            this.initialDelay = EventUtil.parseTimeInterval(new ValueType(pattern.getDelay().getValue()), pattern
-                    .getDelay().getUnit());
-        }
-        if (pattern.getMaxOccurs() != null) {
-            this.maxOccurs = pattern.getMaxOccurs();
-        }
-        this.timer = new Timer();
-        taskArgs = EventUtil.getEventArgs(pattern);
-        candidateLocations = EventUtil.getCandidateLocations(pattern, client.getCluster());
-        if (pattern.getEvent().getNodeid().getValue().getRandom() != null && period != null && maxOccurs > 1) {
-            dynamicLocation = true;
-            reuseLocation = pattern.getEvent().getNodeid().getValue().getRandom().getRange().isReuse();
-        } else {
-            location = EventUtil.getEventLocation(pattern, candidateLocations, client.getCluster());
-        }
-        String scriptsDir;
-        if (location.getId().equals(EventDriver.CLIENT_NODE_ID)) {
-            scriptsDir = client.getEventsDir();
-        } else {
-            scriptsDir = client.getCluster().getWorkingDir().getDir() + File.separator + "events";
-        }
-        event = EventUtil.getEvent(pattern, client.getEvents());
-        taskScript = scriptsDir + File.separator + event.getScript();
-        state = State.INITIALIZED;
-    }
-
-    public void start() {
-        if (interval > 0) {
-            timer.schedule(this, initialDelay, interval);
-        } else {
-            timer.schedule(this, initialDelay);
-        }
-    }
-
-    @Override
-    public void run() {
-        if (candidateLocations.size() == 0) {
-            timer.cancel();
-            client.notifyCompletion(new EventTaskReport(this));
-        } else {
-            if (dynamicLocation) {
-                location = EventUtil.getEventLocation(pattern, candidateLocations, client.getCluster());
-                if (!reuseLocation) {
-                    candidateLocations.remove(location);
-                }
-            }
-
-            logger.debug(EventUtil.dateFormat.get().format(new Date()) + " " + "EVENT "
-                    + pattern.getEvent().getType().toUpperCase() + " at " + location.getId().toUpperCase());
-            try {
-                if (!client.isDryRun()) {
-                    new EventExecutor().executeEvent(location, taskScript, taskArgs, event.isDaemon(),
-                            client.getCluster(), pattern, client.getErrorHandler(), client);
-                }
-                occurrenceCount++;
-                if (occurrenceCount >= maxOccurs) {
-                    timer.cancel();
-                    client.notifyCompletion(new EventTaskReport(this));
-                }
-            } catch (IOException ioe) {
-                timer.cancel();
-                client.notifyCompletion(new EventTaskReport(this, false, ioe));
-            }
-        }
-
-    }
-
-    public Node getLocation() {
-        return location;
-    }
-
-    public long getInterval() {
-        return interval;
-    }
-
-    public Pattern getPattern() {
-        return pattern;
-    }
-
-    public State getState() {
-        return state;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTaskReport.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTaskReport.java
deleted file mode 100644
index 82f303a..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventTaskReport.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.io.Serializable;
-
-public class EventTaskReport implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-    private final EventTask task;
-    private final boolean success;
-    private final Exception e;
-
-    public EventTaskReport(EventTask task, boolean success, Exception e) {
-        this.task = task;
-        this.success = success;
-        this.e = e;
-    }
-
-    public EventTaskReport(EventTask task) {
-        this.task = task;
-        this.success = true;
-        this.e = null;
-    }
-
-    public Exception getException() {
-        return e;
-    }
-
-    public EventTask getTask() {
-        return task;
-    }
-
-    public boolean isSuccess() {
-        return success;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventUtil.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventUtil.java
deleted file mode 100644
index 4dc3124..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/EventUtil.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.management.ValueType.Type;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.event.Event;
-import org.apache.asterix.event.schema.event.Events;
-import org.apache.asterix.event.schema.pattern.Pattern;
-
-public class EventUtil {
-
-    public static final String EVENTS_DIR = "events";
-    public static final ThreadLocal<DateFormat> dateFormat =
-            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
-    public static final String NC_JAVA_OPTS = "nc.java.opts";
-    public static final String CC_JAVA_OPTS = "cc.java.opts";
-
-    private static final String IP_LOCATION = "IP_LOCATION";
-
-    public static Cluster getCluster(String clusterConfigurationPath) throws JAXBException {
-        File file = new File(clusterConfigurationPath);
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        Cluster cluster = (Cluster) unmarshaller.unmarshal(file);
-        return cluster;
-    }
-
-    public static long parseTimeInterval(ValueType v, String unit) throws IllegalArgumentException {
-        int val = 0;
-        switch (v.getType()) {
-            case ABS:
-                val = Integer.parseInt(v.getAbsoluteValue());
-                break;
-            case RANDOM_MIN_MAX:
-                val = Randomizer.getInstance().getRandomInt(v.getMin(), v.getMax());
-                break;
-            case RANDOM_RANGE:
-                String[] values = v.getRangeSet();
-                val = Integer.parseInt(values[Randomizer.getInstance().getRandomInt(0, values.length - 1)]);
-                break;
-        }
-        return computeInterval(val, unit);
-    }
-
-    public static long parseTimeInterval(String v, String unit) throws IllegalArgumentException {
-        int value = Integer.parseInt(v);
-        return computeInterval(value, unit);
-    }
-
-    private static long computeInterval(int val, String unit) {
-        int vmult = 1;
-        if ("hr".equalsIgnoreCase(unit)) {
-            vmult = 3600 * 1000;
-        } else if ("min".equalsIgnoreCase(unit)) {
-            vmult = 60 * 1000;
-        } else if ("sec".equalsIgnoreCase(unit)) {
-            vmult = 1000;
-        } else
-            throw new IllegalArgumentException(" invalid unit value specified for frequency (hr,min,sec)");
-        return val * vmult;
-
-    }
-
-    public static Event getEvent(Pattern pattern, Events events) {
-        for (Event event : events.getEvent()) {
-            if (event.getType().equals(pattern.getEvent().getType())) {
-                return event;
-            }
-        }
-        throw new IllegalArgumentException(" Unknown event type" + pattern.getEvent().getType());
-    }
-
-    public static Node getEventLocation(Pattern pattern, List<Node> candidateLocations, Cluster cluster) {
-        ValueType value = new ValueType(pattern.getEvent().getNodeid().getValue());
-        Node location = null;
-        Type vtype = value.getType();
-
-        switch (vtype) {
-            case ABS:
-                location = getNodeFromId(value.getAbsoluteValue(), cluster);
-                break;
-            case RANDOM_RANGE:
-                int nodeIndex = Randomizer.getInstance().getRandomInt(0, candidateLocations.size() - 1);
-                location = candidateLocations.get(nodeIndex);
-                break;
-            case RANDOM_MIN_MAX:
-                throw new IllegalStateException(" Canont configure a min max value range for location");
-        }
-        return location;
-
-    }
-
-    public static List<Node> getCandidateLocations(Pattern pattern, Cluster cluster) {
-        ValueType value = new ValueType(pattern.getEvent().getNodeid().getValue());
-        List<Node> candidateList = new ArrayList<Node>();
-        switch (value.getType()) {
-            case ABS:
-                candidateList.add(getNodeFromId(value.getAbsoluteValue(), cluster));
-                break;
-            case RANDOM_RANGE:
-                boolean anyOption = false;
-                String[] values = value.getRangeSet();
-                for (String v : values) {
-                    if (v.equalsIgnoreCase("ANY")) {
-                        anyOption = true;
-                    }
-                }
-                if (anyOption) {
-                    for (Node node : cluster.getNode()) {
-                        candidateList.add(node);
-                    }
-                } else {
-                    boolean found = false;
-                    for (String v : values) {
-                        for (Node node : cluster.getNode()) {
-                            if (node.getId().equals(v)) {
-                                candidateList.add(node);
-                                found = true;
-                                break;
-                            }
-                        }
-                        if (!found) {
-                            throw new IllegalStateException("Unknonw nodeId : " + v);
-                        }
-                        found = false;
-                    }
-
-                }
-                String[] excluded = value.getRangeExcluded();
-                if (excluded != null && excluded.length > 0) {
-                    List<Node> markedForRemoval = new ArrayList<Node>();
-                    for (String exclusion : excluded) {
-                        for (Node node : candidateList) {
-                            if (node.getId().equals(exclusion)) {
-                                markedForRemoval.add(node);
-                            }
-                        }
-                    }
-                    candidateList.removeAll(markedForRemoval);
-                }
-                break;
-            case RANDOM_MIN_MAX:
-                throw new IllegalStateException(" Invalid value configured for location");
-        }
-        return candidateList;
-    }
-
-    private static Node getNodeFromId(String nodeid, Cluster cluster) {
-        if (nodeid.equals(EventDriver.CLIENT_NODE.getId())) {
-            return EventDriver.CLIENT_NODE;
-        }
-
-        if (nodeid.equals(cluster.getMasterNode().getId())) {
-            String logDir = cluster.getMasterNode().getLogDir() == null ? cluster.getLogDir() : cluster.getMasterNode()
-                    .getLogDir();
-            String javaHome = cluster.getMasterNode().getJavaHome() == null ? cluster.getJavaHome() : cluster
-                    .getMasterNode().getJavaHome();
-            return new Node(cluster.getMasterNode().getId(), cluster.getMasterNode().getClusterIp(), javaHome, logDir,
-                    null, null, cluster.getMasterNode().getDebugPort(), null);
-        }
-
-        List<Node> nodeList = cluster.getNode();
-        for (Node node : nodeList) {
-            if (node.getId().equals(nodeid)) {
-                return node;
-            }
-        }
-        StringBuilder buffer = new StringBuilder();
-        buffer.append(EventDriver.CLIENT_NODE.getId() + ",");
-        buffer.append(cluster.getMasterNode().getId() + ",");
-        for (Node v : cluster.getNode()) {
-            buffer.append(v.getId() + ",");
-        }
-        buffer.deleteCharAt(buffer.length() - 1);
-        throw new IllegalArgumentException("Unknown node id :" + nodeid + " valid ids:" + buffer);
-    }
-
-    public static void executeLocalScript(Node node, String script, List<String> args) throws IOException,
-            InterruptedException {
-        List<String> pargs = new ArrayList<String>();
-        pargs.add("/bin/bash");
-        pargs.add(script);
-        if (args != null) {
-            pargs.addAll(args);
-        }
-        ProcessBuilder pb = new ProcessBuilder(pargs);
-        pb.environment().putAll(EventDriver.getEnvironment());
-        pb.environment().put(IP_LOCATION, node.getClusterIp());
-        pb.start();
-    }
-
-    public static List<String> getEventArgs(Pattern pattern) {
-        List<String> pargs = new ArrayList<String>();
-        if (pattern.getEvent().getPargs() == null) {
-            return pargs;
-        }
-        String[] args = pattern.getEvent().getPargs().split(" ");
-        for (String arg : args) {
-            pargs.add(arg.trim());
-        }
-        return pargs;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IOutputHandler.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IOutputHandler.java
deleted file mode 100644
index d2c3242..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IOutputHandler.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import org.apache.asterix.event.schema.pattern.Event;
-
-public interface IOutputHandler {
-
-    public OutputAnalysis reportEventOutput(Event event, String output);
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IPatternListener.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IPatternListener.java
deleted file mode 100644
index e075140..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/IPatternListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-public interface IPatternListener {
-
-    public void eventCompleted(EventTaskReport report);
-
-    public void jobCompleted();
-
-    public void jobFailed(EventTaskReport report);
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/OutputAnalysis.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/OutputAnalysis.java
deleted file mode 100644
index 86baeb7..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/OutputAnalysis.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-public class OutputAnalysis {
-
-    private final boolean expected;
-    private final String errorMessage;
-
-    public OutputAnalysis(boolean expected, String errorMessage) {
-        this.expected = expected;
-        this.errorMessage = errorMessage;
-    }
-
-    public boolean isExpected() {
-        return expected;
-    }
-
-    public String getErrorMessage() {
-        return errorMessage;
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/Randomizer.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/Randomizer.java
deleted file mode 100644
index 347ffce..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/Randomizer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import java.util.Random;
-import java.util.logging.Logger;
-
-public class Randomizer {
-
-    private static final Logger LOGGER = Logger.getLogger(Randomizer.class.getName());
-    private static Randomizer INSTANCE;
-    private final Random random;
-    private final int seed;
-
-    public static Randomizer getInstance(int seed) {
-        if (INSTANCE == null) {
-            INSTANCE = new Randomizer(seed);
-        }
-        return INSTANCE;
-    }
-
-    public static Randomizer getInstance() {
-        if (INSTANCE == null) {
-            INSTANCE = new Randomizer();
-        }
-        return INSTANCE;
-    }
-
-    private Randomizer() {
-        Random rm = new Random();
-        seed = rm.nextInt(10000);
-        random = new Random(seed);
-        LOGGER.info("SEED:" + seed);
-    }
-
-    private Randomizer(int seed) {
-        this.seed = seed;
-        random = new Random(seed);
-        LOGGER.info("SEED:" + seed);
-    }
-
-    public Random getRandom() {
-        return random;
-    }
-
-    public int getSeed() {
-        return seed;
-    }
-
-    public int getRandomInt(int min, int max) {
-        return min + random.nextInt(max - min + 1);
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/ValueType.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/ValueType.java
deleted file mode 100644
index 2fc7eeb..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/management/ValueType.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.management;
-
-import org.apache.asterix.event.schema.pattern.Value;
-
-public class ValueType {
-
-    public static enum Type {
-        ABS,
-        RANDOM_RANGE,
-        RANDOM_MIN_MAX
-    }
-
-    private Value value;
-    private Type type;
-
-    public ValueType(Value value) {
-        this.value = value;
-        if (value.getAbsvalue() != null) {
-            type = Type.ABS;
-        } else if (value.getRandom() != null) {
-            if (value.getRandom().getMinmax() != null) {
-                type = Type.RANDOM_MIN_MAX;
-            } else if (value.getRandom().getRange() != null) {
-                type = Type.RANDOM_RANGE;
-            } else {
-                throw new IllegalStateException("Incorrect value type");
-            }
-        }
-    }
-
-    public int getMin() {
-        switch (type) {
-            case RANDOM_MIN_MAX:
-                return Integer.parseInt(value.getRandom().getMinmax().getMin());
-            default:
-                throw new IllegalStateException("");
-        }
-    }
-
-    public int getMax() {
-        switch (type) {
-            case RANDOM_MIN_MAX:
-                return Integer.parseInt(value.getRandom().getMinmax().getMax());
-            default:
-                throw new IllegalStateException("");
-        }
-    }
-
-    public String[] getRangeSet() {
-        switch (type) {
-            case RANDOM_RANGE:
-                return value.getRandom().getRange().getSet().split(" ");
-            default:
-                throw new IllegalStateException("");
-        }
-    }
-
-    public String[] getRangeExcluded() {
-        switch (type) {
-            case RANDOM_RANGE:
-                String exl = value.getRandom().getRange().getExclude();
-                return exl != null ? exl.split(" ") : null;
-            default:
-                throw new IllegalStateException("");
-        }
-    }
-
-    public String getAbsoluteValue() {
-        switch (type) {
-            case ABS:
-                return value.getAbsvalue();
-            default:
-                throw new IllegalStateException("");
-        }
-    }
-
-    public Type getType() {
-        return type;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixInstance.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixInstance.java
deleted file mode 100644
index f824d5b..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixInstance.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Property;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-
-public class AsterixInstance implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    private static final int WEB_INTERFACE_PORT_DEFAULT = 19001;
-
-    public enum State {
-        ACTIVE,
-        INACTIVE,
-        UNUSABLE
-    }
-
-    private final Cluster cluster;
-    private final String name;
-    private final Date createdTimestamp;
-    private Date stateChangeTimestamp;
-    private Date modifiedTimestamp;
-    private AsterixConfiguration asterixConfiguration;
-    private State state;
-    private final String metadataNodeId;
-    private final String asterixVersion;
-    private final List<BackupInfo> backupInfo;
-    private AsterixRuntimeState runtimeState;
-    private State previousState;
-
-    public AsterixInstance(String name, Cluster cluster, AsterixConfiguration asterixConfiguration,
-            String metadataNodeId, String asterixVersion) {
-        this.name = name;
-        this.cluster = cluster;
-        this.asterixConfiguration = asterixConfiguration;
-        this.metadataNodeId = metadataNodeId;
-        this.state = State.ACTIVE;
-        this.previousState = State.UNUSABLE;
-        this.asterixVersion = asterixVersion;
-        this.createdTimestamp = new Date();
-        this.backupInfo = new ArrayList<BackupInfo>();
-    }
-
-    public State getState() {
-        return state;
-    }
-
-    public void setState(State state) {
-        this.previousState = this.state;
-        this.state = state;
-    }
-
-    public Cluster getCluster() {
-        return cluster;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setStateChangeTimestamp(Date stateChangeTimestamp) {
-        this.stateChangeTimestamp = stateChangeTimestamp;
-    }
-
-    public void setModifiedTimestamp(Date modifiedTimestamp) {
-        this.modifiedTimestamp = modifiedTimestamp;
-    }
-
-    public String getMetadataNodeId() {
-        return metadataNodeId;
-    }
-
-    public String getAsterixVersion() {
-        return asterixVersion;
-    }
-
-    public String getDescription(boolean detailed) {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("Name:" + name + "\n");
-        buffer.append("Created:" + createdTimestamp + "\n");
-
-        buffer.append("Web-Url:" + getWebInterfaceUrl() + "\n");
-        buffer.append("State:" + state);
-        if (!state.equals(State.UNUSABLE) && stateChangeTimestamp != null) {
-            buffer.append(" (" + stateChangeTimestamp + ")" + "\n");
-        } else {
-            buffer.append("\n");
-        }
-        if (modifiedTimestamp != null) {
-            buffer.append("Last modified timestamp:" + modifiedTimestamp + "\n");
-        }
-
-        if (runtimeState.getSummary() != null && runtimeState.getSummary().length() > 0) {
-            buffer.append("\nWARNING!:" + runtimeState.getSummary() + "\n");
-        }
-        if (detailed) {
-            addDetailedInformation(buffer);
-        }
-        return buffer.toString();
-    }
-
-    public List<BackupInfo> getBackupInfo() {
-        return backupInfo;
-    }
-
-    public String getWebInterfaceUrl() {
-        int webPort = WEB_INTERFACE_PORT_DEFAULT;
-        for (Property p : asterixConfiguration.getProperty()) {
-            if (p.getName().equalsIgnoreCase("web.port")) {
-                webPort = Integer.parseInt(p.getValue());
-            }
-        }
-        return "http://" + cluster.getMasterNode().getClientIp() + ":" + webPort;
-    }
-
-    public void setAsterixRuntimeStates(AsterixRuntimeState runtimeState) {
-        this.runtimeState = runtimeState;
-    }
-
-    private void addDetailedInformation(StringBuilder buffer) {
-        buffer.append("Master node:" + cluster.getMasterNode().getId() + ":" + cluster.getMasterNode().getClusterIp()
-                + "\n");
-        for (Node node : cluster.getNode()) {
-            buffer.append(node.getId() + ":" + node.getClusterIp() + "\n");
-        }
-
-        if (backupInfo != null && backupInfo.size() > 0) {
-            for (BackupInfo info : backupInfo) {
-                buffer.append(info + "\n");
-            }
-        }
-        buffer.append("\n");
-        buffer.append("Asterix version:" + asterixVersion + "\n");
-        buffer.append("Metadata Node:" + metadataNodeId + "\n");
-        buffer.append("Processes" + "\n");
-        for (ProcessInfo pInfo : runtimeState.getProcesses()) {
-            buffer.append(pInfo + "\n");
-        }
-
-        buffer.append("\n");
-        buffer.append("Asterix Configuration\n");
-        int lenMax = 0;
-        for (Property property : asterixConfiguration.getProperty()) {
-            int nextLen = property.getName().length();
-            if (nextLen > lenMax) {
-                lenMax = nextLen;
-            }
-        }
-        for (Property property : asterixConfiguration.getProperty()) {
-            buffer.append(property.getName() + getIndentation(property.getName(), lenMax) + ":" + property.getValue()
-                    + "\n");
-        }
-
-    }
-
-    private String getIndentation(String name, int lenMax) {
-        int len = name.length();
-        StringBuilder buf = new StringBuilder();
-        for (int i = 0; i < lenMax - len; i++) {
-            buf.append(" ");
-        }
-        return buf.toString();
-    }
-
-    public State getPreviousState() {
-        return previousState;
-    }
-
-    public AsterixConfiguration getAsterixConfiguration() {
-        return asterixConfiguration;
-    }
-
-    public void setAsterixConfiguration(AsterixConfiguration asterixConfiguration) {
-        this.asterixConfiguration = asterixConfiguration;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixRuntimeState.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixRuntimeState.java
deleted file mode 100644
index a1c4418..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/AsterixRuntimeState.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.model;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class AsterixRuntimeState implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-    private final List<ProcessInfo> processes;
-    private final List<String> failedNCs;
-    private final boolean ccRunning;
-    private String summary;
-
-    public AsterixRuntimeState(List<ProcessInfo> processes, List<String> failedNCs, boolean ccRunning) {
-        this.processes = processes;
-        this.failedNCs = failedNCs;
-        this.ccRunning = ccRunning;
-    }
-
-    public List<ProcessInfo> getProcesses() {
-        return processes;
-    }
-
-    public List<String> getFailedNCs() {
-        return failedNCs;
-    }
-
-    public boolean isCcRunning() {
-        return ccRunning;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/BackupInfo.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/BackupInfo.java
deleted file mode 100644
index ae10cd7..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/BackupInfo.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.model;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import org.apache.asterix.installer.schema.conf.Backup;
-import org.apache.asterix.installer.schema.conf.Hdfs;
-
-public class BackupInfo implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public static enum BackupType {
-        LOCAL,
-        HDFS
-    };
-
-    private final int id;
-    private final Date date;
-    private final Backup backupConf;
-
-    public BackupInfo(int id, Date date, Backup backupConf) {
-        this.id = id;
-        this.date = date;
-        this.backupConf = backupConf;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    public Date getDate() {
-        return date;
-    }
-
-    public Backup getBackupConf() {
-        return backupConf;
-    }
-
-    @Override
-    public String toString() {
-        return id + " " + date + " " + "(" + getBackupType() + ")" + " " + "[ " + this.getBackupConf().getBackupDir()
-                + " ]";
-    }
-
-    public BackupType getBackupType() {
-        return getBackupType(this.getBackupConf());
-    }
-
-    public static BackupType getBackupType(Backup backupConf) {
-        Hdfs hdfs = backupConf.getHdfs();
-        return (hdfs != null && hdfs.getUrl() != null && hdfs.getUrl().length() > 0) ? BackupType.HDFS
-                : BackupType.LOCAL;
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/EventList.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/EventList.java
deleted file mode 100644
index dba84c6..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/EventList.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.model;
-
-public class EventList {
-
-    public enum EventType {
-        NODE_JOIN,
-        NODE_FAILURE,
-        CC_START,
-        CC_FAILURE,
-        BACKUP,
-        RESTORE,
-        FILE_DELETE,
-        HDFS_DELETE,
-        FILE_TRANSFER,
-        FILE_CREATE,
-        DIRECTORY_TRANSFER,
-        DIRECTORY_COPY,
-        NODE_INFO
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/ProcessInfo.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/ProcessInfo.java
deleted file mode 100644
index 9702ceb..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/model/ProcessInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.model;
-
-import java.io.Serializable;
-
-public class ProcessInfo implements Serializable {
-
-    private static final long serialVersionUID = 304186774065853730L;
-    private final String processName;
-    private final String host;
-    private final String nodeId;
-    private final int processId;
-
-    public ProcessInfo(String processName, String host, String nodeId, int processId) {
-        this.processName = processName;
-        this.host = host;
-        this.nodeId = nodeId;
-        this.processId = processId;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public String toString() {
-        return processName + " at " + nodeId + " [ " + processId + " ] ";
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventService.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventService.java
deleted file mode 100644
index f95b934..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.service;
-
-import java.io.File;
-import java.io.FileFilter;
-
-import org.apache.asterix.event.error.OutputHandler;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.installer.schema.conf.Configuration;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-
-public class AsterixEventService {
-
-    private static final Logger LOGGER = Logger.getLogger(AsterixEventService.class.getName());
-    private static Configuration configuration;
-    private static String asterixDir;
-    private static String asterixZip;
-    private static String eventHome;
-
-    public static void initialize(Configuration configuration, String asterixDir, String eventHome) throws Exception {
-        AsterixEventService.configuration = configuration;
-        AsterixEventService.asterixDir = asterixDir;
-        AsterixEventService.asterixZip = initBinary("asterix-server");
-        AsterixEventService.eventHome = eventHome;
-    }
-
-    public static AsterixEventServiceClient getAsterixEventServiceClient(Cluster cluster, boolean transferArtifacts,
-            boolean dryRun) throws Exception {
-        return new AsterixEventServiceClient(configuration, eventHome, cluster, transferArtifacts, dryRun,
-                OutputHandler.INSTANCE);
-    }
-
-    public static AsterixEventServiceClient getAsterixEventServiceClient(Cluster cluster) throws Exception {
-        return new AsterixEventServiceClient(configuration, eventHome, cluster, false, false, OutputHandler.INSTANCE);
-    }
-
-    private static String initBinary(final String fileNamePattern) {
-        File file = new File(asterixDir);
-        File[] zipFiles = file.listFiles(new FileFilter() {
-            public boolean accept(File arg0) {
-                return arg0.getAbsolutePath().contains(fileNamePattern) && arg0.isFile();
-            }
-        });
-        if (zipFiles.length == 0) {
-            String msg = " Binary not found at " + asterixDir;
-            LOGGER.log(Level.FATAL, msg);
-            throw new IllegalStateException(msg);
-        }
-        if (zipFiles.length > 1) {
-            String msg = " Multiple binaries found at " + asterixDir;
-            LOGGER.log(Level.FATAL, msg);
-            throw new IllegalStateException(msg);
-        }
-
-        return zipFiles[0].getAbsolutePath();
-    }
-
-    public static Configuration getConfiguration() {
-        return configuration;
-    }
-
-    public static String getAsterixZip() {
-        return asterixZip;
-    }
-
-    public static String getAsterixDir() {
-        return asterixDir;
-    }
-
-    public static String getEventHome() {
-        return eventHome;
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java
deleted file mode 100644
index b48e311..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/AsterixEventServiceUtil.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.service;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Coredump;
-import org.apache.asterix.common.configuration.Store;
-import org.apache.asterix.common.configuration.TransactionLogDir;
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.error.EventException;
-import org.apache.asterix.event.management.EventUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Env;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.cluster.Property;
-import org.apache.commons.io.IOUtils;
-
-public class AsterixEventServiceUtil {
-
-    public static final String TXN_LOG_DIR = "txnLogs";
-    public static final String ASTERIX_CONFIGURATION_FILE = "asterix-configuration.xml";
-    public static final String CLUSTER_CONFIGURATION_FILE = "cluster.xml";
-    public static final String EVENT_DIR = "events";
-    public static final int CLUSTER_NET_PORT_DEFAULT = 1098;
-    public static final int CLIENT_NET_PORT_DEFAULT = 1099;
-    public static final int HTTP_PORT_DEFAULT = 8888;
-    private static final String EMPTY_STRING = "";
-
-    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "managix-conf.xml";
-
-    private static final int BUFFER_SIZE = 4096;
-
-    public static AsterixInstance createAsterixInstance(String asterixInstanceName, Cluster cluster,
-            AsterixConfiguration asterixConfiguration) throws IOException {
-        Node metadataNode = getMetadataNode(asterixInstanceName, cluster);
-        String asterixZipName = asterixZipName();
-        String asterixVersion = asterixZipName.substring("asterix-server-".length(),
-                asterixZipName.indexOf("-binary-assembly"));
-        return new AsterixInstance(asterixInstanceName, cluster, asterixConfiguration,
-                metadataNode.getId(), asterixVersion);
-    }
-
-    public static void createAsterixZip(AsterixInstance asterixInstance)
-            throws IOException, InterruptedException, JAXBException, EventException {
-        String asterixInstanceDir = asterixInstanceDir(asterixInstance);
-        unzip(AsterixEventService.getAsterixZip(), asterixInstanceDir);
-
-        injectAsterixPropertyFile(asterixInstanceDir, asterixInstance);
-        injectAsterixClusterConfigurationFile(asterixInstanceDir, asterixInstance);
-
-        final String asterixZipPath = asterixInstanceDir + File.separator + asterixZipName();
-        zipDir(new File(asterixInstanceDir), new File(asterixZipPath));
-    }
-
-    public static void createClusterProperties(Cluster cluster, AsterixConfiguration asterixConfiguration) {
-
-        String ccJavaOpts = null;
-        String ncJavaOpts = null;
-        for (org.apache.asterix.common.configuration.Property property : asterixConfiguration.getProperty()) {
-            if (property.getName().equalsIgnoreCase(EventUtil.CC_JAVA_OPTS)) {
-                ccJavaOpts = property.getValue();
-            } else if (property.getName().equalsIgnoreCase(EventUtil.NC_JAVA_OPTS)) {
-                ncJavaOpts = property.getValue();
-            }
-        }
-
-        poulateClusterEnvironmentProperties(cluster, ccJavaOpts, ncJavaOpts);
-    }
-
-    public static void poulateClusterEnvironmentProperties(Cluster cluster, String ccJavaOpts, String ncJavaOpts) {
-        List<Property> clusterProperties = null;
-        if (cluster.getEnv() != null && cluster.getEnv().getProperty() != null) {
-            clusterProperties = cluster.getEnv().getProperty();
-            clusterProperties.clear();
-        } else {
-            clusterProperties = new ArrayList<Property>();
-        }
-
-        clusterProperties.add(new Property(EventUtil.CC_JAVA_OPTS, ccJavaOpts));
-        clusterProperties.add(new Property(EventUtil.NC_JAVA_OPTS, ncJavaOpts));
-        clusterProperties
-                .add(new Property("ASTERIX_HOME", cluster.getWorkingDir().getDir() + File.separator + "asterix"));
-        clusterProperties.add(new Property("LOG_DIR", cluster.getLogDir()));
-        clusterProperties.add(new Property("JAVA_HOME", cluster.getJavaHome()));
-        clusterProperties.add(new Property("WORKING_DIR", cluster.getWorkingDir().getDir()));
-        clusterProperties.add(new Property("CLIENT_NET_IP", cluster.getMasterNode().getClientIp()));
-        clusterProperties.add(new Property("CLUSTER_NET_IP", cluster.getMasterNode().getClusterIp()));
-
-        int clusterNetPort = cluster.getMasterNode().getClusterPort() != null
-                ? cluster.getMasterNode().getClusterPort().intValue() : CLUSTER_NET_PORT_DEFAULT;
-        int clientNetPort = cluster.getMasterNode().getClientPort() != null
-                ? cluster.getMasterNode().getClientPort().intValue() : CLIENT_NET_PORT_DEFAULT;
-        int httpPort = cluster.getMasterNode().getHttpPort() != null ? cluster.getMasterNode().getHttpPort().intValue()
-                : HTTP_PORT_DEFAULT;
-
-        clusterProperties.add(new Property("CLIENT_NET_PORT", "" + clientNetPort));
-        clusterProperties.add(new Property("CLUSTER_NET_PORT", "" + clusterNetPort));
-        clusterProperties.add(new Property("HTTP_PORT", "" + httpPort));
-
-        //pass Cluster optional parameters
-        if (cluster.getHeartbeatPeriod() != null) {
-            clusterProperties
-                    .add(new Property("HEARTBEAT_PERIOD", String.valueOf(cluster.getHeartbeatPeriod().intValue())));
-        }
-        if (cluster.getMaxHeartbeatLapsePeriods() != null) {
-            clusterProperties.add(new Property("MAX_HEARTBEAT_LAPSE_PERIODS",
-                    String.valueOf(cluster.getMaxHeartbeatLapsePeriods().intValue())));
-        }
-        if (cluster.getProfileDumpPeriod() != null) {
-            clusterProperties.add(
-                    new Property("PROFILE_DUMP_PERIOD", String.valueOf(cluster.getProfileDumpPeriod().intValue())));
-        }
-        if (cluster.getJobHistorySize() != null) {
-            clusterProperties
-                    .add(new Property("JOB_HISTORY_SIZE", String.valueOf(cluster.getJobHistorySize().intValue())));
-        }
-        if (cluster.getResultTimeToLive() != null) {
-            clusterProperties.add(
-                    new Property("RESULT_TIME_TO_LIVE", String.valueOf(cluster.getResultTimeToLive().longValue())));
-        }
-        if (cluster.getResultSweepThreshold() != null) {
-            clusterProperties.add(new Property("RESULT_SWEEP_THRESHOLD",
-                    String.valueOf(cluster.getResultSweepThreshold().longValue())));
-        }
-        if (cluster.getCcRoot() != null) {
-            clusterProperties.add(new Property("CC_ROOT", cluster.getCcRoot()));
-        }
-        cluster.setEnv(new Env(clusterProperties));
-    }
-
-    private static String asterixZipName() {
-        return AsterixEventService.getAsterixZip()
-                .substring(AsterixEventService.getAsterixZip().lastIndexOf(File.separator) + 1);
-    }
-
-    private static String asterixJarPath(AsterixInstance asterixInstance, String asterixInstanceDir) {
-        return asterixInstanceDir + File.separator + "repo" + File.separator + "asterix-app-"
-                + asterixInstance.getAsterixVersion() + ".jar";
-    }
-
-    private static String asterixInstanceDir(AsterixInstance asterixInstance) {
-        return AsterixEventService.getAsterixDir() + File.separator + asterixInstance.getName();
-    }
-
-    private static void injectAsterixPropertyFile(String asterixInstanceDir, AsterixInstance asterixInstance)
-            throws IOException, JAXBException {
-        writeAsterixConfigurationFile(asterixInstance);
-
-        File sourceJar = new File(asterixJarPath(asterixInstance, asterixInstanceDir));
-        File replacementFile = new File(asterixInstanceDir + File.separator + ASTERIX_CONFIGURATION_FILE);
-        replaceInJar(sourceJar, ASTERIX_CONFIGURATION_FILE, replacementFile);
-        new File(asterixInstanceDir + File.separator + ASTERIX_CONFIGURATION_FILE).delete();
-    }
-
-    private static void injectAsterixClusterConfigurationFile(String asterixInstanceDir,
-            AsterixInstance asterixInstance) throws IOException, EventException, JAXBException {
-        File sourceJar = new File(asterixJarPath(asterixInstance, asterixInstanceDir));
-        writeAsterixClusterConfigurationFile(asterixInstance);
-
-        File replacementFile = new File(asterixInstanceDir + File.separator + "cluster.xml");
-        replaceInJar(sourceJar, CLUSTER_CONFIGURATION_FILE, replacementFile);
-
-        new File(asterixInstanceDir + File.separator + CLUSTER_CONFIGURATION_FILE).delete();
-    }
-
-    private static void writeAsterixClusterConfigurationFile(AsterixInstance asterixInstance)
-            throws IOException, EventException, JAXBException {
-        String asterixInstanceName = asterixInstance.getName();
-        Cluster cluster = asterixInstance.getCluster();
-
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        marshaller.marshal(cluster, new FileOutputStream(AsterixEventService.getAsterixDir() + File.separator
-                + asterixInstanceName + File.separator + "cluster.xml"));
-    }
-
-    public static void addLibraryToAsterixZip(AsterixInstance asterixInstance, String dataverseName, String libraryName,
-            String libraryPath) throws IOException {
-        File instanceDir = new File(asterixInstanceDir(asterixInstance));
-        if (!instanceDir.exists()) {
-            instanceDir.mkdirs();
-        }
-        String asterixZipName = asterixZipName();
-
-        String sourceZip = instanceDir.getAbsolutePath() + File.separator + asterixZipName;
-        unzip(sourceZip, instanceDir.getAbsolutePath());
-        File libraryPathInZip = new File(instanceDir.getAbsolutePath() + File.separator + "external" + File.separator
-                + "library" + dataverseName + File.separator + "to-add" + File.separator + libraryName);
-        libraryPathInZip.mkdirs();
-        Runtime.getRuntime().exec("cp" + " " + libraryPath + " " + libraryPathInZip.getAbsolutePath());
-        Runtime.getRuntime().exec("rm " + sourceZip);
-        String destZip = AsterixEventService.getAsterixDir() + File.separator + asterixInstance.getName()
-                + File.separator + asterixZipName;
-        zipDir(instanceDir, new File(destZip));
-        Runtime.getRuntime().exec("mv" + " " + destZip + " " + sourceZip);
-    }
-
-    private static Node getMetadataNode(String asterixInstanceName, Cluster cluster) {
-        Node metadataNode = null;
-        if (cluster.getMetadataNode() != null) {
-            for (Node node : cluster.getNode()) {
-                if (node.getId().equals(cluster.getMetadataNode())) {
-                    metadataNode = node;
-                    break;
-                }
-            }
-        } else {
-            Random random = new Random();
-            int nNodes = cluster.getNode().size();
-            metadataNode = cluster.getNode().get(random.nextInt(nNodes));
-        }
-        return metadataNode;
-    }
-
-    private static void writeAsterixConfigurationFile(AsterixInstance asterixInstance)
-            throws IOException, JAXBException {
-        String asterixInstanceName = asterixInstance.getName();
-        Cluster cluster = asterixInstance.getCluster();
-        String metadataNodeId = asterixInstance.getMetadataNodeId();
-
-        AsterixConfiguration configuration = asterixInstance.getAsterixConfiguration();
-        configuration.setInstanceName(asterixInstanceName);
-        configuration.setMetadataNode(asterixInstanceName + "_" + metadataNodeId);
-        List<Store> stores = new ArrayList<Store>();
-        String storeDir = cluster.getStore().trim();
-        for (Node node : cluster.getNode()) {
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            String[] nodeIdDevice = iodevices.split(",");
-            StringBuilder nodeStores = new StringBuilder();
-            for (int i = 0; i < nodeIdDevice.length; i++) {
-                nodeStores.append(nodeIdDevice[i] + File.separator + storeDir + ",");
-            }
-            //remove last comma
-            nodeStores.deleteCharAt(nodeStores.length() - 1);
-            stores.add(new Store(asterixInstanceName + "_" + node.getId(), nodeStores.toString()));
-        }
-        configuration.setStore(stores);
-        List<Coredump> coredump = new ArrayList<Coredump>();
-        List<TransactionLogDir> txnLogDirs = new ArrayList<TransactionLogDir>();
-        for (Node node : cluster.getNode()) {
-            String coredumpdir = node.getLogDir() == null ? cluster.getLogDir() : node.getLogDir();
-            coredump.add(new Coredump(asterixInstanceName + "_" + node.getId(),
-                    coredumpdir + File.separator + asterixInstanceName + "_" + node.getId()));
-
-            String txnLogDir = node.getTxnLogDir() == null ? cluster.getTxnLogDir() : node.getTxnLogDir();
-            txnLogDirs.add(new TransactionLogDir(asterixInstanceName + "_" + node.getId(), txnLogDir));
-        }
-        configuration.setCoredump(coredump);
-        configuration.setTransactionLogDir(txnLogDirs);
-        File asterixConfDir = new File(AsterixEventService.getAsterixDir() + File.separator + asterixInstanceName);
-        asterixConfDir.mkdirs();
-
-        JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        FileOutputStream os = new FileOutputStream(asterixConfDir + File.separator + ASTERIX_CONFIGURATION_FILE);
-        marshaller.marshal(configuration, os);
-        os.close();
-    }
-
-    public static void unzip(String sourceFile, String destDir) throws IOException {
-        final FileInputStream fis = new FileInputStream(sourceFile);
-        final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
-        final File destDirFile = new File(destDir);
-        final byte [] data = new byte[BUFFER_SIZE];
-
-        ZipEntry entry;
-        Set<String> visitedDirs = new HashSet<>();
-        createDir(destDir);
-        while ((entry = zis.getNextEntry()) != null) {
-            createDir(destDirFile, entry, visitedDirs);
-            if (entry.isDirectory()) {
-                continue;
-            }
-            int count;
-
-            // write the file to the disk
-            File dst = new File(destDir, entry.getName());
-            FileOutputStream fos = new FileOutputStream(dst);
-            BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER_SIZE);
-            while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
-                dest.write(data, 0, count);
-            }
-            // close the output streams
-            dest.flush();
-            dest.close();
-        }
-
-        zis.close();
-    }
-
-    public static void zipDir(File sourceDir, File destFile) throws IOException {
-        FileOutputStream fos = new FileOutputStream(destFile);
-        ZipOutputStream zos = new ZipOutputStream(fos);
-        zipDir(EMPTY_STRING, sourceDir, destFile, zos);
-        zos.close();
-    }
-
-    private static void zipDir(String prefix, File sourceDir, final File destFile, ZipOutputStream zos)
-            throws IOException {
-        File[] dirList = sourceDir.listFiles(f->!f.getName().endsWith(destFile.getName()));
-        String newPrefix = prefix.equals(EMPTY_STRING) ? prefix : prefix + File.separator;
-        for (int i = 0; i < dirList.length; i++) {
-            File f = dirList[i];
-            if (f.isDirectory()) {
-                zipDir(newPrefix + f.getName(), f, destFile, zos);
-            } else {
-                int bytesIn = 0;
-                byte[] readBuffer = new byte[2156];
-                FileInputStream fis = new FileInputStream(f);
-                ZipEntry entry = new ZipEntry(newPrefix + f.getName());
-                zos.putNextEntry(entry);
-                while ((bytesIn = fis.read(readBuffer)) != -1) {
-                    zos.write(readBuffer, 0, bytesIn);
-                }
-                fis.close();
-            }
-        }
-    }
-
-    private static void replaceInJar(File sourceJar, String origFile, File replacementFile) throws IOException {
-        String srcJarAbsPath = sourceJar.getAbsolutePath();
-        String srcJarSuffix = srcJarAbsPath.substring(srcJarAbsPath.lastIndexOf(File.separator) + 1);
-        String srcJarName = srcJarSuffix.split(".jar")[0];
-
-        String destJarName = srcJarName + "-managix";
-        String destJarSuffix = destJarName + ".jar";
-        File destJar = new File(sourceJar.getParentFile().getAbsolutePath() + File.separator + destJarSuffix);
-        //  File destJar = new File(sourceJar.getAbsolutePath() + ".modified");
-        JarFile sourceJarFile = new JarFile(sourceJar);
-        Enumeration<JarEntry> entries = sourceJarFile.entries();
-        JarOutputStream jos = new JarOutputStream(new FileOutputStream(destJar));
-        byte[] buffer = new byte[2048];
-        int read;
-        while (entries.hasMoreElements()) {
-            JarEntry entry = (JarEntry) entries.nextElement();
-            String name = entry.getName();
-            if (name.equals(origFile)) {
-                continue;
-            }
-            InputStream jarIs = sourceJarFile.getInputStream(entry);
-            jos.putNextEntry(entry);
-            while ((read = jarIs.read(buffer)) != -1) {
-                jos.write(buffer, 0, read);
-            }
-            jarIs.close();
-        }
-        sourceJarFile.close();
-        JarEntry entry = new JarEntry(origFile);
-        jos.putNextEntry(entry);
-        FileInputStream fis = new FileInputStream(replacementFile);
-        while ((read = fis.read(buffer)) != -1) {
-            jos.write(buffer, 0, read);
-        }
-        fis.close();
-        jos.close();
-        sourceJar.delete();
-        destJar.renameTo(sourceJar);
-        destJar.setExecutable(true);
-    }
-
-    public static void dumpToFile(String dest, String content) throws IOException {
-        FileWriter writer = new FileWriter(dest);
-        writer.write(content);
-        writer.close();
-    }
-
-    private static void createDir(File destDirectory, ZipEntry entry, Set<String> visitedDirs) {
-        String name = entry.getName();
-        int index = name.lastIndexOf(File.separator);
-        if (index != -1) {
-            String dirSequence = name.substring(0, index);
-            if (visitedDirs.add(dirSequence)) {
-                File newDirs = new File(destDirectory, dirSequence);
-                newDirs.mkdirs();
-            }
-        }
-    }
-
-    private static void createDir(String destDirectory) {
-        File newDirs = new File(destDirectory + File.separator);
-        newDirs.mkdirs();
-    }
-
-    public static AsterixInstance validateAsterixInstanceExists(String name, State... permissibleStates)
-            throws Exception {
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(name);
-        if (instance == null) {
-            throw new EventException("Asterix instance by name " + name + " does not exist.");
-        }
-        boolean valid = false;
-        for (State state : permissibleStates) {
-            if (state.equals(instance.getState())) {
-                valid = true;
-                break;
-            }
-        }
-        if (!valid) {
-            throw new EventException(
-                    "Asterix instance by the name " + name + " is in " + instance.getState() + " state ");
-        }
-        return instance;
-    }
-
-    public static void validateAsterixInstanceNotExists(String name) throws Exception {
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(name);
-        if (instance != null) {
-            throw new EventException("Asterix instance by name " + name + " already exists.");
-        }
-    }
-
-    public static void evaluateConflictWithOtherInstances(AsterixInstance instance) throws Exception {
-        List<AsterixInstance> existingInstances = ServiceProvider.INSTANCE.getLookupService().getAsterixInstances();
-        List<String> usedIps = new ArrayList<String>();
-        String masterIp = instance.getCluster().getMasterNode().getClusterIp();
-        for (Node node : instance.getCluster().getNode()) {
-            usedIps.add(node.getClusterIp());
-        }
-        usedIps.add(instance.getCluster().getMasterNode().getClusterIp());
-        boolean conflictFound = false;
-        AsterixInstance conflictingInstance = null;
-        for (AsterixInstance existing : existingInstances) {
-            if (existing.getState().equals(State.INACTIVE)) {
-                continue;
-            }
-            InetAddress extantAddress = InetAddress.getByName(existing.getCluster().getMasterNode().getClusterIp());
-            InetAddress masterAddress = InetAddress.getByName(masterIp);
-            if (extantAddress.equals(masterAddress)) {
-                conflictingInstance = existing;
-                break;
-            }
-            for (Node n : existing.getCluster().getNode()) {
-                if (usedIps.contains(n.getClusterIp())) {
-                    conflictFound = true;
-                    conflictingInstance = existing;
-                    break;
-                }
-            }
-        }
-        if (conflictFound) {
-            throw new Exception("Cluster definition conflicts with an existing instance of Asterix: "
-                    + conflictingInstance.getName());
-        }
-    }
-
-    public static void deleteDirectory(String path) throws IOException {
-        Runtime.getRuntime().exec("rm -rf " + path);
-    }
-
-    public static String executeLocalScript(String path, List<String> args) throws Exception {
-        List<String> pargs = new ArrayList<String>();
-        pargs.add("/bin/bash");
-        pargs.add(path);
-        if (args != null) {
-            pargs.addAll(args);
-        }
-        ProcessBuilder pb = new ProcessBuilder(pargs);
-        pb.environment().putAll(EventDriver.getEnvironment());
-        pb.environment().put("IP_LOCATION", EventDriver.CLIENT_NODE.getClusterIp());
-        Process p = pb.start();
-        BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
-        StringWriter writer = new StringWriter();
-        IOUtils.copy(bis, writer, "UTF-8");
-        return writer.toString();
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ClusterStateWatcher.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ClusterStateWatcher.java
deleted file mode 100644
index c51e2cf..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ClusterStateWatcher.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.asterix.event.service;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.log4j.Logger;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.ZooKeeper;
-
-//A zookeeper watcher that watches the change in the state of the cluster
-public class ClusterStateWatcher implements Watcher {
-    private final Object mutex = new Object();
-    private final ZooKeeper zk;
-    private String clusterStatePath;
-    private boolean done = false;
-    private ClusterState clusterState = ClusterState.UNUSABLE;
-    private boolean failed = false;
-    private Exception failureCause = null;
-    private static Logger LOGGER = Logger.getLogger(ClusterStateWatcher.class.getName());
-
-    public ClusterStateWatcher(ZooKeeper zk, String clusterName) {
-        this.clusterStatePath = ZooKeeperService.ASTERIX_INSTANCE_BASE_PATH + File.separator + clusterName
-                + ZooKeeperService.ASTERIX_INSTANCE_STATE_PATH;
-        this.zk = zk;
-    }
-
-    public ClusterState waitForClusterStart() throws Exception {
-        while (true) {
-            synchronized (mutex) {
-                if (done) {
-                    if (failed) {
-                        LOGGER.error("An error took place in the startup sequence. Check the CC logs.");
-                        throw failureCause;
-                    } else {
-                        return clusterState;
-                    }
-                } else {
-                    mutex.wait();
-                }
-            }
-        }
-    }
-
-    private void monitorStateChange() {
-        try {
-            while (true) {
-                synchronized (mutex) {
-                    // Get the cluster state
-                    List<String> list = zk.getChildren(clusterStatePath, this);
-                    if (list.size() == 0) {
-                        // Cluster state not found, wait to be awaken by Zookeeper
-                        mutex.wait();
-                    } else {
-                        // Cluster state found
-                        byte[] b = zk.getData(clusterStatePath + ZooKeeperService.ASTERIX_INSTANCE_STATE_REPORT, false,
-                                null);
-                        zk.delete(clusterStatePath + ZooKeeperService.ASTERIX_INSTANCE_STATE_REPORT, 0);
-                        clusterState = ClusterState.values()[(int) b[0]];
-                        done = true;
-                        mutex.notifyAll();
-                        return;
-                    }
-                }
-            }
-        } catch (Exception e) {
-            // Exception was thrown, let Managix know that a failure took place
-            failed = true;
-            done = true;
-            failureCause = e;
-        }
-    }
-
-    public void startMonitoringThread() {
-        Runnable monitoringThread = new Runnable() {
-            @Override
-            public void run() {
-                monitorStateChange();
-            }
-        };
-        // Start the monitoring thread
-        (new Thread(monitoringThread)).start();
-    }
-
-    @Override
-    synchronized public void process(WatchedEvent event) {
-        synchronized (mutex) {
-            mutex.notifyAll();
-        }
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ILookupService.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ILookupService.java
deleted file mode 100644
index 34252e3..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ILookupService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.service;
-
-import java.util.List;
-
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.installer.schema.conf.Configuration;
-
-public interface ILookupService {
-
-    public void writeAsterixInstance(AsterixInstance asterixInstance) throws Exception;
-
-    public AsterixInstance getAsterixInstance(String name) throws Exception;
-
-    public boolean isRunning(Configuration conf) throws Exception;
-
-    public void startService(Configuration conf) throws Exception;
-
-    public void stopService(Configuration conf) throws Exception;
-
-    public boolean exists(String name) throws Exception;
-
-    public void removeAsterixInstance(String name) throws Exception;
-
-    public List<AsterixInstance> getAsterixInstances() throws Exception;
-
-    public void updateAsterixInstance(AsterixInstance updatedInstance) throws Exception;
-
-    public void reportClusterState(String instanceName, ClusterState active) throws Exception;
-
-    public ClusterStateWatcher startWatchingClusterState(String asterixInstanceName);
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ServiceProvider.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ServiceProvider.java
deleted file mode 100644
index ab421fd..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ServiceProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.service;
-
-public class ServiceProvider {
-
-    public static ServiceProvider INSTANCE = new ServiceProvider();
-    private static ILookupService lookupService = new ZooKeeperService();
-
-    private ServiceProvider() {
-    }
-
-    public ILookupService getLookupService() {
-        return lookupService;
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ZooKeeperService.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ZooKeeperService.java
deleted file mode 100644
index 5e102e7..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/service/ZooKeeperService.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.service;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.StringWriter;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.event.error.EventException;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.installer.schema.conf.Configuration;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.log4j.Logger;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.KeeperException;
-import org.apache.zookeeper.WatchedEvent;
-import org.apache.zookeeper.Watcher;
-import org.apache.zookeeper.Watcher.Event.KeeperState;
-import org.apache.zookeeper.ZooDefs.Ids;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.data.Stat;
-
-public class ZooKeeperService implements ILookupService {
-
-    private static final Logger LOGGER = Logger.getLogger(ZooKeeperService.class.getName());
-
-    private static final int ZOOKEEPER_LEADER_CONN_PORT = 2222;
-    private static final int ZOOKEEPER_LEADER_ELEC_PORT = 2223;
-    private static final int ZOOKEEPER_SESSION_TIME_OUT = 40 * 1000; //milliseconds
-    private static final String ZOOKEEPER_HOME = AsterixEventService.getEventHome() + File.separator + "zookeeper";
-    private static final String ZOO_KEEPER_CONFIG = ZOOKEEPER_HOME + File.separator + "zk.cfg";
-
-    private boolean isRunning = false;
-    private ZooKeeper zk;
-    private String zkConnectionString;
-    public static final String ASTERIX_INSTANCE_BASE_PATH = File.separator + "Asterix";
-    public static final String ASTERIX_INSTANCE_STATE_PATH = File.separator + "state";
-    public static final String ASTERIX_INSTANCE_STATE_REPORT = File.separator + "clusterState";
-    public static final int DEFAULT_NODE_VERSION = -1;
-    private LinkedBlockingQueue<String> msgQ = new LinkedBlockingQueue<String>();
-    private ZooKeeperWatcher watcher = new ZooKeeperWatcher(msgQ);
-
-    @Override
-    public boolean isRunning(Configuration conf) throws Exception {
-        List<String> servers = conf.getZookeeper().getServers().getServer();
-        int clientPort = conf.getZookeeper().getClientPort().intValue();
-        StringBuilder connectionString = new StringBuilder();
-        for (String serverAddress : servers) {
-            connectionString.append(serverAddress);
-            connectionString.append(":");
-            connectionString.append(clientPort);
-            connectionString.append(",");
-        }
-        if (connectionString.length() > 0) {
-            connectionString.deleteCharAt(connectionString.length() - 1);
-        }
-        zkConnectionString = connectionString.toString();
-
-        zk = new ZooKeeper(zkConnectionString, ZOOKEEPER_SESSION_TIME_OUT, watcher);
-        try {
-            zk.exists("/dummy", watcher);
-            if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug("ZooKeeper running at " + connectionString);
-            }
-            createRootIfNotExist();
-            isRunning = true;
-        } catch (KeeperException ke) {
-            isRunning = false;
-        }
-        return isRunning;
-    }
-
-    @Override
-    public void startService(Configuration conf) throws Exception {
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Starting ZooKeeper at " + zkConnectionString);
-        }
-        ZookeeperUtil.writeConfiguration(ZOO_KEEPER_CONFIG, conf, ZOOKEEPER_LEADER_CONN_PORT,
-                ZOOKEEPER_LEADER_ELEC_PORT);
-        String initScript = ZOOKEEPER_HOME + File.separator + "bin" + File.separator + "zk.init";
-        StringBuilder cmdBuffer = new StringBuilder();
-        cmdBuffer.append(initScript + " ");
-        cmdBuffer.append(conf.getZookeeper().getHomeDir() + " ");
-        cmdBuffer.append(conf.getZookeeper().getServers().getJavaHome() + " ");
-        List<String> zkServers = conf.getZookeeper().getServers().getServer();
-        for (String zkServer : zkServers) {
-            cmdBuffer.append(zkServer + " ");
-        }
-        //TODO: Create a better way to interact with zookeeper
-        Process zkProcess = Runtime.getRuntime().exec(cmdBuffer.toString());
-        int exitCode = zkProcess.waitFor();
-        Pair<CharSequence, CharSequence> outputs = getProcessStreams(zkProcess);
-        if (exitCode != 0) {
-            StringBuilder msg = new StringBuilder("Error starting zookeeper server; output code = ");
-            msg.append(exitCode);
-            appendNonEmptyStreams(outputs, msg);
-            throw new Exception(msg.toString());
-        }
-        zk = new ZooKeeper(zkConnectionString, ZOOKEEPER_SESSION_TIME_OUT, watcher);
-        String head = msgQ.poll(60, TimeUnit.SECONDS);
-        if (head == null) {
-            StringBuilder msg = new StringBuilder("Unable to start Zookeeper Service. This could be because of the"
-                    + " following reasons.\n1) Managix is incorrectly configured. Please run "
-                    + "managix validate to run a validation test and correct the errors reported.\n"
-                    + "2) If validation in (1) is successful, ensure that java_home parameter is set correctly"
-                    + " in Managix configuration (" + AsterixEventServiceUtil.MANAGIX_CONF_XML + ")");
-            appendNonEmptyStreams(outputs, msg);
-            throw new Exception(msg.toString());
-        }
-        msgQ.take();
-        createRootIfNotExist();
-    }
-
-    private void appendNonEmptyStreams(Pair<CharSequence, CharSequence> outputs, StringBuilder msg) {
-        appendIfNotEmpty(msg, outputs.getLeft(), "stdout");
-        appendIfNotEmpty(msg, outputs.getRight(), "stderr");
-    }
-
-    private Pair<CharSequence, CharSequence> getProcessStreams(Process process) throws IOException {
-        StringWriter stdout = new StringWriter();
-        StringWriter stderr = new StringWriter();
-        IOUtils.copy(process.getInputStream(), stdout, Charset.defaultCharset());
-        IOUtils.copy(process.getErrorStream(), stderr, Charset.defaultCharset());
-        return new ImmutablePair<>(stdout.getBuffer(), stderr.getBuffer());
-    }
-
-    private void appendIfNotEmpty(StringBuilder msg, CharSequence output, String outputName) {
-        if (output.length() > 0) {
-            msg.append(", ").append(outputName).append(" = ").append(output);
-        }
-    }
-
-    @Override
-    public void stopService(Configuration conf) throws Exception {
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Stopping ZooKeeper running at " + zkConnectionString);
-        }
-        String stopScript = ZOOKEEPER_HOME + File.separator + "bin" + File.separator + "stop_zk";
-        StringBuilder cmdBuffer = new StringBuilder();
-        cmdBuffer.append(stopScript + " ");
-        cmdBuffer.append(conf.getZookeeper().getHomeDir() + " ");
-        List<String> zkServers = conf.getZookeeper().getServers().getServer();
-        for (String zkServer : zkServers) {
-            cmdBuffer.append(zkServer + " ");
-        }
-        Runtime.getRuntime().exec(cmdBuffer.toString());
-        if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug("Stopped ZooKeeper service at " + zkConnectionString);
-        }
-    }
-
-    @Override
-    public void writeAsterixInstance(AsterixInstance asterixInstance) throws Exception {
-        String instanceBasePath = ASTERIX_INSTANCE_BASE_PATH + File.separator + asterixInstance.getName();
-        ByteArrayOutputStream b = new ByteArrayOutputStream();
-        ObjectOutputStream o = new ObjectOutputStream(b);
-        o.writeObject(asterixInstance);
-        zk.create(instanceBasePath, b.toByteArray(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-        // Create a place to put the state of the cluster in
-        String instanceStatePath = instanceBasePath + ASTERIX_INSTANCE_STATE_PATH;
-        zk.create(instanceStatePath, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-    }
-
-    private void createRootIfNotExist() throws Exception {
-        try {
-            Stat stat = zk.exists(ASTERIX_INSTANCE_BASE_PATH, false);
-            if (stat == null) {
-                zk.create(ASTERIX_INSTANCE_BASE_PATH, "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-            }
-        } catch (Exception e) {
-            // Is this the right way to handle the exception (try again? forever?)
-            LOGGER.error("An error took place when creating the root in Zookeeper");
-            e.printStackTrace();
-            createRootIfNotExist();
-        }
-    }
-
-    @Override
-    public AsterixInstance getAsterixInstance(String name) throws Exception {
-        String path = ASTERIX_INSTANCE_BASE_PATH + File.separator + name;
-        Stat stat = zk.exists(ASTERIX_INSTANCE_BASE_PATH + File.separator + name, false);
-        if (stat == null) {
-            return null;
-        }
-        byte[] asterixInstanceBytes = zk.getData(path, false, new Stat());
-        return readAsterixInstanceObject(asterixInstanceBytes);
-    }
-
-    @Override
-    public boolean exists(String path) throws Exception {
-        return zk.exists(ASTERIX_INSTANCE_BASE_PATH + File.separator + path, false) != null;
-    }
-
-    @Override
-    public void removeAsterixInstance(String name) throws Exception {
-        if (!exists(name)) {
-            throw new EventException("Asterix instance by name " + name + " does not exists.");
-        }
-        if (exists(name + ASTERIX_INSTANCE_STATE_PATH)) {
-            if (exists(name + ASTERIX_INSTANCE_STATE_PATH + File.separator + "clusterState")) {
-                zk.delete(ASTERIX_INSTANCE_BASE_PATH + File.separator + name + ASTERIX_INSTANCE_STATE_PATH
-                        + ASTERIX_INSTANCE_STATE_REPORT, DEFAULT_NODE_VERSION);
-            }
-            zk.delete(ASTERIX_INSTANCE_BASE_PATH + File.separator + name + ASTERIX_INSTANCE_STATE_PATH,
-                    DEFAULT_NODE_VERSION);
-        }
-        zk.delete(ASTERIX_INSTANCE_BASE_PATH + File.separator + name, DEFAULT_NODE_VERSION);
-    }
-
-    @Override
-    public List<AsterixInstance> getAsterixInstances() throws Exception {
-        List<String> instanceNames = zk.getChildren(ASTERIX_INSTANCE_BASE_PATH, false);
-        List<AsterixInstance> asterixInstances = new ArrayList<AsterixInstance>();
-        String path;
-        for (String instanceName : instanceNames) {
-            path = ASTERIX_INSTANCE_BASE_PATH + File.separator + instanceName;
-            byte[] asterixInstanceBytes = zk.getData(path, false, new Stat());
-            asterixInstances.add(readAsterixInstanceObject(asterixInstanceBytes));
-        }
-        return asterixInstances;
-    }
-
-    private AsterixInstance readAsterixInstanceObject(byte[] asterixInstanceBytes)
-            throws IOException, ClassNotFoundException {
-        ByteArrayInputStream b = new ByteArrayInputStream(asterixInstanceBytes);
-        ObjectInputStream ois = new ObjectInputStream(b);
-        return (AsterixInstance) ois.readObject();
-    }
-
-    @Override
-    public void updateAsterixInstance(AsterixInstance updatedInstance) throws Exception {
-        removeAsterixInstance(updatedInstance.getName());
-        writeAsterixInstance(updatedInstance);
-    }
-
-    @Override
-    public ClusterStateWatcher startWatchingClusterState(String instanceName) {
-        ClusterStateWatcher watcher = new ClusterStateWatcher(zk, instanceName);
-        watcher.startMonitoringThread();
-        return watcher;
-    }
-
-    @Override
-    public void reportClusterState(String instanceName, ClusterState state) throws Exception {
-        String clusterStatePath = ZooKeeperService.ASTERIX_INSTANCE_BASE_PATH + File.separator + instanceName
-                + ASTERIX_INSTANCE_STATE_PATH;
-        Integer value = state.ordinal();
-        byte[] stateValue = new byte[] { value.byteValue() };
-        // Create a place to put the state of the cluster in
-        zk.create(clusterStatePath + ASTERIX_INSTANCE_STATE_REPORT, stateValue, Ids.OPEN_ACL_UNSAFE,
-                CreateMode.PERSISTENT);
-        return;
-    }
-
-}
-
-class ZooKeeperWatcher implements Watcher {
-
-    private boolean isRunning = true;
-    private LinkedBlockingQueue<String> msgQ;
-
-    public ZooKeeperWatcher(LinkedBlockingQueue<String> msgQ) {
-        this.msgQ = msgQ;
-    }
-
-    @Override
-    public void process(WatchedEvent wEvent) {
-        if (wEvent.getState() == KeeperState.SyncConnected) {
-            msgQ.add("connected");
-        }
-    }
-
-    public boolean isRunning() {
-        return isRunning;
-    }
-
-}
-
-class ZookeeperUtil {
-
-    public static void writeConfiguration(String zooKeeperConfigPath, Configuration conf, int leaderConnPort,
-            int leaderElecPort) throws IOException {
-
-        StringBuilder buffer = new StringBuilder();
-        buffer.append("tickTime=1000" + "\n");
-        buffer.append("dataDir=" + conf.getZookeeper().getHomeDir() + File.separator + "data" + "\n");
-        buffer.append("clientPort=" + conf.getZookeeper().getClientPort().intValue() + "\n");
-        buffer.append("initLimit=" + 2 + "\n");
-        buffer.append("syncLimit=" + 2 + "\n");
-
-        List<String> servers = conf.getZookeeper().getServers().getServer();
-        int serverId = 1;
-        for (String server : servers) {
-            buffer.append(
-                    "server" + "." + serverId + "=" + server + ":" + leaderConnPort + ":" + leaderElecPort + "\n");
-            serverId++;
-        }
-        AsterixEventServiceUtil.dumpToFile(zooKeeperConfigPath, buffer.toString());
-    }
-
-}
diff --git a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java b/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
deleted file mode 100644
index 71cef80..0000000
--- a/asterixdb/asterix-events/src/main/java/org/apache/asterix/event/util/PatternCreator.java
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.event.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.common.utils.StorageConstants;
-import org.apache.asterix.event.driver.EventDriver;
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.BackupInfo;
-import org.apache.asterix.event.model.BackupInfo.BackupType;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.pattern.Delay;
-import org.apache.asterix.event.schema.pattern.Event;
-import org.apache.asterix.event.schema.pattern.Nodeid;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.schema.pattern.Value;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.installer.schema.conf.Backup;
-
-public class PatternCreator {
-
-    public static final PatternCreator INSTANCE = new PatternCreator();
-
-    private PatternCreator() {
-    }
-
-    private void addInitialDelay(Pattern p, int delay, String unit) {
-        Delay d = new Delay(new Value(null, Integer.toString(delay)), unit);
-        p.setDelay(d);
-    }
-
-    public Patterns getAsterixBinaryTransferPattern(String asterixInstanceName, Cluster cluster) throws Exception {
-        String ccLocationIp = cluster.getMasterNode().getClusterIp();
-        String destDir = cluster.getWorkingDir().getDir() + File.separator + "asterix";
-        List<Pattern> ps = new ArrayList<>();
-
-        Pattern copyHyracks = createCopyHyracksPattern(asterixInstanceName, cluster, ccLocationIp, destDir);
-        ps.add(copyHyracks);
-
-        boolean copyHyracksToNC = !cluster.getWorkingDir().isNFS();
-
-        for (Node node : cluster.getNode()) {
-            if (copyHyracksToNC) {
-                Pattern copyHyracksForNC =
-                        createCopyHyracksPattern(asterixInstanceName, cluster, node.getClusterIp(), destDir);
-                ps.add(copyHyracksForNC);
-            }
-        }
-        ps.addAll(createHadoopLibraryTransferPattern(cluster).getPattern());
-        return new Patterns(ps);
-    }
-
-    public Patterns getStartAsterixPattern(String asterixInstanceName, Cluster cluster, boolean createCommand)
-            throws Exception {
-        String ccLocationId = cluster.getMasterNode().getId();
-        List<Pattern> ps = new ArrayList<>();
-
-        Pattern createCC = createCCStartPattern(ccLocationId);
-        addInitialDelay(createCC, 3, "sec");
-        ps.add(createCC);
-
-        for (Node node : cluster.getNode()) {
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            Pattern createNC = createNCStartPattern(cluster.getMasterNode().getClusterIp(), node.getId(),
-                    asterixInstanceName + "_" + node.getId(), iodevices, createCommand);
-            addInitialDelay(createNC, 5, "sec");
-            ps.add(createNC);
-        }
-
-        return new Patterns(ps);
-    }
-
-    public Patterns getBackUpAsterixPattern(AsterixInstance instance, Backup backupConf) throws Exception {
-        BackupType backupType = BackupInfo.getBackupType(backupConf);
-        Patterns patterns = null;
-        switch (backupType) {
-            case HDFS:
-                patterns = getHDFSBackUpAsterixPattern(instance, backupConf);
-                break;
-            case LOCAL:
-                patterns = getLocalBackUpAsterixPattern(instance, backupConf);
-                break;
-        }
-        return patterns;
-    }
-
-    public Patterns getRestoreAsterixPattern(AsterixInstance instance, BackupInfo backupInfo) throws Exception {
-        BackupType backupType = backupInfo.getBackupType();
-        Patterns patterns = null;
-        switch (backupType) {
-            case HDFS:
-                patterns = getHDFSRestoreAsterixPattern(instance, backupInfo);
-                break;
-            case LOCAL:
-                patterns = getLocalRestoreAsterixPattern(instance, backupInfo);
-                break;
-        }
-        return patterns;
-    }
-
-    private Patterns getHDFSBackUpAsterixPattern(AsterixInstance instance, Backup backupConf) throws Exception {
-        Cluster cluster = instance.getCluster();
-        String hdfsUrl = backupConf.getHdfs().getUrl();
-        String hadoopVersion = backupConf.getHdfs().getVersion();
-        String hdfsBackupDir = backupConf.getBackupDir();
-        VerificationUtil.verifyBackupRestoreConfiguration(hdfsUrl, hadoopVersion, hdfsBackupDir);
-        String workingDir = cluster.getWorkingDir().getDir();
-        String backupId = Integer.toString(instance.getBackupInfo().size());
-        String store;
-        String pargs;
-        String iodevices;
-        store = cluster.getStore();
-        List<Pattern> patternList = new ArrayList<>();
-        for (Node node : cluster.getNode()) {
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            iodevices = node.getIodevices() == null ? instance.getCluster().getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + hdfsBackupDir + " " + "hdfs" + " " + node.getId() + " " + hdfsUrl + " "
-                    + hadoopVersion;
-            Event event = new Event("backup", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-        return new Patterns(patternList);
-    }
-
-    private Patterns getLocalBackUpAsterixPattern(AsterixInstance instance, Backup backupConf) throws Exception {
-        Cluster cluster = instance.getCluster();
-        String backupDir = backupConf.getBackupDir();
-        String workingDir = cluster.getWorkingDir().getDir();
-        String backupId = Integer.toString(instance.getBackupInfo().size());
-        String iodevices;
-        String txnLogDir;
-        String store;
-        String pargs;
-        store = cluster.getStore();
-        List<Pattern> patternList = new ArrayList<>();
-        for (Node node : cluster.getNode()) {
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            iodevices = node.getIodevices() == null ? instance.getCluster().getIodevices() : node.getIodevices();
-            txnLogDir = node.getTxnLogDir() == null ? instance.getCluster().getTxnLogDir() : node.getTxnLogDir();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + store + " "
-                    + StorageConstants.METADATA_ROOT + " " + txnLogDir + " " + backupId + " " + backupDir
-                    + " " + "local" + " " + node.getId();
-            Event event = new Event("backup", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns getHDFSRestoreAsterixPattern(AsterixInstance instance, BackupInfo backupInfo) throws Exception {
-        Cluster cluster = instance.getCluster();
-        String clusterStore = instance.getCluster().getStore();
-        String hdfsUrl = backupInfo.getBackupConf().getHdfs().getUrl();
-        String hadoopVersion = backupInfo.getBackupConf().getHdfs().getVersion();
-        String hdfsBackupDir = backupInfo.getBackupConf().getBackupDir();
-        VerificationUtil.verifyBackupRestoreConfiguration(hdfsUrl, hadoopVersion, hdfsBackupDir);
-        String workingDir = cluster.getWorkingDir().getDir();
-        int backupId = backupInfo.getId();
-        String pargs;
-        List<Pattern> patternList = new ArrayList<>();
-        for (Node node : cluster.getNode()) {
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + " " + hdfsBackupDir + " " + "hdfs" + " " + node.getId() + " " + hdfsUrl + " "
-                    + hadoopVersion;
-            Event event = new Event("restore", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns getLocalRestoreAsterixPattern(AsterixInstance instance, BackupInfo backupInfo) throws Exception {
-        Cluster cluster = instance.getCluster();
-        String clusterStore = instance.getCluster().getStore();
-        String backupDir = backupInfo.getBackupConf().getBackupDir();
-        String workingDir = cluster.getWorkingDir().getDir();
-        int backupId = backupInfo.getId();
-        String pargs;
-        List<Pattern> patternList = new ArrayList<>();
-        for (Node node : cluster.getNode()) {
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            pargs = workingDir + " " + instance.getName() + " " + iodevices + " " + clusterStore + " "
-                    + StorageConstants.METADATA_ROOT + " " + AsterixEventServiceUtil.TXN_LOG_DIR + " "
-                    + backupId + " " + backupDir + " " + "local" + " " + node.getId();
-            Event event = new Event("restore", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns createHadoopLibraryTransferPattern(Cluster cluster) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        String workingDir = cluster.getWorkingDir().getDir();
-        String hadoopVersion = AsterixEventService.getConfiguration().getBackup().getHdfs().getVersion();
-        File hadoopDir = new File(AsterixEventService.getEventHome() + File.separator + "hadoop-" + hadoopVersion);
-        if (!hadoopDir.exists()) {
-            throw new IllegalStateException("Hadoop version :" + hadoopVersion + " not supported");
-        }
-
-        Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-        String username = cluster.getUsername() != null ? cluster.getUsername() : System.getProperty("user.name");
-        String pargs = username + " " + hadoopDir.getAbsolutePath() + " " + cluster.getMasterNode().getClusterIp() + " "
-                + workingDir;
-        Event event = new Event("directory_transfer", nodeid, pargs);
-        Pattern p = new Pattern(null, 1, null, event);
-        addInitialDelay(p, 2, "sec");
-        patternList.add(p);
-
-        boolean copyToNC = !cluster.getWorkingDir().isNFS();
-        if (copyToNC) {
-            for (Node node : cluster.getNode()) {
-                nodeid = new Nodeid(new Value(null, node.getId()));
-                pargs = cluster.getUsername() + " " + hadoopDir.getAbsolutePath() + " " + node.getClusterIp() + " "
-                        + workingDir;
-                event = new Event("directory_transfer", nodeid, pargs);
-                p = new Pattern(null, 1, null, event);
-                addInitialDelay(p, 2, "sec");
-                patternList.add(p);
-            }
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns createDeleteInstancePattern(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        patternList.addAll(createRemoveAsterixStoragePattern(instance).getPattern());
-        if (instance.getBackupInfo() != null && !instance.getBackupInfo().isEmpty()) {
-            List<BackupInfo> backups = instance.getBackupInfo();
-            Set<String> removedBackupDirsHDFS = new HashSet<>();
-            Set<String> removedBackupDirsLocal = new HashSet<>();
-
-            String backupDir;
-            for (BackupInfo binfo : backups) {
-                backupDir = binfo.getBackupConf().getBackupDir();
-                switch (binfo.getBackupType()) {
-                    case HDFS:
-                        if (removedBackupDirsHDFS.contains(backupDir)) {
-                            continue;
-                        }
-                        patternList.addAll(createRemoveHDFSBackupPattern(instance, backupDir).getPattern());
-                        removedBackupDirsHDFS.add(backupDir);
-                        break;
-
-                    case LOCAL:
-                        if (removedBackupDirsLocal.contains(backupDir)) {
-                            continue;
-                        }
-                        patternList.addAll(createRemoveLocalBackupPattern(instance, backupDir).getPattern());
-                        removedBackupDirsLocal.add(backupDir);
-                        break;
-                }
-
-            }
-        }
-        patternList.addAll(createRemoveAsterixLogDirPattern(instance).getPattern());
-        patternList.addAll(createRemoveAsterixRootMetadata(instance).getPattern());
-        patternList.addAll(createRemoveAsterixTxnLogs(instance).getPattern());
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveAsterixTxnLogs(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        Nodeid nodeid;
-        Event event;
-        for (Node node : cluster.getNode()) {
-            String txnLogDir = node.getTxnLogDir() == null ? cluster.getTxnLogDir() : node.getTxnLogDir();
-            nodeid = new Nodeid(new Value(null, node.getId()));
-            event = new Event("file_delete", nodeid, txnLogDir);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveHDFSBackupPattern(AsterixInstance instance, String hdfsBackupDir) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        String hdfsUrl = AsterixEventService.getConfiguration().getBackup().getHdfs().getUrl();
-        String hadoopVersion = AsterixEventService.getConfiguration().getBackup().getHdfs().getVersion();
-        String workingDir = cluster.getWorkingDir().getDir();
-        Node launchingNode = cluster.getNode().get(0);
-        Nodeid nodeid = new Nodeid(new Value(null, launchingNode.getId()));
-        String pathToDelete = hdfsBackupDir + File.separator + instance.getName();
-        String pargs = workingDir + " " + hadoopVersion + " " + hdfsUrl + " " + pathToDelete;
-        Event event = new Event("hdfs_delete", nodeid, pargs);
-        patternList.add(new Pattern(null, 1, null, event));
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveLocalBackupPattern(AsterixInstance instance, String localBackupDir) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-
-        String pathToDelete = localBackupDir + File.separator + instance.getName();
-        String pargs = pathToDelete;
-        List<String> removedBackupDirs = new ArrayList<>();
-        for (Node node : cluster.getNode()) {
-            if (removedBackupDirs.contains(node.getClusterIp())) {
-                continue;
-            }
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            Event event = new Event("file_delete", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-            removedBackupDirs.add(node.getClusterIp());
-        }
-
-        return new Patterns(patternList);
-    }
-
-    public Patterns createRemoveAsterixWorkingDirPattern(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        String workingDir = cluster.getWorkingDir().getDir();
-        String pargs = workingDir;
-        Nodeid nodeid = new Nodeid(new Value(null, cluster.getMasterNode().getId()));
-        Event event = new Event("file_delete", nodeid, pargs);
-        patternList.add(new Pattern(null, 1, null, event));
-
-        if (!cluster.getWorkingDir().isNFS()) {
-            for (Node node : cluster.getNode()) {
-                nodeid = new Nodeid(new Value(null, node.getId()));
-                event = new Event("file_delete", nodeid, pargs);
-                patternList.add(new Pattern(null, 1, null, event));
-            }
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns getLibraryInstallPattern(AsterixInstance instance, String dataverse, String libraryName,
-            String libraryPath) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-        String username = cluster.getUsername() != null ? cluster.getUsername() : System.getProperty("user.name");
-        String workingDir = cluster.getWorkingDir().getDir();
-        String destDir =
-                workingDir + File.separator + "library" + File.separator + dataverse + File.separator + libraryName;
-        String fileToTransfer = new File(libraryPath).getAbsolutePath();
-
-        Iterator<Node> installTargets = cluster.getNode().iterator();
-        Node installNode = installTargets.next();
-        String destinationIp = installNode.getClusterIp();
-        String pargs = username + " " + fileToTransfer + " " + destinationIp + " " + destDir + " " + "unpack";
-        Event event = new Event("file_transfer", nodeid, pargs);
-        Pattern p = new Pattern(null, 1, null, event);
-        patternList.add(p);
-
-        if (!cluster.getWorkingDir().isNFS()) {
-            while (installTargets.hasNext()) {
-                Node node = installTargets.next();
-                pargs = username + " " + fileToTransfer + " " + node.getClusterIp() + " " + destDir + " " + "unpack";
-                event = new Event("file_transfer", nodeid, pargs);
-                p = new Pattern(null, 1, null, event);
-                patternList.add(p);
-            }
-
-            pargs = username + " " + fileToTransfer + " " + cluster.getMasterNode().getClusterIp() + " " + destDir + " "
-                    + "unpack";
-            event = new Event("file_transfer", nodeid, pargs);
-            p = new Pattern(null, 1, null, event);
-            patternList.add(p);
-        }
-        return new Patterns(patternList);
-    }
-
-    public Patterns getLibraryUninstallPattern(AsterixInstance instance, String dataverse, String libraryName)
-            throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        String workingDir = cluster.getWorkingDir().getDir();
-        String destFile = dataverse + "." + libraryName;
-        String pargs = workingDir + File.separator + "uninstall" + " " + destFile;
-
-        String metadataNodeId = instance.getMetadataNodeId();
-        Nodeid nodeid = new Nodeid(new Value(null, metadataNodeId));
-        Event event = new Event("file_create", nodeid, pargs);
-        Pattern p = new Pattern(null, 1, null, event);
-        patternList.add(p);
-
-        Iterator<Node> uninstallTargets = cluster.getNode().iterator();
-        String libDir =
-                workingDir + File.separator + "library" + File.separator + dataverse + File.separator + libraryName;
-        Node uninstallNode = uninstallTargets.next();
-        nodeid = new Nodeid(new Value(null, uninstallNode.getId()));
-        event = new Event("file_delete", nodeid, libDir);
-        p = new Pattern(null, 1, null, event);
-        patternList.add(p);
-        pargs = libDir;
-
-        if (!cluster.getWorkingDir().isNFS()) {
-            while (uninstallTargets.hasNext()) {
-                uninstallNode = uninstallTargets.next();
-                nodeid = new Nodeid(new Value(null, uninstallNode.getId()));
-                event = new Event("file_delete", nodeid, pargs);
-                p = new Pattern(null, 1, null, event);
-                patternList.add(p);
-            }
-
-            nodeid = new Nodeid(new Value(null, cluster.getMasterNode().getId()));
-            event = new Event("file_delete", nodeid, pargs);
-            p = new Pattern(null, 1, null, event);
-            patternList.add(p);
-
-        }
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveAsterixRootMetadata(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        Nodeid nodeid;
-        String pargs;
-        Event event;
-        for (Node node : cluster.getNode()) {
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            String primaryIODevice = iodevices.split(",")[0].trim();
-            pargs = primaryIODevice + File.separator + StorageConstants.METADATA_ROOT;
-            nodeid = new Nodeid(new Value(null, node.getId()));
-            event = new Event("file_delete", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveAsterixLogDirPattern(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        String pargs = instance.getCluster().getLogDir();
-        Nodeid nodeid = new Nodeid(new Value(null, cluster.getMasterNode().getId()));
-        Event event = new Event("file_delete", nodeid, pargs);
-        patternList.add(new Pattern(null, 1, null, event));
-
-        for (Node node : cluster.getNode()) {
-            nodeid = new Nodeid(new Value(null, node.getId()));
-            if (node.getLogDir() != null) {
-                pargs = node.getLogDir();
-            }
-            event = new Event("file_delete", nodeid, pargs);
-            patternList.add(new Pattern(null, 1, null, event));
-        }
-
-        return new Patterns(patternList);
-    }
-
-    private Patterns createRemoveAsterixStoragePattern(AsterixInstance instance) throws Exception {
-        List<Pattern> patternList = new ArrayList<>();
-        Cluster cluster = instance.getCluster();
-        String pargs;
-
-        for (Node node : cluster.getNode()) {
-            Nodeid nodeid = new Nodeid(new Value(null, node.getId()));
-            String[] nodeIODevices;
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            nodeIODevices = iodevices.trim().split(",");
-            String nodeStore = cluster.getStore().trim();
-            for (String nodeIODevice : nodeIODevices) {
-                pargs = nodeIODevice.trim() + File.separator + nodeStore;
-                Event event = new Event("file_delete", nodeid, pargs);
-                patternList.add(new Pattern(null, 1, null, event));
-            }
-        }
-        return new Patterns(patternList);
-    }
-
-    private Pattern createCopyHyracksPattern(String instanceName, Cluster cluster, String destinationIp,
-            String destDir) {
-        Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-        String username = cluster.getUsername() != null ? cluster.getUsername() : System.getProperty("user.name");
-        String asterixZipName = AsterixEventService.getAsterixZip()
-                .substring(AsterixEventService.getAsterixZip().lastIndexOf(File.separator) + 1);
-        String fileToTransfer = new File(
-                AsterixEventService.getAsterixDir() + File.separator + instanceName + File.separator + asterixZipName)
-                        .getAbsolutePath();
-        String pargs = username + " " + fileToTransfer + " " + destinationIp + " " + destDir + " " + "unpack";
-        Event event = new Event("file_transfer", nodeid, pargs);
-        return new Pattern(null, 1, null, event);
-    }
-
-    private Pattern createCCStartPattern(String hostId) {
-        Nodeid nodeid = new Nodeid(new Value(null, hostId));
-        Event event = new Event("cc_start", nodeid, "");
-        return new Pattern(null, 1, null, event);
-    }
-
-    public Pattern createCCStopPattern(String hostId) {
-        Nodeid nodeid = new Nodeid(new Value(null, hostId));
-        Event event = new Event("cc_failure", nodeid, null);
-        return new Pattern(null, 1, null, event);
-    }
-
-    public Pattern createNCStartPattern(String ccHost, String hostId, String nodeControllerId, String iodevices,
-            boolean isInitialRun) {
-        Nodeid nodeid = new Nodeid(new Value(null, hostId));
-        String pargs = ccHost + " " + nodeControllerId + " " + iodevices;
-        if (isInitialRun) {
-            pargs += " " + "-initial-run";
-        }
-        Event event = new Event("node_join", nodeid, pargs);
-        return new Pattern(null, 1, null, event);
-    }
-
-    public Pattern createNCStopPattern(String hostId, String nodeControllerId) {
-        Nodeid nodeid = new Nodeid(new Value(null, hostId));
-        Event event = new Event("node_failure", nodeid, nodeControllerId);
-        return new Pattern(null, 1, null, event);
-    }
-
-    public Patterns createPrepareNodePattern(String instanceName, Cluster cluster, Node nodeToBeAdded) {
-        List<Pattern> ps = new ArrayList<>();
-        boolean workingDirOnNFS = cluster.getWorkingDir().isNFS();
-        if (!workingDirOnNFS) {
-            String ccLocationIp = cluster.getMasterNode().getClusterIp();
-            String destDir = cluster.getWorkingDir().getDir() + File.separator + "asterix";
-            Pattern copyHyracks = createCopyHyracksPattern(instanceName, cluster, ccLocationIp, destDir);
-            ps.add(copyHyracks);
-
-            String workingDir = cluster.getWorkingDir().getDir();
-            String hadoopVersion = AsterixEventService.getConfiguration().getBackup().getHdfs().getVersion();
-            File hadoopDir = new File(AsterixEventService.getEventHome() + File.separator + "hadoop-" + hadoopVersion);
-            if (!hadoopDir.exists()) {
-                throw new IllegalStateException("Hadoop version :" + hadoopVersion + " not supported");
-            }
-
-            Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-            String username = cluster.getUsername() != null ? cluster.getUsername() : System.getProperty("user.name");
-            String pargs = username + " " + hadoopDir.getAbsolutePath() + " " + cluster.getMasterNode().getClusterIp()
-                    + " " + workingDir;
-            Event event = new Event("directory_transfer", nodeid, pargs);
-            Pattern p = new Pattern(null, 1, null, event);
-            addInitialDelay(p, 2, "sec");
-            ps.add(p);
-
-            nodeid = new Nodeid(new Value(null, nodeToBeAdded.getId()));
-            pargs = cluster.getUsername() + " " + hadoopDir.getAbsolutePath() + " " + nodeToBeAdded.getClusterIp() + " "
-                    + workingDir;
-            event = new Event("directory_transfer", nodeid, pargs);
-            p = new Pattern(null, 1, null, event);
-            addInitialDelay(p, 2, "sec");
-            ps.add(p);
-        }
-
-        return new Patterns(ps);
-    }
-
-    public Patterns getGenerateLogPattern(Cluster cluster, String outputDir) {
-        List<Pattern> patternList = new ArrayList<>();
-        Map<String, String> nodeLogs = new HashMap<>();
-
-        String username = cluster.getUsername() == null ? System.getProperty("user.name") : cluster.getUsername();
-        String srcHost = cluster.getMasterNode().getClientIp();
-        Nodeid nodeid = new Nodeid(new Value(null, EventDriver.CLIENT_NODE.getId()));
-        String srcDir =
-                cluster.getMasterNode().getLogDir() == null ? cluster.getLogDir() : cluster.getMasterNode().getLogDir();
-        String destDir = outputDir + File.separator + "cc";
-        String pargs = username + " " + srcHost + " " + srcDir + " " + destDir;
-        Event event = new Event("directory_copy", nodeid, pargs);
-        Pattern p = new Pattern(null, 1, null, event);
-        patternList.add(p);
-        nodeLogs.put(cluster.getMasterNode().getClusterIp(), srcDir);
-        for (Node node : cluster.getNode()) {
-            srcHost = node.getClusterIp();
-            srcDir = node.getLogDir() == null ? cluster.getLogDir() : node.getLogDir();
-            if (nodeLogs.get(node.getClusterIp()) != null && nodeLogs.get(node.getClusterIp()).equals(srcDir)) {
-                continue;
-            }
-            destDir = outputDir + File.separator + node.getId();
-            pargs = username + " " + srcHost + " " + srcDir + " " + destDir;
-            event = new Event("directory_copy", nodeid, pargs);
-            p = new Pattern(null, 1, null, event);
-            patternList.add(p);
-        }
-        return new Patterns(patternList);
-    }
-}
diff --git a/asterixdb/asterix-events/src/main/resources/events/backup/backup.sh b/asterixdb/asterix-events/src/main/resources/events/backup/backup.sh
deleted file mode 100755
index 155cb86..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/backup/backup.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-WORKING_DIR=$1
-ASTERIX_INSTANCE_NAME=$2
-ASTERIX_IODEVICES=$3
-NODE_STORE=$4
-ASTERIX_ROOT_METADATA_DIR=$5
-TXN_LOG_DIR=$6
-BACKUP_ID=$7
-BACKUP_DIR=$8
-BACKUP_TYPE=$9
-NODE_ID=${10}
-
-nodeIODevices=$(echo $ASTERIX_IODEVICES | tr "," "\n")
-
-if [ $BACKUP_TYPE == "hdfs" ];
-then
-  HDFS_URL=${11}
-  HADOOP_VERSION=${12}
-  export HADOOP_HOME=$WORKING_DIR/hadoop-$HADOOP_VERSION
-  index=1
-  for nodeIODevice in $nodeIODevices
-  do
-    STORE_DIR=$nodeIODevice/$NODE_STORE
-    NODE_BACKUP_DIR=$BACKUP_DIR/$ASTERIX_INSTANCE_NAME/$BACKUP_ID/$NODE_ID/
-   
-    # make the destination directory 
-    $HADOOP_HOME/bin/hadoop fs -mkdir $STORE_DIR $HDFS_URL/$NODE_BACKUP_DIR
-
-    # copy store directory
-    $HADOOP_HOME/bin/hadoop fs -copyFromLocal $STORE_DIR $HDFS_URL/$NODE_BACKUP_DIR/
-
-    # copy asterix root metadata directory and log directory from the primary(first) iodevice
-    if [ $index -eq 1 ];
-    then
-      # copy asterix root metadata directory
-      $HADOOP_HOME/bin/hadoop fs -copyFromLocal $nodeIODevice/$ASTERIX_ROOT_METADATA_DIR $HDFS_URL/$NODE_BACKUP_DIR/
-
-      # copy log directory 
-      $HADOOP_HOME/bin/hadoop fs -copyFromLocal $TXN_LOG_DIR $HDFS_URL/$NODE_BACKUP_DIR/
-    fi
-
-    index=`expr $index + 1`
-  done
-else 
-  index=1
-  for nodeIODevice in $nodeIODevices
-  do
-    STORE_DIR=$nodeIODevice/$NODE_STORE
-    NODE_BACKUP_DIR=$BACKUP_DIR/$ASTERIX_INSTANCE_NAME/$BACKUP_ID/$NODE_ID
-
-    # create the backup directory, if it does not exists
-    if [ ! -d $NODE_BACKUP_DIR ];
-    then
-      mkdir -p $NODE_BACKUP_DIR
-    fi
-
-    # copy store directory
-    cp -r $STORE_DIR $NODE_BACKUP_DIR/
-
-    # copy asterix root metadata directory and log directory from the primary(first) iodevice
-    if [ $index -eq 1 ];
-    then
-      cp -r $nodeIODevice/$ASTERIX_ROOT_METADATA_DIR  $NODE_BACKUP_DIR/
-
-      # copy log directory
-      cp -r $TXN_LOG_DIR $NODE_BACKUP_DIR/
-    fi
-
-    index=`expr $index + 1`
-  done
-fi
diff --git a/asterixdb/asterix-events/src/main/resources/events/cc_failure/cc_failure.sh b/asterixdb/asterix-events/src/main/resources/events/cc_failure/cc_failure.sh
deleted file mode 100755
index e8bc326..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/cc_failure/cc_failure.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-CC_PARENT_ID=`ps -ef  | grep asterix | grep cc_start | grep -v ssh | awk '{ print $2 }'`
-CC_ID=`ps -ef | grep asterix | grep $CC_PARENT_ID | grep -v bash | awk "\\\$3 == $CC_PARENT_ID { print \\\$2 }"`
-kill -9 $CC_ID
diff --git a/asterixdb/asterix-events/src/main/resources/events/cc_start/cc_start.sh b/asterixdb/asterix-events/src/main/resources/events/cc_start/cc_start.sh
deleted file mode 100755
index 3950547..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/cc_start/cc_start.sh
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-if [ ! -d $LOG_DIR ];
-then
-  mkdir -p $LOG_DIR
-fi
-ccArgs='-client-listen-address '$CLIENT_NET_IP
-ccArgs=$ccArgs' -client-listen-port '$CLIENT_NET_PORT
-ccArgs=$ccArgs' -address '$CLUSTER_NET_IP
-ccArgs=$ccArgs' -cluster-listen-port '$CLUSTER_NET_PORT
-ccArgs=$ccArgs' -console-listen-port '$HTTP_PORT
-
-if [ ! -z $HEARTBEAT_PERIOD ]
-then
-ccArgs=$ccArgs' -heartbeat-period '$HEARTBEAT_PERIOD
-fi
-
-if [ ! -z $MAX_HEARTBEAT_LAPSE_PERIODS ]
-then
-ccArgs=$ccArgs' -heartbeat-max-misses '$MAX_HEARTBEAT_LAPSE_PERIODS
-fi
-
-if [ ! -z $PROFILE_DUMP_PERIOD ]
-then
-ccArgs=$ccArgs' -profile-dump-period '$PROFILE_DUMP_PERIOD
-fi
-
-if [ ! -z $JOB_HISTORY_SIZE ]
-then
-ccArgs=$ccArgs' -job-history-size '$JOB_HISTORY_SIZE
-fi
-
-if [ ! -z $RESULT_TIME_TO_LIVE ]
-then
-ccArgs=$ccArgs' -result-ttl '$RESULT_TIME_TO_LIVE
-fi
-
-if [ ! -z $RESULT_SWEEP_THRESHOLD ]
-then
-ccArgs=$ccArgs' -result-sweep-threshold '$RESULT_SWEEP_THRESHOLD
-fi
-
-if [ ! -z $CC_ROOT ]
-then
-ccArgs=$ccArgs' -root-dir '$CC_ROOT
-fi
-cd $WORKING_DIR
-# TODO(mblow): ensure logging configuration is correct here...
-# export JAVA_OPTS="$JAVA_OPTS -Dlog4j.configuration=file:$WORKING_DIR/conf/log4j.properties"
-
-DATE=`date`
-cat <<EOF >> $LOG_DIR/cc.log
---------------------------------------------------------------------------------
-LOG START: $DATE
-JAVA_OPTS: $JAVA_OPTS
---------------------------------------------------------------------------------
-EOF
-$ASTERIX_HOME/bin/asterixcc $ccArgs >> $LOG_DIR/cc.log 2>&1
\ No newline at end of file
diff --git a/asterixdb/asterix-events/src/main/resources/events/events.xml b/asterixdb/asterix-events/src/main/resources/events/events.xml
deleted file mode 100644
index c4f82c4..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/events.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<events xmlns="events">
-  <event>
-    <type>node_join</type>
-    <script>node_join/nc_join.sh</script>
-    <description>Creates a NodeController process at a specified location.</description>
-    <args>location_of_cc location(hostname/ip_address) node_controller_id</args>
-    <daemon>true</daemon>
-  </event>
-  <event>
-    <type>node_failure</type>
-    <script>node_failure/nc_failure.sh</script>
-    <description>Kills a NodeController process at a specified location.</description>
-    <args>node_controller_id</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>cc_start</type>
-    <script>cc_start/cc_start.sh</script>
-    <description>Starts a ClusterController process at a specified location.</description>
-    <args></args>
-    <daemon>true</daemon>
-  </event>
-  <event>
-    <type>cc_failure</type>
-    <script>cc_failure/cc_failure.sh</script>
-    <description>Kills the Cluster Controller process running at a specified location.</description>
-    <args></args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>node_restart</type>
-    <script>node_restart/nc_restart.sh</script>
-    <description>Shuts and restarts a NodeControllerProcess after a specified time interval, at a specified location</description>
-    <args>address of cc, node controller id and sleep interval(seconds)</args>
-    <daemon>true</daemon>
-  </event>
-  <event>
-    <type>asterix_deploy</type>
-    <script>asterix_deploy/asterix_deploy.sh</script>
-    <description>Deploys Asterix application on a cluster running hyracks</description>
-    <args>IP address of the node running the hyracks cluster controller</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>zookeeper_start</type>
-    <script>zookeeper/start.sh</script>
-    <description>Launches ZooKeeper server process</description>
-    <args>IP address of the ZooKeeper server</args>
-    <daemon>true</daemon>
-  </event>
-  <event>
-    <type>zookeeper_stop</type>
-    <script>zookeeper/stop.sh</script>
-    <description>Terminates ZooKeeper server process</description>
-    <args>IP address of the ZooKeeper server</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>file_transfer</type>
-    <script>file/transfer.sh</script>
-    <description>Copies a file on the local file system to a remote node</description>
-    <args>local_source_path destination_node destination_path</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>directory_transfer</type>
-    <script>file/dir_transfer.sh</script>
-    <description>Copies a directory (and its contents) on the local file system to a remote node</description>
-    <args>local_source_path destination_node destination_path</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>directory_copy</type>
-    <script>file/dir_copy.sh</script>
-    <description>Copies a directory (and its contents) from the remove file system to the local file system</description>
-    <args>destination_node destination_path local_source_path</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>file_delete</type>
-    <script>file/delete.sh</script>
-    <description>Deletes a file on the local file system to a remote node</description>
-    <args>destination_node destination_path</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>file_create</type>
-    <script>file/create_file.sh</script>
-    <description>Creates a file on the local file system to a remote node</description>
-    <args>destination_node destination_path</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>backup</type>
-    <script>backup/backup.sh</script>
-    <description>Takes a backup of an Asterix instance</description>
-    <args>Asterix_data_dir HDFSurl</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>restore</type>
-    <script>restore/restore.sh</script>
-    <description>Restores an Asterix instance from a back up</description>
-    <args>Asterix_data_dir HDFSurl</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>hdfs_delete</type>
-    <script>hdfs/delete.sh</script>
-    <description>Deletes an HDFS path</description>
-    <args>WorkingDir HadoopVersion HDFSUrl Path_to_Delete</args>
-    <daemon>false</daemon>
-  </event>
-  <event>
-    <type>node_info</type>
-    <script>node_info/node_info.sh</script>
-    <description>Retrieved environment information for a node</description>
-    <daemon>false</daemon>
-  </event>
-</events>
diff --git a/asterixdb/asterix-events/src/main/resources/events/execute.sh b/asterixdb/asterix-events/src/main/resources/events/execute.sh
deleted file mode 100755
index d9ad7b2..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/execute.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-USERNAME=$1
-if [ ! -d $MANAGIX_HOME/logs ];
-then
-   mkdir -p $MANAGIX_HOME/logs
-fi
-LOGDIR=$MANAGIX_HOME/logs
-if [ $DAEMON == "false" ]; then 
-  if [ -z $USERNAME ]
-  then
-    cmd_output=$(ssh $IP_LOCATION "$ENV $SCRIPT $ARGS" 2>&1 >/dev/null) 
-    echo "ssh $IP_LOCATION $ENV $SCRIPT $ARGS" >> $LOGDIR/execute.log
-    echo "$cmd_output"
-  else
-    echo "ssh -l $USERNAME $IP_LOCATION $ENV $SCRIPT $ARGS" >> $LOGDIR/execute.log
-    cmd_output=$(ssh -l $USERNAME $IP_LOCATION "$ENV $SCRIPT $ARGS" 2>&1 >/dev/null) 
-    echo "$cmd_output"
-  fi  
-else 
-  if [ -z $USERNAME ];
-  then
-     echo "ssh $IP_LOCATION $ENV $SCRIPT $ARGS &" >> $LOGDIR/execute.log
-     ssh $IP_LOCATION "$ENV $SCRIPT $ARGS" &
-  else
-     echo "ssh -l $USERNAME $IP_LOCATION $ENV $SCRIPT $ARGS &" >> $LOGDIR/execute.log
-     ssh -l $USERNAME $IP_LOCATION "$ENV $SCRIPT $ARGS" &
-  fi   
-fi
diff --git a/asterixdb/asterix-events/src/main/resources/events/file/create_file.sh b/asterixdb/asterix-events/src/main/resources/events/file/create_file.sh
deleted file mode 100755
index 01aa3c5..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/file/create_file.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-mkdir -p $1
-echo "touch $1/$2" >> ~/file_create.log
-touch $1/$2
diff --git a/asterixdb/asterix-events/src/main/resources/events/file/delete.sh b/asterixdb/asterix-events/src/main/resources/events/file/delete.sh
deleted file mode 100755
index 9c8b0e0..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/file/delete.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-PATH_TO_DELETE=$1
-echo "rm -rf $PATH_TO_DELETE" >> ~/backup.log
-rm -rf $PATH_TO_DELETE
diff --git a/asterixdb/asterix-events/src/main/resources/events/file/dir_copy.sh b/asterixdb/asterix-events/src/main/resources/events/file/dir_copy.sh
deleted file mode 100755
index fc1a346..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/file/dir_copy.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-USERNAME=$1
-SRC_HOST=$2
-SRC_DIR=$3
-DEST_DIR=$4
-mkdir -p $DEST_DIR
-echo "scp -r $USERNAME@$SRC_HOST:$SRC_DIR $DEST_DIR"
-scp -r $USERNAME@$SRC_HOST:$SRC_DIR $DEST_DIR 
diff --git a/asterixdb/asterix-events/src/main/resources/events/file/dir_transfer.sh b/asterixdb/asterix-events/src/main/resources/events/file/dir_transfer.sh
deleted file mode 100755
index ec16c02..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/file/dir_transfer.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-USERNAME=$1
-DIR_TO_TRANSFER=$2
-DEST_HOST=$3
-DEST_DIR=$4
-ssh -l $USERNAME $DEST_HOST "mkdir -p $DEST_DIR"
-echo "scp -r $DIR_TO_TRANSFER $USERNAME@$DEST_HOST:$DEST_DIR/" 
-scp -r $DIR_TO_TRANSFER $USERNAME@$DEST_HOST:$DEST_DIR/
diff --git a/asterixdb/asterix-events/src/main/resources/events/file/transfer.sh b/asterixdb/asterix-events/src/main/resources/events/file/transfer.sh
deleted file mode 100755
index be6add2..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/file/transfer.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-USERNAME=$1
-FILE_TO_TRANSFER=$2
-DEST_HOST=$3
-DEST_DIR=$4
-POST_ACTION=$5
-ssh -l $USERNAME $DEST_HOST "mkdir -p $DEST_DIR"
-echo "scp $FILE_TO_TRANSFER $USERNAME@$DEST_HOST:$DEST_DIR/" 
-scp $FILE_TO_TRANSFER $USERNAME@$DEST_HOST:$DEST_DIR/
-if [ $POST_ACTION == "unpack" ]
- then 
- filename=`echo ${FILE_TO_TRANSFER##*/}`
- fileType=`echo ${FILE_TO_TRANSFER##*.}`
- if [ $fileType == "tar" ]
- then 
-   echo "ssh -l $USERNAME $DEST_HOST cd $DEST_DIR && tar xf $filename"
-   ssh -l $USERNAME $DEST_HOST "cd $DEST_DIR && tar xf $filename"
- else if [ $fileType == "zip" ]
-   then
-     echo "ssh -l $USERNAME $DEST_HOST unzip -o -q -d $DEST_DIR $DEST_DIR/$filename"
-     ssh -l $USERNAME $DEST_HOST "unzip -o -q -d $DEST_DIR $DEST_DIR/$filename"
-     ssh -l $USERNAME $DEST_HOST "chmod -R 755  $DEST_DIR"
-   fi 
- fi
-fi
diff --git a/asterixdb/asterix-events/src/main/resources/events/hdfs/delete.sh b/asterixdb/asterix-events/src/main/resources/events/hdfs/delete.sh
deleted file mode 100755
index 1098b0c..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/hdfs/delete.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-WORKING_DIR=$1
-HADOOP_VERSION=$2
-HDFS_URL=$3
-HDFS_PATH=$4
-export HADOOP_HOME=$WORKING_DIR/hadoop-$HADOOP_VERSION
-echo "$HADOOP_HOME/bin/hadoop fs -rmr $HDFS_URL/$HDFS_PATH"
-$HADOOP_HOME/bin/hadoop fs -rmr $HDFS_URL/$HDFS_PATH
diff --git a/asterixdb/asterix-events/src/main/resources/events/node_failure/nc_failure.sh b/asterixdb/asterix-events/src/main/resources/events/node_failure/nc_failure.sh
deleted file mode 100755
index 50dfb26..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/node_failure/nc_failure.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-NC_ID=$1
-
-PARENT_ID=`ps -ef | grep nc_join | grep -v grep | grep -v ssh| grep $NC_ID | head -n 1 | awk '{ print $2 }'`
-PID=`ps -ef |  grep asterix | awk "\\\$3 == $PARENT_ID { print \\\$2 }"`
-kill -15 $PID
-
-cmd_output=$(ps -ef | awk "\\\$3 == $PID {print \\\$2}")
-tries=0
-while [ ${#cmd_output} -ne 0 -a $tries -lt 15 ]
-do
-  sleep 1
-  kill -15 $PID
-  tries=`expr $tries + 1`
-  cmd_output=$(ps -ef | awk "\\\$3 == $PID {print \\\$2}")
-done
-if [ ${#cmd_output} -ne 0 ];
-then
-  kill -9 $PID
-fi
\ No newline at end of file
diff --git a/asterixdb/asterix-events/src/main/resources/events/node_info/node_info.sh b/asterixdb/asterix-events/src/main/resources/events/node_info/node_info.sh
deleted file mode 100755
index de2f320..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/node_info/node_info.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-JAVA_VERSION=`java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'`
-echo "java_version=$JAVA_VERSION" 1>&2
diff --git a/asterixdb/asterix-events/src/main/resources/events/node_join/nc_join.sh b/asterixdb/asterix-events/src/main/resources/events/node_join/nc_join.sh
deleted file mode 100755
index 626739a..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/node_join/nc_join.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-CC_HOST=$1
-NC_ID=$2
-IO_DEVICES=$3
-INITIAL_RUN_FLAG=$4
-if [ ! -d $LOG_DIR ];
-then
-  mkdir -p $LOG_DIR
-fi
-
-cd $WORKING_DIR
-
-DATE=`date`
-cat <<EOF >> $LOG_DIR/${NC_ID}.log
---------------------------------------------------------------------------------
-LOG START: $DATE
-JAVA_OPTS: $JAVA_OPTS
---------------------------------------------------------------------------------
-EOF
-$ASTERIX_HOME/bin/asterixnc -node-id $NC_ID -cluster-address $CC_HOST -cluster-port $CLUSTER_NET_PORT  -address $IP_LOCATION  -data-listen-address $IP_LOCATION -iodevices $IO_DEVICES -result-listen-address $IP_LOCATION $INITIAL_RUN_FLAG >> $LOG_DIR/${NC_ID}.log 2>&1
diff --git a/asterixdb/asterix-events/src/main/resources/events/node_restart/nc_restart.sh b/asterixdb/asterix-events/src/main/resources/events/node_restart/nc_restart.sh
deleted file mode 100755
index 521b402..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/node_restart/nc_restart.sh
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-CC_HOST=$1
-NC_ID=$2
-SLEEP_TIME=$3
-
-if [ $NC_ID == 'ANY' ]
-then
-  NC_ID="."
-  PARENT_ID=`ps -ej | tr -s " " | grep nc_join | grep -v grep | grep -v ssh | awk '{ print $2 }' | head -n 1`
-  PARENT_PROCESS_ENTRY=`ps -ef | grep $PARENT_ID | grep -v grep   | head -n 1`
-  NC_ID=`echo ${PARENT_PROCESS_ENTRY##* }`
-  echo "NCid is $NC_ID" >> ~/try.txt
-else
-  PARENT_ID=`ps -ej | tr -s " " | grep nc_join | grep -v grep | grep -v ssh | grep $NC_ID | awk '{ print $2 }' | head -n 1`
-fi
-
-PID=`ps -ej | tr -s " " | grep hyracks | grep -v grep | grep -v nc_join | awk "\\\$3 == $PARENT_ID { print \\\$2 }" | head -n 1`
-kill -9 $PID
-
-sleep $3
-
-$HYRACKS_HOME/hyracks-server/target/hyracks-server-0.2.2-SNAPSHOT-binary-assembly/bin/hyracksnc -node-id $NC_ID -cluster-address $CC_HOST -cluster-port 1099 -address $IP_LOCATION  -data-listen-address $IP_LOCATION
diff --git a/asterixdb/asterix-events/src/main/resources/events/prepare.sh b/asterixdb/asterix-events/src/main/resources/events/prepare.sh
deleted file mode 100755
index 6edd950..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/prepare.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
diff --git a/asterixdb/asterix-events/src/main/resources/events/restore/restore.sh b/asterixdb/asterix-events/src/main/resources/events/restore/restore.sh
deleted file mode 100755
index 6ba59da..0000000
--- a/asterixdb/asterix-events/src/main/resources/events/restore/restore.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-WORKING_DIR=$1
-ASTERIX_INSTANCE_NAME=$2
-ASTERIX_IODEVICES=$3
-NODE_STORE=$4
-ASTERIX_ROOT_METADATA_DIR=$5
-TXN_LOG_DIR=$6
-BACKUP_ID=$7
-BACKUP_DIR=$8
-BACKUP_TYPE=$9
-NODE_ID=${10}
-HDFS_URL=${11}
-HADOOP_VERSION=${12}
-HADOOP_HOME=$WORKING_DIR/hadoop-$HADOOP_VERSION
-
-iodevices=$(echo $ASTERIX_IODEVICES | tr "," "\n")
-
-index=1
-for iodevice in $iodevices
-do
-  NODE_BACKUP_DIR=$BACKUP_DIR/$ASTERIX_INSTANCE_NAME/$BACKUP_ID/$NODE_ID
-
-  # remove the existing store directory
-  STORE_DIR=$iodevice/$NODE_STORE
-
-  # if STORE_DIR ends with a /, remove it
-  if [ ${STORE_DIR:${#STORE_DIR}-1} == "/" ];
-  then
-    STORE_DIR=${STORE_DIR:0:${#STORE_DIR}-1}
-  fi
-
-  DEST_STORE_DIR=${STORE_DIR%/*}
-  SOURCE_STORE_DIR=${NODE_STORE##*/}
-  rm -rf $DEST_STORE_DIR/$SOURCE_STORE_DIR
-
-  # remove the existing log directory
-  DEST_LOG_DIR=$TXN_LOG_DIR
-  rm -rf $DEST_LOG_DIR/*
-  TXN_LOG_DIR_NAME=${TXN_LOG_DIR%/*}
-
-  # remove the existing asterix metadata directory
-  rm -rf $iodevice/$ASTERIX_ROOT_METADATA_DIR
-
-  if [ $BACKUP_TYPE == "hdfs" ];
-  then
-      # RESTORE FROM HDFS BACKUP
-
-      # copy store directory
-      $HADOOP_HOME/bin/hadoop fs -copyToLocal $HDFS_URL/$NODE_BACKUP_DIR/$SOURCE_STORE_DIR  $DEST_STORE_DIR/ 
-
-      # copy asterix metadata root directory and txn log directory
-      if [ $index -eq 1 ];
-      then
-        $HADOOP_HOME/bin/hadoop fs -copyToLocal $HDFS_URL/$NODE_BACKUP_DIR/$ASTERIX_ROOT_METADATA_DIR $iodevice/
-
-        # copy transaction logs directory
-        $HADOOP_HOME/bin/hadoop fs -copyToLocal $HDFS_URL/$NODE_BACKUP_DIR/$TXN_LOG_DIR_NAME $$TXN_LOG_DIR/
-      fi
-
-  else
-
-      # RESTORE FROM LOCAL BACKUP
-      # copy store directory
-      cp  -r $NODE_BACKUP_DIR/$SOURCE_STORE_DIR  $DEST_STORE_DIR/ 
-
-      # copy asterix metadata root directory and txn log directory
-      if [ $index -eq 1 ];
-      then
-        cp -r $NODE_BACKUP_DIR/$ASTERIX_ROOT_METADATA_DIR $iodevice/
-
-        # copy transaction logs directory
-        cp -r $NODE_BACKUP_DIR/$TXN_LOG_DIR_NAME $TXN_LOG_DIR/
-      fi
-
-  fi
-  index=`expr $index + 1`
-done
diff --git a/asterixdb/asterix-events/src/main/resources/schema/event.xsd b/asterixdb/asterix-events/src/main/resources/schema/event.xsd
deleted file mode 100644
index 146c351..0000000
--- a/asterixdb/asterix-events/src/main/resources/schema/event.xsd
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:es="events" targetNamespace="events" elementFormDefault="qualified">
-
-<!-- definition of simple types --> 
-<xs:element name="script" type="xs:string"/>
-<xs:element name="type" type="xs:string"/>
-<xs:element name="description" type="xs:string"/>
-<xs:element name="args" type="xs:string"/>
-<xs:element name="daemon" type="xs:boolean"/>
-
-<!-- definition of complex elements -->
-
-<xs:element name="event">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="es:type"/>
-      <xs:element ref="es:script"/>
-      <xs:element ref="es:description"/>
-      <xs:element ref="es:args"/>
-      <xs:element ref="es:daemon"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="events">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="es:event" maxOccurs="unbounded"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
- 
-</xs:schema>     
diff --git a/asterixdb/asterix-events/src/main/resources/schema/installer-conf.xsd b/asterixdb/asterix-events/src/main/resources/schema/installer-conf.xsd
deleted file mode 100644
index e5bc3ed..0000000
--- a/asterixdb/asterix-events/src/main/resources/schema/installer-conf.xsd
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
-  xmlns:mg="installer" targetNamespace="installer" elementFormDefault="qualified">
-
-  <!-- definition of simple types -->
-  <xs:element name="configured" type="xs:boolean" />
-  <xs:element name="asterix_home" type="xs:string" />
-  <xs:element name="hyracks_home" type="xs:string" />
-  <xs:element name="hdfsurl" type="xs:string" />
-  <xs:element name="server" type="xs:string" />
-  <xs:element name="clientPort" type="xs:integer" />
-  <xs:element name="homeDir" type="xs:string" />
-  <xs:element name="version" type="xs:string" />
-  <xs:element name="url" type="xs:string" />
-  <xs:element name="backupDir" type="xs:string" />
-  <xs:element name="java_home" type="xs:string" />
-
-  <!-- definition of complex elements -->
-  <xs:element name="hdfs">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="mg:version" />
-        <xs:element ref="mg:url" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-
-  <xs:element name="backup">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="mg:hdfs" minOccurs="0" />
-        <xs:element ref="mg:backupDir" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-
-  <xs:element name="zookeeper">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="mg:homeDir" />
-        <xs:element ref="mg:clientPort" />
-        <xs:element ref="mg:servers" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-
-  <xs:element name="servers">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="mg:java_home" />
-        <xs:element ref="mg:server" maxOccurs="unbounded" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-
-  <xs:element name="configuration">
-    <xs:complexType>
-      <xs:sequence>
-        <xs:element ref="mg:configured" minOccurs="1" />
-        <xs:element ref="mg:backup" minOccurs="0" />
-        <xs:element ref="mg:zookeeper" minOccurs="1" />
-      </xs:sequence>
-    </xs:complexType>
-  </xs:element>
-
-</xs:schema>     
diff --git a/asterixdb/asterix-events/src/main/resources/schema/jaxb-bindings.xjb b/asterixdb/asterix-events/src/main/resources/schema/jaxb-bindings.xjb
deleted file mode 100644
index 0b191a6..0000000
--- a/asterixdb/asterix-events/src/main/resources/schema/jaxb-bindings.xjb
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<jxb:bindings version="1.0"
-xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
-xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<jxb:globalBindings>
-  <jxb:serializable uid="1"/>
-</jxb:globalBindings>
-
-</jxb:bindings>
diff --git a/asterixdb/asterix-events/src/main/resources/schema/pattern.xsd b/asterixdb/asterix-events/src/main/resources/schema/pattern.xsd
deleted file mode 100644
index c087374..0000000
--- a/asterixdb/asterix-events/src/main/resources/schema/pattern.xsd
+++ /dev/null
@@ -1,134 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:eg="patterns" targetNamespace="patterns">
-
-
-<!-- definition of simple types --> 
-<xs:element name="maxOccurs" type = "xs:int"/> 
-<xs:element name="pargs" type="xs:string"/>
-<xs:element name="absvalue" type="xs:string"/>
-<xs:element name="unit" type="xs:string"/>
-<xs:element name="type" type="xs:string"/>
-<xs:element name="min" type="xs:string"/>
-<xs:element name="max" type="xs:string"/>
-<xs:element name="abs" type="xs:string"/>
-<xs:element name="set" type="xs:string"/>
-<xs:element name="exclude" type="xs:string"/>
-<xs:element name="reuse" type="xs:boolean"/>
-<!-- definition of attributes -->
-
-<!-- definition of complex elements -->
-
-<xs:element name="range">
-  <xs:complexType>
-    <xs:sequence>
-     <xs:element ref="eg:set"/>
-     <xs:element ref="eg:exclude" minOccurs="0"/>
-     <xs:element ref="eg:reuse" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="minmax">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:min"/>
-      <xs:element ref="eg:max"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-
-<xs:element name="random">
-  <xs:complexType>
-    <xs:sequence>
-       <xs:element ref="eg:minmax" minOccurs="0"/>
-       <xs:element ref="eg:range" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="value">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:random" minOccurs="0"/>
-      <xs:element ref="eg:absvalue" minOccurs="0"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="nodeid">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:value"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="period">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:absvalue"/>
-      <xs:element ref="eg:unit"/>
-    </xs:sequence>   
-  </xs:complexType>
-</xs:element>    
-
-<xs:element name="delay">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:value"/>
-      <xs:element ref="eg:unit"/>
-    </xs:sequence>   
-  </xs:complexType>
-</xs:element>    
-
-<xs:element name="event">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:type"/>
-      <xs:element ref="eg:nodeid"/>
-      <xs:element ref="eg:pargs"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
- 
-<xs:element name="pattern">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:delay"/>
-      <xs:element ref="eg:maxOccurs" maxOccurs="1" minOccurs="0"/>
-      <xs:element ref="eg:period"/>
-      <xs:element ref="eg:event"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-<xs:element name="patterns">
-  <xs:complexType>
-    <xs:sequence>
-      <xs:element ref="eg:pattern" maxOccurs="unbounded"/>
-    </xs:sequence>
-  </xs:complexType>
-</xs:element>
-
-</xs:schema>     
diff --git a/asterixdb/asterix-events/src/main/resources/scripts/execute.sh b/asterixdb/asterix-events/src/main/resources/scripts/execute.sh
deleted file mode 100755
index ed3a0f3..0000000
--- a/asterixdb/asterix-events/src/main/resources/scripts/execute.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-USERNAME=$1
-if [ ! -d $MANAGIX_HOME/logs ];
-then
-   mkdir -p $MANAGIX_HOME/logs
-fi
-LOGDIR=$MANAGIX_HOME/logs
-if [ $DAEMON == "false" ]; then 
-  if [ -z $USERNAME ]
-  then
-    cmd_output=$(ssh $IP_LOCATION "$ENV $SCRIPT $ARGS" 2>&1 >/dev/null) 
-    echo "ssh $IP_LOCATION $ENV $SCRIPT $ARGS" >> $LOGDIR/execute.log
-    echo "$cmd_output"
-  else
-    echo "ssh -l $USERNAME $IP_LOCATION $ENV $SCRIPT $ARGS" >> $LOGDIR/execute.log
-    cmd_output=$(ssh -l $USERNAME $IP_LOCATION "$ENV $SCRIPT $ARGS" 2>&1 >/dev/null) 
-    echo "$cmd_output"
-  fi  
-else 
-  if [ -z $USERNAME ];
-  then
-     echo "ssh $IP_LOCATION $ENV $SCRIPT $ARGS &" >> $LOGDIR/execute.log
-     ssh $IP_LOCATION "$ENV $SCRIPT $ARGS" &
-  else
-     echo "ssh -l $USERNAME $IP_LOCATION $ENV $SCRIPT $ARGS &" >> $LOGDIR/execute.log
-     ssh -l $USERNAME $IP_LOCATION "$ENV $SCRIPT $ARGS" &
-  fi   
-fi
diff --git a/asterixdb/asterix-events/src/main/resources/scripts/prepare.sh b/asterixdb/asterix-events/src/main/resources/scripts/prepare.sh
deleted file mode 100755
index 83cc43c..0000000
--- a/asterixdb/asterix-events/src/main/resources/scripts/prepare.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
diff --git a/asterixdb/asterix-examples/pom.xml b/asterixdb/asterix-examples/pom.xml
index 1113883..5091ae5 100644
--- a/asterixdb/asterix-examples/pom.xml
+++ b/asterixdb/asterix-examples/pom.xml
@@ -67,7 +67,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
     <sonar.sources>pom.xml,src/main/java,src/main/resources</sonar.sources>
   </properties>
 
diff --git a/asterixdb/asterix-experiments/pom.xml b/asterixdb/asterix-experiments/pom.xml
deleted file mode 100644
index 769bbf2..0000000
--- a/asterixdb/asterix-experiments/pom.xml
+++ /dev/null
@@ -1,213 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>apache-asterixdb</artifactId>
-    <groupId>org.apache.asterix</groupId>
-    <version>0.9.4-SNAPSHOT</version>
-  </parent>
-  <artifactId>asterix-experiments</artifactId>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>appassembler-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <configuration>
-              <programs>
-                <program>
-                  <mainClass>org.apache.asterix.experiment.client.LSMExperimentSetRunner</mainClass>
-                  <name>lsmexprunner</name>
-                </program>
-                <program>
-                  <mainClass>org.apache.asterix.experiment.client.SocketTweetGeneratorDriver</mainClass>
-                  <name>datagenrunner</name>
-                </program>
-                <program>
-                  <mainClass>org.apache.asterix.experiment.client.SpatialQueryGeneratorDriver</mainClass>
-                  <name>querygenrunner</name>
-                </program>
-                <program>
-                  <mainClass>org.apache.asterix.experiment.client.RecordCountingServer</mainClass>
-                  <name>rcserver</name>
-                </program>
-              </programs>
-              <repositoryLayout>flat</repositoryLayout>
-              <repositoryName>lib</repositoryName>
-            </configuration>
-            <phase>package</phase>
-            <goals>
-              <goal>assemble</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <configuration>
-              <descriptors>
-                <descriptor>src/main/assembly/binary-assembly.xml</descriptor>
-              </descriptors>
-            </configuration>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <failOnWarning>false</failOnWarning>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <configuration>
-          <licenses combine.children="append">
-            <license implementation="org.apache.rat.analysis.license.FullTextMatchingLicense">
-              <licenseFamilyCategory>BSD</licenseFamilyCategory>
-              <licenseFamilyName>Modified BSD License</licenseFamilyName>
-              <fullText>
-                Copyright (c) 2013, Los Alamos National Security, LLC
-                All rights reserved.
-
-                Copyright 2013. Los Alamos National Security, LLC. This software
-                was produced under U.S. Government contract DE-AC52-06NA25396 for
-                Los Alamos National Laboratory (LANL), which is operated by Los
-                Alamos National Security, LLC for the U.S. Department of Energy.
-                The U.S. Government has rights to use, reproduce, and distribute
-                this software.  NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL
-                SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
-                ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
-                to produce derivative works, such modified software should be clearly
-                marked, so as not to confuse it with the version available from LANL.
-
-
-                Additionally, redistribution and use in source and binary forms,
-                with or without modification, are permitted provided that the
-                following conditions are met:
-
-                *  Redistributions of source code must retain the above copyright
-                notice, this list of conditions and the following disclaimer.
-
-                *  Redistributions in binary form must reproduce the above copyright
-                notice, this list of conditions and the following disclaimer in the
-                documentation and/or other materials provided with the distribution.
-
-                *  Neither the name of Los Alamos National Security, LLC, Los Alamos
-                National Laboratory, LANL, the U.S. Government, nor the names of
-                its contributors may be used to endorse or promote products derived
-                from this software without specific prior written permission.
-
-                THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
-                "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-                THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-                ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR CONTRIBUTORS
-                BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-                DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-                LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-                THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-                NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-                IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-              </fullText>
-            </license>
-          </licenses>
-          <licenseFamilies combine.children="append">
-            <licenseFamily implementation="org.apache.rat.license.ModifiedBSDLicenseFamily"/>
-          </licenseFamilies>
-          <excludes combine.children="append">
-            <exclude>**/*.dgen</exclude>
-            <exclude>**/*.dqgen</exclude>
-            <exclude>src/main/resources/gantt/vargantt1.txt</exclude>
-            <exclude>src/main/resources/gantt/*.eps</exclude> <!-- generated by gnuplot -->
-            <exclude>src/main/resources/gantt/*.gpl</exclude> <!-- generated by Gantt -->
-            <exclude>src/main/resources/gantt/*.plt</exclude> <!-- generated by Gantt -->
-          </excludes>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-control-cc</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-app</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-tools</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-httpclient</groupId>
-      <artifactId>commons-httpclient</artifactId>
-      <version>3.0.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>args4j</groupId>
-      <artifactId>args4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml.bind</groupId>
-      <artifactId>jaxb-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.hierynomus</groupId>
-      <artifactId>sshj</artifactId>
-      <version>0.13.0</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/asterixdb/asterix-experiments/src/main/appended-resources/META-INF/LICENSE b/asterixdb/asterix-experiments/src/main/appended-resources/META-INF/LICENSE
deleted file mode 100644
index f22880d..0000000
--- a/asterixdb/asterix-experiments/src/main/appended-resources/META-INF/LICENSE
+++ /dev/null
@@ -1,53 +0,0 @@
-===
-   AsterixDB includes source code with separate copyright notices and
-   license terms. Your use of this source code is subject to the terms
-   and condition of the following licenses.
-===
-   A portion of the AsterixDB Experimental Tests
-       located at:
-         src/main/resources/gantt/gantt.py
-
-   is available under a Modified BSD License:
----
-   Copyright (c) 2013, Los Alamos National Security, LLC
-   All rights reserved.
-
-   Copyright 2013. Los Alamos National Security, LLC. This software
-   was produced under U.S. Government contract DE-AC52-06NA25396 for
-   Los Alamos National Laboratory (LANL), which is operated by Los
-   Alamos National Security, LLC for the U.S. Department of Energy.
-   The U.S. Government has rights to use, reproduce, and distribute
-   this software.  NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL
-   SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
-   ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
-   to produce derivative works, such modified software should be clearly
-   marked, so as not to confuse it with the version available from LANL.
-
-
-   Additionally, redistribution and use in source and binary forms,
-   with or without modification, are permitted provided that the
-   following conditions are met:
-
-    *  Redistributions of source code must retain the above copyright
-       notice, this list of conditions and the following disclaimer.
-
-    *  Redistributions in binary form must reproduce the above copyright
-       notice, this list of conditions and the following disclaimer in the
-       documentation and/or other materials provided with the distribution.
-
-    *  Neither the name of Los Alamos National Security, LLC, Los Alamos
-       National Laboratory, LANL, the U.S. Government, nor the names of
-       its contributors may be used to endorse or promote products derived
-       from this software without specific prior written permission.
-
-   THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
-   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-   ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR CONTRIBUTORS
-   BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-   IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----
diff --git a/asterixdb/asterix-experiments/src/main/assembly/binary-assembly.xml b/asterixdb/asterix-experiments/src/main/assembly/binary-assembly.xml
deleted file mode 100644
index 98f5aba..0000000
--- a/asterixdb/asterix-experiments/src/main/assembly/binary-assembly.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- ! 
- !     http://www.apache.org/licenses/LICENSE-2.0
- ! 
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<assembly>
-  <id>binary-assembly</id>
-  <formats>
-    <format>zip</format>
-    <format>dir</format>
-  </formats>
-  <includeBaseDirectory>false</includeBaseDirectory>
-  <fileSets>
-    <fileSet>
-      <directory>target/appassembler/bin</directory>
-      <outputDirectory>bin</outputDirectory>
-      <fileMode>0755</fileMode>
-    </fileSet>
-    <fileSet>
-      <directory>target/appassembler/lib</directory>
-      <outputDirectory>lib</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/ingestion-experiment-binary-and-configs</directory>
-      <outputDirectory>.</outputDirectory>
-    </fileSet>
-  </fileSets>
-</assembly>
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/AbstractAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/AbstractAction.java
deleted file mode 100644
index 0e58dd4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/AbstractAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-public abstract class AbstractAction implements IAction {
-
-    private final IExceptionListener el;
-
-    protected AbstractAction() {
-        el = new DefaultExceptionListener();
-    }
-
-    protected AbstractAction(IExceptionListener el) {
-        this.el = el;
-    }
-
-    @Override
-    public void perform() {
-        try {
-            doPerform();
-        } catch (Throwable t) {
-            el.caughtException(t);
-        }
-    }
-
-    protected abstract void doPerform() throws Exception;
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/DefaultExceptionListener.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/DefaultExceptionListener.java
deleted file mode 100644
index 5f89871..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/DefaultExceptionListener.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class DefaultExceptionListener implements IExceptionListener {
-
-    private static final Logger LOGGER = Logger.getLogger(DefaultExceptionListener.class.getName());
-
-    @Override
-    public void caughtException(Throwable t) {
-        if (LOGGER.isLoggable(Level.SEVERE)) {
-            LOGGER.severe("Caught exception: " + t);
-            LOGGER.severe("Stopping...");
-            t.printStackTrace();
-        }
-        System.exit(1);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IAction.java
deleted file mode 100644
index c174a6f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-public interface IAction {
-    public void perform();
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IExceptionListener.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IExceptionListener.java
deleted file mode 100644
index e6a6cf1..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/IExceptionListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-public interface IExceptionListener {
-    public void caughtException(Throwable t);
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/ParallelActionSet.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/ParallelActionSet.java
deleted file mode 100644
index 9593307..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/ParallelActionSet.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class ParallelActionSet extends AbstractAction {
-
-    private final ExecutorService executor;
-
-    private final List<IAction> actions;
-
-    public ParallelActionSet() {
-        executor = Executors.newCachedThreadPool(new ThreadFactory() {
-
-            private final AtomicInteger tid = new AtomicInteger(0);
-
-            @Override
-            public Thread newThread(Runnable r) {
-                Thread t = new Thread(r);
-                t.setDaemon(true);
-                t.setName("ParallelActionThread " + tid.getAndIncrement());
-                return t;
-            }
-        });
-        actions = new ArrayList<>();
-    }
-
-    public void add(IAction action) {
-        actions.add(action);
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        final Semaphore sem = new Semaphore(-(actions.size() - 1));
-        for (final IAction a : actions) {
-            executor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    try {
-                        a.perform();
-                    } finally {
-                        sem.release();
-                    }
-                }
-            });
-        }
-        sem.acquire();
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/SequentialActionList.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/SequentialActionList.java
deleted file mode 100644
index 4f4e442..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/base/SequentialActionList.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.base;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class SequentialActionList extends AbstractAction {
-    private final List<IAction> actions;
-
-    public SequentialActionList() {
-        actions = new ArrayList<>();
-    }
-
-    public void add(IAction exec) {
-        actions.add(exec);
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        for (IAction e : actions) {
-            e.perform();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractExecutableAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractExecutableAction.java
deleted file mode 100644
index 3f8a016..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractExecutableAction.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.commons.io.IOUtils;
-
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.experiment.action.base.AbstractAction;
-
-public abstract class AbstractExecutableAction extends AbstractAction {
-
-    private static final Logger LOGGER = Logger.getLogger(AbstractExecutableAction.class.getName());
-
-    protected Map<String, String> getEnvironment() {
-        return Collections.<String, String> emptyMap();
-    }
-
-    protected abstract String getCommand();
-
-    protected abstract boolean doExecute(String command, Map<String, String> env) throws Exception;
-
-    protected abstract InputStream getErrorStream();
-
-    protected abstract InputStream getInputStream();
-
-    @Override
-    protected void doPerform() throws Exception {
-        StringWriter sw = new StringWriter();
-        String cmd = getCommand();
-        if (!doExecute(cmd, getEnvironment())) {
-            IOUtils.copy(getErrorStream(), sw);
-            throw new AsterixException("Error executing command: " + cmd + ".\n Error = " + sw.toString());
-        } else {
-            IOUtils.copy(getInputStream(), sw);
-            IOUtils.copy(getErrorStream(), sw);
-        }
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info(sw.toString());
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractLocalExecutableAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractLocalExecutableAction.java
deleted file mode 100644
index 1bba94f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractLocalExecutableAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.InputStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-public abstract class AbstractLocalExecutableAction extends AbstractExecutableAction {
-
-    private final ProcessBuilder pb;
-
-    private Process p;
-
-    protected AbstractLocalExecutableAction() {
-        pb = new ProcessBuilder();
-    }
-
-    protected InputStream getErrorStream() {
-        return p == null ? null : p.getErrorStream();
-    }
-
-    protected InputStream getInputStream() {
-        return p == null ? null : p.getInputStream();
-    }
-
-    @Override
-    protected boolean doExecute(String command, Map<String, String> env) throws Exception {
-        List<String> cmd = Arrays.asList(command.split(" "));
-        pb.command(cmd);
-        pb.environment().putAll(env);
-        p = pb.start();
-        int exitVal = p.waitFor();
-        return exitVal == 0;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractRemoteExecutableAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractRemoteExecutableAction.java
deleted file mode 100644
index 8976e7c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/AbstractRemoteExecutableAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import net.schmizz.sshj.SSHClient;
-import net.schmizz.sshj.connection.channel.direct.Session;
-import net.schmizz.sshj.connection.channel.direct.Session.Command;
-
-public abstract class AbstractRemoteExecutableAction extends AbstractExecutableAction {
-
-    private final SSHClient client;
-
-    private final String hostname;
-
-    private final int port;
-
-    private final String username;
-
-    private final String keyLocation;
-
-    private Command cmd;
-
-    protected AbstractRemoteExecutableAction(String hostname, String username, String keyLocation) {
-        this(hostname, SSHClient.DEFAULT_PORT, username, keyLocation);
-    }
-
-    protected AbstractRemoteExecutableAction(String hostname, int port, String username, String keyLocation) {
-        this.hostname = hostname;
-        this.port = port;
-        this.username = username;
-        this.keyLocation = keyLocation;
-        client = new SSHClient();
-    }
-
-    protected InputStream getErrorStream() {
-        return cmd == null ? null : cmd.getErrorStream();
-    }
-
-    protected InputStream getInputStream() {
-        return cmd == null ? null : cmd.getInputStream();
-    }
-
-    @Override
-    protected boolean doExecute(String command, Map<String, String> env) throws Exception {
-        int exitVal = 0;
-        client.loadKnownHosts();
-        try {
-            client.connect(hostname, port);
-            client.authPublickey(username, keyLocation);
-            Session s = client.startSession();
-            try {
-                for (Entry<String, String> e : env.entrySet()) {
-                    s.setEnvVar(e.getKey(), e.getValue());
-                }
-                cmd = s.exec(command);
-                cmd.join();
-                Integer ev = cmd.getExitStatus();
-                exitVal = ev == null ? -1 : ev;
-                cmd.close();
-            } finally {
-                s.close();
-            }
-        } finally {
-            client.close();
-        }
-        return exitVal == 0;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/CloseOutputStreamAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/CloseOutputStreamAction.java
deleted file mode 100644
index 66956f4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/CloseOutputStreamAction.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.OutputStream;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.hyracks.api.util.ExperimentProfilerUtils;
-
-public class CloseOutputStreamAction extends AbstractAction {
-
-    private final OutputStream os;
-
-    public CloseOutputStreamAction(OutputStream os) {
-        this.os = os;
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        ExperimentProfilerUtils.closeOutputFile(os);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/ManagixActions.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/ManagixActions.java
deleted file mode 100644
index 182cdbb..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/ManagixActions.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.Map;
-
-public class ManagixActions {
-
-    private enum ManagixCommand {
-        CONFIGURE("configure"),
-        CREATE("create", "-n", "-c", "-a"),
-        START("start", "-n"),
-        STOP("stop", "-n"),
-        DELETE("delete", "-n"),
-        LOG("log", "-n", "-d"),
-        SHUTDOWN("shutdown");
-
-        private final String cmdFormat;
-
-        private ManagixCommand(String name, String... options) {
-            StringBuilder sb = new StringBuilder();
-            sb.append(name).append(" ");
-            if (options != null) {
-                for (int i = 0; i < options.length; ++i) {
-                    sb.append(options[i]).append(" ").append("{").append(i).append("}");
-                    if (i != options.length - 1) {
-                        sb.append(" ");
-                    }
-                }
-            }
-            cmdFormat = sb.toString();
-        }
-
-        public String getCommandFormat() {
-            return cmdFormat;
-        }
-    }
-
-    private static abstract class AbstractManagixCommandAction extends AbstractLocalExecutableAction {
-
-        private static final String cmdFormat = "{0}/bin/managix {1}";
-
-        private final String managixHomePath;
-
-        private final String command;
-
-        protected AbstractManagixCommandAction(String managixHomePath, String command) {
-            this.managixHomePath = managixHomePath;
-            this.command = command;
-        }
-
-        @Override
-        protected String getCommand() {
-            return MessageFormat.format(cmdFormat, managixHomePath, command);
-        }
-
-        @Override
-        protected Map<String, String> getEnvironment() {
-            Map<String, String> env = new HashMap<>();
-            env.put("MANAGIX_HOME", managixHomePath);
-            return env;
-        }
-
-    }
-
-    public static class ConfigureAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public ConfigureAsterixManagixAction(String managixHomePath) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.CONFIGURE.getCommandFormat(), ""));
-        }
-
-    }
-
-    public static class CreateAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public CreateAsterixManagixAction(String managixHomePath, String asterixInstanceName,
-                String clusterConfigFilePath, String asterixConfigFilePath) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.CREATE.getCommandFormat(), asterixInstanceName,
-                    clusterConfigFilePath, asterixConfigFilePath));
-        }
-
-    }
-
-    public static class StartAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public StartAsterixManagixAction(String managixHomePath, String asterixInstanceName) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.START.getCommandFormat(), asterixInstanceName));
-        }
-
-    }
-
-    public static class StopAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public StopAsterixManagixAction(String managixHomePath, String asterixInstanceName) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.STOP.getCommandFormat(), asterixInstanceName));
-        }
-
-    }
-
-    public static class DeleteAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public DeleteAsterixManagixAction(String managixHomePath, String asterixInstanceName) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.DELETE.getCommandFormat(), asterixInstanceName));
-        }
-
-    }
-
-    public static class LogAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public LogAsterixManagixAction(String managixHomePath, String asterixInstanceName, String destinationDir) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.LOG.getCommandFormat(), asterixInstanceName,
-                    destinationDir));
-        }
-
-    }
-
-    public static class ShutdownAsterixManagixAction extends AbstractManagixCommandAction {
-
-        public ShutdownAsterixManagixAction(String managixHomePath) {
-            super(managixHomePath, MessageFormat.format(ManagixCommand.SHUTDOWN.getCommandFormat(), ""));
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteAsterixDriverKill.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteAsterixDriverKill.java
deleted file mode 100644
index 229b8c7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteAsterixDriverKill.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-public class RemoteAsterixDriverKill extends AbstractRemoteExecutableAction {
-
-    public RemoteAsterixDriverKill(String hostname, String username, String keyLocation) {
-        super(hostname, username, keyLocation);
-    }
-
-    @Override
-    protected String getCommand() {
-        return "ps -ef | awk '/java.*org\\.apache\\.hyracks\\.control\\.[cn]c\\.[CN]CDriver/ {print $2}' " +
-                "| xargs -n 1 kill -9";
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteCopyFileAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteCopyFileAction.java
deleted file mode 100644
index 6768e94..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RemoteCopyFileAction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import net.schmizz.sshj.SSHClient;
-import net.schmizz.sshj.xfer.scp.SCPFileTransfer;
-import org.apache.asterix.experiment.action.base.AbstractAction;
-
-public class RemoteCopyFileAction extends AbstractAction {
-
-    private final String srcFilePath;
-
-    private final String destFilePath;
-
-    private final SSHClient client;
-
-    private final String hostname;
-
-    private final int port;
-
-    private final String username;
-
-    private final String keyLocation;
-
-    public RemoteCopyFileAction(String srcFilePath, String destFilePath, String hostname, String username,
-            String keyLocation) {
-        this(srcFilePath, destFilePath, hostname, SSHClient.DEFAULT_PORT, username, keyLocation);
-    }
-
-    public RemoteCopyFileAction(String srcFilePath, String destFilePath, String hostname, int port, String username,
-            String keyLocation) {
-        this.srcFilePath = srcFilePath;
-        this.destFilePath = destFilePath;
-        this.hostname = hostname;
-        this.port = port;
-        this.username = username;
-        this.keyLocation = keyLocation;
-        client = new SSHClient();
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        client.loadKnownHosts();
-        try {
-            client.connect(hostname, port);
-            client.authPublickey(username, keyLocation);
-            SCPFileTransfer scpft = client.newSCPFileTransfer();
-            scpft.upload(srcFilePath, destFilePath);
-        } finally {
-            client.close();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLFileAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLFileAction.java
deleted file mode 100644
index 2e6772a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLFileAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.MessageFormat;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-
-public class RunAQLFileAction extends AbstractAction {
-    private final Logger LOGGER = Logger.getLogger(RunAQLFileAction.class.getName());
-    private static final String REST_URI_TEMPLATE = "http://{0}:{1}/aql";
-
-    private final HttpClient httpClient;
-
-    private final Path aqlFilePath;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    private final OutputStream os;
-
-    public RunAQLFileAction(HttpClient httpClient, String restHost, int restPort, Path aqlFilePath) {
-        this.httpClient = httpClient;
-        this.aqlFilePath = aqlFilePath;
-        this.restHost = restHost;
-        this.restPort = restPort;
-        os = null;
-    }
-
-    public RunAQLFileAction(HttpClient httpClient, String restHost, int restPort, Path aqlFilePath, OutputStream os) {
-        this.httpClient = httpClient;
-        this.aqlFilePath = aqlFilePath;
-        this.restHost = restHost;
-        this.restPort = restPort;
-        this.os = os;
-    }
-
-    @Override
-    public void doPerform() throws Exception {
-        String aql = StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlFilePath))).toString();
-        String uri = MessageFormat.format(REST_URI_TEMPLATE, restHost, String.valueOf(restPort));
-        HttpPost post = new HttpPost(uri);
-        post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
-        post.setEntity(new StringEntity(aql, StandardCharsets.UTF_8));
-        HttpEntity entity = httpClient.execute(post).getEntity();
-        if (entity != null && entity.isStreaming()) {
-            printStream(entity.getContent());
-        }
-        if (aql.contains("compact")) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Compaction has been completed");
-            }
-        }
-    }
-
-    private void printStream(InputStream content) throws IOException {
-        if (os == null) {
-            IOUtils.copy(content, System.out);
-            System.out.flush();
-        } else {
-            IOUtils.copy(content, os);
-            os.flush();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLStringAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLStringAction.java
deleted file mode 100644
index 1785e75..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunAQLStringAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.text.MessageFormat;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-
-public class RunAQLStringAction extends AbstractAction {
-    private static final String REST_URI_TEMPLATE = "http://{0}:{1}/aql";
-
-    private final HttpClient httpClient;
-
-    private final String aql;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    private final OutputStream os;
-
-    public RunAQLStringAction(HttpClient httpClient, String restHost, int restPort, String aql) {
-        this.httpClient = httpClient;
-        this.aql = aql;
-        this.restHost = restHost;
-        this.restPort = restPort;
-        os = null;
-    }
-
-    public RunAQLStringAction(HttpClient httpClient, String restHost, int restPort, String aql, OutputStream os) {
-        this.httpClient = httpClient;
-        this.aql = aql;
-        this.restHost = restHost;
-        this.restPort = restPort;
-        this.os = os;
-    }
-
-    @Override
-    public void doPerform() throws Exception {
-        String uri = MessageFormat.format(REST_URI_TEMPLATE, restHost, String.valueOf(restPort));
-        HttpPost post = new HttpPost(uri);
-        post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
-        post.setEntity(new StringEntity(aql, StandardCharsets.UTF_8));
-        HttpEntity entity = httpClient.execute(post).getEntity();
-        if (entity != null && entity.isStreaming()) {
-            printStream(entity.getContent());
-        }
-    }
-
-    private void printStream(InputStream content) throws IOException {
-        if (os == null) {
-            IOUtils.copy(content, System.out);
-            System.out.flush();
-        } else {
-            IOUtils.copy(content, os);
-            os.flush();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunRESTIOWaitAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunRESTIOWaitAction.java
deleted file mode 100644
index 9646d32..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunRESTIOWaitAction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.text.MessageFormat;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.util.EntityUtils;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-
-public class RunRESTIOWaitAction extends AbstractAction {
-    private static final String REST_URI_TEMPLATE = "http://{0}:{1}/iowait";
-
-    private final HttpClient httpClient;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    public RunRESTIOWaitAction(HttpClient httpClient, String restHost, int restPort) {
-        this.httpClient = httpClient;
-        this.restHost = restHost;
-        this.restPort = restPort;
-    }
-
-    @Override
-    public void doPerform() throws Exception {
-        String uri = MessageFormat.format(REST_URI_TEMPLATE, restHost, String.valueOf(restPort));
-        HttpGet get = new HttpGet(uri);
-        HttpEntity entity = httpClient.execute(get).getEntity();
-        EntityUtils.consume(entity);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunSQLPPFileAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunSQLPPFileAction.java
deleted file mode 100644
index 8e44b0d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/RunSQLPPFileAction.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.avro.generic.GenericData;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.util.EntityUtils;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class RunSQLPPFileAction extends AbstractAction {
-    private static final String REST_URI_TEMPLATE = "http://{0}:{1}/sqlpp";
-
-    private final HttpClient httpClient;
-
-    private final Path aqlFilePath;
-    private final Path csvFilePath;
-    private final List<Path> queriesToRun;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    public RunSQLPPFileAction(HttpClient httpClient, String restHost, int restPort, Path aqlFilePath, Path csvFilePath) {
-        this.httpClient = httpClient;
-        this.aqlFilePath = aqlFilePath;
-        this.csvFilePath = csvFilePath;
-        this.restHost = restHost;
-        this.restPort = restPort;
-        queriesToRun = new ArrayList<>();
-    }
-
-    @Override
-    public void doPerform() throws Exception {
-        FileOutputStream csvFileOut = new FileOutputStream(csvFilePath.toFile());
-        PrintWriter printer = new PrintWriter(csvFileOut, true);
-        try {
-            if (aqlFilePath.toFile().isDirectory()) {
-                for (File f : aqlFilePath.toFile().listFiles()) {
-                    queriesToRun.add(f.toPath());
-                }
-            } else {
-                queriesToRun.add(aqlFilePath);
-            }
-
-            for (Path p : queriesToRun) {
-                String sqlpp = StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(p))).toString();
-                String uri = MessageFormat.format(REST_URI_TEMPLATE, restHost, String.valueOf(restPort));
-                HttpPost post = new HttpPost(uri);
-                post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
-                post.setEntity(new StringEntity(sqlpp, StandardCharsets.UTF_8));
-                long start = System.currentTimeMillis();
-                HttpResponse resp = httpClient.execute(post);
-                HttpEntity entity = resp.getEntity();
-                if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-                    throw new HttpException("Query returned error" + EntityUtils.toString(entity));
-                }
-                EntityUtils.consume(entity);
-                long end = System.currentTimeMillis();
-                long wallClock = end - start;
-                String currLine = p.getFileName().toString() + ',' + wallClock;
-                System.out.println(currLine);
-                printer.print(currLine + '\n');
-            }
-        }
-        finally{
-            printer.close();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/SleepAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/SleepAction.java
deleted file mode 100644
index 5200c8b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/SleepAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-
-public class SleepAction extends AbstractAction {
-
-    private final long ms;
-
-    public SleepAction(long ms) {
-        this.ms = ms;
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        Thread.sleep(ms);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/StartDataGeneratorAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/StartDataGeneratorAction.java
deleted file mode 100644
index f0d51ac..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/StartDataGeneratorAction.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.StringWriter;
-
-import net.schmizz.sshj.SSHClient;
-import net.schmizz.sshj.connection.channel.direct.Session;
-import net.schmizz.sshj.connection.channel.direct.Session.Command;
-
-import org.apache.commons.io.IOUtils;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-
-public class StartDataGeneratorAction extends AbstractAction {
-
-    @Override
-    protected void doPerform() throws Exception {
-    }
-
-    public static void main(String[] args) throws Exception {
-        SSHClient sshClient = new SSHClient();
-        sshClient.loadKnownHosts();
-        sshClient.connect("asterix-1.ics.uci.edu");
-        sshClient.authPublickey("zheilbro", "/Users/zheilbron/.ssh/id_rsa");
-        Session session = sshClient.startSession();
-        Command lsCmd = session.exec("ls");
-        StringWriter sw = new StringWriter();
-        IOUtils.copy(lsCmd.getInputStream(), sw);
-        IOUtils.copy(lsCmd.getErrorStream(), sw);
-        System.out.println(sw.toString());
-        session.close();
-        sw.close();
-        sshClient.close();
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/TimedAction.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/TimedAction.java
deleted file mode 100644
index f0e7ad7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/action/derived/TimedAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.action.derived;
-
-import java.io.OutputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.IAction;
-
-public class TimedAction extends AbstractAction {
-
-    private final Logger LOGGER = Logger.getLogger(TimedAction.class.getName());
-
-    private final IAction action;
-    private final OutputStream os;
-
-    public TimedAction(IAction action) {
-        this.action = action;
-        os = null;
-    }
-
-    public TimedAction(IAction action, OutputStream os) {
-        this.action = action;
-        this.os = os;
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        long start = System.currentTimeMillis();
-        action.perform();
-        long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.SEVERE)) {
-            if (os == null) {
-                System.out.println("Elapsed time = " + (end - start) + " for action " + action);
-                System.out.flush();
-            } else {
-                os.write(("Elapsed time = " + (end - start) + " for action " + action).getBytes());
-                os.flush();
-            }
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment1Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment1Builder.java
deleted file mode 100644
index 4461fd7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment1Builder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment1Builder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment1Builder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("1.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2ABuilder.java
deleted file mode 100644
index 4dce1af..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2ABuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment2ABuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment2ABuilder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("2_a.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2BBuilder.java
deleted file mode 100644
index 2aeb6f8..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2BBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment2BBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment2BBuilder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("2_b.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2CBuilder.java
deleted file mode 100644
index f54c78a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2CBuilder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment2CBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment2CBuilder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("2_c.aql")));
-    }
-
-    @Override
-    protected void doPost(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("avg_gram_tokens.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2DBuilder.java
deleted file mode 100644
index f54b523..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment2DBuilder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment2DBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment2DBuilder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("2_d.aql")));
-    }
-
-    @Override
-    protected void doPost(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("avg_keyword_tokens.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment3Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment3Builder.java
deleted file mode 100644
index f5fb4a4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment3Builder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment3Builder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment3Builder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, "count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("3.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment4Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment4Builder.java
deleted file mode 100644
index e18975c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment4Builder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment4Builder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment4Builder(String name, LSMExperimentSetRunnerConfig config) {
-        super(name, config, "8node.xml", "base_8_ingest.aql", "8.dgen", "count.aql");
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment6Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment6Builder.java
deleted file mode 100644
index a34e089..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment6Builder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public abstract class AbstractExperiment6Builder extends AbstractLSMBaseExperimentBuilder {
-
-    public AbstractExperiment6Builder(String name, LSMExperimentSetRunnerConfig config) {
-        super(name, config, "8node.xml", "base_8_ingest.aql", "8.dgen", "count.aql");
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment7Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment7Builder.java
deleted file mode 100644
index 4f35ff0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment7Builder.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.IAction;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.action.derived.RunAQLStringAction;
-import org.apache.asterix.experiment.action.derived.RunRESTIOWaitAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.OrchestratorServer7;
-import org.apache.asterix.experiment.client.OrchestratorServer7.IProtocolActionBuilder;
-import org.apache.commons.lang3.StringUtils;
-
-public abstract class AbstractExperiment7Builder extends AbstractLSMBaseExperimentBuilder {
-
-    private static final long DOMAIN_SIZE = (1L << 32);
-
-    public static final long QUERY_BEGIN_ROUND = 6;
-
-    private static int N_PARTITIONS = 16;
-
-    private final int nIntervals;
-
-    private final String orchHost;
-
-    private final int orchPort;
-
-    protected final long dataInterval;
-
-    protected final int nQueryRuns;
-
-    protected final Random randGen;
-
-    public AbstractExperiment7Builder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, null);
-        nIntervals = config.getNIntervals();
-        orchHost = config.getOrchestratorHost();
-        orchPort = config.getOrchestratorPort();
-        dataInterval = config.getDataInterval();
-        this.nQueryRuns = config.getNQueryRuns();
-        this.randGen = new Random();
-    }
-
-    @Override
-    protected void doBuildDataGen(SequentialActionList seq, Map<String, List<String>> dgenPairs) throws Exception {
-        int nDgens = 0;
-        for (List<String> v : dgenPairs.values()) {
-            nDgens += v.size();
-        }
-        final OrchestratorServer7 oServer = new OrchestratorServer7(orchPort, nDgens, nIntervals,
-                new ProtocolActionBuilder(), this.lsAction);
-
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.start();
-            }
-        });
-
-        ParallelActionSet dgenActions = new ParallelActionSet();
-        int partition = 0;
-
-        // run dgen
-        for (String dgenHost : dgenPairs.keySet()) {
-            final List<String> rcvrs = dgenPairs.get(dgenHost);
-            final int p = partition;
-            dgenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("datagenrunner").toString();
-                    return StringUtils.join(new String[] { binary, "-si", "" + locationSampleInterval, "-of",
-                            openStreetMapFilePath, "-p", "" + p, "-di", "" + dataInterval, "-ni", "" + nIntervals,
-                            "-oh", orchHost, "-op", "" + orchPort, ipPortPairs }, " ");
-                }
-            });
-            partition += rcvrs.size();
-        }
-        seq.add(dgenActions);
-
-        // wait until all dgen / queries are done
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.awaitFinished();
-            }
-        });
-    }
-
-    public class ProtocolActionBuilder implements IProtocolActionBuilder {
-
-        private final String rangeQueryTemplate;
-
-        public ProtocolActionBuilder() throws IOException {
-            this.rangeQueryTemplate = getRangeQueryTemplate();
-        }
-
-        private String getRangeQueryTemplate() throws IOException {
-            Path aqlTemplateFilePath = localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_q2.aql");
-            return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlTemplateFilePath))).toString();
-        }
-
-        @Override
-        public IAction buildQueryAction(long cardinality, boolean finalRound) throws IOException {
-            SequentialActionList protoAction = new SequentialActionList();
-            IAction rangeQueryAction = new TimedAction(
-                    new RunAQLStringAction(httpClient, restHost, restPort, getRangeAQL(cardinality, finalRound)));
-            protoAction.add(rangeQueryAction);
-            return protoAction;
-        }
-
-        private String getRangeAQL(long cardinaliry, boolean finalRound) throws IOException {
-            long round = QUERY_BEGIN_ROUND;
-            if (finalRound) {
-                ++round;
-            }
-            long numKeys = ((round * dataInterval) / 1000) * N_PARTITIONS;
-            long rangeSize = (long) ((cardinaliry / (double) numKeys) * DOMAIN_SIZE);
-            int lowKey = randGen.nextInt();
-            long maxLowKey = Integer.MAX_VALUE - rangeSize;
-            if (lowKey > maxLowKey) {
-                lowKey = (int) maxLowKey;
-            }
-            int highKey = (int) (lowKey + rangeSize);
-            return rangeQueryTemplate.replaceAll("\\$LKEY\\$", Long.toString(lowKey)).replaceAll("\\$HKEY\\$",
-                    Long.toString(highKey));
-        }
-
-        @Override
-        public IAction buildIOWaitAction() throws IOException {
-            SequentialActionList ioAction = new SequentialActionList();
-            ioAction.add(new SleepAction(10000));
-            ioAction.add(new RunRESTIOWaitAction(httpClient, restHost, restPort));
-            ioAction.add(new SleepAction(10000));
-            return ioAction;
-        }
-
-        @Override
-        public IAction buildCompactAction() throws IOException {
-            return new RunAQLFileAction(httpClient, restHost, restPort,
-                    localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_compact.aql"));
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment8Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment8Builder.java
deleted file mode 100644
index 8d4c5ed..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment8Builder.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.RunAQLStringAction;
-import org.apache.asterix.experiment.action.derived.RunRESTIOWaitAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.OrchestratorServer;
-import org.apache.commons.lang3.StringUtils;
-
-public abstract class AbstractExperiment8Builder extends AbstractLSMBaseExperimentBuilder {
-
-    private static final long DOMAIN_SIZE = (1L << 32);
-
-    private static final long EXPECTED_RANGE_CARDINALITY = 50000;
-
-    private static int N_PARTITIONS = 16;
-
-    private final int nIntervals;
-
-    private final String orchHost;
-
-    private final int orchPort;
-
-    protected final long dataInterval;
-
-    protected final int nQueryRuns;
-
-    protected final Random randGen;
-
-    private final String pointQueryTemplate;
-    private final String rangeQueryTemplate;
-
-    public AbstractExperiment8Builder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) throws IOException {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, null);
-        nIntervals = config.getNIntervals();
-        orchHost = config.getOrchestratorHost();
-        orchPort = config.getOrchestratorPort();
-        dataInterval = config.getDataInterval();
-        this.nQueryRuns = config.getNQueryRuns();
-        this.randGen = new Random();
-        this.pointQueryTemplate = getPointQueryTemplate();
-        this.rangeQueryTemplate = getRangeQueryTemplate();
-    }
-
-    protected void doBuildProtocolAction(SequentialActionList seq, int round) throws Exception {
-        for (int i = 0; i < nQueryRuns; ++i) {
-            //            String aql = getPointLookUpAQL(round);
-            //            seq.add(new TimedAction(new RunAQLStringAction(httpClient, restHost, restPort, aql)));
-            String aql = getRangeAQL(round);
-            seq.add(new TimedAction(new RunAQLStringAction(httpClient, restHost, restPort, aql)));
-        }
-    }
-
-    @Override
-    protected void doBuildDataGen(SequentialActionList seq, Map<String, List<String>> dgenPairs) throws Exception {
-        //start datagen
-        SequentialActionList[] protocolActions = new SequentialActionList[nIntervals];
-        for (int i = 0; i < nIntervals; i++) {
-            protocolActions[i] = new SequentialActionList();
-            protocolActions[i].add(new SleepAction(10000));
-            protocolActions[i].add(new RunRESTIOWaitAction(httpClient, restHost, restPort));
-            protocolActions[i].add(new SleepAction(10000));
-            doBuildProtocolAction(protocolActions[i], i);
-        }
-
-        int nDgens = 0;
-        for (List<String> v : dgenPairs.values()) {
-            nDgens += v.size();
-        }
-        final OrchestratorServer oServer = new OrchestratorServer(orchPort, nDgens, nIntervals, protocolActions);
-
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.start();
-            }
-        });
-
-        ParallelActionSet dgenActions = new ParallelActionSet();
-        int partition = 0;
-
-        // run dgen
-        for (String dgenHost : dgenPairs.keySet()) {
-            final List<String> rcvrs = dgenPairs.get(dgenHost);
-            final int p = partition;
-            dgenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("datagenrunner").toString();
-                    return StringUtils.join(new String[] { binary, "-si", "" + locationSampleInterval, "-of",
-                            openStreetMapFilePath, "-p", "" + p, "-di", "" + dataInterval, "-ni", "" + nIntervals,
-                            "-oh", orchHost, "-op", "" + orchPort, ipPortPairs }, " ");
-                }
-            });
-            partition += rcvrs.size();
-        }
-        seq.add(dgenActions);
-
-        // wait until all dgen / queries are done
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.awaitFinished();
-            }
-        });
-    }
-
-    private String getRangeQueryTemplate() throws IOException {
-        Path aqlTemplateFilePath = localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_q2.aql");
-        return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlTemplateFilePath))).toString();
-    }
-
-    private String getPointQueryTemplate() throws IOException {
-        Path aqlTemplateFilePath = localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_q1.aql");
-        return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlTemplateFilePath))).toString();
-    }
-
-    protected String getPointLookUpAQL(int round) {
-        ByteBuffer bb = ByteBuffer.allocate(8);
-        bb.put((byte) 0);
-        bb.put((byte) randGen.nextInt(N_PARTITIONS));
-        bb.putShort((short) 0);
-        bb.putInt(randGen.nextInt((int) (((1 + round) * dataInterval) / 1000)));
-        bb.flip();
-        long key = bb.getLong();
-        return pointQueryTemplate.replaceAll("\\$KEY\\$", Long.toString(key));
-    }
-
-    protected String getRangeAQL(int round) {
-        long numKeys = (((1 + round) * dataInterval) / 1000) * N_PARTITIONS;
-        long rangeSize = (long) ((EXPECTED_RANGE_CARDINALITY / (double) numKeys) * DOMAIN_SIZE);
-        int lowKey = randGen.nextInt();
-        long maxLowKey = Integer.MAX_VALUE - rangeSize;
-        if (lowKey > maxLowKey) {
-            lowKey = (int) maxLowKey;
-        }
-        int highKey = (int) (lowKey + rangeSize);
-        return rangeQueryTemplate.replaceAll("\\$LKEY\\$", Long.toString(lowKey)).replaceAll("\\$HKEY\\$",
-                Long.toString(highKey));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment9Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment9Builder.java
deleted file mode 100644
index bd3067d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperiment9Builder.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.IAction;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.RunAQLStringAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.OrchestratorServer9;
-import org.apache.asterix.experiment.client.OrchestratorServer9.IProtocolActionBuilder;
-import org.apache.commons.lang3.StringUtils;
-
-public abstract class AbstractExperiment9Builder extends AbstractLSMBaseExperimentBuilder {
-
-    private static final long DOMAIN_SIZE = (1L << 32);
-
-    private static final long EXPECTED_RANGE_CARDINALITY = 1000;
-
-    private static int N_PARTITIONS = 16;
-
-    private final int nIntervals;
-
-    private final String orchHost;
-
-    private final int orchPort;
-
-    protected final long dataInterval;
-
-    protected final int nQueryRuns;
-
-    protected final Random randGen;
-
-    public AbstractExperiment9Builder(String name, LSMExperimentSetRunnerConfig config, String clusterConfigFileName,
-            String ingestFileName, String dgenFileName) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, null);
-        nIntervals = config.getNIntervals();
-        orchHost = config.getOrchestratorHost();
-        orchPort = config.getOrchestratorPort();
-        dataInterval = config.getDataInterval();
-        this.nQueryRuns = config.getNQueryRuns();
-        this.randGen = new Random();
-    }
-
-    @Override
-    protected void doBuildDataGen(SequentialActionList seq, Map<String, List<String>> dgenPairs) throws IOException {
-        int nDgens = 0;
-        for (List<String> v : dgenPairs.values()) {
-            nDgens += v.size();
-        }
-        final OrchestratorServer9 oServer = new OrchestratorServer9(orchPort, nDgens, nIntervals,
-                new ProtocolActionBuilder());
-
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.start();
-            }
-        });
-
-        ParallelActionSet dgenActions = new ParallelActionSet();
-        int partition = 0;
-
-        // run dgen
-        for (String dgenHost : dgenPairs.keySet()) {
-            final List<String> rcvrs = dgenPairs.get(dgenHost);
-            final int p = partition;
-            dgenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("datagenrunner").toString();
-                    return StringUtils.join(new String[] { binary, "-si", "" + locationSampleInterval, "-of",
-                            openStreetMapFilePath, "-p", "" + p, "-di", "" + dataInterval, "-ni", "" + nIntervals,
-                            "-oh", orchHost, "-op", "" + orchPort, ipPortPairs }, " ");
-                }
-            });
-            partition += rcvrs.size();
-        }
-        seq.add(dgenActions);
-
-        // wait until all dgen / queries are done
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.awaitFinished();
-            }
-        });
-    }
-
-    public class ProtocolActionBuilder implements IProtocolActionBuilder {
-
-        private final String pointQueryTemplate;
-
-        private final String rangeQueryTemplate;
-
-        public ProtocolActionBuilder() throws IOException {
-            this.pointQueryTemplate = getPointQueryTemplate();
-            this.rangeQueryTemplate = getRangeQueryTemplate();
-        }
-
-        private String getRangeQueryTemplate() throws IOException {
-            Path aqlTemplateFilePath = localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_q2.aql");
-            return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlTemplateFilePath))).toString();
-        }
-
-        private String getPointQueryTemplate() throws IOException {
-            Path aqlTemplateFilePath = localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_q1.aql");
-            return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(aqlTemplateFilePath))).toString();
-        }
-
-        @Override
-        public IAction buildAction(int round) throws Exception {
-            SequentialActionList protoAction = new SequentialActionList();
-            IAction pointQueryAction = new TimedAction(
-                    new RunAQLStringAction(httpClient, restHost, restPort, getPointLookUpAQL(round)));
-            IAction rangeQueryAction = new TimedAction(
-                    new RunAQLStringAction(httpClient, restHost, restPort, getRangeAQL(round)));
-            protoAction.add(pointQueryAction);
-            protoAction.add(rangeQueryAction);
-            return protoAction;
-        }
-
-        private String getPointLookUpAQL(int round) throws Exception {
-            ByteBuffer bb = ByteBuffer.allocate(8);
-            bb.put((byte) 0);
-            bb.put((byte) randGen.nextInt(N_PARTITIONS));
-            bb.putShort((short) 0);
-            bb.putInt(randGen.nextInt((int) (((1 + round) * dataInterval) / 1000)));
-            bb.flip();
-            long key = bb.getLong();
-            return pointQueryTemplate.replaceAll("\\$KEY\\$", Long.toString(key));
-        }
-
-        private String getRangeAQL(int round) throws Exception {
-            long numKeys = (((1 + round) * dataInterval) / 1000) * N_PARTITIONS;
-            long rangeSize = (long) ((EXPECTED_RANGE_CARDINALITY / (double) numKeys) * DOMAIN_SIZE);
-            int lowKey = randGen.nextInt();
-            long maxLowKey = Integer.MAX_VALUE - rangeSize;
-            if (lowKey > maxLowKey) {
-                lowKey = (int) maxLowKey;
-            }
-            int highKey = (int) (lowKey + rangeSize);
-            return rangeQueryTemplate.replaceAll("\\$LKEY\\$", Long.toString(lowKey)).replaceAll("\\$HKEY\\$",
-                    Long.toString(highKey));
-        }
-
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperimentBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperimentBuilder.java
deleted file mode 100644
index 1717652..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractExperimentBuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-public abstract class AbstractExperimentBuilder {
-    private final String name;
-
-    protected AbstractExperimentBuilder(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public final Experiment build() throws Exception {
-        Experiment e = new Experiment(name);
-        doBuild(e);
-        return e;
-    }
-
-    protected abstract void doBuild(Experiment e) throws Exception;
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLSMBaseExperimentBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLSMBaseExperimentBuilder.java
deleted file mode 100644
index 1a57480..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLSMBaseExperimentBuilder.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.Set;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.CreateAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.DeleteAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.LogAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.StopAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.RemoteAsterixDriverKill;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-public abstract class AbstractLSMBaseExperimentBuilder extends AbstractExperimentBuilder {
-
-    private static final String ASTERIX_INSTANCE_NAME = "a1";
-
-    private final String logDirSuffix;
-
-    protected final HttpClient httpClient;
-
-    protected final String restHost;
-
-    protected final int restPort;
-
-    private final String managixHomePath;
-
-    protected final String javaHomePath;
-
-    protected final Path localExperimentRoot;
-
-    protected final String username;
-
-    protected final String sshKeyLocation;
-
-    private final int duration;
-
-    private final String clusterConfigFileName;
-
-    private final String ingestFileName;
-
-    protected final String dgenFileName;
-
-    private final String countFileName;
-
-    private final String statFile;
-
-    protected final SequentialActionList lsAction;
-
-    protected final String openStreetMapFilePath;
-    protected final int locationSampleInterval;
-
-    protected final int recordCountPerBatchDuringIngestionOnly;
-    protected final int recordCountPerBatchDuringQuery;
-    protected final long dataGenSleepTimeDuringIngestionOnly;
-    protected final long dataGenSleepTimeDuringQuery;
-
-    public AbstractLSMBaseExperimentBuilder(String name, LSMExperimentSetRunnerConfig config,
-            String clusterConfigFileName, String ingestFileName, String dgenFileName, String countFileName) {
-        super(name);
-        this.logDirSuffix = config.getLogDirSuffix();
-        this.httpClient = new DefaultHttpClient();
-        this.restHost = config.getRESTHost();
-        this.restPort = config.getRESTPort();
-        this.managixHomePath = config.getManagixHome();
-        this.javaHomePath = config.getJavaHome();
-        this.localExperimentRoot = Paths.get(config.getLocalExperimentRoot());
-        this.username = config.getUsername();
-        this.sshKeyLocation = config.getSSHKeyLocation();
-        this.duration = config.getDuration();
-        this.clusterConfigFileName = clusterConfigFileName;
-        this.ingestFileName = ingestFileName;
-        this.dgenFileName = dgenFileName;
-        this.countFileName = countFileName;
-        this.statFile = config.getStatFile();
-        this.lsAction = new SequentialActionList();
-        this.openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        this.locationSampleInterval = config.getLocationSampleInterval();
-        recordCountPerBatchDuringIngestionOnly = config.getRecordCountPerBatchDuringIngestionOnly();
-        recordCountPerBatchDuringQuery = config.getRecordCountPerBatchDuringQuery();
-        dataGenSleepTimeDuringIngestionOnly = config.getDataGenSleepTimeDuringIngestionOnly();
-        dataGenSleepTimeDuringQuery = config.getDataGenSleepTimeDuringQuery();
-    }
-
-    protected abstract void doBuildDDL(SequentialActionList seq);
-
-    protected void doPost(SequentialActionList seq) {
-    }
-
-    protected void doBuildDataGen(SequentialActionList seq, final Map<String, List<String>> dgenPairs) throws Exception {
-
-        //start datagen
-        ParallelActionSet dgenActions = new ParallelActionSet();
-        int partition = 0;
-        for (String dgenHost : dgenPairs.keySet()) {
-            final List<String> rcvrs = dgenPairs.get(dgenHost);
-            final int p = partition;
-            dgenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("datagenrunner").toString();
-                    if (openStreetMapFilePath == null) {
-                        return StringUtils.join(new String[] { binary, "-rcbi",
-                                "" + recordCountPerBatchDuringIngestionOnly, "-rcbq",
-                                "" + recordCountPerBatchDuringQuery, "-dsti", "" + dataGenSleepTimeDuringIngestionOnly,
-                                "-dstq", "" + dataGenSleepTimeDuringQuery, "-si", "" + locationSampleInterval, "-p",
-                                "" + p, "-d", "" + duration, ipPortPairs }, " ");
-                    } else {
-                        return StringUtils.join(new String[] { binary, "-rcbi",
-                                "" + recordCountPerBatchDuringIngestionOnly, "-rcbq",
-                                "" + recordCountPerBatchDuringQuery, "-dsti", "" + dataGenSleepTimeDuringIngestionOnly,
-                                "-dstq", "" + dataGenSleepTimeDuringQuery, "-si", "" + locationSampleInterval, "-of",
-                                openStreetMapFilePath, "-p", "" + p, "-d", "" + duration, ipPortPairs }, " ");
-                    }
-                }
-            });
-            partition += rcvrs.size();
-        }
-        seq.add(dgenActions);
-    }
-
-    @Override
-    protected void doBuild(Experiment e) throws Exception {
-        SequentialActionList execs = new SequentialActionList();
-
-        String clusterConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(clusterConfigFileName).toString();
-        String asterixConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(LSMExperimentConstants.ASTERIX_CONFIGURATION).toString();
-
-        //create instance
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new DeleteAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new SleepAction(30000));
-        execs.add(new CreateAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, clusterConfigPath,
-                asterixConfigPath));
-
-        //run ddl statements
-        execs.add(new SleepAction(15000));
-        // TODO: implement retry handler
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(LSMExperimentConstants.BASE_TYPES)));
-        doBuildDDL(execs);
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot
-                .resolve(LSMExperimentConstants.AQL_DIR).resolve(LSMExperimentConstants.BASE_DIR)
-                .resolve(ingestFileName)));
-
-        Map<String, List<String>> dgenPairs = readDatagenPairs(localExperimentRoot.resolve(
-                LSMExperimentConstants.DGEN_DIR).resolve(dgenFileName));
-        final Set<String> ncHosts = new HashSet<>();
-        for (List<String> ncHostList : dgenPairs.values()) {
-            for (String ncHost : ncHostList) {
-                ncHosts.add(ncHost.split(":")[0]);
-            }
-        }
-
-        if (statFile != null) {
-            ParallelActionSet ioCountActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -d -m sh -c \"sar -b -u 1 > " + statFile + "\"";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountActions);
-        }
-
-        SequentialActionList postLSAction = new SequentialActionList();
-        File file = new File(clusterConfigPath);
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        final Cluster cluster = (Cluster) unmarshaller.unmarshal(file);
-        String[] storageRoots = cluster.getIodevices().split(",");
-        for (String ncHost : ncHosts) {
-            for (final String sRoot : storageRoots) {
-                lsAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-                postLSAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-
-            }
-        }
-
-        // main exp
-        doBuildDataGen(execs, dgenPairs);
-
-        //        if (statFile != null) {
-        //            ParallelActionSet ioCountKillActions = new ParallelActionSet();
-        //            for (String ncHost : ncHosts) {
-        //                ioCountKillActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-        //
-        //                    @Override
-        //                    protected String getCommand() {
-        //                        String cmd = "screen -X -S `screen -list | grep Detached | awk '{print $1}'` quit";
-        //                        return cmd;
-        //                    }
-        //                });
-        //            }
-        //            execs.add(ioCountKillActions);
-        //        }
-
-        execs.add(new SleepAction(10000));
-        if (countFileName != null) {
-            execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                    LSMExperimentConstants.AQL_DIR).resolve(countFileName)));
-        }
-
-        execs.add(postLSAction);
-        doPost(execs);
-        ParallelActionSet killCmds = new ParallelActionSet();
-        for (String ncHost : ncHosts) {
-            killCmds.add(new RemoteAsterixDriverKill(ncHost, username, sshKeyLocation));
-        }
-        //killCmds.add(new RemoteAsterixDriverKill(restHost, username, sshKeyLocation));
-        execs.add(killCmds);
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        if (statFile != null) {
-            ParallelActionSet collectIOActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                collectIOActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "cp " + statFile + " " + cluster.getLogDir();
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(collectIOActions);
-        }
-
-        //collect profile information
-        //        if (ExperimentProfiler.PROFILE_MODE) {
-        //            if (!SpatialIndexProfiler.PROFILE_HOME_DIR.contentEquals(cluster.getLogDir())) {
-        //                ParallelActionSet collectProfileInfo = new ParallelActionSet();
-        //                for (String ncHost : ncHosts) {
-        //                    collectProfileInfo.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-        //                        @Override
-        //                        protected String getCommand() {
-        //                            String cmd = "mv " + SpatialIndexProfiler.PROFILE_HOME_DIR + "*.txt " + cluster.getLogDir();
-        //                            return cmd;
-        //                        }
-        //                    });
-        //                }
-        //                execs.add(collectProfileInfo);
-        //            }
-        //        }
-
-        execs.add(new LogAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, localExperimentRoot
-                .resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix).resolve(getName()).toString()));
-
-        if (getName().contains("SpatialIndexExperiment2") || getName().contains("SpatialIndexExperiment5")) {
-            //get query result file
-            SequentialActionList getQueryResultFileActions = new SequentialActionList();
-            final String queryResultFilePath = openStreetMapFilePath.substring(0,
-                    openStreetMapFilePath.lastIndexOf(File.separator))
-                    + File.separator + "QueryGenResult-*.txt";
-            for (final String qgenHost : dgenPairs.keySet()) {
-                getQueryResultFileActions.add(new AbstractRemoteExecutableAction(restHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "scp "
-                                + username
-                                + "@"
-                                + qgenHost
-                                + ":"
-                                + queryResultFilePath
-                                + " "
-                                + localExperimentRoot.resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix)
-                                        .resolve(getName()).toString();
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(getQueryResultFileActions);
-        }
-
-        e.addBody(execs);
-    }
-
-    protected Map<String, List<String>> readDatagenPairs(Path p) throws IOException {
-        Map<String, List<String>> dgenPairs = new HashMap<>();
-        Scanner s = new Scanner(p, StandardCharsets.UTF_8.name());
-        try {
-            while (s.hasNextLine()) {
-                String line = s.nextLine();
-                String[] pair = line.split("\\s+");
-                List<String> vals = dgenPairs.get(pair[0]);
-                if (vals == null) {
-                    vals = new ArrayList<>();
-                    dgenPairs.put(pair[0], vals);
-                }
-                vals.add(pair[1]);
-            }
-        } finally {
-            s.close();
-        }
-        return dgenPairs;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLocalExperimentBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLocalExperimentBuilder.java
deleted file mode 100644
index 315ad9c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractLocalExperimentBuilder.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-
-public abstract class AbstractLocalExperimentBuilder extends AbstractExperimentBuilder {
-
-    private final int nNodeControllers;
-
-    protected AbstractLocalExperimentBuilder(String name, int nNodeControllers) {
-        super(name);
-        this.nNodeControllers = nNodeControllers;
-    }
-
-    protected abstract void addPre(SequentialActionList pre);
-
-    protected abstract void addPost(SequentialActionList post);
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractPerfLoadBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractPerfLoadBuilder.java
deleted file mode 100644
index 472d610..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractPerfLoadBuilder.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.*;
-import org.apache.asterix.experiment.action.derived.ManagixActions.CreateAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.DeleteAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.LogAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.StopAsterixManagixAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.LSMPerfConstants;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
-
-/**
- * This class is used to create experiments for spatial index static data evaluation, that is, no ingestion is involved.
- * Also, there is no orchestration server involved in this experiment builder.
- */
-public abstract class AbstractPerfLoadBuilder extends AbstractExperimentBuilder {
-
-    private static final String ASTERIX_INSTANCE_NAME = "a1";
-
-    private final String logDirSuffix;
-
-    protected final HttpClient httpClient;
-
-    protected final String restHost;
-
-    protected final int restPort;
-
-    private final String managixHomePath;
-
-    protected final String javaHomePath;
-
-    protected final Path localExperimentRoot;
-
-    protected final String username;
-
-    protected final String sshKeyLocation;
-
-    private final String clusterConfigFileName;
-
-    protected final String dgenFileName;
-
-    private final String countFileName;
-
-    private final String statFile;
-
-    protected final SequentialActionList lsAction;
-
-    protected final String openStreetMapFilePath;
-
-    protected final int locationSampleInterval;
-
-    protected final String loadAQLFilePath;
-
-    protected final String querySQLPPFileName;
-
-    public AbstractPerfLoadBuilder(String name, LSMExperimentSetRunnerConfig config,
-                                   String clusterConfigFileName, String dgenFileName,
-                                   String countFileName, String loadAQLFileName, String querySQLPPFileName) {
-        super(name);
-        this.logDirSuffix = config.getLogDirSuffix();
-        this.httpClient = new DefaultHttpClient();
-        this.restHost = config.getRESTHost();
-        this.restPort = config.getRESTPort();
-        this.managixHomePath = config.getManagixHome();
-        this.javaHomePath = config.getJavaHome();
-        this.localExperimentRoot = Paths.get(config.getLocalExperimentRoot());
-        this.username = config.getUsername();
-        this.sshKeyLocation = config.getSSHKeyLocation();
-        this.clusterConfigFileName = clusterConfigFileName;
-        this.dgenFileName = dgenFileName;
-        this.countFileName = countFileName;
-        this.statFile = config.getStatFile();
-        this.lsAction = new SequentialActionList();
-        this.openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        this.locationSampleInterval = config.getLocationSampleInterval();
-        this.loadAQLFilePath = loadAQLFileName;
-        this.querySQLPPFileName = querySQLPPFileName;
-    }
-
-    protected abstract void doBuildDDL(SequentialActionList seq);
-
-    @Override
-    protected void doBuild(Experiment e) throws IOException, JAXBException {
-        SequentialActionList execs = new SequentialActionList();
-
-        String clusterConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(clusterConfigFileName).toString();
-        String asterixConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(LSMExperimentConstants.ASTERIX_CONFIGURATION).toString();
-
-        //stop/delete/create instance
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new DeleteAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new SleepAction(30000));
-        execs.add(new CreateAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, clusterConfigPath,
-                asterixConfigPath));
-
-        //ddl statements
-        execs.add(new SleepAction(15000));
-        // TODO: implement retry handler
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(LSMPerfConstants.BASE_TYPES)));
-        doBuildDDL(execs);
-
-        //prepare io state action in NC node(s)
-        Map<String, List<String>> dgenPairs = readDatagenPairs(localExperimentRoot.resolve(
-                LSMExperimentConstants.DGEN_DIR).resolve(dgenFileName));
-        final Set<String> ncHosts = new HashSet<>();
-        for (List<String> ncHostList : dgenPairs.values()) {
-            for (String ncHost : ncHostList) {
-                ncHosts.add(ncHost.split(":")[0]);
-            }
-        }
-        if (statFile != null) {
-            ParallelActionSet ioCountActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -d -m sh -c \"sar -b -u 1 > " + statFile + "\"";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountActions);
-        }
-
-        //prepare post ls action
-        File file = new File(clusterConfigPath);
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        final Cluster cluster = (Cluster) unmarshaller.unmarshal(file);
-        String[] storageRoots = cluster.getIodevices().split(",");
-
-        //---------- main experiment body begins -----------
-
-        //run DDL + Load
-        execs.add(new TimedAction(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(loadAQLFilePath))));
-
-        //execute SQL++ Queries
-        execs.add(new TimedAction(new RunSQLPPFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(querySQLPPFileName),
-                localExperimentRoot.resolve(LSMPerfConstants.RESULT_FILE))));
-
-        //---------- main experiment body ends -----------
-
-        //kill io state action
-        if (statFile != null) {
-            ParallelActionSet ioCountKillActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountKillActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -X -S `screen -list | grep Detached | awk '{print $1}'` quit";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountKillActions);
-        }
-
-        //total record count
-        execs.add(new SleepAction(10000));
-        if (countFileName != null) {
-            execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                    LSMExperimentConstants.AQL_DIR).resolve(countFileName)));
-        }
-
-
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-
-        //prepare to collect io state by putting the state file into asterix log dir
-        if (statFile != null) {
-            ParallelActionSet collectIOActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                collectIOActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "cp " + statFile + " " + cluster.getLogDir();
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(collectIOActions);
-        }
-
-        //collect cc and nc logs
-        execs.add(new LogAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, localExperimentRoot
-                .resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix).resolve(getName()).toString()));
-
-        e.addBody(execs);
-    }
-
-    protected Map<String, List<String>> readDatagenPairs(Path p) throws IOException {
-        Map<String, List<String>> dgenPairs = new HashMap<>();
-        Scanner s = new Scanner(p, StandardCharsets.UTF_8.name());
-        try {
-            while (s.hasNextLine()) {
-                String line = s.nextLine();
-                String[] pair = line.split("\\s+");
-                List<String> vals = dgenPairs.get(pair[0]);
-                if (vals == null) {
-                    vals = new ArrayList<>();
-                    dgenPairs.put(pair[0], vals);
-                }
-                vals.add(pair[1]);
-            }
-        } finally {
-            s.close();
-        }
-        return dgenPairs;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment2Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment2Builder.java
deleted file mode 100644
index 848ab7c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment2Builder.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.SpatialIndexExperiment2OrchestratorServer;
-import org.apache.commons.lang3.StringUtils;
-
-public abstract class AbstractSpatialIndexExperiment2Builder extends AbstractLSMBaseExperimentBuilder {
-
-    private static final long DOMAIN_SIZE = (1L << 32);
-
-    public static final long QUERY_BEGIN_ROUND = 6;
-
-    private static int N_PARTITIONS = 16;
-
-    private final int nIntervals;
-
-    private final String dataGenOrchHost;
-
-    private final int dataGenOrchPort;
-
-    private final String queryGenOrchHost;
-
-    private final int queryGenOrchPort;
-
-    private final long queryGenDuration;
-
-    protected final long dataInterval;
-
-    protected final int nQueryRuns;
-
-    protected final Random randGen;
-
-    protected final boolean isIndexOnlyPlan;
-
-    public AbstractSpatialIndexExperiment2Builder(String name, LSMExperimentSetRunnerConfig config,
-            String clusterConfigFileName, String ingestFileName, String dgenFileName, boolean isIndexOnlyPlan) {
-        super(name, config, clusterConfigFileName, ingestFileName, dgenFileName, null);
-        nIntervals = config.getNIntervals();
-        dataGenOrchHost = config.getOrchestratorHost();
-        dataGenOrchPort = config.getOrchestratorPort();
-        dataInterval = config.getDataInterval();
-        queryGenOrchHost = config.getQueryOrchestratorHost();
-        queryGenOrchPort = config.getQueryOrchestratorPort();
-        queryGenDuration = config.getQueryDuration();
-        this.nQueryRuns = config.getNQueryRuns();
-        this.randGen = new Random();
-        this.isIndexOnlyPlan = isIndexOnlyPlan;
-    }
-
-    @Override
-    protected void doBuildDataGen(SequentialActionList seq, Map<String, List<String>> dgenPairs) throws Exception {
-        int nDgens = 0;
-        for (List<String> v : dgenPairs.values()) {
-            nDgens += v.size();
-        }
-        final SpatialIndexExperiment2OrchestratorServer oServer = new SpatialIndexExperiment2OrchestratorServer(
-                dataGenOrchPort, nDgens, nIntervals, queryGenOrchPort, nDgens /*for now, query gen uses the same node as data gen*/);
-
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.start();
-            }
-        });
-
-        //prepare data gen runner and query gen runner
-        //note that dgenPairs.keySet() are used as query gen runners' ip address.
-        ParallelActionSet dataAndQueryGenActions = new ParallelActionSet();
-        int partition = 0;
-        for (String dgenHost : dgenPairs.keySet()) {
-            final List<String> rcvrs = dgenPairs.get(dgenHost);
-            final int p = partition;
-            //prepare data gen
-            dataAndQueryGenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("datagenrunner").toString();
-                    if (openStreetMapFilePath == null) {
-                        return StringUtils.join(new String[] { binary, "-rcbi",
-                                "" + recordCountPerBatchDuringIngestionOnly, "-rcbq",
-                                "" + recordCountPerBatchDuringQuery, "-dsti", "" + dataGenSleepTimeDuringIngestionOnly,
-                                "-dstq", "" + dataGenSleepTimeDuringQuery, "-si", "" + locationSampleInterval, "-p",
-                                "" + p, "-di", "" + dataInterval, "-ni", "" + nIntervals, "-qd", "" + queryGenDuration,
-                                "-oh", dataGenOrchHost, "-op", "" + dataGenOrchPort, ipPortPairs }, " ");
-                    } else {
-                        return StringUtils.join(new String[] { binary, "-rcbi",
-                                "" + recordCountPerBatchDuringIngestionOnly, "-rcbq",
-                                "" + recordCountPerBatchDuringQuery, "-dsti", "" + dataGenSleepTimeDuringIngestionOnly,
-                                "-dstq", "" + dataGenSleepTimeDuringQuery, "-si", "" + locationSampleInterval, "-of",
-                                openStreetMapFilePath, "-p", "" + p, "-di", "" + dataInterval, "-ni", "" + nIntervals,
-                                "-qd", "" + queryGenDuration, "-oh", dataGenOrchHost, "-op", "" + dataGenOrchPort,
-                                ipPortPairs }, " ");
-                    }
-                }
-            });
-
-            //prepare query gen
-            dataAndQueryGenActions.add(new AbstractRemoteExecutableAction(dgenHost, username, sshKeyLocation) {
-
-                @Override
-                protected String getCommand() {
-                    String ipPortPairs = StringUtils.join(rcvrs.iterator(), " ");
-                    String binary = "JAVA_HOME=" + javaHomePath + " "
-                            + localExperimentRoot.resolve("bin").resolve("querygenrunner").toString();
-                    if (openStreetMapFilePath == null) {
-                        if (isIndexOnlyPlan) {
-                            return StringUtils.join(new String[] { binary, "-iop", "-p", "" + p, "-qd",
-                                    "" + queryGenDuration, "-qoh", "" + queryGenOrchHost, "-qop",
-                                    "" + queryGenOrchPort, "-rh", restHost, "-rp", "" + restPort }, " ");
-                        } else {
-                            return StringUtils.join(new String[] { binary, "-p", "" + p, "-qd", "" + queryGenDuration,
-                                    "-qoh", "" + queryGenOrchHost, "-qop", "" + queryGenOrchPort, "-rh", restHost,
-                                    "-rp", "" + restPort }, " ");
-                        }
-                    } else {
-                        if (isIndexOnlyPlan) {
-                            return StringUtils.join(new String[] { binary, "-iop", "-of", openStreetMapFilePath, "-p",
-                                    "" + p, "-qd", "" + queryGenDuration, "-qoh", "" + queryGenOrchHost, "-qop",
-                                    "" + queryGenOrchPort, "-rh", restHost, "-rp", "" + restPort }, " ");
-                        } else {
-                            return StringUtils.join(new String[] { binary, "-of", openStreetMapFilePath, "-p", "" + p,
-                                    "-qd", "" + queryGenDuration, "-qoh", "" + queryGenOrchHost, "-qop",
-                                    "" + queryGenOrchPort, "-rh", restHost, "-rp", "" + restPort }, " ");
-                        }
-                    }
-                }
-            });
-
-            partition += rcvrs.size();
-        }
-        seq.add(dataAndQueryGenActions);
-
-        // wait until all dgen / queries are done
-        seq.add(new AbstractAction() {
-
-            @Override
-            protected void doPerform() throws Exception {
-                oServer.awaitFinished();
-            }
-        });
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3PIdxLoadBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3PIdxLoadBuilder.java
deleted file mode 100644
index 6de1c73..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3PIdxLoadBuilder.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.Set;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.CreateAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.DeleteAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.LogAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.StopAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.RemoteAsterixDriverKill;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-/**
- * This class is used to create experiments for spatial index static data evaluation, that is, no ingestion is involved.
- * Also, there is no orchestration server involved in this experiment builder.
- */
-public abstract class AbstractSpatialIndexExperiment3PIdxLoadBuilder extends AbstractExperimentBuilder {
-
-    private static final String ASTERIX_INSTANCE_NAME = "a1";
-
-    private final String logDirSuffix;
-
-    protected final HttpClient httpClient;
-
-    protected final String restHost;
-
-    protected final int restPort;
-
-    private final String managixHomePath;
-
-    protected final String javaHomePath;
-
-    protected final Path localExperimentRoot;
-
-    protected final String username;
-
-    protected final String sshKeyLocation;
-
-    private final int duration;
-
-    private final String clusterConfigFileName;
-
-    private final String ingestFileName;
-
-    protected final String dgenFileName;
-
-    private final String countFileName;
-
-    private final String statFile;
-
-    protected final SequentialActionList lsAction;
-
-    protected final String openStreetMapFilePath;
-
-    protected final int locationSampleInterval;
-
-    protected final String loadAQLFilePath;
-
-    public AbstractSpatialIndexExperiment3PIdxLoadBuilder(String name, LSMExperimentSetRunnerConfig config,
-            String clusterConfigFileName, String ingestFileName, String dgenFileName, String countFileName,
-            String loadAQLFileName) {
-        super(name);
-        this.logDirSuffix = config.getLogDirSuffix();
-        this.httpClient = new DefaultHttpClient();
-        this.restHost = config.getRESTHost();
-        this.restPort = config.getRESTPort();
-        this.managixHomePath = config.getManagixHome();
-        this.javaHomePath = config.getJavaHome();
-        this.localExperimentRoot = Paths.get(config.getLocalExperimentRoot());
-        this.username = config.getUsername();
-        this.sshKeyLocation = config.getSSHKeyLocation();
-        this.duration = config.getDuration();
-        this.clusterConfigFileName = clusterConfigFileName;
-        this.ingestFileName = ingestFileName;
-        this.dgenFileName = dgenFileName;
-        this.countFileName = countFileName;
-        this.statFile = config.getStatFile();
-        this.lsAction = new SequentialActionList();
-        this.openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        this.locationSampleInterval = config.getLocationSampleInterval();
-        this.loadAQLFilePath = loadAQLFileName;
-    }
-
-    protected abstract void doBuildDDL(SequentialActionList seq);
-
-    protected void doPost(SequentialActionList seq) {
-    }
-
-    protected void doBuildDataGen(SequentialActionList seq, final Map<String, List<String>> dgenPairs) throws Exception {
-    }
-
-    @Override
-    protected void doBuild(Experiment e) throws Exception {
-        SequentialActionList execs = new SequentialActionList();
-
-        String clusterConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(clusterConfigFileName).toString();
-        String asterixConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(LSMExperimentConstants.ASTERIX_CONFIGURATION).toString();
-
-        //stop/delete/create instance
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new DeleteAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new SleepAction(30000));
-        execs.add(new CreateAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, clusterConfigPath,
-                asterixConfigPath));
-
-        //ddl statements
-        execs.add(new SleepAction(15000));
-        // TODO: implement retry handler
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(LSMExperimentConstants.BASE_TYPES)));
-        doBuildDDL(execs);
-
-        //prepare io state action in NC node(s)
-        Map<String, List<String>> dgenPairs = readDatagenPairs(localExperimentRoot.resolve(
-                LSMExperimentConstants.DGEN_DIR).resolve(dgenFileName));
-        final Set<String> ncHosts = new HashSet<>();
-        for (List<String> ncHostList : dgenPairs.values()) {
-            for (String ncHost : ncHostList) {
-                ncHosts.add(ncHost.split(":")[0]);
-            }
-        }
-        if (statFile != null) {
-            ParallelActionSet ioCountActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -d -m sh -c \"sar -b -u 1 > " + statFile + "\"";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountActions);
-        }
-
-        //prepare post ls action
-        SequentialActionList postLSAction = new SequentialActionList();
-        File file = new File(clusterConfigPath);
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        final Cluster cluster = (Cluster) unmarshaller.unmarshal(file);
-        String[] storageRoots = cluster.getIodevices().split(",");
-        for (String ncHost : ncHosts) {
-            for (final String sRoot : storageRoots) {
-                lsAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-                postLSAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-
-            }
-        }
-
-        //---------- main experiment body begins -----------
-
-        //load data into pidx 
-        execs.add(new TimedAction(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(loadAQLFilePath))));
-
-        //---------- main experiment body ends -----------
-
-        //kill io state action
-        if (statFile != null) {
-            ParallelActionSet ioCountKillActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountKillActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -X -S `screen -list | grep Detached | awk '{print $1}'` quit";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountKillActions);
-        }
-
-        //total record count
-        execs.add(new SleepAction(10000));
-        if (countFileName != null) {
-            execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                    LSMExperimentConstants.AQL_DIR).resolve(countFileName)));
-        }
-
-        //add ls action
-        execs.add(postLSAction);
-
-        //kill asterix cc and nc
-        ParallelActionSet killCmds = new ParallelActionSet();
-        for (String ncHost : ncHosts) {
-            killCmds.add(new RemoteAsterixDriverKill(ncHost, username, sshKeyLocation));
-        }
-        killCmds.add(new RemoteAsterixDriverKill(restHost, username, sshKeyLocation));
-        execs.add(killCmds);
-
-        //stop asterix instance
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-
-        //prepare to collect io state by putting the state file into asterix log dir
-        if (statFile != null) {
-            ParallelActionSet collectIOActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                collectIOActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "cp " + statFile + " " + cluster.getLogDir();
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(collectIOActions);
-        }
-
-        //collect cc and nc logs
-        execs.add(new LogAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, localExperimentRoot
-                .resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix).resolve(getName()).toString()));
-
-        e.addBody(execs);
-    }
-
-    protected Map<String, List<String>> readDatagenPairs(Path p) throws IOException {
-        Map<String, List<String>> dgenPairs = new HashMap<>();
-        Scanner s = new Scanner(p, StandardCharsets.UTF_8.name());
-        try {
-            while (s.hasNextLine()) {
-                String line = s.nextLine();
-                String[] pair = line.split("\\s+");
-                List<String> vals = dgenPairs.get(pair[0]);
-                if (vals == null) {
-                    vals = new ArrayList<>();
-                    dgenPairs.put(pair[0], vals);
-                }
-                vals.add(pair[1]);
-            }
-        } finally {
-            s.close();
-        }
-        return dgenPairs;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder.java
deleted file mode 100644
index 9720346..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.Inet4Address;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Scanner;
-import java.util.Set;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.experiment.action.base.IAction;
-import org.apache.asterix.experiment.action.base.ParallelActionSet;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.AbstractRemoteExecutableAction;
-import org.apache.asterix.experiment.action.derived.CloseOutputStreamAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.LogAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.StartAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.ManagixActions.StopAsterixManagixAction;
-import org.apache.asterix.experiment.action.derived.RemoteAsterixDriverKill;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.action.derived.RunAQLStringAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.hyracks.api.util.ExperimentProfilerUtils;
-
-/**
- * This class is used to create experiments for spatial index static data evaluation, that is, no ingestion is involved.
- * Also, there is no orchestration server involved in this experiment builder.
- */
-public abstract class AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder extends AbstractExperimentBuilder {
-
-    private static final boolean PROFILE_JOB_LAUCHING_OVERHEAD = false;
-
-    private static final String ASTERIX_INSTANCE_NAME = "a1";
-    private static final int SKIP_LINE_COUNT = 223;
-    private static final int CACHE_WARM_UP_QUERY_COUNT = 500;
-    private static final int SELECT_QUERY_COUNT = 5000;
-    private static final int JOIN_QUERY_COUNT = 1000;
-
-    private static final int JOIN_CANDIDATE_COUNT = 100;
-    private static final int MAX_QUERY_SEED = 10000;
-
-    private int querySeed = 0;
-
-    private int queryCount = 0;
-
-    private final String logDirSuffix;
-
-    protected final HttpClient httpClient;
-
-    protected final String restHost;
-
-    protected final int restPort;
-
-    private final String managixHomePath;
-
-    protected final String javaHomePath;
-
-    protected final Path localExperimentRoot;
-
-    protected final String username;
-
-    protected final String sshKeyLocation;
-
-    private final int duration;
-
-    private final String clusterConfigFileName;
-
-    private final String ingestFileName;
-
-    protected final String dgenFileName;
-
-    private final String countFileName;
-
-    private final String statFile;
-
-    protected final SequentialActionList lsAction;
-
-    protected final String openStreetMapFilePath;
-
-    protected final int locationSampleInterval;
-
-    protected final String createAQLFilePath;
-
-    protected final String querySeedFilePath;
-
-    private final float[] radiusType = new float[] { 0.00001f, 0.0001f, 0.001f, 0.01f, 0.1f };
-    private int radiusIter = 0;
-    private final Random randGen;
-    private BufferedReader br;
-    private final boolean isIndexOnlyPlan;
-    private String outputFilePath;
-    private FileOutputStream outputFos;
-
-    public AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder(String name, LSMExperimentSetRunnerConfig config,
-            String clusterConfigFileName, String ingestFileName, String dgenFileName, String countFileName,
-            String createAQLFileName, boolean isIndexOnlyPlan) {
-        super(name);
-        this.logDirSuffix = config.getLogDirSuffix();
-        this.httpClient = new DefaultHttpClient();
-        this.restHost = config.getRESTHost();
-        this.restPort = config.getRESTPort();
-        this.managixHomePath = config.getManagixHome();
-        this.javaHomePath = config.getJavaHome();
-        this.localExperimentRoot = Paths.get(config.getLocalExperimentRoot());
-        this.username = config.getUsername();
-        this.sshKeyLocation = config.getSSHKeyLocation();
-        this.duration = config.getDuration();
-        this.clusterConfigFileName = clusterConfigFileName;
-        this.ingestFileName = ingestFileName;
-        this.dgenFileName = dgenFileName;
-        this.countFileName = countFileName;
-        this.statFile = config.getStatFile();
-        this.lsAction = new SequentialActionList();
-        this.openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        this.locationSampleInterval = config.getLocationSampleInterval();
-        this.createAQLFilePath = createAQLFileName;
-        this.querySeedFilePath = config.getQuerySeedFilePath();
-        this.randGen = new Random();
-        this.isIndexOnlyPlan = isIndexOnlyPlan;
-    }
-
-    protected void doPost(SequentialActionList seq) {
-    }
-
-    protected void doBuildDataGen(SequentialActionList seq, final Map<String, List<String>> dgenPairs) throws Exception {
-    }
-
-    @Override
-    protected void doBuild(Experiment e) throws Exception {
-        SequentialActionList execs = new SequentialActionList();
-
-        String clusterConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(clusterConfigFileName).toString();
-        String asterixConfigPath = localExperimentRoot.resolve(LSMExperimentConstants.CONFIG_DIR)
-                .resolve(LSMExperimentConstants.ASTERIX_CONFIGURATION).toString();
-
-        //start asterix instance
-        execs.add(new StartAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-        execs.add(new SleepAction(30000));
-
-        //prepare io state action in NC node(s)
-        Map<String, List<String>> dgenPairs = readDatagenPairs(localExperimentRoot.resolve(
-                LSMExperimentConstants.DGEN_DIR).resolve(dgenFileName));
-        final Set<String> ncHosts = new HashSet<>();
-        for (List<String> ncHostList : dgenPairs.values()) {
-            for (String ncHost : ncHostList) {
-                ncHosts.add(ncHost.split(":")[0]);
-            }
-        }
-        if (statFile != null) {
-            ParallelActionSet ioCountActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                ioCountActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "screen -d -m sh -c \"sar -b -u 1 > " + statFile + "\"";
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(ioCountActions);
-        }
-
-        //prepare post ls action
-        SequentialActionList postLSAction = new SequentialActionList();
-        File file = new File(clusterConfigPath);
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        final Cluster cluster = (Cluster) unmarshaller.unmarshal(file);
-        String[] storageRoots = cluster.getIodevices().split(",");
-        for (String ncHost : ncHosts) {
-            for (final String sRoot : storageRoots) {
-                lsAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-                postLSAction.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-                    @Override
-                    protected String getCommand() {
-                        return "ls -Rl " + sRoot;
-                    }
-                });
-
-            }
-        }
-
-        //---------- main experiment body begins -----------
-
-        try {
-            outputFilePath = openStreetMapFilePath.substring(0, openStreetMapFilePath.lastIndexOf(File.separator))
-                    + File.separator + "QueryGenResult-" + getName() + "-"
-                    + Inet4Address.getLocalHost().getHostAddress() + ".txt";
-            outputFos = ExperimentProfilerUtils.openOutputFile(outputFilePath);
-        } catch (Exception e1) {
-            e1.printStackTrace();
-            return;
-        }
-
-        //delete all existing secondary indexes if any
-        execs.add(new RunAQLStringAction(httpClient, restHost, restPort,
-                "use dataverse experiments; drop index Tweets.dhbtreeLocation;", outputFos));
-        execs.add(new RunAQLStringAction(httpClient, restHost, restPort,
-                "use dataverse experiments; drop index Tweets.dhvbtreeLocation;", outputFos));
-        execs.add(new RunAQLStringAction(httpClient, restHost, restPort,
-                "use dataverse experiments; drop index Tweets.rtreeLocation;", outputFos));
-        execs.add(new RunAQLStringAction(httpClient, restHost, restPort,
-                "use dataverse experiments; drop index Tweets.shbtreeLocation;", outputFos));
-        execs.add(new RunAQLStringAction(httpClient, restHost, restPort,
-                "use dataverse experiments; drop index Tweets.sifLocation;", outputFos));
-
-        //create secondary index 
-        execs.add(new TimedAction(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(createAQLFilePath), outputFos), outputFos));
-
-        //run count query for cleaning up OS buffer cache
-        if (countFileName != null) {
-            execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                    LSMExperimentConstants.AQL_DIR).resolve(countFileName), outputFos));
-        }
-
-        //run cache warm-up queries: run CACHE_WARM_UP_QUERY_COUNT select queries
-        br = new BufferedReader(new FileReader(querySeedFilePath));
-        radiusIter = 0;
-        for (int i = 0; i < CACHE_WARM_UP_QUERY_COUNT; i++) {
-            execs.add(getSelectQuery(isIndexOnlyPlan));
-        }
-
-        radiusIter = 0;
-        //run queries for measurement: run SELECT_QUERY_COUNT select queries
-        for (int i = 0; i < SELECT_QUERY_COUNT; i++) {
-            execs.add(getSelectQuery(isIndexOnlyPlan));
-        }
-
-        radiusIter = 0;
-        //run queries for measurement: run JOIN_QUERY_COUNT join queries
-        for (int i = 0; i < JOIN_QUERY_COUNT; i++) {
-            execs.add(getJoinQuery(isIndexOnlyPlan));
-        }
-
-        //---------- main experiment body ends -----------
-
-        //kill io state action
-        //        if (statFile != null) {
-        //            ParallelActionSet ioCountKillActions = new ParallelActionSet();
-        //            for (String ncHost : ncHosts) {
-        //                ioCountKillActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-        //
-        //                    @Override
-        //                    protected String getCommand() {
-        //                        String cmd = "screen -X -S `screen -list | grep Detached | awk '{print $1}'` quit";
-        //                        return cmd;
-        //                    }
-        //                });
-        //            }
-        //            execs.add(ioCountKillActions);
-        //        }
-
-        //add ls action
-        execs.add(postLSAction);
-
-        //kill asterix cc and nc
-        ParallelActionSet killCmds = new ParallelActionSet();
-        for (String ncHost : ncHosts) {
-            killCmds.add(new RemoteAsterixDriverKill(ncHost, username, sshKeyLocation));
-        }
-        killCmds.add(new RemoteAsterixDriverKill(restHost, username, sshKeyLocation));
-        execs.add(killCmds);
-
-        //stop asterix instance
-        execs.add(new StopAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME));
-
-        //prepare to collect io state by putting the state file into asterix log dir
-        if (statFile != null) {
-            ParallelActionSet collectIOActions = new ParallelActionSet();
-            for (String ncHost : ncHosts) {
-                collectIOActions.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-
-                    @Override
-                    protected String getCommand() {
-                        String cmd = "cp " + statFile + " " + cluster.getLogDir();
-                        return cmd;
-                    }
-                });
-            }
-            execs.add(collectIOActions);
-        }
-
-        //collect profile information
-        //        if (ExperimentProfiler.PROFILE_MODE) {
-        //            if (!SpatialIndexProfiler.PROFILE_HOME_DIR.contentEquals(cluster.getLogDir())) {
-        //                ParallelActionSet collectProfileInfo = new ParallelActionSet();
-        //                for (String ncHost : ncHosts) {
-        //                    collectProfileInfo.add(new AbstractRemoteExecutableAction(ncHost, username, sshKeyLocation) {
-        //                        @Override
-        //                        protected String getCommand() {
-        //                            String cmd = "mv " + SpatialIndexProfiler.PROFILE_HOME_DIR + "*.txt " + cluster.getLogDir();
-        //                            return cmd;
-        //                        }
-        //                    });
-        //                }
-        //                execs.add(collectProfileInfo);
-        //            }
-        //        }
-
-        //collect cc and nc logs
-        execs.add(new LogAsterixManagixAction(managixHomePath, ASTERIX_INSTANCE_NAME, localExperimentRoot
-                .resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix).resolve(getName()).toString()));
-
-        //get query result file
-        final String queryResultFilePath = outputFilePath;
-        execs.add(new AbstractRemoteExecutableAction(restHost, username, sshKeyLocation) {
-            @Override
-            protected String getCommand() {
-                String cmd = "mv "
-                        + queryResultFilePath
-                        + " "
-                        + localExperimentRoot.resolve(LSMExperimentConstants.LOG_DIR + "-" + logDirSuffix)
-                                .resolve(getName()).toString();
-                return cmd;
-            }
-        });
-        //close the outputStream
-        execs.add(new CloseOutputStreamAction(outputFos));
-
-        e.addBody(execs);
-    }
-
-    protected Map<String, List<String>> readDatagenPairs(Path p) throws IOException {
-        Map<String, List<String>> dgenPairs = new HashMap<>();
-        Scanner s = new Scanner(p, StandardCharsets.UTF_8.name());
-        try {
-            while (s.hasNextLine()) {
-                String line = s.nextLine();
-                String[] pair = line.split("\\s+");
-                List<String> vals = dgenPairs.get(pair[0]);
-                if (vals == null) {
-                    vals = new ArrayList<>();
-                    dgenPairs.put(pair[0], vals);
-                }
-                vals.add(pair[1]);
-            }
-        } finally {
-            s.close();
-        }
-        return dgenPairs;
-    }
-
-    private SequentialActionList getSelectQuery(boolean isIndexOnlyPlan) throws IOException {
-        //prepare radius and center point
-        int skipLineCount = SKIP_LINE_COUNT;
-        int lineCount = 0;
-        String line = null;;
-
-        querySeed += SKIP_LINE_COUNT;
-        if (querySeed > MAX_QUERY_SEED) {
-            querySeed -= MAX_QUERY_SEED;
-        }
-
-        while (lineCount < skipLineCount) {
-            if ((line = br.readLine()) == null) {
-                //reopen file
-                br.close();
-                br = new BufferedReader(new FileReader(querySeedFilePath));
-                line = br.readLine();
-            }
-            lineCount++;
-        }
-
-        int beginIdx = line.indexOf("(", line.indexOf("point"));
-        int endIdx = line.indexOf(")", line.indexOf("point")) + 1;
-        String point = line.substring(beginIdx, endIdx);
-
-        //create action
-        SequentialActionList sAction = new SequentialActionList();
-        IAction queryAction = new TimedAction(new RunAQLStringAction(httpClient, restHost, restPort, getSelectQueryAQL(
-                radiusType[radiusIter++ % radiusType.length], point, isIndexOnlyPlan), outputFos), outputFos);
-        sAction.add(queryAction);
-
-        return sAction;
-    }
-
-    private String getSelectQueryAQL(float radius, String point, boolean isIndexOnlyPlan) {
-        if (PROFILE_JOB_LAUCHING_OVERHEAD) {
-            Random random = new Random();
-            int btreeExtraFieldKey = random.nextInt();
-            int rangeSize = (int) (radius * 100000000L);
-            if (btreeExtraFieldKey == Integer.MIN_VALUE) {
-                btreeExtraFieldKey = Integer.MIN_VALUE + 1;
-            }
-            if (btreeExtraFieldKey + rangeSize >= Integer.MAX_VALUE) {
-                btreeExtraFieldKey = Integer.MAX_VALUE - rangeSize - 1;
-            }
-
-            StringBuilder sb = new StringBuilder();
-            sb.append("use dataverse experiments; ");
-            sb.append("count( ");
-            sb.append("for $x in dataset Tweets").append(" ");
-            sb.append("where $x.btree-extra-field1 > int32(\"" + btreeExtraFieldKey
-                    + "\") and $x.btree-extra-field1 < int32(\"" + (btreeExtraFieldKey + rangeSize) + "\")");
-            sb.append("return $x ");
-            sb.append(");");
-
-            System.out.println("[squery" + (queryCount++) + "]" + sb.toString());
-
-            return sb.toString();
-        } else {
-            StringBuilder sb = new StringBuilder();
-            sb.append("use dataverse experiments; ");
-            sb.append("count( ");
-            sb.append("for $x in dataset Tweets").append(" ");
-            sb.append("let $n :=  create-circle( ");
-            sb.append("point").append(point).append(" ");
-            sb.append(", ");
-            sb.append(String.format("%f", radius));
-            sb.append(" ) ");
-            if (isIndexOnlyPlan) {
-                sb.append("where spatial-intersect($x.sender-location, $n) ");
-            } else {
-                sb.append("where spatial-intersect($x.sender-location, $n) and $x.btree-extra-field1 <= int32(\"2147483647\") ");
-            }
-            sb.append("return $x ");
-            sb.append(");");
-
-            System.out.println("[squery" + (queryCount++) + "]" + sb.toString());
-
-            return sb.toString();
-        }
-    }
-
-    private SequentialActionList getJoinQuery(boolean isIndexOnlyPlan) {
-        querySeed += SKIP_LINE_COUNT;
-        if (querySeed > MAX_QUERY_SEED) {
-            querySeed -= MAX_QUERY_SEED;
-        }
-
-        int lowId = querySeed * 10000 + 1;
-        int highId = (querySeed + JOIN_CANDIDATE_COUNT) * 10000 + 1;
-
-        //create action
-        SequentialActionList sAction = new SequentialActionList();
-        IAction queryAction = new TimedAction(new RunAQLStringAction(httpClient, restHost, restPort, getJoinQueryAQL(
-                radiusType[radiusIter++ % (radiusType.length - 1)], lowId, highId, isIndexOnlyPlan), outputFos),
-                outputFos);
-        sAction.add(queryAction);
-
-        return sAction;
-    }
-
-    private String getJoinQueryAQL(float radius, int lowId, int highId, boolean isIndexOnlyPlan) {
-        if (PROFILE_JOB_LAUCHING_OVERHEAD) {
-            Random random = new Random();
-            int btreeExtraFieldKey = random.nextInt();
-            if (btreeExtraFieldKey == Integer.MIN_VALUE) {
-                btreeExtraFieldKey = Integer.MIN_VALUE + 1;
-            }
-
-            StringBuilder sb = new StringBuilder();
-            sb.append("use dataverse experiments; ");
-            sb.append("count( ");
-            sb.append("for $x in dataset Tweets").append(" ");
-            sb.append("where $x.tweetid = int64(\"" + btreeExtraFieldKey + "\")");
-            sb.append("return $x ");
-            sb.append(");");
-
-            System.out.println("[squery" + (queryCount++) + "]" + sb.toString());
-
-            return sb.toString();
-        } else {
-            StringBuilder sb = new StringBuilder();
-            sb.append(" use dataverse experiments; \n");
-            sb.append(" count( \n");
-            sb.append(" for $x in dataset JoinSeedTweets").append(" \n");
-            sb.append(" let $area := create-circle($x.sender-location, ").append(String.format("%f", radius))
-                    .append(" ) \n");
-            sb.append(" for $y in dataset Tweets \n");
-            sb.append(" where $x.tweetid >= int64(\"" + lowId + "\") ").append(
-                    "and $x.tweetid < int64(\"" + highId + "\") and ");
-            if (isIndexOnlyPlan) {
-                sb.append(" spatial-intersect($y.sender-location, $area) \n");
-            } else {
-                sb.append(" spatial-intersect($y.sender-location, $area) and $y.btree-extra-field1 <= int32(\"2147483647\")  \n");
-            }
-            sb.append(" return $y \n");
-            sb.append(" );\n");
-
-            System.out.println("[jquery" + (queryCount++) + "]" + sb.toString());
-
-            return sb.toString();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment.java
deleted file mode 100644
index 3faf195..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.experiment.action.base.IAction;
-
-public class Experiment extends AbstractAction {
-
-    private static final Logger LOGGER = Logger.getLogger(Experiment.class.getName());
-
-    private final String name;
-
-    private IAction body;
-
-    public Experiment(String name) {
-        this.name = name;
-    }
-
-    public void addBody(IAction exec) {
-        body = exec;
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        if (body != null) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Running experiment: " + name);
-            }
-            body.perform();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1ABuilder.java
deleted file mode 100644
index f7d2039..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1ABuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment1ABuilder extends AbstractExperiment1Builder {
-
-    public Experiment1ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("1A", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1BBuilder.java
deleted file mode 100644
index 17e288f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1BBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment1BBuilder extends AbstractExperiment1Builder {
-
-    public Experiment1BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("1B", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1CBuilder.java
deleted file mode 100644
index efc5003..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1CBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment1CBuilder extends AbstractExperiment1Builder {
-
-    public Experiment1CBuilder(LSMExperimentSetRunnerConfig config) {
-        super("1C", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1DBuilder.java
deleted file mode 100644
index d6d358b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1DBuilder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment1DBuilder extends AbstractExperiment1Builder {
-
-    public Experiment1DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("1D", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1EBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1EBuilder.java
deleted file mode 100644
index c2d30a5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment1EBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment1EBuilder extends AbstractExperiment1Builder {
-
-    public Experiment1EBuilder(LSMExperimentSetRunnerConfig config) {
-        super("1E", config, "nuclear.xml", "nuclear_base_4_ingest.aql", "nuc.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A1Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A1Builder.java
deleted file mode 100644
index 3fc9cc7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A1Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2A1Builder extends AbstractExperiment2ABuilder {
-
-    public Experiment2A1Builder(LSMExperimentSetRunnerConfig config) {
-        super("2A1", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A2Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A2Builder.java
deleted file mode 100644
index 2c08ed3..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A2Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2A2Builder extends AbstractExperiment2ABuilder {
-
-    public Experiment2A2Builder(LSMExperimentSetRunnerConfig config) {
-        super("2A2", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A4Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A4Builder.java
deleted file mode 100644
index a319687..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A4Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2A4Builder extends AbstractExperiment2ABuilder {
-
-    public Experiment2A4Builder(LSMExperimentSetRunnerConfig config) {
-        super("2A4", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A8Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A8Builder.java
deleted file mode 100644
index 3946ea3..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2A8Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2A8Builder extends AbstractExperiment2ABuilder {
-
-    public Experiment2A8Builder(LSMExperimentSetRunnerConfig config) {
-        super("2A8", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B1Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B1Builder.java
deleted file mode 100644
index e1f39b2..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B1Builder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2B1Builder extends AbstractExperiment2BBuilder {
-
-    public Experiment2B1Builder(LSMExperimentSetRunnerConfig config) {
-        super("2B1", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B2Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B2Builder.java
deleted file mode 100644
index 42f23d5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B2Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2B2Builder extends AbstractExperiment2BBuilder {
-
-    public Experiment2B2Builder(LSMExperimentSetRunnerConfig config) {
-        super("2B2", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B4Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B4Builder.java
deleted file mode 100644
index f644fd8..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B4Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2B4Builder extends AbstractExperiment2BBuilder {
-
-    public Experiment2B4Builder(LSMExperimentSetRunnerConfig config) {
-        super("2B4", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B8Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B8Builder.java
deleted file mode 100644
index 6264513..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2B8Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2B8Builder extends AbstractExperiment2BBuilder {
-
-    public Experiment2B8Builder(LSMExperimentSetRunnerConfig config) {
-        super("2B8", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C1Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C1Builder.java
deleted file mode 100644
index 81c5428..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C1Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2C1Builder extends AbstractExperiment2CBuilder {
-
-    public Experiment2C1Builder(LSMExperimentSetRunnerConfig config) {
-        super("2C1", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C2Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C2Builder.java
deleted file mode 100644
index d1ff1d3..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C2Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2C2Builder extends AbstractExperiment2CBuilder {
-
-    public Experiment2C2Builder(LSMExperimentSetRunnerConfig config) {
-        super("2C2", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C4Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C4Builder.java
deleted file mode 100644
index a6594d3..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C4Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2C4Builder extends AbstractExperiment2CBuilder {
-
-    public Experiment2C4Builder(LSMExperimentSetRunnerConfig config) {
-        super("2C4", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C8Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C8Builder.java
deleted file mode 100644
index bccd0a5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2C8Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2C8Builder extends AbstractExperiment2CBuilder {
-
-    public Experiment2C8Builder(LSMExperimentSetRunnerConfig config) {
-        super("2C8", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D1Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D1Builder.java
deleted file mode 100644
index 02d9015..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D1Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2D1Builder extends AbstractExperiment2DBuilder {
-
-    public Experiment2D1Builder(LSMExperimentSetRunnerConfig config) {
-        super("2D1", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D2Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D2Builder.java
deleted file mode 100644
index 1e65877..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D2Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2D2Builder extends AbstractExperiment2DBuilder {
-
-    public Experiment2D2Builder(LSMExperimentSetRunnerConfig config) {
-        super("2D2", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D4Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D4Builder.java
deleted file mode 100644
index 4bca31c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D4Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2D4Builder extends AbstractExperiment2DBuilder {
-
-    public Experiment2D4Builder(LSMExperimentSetRunnerConfig config) {
-        super("2D4", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D8Builder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D8Builder.java
deleted file mode 100644
index 779aefd..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment2D8Builder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment2D8Builder extends AbstractExperiment2DBuilder {
-
-    public Experiment2D8Builder(LSMExperimentSetRunnerConfig config) {
-        super("2D8", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3ABuilder.java
deleted file mode 100644
index b44b82d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3ABuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment3ABuilder extends AbstractExperiment3Builder {
-
-    public Experiment3ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("3A", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3BBuilder.java
deleted file mode 100644
index f54154a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3BBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment3BBuilder extends AbstractExperiment3Builder {
-
-    public Experiment3BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("3B", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3CBuilder.java
deleted file mode 100644
index 526d65e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3CBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment3CBuilder extends AbstractExperiment3Builder {
-
-    public Experiment3CBuilder(LSMExperimentSetRunnerConfig config) {
-        super("3C", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3DBuilder.java
deleted file mode 100644
index 4d59dec..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment3DBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment3DBuilder extends AbstractExperiment3Builder {
-
-    public Experiment3DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("3D", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4ABuilder.java
deleted file mode 100644
index 7a500e6..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4ABuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment4ABuilder extends AbstractExperiment4Builder {
-
-    public Experiment4ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("4A", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("4_1.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4BBuilder.java
deleted file mode 100644
index bc2ffc8..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4BBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment4BBuilder extends AbstractExperiment4Builder {
-
-    public Experiment4BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("4B", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("4_2.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4CBuilder.java
deleted file mode 100644
index 2215b8a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4CBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment4CBuilder extends AbstractExperiment4Builder {
-
-    public Experiment4CBuilder(LSMExperimentSetRunnerConfig config) {
-        super("4C", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("4_4.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4DBuilder.java
deleted file mode 100644
index 86bb940..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment4DBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment4DBuilder extends AbstractExperiment4Builder {
-
-    public Experiment4DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("4D", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("4_8.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5ABuilder.java
deleted file mode 100644
index ce9f95f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5ABuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment5ABuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public Experiment5ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("5A", config, "8node.xml", "5_1_ingest.aql", "5_1.dgen", "5_1_count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("5_1.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5BBuilder.java
deleted file mode 100644
index 577ecf1..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5BBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment5BBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public Experiment5BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("5B", config, "8node.xml", "5_2_ingest.aql", "5_2.dgen", "5_2_count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("5_2.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5CBuilder.java
deleted file mode 100644
index a78379b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5CBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment5CBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public Experiment5CBuilder(LSMExperimentSetRunnerConfig config) {
-        super("5C", config, "8node.xml", "5_3_ingest.aql", "5_3.dgen", "5_3_count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("5_3.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5DBuilder.java
deleted file mode 100644
index af02a8d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment5DBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment5DBuilder extends AbstractLSMBaseExperimentBuilder {
-
-    public Experiment5DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("5D", config, "8node.xml", "5_4_ingest.aql", "5_4.dgen", "5_4_count.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("5_4.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6ABuilder.java
deleted file mode 100644
index 92f4bbb..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6ABuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment6ABuilder extends AbstractExperiment6Builder {
-
-    public Experiment6ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("6A", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("6_a.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6BBuilder.java
deleted file mode 100644
index 936b804..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6BBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment6BBuilder extends AbstractExperiment6Builder {
-
-    public Experiment6BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("6B", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("6_b.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6CBuilder.java
deleted file mode 100644
index 6e1b7f7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment6CBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment6CBuilder extends AbstractExperiment6Builder {
-
-    public Experiment6CBuilder(LSMExperimentSetRunnerConfig config) {
-        super("6C", config);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("6_c.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7ABuilder.java
deleted file mode 100644
index 828006d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7ABuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment7ABuilder extends AbstractExperiment7Builder {
-
-    public Experiment7ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("7A", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_a.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7BBuilder.java
deleted file mode 100644
index 513069a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7BBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment7BBuilder extends AbstractExperiment7Builder {
-
-    public Experiment7BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("7B", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_b.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7DBuilder.java
deleted file mode 100644
index 0a2cf57..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment7DBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment7DBuilder extends AbstractExperiment7Builder {
-
-    public Experiment7DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("7D", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_d.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8ABuilder.java
deleted file mode 100644
index 78ac504..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8ABuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-import java.io.IOException;
-
-public class Experiment8ABuilder extends AbstractExperiment8Builder {
-
-    public Experiment8ABuilder(LSMExperimentSetRunnerConfig config) throws IOException {
-        super("8A", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_a.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8BBuilder.java
deleted file mode 100644
index 71c8e48..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8BBuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment8BBuilder extends AbstractExperiment8Builder {
-
-    public Experiment8BBuilder(LSMExperimentSetRunnerConfig config) throws IOException {
-        super("8B", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort,
-                localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_b.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8CBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8CBuilder.java
deleted file mode 100644
index a05a91e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8CBuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment8CBuilder extends AbstractExperiment8Builder {
-
-    public Experiment8CBuilder(LSMExperimentSetRunnerConfig config) throws IOException {
-        super("8C", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort,
-                localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_c.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8DBuilder.java
deleted file mode 100644
index c7a6247..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment8DBuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.io.IOException;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment8DBuilder extends AbstractExperiment8Builder {
-
-    public Experiment8DBuilder(LSMExperimentSetRunnerConfig config) throws IOException {
-        super("8D", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort,
-                localExperimentRoot.resolve(LSMExperimentConstants.AQL_DIR).resolve("8_d.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9ABuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9ABuilder.java
deleted file mode 100644
index 50417f9..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9ABuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment9ABuilder extends AbstractExperiment9Builder {
-
-    public Experiment9ABuilder(LSMExperimentSetRunnerConfig config) {
-        super("9A", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_a.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9BBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9BBuilder.java
deleted file mode 100644
index 0020623..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9BBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment9BBuilder extends AbstractExperiment9Builder {
-
-    public Experiment9BBuilder(LSMExperimentSetRunnerConfig config) {
-        super("9B", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_b.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9DBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9DBuilder.java
deleted file mode 100644
index f9fd10e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/Experiment9DBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class Experiment9DBuilder extends AbstractExperiment9Builder {
-
-    public Experiment9DBuilder(LSMExperimentSetRunnerConfig config) {
-        super("9D", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("8_d.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PerfTestAggBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PerfTestAggBuilder.java
deleted file mode 100644
index 500cced..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PerfTestAggBuilder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class PerfTestAggBuilder extends AbstractPerfLoadBuilder {
-
-    public PerfTestAggBuilder(LSMExperimentSetRunnerConfig config) {
-        super("PerfTestAggBuilder", config, "asterix-agg.xml", "asterix-4.dgen", "bench_count.aql", "bench_3_load.aql",
-                "agg_bench");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("bench_3.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PresetClusterPerfBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PresetClusterPerfBuilder.java
deleted file mode 100644
index 5c136d6..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/PresetClusterPerfBuilder.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.action.derived.RunSQLPPFileAction;
-import org.apache.asterix.experiment.action.derived.SleepAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-import org.apache.asterix.experiment.client.LSMPerfConstants;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-import javax.xml.bind.JAXBException;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-
-/**
- * This experiment simply runs the performance benchmark queries against
- * a cluster which is presumed to already be running.
- * Also, there is no orchestration server involved in this experiment builder.
- *
- * The only LSMExperimentSetRunner config command-line options used by this
- * experiment are:
- *   -ler  -rh  -rp
- */
-public class PresetClusterPerfBuilder extends AbstractExperimentBuilder {
-
-    protected final HttpClient httpClient;
-
-    protected final String restHost;
-
-    protected final int restPort;
-
-    protected final Path localExperimentRoot;
-
-    private final String countFileName;
-
-    protected final String loadAQLFilePath;
-
-    protected final String querySQLPPFileName;
-
-    public PresetClusterPerfBuilder(LSMExperimentSetRunnerConfig config) {
-        super("PresetClusterPerfBuilder");
-        this.httpClient = new DefaultHttpClient();
-        this.restHost = config.getRESTHost();
-        this.restPort = config.getRESTPort();
-        this.localExperimentRoot = Paths.get(config.getLocalExperimentRoot());
-        this.countFileName = "bench_count.aql";
-        this.loadAQLFilePath = "bench_3_load_2.aql";
-        this.querySQLPPFileName = "agg_bench";
-    }
-
-    @Override
-    protected void doBuild(Experiment e) throws IOException, JAXBException {
-        SequentialActionList execs = new SequentialActionList();
-
-        //ddl statements
-        execs.add(new SleepAction(15000));
-        // TODO: implement retry handler
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(LSMPerfConstants.BASE_TYPES)));
-        execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("bench_3.aql")));
-
-        //---------- main experiment body begins -----------
-
-        //run DDL + Load
-        execs.add(new TimedAction(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(loadAQLFilePath))));
-
-        //execute SQL++ Queries
-        execs.add(new TimedAction(new RunSQLPPFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve(querySQLPPFileName),
-                localExperimentRoot.resolve(LSMPerfConstants.RESULT_FILE))));
-
-        //---------- main experiment body ends -----------
-
-        //total record count
-        execs.add(new SleepAction(10000));
-        if (countFileName != null) {
-            execs.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                    LSMExperimentConstants.AQL_DIR).resolve(countFileName)));
-        }
-
-        e.addBody(execs);
-    }
-
-    protected Map<String, List<String>> readDatagenPairs(Path p) throws IOException {
-        Map<String, List<String>> dgenPairs = new HashMap<>();
-        Scanner s = new Scanner(p, StandardCharsets.UTF_8.name());
-        try {
-            while (s.hasNextLine()) {
-                String line = s.nextLine();
-                String[] pair = line.split("\\s+");
-                List<String> vals = dgenPairs.get(pair[0]);
-                if (vals == null) {
-                    vals = new ArrayList<>();
-                    dgenPairs.put(pair[0], vals);
-                }
-                vals.add(pair[1]);
-            }
-        } finally {
-            s.close();
-        }
-        return dgenPairs;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SingleNodeIngestionExperimentBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SingleNodeIngestionExperimentBuilder.java
deleted file mode 100644
index 38b9fcb..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SingleNodeIngestionExperimentBuilder.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.SocketDataGeneratorExecutable;
-
-public class SingleNodeIngestionExperimentBuilder extends AbstractLocalExperimentBuilder {
-
-    private final String adapterHost;
-
-    private final int adapterPort;
-
-    private final HttpClient httpClient;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    private final Path aqlFilePath;
-
-    public SingleNodeIngestionExperimentBuilder(String adapterHost, int adapterPort, String restHost, int restPort,
-            String aqlFilePath) {
-        super("Local Ingestion Experiment", 2);
-        this.adapterHost = adapterHost;
-        this.adapterPort = adapterPort;
-        httpClient = new DefaultHttpClient();
-        this.restHost = restHost;
-        this.restPort = restPort;
-        this.aqlFilePath = Paths.get(aqlFilePath);
-    }
-
-    @Override
-    protected void addPre(SequentialActionList pre) {
-        pre.add(new RunAQLFileAction(httpClient, restHost, restPort, aqlFilePath));
-    }
-
-    @Override
-    protected void addPost(SequentialActionList post) {
-
-    }
-
-    @Override
-    protected void doBuild(Experiment e) {
-        e.addBody(new SocketDataGeneratorExecutable(adapterHost, adapterPort));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhbtreeBuilder.java
deleted file mode 100644
index 34a3555..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1ADhbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1ADhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1ADhbtree", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhvbtreeBuilder.java
deleted file mode 100644
index 9457671..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ADhvbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1ADhvbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1ADhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1ADhvbtree", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ARtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ARtreeBuilder.java
deleted file mode 100644
index 1c21da5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ARtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1ARtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1ARtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1ARtree", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1AShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1AShbtreeBuilder.java
deleted file mode 100644
index a238043..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1AShbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1AShbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1AShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1AShbtree", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ASifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ASifBuilder.java
deleted file mode 100644
index 9721d5e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1ASifBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1ASifBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1ASifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1ASif", config, "1node.xml", "base_1_ingest.aql", "1.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhbtreeBuilder.java
deleted file mode 100644
index 5f8446d..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1BDhbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1BDhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1BDhbtree", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhvbtreeBuilder.java
deleted file mode 100644
index 4ff2576..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BDhvbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1BDhvbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1BDhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1BDhvbtree", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BRtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BRtreeBuilder.java
deleted file mode 100644
index af22866..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BRtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1BRtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1BRtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1BRtree", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BShbtreeBuilder.java
deleted file mode 100644
index 1c27a0b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BShbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1BShbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1BShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1BShbtree", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BSifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BSifBuilder.java
deleted file mode 100644
index e6a44cf..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1BSifBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1BSifBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1BSifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1BSif", config, "2node.xml", "base_2_ingest.aql", "2.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhbtreeBuilder.java
deleted file mode 100644
index 2612ded..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1CDhbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1CDhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1CDhbtree", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhvbtreeBuilder.java
deleted file mode 100644
index a4a22df..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CDhvbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1CDhvbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1CDhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1CDhvbtree", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CRtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CRtreeBuilder.java
deleted file mode 100644
index 7ce9d77..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CRtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1CRtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1CRtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1CRtree", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CShbtreeBuilder.java
deleted file mode 100644
index d7bb6fc..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CShbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1CShbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1CShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1CShbtree", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CSifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CSifBuilder.java
deleted file mode 100644
index 25282dc..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1CSifBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1CSifBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1CSifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1CSif", config, "4node.xml", "base_4_ingest.aql", "4.dgen");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhbtreeBuilder.java
deleted file mode 100644
index a3f57d9..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1DDhbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1DDhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1DDhbtree", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-    
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhvbtreeBuilder.java
deleted file mode 100644
index 02c8af9..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DDhvbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1DDhvbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1DDhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1DDhvbtree", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-    
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DRtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DRtreeBuilder.java
deleted file mode 100644
index 9f7ac45..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DRtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1DRtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1DRtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1DRtree", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-    
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DShbtreeBuilder.java
deleted file mode 100644
index 3252fe1..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DShbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1DShbtreeBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1DShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1DShbtree", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-    
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DSifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DSifBuilder.java
deleted file mode 100644
index 96889aa..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment1DSifBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment1DSifBuilder extends AbstractExperiment1Builder {
-
-    public SpatialIndexExperiment1DSifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment1DSif", config, "8node.xml", "base_8_ingest.aql", "8.dgen");
-    }
-    
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhbtreeBuilder.java
deleted file mode 100644
index 667b9c2..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment2DhbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    public SpatialIndexExperiment2DhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment2Dhbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", true);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhvbtreeBuilder.java
deleted file mode 100644
index 55c2140..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2DhvbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment2DhvbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    public SpatialIndexExperiment2DhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment2Dhvbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", true);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2RtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2RtreeBuilder.java
deleted file mode 100644
index 9188fbe..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2RtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment2RtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    public SpatialIndexExperiment2RtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment2Rtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", true);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2ShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2ShbtreeBuilder.java
deleted file mode 100644
index ec08453..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2ShbtreeBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment2ShbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    public SpatialIndexExperiment2ShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment2Shbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", true);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2SifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2SifBuilder.java
deleted file mode 100644
index 79353dc..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment2SifBuilder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment2SifBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    public SpatialIndexExperiment2SifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment2Sif", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", true);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhbtreeBuilder.java
deleted file mode 100644
index 4a6718f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhbtreeBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3DhbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    public SpatialIndexExperiment3DhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3Dhbtree", config, "1node.xml", "base_1_ingest.aql", "1.dqgen", "count.aql",
-                "spatial_3_create_dhbtree.aql", true);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhvbtreeBuilder.java
deleted file mode 100644
index 58cc03f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3DhvbtreeBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3DhvbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    public SpatialIndexExperiment3DhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3Dhvbtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_dhvbtree.aql", true);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3PIdxLoadBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3PIdxLoadBuilder.java
deleted file mode 100644
index fbc63ac..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3PIdxLoadBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3PIdxLoadBuilder extends AbstractSpatialIndexExperiment3PIdxLoadBuilder {
-
-    public SpatialIndexExperiment3PIdxLoadBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3PIdxLoad", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql", "spatial_3_pidx_load.aql");
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_3.aql")));
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3RtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3RtreeBuilder.java
deleted file mode 100644
index bcf5f8c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3RtreeBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3RtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    public SpatialIndexExperiment3RtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3Rtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_rtree.aql", true);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3ShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3ShbtreeBuilder.java
deleted file mode 100644
index 7b33ed7..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3ShbtreeBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3ShbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    public SpatialIndexExperiment3ShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3Shbtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_shbtree.aql", true);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3SifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3SifBuilder.java
deleted file mode 100644
index 75a50c5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment3SifBuilder.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment3SifBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    public SpatialIndexExperiment3SifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment3Sif", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_sif.aql", true);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhbtreeBuilder.java
deleted file mode 100644
index 1fac7d0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhbtreeBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment4DhbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    //SpatialIndexExperiment4XXX is exactly the same as SpatialIndexExperiment3XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment4DhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment4Dhbtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_dhbtree.aql", false);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhvbtreeBuilder.java
deleted file mode 100644
index 1579be0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4DhvbtreeBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment4DhvbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    //SpatialIndexExperiment4XXX is exactly the same as SpatialIndexExperiment3XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment4DhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment4Dhvbtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_dhvbtree.aql", false);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4RtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4RtreeBuilder.java
deleted file mode 100644
index 54cd9cc..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4RtreeBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment4RtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    //SpatialIndexExperiment4XXX is exactly the same as SpatialIndexExperiment3XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment4RtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment4Rtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_rtree.aql", false);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4ShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4ShbtreeBuilder.java
deleted file mode 100644
index 91eef5e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4ShbtreeBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment4ShbtreeBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    //SpatialIndexExperiment4XXX is exactly the same as SpatialIndexExperiment3XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment4ShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment4Shbtree", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_shbtree.aql", false);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4SifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4SifBuilder.java
deleted file mode 100644
index 9043c5f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment4SifBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment4SifBuilder extends AbstractSpatialIndexExperiment3SIdxCreateAndQueryBuilder {
-
-    //SpatialIndexExperiment4XXX is exactly the same as SpatialIndexExperiment3XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment4SifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment4Sif", config, "8node.xml", "base_8_ingest.aql", "8.dqgen", "count.aql",
-                "spatial_3_create_sif.aql", false);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhbtreeBuilder.java
deleted file mode 100644
index 74b00f3..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment5DhbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    //SpatialIndexExperiment5XXX is exactly the same as SpatialIndexExperiment2XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment5DhbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment5Dhbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", false);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhvbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhvbtreeBuilder.java
deleted file mode 100644
index b665d1b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5DhvbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment5DhvbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    //SpatialIndexExperiment5XXX is exactly the same as SpatialIndexExperiment2XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment5DhvbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment5Dhvbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", false);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_dhvbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5RtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5RtreeBuilder.java
deleted file mode 100644
index aca7c2b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5RtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment5RtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    //SpatialIndexExperiment5XXX is exactly the same as SpatialIndexExperiment2XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment5RtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment5Rtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", false);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_rtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5ShbtreeBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5ShbtreeBuilder.java
deleted file mode 100644
index 2c066fd..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5ShbtreeBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment5ShbtreeBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    //SpatialIndexExperiment5XXX is exactly the same as SpatialIndexExperiment2XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment5ShbtreeBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment5Shbtree", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", false);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_shbtree.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5SifBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5SifBuilder.java
deleted file mode 100644
index 4ee4095..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/builder/SpatialIndexExperiment5SifBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.builder;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLFileAction;
-import org.apache.asterix.experiment.client.LSMExperimentConstants;
-import org.apache.asterix.experiment.client.LSMExperimentSetRunner.LSMExperimentSetRunnerConfig;
-
-public class SpatialIndexExperiment5SifBuilder extends AbstractSpatialIndexExperiment2Builder {
-
-    //SpatialIndexExperiment5XXX is exactly the same as SpatialIndexExperiment2XXX except queries are non-index only plan queries.
-    public SpatialIndexExperiment5SifBuilder(LSMExperimentSetRunnerConfig config) {
-        super("SpatialIndexExperiment5Sif", config, "1node.xml", "base_1_ingest_query.aql", "1.dgen", false);
-    }
-
-    @Override
-    protected void doBuildDDL(SequentialActionList seq) {
-        seq.add(new RunAQLFileAction(httpClient, restHost, restPort, localExperimentRoot.resolve(
-                LSMExperimentConstants.AQL_DIR).resolve("spatial_1_sif.aql")));
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentConstants.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentConstants.java
deleted file mode 100644
index 47dcc6e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentConstants.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-public class LSMExperimentConstants {
-
-    public static final String CONFIG_DIR = "configs";
-
-    public static final String AQL_DIR = "aql";
-
-    public static final String BASE_DIR = "base";
-
-    public static final String DGEN_DIR = "dgen";
-
-    public static final String LOG_DIR = "log";
-
-    public static final String BASE_TYPES = "base/base_types.aql";
-
-    public static final String ASTERIX_CONFIGURATION = "asterix-configuration.xml";
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentSetRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentSetRunner.java
deleted file mode 100644
index 45073d9..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMExperimentSetRunner.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Pattern;
-
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.builder.AbstractExperimentBuilder;
-import org.apache.asterix.experiment.builder.PerfTestAggBuilder;
-import org.apache.asterix.experiment.builder.PresetClusterPerfBuilder;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-
-public class LSMExperimentSetRunner {
-
-    private static final Logger LOGGER = Logger.getLogger(LSMExperimentSetRunner.class.getName());
-
-    public static class LSMExperimentSetRunnerConfig {
-
-        private final String logDirSuffix;
-
-        private final int nQueryRuns;
-
-        public LSMExperimentSetRunnerConfig(String logDirSuffix, int nQueryRuns) {
-            this.logDirSuffix = logDirSuffix;
-            this.nQueryRuns = nQueryRuns;
-        }
-
-        public String getLogDirSuffix() {
-            return logDirSuffix;
-        }
-
-        public int getNQueryRuns() {
-            return nQueryRuns;
-        }
-
-        @Option(name = "-rh", aliases = "--rest-host", usage = "Asterix REST API host address", required = true, metaVar = "HOST")
-        private String restHost;
-
-        public String getRESTHost() {
-            return restHost;
-        }
-
-        @Option(name = "-rp", aliases = "--rest-port", usage = "Asterix REST API port", required = true, metaVar = "PORT")
-        private int restPort;
-
-        public int getRESTPort() {
-            return restPort;
-        }
-
-        @Option(name = "-mh", aliases = "--managix-home", usage = "Path to MANAGIX_HOME directory", required = true, metaVar = "MGXHOME")
-        private String managixHome;
-
-        public String getManagixHome() {
-            return managixHome;
-        }
-
-        @Option(name = "-jh", aliases = "--java-home", usage = "Path to JAVA_HOME directory", required = true, metaVar = "JAVAHOME")
-        private String javaHome;
-
-        public String getJavaHome() {
-            return javaHome;
-        }
-
-        @Option(name = "-ler", aliases = "--local-experiment-root", usage = "Path to the local LSM experiment root directory", required = true, metaVar = "LOCALEXPROOT")
-        private String localExperimentRoot;
-
-        public String getLocalExperimentRoot() {
-            return localExperimentRoot;
-        }
-
-        @Option(name = "-u", aliases = "--username", usage = "Username to use for SSH/SCP", required = true, metaVar = "UNAME")
-        private String username;
-
-        public String getUsername() {
-            return username;
-        }
-
-        @Option(name = "-k", aliases = "--key", usage = "SSH key location", metaVar = "SSHKEY")
-        private String sshKeyLocation;
-
-        public String getSSHKeyLocation() {
-            return sshKeyLocation;
-        }
-
-        @Option(name = "-d", aliases = "--datagen-duration", usage = "Data generation duration in seconds", metaVar = "DATAGENDURATION")
-        private int duration;
-
-        public int getDuration() {
-            return duration;
-        }
-
-        @Option(name = "-qd", aliases = "--querygen-duration", usage = "Query generation duration in seconds", metaVar = "QUERYGENDURATION")
-        private int queryDuration;
-
-        public int getQueryDuration() {
-            return queryDuration;
-        }
-
-        @Option(name = "-regex", aliases = "--regex", usage = "Regular expression used to match experiment names", metaVar = "REGEXP")
-        private String regex;
-
-        public String getRegex() {
-            return regex;
-        }
-
-        @Option(name = "-oh", aliases = "--orchestrator-host", usage = "The host address of THIS orchestrator")
-        private String orchHost;
-
-        public String getOrchestratorHost() {
-            return orchHost;
-        }
-
-        @Option(name = "-op", aliases = "--orchestrator-port", usage = "The port to be used for the orchestrator server of THIS orchestrator")
-        private int orchPort;
-
-        public int getOrchestratorPort() {
-            return orchPort;
-        }
-
-        @Option(name = "-qoh", aliases = "--query-orchestrator-host", usage = "The host address of query orchestrator")
-        private String queryOrchHost;
-
-        public String getQueryOrchestratorHost() {
-            return queryOrchHost;
-        }
-
-        @Option(name = "-qop", aliases = "--query-orchestrator-port", usage = "The port to be used for the orchestrator server of query orchestrator")
-        private int queryOrchPort;
-
-        public int getQueryOrchestratorPort() {
-            return queryOrchPort;
-        }
-
-        @Option(name = "-di", aliases = "--data-interval", usage = " Initial data interval to use when generating data for exp 7")
-        private long dataInterval;
-
-        public long getDataInterval() {
-            return dataInterval;
-        }
-
-        @Option(name = "-ni", aliases = "--num-data-intervals", usage = "Number of data intervals to use when generating data for exp 7")
-        private int numIntervals;
-
-        public int getNIntervals() {
-            return numIntervals;
-        }
-
-        @Option(name = "-sf", aliases = "--stat-file", usage = "Enable IO/CPU stats and place in specified file")
-        private String statFile = null;
-
-        public String getStatFile() {
-            return statFile;
-        }
-
-        @Option(name = "-of", aliases = "--openstreetmap-filepath", usage = "The open street map gps point data file path")
-        private String openStreetMapFilePath;
-
-        public String getOpenStreetMapFilePath() {
-            return openStreetMapFilePath;
-        }
-
-        @Option(name = "-si", aliases = "--location-sample-interval", usage = "Location sample interval from open street map point data")
-        private int locationSampleInterval;
-
-        public int getLocationSampleInterval() {
-            return locationSampleInterval;
-        }
-
-        @Option(name = "-qsf", aliases = "--query-seed-filepath", usage = "The query seed file path")
-        private String querySeedFilePath;
-
-        public String getQuerySeedFilePath() {
-            return querySeedFilePath;
-        }
-
-        @Option(name = "-rcbi", aliases = "--record-count-per-batch-during-ingestion-only", usage = "Record count per batch during ingestion only")
-        private int recordCountPerBatchDuringIngestionOnly = 1000;
-
-        public int getRecordCountPerBatchDuringIngestionOnly() {
-            return recordCountPerBatchDuringIngestionOnly;
-        }
-
-        @Option(name = "-rcbq", aliases = "--record-count-per-batch-during-query", usage = "Record count per batch during query")
-        private int recordCountPerBatchDuringQuery = 1000;
-
-        public int getRecordCountPerBatchDuringQuery() {
-            return recordCountPerBatchDuringQuery;
-        }
-
-        @Option(name = "-dsti", aliases = "--data-gen-sleep-time-during-ingestion-only", usage = "DataGen sleep time in milliseconds after every recordCountPerBatchDuringIngestionOnly records were sent")
-        private long dataGenSleepTimeDuringIngestionOnly = 1;
-
-        public long getDataGenSleepTimeDuringIngestionOnly() {
-            return dataGenSleepTimeDuringIngestionOnly;
-        }
-
-        @Option(name = "-dstq", aliases = "--data-gen-sleep-time-during-query", usage = "DataGen sleep time in milliseconds after every recordCountPerBatchDuringQuery records were sent")
-        private long dataGenSleepTimeDuringQuery = 1;
-
-        public long getDataGenSleepTimeDuringQuery() {
-            return dataGenSleepTimeDuringQuery;
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        //        LogManager.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
-        LSMExperimentSetRunnerConfig config = new LSMExperimentSetRunnerConfig(String.valueOf(System
-                .currentTimeMillis()), 3);
-        CmdLineParser clp = new CmdLineParser(config);
-        try {
-            clp.parseArgument(args);
-        } catch (CmdLineException e) {
-            System.err.println(e.getMessage());
-            clp.printUsage(System.err);
-            System.exit(1);
-        }
-
-        Collection<AbstractExperimentBuilder> suite = new ArrayList<>();
-
-        /*
-                suite.add(new Experiment7BBuilder(config));
-                suite.add(new Experiment7DBuilder(config));
-                suite.add(new Experiment7ABuilder(config));
-                suite.add(new Experiment8DBuilder(config));
-                suite.add(new Experiment8ABuilder(config));
-                suite.add(new Experiment8BBuilder(config));
-                suite.add(new Experiment9ABuilder(config));
-                suite.add(new Experiment9DBuilder(config));
-                suite.add(new Experiment9BBuilder(config));
-                suite.add(new Experiment6ABuilder(config));
-                suite.add(new Experiment6BBuilder(config));
-                suite.add(new Experiment6CBuilder(config));
-                suite.add(new Experiment2D1Builder(config));
-                suite.add(new Experiment2D2Builder(config));
-                suite.add(new Experiment2D4Builder(config));
-                suite.add(new Experiment2D8Builder(config));
-                suite.add(new Experiment2C1Builder(config));
-                suite.add(new Experiment2C2Builder(config));
-                suite.add(new Experiment2C4Builder(config));
-                suite.add(new Experiment2C8Builder(config));
-                suite.add(new Experiment2A1Builder(config));
-                suite.add(new Experiment2A2Builder(config));
-                suite.add(new Experiment2A4Builder(config));
-                suite.add(new Experiment2A8Builder(config));
-                suite.add(new Experiment2B1Builder(config));
-                suite.add(new Experiment2B2Builder(config));
-                suite.add(new Experiment2B4Builder(config));
-                suite.add(new Experiment2B8Builder(config));
-                suite.add(new Experiment1ABuilder(config));
-                suite.add(new Experiment1BBuilder(config));
-                suite.add(new Experiment1CBuilder(config));
-                suite.add(new Experiment1DBuilder(config));
-                suite.add(new Experiment1EBuilder(config));
-                suite.add(new Experiment4ABuilder(config));
-                suite.add(new Experiment4BBuilder(config));
-                suite.add(new Experiment4CBuilder(config));
-                suite.add(new Experiment4DBuilder(config));
-                suite.add(new Experiment3ABuilder(config));
-                suite.add(new Experiment3BBuilder(config));
-                suite.add(new Experiment3CBuilder(config));
-                suite.add(new Experiment3DBuilder(config));
-                suite.add(new Experiment5ABuilder(config));
-                suite.add(new Experiment5BBuilder(config));
-                suite.add(new Experiment5CBuilder(config));
-                suite.add(new Experiment5DBuilder(config));
-        */
-                suite.add(new PerfTestAggBuilder(config));
-                suite.add(new PresetClusterPerfBuilder(config));
-
-        Pattern p = config.getRegex() == null ? null : Pattern.compile(config.getRegex());
-
-        SequentialActionList exps = new SequentialActionList();
-        for (AbstractExperimentBuilder eb : suite) {
-            if (p == null || p.matcher(eb.getName()).matches()) {
-                exps.add(eb.build());
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.info("Added " + eb.getName() + " to run list...");
-                }
-            }
-        }
-        exps.perform();
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMPerfConstants.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMPerfConstants.java
deleted file mode 100644
index 78483d1..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/LSMPerfConstants.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-public class LSMPerfConstants {
-
-    private LSMPerfConstants(){
-        throw new UnsupportedOperationException();
-    } // never needs to be instantiated
-
-    public static final String CONFIG_DIR = "configs";
-
-    public static final String AQL_DIR = "aql";
-
-    public static final String BASE_DIR = "base";
-
-    public static final String DGEN_DIR = "dgen";
-
-    public static final String LOG_DIR = "log";
-
-    public static final String BASE_TYPES = "base/perf_types.aql";
-
-    public static final String RESULT_FILE = "agg_results.csv";
-
-    public static final String ASTERIX_CONFIGURATION = "asterix-configuration.xml";
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorDGProtocol.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorDGProtocol.java
deleted file mode 100644
index a29a74c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorDGProtocol.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-public enum OrchestratorDGProtocol {
-    STOPPED,
-    RESUME,
-    REACHED
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer.java
deleted file mode 100644
index a69b0ce..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.IAction;
-
-public class OrchestratorServer {
-
-    private static final Logger LOGGER = Logger.getLogger(OrchestratorServer.class.getName());
-
-    private final int port;
-
-    private final int nDataGens;
-
-    private final int nIntervals;
-
-    private final AtomicBoolean running;
-
-    private final IAction[] protocolActions;
-
-    private final boolean flagStopResume;
-
-    public OrchestratorServer(int port, int nDataGens, int nIntervals, IAction[] protocolActions) {
-        this.port = port;
-        this.nDataGens = nDataGens;
-        this.nIntervals = nIntervals;
-        running = new AtomicBoolean();
-        this.protocolActions = protocolActions;
-        this.flagStopResume = true;
-    }
-    
-    public synchronized void start() throws IOException, InterruptedException {
-        final AtomicBoolean bound = new AtomicBoolean();
-        running.set(true);
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    ServerSocket ss = new ServerSocket(port);
-                    synchronized (bound) {
-                        bound.set(true);
-                        bound.notifyAll();
-                    }
-                    Socket[] conn = new Socket[nDataGens];
-                    try {
-                        for (int i = 0; i < nDataGens; i++) {
-                            conn[i] = ss.accept();
-                        }
-                        for (int n = 0; n < nIntervals; ++n) {
-                            //TODO refactor operations according to the protocol message
-                            if (flagStopResume) {
-                                for (int i = 0; i < nDataGens; i++) {
-                                    receiveStopped(conn[i]);
-                                }
-                                protocolActions[n].perform();
-                                if (n != nIntervals - 1) {
-                                    for (int i = 0; i < nDataGens; i++) {
-                                        sendResume(conn[i]);
-                                    }
-                                }
-                            } else {
-                                for (int i = 0; i < nDataGens; i++) {
-                                    receiveReached(conn[i]);
-                                }
-                                protocolActions[n].perform();
-                            }
-                        }
-                    } finally {
-                        for (int i = 0; i < conn.length; ++i) {
-                            if (conn[i] != null) {
-                                conn[i].close();
-                            }
-                        }
-                        ss.close();
-                    }
-                    running.set(false);
-                    synchronized (OrchestratorServer.this) {
-                        OrchestratorServer.this.notifyAll();
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                }
-            }
-
-        });
-        t.start();
-        synchronized (bound) {
-            while (!bound.get()) {
-                bound.wait();
-            }
-        }
-    }
-
-    private void sendResume(Socket conn) throws IOException {
-        new DataOutputStream(conn.getOutputStream()).writeInt(OrchestratorDGProtocol.RESUME.ordinal());
-        conn.getOutputStream().flush();
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Sent " + OrchestratorDGProtocol.RESUME + " to " + conn.getRemoteSocketAddress());
-        }
-    }
-
-    private void receiveStopped(Socket conn) throws IOException {
-        int msg = new DataInputStream(conn.getInputStream()).readInt();
-        OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Received " + msgType + " from " + conn.getRemoteSocketAddress());
-        }
-        if (msgType != OrchestratorDGProtocol.STOPPED) {
-            throw new IllegalStateException("Encounted unknown message type " + msgType);
-        }
-    }
-
-    private void receiveReached(Socket conn) throws IOException {
-        int msg = new DataInputStream(conn.getInputStream()).readInt();
-        OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Received " + msgType + " from " + conn.getRemoteSocketAddress());
-        }
-        if (msgType != OrchestratorDGProtocol.REACHED) {
-            throw new IllegalStateException("Encounted unknown message type " + msgType);
-        }
-
-    }
-
-    public synchronized void awaitFinished() throws InterruptedException {
-        while (running.get()) {
-            wait();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer7.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer7.java
deleted file mode 100644
index c547393..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer7.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.IAction;
-import org.apache.asterix.experiment.builder.AbstractExperiment7Builder;
-
-public class OrchestratorServer7 {
-
-    private static final Logger LOGGER = Logger.getLogger(OrchestratorServer7.class.getName());
-
-    private final int port;
-
-    private final int nDataGens;
-
-    private final int nIntervals;
-
-    private final AtomicBoolean running;
-
-    private final IProtocolActionBuilder protoActionBuilder;
-    
-    private final IAction lsAction;
-
-    private static final int QUERY_TOTAL_COUNT = 2000;
-
-    public OrchestratorServer7(int port, int nDataGens, int nIntervals, IProtocolActionBuilder protoActionBuilder, IAction lsAction) {
-        this.port = port;
-        this.nDataGens = nDataGens;
-        this.nIntervals = nIntervals;
-        running = new AtomicBoolean();
-        this.protoActionBuilder = protoActionBuilder;
-        this.lsAction = lsAction;
-    }
-
-    public synchronized void start() throws IOException, InterruptedException {
-        final AtomicBoolean bound = new AtomicBoolean();
-        running.set(true);
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    ServerSocket ss = new ServerSocket(port);
-                    synchronized (bound) {
-                        bound.set(true);
-                        bound.notifyAll();
-                    }
-                    Socket[] conn = new Socket[nDataGens];
-                    try {
-                        for (int i = 0; i < nDataGens; i++) {
-                            conn[i] = ss.accept();
-                        }
-                        AtomicInteger round = new AtomicInteger();
-                        AtomicBoolean done = new AtomicBoolean(false);
-                        Thread pct = new Thread(new ProtocolConsumer(conn, nIntervals, round, done));
-                        pct.start();
-                        int[] queryType = new int[] { 10, 100, 1000, 10000 };
-                        int type = 0;
-                        //step1. send query when it reaches the query begin round
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step1 starts");
-                        }
-                        boolean sendQuery = false;
-                        while (!done.get()) {
-                            if (!sendQuery) {
-                                synchronized (round) {
-                                    while (true) {
-                                        if (round.get() >= AbstractExperiment7Builder.QUERY_BEGIN_ROUND) {
-                                            sendQuery = true;
-                                            break;
-                                        }
-                                        round.wait();
-                                    }
-                                }
-                            }
-                            if (sendQuery) {
-                                protoActionBuilder.buildQueryAction(queryType[type % 4], false).perform();
-                                type = (++type) % 4;
-                            }
-
-                        }
-                        pct.join();
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step1 ends");
-                        }
-                        
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step2 starts");
-                        }
-                        //step2. send one more round of queries after ingestion is over
-                        protoActionBuilder.buildIOWaitAction().perform();
-                        lsAction.perform();
-                        for (int i = 0; i < QUERY_TOTAL_COUNT; i++) {
-                            protoActionBuilder.buildQueryAction(queryType[i % 4], true).perform();
-                        }
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step2 ends");
-                        }
-                        
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step3 starts");
-                        }
-                        //step3. compact dataset
-                        protoActionBuilder.buildCompactAction().perform();
-                        protoActionBuilder.buildIOWaitAction().perform();
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step3 ends");
-                        }
-                        
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step4 starts");
-                        }
-                        //step4. send last round of queries after the compaction is over
-                        for (int i = 0; i < QUERY_TOTAL_COUNT; i++) {
-                            protoActionBuilder.buildQueryAction(queryType[i % 4], true).perform();
-                        }
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Step4 ends");
-                        }
-
-                    } finally {
-                        for (int i = 0; i < conn.length; ++i) {
-                            if (conn[i] != null) {
-                                conn[i].close();
-                            }
-                        }
-                        ss.close();
-                    }
-                    running.set(false);
-                    synchronized (OrchestratorServer7.this) {
-                        OrchestratorServer7.this.notifyAll();
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                }
-            }
-
-        });
-        t.start();
-        synchronized (bound) {
-            while (!bound.get()) {
-                bound.wait();
-            }
-        }
-    }
-
-    private static class ProtocolConsumer implements Runnable {
-
-        private final Socket[] conn;
-
-        private final int nIntervals;
-
-        private final AtomicInteger interval;
-
-        private final AtomicBoolean done;
-
-        public ProtocolConsumer(Socket[] conn, int nIntervals, AtomicInteger interval, AtomicBoolean done) {
-            this.conn = conn;
-            this.nIntervals = nIntervals;
-            this.interval = interval;
-            this.done = done;
-        }
-
-        @Override
-        public void run() {
-            interval.set(0);
-            try {
-                for (int n = 0; n < nIntervals; ++n) {
-                    for (int i = 0; i < conn.length; i++) {
-                        receiveReached(conn[i]);
-                    }
-                    synchronized (interval) {
-                        interval.getAndIncrement();
-                        interval.notifyAll();
-                    }
-                }
-                done.set(true);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-    }
-
-    private static void receiveReached(Socket conn) throws IOException {
-        int msg = new DataInputStream(conn.getInputStream()).readInt();
-        OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Received " + msgType + " from " + conn.getRemoteSocketAddress());
-        }
-        if (msgType != OrchestratorDGProtocol.REACHED) {
-            throw new IllegalStateException("Encounted unknown message type " + msgType);
-        }
-
-    }
-
-    public synchronized void awaitFinished() throws InterruptedException {
-        while (running.get()) {
-            wait();
-        }
-    }
-
-    public interface IProtocolActionBuilder {
-        public IAction buildQueryAction(long cardinality, boolean finalRound) throws Exception;
-
-        public IAction buildIOWaitAction() throws Exception;
-
-        public IAction buildCompactAction() throws Exception;
-
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer9.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer9.java
deleted file mode 100644
index be50e7c..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/OrchestratorServer9.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.IAction;
-
-public class OrchestratorServer9 {
-
-    private static final Logger LOGGER = Logger.getLogger(OrchestratorServer9.class.getName());
-
-    private final int port;
-
-    private final int nDataGens;
-
-    private final int nIntervals;
-
-    private final AtomicBoolean running;
-
-    private final IProtocolActionBuilder protoActionBuilder;
-
-    public OrchestratorServer9(int port, int nDataGens, int nIntervals, IProtocolActionBuilder protoActionBuilder) {
-        this.port = port;
-        this.nDataGens = nDataGens;
-        this.nIntervals = nIntervals;
-        running = new AtomicBoolean();
-        this.protoActionBuilder = protoActionBuilder;
-    }
-
-    public synchronized void start() throws IOException, InterruptedException {
-        final AtomicBoolean bound = new AtomicBoolean();
-        running.set(true);
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    ServerSocket ss = new ServerSocket(port);
-                    synchronized (bound) {
-                        bound.set(true);
-                        bound.notifyAll();
-                    }
-                    Socket[] conn = new Socket[nDataGens];
-                    try {
-                        for (int i = 0; i < nDataGens; i++) {
-                            conn[i] = ss.accept();
-                        }
-                        AtomicInteger round = new AtomicInteger();
-                        AtomicBoolean done = new AtomicBoolean(false);
-                        Thread pct = new Thread(new ProtocolConsumer(conn, nIntervals, round, done));
-                        pct.start();
-                        while (!done.get()) {
-                            protoActionBuilder.buildAction(round.get()).perform();
-                        }
-                        pct.join();
-                    } finally {
-                        for (int i = 0; i < conn.length; ++i) {
-                            if (conn[i] != null) {
-                                conn[i].close();
-                            }
-                        }
-                        ss.close();
-                    }
-                    running.set(false);
-                    synchronized (OrchestratorServer9.this) {
-                        OrchestratorServer9.this.notifyAll();
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                }
-            }
-
-        });
-        t.start();
-        synchronized (bound) {
-            while (!bound.get()) {
-                bound.wait();
-            }
-        }
-    }
-
-    private static class ProtocolConsumer implements Runnable {
-
-        private final Socket[] conn;
-
-        private final int nIntervals;
-
-        private final AtomicInteger interval;
-
-        private final AtomicBoolean done;
-
-        public ProtocolConsumer(Socket[] conn, int nIntervals, AtomicInteger interval, AtomicBoolean done) {
-            this.conn = conn;
-            this.nIntervals = nIntervals;
-            this.interval = interval;
-            this.done = done;
-        }
-
-        @Override
-        public void run() {
-            interval.set(0);
-            try {
-                for (int n = 0; n < nIntervals; ++n) {
-                    for (int i = 0; i < conn.length; i++) {
-                        receiveReached(conn[i]);
-                    }
-                    interval.getAndIncrement();
-                }
-                done.set(true);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
-
-    }
-
-    private static void receiveReached(Socket conn) throws IOException {
-        int msg = new DataInputStream(conn.getInputStream()).readInt();
-        OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Received " + msgType + " from " + conn.getRemoteSocketAddress());
-        }
-        if (msgType != OrchestratorDGProtocol.REACHED) {
-            throw new IllegalStateException("Encounted unknown message type " + msgType);
-        }
-
-    }
-
-    public synchronized void awaitFinished() throws InterruptedException {
-        while (running.get()) {
-            wait();
-        }
-    }
-
-    public interface IProtocolActionBuilder {
-        public IAction buildAction(int round) throws Exception;
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/RecordCountingServer.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/RecordCountingServer.java
deleted file mode 100644
index 22e5ac0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/RecordCountingServer.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-public class RecordCountingServer {
-
-    private final ExecutorService threadPool;
-
-    private final int port;
-
-    private final long duration;
-
-    private ServerSocket ss;
-
-    private boolean stopped;
-
-    private final Object o = new Object();
-
-    final AtomicBoolean b = new AtomicBoolean(false);
-
-    public RecordCountingServer(int port, long duration) {
-        this.port = port;
-        this.duration = duration;
-        threadPool = Executors.newCachedThreadPool();
-    }
-
-    public void start() throws IOException, InterruptedException {
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    stopped = false;
-                    ss = new ServerSocket(port);
-                    while (true) {
-                        Socket s = ss.accept();
-                        if (stopped) {
-                            break;
-                        }
-                        threadPool.execute(new RecordCountingThread(s, duration));
-                        synchronized (o) {
-                            b.set(true);
-                            o.notifyAll();
-                        }
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-        t.start();
-    }
-
-    public void awaitFirstConnection() throws InterruptedException {
-        synchronized (o) {
-            if (!b.get()) {
-                o.wait();
-            }
-        }
-    }
-
-    public void stop() throws IOException, InterruptedException {
-        stopped = true;
-        threadPool.shutdown();
-        threadPool.awaitTermination(1000, TimeUnit.DAYS);
-        ss.close();
-    }
-
-    private static class RecordCountingThread implements Runnable {
-        private final Socket s;
-
-        private final long duration;
-
-        private final char[] buf;
-
-        private int index;
-
-        private int count;
-
-        public RecordCountingThread(Socket s, long duration) {
-            this.s = s;
-            this.duration = duration;
-            buf = new char[32 * 1024];
-        }
-
-        @Override
-        public void run() {
-            count = 0;
-            index = 0;
-            long start = System.currentTimeMillis();
-            try {
-                InputStreamReader r = new InputStreamReader(s.getInputStream());
-                while (System.currentTimeMillis() - start < duration) {
-                    fill(r);
-                    countRecords();
-                }
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-            long end = System.currentTimeMillis();
-            System.out.println("Read " + count + " records in " + (end - start) / 1000 + " seconds");
-        }
-
-        private void countRecords() {
-            for (int i = 0; i < index; ++i) {
-                if (buf[i] == '\n') {
-                    ++count;
-                }
-            }
-        }
-
-        private void fill(Reader r) throws IOException {
-            index = 0;
-            int read = r.read(buf);
-            if (read == -1) {
-                index = 0;
-                return;
-            }
-            index += read;
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        long duration = Long.parseLong(args[0]);
-        int port1 = Integer.parseInt(args[1]);
-        int port2 = Integer.parseInt(args[2]);
-        RecordCountingServer rcs1 = new RecordCountingServer(port1, duration * 1000);
-        RecordCountingServer rcs2 = new RecordCountingServer(port2, duration * 1000);
-        try {
-            rcs1.start();
-            rcs2.start();
-            rcs1.awaitFirstConnection();
-            rcs2.awaitFirstConnection();
-        } finally {
-            rcs1.stop();
-            rcs2.stop();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketDataGeneratorExecutable.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketDataGeneratorExecutable.java
deleted file mode 100644
index eeac0b4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketDataGeneratorExecutable.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.net.Socket;
-import java.util.Collections;
-
-import org.apache.asterix.experiment.action.base.AbstractAction;
-import org.apache.asterix.tools.external.data.TweetGeneratorForSpatialIndexEvaluation;
-
-public class SocketDataGeneratorExecutable extends AbstractAction {
-
-    private final String adapterHost;
-
-    private final int adapterPort;
-
-    public SocketDataGeneratorExecutable(String adapterHost, int adapterPort) {
-        this.adapterHost = adapterHost;
-        this.adapterPort = adapterPort;
-    }
-
-    @Override
-    protected void doPerform() throws Exception {
-        Thread.sleep(4000);
-        Socket s = new Socket(adapterHost, adapterPort);
-        try {
-            TweetGeneratorForSpatialIndexEvaluation tg = new TweetGeneratorForSpatialIndexEvaluation(Collections.<String, String> emptyMap(), 0,
-                    TweetGeneratorForSpatialIndexEvaluation.OUTPUT_FORMAT_ADM_STRING, s.getOutputStream());
-            long start = System.currentTimeMillis();
-            while (tg.setNextRecordBatch(1000)) {
-            }
-            long end = System.currentTimeMillis();
-            long total = end - start;
-            System.out.println("Generation finished: " + tg.getNumFlushedTweets() + " in " + total / 1000 + " seconds");
-        } finally {
-            s.close();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGenerator.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGenerator.java
deleted file mode 100644
index f817fc9..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGenerator.java
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.tools.external.data.TweetGeneratorForSpatialIndexEvaluation;
-import org.apache.commons.lang3.tuple.Pair;
-
-public class SocketTweetGenerator {
-
-    private final ExecutorService threadPool;
-
-    private final int partitionRangeStart;
-
-    private final int dataGenDuration;
-
-    private final int queryGenDuration;
-
-    private final long startDataInterval;
-
-    private final int nDataIntervals;
-
-    private final String orchHost;
-
-    private final int orchPort;
-
-    private final List<Pair<String, Integer>> receiverAddresses;
-
-    private final String openStreetMapFilePath;
-    private final int locationSampleInterval;
-    private final int recordCountPerBatchDuringIngestionOnly;
-    private final int recordCountPerBatchDuringQuery;
-    private final long dataGenSleepTimeDuringIngestionOnly;
-    private final long dataGenSleepTimeDuringQuery;
-
-    private final Mode mode;
-
-    private enum Mode {
-        TIME,
-        DATA
-    }
-
-    public SocketTweetGenerator(SocketTweetGeneratorConfig config) {
-        threadPool = Executors.newCachedThreadPool(new ThreadFactory() {
-
-            private final AtomicInteger count = new AtomicInteger();
-
-            @Override
-            public Thread newThread(Runnable r) {
-                int tid = count.getAndIncrement();
-                Thread t = new Thread(r, "DataGeneratorThread: " + tid);
-                t.setDaemon(true);
-                return t;
-            }
-        });
-
-        partitionRangeStart = config.getPartitionRangeStart();
-        dataGenDuration = config.getDataGenDuration();
-        queryGenDuration = config.getQueryGenDuration();
-        startDataInterval = config.getDataInterval();
-        nDataIntervals = config.getNIntervals();
-        orchHost = config.getOrchestratorHost();
-        orchPort = config.getOrchestratorPort();
-        receiverAddresses = config.getAddresses();
-        mode = startDataInterval > 0 ? Mode.DATA : Mode.TIME;
-        openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        locationSampleInterval = config.getLocationSampleInterval();
-        recordCountPerBatchDuringIngestionOnly = config.getRecordCountPerBatchDuringIngestionOnly();
-        recordCountPerBatchDuringQuery = config.getRecordCountPerBatchDuringQuery();
-        dataGenSleepTimeDuringIngestionOnly = config.getDataGenSleepTimeDuringIngestionOnly();
-        dataGenSleepTimeDuringQuery = config.getDataGenSleepTimeDuringQuery();
-    }
-
-    public void start() throws Exception {
-        final Semaphore sem = new Semaphore((receiverAddresses.size() - 1) * -1);
-        int i = 0;
-        for (Pair<String, Integer> address : receiverAddresses) {
-            threadPool.submit(new DataGenerator(mode, sem, address.getLeft(), address.getRight(), i
-                    + partitionRangeStart, dataGenDuration, queryGenDuration, nDataIntervals, startDataInterval,
-                    orchHost, orchPort, openStreetMapFilePath, locationSampleInterval,
-                    recordCountPerBatchDuringIngestionOnly, recordCountPerBatchDuringQuery,
-                    dataGenSleepTimeDuringIngestionOnly, dataGenSleepTimeDuringQuery));
-            ++i;
-        }
-        sem.acquire();
-    }
-
-    public static class DataGenerator implements Runnable {
-
-        private static final Logger LOGGER = Logger.getLogger(DataGenerator.class.getName());
-
-        private final Mode m;
-        private final Semaphore sem;
-        private final String host;
-        private final int port;
-        private final int partition;
-        private final int dataGenDuration;
-        private final int queryGenDuration;
-        private final int nDataIntervals;
-        private final String orchHost;
-        private final int orchPort;
-
-        private int currentInterval;
-        private long nextStopInterval;
-        private final long dataSizeInterval;
-        private final boolean flagStopResume;
-        private final String openStreetMapFilePath;
-        private final int locationSampleInterval;
-        private final int recordCountPerBatchDuringIngestionOnly;
-        private final int recordCountPerBatchDuringQuery;
-        private final long dataGenSleepTimeDuringIngestionOnly;
-        private final long dataGenSleepTimeDuringQuery;
-
-        public DataGenerator(Mode m, Semaphore sem, String host, int port, int partition, int dataGenDuration,
-                int queryGenDuration, int nDataIntervals, long dataSizeInterval, String orchHost, int orchPort,
-                String openStreetMapFilePath, int locationSampleInterval, int recordCountPerBatchDuringIngestionOnly,
-                int recordCountPerBatchDuringQuery, long dataGenSleepTimeDuringIngestionOnly,
-                long dataGenSleepTimeDuringQuery) {
-            this.m = m;
-            this.sem = sem;
-            this.host = host;
-            this.port = port;
-            this.partition = partition;
-            this.dataGenDuration = dataGenDuration;
-            this.queryGenDuration = queryGenDuration;
-            this.nDataIntervals = nDataIntervals;
-            currentInterval = 0;
-            this.dataSizeInterval = dataSizeInterval;
-            this.nextStopInterval = dataSizeInterval;
-            this.orchHost = orchHost;
-            this.orchPort = orchPort;
-            this.flagStopResume = false;
-            this.openStreetMapFilePath = openStreetMapFilePath;
-            //simple heuristic to generate different data from different data generator.
-            int lsi = locationSampleInterval + (partition + 1) * (partition <= 4 ? 7 : 9);
-            this.locationSampleInterval = lsi;
-            this.recordCountPerBatchDuringIngestionOnly = recordCountPerBatchDuringIngestionOnly;
-            this.recordCountPerBatchDuringQuery = recordCountPerBatchDuringQuery;
-            this.dataGenSleepTimeDuringIngestionOnly = dataGenSleepTimeDuringIngestionOnly;
-            this.dataGenSleepTimeDuringQuery = dataGenSleepTimeDuringQuery;
-        }
-
-        @Override
-        public void run() {
-            LOGGER.info("\nDataGen[" + partition + "] running with the following parameters: \n" + "dataGenDuration : "
-                    + dataGenDuration + "\n" + "queryGenDuration : " + queryGenDuration + "\n" + "nDataIntervals : "
-                    + nDataIntervals + "\n" + "dataSizeInterval : " + dataSizeInterval + "\n"
-                    + "recordCountPerBatchDuringIngestionOnly : " + recordCountPerBatchDuringIngestionOnly + "\n"
-                    + "recordCountPerBatchDuringQuery : " + recordCountPerBatchDuringQuery + "\n"
-                    + "dataGenSleepTimeDuringIngestionOnly : " + dataGenSleepTimeDuringIngestionOnly + "\n"
-                    + "dataGenSleepTimeDuringQuery : " + dataGenSleepTimeDuringQuery + "\n"
-                    + "locationSampleInterval : " + locationSampleInterval);
-
-            try {
-                Socket s = new Socket(host, port);
-                try {
-                    Socket orchSocket = null;
-                    if (m == Mode.DATA && orchHost != null) {
-                        orchSocket = new Socket(orchHost, orchPort);
-                    }
-                    TweetGeneratorForSpatialIndexEvaluation tg = null;
-                    try {
-                        Map<String, String> config = new HashMap<>();
-                        String durationVal = m == Mode.TIME ? String.valueOf(dataGenDuration) : "0";
-                        config.put(TweetGeneratorForSpatialIndexEvaluation.KEY_DURATION, String.valueOf(durationVal));
-                        if (openStreetMapFilePath != null) {
-                            config.put(TweetGeneratorForSpatialIndexEvaluation.KEY_OPENSTREETMAP_FILEPATH,
-                                    openStreetMapFilePath);
-                            config.put(TweetGeneratorForSpatialIndexEvaluation.KEY_LOCATION_SAMPLE_INTERVAL,
-                                    String.valueOf(locationSampleInterval));
-                        }
-                        tg = new TweetGeneratorForSpatialIndexEvaluation(config, partition,
-                                TweetGeneratorForSpatialIndexEvaluation.OUTPUT_FORMAT_ADM_STRING, s.getOutputStream());
-                        long startTS = System.currentTimeMillis();
-                        long prevTS = startTS;
-                        long curTS = startTS;
-                        int round = 0;
-                        while (tg.setNextRecordBatch(recordCountPerBatchDuringIngestionOnly)) {
-                            if (m == Mode.DATA) {
-                                if (tg.getNumFlushedTweets() >= nextStopInterval) {
-                                    //TODO stop/resume option
-                                    if (orchSocket != null) {
-                                        if (flagStopResume) {
-                                            // send stop to orchestrator
-                                            sendStopped(orchSocket);
-                                        } else {
-                                            sendReached(orchSocket);
-                                        }
-                                    }
-
-                                    // update intervals
-                                    // TODO give options: exponential/linear interval
-                                    nextStopInterval += dataSizeInterval;
-                                    if (++currentInterval >= nDataIntervals) {
-                                        break;
-                                    }
-
-                                    if (orchSocket != null) {
-                                        if (flagStopResume) {
-                                            receiveResume(orchSocket);
-                                        }
-                                    }
-                                }
-                            }
-                            curTS = System.currentTimeMillis();
-                            if (LOGGER.isLoggable(Level.INFO)) {
-                                round++;
-                                if ((round * recordCountPerBatchDuringIngestionOnly) % 100000 == 0) {
-                                    System.out.println("DataGen[" + partition
-                                            + "][During ingestion only][TimeToInsert100000] " + (curTS - prevTS)
-                                            + " in milliseconds");
-                                    round = 0;
-                                    prevTS = curTS;
-                                }
-                            }
-                            //to prevent congestion in feed pipe line. 
-                            if (dataGenSleepTimeDuringIngestionOnly > 0) {
-                                Thread.sleep(dataGenSleepTimeDuringIngestionOnly);
-                            }
-                        }
-
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("DataGen[" + partition
-                                    + "][During ingestion only][InsertCount] Num tweets flushed = "
-                                    + tg.getNumFlushedTweets() + " in "
-                                    + ((System.currentTimeMillis() - startTS) / 1000) + " seconds from "
-                                    + InetAddress.getLocalHost() + " to " + host + ":" + port);
-                        }
-
-                        if (orchSocket != null && queryGenDuration > 0) {
-                            //wait until orchestrator server's resume message is received.
-                            receiveResume(orchSocket);
-
-                            //reset duration and flushed tweet count
-                            tg.resetDurationAndFlushedTweetCount(queryGenDuration);
-
-                            prevTS = System.currentTimeMillis();
-                            round = 0;
-                            //start sending record
-                            while (tg.setNextRecordBatch(recordCountPerBatchDuringQuery)) {
-                                curTS = System.currentTimeMillis();
-                                if (LOGGER.isLoggable(Level.INFO)) {
-                                    round++;
-                                    if ((round * recordCountPerBatchDuringQuery) % 100000 == 0) {
-                                        System.out.println("DataGen[" + partition
-                                                + "][During ingestion + queries][TimeToInsert100000] "
-                                                + (curTS - prevTS) + " in milliseconds");
-                                        round = 0;
-                                        prevTS = curTS;
-                                    }
-                                }
-                                if (dataGenSleepTimeDuringQuery > 0) {
-                                    Thread.sleep(dataGenSleepTimeDuringQuery);
-                                }
-                            }
-                            if (LOGGER.isLoggable(Level.INFO)) {
-                                LOGGER.info("DataGen[" + partition
-                                        + "][During ingestion + queries][InsertCount] Num tweets flushed = "
-                                        + tg.getNumFlushedTweets() + " in " + queryGenDuration + " seconds from "
-                                        + InetAddress.getLocalHost() + " to " + host + ":" + port);
-                            }
-                            //send reached message to orchestrator server
-                            sendReached(orchSocket);
-                        }
-
-                    } finally {
-                        if (orchSocket != null) {
-                            orchSocket.close();
-                        }
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("Num tweets flushed = " + tg.getNumFlushedTweets() + " in " + dataGenDuration
-                                    + " seconds from " + InetAddress.getLocalHost() + " to " + host + ":" + port);
-                        }
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                } finally {
-                    s.close();
-                }
-            } catch (Throwable t) {
-                System.err.println("Error connecting to " + host + ":" + port);
-                t.printStackTrace();
-            } finally {
-                sem.release();
-            }
-        }
-
-        private void sendReached(Socket s) throws IOException {
-            new DataOutputStream(s.getOutputStream()).writeInt(OrchestratorDGProtocol.REACHED.ordinal());
-            s.getOutputStream().flush();
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Sent " + OrchestratorDGProtocol.REACHED + " to " + s.getRemoteSocketAddress());
-            }
-        }
-
-        private void receiveResume(Socket s) throws IOException {
-            int msg = new DataInputStream(s.getInputStream()).readInt();
-            OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Received " + msgType + " from " + s.getRemoteSocketAddress());
-            }
-            if (msgType != OrchestratorDGProtocol.RESUME) {
-                throw new IllegalStateException("Unknown protocol message received: " + msgType);
-            }
-        }
-
-        private void sendStopped(Socket s) throws IOException {
-            new DataOutputStream(s.getOutputStream()).writeInt(OrchestratorDGProtocol.STOPPED.ordinal());
-            s.getOutputStream().flush();
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Sent " + OrchestratorDGProtocol.STOPPED + " to " + s.getRemoteSocketAddress());
-            }
-        }
-
-    }
-
-    private static class CircularByteArrayOutputStream extends OutputStream {
-
-        private final byte[] buf;
-
-        private int index;
-
-        public CircularByteArrayOutputStream() {
-            buf = new byte[32 * 1024];
-            index = 0;
-        }
-
-        @Override
-        public void write(byte b[], int off, int len) throws IOException {
-            if (b == null) {
-                throw new NullPointerException();
-            } else if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) > b.length) || ((off + len) < 0)) {
-                throw new IndexOutOfBoundsException();
-            } else if (len == 0) {
-                return;
-            }
-
-            int remain = len;
-            int remainOff = off;
-            while (remain > 0) {
-                int avail = buf.length - index;
-                System.arraycopy(b, remainOff, buf, index, avail);
-                remainOff += avail;
-                remain -= avail;
-                index = (index + avail) % buf.length;
-            }
-        }
-
-        @Override
-        public void write(int b) throws IOException {
-            buf[index] = (byte) b;
-            index = (index + 1) % buf.length;
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorConfig.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorConfig.java
deleted file mode 100644
index d3bb4bd..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorConfig.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.util.List;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.kohsuke.args4j.Argument;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class SocketTweetGeneratorConfig {
-
-    @Option(name = "-p", aliases = "--partition-range-start", usage = "Starting partition number for the set of data generators (default = 0)")
-    private int partitionRangeStart = 0;
-
-    public int getPartitionRangeStart() {
-        return partitionRangeStart;
-    }
-
-    @Option(name = "-d", aliases = { "--datagen-duration" }, usage = "Duration in seconds to run data generation")
-    private int duration = -1;
-
-    public int getDataGenDuration() {
-        return duration;
-    }
-
-    @Option(name = "-qd", aliases = { "--querygen-duration" }, usage = "Duration in seconds to run query generation")
-    private int queryDuration = -1;
-
-    public int getQueryGenDuration() {
-        return queryDuration;
-    }
-
-    @Option(name = "-di", aliases = "--data-interval", usage = "Initial data interval to use when generating data based on data size")
-    private long dataInterval = -1;
-
-    public long getDataInterval() {
-        return dataInterval;
-    }
-
-    @Option(name = "-ni", aliases = "--num-intervals", usage = "Number of intervals to use when generating data based on data size (default = 4)")
-    private int nIntervals = 4;
-
-    public int getNIntervals() {
-        return nIntervals;
-    }
-
-    @Option(name = "-oh", aliases = "--orachestrator-host", usage = "The host name of the orchestrator")
-    private String orchHost;
-
-    public String getOrchestratorHost() {
-        return orchHost;
-    }
-
-    @Option(name = "-op", aliases = "--orchestrator-port", usage = "The port number of the orchestrator")
-    private int orchPort;
-
-    public int getOrchestratorPort() {
-        return orchPort;
-    }
-
-    @Option(name = "-of", aliases = "--openstreetmap-filepath", usage = "The open street map gps point data file path")
-    private String openStreetMapFilePath;
-
-    public String getOpenStreetMapFilePath() {
-        return openStreetMapFilePath;
-    }
-
-    @Option(name = "-si", aliases = "--location-sample-interval", usage = "Location sample interval from open street map point data")
-    private int locationSampleInterval;
-
-    public int getLocationSampleInterval() {
-        return locationSampleInterval;
-    }
-
-    @Option(name = "-rcbi", aliases = "--record-count-per-batch-during-ingestion-only", usage = "Record count per batch during ingestion only")
-    private int recordCountPerBatchDuringIngestionOnly = 1000;
-
-    public int getRecordCountPerBatchDuringIngestionOnly() {
-        return recordCountPerBatchDuringIngestionOnly;
-    }
-
-    @Option(name = "-rcbq", aliases = "--record-count-per-batch-during-query", usage = "Record count per batch during query")
-    private int recordCountPerBatchDuringQuery = 1000;
-
-    public int getRecordCountPerBatchDuringQuery() {
-        return recordCountPerBatchDuringQuery;
-    }
-
-    @Option(name = "-dsti", aliases = "--data-gen-sleep-time-during-ingestion-only", usage = "DataGen sleep time in milliseconds after every recordCountPerBatchDuringIngestionOnly records were sent")
-    private long dataGenSleepTimeDuringIngestionOnly = 1;
-
-    public long getDataGenSleepTimeDuringIngestionOnly() {
-        return dataGenSleepTimeDuringIngestionOnly;
-    }
-
-    @Option(name = "-dstq", aliases = "--data-gen-sleep-time-during-query", usage = "DataGen sleep time in milliseconds after every recordCountPerBatchDuringQuery records were sent")
-    private long dataGenSleepTimeDuringQuery = 1;
-
-    public long getDataGenSleepTimeDuringQuery() {
-        return dataGenSleepTimeDuringQuery;
-    }
-
-    @Argument(required = true, usage = "A list of <ip>:<port> pairs (addresses) to send data to", metaVar = "addresses...", handler = AddressOptionHandler.class)
-    private List<Pair<String, Integer>> addresses;
-
-    public List<Pair<String, Integer>> getAddresses() {
-        return addresses;
-    }
-
-    public static class AddressOptionHandler extends OptionHandler<Pair<String, Integer>> {
-
-        public AddressOptionHandler(CmdLineParser parser, OptionDef option, Setter<? super Pair<String, Integer>> setter) {
-            super(parser, option, setter);
-        }
-
-        @Override
-        public int parseArguments(Parameters params) throws CmdLineException {
-            int counter = 0;
-            while (true) {
-                String param;
-                try {
-                    param = params.getParameter(counter);
-                } catch (CmdLineException ex) {
-                    break;
-                }
-
-                String[] hostPort = param.split(":");
-                if (hostPort.length != 2) {
-                    throw new CmdLineException("Invalid address: " + param + ". Expected <host>:<port>");
-                }
-                Integer port = null;
-                try {
-                    port = Integer.parseInt(hostPort[1]);
-                } catch (NumberFormatException e) {
-                    throw new CmdLineException("Invalid port " + hostPort[1] + " for address " + param + ".");
-                }
-                setter.addValue(Pair.of(hostPort[0], port));
-                counter++;
-            }
-            return counter;
-        }
-
-        @Override
-        public String getDefaultMetaVariable() {
-            return "addresses";
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorDriver.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorDriver.java
deleted file mode 100644
index d64809f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SocketTweetGeneratorDriver.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-
-public class SocketTweetGeneratorDriver {
-    public static void main(String[] args) throws Exception {
-        SocketTweetGeneratorConfig clientConfig = new SocketTweetGeneratorConfig();
-        CmdLineParser clp = new CmdLineParser(clientConfig);
-        try {
-            clp.parseArgument(args);
-        } catch (CmdLineException e) {
-            System.err.println(e.getMessage());
-            clp.printUsage(System.err);
-            System.exit(1);
-        }
-
-        if ((clientConfig.getDataInterval() == -1 && clientConfig.getDataGenDuration() == -1)
-                || (clientConfig.getDataInterval() > 0 && clientConfig.getDataGenDuration() > 0)) {
-            System.err.println("Must use exactly one of -d or -di");
-            clp.printUsage(System.err);
-            System.exit(1);
-        }
-
-        SocketTweetGenerator client = new SocketTweetGenerator(clientConfig);
-        client.start();
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialIndexExperiment2OrchestratorServer.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialIndexExperiment2OrchestratorServer.java
deleted file mode 100644
index 4e360dd..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialIndexExperiment2OrchestratorServer.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class SpatialIndexExperiment2OrchestratorServer {
-
-    private static final Logger LOGGER = Logger.getLogger(SpatialIndexExperiment2OrchestratorServer.class.getName());
-
-    private final int dataGenPort;
-
-    private final int queryGenPort;
-
-    private final int nDataGens;
-
-    private final int nQueryGens;
-
-    private final int nIntervals;
-
-    private final AtomicBoolean running;
-
-    public SpatialIndexExperiment2OrchestratorServer(int dataGenPort, int nDataGens, int nIntervals, int queryGenPort,
-            int nQueryGens) {
-        this.dataGenPort = dataGenPort;
-        this.nDataGens = nDataGens;
-        this.queryGenPort = queryGenPort;
-        this.nQueryGens = nQueryGens;
-        this.nIntervals = nIntervals;
-        running = new AtomicBoolean();
-    }
-
-    public synchronized void start() throws IOException, InterruptedException {
-        final AtomicBoolean dataGenBound = new AtomicBoolean();
-        final AtomicBoolean queryGenBound = new AtomicBoolean();
-        running.set(true);
-        Thread t = new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                try {
-                    ServerSocket dataGenSS = new ServerSocket(dataGenPort);
-                    synchronized (dataGenBound) {
-                        dataGenBound.set(true);
-                        dataGenBound.notifyAll();
-                    }
-                    ServerSocket queryGenSS = new ServerSocket(queryGenPort);
-                    synchronized (queryGenBound) {
-                        queryGenBound.set(true);
-                        queryGenBound.notifyAll();
-                    }
-
-                    Socket[] dataConn = new Socket[nDataGens];
-                    Socket[] queryConn = new Socket[nQueryGens];
-                    try {
-                        //#.wait until all dataGens and queryGens have connected to the orchestrator
-                        for (int i = 0; i < nDataGens; i++) {
-                            dataConn[i] = dataGenSS.accept();
-                        }
-                        for (int i = 0; i < nQueryGens; i++) {
-                            queryConn[i] = queryGenSS.accept();
-                        }
-
-                        //#.wait until queryGens are ready for generating query
-                        for (int i = 0; i < nQueryGens; i++) {
-                            receiveReached(queryConn[i]);
-                        }
-
-                        //#.wait until dataGens are ready for generating data after nIntervals of data were generated 
-                        for (int i = 0; i < nIntervals; i++) {
-                            for (int j = 0; j < nDataGens; j++) {
-                                receiveReached(dataConn[j]);
-                            }
-                        }
-
-                        //#.send signal to queryGens to start sending queries
-                        for (int i = 0; i < nQueryGens; i++) {
-                            sendResume(queryConn[i]);
-                        }
-                        //#.send signal to dataGens to start sending records
-                        for (int i = 0; i < nDataGens; i++) {
-                            sendResume(dataConn[i]);
-                        }
-
-                        //#.wait until both dataGen and queryGen's are done
-                        for (int i = 0; i < nQueryGens; i++) {
-                            receiveReached(queryConn[i]);
-                        }
-                        for (int i = 0; i < nDataGens; i++) {
-                            receiveReached(dataConn[i]);
-                        }
-
-                    } finally {
-                        for (int i = 0; i < nDataGens; ++i) {
-                            if (dataConn[i] != null) {
-                                dataConn[i].close();
-                            }
-                        }
-                        dataGenSS.close();
-                        for (int i = 0; i < nQueryGens; ++i) {
-                            if (queryConn[i] != null) {
-                                queryConn[i].close();
-                            }
-                        }
-                        queryGenSS.close();
-                    }
-                    running.set(false);
-                    synchronized (SpatialIndexExperiment2OrchestratorServer.this) {
-                        SpatialIndexExperiment2OrchestratorServer.this.notifyAll();
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                }
-            }
-
-        });
-        t.start();
-        synchronized (dataGenBound) {
-            while (!dataGenBound.get()) {
-                dataGenBound.wait();
-            }
-        }
-        synchronized (queryGenBound) {
-            while (!queryGenBound.get()) {
-                queryGenBound.wait();
-            }    
-        }
-    }
-
-    private static void receiveReached(Socket conn) throws IOException {
-        int msg = new DataInputStream(conn.getInputStream()).readInt();
-        OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Received " + msgType + " from " + conn.getRemoteSocketAddress());
-        }
-        if (msgType != OrchestratorDGProtocol.REACHED) {
-            throw new IllegalStateException("Encounted unknown message type " + msgType);
-        }
-    }
-
-    private void sendResume(Socket s) throws IOException {
-        new DataOutputStream(s.getOutputStream()).writeInt(OrchestratorDGProtocol.RESUME.ordinal());
-        s.getOutputStream().flush();
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Sent " + OrchestratorDGProtocol.RESUME + " to " + s.getRemoteSocketAddress());
-        }
-    }
-
-    public synchronized void awaitFinished() throws InterruptedException {
-        while (running.get()) {
-            wait();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGenerator.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGenerator.java
deleted file mode 100644
index c046f4e..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGenerator.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.BufferedReader;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.Inet4Address;
-import java.net.Socket;
-import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.experiment.action.base.IAction;
-import org.apache.asterix.experiment.action.base.SequentialActionList;
-import org.apache.asterix.experiment.action.derived.RunAQLStringAction;
-import org.apache.asterix.experiment.action.derived.TimedAction;
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.hyracks.api.util.ExperimentProfilerUtils;
-
-public class SpatialQueryGenerator {
-
-    private static final int SKIP_LINE_COUNT = 199;
-
-    private final ExecutorService threadPool;
-
-    private final int partitionRangeStart;
-
-    private final int duration;
-
-    private final String restHost;
-
-    private final int restPort;
-
-    private final String orchHost;
-
-    private final int orchPort;
-
-    private final String openStreetMapFilePath;
-
-    private final boolean isIndexOnlyPlan;
-
-    public SpatialQueryGenerator(SpatialQueryGeneratorConfig config) {
-        threadPool = Executors.newCachedThreadPool(new ThreadFactory() {
-
-            private final AtomicInteger count = new AtomicInteger();
-
-            @Override
-            public Thread newThread(Runnable r) {
-                int tid = count.getAndIncrement();
-                Thread t = new Thread(r, "DataGeneratorThread: " + tid);
-                t.setDaemon(true);
-                return t;
-            }
-        });
-
-        partitionRangeStart = config.getPartitionRangeStart();
-        duration = config.getDuration();
-        restHost = config.getRESTHost();
-        restPort = config.getRESTPort();
-        orchHost = config.getQueryOrchestratorHost();
-        orchPort = config.getQueryOrchestratorPort();
-        openStreetMapFilePath = config.getOpenStreetMapFilePath();
-        isIndexOnlyPlan = config.getIsIndexOnlyPlan();
-    }
-
-    public void start() throws Exception {
-        final Semaphore sem = new Semaphore(0);
-        threadPool.submit(new QueryGenerator(sem, restHost, restPort, orchHost, orchPort, partitionRangeStart,
-                duration, openStreetMapFilePath, isIndexOnlyPlan));
-        sem.acquire();
-    }
-
-    public static class QueryGenerator implements Runnable {
-
-        private static final Logger LOGGER = Logger.getLogger(QueryGenerator.class.getName());
-
-        private final HttpClient httpClient;
-        private final Semaphore sem;
-        private final String restHost;
-        private final int restPort;
-        private final String orchHost;
-        private final int orchPort;
-        private final int partition;
-        private final int queryDuration;
-        private final String openStreetMapFilePath;
-        private final float[] radiusType = new float[] { 0.00001f, 0.0001f, 0.001f, 0.01f, 0.1f };
-        private int radiusIter = 0;
-        private final Random randGen;
-        private BufferedReader br;
-        private long queryCount;
-        private Random random = new Random(211);
-        private final boolean isIndexOnlyPlan;
-        private String outputFilePath;
-        private FileOutputStream outputFos;
-
-        public QueryGenerator(Semaphore sem, String restHost, int restPort, String orchHost, int orchPort,
-                int partitionRangeStart, int queryDuration, String openStreetMapFilePath, boolean isIndexOnlyPlan) {
-            httpClient = new DefaultHttpClient();
-            this.sem = sem;
-            this.restHost = restHost;
-            this.restPort = restPort;
-            this.orchHost = orchHost;
-            this.orchPort = orchPort;
-            this.partition = partitionRangeStart;
-            this.queryDuration = queryDuration * 1000;
-            this.openStreetMapFilePath = openStreetMapFilePath;
-            this.queryCount = 0;
-            this.randGen = new Random(partitionRangeStart);
-            this.isIndexOnlyPlan = isIndexOnlyPlan;
-        }
-
-        @Override
-        public void run() {
-            LOGGER.info("\nQueryGen[" + partition + "] running with the following parameters: \n"
-                    + "queryGenDuration : " + queryDuration + "\n" + "isIndexOnlyPlan : " + isIndexOnlyPlan);
-
-            try {
-                outputFilePath = openStreetMapFilePath.substring(0, openStreetMapFilePath.lastIndexOf(File.separator))
-                        + File.separator + "QueryGenResult-" + Inet4Address.getLocalHost().getHostAddress() + ".txt";
-                outputFos = ExperimentProfilerUtils.openOutputFile(outputFilePath);
-            } catch (Exception e) {
-                e.printStackTrace();
-                return;
-            }
-
-            try {
-                if (openStreetMapFilePath != null) {
-                    this.br = new BufferedReader(new FileReader(openStreetMapFilePath));
-                }
-                try {
-                    //connect to orchestrator socket
-                    Socket orchSocket = null;
-                    orchSocket = new Socket(orchHost, orchPort);
-                    try {
-                        //send reached message to orchestrator
-                        sendReached(orchSocket);
-
-                        //wait until receiving resume message from the orchestrator server
-                        receiveResume(orchSocket);
-
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("QueryGen[" + partition + "] starts sending queries...");
-                        }
-                        //send queries during query duration
-                        long startTS = System.currentTimeMillis();
-                        long prevTS = startTS;
-                        long curTS = startTS;
-                        while (curTS - startTS < queryDuration) {
-                            sendQuery();
-                            queryCount++;
-                            curTS = System.currentTimeMillis();
-                            if (LOGGER.isLoggable(Level.INFO) && queryCount % 100 == 0) {
-                                LOGGER.info("QueryGen[" + partition + "][TimeToQuery100] " + (curTS - prevTS)
-                                        + " in milliseconds");
-                                prevTS = curTS;
-                            }
-                        }
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("QueryGen[" + partition + "][QueryCount] " + queryCount + " in "
-                                    + (queryDuration / 1000) + " seconds");
-                        }
-
-                        if (outputFos != null) {
-                            ExperimentProfilerUtils.closeOutputFile(outputFos);
-                        }
-
-                        //send reqched message to orchestrator
-                        sendReached(orchSocket);
-                    } finally {
-                        if (orchSocket != null) {
-                            orchSocket.close();
-                        }
-                    }
-                } catch (Throwable t) {
-                    t.printStackTrace();
-                    outputFos.write("Error during sending query\n".getBytes());
-                    throw t;
-                } finally {
-                    if (openStreetMapFilePath != null) {
-                        br.close();
-                    }
-                    if (outputFos != null) {
-                        ExperimentProfilerUtils.closeOutputFile(outputFos);
-                    }
-                }
-            } catch (Throwable t) {
-                System.err.println("Error connecting to rest API server " + restHost + ":" + restPort);
-                t.printStackTrace();
-            } finally {
-                sem.release();
-            }
-        }
-
-        private void sendQuery() throws IOException {
-            //prepare radius and center point
-            int skipLineCount = SKIP_LINE_COUNT;
-            int lineCount = 0;
-            String line = null;;
-            String strPoints[] = null;
-            float x = 0, y = 0;
-            int beginX = -180, endX = 180, beginY = -90, endY = 90;
-            if (openStreetMapFilePath != null) {
-                while (lineCount < skipLineCount) {
-                    if ((line = br.readLine()) == null) {
-                        //reopen file
-                        br.close();
-                        br = new BufferedReader(new FileReader(openStreetMapFilePath));
-                        line = br.readLine();
-                    }
-                    strPoints = line.split(",");
-                    if (strPoints.length != 2) {
-                        continue;
-                    }
-                    lineCount++;
-                }
-                y = Float.parseFloat(strPoints[0]) / 10000000; //latitude (y value)
-                x = Float.parseFloat(strPoints[1]) / 10000000; //longitude (x value)
-            } else {
-                int xMajor = beginX + random.nextInt(endX - beginX);
-                int xMinor = random.nextInt(100);
-                x = xMajor + ((float) xMinor) / 100;
-
-                int yMajor = beginY + random.nextInt(endY - beginY);
-                int yMinor = random.nextInt(100);
-                y = yMajor + ((float) yMinor) / 100;
-            }
-
-            //create action
-            SequentialActionList sAction = new SequentialActionList();
-            IAction rangeQueryAction = new TimedAction(new RunAQLStringAction(httpClient, restHost, restPort,
-                    getRangeQueryAQL(radiusType[radiusIter++ % radiusType.length], x, y, isIndexOnlyPlan), outputFos),
-                    outputFos);
-            sAction.add(rangeQueryAction);
-
-            //perform
-            sAction.perform();
-        }
-
-        private String getRangeQueryAQL(float radius, float x, float y, boolean isIndexOnlyPlan) {
-            StringBuilder sb = new StringBuilder();
-            sb.append("use dataverse experiments; ");
-            sb.append("count( ");
-            sb.append("for $x in dataset Tweets").append(" ");
-            sb.append("let $n :=  create-circle( ");
-            sb.append("point(\"").append(x).append(", ").append(y).append("\") ");
-            sb.append(", ");
-            sb.append(String.format("%f", radius));
-            sb.append(" )");
-            if (isIndexOnlyPlan) {
-                sb.append("where spatial-intersect($x.sender-location, $n) ");
-            } else {
-                sb.append("where spatial-intersect($x.sender-location, $n) and $x.btree-extra-field1 <= int32(\"2147483647\") ");
-            }
-            sb.append("return $x ");
-            sb.append(");");
-            return sb.toString();
-        }
-
-        private void sendReached(Socket s) throws IOException {
-            new DataOutputStream(s.getOutputStream()).writeInt(OrchestratorDGProtocol.REACHED.ordinal());
-            s.getOutputStream().flush();
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Sent " + OrchestratorDGProtocol.REACHED + " to " + s.getRemoteSocketAddress());
-            }
-        }
-
-        private void receiveResume(Socket s) throws IOException {
-            int msg = new DataInputStream(s.getInputStream()).readInt();
-            OrchestratorDGProtocol msgType = OrchestratorDGProtocol.values()[msg];
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Received " + msgType + " from " + s.getRemoteSocketAddress());
-            }
-            if (msgType != OrchestratorDGProtocol.RESUME) {
-                throw new IllegalStateException("Unknown protocol message received: " + msgType);
-            }
-        }
-
-        private void sendStopped(Socket s) throws IOException {
-            new DataOutputStream(s.getOutputStream()).writeInt(OrchestratorDGProtocol.STOPPED.ordinal());
-            s.getOutputStream().flush();
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Sent " + OrchestratorDGProtocol.STOPPED + " to " + s.getRemoteSocketAddress());
-            }
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorConfig.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorConfig.java
deleted file mode 100644
index 79055aa..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorConfig.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-import org.kohsuke.args4j.Option;
-import org.kohsuke.args4j.OptionDef;
-import org.kohsuke.args4j.spi.OptionHandler;
-import org.kohsuke.args4j.spi.Parameters;
-import org.kohsuke.args4j.spi.Setter;
-
-public class SpatialQueryGeneratorConfig {
-
-    @Option(name = "-p", aliases = "--partition-range-start", usage = "Starting partition number for the set of data generators (default = 0)")
-    private int partitionRangeStart = 0;
-
-    public int getPartitionRangeStart() {
-        return partitionRangeStart;
-    }
-
-    @Option(name = "-qd", aliases = { "--duration" }, usage = "Duration in seconds to run guery generation")
-    private int queryGenDuration = -1;
-
-    public int getDuration() {
-        return queryGenDuration;
-    }
-
-    @Option(name = "-qc", aliases = { "--query-count" }, usage = "The number of queries to generate")
-    private int queryCount = -1;
-
-    public int getQueryCount() {
-        return queryCount;
-    }
-
-    @Option(name = "-rh", aliases = "--rest-host", usage = "Asterix REST API host address", required = true, metaVar = "HOST")
-    private String restHost;
-
-    public String getRESTHost() {
-        return restHost;
-    }
-
-    @Option(name = "-rp", aliases = "--rest-port", usage = "Asterix REST API port", required = true, metaVar = "PORT")
-    private int restPort;
-
-    public int getRESTPort() {
-        return restPort;
-    }
-
-    @Option(name = "-qoh", aliases = "--query-orchestrator-host", usage = "The host address of query orchestrator")
-    private String queryOrchHost;
-
-    public String getQueryOrchestratorHost() {
-        return queryOrchHost;
-    }
-
-    @Option(name = "-qop", aliases = "--query-orchestrator-port", usage = "The port to be used for the orchestrator server of query orchestrator")
-    private int queryOrchPort;
-
-    public int getQueryOrchestratorPort() {
-        return queryOrchPort;
-    }
-
-    @Option(name = "-of", aliases = "--openstreetmap-filepath", usage = "The open street map gps point data file path")
-    private String openStreetMapFilePath;
-
-    public String getOpenStreetMapFilePath() {
-        return openStreetMapFilePath;
-    }
-
-    @Option(name = "-iop", aliases = "--index-only-plan", usage = "Indicator of whether index only plan or not")
-    private boolean isIndexOnlyPlan;
-
-    public boolean getIsIndexOnlyPlan() {
-        return isIndexOnlyPlan;
-    }
-
-    public static class AddressOptionHandler extends OptionHandler<Pair<String, Integer>> {
-
-        public AddressOptionHandler(CmdLineParser parser, OptionDef option, Setter<? super Pair<String, Integer>> setter) {
-            super(parser, option, setter);
-        }
-
-        @Override
-        public int parseArguments(Parameters params) throws CmdLineException {
-            int counter = 0;
-            while (true) {
-                String param;
-                try {
-                    param = params.getParameter(counter);
-                } catch (CmdLineException ex) {
-                    break;
-                }
-
-                String[] hostPort = param.split(":");
-                if (hostPort.length != 2) {
-                    throw new CmdLineException("Invalid address: " + param + ". Expected <host>:<port>");
-                }
-                Integer port = null;
-                try {
-                    port = Integer.parseInt(hostPort[1]);
-                } catch (NumberFormatException e) {
-                    throw new CmdLineException("Invalid port " + hostPort[1] + " for address " + param + ".");
-                }
-                setter.addValue(Pair.of(hostPort[0], port));
-                counter++;
-            }
-            return counter;
-        }
-
-        @Override
-        public String getDefaultMetaVariable() {
-            return "addresses";
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorDriver.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorDriver.java
deleted file mode 100644
index ee16340..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SpatialQueryGeneratorDriver.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-
-public class SpatialQueryGeneratorDriver {
-    public static void main(String[] args) throws Exception {
-        SpatialQueryGeneratorConfig clientConfig = new SpatialQueryGeneratorConfig();
-        CmdLineParser clp = new CmdLineParser(clientConfig);
-        try {
-            clp.parseArgument(args);
-        } catch (CmdLineException e) {
-            System.err.println(e.getMessage());
-            clp.printUsage(System.err);
-            System.exit(1);
-        }
-
-        SpatialQueryGenerator client = new SpatialQueryGenerator(clientConfig);
-        client.start();
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorConfig.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorConfig.java
deleted file mode 100644
index 8621681..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorConfig.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import org.kohsuke.args4j.Option;
-
-public class SyntheticDataGeneratorConfig {
-
-    @Option(name = "-psf", aliases = "--point-source-file", usage = "The point source file")
-    private String pointSourceFile;
-
-    public String getPointSourceFile() {
-        return pointSourceFile;
-    }
-    
-    @Option(name = "-psi", aliases = "--point-sampling-interval", usage = "The point sampling interval from the point source file", required = true)
-    private int pointSamplingInterval;
-
-    public int getpointSamplingInterval() {
-        return pointSamplingInterval;
-    }
-    
-    @Option(name = "-pid", aliases = "--parition-id", usage = "The partition id in order to avoid key duplication", required = true)
-    private int partitionId;
-
-    public int getPartitionId() {
-        return partitionId;
-    }
-    
-    @Option(name = "-of", aliases = "--output-filepath", usage = "The output file path", required = true)
-    private String outputFilePath;
-
-    public String getOutputFilePath() {
-        return outputFilePath;
-    }
-    
-    @Option(name = "-rc", aliases = "--record-count", usage = "The record count to generate", required = true)
-    private long recordCount;
-
-    public long getRecordCount() {
-        return recordCount;
-    }        
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorForSpatialIndexEvaluation.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorForSpatialIndexEvaluation.java
deleted file mode 100644
index 25d56a0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/client/SyntheticDataGeneratorForSpatialIndexEvaluation.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.client;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation;
-import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation.InitializationInfo;
-import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation.TweetMessageIterator;
-import org.apache.asterix.tools.external.data.GULongIDGenerator;
-import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.args4j.CmdLineParser;
-
-public class SyntheticDataGeneratorForSpatialIndexEvaluation {
-    public static void main(String[] args) throws Exception {
-        SyntheticDataGeneratorConfig config = new SyntheticDataGeneratorConfig();
-        CmdLineParser clp = new CmdLineParser(config);
-        try {
-            clp.parseArgument(args);
-        } catch (CmdLineException e) {
-            System.err.println(e.getMessage());
-            clp.printUsage(System.err);
-            System.exit(1);
-        }
-
-        //prepare data generator
-        GULongIDGenerator uidGenerator = new GULongIDGenerator(config.getPartitionId(), (byte) (0));
-        String pointSourceFilePath = config.getPointSourceFile();
-        int pointSampleInterval = config.getpointSamplingInterval();
-        DataGeneratorForSpatialIndexEvaluation dataGenerator = new DataGeneratorForSpatialIndexEvaluation(new InitializationInfo(), pointSourceFilePath,
-                pointSampleInterval);
-
-        //get record count to be generated
-        long maxRecordCount = config.getRecordCount();
-        long recordCount = 0;
-
-        //prepare timer
-        long startTS = System.currentTimeMillis();
-
-        //prepare tweetIterator which acutally generates tweet 
-        TweetMessageIterator tweetIterator = dataGenerator.new TweetMessageIterator(0, uidGenerator);
-
-        FileOutputStream fos = null;
-        try {
-            //prepare output file
-            fos = openOutputFile(config.getOutputFilePath());
-
-            while (recordCount < maxRecordCount) {
-                //get a tweet and append newline at the end
-                String tweet = tweetIterator.next().toString() + "\n";
-                //write to file
-                fos.write(tweet.getBytes());
-                
-                recordCount++;
-                if (recordCount % 1000000 == 0) {
-                    System.out.println("... generated " + recordCount + " records");
-                }
-            }
-            System.out.println("Done: generated " + recordCount + " records in "
-                    + ((System.currentTimeMillis() - startTS) / 1000) + " in seconds!");
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            try {
-                closeOutputFile(fos);
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    public static FileOutputStream openOutputFile(String filepath) throws IOException {
-        File file = new File(filepath);
-        if (file.exists()) {
-            throw new IOException(filepath + "already exists");
-        }
-        file.createNewFile();
-        return new FileOutputStream(file);
-    }
-
-    public static void closeOutputFile(FileOutputStream fos) throws IOException {
-        fos.flush();
-        fos.close();
-        fos = null;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/logging/ExperimentLogFormatter.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/logging/ExperimentLogFormatter.java
deleted file mode 100644
index 544fbf8..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/logging/ExperimentLogFormatter.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.logging;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.logging.Formatter;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-
-public class ExperimentLogFormatter extends Formatter {
-
-    // format string for printing the log record
-    private static final String format = "{0} {1}\n{2}: {3}\n";
-    private final Date dat = new Date();
-    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
-
-    /**
-     * Format the given LogRecord.
-     * <p>
-     * The formatting can be customized by specifying the <a href="../Formatter.html#syntax">format string</a> in the <a href="#formatting"> {@code java.util.logging.SimpleFormatter.format}</a> property. The given {@code LogRecord} will be formatted as if by calling:
-     * 
-     * <pre>
-     *    {@link String#format String.format}(format, date, source, logger, level, message, thrown);
-     * </pre>
-     * 
-     * where the arguments are:<br>
-     * <ol>
-     * <li>{@code format} - the {@link java.util.Formatter
-     * java.util.Formatter} format string specified in the {@code java.util.logging.SimpleFormatter.format} property or the default format.</li>
-     * <li>{@code date} - a {@link Date} object representing {@linkplain LogRecord#getMillis event time} of the log record.</li>
-     * <li>{@code source} - a string representing the caller, if available; otherwise, the logger's name.</li>
-     * <li>{@code logger} - the logger's name.</li>
-     * <li>{@code level} - the {@linkplain Level#getLocalizedName
-     * log level}.</li>
-     * <li>{@code message} - the formatted log message returned from the {@link Formatter#formatMessage(LogRecord)} method. It uses {@link java.text.MessageFormat java.text} formatting and does not use the {@code java.util.Formatter format} argument.</li>
-     * <li>{@code thrown} - a string representing the {@linkplain LogRecord#getThrown throwable} associated with the log record and its backtrace beginning with a newline character, if any; otherwise, an empty string.</li>
-     * </ol>
-     * <p>
-     * Some example formats:<br>
-     * <ul>
-     * <li> {@code java.util.logging.SimpleFormatter.format="%4$s: %5$s [%1$tc]%n"}
-     * <p>
-     * This prints 1 line with the log level ({@code 4$}), the log message ({@code 5$}) and the timestamp ({@code 1$}) in a square bracket.
-     * 
-     * <pre>
-     *     WARNING: warning message [Tue Mar 22 13:11:31 PDT 2011]
-     * </pre>
-     * 
-     * </li>
-     * <li> {@code java.util.logging.SimpleFormatter.format="%1$tc %2$s%n%4$s: %5$s%6$s%n"}
-     * <p>
-     * This prints 2 lines where the first line includes the timestamp ({@code 1$}) and the source ({@code 2$}); the second line includes the log level ({@code 4$}) and the log message ({@code 5$}) followed with the throwable and its backtrace ({@code 6$}), if any:
-     * 
-     * <pre>
-     *     Tue Mar 22 13:11:31 PDT 2011 MyClass fatal
-     *     SEVERE: several message with an exception
-     *     java.lang.IllegalArgumentException: invalid argument
-     *             at MyClass.mash(MyClass.java:9)
-     *             at MyClass.crunch(MyClass.java:6)
-     *             at MyClass.main(MyClass.java:3)
-     * </pre>
-     * 
-     * </li>
-     * <li> {@code java.util.logging.SimpleFormatter.format="%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %2$s%n%4$s: %5$s%n"}
-     * <p>
-     * This prints 2 lines similar to the example above with a different date/time formatting and does not print the throwable and its backtrace:
-     * 
-     * <pre>
-     *     Mar 22, 2011 1:11:31 PM MyClass fatal
-     *     SEVERE: several message with an exception
-     * </pre>
-     * 
-     * </li>
-     * </ul>
-     * <p>
-     * This method can also be overridden in a subclass. It is recommended to use the {@link Formatter#formatMessage} convenience method to localize and format the message field.
-     * 
-     * @param record
-     *            the log record to be formatted.
-     * @return a formatted log record
-     */
-    public synchronized String format(LogRecord record) {
-        dat.setTime(record.getMillis());
-        String source;
-        if (record.getSourceClassName() != null) {
-            source = record.getSourceClassName();
-            if (record.getSourceMethodName() != null) {
-                source += " " + record.getSourceMethodName();
-            }
-        } else {
-            source = record.getLoggerName();
-        }
-        String message = formatMessage(record);
-        String throwable = "";
-        if (record.getThrown() != null) {
-            StringWriter sw = new StringWriter();
-            PrintWriter pw = new PrintWriter(sw);
-            pw.println();
-            record.getThrown().printStackTrace(pw);
-            pw.close();
-            throwable = sw.toString();
-        }
-        return MessageFormat.format(format, sdf.format(dat), source, record.getLevel(),
-                message, throwable);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractDynamicDataEvalReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractDynamicDataEvalReportBuilder.java
deleted file mode 100644
index 13d2694..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractDynamicDataEvalReportBuilder.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
-public abstract class AbstractDynamicDataEvalReportBuilder implements IDynamicDataEvalReportBuilder {
-
-    protected final static String INSTANTANEOUS_INSERT_STRING = "[TimeToInsert100000]";
-    protected final static int INSTANTAEOUS_INSERT_COUNT = 100000;
-    protected final static int ROUND_COUNT = 721;
-    protected final static int ROUND_INTERVAL = 5;
-    protected final String expHomePath;
-    protected final String expName;
-    protected final String runLogFilePath;
-    protected final String[] ncLogFilePaths;
-    protected BufferedReader br = null;
-    protected BufferedReader[] ncLogBrs = null;
-    protected final int ncLogFileCount;
-
-    protected final StringBuilder dataGenSb;
-    protected final StringBuilder queryGenSb;
-    protected final StringBuilder rsb;
-
-    protected AbstractDynamicDataEvalReportBuilder(String expHomePath, String expName, String runLogFileName,
-            boolean hasStatFile) {
-        this.expHomePath = expHomePath;
-        this.expName = expName;
-        this.runLogFilePath = new String(expHomePath + runLogFileName);
-        if (expName.contains("1A")) {
-            ncLogFileCount = 1;
-        } else if (expName.contains("1B")) {
-            ncLogFileCount = 2;
-        } else if (expName.contains("1C")) {
-            ncLogFileCount = 4;
-        } else /* if (expName.contains("1D") || other exps) */{
-            ncLogFileCount = 8;
-        }
-        ncLogFilePaths = new String[ncLogFileCount];
-        ncLogBrs = new BufferedReader[ncLogFileCount];
-        for (int i = 0; i < ncLogFileCount; i++) {
-            if (hasStatFile) {
-                ncLogFilePaths[i] = new String(expHomePath + expName + File.separator + "node" + (i + 1)
-                        + File.separator + "logs" + File.separator + "a1_node" + (i + 1) + ".log");
-            } else {
-                ncLogFilePaths[i] = new String(expHomePath + expName + File.separator + "logs" + File.separator
-                        + "a1_node" + (i + 1) + ".log");
-            }
-        }
-        dataGenSb = new StringBuilder();
-        queryGenSb = new StringBuilder();
-        rsb = new StringBuilder();
-    }
-
-    protected void openRunLog() throws IOException {
-        br = new BufferedReader(new FileReader(runLogFilePath));
-        for (int i = 0; i < ncLogFileCount; i++) {
-            ncLogBrs[i] = new BufferedReader(new FileReader(ncLogFilePaths[i]));
-        }
-    }
-
-    protected void closeRunLog() throws IOException {
-        if (br != null) {
-            br.close();
-        }
-        if (ncLogBrs != null) {
-            for (int i = 0; i < ncLogFileCount; i++) {
-                if (ncLogBrs[i] != null) {
-                    ncLogBrs[i].close();
-                }
-            }
-        }
-    }
-
-    protected boolean moveToExperimentBegin() throws IOException {
-        String line;
-        while ((line = br.readLine()) != null) {
-            if (line.contains("Running experiment: " + expName)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected void renewStringBuilder() {
-        dataGenSb.setLength(0);
-        queryGenSb.setLength(0);
-        rsb.setLength(0);
-    }
-
-    @Override
-    public String getInstantaneousInsertPS(int nodeId, boolean useTimeForX) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            int round = 0;
-            while (round < ROUND_COUNT) {
-                long IIPS = 0;
-                String line;
-                while ((line = ncLogBrs[nodeId].readLine()) != null) {
-                    if (line.contains("IPS")) {
-                        IIPS = ReportBuilderHelper.getLong(line, ", IIPS[", "]");
-                        break;
-                    }
-                }
-                round++;
-                dataGenSb.append(round * ROUND_INTERVAL).append(",").append(IIPS).append("\n");
-            }
-
-            return dataGenSb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    @Override
-    public void getAllNodesAccumulatedInsertPS(int targetRound, List<Long> ipsList) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        ipsList.clear();
-        try {
-
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return;
-            }
-
-            int round = 0;
-            while (round < targetRound) {
-                long IPSPerRound = 0;
-                for (int i = 0; i < ncLogFileCount; i++) {
-                    String line;
-                    while ((line = ncLogBrs[i].readLine()) != null) {
-                        if (line.contains("IPS")) {
-                            IPSPerRound += ReportBuilderHelper.getLong(line, ", IPS[", "]");
-                            break;
-                        }
-                    }
-                }
-                ipsList.add(IPSPerRound);
-                round++;
-            }
-            return;
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    public String getInstantaneousDataGenPS(int genId, boolean useTimeForX) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            int dGenId;
-            int count = 0;
-            long timeToInsert = 0;
-            long totalTimeToInsert = 0;
-            while ((line = br.readLine()) != null) {
-                if (line.contains(INSTANTANEOUS_INSERT_STRING)) {
-                    dGenId = ReportBuilderHelper.getInt(line, "DataGen[", "]");
-                    if (dGenId == genId) {
-                        count++;
-                        timeToInsert = ReportBuilderHelper.getLong(line, INSTANTANEOUS_INSERT_STRING, "in");
-                        totalTimeToInsert += timeToInsert;
-                        if (useTimeForX) {
-                            dataGenSb.append(totalTimeToInsert / 1000).append(",")
-                                    .append(INSTANTAEOUS_INSERT_COUNT / ((double) (timeToInsert) / 1000)).append("\n");
-                        } else {
-                            dataGenSb.append(count).append(",")
-                                    .append(INSTANTAEOUS_INSERT_COUNT / ((double) (timeToInsert) / 1000)).append("\n");
-                        }
-                    }
-                }
-                if (line.contains("Running")) {
-                    break;
-                }
-            }
-            System.out.println("GenId[" + genId + "] " + totalTimeToInsert + ", " + (totalTimeToInsert / (1000 * 60)));
-            return dataGenSb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    public long getDataGenStartTimeStamp() throws Exception {
-        openRunLog();
-        try {
-            String line;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("Running experiment: " + expName)) {
-                    while ((line = br.readLine()) != null) {
-                        //2015-10-27 17:18:28,242 INFO  [ParallelActionThread 6] transport.TransportImpl (TransportImpl.java:init(155)) - Client identity string: SSH-2.0-SSHJ_0_13_0
-                        if (line.contains("INFO  [ParallelActionThread")) {
-                            //format1 = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss aa");
-                            //format2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
-                            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
-                            return ReportBuilderHelper.getTimeStampAsLong(line, format);
-                        }
-                    }
-                }
-            }
-            return -1;
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    public String getIndexSize(String indexDirPath) throws Exception {
-        /*
-         * exmaple
-         * /mnt/data/sdb/youngsk2/asterix/storage/experiments/Tweets_idx_dhbtreeLocation/device_id_0:
-        total 211200
-        -rw-r--r-- 1 youngsk2 grad 191234048 Jun 29 00:11 2015-06-29-00-09-59-023_2015-06-28-23-51-56-984_b
-        -rw-r--r-- 1 youngsk2 grad   7864320 Jun 29 00:11 2015-06-29-00-09-59-023_2015-06-28-23-51-56-984_f
-        -rw-r--r-- 1 youngsk2 grad   4194304 Jun 29 00:10 2015-06-29-00-10-26-997_2015-06-29-00-10-26-997_b
-        -rw-r--r-- 1 youngsk2 grad    393216 Jun 29 00:10 2015-06-29-00-10-26-997_2015-06-29-00-10-26-997_f
-        -rw-r--r-- 1 youngsk2 grad   5898240 Jun 29 00:11 2015-06-29-00-10-59-791_2015-06-29-00-10-59-791_b
-        -rw-r--r-- 1 youngsk2 grad    393216 Jun 29 00:11 2015-06-29-00-10-59-791_2015-06-29-00-10-59-791_f
-        -rw-r--r-- 1 youngsk2 grad   5898240 Jun 29 00:11 2015-06-29-00-11-30-486_2015-06-29-00-11-30-486_b
-        -rw-r--r-- 1 youngsk2 grad    393216 Jun 29 00:11 2015-06-29-00-11-30-486_2015-06-29-00-11-30-486_f
-        
-         */
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            String[] tokens;
-            long diskSize = 0;
-            while ((line = br.readLine()) != null) {
-                if (line.contains(indexDirPath)) {
-                    br.readLine();//discard "total XXXX" line
-                    //read and sum file size
-                    while (!(line = br.readLine()).isEmpty()) {
-                        tokens = line.split("\\s+");;
-                        diskSize += Long.parseLong(tokens[4].trim());
-                    }
-                }
-                if (line.contains("Running")) {
-                    break;
-                }
-            }
-            rsb.append((double) diskSize / (1024 * 1024 * 1024));
-            return rsb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractStaticDataEvalReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractStaticDataEvalReportBuilder.java
deleted file mode 100644
index fdd1d92..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/AbstractStaticDataEvalReportBuilder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-public abstract class AbstractStaticDataEvalReportBuilder implements IStaticDataEvalReportBuilder {
-
-    protected final String expName;
-    protected final String runLogFilePath;
-    
-    protected AbstractStaticDataEvalReportBuilder(String expName, String runLogFilePath) {
-        this.expName = expName;
-        this.runLogFilePath = runLogFilePath;
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IDynamicDataEvalReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IDynamicDataEvalReportBuilder.java
deleted file mode 100644
index 4d5e511..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IDynamicDataEvalReportBuilder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.util.List;
-
-public interface IDynamicDataEvalReportBuilder {
-    public String getInstantaneousInsertPS(int genId, boolean useTimeForX) throws Exception;
-
-    public String getOverallInsertPS(int minutes) throws Exception;
-
-    public String getInstantaneousQueryPS() throws Exception;
-
-    public String getQueryPS(int minutes) throws Exception;
-
-    void getAllNodesAccumulatedInsertPS(int targetRound, List<Long> ipsList) throws Exception;
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IStaticDataEvalReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IStaticDataEvalReportBuilder.java
deleted file mode 100644
index 6c879f4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/IStaticDataEvalReportBuilder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-public interface IStaticDataEvalReportBuilder {
-    public String getSelectQueryTime();
-    public String getJoinQueryTime();
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/NCLogReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/NCLogReportBuilder.java
deleted file mode 100644
index 5da4463..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/NCLogReportBuilder.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-public class NCLogReportBuilder {
-
-    private String ncLogFilePath = "/Users/kisskys/workspace/asterix_experiment/run-log/measure-with-balloon/sie1-8dgen/log-1436511417368/SpatialIndexExperiment1ADhbtree/logs/a1_node1.log";
-    private BufferedReader br;
-    private String timeLine;
-    private String msgLine;
-
-    public NCLogReportBuilder(String filePath) {
-        if (filePath != null) {
-            this.ncLogFilePath = filePath;
-        }
-    }
-
-    public String getFlushMergeEventAsGanttChartFormat(long testBeginTimeStamp) throws Exception {
-        openNCLog();
-        StringBuilder sb = new StringBuilder();
-        long flushStartTimeStamp, flushFinishTimeStamp, mergeStartTimeStamp, mergeFinishTimeStamp;
-        String indexName;
-        SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss aa");
-        HashMap<String, Long> flushMap = new HashMap<String, Long>();
-        HashMap<String, Long> mergeMap = new HashMap<String, Long>();
-        long sTime, fTime;
-        try {
-            while ((timeLine = br.readLine()) != null) {
-                if ((msgLine = br.readLine()) == null) {
-                    break;
-                }
-                while (!msgLine.contains("INFO:")) {
-                    timeLine = msgLine;
-                    msgLine = br.readLine();
-                    if (msgLine == null) {
-                        break;
-                    }
-                }
-                if (msgLine == null) {
-                    break;
-                }
-
-                //flush start
-                if (msgLine.contains("Started a flush operation for index")) {
-                    flushStartTimeStamp = ReportBuilderHelper.getTimeStampAsLong(timeLine, format);
-
-                    //ignore flush op which happened before the data gen started.
-                    if (flushStartTimeStamp < testBeginTimeStamp) {
-                        continue;
-                    }
-
-                    indexName = ReportBuilderHelper.getString(msgLine, "experiments/Tweets_idx_", "/]");
-                    flushMap.put(indexName, flushStartTimeStamp);
-                }
-
-                //flush finish
-                if (msgLine.contains("Finished the flush operation for index")) {
-                    flushFinishTimeStamp = ReportBuilderHelper.getTimeStampAsLong(timeLine, format);
-
-                    //ignore flush op which happened before the data gen started.
-                    if (flushFinishTimeStamp < testBeginTimeStamp) {
-                        continue;
-                    }
-
-                    indexName = ReportBuilderHelper.getString(msgLine, "experiments/Tweets_idx_", "/]");
-
-                    if (flushMap.containsKey(indexName)) {
-                        flushStartTimeStamp = flushMap.remove(indexName);
-                        sTime = (flushStartTimeStamp - testBeginTimeStamp) / 1000;
-                        fTime = (flushFinishTimeStamp - testBeginTimeStamp) / 1000;
-                        if (fTime == sTime) {
-                            ++fTime;
-                        }
-                        //only for sie1
-                        //                        if (fTime > 1200) {
-                        //                            fTime = 1200;
-                        //                        }
-                        sb.append("f-" + getPrintName(indexName)).append("\t").append(sTime).append("\t").append(fTime)
-                                .append("\t").append(indexName.contains("Tweets") ? "flushPidx" : "flushSidx")
-                                .append("\n");
-                    }
-                }
-
-                //merge start
-                if (msgLine.contains("Started a merge operation for index")) {
-                    mergeStartTimeStamp = ReportBuilderHelper.getTimeStampAsLong(timeLine, format);
-
-                    //ignore flush op which happened before the data gen started.
-                    if (mergeStartTimeStamp < testBeginTimeStamp) {
-                        continue;
-                    }
-
-                    indexName = ReportBuilderHelper.getString(msgLine, "experiments/Tweets_idx_", "/]");
-                    mergeMap.put(indexName, mergeStartTimeStamp);
-                }
-
-                //merge finish
-                if (msgLine.contains("Finished the merge operation for index")) {
-                    mergeFinishTimeStamp = ReportBuilderHelper.getTimeStampAsLong(timeLine, format);
-
-                    //ignore flush op which happened before the data gen started.
-                    if (mergeFinishTimeStamp < testBeginTimeStamp) {
-                        continue;
-                    }
-
-                    indexName = ReportBuilderHelper.getString(msgLine, "experiments/Tweets_idx_", "/]");
-
-                    if (mergeMap.containsKey(indexName)) {
-                        mergeStartTimeStamp = mergeMap.remove(indexName);
-                        sTime = (mergeStartTimeStamp - testBeginTimeStamp) / 1000;
-                        fTime = (mergeFinishTimeStamp - testBeginTimeStamp) / 1000;
-                        if (fTime == sTime) {
-                            ++fTime;
-                        }
-                        //only for sie1
-                        //                        if (fTime > 1200) {
-                        //                            fTime = 1200;
-                        //                        }
-                        sb.append("m-" + getPrintName(indexName)).append("\t").append(sTime).append("\t").append(fTime)
-                                .append("\t").append(indexName.contains("Tweets") ? "mergePidx" : "mergeSidx")
-                                .append("\n");
-                    }
-                }
-            }
-
-            Iterator<Entry<String, Long>> mergeMapIter = mergeMap.entrySet().iterator();
-            Entry<String, Long> entry = null;
-            while (mergeMapIter.hasNext()) {
-                entry = mergeMapIter.next();
-                sb.append("m-" + getPrintName(entry.getKey())).append("\t")
-                        .append((entry.getValue() - testBeginTimeStamp) / 1000).append("\t").append(60 * 20)
-                        .append("\t").append(entry.getKey().contains("Tweets") ? "mergePidx" : "mergeSidx")
-                        .append("\n");
-            }
-
-            Iterator<Entry<String, Long>> flushMapIter = mergeMap.entrySet().iterator();
-            while (mergeMapIter.hasNext()) {
-                entry = flushMapIter.next();
-                sb.append("f-" + getPrintName(entry.getKey())).append("\t")
-                        .append((entry.getValue() - testBeginTimeStamp) / 1000).append("\t").append(60 * 20)
-                        .append("\t").append(entry.getKey().contains("Tweets") ? "flushPidx" : "flushSidx")
-                        .append("\n");
-            }
-
-            return sb.toString();
-        } finally {
-            closeNCLog();
-        }
-    }
-
-    private String getPrintName(String indexName) {
-        String name = null;
-        if (indexName.contains("Tweets")) {
-            if (indexName.contains("0")) {
-                name = "pidx0";
-            } else if (indexName.contains("1")) {
-                name = "pidx1";
-            } else if (indexName.contains("2")) {
-                name = "pidx2";
-            } else if (indexName.contains("3")) {
-                name = "pidx3";
-            }
-        } else if (indexName.contains("Location")) {
-            if (indexName.contains("0")) {
-                name = "sidx0"; //ReportBuilderHelper.getString(indexName, "Location") + "0";
-            } else if (indexName.contains("1")) {
-                name = "sidx1"; //ReportBuilderHelper.getString(indexName, "Location") + "1";
-            } else if (indexName.contains("2")) {
-                name = "sidx2"; //ReportBuilderHelper.getString(indexName, "Location") + "2";
-            } else if (indexName.contains("3")) {
-                name = "sidx3"; //ReportBuilderHelper.getString(indexName, "Location") + "2";
-            }
-        }
-        return name;
-    }
-
-    protected void openNCLog() throws IOException {
-        br = new BufferedReader(new FileReader(ncLogFilePath));
-    }
-
-    protected void closeNCLog() throws IOException {
-        if (br != null) {
-            br.close();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/OperatorProfilerReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/OperatorProfilerReportBuilder.java
deleted file mode 100644
index 24617bb..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/OperatorProfilerReportBuilder.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-public class OperatorProfilerReportBuilder {
-
-    private static final int INDEX_BUILD_OP_COUNT = 1;
-    private static final int PIDX_SCAN_OP_COUNT = 1;
-    private static final int WARM_UP_SELECT_QUERY_COUNT = 500;
-    private static final int SELECT_QUERY_COUNT = 5000;
-    private static final int JOIN_QUERY_COUNT = 200;
-    private static final int JOIN_RADIUS_TYPE_COUNT = 4;
-    private static final int SELECT_RADIUS_TYPE_COUNT = 5;
-    private static final int IDX_JOIN_RADIUS_SKIP = JOIN_RADIUS_TYPE_COUNT - 1;
-    private static final int IDX_SELECT_RADIUS_SKIP = SELECT_RADIUS_TYPE_COUNT - 1;
-    private static final int IDX_INITIAL_JOIN_SKIP = INDEX_BUILD_OP_COUNT + PIDX_SCAN_OP_COUNT
-            + WARM_UP_SELECT_QUERY_COUNT + SELECT_QUERY_COUNT;
-    private static final int IDX_INITIAL_SELECT_SKIP = INDEX_BUILD_OP_COUNT + PIDX_SCAN_OP_COUNT
-            + WARM_UP_SELECT_QUERY_COUNT;
-
-    private static final int HYRACK_JOB_ELAPSED_TIME_FIELD = 2;
-    private static final int OP_ELAPSED_TIME_FIELD = 4;
-    private static final int OP_TASK_ID_FIELD = 2;
-    private static final int OP_NAME_FIELD = 1;
-
-    private String executionTimeFilePath = null;
-    private BufferedReader brExecutionTime;
-    private String line;
-    private int lineNum;
-
-    public OperatorProfilerReportBuilder(String executionTimeFilePath) {
-        this.executionTimeFilePath = executionTimeFilePath;
-    }
-
-    public String getIdxNumber(boolean isJoin, int radiusIdx) throws Exception {
-        openExecutionTimeFile();
-
-        StringBuilder sb = new StringBuilder();
-        int initialSkip = (isJoin ? IDX_INITIAL_JOIN_SKIP : IDX_INITIAL_SELECT_SKIP) + radiusIdx;
-        int radiusSkip = isJoin ? IDX_JOIN_RADIUS_SKIP : IDX_SELECT_RADIUS_SKIP;
-        BufferedReader br = brExecutionTime;
-        int queryCount = isJoin ? JOIN_QUERY_COUNT / JOIN_RADIUS_TYPE_COUNT : SELECT_QUERY_COUNT
-                / SELECT_RADIUS_TYPE_COUNT;
-        lineNum = 0;
-        JobStat jobStat = new JobStat();
-
-        try {
-
-            //initial skip
-            int jobCount = 0;
-            while ((line = br.readLine()) != null) {
-                lineNum++;
-                if (line.contains("TOTAL_HYRACKS_JOB")) {
-                    jobCount++;
-                    if (jobCount > initialSkip) {
-                        break;
-                    }
-                }
-            }
-
-            //Reaching Here, line variable contains the first job to be counted
-            for (int j = 0; j < queryCount; j++) {
-
-                analyzeOperatorExecutionTime(jobStat, br);
-
-                //radius skip
-                jobCount = 0;
-                while ((line = br.readLine()) != null) {
-                    lineNum++;
-                    if (line.contains("TOTAL_HYRACKS_JOB")) {
-                        jobCount++;
-                        if (jobCount > radiusSkip) {
-                            break;
-                        }
-                    }
-                }
-            }
-
-            //System.out.println("lineNum: " + lineNum);
-            sb.append("TOTAL_HYRACKS_JOB," + (((double) jobStat.getHyracksJobTimeSum()) / jobStat.getHyracksJobCount())
-                    + "," + jobStat.getHyracksJobTimeSum() + "," + jobStat.getHyracksJobCount() + "\n");
-            sb.append(jobStat.getOperatorsElapsedTimeAsString());
-            return sb.toString();
-        } finally {
-            closeExecutionTimeFile();
-        }
-    }
-
-    private void analyzeOperatorExecutionTime(JobStat jobStat, BufferedReader br) throws IOException {
-        //the line argument contains TOTAL_HYRACKS_JOB string. eg.:
-        //2015-11-04 19:13:08,003   TOTAL_HYRACKS_JOB a1_node1_JID:3_26202768 TOTAL_HYRACKS_JOB1446660788003    1066    1.066   1066    1.066
-        String tokens[] = line.split("\t");
-
-        if (Long.parseLong(tokens[HYRACK_JOB_ELAPSED_TIME_FIELD]) > 10000) {
-            System.out.println("[" + lineNum + "] " + line);
-        }
-
-        jobStat.addHyracksJobTime(Long.parseLong(tokens[HYRACK_JOB_ELAPSED_TIME_FIELD]));
-
-        while ((line = br.readLine()) != null) {
-            lineNum++;
-
-            if (line.isEmpty()) {
-                break;
-            }
-
-            tokens = line.split("\t");
-            if (line.contains("DISTRIBUTE_RESULT")) {
-                jobStat.addDistributeResultTime(Long.parseLong(tokens[OP_ELAPSED_TIME_FIELD]));
-                continue;
-            }
-            if (line.contains("EMPTY_TUPLE_SOURCE")) {
-                continue;
-            }
-
-            if (line.contains("TXN_JOB_COMMIT")) {
-                continue;
-            }
-
-            jobStat.updateOperatorTime(tokens[OP_TASK_ID_FIELD], tokens[OP_NAME_FIELD],
-                    Long.parseLong(tokens[OP_ELAPSED_TIME_FIELD]));
-        }
-
-        jobStat.updateTaskForAvgWithSlowestTask();
-    }
-
-    protected void openExecutionTimeFile() throws IOException {
-        brExecutionTime = new BufferedReader(new FileReader(executionTimeFilePath));
-    }
-
-    protected void closeExecutionTimeFile() throws IOException {
-        if (brExecutionTime != null) {
-            brExecutionTime.close();
-        }
-    }
-
-    class JobStat {
-        private long hyracksJobElapsedTimeSum;
-        private int hyracksJobCount;
-        private long distributeResultTimeSum;
-        private Task taskForAvg;
-        private HashMap<String, Task> taskId2TaskMap;
-
-        public JobStat() {
-            hyracksJobElapsedTimeSum = 0;
-            hyracksJobCount = 0;
-            distributeResultTimeSum = 0;
-            taskForAvg = new Task("TaskForAvg");
-            taskId2TaskMap = new HashMap<String, Task>();
-        }
-
-        public void reset() {
-            hyracksJobElapsedTimeSum = 0;
-            hyracksJobCount = 0;
-            distributeResultTimeSum = 0;
-            taskForAvg.reset();;
-            taskId2TaskMap.clear();
-        }
-
-        public void addHyracksJobTime(long elapsedTime) {
-            hyracksJobElapsedTimeSum += elapsedTime;
-            hyracksJobCount++;
-        }
-
-        public void addDistributeResultTime(long elapsedTime) {
-            distributeResultTimeSum += elapsedTime;
-        }
-
-        public long getDistributeResultTime() {
-            return distributeResultTimeSum;
-        }
-
-        public long getHyracksJobTimeSum() {
-            return hyracksJobElapsedTimeSum;
-        }
-
-        public int getHyracksJobCount() {
-            return hyracksJobCount;
-        }
-
-        public void updateOperatorTime(String taskId, String operatorName, long elapsedTime) {
-            Task task = taskId2TaskMap.get(taskId);
-            if (task == null) {
-                task = new Task(taskId);
-                taskId2TaskMap.put(new String(taskId), task);
-            }
-            task.updateOperatorTime(operatorName, elapsedTime);
-        }
-
-        public void updateTaskForAvgWithSlowestTask() {
-            Iterator<Entry<String, Task>> taskIter = taskId2TaskMap.entrySet().iterator();
-            Task slowestTask = null;
-            Task curTask;
-
-            //get the slowest task
-            while (taskIter.hasNext()) {
-                curTask = taskIter.next().getValue();
-                if (slowestTask == null) {
-                    slowestTask = curTask;
-                } else {
-                    if (slowestTask.getElapsedTime() < curTask.getElapsedTime()) {
-                        slowestTask = curTask;
-                    }
-                }
-            }
-
-            //update the TaskForAvg with the slowest one
-            HashMap<String, SumCount> operator2SumCountMap = slowestTask.getOperator2SumCountMap();
-            Iterator<Entry<String, SumCount>> operatorIter = operator2SumCountMap.entrySet().iterator();
-            while (operatorIter.hasNext()) {
-                Entry<String, SumCount> entry = operatorIter.next();
-                SumCount sc = entry.getValue();
-                taskForAvg.updateOperatorTime(entry.getKey(), sc.sum);
-            }
-            taskId2TaskMap.clear();
-        }
-
-        public String getOperatorsElapsedTimeAsString() {
-            return "SUM_OF_OPERATORS," + (((double) taskForAvg.getElapsedTime()) / hyracksJobCount) + ","
-                    + taskForAvg.getElapsedTime() + "," + hyracksJobCount + "\n"
-                    + taskForAvg.getOperatorsElapsedTimeAsString() + "DISTRIBUTE_RESULT,"
-                    + (((double) distributeResultTimeSum) / hyracksJobCount) + "," + distributeResultTimeSum + ","
-                    + hyracksJobCount + "\n";
-        }
-    }
-
-    class Task {
-        private String taskId;
-        private long elapsedTime;
-        private HashMap<String, SumCount> operator2SumCountMap;
-
-        public Task(String taskId) {
-            this.taskId = new String(taskId);
-            elapsedTime = 0;
-            operator2SumCountMap = new HashMap<String, SumCount>();
-        }
-
-        @Override
-        public int hashCode() {
-            return taskId.hashCode();
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o == this) {
-                return true;
-            }
-            if (!(o instanceof Task)) {
-                return false;
-            }
-            return ((Task) o).taskId == taskId;
-        }
-
-        public long getElapsedTime() {
-            return elapsedTime;
-        }
-
-        public void updateOperatorTime(String operatorName, long elapsedTime) {
-            SumCount sc = operator2SumCountMap.get(operatorName);
-            if (sc == null) {
-                sc = new SumCount();
-                sc.sum = 0;
-                sc.count = 0;
-                operator2SumCountMap.put(new String(operatorName), sc);
-            }
-            sc.sum += elapsedTime;
-            sc.count++;
-            this.elapsedTime += elapsedTime;
-        }
-
-        public void reset() {
-            elapsedTime = 0;
-            operator2SumCountMap.clear();
-        }
-
-        public String getOperatorsElapsedTimeAsString() {
-            StringBuilder sb = new StringBuilder();
-            Iterator<Entry<String, SumCount>> iter = operator2SumCountMap.entrySet().iterator();
-            while (iter.hasNext()) {
-                Entry<String, SumCount> entry = iter.next();
-                SumCount sc = entry.getValue();
-                sb.append(entry.getKey()).append(",").append(((double) sc.sum) / sc.count).append(",").append(sc.sum)
-                        .append(",").append(sc.count).append("\n");
-            }
-            return sb.toString();
-        }
-
-        public HashMap<String, SumCount> getOperator2SumCountMap() {
-            return operator2SumCountMap;
-        }
-    }
-
-    class SumCount {
-        public long sum;
-        public int count;
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ProfilerReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ProfilerReportBuilder.java
deleted file mode 100644
index d5eb539..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ProfilerReportBuilder.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class ProfilerReportBuilder {
-
-    private static final int INDEX_BUILD_OP_COUNT = 1;
-    private static final int PIDX_SCAN_OP_COUNT = 1;
-    private static final int WARM_UP_SELECT_QUERY_COUNT = 500;
-    private static final int SELECT_QUERY_COUNT = 5000;
-    private static final int JOIN_QUERY_COUNT = 200;
-    private static final int PARTITION_COUNT = 4;
-
-    private static final int SELECT_QUERY_INVOLVED_INDEX_COUNT = 2;
-    private static final int JOIN_QUERY_INVOLVED_INDEX_COUNT = 3;
-    private static final int JOIN_RADIUS_TYPE_COUNT = 4;
-    private static final int SELECT_RADIUS_TYPE_COUNT = 5;
-    private static final int IDX_JOIN_RADIUS_SKIP = JOIN_RADIUS_TYPE_COUNT * JOIN_QUERY_INVOLVED_INDEX_COUNT
-            * PARTITION_COUNT - PARTITION_COUNT;
-    private static final int IDX_SELECT_RADIUS_SKIP = SELECT_RADIUS_TYPE_COUNT * SELECT_QUERY_INVOLVED_INDEX_COUNT
-            * PARTITION_COUNT - PARTITION_COUNT;
-    private static final int IDX_INITIAL_JOIN_SKIP = (INDEX_BUILD_OP_COUNT + PIDX_SCAN_OP_COUNT + ((WARM_UP_SELECT_QUERY_COUNT + SELECT_QUERY_COUNT) * SELECT_QUERY_INVOLVED_INDEX_COUNT))
-            * PARTITION_COUNT;
-    private static final int IDX_INITIAL_SELECT_SKIP = (INDEX_BUILD_OP_COUNT + PIDX_SCAN_OP_COUNT + (WARM_UP_SELECT_QUERY_COUNT * SELECT_QUERY_INVOLVED_INDEX_COUNT))
-            * PARTITION_COUNT;
-    private static final int FP_JOIN_RADIUS_SKIP = JOIN_RADIUS_TYPE_COUNT * PARTITION_COUNT - PARTITION_COUNT;
-    private static final int FP_SELECT_RADIUS_SKIP = SELECT_RADIUS_TYPE_COUNT * PARTITION_COUNT - PARTITION_COUNT;
-    private static final int FP_INITIAL_JOIN_SKIP = (PIDX_SCAN_OP_COUNT + WARM_UP_SELECT_QUERY_COUNT + SELECT_QUERY_COUNT)
-            * PARTITION_COUNT;
-    private static final int FP_INITIAL_SELECT_SKIP = (PIDX_SCAN_OP_COUNT + WARM_UP_SELECT_QUERY_COUNT)
-            * PARTITION_COUNT;
-
-    private String indexSearchTimeFilePath = null;
-    private String falsePositiveFilePath = null;
-    private String cacheMissFilePath = null;
-    private BufferedReader brIndexSearchTime;
-    private BufferedReader brFalsePositive;
-    private BufferedReader brCacheMiss;
-    private String line;
-
-    public ProfilerReportBuilder(String indexSearchTimeFilePath, String falsePositiveFilePath, String cacheMissFilePath) {
-        this.indexSearchTimeFilePath = indexSearchTimeFilePath;
-        this.falsePositiveFilePath = falsePositiveFilePath;
-        this.cacheMissFilePath = cacheMissFilePath;
-    }
-
-    public String getIdxNumber(boolean getSearchTime, boolean isJoin, int radiusIdx, int indexIdx) throws Exception {
-        if (getSearchTime) {
-            openIndexSearchTimeFile();
-        } else {
-            openCacheMissFile();
-        }
-
-        StringBuilder sb = new StringBuilder();
-        int involvedIndexCount = isJoin ? JOIN_QUERY_INVOLVED_INDEX_COUNT : SELECT_QUERY_INVOLVED_INDEX_COUNT;
-        int initialSkip = (isJoin ? IDX_INITIAL_JOIN_SKIP : IDX_INITIAL_SELECT_SKIP) + radiusIdx * involvedIndexCount
-                * PARTITION_COUNT + indexIdx * PARTITION_COUNT;
-        int radiusSkip = isJoin ? IDX_JOIN_RADIUS_SKIP : IDX_SELECT_RADIUS_SKIP;
-        long measuredValue = 0;
-        BufferedReader br = getSearchTime ? brIndexSearchTime : brCacheMiss;
-        int lineNum = 0;
-        int queryCount = isJoin ? JOIN_QUERY_COUNT / JOIN_RADIUS_TYPE_COUNT : SELECT_QUERY_COUNT
-                / SELECT_RADIUS_TYPE_COUNT;
-        try {
-
-            //initial skip
-            for (int i = 0; i < initialSkip; i++) {
-                br.readLine();
-                ++lineNum;
-            }
-
-            for (int j = 0; j < queryCount; j++) {
-                //get target index numbers
-                for (int i = 0; i < PARTITION_COUNT; i++) {
-                    line = br.readLine();
-                    measuredValue += Long.parseLong(line);
-                    ++lineNum;
-                }
-
-                //radius skip
-                for (int i = 0; i < radiusSkip; i++) {
-                    br.readLine();
-                    ++lineNum;
-                }
-            }
-
-            //System.out.println("lineNum: " + lineNum);
-            sb.append((double) measuredValue / (PARTITION_COUNT * queryCount));
-            return sb.toString();
-        } finally {
-            if (getSearchTime) {
-                closeIndexSearchTimeFile();
-            } else {
-                closeCacheMissFile();
-            }
-        }
-    }
-
-    public String getFalsePositives(boolean isJoin, int radiusIdx) throws Exception {
-        openFalsePositiveFile();
-
-        StringBuilder sb = new StringBuilder();
-        int initialSkip = (isJoin ? FP_INITIAL_JOIN_SKIP : FP_INITIAL_SELECT_SKIP) + radiusIdx * PARTITION_COUNT;
-        int radiusSkip = isJoin ? FP_JOIN_RADIUS_SKIP : FP_SELECT_RADIUS_SKIP;
-        long falsePositives = 0;
-        BufferedReader br = brFalsePositive;
-        int lineNum = 0;
-        int queryCount = isJoin ? JOIN_QUERY_COUNT / JOIN_RADIUS_TYPE_COUNT : SELECT_QUERY_COUNT
-                / SELECT_RADIUS_TYPE_COUNT;
-        try {
-
-            //initial skip
-            for (int i = 0; i < initialSkip; i++) {
-                br.readLine();
-                ++lineNum;
-            }
-
-            for (int j = 0; j < queryCount; j++) {
-                //get target index numbers
-                for (int i = 0; i < PARTITION_COUNT; i++) {
-                    line = br.readLine();
-                    falsePositives += Long.parseLong(line);
-                    ++lineNum;
-                }
-
-                //radius skip
-                for (int i = 0; i < radiusSkip; i++) {
-                    br.readLine();
-                    ++lineNum;
-                }
-            }
-
-            //System.out.println("lineNum: " + lineNum);
-            sb.append((double) falsePositives / (PARTITION_COUNT * queryCount));
-            return sb.toString();
-        } finally {
-            closeFalsePositiveFile();
-        }
-    }
-
-    protected void openIndexSearchTimeFile() throws IOException {
-        brIndexSearchTime = new BufferedReader(new FileReader(indexSearchTimeFilePath));
-    }
-
-    protected void closeIndexSearchTimeFile() throws IOException {
-        if (brIndexSearchTime != null) {
-            brIndexSearchTime.close();
-        }
-    }
-
-    protected void openFalsePositiveFile() throws IOException {
-        brFalsePositive = new BufferedReader(new FileReader(falsePositiveFilePath));
-    }
-
-    protected void closeFalsePositiveFile() throws IOException {
-        if (brFalsePositive != null) {
-            brFalsePositive.close();
-        }
-    }
-
-    protected void openCacheMissFile() throws IOException {
-        brCacheMiss = new BufferedReader(new FileReader(cacheMissFilePath));
-    }
-
-    protected void closeCacheMissFile() throws IOException {
-        if (brCacheMiss != null) {
-            brCacheMiss.close();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderHelper.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderHelper.java
deleted file mode 100644
index 93ae819..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderHelper.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public class ReportBuilderHelper {
-
-    public static void main(String[] args) throws Exception {
-        String line = "INFO: DataGen[13][During ingestion only][TimeToInsert100000] 10651 in milliseconds";
-        System.out.println(getEndIndexOf("DataGen[1][During ingestion only][TimeToInsert100000] 10651 in milliseconds",
-                "DataGen["));
-        System.out.println(getLong(line, "[TimeToInsert100000]", "in"));
-        System.out.println(getLong(line, "DataGen[", "]"));
-        //SIE1AReportBuilder rb = new SIE1AReportBuilder("/Users/kisskys/workspace/asterix_experiment/run-log/run-log-backup/log-1435560604069/run.log");
-        //System.out.println(rb.getInstantaneousInsertPS());
-    }
-
-    public static int getEndIndexOf(String target, String pattern) {
-        //get the end index of the pattern string in target string.
-        int index = target.indexOf(pattern);
-        if (index != -1) {
-            return target.indexOf(pattern) + pattern.length();
-        }
-        return -1;
-    }
-
-    public static long getLong(String line, String beginPattern, String endPattern) {
-        int idBeginIdx = getEndIndexOf(line, beginPattern);
-        int idEndIdx = line.indexOf(endPattern, idBeginIdx);
-        return Long.parseLong(line.substring(idBeginIdx, idEndIdx).trim());
-    }
-
-    public static int getInt(String line, String beginPattern, String endPattern) {
-        int idBeginIdx = getEndIndexOf(line, beginPattern);
-        int idEndIdx = line.indexOf(endPattern, idBeginIdx);
-        return Integer.parseInt(line.substring(idBeginIdx, idEndIdx).trim());
-    }
-
-    public static double getDouble(String line, String beginPattern, String endPattern) {
-        int idBeginIdx = getEndIndexOf(line, beginPattern);
-        int idEndIdx = line.indexOf(endPattern, idBeginIdx);
-        return Double.parseDouble(line.substring(idBeginIdx, idEndIdx).trim());
-    }
-
-    public static String getString(String line, String beginPattern, String endPattern) {
-        int idBeginIdx = getEndIndexOf(line, beginPattern);
-        int idEndIdx = line.indexOf(endPattern, idBeginIdx);
-        return line.substring(idBeginIdx, idEndIdx).trim();
-    }
-    
-    public static String getString(String line, String endPattern) {
-        int idEndIdx = line.indexOf(endPattern, 0);
-        return line.substring(0, idEndIdx).trim();
-    }
-
-    public static long getTimeStampAsLong(String line, SimpleDateFormat format) throws ParseException {
-        //Jul 09, 2015 11:58:08
-        //String line = "Jul 09, 2015 11:58:09 PM org.apache.hyracks.storage.am.lsm.common.impls.LSMHarness flush";
-        //DateFormat format;
-        //format = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss");
-        Date parseDate = format.parse(line);
-        return parseDate.getTime();
-    }
-    
-    protected static FileOutputStream openOutputFile(String filepath) throws IOException {
-        File file = new File(filepath);
-        if (file.exists()) {
-            //throw new IOException(filepath + "already exists");
-            file.delete();
-        }
-        file.createNewFile();
-        return new FileOutputStream(file);
-    }
-
-    protected static void closeOutputFile(FileOutputStream fos) throws IOException {
-        fos.flush();
-        fos.close();
-        fos = null;
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderRunner.java
deleted file mode 100644
index eba8f07..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/ReportBuilderRunner.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-public class ReportBuilderRunner {
-    public static final boolean REPORT_SIE1 = false;
-    public static final boolean REPORT_SIE2 = false;
-    public static final boolean REPORT_SIE3 = false;
-    public static final boolean REPORT_SIE4 = false;
-    public static final boolean REPORT_SIE5 = true;
-    public static final boolean REPORT_SIE3_PROFILE = false;
-
-    public static void main(String[] args) throws Exception {
-
-        if (REPORT_SIE1) {
-            SIE1ReportBuilderRunner sie1 = new SIE1ReportBuilderRunner();
-            sie1.generateSIE1IPS();
-            //        sie1.generateInstantaneousInsertPS();
-            sie1.generateIndexSize();
-            sie1.generateGanttInstantaneousInsertPS();
-            sie1.generateAccumulatedInsertPS();
-        }
-
-        if (REPORT_SIE2) {
-            SIE2ReportBuilderRunner sie2 = new SIE2ReportBuilderRunner();
-            sie2.generateOverallInsertPS();
-            sie2.generateAccumulatedInsertPS();
-            sie2.generateQueryPS();
-            sie2.generateAverageQueryResultCount();
-            sie2.generateAverageQueryResponseTime();
-            sie2.generateInstantaneousInsertPS();
-            sie2.generateGanttInstantaneousInsertPS();
-            sie2.generateSelectQueryResponseTime();
-            sie2.generateSelectQueryResultCount();
-        }
-
-        if (REPORT_SIE3) {
-            SIE3ReportBuilderRunner sie3 = new SIE3ReportBuilderRunner();
-            sie3.generateIndexCreationTime();
-            sie3.generateIndexSize();
-            sie3.generateSelectQueryResponseTime();
-            sie3.generateJoinQueryResponseTime();
-            sie3.generateSelectQueryResultCount();
-            sie3.generateJoinQueryResultCount();
-
-            //            sie3.generateSelectQueryProfiledSidxSearchTime();
-            //            sie3.generateSelectQueryProfiledPidxSearchTime();
-            //            sie3.generateJoinQueryProfiledSidxSearchTime();
-            //            sie3.generateJoinQueryProfiledPidxSearchTime();
-            //            sie3.generateJoinQueryProfiledSeedPidxSearchTime();
-            //            sie3.generateSelectQueryProfiledSidxCacheMiss();
-            //            sie3.generateSelectQueryProfiledPidxCacheMiss();
-            //            sie3.generateJoinQueryProfiledSidxCacheMiss();
-            //            sie3.generateJoinQueryProfiledPidxCacheMiss();
-            //            sie3.generateJoinQueryProfiledSeedPidxCacheMiss();
-            //            sie3.generateSelectQueryProfiledFalsePositive();
-            //            sie3.generateJoinQueryProfiledFalsePositive();
-        }
-
-        if (REPORT_SIE4) {
-            SIE4ReportBuilderRunner sie4 = new SIE4ReportBuilderRunner();
-            sie4.generateIndexCreationTime();
-            sie4.generateIndexSize();
-            sie4.generateSelectQueryResponseTime();
-            sie4.generateJoinQueryResponseTime();
-            sie4.generateSelectQueryResultCount();
-            sie4.generateJoinQueryResultCount();
-        }
-
-        if (REPORT_SIE5) {
-            SIE5ReportBuilderRunner sie5 = new SIE5ReportBuilderRunner();
-            sie5.generateOverallInsertPS();
-            sie5.generateAccumulatedInsertPS();
-            sie5.generateQueryPS();
-            sie5.generateAverageQueryResultCount();
-            sie5.generateAverageQueryResponseTime();
-            sie5.generateInstantaneousInsertPS();
-            sie5.generateGanttInstantaneousInsertPS();
-            sie5.generateSelectQueryResponseTime();
-            sie5.generateSelectQueryResultCount();
-        }
-
-        if (REPORT_SIE3_PROFILE) {
-            String executionTimeFilePath[] = new String[5];
-            executionTimeFilePath[0] = "/Users/kisskys/workspace/asterix_master/resultLog/Mem3g-Disk4g-part4-Lsev-Jvm5g-Lock6g/profile-exp3/SpatialIndexExperiment3Dhbtree/logs/executionTime-130.149.249.52.txt";
-            executionTimeFilePath[1] = "/Users/kisskys/workspace/asterix_master/resultLog/Mem3g-Disk4g-part4-Lsev-Jvm5g-Lock6g/profile-exp3/SpatialIndexExperiment3Dhvbtree/logs/executionTime-130.149.249.52.txt";
-            executionTimeFilePath[2] = "/Users/kisskys/workspace/asterix_master/resultLog/Mem3g-Disk4g-part4-Lsev-Jvm5g-Lock6g/profile-exp3/SpatialIndexExperiment3Rtree/logs/executionTime-130.149.249.52.txt";
-            executionTimeFilePath[3] = "/Users/kisskys/workspace/asterix_master/resultLog/Mem3g-Disk4g-part4-Lsev-Jvm5g-Lock6g/profile-exp3/SpatialIndexExperiment3Shbtree/logs/executionTime-130.149.249.52.txt";
-            executionTimeFilePath[4] = "/Users/kisskys/workspace/asterix_master/resultLog/Mem3g-Disk4g-part4-Lsev-Jvm5g-Lock6g/profile-exp3/SpatialIndexExperiment3Sif/logs/executionTime-130.149.249.52.txt";
-
-            for (int i = 0; i < 5; i++) {
-                String filePath = executionTimeFilePath[i];
-                OperatorProfilerReportBuilder oprb = new OperatorProfilerReportBuilder(filePath);
-                System.out.println("--------  " + i + " ----------\n");
-                System.out.println(oprb.getIdxNumber(false, 0));
-                System.out.println(oprb.getIdxNumber(false, 1));
-                System.out.println(oprb.getIdxNumber(false, 2));
-                System.out.println(oprb.getIdxNumber(false, 3));
-                System.out.println(oprb.getIdxNumber(false, 4));
-                System.out.println(oprb.getIdxNumber(true, 0));
-                System.out.println(oprb.getIdxNumber(true, 1));
-                System.out.println(oprb.getIdxNumber(true, 2));
-                System.out.println(oprb.getIdxNumber(true, 3));
-            }
-
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilder.java
deleted file mode 100644
index 2e04615..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilder.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-public class SIE1ReportBuilder extends AbstractDynamicDataEvalReportBuilder {
-    public SIE1ReportBuilder(String expHomePath, String expName, String runLogFileName) {
-        super(expHomePath, expName, runLogFileName, false);
-    }
-
-    @Override
-    public String getOverallInsertPS(int minutes) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("int64")) {
-                    line = br.readLine();
-                    rsb.append(Long.parseLong(line) / (minutes * 60));
-                    break;
-                }
-            }
-
-            return rsb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    @Override
-    public String getInstantaneousQueryPS() throws Exception {
-        return null;
-    }
-
-    @Override
-    public String getQueryPS(int minutes) throws Exception {
-        return null;
-        //        renewStringBuilder();
-        //        openRunLog();
-        //        try {
-        //
-        //            return getResult();
-        //        } finally {
-        //            closeRunLog();
-        //        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilderRunner.java
deleted file mode 100644
index bab69a0..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE1ReportBuilderRunner.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.FileOutputStream;
-import java.util.ArrayList;
-
-public class SIE1ReportBuilderRunner {
-    String expHomePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/exp1/";
-    String runLogFileName = "run-exp1.log";
-    String outputFilePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/result-report/";
-
-    SIE1ReportBuilder sie1ADhbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1ADhbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1ADhvbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1ADhvbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1ARtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1ARtree", runLogFileName);
-    SIE1ReportBuilder sie1AShbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1AShbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1ASif = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1ASif", runLogFileName);
-
-    SIE1ReportBuilder sie1BDhbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1BDhbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1BDhvbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1BDhvbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1BRtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1BRtree", runLogFileName);
-    SIE1ReportBuilder sie1BShbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1BShbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1BSif = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1BSif", runLogFileName);
-
-    SIE1ReportBuilder sie1CDhbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1CDhbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1CDhvbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1CDhvbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1CRtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1CRtree", runLogFileName);
-    SIE1ReportBuilder sie1CShbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1CShbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1CSif = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1CSif", runLogFileName);
-
-    SIE1ReportBuilder sie1DDhbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1DDhbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1DDhvbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1DDhvbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1DRtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1DRtree", runLogFileName);
-    SIE1ReportBuilder sie1DShbtree = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1DShbtree",
-            runLogFileName);
-    SIE1ReportBuilder sie1DSif = new SIE1ReportBuilder(expHomePath, "SpatialIndexExperiment1DSif", runLogFileName);
-
-    StringBuilder sb = new StringBuilder();
-
-    /**
-     * generate sie1_ips.txt
-     */
-    public void generateSIE1IPS() throws Exception {
-        int minutes = 60;
-        sb.setLength(0);
-        sb.append("# sie1 ips(inserts per second) report\n");
-        sb.append("# number of nodes, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("1,").append(sie1ADhbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1ADhvbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1ARtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1AShbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1ASif.getOverallInsertPS(minutes)).append("\n");
-
-        sb.append("2,").append(sie1BDhbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1BDhvbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1BRtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1BShbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1BSif.getOverallInsertPS(minutes)).append("\n");
-
-        sb.append("4,").append(sie1CDhbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1CDhvbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1CRtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1CShbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1CSif.getOverallInsertPS(minutes)).append("\n");
-
-        sb.append("8,").append(sie1DDhbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1DDhvbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1DRtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1DShbtree.getOverallInsertPS(minutes)).append(",")
-                .append(sie1DSif.getOverallInsertPS(minutes)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_ips.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    /**
-     * generate sie1_accumulated_insert_ps.txt
-     */
-    public void generateAccumulatedInsertPS() throws Exception {
-        int targetRound = 721; //(3600 seconds / 5seconds) + 1
-        int roundInterval = 5;
-
-        ArrayList<Long> ipsListDhbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListDhvbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListRtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListShbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListSif = new ArrayList<Long>();
-        sie1DDhbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhbtree);
-        sie1DDhvbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhvbtree);
-        sie1DRtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListRtree);
-        sie1DShbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListShbtree);
-        sie1DSif.getAllNodesAccumulatedInsertPS(targetRound, ipsListSif);
-
-        sb.setLength(0);
-        sb.append("# sie1 accumulated inserts per second report\n");
-        sb.append("# time, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-
-        for (int i = 0; i < targetRound; i++) {
-            sb.append("" + (i * roundInterval) + "," + ipsListDhbtree.get(i) + "," + ipsListDhvbtree.get(i) + ","
-                    + ipsListRtree.get(i) + "," + ipsListShbtree.get(i) + "," + ipsListSif.get(i) + "\n");
-        }
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_accumulated_insert_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        ipsListDhbtree.clear();
-        ipsListDhvbtree.clear();
-        ipsListRtree.clear();
-        ipsListShbtree.clear();
-        ipsListSif.clear();
-    }
-
-    public void generateInstantaneousInsertPS() throws Exception {
-        int nodeCount = 8;
-        for (int i = 0; i < nodeCount; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie1DDhbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_8nodes_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < nodeCount; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie1DDhvbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_8nodes_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < nodeCount; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie1DRtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_8nodes_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < nodeCount; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie1DShbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_8nodes_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < nodeCount; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie1DSif.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_8nodes_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-    }
-
-    public void generateIndexSize() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie1 index size report\n");
-
-        sb.append("# number of nodes, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("1,").append(sie1ADhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append(",")
-                .append(sie1ADhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append(",")
-                .append(sie1ARtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append(",")
-                .append(sie1AShbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append(",")
-                .append(sie1ASif.getIndexSize("Tweets_idx_sifLocation/device_id")).append(",")
-                .append(sie1ASif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-        sb.append("2,").append(sie1BDhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append(",")
-                .append(sie1BDhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append(",")
-                .append(sie1BRtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append(",")
-                .append(sie1BShbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append(",")
-                .append(sie1BSif.getIndexSize("Tweets_idx_sifLocation/device_id")).append(",")
-                .append(sie1BSif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-        sb.append("4,").append(sie1CDhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append(",")
-                .append(sie1CDhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append(",")
-                .append(sie1CRtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append(",")
-                .append(sie1CShbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append(",")
-                .append(sie1CSif.getIndexSize("Tweets_idx_sifLocation/device_id")).append(",")
-                .append(sie1CSif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-        sb.append("8,").append(sie1DDhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append(",")
-                .append(sie1DDhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append(",")
-                .append(sie1DRtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append(",")
-                .append(sie1DShbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append(",")
-                .append(sie1DSif.getIndexSize("Tweets_idx_sifLocation/device_id")).append(",")
-                .append(sie1DSif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_index_size.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateGanttInstantaneousInsertPS() throws Exception {
-
-        SIE1ReportBuilder dhbtree = sie1DDhbtree;
-        SIE1ReportBuilder dhvbtree = sie1DDhvbtree;
-        SIE1ReportBuilder rtree = sie1DRtree;
-        SIE1ReportBuilder shbtree = sie1DShbtree;
-        SIE1ReportBuilder sif = sie1DSif;
-        String sie1Type = "D";
-        String logDirPrefix = "";
-
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 1node(1 dataGen) instantaneous inserts per second report\n");
-            sb.append(dhbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_gantt_1node_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 1node(1 dataGen) instantaneous inserts per second report\n");
-            sb.append(dhvbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_gantt_1node_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 1node(1 dataGen) instantaneous inserts per second report\n");
-            sb.append(rtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_gantt_1node_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 1node(1 dataGen) instantaneous inserts per second report\n");
-            sb.append(shbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_gantt_1node_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie1 1node(1 dataGen) instantaneous inserts per second report\n");
-            sb.append(sif.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie1_gantt_1node_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-
-        long dataGenStartTime = dhbtree.getDataGenStartTimeStamp();
-        NCLogReportBuilder ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment1"
-                + sie1Type + "Dhbtree/" + logDirPrefix + "logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie1_gantt_1node_flush_merge_dhbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = dhvbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment1" + sie1Type + "Dhvbtree/"
-                + logDirPrefix + "logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_gantt_1node_flush_merge_dhvbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = rtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment1" + sie1Type + "Rtree/"
-                + logDirPrefix + "logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_gantt_1node_flush_merge_rtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = shbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment1" + sie1Type + "Shbtree/"
-                + logDirPrefix + "logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_gantt_1node_flush_merge_shbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sif.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment1" + sie1Type + "Sif/"
-                + logDirPrefix + "logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie1_gantt_1node_flush_merge_sif.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilder.java
deleted file mode 100644
index 52034a4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilder.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class SIE2ReportBuilder extends AbstractDynamicDataEvalReportBuilder {
-    private static final int SELECT_QUERY_RADIUS_COUNT = 5;
-    private static final int INITIAL_SELECT_QUERY_COUNT_TO_IGNORE = 0;
-    private static final int MAX_SELECT_QUERY_COUNT_TO_CONSIDER = Integer.MAX_VALUE; //5000 + INITIAL_SELECT_QUERY_COUNT_TO_CONSIDER;
-    private static final int QUERY_GEN_COUNT = 8;
-    private static final String[] QUERY_GEN_IPS = { "130.149.249.61", "130.149.249.62", "130.149.249.63",
-            "130.149.249.64", "130.149.249.65", "130.149.249.66", "130.149.249.67", "130.149.249.68" };
-    private BufferedReader[] queryLogFileBrs;
-
-    public SIE2ReportBuilder(String expHomePath, String expName, String runLogFileName) {
-        super(expHomePath, expName, runLogFileName, false);
-        queryLogFileBrs = new BufferedReader[QUERY_GEN_COUNT];
-    }
-
-    @Override
-    public String getOverallInsertPS(int minutes) throws Exception {
-        return null;
-    }
-
-    public String get20minInsertPS(int minutes) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            long insertCount = 0;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("[During ingestion + queries][InsertCount]")) {
-                    insertCount += ReportBuilderHelper.getLong(line, "=", "in");
-                }
-                if (line.contains("Running")) {
-                    break;
-                }
-            }
-            rsb.append(insertCount / (minutes * 60));
-            return rsb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    public double getFirstXminInsertPS(int minutes, int genId, int unitMinutes) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return 0;
-            }
-
-            String line;
-            int dGenId;
-            int count = 0;
-            long timeToInsert = 0;
-            long totalTimeToInsert = 0;
-            boolean haveResult = false;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("[During ingestion only][TimeToInsert100000]")) {
-                    dGenId = ReportBuilderHelper.getInt(line, "DataGen[", "]");
-                    if (dGenId == genId) {
-                        count++;
-                        timeToInsert = ReportBuilderHelper.getLong(line, INSTANTANEOUS_INSERT_STRING, "in");
-                        totalTimeToInsert += timeToInsert;
-                        if (totalTimeToInsert > minutes * 60000) {
-                            haveResult = true;
-                            break;
-                        }
-                    }
-                }
-                if (line.contains("Running")) {
-                    break;
-                }
-            }
-            if (haveResult || totalTimeToInsert > (minutes * 60000 - unitMinutes * 60000)) {
-                return (count * INSTANTAEOUS_INSERT_COUNT) / ((double) totalTimeToInsert / 1000);
-            } else {
-                return 0;
-                //return  ((count * INSTANTAEOUS_INSERT_COUNT) / ((double)totalTimeToInsert/1000)) * -1;
-            }
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    @Override
-    public String getInstantaneousQueryPS() throws Exception {
-        return null;
-    }
-
-    @Override
-    public String getQueryPS(int minutes) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            long queryCount = 0;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("[QueryCount]")) {
-                    queryCount += ReportBuilderHelper.getLong(line, "[QueryCount]", "in");
-                }
-                if (line.contains("Running")) {
-                    break;
-                }
-            }
-            rsb.append(queryCount / (float) (minutes * 60));
-            return rsb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    public String getAverageQueryResultCount() throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-            String line;
-            long resultCount = 0;
-            long queryCount = 0;
-            for (BufferedReader queryLogFileBr : queryLogFileBrs) {
-                while ((line = queryLogFileBr.readLine()) != null) {
-                    if (line.contains("int64")) {
-                        line = queryLogFileBr.readLine();
-                        resultCount += Long.parseLong(line);
-                        ++queryCount;
-                    }
-                }
-            }
-            rsb.append(resultCount / queryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getAverageQueryResponseTime() throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-            String line;
-            long responseTime = 0;
-            long queryCount = 0;
-            for (BufferedReader queryLogFileBr : queryLogFileBrs) {
-                while ((line = queryLogFileBr.readLine()) != null) {
-                    if (line.contains("Elapsed time = ")) {
-                        responseTime += ReportBuilderHelper.getLong(line, "=", "for");
-                        ++queryCount;
-                    }
-                }
-            }
-            rsb.append(responseTime / queryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getSelectQueryResponseTime(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-            String line;
-            long queryResponseTime = 0;
-            int targetRadiusSelectQueryCount = 0;
-            for (BufferedReader queryLogFileBr : queryLogFileBrs) {
-                int selectQueryCount = 0;
-                while ((line = queryLogFileBr.readLine()) != null) {
-                    if (line.contains("Elapsed time =") && selectQueryCount < MAX_SELECT_QUERY_COUNT_TO_CONSIDER) {
-                        if (selectQueryCount % SELECT_QUERY_RADIUS_COUNT == radiusIdx
-                                && selectQueryCount >= INITIAL_SELECT_QUERY_COUNT_TO_IGNORE) {
-                            queryResponseTime += ReportBuilderHelper.getLong(line, "=", "for");
-                            ++targetRadiusSelectQueryCount;
-                        }
-                        ++selectQueryCount;
-                    }
-                }
-            }
-            rsb.append((double) queryResponseTime / targetRadiusSelectQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getSelectQueryResultCount(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-            String line;
-            long queryResultCount = 0;
-            int targetRadiusSelectQueryCount = 0;
-            for (BufferedReader queryLogFileBr : queryLogFileBrs) {
-                int selectQueryCount = 0;
-                while ((line = queryLogFileBr.readLine()) != null) {
-                    if (line.contains("int64") && selectQueryCount < MAX_SELECT_QUERY_COUNT_TO_CONSIDER) {
-                        if (selectQueryCount % SELECT_QUERY_RADIUS_COUNT == radiusIdx
-                                && selectQueryCount >= INITIAL_SELECT_QUERY_COUNT_TO_IGNORE) {
-                            line = queryLogFileBr.readLine(); //read the result count line
-                            queryResultCount += Long.parseLong(line);
-                            ++targetRadiusSelectQueryCount;
-                        }
-                        ++selectQueryCount;
-                    }
-                }
-            }
-            rsb.append((double) queryResultCount / targetRadiusSelectQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    private void openQueryLog() throws IOException {
-        String queryLogFilePathPrefix = expHomePath + File.separator + expName + File.separator + "QueryGenResult-";
-        String queryLogFilePathSuffix = ".txt";
-        for (int i = 0; i < QUERY_GEN_COUNT; i++) {
-            queryLogFileBrs[i] = new BufferedReader(new FileReader(queryLogFilePathPrefix + QUERY_GEN_IPS[i]
-                    + queryLogFilePathSuffix));
-        }
-    }
-
-    private void closeQueryLog() throws IOException {
-        for (BufferedReader queryLogFileBr : queryLogFileBrs) {
-            if (queryLogFileBr != null) {
-                queryLogFileBr.close();
-                queryLogFileBr = null;
-            }
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilderRunner.java
deleted file mode 100644
index 91f30f5..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE2ReportBuilderRunner.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.FileOutputStream;
-import java.util.ArrayList;
-
-public class SIE2ReportBuilderRunner {
-    String expHomePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/exp2-4/";
-    String runLogFileName = "run-exp2-4.log";
-    String outputFilePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/result-report/";
-
-    SIE2ReportBuilder sie2Dhbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment2Dhbtree", runLogFileName);
-    SIE2ReportBuilder sie2Dhvbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment2Dhvbtree",
-            runLogFileName);
-    SIE2ReportBuilder sie2Rtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment2Rtree", runLogFileName);
-    SIE2ReportBuilder sie2Shbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment2Shbtree", runLogFileName);
-    SIE2ReportBuilder sie2Sif = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment2Sif", runLogFileName);
-
-    StringBuilder sb = new StringBuilder();
-
-    /**
-     * generate sie2_overall_insert_ps.txt
-     */
-    public void generateOverallInsertPS() throws Exception {
-        int targetRound = 721; //(3600 seconds / 5seconds) + 1
-
-        ArrayList<Long> ipsListDhbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListDhvbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListRtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListShbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListSif = new ArrayList<Long>();
-        sie2Dhbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhbtree);
-        sie2Dhvbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhvbtree);
-        sie2Rtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListRtree);
-        sie2Shbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListShbtree);
-        sie2Sif.getAllNodesAccumulatedInsertPS(targetRound, ipsListSif);
-
-        sb.setLength(0);
-        sb.append("# sie2 60min inserts per second report\n");
-        sb.append("index type, InsertPS\n");
-        sb.append("dhbtree,").append(ipsListDhbtree.get(targetRound - 1)).append("\n");
-        sb.append("dhvbtree,").append(ipsListDhvbtree.get(targetRound - 1)).append("\n");
-        sb.append("rtree,").append(ipsListRtree.get(targetRound - 1)).append("\n");
-        sb.append("shbtree,").append(ipsListShbtree.get(targetRound - 1)).append("\n");
-        sb.append("sif,").append(ipsListSif.get(targetRound - 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_overall_insert_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        ipsListDhbtree.clear();
-        ipsListDhvbtree.clear();
-        ipsListRtree.clear();
-        ipsListShbtree.clear();
-        ipsListSif.clear();
-    }
-
-    /**
-     * generate sie2_accumulated_insert_ps.txt
-     */
-    public void generateAccumulatedInsertPS() throws Exception {
-        int targetRound = 721; //(3600 seconds / 5seconds) + 1
-        int roundInterval = 5;
-
-        ArrayList<Long> ipsListDhbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListDhvbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListRtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListShbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListSif = new ArrayList<Long>();
-        sie2Dhbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhbtree);
-        sie2Dhvbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhvbtree);
-        sie2Rtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListRtree);
-        sie2Shbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListShbtree);
-        sie2Sif.getAllNodesAccumulatedInsertPS(targetRound, ipsListSif);
-
-        sb.setLength(0);
-        sb.append("# sie2 accumulated inserts per second report\n");
-        sb.append("# time, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-
-        for (int i = 0; i < targetRound; i++) {
-            sb.append("" + (i * roundInterval) + "," + ipsListDhbtree.get(i) + "," + ipsListDhvbtree.get(i) + ","
-                    + ipsListRtree.get(i) + "," + ipsListShbtree.get(i) + "," + ipsListSif.get(i) + "\n");
-        }
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_accumulated_insert_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        ipsListDhbtree.clear();
-        ipsListDhvbtree.clear();
-        ipsListRtree.clear();
-        ipsListShbtree.clear();
-        ipsListSif.clear();
-    }
-
-    public void generateQueryPS() throws Exception {
-        int minutes = 60;
-        sb.setLength(0);
-        sb.append("# sie2 queries per second report\n");
-        sb.append("index type, QueryPS\n");
-        sb.append("dhbtree,").append(sie2Dhbtree.getQueryPS(minutes)).append("\n");
-        sb.append("dhvbtree,").append(sie2Dhvbtree.getQueryPS(minutes)).append("\n");
-        sb.append("rtree,").append(sie2Rtree.getQueryPS(minutes)).append("\n");
-        sb.append("shbtree,").append(sie2Shbtree.getQueryPS(minutes)).append("\n");
-        sb.append("sif,").append(sie2Sif.getQueryPS(minutes)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_query_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateAverageQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie2 average query result count report\n");
-        sb.append("index type, query result count\n");
-        sb.append("dhbtree,").append(sie2Dhbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("dhvbtree,").append(sie2Dhvbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("rtree,").append(sie2Rtree.getAverageQueryResultCount()).append("\n");
-        sb.append("shbtree,").append(sie2Shbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("sif,").append(sie2Sif.getAverageQueryResultCount()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie2_average_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateAverageQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie2 average query response time report\n");
-        sb.append("index type, query response time\n");
-        sb.append("dhbtree,").append(sie2Dhbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("dhvbtree,").append(sie2Dhvbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("rtree,").append(sie2Rtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("shbtree,").append(sie2Shbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("sif,").append(sie2Sif.getAverageQueryResponseTime()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie2_average_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateInstantaneousInsertPS() throws Exception {
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 instantaneous inserts per second report\n");
-            sb.append(sie2Dhbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 instantaneous inserts per second report\n");
-            sb.append(sie2Dhvbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 instantaneous inserts per second report\n");
-            sb.append(sie2Rtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 instantaneous inserts per second report\n");
-            sb.append(sie2Shbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 instantaneous inserts per second report\n");
-            sb.append(sie2Sif.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-    }
-
-    public void generateGanttInstantaneousInsertPS() throws Exception {
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie2Dhbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_gantt_1node_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie2Dhvbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_gantt_1node_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie2Rtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_gantt_1node_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie2Shbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_gantt_1node_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie2 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie2Sif.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie2_gantt_1node_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-
-        long dataGenStartTime = sie2Dhbtree.getDataGenStartTimeStamp();
-        NCLogReportBuilder ncLogReportBuilder = new NCLogReportBuilder(expHomePath
-                + "SpatialIndexExperiment2Dhbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie2_gantt_1node_flush_merge_dhbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie2Dhvbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment2Dhvbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_gantt_1node_flush_merge_dhvbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie2Rtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment2Rtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_gantt_1node_flush_merge_rtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie2Shbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment2Shbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_gantt_1node_flush_merge_shbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie2Sif.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment2Sif/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_gantt_1node_flush_merge_sif.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie2 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie2Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie2Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie2Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie2Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie2Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie2_select_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie2 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie2Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie2Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie2Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(2)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_select_query_response_time1.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie2 select query response time 2 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.01,").append(sie2Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie2Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie2Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_select_query_response_time2.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResultCount() throws Exception {
-
-        sb.setLength(0);
-        sb.append("# sie2 select query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie2Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie2Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie2Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(2)).append("\n");
-        sb.append("0.01,").append(sie2Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie2Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper
-                .openOutputFile(outputFilePath + "sie2_select_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie2 select query result count 1 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie2Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie2Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie2Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(2)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_select_query_result_count1.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie2 select query result count 2 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.01,").append(sie2Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie2Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie2Sif.getSelectQueryResultCount(4)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie2_select_query_result_count2.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ProfileReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ProfileReportBuilder.java
deleted file mode 100644
index 138afb4..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ProfileReportBuilder.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-public class SIE3ProfileReportBuilder extends AbstractDynamicDataEvalReportBuilder {
-    public SIE3ProfileReportBuilder(String expHomePath, String expName, String runLogFileName) {
-        super(expHomePath, expName, runLogFileName, false);
-    }
-
-    @Override
-    public String getOverallInsertPS(int minutes) throws Exception {
-        renewStringBuilder();
-        openRunLog();
-        try {
-            if (!moveToExperimentBegin()) {
-                //The experiment run log doesn't exist in this run log file
-                return null;
-            }
-
-            String line;
-            while ((line = br.readLine()) != null) {
-                if (line.contains("int64")) {
-                    line = br.readLine();
-                    rsb.append(Long.parseLong(line) / (minutes * 60));
-                    break;
-                }
-            }
-
-            return rsb.toString();
-        } finally {
-            closeRunLog();
-        }
-    }
-
-    @Override
-    public String getInstantaneousQueryPS() throws Exception {
-        return null;
-    }
-
-    @Override
-    public String getQueryPS(int minutes) throws Exception {
-        return null;
-        //        renewStringBuilder();
-        //        openRunLog();
-        //        try {
-        //
-        //            return getResult();
-        //        } finally {
-        //            closeRunLog();
-        //        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilder.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilder.java
deleted file mode 100644
index 0f36b2a..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilder.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class SIE3ReportBuilder extends AbstractDynamicDataEvalReportBuilder {
-    private static final int WARM_UP_QUERY_COUNT = 500;
-    private static final int SELECT_QUERY_COUNT = 5000; //5000
-    private static final int JOIN_QUERY_COUNT = 1000;
-    private static final int SELECT_QUERY_RADIUS_COUNT = 5; //0.00001, 0.0001, 0.001, 0.01, 0.1
-    private static final int JOIN_QUERY_RADIUS_COUNT = 4; ////0.00001, 0.0001, 0.001, 0.01
-    private static final String LOADED_RECORD_COUNT = "1600000000"; //1600000000
-    private final String queryLogFilePath;
-    private BufferedReader queryLogFileBr;
-
-    public SIE3ReportBuilder(String expHomePath, String expName, String runLogFileName, String queryLogFileName) {
-        super(expHomePath, expName, runLogFileName, false);
-        queryLogFilePath = new String(expHomePath + File.separator + expName + File.separator + queryLogFileName);
-    }
-
-    private void openQueryLog() throws IOException {
-        queryLogFileBr = new BufferedReader(new FileReader(queryLogFilePath));
-    }
-
-    private void closeQueryLog() throws IOException {
-        if (queryLogFileBr != null) {
-            queryLogFileBr.close();
-            queryLogFileBr = null;
-        }
-    }
-
-    @Override
-    public String getOverallInsertPS(int minutes) throws Exception {
-        return null;
-    }
-
-    public String get20minInsertPS(int minutes) throws Exception {
-        return null;
-    }
-
-    @Override
-    public String getInstantaneousQueryPS() throws Exception {
-        return null;
-    }
-
-    @Override
-    public String getQueryPS(int minutes) throws Exception {
-        return null;
-    }
-
-    public String getIndexCreationTime() throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-
-        try {
-            String line;
-            long indexCreationTime = 0;
-            while ((line = queryLogFileBr.readLine()) != null) {
-                if (line.contains("There is no index with this name")) {
-                    indexCreationTime += ReportBuilderHelper.getLong(line, "=", "for");
-                    break;
-                }
-            }
-            rsb.append((double) indexCreationTime / (1000 * 60));
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getSelectQueryResponseTime(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-            String line;
-            long queryResponseTime = 0;
-            int selectQueryCount = 0;
-            int targetRadiusSelectQueryCount = 0;
-            while ((line = queryLogFileBr.readLine()) != null) {
-                if (line.contains(LOADED_RECORD_COUNT)) {
-                    //select queries start after total count query
-                    // read and discard WARM_UP_QUERY_COUNT queries' results 
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("Elapsed time =")) {
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-
-                    // read and calculate the average query response time for the requested(target) radius
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("Elapsed time =")) {
-                            if (selectQueryCount % SELECT_QUERY_RADIUS_COUNT == radiusIdx) {
-                                queryResponseTime += ReportBuilderHelper.getLong(line, "=", "for");
-                                ++targetRadiusSelectQueryCount;
-                            }
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-                    break;
-                }
-            }
-            rsb.append((double) queryResponseTime / targetRadiusSelectQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getSelectQueryResultCount(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-
-            String line;
-            long queryResultCount = 0;
-            int selectQueryCount = 0;
-            int targetRadiusSelectQueryCount = 0;
-            while ((line = queryLogFileBr.readLine()) != null) {
-                if (line.contains(LOADED_RECORD_COUNT)) {
-                    //select queries start after total count query
-                    // read and discard WARM_UP_QUERY_COUNT queries' results 
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("int64")) {
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-
-                    // read and calculate the average query response time for the requested(target) radius
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("int64")) {
-                            if (selectQueryCount % SELECT_QUERY_RADIUS_COUNT == radiusIdx) {
-                                line = queryLogFileBr.readLine();
-                                queryResultCount += Long.parseLong(line);
-                                ++targetRadiusSelectQueryCount;
-                            }
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-                    break;
-                }
-            }
-            rsb.append((double) queryResultCount / targetRadiusSelectQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getJoinQueryResponseTime(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-
-            String line;
-            long queryResponseTime = 0;
-            int selectQueryCount = 0;
-            int targetRadiusJoinQueryCount = 0;
-            while ((line = queryLogFileBr.readLine()) != null) {
-                if (line.contains(LOADED_RECORD_COUNT)) {
-                    //select queries start after total count query
-                    // read and discard WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT queries' results 
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("Elapsed time =")) {
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-
-                    selectQueryCount = 0;
-                    // read and calculate the average query response time for the requested(target) radius
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("Elapsed time =")) {
-                            if (selectQueryCount % JOIN_QUERY_RADIUS_COUNT == radiusIdx) {
-                                if (ReportBuilderHelper.getLong(line, "=", "for") > 5000) {
-                                    System.out.println("Time: " + expName + "[" + radiusIdx + ", "
-                                            + targetRadiusJoinQueryCount + ", " + selectQueryCount + "]:"
-                                            + ReportBuilderHelper.getLong(line, "=", "for"));
-                                }
-                                queryResponseTime += ReportBuilderHelper.getLong(line, "=", "for");
-                                ++targetRadiusJoinQueryCount;
-                            }
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == JOIN_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-                    break;
-                }
-            }
-            rsb.append((double) queryResponseTime / targetRadiusJoinQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-
-    public String getJoinQueryResultCount(int radiusIdx) throws Exception {
-        renewStringBuilder();
-        openQueryLog();
-        try {
-
-            String line;
-            long queryResultCount = 0;
-            int selectQueryCount = 0;
-            int targetRadiusJoinQueryCount = 0;
-            while ((line = queryLogFileBr.readLine()) != null) {
-                if (line.contains(LOADED_RECORD_COUNT)) {
-                    //select queries start after total count query
-                    // read and discard WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT queries' results 
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("int64")) {
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == WARM_UP_QUERY_COUNT + SELECT_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-
-                    selectQueryCount = 0;
-                    // read and calculate the average query response time for the requested(target) radius
-                    while (true) {
-                        line = queryLogFileBr.readLine();
-                        if (line.contains("int64")) {
-                            if (selectQueryCount % JOIN_QUERY_RADIUS_COUNT == radiusIdx) {
-                                line = queryLogFileBr.readLine();
-
-                                if (selectQueryCount == 600 || selectQueryCount == 824 || Long.parseLong(line) > 100000) {
-                                    System.out.println("Count: " + expName + "[" + radiusIdx + ", "
-                                            + targetRadiusJoinQueryCount + ", " + selectQueryCount + "]:"
-                                            + Long.parseLong(line));
-                                }
-
-                                queryResultCount += Long.parseLong(line);
-                                ++targetRadiusJoinQueryCount;
-                            }
-                            ++selectQueryCount;
-                        }
-                        if (selectQueryCount == JOIN_QUERY_COUNT) {
-                            break;
-                        }
-                    }
-                    break;
-                }
-            }
-            rsb.append((double) queryResultCount / targetRadiusJoinQueryCount);
-            return rsb.toString();
-        } finally {
-            closeQueryLog();
-        }
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilderRunner.java
deleted file mode 100644
index 8cfff8b..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE3ReportBuilderRunner.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class SIE3ReportBuilderRunner {
-    static boolean IS_PROFILE = false;
-    String outputFilePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/result-report/";
-    SIE3ReportBuilder sie3Dhbtree;
-    SIE3ReportBuilder sie3Dhvbtree;
-    SIE3ReportBuilder sie3Rtree;
-    SIE3ReportBuilder sie3Shbtree;
-    SIE3ReportBuilder sie3Sif;
-
-    //for profiling report -------------------------------------
-    String profileFileHomeDir;
-    String indexSearchTimeFilePath;
-    String falsePositiveFilePath;
-    String cacheMissFilePath;
-    ProfilerReportBuilder dhbtreeProfiler;
-    ProfilerReportBuilder dhvbtreeProfiler;
-    ProfilerReportBuilder rtreeProfiler;
-    ProfilerReportBuilder shbtreeProfiler;
-    ProfilerReportBuilder sifProfiler;
-    //for profiling report -------------------------------------
-
-    StringBuilder sb = new StringBuilder();
-
-    public SIE3ReportBuilderRunner() {
-
-        String expHomePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/exp3/";
-        String runLogFileName = "run-exp3.log";
-        String queryLogFileNamePrefix = "QueryGenResult-";
-        String queryLogFileNameSuffix = "-130.149.249.51.txt";
-
-        sie3Dhbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment3Dhbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment3Dhbtree" + queryLogFileNameSuffix);
-        sie3Dhvbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment3Dhvbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment3Dhvbtree" + queryLogFileNameSuffix);
-        sie3Rtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment3Rtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment3Rtree" + queryLogFileNameSuffix);
-        sie3Shbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment3Shbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment3Shbtree" + queryLogFileNameSuffix);
-        sie3Sif = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment3Sif", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment3Sif" + queryLogFileNameSuffix);
-    }
-
-    public void generateIndexCreationTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 index creation time report\n");
-        sb.append("index type, index creation time\n");
-        sb.append("dhbtree,").append(sie3Dhbtree.getIndexCreationTime()).append("\n");
-        sb.append("dhvbtree,").append(sie3Dhvbtree.getIndexCreationTime()).append("\n");
-        sb.append("rtree,").append(sie3Rtree.getIndexCreationTime()).append("\n");
-        sb.append("shbtree,").append(sie3Shbtree.getIndexCreationTime()).append("\n");
-        sb.append("sif,").append(sie3Sif.getIndexCreationTime()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie3_index_creation_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateIndexSize() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 index size report\n");
-
-        sb.append("index type, index size\n");
-        sb.append("dhbtree,").append(sie3Dhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append("\n");
-        sb.append("dhvbtree,").append(sie3Dhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append("\n");
-        sb.append("rtree,").append(sie3Rtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append("\n");
-        sb.append("shbtree,").append(sie3Shbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append("\n");
-        sb.append("sif,").append(sie3Sif.getIndexSize("Tweets_idx_sifLocation/device_id")).append("\n");
-        sb.append("# pidx,").append(sie3Sif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie3_sidx_size.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie3Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie3Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie3Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie3Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie3Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie3Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie3Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie3Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie3Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie3Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie3Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie3Sif.getSelectQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie3Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie3Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie3Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie3Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie3Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie3Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie3Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie3Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie3Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie3Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie3Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie3Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie3Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie3Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie3Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie3Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie3Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie3Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie3Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie3Sif.getSelectQueryResultCount(2)).append("\n");
-        sb.append("0.01,").append(sie3Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie3Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie3Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie3Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie3Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie3Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie3Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie3Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie3Sif.getSelectQueryResultCount(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper
-                .openOutputFile(outputFilePath + "sie3_select_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie3Dhbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie3Rtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie3Shbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie3Sif.getJoinQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie3Dhbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie3Rtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie3Shbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie3Sif.getJoinQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie3Dhbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie3Rtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie3Shbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie3Sif.getJoinQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie3Dhbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie3Rtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie3Shbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie3Sif.getJoinQueryResponseTime(3)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie3_join_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie3Dhbtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie3Rtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie3Shbtree.getJoinQueryResultCount(0)).append(",").append(sie3Sif.getJoinQueryResultCount(0))
-                .append("\n");
-        sb.append("0.0001,").append(sie3Dhbtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie3Rtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie3Shbtree.getJoinQueryResultCount(1)).append(",").append(sie3Sif.getJoinQueryResultCount(1))
-                .append("\n");
-        sb.append("0.001,").append(sie3Dhbtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie3Rtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie3Shbtree.getJoinQueryResultCount(2)).append(",").append(sie3Sif.getJoinQueryResultCount(2))
-                .append("\n");
-        sb.append("0.01,").append(sie3Dhbtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie3Dhvbtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie3Rtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie3Shbtree.getJoinQueryResultCount(3)).append(",").append(sie3Sif.getJoinQueryResultCount(3))
-                .append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie3_join_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledSidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query profiled sidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 3, 0)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 4, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_profiled_sidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query profiled pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 3, 1)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 4, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_profiled_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled sidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_sidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 2)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 2)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 2)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSeedPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled query seed pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_seed_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledSidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query profiled sidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 3, 0)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 4, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_profiled_sidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query profiled pidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 3, 1)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 4, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_profiled_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled sidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_sidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled pidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 2)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 2)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 2)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSeedPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled query seed pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_seed_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledFalsePositive() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 select query profiled false positive raw report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 3)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_select_query_profiled_false_positive_raw.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-        generateFalsePositive(outputFilePath + "sie3_select_query_profiled_false_positive_raw.txt", outputFilePath
-                + "sie3_select_query_result_count.txt", outputFilePath
-                + "sie3_select_query_profiled_false_positive.txt", false);
-    }
-
-    private void generateFalsePositive(String falsePositveFile, String queryResultCountFile, String outputFile,
-            boolean isJoin) throws IOException {
-
-        String[] fps, rcs;
-        sb.setLength(0);
-
-        BufferedReader brFalsePositive = new BufferedReader(new FileReader(falsePositveFile));
-        BufferedReader brQueryResultCount = new BufferedReader(new FileReader(queryResultCountFile));
-
-        //discard two head lines
-        brFalsePositive.readLine();
-        brFalsePositive.readLine();
-        brQueryResultCount.readLine();
-        brQueryResultCount.readLine();
-
-        int radiusCount = isJoin ? 4 : 5;
-        int partitionCount = 24;
-        String[] radius = { "0.00001", "0.0001", "0.001", "0.01", "0.1" };
-
-        if (isJoin) {
-            sb.append("# sie3 join query profiled false positive report\n");
-        } else {
-            sb.append("# sie3 select query profiled false positive report\n");
-        }
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-
-        for (int i = 0; i < radiusCount; i++) {
-            fps = brFalsePositive.readLine().split(",");
-            rcs = brQueryResultCount.readLine().split(",");
-            //false positive count
-            sb.append(radius[i])
-                    .append(",")
-                    .append(((Double.parseDouble(fps[1]) * partitionCount) - Double.parseDouble(rcs[1]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[2]) * partitionCount) - Double.parseDouble(rcs[2]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[3]) * partitionCount) - Double.parseDouble(rcs[3]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[4]) * partitionCount) - Double.parseDouble(rcs[4]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[5]) * partitionCount) - Double.parseDouble(rcs[5]))
-                            / partitionCount).append("\n");
-            //false positive rate
-            //            sb.append(radius[i])
-            //            .append(",").append(((Double.parseDouble(fps[1]) * partitionCount) - Double.parseDouble(rcs[1]))/(Double.parseDouble(fps[1]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[2]) * partitionCount) - Double.parseDouble(rcs[2]))/(Double.parseDouble(fps[2]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[3]) * partitionCount) - Double.parseDouble(rcs[3]))/(Double.parseDouble(fps[3]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[4]) * partitionCount) - Double.parseDouble(rcs[4]))/(Double.parseDouble(fps[4]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[5]) * partitionCount) - Double.parseDouble(rcs[5]))/(Double.parseDouble(fps[5]) * partitionCount))
-            //            .append("\n");
-        }
-        brFalsePositive.close();
-        brQueryResultCount.close();
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFile);
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledFalsePositive() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie3 join query profiled false positive raw report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 3)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie3_join_query_profiled_false_positive_raw.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        generateFalsePositive(outputFilePath + "sie3_join_query_profiled_false_positive_raw.txt", outputFilePath
-                + "sie3_join_query_result_count.txt", outputFilePath + "sie3_join_query_profiled_false_positive.txt",
-                true);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE4ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE4ReportBuilderRunner.java
deleted file mode 100644
index 2dfa23f..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE4ReportBuilderRunner.java
+++ /dev/null
@@ -1,715 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.BufferedReader;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-
-public class SIE4ReportBuilderRunner {
-    static boolean IS_PROFILE = false;
-    String outputFilePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/result-report/";
-    SIE3ReportBuilder sie4Dhbtree;
-    SIE3ReportBuilder sie4Dhvbtree;
-    SIE3ReportBuilder sie4Rtree;
-    SIE3ReportBuilder sie4Shbtree;
-    SIE3ReportBuilder sie4Sif;
-
-    //for profiling report -------------------------------------
-    String profileFileHomeDir;
-    String indexSearchTimeFilePath;
-    String falsePositiveFilePath;
-    String cacheMissFilePath;
-    ProfilerReportBuilder dhbtreeProfiler;
-    ProfilerReportBuilder dhvbtreeProfiler;
-    ProfilerReportBuilder rtreeProfiler;
-    ProfilerReportBuilder shbtreeProfiler;
-    ProfilerReportBuilder sifProfiler;
-    //for profiling report -------------------------------------
-
-    StringBuilder sb = new StringBuilder();
-
-    public SIE4ReportBuilderRunner() {
-        String expHomePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/exp4/";
-        String runLogFileName = "run-exp4.log";
-        String queryLogFileNamePrefix = "QueryGenResult-";
-        String queryLogFileNameSuffix = "-130.149.249.51.txt";
-
-        sie4Dhbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment4Dhbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment4Dhbtree" + queryLogFileNameSuffix);
-        sie4Dhvbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment4Dhvbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment4Dhvbtree" + queryLogFileNameSuffix);
-        sie4Rtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment4Rtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment4Rtree" + queryLogFileNameSuffix);
-        sie4Shbtree = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment4Shbtree", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment4Shbtree" + queryLogFileNameSuffix);
-        sie4Sif = new SIE3ReportBuilder(expHomePath, "SpatialIndexExperiment4Sif", runLogFileName,
-                queryLogFileNamePrefix + "SpatialIndexExperiment4Sif" + queryLogFileNameSuffix);
-    }
-
-    public void generateIndexCreationTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 index creation time report\n");
-        sb.append("index type, index creation time\n");
-        sb.append("dhbtree,").append(sie4Dhbtree.getIndexCreationTime()).append("\n");
-        sb.append("dhvbtree,").append(sie4Dhvbtree.getIndexCreationTime()).append("\n");
-        sb.append("rtree,").append(sie4Rtree.getIndexCreationTime()).append("\n");
-        sb.append("shbtree,").append(sie4Shbtree.getIndexCreationTime()).append("\n");
-        sb.append("sif,").append(sie4Sif.getIndexCreationTime()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie4_index_creation_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateIndexSize() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 index size report\n");
-
-        sb.append("index type, index size\n");
-        sb.append("dhbtree,").append(sie4Dhbtree.getIndexSize("Tweets_idx_dhbtreeLocation/device_id")).append("\n");
-        sb.append("dhvbtree,").append(sie4Dhvbtree.getIndexSize("Tweets_idx_dhvbtreeLocation/device_id")).append("\n");
-        sb.append("rtree,").append(sie4Rtree.getIndexSize("Tweets_idx_rtreeLocation/device_id")).append("\n");
-        sb.append("shbtree,").append(sie4Shbtree.getIndexSize("Tweets_idx_shbtreeLocation/device_id")).append("\n");
-        sb.append("sif,").append(sie4Sif.getIndexSize("Tweets_idx_sifLocation/device_id")).append("\n");
-        sb.append("# pidx,").append(sie4Sif.getIndexSize("Tweets_idx_Tweets/device_id")).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie4_sidx_size.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie4Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie4Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie4Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie4Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie4Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie4Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie4Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie4Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie4Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie4Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie4Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie4Sif.getSelectQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie4Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie4Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie4Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie4Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie4Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie4Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie4Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie4Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie4Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie4Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie4Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie4Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie4Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie4Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie4Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie4Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie4Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie4Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie4Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie4Sif.getSelectQueryResultCount(2)).append("\n");
-        sb.append("0.01,").append(sie4Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie4Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie4Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie4Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie4Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie4Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie4Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie4Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie4Sif.getSelectQueryResultCount(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper
-                .openOutputFile(outputFilePath + "sie4_select_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie4Dhbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie4Rtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie4Shbtree.getJoinQueryResponseTime(0)).append(",")
-                .append(sie4Sif.getJoinQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie4Dhbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie4Rtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie4Shbtree.getJoinQueryResponseTime(1)).append(",")
-                .append(sie4Sif.getJoinQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie4Dhbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie4Rtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie4Shbtree.getJoinQueryResponseTime(2)).append(",")
-                .append(sie4Sif.getJoinQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie4Dhbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie4Rtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie4Shbtree.getJoinQueryResponseTime(3)).append(",")
-                .append(sie4Sif.getJoinQueryResponseTime(3)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie4_join_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie4Dhbtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie4Rtree.getJoinQueryResultCount(0)).append(",")
-                .append(sie4Shbtree.getJoinQueryResultCount(0)).append(",").append(sie4Sif.getJoinQueryResultCount(0))
-                .append("\n");
-        sb.append("0.0001,").append(sie4Dhbtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie4Rtree.getJoinQueryResultCount(1)).append(",")
-                .append(sie4Shbtree.getJoinQueryResultCount(1)).append(",").append(sie4Sif.getJoinQueryResultCount(1))
-                .append("\n");
-        sb.append("0.001,").append(sie4Dhbtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie4Rtree.getJoinQueryResultCount(2)).append(",")
-                .append(sie4Shbtree.getJoinQueryResultCount(2)).append(",").append(sie4Sif.getJoinQueryResultCount(2))
-                .append("\n");
-        sb.append("0.01,").append(sie4Dhbtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie4Dhvbtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie4Rtree.getJoinQueryResultCount(3)).append(",")
-                .append(sie4Shbtree.getJoinQueryResultCount(3)).append(",").append(sie4Sif.getJoinQueryResultCount(3))
-                .append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie4_join_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledSidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query profiled sidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 3, 0)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 4, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 4, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_profiled_sidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query profiled pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 3, 1)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, false, 4, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, false, 4, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_profiled_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled sidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_sidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 2)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 2)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 2)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSeedPidxSearchTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled query seed pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(true, true, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(true, true, 3, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_seed_pidx_search_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledSidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query profiled sidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 3, 0)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 4, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 4, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_profiled_sidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query profiled pidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 3, 1)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, false, 4, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, false, 4, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_profiled_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled sidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 1)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 1)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 1)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_sidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled pidx cache miss report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 2)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 2)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 2)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 2)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledSeedPidxCacheMiss() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled query seed pidx search time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 0, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 0, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 1, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 1, 0)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 2, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 2, 0)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(dhvbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(rtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(shbtreeProfiler.getIdxNumber(false, true, 3, 0)).append(",")
-                .append(sifProfiler.getIdxNumber(false, true, 3, 0)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_seed_pidx_cache_miss.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryProfiledFalsePositive() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 select query profiled false positive raw report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 0)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 1)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 2)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 3)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 3)).append("\n");
-        sb.append("0.1,").append(dhbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(rtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(false, 4)).append(",")
-                .append(sifProfiler.getFalsePositives(false, 4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_select_query_profiled_false_positive_raw.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-        generateFalsePositive(outputFilePath + "sie4_select_query_profiled_false_positive_raw.txt", outputFilePath
-                + "sie4_select_query_result_count.txt", outputFilePath
-                + "sie4_select_query_profiled_false_positive.txt", false);
-    }
-
-    private void generateFalsePositive(String falsePositveFile, String queryResultCountFile, String outputFile,
-            boolean isJoin) throws IOException {
-
-        String[] fps, rcs;
-        sb.setLength(0);
-
-        BufferedReader brFalsePositive = new BufferedReader(new FileReader(falsePositveFile));
-        BufferedReader brQueryResultCount = new BufferedReader(new FileReader(queryResultCountFile));
-
-        //discard two head lines
-        brFalsePositive.readLine();
-        brFalsePositive.readLine();
-        brQueryResultCount.readLine();
-        brQueryResultCount.readLine();
-
-        int radiusCount = isJoin ? 4 : 5;
-        int partitionCount = 24;
-        String[] radius = { "0.00001", "0.0001", "0.001", "0.01", "0.1" };
-
-        if (isJoin) {
-            sb.append("# sie4 join query profiled false positive report\n");
-        } else {
-            sb.append("# sie4 select query profiled false positive report\n");
-        }
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-
-        for (int i = 0; i < radiusCount; i++) {
-            fps = brFalsePositive.readLine().split(",");
-            rcs = brQueryResultCount.readLine().split(",");
-            //false positive count
-            sb.append(radius[i])
-                    .append(",")
-                    .append(((Double.parseDouble(fps[1]) * partitionCount) - Double.parseDouble(rcs[1]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[2]) * partitionCount) - Double.parseDouble(rcs[2]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[3]) * partitionCount) - Double.parseDouble(rcs[3]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[4]) * partitionCount) - Double.parseDouble(rcs[4]))
-                            / partitionCount)
-                    .append(",")
-                    .append(((Double.parseDouble(fps[5]) * partitionCount) - Double.parseDouble(rcs[5]))
-                            / partitionCount).append("\n");
-            //false positive rate
-            //            sb.append(radius[i])
-            //            .append(",").append(((Double.parseDouble(fps[1]) * partitionCount) - Double.parseDouble(rcs[1]))/(Double.parseDouble(fps[1]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[2]) * partitionCount) - Double.parseDouble(rcs[2]))/(Double.parseDouble(fps[2]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[3]) * partitionCount) - Double.parseDouble(rcs[3]))/(Double.parseDouble(fps[3]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[4]) * partitionCount) - Double.parseDouble(rcs[4]))/(Double.parseDouble(fps[4]) * partitionCount))
-            //            .append(",").append(((Double.parseDouble(fps[5]) * partitionCount) - Double.parseDouble(rcs[5]))/(Double.parseDouble(fps[5]) * partitionCount))
-            //            .append("\n");
-        }
-        brFalsePositive.close();
-        brQueryResultCount.close();
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFile);
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateJoinQueryProfiledFalsePositive() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie4 join query profiled false positive raw report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(dhbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 0)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 0)).append("\n");
-        sb.append("0.0001,").append(dhbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 1)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 1)).append("\n");
-        sb.append("0.001,").append(dhbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 2)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 2)).append("\n");
-        sb.append("0.01,").append(dhbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(dhvbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(rtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(shbtreeProfiler.getFalsePositives(true, 3)).append(",")
-                .append(sifProfiler.getFalsePositives(true, 3)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie4_join_query_profiled_false_positive_raw.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        generateFalsePositive(outputFilePath + "sie4_join_query_profiled_false_positive_raw.txt", outputFilePath
-                + "sie4_join_query_result_count.txt", outputFilePath + "sie4_join_query_profiled_false_positive.txt",
-                true);
-    }
-
-}
diff --git a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE5ReportBuilderRunner.java b/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE5ReportBuilderRunner.java
deleted file mode 100644
index 2cd8588..0000000
--- a/asterixdb/asterix-experiments/src/main/java/org/apache/asterix/experiment/report/SIE5ReportBuilderRunner.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.experiment.report;
-
-import java.io.FileOutputStream;
-import java.util.ArrayList;
-
-public class SIE5ReportBuilderRunner {
-    String expHomePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/exp5-4/";
-    String runLogFileName = "run-exp5-4.log";
-    String outputFilePath = "/Users/kisskys/workspace/asterix_master/resultLog/MemBuf3g-DiskBuf3g-Lsev-Jvm7g-Lock0g/result-report/";
-
-    SIE2ReportBuilder sie5Dhbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment5Dhbtree", runLogFileName);
-    SIE2ReportBuilder sie5Dhvbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment5Dhvbtree",
-            runLogFileName);
-    SIE2ReportBuilder sie5Rtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment5Rtree", runLogFileName);
-    SIE2ReportBuilder sie5Shbtree = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment5Shbtree", runLogFileName);
-    SIE2ReportBuilder sie5Sif = new SIE2ReportBuilder(expHomePath, "SpatialIndexExperiment5Sif", runLogFileName);
-
-    StringBuilder sb = new StringBuilder();
-
-    /**
-     * generate sie5_overall_insert_ps.txt
-     */
-    public void generateOverallInsertPS() throws Exception {
-        int targetRound = 721; //(3600 seconds / 5seconds) + 1
-
-        ArrayList<Long> ipsListDhbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListDhvbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListRtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListShbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListSif = new ArrayList<Long>();
-        sie5Dhbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhbtree);
-        sie5Dhvbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhvbtree);
-        sie5Rtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListRtree);
-        sie5Shbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListShbtree);
-        sie5Sif.getAllNodesAccumulatedInsertPS(targetRound, ipsListSif);
-
-        sb.setLength(0);
-        sb.append("# sie5 60min inserts per second report\n");
-        sb.append("index type, InsertPS\n");
-        sb.append("dhbtree,").append(ipsListDhbtree.get(targetRound - 1)).append("\n");
-        sb.append("dhvbtree,").append(ipsListDhvbtree.get(targetRound - 1)).append("\n");
-        sb.append("rtree,").append(ipsListRtree.get(targetRound - 1)).append("\n");
-        sb.append("shbtree,").append(ipsListShbtree.get(targetRound - 1)).append("\n");
-        sb.append("sif,").append(ipsListSif.get(targetRound - 1)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_overall_insert_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        ipsListDhbtree.clear();
-        ipsListDhvbtree.clear();
-        ipsListRtree.clear();
-        ipsListShbtree.clear();
-        ipsListSif.clear();
-    }
-
-    /**
-     * generate sie5_accumulated_insert_ps.txt
-     */
-    public void generateAccumulatedInsertPS() throws Exception {
-        int targetRound = 721; //(3600 seconds / 5seconds) + 1
-        int roundInterval = 5;
-
-        ArrayList<Long> ipsListDhbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListDhvbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListRtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListShbtree = new ArrayList<Long>();
-        ArrayList<Long> ipsListSif = new ArrayList<Long>();
-        sie5Dhbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhbtree);
-        sie5Dhvbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListDhvbtree);
-        sie5Rtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListRtree);
-        sie5Shbtree.getAllNodesAccumulatedInsertPS(targetRound, ipsListShbtree);
-        sie5Sif.getAllNodesAccumulatedInsertPS(targetRound, ipsListSif);
-
-        sb.setLength(0);
-        sb.append("# sie5 accumulated inserts per second report\n");
-        sb.append("# time, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-
-        for (int i = 0; i < targetRound; i++) {
-            sb.append("" + (i * roundInterval) + "," + ipsListDhbtree.get(i) + "," + ipsListDhvbtree.get(i) + ","
-                    + ipsListRtree.get(i) + "," + ipsListShbtree.get(i) + "," + ipsListSif.get(i) + "\n");
-        }
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_accumulated_insert_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        ipsListDhbtree.clear();
-        ipsListDhvbtree.clear();
-        ipsListRtree.clear();
-        ipsListShbtree.clear();
-        ipsListSif.clear();
-    }
-
-    public void generateQueryPS() throws Exception {
-        int minutes = 60;
-        sb.setLength(0);
-        sb.append("# sie5 queries per second report\n");
-        sb.append("index type, QueryPS\n");
-        sb.append("dhbtree,").append(sie5Dhbtree.getQueryPS(minutes)).append("\n");
-        sb.append("dhvbtree,").append(sie5Dhvbtree.getQueryPS(minutes)).append("\n");
-        sb.append("rtree,").append(sie5Rtree.getQueryPS(minutes)).append("\n");
-        sb.append("shbtree,").append(sie5Shbtree.getQueryPS(minutes)).append("\n");
-        sb.append("sif,").append(sie5Sif.getQueryPS(minutes)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_query_ps.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateAverageQueryResultCount() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie5 average query result count report\n");
-        sb.append("index type, query result count\n");
-        sb.append("dhbtree,").append(sie5Dhbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("dhvbtree,").append(sie5Dhvbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("rtree,").append(sie5Rtree.getAverageQueryResultCount()).append("\n");
-        sb.append("shbtree,").append(sie5Shbtree.getAverageQueryResultCount()).append("\n");
-        sb.append("sif,").append(sie5Sif.getAverageQueryResultCount()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie5_average_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateAverageQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie5 average query response time report\n");
-        sb.append("index type, query response time\n");
-        sb.append("dhbtree,").append(sie5Dhbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("dhvbtree,").append(sie5Dhvbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("rtree,").append(sie5Rtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("shbtree,").append(sie5Shbtree.getAverageQueryResponseTime()).append("\n");
-        sb.append("sif,").append(sie5Sif.getAverageQueryResponseTime()).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie5_average_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateInstantaneousInsertPS() throws Exception {
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 instantaneous inserts per second report\n");
-            sb.append(sie5Dhbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 instantaneous inserts per second report\n");
-            sb.append(sie5Dhvbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 instantaneous inserts per second report\n");
-            sb.append(sie5Rtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 instantaneous inserts per second report\n");
-            sb.append(sie5Shbtree.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 8; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 instantaneous inserts per second report\n");
-            sb.append(sie5Sif.getInstantaneousInsertPS(i, false));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-    }
-
-    public void generateGanttInstantaneousInsertPS() throws Exception {
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie5Dhbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_gantt_1node_instantaneous_insert_ps_dhbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie5Dhvbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_gantt_1node_instantaneous_insert_ps_dhvbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie5Rtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_gantt_1node_instantaneous_insert_ps_rtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie5Shbtree.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_gantt_1node_instantaneous_insert_ps_shbtree_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-        for (int i = 0; i < 1; i++) {
-            sb.setLength(0);
-            sb.append("# sie5 8nodes(8 dataGen) instantaneous inserts per second report\n");
-            sb.append(sie5Sif.getInstantaneousInsertPS(i, true));
-            FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                    + "sie5_gantt_1node_instantaneous_insert_ps_sif_gen" + i + ".txt");
-            fos.write(sb.toString().getBytes());
-            ReportBuilderHelper.closeOutputFile(fos);
-        }
-
-        long dataGenStartTime = sie5Dhbtree.getDataGenStartTimeStamp();
-        NCLogReportBuilder ncLogReportBuilder = new NCLogReportBuilder(expHomePath
-                + "SpatialIndexExperiment5Dhbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie5_gantt_1node_flush_merge_dhbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie5Dhvbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment5Dhvbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_gantt_1node_flush_merge_dhvbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie5Rtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment5Rtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_gantt_1node_flush_merge_rtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie5Shbtree.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment5Shbtree/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_gantt_1node_flush_merge_shbtree.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        dataGenStartTime = sie5Sif.getDataGenStartTimeStamp();
-        ncLogReportBuilder = new NCLogReportBuilder(expHomePath + "SpatialIndexExperiment5Sif/logs/a1_node1.log");
-        sb.setLength(0);
-        sb.append(ncLogReportBuilder.getFlushMergeEventAsGanttChartFormat(dataGenStartTime));
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_gantt_1node_flush_merge_sif.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResponseTime() throws Exception {
-        sb.setLength(0);
-        sb.append("# sie5 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie5Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie5Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie5Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(2)).append("\n");
-        sb.append("0.01,").append(sie5Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie5Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper.openOutputFile(outputFilePath
-                + "sie5_select_query_response_time.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie5 select query response time report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie5Dhbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(0)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(0)).append("\n");
-        sb.append("0.0001,").append(sie5Dhbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(1)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(1)).append("\n");
-        sb.append("0.001,").append(sie5Dhbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(2)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(2)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_select_query_response_time1.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie5 select query response time 2 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.01,").append(sie5Dhbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(3)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(3)).append("\n");
-        sb.append("0.1,").append(sie5Dhbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Rtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Shbtree.getSelectQueryResponseTime(4)).append(",")
-                .append(sie5Sif.getSelectQueryResponseTime(4)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_select_query_response_time2.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-
-    public void generateSelectQueryResultCount() throws Exception {
-
-        sb.setLength(0);
-        sb.append("# sie5 select query result count report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie5Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie5Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie5Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(2)).append("\n");
-        sb.append("0.01,").append(sie5Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie5Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(4)).append("\n");
-
-        FileOutputStream fos = ReportBuilderHelper
-                .openOutputFile(outputFilePath + "sie5_select_query_result_count.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie5 select query result count 1 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.00001,").append(sie5Dhbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(0)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(0)).append("\n");
-        sb.append("0.0001,").append(sie5Dhbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(1)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(1)).append("\n");
-        sb.append("0.001,").append(sie5Dhbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(2)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(2)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_select_query_result_count1.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-
-        sb.setLength(0);
-        sb.append("# sie5 select query result count 2 report\n");
-
-        sb.append("radius, dhbtree, dhvbtree, rtree, shbtree, sif\n");
-        sb.append("0.01,").append(sie5Dhbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(3)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(3)).append("\n");
-        sb.append("0.1,").append(sie5Dhbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Dhvbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Rtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Shbtree.getSelectQueryResultCount(4)).append(",")
-                .append(sie5Sif.getSelectQueryResultCount(4)).append("\n");
-
-        fos = ReportBuilderHelper.openOutputFile(outputFilePath + "sie5_select_query_result_count2.txt");
-        fos.write(sb.toString().getBytes());
-        ReportBuilderHelper.closeOutputFile(fos);
-    }
-}
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/foo.eps b/asterixdb/asterix-experiments/src/main/resources/gantt/foo.eps
deleted file mode 100644
index 0f13788..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/foo.eps
+++ /dev/null
@@ -1,928 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: foo.eps
-%%Creator: gnuplot 4.6 patchlevel 5
-%%CreationDate: Sat Jul 11 23:19:23 2015
-%%DocumentFonts: (atend)
-%%BoundingBox: 50 50 410 302
-%%EndComments
-%%BeginProlog
-/gnudict 256 dict def
-gnudict begin
-%
-% The following true/false flags may be edited by hand if desired.
-% The unit line width and grayscale image gamma correction may also be changed.
-%
-/Color true def
-/Blacktext false def
-/Solid true def
-/Dashlength 1 def
-/Landscape false def
-/Level1 false def
-/Rounded false def
-/ClipToBoundingBox false def
-/SuppressPDFMark false def
-/TransparentPatterns false def
-/gnulinewidth 5.000 def
-/userlinewidth gnulinewidth def
-/Gamma 1.0 def
-/BackgroundColor {-1.000 -1.000 -1.000} def
-%
-/vshift -46 def
-/dl1 {
-  10.0 Dashlength mul mul
-  Rounded { currentlinewidth 0.75 mul sub dup 0 le { pop 0.01 } if } if
-} def
-/dl2 {
-  10.0 Dashlength mul mul
-  Rounded { currentlinewidth 0.75 mul add } if
-} def
-/hpt_ 31.5 def
-/vpt_ 31.5 def
-/hpt hpt_ def
-/vpt vpt_ def
-/doclip {
-  ClipToBoundingBox {
-    newpath 50 50 moveto 410 50 lineto 410 302 lineto 50 302 lineto closepath
-    clip
-  } if
-} def
-%
-% Gnuplot Prolog Version 4.6 (September 2012)
-%
-%/SuppressPDFMark true def
-%
-/M {moveto} bind def
-/L {lineto} bind def
-/R {rmoveto} bind def
-/V {rlineto} bind def
-/N {newpath moveto} bind def
-/Z {closepath} bind def
-/C {setrgbcolor} bind def
-/f {rlineto fill} bind def
-/g {setgray} bind def
-/Gshow {show} def   % May be redefined later in the file to support UTF-8
-/vpt2 vpt 2 mul def
-/hpt2 hpt 2 mul def
-/Lshow {currentpoint stroke M 0 vshift R 
-	Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
-/Rshow {currentpoint stroke M dup stringwidth pop neg vshift R
-	Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
-/Cshow {currentpoint stroke M dup stringwidth pop -2 div vshift R 
-	Blacktext {gsave 0 setgray show grestore} {show} ifelse} def
-/UP {dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
-  /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def} def
-/DL {Color {setrgbcolor Solid {pop []} if 0 setdash}
- {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse} def
-/BL {stroke userlinewidth 2 mul setlinewidth
-	Rounded {1 setlinejoin 1 setlinecap} if} def
-/AL {stroke userlinewidth 2 div setlinewidth
-	Rounded {1 setlinejoin 1 setlinecap} if} def
-/UL {dup gnulinewidth mul /userlinewidth exch def
-	dup 1 lt {pop 1} if 10 mul /udl exch def} def
-/PL {stroke userlinewidth setlinewidth
-	Rounded {1 setlinejoin 1 setlinecap} if} def
-3.8 setmiterlimit
-% Default Line colors
-/LCw {1 1 1} def
-/LCb {0 0 0} def
-/LCa {0 0 0} def
-/LC0 {1 0 0} def
-/LC1 {0 1 0} def
-/LC2 {0 0 1} def
-/LC3 {1 0 1} def
-/LC4 {0 1 1} def
-/LC5 {1 1 0} def
-/LC6 {0 0 0} def
-/LC7 {1 0.3 0} def
-/LC8 {0.5 0.5 0.5} def
-% Default Line Types
-/LTw {PL [] 1 setgray} def
-/LTb {BL [] LCb DL} def
-/LTa {AL [1 udl mul 2 udl mul] 0 setdash LCa setrgbcolor} def
-/LT0 {PL [] LC0 DL} def
-/LT1 {PL [4 dl1 2 dl2] LC1 DL} def
-/LT2 {PL [2 dl1 3 dl2] LC2 DL} def
-/LT3 {PL [1 dl1 1.5 dl2] LC3 DL} def
-/LT4 {PL [6 dl1 2 dl2 1 dl1 2 dl2] LC4 DL} def
-/LT5 {PL [3 dl1 3 dl2 1 dl1 3 dl2] LC5 DL} def
-/LT6 {PL [2 dl1 2 dl2 2 dl1 6 dl2] LC6 DL} def
-/LT7 {PL [1 dl1 2 dl2 6 dl1 2 dl2 1 dl1 2 dl2] LC7 DL} def
-/LT8 {PL [2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 2 dl2 2 dl1 4 dl2] LC8 DL} def
-/Pnt {stroke [] 0 setdash gsave 1 setlinecap M 0 0 V stroke grestore} def
-/Dia {stroke [] 0 setdash 2 copy vpt add M
-  hpt neg vpt neg V hpt vpt neg V
-  hpt vpt V hpt neg vpt V closepath stroke
-  Pnt} def
-/Pls {stroke [] 0 setdash vpt sub M 0 vpt2 V
-  currentpoint stroke M
-  hpt neg vpt neg R hpt2 0 V stroke
- } def
-/Box {stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
-  0 vpt2 neg V hpt2 0 V 0 vpt2 V
-  hpt2 neg 0 V closepath stroke
-  Pnt} def
-/Crs {stroke [] 0 setdash exch hpt sub exch vpt add M
-  hpt2 vpt2 neg V currentpoint stroke M
-  hpt2 neg 0 R hpt2 vpt2 V stroke} def
-/TriU {stroke [] 0 setdash 2 copy vpt 1.12 mul add M
-  hpt neg vpt -1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt 1.62 mul V closepath stroke
-  Pnt} def
-/Star {2 copy Pls Crs} def
-/BoxF {stroke [] 0 setdash exch hpt sub exch vpt add M
-  0 vpt2 neg V hpt2 0 V 0 vpt2 V
-  hpt2 neg 0 V closepath fill} def
-/TriUF {stroke [] 0 setdash vpt 1.12 mul add M
-  hpt neg vpt -1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt 1.62 mul V closepath fill} def
-/TriD {stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
-  hpt neg vpt 1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt -1.62 mul V closepath stroke
-  Pnt} def
-/TriDF {stroke [] 0 setdash vpt 1.12 mul sub M
-  hpt neg vpt 1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt -1.62 mul V closepath fill} def
-/DiaF {stroke [] 0 setdash vpt add M
-  hpt neg vpt neg V hpt vpt neg V
-  hpt vpt V hpt neg vpt V closepath fill} def
-/Pent {stroke [] 0 setdash 2 copy gsave
-  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
-  closepath stroke grestore Pnt} def
-/PentF {stroke [] 0 setdash gsave
-  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
-  closepath fill grestore} def
-/Circle {stroke [] 0 setdash 2 copy
-  hpt 0 360 arc stroke Pnt} def
-/CircleF {stroke [] 0 setdash hpt 0 360 arc fill} def
-/C0 {BL [] 0 setdash 2 copy moveto vpt 90 450 arc} bind def
-/C1 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 90 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C2 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 90 180 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C3 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 180 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C4 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 180 270 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C5 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 90 arc
-	2 copy moveto
-	2 copy vpt 180 270 arc closepath fill
-	vpt 0 360 arc} bind def
-/C6 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 90 270 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C7 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 270 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C8 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 270 360 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C9 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 270 450 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C10 {BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
-	2 copy moveto
-	2 copy vpt 90 180 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C11 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 180 arc closepath fill
-	2 copy moveto
-	2 copy vpt 270 360 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C12 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 180 360 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C13 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 0 90 arc closepath fill
-	2 copy moveto
-	2 copy vpt 180 360 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/C14 {BL [] 0 setdash 2 copy moveto
-	2 copy vpt 90 360 arc closepath fill
-	vpt 0 360 arc} bind def
-/C15 {BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
-	vpt 0 360 arc closepath} bind def
-/Rec {newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
-	neg 0 rlineto closepath} bind def
-/Square {dup Rec} bind def
-/Bsquare {vpt sub exch vpt sub exch vpt2 Square} bind def
-/S0 {BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare} bind def
-/S1 {BL [] 0 setdash 2 copy vpt Square fill Bsquare} bind def
-/S2 {BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
-/S3 {BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare} bind def
-/S4 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
-/S5 {BL [] 0 setdash 2 copy 2 copy vpt Square fill
-	exch vpt sub exch vpt sub vpt Square fill Bsquare} bind def
-/S6 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare} bind def
-/S7 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
-	2 copy vpt Square fill Bsquare} bind def
-/S8 {BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare} bind def
-/S9 {BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare} bind def
-/S10 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
-	Bsquare} bind def
-/S11 {BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
-	Bsquare} bind def
-/S12 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare} bind def
-/S13 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
-	2 copy vpt Square fill Bsquare} bind def
-/S14 {BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
-	2 copy exch vpt sub exch vpt Square fill Bsquare} bind def
-/S15 {BL [] 0 setdash 2 copy Bsquare fill Bsquare} bind def
-/D0 {gsave translate 45 rotate 0 0 S0 stroke grestore} bind def
-/D1 {gsave translate 45 rotate 0 0 S1 stroke grestore} bind def
-/D2 {gsave translate 45 rotate 0 0 S2 stroke grestore} bind def
-/D3 {gsave translate 45 rotate 0 0 S3 stroke grestore} bind def
-/D4 {gsave translate 45 rotate 0 0 S4 stroke grestore} bind def
-/D5 {gsave translate 45 rotate 0 0 S5 stroke grestore} bind def
-/D6 {gsave translate 45 rotate 0 0 S6 stroke grestore} bind def
-/D7 {gsave translate 45 rotate 0 0 S7 stroke grestore} bind def
-/D8 {gsave translate 45 rotate 0 0 S8 stroke grestore} bind def
-/D9 {gsave translate 45 rotate 0 0 S9 stroke grestore} bind def
-/D10 {gsave translate 45 rotate 0 0 S10 stroke grestore} bind def
-/D11 {gsave translate 45 rotate 0 0 S11 stroke grestore} bind def
-/D12 {gsave translate 45 rotate 0 0 S12 stroke grestore} bind def
-/D13 {gsave translate 45 rotate 0 0 S13 stroke grestore} bind def
-/D14 {gsave translate 45 rotate 0 0 S14 stroke grestore} bind def
-/D15 {gsave translate 45 rotate 0 0 S15 stroke grestore} bind def
-/DiaE {stroke [] 0 setdash vpt add M
-  hpt neg vpt neg V hpt vpt neg V
-  hpt vpt V hpt neg vpt V closepath stroke} def
-/BoxE {stroke [] 0 setdash exch hpt sub exch vpt add M
-  0 vpt2 neg V hpt2 0 V 0 vpt2 V
-  hpt2 neg 0 V closepath stroke} def
-/TriUE {stroke [] 0 setdash vpt 1.12 mul add M
-  hpt neg vpt -1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt 1.62 mul V closepath stroke} def
-/TriDE {stroke [] 0 setdash vpt 1.12 mul sub M
-  hpt neg vpt 1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt -1.62 mul V closepath stroke} def
-/PentE {stroke [] 0 setdash gsave
-  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
-  closepath stroke grestore} def
-/CircE {stroke [] 0 setdash 
-  hpt 0 360 arc stroke} def
-/Opaque {gsave closepath 1 setgray fill grestore 0 setgray closepath} def
-/DiaW {stroke [] 0 setdash vpt add M
-  hpt neg vpt neg V hpt vpt neg V
-  hpt vpt V hpt neg vpt V Opaque stroke} def
-/BoxW {stroke [] 0 setdash exch hpt sub exch vpt add M
-  0 vpt2 neg V hpt2 0 V 0 vpt2 V
-  hpt2 neg 0 V Opaque stroke} def
-/TriUW {stroke [] 0 setdash vpt 1.12 mul add M
-  hpt neg vpt -1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt 1.62 mul V Opaque stroke} def
-/TriDW {stroke [] 0 setdash vpt 1.12 mul sub M
-  hpt neg vpt 1.62 mul V
-  hpt 2 mul 0 V
-  hpt neg vpt -1.62 mul V Opaque stroke} def
-/PentW {stroke [] 0 setdash gsave
-  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
-  Opaque stroke grestore} def
-/CircW {stroke [] 0 setdash 
-  hpt 0 360 arc Opaque stroke} def
-/BoxFill {gsave Rec 1 setgray fill grestore} def
-/Density {
-  /Fillden exch def
-  currentrgbcolor
-  /ColB exch def /ColG exch def /ColR exch def
-  /ColR ColR Fillden mul Fillden sub 1 add def
-  /ColG ColG Fillden mul Fillden sub 1 add def
-  /ColB ColB Fillden mul Fillden sub 1 add def
-  ColR ColG ColB setrgbcolor} def
-/BoxColFill {gsave Rec PolyFill} def
-/PolyFill {gsave Density fill grestore grestore} def
-/h {rlineto rlineto rlineto gsave closepath fill grestore} bind def
-%
-% PostScript Level 1 Pattern Fill routine for rectangles
-% Usage: x y w h s a XX PatternFill
-%	x,y = lower left corner of box to be filled
-%	w,h = width and height of box
-%	  a = angle in degrees between lines and x-axis
-%	 XX = 0/1 for no/yes cross-hatch
-%
-/PatternFill {gsave /PFa [ 9 2 roll ] def
-  PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate
-  PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec
-  TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
-  clip
-  currentlinewidth 0.5 mul setlinewidth
-  /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def
-  0 0 M PFa 5 get rotate PFs -2 div dup translate
-  0 1 PFs PFa 4 get div 1 add floor cvi
-	{PFa 4 get mul 0 M 0 PFs V} for
-  0 PFa 6 get ne {
-	0 1 PFs PFa 4 get div 1 add floor cvi
-	{PFa 4 get mul 0 2 1 roll M PFs 0 V} for
- } if
-  stroke grestore} def
-%
-/languagelevel where
- {pop languagelevel} {1} ifelse
- 2 lt
-	{/InterpretLevel1 true def}
-	{/InterpretLevel1 Level1 def}
- ifelse
-%
-% PostScript level 2 pattern fill definitions
-%
-/Level2PatternFill {
-/Tile8x8 {/PaintType 2 /PatternType 1 /TilingType 1 /BBox [0 0 8 8] /XStep 8 /YStep 8}
-	bind def
-/KeepColor {currentrgbcolor [/Pattern /DeviceRGB] setcolorspace} bind def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke} 
->> matrix makepattern
-/Pat1 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop 0 0 M 8 8 L 0 8 M 8 0 L stroke
-	0 4 M 4 8 L 8 4 L 4 0 L 0 4 L stroke}
->> matrix makepattern
-/Pat2 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop 0 0 M 0 8 L
-	8 8 L 8 0 L 0 0 L fill}
->> matrix makepattern
-/Pat3 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop -4 8 M 8 -4 L
-	0 12 M 12 0 L stroke}
->> matrix makepattern
-/Pat4 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop -4 0 M 8 12 L
-	0 -4 M 12 8 L stroke}
->> matrix makepattern
-/Pat5 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop -2 8 M 4 -4 L
-	0 12 M 8 -4 L 4 12 M 10 0 L stroke}
->> matrix makepattern
-/Pat6 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop -2 0 M 4 12 L
-	0 -4 M 8 12 L 4 -4 M 10 8 L stroke}
->> matrix makepattern
-/Pat7 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop 8 -2 M -4 4 L
-	12 0 M -4 8 L 12 4 M 0 10 L stroke}
->> matrix makepattern
-/Pat8 exch def
-<< Tile8x8
- /PaintProc {0.5 setlinewidth pop 0 -2 M 12 4 L
-	-4 0 M 12 8 L -4 4 M 8 10 L stroke}
->> matrix makepattern
-/Pat9 exch def
-/Pattern1 {PatternBgnd KeepColor Pat1 setpattern} bind def
-/Pattern2 {PatternBgnd KeepColor Pat2 setpattern} bind def
-/Pattern3 {PatternBgnd KeepColor Pat3 setpattern} bind def
-/Pattern4 {PatternBgnd KeepColor Landscape {Pat5} {Pat4} ifelse setpattern} bind def
-/Pattern5 {PatternBgnd KeepColor Landscape {Pat4} {Pat5} ifelse setpattern} bind def
-/Pattern6 {PatternBgnd KeepColor Landscape {Pat9} {Pat6} ifelse setpattern} bind def
-/Pattern7 {PatternBgnd KeepColor Landscape {Pat8} {Pat7} ifelse setpattern} bind def
-} def
-%
-%
-%End of PostScript Level 2 code
-%
-/PatternBgnd {
-  TransparentPatterns {} {gsave 1 setgray fill grestore} ifelse
-} def
-%
-% Substitute for Level 2 pattern fill codes with
-% grayscale if Level 2 support is not selected.
-%
-/Level1PatternFill {
-/Pattern1 {0.250 Density} bind def
-/Pattern2 {0.500 Density} bind def
-/Pattern3 {0.750 Density} bind def
-/Pattern4 {0.125 Density} bind def
-/Pattern5 {0.375 Density} bind def
-/Pattern6 {0.625 Density} bind def
-/Pattern7 {0.875 Density} bind def
-} def
-%
-% Now test for support of Level 2 code
-%
-Level1 {Level1PatternFill} {Level2PatternFill} ifelse
-%
-/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont
-dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall
-currentdict end definefont pop
-Level1 SuppressPDFMark or 
-{} {
-/SDict 10 dict def
-systemdict /pdfmark known not {
-  userdict /pdfmark systemdict /cleartomark get put
-} if
-SDict begin [
-  /Title (foo.eps)
-  /Subject (gnuplot plot)
-  /Creator (gnuplot 4.6 patchlevel 5)
-  /Author (kisskys)
-%  /Producer (gnuplot)
-%  /Keywords ()
-  /CreationDate (Sat Jul 11 23:19:23 2015)
-  /DOCINFO pdfmark
-end
-} ifelse
-end
-%%EndProlog
-%%Page: 1 1
-gnudict begin
-gsave
-doclip
-50 50 translate
-0.050 0.050 scale
-0 setgray
-newpath
-(Helvetica) findfont 140 scalefont setfont
-BackgroundColor 0 lt 3 1 roll 0 lt exch 0 lt or or not {BackgroundColor C 1.000 0 0 7200.00 5040.00 BoxColFill} if
-gsave % colour palette begin
-/maxcolors 0 def
-/HSV2RGB {  exch dup 0.0 eq {pop exch pop dup dup} % achromatic gray
-  { /HSVs exch def /HSVv exch def 6.0 mul dup floor dup 3 1 roll sub
-     /HSVf exch def /HSVi exch cvi def /HSVp HSVv 1.0 HSVs sub mul def
-	 /HSVq HSVv 1.0 HSVs HSVf mul sub mul def 
-	 /HSVt HSVv 1.0 HSVs 1.0 HSVf sub mul sub mul def
-	 /HSVi HSVi 6 mod def 0 HSVi eq {HSVv HSVt HSVp}
-	 {1 HSVi eq {HSVq HSVv HSVp}{2 HSVi eq {HSVp HSVv HSVt}
-	 {3 HSVi eq {HSVp HSVq HSVv}{4 HSVi eq {HSVt HSVp HSVv}
-	 {HSVv HSVp HSVq} ifelse} ifelse} ifelse} ifelse} ifelse
-  } ifelse} def
-/Constrain {
-  dup 0 lt {0 exch pop}{dup 1 gt {1 exch pop} if} ifelse} def
-/YIQ2RGB {
-  3 copy -1.702 mul exch -1.105 mul add add Constrain 4 1 roll
-  3 copy -0.647 mul exch -0.272 mul add add Constrain 5 1 roll
-  0.621 mul exch -0.956 mul add add Constrain 3 1 roll } def
-/CMY2RGB {  1 exch sub exch 1 exch sub 3 2 roll 1 exch sub 3 1 roll exch } def
-/XYZ2RGB {  3 copy -0.9017 mul exch -0.1187 mul add exch 0.0585 mul exch add
-  Constrain 4 1 roll 3 copy -0.0279 mul exch 1.999 mul add exch
-  -0.9844 mul add Constrain 5 1 roll -0.2891 mul exch -0.5338 mul add
-  exch 1.91 mul exch add Constrain 3 1 roll} def
-/SelectSpace {ColorSpace (HSV) eq {HSV2RGB}{ColorSpace (XYZ) eq {
-  XYZ2RGB}{ColorSpace (CMY) eq {CMY2RGB}{ColorSpace (YIQ) eq {YIQ2RGB}
-  if} ifelse} ifelse} ifelse} def
-/InterpolatedColor true def
-/grayindex {/gidx 0 def
-  {GrayA gidx get grayv ge {exit} if /gidx gidx 1 add def} loop} def
-/dgdx {grayv GrayA gidx get sub GrayA gidx 1 sub get
-  GrayA gidx get sub div} def 
-/redvalue {RedA gidx get RedA gidx 1 sub get
-  RedA gidx get sub dgdxval mul add} def
-/greenvalue {GreenA gidx get GreenA gidx 1 sub get
-  GreenA gidx get sub dgdxval mul add} def
-/bluevalue {BlueA gidx get BlueA gidx 1 sub get
-  BlueA gidx get sub dgdxval mul add} def
-/interpolate {
-  grayindex grayv GrayA gidx get sub abs 1e-5 le
-    {RedA gidx get GreenA gidx get BlueA gidx get}
-    {/dgdxval dgdx def redvalue greenvalue bluevalue} ifelse} def
-/GrayA [0 .2 .4 .6 .8 1 ] def
-/RedA [1 1 .8 .8 .8 1 ] def
-/GreenA [.8 .8 .8 1 1 1 ] def
-/BlueA [.8 1 1 1 .8 .8 ] def
-/pm3dround {maxcolors 0 gt {dup 1 ge
-	{pop 1} {maxcolors mul floor maxcolors 1 sub div} ifelse} if} def
-/pm3dGamma 1.0 1.5 Gamma mul div def
-/ColorSpace (RGB) def
-Color InterpolatedColor or { % COLOUR vs. GRAY map
-  InterpolatedColor { %% Interpolation vs. RGB-Formula
-    /g {stroke pm3dround /grayv exch def interpolate
-        SelectSpace setrgbcolor} bind def
-  }{
-  /g {stroke pm3dround dup cF7 Constrain exch dup cF5 Constrain exch cF15 Constrain 
-       SelectSpace setrgbcolor} bind def
-  } ifelse
-}{
-  /g {stroke pm3dround pm3dGamma exp setgray} bind def
-} ifelse
-1.000 UL
-LTb
-LCb setrgbcolor
-378 1277 M
-63 0 V
-5687 0 R
--63 0 V
--5771 0 R
-(S2) Rshow
-1.000 UL
-LTb
-LCb setrgbcolor
-378 2660 M
-63 0 V
-5687 0 R
--63 0 V
--5771 0 R
-(A) Rshow
-1.000 UL
-LTb
-LCb setrgbcolor
-378 4042 M
-63 0 V
-5687 0 R
--63 0 V
--5771 0 R
-(S0) Rshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-378 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-378 448 M
-0 63 V
-0 4360 R
-0 -63 V
-378 308 M
-( 0) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-1336 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-1336 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 5) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-2295 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-2295 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 10) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-3253 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-3253 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 15) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-4211 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-4211 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 20) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-5170 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-5170 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 25) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTa
-LCa setrgbcolor
-6128 448 M
-0 4423 V
-stroke
-LTb
-LCb setrgbcolor
-6128 448 M
-0 63 V
-0 4360 R
-0 -63 V
-0 -4500 R
-( 30) Cshow
-1.000 UL
-LTb
-LCb setrgbcolor
-1.000 UL
-LTb
-LCb setrgbcolor
-378 4871 N
-378 448 L
-5750 0 V
-0 4423 V
--5750 0 V
-Z stroke
-LCb setrgbcolor
-112 2659 M
-currentpoint gsave translate -270 rotate 0 0 M
-() Cshow
-grestore
-LTb
-LCb setrgbcolor
-3253 98 M
-(time) Cshow
-LTb
-3253 4801 M
-() Cshow
-1.000 UL
-LTb
-0 g 0.800 378 3489 575 1106 BoxColFill
-LCb setrgbcolor
-378 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-0 g 0.800 953 2107 383 1105 BoxColFill
-LCb setrgbcolor
-953 2107 M
-0 1105 V
-383 0 V
-0 -1105 V
--383 0 V
-stroke
-LTb
-.2 g 0.800 1145 3489 575 1106 BoxColFill
-LCb setrgbcolor
-1145 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-0 g 0.800 1336 724 575 1106 BoxColFill
-LCb setrgbcolor
-1336 724 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.2 g 0.800 1720 2107 766 1105 BoxColFill
-LCb setrgbcolor
-1720 2107 M
-0 1105 V
-766 0 V
-0 -1105 V
--766 0 V
-stroke
-LTb
-.4 g 0.800 1911 3489 575 1106 BoxColFill
-LCb setrgbcolor
-1911 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.2 g 0.800 2486 724 575 1106 BoxColFill
-LCb setrgbcolor
-2486 724 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.4 g 0.800 2486 2107 575 1105 BoxColFill
-LCb setrgbcolor
-2486 2107 M
-0 1105 V
-575 0 V
-0 -1105 V
--575 0 V
-stroke
-LTb
-.6 g 0.800 2678 3489 575 1106 BoxColFill
-LCb setrgbcolor
-2678 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.4 g 0.800 3061 724 575 1106 BoxColFill
-LCb setrgbcolor
-3061 724 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.6 g 0.800 3253 2107 767 1105 BoxColFill
-LCb setrgbcolor
-3253 2107 M
-0 1105 V
-767 0 V
-0 -1105 V
--767 0 V
-stroke
-LTb
-.8 g 0.800 3445 3489 575 1106 BoxColFill
-LCb setrgbcolor
-3445 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.6 g 0.800 4020 724 575 1106 BoxColFill
-LCb setrgbcolor
-4020 724 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.8 g 0.800 4020 2107 575 1105 BoxColFill
-LCb setrgbcolor
-4020 2107 M
-0 1105 V
-575 0 V
-0 -1105 V
--575 0 V
-stroke
-LTb
-1 g 0.800 4211 3489 575 1106 BoxColFill
-LCb setrgbcolor
-4211 3489 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-.8 g 0.800 4595 724 575 1106 BoxColFill
-LCb setrgbcolor
-4595 724 M
-0 1106 V
-575 0 V
-0 -1106 V
--575 0 V
-stroke
-LTb
-1 g 0.800 4786 2107 767 1105 BoxColFill
-LCb setrgbcolor
-4786 2107 M
-0 1105 V
-767 0 V
-0 -1105 V
--767 0 V
-stroke
-LTb
-1 g 0.800 5553 724 574 1106 BoxColFill
-LCb setrgbcolor
-5553 724 M
-0 1106 V
-574 0 V
-0 -1106 V
--574 0 V
-1.000 UP
-stroke
-LTb
-LCb setrgbcolor
-% Begin plot #1
-6.000 UL
-LT0
-0 g LCb setrgbcolor
-6548 4801 M
-(0) Rshow
-LT0
-0 g 6632 4801 M
-399 0 V
-% End plot #1
-% Begin plot #2
-stroke
-LT1
-.2 g LCb setrgbcolor
-6548 4661 M
-(1) Rshow
-LT1
-.2 g 6632 4661 M
-399 0 V
-% End plot #2
-% Begin plot #3
-stroke
-LT2
-.4 g LCb setrgbcolor
-6548 4521 M
-(2) Rshow
-LT2
-.4 g 6632 4521 M
-399 0 V
-% End plot #3
-% Begin plot #4
-stroke
-LT3
-.6 g LCb setrgbcolor
-6548 4381 M
-(3) Rshow
-LT3
-.6 g 6632 4381 M
-399 0 V
-% End plot #4
-% Begin plot #5
-stroke
-LT4
-.8 g LCb setrgbcolor
-6548 4241 M
-(4) Rshow
-LT4
-.8 g 6632 4241 M
-399 0 V
-% End plot #5
-% Begin plot #6
-stroke
-LT5
-1 g LCb setrgbcolor
-6548 4101 M
-(5) Rshow
-LT5
-1 g 6632 4101 M
-399 0 V
-% End plot #6
-stroke
-1.000 UL
-LTb
-LCb setrgbcolor
-378 4871 N
-378 448 L
-5750 0 V
-0 4423 V
--5750 0 V
-Z stroke
-1.000 UP
-1.000 UL
-LTb
-LCb setrgbcolor
-grestore % colour palette end
-stroke
-grestore
-end
-showpage
-%%Trailer
-%%DocumentFonts: Helvetica
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/foo.gpl b/asterixdb/asterix-experiments/src/main/resources/gantt/foo.gpl
deleted file mode 100644
index d1e62bf..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/foo.gpl
+++ /dev/null
@@ -1,35 +0,0 @@
-set xrange [0.000000:30.000000]
-set yrange [0.400000:3.600000]
-set autoscale x
-set xlabel "time"
-set ylabel ""
-set title ""
-set ytics ("A" 2, "S2" 1, "S0" 3)
-set key outside width +2
-set grid xtics
-set palette model RGB defined ( 0 1.0 0.8 0.8, 1 1.0 0.8 1.0, 2 0.8 0.8 1.0, 3 0.8 1.0 1.0, 4 0.8 1.0 0.8, 5 1.0 1.0 0.8 )
-unset colorbox
-set object 1 rectangle from 0.000000, 2.6 to 3.000000, 3.4 fillcolor palette frac 0.00 fillstyle solid 0.8
-set object 2 rectangle from 3.000000, 1.6 to 5.000000, 2.4 fillcolor palette frac 0.00 fillstyle solid 0.8
-set object 3 rectangle from 4.000000, 2.6 to 7.000000, 3.4 fillcolor palette frac 0.20 fillstyle solid 0.8
-set object 4 rectangle from 5.000000, 0.6 to 8.000000, 1.4 fillcolor palette frac 0.00 fillstyle solid 0.8
-set object 5 rectangle from 7.000000, 1.6 to 11.000000, 2.4 fillcolor palette frac 0.20 fillstyle solid 0.8
-set object 6 rectangle from 8.000000, 2.6 to 11.000000, 3.4 fillcolor palette frac 0.40 fillstyle solid 0.8
-set object 7 rectangle from 11.000000, 0.6 to 14.000000, 1.4 fillcolor palette frac 0.20 fillstyle solid 0.8
-set object 8 rectangle from 11.000000, 1.6 to 14.000000, 2.4 fillcolor palette frac 0.40 fillstyle solid 0.8
-set object 9 rectangle from 12.000000, 2.6 to 15.000000, 3.4 fillcolor palette frac 0.60 fillstyle solid 0.8
-set object 10 rectangle from 14.000000, 0.6 to 17.000000, 1.4 fillcolor palette frac 0.40 fillstyle solid 0.8
-set object 11 rectangle from 15.000000, 1.6 to 19.000000, 2.4 fillcolor palette frac 0.60 fillstyle solid 0.8
-set object 12 rectangle from 16.000000, 2.6 to 19.000000, 3.4 fillcolor palette frac 0.80 fillstyle solid 0.8
-set object 13 rectangle from 19.000000, 0.6 to 22.000000, 1.4 fillcolor palette frac 0.60 fillstyle solid 0.8
-set object 14 rectangle from 19.000000, 1.6 to 22.000000, 2.4 fillcolor palette frac 0.80 fillstyle solid 0.8
-set object 15 rectangle from 20.000000, 2.6 to 23.000000, 3.4 fillcolor palette frac 1.00 fillstyle solid 0.8
-set object 16 rectangle from 22.000000, 0.6 to 25.000000, 1.4 fillcolor palette frac 0.80 fillstyle solid 0.8
-set object 17 rectangle from 23.000000, 1.6 to 27.000000, 2.4 fillcolor palette frac 1.00 fillstyle solid 0.8
-set object 18 rectangle from 27.000000, 0.6 to 30.000000, 1.4 fillcolor palette frac 1.00 fillstyle solid 0.8
-plot -1 title "0" with lines linecolor palette frac 0.00  linewidth 6, \
-	-1 title "1" with lines linecolor palette frac 0.20  linewidth 6, \
-	-1 title "2" with lines linecolor palette frac 0.40  linewidth 6, \
-	-1 title "3" with lines linecolor palette frac 0.60  linewidth 6, \
-	-1 title "4" with lines linecolor palette frac 0.80  linewidth 6, \
-	-1 title "5" with lines linecolor palette frac 1.00  linewidth 6
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/gantt.py b/asterixdb/asterix-experiments/src/main/resources/gantt/gantt.py
deleted file mode 100644
index d232c4d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/gantt.py
+++ /dev/null
@@ -1,432 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 2013, Los Alamos National Security, LLC
-# All rights reserved.
-#
-# Copyright 2013. Los Alamos National Security, LLC. This software
-# was produced under U.S. Government contract DE-AC52-06NA25396 for
-# Los Alamos National Laboratory (LANL), which is operated by Los
-# Alamos National Security, LLC for the U.S. Department of Energy.
-# The U.S. Government has rights to use, reproduce, and distribute
-# this software.  NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL
-# SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
-# ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
-# to produce derivative works, such modified software should be clearly
-# marked, so as not to confuse it with the version available from LANL.
-#
-#
-# Additionally, redistribution and use in source and binary forms,
-# with or without modification, are permitted provided that the
-# following conditions are met:
-#
-#  *  Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer.
-#
-#  *  Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution.
-#
-#  *  Neither the name of Los Alamos National Security, LLC, Los Alamos
-#     National Laboratory, LANL, the U.S. Government, nor the names of
-#     its contributors may be used to endorse or promote products derived
-#     from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# (preceding license text from https://raw.githubusercontent.com/lanl/Gazebo/f4e0a22ab655880abe993f15c6bae2b483e66353/LICENSE
-#  provided here as a convenience)
-#
-# # TODO:
-# - Task colors:
-#     - User-defined using config file.
-#     - Automagically chosen from color space.
-#     - Advanced algorithm (contact Hannes Pretorius).
-# - Koos' specs:
-#     - Resources and tasks sorted in read-in order (default)
-#       or alphabetically (flag).
-#     - Have proper gnuplot behavior on windows/x11, eps/pdf, latex terminals.
-#     - Create and implement algorithm for critical path analysis.
-# - Split generic stuff into a Gantt class, and specific stuff into the main.
-#
-# gantt.py ganttfile | gnuplot
-
-import itertools, sys, getopt
-from ConfigParser import ConfigParser
-
-rectangleHeight = 0.8  #: Height of a rectangle in units.
-
-class Activity(object):
-    """
-    Container for activity information.
-
-    @ivar resource: Resource name.
-    @type resource: C{str}
-
-    @ivar start: Start time of the activity.
-    @type start: C{float}
-
-    @ivar stop: End time of the activity.
-    @type stop: C{float}
-
-    @ivar task: Name of the task/activity being performed.
-    @type task: C{str}
-    """
-    def __init__(self, resource, start, stop, task):
-        self.resource = resource
-        self.start = start
-        self.stop = stop
-        self.task = task
-
-class Rectangle(object):
-    """
-    Container for rectangle information.
-    """
-    def __init__(self, bottomleft, topright, fillcolor):
-        self.bottomleft = bottomleft
-        self.topright = topright
-        self.fillcolor = fillcolor
-        self.fillstyle = 'solid 0.8'
-        self.linewidth = 2
-
-class ColorBook(object):
-    """
-    Class managing colors.
-
-    @ivar colors
-    @ivar palette
-    @ivar prefix
-    """
-    def __init__(self, colorfname, tasks):
-        """
-        Construct a ColorBook object.
-
-        @param colorfname: Name of the color config file (if specified).
-        @type  colorfname: C{str} or C{None}
-
-        @param tasks: Existing task types.
-        @type  tasks: C{list} of C{str}
-        """
-        if colorfname:
-            values = self.load_config(colorfname, tasks)
-        else:
-            values = self.fixed(tasks)
-
-        self.colors, self.palette, self.prefix = values
-
-
-    def load_config(self, colorfname, tasks):
-        """
-        Read task colors from a configuration file.
-        """
-        palettedef = 'model RGB'
-        colorprefix = 'rgb'
-
-        # Read in task colors from configuration file
-        config = ConfigParser()
-        config.optionxform = str # makes option names case sensitive
-        config.readfp(open(colorfname, 'r'))
-        # Colors are RGB colornames
-        colors = dict(config.items('Colors'))
-
-        # Raise KeyError if no color is specified for a task
-        nocolors = [t for t in tasks if not colors.has_key(t)]
-        if nocolors:
-            msg = 'Could not find task color for ' + ', '.join(nocolors)
-            raise KeyError(msg)
-
-        return colors, palettedef, colorprefix
-
-    def fixed(self, tasks):
-        """
-        Pick colors from a pre-defined palette.
-        """
-        # Set task colors
-        # SE colors
-        # (see http://w3.wtb.tue.nl/nl/organisatie/systems_engineering/\
-        #      info_for_se_students/how2make_a_poster/pictures/)
-        # Decrease the 0.8 values for less transparent colors.
-        se_palette = {"se_red":   (1.0, 0.8, 0.8),
-                     "se_pink":   (1.0, 0.8, 1.0),
-                     "se_violet": (0.8, 0.8, 1.0),
-                     "se_blue":   (0.8, 1.0, 1.0),
-                     "se_green":  (0.8, 1.0, 0.8),
-                     "se_yellow": (1.0, 1.0, 0.8)}
-        se_gradient = ["se_red", "se_pink", "se_violet",
-                       "se_blue", "se_green", "se_yellow"]
-        se_palettedef = '( ' + \
-                        ', '.join(('%d ' % n +
-                                   ' '.join((str(x) for x in se_palette[c]))
-                                   for n, c in enumerate(se_gradient))) + \
-                        ' )'
-
-        palettedef = 'model RGB defined %s' % se_palettedef
-        colorprefix = 'palette frac'
-        # Colors are fractions from the palette defined
-        colors = dict((t, '%0.2f' % (float(n)/(len(tasks)-1)))
-                       for n, t in enumerate(tasks))
-
-        return colors, palettedef, colorprefix
-
-class DummyClass(object):
-    """
-    Dummy class for storing option values in.
-    """
-
-
-def make_rectangles(activities, resource_map, colors):
-    """
-    Construct a collection of L{Rectangle} for all activities.
-
-    @param activities: Activities being performed.
-    @type  activities: C{iterable} of L{Activity}
-
-    @param resource_map: Indices of all resources.
-    @type  resource_map: C{dict} of C{str} to C{int}
-
-    @param colors: Colors for all tasks.
-    @type  colors: C{dict} of C{str} to C{str}
-
-    @return: Collection of rectangles to draw.
-    @rtype:  C{list} of L{Rectangle}
-    """
-    rectangles = []
-    for act in activities:
-        ypos = resource_map[act.resource]
-        bottomleft = (act.start, ypos - 0.5 * rectangleHeight)
-        topright = (act.stop, ypos + 0.5 * rectangleHeight)
-        fillcolor = colors[act.task]
-        rectangles.append(Rectangle(bottomleft, topright, fillcolor))
-
-    return rectangles
-
-
-def load_ganttfile(ganttfile):
-    """
-    Load the resource/task file.
-
-    @param ganttfile: Name of the gantt file.
-    @type  ganttfile: C{str}
-
-    @return: Activities loaded from the file, collection of
-             (resource, start, end, task) activities.
-    @rtype:  C{list} of L{Activity}
-    """
-    activities = []
-    for line in open(ganttfile, 'r').readlines():
-        line = line.strip().split()
-        if len(line) == 0:
-            continue
-        resource = line[0]
-        start = float(line[1])
-        stop = float(line[2])
-        task = line[3]
-        activities.append(Activity(resource, start, stop, task))
-
-    return activities
-
-def make_unique_tasks_resources(alphasort, activities):
-    """
-    Construct collections of unique task names and resource names.
-
-    @param alphasort: Sort resources and tasks alphabetically.
-    @type  alphasort: C{bool}
-
-    @param activities: Activities to draw.
-    @type  activities: C{list} of L{Activity}
-
-    @return: Collections of task-types and resources.
-    @rtype:  C{list} of C{str}, C{list} of C{str}
-    """
-    # Create list with unique resources and tasks in activity order.
-    resources = []
-    tasks = []
-    for act in activities:
-        if act.resource not in resources:
-            resources.append(act.resource)
-        if act.task not in tasks:
-            tasks.append(act.task)
-
-    # Sort such that resources and tasks appear in alphabetical order
-    if alphasort:
-        resources.sort()
-        tasks.sort()
-
-    # Resources are read from top (y=max) to bottom (y=1)
-    resources.reverse()
-
-    return tasks, resources
-
-
-def generate_plotdata(activities, resources, tasks, rectangles, options,
-                     resource_map, color_book):
-    """
-    Generate Gnuplot lines.
-    """
-    xmin = 0
-    xmax = max(act.stop for act in activities)
-    ymin = 0 + (rectangleHeight / 2)
-    ymax = len(resources) + 1 - (rectangleHeight / 2)
-    xlabel = 'time'
-    ylabel = ''
-    title = options.plottitle
-    ytics = ''.join(['(',
-                     ', '.join(('"%s" %d' % item)
-                                for item in resource_map.iteritems()),
-                     ')'])
-    # outside and 2 characters from the graph
-    key_position = 'outside width +2'
-    grid_tics = 'xtics'
-
-    # Set plot dimensions
-    plot_dimensions = ['set xrange [%f:%f]' % (xmin, xmax),
-                       'set yrange [%f:%f]' % (ymin, ymax),
-                       'set autoscale x', # extends x axis to next tic mark
-                       'set xlabel "%s"' % xlabel,
-                       'set ylabel "%s"' % ylabel,
-                       'set title "%s"' % title,
-                       'set ytics %s' % ytics,
-                       'set key %s' % key_position,
-                       'set grid %s' % grid_tics,
-                       'set palette %s' % color_book.palette,
-                       'unset colorbox']
-
-    # Generate gnuplot rectangle objects
-    plot_rectangles = (' '.join(['set object %d rectangle' % n,
-                                 'from %f, %0.1f' % r.bottomleft,
-                                 'to %f, %0.1f' % r.topright,
-                                 'fillcolor %s %s' % (color_book.prefix,
-                                                      r.fillcolor),
-                                 'fillstyle solid 0.8'])
-                    for n, r in itertools.izip(itertools.count(1), rectangles))
-
-    # Generate gnuplot lines
-    plot_lines = ['plot ' +
-                  ', \\\n\t'.join(' '.join(['-1',
-                                      'title "%s"' % t,
-                                      'with lines',
-                                      'linecolor %s %s ' % (color_book.prefix,
-                                                        color_book.colors[t]),
-                                      'linewidth 6'])
-                            for t in tasks)]
-
-    return plot_dimensions, plot_rectangles, plot_lines
-
-def write_data(plot_dimensions, plot_rectangles, plot_lines, fname):
-    """
-    Write plot data out to file or screen.
-
-    @param fname: Name of the output file, if specified.
-    @type  fname: C{str}  (??)
-    """
-    if fname:
-        g = open(fname, 'w')
-        g.write('\n'.join(itertools.chain(plot_dimensions, plot_rectangles,
-                                          plot_lines)))
-        g.close()
-    else:
-        print '\n'.join(itertools.chain(plot_dimensions, plot_rectangles,
-                                        plot_lines))
-
-def fmt_opt(short, long, arg, text):
-    if arg:
-        return '-%s %s, --%s%s\t%s' % (short[:-1], arg, long, arg, text)
-    else:
-        return '-%s, --%s\t%s' % (short, long, text)
-
-def make_default_options():
-    option_values = DummyClass()
-    option_values.outputfile = ''
-    option_values.colorfile = ''
-    option_values.alphasort = False
-    option_values.plottitle = ''
-    return option_values
-
-def process_options():
-    """
-    Handle option and command-line argument processing.
-
-    @return: Options and gantt input filename.
-    @rtype:  L{OptionParser} options, C{str}
-    """
-    optdefs = [('o:', 'output=', 'FILE', 'Write output to FILE.'),
-               ('c:', 'color=',  'FILE', 'Use task colors (RGB) as defined in '
-                'configuration FILE (in RGB triplets,\n\t\t\t\tGnuplot '
-                'colornames, or hexadecimal representations.'),
-               ('a', 'alpha', '', '\t\tShow resources and tasks in '
-                'alphabetical order.'),
-               ('t:','title=', 'TITLE', 'Set plot title to TITLE (between '
-                'double quotes).'),
-               ('h', 'help', '', '\t\tShow online help.')]
-    short_opts = ''.join(opt[0] for opt in optdefs if opt[0])
-    long_opts  = [opt[1] for opt in optdefs if opt[1]]
-    usage_text = 'gantt.py [options] gantt-file\nwhere\n' + \
-            '\n'.join('    ' + fmt_opt(*opt) for opt in optdefs)
-
-    option_values = make_default_options()
-
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], short_opts, long_opts)
-    except getopt.GetoptError, err:
-        sys.stderr.write("gantt.py: %s\n" % err)
-        sys.exit(2)
-
-    for opt, optval in opts:
-        if opt in ('-o', '--output'):
-            option_values.outputfile = optval
-            continue
-        if opt in ('-c', '--color'):
-            option_values.colorfile = optval
-            continue
-        if opt in ('-a', '--alphasort'):
-            option_values.alphasort = True
-            continue
-        if opt in ('-t', '--title'):
-            option_values.plottitle = optval
-            continue
-        if opt in ('-h', '--help'):
-            print usage_text
-            sys.exit(0)
-
-    # Check if correct number of arguments is supplied
-    if len(args) != 1:
-        sys.stderr.write('gantty.py: incorrect number of arguments '
-                         '(task/resource file expected)\n')
-        sys.exit(1)
-
-    return option_values, args[0]
-
-def compute(options, ganttfile):
-    activities = load_ganttfile(ganttfile)
-    tasks, resources = make_unique_tasks_resources(options.alphasort,
-                                                   activities)
-
-    # Assign indices to resources
-    resource_map = dict(itertools.izip(resources, itertools.count(1)))
-
-    color_book = ColorBook(options.colorfile, tasks)
-    rectangles = make_rectangles(activities, resource_map, color_book.colors)
-
-    plot_dims, plot_rects, plot_lines = \
-            generate_plotdata(activities, resources, tasks, rectangles,
-                              options, resource_map, color_book)
-
-    write_data(plot_dims, plot_rects, plot_lines, options.outputfile)
-
-def run():
-    options, ganttfile = process_options()
-    compute(options, ganttfile)
-
-
-if __name__ == '__main__':
-    run()
-
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.gpl b/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.gpl
deleted file mode 100644
index 02ac5e3..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.gpl
+++ /dev/null
@@ -1,35 +0,0 @@
-set xrange [0.000000:30.000000]
-set yrange [0.400000:3.600000]
-set autoscale x
-set xlabel "time"
-set ylabel ""
-set title "Gantt chart"
-set ytics ("A" 2, "S2" 1, "S0" 3)
-set key outside width +2
-set grid xtics
-set palette model RGB
-unset colorbox
-set object 1 rectangle from 0.000000, 2.6 to 3.000000, 3.4 fillcolor rgb "#0092B5" fillstyle solid 0.8
-set object 2 rectangle from 3.000000, 1.6 to 5.000000, 2.4 fillcolor rgb "#0092B5" fillstyle solid 0.8
-set object 3 rectangle from 4.000000, 2.6 to 7.000000, 3.4 fillcolor rgb "#00AC82" fillstyle solid 0.8
-set object 4 rectangle from 5.000000, 0.6 to 8.000000, 1.4 fillcolor rgb "#0092B5" fillstyle solid 0.8
-set object 5 rectangle from 7.000000, 1.6 to 11.000000, 2.4 fillcolor rgb "#00AC82" fillstyle solid 0.8
-set object 6 rectangle from 8.000000, 2.6 to 11.000000, 3.4 fillcolor rgb "#84D200" fillstyle solid 0.8
-set object 7 rectangle from 11.000000, 0.6 to 14.000000, 1.4 fillcolor rgb "#00AC82" fillstyle solid 0.8
-set object 8 rectangle from 11.000000, 1.6 to 14.000000, 2.4 fillcolor rgb "#84D200" fillstyle solid 0.8
-set object 9 rectangle from 12.000000, 2.6 to 15.000000, 3.4 fillcolor rgb "#CEDF00" fillstyle solid 0.8
-set object 10 rectangle from 14.000000, 0.6 to 17.000000, 1.4 fillcolor rgb "#84D200" fillstyle solid 0.8
-set object 11 rectangle from 15.000000, 1.6 to 19.000000, 2.4 fillcolor rgb "#CEDF00" fillstyle solid 0.8
-set object 12 rectangle from 16.000000, 2.6 to 19.000000, 3.4 fillcolor rgb "#FFDD00" fillstyle solid 0.8
-set object 13 rectangle from 19.000000, 0.6 to 22.000000, 1.4 fillcolor rgb "#CEDF00" fillstyle solid 0.8
-set object 14 rectangle from 19.000000, 1.6 to 22.000000, 2.4 fillcolor rgb "#FFDD00" fillstyle solid 0.8
-set object 15 rectangle from 20.000000, 2.6 to 23.000000, 3.4 fillcolor rgb "#FF9A00" fillstyle solid 0.8
-set object 16 rectangle from 22.000000, 0.6 to 25.000000, 1.4 fillcolor rgb "#FFDD00" fillstyle solid 0.8
-set object 17 rectangle from 23.000000, 1.6 to 27.000000, 2.4 fillcolor rgb "#FF9A00" fillstyle solid 0.8
-set object 18 rectangle from 27.000000, 0.6 to 30.000000, 1.4 fillcolor rgb "#FF9A00" fillstyle solid 0.8
-plot -1 title "0" with lines linecolor rgb "#0092B5"  linewidth 6, \
-	-1 title "1" with lines linecolor rgb "#00AC82"  linewidth 6, \
-	-1 title "2" with lines linecolor rgb "#84D200"  linewidth 6, \
-	-1 title "3" with lines linecolor rgb "#CEDF00"  linewidth 6, \
-	-1 title "4" with lines linecolor rgb "#FFDD00"  linewidth 6, \
-	-1 title "5" with lines linecolor rgb "#FF9A00"  linewidth 6
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.plt b/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.plt
deleted file mode 100644
index 7f48291..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.plt
+++ /dev/null
@@ -1,4 +0,0 @@
-set terminal postscript eps color solid
-set output "foo.eps"
-load "foo.gpl"
-unset output
diff --git a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.txt b/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.txt
deleted file mode 100644
index 26a5641..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/gantt/vargantt1.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-S0	0.00000000000000000000	3.00000000000000000000	0
-A	3.00000000000000000000	5.00000000000000000000	0
-S0	4.00000000000000000000	7.00000000000000000000	1
-S2	5.00000000000000000000	8.00000000000000000000	0
-A	7.00000000000000000000	11.00000000000000000000	1
-S0	8.00000000000000000000	11.00000000000000000000	2
-S2	11.00000000000000000000	14.00000000000000000000	1
-A	11.00000000000000000000	14.00000000000000000000	2
-S0	12.00000000000000000000	15.00000000000000000000	3
-S2	14.00000000000000000000	17.00000000000000000000	2
-A	15.00000000000000000000	19.00000000000000000000	3
-S0	16.00000000000000000000	19.00000000000000000000	4
-S2	19.00000000000000000000	22.00000000000000000000	3
-A	19.00000000000000000000	22.00000000000000000000	4
-S0	20.00000000000000000000	23.00000000000000000000	5
-S2	22.00000000000000000000	25.00000000000000000000	4
-A	23.00000000000000000000	27.00000000000000000000	5
-S2	27.00000000000000000000	30.00000000000000000000	5
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/1.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/1.aql
deleted file mode 100644
index 6eb5766..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/1.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_a.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_a.aql
deleted file mode 100644
index 2eb8592..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_a.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_b.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_b.aql
deleted file mode 100644
index d6ee9d6..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_b.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index RtreeLocationIdx on Tweets(sender-location) type rtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_c.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_c.aql
deleted file mode 100644
index 4f8b9e3..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_c.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index InvMessageTextIdx on Tweets(message-text) type ngram(3);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_d.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_d.aql
deleted file mode 100644
index 1deedbd..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/2_d.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index InvMessageTextIdx on Tweets(message-text) type keyword;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/3.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/3.aql
deleted file mode 100644
index 55a07c6..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/3.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
-create index RtreeLocationIdx on Tweets(sender-location) type rtree;
-create index InvMessageKeywordIdx on Tweets(message-text) type keyword;
-create index InvMessagetNgramIdx on Tweets(message-text) type ngram(3);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_1.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_1.aql
deleted file mode 100644
index 40c65d8..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_1.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx1 on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_2.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_2.aql
deleted file mode 100644
index f7def5b..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_2.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx1 on Tweets(btree-extra-field1) type btree;
-create index BtreeExtraFieldIdx2 on Tweets(btree-extra-field2) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_4.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_4.aql
deleted file mode 100644
index 911b5f3..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_4.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx1 on Tweets(btree-extra-field1) type btree;
-create index BtreeExtraFieldIdx2 on Tweets(btree-extra-field2) type btree;
-create index BtreeExtraFieldIdx3 on Tweets(btree-extra-field3) type btree;
-create index BtreeExtraFieldIdx4 on Tweets(btree-extra-field4) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_8.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_8.aql
deleted file mode 100644
index f7067b4..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/4_8.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index BtreeExtraFieldIdx1 on Tweets(btree-extra-field1) type btree;
-create index BtreeExtraFieldIdx2 on Tweets(btree-extra-field2) type btree;
-create index BtreeExtraFieldIdx3 on Tweets(btree-extra-field3) type btree;
-create index BtreeExtraFieldIdx4 on Tweets(btree-extra-field4) type btree;
-create index BtreeExtraFieldIdx5 on Tweets(btree-extra-field5) type btree;
-create index BtreeExtraFieldIdx6 on Tweets(btree-extra-field6) type btree;
-create index BtreeExtraFieldIdx7 on Tweets(btree-extra-field7) type btree;
-create index BtreeExtraFieldIdx8 on Tweets(btree-extra-field8) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1.aql
deleted file mode 100644
index 9c08872..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets1(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1_count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1_count.aql
deleted file mode 100644
index 0bc53eb..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_1_count.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count1 := count(for $t in dataset Tweets1 return $t.tweetid)
-return {"count1": $count1}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2.aql
deleted file mode 100644
index 890766e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets1(TweetMessageType) primary key tweetid;
-create dataset Tweets2(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2_count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2_count.aql
deleted file mode 100644
index bee105a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_2_count.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count1 := count(for $t in dataset Tweets1 return $t.tweetid)
-return {"count1": $count1}
-
-let $count2 := count(for $t in dataset Tweets2 return $t.tweetid)
-return {"count2": $count2}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3.aql
deleted file mode 100644
index 0324584..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets1(TweetMessageType) primary key tweetid;
-create dataset Tweets2(TweetMessageType) primary key tweetid;
-create dataset Tweets3(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3_count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3_count.aql
deleted file mode 100644
index 8e614ea..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_3_count.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count1 := count(for $t in dataset Tweets1 return $t.tweetid)
-return {"count1": $count1}
-
-let $count2 := count(for $t in dataset Tweets2 return $t.tweetid)
-return {"count2": $count2}
-
-let $count3 := count(for $t in dataset Tweets3 return $t.tweetid)
-return {"count3": $count3}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4.aql
deleted file mode 100644
index 2b24c6f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets1(TweetMessageType) primary key tweetid;
-create dataset Tweets2(TweetMessageType) primary key tweetid;
-create dataset Tweets3(TweetMessageType) primary key tweetid;
-create dataset Tweets4(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4_count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4_count.aql
deleted file mode 100644
index de74c9f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/5_4_count.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count1 := count(for $t in dataset Tweets1 return $t.tweetid)
-return {"count1": $count1}
-
-let $count2 := count(for $t in dataset Tweets2 return $t.tweetid)
-return {"count2": $count2}
-
-let $count3 := count(for $t in dataset Tweets3 return $t.tweetid)
-return {"count3": $count3}
-
-let $count4 := count(for $t in dataset Tweets4 return $t.tweetid)
-return {"count4": $count4}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_a.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_a.aql
deleted file mode 100644
index 2098d0c..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_a.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="3"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_b.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_b.aql
deleted file mode 100644
index dad66bb..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_b.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy prefix(("max-mergable-component-size"="1073741824"),
-                                                                                           ("max-tolerance-component-count"="5"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_c.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_c.aql
deleted file mode 100644
index d329403..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/6_c.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="1000000"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_a.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_a.aql
deleted file mode 100644
index 2098d0c..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_a.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="3"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_b.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_b.aql
deleted file mode 100644
index dad66bb..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_b.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy prefix(("max-mergable-component-size"="1073741824"),
-                                                                                           ("max-tolerance-component-count"="5"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_c.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_c.aql
deleted file mode 100644
index d329403..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_c.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="1000000"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_compact.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_compact.aql
deleted file mode 100644
index ce94a1d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_compact.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-compact dataset Tweets;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_d.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_d.aql
deleted file mode 100644
index d329403..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_d.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="1000000"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q1.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q1.aql
deleted file mode 100644
index 62faf74..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q1.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count := count(
-for $t in dataset Tweets
-where $t.tweetid = int64("1")
-return $t
-)
-return $count
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q2.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q2.aql
deleted file mode 100644
index 746fa30..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/7_q2.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count := count(
-for $t in dataset Tweets
-where $t.tweetid >= int64("1") and $t.tweetid <= int64("1000")
-return $t
-)
-return $count
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_a.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_a.aql
deleted file mode 100644
index 9864438..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_a.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="3"));
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_b.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_b.aql
deleted file mode 100644
index 6a6c13a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_b.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy prefix(("max-mergable-component-size"="1073741824"),
-                                                                                           ("max-tolerance-component-count"="5"));
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_c.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_c.aql
deleted file mode 100644
index e6c7c59..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_c.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="1000000"));
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_compact.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_compact.aql
deleted file mode 100644
index ce94a1d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_compact.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-compact dataset Tweets;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_d.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_d.aql
deleted file mode 100644
index e6c7c59..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_d.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create dataset Tweets(TweetMessageType) primary key tweetid using compaction policy constant(("num-components"="1000000"));
-create index BtreeExtraFieldIdx on Tweets(btree-extra-field1) type btree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q1.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q1.aql
deleted file mode 100644
index 7a471eb..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q1.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count := count(
-for $t in dataset Tweets
-where $t.tweetid = int64("$KEY$")
-return $t
-)
-return {"pointLookupCount": $count}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q2.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q2.aql
deleted file mode 100644
index 314342d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/8_q2.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count := count(
-for $t in dataset Tweets
-where $t.btree-extra-field1 > $LKEY$ and $t.btree-extra-field1 <= $HKEY$
-return $t
-)
-return {"rangeQueryCount": $count}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg.sqlpp
deleted file mode 100644
index 1eb25b9..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg.sqlpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use experiments;
-
-select element array_avg((
-select element "string-length"(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2013-07-16T14:31:31') and
-      g.send_time <= datetime('2014-01-12T14:31:31')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-3-months.sqlpp
deleted file mode 100644
index 0c5cba5..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-3-months.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2007-12-24T16:03:59') and
-      g.send_time <= datetime('2008-03-23T16:03:59')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-6-months.sqlpp
deleted file mode 100644
index e562e96..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-6-months.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2013-07-16T14:31:31') and
-      g.send_time <= datetime('2014-01-12T14:31:31')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-day.sqlpp
deleted file mode 100644
index 2d64c99..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-day.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2010-10-10T03:13:47') and
-      g.send_time <= datetime('2010-10-11T03:13:47')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-hour.sqlpp
deleted file mode 100644
index 43d7346..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-hour.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2007-05-26T08:58:39') and
-      g.send_time <= datetime('2007-05-26T09:58:39')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-minute.sqlpp
deleted file mode 100644
index d9b428a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-minute.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2001-05-10T12:16:12') and
-      g.send_time <= datetime('2001-05-10T12:17:12')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-month.sqlpp
deleted file mode 100644
index 12bec95..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-month.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2007-03-01T21:43:22') and
-      g.send_time <= datetime('2007-03-31T21:43:22')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-week.sqlpp
deleted file mode 100644
index 523d71a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/agg-week.sqlpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element array_avg((
-select element `string-length`(g.message)
-from GleambookMessages as g
-where g.send_time > datetime('2008-10-10T21:33:13') and
-      g.send_time <= datetime('2008-10-17T21:33:13')
-));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-3-months.sqlpp
deleted file mode 100644
index cd9cd45..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-3-months.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2007-03-16T01:34:15') and
-      message.send_time < datetime('2007-06-14T01:34:15')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-6-months.sqlpp
deleted file mode 100644
index 8799563..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-6-months.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2009-10-31T05:05:19') and
-      message.send_time < datetime('2010-04-29T05:05:19')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-day.sqlpp
deleted file mode 100644
index 9161ad1..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-day.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2008-08-22T16:20:12') and
-      message.send_time < datetime('2008-08-23T16:20:12')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-hour.sqlpp
deleted file mode 100644
index d595678..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-hour.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2012-04-21T12:40:53') and
-      message.send_time < datetime('2012-04-21T13:40:53')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-minute.sqlpp
deleted file mode 100644
index b0b0d01..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-minute.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2006-04-15T23:53:14') and
-      message.send_time < datetime('2006-04-15T23:54:14')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-month.sqlpp
deleted file mode 100644
index d19fdca..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-month.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2003-02-22T05:05:02') and
-      message.send_time < datetime('2003-03-24T05:05:02')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-week.sqlpp
deleted file mode 100644
index e6bc45e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin-week.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookUsers as user,
-        GleambookMessages as message
-  where message.author_id = user.id and
-      message.send_time >= datetime('2008-08-08T15:24:25') and
-      message.send_time < datetime('2008-08-15T15:24:25')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-3-months.sqlpp
deleted file mode 100644
index 6aa0b37..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-3-months.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2007-03-16T01:34:15') and
-      message.send_time < datetime('2007-06-14T01:34:15')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-6-months.sqlpp
deleted file mode 100644
index 6cc6b74..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-6-months.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2009-10-31T05:05:19') and
-      message.send_time < datetime('2010-04-29T05:05:19')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-day.sqlpp
deleted file mode 100644
index fca5e88..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-day.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2008-08-22T16:20:12') and
-      message.send_time < datetime('2008-08-23T16:20:12')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-hour.sqlpp
deleted file mode 100644
index 8e1b54e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-hour.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2012-04-21T12:40:53') and
-      message.send_time < datetime('2012-04-21T13:40:53')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-minute.sqlpp
deleted file mode 100644
index 3a20a3d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-minute.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2006-04-15T23:53:14') and
-      message.send_time < datetime('2006-04-15T23:54:14')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-month.sqlpp
deleted file mode 100644
index 34a1018..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-month.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2003-02-22T05:05:02') and
-      message.send_time < datetime('2003-03-24T05:05:02')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-week.sqlpp
deleted file mode 100644
index 0215b5b..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/countjoin_index-week.sqlpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-array_count(
- (
-  select element {
-  'uname': user.name,
-  'alias': user.alias,
-  'send_time': message.send_time,
-  'message': substring(message.message, 1, 31)
-  }
-  from  GleambookMessages as message,
-        GleambookUsers as user
-  where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2008-08-08T15:24:25') and
-      message.send_time < datetime('2008-08-15T15:24:25')
- )
-);
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-3-months.sqlpp
deleted file mode 100644
index 8eb459c..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-3-months.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2000-04-03T17:47:01') and
-      message.send_time < datetime('2000-07-02T17:47:01');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-6-months.sqlpp
deleted file mode 100644
index 93e51f7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-6-months.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2001-10-22T09:18:11') and
-      message.send_time < datetime('2002-04-20T09:18:11');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-day.sqlpp
deleted file mode 100644
index 14c5890..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-day.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2002-08-25T10:53:14') and
-      message.send_time < datetime('2002-08-26T10:53:14');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-hour.sqlpp
deleted file mode 100644
index 9d8086e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-hour.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2000-03-28T13:29:53') and
-      message.send_time < datetime('2000-03-28T14:29:53');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-minute.sqlpp
deleted file mode 100644
index 806f0ec..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-minute.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2013-08-31T04:21:21') and
-      message.send_time < datetime('2013-08-31T04:22:21');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-month.sqlpp
deleted file mode 100644
index 91f9387..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-month.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2014-01-27T06:38:19') and
-      message.send_time < datetime('2014-02-26T06:38:19');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-week.sqlpp
deleted file mode 100644
index ee51260e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join-week.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2012-08-03T11:02:50') and
-      message.send_time < datetime('2012-08-10T11:02:50');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-3-months.sqlpp
deleted file mode 100644
index 6e2ae07..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-3-months.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2000-04-03T17:47:01') and
-      message.send_time < datetime('2000-07-02T17:47:01');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-6-months.sqlpp
deleted file mode 100644
index 7b4a04f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-6-months.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2001-10-22T09:18:11') and
-      message.send_time < datetime('2002-04-20T09:18:11');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-day.sqlpp
deleted file mode 100644
index f29bcac..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-day.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2002-08-25T10:53:14') and
-      message.send_time < datetime('2002-08-26T10:53:14');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-hour.sqlpp
deleted file mode 100644
index 48268f8..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-hour.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2000-03-28T13:29:53') and
-      message.send_time < datetime('2000-03-28T14:29:53');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-minute.sqlpp
deleted file mode 100644
index 9532eb1..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-minute.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2013-08-31T04:21:21') and
-      message.send_time < datetime('2013-08-31T04:22:21');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-month.sqlpp
deleted file mode 100644
index 47e4c24..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-month.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2014-01-27T06:38:19') and
-      message.send_time < datetime('2014-02-26T06:38:19');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-week.sqlpp
deleted file mode 100644
index ab1d0c9..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/join_indexnl-week.sqlpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select element {
-'uname': user.name,
-'alias': user.alias,
-'send_time': message.send_time,
-'message': substring(message.message, 1, 31)
-}
-from GleambookMessages as message,
-     GleambookUsers as user
-where message.author_id /*+ indexnl */= user.id and
-      message.send_time >= datetime('2012-08-03T11:02:50') and
-      message.send_time < datetime('2012-08-10T11:02:50');
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-3-months.sqlpp
deleted file mode 100644
index c33b35a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-3-months.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2004-04-21T04:24:26') and
-      message.send_time < datetime('2004-07-20T04:24:26')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-6-months.sqlpp
deleted file mode 100644
index 2429518..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-6-months.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2003-06-04T05:29:58') and
-      message.send_time < datetime('2003-12-01T05:29:58')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-day.sqlpp
deleted file mode 100644
index a56b64a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-day.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2011-08-06T12:22:42') and
-      message.send_time < datetime('2011-08-07T12:22:42')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-hour.sqlpp
deleted file mode 100644
index 9b927fa..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-hour.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2004-03-25T01:06:02') and
-      message.send_time < datetime('2004-03-25T02:06:02')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-minute.sqlpp
deleted file mode 100644
index d062885..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-minute.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2003-07-04T21:31:33') and
-      message.send_time < datetime('2003-07-04T21:32:33')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-month.sqlpp
deleted file mode 100644
index 4b6bc23..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-month.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2003-07-11T10:56:04') and
-      message.send_time < datetime('2003-08-10T10:56:04')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-week.sqlpp
deleted file mode 100644
index 2383b8b..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby-week.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from GleambookUsers as user,
-     GleambookMessages as message
-where message.author_id = user.id and
-      message.send_time >= datetime('2010-04-10T18:10:27') and
-      message.send_time < datetime('2010-04-17T18:10:27')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-3-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-3-months.sqlpp
deleted file mode 100644
index b8a1f86..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-3-months.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2004-04-21T04:24:26') and
-      message.send_time < datetime('2004-07-20T04:24:26')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-6-months.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-6-months.sqlpp
deleted file mode 100644
index 5eb521f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-6-months.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2003-06-04T05:29:58') and
-      message.send_time < datetime('2003-12-01T05:29:58')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-day.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-day.sqlpp
deleted file mode 100644
index 3e73634..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-day.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2011-08-06T12:22:42') and
-      message.send_time < datetime('2011-08-07T12:22:42')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-hour.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-hour.sqlpp
deleted file mode 100644
index 411ae32..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-hour.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2004-03-25T01:06:02') and
-      message.send_time < datetime('2004-03-25T02:06:02')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-minute.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-minute.sqlpp
deleted file mode 100644
index e781aee..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-minute.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2003-07-04T21:31:33') and
-      message.send_time < datetime('2003-07-04T21:32:33')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-month.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-month.sqlpp
deleted file mode 100644
index f3eb7e0..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-month.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2003-07-11T10:56:04') and
-      message.send_time < datetime('2003-08-10T10:56:04')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-week.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-week.sqlpp
deleted file mode 100644
index c8e0328..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/joingby_index-week.sqlpp
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use SocialNetworkData;
-
-select uid as uid, c as array_count
-from  GleambookMessages as message,
-      GleambookUsers as user
-where message.author_id /*+ indexnl */ = user.id and
-      message.send_time >= datetime('2010-04-10T18:10:27') and
-      message.send_time < datetime('2010-04-17T18:10:27')
-group by user.id AS uid
-let c = array_count(message)
-order by c desc
-limit 10;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/select-all.sqlpp b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/select-all.sqlpp
deleted file mode 100644
index 29f104f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/agg_bench/select-all.sqlpp
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use SocialNetworkData;
-select * from GleambookMessages;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_gram_tokens.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_gram_tokens.aql
deleted file mode 100644
index b0f4cf9..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_gram_tokens.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $avg := avg(for $t in dataset Tweets
-let $c := count(gram-tokens($t.message-text, 3, 1))
-return $c)
-return {"avg-grams-per-record": $avg}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_keyword_tokens.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_keyword_tokens.aql
deleted file mode 100644
index b57b335..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/avg_keyword_tokens.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $avg := avg(for $t in dataset Tweets
-let $c := count(word-tokens($t.message-text))
-return $c)
-return {"avg-keywords-per-record": $avg}
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_1_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_1_ingest.aql
deleted file mode 100644
index c3fdde7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_1_ingest.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,
-                128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets1 using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_2_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_2_ingest.aql
deleted file mode 100644
index 6606894..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_2_ingest.aql
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,
-                128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002,128.195.9.24:10002,128.195.9.25:10002,
-                128.195.9.26:10002,128.195.9.27:10002,128.195.9.28:10002,128.195.9.29:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets1 using policy Br;
-connect feed TweetFeed2 to dataset Tweets2 using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_3_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_3_ingest.aql
deleted file mode 100644
index d39a1eb..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_3_ingest.aql
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,
-                128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002,128.195.9.24:10002,128.195.9.25:10002,
-                128.195.9.26:10002,128.195.9.27:10002,128.195.9.28:10002,128.195.9.29:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed3 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10003,128.195.9.23:10003,128.195.9.24:10003,128.195.9.25:10003,
-                128.195.9.26:10003,128.195.9.27:10003,128.195.9.28:10003,128.195.9.29:10003"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets1 using policy Br;
-connect feed TweetFeed2 to dataset Tweets2 using policy Br;
-connect feed TweetFeed3 to dataset Tweets3 using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_4_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_4_ingest.aql
deleted file mode 100644
index b7bbf77..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/5_4_ingest.aql
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,
-                128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002,128.195.9.24:10002,128.195.9.25:10002,
-                128.195.9.26:10002,128.195.9.27:10002,128.195.9.28:10002,128.195.9.29:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed3 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10003,128.195.9.23:10003,128.195.9.24:10003,128.195.9.25:10003,
-                128.195.9.26:10003,128.195.9.27:10003,128.195.9.28:10003,128.195.9.29:10003"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed4 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10004,128.195.9.23:10004,128.195.9.24:10004,128.195.9.25:10004,
-                128.195.9.26:10004,128.195.9.27:10004,128.195.9.28:10004,128.195.9.29:10004"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets1 using policy Br;
-connect feed TweetFeed2 to dataset Tweets2 using policy Br;
-connect feed TweetFeed3 to dataset Tweets3 using policy Br;
-connect feed TweetFeed4 to dataset Tweets4 using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/asterix_base_4_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/asterix_base_4_ingest.aql
deleted file mode 100644
index 5ca2eb8..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/asterix_base_4_ingest.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SocialNetworkData;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest.aql
deleted file mode 100644
index 54c40a4..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="127.0.0.1:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Br;
-connect feed TweetFeed2 to dataset Tweets using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest_query.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest_query.aql
deleted file mode 100644
index 410aa6d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_1_ingest_query.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="127.0.0.1:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="127.0.0.1:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Brittle;
-connect feed TweetFeed2 to dataset Tweets using policy Brittle;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_2_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_2_ingest.aql
deleted file mode 100644
index 0889520..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_2_ingest.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Br;
-connect feed TweetFeed2 to dataset Tweets using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_4_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_4_ingest.aql
deleted file mode 100644
index c372a6a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_4_ingest.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002,128.195.9.24:10002,128.195.9.25:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Br;
-connect feed TweetFeed2 to dataset Tweets using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest.aql
deleted file mode 100644
index 7a9335a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest.aql
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-create feed TweetFeed2 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10002,128.195.9.23:10002,128.195.9.24:10002,128.195.9.25:10002,128.195.9.26:10002,128.195.9.27:10002,128.195.9.28:10002,128.195.9.29:10002"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Br;
-connect feed TweetFeed2 to dataset Tweets using policy Br;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest_query.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest_query.aql
deleted file mode 100644
index b23df9c..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_8_ingest_query.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="128.195.9.22:10001,128.195.9.23:10001,128.195.9.24:10001,128.195.9.25:10001,128.195.9.26:10001,128.195.9.27:10001,128.195.9.28:10001,128.195.9.29:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets using policy Brittle;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_types.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_types.aql
deleted file mode 100644
index 274e62b..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/base_types.aql
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-drop dataverse experiments if exists;
-create dataverse experiments;
-use dataverse experiments;
-
-create type TwitterUserType as closed {
-    screen-name: string,
-    lang: string,
-    friends_count: int32,
-    statuses_count: int32,
-    name: string,
-    followers_count: int32
-}
-
-create type TweetMessageType as closed {
-    tweetid: int64,
-    user: TwitterUserType,
-    sender-location: point,
-    send-time: datetime,
-    referred-topics: {{ string }},
-    message-text: string,
-
-    btree-extra-field1: int32,
-    btree-extra-field2: int32,
-    btree-extra-field3: int32,
-    btree-extra-field4: int32,
-    btree-extra-field5: int32,
-    btree-extra-field6: int32,
-    btree-extra-field7: int32,
-    btree-extra-field8: int32,
-    dummy-size-adjuster: string // 357
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/nuclear_base_4_ingest.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/nuclear_base_4_ingest.aql
deleted file mode 100644
index 5b276a2..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/nuclear_base_4_ingest.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-create feed TweetFeed1 using socket_adapter
-(
-    ("sockets"="radium.ics.uci.edu:10001,promethium.ics.uci.edu:10001,actinium.ics.uci.edu:10001"),
-    ("address-type"="IP"),
-    ("type-name"="TweetMessageType"),
-    ("format"="adm"),
-    ("duration"="1200")
-);
-
-set wait-for-completion-feed "false";
-
-connect feed TweetFeed1 to dataset Tweets;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/perf_types.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/perf_types.aql
deleted file mode 100644
index a6aea40..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/base/perf_types.aql
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-drop dataverse SocialNetworkData if exists;
-create dataverse SocialNetworkData;
-use dataverse SocialNetworkData;
-
-  create type EmploymentType as {
-    organization: string,
-    start_date: date,
-    end_date: date?
-  }
-
-  create type GleambookUserType as {
-    id: string,
-    alias: string,
-    name: string,
-    user_since: datetime,
-    friend_ids: {{ string }},
-    employment: [EmploymentType]
-  }
-
-  create type GleambookMessageType as {
-    message_id: string,
-    author_id: string,
-    in_response_to: string?,
-    sender_location: point,
-    send_time: datetime,
-    message: string
-  }
-
-  create type ChirpUserType as {
-    screen_name: string,
-    lang: string,
-    friends_count: int32,
-    statuses_count: int32,
-    name: string,
-    followers_count: int32
-  }
-
-  create type ChirpMessageType as {
-    chirpid: string,
-    user: ChirpUserType,
-    sender_location: point,
-    send_time: datetime,
-    referred_topics: {{ string }},
-    message_text: string
-  }
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3.aql
deleted file mode 100644
index fb30afc..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SocialNetworkData;
-
-create dataset GleambookUsers(GleambookUserType)
-primary key id;
-
-create dataset GleambookMessages(GleambookMessageType)
-primary key message_id;
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load.aql
deleted file mode 100644
index 8c3fcc7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SocialNetworkData;
-
-load dataset GleambookMessages using
-localfs(("path"="asterix-6:///mnt/data/sdf/imaxon/datagen/gbook_messages.adm,asterix-7:///mnt/data/sdf/imaxon/datagen/gbook_messages.adm,asterix-8:///mnt/data/sdf/imaxon/datagen/gbook_messages.adm,asterix-9:///mnt/data/sdf/imaxon/datagen/gbook_messages.adm"),("format"="adm"));
-
-load dataset GleambookUsers using
-localfs(("path"="asterix-6:///mnt/data/sdf/imaxon/datagen/gbook_users.adm,asterix-7:///mnt/data/sdf/imaxon/datagen/gbook_users.adm,asterix-8:///mnt/data/sdf/imaxon/datagen/gbook_users.adm,asterix-9:///mnt/data/sdf/imaxon/datagen/gbook_users.adm"),("format"="adm"));
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load_2.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load_2.aql
deleted file mode 100644
index 2b45350..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_3_load_2.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SocialNetworkData;
-
-load dataset GleambookMessages using
-localfs(("path"="172.23.100.190:///hd1/datagen/gbook_messages.adm,172.23.100.191:///hd1/datagen/gbook_messages.adm,172.23.100.192:///hd1/datagen/gbook_messages.adm,172.23.100.193:///hd1/datagen/gbook_messages.adm"),("format"="adm"));
-
-load dataset GleambookUsers using
-localfs(("path"="172.23.100.190:///hd1/datagen/gbook_users.adm,172.23.100.191:///hd1/datagen/gbook_users.adm,172.23.100.192:///hd1/datagen/gbook_users.adm,172.23.100.193:///hd1/datagen/gbook_users.adm"),("format"="adm"));
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_count.aql
deleted file mode 100644
index 51d9562..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/bench_count.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SocialNetworkData;
-
-let $count := count(for $t in dataset GleambookMessages return $t.id)
-return $count;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/count.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/count.aql
deleted file mode 100644
index 690a46e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/count.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-let $count := count(for $t in dataset Tweets return $t.tweetid)
-return $count;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhbtree.aql
deleted file mode 100644
index d8c5be4..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhbtree.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index dhbtreeLocation on Tweets(sender-location) type dhbtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhvbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhvbtree.aql
deleted file mode 100644
index 4ed7571..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_dhvbtree.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index dhvbtreeLocation on Tweets(sender-location) type dhvbtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_rtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_rtree.aql
deleted file mode 100644
index 59191ec..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_rtree.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index rtreeLocation on Tweets(sender-location) type rtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_shbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_shbtree.aql
deleted file mode 100644
index b3e2ed4..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_shbtree.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index shbtreeLocation on Tweets(sender-location) type shbtree(-180.0, -90.0, 180.0, 90.0);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_sif.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_sif.aql
deleted file mode 100644
index afeebe5..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_1_sif.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create index sifLocation on Tweets(sender-location) type sif(-180.0, -90.0, 180.0, 90.0);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3.aql
deleted file mode 100644
index 65339f7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create dataset Tweets(TweetMessageType) primary key tweetid;
-create dataset JoinSeedTweets(TweetMessageType) primary key tweetid;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhbtree.aql
deleted file mode 100644
index 962cb8e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhbtree.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create index dhbtreeLocation on Tweets(sender-location) type dhbtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhvbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhvbtree.aql
deleted file mode 100644
index 392920d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_dhvbtree.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create index dhvbtreeLocation on Tweets(sender-location) type dhvbtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_rtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_rtree.aql
deleted file mode 100644
index 2081055..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_rtree.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create index rtreeLocation on Tweets(sender-location) type rtree;
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_shbtree.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_shbtree.aql
deleted file mode 100644
index 38d9bc7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_shbtree.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create index shbtreeLocation on Tweets(sender-location) type shbtree(-180.0, -90.0, 180.0, 90.0);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_sif.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_sif.aql
deleted file mode 100644
index 21d793d..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_create_sif.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-create index sifLocation on Tweets(sender-location) type sif(-180.0, -90.0, 180.0, 90.0);
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_pidx_load.aql b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_pidx_load.aql
deleted file mode 100644
index 680cfad..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/aql/spatial_3_pidx_load.aql
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse experiments;
-
-load dataset JoinSeedTweets
-using "org.apache.asterix.external.dataset.adapter.NCFileSystemAdapter"
-(("path"="128.195.9.22:///scratch/youngsk2/spatial-index-experiment/data/QuerySeedTweets10K-from-SyntheticTweets100M-psi27-pid0.adm"),("format"="adm"));
-
-/* for testing */
-/*
-load dataset Tweets 
-using "org.apache.asterix.external.dataset.adapter.NCFileSystemAdapter"
-(("path"="128.195.9.22:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets2M-psi27-pid0.adm"),("format"="adm"));
-*/
-
-/* for measurement */
-load dataset Tweets 
-using "org.apache.asterix.external.dataset.adapter.NCFileSystemAdapter"
-(("path"=
-"128.195.9.22:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi27-pid0.adm, 
-128.195.9.23:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi26-pid1.adm,
-128.195.9.24:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi25-pid2.adm,
-128.195.9.25:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi24-pid3.adm,
-128.195.9.26:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi23-pid4.adm,
-128.195.9.27:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi22-pid5.adm,
-128.195.9.28:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi21-pid6.adm,
-128.195.9.29:///scratch/youngsk2/spatial-index-experiment/data/SyntheticTweets100M-psi20-pid7.adm"),
-("format"="adm"));
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/balloon.c b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/balloon.c
deleted file mode 100644
index 6482aed..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/balloon.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <stdio.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include <stdint.h>
-
-  int main() {
-  
-    void *mem;
-    int err;
-    uint64_t size = 4.5 * 1024 * 1024;
-    size *= 1024;
-  
-    mem = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); 
-    printf ("%d\n", mem);
-    err = mlock(mem, size);
-    printf ("err is %d\n", err);
-    while(1) {
-      sleep(10000);
-    }
-    return 0;
-  }
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/1node.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/1node.xml
deleted file mode 100644
index ded4733..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/1node.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>1node</name>
-  <username>jenkins</username>
-  <working_dir>
-    <dir>/home/jenkins/asterixdb/working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/home/jenkins/asterix/logs</log_dir>
-  <txn_log_dir>/home/jenkins/asterix/txnlogs</txn_log_dir>
-  <iodevices>/home/jenkins/asterix</iodevices>
-  <store>storage</store>
-  <java_home>/usr/lib/jvm/jre-1.8.0</java_home>
-  <master_node>
-    <id>master</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>127.0.0.1</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>node1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/2node.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/2node.xml
deleted file mode 100644
index a4e2456..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/2node.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>2node</name>
-  <username>youngsk2</username>
-  <working_dir>
-    <dir>/home/youngsk2/asterixdb/working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/mnt/data/sde/youngsk2/asterix/logs</log_dir>
-  <txn_log_dir>/lv_scratch/scratch/youngsk2/asterix/txnlogs</txn_log_dir>
-  <iodevices>/mnt/data/sdb/youngsk2/asterix,/mnt/data/sdc/youngsk2/asterix,/mnt/data/sdd/youngsk2/asterix</iodevices>
-  <store>storage</store>
-  <java_home>/home/youngsk2/jdk1.7.0_65</java_home>
-  <master_node>
-    <id>master</id>
-    <cluster_ip>128.195.9.21</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>128.195.9.21</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>node1</id>
-    <cluster_ip>128.195.9.22</cluster_ip>
-  </node>
-  <node>
-    <id>node2</id>
-    <cluster_ip>128.195.9.23</cluster_ip>
-  </node>
-</cluster>
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/4node.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/4node.xml
deleted file mode 100644
index e3a4b2f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/4node.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>4node</name>
-  <username>youngsk2</username>
-  <working_dir>
-    <dir>/home/youngsk2/asterixdb/working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/mnt/data/sde/youngsk2/asterix/logs</log_dir>
-  <txn_log_dir>/lv_scratch/scratch/youngsk2/asterix/txnlogs</txn_log_dir>
-  <iodevices>/mnt/data/sdb/youngsk2/asterix,/mnt/data/sdc/youngsk2/asterix,/mnt/data/sdd/youngsk2/asterix</iodevices>
-  <store>storage</store>
-  <java_home>/home/youngsk2/jdk1.7.0_65</java_home>
-  <master_node>
-    <id>master</id>
-    <cluster_ip>128.195.9.21</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>128.195.9.21</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>node1</id>
-    <cluster_ip>128.195.9.22</cluster_ip>
-  </node>
-  <node>
-    <id>node2</id>
-    <cluster_ip>128.195.9.23</cluster_ip>
-  </node>
-  <node>
-    <id>node3</id>
-    <cluster_ip>128.195.9.24</cluster_ip>
-  </node>
-  <node>
-    <id>node4</id>
-    <cluster_ip>128.195.9.25</cluster_ip>
-  </node>
-</cluster>
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/8node.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/8node.xml
deleted file mode 100644
index 694df12..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/8node.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>8node</name>
-  <username>youngsk2</username>
-  <working_dir>
-    <dir>/home/youngsk2/asterixdb/working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/mnt/data/sde/youngsk2/asterix/logs</log_dir>
-  <txn_log_dir>/lv_scratch/scratch/youngsk2/asterix/txnlogs</txn_log_dir>
-  <iodevices>/mnt/data/sdb/youngsk2/asterix,/mnt/data/sdc/youngsk2/asterix,/mnt/data/sdd/youngsk2/asterix</iodevices>
-  <store>storage</store>
-  <java_home>/home/youngsk2/jdk1.7.0_65</java_home>
-  <master_node>
-    <id>master</id>
-    <cluster_ip>128.195.9.21</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>128.195.9.21</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>node1</id>
-    <cluster_ip>128.195.9.22</cluster_ip>
-  </node>
-  <node>
-    <id>node2</id>
-    <cluster_ip>128.195.9.23</cluster_ip>
-  </node>
-  <node>
-    <id>node3</id>
-    <cluster_ip>128.195.9.24</cluster_ip>
-  </node>
-  <node>
-    <id>node4</id>
-    <cluster_ip>128.195.9.25</cluster_ip>
-  </node>
-  <node>
-    <id>node5</id>
-    <cluster_ip>128.195.9.26</cluster_ip>
-  </node>
-  <node>
-    <id>node6</id>
-    <cluster_ip>128.195.9.27</cluster_ip>
-  </node>
-  <node>
-    <id>node7</id>
-    <cluster_ip>128.195.9.28</cluster_ip>
-  </node>
-  <node>
-    <id>node8</id>
-    <cluster_ip>128.195.9.29</cluster_ip>
-  </node>
-</cluster>
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-agg.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-agg.xml
deleted file mode 100644
index 899267e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-agg.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>4node</name>
-  <username>asterix</username>
-  <working_dir>
-    <dir>/home/asterix/asterixdb/working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/home/asterix/logs</log_dir>
-  <txn_log_dir>/mnt/data/sdh/scratch/asterix/asterix/txnlogs</txn_log_dir>
-  <iodevices>/mnt/data/sde/asterix/asterix/</iodevices>
-  <store>storage</store>
-  <java_home>/usr/lib/jvm/jre-1.8.0/</java_home>
-  <master_node>
-    <id>3</id>
-    <cluster_ip>asterix-3</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>asterix-3</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>4</id>
-    <cluster_ip>asterix-6</cluster_ip>
-  </node>
-  <node>
-    <id>5</id>
-    <cluster_ip>asterix-7</cluster_ip>
-  </node>
-  <node>
-    <id>6</id>
-    <cluster_ip>asterix-8</cluster_ip>
-  </node>
-  <node>
-    <id>7</id>
-    <cluster_ip>asterix-9</cluster_ip>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml
deleted file mode 100644
index d6f0968..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/asterix-configuration.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<!--
- ! Copyright 2009-2013 by The Regents of the University of California
- ! Licensed under the Apache License, Version 2.0 (the "License");
- ! you may not use this file except in compliance with the License.
- ! you may obtain a copy of the License from
- !
- !     http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing, software
- ! distributed under the License is distributed on an "AS IS" BASIS,
- ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ! See the License for the specific language governing permissions and
- ! limitations under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-
-  <property>
-    <name>nc.java.opts</name>
-    <value>-Xms6144m -Xmx7168m</value>
-    <description>JVM parameters for each Node Contoller (NC)</description>
-  </property>
-
-  <property>
-    <name>cc.java.opts</name>
-    <value>-Xms6144m -Xmx6144m</value>
-    <description>JVM parameters for each Cluster Contoller (CC)
-    </description>
-  </property>
-
-  <property>
-    <name>max.wait.active.cluster</name>
-    <value>60</value>
-    <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all nodes are available)
-      before a submitted query/statement can be executed. (Default = 60 seconds)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages in the buffer cache.
-      (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.size</name>
-    <value>3GB</value>
-    <description>[3GB] The size of memory allocated to the disk buffer cache.
-      The value should be a multiple of the buffer cache page size(Default
-      = "536870912" // 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.maxopenfiles</name>
-    <value>214748364</value>
-    <description>The maximum number of open files in the buffer cache.
-      (Default = "214748364")
-    </description>
-  </property>
-
-  <!-- Buffer size per dataset for in-memory components: 1GB -->
-  <property>
-    <name>storage.memorycomponent.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages allocated to memory
-      components. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numpages</name>
-    <value>8192</value>
-    <description>The number of pages to allocate for a memory component.
-      This budget is shared by all the memory components of the primary
-      index and all its secondary indexes across all I/O devices on a node.
-      Note: in-memory components usually has fill factor of 75% since
-      the pages are 75% full and the remaining 25% is un-utilized. (Default = 256)
-    </description>
-  </property>
-  <!--// Buffer size per dataset for in-memory components -->
-
-  <property>
-    <name>storage.metadata.memorycomponent.numpages</name>
-    <value>64</value>
-    <description>The number of pages to allocate for a memory component.
-      (Default = 64)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numcomponents</name>
-    <value>2</value>
-    <description>The number of memory components to be used per lsm index.
-      (Default = 2)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.globalbudget</name>
-    <value>4196MB</value>
-    <description>The total size of memory in bytes that the sum of all open memory
-      components cannot exceed. Consider this as the buffer cache for all memory
-      components of all indexes in a node. When this budget is fully used, a victim
-      dataset will be chosen. The chosen dataset must be evicted and closed to make
-      a space for another dataset. (Default = 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.lsm.bloomfilter.falsepositiverate</name>
-    <value>0.01</value>
-    <description>The maximum acceptable false positive rate for bloom
-      filters associated with LSM indexes. (Default = "0.01" // 1%)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.numpages</name>
-    <value>2</value>
-    <description>The number of in-memory log buffer pages. (Default = "8")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.pagesize</name>
-    <value>8MB</value>
-    <description>[8MB]The size of pages in the in-memory log buffer. (Default =
-      "524288" // 512KB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.partitionsize</name>
-    <value>2GB</value>
-    <description>The maximum size of a log file partition allowed before
-      rotating the log to the next partition. (Default = "2147483648" //
-      2GB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.lsnthreshold</name>
-    <value>67108864</value>
-    <description>The size of the window that the maximum LSN is allowed to
-      be ahead of the checkpoint LSN by. (Default = ""67108864" // 64M)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.pollfrequency</name>
-    <value>120</value>
-    <description>The time in seconds between that the checkpoint thread
-      waits between polls. (Default = "120" // 120s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.history</name>
-    <value>0</value>
-    <description>The number of old log partition files to keep before
-      discarding. (Default = "0")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.escalationthreshold</name>
-    <value>1000</value>
-    <description>The number of entity level locks that need to be acquired
-      before the locks are coalesced and escalated into a dataset level
-      lock. (Default = "1000")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.shrinktimer</name>
-    <value>5000</value>
-    <description>The time in milliseconds to wait before deallocating
-      unused lock manager memory. (Default = "5000" // 5s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.waitthreshold</name>
-    <value>60000</value>
-    <description>The time in milliseconds to wait before labeling a
-      transaction which has been waiting for a lock timed-out. (Default =
-      "60000" // 60s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.sweepthreshold</name>
-    <value>10000</value>
-    <description>The time in milliseconds the timeout thread waits between
-      sweeps to detect timed-out transactions. (Default = "10000" // 10s)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.sortmemory</name>
-    <value>64MB</value>
-    <description>[64MB]The amount of memory in bytes given to sort operations.
-      (Default = "33554432" // 32mb)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.joinmemory</name>
-    <value>64MB</value>
-    <description>[64MB]The amount of memory in bytes given to join operations.
-      (Default = "33554432" // 32mb)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.framesize</name>
-    <value>128KB</value>
-    <description>The Hyracks frame size that the compiler configures per
-      job. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>web.port</name>
-    <value>19001</value>
-    <description>The port for the ASTERIX web interface. (Default = 19001)
-    </description>
-  </property>
-
-  <property>
-    <name>api.port</name>
-    <value>19002</value>
-    <description>The port for the ASTERIX API server. (Default = 19002)
-    </description>
-  </property>
-
-  <property>
-    <name>log.level</name>
-    <value>INFO</value>
-    <description>The minimum log level to be displayed. (Default = INFO)
-    </description>
-  </property>
-
-  <property>
-    <name>active.memory.global.budget</name>
-    <value>1073741824</value>
-    <description>Feed memory budget (1 GB = 1073741824 Bytes)
-    </description>
-  </property>
-
-</asterixConfiguration>
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/managix-conf.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/managix-conf.xml
deleted file mode 100644
index 66eb18f..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/managix-conf.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<configuration xmlns="installer">
-  <backup>
-    <hdfs>
-      <version>0.20.2</version>
-      <url></url>
-    </hdfs>
-    <backupDir>/home/asterixdb/asterixdb/.installer/zookeeper_home</backupDir>
-  </backup>
-  <zookeeper>
-    <homeDir>/home/asterixdb/asterixdb/.installer/zookeeper_home</homeDir>
-    <clientPort>2900</clientPort>
-    <servers>
-      <java_home>/usr/lib/jvm/jre-1.8.0/</java_home>
-      <server>128.195.9.21</server>
-    </servers>
-  </zookeeper>
-</configuration>
\ No newline at end of file
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/nuclear.xml b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/nuclear.xml
deleted file mode 100644
index 75b7f8e..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/configs/nuclear.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <name>nuclear</name>
-  <username>asterix</username>
-  <working_dir>
-    <dir>/home/asterixdb/asterixdb/working</dir>
-    <NFS>false</NFS>
-  </working_dir>
-  <log_dir>/home/asterixdb/asterixdb/logs/</log_dir>
-  <txn_log_dir>/home/asterixdb/asterixdb/txnLogs/</txn_log_dir>
-  <iodevices>/home/asterixdb/asterixdb/</iodevices>
-  <store>storage</store>
-  <java_home>/usr/lib/jvm/jre-1.8.0</java_home>
-  <master_node>
-    <id>master</id>
-    <cluster_ip>technetium.ics.uci.edu</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_ip>technetium.ics.uci.edu</client_ip>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>technetium</id>
-    <cluster_ip>technetium.ics.uci.edu</cluster_ip>
-  </node>
-  <node>
-    <id>polonium</id>
-    <cluster_ip>polonium.ics.uci.edu</cluster_ip>
-  </node>
-  <node>
-    <id>radon</id>
-    <cluster_ip>radon.ics.uci.edu</cluster_ip>
-  </node>
-</cluster>
-
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/1.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/1.dgen
deleted file mode 100644
index 428b3a3..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/1.dgen
+++ /dev/null
@@ -1 +0,0 @@
-127.0.0.1   127.0.0.1:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/2.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/2.dgen
deleted file mode 100644
index 7a51869..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/2.dgen
+++ /dev/null
@@ -1,2 +0,0 @@
-128.195.11.61   128.195.9.22:10001
-128.195.11.62   128.195.9.23:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/4.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/4.dgen
deleted file mode 100644
index 0472cf6..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/4.dgen
+++ /dev/null
@@ -1,4 +0,0 @@
-128.195.11.61   128.195.9.22:10001
-128.195.11.62   128.195.9.23:10001
-128.195.11.63   128.195.9.24:10001
-128.195.11.64   128.195.9.25:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_1.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_1.dgen
deleted file mode 100644
index e671eca..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_1.dgen
+++ /dev/null
@@ -1,8 +0,0 @@
-128.195.9.30    128.195.9.22:10001
-128.195.9.30    128.195.9.23:10001
-128.195.9.21    128.195.9.24:10001
-128.195.9.21    128.195.9.25:10001
-128.195.11.54   128.195.9.26:10001
-128.195.11.54   128.195.9.27:10001
-128.195.11.55   128.195.9.28:10001
-128.195.11.55   128.195.9.29:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_2.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_2.dgen
deleted file mode 100644
index e82412a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_2.dgen
+++ /dev/null
@@ -1,16 +0,0 @@
-128.195.9.30    128.195.9.22:10001
-128.195.9.30    128.195.9.23:10001
-128.195.9.21    128.195.9.24:10001
-128.195.9.21    128.195.9.25:10001
-128.195.11.54   128.195.9.26:10001
-128.195.11.54   128.195.9.27:10001
-128.195.11.55   128.195.9.28:10001
-128.195.11.55   128.195.9.29:10001
-128.195.11.56   128.195.9.22:10002
-128.195.11.56   128.195.9.23:10002
-128.195.11.57   128.195.9.24:10002
-128.195.11.57   128.195.9.25:10002
-128.195.11.59   128.195.9.26:10002
-128.195.11.59   128.195.9.27:10002
-128.195.11.60   128.195.9.28:10002
-128.195.11.60   128.195.9.29:10002
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_3.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_3.dgen
deleted file mode 100644
index 5846b08..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_3.dgen
+++ /dev/null
@@ -1,24 +0,0 @@
-128.195.9.30    128.195.9.22:10001
-128.195.9.30    128.195.9.23:10001
-128.195.9.21    128.195.9.24:10001
-128.195.9.21    128.195.9.25:10001
-128.195.11.54   128.195.9.26:10001
-128.195.11.54   128.195.9.27:10001
-128.195.11.55   128.195.9.28:10001
-128.195.11.55   128.195.9.29:10001
-128.195.11.56   128.195.9.22:10002
-128.195.11.56   128.195.9.23:10002
-128.195.11.57   128.195.9.24:10002
-128.195.11.57   128.195.9.25:10002
-128.195.11.59   128.195.9.26:10002
-128.195.11.59   128.195.9.27:10002
-128.195.11.60   128.195.9.28:10002
-128.195.11.60   128.195.9.29:10002
-128.195.11.62   128.195.9.22:10003
-128.195.11.62   128.195.9.23:10003
-128.195.11.63   128.195.9.24:10003
-128.195.11.63   128.195.9.25:10003
-128.195.11.64   128.195.9.26:10003
-128.195.11.64   128.195.9.27:10003
-128.195.11.65   128.195.9.28:10003
-128.195.11.65   128.195.9.29:10003
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_4.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_4.dgen
deleted file mode 100644
index ce6dbb2..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/5_4.dgen
+++ /dev/null
@@ -1,32 +0,0 @@
-128.195.9.30    128.195.9.22:10001
-128.195.9.30    128.195.9.23:10001
-128.195.9.21    128.195.9.24:10001
-128.195.9.21    128.195.9.25:10001
-128.195.11.54   128.195.9.26:10001
-128.195.11.54   128.195.9.27:10001
-128.195.11.55   128.195.9.28:10001
-128.195.11.55   128.195.9.29:10001
-128.195.11.56   128.195.9.22:10002
-128.195.11.56   128.195.9.23:10002
-128.195.11.57   128.195.9.24:10002
-128.195.11.57   128.195.9.25:10002
-128.195.11.59   128.195.9.26:10002
-128.195.11.59   128.195.9.27:10002
-128.195.11.60   128.195.9.28:10002
-128.195.11.60   128.195.9.29:10002
-128.195.11.62   128.195.9.22:10003
-128.195.11.62   128.195.9.23:10003
-128.195.11.63   128.195.9.24:10003
-128.195.11.63   128.195.9.25:10003
-128.195.11.64   128.195.9.26:10003
-128.195.11.64   128.195.9.27:10003
-128.195.11.65   128.195.9.28:10003
-128.195.11.65   128.195.9.29:10003
-128.195.11.66   128.195.9.22:10004
-128.195.11.66   128.195.9.23:10004
-128.195.11.68   128.195.9.24:10004
-128.195.11.68   128.195.9.25:10004
-128.195.11.72   128.195.9.26:10004
-128.195.11.72   128.195.9.27:10004
-128.195.11.86   128.195.9.28:10004
-128.195.11.86   128.195.9.29:10004
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dgen
deleted file mode 100644
index 8571cbe..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dgen
+++ /dev/null
@@ -1,8 +0,0 @@
-128.195.11.61   128.195.9.22:10001
-128.195.11.62   128.195.9.23:10001
-128.195.11.63   128.195.9.24:10001
-128.195.11.64   128.195.9.25:10001
-128.195.11.65   128.195.9.26:10001
-128.195.11.66   128.195.9.27:10001
-128.195.11.67   128.195.9.28:10001
-128.195.11.68   128.195.9.29:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dqgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dqgen
deleted file mode 100644
index 8571cbe..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/8.dqgen
+++ /dev/null
@@ -1,8 +0,0 @@
-128.195.11.61   128.195.9.22:10001
-128.195.11.62   128.195.9.23:10001
-128.195.11.63   128.195.9.24:10001
-128.195.11.64   128.195.9.25:10001
-128.195.11.65   128.195.9.26:10001
-128.195.11.66   128.195.9.27:10001
-128.195.11.67   128.195.9.28:10001
-128.195.11.68   128.195.9.29:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/asterix-4.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/asterix-4.dgen
deleted file mode 100644
index 5bd95d7..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/asterix-4.dgen
+++ /dev/null
@@ -1,4 +0,0 @@
-asterix-4.ics.uci.edu   asterix-8.ics.uci.edu:10001
-asterix-5.ics.uci.edu   asterix-9.ics.uci.edu:10001
-asterix-6.ics.uci.edu   asterix-10.ics.uci.edu:10001
-asterix-7.ics.uci.edu   asterix-2.ics.uci.edu:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/nuc.dgen b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/nuc.dgen
deleted file mode 100644
index 142b656..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/dgen/nuc.dgen
+++ /dev/null
@@ -1,3 +0,0 @@
-technetium.ics.uci.edu   radium.ics.uci.edu:10001
-polonium.ics.uci.edu   promethium.ics.uci.edu:10001
-radon.ics.uci.edu   actinium.ics.uci.edu:10001
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killdrivers.sh b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killdrivers.sh
deleted file mode 100755
index 807b8f9..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killdrivers.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-ps -ef | awk '/java.*Driver/ {print $2}' | xargs kill -9
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killscreens.sh b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killscreens.sh
deleted file mode 100755
index 314910a..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/killscreens.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-screen -ls | grep asterix | cut -d. -f1 | awk '{print $1}' | xargs kill -9
-screen -wipe
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/logging.properties b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/logging.properties
deleted file mode 100644
index c297232..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/logging.properties
+++ /dev/null
@@ -1,84 +0,0 @@
-#/*
-# Copyright 2009-2013 by The Regents of the University of California
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# you may obtain a copy of the License from
-# 
-#     http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#*/
-############################################################
-#      Default Logging Configuration File
-#
-# You can use a different file by specifying a filename
-# with the java.util.logging.config.file system property.  
-# For example java -Djava.util.logging.config.file=myfile
-############################################################
-
-############################################################
-#      Global properties
-############################################################
-
-# "handlers" specifies a comma separated list of log Handler 
-# classes.  These handlers will be installed during VM startup.
-# Note that these classes must be on the system classpath.
-# By default we only configure a ConsoleHandler, which will only
-# show messages at the INFO and above levels.
-
-handlers= java.util.logging.ConsoleHandler
-
-# To also add the FileHandler, use the following line instead.
-
-# handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
-
-# Default global logging level.
-# This specifies which kinds of events are logged across
-# all loggers.  For any given facility this global level
-# can be overriden by a facility specific level
-# Note that the ConsoleHandler also has a separate level
-# setting to limit messages printed to the console.
-
-.level= INFO
-# .level= INFO
-# .level= FINE
-# .level = FINEST
-
-############################################################
-# Handler specific properties.
-# Describes specific configuration info for Handlers.
-############################################################
-
-# default file output is in user's home directory.
-
-# java.util.logging.FileHandler.pattern = %h/java%u.log
-# java.util.logging.FileHandler.limit = 50000
-# java.util.logging.FileHandler.count = 1
-# java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
-
-# Limit the message that are printed on the console to FINE and above.
-
-java.util.logging.ConsoleHandler.level = INFO
-java.util.logging.ConsoleHandler.formatter = org.apache.asterix.experiment.logging.ExperimentLogFormatter
-#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
-
-
-############################################################
-# Facility specific properties.
-# Provides extra control for each logger.
-############################################################
-
-# For example, set the com.xyz.foo logger to only log SEVERE
-# messages:
-
-
-#org.apache.asterix.test.level = INFO
-#org.apache.asterix.level = INFO
-#org.apache.hyracks.algebricks.level = FINE
-#org.apache.hyracks.level = INFO
-#org.apache.asterix.test = INFO
-#org.apache.asterix.installer.test = INFO
diff --git a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/updateMain.sh b/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/updateMain.sh
deleted file mode 100755
index 8764ce9..0000000
--- a/asterixdb/asterix-experiments/src/main/resources/ingestion-experiment-binary-and-configs/updateMain.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-rm -rf /scratch/youngsk2/spatial-index-experiment/ingestion-experiment-root/ingestion-experiment-binary-and-configs/
-unzip /home/youngsk2/spatial-index-experiment/ingestion-experiment-binary-and-configs/ingestion-experiment-binary-and-configs.zip -d /scratch/youngsk2/spatial-index-experiment/ingestion-experiment-root/
-unzip /home/youngsk2/spatial-index-experiment/ingestion-experiment-binary-and-configs/asterix-experiments-0.8.7-SNAPSHOT-binary-assembly.zip -d /scratch/youngsk2/spatial-index-experiment/ingestion-experiment-root/ingestion-experiment-binary-and-configs/;  
-rm -rf /scratch/youngsk2/spatial-index-experiment/asterix-instance/* /scratch/youngsk2/spatial-index-experiment/asterix-instance/.installer
-unzip /home/youngsk2/spatial-index-experiment/ingestion-experiment-binary-and-configs/asterix-installer-0.8.7-SNAPSHOT-binary-assembly.zip -d /scratch/youngsk2/spatial-index-experiment/asterix-instance/;
-cp -rf /home/youngsk2/spatial-index-experiment/ingestion-experiment-binary-and-configs/managix-conf.xml /scratch/youngsk2/spatial-index-experiment/asterix-instance/conf/
diff --git a/asterixdb/asterix-external-data/pom.xml b/asterixdb/asterix-external-data/pom.xml
index 5bd7bec..521e176 100644
--- a/asterixdb/asterix-external-data/pom.xml
+++ b/asterixdb/asterix-external-data/pom.xml
@@ -33,7 +33,7 @@
   </licenses>
   <artifactId>asterix-external-data</artifactId>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
     <generatedSourcesDirectory>${project.build.directory}/generated-sources/lexer/</generatedSourcesDirectory>
   </properties>
   <build>
@@ -318,10 +318,6 @@
       <artifactId>hyracks-storage-am-lsm-btree</artifactId>
     </dependency>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>algebricks-data</artifactId>
     </dependency>
@@ -407,5 +403,18 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-collections4</artifactId>
+      <version>4.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
index 0a47788..fc59f68 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/adapter/factory/GenericAdapterFactory.java
@@ -18,10 +18,9 @@
  */
 package org.apache.asterix.external.adapter.factory;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IApplicationContext;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -38,6 +37,7 @@
 import org.apache.asterix.external.dataset.adapter.FeedAdapter;
 import org.apache.asterix.external.dataset.adapter.GenericAdapter;
 import org.apache.asterix.external.indexing.ExternalFile;
+import org.apache.asterix.external.parser.factory.ADMDataParserFactory;
 import org.apache.asterix.external.provider.DataflowControllerProvider;
 import org.apache.asterix.external.provider.DatasourceFactoryProvider;
 import org.apache.asterix.external.provider.ParserFactoryProvider;
@@ -47,6 +47,7 @@
 import org.apache.asterix.external.util.FeedLogManager;
 import org.apache.asterix.external.util.FeedUtils;
 import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.utils.RecordUtil;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.INCServiceContext;
@@ -54,11 +55,14 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileSplit;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class GenericAdapterFactory implements IIndexingAdapterFactory, IAdapterFactory {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(GenericAdapterFactory.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private IExternalDataSourceFactory dataSourceFactory;
     private IDataParserFactory dataParserFactory;
     private ARecordType recordType;
@@ -202,4 +206,20 @@
     public IExternalDataSourceFactory getDataSourceFactory() {
         return dataSourceFactory;
     }
+
+    /**
+     * Use pre-configured datasource factory
+     * For function datasources
+     *
+     * @param dataSourceFactory
+     *            the function datasource factory
+     * @throws AlgebricksException
+     */
+    public void configure(IExternalDataSourceFactory dataSourceFactory) throws AlgebricksException {
+        this.dataSourceFactory = dataSourceFactory;
+        dataParserFactory = new ADMDataParserFactory();
+        dataParserFactory.setRecordType(RecordUtil.FULLY_OPEN_RECORD_TYPE);
+        dataParserFactory.configure(Collections.emptyMap());
+        configuration = Collections.emptyMap();
+    }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IDataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IDataParserFactory.java
index de104d4..3ac2770 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IDataParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/api/IDataParserFactory.java
@@ -25,6 +25,7 @@
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.external.api.IExternalDataSourceFactory.DataSourceType;
 import org.apache.asterix.om.types.ARecordType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 public interface IDataParserFactory extends Serializable {
 
@@ -34,7 +35,6 @@
      *         an instance of IDataParserFactory with RECORDS data source type must implement IRecordDataParserFactory
      *         <T>
      *         an instance of IDataParserFactory with STREAM data source type must implement IStreamDataParserFactory
-     * @throws AsterixException
      */
     public DataSourceType getDataSourceType();
 
@@ -44,14 +44,16 @@
      *
      * @param configuration
      */
-    public void configure(Map<String, String> configuration) throws AsterixException;
+    public void configure(Map<String, String> configuration) throws AlgebricksException;
 
     /**
      * Set the record type expected to be produced by parsers created by this factory
      *
      * @param recordType
+     * @throws AsterixException
+     *             if the parser does not support certain types defined in {@value recordType}.
      */
-    public void setRecordType(ARecordType recordType);
+    public void setRecordType(ARecordType recordType) throws AsterixException;
 
     /**
      * Set the meta record type expected to be produced by parsers created by this factory
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedDataFlowController.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedDataFlowController.java
index 57e79c3..2db17e2 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedDataFlowController.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedDataFlowController.java
@@ -33,7 +33,7 @@
     public ChangeFeedDataFlowController(final IHyracksTaskContext ctx, final FeedTupleForwarder tupleForwarder,
             final FeedLogManager feedLogManager, final int numOfOutputFields,
             final IRecordWithPKDataParser<T> dataParser, final IRecordReader<T> recordReader)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         super(ctx, tupleForwarder, feedLogManager, numOfOutputFields, dataParser, recordReader);
         this.dataParser = dataParser;
     }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedWithMetaDataFlowController.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedWithMetaDataFlowController.java
index 22fa8be..4447b28 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedWithMetaDataFlowController.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/ChangeFeedWithMetaDataFlowController.java
@@ -31,7 +31,7 @@
     public ChangeFeedWithMetaDataFlowController(final IHyracksTaskContext ctx, final FeedTupleForwarder tupleForwarder,
             final FeedLogManager feedLogManager, final int numOfOutputFields,
             final IRecordWithMetadataParser<T> dataParser, final IRecordReader<T> recordReader)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         super(ctx, tupleForwarder, feedLogManager, numOfOutputFields, dataParser, recordReader);
     }
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/CounterTimerTupleForwarder.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/CounterTimerTupleForwarder.java
index b5adb32..10815d9 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/CounterTimerTupleForwarder.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/CounterTimerTupleForwarder.java
@@ -21,8 +21,6 @@
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
@@ -35,13 +33,15 @@
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.comm.util.FrameUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CounterTimerTupleForwarder implements ITupleForwarder {
 
     public static final String BATCH_SIZE = "batch-size";
     public static final String BATCH_INTERVAL = "batch-interval";
 
-    private static final Logger LOGGER = Logger.getLogger(CounterTimerTupleForwarder.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private FrameTupleAppender appender;
     private IFrame frame;
@@ -105,7 +105,7 @@
     private void addTupleToFrame(ArrayTupleBuilder tb) throws HyracksDataException {
         if (tuplesInFrame == batchSize
                 || !appender.append(tb.getFieldEndOffsets(), tb.getByteArray(), 0, tb.getSize())) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("flushing frame containg (" + tuplesInFrame + ") tuples");
             }
             FrameUtils.flushFrame(frame.getBuffer(), writer);
@@ -148,7 +148,7 @@
         public void run() {
             try {
                 if (tuplesInFrame > 0) {
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("TTL expired flushing frame (" + tuplesInFrame + ")");
                     }
                     synchronized (lock) {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/FeedRecordDataFlowController.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/FeedRecordDataFlowController.java
index 824f51a..3b9391e 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/FeedRecordDataFlowController.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/FeedRecordDataFlowController.java
@@ -20,8 +20,6 @@
 
 import java.io.IOException;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
@@ -34,6 +32,9 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FeedRecordDataFlowController<T> extends AbstractFeedDataFlowController {
     public static final String INCOMING_RECORDS_COUNT_FIELD_NAME = "incoming-records-count";
@@ -45,7 +46,7 @@
         STOPPED
     }
 
-    private static final Logger LOGGER = Logger.getLogger(FeedRecordDataFlowController.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final IRecordDataParser<T> dataParser;
     private final IRecordReader<T> recordReader;
     protected final AtomicBoolean closed = new AtomicBoolean(false);
@@ -90,7 +91,7 @@
                 }
             }
         } catch (HyracksDataException e) {
-            LOGGER.log(Level.WARNING, "Exception during ingestion", e);
+            LOGGER.log(Level.WARN, "Exception during ingestion", e);
             //if interrupted while waiting for a new record, then it is safe to not fail forward
             if (e.getComponent() == ErrorCode.ASTERIX
                     && (e.getErrorCode() == ErrorCode.FEED_STOPPED_WHILE_WAITING_FOR_A_NEW_RECORD)) {
@@ -113,7 +114,7 @@
         } catch (Exception e) {
             failure = e;
             tupleForwarder.fail();
-            LOGGER.log(Level.WARNING, "Failure while operating a feed source", e);
+            LOGGER.log(Level.WARN, "Failure while operating a feed source", e);
         } finally {
             failure = finish(failure);
         }
@@ -178,7 +179,7 @@
         try {
             recordReader.close();
         } catch (Exception th) {
-            LOGGER.log(Level.WARNING, "Failure during while operating a feed source", th);
+            LOGGER.log(Level.WARN, "Failure during while operating a feed source", th);
             hde = HyracksDataException.suppress(hde, th);
         }
         try {
@@ -203,7 +204,7 @@
         try {
             dataParser.parse(record, tb.getDataOutput());
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, ExternalDataConstants.ERROR_PARSE_RECORD, e);
+            LOGGER.log(Level.WARN, ExternalDataConstants.ERROR_PARSE_RECORD, e);
             feedLogManager.logRecord(record.toString(), ExternalDataConstants.ERROR_PARSE_RECORD);
             // continue the outer loop
             return false;
@@ -281,7 +282,7 @@
 
     @Override
     public String getStats() {
-        return "{\"" + INCOMING_RECORDS_COUNT_FIELD_NAME + "\": " + incomingRecordsCount + ", \"" +
-                FAILED_AT_PARSER_RECORDS_COUNT_FIELD_NAME + "\": " + failedRecordsCount + "}";
+        return "{\"" + INCOMING_RECORDS_COUNT_FIELD_NAME + "\": " + incomingRecordsCount + ", \""
+                + FAILED_AT_PARSER_RECORDS_COUNT_FIELD_NAME + "\": " + failedRecordsCount + "}";
     }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/RecordDataFlowController.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/RecordDataFlowController.java
index e780834..0f9572d 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/RecordDataFlowController.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataflow/RecordDataFlowController.java
@@ -26,18 +26,15 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
-import org.apache.log4j.Logger;
 
 public class RecordDataFlowController<T> extends AbstractDataFlowController {
 
-    private static final Logger LOGGER = Logger.getLogger(RecordDataFlowController.class.getName());
     protected final IRecordDataParser<T> dataParser;
     protected final IRecordReader<? extends T> recordReader;
     protected final int numOfTupleFields;
 
     public RecordDataFlowController(IHyracksTaskContext ctx, ITupleForwarder tupleForwarder,
-            IRecordDataParser<T> dataParser, IRecordReader<? extends T> recordReader,
-            int numOfTupleFields) {
+            IRecordDataParser<T> dataParser, IRecordReader<? extends T> recordReader, int numOfTupleFields) {
         super(ctx, tupleForwarder);
         this.dataParser = dataParser;
         this.recordReader = recordReader;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/LookupAdapter.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/LookupAdapter.java
index dd713e6..aeeb04d 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/LookupAdapter.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/dataset/adapter/LookupAdapter.java
@@ -57,7 +57,7 @@
     public LookupAdapter(IRecordDataParser<T> dataParser, ILookupRecordReader<? extends T> recordReader,
             RecordDescriptor inRecDesc, RecordIdReader ridReader, boolean propagateInput, boolean retainNull,
             IMissingWriterFactory iNullWriterFactory, IHyracksTaskContext ctx, IFrameWriter writer)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         this.dataParser = dataParser;
         this.recordReader = recordReader;
         this.propagateInput = propagateInput;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/api/IFeed.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/api/IFeed.java
index f5c25f7..f197233 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/api/IFeed.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/api/IFeed.java
@@ -24,26 +24,12 @@
 
 public interface IFeed extends Serializable {
 
-    public enum FeedType {
-        /**
-         * A feed that derives its data from an external source.
-         */
-        PRIMARY,
-
-        /**
-         * A feed that derives its data from another primary or secondary feed.
-         */
-        SECONDARY
-    }
-
     public String getFeedName();
 
     public String getDataverseName();
 
     public EntityId getFeedId();
 
-    public Map<String, String> getAdapterConfiguration();
-
-    public String getAdapterName();
+    public Map<String, String> getConfiguration();
 
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedExceptionHandler.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedExceptionHandler.java
index a8c6056..2fda99f 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedExceptionHandler.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedExceptionHandler.java
@@ -19,8 +19,6 @@
 package org.apache.asterix.external.feed.dataflow;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.IExceptionHandler;
 import org.apache.asterix.external.util.FeedFrameUtil;
@@ -28,10 +26,13 @@
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FeedExceptionHandler implements IExceptionHandler {
 
-    private static Logger LOGGER = Logger.getLogger(FeedExceptionHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     // TODO: Enable logging
     private final IHyracksTaskContext ctx;
@@ -53,8 +54,8 @@
                     logExceptionCausingTuple(tupleIndex, th);
                 } catch (Exception ex) {
                     ex.addSuppressed(th);
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.warning("Unable to log exception causing tuple due to..." + ex.getMessage());
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.warn("Unable to log exception causing tuple due to..." + ex.getMessage());
                     }
                 }
                 // TODO: Improve removeBadTuple. Right now, it creates lots of objects
@@ -64,8 +65,8 @@
             }
         } catch (Exception exception) {
             exception.printStackTrace();
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Unable to handle exception " + exception.getMessage());
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Unable to handle exception " + exception.getMessage());
             }
             return null;
         }
@@ -73,6 +74,6 @@
 
     // TODO: Fix logging of exceptions
     private void logExceptionCausingTuple(int tupleIndex, Throwable e) throws HyracksDataException {
-        LOGGER.log(Level.WARNING, e.getMessage(), e);
+        LOGGER.log(Level.WARN, e.getMessage(), e);
     }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedRuntimeInputHandler.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedRuntimeInputHandler.java
index 90a8852..b89c10b 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedRuntimeInputHandler.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FeedRuntimeInputHandler.java
@@ -21,8 +21,6 @@
 import java.nio.ByteBuffer;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveRuntimeId;
 import org.apache.asterix.common.memory.ConcurrentFramePool;
@@ -35,6 +33,9 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * TODO: Add Failure cases unit tests for this class
@@ -49,7 +50,7 @@
  **/
 public class FeedRuntimeInputHandler extends AbstractUnaryInputUnaryOutputOperatorNodePushable {
 
-    private static final Logger LOGGER = Logger.getLogger(FeedRuntimeInputHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final double MAX_SPILL_USED_BEFORE_RESUME = 0.8;
     private static final boolean DEBUG = false;
     private static final ByteBuffer POISON_PILL = ByteBuffer.allocate(0);
@@ -76,11 +77,9 @@
             IFrameWriter writer, FeedPolicyAccessor fpa, FrameTupleAccessor fta, ConcurrentFramePool framePool)
             throws HyracksDataException {
         this.writer = writer;
-        this.spiller = fpa.spillToDiskOnCongestion() ?
-                new FrameSpiller(ctx,
-                        connectionId.getFeedId() + "_" + connectionId.getDatasetName() + "_" + runtimeId.getPartition(),
-                        fpa.getMaxSpillOnDisk()) :
-                null;
+        this.spiller = fpa.spillToDiskOnCongestion() ? new FrameSpiller(ctx,
+                connectionId.getFeedId() + "_" + connectionId.getDatasetName() + "_" + runtimeId.getPartition(),
+                fpa.getMaxSpillOnDisk()) : null;
         this.exceptionHandler = new FeedExceptionHandler(ctx, fta);
         this.fpa = fpa;
         this.framePool = framePool;
@@ -109,7 +108,7 @@
         try {
             inbox.put(FAIL);
         } catch (InterruptedException e) {
-            LOGGER.log(Level.WARNING, "interrupted", e);
+            LOGGER.log(Level.WARN, "interrupted", e);
             Thread.currentThread().interrupt();
         }
     }
@@ -124,7 +123,7 @@
             inbox.put(POISON_PILL);
             consumerThread.join();
         } catch (InterruptedException e) {
-            LOGGER.log(Level.WARNING, "interrupted", e);
+            LOGGER.log(Level.WARN, "interrupted", e);
             Thread.currentThread().interrupt();
         }
         try {
@@ -132,7 +131,7 @@
                 spiller.close();
             }
         } catch (Throwable th) {
-            LOGGER.log(Level.WARNING, "exception closing spiller", th);
+            LOGGER.log(Level.WARN, "exception closing spiller", th);
         } finally {
             writer.close();
         }
@@ -159,8 +158,8 @@
                     discard(frame);
                     break;
                 default:
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.warning("Ignoring incoming tuples in " + mode + " mode");
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.warn("Ignoring incoming tuples in " + mode + " mode");
                     }
                     break;
             }
@@ -288,8 +287,8 @@
             while (spiller.usedBudget() > MAX_SPILL_USED_BEFORE_RESUME) {
                 if (DEBUG) {
                     LOGGER.info("in stall(frame). Spilling has been consumed. We will wait for it to be less than "
-                            + MAX_SPILL_USED_BEFORE_RESUME + " consumed. Current consumption = " + spiller
-                            .usedBudget());
+                            + MAX_SPILL_USED_BEFORE_RESUME + " consumed. Current consumption = "
+                            + spiller.usedBudget());
                 }
                 spiller.wait();
             }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FrameSpiller.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FrameSpiller.java
index 09e03a3..e3630d3 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FrameSpiller.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/feed/dataflow/FrameSpiller.java
@@ -32,7 +32,8 @@
 import org.apache.hyracks.api.comm.VSizeFrame;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A {@link FrameSpiller} is used with feeds when "spill.to.disk.on.congestion" is set to true. The spiller spills
@@ -42,7 +43,7 @@
  * "max.spill.size.on.disk"
  */
 public class FrameSpiller {
-    private static final Logger LOGGER = Logger.getLogger(FrameSpiller.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int FRAMES_PER_FILE = 1024;
     public static final double MAX_SPILL_USED_BEFORE_RESUME = 0.8;
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/DataGenerator.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/DataGenerator.java
index 9bc3037..a0feac5 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/DataGenerator.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/DataGenerator.java
@@ -177,12 +177,11 @@
                             : (date.getMonth() + random.nextInt(endDate.getMonth() - date.getMonth()))
                     : random.nextInt(12) + 1;
 
-            int day = (year == endDate.getYear())
-                    ? month == endDate.getMonth()
+            int day =
+                    (year == endDate.getYear()) ? month == endDate.getMonth()
                             ? date.getDay() == endDate.getDay() ? endDate.getDay()
                                     : date.getDay() + random.nextInt(endDate.getDay() - date.getDay())
-                            : random.nextInt(28) + 1
-                    : random.nextInt(28) + 1;
+                            : random.nextInt(28) + 1 : random.nextInt(28) + 1;
             recentDate.reset(month, day, year);
             return recentDate;
         }
@@ -495,9 +494,9 @@
 
     public static class TweetMessage {
 
-        private static final String[] DEFAULT_FIELDS = new String[] { TweetFields.TWEETID, TweetFields.USER,
-                TweetFields.LATITUDE, TweetFields.LONGITUDE, TweetFields.MESSAGE_TEXT, TweetFields.CREATED_AT,
-                TweetFields.COUNTRY };
+        private static final String[] DEFAULT_FIELDS =
+                new String[] { TweetFields.TWEETID, TweetFields.USER, TweetFields.LATITUDE, TweetFields.LONGITUDE,
+                        TweetFields.MESSAGE_TEXT, TweetFields.CREATED_AT, TweetFields.COUNTRY };
 
         private int id;
         private TwitterUser user;
@@ -1183,14 +1182,13 @@
             "Hallam", "Delores", "Cressida", "Carlyle", "Leann", "Kelcey", "Laurence", "Ryan", "Reynold", "Mark",
             "Collyn", "Audie", "Sammy", "Ellery", "Sallie", "Pamelia", "Adolph", "Lydia", "Titania", "Ron", "Bridger",
             "Aline", "Read", "Kelleigh", "Weldon", "Irving", "Garey", "Diggory", "Evander", "Kylee", "Deidre", "Ormond",
-            "Laurine", "Reannon", "Arline", "Pat"};
+            "Laurine", "Reannon", "Arline", "Pat" };
 
     public static final String[] jargon = { "wireless", "signal", "network", "3G", "plan", "touch-screen",
             "customer-service", "reachability", "voice-command", "shortcut-menu", "customization", "platform", "speed",
             "voice-clarity", "voicemail-service" };
 
-    public static final String[] vendors = { "at&t", "verizon", "t-mobile", "sprint", "motorola", "samsung",
-            "iphone" };
+    public static final String[] vendors = { "at&t", "verizon", "t-mobile", "sprint", "motorola", "samsung", "iphone" };
 
     public static final String[] org_list = { "Latsonity", "ganjalax", "Zuncan", "Lexitechno", "Hot-tech", "subtam",
             "Coneflex", "Ganjatax", "physcane", "Tranzap", "Qvohouse", "Zununoing", "jaydax", "Keytech", "goldendexon",
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/TweetGenerator.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/TweetGenerator.java
index 9431a24..cb64604 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/TweetGenerator.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/generator/TweetGenerator.java
@@ -24,14 +24,14 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.external.generator.DataGenerator.TweetMessage;
 import org.apache.asterix.external.generator.DataGenerator.TweetMessageIterator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TweetGenerator {
-    private static final Logger LOGGER = Logger.getLogger(TweetGenerator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final String KEY_DURATION = "duration";
     public static final String KEY_TPS = "tps";
@@ -99,13 +99,13 @@
         outputBuffer.limit(32 * 1024);
     }
 
-    public boolean generateNextBatch(int numTweets) throws IOException{
+    public boolean generateNextBatch(int numTweets) throws IOException {
         boolean moreData = tweetIterator.hasNext();
         if (!moreData) {
             if (outputBuffer.position() > 0) {
                 flush();
             }
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Reached end of batch. Tweet Count: [" + partition + "]" + tweetCount);
             }
             return false;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
index 2aac497..8fbab3c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFile.java
@@ -21,9 +21,9 @@
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Objects;
 
 import org.apache.asterix.common.config.DatasetConfig.ExternalFilePendingOp;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class ExternalFile implements Serializable, Comparable<ExternalFile> {
 
@@ -120,7 +120,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(dataverseName, datasetName, fileName);
+        return Objects.hash(dataverseName, datasetName, fileName);
     }
 
     @Override
@@ -132,8 +132,8 @@
             return false;
         }
         ExternalFile anotherFile = (ExternalFile) obj;
-        return fileNumber == anotherFile.fileNumber && ObjectUtils.equals(dataverseName, anotherFile.getDataverseName())
-                && ObjectUtils.equals(datasetName, anotherFile.getDatasetName());
+        return fileNumber == anotherFile.fileNumber && Objects.equals(dataverseName, anotherFile.getDataverseName())
+                && Objects.equals(datasetName, anotherFile.getDatasetName());
     }
 
     @Override
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFileIndexAccessor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFileIndexAccessor.java
index c11fb61..88b8a14 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFileIndexAccessor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/ExternalFileIndexAccessor.java
@@ -102,7 +102,7 @@
         searchKeyTupleBuilder.reset();
         searchKeyTupleBuilder.addField(intSerde, currentFileNumber);
         searchKey.reset(searchKeyTupleBuilder.getFieldEndOffsets(), searchKeyTupleBuilder.getByteArray());
-        fileIndexSearchCursor.reset();
+        fileIndexSearchCursor.close();
 
         // Perform search
         fileIndexAccessor.search(fileIndexSearchCursor, searchPredicate);
@@ -137,7 +137,7 @@
     public void close() throws HyracksDataException {
         if (index != null) {
             try {
-                fileIndexSearchCursor.close();
+                fileIndexSearchCursor.destroy();
             } finally {
                 indexDataflowHelper.close();
             }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/FileOffsetIndexer.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/FileOffsetIndexer.java
index a15ec6e..a5bff74 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/FileOffsetIndexer.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/FileOffsetIndexer.java
@@ -42,11 +42,11 @@
     protected RecordReader<?, ? extends Writable> recordReader;
 
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<IAObject> intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    private ISerializerDeserializer<IAObject> intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<IAObject> longSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<IAObject> longSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
     @Override
     public void reset(IIndexingDatasource dataSource) throws HyracksDataException {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/IndexingScheduler.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/IndexingScheduler.java
index 5212892..a788a29 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/IndexingScheduler.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/IndexingScheduler.java
@@ -30,7 +30,6 @@
 import java.util.Map;
 import java.util.PriorityQueue;
 import java.util.Random;
-import java.util.logging.Logger;
 
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.mapred.InputSplit;
@@ -39,10 +38,11 @@
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
-import org.apache.hyracks.hdfs.scheduler.Scheduler;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IndexingScheduler {
-    private static final Logger LOGGER = Logger.getLogger(Scheduler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /** a list of NCs */
     private String[] NCs;
@@ -157,10 +157,10 @@
      */
     private void scheduleNonLocalSlots(InputSplit[] splits, final int[] workloads, String[] locations, int slotLimit,
             boolean[] scheduled, final HashMap<String, Integer> locationToNumOfAssignement)
-                    throws IOException, UnknownHostException {
+            throws IOException, UnknownHostException {
 
-        PriorityQueue<String> scheduleCadndiates = new PriorityQueue<String>(NCs.length,
-                Comparator.comparing(locationToNumOfAssignement::get));
+        PriorityQueue<String> scheduleCadndiates =
+                new PriorityQueue<String>(NCs.length, Comparator.comparing(locationToNumOfAssignement::get));
 
         scheduleCadndiates.addAll(Arrays.asList(NCs));
         /*
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordColumnarIndexer.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordColumnarIndexer.java
index 273901c..e6146d4 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordColumnarIndexer.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordColumnarIndexer.java
@@ -45,11 +45,11 @@
     protected RecordReader<?, Writable> recordReader;
 
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<IAObject> intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    private ISerializerDeserializer<IAObject> intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<IAObject> longSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<IAObject> longSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
     @Override
     public void reset(IIndexingDatasource reader) throws HyracksDataException {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordIdReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordIdReader.java
index 5de2d9d..3cca7e1 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordIdReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/indexing/RecordIdReader.java
@@ -57,8 +57,8 @@
 
     public RecordId read(int index) throws HyracksDataException {
         tupleStartOffset = tupleAccessor.getTupleStartOffset(index) + fieldSlotsLength;
-        int fileNumberStartOffset = tupleAccessor.getFieldStartOffset(index,
-                ridFields[IndexingConstants.FILE_NUMBER_FIELD_INDEX]);
+        int fileNumberStartOffset =
+                tupleAccessor.getFieldStartOffset(index, ridFields[IndexingConstants.FILE_NUMBER_FIELD_INDEX]);
         frameBuffer = tupleAccessor.getBuffer();
         if (frameBuffer.get(tupleStartOffset + fileNumberStartOffset) == MISSING_BYTE) {
             return null;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/RecordWithMetadataAndPK.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/RecordWithMetadataAndPK.java
index ebf1d17..f9bc8b2 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/RecordWithMetadataAndPK.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/RecordWithMetadataAndPK.java
@@ -57,24 +57,24 @@
 
     // Serializers
     @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+    private final ISerializerDeserializer<ADouble> doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
     private final AMutableDouble mutableDouble = new AMutableDouble(0);
     @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    private final ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
     private final AMutableString mutableString = new AMutableString(null);
     @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<AInt32> int32Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    private final ISerializerDeserializer<AInt32> int32Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     private final AMutableInt32 mutableInt = new AMutableInt32(0);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    protected ISerializerDeserializer<AInt64> int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     private final AMutableInt64 mutableLong = new AMutableInt64(0);
     @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    private final ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
     private final int[] keyIndicator;
 
     public RecordWithMetadataAndPK(final IRawRecord<T> record, final IAType[] metaTypes, final ARecordType recordType,
@@ -145,8 +145,8 @@
             throws IOException {
         if (length == 0) {
             if (!NonTaggedFormatUtil.isOptional(metaTypes[index])) {
-                throw new RuntimeDataException(
-                        ErrorCode.INPUT_RECORD_RECORD_WITH_METADATA_AND_PK_NULL_IN_NON_OPTIONAL, index);
+                throw new RuntimeDataException(ErrorCode.INPUT_RECORD_RECORD_WITH_METADATA_AND_PK_NULL_IN_NON_OPTIONAL,
+                        index);
             }
             fieldValueBufferOutputs[index].writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG);
         } else {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/converter/DCPMessageToRecordConverter.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/converter/DCPMessageToRecordConverter.java
index f948c1c..e90b168 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/converter/DCPMessageToRecordConverter.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/converter/DCPMessageToRecordConverter.java
@@ -56,8 +56,8 @@
 
     public DCPMessageToRecordConverter() {
         this.value = new CharArrayRecord();
-        this.recordWithMetadata = new RecordWithMetadataAndPK<>(value, CB_META_TYPES,
-                RecordUtil.FULLY_OPEN_RECORD_TYPE, PK_INDICATOR, PK_INDEXES, PK_TYPES);
+        this.recordWithMetadata = new RecordWithMetadataAndPK<>(value, CB_META_TYPES, RecordUtil.FULLY_OPEN_RECORD_TYPE,
+                PK_INDICATOR, PK_INDEXES, PK_TYPES);
     }
 
     @Override
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/AbstractCharRecordLookupReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/AbstractCharRecordLookupReader.java
index f9ec114..6c7c42e 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/AbstractCharRecordLookupReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/AbstractCharRecordLookupReader.java
@@ -64,7 +64,7 @@
         reusableByteBuffer.clear();
         if (reusableByteBuffer.remaining() < value.getLength()) {
             reusableByteBuffer = ByteBuffer
-                    .allocateDirect((int)(value.getLength() * ExternalDataConstants.DEFAULT_BUFFER_INCREMENT_FACTOR));
+                    .allocateDirect((int) (value.getLength() * ExternalDataConstants.DEFAULT_BUFFER_INCREMENT_FACTOR));
         }
         reusableByteBuffer.put(value.getBytes(), 0, value.getLength());
         reusableByteBuffer.flip();
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/RCLookupReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/RCLookupReader.java
index 3f9d90e..c404b80 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/RCLookupReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/RCLookupReader.java
@@ -31,14 +31,15 @@
 import org.apache.hadoop.hive.serde2.columnar.BytesRefArrayWritable;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.Writable;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RCLookupReader extends AbstractHDFSLookupRecordReader<BytesRefArrayWritable> {
     public RCLookupReader(ExternalFileIndexAccessor snapshotAccessor, FileSystem fs, Configuration conf) {
         super(snapshotAccessor, fs, conf);
     }
 
-    private static final Logger LOGGER = Logger.getLogger(RCLookupReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private Reader reader;
     private LongWritable key = new LongWritable();
     private BytesRefArrayWritable value = new BytesRefArrayWritable();
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/SequenceLookupReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/SequenceLookupReader.java
index 23e647f..46ae9ac 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/SequenceLookupReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/SequenceLookupReader.java
@@ -30,7 +30,8 @@
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.Writable;
 import org.apache.hadoop.util.ReflectionUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class SequenceLookupReader extends AbstractCharRecordLookupReader {
 
@@ -38,7 +39,7 @@
         super(snapshotAccessor, fs, conf);
     }
 
-    private static final Logger LOGGER = Logger.getLogger(SequenceLookupReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private Reader reader;
     private Writable key;
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/TextLookupReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/TextLookupReader.java
index 2e1a11a..1ddeedb 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/TextLookupReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/hdfs/TextLookupReader.java
@@ -25,7 +25,8 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TextLookupReader extends AbstractCharRecordLookupReader {
 
@@ -33,7 +34,7 @@
         super(snapshotAccessor, fs, conf);
     }
 
-    private static final Logger LOGGER = Logger.getLogger(TextLookupReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private HDFSTextLineReader reader;
 
     @Override
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/rss/RSSRecordReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/rss/RSSRecordReader.java
index 44da608..1f97300 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/rss/RSSRecordReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/rss/RSSRecordReader.java
@@ -30,7 +30,8 @@
 import org.apache.asterix.external.dataflow.AbstractFeedDataFlowController;
 import org.apache.asterix.external.input.record.GenericRecord;
 import org.apache.asterix.external.util.FeedLogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.rometools.fetcher.FeedFetcher;
 import com.rometools.fetcher.FetcherEvent;
@@ -45,7 +46,7 @@
 
 public class RSSRecordReader implements IRecordReader<SyndEntry> {
 
-    private static final Logger LOGGER = Logger.getLogger(RSSRecordReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private boolean modified = false;
     private Queue<SyndEntry> rssFeedBuffer = new LinkedList<>();
     private FeedFetcherCache feedInfoCache;
@@ -105,7 +106,7 @@
         this.modified = modified;
     }
 
-    private SyndEntry getNextRSSFeed() throws IOException, FeedException, FetcherException  {
+    private SyndEntry getNextRSSFeed() throws IOException, FeedException, FetcherException {
         if (rssFeedBuffer.isEmpty()) {
             fetchFeed();
         }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/EmptyLineSeparatedRecordReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/EmptyLineSeparatedRecordReader.java
index e64c79e..07b6250 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/EmptyLineSeparatedRecordReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/EmptyLineSeparatedRecordReader.java
@@ -29,8 +29,8 @@
 
 public class EmptyLineSeparatedRecordReader extends StreamRecordReader {
 
-    private static final List<String> recordReaderFormats = Collections
-            .unmodifiableList(Arrays.asList(ExternalDataConstants.FORMAT_LINE_SEPARATED));
+    private static final List<String> recordReaderFormats =
+            Collections.unmodifiableList(Arrays.asList(ExternalDataConstants.FORMAT_LINE_SEPARATED));
     private static final String REQUIRED_CONFIGS = "";
     protected Map<String, String> config;
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/SemiStructuredRecordReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/SemiStructuredRecordReader.java
index e1e1f08..cc4b7f9 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/SemiStructuredRecordReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/SemiStructuredRecordReader.java
@@ -39,9 +39,9 @@
     private char recordStart;
     private char recordEnd;
     private int recordNumber = 0;
-    private static final List<String> recordReaderFormats = Collections
-            .unmodifiableList(Arrays.asList(ExternalDataConstants.FORMAT_ADM, ExternalDataConstants.FORMAT_JSON,
-                    ExternalDataConstants.FORMAT_SEMISTRUCTURED));
+    private static final List<String> recordReaderFormats =
+            Collections.unmodifiableList(Arrays.asList(ExternalDataConstants.FORMAT_ADM,
+                    ExternalDataConstants.FORMAT_JSON, ExternalDataConstants.FORMAT_SEMISTRUCTURED));
     private static final String REQUIRED_CONFIGS = "";
 
     @Override
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/StreamRecordReaderFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/StreamRecordReaderFactory.java
index 0591775..776aa0c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/StreamRecordReaderFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/StreamRecordReaderFactory.java
@@ -94,8 +94,8 @@
     public IRecordReader<? extends char[]> createRecordReader(IHyracksTaskContext ctx, int partition)
             throws HyracksDataException {
         try {
-            StreamRecordReader streamRecordReader = (StreamRecordReader) recordReaderClazz.getConstructor()
-                    .newInstance();
+            StreamRecordReader streamRecordReader =
+                    (StreamRecordReader) recordReaderClazz.getConstructor().newInstance();
             streamRecordReader.configure(streamFactory.createInputStream(ctx, partition), configuration);
             return streamRecordReader;
         } catch (InstantiationException | IllegalAccessException | InvocationTargetException
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/twitter/TwitterRecordReaderFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/twitter/TwitterRecordReaderFactory.java
index 3fb1d5f..8182dcd 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/twitter/TwitterRecordReaderFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/twitter/TwitterRecordReaderFactory.java
@@ -22,8 +22,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
@@ -40,13 +38,15 @@
 import org.apache.hyracks.api.application.IServiceContext;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import twitter4j.FilterQuery;
 
 public class TwitterRecordReaderFactory implements IRecordReaderFactory<String> {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(TwitterRecordReaderFactory.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String DEFAULT_INTERVAL = "10"; // 10 seconds
     private static final int INTAKE_CARDINALITY = 1; // degree of parallelism at intake stage
@@ -113,8 +113,8 @@
                 }
             } else {
                 configuration.put(SearchAPIConstants.INTERVAL, DEFAULT_INTERVAL);
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning(" Parameter " + SearchAPIConstants.INTERVAL + " not defined, using default ("
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.warn(" Parameter " + SearchAPIConstants.INTERVAL + " not defined, using default ("
                             + DEFAULT_INTERVAL + ")");
                 }
             }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
index c5ca129..36781fe 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/LocalFSInputStream.java
@@ -21,8 +21,6 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.ExceptionUtils;
@@ -32,10 +30,13 @@
 import org.apache.asterix.external.util.FeedLogManager;
 import org.apache.asterix.external.util.FileSystemWatcher;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LocalFSInputStream extends AsterixInputStream {
 
-    private static final Logger LOGGER = Logger.getLogger(LocalFSInputStream.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final FileSystemWatcher watcher;
     private FileInputStream in;
     private byte lastByte;
@@ -163,18 +164,18 @@
                 try {
                     logManager.logRecord(currentFile.getAbsolutePath(), "Corrupted input file");
                 } catch (IOException e) {
-                    LOGGER.log(Level.WARNING, "Filed to write to feed log file", e);
+                    LOGGER.log(Level.WARN, "Filed to write to feed log file", e);
                 }
-                LOGGER.log(Level.WARNING, "Corrupted input file: " + currentFile.getAbsolutePath());
+                LOGGER.log(Level.WARN, "Corrupted input file: " + currentFile.getAbsolutePath());
             }
             try {
                 advance();
                 return true;
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "An exception was thrown while trying to skip a file", e);
+                LOGGER.log(Level.WARN, "An exception was thrown while trying to skip a file", e);
             }
         }
-        LOGGER.log(Level.WARNING, "Failed to recover from failure", th);
+        LOGGER.log(Level.WARN, "Failed to recover from failure", th);
         return false;
     }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/SocketServerInputStream.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/SocketServerInputStream.java
index ea55b5b..b487b40 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/SocketServerInputStream.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/SocketServerInputStream.java
@@ -25,10 +25,11 @@
 
 import org.apache.asterix.external.api.AsterixInputStream;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class SocketServerInputStream extends AsterixInputStream {
-    private static final Logger LOGGER = Logger.getLogger(SocketServerInputStream.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private ServerSocket server;
     private Socket socket;
     private InputStream connectionStream;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/TwitterFirehoseInputStream.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/TwitterFirehoseInputStream.java
index 3928b19..49d851d 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/TwitterFirehoseInputStream.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/TwitterFirehoseInputStream.java
@@ -25,24 +25,22 @@
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.external.api.AsterixInputStream;
 import org.apache.asterix.external.generator.TweetGenerator;
-import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TwitterFirehoseInputStream extends AsterixInputStream {
 
-    private static final Logger LOGGER = Logger.getLogger(TwitterFirehoseInputStream.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ExecutorService executorService;
     private final PipedOutputStream outputStream;
     private final PipedInputStream inputStream;
     private final DataProvider dataProvider;
     private boolean started;
 
-    public TwitterFirehoseInputStream(Map<String, String> configuration, int partition)
-            throws IOException {
+    public TwitterFirehoseInputStream(Map<String, String> configuration, int partition) throws IOException {
         executorService = Executors.newCachedThreadPool();
         outputStream = new PipedOutputStream();
         inputStream = new PipedInputStream(outputStream);
@@ -144,7 +142,7 @@
                     os.close();
                     break;
                 } catch (Exception e) {
-                    LOGGER.warning("Exception in adapter " + e.getMessage());
+                    LOGGER.warn("Exception in adapter " + e.getMessage());
                 }
             }
         }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/factory/LocalFSInputStreamFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/factory/LocalFSInputStreamFactory.java
index d7afa13..6d91067 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/factory/LocalFSInputStreamFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/stream/factory/LocalFSInputStreamFactory.java
@@ -25,8 +25,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
@@ -46,13 +44,16 @@
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.UnmanagedFileSplit;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LocalFSInputStreamFactory implements IInputStreamFactory {
 
     private static final long serialVersionUID = 1L;
 
     protected static final INodeResolver DEFAULT_NODE_RESOLVER = new NodeResolverFactory().createNodeResolver();
-    protected static final Logger LOGGER = Logger.getLogger(LocalFSInputStreamFactory.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
     protected static INodeResolver nodeResolver;
     protected Map<String, String> configuration;
     protected UnmanagedFileSplit[] inputFileSplits;
@@ -155,8 +156,8 @@
                         .createNodeResolver();
 
             } catch (Exception e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Unable to create node resolver from the configured classname "
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, "Unable to create node resolver from the configured classname "
                             + configuredNodeResolverFactory + "\n" + e.getMessage());
                 }
                 nodeResolver = DEFAULT_NODE_RESOLVER;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
index c644413..63028ac 100755
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/ExternalFunction.java
@@ -56,8 +56,7 @@
     protected final JavaFunctionHelper functionHelper;
 
     public ExternalFunction(IExternalFunctionInfo finfo, IScalarEvaluatorFactory args[], IHyracksTaskContext context,
-            IApplicationContext appCtx)
-            throws HyracksDataException {
+            IApplicationContext appCtx) throws HyracksDataException {
         this.finfo = finfo;
         this.evaluatorFactories = args;
         argumentEvaluators = new IScalarEvaluator[args.length];
@@ -78,8 +77,7 @@
             externalFunctionFactory = (IFunctionFactory) clazz.newInstance();
             externalFunction = externalFunctionFactory.getExternalFunction();
         } catch (Exception e) {
-            throw new RuntimeDataException(ErrorCode.LIBRARY_EXTERNAL_FUNCTION_UNABLE_TO_LOAD_CLASS, e,
-                    classname);
+            throw new RuntimeDataException(ErrorCode.LIBRARY_EXTERNAL_FUNCTION_UNABLE_TO_LOAD_CLASS, e, classname);
         }
     }
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
index 916e668..bc53f0b 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JTypeObjectFactory.java
@@ -47,7 +47,6 @@
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.util.container.IObjectFactory;
 
-
 public class JTypeObjectFactory implements IObjectFactory<IJObject, IAType> {
 
     public static final JTypeObjectFactory INSTANCE = new JTypeObjectFactory();
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
index a369888..617bbbc 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/JavaFunctionHelper.java
@@ -52,8 +52,8 @@
     private final IDataOutputProvider outputProvider;
     private final IJObject[] arguments;
     private IJObject resultHolder;
-    private final IObjectPool<IJObject, IAType> objectPool = new ListObjectPool<IJObject, IAType>(
-            JTypeObjectFactory.INSTANCE);
+    private final IObjectPool<IJObject, IAType> objectPool =
+            new ListObjectPool<IJObject, IAType>(JTypeObjectFactory.INSTANCE);
     private final JObjectPointableVisitor pointableVisitor;
     private final PointableAllocator pointableAllocator;
     private final Map<Integer, TypeInfo> poolTypeInfo;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
index 2b5e248..8f35c80 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectAccessors.java
@@ -23,10 +23,7 @@
 import java.io.IOException;
 import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
@@ -94,10 +91,13 @@
 import org.apache.asterix.om.util.container.IObjectPool;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.util.string.UTF8StringReader;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class JObjectAccessors {
 
-    private static final Logger LOGGER = Logger.getLogger(JObjectAccessors.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private JObjectAccessors() {
     }
@@ -544,7 +544,7 @@
                 }
 
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Failure while accessing a java record", e);
+                LOGGER.log(Level.WARN, "Failure while accessing a java record", e);
                 throw HyracksDataException.create(e);
             }
             return jRecord;
@@ -573,32 +573,27 @@
             JList list = pointable.ordered() ? new JOrderedList(listType) : new JUnorderedList(listType);
             IJObject listItem;
             int index = 0;
-            try {
-                for (IVisitablePointable itemPointable : items) {
-                    IVisitablePointable itemTagPointable = itemTags.get(index);
-                    ATypeTag itemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                            .deserialize(itemTagPointable.getByteArray()[itemTagPointable.getStartOffset()]);
-                    IAType fieldType;
-                    fieldType = TypeTagUtil.getBuiltinTypeByTag(itemTypeTag);
-                    typeInfo.reset(fieldType, itemTypeTag);
-                    switch (itemTypeTag) {
-                        case OBJECT:
-                            listItem = pointableVisitor.visit((ARecordVisitablePointable) itemPointable, typeInfo);
-                            break;
-                        case MULTISET:
-                        case ARRAY:
-                            listItem = pointableVisitor.visit((AListVisitablePointable) itemPointable, typeInfo);
-                            break;
-                        case ANY:
-                            throw new RuntimeDataException(ErrorCode.LIBRARY_JOBJECT_ACCESSOR_CANNOT_PARSE_TYPE,
-                                    listType.getTypeTag());
-                        default:
-                            listItem = pointableVisitor.visit((AFlatValuePointable) itemPointable, typeInfo);
-                    }
-                    list.add(listItem);
+            for (IVisitablePointable itemPointable : items) {
+                IVisitablePointable itemTagPointable = itemTags.get(index);
+                ATypeTag itemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
+                        .deserialize(itemTagPointable.getByteArray()[itemTagPointable.getStartOffset()]);
+                final IAType fieldType = TypeTagUtil.getBuiltinTypeByTag(itemTypeTag);
+                typeInfo.reset(fieldType, itemTypeTag);
+                switch (itemTypeTag) {
+                    case OBJECT:
+                        listItem = pointableVisitor.visit((ARecordVisitablePointable) itemPointable, typeInfo);
+                        break;
+                    case MULTISET:
+                    case ARRAY:
+                        listItem = pointableVisitor.visit((AListVisitablePointable) itemPointable, typeInfo);
+                        break;
+                    case ANY:
+                        throw new RuntimeDataException(ErrorCode.LIBRARY_JOBJECT_ACCESSOR_CANNOT_PARSE_TYPE,
+                                listType.getTypeTag());
+                    default:
+                        listItem = pointableVisitor.visit((AFlatValuePointable) itemPointable, typeInfo);
                 }
-            } catch (AsterixException exception) {
-                throw HyracksDataException.create(exception);
+                list.add(listItem);
             }
             return list;
         }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
index dc8e461..960b346 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/library/java/JObjectPointableVisitor.java
@@ -41,8 +41,10 @@
 public class JObjectPointableVisitor implements IVisitablePointableVisitor<IJObject, TypeInfo> {
 
     private final Map<ATypeTag, IJObjectAccessor> flatJObjectAccessors = new HashMap<ATypeTag, IJObjectAccessor>();
-    private final Map<IVisitablePointable, IJRecordAccessor> raccessorToJObject = new HashMap<IVisitablePointable, IJRecordAccessor>();
-    private final Map<IVisitablePointable, IJListAccessor> laccessorToPrinter = new HashMap<IVisitablePointable, IJListAccessor>();
+    private final Map<IVisitablePointable, IJRecordAccessor> raccessorToJObject =
+            new HashMap<IVisitablePointable, IJRecordAccessor>();
+    private final Map<IVisitablePointable, IJListAccessor> laccessorToPrinter =
+            new HashMap<IVisitablePointable, IJListAccessor>();
 
     @Override
     public IJObject visit(AListVisitablePointable accessor, TypeInfo arg) throws HyracksDataException {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalDatasetIndexesCommitOperatorDescriptor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalDatasetIndexesCommitOperatorDescriptor.java
index fe4f93c..337946b 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalDatasetIndexesCommitOperatorDescriptor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/ExternalDatasetIndexesCommitOperatorDescriptor.java
@@ -29,12 +29,12 @@
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ITwoPCIndex;
 import org.apache.hyracks.storage.common.IIndex;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalDatasetIndexesCommitOperatorDescriptor extends AbstractExternalDatasetIndexesOperatorDescriptor {
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER =
-            Logger.getLogger(ExternalDatasetIndexesCommitOperatorDescriptor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public ExternalDatasetIndexesCommitOperatorDescriptor(IOperatorDescriptorRegistry spec,
             List<IIndexDataflowHelperFactory> indexesDataflowHelperFactories) {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorDescriptor.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorDescriptor.java
index 770e978..7a0341a 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorDescriptor.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorDescriptor.java
@@ -19,7 +19,6 @@
 package org.apache.asterix.external.operators;
 
 import java.util.Map;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.EntityId;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -37,6 +36,8 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.dataflow.std.base.AbstractSingleActivityOperatorDescriptor;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * An operator responsible for establishing connection with external data source and parsing,
@@ -48,7 +49,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    private static final Logger LOGGER = Logger.getLogger(FeedIntakeOperatorDescriptor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /** The unique identifier of the feed that is being ingested. **/
     private final EntityId feedId;
@@ -77,14 +78,14 @@
         this.outRecDescs[0] = rDesc;
     }
 
-    public FeedIntakeOperatorDescriptor(JobSpecification spec, IFeed primaryFeed, String adapterLibraryName,
+    public FeedIntakeOperatorDescriptor(JobSpecification spec, IFeed feed, String adapterLibraryName,
             String adapterFactoryClassName, ARecordType adapterOutputType, FeedPolicyAccessor policyAccessor,
             RecordDescriptor rDesc) {
         super(spec, 0, 1);
-        this.feedId = new EntityId(FEED_EXTENSION_NAME, primaryFeed.getDataverseName(), primaryFeed.getFeedName());
+        this.feedId = new EntityId(FEED_EXTENSION_NAME, feed.getDataverseName(), feed.getFeedName());
         this.adaptorFactoryClassName = adapterFactoryClassName;
         this.adaptorLibraryName = adapterLibraryName;
-        this.adaptorConfiguration = primaryFeed.getAdapterConfiguration();
+        this.adaptorConfiguration = feed.getConfiguration();
         this.adapterOutputType = adapterOutputType;
         this.policyAccessor = policyAccessor;
         this.outRecDescs[0] = rDesc;
@@ -117,7 +118,7 @@
             RuntimeDataException err = new RuntimeDataException(
                     ErrorCode.OPERATORS_FEED_INTAKE_OPERATOR_DESCRIPTOR_CLASSLOADER_NOT_CONFIGURED, adaptorLibraryName,
                     feedId.getDataverse());
-            LOGGER.severe(err.getMessage());
+            LOGGER.error(err.getMessage());
             throw err;
         }
         return adapterFactory;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorNodePushable.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorNodePushable.java
index 7907e69..e1c339c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorNodePushable.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedIntakeOperatorNodePushable.java
@@ -18,9 +18,6 @@
  */
 package org.apache.asterix.external.operators;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.asterix.active.ActiveRuntimeId;
 import org.apache.asterix.active.ActiveSourceOperatorNodePushable;
 import org.apache.asterix.active.EntityId;
@@ -35,6 +32,9 @@
 import org.apache.hyracks.api.util.HyracksConstants;
 import org.apache.hyracks.dataflow.common.io.MessagingFrameTupleAppender;
 import org.apache.hyracks.dataflow.common.utils.TaskUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * The runtime for @see{FeedIntakeOperationDescriptor}.
@@ -42,7 +42,7 @@
  * The artifacts are lazily activated when a feed receives a subscription request.
  */
 public class FeedIntakeOperatorNodePushable extends ActiveSourceOperatorNodePushable {
-    private static final Logger LOGGER = Logger.getLogger(FeedIntakeOperatorNodePushable.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     // TODO: Make configurable https://issues.apache.org/jira/browse/ASTERIXDB-2065
     public static final int DEFAULT_ABORT_TIMEOUT = 10000;
     private final FeedIntakeOperatorDescriptor opDesc;
@@ -81,7 +81,7 @@
             message.getBuffer().flip();
             run();
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failure during data ingestion", e);
+            LOGGER.log(Level.WARN, "Failure during data ingestion", e);
             throw e;
         } finally {
             writer.close();
@@ -98,7 +98,7 @@
             Thread.currentThread().interrupt();
             throw HyracksDataException.create(e);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Unhandled Exception", e);
+            LOGGER.log(Level.WARN, "Unhandled Exception", e);
             throw HyracksDataException.create(e);
         }
     }
@@ -113,7 +113,7 @@
             } catch (InterruptedException e) {
                 throw e;
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Exception during feed ingestion ", e);
+                LOGGER.log(Level.WARN, "Exception during feed ingestion ", e);
                 throw HyracksDataException.create(e);
             }
         }
@@ -131,10 +131,10 @@
                 }
             } catch (HyracksDataException hde) {
                 if (hde.getComponent() == ErrorCode.HYRACKS && hde.getErrorCode() == ErrorCode.TIMEOUT) {
-                    LOGGER.log(Level.WARNING, runtimeId + " stop adapter timed out. interrupting the thread...", hde);
+                    LOGGER.log(Level.WARN, runtimeId + " stop adapter timed out. interrupting the thread...", hde);
                     taskThread.interrupt();
                 } else {
-                    LOGGER.log(Level.WARNING, "Failure during attempt to stop " + runtimeId, hde);
+                    LOGGER.log(Level.WARN, "Failure during attempt to stop " + runtimeId, hde);
                     throw hde;
                 }
             }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaComputeNodePushable.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaComputeNodePushable.java
index 24a7462..477a777 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaComputeNodePushable.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaComputeNodePushable.java
@@ -20,8 +20,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveManager;
 import org.apache.asterix.active.ActiveRuntimeId;
@@ -42,13 +40,16 @@
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /*
  * This IFrameWriter doesn't follow the contract
  */
 public class FeedMetaComputeNodePushable extends AbstractUnaryInputUnaryOutputOperatorNodePushable {
 
-    private static final Logger LOGGER = Logger.getLogger(FeedMetaComputeNodePushable.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /** Runtime node pushable corresponding to the core feed operator **/
     private AbstractUnaryInputUnaryOutputOperatorNodePushable coreOperator;
@@ -142,7 +143,7 @@
             FeedUtils.processFeedMessage(buffer, message, fta);
             writer.nextFrame(buffer);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, e.getMessage(), e);
+            LOGGER.log(Level.WARN, e.getMessage(), e);
             throw new HyracksDataException(e);
         }
     }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
index 459a3ea..ecd28be 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/operators/FeedMetaStoreNodePushable.java
@@ -20,8 +20,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.active.ActiveManager;
 import org.apache.asterix.active.ActiveRuntimeId;
@@ -44,10 +42,13 @@
 import org.apache.hyracks.dataflow.common.utils.TaskUtil;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
 import org.apache.hyracks.util.trace.ITracer;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FeedMetaStoreNodePushable extends AbstractUnaryInputUnaryOutputOperatorNodePushable {
 
-    private static final Logger LOGGER = Logger.getLogger(FeedMetaStoreNodePushable.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /** Runtime node pushable corresponding to the core feed operator **/
     private AbstractUnaryInputUnaryOutputOperatorNodePushable insertOperator;
@@ -118,7 +119,7 @@
             initializeNewFeedRuntime(runtimeId);
             insertOperator.open();
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failed to open feed store operator", e);
+            LOGGER.log(Level.WARN, "Failed to open feed store operator", e);
             throw new HyracksDataException(e);
         }
     }
@@ -148,7 +149,7 @@
             FeedUtils.processFeedMessage(buffer, message, fta);
             writer.nextFrame(buffer);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failure Processing a frame at store side", e);
+            LOGGER.log(Level.WARN, "Failure Processing a frame at store side", e);
             throw HyracksDataException.create(e);
         } finally {
             tracer.durationE(tid, traceCategory, null);
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
index d964788..c0ccf11 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/ADMDataParser.java
@@ -65,12 +65,12 @@
 
     private final ArrayBackedValueStorage castBuffer = new ArrayBackedValueStorage();
 
-    private final IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool = new ListObjectPool<IARecordBuilder, ATypeTag>(
-            new RecordBuilderFactory());
-    private final IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool = new ListObjectPool<IAsterixListBuilder, ATypeTag>(
-            new ListBuilderFactory());
-    private final IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool = new ListObjectPool<IMutableValueStorage, ATypeTag>(
-            new AbvsBuilderFactory());
+    private final IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool =
+            new ListObjectPool<IARecordBuilder, ATypeTag>(new RecordBuilderFactory());
+    private final IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool =
+            new ListObjectPool<IAsterixListBuilder, ATypeTag>(new ListBuilderFactory());
+    private final IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool =
+            new ListObjectPool<IMutableValueStorage, ATypeTag>(new AbvsBuilderFactory());
 
     private final String mismatchErrorMessage = "Mismatch Type, expecting a value of type ";
     private final String mismatchErrorMessage2 = " got a value of type ";
@@ -198,8 +198,7 @@
                 if (checkType(ATypeTag.BOOLEAN, objectType)) {
                     booleanSerde.serialize(ABoolean.TRUE, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_BOOLEAN_CONS:
@@ -209,8 +208,7 @@
                 if (checkType(ATypeTag.BOOLEAN, objectType)) {
                     booleanSerde.serialize(ABoolean.FALSE, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_DOUBLE_LITERAL:
@@ -256,19 +254,18 @@
                 break;
             case AdmLexer.TOKEN_STRING_LITERAL:
                 if (checkType(ATypeTag.STRING, objectType)) {
-                    String tokenImage = admLexer.getLastTokenImage().substring(1,
-                            admLexer.getLastTokenImage().length() - 1);
+                    String tokenImage =
+                            admLexer.getLastTokenImage().substring(1, admLexer.getLastTokenImage().length() - 1);
                     aString.setValue(admLexer.containsEscapes() ? replaceEscapes(tokenImage) : tokenImage);
                     stringSerde.serialize(aString, out);
                 } else if (checkType(ATypeTag.UUID, objectType)) {
                     // Dealing with UUID type that is represented by a string
-                    String tokenImage = admLexer.getLastTokenImage().substring(1,
-                            admLexer.getLastTokenImage().length() - 1);
+                    String tokenImage =
+                            admLexer.getLastTokenImage().substring(1, admLexer.getLastTokenImage().length() - 1);
                     aUUID.parseUUIDString(tokenImage);
                     uuidSerde.serialize(aUUID, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_STRING_CONS:
@@ -286,8 +283,7 @@
                         }
                     }
                 }
-                throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                        objectType.getTypeName());
+                throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
             case AdmLexer.TOKEN_DATE_CONS:
                 parseConstructor(ATypeTag.DATE, objectType, out);
                 break;
@@ -302,8 +298,7 @@
                     objectType = getComplexType(objectType, ATypeTag.INTERVAL);
                     parseInterval(ATypeTag.INTERVAL, objectType, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_DURATION_CONS:
@@ -338,8 +333,7 @@
                     objectType = getComplexType(objectType, ATypeTag.MULTISET);
                     parseUnorderedList((AUnorderedListType) objectType, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_START_ORDERED_LIST:
@@ -347,8 +341,7 @@
                     objectType = getComplexType(objectType, ATypeTag.ARRAY);
                     parseOrderedList((AOrderedListType) objectType, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_START_RECORD:
@@ -356,8 +349,7 @@
                     objectType = getComplexType(objectType, ATypeTag.OBJECT);
                     parseRecord((ARecordType) objectType, out);
                 } else {
-                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH,
-                            objectType.getTypeName());
+                    throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, objectType.getTypeName());
                 }
                 break;
             case AdmLexer.TOKEN_UUID_CONS:
@@ -407,8 +399,7 @@
                         readpos += 4;
                         break;
                     default:
-                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_ILLEGAL_ESCAPE,
-                                chars[readpos + 1]);
+                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_ILLEGAL_ESCAPE, chars[readpos + 1]);
                 }
                 ++readpos;
                 movemarker = readpos + 1;
@@ -517,12 +508,12 @@
                     expectingRecordField = false;
 
                     if (recType != null) {
-                        String fldName = admLexer.getLastTokenImage().substring(1,
-                                admLexer.getLastTokenImage().length() - 1);
+                        String fldName =
+                                admLexer.getLastTokenImage().substring(1, admLexer.getLastTokenImage().length() - 1);
                         fieldId = recBuilder.getFieldId(fldName);
                         if ((fieldId < 0) && !recType.isOpen()) {
-                            throw new ParseException(
-                                    ErrorCode.PARSER_ADM_DATA_PARSER_EXTRA_FIELD_IN_CLOSED_RECORD, fldName);
+                            throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_EXTRA_FIELD_IN_CLOSED_RECORD,
+                                    fldName);
                         } else if ((fieldId < 0) && recType.isOpen()) {
                             aStringFieldName.setValue(admLexer.getLastTokenImage().substring(1,
                                     admLexer.getLastTokenImage().length() - 1));
@@ -545,8 +536,7 @@
 
                     token = admLexer.next();
                     if (token != AdmLexer.TOKEN_COLON) {
-                        throw new ParseException(
-                                ErrorCode.PARSER_ADM_DATA_PARSER_UNEXPECTED_TOKEN_WHEN_EXPECT_COMMA,
+                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_UNEXPECTED_TOKEN_WHEN_EXPECT_COMMA,
                                 AdmLexer.tokenKindToString(token));
                     }
 
@@ -561,12 +551,10 @@
                     break;
                 case AdmLexer.TOKEN_COMMA:
                     if (first) {
-                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_FOUND_COMMA_WHEN,
-                                "before any");
+                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_FOUND_COMMA_WHEN, "before any");
                     }
                     if (expectingRecordField) {
-                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_FOUND_COMMA_WHEN,
-                                "expecting a");
+                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_FOUND_COMMA_WHEN, "expecting a");
                     }
                     expectingRecordField = true;
                     break;
@@ -675,8 +663,8 @@
                 String arg = admLexer.getLastTokenImage();
                 switch (tag) {
                     case DATE:
-                        chrononTimeInMs += (parseDatePart(arg, 0, arg.length() - 1)
-                                / GregorianCalendarSystem.CHRONON_OF_DAY);
+                        chrononTimeInMs +=
+                                (parseDatePart(arg, 0, arg.length() - 1) / GregorianCalendarSystem.CHRONON_OF_DAY);
                         break;
                     case TIME:
                         chrononTimeInMs += parseTimePart(arg, 0, arg.length() - 1);
@@ -687,8 +675,8 @@
                             throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_INTERVAL_INVALID_DATETIME);
                         }
                         chrononTimeInMs += parseDatePart(arg, 0, timeSeperatorOffsetInDatetimeString - 1);
-                        chrononTimeInMs += parseTimePart(arg, timeSeperatorOffsetInDatetimeString + 1,
-                                arg.length() - 1);
+                        chrononTimeInMs +=
+                                parseTimePart(arg, timeSeperatorOffsetInDatetimeString + 1, arg.length() - 1);
                         break;
                     default:
                         throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_INTERVAL_UNSUPPORTED_TYPE);
@@ -874,18 +862,17 @@
             if (token == AdmLexer.TOKEN_CONSTRUCTOR_OPEN) {
                 token = admLexer.next();
                 if (token == AdmLexer.TOKEN_STRING_LITERAL) {
-                    String unquoted = admLexer.getLastTokenImage().substring(1,
-                            admLexer.getLastTokenImage().length() - 1);
+                    String unquoted =
+                            admLexer.getLastTokenImage().substring(1, admLexer.getLastTokenImage().length() - 1);
                     if (!parseValue(unquoted, typeTag, dataOutput)) {
-                        throw new ParseException(
-                                ErrorCode.PARSER_ADM_DATA_PARSER_CONSTRUCTOR_MISSING_DESERIALIZER,
+                        throw new ParseException(ErrorCode.PARSER_ADM_DATA_PARSER_CONSTRUCTOR_MISSING_DESERIALIZER,
                                 AdmLexer.tokenKindToString(token));
                     }
                     token = admLexer.next();
                     if (token == AdmLexer.TOKEN_CONSTRUCTOR_CLOSE) {
                         if (targetTypeTag != typeTag) {
-                            ITypeConvertComputer promoteComputer = ATypeHierarchy.getTypePromoteComputer(typeTag,
-                                    targetTypeTag);
+                            ITypeConvertComputer promoteComputer =
+                                    ATypeHierarchy.getTypePromoteComputer(typeTag, targetTypeTag);
                             // the availability if the promote computer should be consistent with
                             // the availability of a target type
                             assert promoteComputer != null;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
index 1cbe364..8351931 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractDataParser.java
@@ -110,35 +110,35 @@
 
     // Serializers
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+    protected ISerializerDeserializer<ADouble> doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getAStringSerializerDeserializer();
+    protected ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getAStringSerializerDeserializer();
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ABinary> binarySerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABINARY);
+    protected ISerializerDeserializer<ABinary> binarySerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABINARY);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AFloat> floatSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AFLOAT);
+    protected ISerializerDeserializer<AFloat> floatSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt8> int8Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT8);
+    protected ISerializerDeserializer<AInt8> int8Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT8);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt16> int16Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT16);
+    protected ISerializerDeserializer<AInt16> int16Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT16);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt32> int32Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    protected ISerializerDeserializer<AInt32> int32Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    protected ISerializerDeserializer<AInt64> int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    protected ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     protected final HexParser hexParser = new HexParser();
     protected final Base64Parser base64Parser = new Base64Parser();
@@ -147,23 +147,23 @@
     // (xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx) when parsing the data.
     // Thus, we need to call UUID.fromStringToAMutableUUID() to convert it to the internal representation (byte []).
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AUUID> uuidSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AUUID);
+    protected ISerializerDeserializer<AUUID> uuidSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AUUID);
 
     // To avoid race conditions, the serdes for temporal and spatial data types needs to be one per parser
     // ^^^^^^^^^^^^^^^^^^^^^^^^ ??? then why all these serdes are static?
     @SuppressWarnings("unchecked")
-    protected static final ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ATIME);
+    protected static final ISerializerDeserializer<ATime> timeSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
     @SuppressWarnings("unchecked")
-    protected static final ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADATE);
+    protected static final ISerializerDeserializer<ADate> dateSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
     @SuppressWarnings("unchecked")
-    protected static final ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADATETIME);
+    protected static final ISerializerDeserializer<ADateTime> datetimeSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
     @SuppressWarnings("unchecked")
-    protected static final ISerializerDeserializer<ADuration> durationSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADURATION);
+    protected static final ISerializerDeserializer<ADuration> durationSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
     @SuppressWarnings("unchecked")
     protected static final ISerializerDeserializer<ADayTimeDuration> dayTimeDurationSerde =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADAYTIMEDURATION);
@@ -171,23 +171,23 @@
     protected static final ISerializerDeserializer<AYearMonthDuration> yearMonthDurationSerde =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AYEARMONTHDURATION);
     @SuppressWarnings("unchecked")
-    protected final static ISerializerDeserializer<APoint> pointSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.APOINT);
+    protected final static ISerializerDeserializer<APoint> pointSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.APOINT);
     @SuppressWarnings("unchecked")
-    protected final static ISerializerDeserializer<APoint3D> point3DSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.APOINT3D);
+    protected final static ISerializerDeserializer<APoint3D> point3DSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.APOINT3D);
     @SuppressWarnings("unchecked")
-    protected final static ISerializerDeserializer<ACircle> circleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ACIRCLE);
+    protected final static ISerializerDeserializer<ACircle> circleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ACIRCLE);
     @SuppressWarnings("unchecked")
-    protected final static ISerializerDeserializer<ARectangle> rectangleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ARECTANGLE);
+    protected final static ISerializerDeserializer<ARectangle> rectangleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ARECTANGLE);
     @SuppressWarnings("unchecked")
-    protected final static ISerializerDeserializer<ALine> lineSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ALINE);
+    protected final static ISerializerDeserializer<ALine> lineSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ALINE);
     @SuppressWarnings("unchecked")
-    protected static final ISerializerDeserializer<AInterval> intervalSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINTERVAL);
+    protected static final ISerializerDeserializer<AInterval> intervalSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
 
     protected String filename;
 
@@ -224,8 +224,8 @@
             }
         }
         long chrononTimeInMs = ADateParserFactory.parseDatePart(datetime, 0, timeOffset);
-        chrononTimeInMs += ATimeParserFactory.parseTimePart(datetime, timeOffset + 1,
-                datetime.length() - timeOffset - 1);
+        chrononTimeInMs +=
+                ATimeParserFactory.parseTimePart(datetime, timeOffset + 1, datetime.length() - timeOffset - 1);
         aDateTime.setValue(chrononTimeInMs);
         datetimeSerde.serialize(aDateTime, out);
     }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractNestedDataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractNestedDataParser.java
new file mode 100644
index 0000000..c6f605d
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/AbstractNestedDataParser.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser;
+
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.BitSet;
+
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.exceptions.RuntimeDataException;
+import org.apache.asterix.om.base.AUnorderedList;
+import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AUnionType;
+import org.apache.asterix.om.types.AUnorderedListType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
+import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+/**
+ * Abstract class for nested formats (ADM, JSON, XML ... etc)
+ * TODO(wyk): remove extends AbstractDataParser and only take what's needed from it.
+ * TODO(wyk): find a way to support ADM constructors for ADMDataParser
+ */
+public abstract class AbstractNestedDataParser<T> extends AbstractDataParser {
+
+    private T currentParsedToken;
+
+    /**
+     * Parse object using the defined recordType.
+     *
+     * @param recordType
+     *            {@value RecordUtil.FULLY_OPEN_RECORD_TYPE} if parsing open object
+     * @param out
+     * @throws HyracksDataException
+     */
+    protected abstract void parseObject(ARecordType recordType, DataOutput out) throws IOException;
+
+    /**
+     * Parse array using the defined listType.
+     *
+     * NOTE: currently AsterixDB only supports null values for open collection types.
+     *
+     * @param recordType
+     *            {@value AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE} if parsing open array
+     * @param out
+     * @throws HyracksDataException
+     */
+    protected abstract void parseArray(AOrderedListType listType, DataOutput out) throws IOException;
+
+    /**
+     * Parse multiset using the defined listType.
+     *
+     * NOTE: currently AsterixDB only supports null values for open collection types.
+     *
+     * @param recordType
+     *            {@value AUnorderedListType.FULLY_OPEN_UNORDEREDLIST_TYPE} if parsing open multiset
+     * @param out
+     * @throws HyracksDataException
+     */
+    protected abstract void parseMultiset(AUnorderedList listType, DataOutput out) throws IOException;
+
+    /**
+     * Map the third-party parser's token to {@link T}
+     * This method is called by nextToken to set {@link AbstractNestedDataParser#currentParsedToken}
+     *
+     * @return the corresponding token
+     * @throws IOException
+     */
+    protected abstract T advanceToNextToken() throws IOException;
+
+    public final T nextToken() throws IOException {
+        currentParsedToken = advanceToNextToken();
+        return currentParsedToken;
+    }
+
+    public final T currentToken() {
+        return currentParsedToken;
+    }
+
+    protected boolean isNullableType(IAType definedType) {
+        if (definedType.getTypeTag() != ATypeTag.UNION) {
+            return false;
+        }
+
+        return ((AUnionType) definedType).isNullableType();
+    }
+
+    protected boolean isMissableType(IAType definedType) {
+        if (definedType.getTypeTag() != ATypeTag.UNION) {
+            return false;
+        }
+
+        return ((AUnionType) definedType).isMissableType();
+    }
+
+    protected void checkOptionalConstraints(ARecordType recordType, BitSet nullBitmap) throws RuntimeDataException {
+        for (int i = 0; i < recordType.getFieldTypes().length; i++) {
+            if (!nullBitmap.get(i) && !isMissableType(recordType.getFieldTypes()[i])) {
+                throw new RuntimeDataException(ErrorCode.PARSER_TWEET_PARSER_CLOSED_FIELD_NULL,
+                        recordType.getFieldNames()[i]);
+            }
+        }
+    }
+
+    /**
+     * Parser is not expecting definedType to be null.
+     *
+     * @param definedType
+     *            type defined by the user.
+     * @param parsedTypeTag
+     *            parsed type.
+     * @return
+     *         definedType is nullable && parsedTypeTag == ATypeTag.NULL => return ANULL
+     *         definedType == ANY && isComplexType => fully_open_complex_type
+     *         definedType == ANY && isAtomicType => ANY
+     *         defiendType == parsedTypeTag | canBeConverted => return definedType
+     * @throws RuntimeDataException
+     *             type mismatch
+     */
+    protected IAType checkAndGetType(IAType definedType, ATypeTag parsedTypeTag) throws RuntimeDataException {
+        //Cannot be missing
+        if (parsedTypeTag == ATypeTag.NULL && isNullableType(definedType)) {
+            return BuiltinType.ANULL;
+        }
+
+        final IAType actualDefinedType = getActualType(definedType);
+        if (actualDefinedType.getTypeTag() == ATypeTag.ANY) {
+            switch (parsedTypeTag) {
+                case OBJECT:
+                    return RecordUtil.FULLY_OPEN_RECORD_TYPE;
+                case ARRAY:
+                    return AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
+                case MULTISET:
+                    return AUnorderedListType.FULLY_OPEN_UNORDEREDLIST_TYPE;
+                default:
+                    return BuiltinType.ANY;
+            }
+        } else if (actualDefinedType.getTypeTag() == parsedTypeTag
+                || isConvertable(parsedTypeTag, actualDefinedType.getTypeTag())) {
+            return actualDefinedType;
+        }
+
+        throw new RuntimeDataException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, definedType.getTypeName());
+    }
+
+    private IAType getActualType(IAType definedType) {
+        if (definedType.getTypeTag() == ATypeTag.UNION) {
+            return ((AUnionType) definedType).getActualType();
+        }
+        return definedType;
+    }
+
+    /**
+     * Check promote/demote rules for mismatched types.
+     * String type is a special case as it can be parsed as date/time/datetime/UUID
+     *
+     * @param parsedTypeTag
+     * @param definedTypeTag
+     * @return
+     *         true if it can be converted
+     *         false otherwise
+     */
+    protected boolean isConvertable(ATypeTag parsedTypeTag, ATypeTag definedTypeTag) {
+        boolean convertable = parsedTypeTag == ATypeTag.STRING;
+
+        convertable &= definedTypeTag == ATypeTag.UUID || definedTypeTag == ATypeTag.DATE
+                || definedTypeTag == ATypeTag.TIME || definedTypeTag == ATypeTag.DATETIME;
+
+        return convertable || ATypeHierarchy.canPromote(parsedTypeTag, definedTypeTag)
+                || ATypeHierarchy.canDemote(parsedTypeTag, definedTypeTag);
+    }
+
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/DelimitedDataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/DelimitedDataParser.java
index 0df1412..a7dbc30 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/DelimitedDataParser.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/DelimitedDataParser.java
@@ -140,8 +140,8 @@
                     // NULL. Note that string type can also process empty field as an
                     // empty string
                     if (!NonTaggedFormatUtil.isOptional(recordType.getFieldTypes()[i])) {
-                        throw new RuntimeDataException(ErrorCode.PARSER_DELIMITED_NONOPTIONAL_NULL,
-                                cursor.recordCount, cursor.fieldCount);
+                        throw new RuntimeDataException(ErrorCode.PARSER_DELIMITED_NONOPTIONAL_NULL, cursor.recordCount,
+                                cursor.fieldCount);
                     }
                     fieldValueBufferOutput.writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG);
                 } else {
@@ -152,8 +152,8 @@
                         cursor.fEnd -= cursor.doubleQuoteCount;
                         cursor.isDoubleQuoteIncludedInThisField = false;
                     }
-                    valueParsers[i]
-                            .parse(cursor.buffer, cursor.fStart, cursor.fEnd - cursor.fStart, fieldValueBufferOutput);
+                    valueParsers[i].parse(cursor.buffer, cursor.fStart, cursor.fEnd - cursor.fStart,
+                            fieldValueBufferOutput);
                     areAllNullFields = false;
                 }
                 if (fldIds[i] < 0) {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/JSONDataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/JSONDataParser.java
new file mode 100644
index 0000000..bbe4a60
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/JSONDataParser.java
@@ -0,0 +1,439 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser;
+
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.BitSet;
+
+import org.apache.asterix.builders.IARecordBuilder;
+import org.apache.asterix.builders.IAsterixListBuilder;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.exceptions.RuntimeDataException;
+import org.apache.asterix.external.api.IRawRecord;
+import org.apache.asterix.external.api.IRecordDataParser;
+import org.apache.asterix.external.api.IStreamDataParser;
+import org.apache.asterix.external.parser.jackson.ADMToken;
+import org.apache.asterix.external.parser.jackson.GeometryCoParser;
+import org.apache.asterix.external.parser.jackson.ParserContext;
+import org.apache.asterix.om.base.ABoolean;
+import org.apache.asterix.om.base.ANull;
+import org.apache.asterix.om.base.AUnorderedList;
+import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AbstractCollectionType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.asterix.runtime.exceptions.UnsupportedTypeException;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IMutableValueStorage;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+
+/**
+ * JSON format parser using Jakson parser.
+ */
+public class JSONDataParser extends AbstractNestedDataParser<ADMToken>
+        implements IStreamDataParser, IRecordDataParser<char[]> {
+
+    protected final ParserContext parserContext;
+    protected final JsonFactory jsonFactory;
+    protected final ARecordType rootType;
+    protected final GeometryCoParser geometryCoParser;
+
+    protected JsonParser jsonParser;
+
+    /**
+     * Initialize JSONDataParser with GeometryCoParser
+     *
+     * @param recordType
+     *            defined type.
+     * @param jsonFactory
+     *            Jackson JSON parser factory.
+     */
+    public JSONDataParser(ARecordType recordType, JsonFactory jsonFactory) {
+        // recordType currently cannot be null, however this is to guarantee for any future changes.
+        this.rootType = recordType != null ? recordType : RecordUtil.FULLY_OPEN_RECORD_TYPE;
+        this.jsonFactory = jsonFactory;
+        //GeometyCoParser to parse GeoJSON objects to AsterixDB internal spatial types.
+        geometryCoParser = new GeometryCoParser(jsonParser);
+        parserContext = new ParserContext();
+    }
+
+    /*
+     ****************************************************
+     * Public methods
+     ****************************************************
+     */
+
+    @Override
+    public final void parse(IRawRecord<? extends char[]> record, DataOutput out) throws HyracksDataException {
+        try {
+            //TODO(wyk): find a way to reset byte[] instead of creating a new parser for each record.
+            jsonParser = jsonFactory.createParser(record.get(), 0, record.size());
+            geometryCoParser.reset(jsonParser);
+            nextToken();
+            parseObject(rootType, out);
+        } catch (IOException e) {
+            throw new RuntimeDataException(ErrorCode.RECORD_READER_MALFORMED_INPUT_STREAM, e);
+        }
+    }
+
+    @Override
+    public void setInputStream(InputStream in) throws IOException {
+        jsonParser = jsonFactory.createParser(in);
+        geometryCoParser.reset(jsonParser);
+    }
+
+    @Override
+    public boolean parse(DataOutput out) throws HyracksDataException {
+        try {
+            if (nextToken() == ADMToken.EOF) {
+                return false;
+            }
+            parseObject(rootType, out);
+            return true;
+        } catch (IOException e) {
+            throw new RuntimeDataException(ErrorCode.RECORD_READER_MALFORMED_INPUT_STREAM, e);
+        }
+    }
+
+    @Override
+    public boolean reset(InputStream in) throws IOException {
+        setInputStream(in);
+        return true;
+    }
+
+    /*
+     ****************************************************
+     * Abstract method implementation
+     ****************************************************
+     */
+
+    /**
+     * Jackson token to ADM token mapper
+     */
+    @Override
+    protected final ADMToken advanceToNextToken() throws IOException {
+        final JsonToken jsonToken = jsonParser.nextToken();
+        if (jsonToken == null) {
+            return ADMToken.EOF;
+        }
+        ADMToken token;
+        switch (jsonToken) {
+            case VALUE_FALSE:
+                token = ADMToken.FALSE;
+                break;
+            case VALUE_TRUE:
+                token = ADMToken.TRUE;
+                break;
+            case VALUE_STRING:
+                token = ADMToken.STRING;
+                break;
+            case VALUE_NULL:
+                token = ADMToken.NULL;
+                break;
+            case VALUE_NUMBER_FLOAT:
+                token = ADMToken.DOUBLE;
+                break;
+            case VALUE_NUMBER_INT:
+                token = ADMToken.INT;
+                break;
+            case START_OBJECT:
+                token = ADMToken.OBJECT_START;
+                break;
+            case END_OBJECT:
+                token = ADMToken.OBJECT_END;
+                break;
+            case START_ARRAY:
+                token = ADMToken.ARRAY_START;
+                break;
+            case END_ARRAY:
+                token = ADMToken.ARRAY_END;
+                break;
+            case FIELD_NAME:
+                token = ADMToken.FIELD_NAME;
+                break;
+            default:
+                throw new RuntimeDataException(ErrorCode.TYPE_UNSUPPORTED, jsonParser.currentToken().toString());
+        }
+
+        return token;
+    }
+    /*
+     ****************************************************
+     * Overridden methods
+     ****************************************************
+     */
+
+    /**
+     * In the case of JSON, we can parse GeoJSON objects as internal AsterixDB spatial types.
+     */
+    @Override
+    protected boolean isConvertable(ATypeTag parsedTypeTag, ATypeTag definedTypeTag) {
+        if (parsedTypeTag == ATypeTag.OBJECT && (definedTypeTag == ATypeTag.POINT || definedTypeTag == ATypeTag.LINE
+                || definedTypeTag == ATypeTag.POLYGON)) {
+            return true;
+        }
+        return super.isConvertable(parsedTypeTag, definedTypeTag);
+    }
+
+    /*
+     ****************************************************
+     * Complex types parsers
+     ****************************************************
+     */
+
+    @Override
+    protected final void parseObject(ARecordType recordType, DataOutput out) throws IOException {
+        final IMutableValueStorage valueBuffer = parserContext.enterObject();
+        final IARecordBuilder objectBuilder = parserContext.getObjectBuilder(recordType);
+        final BitSet nullBitMap = parserContext.getNullBitmap(recordType.getFieldTypes().length);
+        while (nextToken() != ADMToken.OBJECT_END) {
+            /*
+             * Jackson parser calls String.intern() for field names (if enabled).
+             * Calling getCurrentName() will not create multiple objects.
+             */
+            final String fieldName = jsonParser.getCurrentName();
+            final int fieldIndex = recordType.getFieldIndex(fieldName);
+
+            if (!recordType.isOpen() && fieldIndex < 0) {
+                throw new RuntimeDataException(ErrorCode.PARSER_ADM_DATA_PARSER_EXTRA_FIELD_IN_CLOSED_RECORD,
+                        fieldName);
+            }
+            valueBuffer.reset();
+            nextToken();
+
+            if (fieldIndex < 0) {
+                //field is not defined and the type is open
+                parseValue(BuiltinType.ANY, valueBuffer.getDataOutput());
+                objectBuilder.addField(parserContext.getSerializedFieldName(fieldName), valueBuffer);
+            } else {
+                //field is defined
+                final IAType fieldType = recordType.getFieldType(fieldName);
+
+                //fail fast if the current field is not nullable
+                if (currentToken() == ADMToken.NULL && !isNullableType(fieldType)) {
+                    throw new RuntimeDataException(ErrorCode.PARSER_TWEET_PARSER_CLOSED_FIELD_NULL, fieldName);
+                }
+
+                nullBitMap.set(fieldIndex);
+                parseValue(fieldType, valueBuffer.getDataOutput());
+                objectBuilder.addField(fieldIndex, valueBuffer);
+            }
+        }
+
+        /*
+         * Check for any possible missed values for a defined (non-nullable) type.
+         * Throws exception if there is a violation
+         */
+        if (nullBitMap != null) {
+            checkOptionalConstraints(recordType, nullBitMap);
+        }
+        parserContext.exitObject(valueBuffer, nullBitMap, objectBuilder);
+        objectBuilder.write(out, true);
+    }
+
+    /**
+     * Geometry in GeoJSON is an object
+     *
+     * @param typeTag
+     *            geometry typeTag
+     * @param out
+     * @throws IOException
+     */
+    private void parseGeometry(ATypeTag typeTag, DataOutput out) throws IOException {
+        //Start the co-parser
+        geometryCoParser.starGeometry();
+        while (nextToken() != ADMToken.OBJECT_END) {
+            if (currentToken() == ADMToken.FIELD_NAME) {
+                geometryCoParser.checkFieldName(jsonParser.getCurrentName());
+            } else if (!geometryCoParser.checkValue(currentToken())) {
+                throw new IOException(geometryCoParser.getErrorMessage());
+            }
+        }
+
+        geometryCoParser.serialize(typeTag, out);
+    }
+
+    @Override
+    protected final void parseArray(AOrderedListType listType, DataOutput out) throws IOException {
+        parseCollection(listType, ADMToken.ARRAY_END, out);
+    }
+
+    @Override
+    protected void parseMultiset(AUnorderedList listType, DataOutput out) throws IOException {
+        throw new UnsupportedTypeException("JSON parser", ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG);
+    }
+
+    protected final void parseCollection(AbstractCollectionType collectionType, ADMToken endToken, DataOutput out)
+            throws IOException {
+        final IMutableValueStorage valueBuffer = parserContext.enterCollection();
+        final IAsterixListBuilder arrayBuilder = parserContext.getCollectionBuilder(collectionType);
+        final boolean isOpen = collectionType.getItemType().getTypeTag() == ATypeTag.ANY;
+        while (nextToken() != endToken) {
+            valueBuffer.reset();
+            if (isOpen) {
+                parseValue(BuiltinType.ANY, valueBuffer.getDataOutput());
+            } else {
+                //fail fast if current value is null
+                if (currentToken() == ADMToken.NULL) {
+                    throw new RuntimeDataException(ErrorCode.PARSER_COLLECTION_ITEM_CANNOT_BE_NULL);
+                }
+                parseValue(collectionType.getItemType(), valueBuffer.getDataOutput());
+            }
+            arrayBuilder.addItem(valueBuffer);
+        }
+        parserContext.exitCollection(valueBuffer, arrayBuilder);
+        arrayBuilder.write(out, true);
+    }
+
+    /*
+     ****************************************************
+     * Value parsers and serializers
+     ****************************************************
+     */
+
+    /**
+     * Parse JSON object or GeoJSON object.
+     *
+     * @param actualType
+     * @param out
+     * @throws IOException
+     */
+    private void parseObject(IAType actualType, DataOutput out) throws IOException {
+        if (actualType.getTypeTag() == ATypeTag.OBJECT) {
+            parseObject((ARecordType) actualType, out);
+        } else {
+            parseGeometry(actualType.getTypeTag(), out);
+        }
+    }
+
+    protected void parseValue(IAType definedType, DataOutput out) throws IOException {
+        final ATypeTag currentTypeTag = currentToken().getTypeTag();
+        /*
+         * In case of type mismatch, checkAndGetType will throw an exception.
+         */
+        final IAType actualType = checkAndGetType(definedType, currentTypeTag);
+
+        switch (currentToken()) {
+            case NULL:
+                nullSerde.serialize(ANull.NULL, out);
+                break;
+            case FALSE:
+                booleanSerde.serialize(ABoolean.FALSE, out);
+                break;
+            case TRUE:
+                booleanSerde.serialize(ABoolean.TRUE, out);
+                break;
+            case INT:
+            case DOUBLE:
+                serailizeNumeric(actualType.getTypeTag(), out);
+                break;
+            case STRING:
+                serializeString(actualType.getTypeTag(), out);
+                break;
+            case OBJECT_START:
+                parseObject(actualType, out);
+                break;
+            case ARRAY_START:
+                parseArray((AOrderedListType) actualType, out);
+                break;
+            default:
+                throw new RuntimeDataException(ErrorCode.PARSE_ERROR, jsonParser.currentToken().toString());
+        }
+    }
+
+    /**
+     * Given that numeric values may underflow or overflow, an exception will be thrown.
+     *
+     * @param numericType
+     * @param out
+     * @throws IOException
+     */
+    private void serailizeNumeric(ATypeTag numericType, DataOutput out) throws IOException {
+        final ATypeTag typeToUse = numericType == ATypeTag.ANY ? currentToken().getTypeTag() : numericType;
+
+        switch (typeToUse) {
+            case BIGINT:
+                aInt64.setValue(jsonParser.getLongValue());
+                int64Serde.serialize(aInt64, out);
+                break;
+            case INTEGER:
+                aInt32.setValue(jsonParser.getIntValue());
+                int32Serde.serialize(aInt32, out);
+                break;
+            case SMALLINT:
+                aInt16.setValue(jsonParser.getShortValue());
+                int16Serde.serialize(aInt16, out);
+                break;
+            case TINYINT:
+                aInt8.setValue(jsonParser.getByteValue());
+                int8Serde.serialize(aInt8, out);
+                break;
+            case DOUBLE:
+                aDouble.setValue(jsonParser.getDoubleValue());
+                doubleSerde.serialize(aDouble, out);
+                break;
+            case FLOAT:
+                aFloat.setValue(jsonParser.getFloatValue());
+                floatSerde.serialize(aFloat, out);
+                break;
+            default:
+                throw new RuntimeDataException(ErrorCode.TYPE_UNSUPPORTED, jsonParser.currentToken().toString());
+        }
+    }
+
+    /**
+     * Serialize the string value.
+     * TODO(wyk) avoid String objects for type STRING
+     *
+     * @param stringVariantType
+     * @param out
+     * @throws IOException
+     */
+    private void serializeString(ATypeTag stringVariantType, DataOutput out) throws IOException {
+        final String stringValue = jsonParser.getText();
+        final ATypeTag typeToUse = stringVariantType == ATypeTag.ANY ? currentToken().getTypeTag() : stringVariantType;
+
+        switch (typeToUse) {
+            case STRING:
+                aString.setValue(stringValue);
+                stringSerde.serialize(aString, out);
+                break;
+            case DATE:
+                parseDate(stringValue, out);
+                break;
+            case DATETIME:
+                parseDateTime(stringValue, out);
+                break;
+            case TIME:
+                parseTime(stringValue, out);
+                break;
+            default:
+                throw new RuntimeDataException(ErrorCode.TYPE_UNSUPPORTED, jsonParser.currentToken().toString());
+
+        }
+    }
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/RecordWithMetadataParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/RecordWithMetadataParser.java
index ed33401..c92ee12 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/RecordWithMetadataParser.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/RecordWithMetadataParser.java
@@ -49,8 +49,8 @@
     private final ArrayBackedValueStorage[] metaFieldsNamesBuffers;
     private final int numberOfMetaFields;
     @SuppressWarnings("unchecked")
-    private final ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    private final ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
 
     public RecordWithMetadataParser(ARecordType metaType, IRecordDataParser<O> valueParser,
             IRecordConverter<T, RecordWithMetadataAndPK<O>> converter) throws HyracksDataException {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/TweetParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/TweetParser.java
index be49863..e1c961a 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/TweetParser.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/TweetParser.java
@@ -48,12 +48,12 @@
 import java.util.Iterator;
 
 public class TweetParser extends AbstractDataParser implements IRecordDataParser<String> {
-    private final IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool = new ListObjectPool<>(
-            new RecordBuilderFactory());
-    private final IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool = new ListObjectPool<>(
-            new ListBuilderFactory());
-    private final IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool = new ListObjectPool<>(
-            new AbvsBuilderFactory());
+    private final IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool =
+            new ListObjectPool<>(new RecordBuilderFactory());
+    private final IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool =
+            new ListObjectPool<>(new ListBuilderFactory());
+    private final IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool =
+            new ListObjectPool<>(new AbvsBuilderFactory());
     private ARecordType recordType;
     private UTF8StringWriter utf8Writer = new UTF8StringWriter();
 
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/ADMDataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/ADMDataParserFactory.java
index 489cf77..394fcb3 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/ADMDataParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/ADMDataParserFactory.java
@@ -18,24 +18,24 @@
  */
 package org.apache.asterix.external.parser.factory;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.external.api.IExternalDataSourceFactory.DataSourceType;
 import org.apache.asterix.external.api.IRecordDataParser;
 import org.apache.asterix.external.api.IStreamDataParser;
-import org.apache.asterix.external.api.IExternalDataSourceFactory.DataSourceType;
 import org.apache.asterix.external.parser.ADMDataParser;
 import org.apache.asterix.external.util.ExternalDataUtils;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
 public class ADMDataParserFactory extends AbstractRecordStreamParserFactory<char[]> {
 
     private static final long serialVersionUID = 1L;
-    private static final List<String> parserFormats = Collections
-            .unmodifiableList(Arrays.asList("adm", "json", "semi-structured"));
+    private static final List<String> parserFormats =
+            Collections.unmodifiableList(Arrays.asList("adm", "semi-structured"));
 
     @Override
     public IRecordDataParser<char[]> createRecordParser(IHyracksTaskContext ctx) {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/AbstractRecordStreamParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/AbstractRecordStreamParserFactory.java
index 8fd02dd..9352298 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/AbstractRecordStreamParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/AbstractRecordStreamParserFactory.java
@@ -20,6 +20,7 @@
 
 import java.util.Map;
 
+import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.external.api.IExternalDataSourceFactory.DataSourceType;
 import org.apache.asterix.external.api.IRecordDataParserFactory;
 import org.apache.asterix.external.api.IStreamDataParserFactory;
@@ -44,7 +45,7 @@
     }
 
     @Override
-    public void setRecordType(ARecordType recordType) {
+    public void setRecordType(ARecordType recordType) throws AsterixException {
         this.recordType = recordType;
     }
 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/DelimitedDataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/DelimitedDataParserFactory.java
index bba8ccc..f406729 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/DelimitedDataParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/DelimitedDataParserFactory.java
@@ -39,8 +39,8 @@
 public class DelimitedDataParserFactory extends AbstractRecordStreamParserFactory<char[]> {
 
     private static final long serialVersionUID = 1L;
-    private static final List<String> parserFormats = Collections
-            .unmodifiableList(Arrays.asList("csv", "delimited-text"));
+    private static final List<String> parserFormats =
+            Collections.unmodifiableList(Arrays.asList("csv", "delimited-text"));
 
     @Override
     public IRecordDataParser<char[]> createRecordParser(IHyracksTaskContext ctx) throws HyracksDataException {
@@ -73,8 +73,8 @@
         if (delimiterValue == null) {
             delimiterValue = ExternalDataConstants.DEFAULT_DELIMITER;
         } else if (delimiterValue.length() != 1) {
-            throw new RuntimeDataException(
-                    ErrorCode.PARSER_FACTORY_DELIMITED_DATA_PARSER_FACTORY_NOT_VALID_DELIMITER, delimiterValue);
+            throw new RuntimeDataException(ErrorCode.PARSER_FACTORY_DELIMITED_DATA_PARSER_FACTORY_NOT_VALID_DELIMITER,
+                    delimiterValue);
         }
         return delimiterValue.charAt(0);
     }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/HiveDataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/HiveDataParserFactory.java
index c944554..489749c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/HiveDataParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/HiveDataParserFactory.java
@@ -38,8 +38,8 @@
 public class HiveDataParserFactory implements IRecordDataParserFactory<Writable> {
 
     private static final long serialVersionUID = 1L;
-    private static final List<String> parserFormats = Collections
-            .unmodifiableList(Arrays.asList("hive", "hive-parser"));
+    private static final List<String> parserFormats =
+            Collections.unmodifiableList(Arrays.asList("hive", "hive-parser"));
     private Map<String, String> configuration;
     private ARecordType recordType;
     private String hiveSerdeClassName;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/JSONDataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/JSONDataParserFactory.java
new file mode 100644
index 0000000..501aea0
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/JSONDataParserFactory.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser.factory;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.external.api.IRecordDataParser;
+import org.apache.asterix.external.api.IStreamDataParser;
+import org.apache.asterix.external.parser.JSONDataParser;
+import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AUnionType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+
+public class JSONDataParserFactory extends AbstractRecordStreamParserFactory<char[]> {
+
+    private static final long serialVersionUID = 1L;
+    private static final List<String> PARSER_FORMAT = Collections.unmodifiableList(Arrays.asList("json"));
+    private static final List<ATypeTag> UNSUPPORTED_TYPES = Collections
+            .unmodifiableList(Arrays.asList(ATypeTag.MULTISET, ATypeTag.POINT3D, ATypeTag.CIRCLE, ATypeTag.RECTANGLE,
+                    ATypeTag.INTERVAL, ATypeTag.DAYTIMEDURATION, ATypeTag.DURATION, ATypeTag.BINARY));
+
+    private final JsonFactory jsonFactory;
+
+    public JSONDataParserFactory() {
+        jsonFactory = new JsonFactory();
+        jsonFactory.configure(JsonParser.Feature.STRICT_DUPLICATE_DETECTION, true);
+        jsonFactory.configure(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES, true);
+        jsonFactory.configure(JsonFactory.Feature.INTERN_FIELD_NAMES, true);
+    }
+
+    @Override
+    public IStreamDataParser createInputStreamParser(IHyracksTaskContext ctx, int partition)
+            throws HyracksDataException {
+        return createParser();
+    }
+
+    @Override
+    public void setMetaType(ARecordType metaType) {
+        // no MetaType to set.
+    }
+
+    @Override
+    public List<String> getParserFormats() {
+        return PARSER_FORMAT;
+    }
+
+    @Override
+    public IRecordDataParser<char[]> createRecordParser(IHyracksTaskContext ctx) throws HyracksDataException {
+        return createParser();
+    }
+
+    @Override
+    public Class<?> getRecordClass() {
+        return char[].class;
+    }
+
+    private JSONDataParser createParser() throws HyracksDataException {
+        return new JSONDataParser(recordType, jsonFactory);
+    }
+
+    /*
+     * check type compatibility before creating the parser.
+     */
+    @Override
+    public void setRecordType(ARecordType recordType) throws AsterixException {
+        checkRecordTypeCompatibility(recordType);
+        super.setRecordType(recordType);
+    }
+
+    /**
+     * Check if the defined type contains ADM special types.
+     * if it contains unsupported types.
+     *
+     * @param recordType
+     * @throws AsterixException
+     */
+    private void checkRecordTypeCompatibility(ARecordType recordType) throws AsterixException {
+        final IAType[] fieldTypes = recordType.getFieldTypes();
+        for (IAType type : fieldTypes) {
+            checkTypeCompatibility(type);
+        }
+    }
+
+    private void checkTypeCompatibility(IAType type) throws AsterixException {
+        if (UNSUPPORTED_TYPES.contains(type.getTypeTag())) {
+            throw new AsterixException(ErrorCode.TYPE_UNSUPPORTED, JSONDataParserFactory.class.getName(),
+                    type.getTypeTag().toString());
+        } else if (type.getTypeTag() == ATypeTag.ARRAY) {
+            checkTypeCompatibility(((AOrderedListType) type).getItemType());
+        } else if (type.getTypeTag() == ATypeTag.OBJECT) {
+            checkRecordTypeCompatibility((ARecordType) type);
+        } else if (type.getTypeTag() == ATypeTag.UNION) {
+            checkTypeCompatibility(((AUnionType) type).getActualType());
+        }
+        //Compatible type
+    }
+
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/RecordWithMetadataParserFactory.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/RecordWithMetadataParserFactory.java
index c7bf447..d34b5e0 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/RecordWithMetadataParserFactory.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/factory/RecordWithMetadataParserFactory.java
@@ -23,7 +23,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.external.api.IRecordDataParser;
 import org.apache.asterix.external.api.IRecordDataParserFactory;
@@ -35,14 +34,15 @@
 import org.apache.asterix.external.util.ExternalDataCompatibilityUtils;
 import org.apache.asterix.external.util.ExternalDataConstants;
 import org.apache.asterix.om.types.ARecordType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public class RecordWithMetadataParserFactory<I, O> implements IRecordDataParserFactory<I> {
 
     private static final long serialVersionUID = 1L;
-    private static final List<String> parserFormats = Collections
-            .unmodifiableList(Arrays.asList("record-with-metadata"));
+    private static final List<String> parserFormats =
+            Collections.unmodifiableList(Arrays.asList("record-with-metadata"));
     private ARecordType metaType;
     private ARecordType recordType;
     private IRecordDataParserFactory<O> recordParserFactory;
@@ -50,16 +50,16 @@
 
     @SuppressWarnings("unchecked")
     @Override
-    public void configure(Map<String, String> configuration) throws AsterixException {
+    public void configure(Map<String, String> configuration) throws AlgebricksException {
         // validate first
         String recordFormat = configuration.get(ExternalDataConstants.KEY_RECORD_FORMAT);
         if (recordFormat == null) {
-            throw new AsterixException(ErrorCode.UNKNOWN_RECORD_FORMAT_FOR_META_PARSER,
+            throw AlgebricksException.create(ErrorCode.UNKNOWN_RECORD_FORMAT_FOR_META_PARSER,
                     ExternalDataConstants.KEY_FORMAT);
         }
         String format = configuration.get(ExternalDataConstants.KEY_FORMAT);
         if (format == null) {
-            throw new AsterixException(ErrorCode.UNKNOWN_RECORD_FORMAT_FOR_META_PARSER,
+            throw AlgebricksException.create(ErrorCode.UNKNOWN_RECORD_FORMAT_FOR_META_PARSER,
                     ExternalDataConstants.KEY_FORMAT);
         }
         // Create Parser Factory
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ADMToken.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ADMToken.java
new file mode 100644
index 0000000..2c80288f
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ADMToken.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser.jackson;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public enum ADMToken {
+    /*
+     ****************************************************
+     * JSON format values
+     ****************************************************
+     */
+
+    NULL(ATypeTag.NULL),
+    FALSE(ATypeTag.BOOLEAN),
+    TRUE(ATypeTag.BOOLEAN),
+    INT(ATypeTag.BIGINT), //Default type of integers
+    DOUBLE(ATypeTag.DOUBLE), //Default type of floating-points
+    STRING(ATypeTag.STRING),
+    OBJECT_START(ATypeTag.OBJECT),
+    OBJECT_END,
+    ARRAY_START(ATypeTag.ARRAY),
+    ARRAY_END,
+
+    //field name
+    FIELD_NAME,
+
+    /*
+     ****************************************************
+     * ADM - Atomic value constructors
+     ****************************************************
+     */
+
+    //numeric constructors
+    TINYINT_ADM(ATypeTag.TINYINT),
+    INT_ADM(ATypeTag.INTEGER),
+    BIGINT_ADM(ATypeTag.BIGINT),
+    FLOAT_ADM(ATypeTag.FLOAT),
+    DOUBLE_ADM(ATypeTag.DOUBLE),
+
+    //spatial
+    POINT_ADM(ATypeTag.POINT),
+    LINE_ADM(ATypeTag.LINE),
+    CIRCLE_ADM(ATypeTag.CIRCLE),
+    RECTANGLE_ADM(ATypeTag.RECTANGLE),
+    POLYGON_ADM(ATypeTag.POLYGON),
+
+    //temporal
+    TIME_ADM(ATypeTag.TIME),
+    DATE_ADM(ATypeTag.DATE),
+    DATETIME_ADM(ATypeTag.DATETIME),
+    DURATION_ADM(ATypeTag.DURATION),
+    YEAR_MONTH_DURATION_ADM(ATypeTag.YEARMONTHDURATION),
+    DAY_TIME_DURATION_ADM(ATypeTag.DAYTIMEDURATION),
+    INTERVAL_ADM(ATypeTag.INTERVAL),
+
+    //other
+    UUID_ADM(ATypeTag.UUID),
+    BINARY_ADM(ATypeTag.BINARY),
+
+    /*
+     ****************************************************
+     * Parser control tokens
+     ****************************************************
+     */
+
+    PROCEED,
+    SKIP,
+    EOF;
+
+    private final ATypeTag tokenMappedType;
+
+    private ADMToken() {
+        tokenMappedType = null;
+    }
+
+    private ADMToken(ATypeTag typeTag) {
+        this.tokenMappedType = typeTag;
+    }
+
+    public ATypeTag getTypeTag() {
+        return tokenMappedType;
+    }
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/GeometryCoParser.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/GeometryCoParser.java
new file mode 100644
index 0000000..8f36b5a
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/GeometryCoParser.java
@@ -0,0 +1,315 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser.jackson;
+
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.common.exceptions.RuntimeDataException;
+import org.apache.asterix.dataflow.data.nontagged.serde.APointSerializerDeserializer;
+import org.apache.asterix.om.types.ATypeTag;
+
+import com.fasterxml.jackson.core.JsonParser;
+
+/**
+ * Co-parser for JsonDataParser to help parse GeoJSON objects.
+ * It only supports POINT, LINE (with only two points) and Polygon.
+ * The co-parser can parse GeoJSON geometry object as in {@link https://tools.ietf.org/html/rfc7946}
+ * and converts it into a supported AsterixDB geometry type.
+ *
+ * Example:
+ * { ..., "geometry":{"type":"Point", "coordinates":[1.0, 1.0]}, ...}
+ * will be:
+ * { ..., "geometry":point("1.0, 1.0"), ...}
+ */
+public class GeometryCoParser {
+
+    //Geometry object fields
+    private static final String DEFAULT_GEOMETERY_KEY = "geometry";
+    private static final String COORDINATES_KEY = "coordinates";
+    private static final String TYPE_KEY = "type";
+
+    //Supported geometry
+    private static final List<String> SUPPORTED_GEOMETRY =
+            Collections.unmodifiableList(Arrays.asList("Point", "LineString", "Polygon"));
+    private static final List<ATypeTag> SUPPORTED_GEOMETRY_TYPETAG =
+            Collections.unmodifiableList(Arrays.asList(ATypeTag.POINT, ATypeTag.LINE, ATypeTag.POLYGON));
+
+    //Error messages
+    private static final String INVALID_GEOMETRY = "Invalid GeoJSON geometry object";
+    private static final String UNSUPPORTED_GEOMETRY = "Unsupported geometry type ";
+
+    private static final int POINT = 0;
+    private static final int LINE = 1;
+    private static final int POLYGON = 2;
+
+    private final List<Double> coordinates;
+    private JsonParser jsonParser;
+    private String currentField;
+    private int geometryType;
+    private String geometryTypeString;
+
+    private int currentCoordinateLevel;
+    private int coordinateValueLevel;
+    private int coordinatesCounter;
+    private String errorMsg;
+
+    /**
+     * @param jsonParser
+     * @param geometryFieldName
+     *            override the default geometry
+     *            field name {@value GeometryCoParser#DEFAULT_GEOMETERY_KEY}
+     */
+    public GeometryCoParser(JsonParser jsonParser) {
+        this.jsonParser = jsonParser;
+        coordinates = new ArrayList<>();
+        currentField = null;
+        geometryTypeString = null;
+        geometryType = -1;
+        currentCoordinateLevel = 0;
+        coordinateValueLevel = 0;
+        coordinatesCounter = 0;
+        errorMsg = null;
+    }
+
+    /*
+     ****************************************************
+     * Public methods
+     ****************************************************
+     */
+
+    /**
+     * Check the field name if it's one of GeoJSON know fields
+     *
+     * @param fieldName
+     * @return
+     *         returns true if the field name equals {@value GeometryCoParser#geometryFieldName},
+     *         which marks the start of a geometry object.
+     */
+    public void checkFieldName(String fieldName) {
+        if (COORDINATES_KEY.equals(fieldName)) {
+            currentField = COORDINATES_KEY;
+        } else if (TYPE_KEY.equals(fieldName)) {
+            currentField = TYPE_KEY;
+        } else {
+            reset("Invalid geometry object");
+        }
+    }
+
+    /**
+     * Given the state of the current token in a geometry object, parse the potential values depends
+     * on the current field name.
+     * In the case of failure, the co-parser will stop parsing without throwing exception.
+     *
+     * @param token
+     * @throws IOException
+     * @return
+     *         true: if it's an expected value.
+     *         false: otherwise.
+     */
+    public boolean checkValue(ADMToken token) throws IOException {
+        if (currentField == null) {
+            return false;
+        }
+        if (currentField == DEFAULT_GEOMETERY_KEY && token != ADMToken.OBJECT_START) {
+            reset(INVALID_GEOMETRY);
+        } else if (currentField == COORDINATES_KEY) {
+            parseCoordinates(token);
+        } else if (currentField == TYPE_KEY) {
+            if (token != ADMToken.STRING) {
+                //unexpected token
+                reset(INVALID_GEOMETRY);
+            } else {
+                geometryTypeString = jsonParser.getValueAsString();
+                geometryType = SUPPORTED_GEOMETRY.indexOf(geometryTypeString);
+                if (geometryType < 0) {
+                    reset(UNSUPPORTED_GEOMETRY + geometryTypeString);
+                }
+            }
+        }
+        return currentField != null;
+    }
+
+    /**
+     * To begin parsing a defined geometry object.
+     */
+    public void starGeometry() {
+        reset("");
+        currentField = DEFAULT_GEOMETERY_KEY;
+    }
+
+    /**
+     * Serialize the parsed geometry
+     *
+     * @param typeTag
+     *            The expected typeTag of the geometry type.
+     * @param out
+     * @throws IOException
+     *             an exception will be thrown in case of failure or type mismatch.
+     */
+    public void serialize(ATypeTag typeTag, DataOutput out) throws IOException {
+        if (!isValidGeometry()) {
+            throw new IOException(errorMsg);
+        } else if (typeTag != SUPPORTED_GEOMETRY_TYPETAG.get(geometryType)) {
+            throw new RuntimeDataException(ErrorCode.PARSER_ADM_DATA_PARSER_TYPE_MISMATCH, typeTag);
+        }
+
+        switch (geometryType) {
+            case POINT:
+                serializePoint(out);
+                break;
+            case LINE:
+                serializeLine(out);
+                break;
+            case POLYGON:
+                serializePolygon(out);
+                break;
+            default:
+                break;
+        }
+    }
+
+    public String getErrorMessage() {
+        return errorMsg;
+    }
+
+    /**
+     * Reset for a new record to be parsed.
+     *
+     * @param jsonParser
+     */
+    public void reset(JsonParser jsonParser) {
+        reset("");
+        this.jsonParser = jsonParser;
+    }
+
+    /*
+     ****************************************************
+     * Helper methods
+     ****************************************************
+     */
+
+    /**
+     * Parse coordinates values.
+     *
+     * @param token
+     * @throws IOException
+     */
+    private void parseCoordinates(ADMToken token) throws IOException {
+        if (token == ADMToken.DOUBLE) {
+            if (++coordinatesCounter > 2) {
+                //A point must have 2 coordinates
+                reset(INVALID_GEOMETRY);
+            }
+
+            coordinates.add(jsonParser.getDoubleValue());
+
+            if (coordinateValueLevel == 0) {
+                coordinateValueLevel = currentCoordinateLevel;
+            }
+        } else if (token == ADMToken.ARRAY_START) {
+            currentCoordinateLevel++;
+            if (coordinateValueLevel - (currentCoordinateLevel - 1) > 1) {
+                reset("Only simple geometries are supported (Point, LineString and Polygon without holes)");
+            }
+        } else if (token == ADMToken.ARRAY_END) {
+            currentCoordinateLevel--;
+            coordinatesCounter = 0;
+        } else {
+            //unexpected token
+            reset(INVALID_GEOMETRY);
+        }
+    }
+
+    private void reset(String errorMsg) {
+        coordinates.clear();
+        geometryType = -1;
+        currentField = null;
+        coordinatesCounter = 0;
+        coordinateValueLevel = 0;
+        currentCoordinateLevel = 0;
+        this.errorMsg = errorMsg;
+    }
+
+    private boolean isValidGeometry() {
+        boolean valid;
+        switch (geometryType) {
+            case POINT:
+                valid = coordinateValueLevel == 1 && coordinates.size() == 2;
+                errorMsg = valid ? null : "Point must have 2 coordinates";
+                break;
+            case LINE:
+                valid = coordinateValueLevel == 2 && coordinates.size() == 4;
+                errorMsg = valid ? null : "Line must have 4 coordinates";
+                break;
+            case POLYGON:
+                valid = isValidPolygon();
+                break;
+            default:
+                valid = false;
+                errorMsg = UNSUPPORTED_GEOMETRY + geometryTypeString;
+        }
+
+        return valid;
+    }
+
+    private boolean isValidPolygon() {
+        /*
+         * A valid polygon should have at least 3 points and should start and end at the same point.
+         */
+        final int size = coordinates.size();
+        if (size < 5) {
+            errorMsg = "Polygon must consists of at least 3 points (6 coordinates)";
+            return false;
+        } else if (coordinateValueLevel != 3) {
+            errorMsg = "MultiPolygon is not supported";
+        } else if (!(coordinates.get(0).equals(coordinates.get(size - 2))
+                && coordinates.get(1).equals(coordinates.get(size - 1)))) {
+            errorMsg = "Unclosed polygon is not supported";
+            return false;
+        }
+        return true;
+    }
+
+    private void serializePoint(DataOutput out) throws IOException {
+        out.writeByte(ATypeTag.SERIALIZED_POINT_TYPE_TAG);
+        APointSerializerDeserializer.serialize(coordinates.get(0), coordinates.get(1), out);
+    }
+
+    private void serializeLine(DataOutput out) throws IOException {
+        out.writeByte(ATypeTag.SERIALIZED_LINE_TYPE_TAG);
+        APointSerializerDeserializer.serialize(coordinates.get(0), coordinates.get(1), out);
+        APointSerializerDeserializer.serialize(coordinates.get(2), coordinates.get(3), out);
+    }
+
+    private void serializePolygon(DataOutput out) throws IOException {
+        out.writeByte(ATypeTag.SERIALIZED_POLYGON_TYPE_TAG);
+        out.writeShort(coordinates.size() / 2);
+        for (int i = 0; i < coordinates.size(); i += 2) {
+            APointSerializerDeserializer.serialize(coordinates.get(i), coordinates.get(i + 1), out);
+        }
+
+    }
+
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ObjectPool.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ObjectPool.java
new file mode 100644
index 0000000..5ccd9e9
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ObjectPool.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser.jackson;
+
+import java.util.ArrayDeque;
+import java.util.Queue;
+
+import org.apache.asterix.om.util.container.IObjectFactory;
+
+/**
+ * Object pool for DFS traversal mode, which allows to recycle objects
+ * as soon as it is not needed.
+ */
+public class ObjectPool<E, T> {
+    private final IObjectFactory<E, T> objectFactory;
+    private final Queue<E> recycledObjects;
+    private final T element;
+
+    public ObjectPool() {
+        this(null, null);
+    }
+
+    public ObjectPool(IObjectFactory<E, T> objectFactory) {
+        this(objectFactory, null);
+    }
+
+    public ObjectPool(IObjectFactory<E, T> objectFactory, T element) {
+        this.objectFactory = objectFactory;
+        recycledObjects = new ArrayDeque<>();
+        this.element = element;
+    }
+
+    public E getInstance() {
+        E instance = recycledObjects.poll();
+        if (objectFactory != null && instance == null) {
+            instance = objectFactory.create(element);
+        }
+        return instance;
+    }
+
+    public void recycle(E object) {
+        if (object != null) {
+            recycledObjects.add(object);
+        }
+    }
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ParserContext.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ParserContext.java
new file mode 100644
index 0000000..387ba7f
--- /dev/null
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/parser/jackson/ParserContext.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.external.parser.jackson;
+
+import java.io.IOException;
+import java.util.BitSet;
+import java.util.Map;
+
+import org.apache.asterix.builders.AbvsBuilderFactory;
+import org.apache.asterix.builders.IARecordBuilder;
+import org.apache.asterix.builders.IAsterixListBuilder;
+import org.apache.asterix.builders.ListBuilderFactory;
+import org.apache.asterix.builders.RecordBuilderFactory;
+import org.apache.asterix.external.parser.AbstractNestedDataParser;
+import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
+import org.apache.asterix.om.base.AMutableString;
+import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.types.ARecordType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AbstractCollectionType;
+import org.apache.commons.collections4.map.LRUMap;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IMutableValueStorage;
+import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+
+/**
+ * A state class that helps parsers of class {@link AbstractNestedDataParser} to maintain
+ * its temporary buffers.
+ */
+public class ParserContext {
+    private static final int SERIALIZED_FIELDNAME_MAP_MAX_SIZE = 128;
+
+    private final ObjectPool<IARecordBuilder, ATypeTag> objectBuilderPool;
+    private final ObjectPool<IAsterixListBuilder, ATypeTag> arrayBuilderPool;
+
+    /**
+     * Parsing nested structure using temporary buffers is expensive.
+     * Example:
+     * {"a":{"b":{"c":{"d":5}}}}
+     *
+     * Scalar value 5 is written 4 times in tempBuffer("d") then tempBuffer("c") ... tempBuffer("a")
+     */
+    private final ObjectPool<IMutableValueStorage, ATypeTag> tempBufferPool;
+    private final ObjectPool<BitSet, Void> nullBitmapPool;
+    private final Map<String, IMutableValueStorage> serializedFieldNames;
+    private final ISerializerDeserializer<AString> stringSerDe;
+    private final AMutableString aString;
+
+    @SuppressWarnings("unchecked")
+    public ParserContext() {
+        objectBuilderPool = new ObjectPool<>(new RecordBuilderFactory());
+        arrayBuilderPool = new ObjectPool<>(new ListBuilderFactory(), ATypeTag.ARRAY);
+        tempBufferPool = new ObjectPool<>(new AbvsBuilderFactory());
+        nullBitmapPool = new ObjectPool<>();
+        serializedFieldNames = new LRUMap<>(SERIALIZED_FIELDNAME_MAP_MAX_SIZE);
+        stringSerDe = SerializerDeserializerProvider.INSTANCE.getAStringSerializerDeserializer();
+        aString = new AMutableString("");
+    }
+
+    public IMutableValueStorage enterObject() {
+        return tempBufferPool.getInstance();
+    }
+
+    public BitSet getNullBitmap(int size) {
+        if (size < 1) {
+            return null;
+        }
+
+        BitSet nullBitMap = nullBitmapPool.getInstance();
+        if (nullBitMap == null) {
+            nullBitMap = new BitSet(size);
+        }
+        return nullBitMap;
+    }
+
+    public IARecordBuilder getObjectBuilder(ARecordType recordType) {
+        IARecordBuilder builder = objectBuilderPool.getInstance();
+        builder.reset(recordType);
+        return builder;
+    }
+
+    /**
+     * Experimental.
+     * Check if too many serialization for the same field names can be expensive or not.
+     *
+     * @param fieldName
+     * @return
+     * @throws HyracksDataException
+     */
+    public IMutableValueStorage getSerializedFieldName(String fieldName) throws IOException {
+        IMutableValueStorage serializedFieldName = serializedFieldNames.get(fieldName);
+        if (serializedFieldName == null) {
+            serializedFieldName = new ArrayBackedValueStorage();
+            serializedFieldName.reset();
+            aString.setValue(fieldName);
+            stringSerDe.serialize(aString, serializedFieldName.getDataOutput());
+            serializedFieldNames.put(fieldName, serializedFieldName);
+        }
+        return serializedFieldName;
+    }
+
+    public void exitObject(IMutableValueStorage tempBuffer, BitSet nullBitmap, IARecordBuilder builder) {
+        tempBufferPool.recycle(tempBuffer);
+        objectBuilderPool.recycle(builder);
+        if (nullBitmap != null) {
+            nullBitmap.clear();
+            nullBitmapPool.recycle(nullBitmap);
+        }
+    }
+
+    public IMutableValueStorage enterCollection() {
+        return tempBufferPool.getInstance();
+    }
+
+    public IAsterixListBuilder getCollectionBuilder(AbstractCollectionType collectionType) {
+        IAsterixListBuilder builder = arrayBuilderPool.getInstance();
+        builder.reset(collectionType);
+        return builder;
+    }
+
+    public void exitCollection(IMutableValueStorage tempBuffer, IAsterixListBuilder builder) {
+        tempBufferPool.recycle(tempBuffer);
+        arrayBuilderPool.recycle(builder);
+    }
+
+}
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/AdapterFactoryProvider.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/AdapterFactoryProvider.java
index d6ac5d1..5740143 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/AdapterFactoryProvider.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/AdapterFactoryProvider.java
@@ -68,8 +68,8 @@
             Map<String, String> configuration, ARecordType recordType, int[] ridFields, boolean retainInput,
             boolean retainMissing, IMissingWriterFactory missingWriterFactory)
             throws HyracksDataException, AlgebricksException {
-        LookupAdapterFactory<?> adapterFactory = new LookupAdapterFactory<>(recordType, ridFields, retainInput,
-                retainMissing, missingWriterFactory);
+        LookupAdapterFactory<?> adapterFactory =
+                new LookupAdapterFactory<>(recordType, ridFields, retainInput, retainMissing, missingWriterFactory);
         adapterFactory.configure(serviceCtx, configuration);
         return adapterFactory;
     }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/DatasourceFactoryProvider.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/DatasourceFactoryProvider.java
index 859c9fd..c9dafbc 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/DatasourceFactoryProvider.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/DatasourceFactoryProvider.java
@@ -68,8 +68,8 @@
         IInputStreamFactory streamSourceFactory;
         if (ExternalDataUtils.isExternal(streamSource)) {
             String dataverse = ExternalDataUtils.getDataverse(configuration);
-            streamSourceFactory = ExternalDataUtils.createExternalInputStreamFactory(libraryManager, dataverse,
-                    streamSource);
+            streamSourceFactory =
+                    ExternalDataUtils.createExternalInputStreamFactory(libraryManager, dataverse, streamSource);
         } else {
             switch (streamSource) {
                 case ExternalDataConstants.STREAM_LOCAL_FILESYSTEM:
@@ -87,8 +87,7 @@
                         streamSourceFactory = (IInputStreamFactory) Class.forName(streamSource).newInstance();
                     } catch (Exception e) {
                         throw new RuntimeDataException(
-                                ErrorCode.PROVIDER_DATASOURCE_FACTORY_UNKNOWN_INPUT_STREAM_FACTORY, e,
-                                streamSource);
+                                ErrorCode.PROVIDER_DATASOURCE_FACTORY_UNKNOWN_INPUT_STREAM_FACTORY, e, streamSource);
                     }
             }
         }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/StreamRecordReaderProvider.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/StreamRecordReaderProvider.java
index d6df81d..4165fa8 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/StreamRecordReaderProvider.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/provider/StreamRecordReaderProvider.java
@@ -32,7 +32,6 @@
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.external.api.AsterixInputStream;
 import org.apache.asterix.external.input.record.reader.stream.StreamRecordReader;
 import org.apache.asterix.external.util.ExternalDataConstants;
 import org.apache.commons.io.IOUtils;
@@ -40,8 +39,8 @@
 
 public class StreamRecordReaderProvider {
 
-    private static final String RESOURCE = "META-INF/services/org.apache.asterix.external.input.record."
-            + "reader.stream.StreamRecordReader";
+    private static final String RESOURCE =
+            "META-INF/services/org.apache.asterix.external.input.record." + "reader.stream.StreamRecordReader";
     private static Map<String, List<Pair<String[], Class>>> recordReaders = null;
 
     protected static StreamRecordReader getInstance(Class clazz) throws AsterixException {
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
index a6c46c3..494efb5 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
@@ -95,6 +95,7 @@
     // a string representing the format of the record (for adapters which produces records with additional information like pk or metadata)
     public static final String KEY_RECORD_FORMAT = "record-format";
     public static final String KEY_META_TYPE_NAME = "meta-type-name";
+    public static final String KEY_ADAPTER_NAME = "adapter-name";
     public static final String READER_STREAM = "stream";
     public static final String KEY_HTTP_PROXY_HOST = "http-proxy-host";
     public static final String KEY_HTTP_PROXY_PORT = "http-proxy-port";
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedConstants.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedConstants.java
index f42c030..a29d66c 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedConstants.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedConstants.java
@@ -18,14 +18,8 @@
  */
 package org.apache.asterix.external.util;
 
-import org.apache.asterix.common.functions.FunctionConstants;
-import org.apache.asterix.common.functions.FunctionSignature;
-
 public class FeedConstants {
 
-    public static final FunctionSignature FEED_COLLECT_FUN_SIGNATURE =
-            new FunctionSignature(FunctionConstants.ASTERIX_NS, "feed_collect", 6);
-
     public final static String FEEDS_METADATA_DV = "feeds_metadata";
     public final static String FAILED_TUPLE_DATASET = "failed_tuple";
     public final static String FAILED_TUPLE_DATASET_TYPE = "FailedTupleType";
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
index dad0d51..8481064 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FeedUtils.java
@@ -24,8 +24,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.asterix.common.api.IClusterManagementWork;
 import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.utils.StoragePathUtil;
@@ -78,9 +78,7 @@
     public static FileSplit splitsForAdapter(String dataverseName, String feedName, String nodeName,
             ClusterPartition partition) {
         File relPathFile = new File(prepareDataverseFeedName(dataverseName, feedName));
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        String storagePartitionPath =
-                StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition.getPartitionId());
+        String storagePartitionPath = StoragePathUtil.prepareStoragePartitionPath(partition.getPartitionId());
         // Note: feed adapter instances in a single node share the feed logger
         // format: 'storage dir name'/partition_#/dataverse/feed/node
         File f = new File(storagePartitionPath + File.separator + relPathFile + File.separator + nodeName);
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FileSystemWatcher.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FileSystemWatcher.java
index ab1c424..74a20f5 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FileSystemWatcher.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/FileSystemWatcher.java
@@ -38,12 +38,12 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FileSystemWatcher {
 
-    private static final Logger LOGGER = Logger.getLogger(FileSystemWatcher.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private WatchService watcher;
     private final HashMap<WatchKey, Path> keys;
     private final LinkedList<File> files = new LinkedList<File>();
@@ -148,18 +148,14 @@
         Path dir = keys.get(key);
         if (dir == null) {
             // This should never happen
-            if (LOGGER.isEnabledFor(Level.WARN)) {
-                LOGGER.warn("WatchKey not recognized!!");
-            }
+            LOGGER.warn("WatchKey not recognized!!");
             return;
         }
         for (WatchEvent<?> event : key.pollEvents()) {
             Kind<?> kind = event.kind();
             // An overflow event means that some events were dropped
             if (kind == StandardWatchEventKinds.OVERFLOW) {
-                if (LOGGER.isEnabledFor(Level.WARN)) {
-                    LOGGER.warn("Overflow event. Some events might have been missed");
-                }
+                LOGGER.warn("Overflow event. Some events might have been missed");
                 // need to read and validate all files.
                 init();
                 return;
@@ -179,9 +175,7 @@
                         LocalFileSystemUtils.validateAndAdd(child, expression, files);
                     }
                 } catch (IOException e) {
-                    if (LOGGER.isEnabledFor(Level.ERROR)) {
-                        LOGGER.error(e);
-                    }
+                    LOGGER.error(e);
                 }
             }
         }
@@ -241,17 +235,13 @@
             try {
                 key = watcher.take();
             } catch (InterruptedException x) {
-                if (LOGGER.isEnabledFor(Level.WARN)) {
-                    LOGGER.warn("Feed Closed");
-                }
+                LOGGER.warn("Feed Closed");
                 if (watcher == null) {
                     return null;
                 }
                 continue;
             } catch (ClosedWatchServiceException e) {
-                if (LOGGER.isEnabledFor(Level.WARN)) {
-                    LOGGER.warn("The watcher has exited");
-                }
+                LOGGER.warn("The watcher has exited");
                 if (watcher == null) {
                     return null;
                 }
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/LocalFileSystemUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/LocalFileSystemUtils.java
index 2cb842b..23c168e 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/LocalFileSystemUtils.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/LocalFileSystemUtils.java
@@ -35,12 +35,11 @@
 
 public class LocalFileSystemUtils {
 
-    public static void traverse(final List<File> files, File root, final String expression,
-            final LinkedList<Path> dirs) throws IOException {
+    public static void traverse(final List<File> files, File root, final String expression, final LinkedList<Path> dirs)
+            throws IOException {
         final Path path = root.toPath();
         if (!Files.exists(path)) {
-            throw new RuntimeDataException(ErrorCode.UTIL_LOCAL_FILE_SYSTEM_UTILS_PATH_NOT_FOUND,
-                    path.toString());
+            throw new RuntimeDataException(ErrorCode.UTIL_LOCAL_FILE_SYSTEM_UTILS_PATH_NOT_FOUND, path.toString());
         }
         if (!Files.isDirectory(path)) {
             validateAndAdd(path, expression, files);
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/TwitterUtil.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/TwitterUtil.java
index bd8e52d..f64daf3 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/TwitterUtil.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/TwitterUtil.java
@@ -23,12 +23,12 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.asterix.common.exceptions.AsterixException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import twitter4j.DirectMessage;
 import twitter4j.FilterQuery;
@@ -48,7 +48,7 @@
 
 public class TwitterUtil {
 
-    private static Logger LOGGER = Logger.getLogger(TwitterUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static class ConfigurationConstants {
         public static final String KEY_LOCATIONS = "locations"; // locations to track
@@ -87,7 +87,8 @@
     public static double[][] getBoundingBoxes(String locationValue) throws AsterixException {
         double[][] locations = null;
 
-        String coordRegex = "^((((\\-?\\d+\\.\\d+),\\s*){3}(\\-?\\d+\\.\\d+)|\\w+);\\s*)*(((\\-?\\d+\\.\\d+),\\s*){3}(\\-?\\d+\\.\\d+)|\\w+)$";
+        String coordRegex =
+                "^((((\\-?\\d+\\.\\d+),\\s*){3}(\\-?\\d+\\.\\d+)|\\w+);\\s*)*(((\\-?\\d+\\.\\d+),\\s*){3}(\\-?\\d+\\.\\d+)|\\w+)$";
         Pattern p = Pattern.compile(coordRegex);
         Matcher m = p.matcher(locationValue);
 
@@ -191,17 +192,17 @@
         try {
             tf = new TwitterFactory(cb.build());
         } catch (Exception e) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
+            if (LOGGER.isWarnEnabled()) {
                 StringBuilder builder = new StringBuilder();
                 builder.append("Twitter Adapter requires the following config parameters\n");
                 builder.append(AuthenticationConstants.OAUTH_CONSUMER_KEY + "\n");
                 builder.append(AuthenticationConstants.OAUTH_CONSUMER_SECRET + "\n");
                 builder.append(AuthenticationConstants.OAUTH_ACCESS_TOKEN + "\n");
                 builder.append(AuthenticationConstants.OAUTH_ACCESS_TOKEN_SECRET + "\n");
-                LOGGER.warning(builder.toString());
-                LOGGER.warning(
+                LOGGER.warn(builder.toString());
+                LOGGER.warn(
                         "Unable to configure Twitter adapter due to incomplete/incorrect authentication credentials");
-                LOGGER.warning(
+                LOGGER.warn(
                         "For details on how to obtain OAuth authentication token, visit https://dev.twitter.com/oauth"
                                 + "/overview/application-owner-access-tokens");
             }
@@ -277,10 +278,8 @@
                     break;
             }
         } catch (Exception e) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("unable to load authentication credentials from auth.properties file"
-                        + "credential information will be obtained from adapter's configuration");
-            }
+            LOGGER.warn("unable to load authentication credentials from auth.properties file"
+                    + "credential information will be obtained from adapter's configuration");
         }
     }
 
diff --git a/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory b/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
index 79289b0..7ce2048 100644
--- a/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
+++ b/asterixdb/asterix-external-data/src/main/resources/META-INF/services/org.apache.asterix.external.api.IDataParserFactory
@@ -16,6 +16,7 @@
 # under the License.
 #
 org.apache.asterix.external.parser.factory.ADMDataParserFactory
+org.apache.asterix.external.parser.factory.JSONDataParserFactory
 org.apache.asterix.external.parser.factory.DelimitedDataParserFactory
 org.apache.asterix.external.parser.factory.HiveDataParserFactory
 org.apache.asterix.external.parser.factory.RecordWithMetadataParserFactory
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/ClassAd.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/ClassAd.java
index 7ac637f..bc24227 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/ClassAd.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/ClassAd.java
@@ -105,8 +105,8 @@
         specialAttrNames.add(ATTR_PARENT);
     }
 
-    public static final FunctionCall curr_time_expr = FunctionCall.createFunctionCall("time",
-            new ExprList(new ClassAdObjectPool()), new ClassAdObjectPool());
+    public static final FunctionCall curr_time_expr =
+            FunctionCall.createFunctionCall("time", new ExprList(new ClassAdObjectPool()), new ClassAdObjectPool());
 
     private ClassAd alternateScope;
     private final Map<CaseInsensitiveString, ExprTree> attrList;
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/Operation.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/Operation.java
index 73ededd..562bd49 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/Operation.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/Operation.java
@@ -529,8 +529,8 @@
         }
 
         // do evaluation
-        sig = privateDoOperation(opKind.getIntegerValue(), val1, val2, val3, valid1, valid2, valid3, result,
-                state, objectPool);
+        sig = privateDoOperation(opKind.getIntegerValue(), val1, val2, val3, valid1, valid2, valid3, result, state,
+                objectPool);
 
         // delete trees which were not significant
         if (valid1 && 0 != (sig & SigValues.SIG_CHLD1.ordinal())) {
@@ -553,8 +553,7 @@
         // corresponding value is UNDEFINED or ERROR, propagate only that tree
         if (isStrictOperator(opKind.getIntegerValue())) {
             // strict unary operators:  unary -, unary +, !, ~, ()
-            if (opKind.getIntegerValue() == OpKind_UNARY_MINUS_OP
-                    || opKind.getIntegerValue() == OpKind_UNARY_PLUS_OP
+            if (opKind.getIntegerValue() == OpKind_UNARY_MINUS_OP || opKind.getIntegerValue() == OpKind_UNARY_PLUS_OP
                     || opKind.getIntegerValue() == OpKind_LOGICAL_NOT_OP
                     || opKind.getIntegerValue() == OpKind_BITWISE_NOT_OP
                     || opKind.getIntegerValue() == OpKind_PARENTHESES_OP) {
@@ -588,15 +587,13 @@
             }
         } else {
             // non-strict operators
-            if (opKind.getIntegerValue() == OpKind_IS_OP
-                    || opKind.getIntegerValue() == OpKind_ISNT_OP) {
+            if (opKind.getIntegerValue() == OpKind_IS_OP || opKind.getIntegerValue() == OpKind_ISNT_OP) {
                 // the operation is *always* significant for IS and ISNT
                 tree.setInnerTree(createOperation(opKind.getIntegerValue(), t1, t2, objectPool));
                 return (true);
             }
             // other non-strict binary operators
-            if (opKind.getIntegerValue() == OpKind_LOGICAL_AND_OP
-                    || opKind.getIntegerValue() == OpKind_LOGICAL_OR_OP) {
+            if (opKind.getIntegerValue() == OpKind_LOGICAL_AND_OP || opKind.getIntegerValue() == OpKind_LOGICAL_OR_OP) {
                 if ((SigValues.values()[sig].ordinal() & SigValues.SIG_CHLD1.ordinal()) != 0
                         && (SigValues.values()[sig].ordinal() & SigValues.SIG_CHLD2.ordinal()) != 0) {
                     tree.setInnerTree(createOperation(opKind.getIntegerValue(), t1, t2, objectPool));
@@ -765,16 +762,15 @@
         }
 
         // cannot collapse values due to dissimilar ops
-        if ((op1.getIntegerValue() != OpKind_NO_OP || op2.getIntegerValue() != OpKind_NO_OP)
-                && !op.equals(op1) && !op.equals(op1)) {
+        if ((op1.getIntegerValue() != OpKind_NO_OP || op2.getIntegerValue() != OpKind_NO_OP) && !op.equals(op1)
+                && !op.equals(op1)) {
             // at least one of them returned a value and a tree, and parent does
             // not share the same operation with either child
             ExprTreeHolder newOp1 = objectPool.mutableExprPool.get();
             ExprTreeHolder newOp2 = objectPool.mutableExprPool.get();
 
             if (op1.getIntegerValue() != OpKind_NO_OP) {
-                newOp1.setInnerTree(
-                        Operation.createOperation(op1.getIntegerValue(), val1, tree1, objectPool));
+                newOp1.setInnerTree(Operation.createOperation(op1.getIntegerValue(), val1, tree1, objectPool));
             } else if (tree1.getInnerTree() != null) {
                 newOp1.setInnerTree(tree1.getInnerTree());
             } else {
@@ -782,8 +778,7 @@
             }
 
             if (op2.getIntegerValue() != OpKind_NO_OP) {
-                newOp2.setInnerTree(
-                        Operation.createOperation(op2.getIntegerValue(), val2, tree2, objectPool));
+                newOp2.setInnerTree(Operation.createOperation(op2.getIntegerValue(), val2, tree2, objectPool));
             } else if (tree2.getInnerTree() != null) {
                 newOp2.setInnerTree(tree2);
             } else {
@@ -820,8 +815,7 @@
             // leftson makes a tree,value contribution
             if (tree2.getInnerTree() == null) {
                 // rightson makes a value contribution
-                privateDoOperation(op.getIntegerValue(), val1, val2, dummy, true, true, false, val,
-                        objectPool);
+                privateDoOperation(op.getIntegerValue(), val1, val2, dummy, true, true, false, val, objectPool);
                 tree.setInnerTree(tree1);
                 return true;
             } else {
@@ -840,8 +834,7 @@
             // rightson makes a tree,value contribution
             if (tree1.getInnerTree() == null) {
                 // leftson makes a value contribution
-                privateDoOperation(op.getIntegerValue(), val1, val2, dummy, true, true, false, val,
-                        objectPool);
+                privateDoOperation(op.getIntegerValue(), val1, val2, dummy, true, true, false, val, objectPool);
                 tree.setInnerTree(tree2);
                 return true;
             } else {
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdParserTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdParserTest.java
index f661d06..a4ac726 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdParserTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdParserTest.java
@@ -58,7 +58,7 @@
             ClassAdObjectPool objectPool = new ClassAdObjectPool();
             ClassAd pAd = new ClassAd(objectPool);
             String szInput;
-            String[] files = new String[] {"/classad/testdata.txt"};
+            String[] files = new String[] { "/classad/testdata.txt" };
             BufferedReader infile = null;
             for (String path : files) {
                 infile = Files.newBufferedReader(
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdToADMTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdToADMTest.java
index 3bbcf89..47f784a 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdToADMTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdToADMTest.java
@@ -90,8 +90,8 @@
     public void testSchemaful() {
         try {
             File file = new File("target/classad-wtih-temporals.adm");
-            File expected = new File(
-                    getClass().getResource("/classad/results/classad-with-temporals.adm").toURI().getPath());
+            File expected =
+                    new File(getClass().getResource("/classad/results/classad-with-temporals.adm").toURI().getPath());
             FileUtils.deleteQuietly(file);
             PrintStream printStream = new PrintStream(Files.newOutputStream(Paths.get(file.toURI())));
             String[] recordFieldNames = { "GlobalJobId", "Owner", "ClusterId", "ProcId", "RemoteWallClockTime",
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdUnitTester.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdUnitTester.java
index eaade6c..85b866e 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdUnitTester.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/classad/test/ClassAdUnitTester.java
@@ -332,7 +332,8 @@
 
         System.out.println("Testing the ClassAd class...");
 
-        String input_basic = "[ A = 3; B = 4.0; C = \"babyzilla\"; D = true; E = {1}; F = [ AA = 3; ]; G =\"deleteme\";]";
+        String input_basic =
+                "[ A = 3; B = 4.0; C = \"babyzilla\"; D = true; E = {1}; F = [ AA = 3; ]; G =\"deleteme\";]";
         ClassAd basic = new ClassAd(objectPool);
         AMutableInt64 i = new AMutableInt64(0);
         MutableBoolean b = new MutableBoolean();
@@ -380,7 +381,8 @@
         basic = null;
 
         /* ----- Test GetExternalReferences ----- */
-        String inputRef = "[ Rank=Member(\"LCG-2_1_0\",other.Environment) ? other.Time/seconds : other.Time/minutes; minutes=60; ]";
+        String inputRef =
+                "[ Rank=Member(\"LCG-2_1_0\",other.Environment) ? other.Time/seconds : other.Time/minutes; minutes=60; ]";
         TreeSet<String> refs = new TreeSet<String>();
         ExprTree rank;
 
@@ -431,7 +433,8 @@
 
         // This ClassAd may cause problems. Perhaps a memory leak.
         // This test is only useful when run under valgrind.
-        String memoryProblemClassad = "[ Updates = [status = \"request_completed\"; timestamp = absTime(\"2004-12-16T18:10:59-0600]\")] ]";
+        String memoryProblemClassad =
+                "[ Updates = [status = \"request_completed\"; timestamp = absTime(\"2004-12-16T18:10:59-0600]\")] ]";
         c = parser.parseClassAd(memoryProblemClassad);
 
         /* ----- Test Parsing multiple ClassAds ----- */
@@ -441,11 +444,9 @@
         AMutableInt32 offset = new AMutableInt32(0);
 
         parser.parseClassAd(twoClassads, classad1, offset);
-        test("Have good offset #1", offset.getIntegerValue() == 10, "Test Parsing multiple ClassAds 1",
-                results);
+        test("Have good offset #1", offset.getIntegerValue() == 10, "Test Parsing multiple ClassAds 1", results);
         parser.parseClassAd(twoClassads, classad2, offset);
-        test("Have good offset #2", offset.getIntegerValue() == 20, "Test Parsing multiple ClassAds 2",
-                results);
+        test("Have good offset #2", offset.getIntegerValue() == 20, "Test Parsing multiple ClassAds 2", results);
 
         /* ----- Test chained ClassAds ----- */
         // classad1 and classad2 from above test are used.
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/TestAsterixMembersReader.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/TestAsterixMembersReader.java
index 665d50b..8e6f346 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/TestAsterixMembersReader.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/TestAsterixMembersReader.java
@@ -38,8 +38,8 @@
     private int counter = 0;
     private final int numOfRecords = 10;
     private final StringBuilder builder = new StringBuilder();
-    private static final String[] names = { "Abdullah", "Michael", "Till", "Yingyi", "Ildar", "Taewoo", "Young-Seok",
-            "Murtadha", "Ian", "Steven" };
+    private static final String[] names =
+            { "Abdullah", "Michael", "Till", "Yingyi", "Ildar", "Taewoo", "Young-Seok", "Murtadha", "Ian", "Steven" };
 
     public TestAsterixMembersReader() {
         rawRecord = new CharArrayRecord();
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/kv/KVTestReader.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/kv/KVTestReader.java
index 57f37da..ec1db67 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/kv/KVTestReader.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/input/record/reader/kv/KVTestReader.java
@@ -28,7 +28,8 @@
 import org.apache.asterix.external.input.record.GenericRecord;
 import org.apache.asterix.external.util.ExternalDataConstants;
 import org.apache.asterix.external.util.FeedLogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.couchbase.client.core.message.dcp.DCPRequest;
 import com.couchbase.client.core.message.dcp.MutationMessage;
@@ -39,7 +40,7 @@
 public class KVTestReader implements IRecordReader<DCPRequest> {
 
     private final GenericRecord<DCPRequest> record;
-    private static final Logger LOGGER = Logger.getLogger(KVTestReader.class);
+    private static final Logger LOGGER = LogManager.getLogger();
     // Test variables
     private final String bucket;
     private final ArrayList<Short> assigned;
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/CapitalFinderFunction.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/CapitalFinderFunction.java
index ecd9b13..cc32f45 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/CapitalFinderFunction.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/CapitalFinderFunction.java
@@ -52,7 +52,8 @@
 
     @Override
     public void initialize(IFunctionHelper functionHelper) throws Exception {
-        InputStream in = CapitalFinderFunction.class.getClassLoader().getResourceAsStream("data/countriesCapitals.properties");
+        InputStream in =
+                CapitalFinderFunction.class.getClassLoader().getResourceAsStream("data/countriesCapitals.properties");
         capitalList = new Properties();
         capitalList.load(in);
         capital = (JString) functionHelper.getObject(JTypeTag.STRING);
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/ClassAdParser.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/ClassAdParser.java
index 04848a5..2f9faed 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/ClassAdParser.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/ClassAdParser.java
@@ -89,14 +89,12 @@
     private final ClassAdObjectPool objectPool;
     // asterix objects
     private ARecordType recordType;
-    private IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool = new ListObjectPool<IARecordBuilder, ATypeTag>(
-            new RecordBuilderFactory());
+    private IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool =
+            new ListObjectPool<IARecordBuilder, ATypeTag>(new RecordBuilderFactory());
     private IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool =
-            new ListObjectPool<IAsterixListBuilder, ATypeTag>(
-                    new ListBuilderFactory());
+            new ListObjectPool<IAsterixListBuilder, ATypeTag>(new ListBuilderFactory());
     private IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool =
-            new ListObjectPool<IMutableValueStorage, ATypeTag>(
-                    new AbvsBuilderFactory());
+            new ListObjectPool<IMutableValueStorage, ATypeTag>(new AbvsBuilderFactory());
     private final ClassAd rootAd;
     private String exprPrefix = "expr=";
     private String exprSuffix = "";
@@ -1351,7 +1349,7 @@
                     if (!parseArgumentList(argList)) {
                         tree.setInnerTree(null);
                         return false;
-                    };
+                    } ;
                     // special case function-calls should be converted
                     // into a literal expression if the argument is a
                     // string literal
@@ -1399,7 +1397,7 @@
                 tree.setInnerTree(Operation.createOperation(Operation.OpKind_PARENTHESES_OP, treeL, objectPool));
                 return (tree.size() != 0);
             }
-                // constants
+            // constants
             case LEX_OPEN_BOX: {
                 isExpr = true;
                 ClassAd newAd = objectPool.classAdPool.get();
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapter.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapter.java
index fcd010d..90336fe 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapter.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapter.java
@@ -25,8 +25,6 @@
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.external.dataset.adapter.FeedAdapter;
 import org.apache.asterix.om.types.ARecordType;
@@ -36,6 +34,8 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.std.file.ITupleParser;
 import org.apache.hyracks.dataflow.std.file.ITupleParserFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TestTypedAdapter extends FeedAdapter {
 
@@ -51,7 +51,7 @@
 
     protected final IAType sourceDatatype;
 
-    protected static final Logger LOGGER = Logger.getLogger(TestTypedAdapter.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
 
     public TestTypedAdapter(ITupleParserFactory parserFactory, ARecordType sourceDatatype, IHyracksTaskContext ctx,
             Map<String, String> configuration, int partition) throws IOException {
@@ -71,10 +71,9 @@
         if (pis != null) {
             tupleParser.parse(pis, writer);
         } else {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning(
-                        "Could not obtain input stream for parsing from adapter " + this + "[" + partition + "]");
-            }
+        }
+        if (LOGGER.isWarnEnabled()) {
+            LOGGER.warn("Could not obtain input stream for parsing from adapter " + this + "[" + partition + "]");
         }
     }
 
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapterFactory.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapterFactory.java
index 616ed6e..6fe938c 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapterFactory.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/library/adapter/TestTypedAdapterFactory.java
@@ -85,10 +85,12 @@
                         (IApplicationContext) ctx.getJobletContext().getServiceContext().getApplicationContext();
                 ClusterPartition nodePartition = appCtx.getMetadataProperties().getNodePartitions().get(nodeId)[0];
                 parser = new ADMDataParser(outputType, true);
-                forwarder = DataflowUtils.getTupleForwarder(configuration,
-                        FeedUtils.getFeedLogManager(ctx,
-                                FeedUtils.splitsForAdapter(ExternalDataUtils.getDataverse(configuration),
-                                        ExternalDataUtils.getFeedName(configuration), nodeId, nodePartition)));
+                forwarder =
+                        DataflowUtils
+                                .getTupleForwarder(configuration,
+                                        FeedUtils.getFeedLogManager(ctx, FeedUtils.splitsForAdapter(
+                                                ExternalDataUtils.getDataverse(configuration),
+                                                ExternalDataUtils.getFeedName(configuration), nodeId, nodePartition)));
                 tb = new ArrayTupleBuilder(1);
                 return new ITupleParser() {
 
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/TestRecordWithPKParser.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/TestRecordWithPKParser.java
index 21a1430..fb222e6 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/TestRecordWithPKParser.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/TestRecordWithPKParser.java
@@ -37,8 +37,8 @@
     }
 
     @Override
-    public void parse(final IRawRecord<? extends RecordWithPK<T>> record, final DataOutput out) throws
-            HyracksDataException {
+    public void parse(final IRawRecord<? extends RecordWithPK<T>> record, final DataOutput out)
+            throws HyracksDataException {
         recordParser.parse(record.get().getRecord(), out);
     }
 
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/factory/TestRecordWithPKParserFactory.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/factory/TestRecordWithPKParserFactory.java
index 7284979..42f1f99 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/factory/TestRecordWithPKParserFactory.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/factory/TestRecordWithPKParserFactory.java
@@ -23,7 +23,6 @@
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.external.api.IRecordDataParser;
 import org.apache.asterix.external.api.IRecordDataParserFactory;
 import org.apache.asterix.external.input.record.RecordWithPK;
@@ -32,6 +31,7 @@
 import org.apache.asterix.external.util.ExternalDataConstants;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
@@ -49,7 +49,7 @@
     private int[][] pkIndexes;
 
     @Override
-    public void configure(Map<String, String> configuration) throws AsterixException {
+    public void configure(Map<String, String> configuration) throws AlgebricksException {
         TreeMap<String, String> parserConf = new TreeMap<String, String>();
         format = configuration.get(ExternalDataConstants.KEY_RECORD_FORMAT);
         parserFormats.add(format);
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ADMDataParserTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ADMDataParserTest.java
index 6f36eab..f06528e 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ADMDataParserTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ADMDataParserTest.java
@@ -38,22 +38,22 @@
     @Test
     public void test() throws IOException {
         String[] dates = { "-9537-08-04", "9656-06-03", "-9537-04-04", "9656-06-04", "-9537-10-04", "9626-09-05" };
-        AMutableDate[] parsedDates = new AMutableDate[] { new AMutableDate(-4202630), new AMutableDate(2807408),
-                new AMutableDate(-4202752), new AMutableDate(2807409), new AMutableDate(-4202569),
-                new AMutableDate(2796544), };
+        AMutableDate[] parsedDates =
+                new AMutableDate[] { new AMutableDate(-4202630), new AMutableDate(2807408), new AMutableDate(-4202752),
+                        new AMutableDate(2807409), new AMutableDate(-4202569), new AMutableDate(2796544), };
 
         String[] times = { "12:04:45.689Z", "12:41:59.002Z", "12:10:45.169Z", "15:37:48.736Z", "04:16:42.321Z",
                 "12:22:56.816Z" };
-        AMutableTime[] parsedTimes = new AMutableTime[] { new AMutableTime(43485689), new AMutableTime(45719002),
-                new AMutableTime(43845169), new AMutableTime(56268736), new AMutableTime(15402321),
-                new AMutableTime(44576816), };
+        AMutableTime[] parsedTimes =
+                new AMutableTime[] { new AMutableTime(43485689), new AMutableTime(45719002), new AMutableTime(43845169),
+                        new AMutableTime(56268736), new AMutableTime(15402321), new AMutableTime(44576816), };
 
         String[] dateTimes = { "-2640-10-11T17:32:15.675Z", "4104-02-01T05:59:11.902Z", "0534-12-08T08:20:31.487Z",
                 "6778-02-16T22:40:21.653Z", "2129-12-12T13:18:35.758Z", "8647-07-01T13:10:19.691Z" };
-        AMutableDateTime[] parsedDateTimes = new AMutableDateTime[] { new AMutableDateTime(-145452954464325L),
-                new AMutableDateTime(67345192751902L), new AMutableDateTime(-45286270768513L),
-                new AMutableDateTime(151729886421653L), new AMutableDateTime(5047449515758L),
-                new AMutableDateTime(210721439419691L) };
+        AMutableDateTime[] parsedDateTimes =
+                new AMutableDateTime[] { new AMutableDateTime(-145452954464325L), new AMutableDateTime(67345192751902L),
+                        new AMutableDateTime(-45286270768513L), new AMutableDateTime(151729886421653L),
+                        new AMutableDateTime(5047449515758L), new AMutableDateTime(210721439419691L) };
 
         Thread[] threads = new Thread[16];
         AtomicInteger errorCount = new AtomicInteger(0);
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ParserFactoryProviderLoadParserTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ParserFactoryProviderLoadParserTest.java
index effb7cd..26cefa8 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ParserFactoryProviderLoadParserTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/ParserFactoryProviderLoadParserTest.java
@@ -29,10 +29,10 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-
 public class ParserFactoryProviderLoadParserTest {
 
     IDataParserFactory factory;
+
     @Test
     public void test() throws AsterixException {
         boolean result = true;
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/StreamRecordReaderProviderTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/StreamRecordReaderProviderTest.java
index 71a5072..3a9d7a5 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/StreamRecordReaderProviderTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/StreamRecordReaderProviderTest.java
@@ -32,14 +32,11 @@
 public class StreamRecordReaderProviderTest {
 
     @Test
-    public void Test() throws AsterixException{
-        List<String> recordReaderFormats = Arrays.asList(
-                ExternalDataConstants.FORMAT_LINE_SEPARATED,
-                ExternalDataConstants.FORMAT_ADM,
-                ExternalDataConstants.FORMAT_JSON,
-                ExternalDataConstants.FORMAT_SEMISTRUCTURED,
-                ExternalDataConstants.FORMAT_DELIMITED_TEXT,
-                ExternalDataConstants.FORMAT_CSV);
+    public void Test() throws AsterixException {
+        List<String> recordReaderFormats =
+                Arrays.asList(ExternalDataConstants.FORMAT_LINE_SEPARATED, ExternalDataConstants.FORMAT_ADM,
+                        ExternalDataConstants.FORMAT_JSON, ExternalDataConstants.FORMAT_SEMISTRUCTURED,
+                        ExternalDataConstants.FORMAT_DELIMITED_TEXT, ExternalDataConstants.FORMAT_CSV);
         Map<String, String> config = new HashMap<>();
         for (String format : recordReaderFormats) {
             config.clear();
diff --git a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/TweetParserTest.java b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/TweetParserTest.java
index 5389310..9916fa5 100644
--- a/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/TweetParserTest.java
+++ b/asterixdb/asterix-external-data/src/test/java/org/apache/asterix/external/parser/test/TweetParserTest.java
@@ -60,8 +60,8 @@
         unionTypeList.add(ANULL);
         unionTypeList.add(AMISSING);
         IAType geoUnionType = new AUnionType(unionTypeList, "GeoType?");
-        ARecordType tweetRecordType = new ARecordType("TweetType", new String[] { "id", "geo" },
-                new IAType[] { AINT64, geoUnionType }, true);
+        ARecordType tweetRecordType =
+                new ARecordType("TweetType", new String[] { "id", "geo" }, new IAType[] { AINT64, geoUnionType }, true);
 
         TweetParser parser = new TweetParser(tweetRecordType);
 
@@ -86,8 +86,8 @@
         // contruct type
         IAType geoFieldType = new ARecordType("GeoType", new String[] { "coordinates" },
                 new IAType[] { new AOrderedListType(AFLOAT, "point") }, true);
-        ARecordType tweetRecordType = new ARecordType("TweetType", new String[] { "id", "geo" },
-                new IAType[] { AINT64, geoFieldType }, true);
+        ARecordType tweetRecordType =
+                new ARecordType("TweetType", new String[] { "id", "geo" }, new IAType[] { AINT64, geoFieldType }, true);
 
         TweetParser parser = new TweetParser(tweetRecordType);
         List<String> lines = Files.readAllLines(Paths.get(getClass().getResource("/test_tweets.txt").toURI()));
diff --git a/asterixdb/asterix-fuzzyjoin/pom.xml b/asterixdb/asterix-fuzzyjoin/pom.xml
index fb3bb63..236bcc7 100644
--- a/asterixdb/asterix-fuzzyjoin/pom.xml
+++ b/asterixdb/asterix-fuzzyjoin/pom.xml
@@ -36,7 +36,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <build>
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyFiltersJaccard.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyFiltersJaccard.java
index 770e9dd..5f50108 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyFiltersJaccard.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyFiltersJaccard.java
@@ -92,13 +92,13 @@
      * @return
      */
     public boolean passPositionFilter(int noGramsCommon, int positionX, int positionY, int lengthX, int lengthY) {
-        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX, lengthY) >= getIntersectLowerBound(
-                lengthX, lengthY);
+        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX,
+                lengthY) >= getIntersectLowerBound(lengthX, lengthY);
     }
 
     public boolean passPositionFilter(int noGramsCommon, long positionX, long positionY, long lengthX, long lengthY) {
-        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX, lengthY) >= getIntersectLowerBound(
-                lengthX, lengthY);
+        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX,
+                lengthY) >= getIntersectLowerBound(lengthX, lengthY);
     }
 
 }
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinAppendLength.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinAppendLength.java
index 6778152..8be6f0c 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinAppendLength.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinAppendLength.java
@@ -45,8 +45,8 @@
         String line;
         while ((line = input.readLine()) != null) {
             String[] splits = line.split(FuzzyJoinConfig.RECORD_SEPARATOR_REGEX);
-            Collection<String> tokens = tokenizer
-                    .tokenize(FuzzyJoinUtil.getData(splits, dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
+            Collection<String> tokens =
+                    tokenizer.tokenize(FuzzyJoinUtil.getData(splits, dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
             output.write(splits[0] + FuzzyJoinConfig.RECORD_SEPARATOR + splits[1] + FuzzyJoinConfig.RECORD_SEPARATOR
                     + splits[2] + FuzzyJoinConfig.RECORD_SEPARATOR + splits[3] + FuzzyJoinConfig.RECORD_SEPARATOR
                     + tokens.size() + "\n");
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinMemory.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinMemory.java
index e42ba51..02d3037 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinMemory.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinMemory.java
@@ -80,7 +80,7 @@
     @SuppressWarnings("squid:S1166") // Either log or rethrow this exception
     public static void readRecords(String fileName, List<int[]> records, List<Integer> rids) throws IOException {
         try (LittleEndianIntInputStream in =
-                     new LittleEndianIntInputStream(new BufferedInputStream(new FileInputStream(fileName)))) {
+                new LittleEndianIntInputStream(new BufferedInputStream(new FileInputStream(fileName)))) {
 
             while (true) {
                 int rid = 0;
@@ -161,9 +161,8 @@
                             count = -1;
                         }
                         // suffix filter
-                        if (count == 1
-                                && !similarityFilters.passSuffixFilter(tokens, indexToken, records.get(indexProbe),
-                                        indexTokenProbe)) {
+                        if (count == 1 && !similarityFilters.passSuffixFilter(tokens, indexToken,
+                                records.get(indexProbe), indexTokenProbe)) {
                             count = -1;
                         }
                         counts.put(indexProbe, count);
@@ -268,9 +267,8 @@
                             count = -1;
                         }
                         // suffix filter
-                        if (count == 1
-                                && !similarityFilters.passSuffixFilter(tokens, indexToken, records.get(indexProbe),
-                                        indexTokenProbe)) {
+                        if (count == 1 && !similarityFilters.passSuffixFilter(tokens, indexToken,
+                                records.get(indexProbe), indexTokenProbe)) {
                             count = -1;
                         }
                         counts.put(indexProbe, count);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinTokenize.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinTokenize.java
index 64c7e52..4c85f25 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinTokenize.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/FuzzyJoinTokenize.java
@@ -78,8 +78,9 @@
         String line;
         HashMap<String, MutableInteger> tokenCount = new HashMap<String, MutableInteger>();
         while ((line = input.readLine()) != null) {
-            Collection<String> tokens = tokenizer.tokenize(FuzzyJoinUtil.getData(
-                    line.split(FuzzyJoinConfig.RECORD_SEPARATOR_REGEX), dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
+            Collection<String> tokens =
+                    tokenizer.tokenize(FuzzyJoinUtil.getData(line.split(FuzzyJoinConfig.RECORD_SEPARATOR_REGEX),
+                            dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
 
             for (String token : tokens) {
                 MutableInteger count = tokenCount.get(token);
@@ -108,14 +109,14 @@
         tokenLoad.loadTokenRank();
 
         input = new BufferedReader(new FileReader(inputFileName));
-        LittleEndianIntOutputStream outputTokenized = new LittleEndianIntOutputStream(
-                new BufferedOutputStream(new FileOutputStream(tokenizedFileName)));
+        LittleEndianIntOutputStream outputTokenized =
+                new LittleEndianIntOutputStream(new BufferedOutputStream(new FileOutputStream(tokenizedFileName)));
         while ((line = input.readLine()) != null) {
             String splits[] = line.split(FuzzyJoinConfig.RECORD_SEPARATOR_REGEX);
             int rid = Integer.parseInt(splits[FuzzyJoinConfig.RECORD_KEY]);
             outputTokenized.writeInt(rid);
-            Collection<String> tokens = tokenizer
-                    .tokenize(FuzzyJoinUtil.getData(splits, dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
+            Collection<String> tokens =
+                    tokenizer.tokenize(FuzzyJoinUtil.getData(splits, dataColumns, FuzzyJoinConfig.TOKEN_SEPARATOR));
             Collection<Integer> tokensRanked = tokenRank.getTokenRanks(tokens);
             outputTokenized.writeInt(tokensRanked.size());
             for (Integer token : tokensRanked) {
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/invertedlist/InvertedList.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/invertedlist/InvertedList.java
index ee1e362..7a9356a 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/invertedlist/InvertedList.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/invertedlist/InvertedList.java
@@ -19,7 +19,6 @@
 
 package org.apache.asterix.fuzzyjoin.invertedlist;
 
-
 public interface InvertedList extends Iterable<int[]> {
     public void add(int[] element);
 
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityFiltersJaccard.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityFiltersJaccard.java
index f16fed9..556c0b7 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityFiltersJaccard.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityFiltersJaccard.java
@@ -186,8 +186,8 @@
      * @return
      */
     public boolean passPositionFilter(int noGramsCommon, int positionX, int lengthX, int positionY, int lengthY) {
-        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX, lengthY) >= getIntersectLowerBound(
-                lengthX, lengthY);
+        return getIntersectUpperBound(noGramsCommon, positionX, positionY, lengthX,
+                lengthY) >= getIntersectLowerBound(lengthX, lengthY);
     }
 
     public float passSimilarityFilter(final int[] tokensX, int startX, int lengthX, final int prefixLengthX,
@@ -208,9 +208,9 @@
             }
         } else {
             if (intersectionSizePrefix + lengthProbe - prefixLengthY >= intersectSizeLowerBound) {
-                intersectSize = intersectionSizePrefix
-                        + SimilarityMetric.getIntersectSize(tokensX, startX + intersectionSizePrefix, lengthX
-                                - intersectionSizePrefix, tokensY, startY + prefixLengthY, lengthY - prefixLengthY);
+                intersectSize = intersectionSizePrefix + SimilarityMetric.getIntersectSize(tokensX,
+                        startX + intersectionSizePrefix, lengthX - intersectionSizePrefix, tokensY,
+                        startY + prefixLengthY, lengthY - prefixLengthY);
             }
         }
 
@@ -268,8 +268,8 @@
 
     public boolean passSuffixFilter(int[] tokensX, int tokensStartX, int tokensLengthX, int positionX, int[] tokensY,
             int tokensStartY, int tokensLengthY, int positionY) {
-        int hammingMax = tokensLengthX + tokensLengthY - 2
-                * (int) Math.ceil(simThr100 / (100 + simThr100) * (tokensLengthX + tokensLengthY))
+        int hammingMax = tokensLengthX + tokensLengthY
+                - 2 * (int) Math.ceil(simThr100 / (100 + simThr100) * (tokensLengthX + tokensLengthY))
                 - (positionX + 1 + positionY + 1 - 2);
         int hamming = getSuffixFilter(tokensX, tokensStartX + positionX + 1, tokensLengthX - positionX - 1, tokensY,
                 tokensStartY + positionY + 1, tokensLengthY - positionY - 1, hammingMax, 1);
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityMetricJaccard.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityMetricJaccard.java
index 4a31b8b..63d3077 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityMetricJaccard.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/similarity/SimilarityMetricJaccard.java
@@ -60,8 +60,8 @@
         // apply length filter
         int lengthLowerBound = (int) Math.ceil(simThresh * firstList.size());
 
-        boolean passesLengthFilter = (lengthLowerBound <= secondList.size())
-                && (secondList.size() <= 1.0f / simThresh * firstList.size());
+        boolean passesLengthFilter =
+                (lengthLowerBound <= secondList.size()) && (secondList.size() <= 1.0f / simThresh * firstList.size());
         if (!passesLengthFilter) {
             return -1f;
         }
diff --git a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/tokenizer/TokenizerBufferedFactory.java b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/tokenizer/TokenizerBufferedFactory.java
index 164b965..2f4e8c6 100644
--- a/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/tokenizer/TokenizerBufferedFactory.java
+++ b/asterixdb/asterix-fuzzyjoin/src/main/java/org/apache/asterix/fuzzyjoin/tokenizer/TokenizerBufferedFactory.java
@@ -28,6 +28,7 @@
     }
 
     public static boolean isSeparator(char c) {
-        return !(Character.isLetterOrDigit(c) || Character.getType(c) == Character.OTHER_LETTER || Character.getType(c) == Character.OTHER_NUMBER);
+        return !(Character.isLetterOrDigit(c) || Character.getType(c) == Character.OTHER_LETTER
+                || Character.getType(c) == Character.OTHER_NUMBER);
     }
 }
diff --git a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/FuzzyJoinTest.java b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/FuzzyJoinTest.java
index 40e4b8e..d2f5da5 100644
--- a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/FuzzyJoinTest.java
+++ b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/FuzzyJoinTest.java
@@ -55,7 +55,8 @@
 
         BufferedWriter out = new BufferedWriter(new FileWriter(base + dataset.getPathPart0(Directory.SSJOINOUT)));
         for (ResultSelfJoin result : results) {
-            out.write(String.format("%d %d %.3f\n", rids.get(result.indexX), rids.get(result.indexY), result.similarity));
+            out.write(
+                    String.format("%d %d %.3f\n", rids.get(result.indexX), rids.get(result.indexY), result.similarity));
         }
         out.close();
 
diff --git a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/AbstractDataset.java b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/AbstractDataset.java
index 1629c74..fe77a38 100644
--- a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/AbstractDataset.java
+++ b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/AbstractDataset.java
@@ -40,7 +40,8 @@
     }
 
     public static enum Relation {
-        R, S,
+        R,
+        S,
     }
 
     public static final String FILE_PART = "part-";
diff --git a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/DBLPDataset.java b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/DBLPDataset.java
index 429a26e..15fada4 100644
--- a/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/DBLPDataset.java
+++ b/asterixdb/asterix-fuzzyjoin/src/test/java/org/apache/asterix/fuzzyjoin/tests/dataset/DBLPDataset.java
@@ -19,7 +19,6 @@
 
 package org.apache.asterix.fuzzyjoin.tests.dataset;
 
-
 public class DBLPDataset extends PublicationsDataset {
     private static final String NAME = "dblp";
     private static final int NO_RECORDS = 1268017;
diff --git a/asterixdb/asterix-hivecompat/pom.xml b/asterixdb/asterix-hivecompat/pom.xml
index b504d1d..1d8884a 100644
--- a/asterixdb/asterix-hivecompat/pom.xml
+++ b/asterixdb/asterix-hivecompat/pom.xml
@@ -32,6 +32,10 @@
     </license>
   </licenses>
   <artifactId>asterix-hivecompat</artifactId>
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+    <source-format.skip>true</source-format.skip>
+  </properties>
   <build>
     <plugins>
       <plugin>
diff --git a/asterixdb/asterix-installer/pom.xml b/asterixdb/asterix-installer/pom.xml
deleted file mode 100644
index 2d96f25..0000000
--- a/asterixdb/asterix-installer/pom.xml
+++ /dev/null
@@ -1,550 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>apache-asterixdb</artifactId>
-    <groupId>org.apache.asterix</groupId>
-    <version>0.9.4-SNAPSHOT</version>
-  </parent>
-  <artifactId>asterix-installer</artifactId>
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <appendedResourcesDirectory>${basedir}/src/main/appended-resources</appendedResourcesDirectory>
-
-    <failsafe.test.excludes>**/DmlRecoveryIT.java</failsafe.test.excludes>
-    <cluster.test.excludes>**/AsterixClusterLifeCycleIT.java</cluster.test.excludes>
-    <cluster.extest.excludes>**/ClusterExecutionIT.java</cluster.extest.excludes>
-  </properties>
-
-  <licenses>
-    <license>
-      <name>Apache License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-      <comments>A business-friendly OSS license</comments>
-    </license>
-  </licenses>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.hyracks</groupId>
-        <artifactId>license-automation-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>generate-resources</phase>
-            <goals>
-              <!--<goal>licensedownload</goal>-->
-              <goal>generate</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <templateRootDir>${basedir}/../src/main/licenses/templates</templateRootDir>
-          <generatedFiles>
-            <generatedFile>
-              <template>asterix-license.ftl</template>
-              <outputFile>LICENSE</outputFile>
-            </generatedFile>
-            <generatedFile>
-              <template>asterix-notice.ftl</template>
-              <outputFile>NOTICE</outputFile>
-            </generatedFile>
-          </generatedFiles>
-          <location>repo/</location>
-          <timeoutSecs>10</timeoutSecs>
-          <extraLicenseMaps>
-            <extraLicenseMap>
-              <file>${basedir}/../asterix-server/target/generated-resources/license_map.json</file>
-              <location>asterix/asterix-server-${project.version}-binary-assembly.zip::repo/</location>
-            </extraLicenseMap>
-          </extraLicenseMaps>
-          <models>
-            <model>${basedir}/../src/main/appended-resources/supplemental-models.xml</model>
-          </models>
-          <downloadDir>${project.build.directory}/generated-resources/license</downloadDir>
-          <excludedScopes>
-            <excludedScope>test</excludedScope>
-          </excludedScopes>
-          <excludes>
-            <exclude>org.apache.asterix:*</exclude>
-            <exclude>org.apache.algebricks:*</exclude>
-            <exclude>org.apache.hyracks:*</exclude>
-          </excludes>
-          <licenseDirectory>${basedir}/../src/main/licenses/content</licenseDirectory>
-          <dependencySets>
-            <dependencySet>
-              <includes>
-                <!-- NOTE! Any changes here must be mirrored in src/main/assembly/binary-assembly.xml -->
-                <include>log4j:log4j</include>
-                <include>org.apache.asterix:asterix-events</include>
-                <include>org.apache.asterix:asterix-common</include>
-                <include>org.apache.commons:commons-lang3</include>
-                <include>org.apache.zookeeper:zookeeper</include>
-                <include>args4j:args4j</include>
-                <include>log4j:log4j</include>
-                <include>commons-io:commons-io</include>
-                <include>org.slf4j:slf4j-api</include>
-                <include>org.slf4j:slf4j-log4j12</include>
-              </includes>
-              <location>lib</location>
-            </dependencySet>
-            <dependencySet>
-              <includes>
-                <!-- NOTE! Any changes here must be mirrored in src/main/assembly/binary-assembly.xml -->
-                <include>commons-cli:commons-cli</include>
-                <include>commons-logging:commons-logging</include>
-              </includes>
-              <location>.installer/hadoop-0.20.2/lib</location>
-            </dependencySet>
-            <dependencySet>
-              <includes>
-                <!-- NOTE! Any changes here must be mirrored in src/main/assembly/binary-assembly.xml -->
-                <include>org.apache.zookeeper:zookeeper</include>
-                <include>log4j:log4j</include>
-                <include>org.slf4j:slf4j-api</include>
-              </includes>
-              <location>.installer/zookeeper/lib</location>
-            </dependencySet>
-          </dependencySets>
-          <overrides>
-            <override>
-              <gav>org.apache.zookeeper:zookeeper:3.4.5</gav>
-              <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            </override>
-          </overrides>
-          <templateProperties>
-            <packageName>Apache AsterixDB Managix Install</packageName>
-            <asterixAppLocation>repo/asterix-app-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</asterixAppLocation>
-            <hyracksControlCcLocation>repo/hyracks-control-cc-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</hyracksControlCcLocation>
-            <hivecompatLocation>repo/asterix-hivecompat-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</hivecompatLocation>
-          </templateProperties>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.jvnet.jaxb2.maven2</groupId>
-        <artifactId>maven-jaxb2-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>configuration</id>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-            <configuration>
-              <args>
-                <arg>-Xsetters</arg>
-                <arg>-Xvalue-constructor</arg>
-              </args>
-              <plugins>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-basics</artifactId>
-                  <version>0.6.2</version>
-                </plugin>
-                <plugin>
-                  <groupId>org.jvnet.jaxb2_commons</groupId>
-                  <artifactId>jaxb2-value-constructor</artifactId>
-                  <version>3.0</version>
-                </plugin>
-              </plugins>
-              <schemaDirectory>src/main/resources/schema</schemaDirectory>
-              <schemaIncludes>
-                <include>installer-conf.xsd</include>
-              </schemaIncludes>
-              <generatePackage>org.apache.asterix.installer.schema.conf</generatePackage>
-              <generateDirectory>${project.build.directory}/generated-sources/configuration</generateDirectory>
-            </configuration>
-          </execution>
-          <execution>
-            <id>cluster</id>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-            <configuration>
-              <schemaDirectory>src/main/resources/schema</schemaDirectory>
-              <schemaIncludes>
-                <include>cluster.xsd</include>
-              </schemaIncludes>
-              <generatePackage>org.apache.asterix.installer.schema.cluster</generatePackage>
-              <bindingDirectory>src/main/resources/schema</bindingDirectory>
-              <bindingIncludes>
-                <bindingInclude>jaxb-bindings.xjb</bindingInclude>
-              </bindingIncludes>
-              <generateDirectory>${project.build.directory}/generated-sources/cluster</generateDirectory>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <configuration>
-              <descriptors>
-                <descriptor>src/main/assembly/binary-assembly.xml</descriptor>
-              </descriptors>
-            </configuration>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-test-data</id>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>copy-resources</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target/data</outputDirectory>
-              <overwrite>true</overwrite>
-              <resources>
-                <resource>
-                  <directory>../asterix-app/data/external-parser</directory>
-                  <includes>
-                    <include>jobads.new</include>
-                  </includes>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-external-testlib</id>
-            <phase>pre-integration-test</phase>
-            <goals>
-              <goal>copy-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeClassifiers>testlib</includeClassifiers>
-              <outputDirectory>target/resources/externallib</outputDirectory>
-              <stripVersion>true</stripVersion>
-              <overWriteIfNewer>true</overWriteIfNewer>
-            </configuration>
-          </execution>
-        </executions>
-        <configuration>
-          <usedDependencies combine.children="append">
-            <usedDependency>org.apache.asterix:asterix-server</usedDependency>
-            <usedDependency>org.apache.hadoop:hadoop-common</usedDependency>
-            <usedDependency>org.apache.hadoop:hadoop-hdfs</usedDependency>
-            <usedDependency>org.apache.hadoop:hadoop-minicluster</usedDependency>
-            <usedDependency>org.apache.zookeeper:zookeeper</usedDependency>
-          </usedDependencies>
-          <ignoredUnusedDeclaredDependencies>
-            <ignoredUnusedDeclaredDependency>org.apache.asterix:asterix-external-data:zip:*</ignoredUnusedDeclaredDependency>
-            <ignoredUnusedDeclaredDependency>org.apache.asterix:asterix-external-data:test-jar:*</ignoredUnusedDeclaredDependency>
-          </ignoredUnusedDeclaredDependencies>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <configuration>
-          <licenses combine.children="append">
-            <license implementation="org.apache.rat.analysis.license.MITLicense"/>
-            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
-              <licenseFamilyCategory>MIT</licenseFamilyCategory>
-              <licenseFamilyName>JQuery</licenseFamilyName>
-              <patterns>(c) jQuery Foundation | jquery.org/license</patterns>
-            </license>
-            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
-              <licenseFamilyCategory>MIT</licenseFamilyCategory>
-              <licenseFamilyName>Bootstrap</licenseFamilyName>
-              <patterns>Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)</patterns>
-            </license>
-            <license implementation="org.apache.rat.analysis.license.SimplePatternBasedLicense">
-              <licenseFamilyCategory>MIT</licenseFamilyCategory>
-              <licenseFamilyName>AngularJS</licenseFamilyName>
-              <patterns>http://angularjs.org | (c) 2010-2016 Google, Inc. | License: MIT</patterns>
-            </license>
-          </licenses>
-          <licenseFamilies combine.children="append">
-            <licenseFamily implementation="org.apache.rat.license.MITLicenseFamily"/>
-            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
-              <familyName>JQuery</familyName>
-            </licenseFamily>
-            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
-              <familyName>Bootstrap</familyName>
-            </licenseFamily>
-            <licenseFamily implementation="org.apache.rat.license.SimpleLicenseFamily">
-              <familyName>AngularJS</familyName>
-            </licenseFamily>
-          </licenseFamilies>
-          <excludes combine.children="append">
-            <exclude>src/test/resources/clusterts/id_rsa</exclude>
-            <exclude>src/test/resources/clusterts/id_rsa.pub</exclude>
-            <exclude>src/test/resources/clusterts/known_hosts</exclude>
-            <exclude>src/test/resources/docker/id_rsa</exclude>
-            <exclude>src/test/resources/docker/id_rsa.pub</exclude>
-            <exclude>src/test/resources/transactionts/results/query_after_restart/big_object_20M/big_object_20M.1.adm.template</exclude>
-            <exclude>src/test/resources/integrationts/restart/tweets.json</exclude> <!-- https://issues.apache.org/jira/browse/ASTERIXDB-1850 -->
-          </excludes>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-failsafe-plugin</artifactId>
-        <configuration>
-          <excludes combine.children="append">
-            <exclude>${failsafe.test.excludes}</exclude>
-            <exclude>${cluster.test.excludes}</exclude>
-            <exclude>${cluster.extest.excludes}</exclude>
-          </excludes>
-        </configuration>
-      </plugin>
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.apache.hyracks</groupId>
-                    <artifactId>license-automation-plugin</artifactId>
-                    <versionRange>[0.0,)</versionRange>
-                    <goals>
-                      <goal>generate</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore />
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-
-  <profiles>
-    <profile>
-      <id>cluster-tests</id>
-      <activation>
-        <activeByDefault>false</activeByDefault>
-        <property>
-          <name>clusterTest</name>
-          <value>true</value>
-        </property>
-      </activation>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>net.ju-n.maven.plugins</groupId>
-            <artifactId>vagrant-maven-plugin</artifactId>
-            <version>1.1.0-SNAPSHOT</version>
-            <executions>
-
-              <!-- Before tests: import box, start VM -->
-              <execution>
-                <id>setup-and-start-vagrant-vm</id>
-                <phase>pre-integration-test</phase>
-                <goals>
-                  <goal>up</goal>
-                </goals>
-                <configuration>
-                  <box>chef/centos-6.5</box>
-                  <url>https://vagrantcloud.com/chef/centos-6.5</url>
-                  <vagrantHome>${project.basedir}/src/test/resources/clusterts</vagrantHome>
-                </configuration>
-              </execution>
-
-              <!-- After tests: shut down, destroy VM -->
-              <execution>
-                <id>destroy-vagrant-vm</id>
-                <phase>post-integration-test</phase>
-                <goals>
-                  <goal>destroy</goal>
-                </goals>
-                <configuration>
-                  <box>chef/centos-6.5</box>
-                  <url>https://vagrantcloud.com/chef/centos-6.5</url>
-                  <vagrantHome>${project.basedir}/src/test/resources/clusterts</vagrantHome>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-failsafe-plugin</artifactId>
-            <configuration>
-              <runOrder>alphabetical</runOrder>
-              <forkMode>pertest</forkMode>
-              <excludes>
-                <exclude>${failsafe.test.excludes}</exclude>
-                <exclude>${cluster.test.excludes}</exclude>
-                <exclude>${cluster.extest.excludes}</exclude>
-              </excludes>
-            </configuration>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>integration-test</goal>
-                  <goal>verify</goal>
-                </goals>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-  <dependencies>
-    <dependency>
-      <groupId>args4j</groupId>
-      <artifactId>args4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-events</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-app</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-server</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-      <classifier>binary-assembly</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-external-data</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-test-framework</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-common</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-minicluster</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-      <version>3.0.20</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-external-data</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml.bind</groupId>
-      <artifactId>jaxb-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-hdfs</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-util</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-server</artifactId>
-      <type>test-jar</type>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-external-data</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-      <classifier>testlib</classifier>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/asterixdb/asterix-installer/src/main/assembly/binary-assembly.xml b/asterixdb/asterix-installer/src/main/assembly/binary-assembly.xml
deleted file mode 100644
index d53593a..0000000
--- a/asterixdb/asterix-installer/src/main/assembly/binary-assembly.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<assembly>
-  <id>binary-assembly</id>
-  <formats>
-    <format>zip</format>
-    <format>dir</format>
-  </formats>
-  <includeBaseDirectory>false</includeBaseDirectory>
-  <fileSets>
-    <fileSet>
-      <directory>src/main/resources/conf</directory>
-      <outputDirectory>conf</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/clusters</directory>
-      <outputDirectory>clusters</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/examples</directory>
-      <outputDirectory>examples</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/zookeeper</directory>
-      <fileMode>0755</fileMode>
-      <outputDirectory>.installer/zookeeper/bin</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/scripts</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>managix</include>
-      </includes>
-      <outputDirectory>bin</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/scripts</directory>
-      <fileMode>0755</fileMode>
-      <excludes>
-        <exclude>managix</exclude>
-      </excludes>
-      <outputDirectory>.installer/scripts</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/hadoop-0.20.2</directory>
-      <outputDirectory>.installer/hadoop-0.20.2</outputDirectory>
-      <fileMode>0755</fileMode>
-    </fileSet>
-    <fileSet>
-      <directory>target</directory>
-      <outputDirectory>lib</outputDirectory>
-      <includes>
-        <include>*.jar</include>
-      </includes>
-    </fileSet>
-    <fileSet>
-      <directory>target/generated-sources</directory>
-      <outputDirectory>.</outputDirectory>
-      <includes>
-        <include>LICENSE*</include>
-        <include>NOTICE*</include>
-      </includes>
-    </fileSet>
-    <fileSet>
-      <directory>../asterix-events/src/main/resources/events</directory>
-      <outputDirectory>.installer/events</outputDirectory>
-      <fileMode>0755</fileMode>
-    </fileSet>
-  </fileSets>
-  <dependencySets>
-    <dependencySet>
-      <includes>
-        <!-- NOTE! Any changes here must be mirrored in asterix-installer pom.xml for licensegen -->
-        <include>log4j:log4j</include>
-        <include>org.apache.asterix:asterix-events</include>
-        <include>org.apache.asterix:asterix-common</include>
-        <include>org.apache.commons:commons-lang3</include>
-        <include>org.apache.zookeeper:zookeeper</include>
-        <include>args4j:args4j</include>
-        <include>log4j:log4j</include>
-        <include>commons-io:commons-io</include>
-        <include>org.slf4j:slf4j-api</include>
-        <include>org.slf4j:slf4j-log4j12</include>
-      </includes>
-      <unpack>false</unpack>
-      <outputDirectory>lib</outputDirectory>
-    </dependencySet>
-    <dependencySet>
-      <includes>
-        <!-- NOTE! Any changes here must be mirrored in asterix-installer pom.xml for licensegen -->
-        <include>commons-cli:commons-cli</include>
-        <include>commons-logging:commons-logging</include>
-      </includes>
-      <unpack>false</unpack>
-      <outputDirectory>.installer/hadoop-0.20.2/lib</outputDirectory>
-    </dependencySet>
-    <dependencySet>
-      <includes>
-        <!-- NOTE! Any changes here must be mirrored in asterix-installer pom.xml for licensegen -->
-        <include>org.apache.zookeeper:zookeeper</include>
-        <include>log4j:log4j</include>
-        <include>org.slf4j:slf4j-api</include>
-      </includes>
-      <unpack>false</unpack>
-      <outputDirectory>.installer/zookeeper/lib</outputDirectory>
-    </dependencySet>
-    <dependencySet>
-      <outputDirectory>asterix</outputDirectory>
-      <includes>
-        <include>org.apache.asterix:asterix-server*</include>
-      </includes>
-      <useTransitiveDependencies>false</useTransitiveDependencies>
-    </dependencySet>
-    <dependencySet>
-      <outputDirectory>.installer/events</outputDirectory>
-      <includes>
-        <include>org.apache.asterix:asterix-events*</include>
-      </includes>
-      <unpack>false</unpack>
-      <useTransitiveDependencies>false</useTransitiveDependencies>
-    </dependencySet>
-    <dependencySet>
-      <outputDirectory>extlibs</outputDirectory>
-      <includes>
-        <include>org.apache.asterix:asterix-external-data:*:zip</include>
-      </includes>
-      <unpack>false</unpack>
-      <useTransitiveDependencies>false</useTransitiveDependencies>
-    </dependencySet>
-  </dependencySets>
-</assembly>
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AbstractCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AbstractCommand.java
deleted file mode 100644
index 4ce37bd..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AbstractCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.apache.log4j.Logger;
-import org.kohsuke.args4j.CmdLineParser;
-
-public abstract class AbstractCommand implements ICommand {
-
-    protected static final Logger LOGGER = Logger.getLogger(AbstractCommand.class.getName());
-
-    protected CommandConfig config;
-
-    protected String usageDescription;
-
-    public void execute(String[] args) throws Exception {
-        String[] cmdArgs = new String[args.length - 1];
-        System.arraycopy(args, 1, cmdArgs, 0, cmdArgs.length);
-        config = getCommandConfig();
-        CmdLineParser parser = new CmdLineParser(config);
-        parser.parseArgument(cmdArgs);
-        execCommand();
-    }
-
-    abstract protected void execCommand() throws Exception;
-
-    abstract protected String getUsageDescription();
-
-    abstract protected CommandConfig getCommandConfig();
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AlterCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AlterCommand.java
deleted file mode 100644
index 05e3b67..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/AlterCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.Date;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ILookupService;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.driver.InstallerUtil;
-
-public class AlterCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String instanceName = ((AlterConfig) config).name;
-        AsterixEventServiceUtil.validateAsterixInstanceExists(instanceName, State.INACTIVE);
-        ILookupService lookupService = ServiceProvider.INSTANCE.getLookupService();
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(instanceName);
-        AsterixEventServiceUtil.createClusterProperties(instance.getCluster(), instance.getAsterixConfiguration());
-        AsterixConfiguration asterixConfiguration = InstallerUtil
-                .getAsterixConfiguration(((AlterConfig) config).confPath);
-        instance.setAsterixConfiguration(asterixConfiguration);
-        instance.setModifiedTimestamp(new Date());
-        lookupService.updateAsterixInstance(instance);
-        LOGGER.info("Altered configuration settings for Asterix instance: " + instanceName);
-
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new AlterConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nAlter the instance's configuration settings."
-                + "\nPrior to running this command, the instance is required to be INACTIVE state."
-                + "\nChanged configuration settings will be reflected when the instance is started."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance.";
-    }
-
-}
-
-class AlterConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-a", required = true, usage = "Path to asterix instance configuration")
-    public String confPath;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/BackupCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/BackupCommand.java
deleted file mode 100644
index 22b6952..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/BackupCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.Date;
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.BackupInfo;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.schema.conf.Backup;
-
-public class BackupCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((BackupConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE);
-        List<BackupInfo> backupInfo = instance.getBackupInfo();
-        Backup backupConf = AsterixEventService.getConfiguration().getBackup();
-        Patterns patterns = PatternCreator.INSTANCE.getBackUpAsterixPattern(instance, backupConf);
-        AsterixEventService.getAsterixEventServiceClient(instance.getCluster()).submit(patterns);
-        int backupId = backupInfo.size();
-        BackupInfo binfo = new BackupInfo(backupId, new Date(), backupConf);
-        backupInfo.add(binfo);
-        LOGGER.info(asterixInstanceName + " backed up " + binfo);
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new BackupConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nThe backup command allows you to take a"
-                + "\nbackup of the data stored with an ASTERIX instance. "
-                + "\nThe backed up snapshot is stored either in HDFS or on the local file system of each node in the ASTERIX cluster."
-                + "\nThe target location of backup can be configured in $MANAGIX_HOME/conf/managix-conf.xml"
-                + "\n\nAvailable arguments/options:" + "\n-n name of the Asterix instance";
-
-    }
-
-}
-
-class BackupConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of the Asterix instance")
-    public String name;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandConfig.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandConfig.java
deleted file mode 100644
index 4c07d4e..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandConfig.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-public abstract class CommandConfig {
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandHandler.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandHandler.java
deleted file mode 100644
index 7d628ff..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CommandHandler.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.apache.asterix.installer.command.ICommand.CommandType;
-
-public class CommandHandler {
-
-    public void processCommand(String args[]) throws Exception {
-        CommandType cmdType = CommandType.valueOf(args[0].toUpperCase());
-        ICommand cmd = null;
-        switch (cmdType) {
-            case CREATE:
-                cmd = new CreateCommand();
-                break;
-            case ALTER:
-                cmd = new AlterCommand();
-                break;
-            case DELETE:
-                cmd = new DeleteCommand();
-                break;
-            case DESCRIBE:
-                cmd = new DescribeCommand();
-                break;
-            case BACKUP:
-                cmd = new BackupCommand();
-                break;
-            case RESTORE:
-                cmd = new RestoreCommand();
-                break;
-            case START:
-                cmd = new StartCommand();
-                break;
-            case STOP:
-                cmd = new StopCommand();
-                break;
-            case VALIDATE:
-                cmd = new ValidateCommand();
-                break;
-            case CONFIGURE:
-                cmd = new ConfigureCommand();
-                break;
-            case INSTALL:
-                cmd = new InstallCommand();
-                break;
-            case UNINSTALL:
-                cmd = new UninstallCommand();
-                break;
-            case LOG:
-                cmd = new LogCommand();
-                break;
-            case SHUTDOWN:
-                cmd = new ShutdownCommand();
-                break;
-            case HELP:
-                cmd = new HelpCommand();
-                break;
-            case STOPNODE:
-                cmd = new StopNodeCommand();
-                break;
-            case STARTNODE:
-                cmd = new StartNodeCommand();
-                break;
-            case VERSION:
-                cmd = new VersionCommand();
-                break;
-            default:
-                break;
-        }
-        cmd.execute(args);
-    }
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java
deleted file mode 100644
index eac7586..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.PropertyException;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.management.EventUtil;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.cluster.WorkingDir;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.schema.conf.Configuration;
-
-public class ConfigureCommand extends AbstractCommand {
-
-    private static final String WORK_DIR = "/tmp/asterix";
-
-    @Override
-    protected void execCommand() throws Exception {
-        configureCluster("local", "local.xml");
-        configureCluster("local", "local_chained_declustering_rep.xml");
-        configureCluster("local", "local_metadata_only_rep.xml");
-        configureCluster("demo", "demo.xml");
-
-        String installerConfPath = InstallerDriver.getManagixHome() + File.separator + InstallerDriver.MANAGIX_CONF_XML;
-        JAXBContext ctx = JAXBContext.newInstance(Configuration.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        Configuration configuration = (Configuration) unmarshaller.unmarshal(new File(installerConfPath));
-
-        configuration.setConfigured(true);
-        configuration.getBackup().setBackupDir(InstallerDriver.getManagixHome() + File.separator + "backup");
-        configuration.getZookeeper().setHomeDir(InstallerDriver.getManagixHome() + File.separator
-                + InstallerDriver.MANAGIX_INTERNAL_DIR + File.separator + "zookeeper_home");
-        configuration.getZookeeper().getServers().setJavaHome(System.getProperty("java.home"));
-
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        marshaller.marshal(configuration, new FileOutputStream(installerConfPath));
-    }
-
-    private void configureCluster(String dir, String file)
-            throws JAXBException, PropertyException, FileNotFoundException {
-        String clusterDir = InstallerDriver.getManagixHome() + File.separator + "clusters" + File.separator + dir;
-        String localClusterPath = clusterDir + File.separator + file;
-
-        if (!Files.exists(Paths.get(localClusterPath))) {
-            return;
-        }
-        Cluster cluster = EventUtil.getCluster(localClusterPath);
-        String workingDir = clusterDir + File.separator + "working_dir";
-        cluster.setWorkingDir(new WorkingDir(workingDir, true));
-        cluster.setIodevices(configureIoDevices(cluster.getIodevices(), workingDir));
-        cluster.setLogDir(configureDirectory(cluster.getLogDir(), workingDir));
-        cluster.setTxnLogDir(configureDirectory(cluster.getTxnLogDir(), workingDir));
-        String javaHome = System.getProperty("java.home");
-        if (javaHome.endsWith(File.separator + "jre")) {
-            javaHome = javaHome.substring(0, javaHome.indexOf(File.separator + "jre"));
-        }
-        cluster.setJavaHome(javaHome);
-
-        for (Node node : cluster.getNode()) {
-            node.setIodevices(configureIoDevices(node.getIodevices(), workingDir));
-            node.setLogDir(configureDirectory(node.getLogDir(), workingDir));
-            node.setTxnLogDir(configureDirectory(node.getTxnLogDir(), workingDir));
-        }
-
-        JAXBContext ctx = JAXBContext.newInstance(Cluster.class);
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        marshaller.marshal(cluster, new FileOutputStream(localClusterPath));
-    }
-
-    private String configureIoDevices(String ioDevices, String workingDir) {
-        if (ioDevices == null) {
-            return null;
-        }
-        final String separator = ",";
-        StringBuilder sb = new StringBuilder();
-        String[] ioDevs = ioDevices.split(separator);
-        for (int i = 0; i < ioDevs.length; ++i) {
-            if (i > 0) {
-                sb.append(separator);
-            }
-            sb.append(configureDirectory(ioDevs[i], workingDir));
-        }
-        return sb.toString();
-    }
-
-    private String configureDirectory(String dir, String workingDir) {
-        return dir == null ? null : dir.replace(WORK_DIR, workingDir);
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nAuto-generates the ASTERIX installer configruation settings and ASTERIX cluster "
-                + "\nconfiguration settings for a single node setup.";
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new ConfigureConfig();
-    }
-
-}
-
-class ConfigureConfig extends CommandConfig {
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CreateCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CreateCommand.java
deleted file mode 100644
index 6db0648..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/CreateCommand.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-
-import org.kohsuke.args4j.Option;
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.management.EventUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ClusterStateWatcher;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.driver.InstallerUtil;
-
-public class CreateCommand extends AbstractCommand {
-
-    private String asterixInstanceName;
-    private Cluster cluster;
-    private AsterixConfiguration asterixConfiguration;
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        ValidateCommand validateCommand = new ValidateCommand();
-        boolean valid = validateCommand.validateCluster(((CreateConfig) config).clusterPath);
-        if (!valid) {
-            throw new Exception("Cannot create an Asterix instance.");
-        }
-        asterixInstanceName = ((CreateConfig) config).name;
-        AsterixEventServiceUtil.validateAsterixInstanceNotExists(asterixInstanceName);
-        CreateConfig createConfig = (CreateConfig) config;
-        cluster = EventUtil.getCluster(createConfig.clusterPath);
-        cluster.setInstanceName(asterixInstanceName);
-        asterixConfiguration = InstallerUtil.getAsterixConfiguration(createConfig.asterixConfPath);
-        AsterixInstance asterixInstance = AsterixEventServiceUtil.createAsterixInstance(asterixInstanceName, cluster,
-                asterixConfiguration);
-        AsterixEventServiceUtil.evaluateConflictWithOtherInstances(asterixInstance);
-        AsterixEventServiceUtil.createAsterixZip(asterixInstance);
-        AsterixEventServiceUtil.createClusterProperties(cluster, asterixConfiguration);
-        AsterixEventServiceClient eventrixClient = AsterixEventService.getAsterixEventServiceClient(cluster, true,
-                false);
-        // Store the cluster initially in Zookeeper and start watching
-        ServiceProvider.INSTANCE.getLookupService().writeAsterixInstance(asterixInstance);
-        ClusterStateWatcher stateWatcher = ServiceProvider.INSTANCE.getLookupService().startWatchingClusterState(
-                asterixInstanceName);
-        Patterns asterixBinarytrasnferPattern = PatternCreator.INSTANCE.getAsterixBinaryTransferPattern(
-                asterixInstanceName, cluster);
-        eventrixClient.submit(asterixBinarytrasnferPattern);
-        Patterns patterns = PatternCreator.INSTANCE.getStartAsterixPattern(asterixInstanceName, cluster, true);
-        eventrixClient.submit(patterns);
-
-        // Check the cluster state
-        ClusterState clusterState = stateWatcher.waitForClusterStart();
-        if (clusterState != ClusterState.ACTIVE) {
-            throw new Exception("CC failed to start");
-        }
-
-        AsterixRuntimeState runtimeState = VerificationUtil.getAsterixRuntimeState(asterixInstance);
-        VerificationUtil.updateInstanceWithRuntimeDescription(asterixInstance, runtimeState, true);
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(asterixInstance);
-        AsterixEventServiceUtil.deleteDirectory(InstallerDriver.getManagixHome() + File.separator
-                + InstallerDriver.ASTERIX_DIR + File.separator + asterixInstanceName);
-        LOGGER.info(asterixInstance.getDescription(false));
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new CreateConfig();
-    }
-
-    public Cluster getCluster() {
-        return cluster;
-    }
-
-    public String getAsterixInstanceName() {
-        return asterixInstanceName;
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nCreates an ASTERIX instance with a specified name."
-                + "\n\nPost creation, the instance is in ACTIVE state, indicating its "
-                + "\navailability for executing statements/queries." + "\n\nUsage arguments/options:"
-                + "\n-n Name of the ASTERIX instance." + "\n-c Path to the cluster configuration file"
-                + "\n[-a] Path to asterix configuration file" + "\n [..] indicates optional flag";
-    }
-
-}
-
-class CreateConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-c", required = true, usage = "Path to cluster configuration")
-    public String clusterPath;
-
-    @Option(name = "-a", required = false, usage = "Path to asterix configuration")
-    public String asterixConfPath;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DeleteCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DeleteCommand.java
deleted file mode 100644
index 043d48a..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DeleteCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.kohsuke.args4j.Option;
-
-public class DeleteCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((DeleteConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE);
-        Patterns patterns = PatternCreator.INSTANCE.createDeleteInstancePattern(instance);
-        AsterixEventService.getAsterixEventServiceClient(instance.getCluster()).submit(patterns);
-
-        patterns = PatternCreator.INSTANCE.createRemoveAsterixWorkingDirPattern(instance);
-        AsterixEventService.getAsterixEventServiceClient(instance.getCluster()).submit(patterns);
-        ServiceProvider.INSTANCE.getLookupService().removeAsterixInstance(asterixInstanceName);
-        LOGGER.info("Deleted Asterix instance: " + asterixInstanceName);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new DeleteConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nPermanently deletes an ASTERIX instance." + "\n" + "The instance must be in the INACTIVE state."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance.";
-    }
-
-}
-
-class DeleteConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DescribeCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DescribeCommand.java
deleted file mode 100644
index 1ffcb74..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/DescribeCommand.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.error.InstallerException;
-
-public class DescribeCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((DescribeConfig) config).name;
-        boolean adminView = ((DescribeConfig) config).admin;
-        if (asterixInstanceName != null) {
-            AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName, State.INACTIVE, State.ACTIVE,
-                    State.UNUSABLE);
-            AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(
-                    asterixInstanceName);
-            if (instance != null) {
-                AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-                boolean expectedRunning = instance.getState().equals(State.UNUSABLE) ? instance.getPreviousState()
-                        .equals(State.ACTIVE) : !instance.getState().equals(State.INACTIVE);
-                VerificationUtil.updateInstanceWithRuntimeDescription(instance, state, expectedRunning);
-                ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-                LOGGER.info(instance.getDescription(adminView));
-            } else {
-                throw new InstallerException("Asterix instance by the name " + asterixInstanceName + " does not exist.");
-            }
-        } else {
-            List<AsterixInstance> asterixInstances = ServiceProvider.INSTANCE.getLookupService().getAsterixInstances();
-            if (asterixInstances.size() > 0) {
-                for (AsterixInstance instance : asterixInstances) {
-                    AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-                    boolean expectedRunning = instance.getState().equals(State.UNUSABLE) ? instance.getPreviousState()
-                            .equals(State.ACTIVE) : !instance.getState().equals(State.INACTIVE);
-                    VerificationUtil.updateInstanceWithRuntimeDescription(instance, state, expectedRunning);
-                    ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-                    LOGGER.info(instance.getDescription(adminView));
-                }
-            } else {
-                LOGGER.info("No Asterix instances found!");
-            }
-
-        }
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new DescribeConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nProvides information about an ASTERIX instance." + "\n\nUsage arguments/options:-"
-                + "\n[-n]       Name of the ASTERIX instance." + "\n[-admin]   Provides a detailed description";
-    }
-
-}
-
-class DescribeConfig extends CommandConfig {
-
-    @Option(name = "-n", required = false, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-admin", required = false, usage = "Detailed description")
-    public boolean admin;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/HelpCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/HelpCommand.java
deleted file mode 100644
index e8a93be..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/HelpCommand.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.kohsuke.args4j.Option;
-
-public class HelpCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        HelpConfig helpConfig = (HelpConfig) config;
-        String command = helpConfig.command;
-        CommandType cmdType = CommandType.valueOf(command.toUpperCase());
-        String helpMessage = null;
-        switch (cmdType) {
-            case CREATE:
-                helpMessage = new CreateCommand().getUsageDescription();
-                break;
-            case CONFIGURE:
-                helpMessage = new ConfigureCommand().getUsageDescription();
-                break;
-            case DELETE:
-                helpMessage = new DeleteCommand().getUsageDescription();
-                break;
-            case DESCRIBE:
-                helpMessage = new DescribeCommand().getUsageDescription();
-                break;
-            case RESTORE:
-                helpMessage = new RestoreCommand().getUsageDescription();
-                break;
-            case START:
-                helpMessage = new StartCommand().getUsageDescription();
-                break;
-            case SHUTDOWN:
-                helpMessage = new ShutdownCommand().getUsageDescription();
-                break;
-            case BACKUP:
-                helpMessage = new BackupCommand().getUsageDescription();
-                break;
-            case STOP:
-                helpMessage = new StopCommand().getUsageDescription();
-                break;
-            case VALIDATE:
-                helpMessage = new ValidateCommand().getUsageDescription();
-                break;
-            case INSTALL:
-                helpMessage = new InstallCommand().getUsageDescription();
-                break;
-            case UNINSTALL:
-                helpMessage = new UninstallCommand().getUsageDescription();
-                break;
-            case ALTER:
-                helpMessage = new AlterCommand().getUsageDescription();
-                break;
-            case LOG:
-                helpMessage = new LogCommand().getUsageDescription();
-                break;
-            case STOPNODE:
-                helpMessage = new StopNodeCommand().getUsageDescription();
-                break;
-            case STARTNODE:
-                helpMessage = new StartNodeCommand().getUsageDescription();
-                break;
-            case VERSION:
-                helpMessage = new VersionCommand().getUsageDescription();
-                break;
-            default:
-                helpMessage = "Unknown command " + command;
-        }
-
-        System.out.println(helpMessage);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new HelpConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nAlter the instance's configuration settings."
-                + "\nPrior to running this command, the instance is required to be INACTIVE state."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance"
-                + "\n-conf path to the ASTERIX configuration file.";
-    }
-
-}
-
-class HelpConfig extends CommandConfig {
-
-    @Option(name = "-cmd", required = true, usage = "Name of Asterix Instance")
-    public String command;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ICommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ICommand.java
deleted file mode 100644
index 47e4a8d..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ICommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-public interface ICommand {
-
-    public enum CommandType {
-        CREATE,
-        DELETE,
-        START,
-        STOP,
-        BACKUP,
-        RESTORE,
-        DESCRIBE,
-        ALTER,
-        VALIDATE,
-        CONFIGURE,
-        INSTALL,
-        UNINSTALL,
-        LOG,
-        SHUTDOWN,
-        HELP,
-        STOPNODE,
-        STARTNODE,
-        VERSION
-    }
-
-    public void execute(String args[]) throws Exception;
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/InstallCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/InstallCommand.java
deleted file mode 100644
index 779f76d..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/InstallCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class InstallCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        InstallConfig installConfig = ((InstallConfig) config);
-        String instanceName = installConfig.name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(instanceName, State.INACTIVE);
-        PatternCreator pc = PatternCreator.INSTANCE;
-        Patterns patterns = pc.getLibraryInstallPattern(instance, installConfig.dataverseName,
-                installConfig.libraryName, installConfig.libraryPath);
-        AsterixEventService.getAsterixEventServiceClient(instance.getCluster()).submit(patterns);
-        LOGGER.info("Installed library " + installConfig.libraryName);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new InstallConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "Installs a library to an asterix instance." + "\n" + "Arguments/Options\n"
-                + "-n  Name of Asterix Instance\n"
-                + "-d  Name of the dataverse under which the library will be installed\n" + "-l  Name of the library\n"
-                + "-p  Path to library zip bundle";
-
-    }
-
-}
-
-class InstallConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-d", required = true, usage = "Name of the dataverse under which the library will be installed")
-    public String dataverseName;
-
-    @Option(name = "-l", required = true, usage = "Name of the library")
-    public String libraryName;
-
-    @Option(name = "-p", required = true, usage = "Path to library zip bundle")
-    public String libraryPath;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/LogCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/LogCommand.java
deleted file mode 100644
index 1e00d70..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/LogCommand.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.Date;
-
-import org.apache.commons.io.FileUtils;
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.error.InstallerException;
-
-public class LogCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((LogConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE, State.UNUSABLE, State.ACTIVE);
-        PatternCreator pc = PatternCreator.INSTANCE;
-
-        AsterixEventServiceClient eventrixClient = AsterixEventService.getAsterixEventServiceClient(
-                instance.getCluster(), true, false);
-
-        String outputDir = ((LogConfig) config).outputDir == null ? InstallerDriver.getManagixHome() + File.separator
-                + "logdump" : ((LogConfig) config).outputDir;
-        File f = new File(outputDir);
-        String outputDirPath = f.getAbsolutePath();
-        if (!f.exists()) {
-            boolean success = f.mkdirs();
-            if (!success) {
-                throw new InstallerException("Unable to create output directory:" + outputDirPath);
-            }
-        }
-        Patterns transferLogPattern = pc.getGenerateLogPattern(instance.getCluster(),
-                outputDirPath);
-        eventrixClient.submit(transferLogPattern);
-        File outputDirFile = new File(outputDirPath);
-        final String destFileName = "log_" + new Date().toString().replace(' ', '_') + ".zip";
-        File destFile = new File(outputDirFile, destFileName);
-        AsterixEventServiceUtil.zipDir(outputDirFile, destFile);
-
-        String[] filesToDelete = outputDirFile.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return !name.equals(destFileName);
-            }
-
-        });
-        for (String fileS : filesToDelete) {
-            f = new File(outputDirFile, fileS);
-            if (f.isDirectory()) {
-                FileUtils.deleteDirectory(f);
-            } else {
-                f.delete();
-            }
-        }
-        LOGGER.info("Log zip archive created at " + destFile.getAbsolutePath());
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new LogConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nCreates a tar ball containing log files corresponding to each worker node (NC) and the master (CC)  for an ASTERIX instance"
-                + "\n\nAvailable arguments/options"
-                + "\n-n name of the ASTERIX instance. \n-d destination directory for producing the tar ball (defaults to) "
-                + InstallerDriver.getManagixHome();
-    }
-}
-
-class LogConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-d", required = false, usage = "Destination directory for producing log tar ball")
-    public String outputDir;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/RestoreCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/RestoreCommand.java
deleted file mode 100644
index 79a1cc7..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/RestoreCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.BackupInfo;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class RestoreCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((RestoreConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE);
-        int backupId = ((RestoreConfig) config).backupId;
-        List<BackupInfo> backupInfoList = instance.getBackupInfo();
-        if (backupInfoList.size() <= backupId || backupId < 0) {
-            throw new IllegalStateException("Invalid backup id");
-        }
-
-        BackupInfo backupInfo = backupInfoList.get(backupId);
-        Patterns patterns = PatternCreator.INSTANCE.getRestoreAsterixPattern(instance, backupInfo);
-        AsterixEventService.getAsterixEventServiceClient(instance.getCluster()).submit(patterns);
-        LOGGER.info("Asterix instance: " + asterixInstanceName + " has been restored from backup");
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new RestoreConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nRestores an ASTERIX instance's data from a previously taken backup snapshot."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance"
-                + "\n-b id of the backup snapshot ";
-    }
-
-}
-
-class RestoreConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of the Asterix instance")
-    public String name;
-
-    @Option(name = "-b", required = true, usage = "Id corresponding to the backed up version")
-    public int backupId;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ShutdownCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ShutdownCommand.java
deleted file mode 100644
index d4f6bcf..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ShutdownCommand.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.ILookupService;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class ShutdownCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(false);
-        ILookupService lookupService = ServiceProvider.INSTANCE.getLookupService();
-        lookupService.stopService(AsterixEventService.getConfiguration());
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new ShutdownConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nShuts down the installer's backgrouund processes";
-    }
-
-}
-
-class ShutdownConfig extends CommandConfig {
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartCommand.java
deleted file mode 100644
index 551bc11..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-
-import org.kohsuke.args4j.Option;
-import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ClusterStateWatcher;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class StartCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((StartConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE);
-        AsterixEventServiceUtil.createAsterixZip(instance);
-        AsterixEventServiceClient client = AsterixEventService.getAsterixEventServiceClient(instance.getCluster());
-        Patterns asterixBinaryTransferPattern = PatternCreator.INSTANCE.getAsterixBinaryTransferPattern(
-                asterixInstanceName, instance.getCluster());
-        client.submit(asterixBinaryTransferPattern);
-        // Start the watcher
-        ClusterStateWatcher stateWatcher = ServiceProvider.INSTANCE.getLookupService().startWatchingClusterState(
-                asterixInstanceName);
-        AsterixEventServiceUtil.createClusterProperties(instance.getCluster(), instance.getAsterixConfiguration());
-        Patterns patterns = PatternCreator.INSTANCE.getStartAsterixPattern(asterixInstanceName, instance.getCluster(),
-                false);
-        client.submit(patterns);
-        // Check the cluster state
-        ClusterState clusterState = stateWatcher.waitForClusterStart();
-        if (clusterState != ClusterState.ACTIVE) {
-            throw new Exception("CC failed to start");
-        }
-        AsterixEventServiceUtil.deleteDirectory(InstallerDriver.getManagixHome() + File.separator
-                + InstallerDriver.ASTERIX_DIR + File.separator + asterixInstanceName);
-        AsterixRuntimeState runtimeState = VerificationUtil.getAsterixRuntimeState(instance);
-        VerificationUtil.updateInstanceWithRuntimeDescription(instance, runtimeState, true);
-        LOGGER.info(instance.getDescription(false));
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new StartConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nStarts an ASTERIX instance that is in INACTIVE state."
-                + "\nAfter executing the start command, the ASTERIX instance transits to the ACTIVE state,"
-                + "\nindicating that it is now available for executing statements/queries."
-                + "\n\nAvailable arguments/options" + "\n-n name of the ASTERIX instance. ";
-    }
-}
-
-class StartConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartNodeCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartNodeCommand.java
deleted file mode 100644
index 59825fe..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StartNodeCommand.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.model.ProcessInfo;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.error.InstallerException;
-
-public class StartNodeCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((StartNodeConfig) config).name;
-        AsterixInstance instance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.INACTIVE, State.ACTIVE, State.UNUSABLE);
-
-        Cluster cluster = instance.getCluster();
-        List<Pattern> pl = new ArrayList<Pattern>();
-        AsterixRuntimeState runtimeState = VerificationUtil.getAsterixRuntimeState(instance);
-        String[] nodesToBeAdded = ((StartNodeConfig) config).nodes.split(",");
-        List<String> aliveNodes = new ArrayList<String>();
-        for (ProcessInfo p : runtimeState.getProcesses()) {
-            aliveNodes.add(p.getNodeId());
-        }
-        List<Node> clusterNodes = cluster.getNode();
-        for (String n : nodesToBeAdded) {
-            if (aliveNodes.contains(n)) {
-                throw new InstallerException("Node: " + n + " is already alive");
-            }
-            for (Node node : clusterNodes) {
-                if (n.equals(node.getId())) {
-                    String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-                    Pattern createNC = PatternCreator.INSTANCE.createNCStartPattern(cluster.getMasterNode()
-                            .getClusterIp(), node.getId(), asterixInstanceName + "_" + node.getId(), iodevices, false);
-                    pl.add(createNC);
-                    break;
-                }
-            }
-        }
-        Patterns patterns = new Patterns(pl);
-        AsterixEventServiceClient client = AsterixEventService.getAsterixEventServiceClient(cluster);
-        client.submit(patterns);
-        runtimeState = VerificationUtil.getAsterixRuntimeState(instance);
-        VerificationUtil.updateInstanceWithRuntimeDescription(instance, runtimeState, true);
-        LOGGER.info(instance.getDescription(false));
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(instance);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new StartNodeConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nStarts a set of nodes for an ASTERIX instance." + "\n\nAvailable arguments/options"
-                + "\n-n name of the ASTERIX instance. " + "\n-nodes"
-                + "Comma separated list of nodes that need to be started";
-    }
-}
-
-class StartNodeConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-nodes", required = true, usage = "Comma separated list of nodes that need to be started")
-    public String nodes;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopCommand.java
deleted file mode 100644
index 0feff27..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class StopCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((StopConfig) config).name;
-        AsterixInstance asterixInstance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.ACTIVE, State.UNUSABLE);
-        AsterixEventServiceClient client = AsterixEventService.getAsterixEventServiceClient(asterixInstance
-                .getCluster());
-
-        List<Pattern> ncKillPatterns = new ArrayList<Pattern>();
-        for (Node node : asterixInstance.getCluster().getNode()) {
-            ncKillPatterns.add(PatternCreator.INSTANCE.createNCStopPattern(node.getId(), asterixInstanceName + "_"
-                    + node.getId()));
-        }
-
-        List<Pattern> ccKillPatterns = new ArrayList<Pattern>();
-        ccKillPatterns.add(PatternCreator.INSTANCE.createCCStopPattern(asterixInstance.getCluster().getMasterNode()
-                .getId()));
-
-        try {
-            client.submit(new Patterns(ncKillPatterns));
-            client.submit(new Patterns(ccKillPatterns));
-        } catch (Exception e) {
-            // processes are already dead
-            LOGGER.debug("Attempt to kill non-existing processess");
-        }
-
-        asterixInstance.setState(State.INACTIVE);
-        asterixInstance.setStateChangeTimestamp(new Date());
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(asterixInstance);
-        LOGGER.info("Stopped Asterix instance: " + asterixInstanceName);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new StopConfig();
-    }
-
-    public String getAsterixInstanceName() {
-        return ((StopConfig) config).name;
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nShuts an ASTERIX instance that is in ACTIVE/UNUSABLE state."
-                + "\nAfter executing the stop command, the ASTERIX instance transits"
-                + "\nto the INACTIVE state, indicating that it is no longer available"
-                + "\nfor executing statements/queries." + "\n\nAvailable arguments/options"
-                + "\n-n name of the ASTERIX instance.";
-
-    }
-
-}
-
-class StopConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopNodeCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopNodeCommand.java
deleted file mode 100644
index 1c22f86..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/StopNodeCommand.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.model.ProcessInfo;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.error.InstallerException;
-
-public class StopNodeCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        String asterixInstanceName = ((StopNodeConfig) config).name;
-        AsterixInstance asterixInstance = AsterixEventServiceUtil.validateAsterixInstanceExists(asterixInstanceName,
-                State.ACTIVE, State.UNUSABLE);
-
-        AsterixEventServiceClient client = AsterixEventService.getAsterixEventServiceClient(asterixInstance
-                .getCluster());
-
-        String[] nodesToStop = ((StopNodeConfig) config).nodeList.split(",");
-        AsterixRuntimeState runtimeState = VerificationUtil.getAsterixRuntimeState(asterixInstance);
-        List<String> aliveNodes = new ArrayList<String>();
-        for (ProcessInfo p : runtimeState.getProcesses()) {
-            aliveNodes.add(p.getNodeId());
-        }
-
-        List<String> validNodeIds = new ArrayList<String>();
-        for (Node node : asterixInstance.getCluster().getNode()) {
-            validNodeIds.add(node.getId());
-        }
-        List<Pattern> ncKillPatterns = new ArrayList<Pattern>();
-        for (String nodeId : nodesToStop) {
-            if (!nodeId.contains(nodeId)) {
-                throw new InstallerException("Invalid nodeId: " + nodeId);
-            }
-            if (!aliveNodes.contains(nodeId)) {
-                throw new InstallerException("Node: " + nodeId + " is not alive");
-            }
-            ncKillPatterns.add(PatternCreator.INSTANCE.createNCStopPattern(nodeId, asterixInstanceName + "_" + nodeId));
-        }
-
-        try {
-            client.submit(new Patterns(ncKillPatterns));
-        } catch (Exception e) {
-            // processes are already dead
-            LOGGER.debug("Attempt to kill non-existing processess");
-        }
-
-        asterixInstance.setStateChangeTimestamp(new Date());
-        ServiceProvider.INSTANCE.getLookupService().updateAsterixInstance(asterixInstance);
-        LOGGER.info("Stopped nodes " + ((StopNodeConfig) config).nodeList + " serving Asterix instance: "
-                + asterixInstanceName);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new StopNodeConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nStops a specified set of ASTERIX nodes." + "\n\nAvailable arguments/options"
-                + "\n-n name of the ASTERIX instance. "
-                + "\n-nodes Comma separated list of nodes that need to be stopped. ";
-
-    }
-}
-
-class StopNodeConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-nodes", required = true, usage = "Comma separated list of nodes that need to be stopped")
-    public String nodeList;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/UninstallCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/UninstallCommand.java
deleted file mode 100644
index 8199d4b..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/UninstallCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import org.kohsuke.args4j.Option;
-
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ILookupService;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class UninstallCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(true);
-        UninstallConfig uninstallConfig = ((UninstallConfig) config);
-        String instanceName = uninstallConfig.name;
-        AsterixEventServiceUtil.validateAsterixInstanceExists(instanceName, State.INACTIVE);
-        ILookupService lookupService = ServiceProvider.INSTANCE.getLookupService();
-        AsterixInstance instance = lookupService.getAsterixInstance(instanceName);
-        PatternCreator pc = PatternCreator.INSTANCE;
-        Patterns patterns = pc.getLibraryUninstallPattern(instance, uninstallConfig.dataverseName,
-                uninstallConfig.libraryName);
-        AsterixEventServiceClient client = AsterixEventService.getAsterixEventServiceClient(instance.getCluster());
-        client.submit(patterns);
-        LOGGER.info("Uninstalled library " + uninstallConfig.libraryName);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new UninstallConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "Uninstalls a library from an asterix instance." + "\n" + "Arguments/Options\n"
-                + "-n  Name of Asterix Instance\n"
-                + "-d  Name of the dataverse under which the library will be installed\n" + "-l  Name of the library\n"
-                + "-l  Name of the library";
-    }
-
-}
-
-class UninstallConfig extends CommandConfig {
-
-    @Option(name = "-n", required = true, usage = "Name of Asterix Instance")
-    public String name;
-
-    @Option(name = "-d", required = true, usage = "Name of the dataverse under which the library will be installed")
-    public String dataverseName;
-
-    @Option(name = "-l", required = true, usage = "Name of the library")
-    public String libraryName;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ValidateCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ValidateCommand.java
deleted file mode 100644
index 748d811..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ValidateCommand.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.management.EventUtil;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.MasterNode;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.schema.conf.Configuration;
-import org.apache.asterix.installer.schema.conf.Zookeeper;
-import org.kohsuke.args4j.Option;
-
-public class ValidateCommand extends AbstractCommand {
-
-    private static final String OK = " [" + "OK" + "]";
-    private static final String ERROR = " [" + "ERROR" + "]";
-    private static final String WARNING = " [" + "WARNING" + "]";
-
-    @Override
-    protected void execCommand() throws Exception {
-        ValidateConfig vConfig = (ValidateConfig) config;
-        logValidationResult("Environment", validateEnvironment());
-        if (((ValidateConfig) config).cluster != null) {
-            logValidationResult("Cluster configuration", validateCluster(vConfig.cluster));
-        } else {
-            logValidationResult("Managix Configuration", validateConfiguration());
-        }
-    }
-
-    private void logValidationResult(String prefix, boolean isValid) {
-        if (!isValid) {
-            LOGGER.fatal(prefix + ERROR);
-        } else {
-            LOGGER.info(prefix + OK);
-        }
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new ValidateConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "\nValidate the installer's configuration or a cluster configuration" + "\nUsage"
-                + "\nFor validating the installer configuration" + "\nuse managix validate"
-                + "\n\nFor validating a cluster configuration"
-                + "\nuse managix validate -c <path to the cluster configuration file>";
-    }
-
-    public boolean validateEnvironment() throws Exception {
-        boolean valid = true;
-        File home = new File(InstallerDriver.getManagixHome());
-        if (!home.exists()) {
-            valid = false;
-            LOGGER.fatal(InstallerDriver.ENV_MANAGIX_HOME + ": " + home.getAbsolutePath() + " does not exist!" + ERROR);
-        }
-        return valid;
-
-    }
-
-    public boolean validateCluster(String clusterPath) throws Exception {
-        boolean valid = true;
-        Cluster cluster = null;
-        File f = new File(clusterPath);
-        List<String> ipAddresses = new ArrayList<String>();
-        if (!f.exists() || !f.isFile()) {
-            LOGGER.error(" Invalid path " + f.getAbsolutePath() + ERROR);
-            valid = false;
-        } else {
-            cluster = EventUtil.getCluster(clusterPath);
-            valid = valid & validateClusterProperties(cluster);
-
-            Set<String> servers = new HashSet<String>();
-            Set<String> serverIds = new HashSet<String>();
-            servers.add(cluster.getMasterNode().getClusterIp());
-            serverIds.add(cluster.getMasterNode().getId());
-
-            MasterNode masterNode = cluster.getMasterNode();
-            Node master = new Node(masterNode.getId(), masterNode.getClusterIp(), masterNode.getJavaHome(),
-                    masterNode.getLogDir(), null, null, null, null);
-            ipAddresses.add(masterNode.getClusterIp());
-
-            valid = valid & validateNodeConfiguration(master, cluster);
-
-            for (Node node : cluster.getNode()) {
-                servers.add(node.getClusterIp());
-                if (serverIds.contains(node.getId())) {
-                    valid = false;
-                    LOGGER.error("Duplicate node id :" + node.getId() + ERROR);
-                } else {
-                    valid = valid & validateNodeConfiguration(node, cluster);
-                    if (!ipAddresses.contains(node.getClusterIp())) {
-                        ipAddresses.add(node.getClusterIp());
-                    }
-                }
-            }
-
-            valid = valid & validateReplicationProperties(cluster);
-        }
-
-        if (valid) {
-            String username = cluster.getUsername();
-            if (username == null) {
-                username = System.getProperty("user.name");
-            }
-            valid = checkPasswordLessSSHLogin(username, ipAddresses);
-        }
-        return valid;
-    }
-
-    private boolean checkPasswordLessSSHLogin(String username, List<String> ipAddresses) throws Exception {
-        String script = InstallerDriver.getManagixHome() + File.separator + InstallerDriver.MANAGIX_INTERNAL_DIR
-                + File.separator + "scripts" + File.separator + "validate_ssh.sh";
-        List<String> args = ipAddresses;
-        args.add(0, username);
-        String output = AsterixEventServiceUtil.executeLocalScript(script, args);
-        ipAddresses.remove(0);
-        for (String line : output.split("\n")) {
-            ipAddresses.remove(line);
-        }
-        if (ipAddresses.size() > 0) {
-            LOGGER.error(" Password-less SSH (from user account: " + username + " )"
-                    + " not configured for the following hosts");
-            for (String failedIp : ipAddresses) {
-                System.out.println(failedIp);
-            }
-            return false;
-        }
-        return true;
-    }
-
-    private boolean validateClusterProperties(Cluster cluster) {
-        List<String> tempDirs = new ArrayList<String>();
-        if (cluster.getLogDir() != null && checkTemporaryPath(cluster.getLogDir())) {
-            tempDirs.add("Log directory: " + cluster.getLogDir());
-        }
-        if (cluster.getIodevices() != null && checkTemporaryPath(cluster.getIodevices())) {
-            tempDirs.add("IO Device: " + cluster.getIodevices());
-        }
-
-        if (tempDirs.size() > 0) {
-            StringBuffer msg = new StringBuffer();
-            msg.append("The following paths are subject to be cleaned up by OS");
-            for (String tempDir : tempDirs) {
-                msg.append("\n" + tempDir + WARNING);
-            }
-            LOGGER.warn(msg);
-        }
-
-        if (cluster.getStore() == null || cluster.getStore().length() == 0) {
-            LOGGER.fatal("store not defined at cluster" + ERROR);
-            return false;
-        }
-        return true;
-    }
-
-    private boolean validateNodeConfiguration(Node node, Cluster cluster) {
-        boolean valid = true;
-        if (node.getJavaHome() == null || node.getJavaHome().length() == 0) {
-            if (cluster.getJavaHome() == null || cluster.getJavaHome().length() == 0) {
-                valid = false;
-                LOGGER.fatal("java_home not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
-
-        if (node.getLogDir() == null || node.getLogDir().length() == 0) {
-            if (cluster.getLogDir() == null || cluster.getLogDir().length() == 0) {
-                valid = false;
-                LOGGER.fatal("log_dir not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
-
-        if (node.getTxnLogDir() == null || node.getTxnLogDir().length() == 0) {
-            if (cluster.getTxnLogDir() == null || cluster.getTxnLogDir().length() == 0) {
-                valid = false;
-                LOGGER.fatal("txn_log_dir not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
-
-        if (node.getIodevices() == null || node.getIodevices().length() == 0) {
-            if (!cluster.getMasterNode().getId().equals(node.getId())
-                    && (cluster.getIodevices() == null || cluster.getIodevices().length() == 0)) {
-                valid = false;
-                LOGGER.fatal("iodevice(s) not defined at cluster/node level for node: " + node.getId() + ERROR);
-            }
-        }
-
-        return valid;
-    }
-
-    private boolean checkTemporaryPath(String logdir) {
-        return logdir.startsWith(System.getProperty("java.io.tmpdir"));
-    }
-
-    public boolean validateConfiguration() throws Exception {
-        String managixHome = System.getenv(InstallerDriver.ENV_MANAGIX_HOME);
-        File configFile = new File(managixHome + File.separator + InstallerDriver.MANAGIX_CONF_XML);
-        JAXBContext configCtx = JAXBContext.newInstance(Configuration.class);
-        Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-        Configuration conf = (Configuration) unmarshaller.unmarshal(configFile);
-        return validateZookeeperConfiguration(conf);
-    }
-
-    private boolean validateZookeeperConfiguration(Configuration conf) throws Exception {
-        boolean valid = true;
-        Zookeeper zk = conf.getZookeeper();
-
-        if (zk.getHomeDir() == null || zk.getHomeDir().length() == 0) {
-            valid = false;
-            LOGGER.fatal("Zookeeper home dir not configured" + ERROR);
-        } else if (checkTemporaryPath(zk.getHomeDir())) {
-            LOGGER.warn("Zookeeper home dir is subject to be cleaned up by OS" + WARNING);
-        }
-
-        if (zk.getServers().getServer() == null || zk.getServers().getServer().isEmpty()) {
-            valid = false;
-            LOGGER.fatal("Zookeeper servers not configured" + ERROR);
-        }
-
-        if (zk.getServers().getJavaHome() == null || zk.getServers().getJavaHome().length() == 0) {
-            valid = false;
-            LOGGER.fatal("Java home not set for Zookeeper server in " + InstallerDriver.getManagixHome()
-                    + File.separator + InstallerDriver.MANAGIX_CONF_XML);
-        }
-
-        if (valid) {
-            valid = valid & checkPasswordLessSSHLogin(System.getProperty("user.name"), zk.getServers().getServer());
-        }
-
-        return valid;
-    }
-
-    private boolean validateReplicationProperties(Cluster cluster) {
-        boolean valid = true;
-
-        //if replication is disabled, no need to validate the settings
-        if (cluster.getHighAvailability() != null && cluster.getHighAvailability().getDataReplication() != null) {
-            if (cluster.getHighAvailability().getDataReplication().getReplicationPort() == null || cluster
-                    .getHighAvailability().getDataReplication().getReplicationPort().toString().length() == 0) {
-                valid = false;
-                LOGGER.fatal("Replication data port not defined for data repliaction. " + ERROR);
-            }
-
-            if (cluster.getHighAvailability().getDataReplication().getReplicationTimeOut() == null || String
-                    .valueOf(cluster.getHighAvailability().getDataReplication().getReplicationTimeOut().intValue())
-                    .length() == 0) {
-                LOGGER.warn("Replication maximum wait time not defined. Using default value (60 seconds) " + WARNING);
-            }
-
-            //validate all nodes have the same number of io devices
-            int numOfIODevices = 0;
-            Set<Integer> ioDevicesCount = new HashSet<Integer>();
-            for (int i = 0; i < cluster.getNode().size(); i++) {
-                Node node = cluster.getNode().get(i);
-
-                if (node.getIodevices() != null) {
-                    numOfIODevices = node.getIodevices().length() - node.getIodevices().replace(",", "").length();
-                } else {
-                    numOfIODevices = cluster.getIodevices().length() - cluster.getIodevices().replace(",", "").length();
-                }
-
-                ioDevicesCount.add(numOfIODevices);
-
-                if (ioDevicesCount.size() > 1) {
-                    valid = false;
-                    LOGGER.fatal("Replication requires all nodes to have the same number of IO devices." + ERROR);
-                    break;
-                }
-            }
-
-        }
-
-        return valid;
-    }
-
-}
-
-class ValidateConfig extends CommandConfig {
-
-    @Option(name = "-c", required = false, usage = "Path to the cluster configuration xml")
-    public String cluster;
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/VersionCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/VersionCommand.java
deleted file mode 100644
index b604dc0..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/VersionCommand.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.command;
-
-import java.io.File;
-
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.installer.driver.InstallerDriver;
-
-public class VersionCommand extends AbstractCommand {
-
-    @Override
-    protected void execCommand() throws Exception {
-        InstallerDriver.initConfig(false);
-        String asterixZipName = AsterixEventService.getAsterixZip().substring(
-                AsterixEventService.getAsterixZip().lastIndexOf(File.separator) + 1);
-        String asterixVersion = asterixZipName.substring("asterix-server-".length(),
-                asterixZipName.indexOf("-binary-assembly"));
-        LOGGER.info("Asterix/Managix version " + asterixVersion);
-    }
-
-    @Override
-    protected CommandConfig getCommandConfig() {
-        return new VersionConfig();
-    }
-
-    @Override
-    protected String getUsageDescription() {
-        return "Provides version of Managix/Asterix";
-    }
-
-}
-
-class VersionConfig extends CommandConfig {
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerDriver.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerDriver.java
deleted file mode 100644
index 61e7916..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerDriver.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.driver;
-
-import java.io.File;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.log4j.Logger;
-
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.ILookupService;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.command.CommandHandler;
-import org.apache.asterix.installer.command.ConfigureCommand;
-import org.apache.asterix.installer.schema.conf.Configuration;
-
-public class InstallerDriver {
-
-    private static final Logger LOGGER = Logger.getLogger(InstallerDriver.class.getName());
-
-    public static final String MANAGIX_INTERNAL_DIR = ".installer";
-    public static final String ENV_MANAGIX_HOME = "MANAGIX_HOME";
-    public static final String MANAGIX_CONF_XML = "conf" + File.separator + "managix-conf.xml";
-    public static final String ASTERIX_DIR = "asterix";
-
-    private static String managixHome;
-
-    public static void initConfig(boolean ensureLookupServiceIsRunning) throws Exception {
-        File configFile = new File(managixHome + File.separator + MANAGIX_CONF_XML);
-        JAXBContext configCtx = JAXBContext.newInstance(Configuration.class);
-        Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-        Configuration conf = (Configuration) unmarshaller.unmarshal(configFile);
-        String asterixDir = managixHome + File.separator + ASTERIX_DIR;
-        String eventHome = managixHome + File.separator + MANAGIX_INTERNAL_DIR;
-        AsterixEventService.initialize(conf, asterixDir, eventHome);
-
-        ILookupService lookupService = ServiceProvider.INSTANCE.getLookupService();
-        if (ensureLookupServiceIsRunning) {
-            if (!conf.isConfigured()) {
-                try {
-                    configure();
-                    /* read back the configuration file updated as part of configure command*/
-                    conf = (Configuration) unmarshaller.unmarshal(configFile);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-            if (!lookupService.isRunning(conf)) {
-                lookupService.startService(conf);
-            }
-        }
-
-    }
-
-    private static void configure() throws Exception {
-        ConfigureCommand cmd = new ConfigureCommand();
-        cmd.execute(new String[] { "configure" });
-    }
-
-    public static String getManagixHome() {
-        return managixHome;
-    }
-
-    public static void setManagixHome(String managixHome) {
-        InstallerDriver.managixHome = managixHome;
-    }
-
-    public static void main(String args[]) {
-        try {
-            if (args.length != 0) {
-                managixHome = System.getenv(ENV_MANAGIX_HOME);
-                CommandHandler cmdHandler = new CommandHandler();
-                cmdHandler.processCommand(args);
-            } else {
-                printUsage();
-            }
-        } catch (IllegalArgumentException iae) {
-            LOGGER.error("Unknown command");
-            printUsage();
-        } catch (Exception e) {
-            LOGGER.error(e.getMessage());
-            if (e.getMessage() == null || e.getMessage().length() < 10) {
-                // less than 10 characters of error message is probably not enough
-                e.printStackTrace();
-            }
-        }
-    }
-
-    private static void printUsage() {
-        StringBuffer buffer = new StringBuffer("managix <command> <options>" + "\n");
-        buffer.append("Commands" + "\n");
-        buffer.append("create   " + ":" + " Creates a new asterix instance" + "\n");
-        buffer.append("delete   " + ":" + " Deletes an asterix instance" + "\n");
-        buffer.append("start    " + ":" + " Starts an  asterix instance" + "\n");
-        buffer.append("stop     " + ":" + " Stops an asterix instance that is in ACTIVE state" + "\n");
-        buffer.append("backup   " + ":" + " Creates a back up for an existing asterix instance" + "\n");
-        buffer.append("restore  " + ":" + " Restores an asterix instance" + "\n");
-        buffer.append("alter    " + ":" + " Alter the instance's configuration settings" + "\n");
-        buffer.append("describe " + ":" + " Describes an existing asterix instance" + "\n");
-        buffer.append("validate " + ":" + " Validates the installer/cluster configuration" + "\n");
-        buffer.append("configure" + ":" + " Auto-generate configuration for local psedu-distributed Asterix instance"
-                + "\n");
-        buffer.append("install  " + ":" + " Installs a library to an asterix instance" + "\n");
-        buffer.append("uninstall" + ":" + " Uninstalls a library from an asterix instance" + "\n");
-        buffer.append("log      " + ":"
-                + " Produce a tar archive contianing log files from the master and worker nodes" + "\n");
-        buffer.append("shutdown " + ":" + " Shutdown the installer service" + "\n");
-        buffer.append("help     " + ":" + " Provides usage description of a command" + "\n");
-        buffer.append("version  " + ":" + " Provides version of Asterix/Managix" + "\n");
-
-        buffer.append("\nTo get more information about a command, use managix help -cmd <command>");
-        LOGGER.info(buffer.toString());
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerUtil.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerUtil.java
deleted file mode 100644
index 1ac60ba..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/driver/InstallerUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.driver;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-
-public class InstallerUtil {
-
-    private static final String DEFAULT_ASTERIX_CONFIGURATION_PATH = "conf" + File.separator
-            + "asterix-configuration.xml";
-
-    public static final String TXN_LOG_DIR = "txnLogs";
-    public static final String TXN_LOG_DIR_KEY_SUFFIX = "txnLogDir";
-    public static final String ASTERIX_CONFIGURATION_FILE = "asterix-configuration.xml";
-    public static final String TXN_LOG_CONFIGURATION_FILE = "log.properties";
-    public static final int CLUSTER_NET_PORT_DEFAULT = 1098;
-    public static final int CLIENT_NET_PORT_DEFAULT = 1099;
-    public static final int HTTP_PORT_DEFAULT = 8888;
-    public static final int WEB_INTERFACE_PORT_DEFAULT = 19001;
-
-    public static String getNodeDirectories(String asterixInstanceName, Node node, Cluster cluster) {
-        String storeDataSubDir = asterixInstanceName + File.separator + "data" + File.separator;
-        String[] storeDirs = null;
-        StringBuffer nodeDataStore = new StringBuffer();
-        String storeDirValue = cluster.getStore();
-        if (storeDirValue == null) {
-            throw new IllegalStateException(" Store not defined for node " + node.getId());
-        }
-        storeDataSubDir = node.getId() + File.separator + storeDataSubDir;
-
-        storeDirs = storeDirValue.split(",");
-        for (String ns : storeDirs) {
-            nodeDataStore.append(ns + File.separator + storeDataSubDir.trim());
-            nodeDataStore.append(",");
-        }
-        nodeDataStore.deleteCharAt(nodeDataStore.length() - 1);
-        return nodeDataStore.toString();
-    }
-
-    public static AsterixConfiguration getAsterixConfiguration(String asterixConf)
-            throws FileNotFoundException, IOException, JAXBException {
-        if (asterixConf == null) {
-            asterixConf = InstallerDriver.getManagixHome() + File.separator + DEFAULT_ASTERIX_CONFIGURATION_PATH;
-        }
-        File file = new File(asterixConf);
-        JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        AsterixConfiguration asterixConfiguration = (AsterixConfiguration) unmarshaller.unmarshal(file);
-        return asterixConfiguration;
-    }
-}
diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/error/InstallerException.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/error/InstallerException.java
deleted file mode 100644
index dccfd4a..0000000
--- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/error/InstallerException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.error;
-
-public class InstallerException extends Exception {
-
-    private static final long serialVersionUID = 1L;
-
-    public InstallerException(String message) {
-        super(message);
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/main/resources/clusters/demo/demo.xml b/asterixdb/asterix-installer/src/main/resources/clusters/demo/demo.xml
deleted file mode 100644
index 2721eec..0000000
--- a/asterixdb/asterix-installer/src/main/resources/clusters/demo/demo.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <!--
-    This defines a cluster that runs 2 worker nodes on a single machine.
-    Also, each worker node is assigned to 2 partitions in the same
-    directory (and thus on the same external storage device).
-    Both of these decisions are usually not advisable for production
-    use.
-  -->
-  <name>demo</name>
-  <working_dir>
-    <dir>/tmp/asterix-installer</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <log_dir>/tmp/asterix/logs</log_dir>
-  <store>storage</store>
-  <java_home></java_home>
-  <master_node>
-    <id>master</id>
-    <client_ip>127.0.0.1</client_ip>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <cluster_port>1099</cluster_port>
-    <client_port>1098</client_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>node1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/node1/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/node1/1,/tmp/asterix/node1/2</iodevices>
-  </node>
-  <node>
-    <id>node2</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/node2/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/node2/1,/tmp/asterix/node2/2</iodevices>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-installer/src/main/resources/clusters/local/local.xml b/asterixdb/asterix-installer/src/main/resources/clusters/local/local.xml
deleted file mode 100644
index f2afe5e..0000000
--- a/asterixdb/asterix-installer/src/main/resources/clusters/local/local.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <java_home>/usr/lib/jvm/jdk-8-oracle-x64/jre</java_home>
-  <log_dir>/tmp/asterix/logs</log_dir>
-  <txn_log_dir>/tmp/asterix/txnLogs</txn_log_dir>
-  <store>storage</store>
-  <working_dir>
-    <dir>/tmp/asterix-installer</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <!-- Sets the time duration between two heartbeats from each node controller in milliseconds (default: 10000) -->
-  <heartbeat_period>10000</heartbeat_period>
-  <!-- Sets the maximum number of missed heartbeats before a node is marked as dead (default: 5) -->
-  <max_heartbeat_lapse_periods>5</max_heartbeat_lapse_periods>
-  <!-- Sets the time duration between two profile dumps from each node controller in milliseconds. 0 to disable. (default: 0) -->
-  <profile_dump_period>0</profile_dump_period>
-  <!-- Limits the number of historical jobs remembered by the system to the specified value. (default: 10) -->
-  <job_history_size>10</job_history_size>
-  <!-- Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds. (default: 24 hours) -->
-  <result_time_to_live>86400000</result_time_to_live>
-  <!-- The duration within which an instance of the result cleanup should be invoked in milliseconds. (default: 1 minute) -->
-  <result_sweep_threshold>60000</result_sweep_threshold>
-  <master_node>
-    <id>master</id>
-    <client_ip>127.0.0.1</client_ip>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc1/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc1/p1,/tmp/asterix/nc1/p2</iodevices>
-
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc2/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc2/p1,/tmp/asterix/nc2/p2</iodevices>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-installer/src/main/resources/clusters/local/local_chained_declustering_rep.xml b/asterixdb/asterix-installer/src/main/resources/clusters/local/local_chained_declustering_rep.xml
deleted file mode 100644
index 57d04c7..0000000
--- a/asterixdb/asterix-installer/src/main/resources/clusters/local/local_chained_declustering_rep.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <java_home>/usr/lib/jvm/jdk-8-oracle-x64/jre</java_home>
-  <log_dir>/tmp/asterix/logs</log_dir>
-  <txn_log_dir>/tmp/asterix/txnLogs</txn_log_dir>
-  <store>storage</store>
-  <working_dir>
-    <dir>/tmp/asterix-installer</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <!-- Sets the time duration between two heartbeats from each node controller in milliseconds (default: 10000) -->
-  <heartbeat_period>1000</heartbeat_period>
-  <!-- Sets the maximum number of missed heartbeats before a node is marked as dead (default: 5) -->
-  <max_heartbeat_lapse_periods>5</max_heartbeat_lapse_periods>
-  <!-- Sets the time duration between two profile dumps from each node controller in milliseconds. 0 to disable. (default: 0) -->
-  <profile_dump_period>0</profile_dump_period>
-  <!-- Limits the number of historical jobs remembered by the system to the specified value. (default: 10) -->
-  <job_history_size>10</job_history_size>
-  <!-- Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds. (default: 24 hours) -->
-  <result_time_to_live>86400000</result_time_to_live>
-  <!-- The duration within which an instance of the result cleanup should be invoked in milliseconds. (default: 1 minute) -->
-  <result_sweep_threshold>60000</result_sweep_threshold>
-
-  <metadata_node>nc1</metadata_node>
-
-  <high_availability>
-    <enabled>true</enabled>
-    <data_replication>
-      <strategy>chained_declustering</strategy>
-      <replication_port>2000</replication_port>
-      <replication_factor>2</replication_factor>
-      <replication_time_out>30</replication_time_out>
-    </data_replication>
-    <fault_tolerance>
-       <strategy>auto</strategy>
-    </fault_tolerance>
-  </high_availability>
-
-  <master_node>
-    <id>master</id>
-    <client_ip>127.0.0.1</client_ip>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc1/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc1/p1,/tmp/asterix/nc1/p2</iodevices>
-    <replication_port>2000</replication_port>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc2/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc2/p1,/tmp/asterix/nc2/p2</iodevices>
-    <replication_port>2001</replication_port>
-  </node>
-</cluster>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/main/resources/clusters/local/local_metadata_only_rep.xml b/asterixdb/asterix-installer/src/main/resources/clusters/local/local_metadata_only_rep.xml
deleted file mode 100644
index 7a435b7..0000000
--- a/asterixdb/asterix-installer/src/main/resources/clusters/local/local_metadata_only_rep.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-  <java_home>/usr/lib/jvm/jdk-8-oracle-x64/jre</java_home>
-  <log_dir>/tmp/asterix/logs</log_dir>
-  <txn_log_dir>/tmp/asterix/txnLogs</txn_log_dir>
-  <store>storage</store>
-  <working_dir>
-    <dir>/tmp/asterix-installer</dir>
-    <NFS>true</NFS>
-  </working_dir>
-  <!-- Sets the time duration between two heartbeats from each node controller in milliseconds (default: 10000) -->
-  <heartbeat_period>1000</heartbeat_period>
-  <!-- Sets the maximum number of missed heartbeats before a node is marked as dead (default: 5) -->
-  <max_heartbeat_lapse_periods>5</max_heartbeat_lapse_periods>
-  <!-- Sets the time duration between two profile dumps from each node controller in milliseconds. 0 to disable. (default: 0) -->
-  <profile_dump_period>0</profile_dump_period>
-  <!-- Sets the default number of job attempts allowed if not specified in the job specification. (default: 5) -->
-  <default_max_job_attempts>5</default_max_job_attempts>
-  <!-- Limits the number of historical jobs remembered by the system to the specified value. (default: 10) -->
-  <job_history_size>10</job_history_size>
-  <!-- Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds. (default: 24 hours) -->
-  <result_time_to_live>86400000</result_time_to_live>
-  <!-- The duration within which an instance of the result cleanup should be invoked in milliseconds. (default: 1 minute) -->
-  <result_sweep_threshold>60000</result_sweep_threshold>
-
-  <metadata_node>nc1</metadata_node>
-
-  <high_availability>
-    <enabled>true</enabled>
-    <data_replication>
-      <strategy>metadata_only</strategy>
-      <replication_port>2000</replication_port>
-      <replication_time_out>30</replication_time_out>
-    </data_replication>
-    <fault_tolerance>
-      <strategy>metadata_node</strategy>
-      <replica>
-        <node_id>nc2</node_id>
-      </replica>
-    </fault_tolerance>
-  </high_availability>
-
-  <master_node>
-    <id>master</id>
-    <client_ip>127.0.0.1</client_ip>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc1/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc1/p1,/tmp/asterix/nc1/p2</iodevices>
-    <replication_port>2000</replication_port>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-    <txn_log_dir>/tmp/asterix/nc2/txnLogs</txn_log_dir>
-    <iodevices>/tmp/asterix/nc2/p1,/tmp/asterix/nc2/p2</iodevices>
-    <replication_port>2001</replication_port>
-  </node>
-</cluster>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/main/resources/conf/asterix-configuration.xml b/asterixdb/asterix-installer/src/main/resources/conf/asterix-configuration.xml
deleted file mode 100644
index 35d114e..0000000
--- a/asterixdb/asterix-installer/src/main/resources/conf/asterix-configuration.xml
+++ /dev/null
@@ -1,268 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-
-  <property>
-    <name>nc.java.opts</name>
-    <value>-Xmx3096m</value>
-    <description>JVM parameters for each Node Contoller (NC)</description>
-  </property>
-
-  <property>
-    <name>cc.java.opts</name>
-    <value>-Xmx1024m</value>
-    <description>JVM parameters for each Cluster Contoller (CC)
-    </description>
-  </property>
-
-  <property>
-    <name>max.wait.active.cluster</name>
-    <value>60</value>
-    <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all nodes are available)
-      before a submitted query/statement can be executed. (Default = 60 seconds)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages in the buffer cache.
-      (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.size</name>
-    <value>512MB</value>
-    <description>The size of memory allocated to the disk buffer cache.
-      The value should be a multiple of the buffer cache page size(Default
-      = "536870912" // 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.maxopenfiles</name>
-    <value>214748364</value>
-    <description>The maximum number of open files in the buffer cache.
-      (Default = "214748364")
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages allocated to memory
-      components. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numpages</name>
-    <value>256</value>
-    <description>The number of pages to allocate for a memory component.
-      This budget is shared by all the memory components of the primary
-      index and all its secondary indexes across all I/O devices on a node.
-      Note: in-memory components usually has fill factor of 75% since
-      the pages are 75% full and the remaining 25% is un-utilized. (Default = 256)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.metadata.memorycomponent.numpages</name>
-    <value>64</value>
-    <description>The number of pages to allocate for a memory component.
-      (Default = 64)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numcomponents</name>
-    <value>2</value>
-    <description>The number of memory components to be used per lsm index.
-      (Default = 2)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.globalbudget</name>
-    <value>1GB</value>
-    <description>The total size of memory in bytes that the sum of all open memory
-      components cannot exceed. Consider this as the buffer cache for all memory
-      components of all indexes in a node. When this budget is fully used, a victim
-      dataset will be chosen. The chosen dataset must be evicted and closed to make
-      a space for another dataset. (Default = 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.lsm.bloomfilter.falsepositiverate</name>
-    <value>0.01</value>
-    <description>The maximum acceptable false positive rate for bloom
-      filters associated with LSM indexes. (Default = "0.01" // 1%)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.numpages</name>
-    <value>8</value>
-    <description>The number of in-memory log buffer pages. (Default = "8")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.pagesize</name>
-    <value>512KB</value>
-    <description>The size of pages in the in-memory log buffer. (Default =
-      "524288" // 512KB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.partitionsize</name>
-    <value>2GB</value>
-    <description>The maximum size of a log file partition allowed before
-      rotating the log to the next partition. (Default = "2147483648" //
-      2GB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.lsnthreshold</name>
-    <value>67108864</value>
-    <description>The size of the window that the maximum LSN is allowed to
-      be ahead of the checkpoint LSN by. (Default = ""67108864" // 64M)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.pollfrequency</name>
-    <value>120</value>
-    <description>The time in seconds between that the checkpoint thread
-      waits between polls. (Default = "120" // 120s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.history</name>
-    <value>0</value>
-    <description>The number of old log partition files to keep before
-      discarding. (Default = "0")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.escalationthreshold</name>
-    <value>1000</value>
-    <description>The number of entity level locks that need to be acquired
-      before the locks are coalesced and escalated into a dataset level
-      lock. (Default = "1000")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.shrinktimer</name>
-    <value>5000</value>
-    <description>The time in milliseconds to wait before deallocating
-      unused lock manager memory. (Default = "5000" // 5s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.waitthreshold</name>
-    <value>60000</value>
-    <description>The time in milliseconds to wait before labeling a
-      transaction which has been waiting for a lock timed-out. (Default =
-      "60000" // 60s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.sweepthreshold</name>
-    <value>10000</value>
-    <description>The time in milliseconds the timeout thread waits between
-      sweeps to detect timed-out transactions. (Default = "10000" // 10s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.job.recovery.memorysize</name>
-    <value>64MB</value>
-    <description>The memory allocated per job during recovery.
-     (Default = "67108864" // 64MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.sortmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to sort operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.joinmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to join operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.framesize</name>
-    <value>128KB</value>
-    <description>The Hyracks frame size that the compiler configures per
-      job. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.pregelix.home</name>
-    <value>~/pregelix</value>
-  </property>
-
-  <property>
-    <name>web.port</name>
-    <value>19001</value>
-    <description>The port for the ASTERIX web interface. (Default = 19001)
-    </description>
-  </property>
-
-  <property>
-    <name>web.queryinterface.port</name>
-    <value>19006</value>
-    <description>The port for the ASTERIX web query interface. (Default = 19006)
-    </description>
-  </property>
-
-  <property>
-    <name>api.port</name>
-    <value>19002</value>
-    <description>The port for the ASTERIX API server. (Default = 19002)
-    </description>
-  </property>
-
-  <property>
-    <name>log.level</name>
-    <value>INFO</value>
-    <description>The minimum log level to be displayed. (Default = INFO)
-    </description>
-  </property>
-
-</asterixConfiguration>
diff --git a/asterixdb/asterix-installer/src/main/resources/conf/log4j.properties b/asterixdb/asterix-installer/src/main/resources/conf/log4j.properties
deleted file mode 100644
index 9d84a21..0000000
--- a/asterixdb/asterix-installer/src/main/resources/conf/log4j.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-log4j.rootLogger=info, A1
-
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-# Print the date in ISO 8601 format
-log4j.appender.A1.layout.ConversionPattern=%-p: %m%n
-
-log4j.logger.org.apache.asterix.event.management=error
-log4j.logger.org.apache.zookeeper=error
diff --git a/asterixdb/asterix-installer/src/main/resources/conf/managix-conf.xml b/asterixdb/asterix-installer/src/main/resources/conf/managix-conf.xml
deleted file mode 100644
index 789f546..0000000
--- a/asterixdb/asterix-installer/src/main/resources/conf/managix-conf.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<configuration xmlns="installer">
-  <is_configured>false</is_configured>
-  <backup>
-    <hdfs>
-      <version>0.20.2</version>
-      <url></url>
-      <backupDir></backupDir>
-    </hdfs>
-  </backup>
-  <zookeeper>
-    <homeDir>/tmp/zookeeper</homeDir>
-    <clientPort>2900</clientPort>
-    <servers>
-      <server>127.0.0.1</server>
-    </servers>
-  </zookeeper>
-</configuration>
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/create.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/create.aql
deleted file mode 100644
index 87ad2b0..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/create.aql
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-drop dataverse TinySocial if exists;
-create dataverse TinySocial;
-use dataverse TinySocial;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type MugshotUserType as {
-    id: int32,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    address: {
-        street: string,
-        city: string,
-        state: string,
-        zip: string,
-        country: string
-    },
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-create type MugshotMessageType as closed {
-    message-id: int32,
-    author-id: int32,
-    timestamp: datetime,
-    in-response-to: int32?,
-    sender-location: point?,
-    tags: {{ string }},
-    message: string
-}
-
-create dataset MugshotUsers(MugshotUserType)
-    primary key id;
-create dataset MugshotMessages(MugshotMessageType)
-    primary key message-id;
-
-create index msUserSinceIdx
-    on MugshotUsers(user-since);
-create index msTimestampIdx
-    on MugshotMessages(timestamp);
-create index msAuthorIdx
-    on MugshotMessages(author-id) type btree;
-create index msSenderLocIndex
-    on MugshotMessages(sender-location) type rtree;
-create index msMessageIdx
-    on MugshotMessages(message) type keyword;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/delete.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/delete.aql
deleted file mode 100644
index 8079f66..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/delete.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-delete $user from dataset MugshotUsers
-where $user.id = 999;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/equi-join.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/equi-join.aql
deleted file mode 100644
index 2dab34a..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/equi-join.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-for $message in dataset MugshotMessages
-where $message.author-id = $user.id
-  and $user.user-since >= datetime('2010-07-22T00:00:00')
-  and $user.user-since <= datetime('2012-07-29T23:59:59')
-return {
-  "uname" : $user.name,
-  "message" : $message.message
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-definition.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-definition.aql
deleted file mode 100644
index fee9eb0..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-definition.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-drop function unemployed@0 if exists;
-
-create function unemployed() {
-  for $msu in dataset MugshotUsers
-  where (every $e in $msu.employment
-         satisfies not(is-null($e.end-date)))
-  return {
-    "name" : $msu.name,
-    "address" : $msu.address
-  }
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-use.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-use.aql
deleted file mode 100644
index 5695b31..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/function-use.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $un in unemployed()
-where $un.address.zip = "94065"
-return $un
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/group-sort-limit.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/group-sort-limit.aql
deleted file mode 100644
index e0c4cfd..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/group-sort-limit.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $msg in dataset MugshotMessages
-where $msg.timestamp >= datetime("2014-02-20T00:00:00")
-  and $msg.timestamp <  datetime("2014-03-20T00:00:00")
-group by $aid := $msg.author-id with $msg
-let $cnt := count($msg)
-order by $cnt desc
-limit 3
-return {
-  "author" : $aid,
-  "no messages" : $cnt
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/insert.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/insert.aql
deleted file mode 100644
index 720a34f..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/insert.aql
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-insert into dataset MugshotUsers
-(
-  {
-    "id":999,
-    "alias":"John",
-    "name":"JohnDoe",
-    "address":{
-      "street":"789 Jane St",
-      "city":"San Harry",
-      "zip":"98767",
-      "state":"CA",
-      "country":"USA"
-    },
-    "user-since":datetime("2010-08-15T08:10:00"),
-    "friend-ids":{{ 5, 9, 11 }},
-    "employment":[{
-        "organization-name":"Kongreen",
-        "start-date":date("2012-06-05")
-    }]
-  }
-);
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/join-group.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/join-group.aql
deleted file mode 100644
index 255f800..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/join-group.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-for $message in dataset MugshotMessages
-where $message.author-id = $user.id
-group by $name := $user.name with $message
-let $avglen := avg(for $m in $message
-                   return string-length($m.message))
-order by $avglen desc
-limit 10
-return {
-  "uname" : $name,
-  "msg-length" : $avglen
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-fuzzy-join.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-fuzzy-join.aql
deleted file mode 100644
index ee4e626..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-fuzzy-join.aql
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-set simfunction "jaccard";
-set simthreshold "0.3";
-
-for $msg in dataset MugshotMessages
-let $msgsSimilarTags := (
-  for $m2 in dataset MugshotMessages
-    where  $m2.tags ~= $msg.tags
-      and $m2.message-id != $msg.message-id
-    return $m2.message
-  )
-where count($msgsSimilarTags) > 0
-order by count($msgsSimilarTags)
-limit 10
-return {
-  "message" : $msg.message,
-  "similarly tagged" : $msgsSimilarTags
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join-aggr.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join-aggr.aql
deleted file mode 100644
index ff461bc..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join-aggr.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-let $result := {
-    "uname" : $user.name,
-    "msg-length" : avg(
-        for $message in dataset MugshotMessages
-        where $message.author-id = $user.id
-        return string-length($message.message)
-      )
-  }
-order by $result.msg-length desc
-limit 10
-return $result;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join.aql
deleted file mode 100644
index 04e1ceb..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/left-outer-join.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-where $user.user-since >= datetime('2010-07-22T00:00:00')
-  and $user.user-since <= datetime('2012-07-29T23:59:59')
-return {
-  "uname" : $user.name,
-  "messages" :
-    for $message in dataset MugshotMessages
-    where $message.author-id = $user.id
-    return $message.message
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/load.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/load.aql
deleted file mode 100644
index e85739a..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/load.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-load dataset MugshotUsers using localfs
-(("path"="127.0.0.1://../../../examples/mugshot/data/mugshot_users.adm"),("format"="adm"));
-
-load dataset MugshotMessages using localfs
-(("path"="127.0.0.1://../../../examples/mugshot/data/mugshot_messages.adm"),("format"="adm"));
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/lookup.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/lookup.aql
deleted file mode 100644
index ec5cfe8..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/lookup.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-where $user.id = 8
-return $user;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/range-scan.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/range-scan.aql
deleted file mode 100644
index 788379a..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/range-scan.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-where $user.user-since >= datetime('2010-07-22T00:00:00')
-  and $user.user-since <= datetime('2012-07-29T23:59:59')
-return $user;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/simple-aggregation.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/simple-aggregation.aql
deleted file mode 100644
index 44e1281..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/simple-aggregation.aql
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-avg(
-  for $m in dataset MugshotMessages
-  where $m.timestamp >= datetime("2014-01-01T00:00:00")
-    and $m.timestamp <  datetime("2014-04-01T00:00:00")
-  return string-length($m.message)
-)
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/spatial-join.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/spatial-join.aql
deleted file mode 100644
index eb50cb1..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/spatial-join.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $t in dataset MugshotMessages
-return {
-  "message" : $t.message,
-  "nearby-messages":
-    for $t2 in dataset MugshotMessages
-    where spatial-distance($t.sender-location,
-                           $t2.sender-location) <= 1
-    return { "msgtxt" : $t2.message }
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/ten-of-each.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/ten-of-each.aql
deleted file mode 100644
index ec829eb..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/ten-of-each.aql
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $user in dataset MugshotUsers
-limit 10
-return $user;
-
-for $message in dataset MugshotMessages
-limit 10
-return $message;
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/universal.aql b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/universal.aql
deleted file mode 100644
index ab25894..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/aql/universal.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse TinySocial;
-
-for $msu in dataset MugshotUsers
-where (every $e in $msu.employment
-      satisfies not(is-null($e.end-date)))
-limit 10
-return {
-  "name" : $msu.name,
-  "address" : $msu.address
-};
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_messages.adm b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_messages.adm
deleted file mode 100644
index 339c838..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_messages.adm
+++ /dev/null
@@ -1,1331 +0,0 @@
-{"message-id": 1, "author-id": 1, "timestamp":datetime("2009-01-17T07:56:52"), "in-response-to": 787, "sender-location":point("34.92,89.38"), "tags":{{"samsung", "3G" }}, "message":" like samsung the 3G is amazing"}
-{"message-id": 2, "author-id": 1, "timestamp":datetime("2012-03-24T04:20:04"), "in-response-to": 2423, "sender-location":point("26.6,85.97"), "tags":{{"verizon", "network" }}, "message":" like verizon the network is awesome:)"}
-{"message-id": 3, "author-id": 1, "timestamp":datetime("2007-03-26T00:43:44"), "in-response-to": 3107, "sender-location":point("44.5,71.87"), "tags":{{"verizon", "voice-command" }}, "message":" can't stand verizon the voice-command is OMG"}
-{"message-id": 4, "author-id": 1, "timestamp":datetime("2010-01-01T19:50:04"), "in-response-to": 101, "sender-location":point("25.67,82.85"), "tags":{{"verizon", "platform" }}, "message":" love verizon its platform is mind-blowing"}
-{"message-id": 5, "author-id": 1, "timestamp":datetime("2013-02-04T12:52:26"), "in-response-to": 3226, "sender-location":point("40.91,71.73"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" like t-mobile its voice-clarity is awesome:)"}
-{"message-id": 6, "author-id": 1, "timestamp":datetime("2005-03-13T00:59:18"), "in-response-to": 317, "sender-location":point("40.04,88.54"), "tags":{{"motorola", "touch-screen" }}, "message":" like motorola the touch-screen is mind-blowing:)"}
-{"message-id": 7, "author-id": 1, "timestamp":datetime("2009-01-16T07:38:49"), "in-response-to": 1472, "sender-location":point("34.31,86.35"), "tags":{{"samsung", "signal" }}, "message":" can't stand samsung its signal is OMG:("}
-{"message-id": 8, "author-id": 1, "timestamp":datetime("2008-05-12T08:44:47"), "in-response-to": 1088, "sender-location":point("32.51,85.9"), "tags":{{"sprint", "plan" }}, "message":" like sprint its plan is awesome"}
-{"message-id": 9, "author-id": 1, "timestamp":datetime("2006-02-22T09:39:54"), "in-response-to": 2712, "sender-location":point("47.95,67.41"), "tags":{{"iphone", "wireless" }}, "message":" dislike iphone its wireless is bad"}
-{"message-id": 10, "author-id": 1, "timestamp":datetime("2012-08-19T02:35:49"), "in-response-to": 2641, "sender-location":point("27.79,91.53"), "tags":{{"iphone", "reachability" }}, "message":" like iphone the reachability is good"}
-{"message-id": 11, "author-id": 1, "timestamp":datetime("2014-01-13T14:44:28"), "in-response-to": 555, "sender-location":point("26.72,95.52"), "tags":{{"at&t", "3G" }}, "message":" like at&t its 3G is mind-blowing:)"}
-{"message-id": 12, "author-id": 1, "timestamp":datetime("2012-04-27T12:11:33"), "in-response-to": 2125, "sender-location":point("26.02,83.77"), "tags":{{"at&t", "customer-service" }}, "message":" dislike at&t its customer-service is terrible"}
-{"message-id": 13, "author-id": 1, "timestamp":datetime("2008-05-19T18:27:43"), "in-response-to": 2115, "sender-location":point("32.88,81.3"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone its voice-clarity is mind-blowing"}
-{"message-id": 14, "author-id": 1, "timestamp":datetime("2014-08-25T14:31:02"), "in-response-to": 348, "sender-location":point("26.16,96.18"), "tags":{{"verizon", "customer-service" }}, "message":" like verizon the customer-service is mind-blowing:)"}
-{"message-id": 15, "author-id": 1, "timestamp":datetime("2012-04-06T12:07:16"), "in-response-to": 1496, "sender-location":point("40.32,71.25"), "tags":{{"motorola", "customer-service" }}, "message":" love motorola its customer-service is awesome:)"}
-{"message-id": 16, "author-id": 1, "timestamp":datetime("2014-01-24T21:16:12"), "in-response-to": 1530, "sender-location":point("39.81,79.89"), "tags":{{"t-mobile", "reachability" }}, "message":" like t-mobile the reachability is mind-blowing"}
-{"message-id": 17, "author-id": 1, "timestamp":datetime("2011-11-09T13:23:31"), "in-response-to": 46, "sender-location":point("36.02,95.26"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" love t-mobile the voice-clarity is good"}
-{"message-id": 18, "author-id": 1, "timestamp":datetime("2007-03-11T05:37:27"), "in-response-to": 903, "sender-location":point("48.49,68.79"), "tags":{{"samsung", "voice-clarity" }}, "message":" like samsung its voice-clarity is mind-blowing:)"}
-{"message-id": 19, "author-id": 1, "timestamp":datetime("2005-11-21T13:48:58"), "in-response-to": 1524, "sender-location":point("34.3,77.6"), "tags":{{"t-mobile", "speed" }}, "message":" like t-mobile its speed is good:)"}
-{"message-id": 20, "author-id": 1, "timestamp":datetime("2008-04-07T02:05:42"), "in-response-to": 1986, "sender-location":point("33.21,67.4"), "tags":{{"at&t", "voice-clarity" }}, "message":" can't stand at&t the voice-clarity is horrible:("}
-{"message-id": 21, "author-id": 1, "timestamp":datetime("2010-06-04T03:46:02"), "in-response-to": 2069, "sender-location":point("32.23,97.4"), "tags":{{"at&t", "customer-service" }}, "message":" can't stand at&t the customer-service is horrible"}
-{"message-id": 22, "author-id": 1, "timestamp":datetime("2014-08-16T12:25:29"), "in-response-to": 2043, "sender-location":point("39.4,72.53"), "tags":{{"verizon", "voice-command" }}, "message":" hate verizon its voice-command is OMG"}
-{"message-id": 23, "author-id": 1, "timestamp":datetime("2008-07-21T07:59:04"), "in-response-to": 1583, "sender-location":point("47.25,87.12"), "tags":{{"t-mobile", "signal" }}, "message":" can't stand t-mobile its signal is terrible:("}
-{"message-id": 24, "author-id": 1, "timestamp":datetime("2007-11-12T14:14:07"), "in-response-to": 1082, "sender-location":point("35.17,66.4"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t its voicemail-service is amazing:)"}
-{"message-id": 25, "author-id": 1, "timestamp":datetime("2010-01-28T22:46:51"), "in-response-to": 498, "sender-location":point("31.98,71.58"), "tags":{{"sprint", "voice-clarity" }}, "message":" hate sprint the voice-clarity is horrible"}
-{"message-id": 26, "author-id": 1, "timestamp":datetime("2005-08-07T03:11:25"), "in-response-to": 2454, "sender-location":point("35.73,94.53"), "tags":{{"samsung", "voice-clarity" }}, "message":" like samsung its voice-clarity is amazing"}
-{"message-id": 27, "author-id": 1, "timestamp":datetime("2007-03-05T10:38:08"), "in-response-to": 761, "sender-location":point("39.34,86.6"), "tags":{{"iphone", "signal" }}, "message":" dislike iphone its signal is horrible:("}
-{"message-id": 28, "author-id": 1, "timestamp":datetime("2008-07-06T05:43:56"), "in-response-to": 1371, "sender-location":point("31.47,94.45"), "tags":{{"t-mobile", "wireless" }}, "message":" dislike t-mobile its wireless is terrible"}
-{"message-id": 29, "author-id": 2, "timestamp":datetime("2012-12-10T10:20:54"), "in-response-to": 2483, "sender-location":point("35.56,73.91"), "tags":{{"iphone", "3G" }}, "message":" dislike iphone the 3G is OMG"}
-{"message-id": 30, "author-id": 2, "timestamp":datetime("2005-06-09T22:39:37"), "in-response-to": 435, "sender-location":point("42.46,75.84"), "tags":{{"samsung", "shortcut-menu" }}, "message":" love samsung its shortcut-menu is good:)"}
-{"message-id": 31, "author-id": 2, "timestamp":datetime("2013-12-07T12:08:57"), "in-response-to": 3089, "sender-location":point("24.89,89.17"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" dislike t-mobile the shortcut-menu is OMG"}
-{"message-id": 32, "author-id": 2, "timestamp":datetime("2008-06-07T00:34:47"), "in-response-to": 3218, "sender-location":point("43.71,92.88"), "tags":{{"at&t", "shortcut-menu" }}, "message":" like at&t its shortcut-menu is good:)"}
-{"message-id": 33, "author-id": 2, "timestamp":datetime("2011-10-19T13:46:03"), "in-response-to": 1855, "sender-location":point("38.9,94.85"), "tags":{{"samsung", "speed" }}, "message":" can't stand samsung the speed is horrible"}
-{"message-id": 34, "author-id": 2, "timestamp":datetime("2006-05-12T15:15:28"), "in-response-to": 1572, "sender-location":point("47.33,68.25"), "tags":{{"t-mobile", "reachability" }}, "message":" like t-mobile its reachability is good:)"}
-{"message-id": 35, "author-id": 2, "timestamp":datetime("2009-05-06T20:30:54"), "in-response-to": 191, "sender-location":point("33.87,79.95"), "tags":{{"verizon", "customization" }}, "message":" hate verizon its customization is horrible"}
-{"message-id": 36, "author-id": 2, "timestamp":datetime("2012-12-10T22:55:22"), "in-response-to": 3009, "sender-location":point("43.02,74.2"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile the plan is good"}
-{"message-id": 37, "author-id": 2, "timestamp":datetime("2007-08-25T16:18:52"), "in-response-to": 2100, "sender-location":point("42.56,78.63"), "tags":{{"sprint", "voice-command" }}, "message":" can't stand sprint the voice-command is bad"}
-{"message-id": 38, "author-id": 2, "timestamp":datetime("2013-02-25T10:20:51"), "in-response-to": 1239, "sender-location":point("37.2,71.82"), "tags":{{"iphone", "voice-command" }}, "message":" like iphone the voice-command is amazing:)"}
-{"message-id": 39, "author-id": 2, "timestamp":datetime("2007-03-10T23:11:44"), "in-response-to": 3176, "sender-location":point("29.28,80.84"), "tags":{{"sprint", "signal" }}, "message":" like sprint the signal is mind-blowing:)"}
-{"message-id": 40, "author-id": 2, "timestamp":datetime("2009-01-09T06:55:02"), "in-response-to": 808, "sender-location":point("36.71,90.6"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola its shortcut-menu is horrible:("}
-{"message-id": 41, "author-id": 2, "timestamp":datetime("2013-05-01T17:28:05"), "in-response-to": 1469, "sender-location":point("25.06,72.91"), "tags":{{"iphone", "customization" }}, "message":" hate iphone the customization is horrible:("}
-{"message-id": 42, "author-id": 2, "timestamp":datetime("2008-03-18T16:28:35"), "in-response-to": 2600, "sender-location":point("37.27,67.58"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola its voice-command is awesome:)"}
-{"message-id": 43, "author-id": 2, "timestamp":datetime("2006-06-08T23:02:11"), "in-response-to": 1102, "sender-location":point("24.3,78.27"), "tags":{{"samsung", "wireless" }}, "message":" like samsung the wireless is awesome"}
-{"message-id": 44, "author-id": 2, "timestamp":datetime("2007-11-17T22:07:41"), "in-response-to": 411, "sender-location":point("44.28,83.01"), "tags":{{"at&t", "reachability" }}, "message":" dislike at&t the reachability is OMG:("}
-{"message-id": 45, "author-id": 2, "timestamp":datetime("2014-03-09T11:35:28"), "in-response-to": 1060, "sender-location":point("29.38,82.39"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile its shortcut-menu is amazing"}
-{"message-id": 46, "author-id": 2, "timestamp":datetime("2006-10-24T17:16:20"), "in-response-to": 2587, "sender-location":point("26.68,77.31"), "tags":{{"at&t", "network" }}, "message":" hate at&t its network is OMG"}
-{"message-id": 47, "author-id": 2, "timestamp":datetime("2010-09-13T04:14:16"), "in-response-to": 2583, "sender-location":point("24.95,78.81"), "tags":{{"sprint", "touch-screen" }}, "message":" dislike sprint its touch-screen is OMG:("}
-{"message-id": 48, "author-id": 2, "timestamp":datetime("2010-01-04T20:08:17"), "in-response-to": 3051, "sender-location":point("42.28,93.32"), "tags":{{"at&t", "shortcut-menu" }}, "message":" can't stand at&t its shortcut-menu is OMG:("}
-{"message-id": 49, "author-id": 3, "timestamp":datetime("2009-10-23T08:19:26"), "in-response-to": 2119, "sender-location":point("36.07,86.23"), "tags":{{"sprint", "3G" }}, "message":" hate sprint the 3G is horrible:("}
-{"message-id": 50, "author-id": 3, "timestamp":datetime("2006-06-15T13:03:35"), "in-response-to": 1528, "sender-location":point("24.13,87.0"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola the voice-command is mind-blowing:)"}
-{"message-id": 51, "author-id": 3, "timestamp":datetime("2011-03-01T08:26:45"), "in-response-to": 836, "sender-location":point("35.1,77.77"), "tags":{{"sprint", "voicemail-service" }}, "message":" love sprint the voicemail-service is awesome"}
-{"message-id": 52, "author-id": 3, "timestamp":datetime("2013-07-15T21:44:48"), "in-response-to": 1042, "sender-location":point("28.62,73.25"), "tags":{{"t-mobile", "voice-command" }}, "message":" dislike t-mobile the voice-command is bad"}
-{"message-id": 53, "author-id": 3, "timestamp":datetime("2005-07-28T04:25:44"), "in-response-to": 1339, "sender-location":point("42.51,72.12"), "tags":{{"at&t", "wireless" }}, "message":" love at&t the wireless is amazing"}
-{"message-id": 54, "author-id": 3, "timestamp":datetime("2006-04-24T05:33:40"), "in-response-to": 1474, "sender-location":point("28.72,94.63"), "tags":{{"verizon", "voice-clarity" }}, "message":" hate verizon the voice-clarity is horrible:("}
-{"message-id": 55, "author-id": 3, "timestamp":datetime("2013-01-12T13:10:40"), "in-response-to": 125, "sender-location":point("35.14,67.35"), "tags":{{"motorola", "reachability" }}, "message":" can't stand motorola the reachability is horrible:("}
-{"message-id": 56, "author-id": 3, "timestamp":datetime("2010-12-05T09:34:32"), "in-response-to": 2873, "sender-location":point("25.76,92.16"), "tags":{{"at&t", "reachability" }}, "message":" hate at&t the reachability is bad"}
-{"message-id": 57, "author-id": 3, "timestamp":datetime("2010-06-17T12:01:16"), "in-response-to": 1261, "sender-location":point("29.36,94.85"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint the reachability is terrible"}
-{"message-id": 58, "author-id": 3, "timestamp":datetime("2009-11-06T14:12:13"), "in-response-to": 1993, "sender-location":point("48.73,78.43"), "tags":{{"samsung", "customer-service" }}, "message":" love samsung the customer-service is amazing"}
-{"message-id": 59, "author-id": 3, "timestamp":datetime("2011-12-19T15:48:37"), "in-response-to": 2738, "sender-location":point("31.72,95.12"), "tags":{{"sprint", "shortcut-menu" }}, "message":" love sprint its shortcut-menu is awesome:)"}
-{"message-id": 60, "author-id": 3, "timestamp":datetime("2014-04-06T05:09:01"), "in-response-to": 1800, "sender-location":point("25.04,94.27"), "tags":{{"at&t", "voicemail-service" }}, "message":" hate at&t the voicemail-service is bad:("}
-{"message-id": 61, "author-id": 3, "timestamp":datetime("2006-01-21T09:28:12"), "in-response-to": 2410, "sender-location":point("26.94,76.17"), "tags":{{"motorola", "network" }}, "message":" hate motorola its network is terrible"}
-{"message-id": 62, "author-id": 3, "timestamp":datetime("2008-02-02T16:41:01"), "in-response-to": 2748, "sender-location":point("34.97,76.62"), "tags":{{"t-mobile", "signal" }}, "message":" love t-mobile the signal is mind-blowing"}
-{"message-id": 63, "author-id": 3, "timestamp":datetime("2005-01-23T12:14:50"), "in-response-to": 1602, "sender-location":point("47.43,80.23"), "tags":{{"motorola", "customer-service" }}, "message":" like motorola its customer-service is good"}
-{"message-id": 64, "author-id": 3, "timestamp":datetime("2012-06-06T03:37:09"), "in-response-to": 1500, "sender-location":point("29.18,79.0"), "tags":{{"samsung", "platform" }}, "message":" like samsung its platform is amazing:)"}
-{"message-id": 65, "author-id": 4, "timestamp":datetime("2006-01-09T01:49:33"), "in-response-to": 323, "sender-location":point("31.78,95.63"), "tags":{{"at&t", "voice-clarity" }}, "message":" hate at&t the voice-clarity is horrible:("}
-{"message-id": 66, "author-id": 4, "timestamp":datetime("2012-12-17T14:51:17"), "in-response-to": 2686, "sender-location":point("29.76,74.35"), "tags":{{"motorola", "speed" }}, "message":" can't stand motorola the speed is bad"}
-{"message-id": 67, "author-id": 4, "timestamp":datetime("2013-05-05T09:57:45"), "in-response-to": 2244, "sender-location":point("40.27,76.34"), "tags":{{"verizon", "3G" }}, "message":" dislike verizon its 3G is OMG:("}
-{"message-id": 68, "author-id": 4, "timestamp":datetime("2005-07-21T18:42:06"), "in-response-to": 1400, "sender-location":point("28.74,80.58"), "tags":{{"verizon", "reachability" }}, "message":" can't stand verizon the reachability is terrible"}
-{"message-id": 69, "author-id": 4, "timestamp":datetime("2008-03-10T21:02:37"), "in-response-to": 2652, "sender-location":point("31.75,95.08"), "tags":{{"motorola", "network" }}, "message":" like motorola its network is good:)"}
-{"message-id": 70, "author-id": 4, "timestamp":datetime("2010-09-06T14:06:57"), "in-response-to": 72, "sender-location":point("31.0,71.65"), "tags":{{"sprint", "touch-screen" }}, "message":" like sprint its touch-screen is awesome"}
-{"message-id": 71, "author-id": 4, "timestamp":datetime("2008-12-07T14:41:23"), "in-response-to": 2921, "sender-location":point("46.77,74.84"), "tags":{{"samsung", "signal" }}, "message":" like samsung its signal is awesome:)"}
-{"message-id": 72, "author-id": 4, "timestamp":datetime("2009-10-14T19:49:56"), "in-response-to": 1064, "sender-location":point("40.61,92.04"), "tags":{{"samsung", "network" }}, "message":" hate samsung its network is terrible:("}
-{"message-id": 73, "author-id": 4, "timestamp":datetime("2012-11-12T14:29:58"), "in-response-to": 2831, "sender-location":point("29.0,78.15"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola the voice-command is good:)"}
-{"message-id": 74, "author-id": 4, "timestamp":datetime("2009-03-13T17:37:23"), "in-response-to": 184, "sender-location":point("27.22,91.17"), "tags":{{"iphone", "signal" }}, "message":" hate iphone the signal is bad:("}
-{"message-id": 75, "author-id": 4, "timestamp":datetime("2011-09-15T10:23:16"), "in-response-to": 1249, "sender-location":point("41.67,82.92"), "tags":{{"sprint", "reachability" }}, "message":" love sprint its reachability is mind-blowing:)"}
-{"message-id": 76, "author-id": 4, "timestamp":datetime("2010-06-14T18:49:01"), "in-response-to": 256, "sender-location":point("24.2,78.0"), "tags":{{"sprint", "shortcut-menu" }}, "message":" love sprint its shortcut-menu is mind-blowing"}
-{"message-id": 77, "author-id": 4, "timestamp":datetime("2006-10-01T19:03:56"), "in-response-to": 643, "sender-location":point("41.95,73.19"), "tags":{{"samsung", "network" }}, "message":" love samsung its network is good"}
-{"message-id": 78, "author-id": 4, "timestamp":datetime("2005-08-16T05:19:29"), "in-response-to": 1472, "sender-location":point("28.83,73.22"), "tags":{{"iphone", "speed" }}, "message":" like iphone the speed is good"}
-{"message-id": 79, "author-id": 5, "timestamp":datetime("2008-08-08T13:09:40"), "in-response-to": 1340, "sender-location":point("38.97,89.11"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint the reachability is bad:("}
-{"message-id": 80, "author-id": 5, "timestamp":datetime("2011-02-08T12:56:36"), "in-response-to": 3139, "sender-location":point("37.95,82.29"), "tags":{{"t-mobile", "3G" }}, "message":" dislike t-mobile the 3G is horrible:("}
-{"message-id": 81, "author-id": 5, "timestamp":datetime("2007-10-11T20:59:56"), "in-response-to": 1241, "sender-location":point("37.55,93.53"), "tags":{{"samsung", "speed" }}, "message":" hate samsung the speed is terrible:("}
-{"message-id": 82, "author-id": 5, "timestamp":datetime("2005-09-25T00:21:02"), "in-response-to": 2310, "sender-location":point("47.39,68.63"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" can't stand t-mobile the voice-clarity is OMG:("}
-{"message-id": 83, "author-id": 5, "timestamp":datetime("2014-04-17T22:31:34"), "in-response-to": 163, "sender-location":point("30.85,96.21"), "tags":{{"at&t", "touch-screen" }}, "message":" love at&t the touch-screen is awesome"}
-{"message-id": 84, "author-id": 5, "timestamp":datetime("2008-04-25T11:43:18"), "in-response-to": 1505, "sender-location":point("26.74,95.12"), "tags":{{"samsung", "signal" }}, "message":" like samsung the signal is good"}
-{"message-id": 85, "author-id": 5, "timestamp":datetime("2005-06-05T22:43:04"), "in-response-to": 715, "sender-location":point("24.26,66.66"), "tags":{{"motorola", "speed" }}, "message":" like motorola its speed is good"}
-{"message-id": 86, "author-id": 5, "timestamp":datetime("2014-04-15T20:46:02"), "in-response-to": 1186, "sender-location":point("25.59,84.43"), "tags":{{"at&t", "reachability" }}, "message":" can't stand at&t its reachability is OMG:("}
-{"message-id": 87, "author-id": 5, "timestamp":datetime("2007-01-01T23:39:53"), "in-response-to": 237, "sender-location":point("47.53,85.28"), "tags":{{"t-mobile", "customer-service" }}, "message":" like t-mobile the customer-service is mind-blowing:)"}
-{"message-id": 88, "author-id": 5, "timestamp":datetime("2007-09-09T19:49:22"), "in-response-to": 1379, "sender-location":point("43.78,78.85"), "tags":{{"sprint", "reachability" }}, "message":" dislike sprint the reachability is OMG:("}
-{"message-id": 89, "author-id": 5, "timestamp":datetime("2014-02-10T01:35:59"), "in-response-to": 1685, "sender-location":point("34.7,94.27"), "tags":{{"verizon", "network" }}, "message":" like verizon its network is good:)"}
-{"message-id": 90, "author-id": 5, "timestamp":datetime("2007-01-06T17:22:46"), "in-response-to": 1880, "sender-location":point("46.99,81.55"), "tags":{{"motorola", "customization" }}, "message":" can't stand motorola its customization is horrible:("}
-{"message-id": 91, "author-id": 6, "timestamp":datetime("2012-10-11T19:50:57"), "in-response-to": 953, "sender-location":point("45.44,86.22"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile its plan is amazing"}
-{"message-id": 92, "author-id": 6, "timestamp":datetime("2010-05-07T11:44:53"), "in-response-to": 1674, "sender-location":point("41.36,84.79"), "tags":{{"at&t", "voice-command" }}, "message":" hate at&t the voice-command is horrible:("}
-{"message-id": 93, "author-id": 6, "timestamp":datetime("2010-11-01T07:54:46"), "in-response-to": 237, "sender-location":point("40.62,90.78"), "tags":{{"iphone", "network" }}, "message":" love iphone the network is mind-blowing"}
-{"message-id": 94, "author-id": 6, "timestamp":datetime("2013-10-26T15:08:00"), "in-response-to": 288, "sender-location":point("27.56,71.19"), "tags":{{"iphone", "voicemail-service" }}, "message":" can't stand iphone the voicemail-service is terrible:("}
-{"message-id": 95, "author-id": 6, "timestamp":datetime("2008-11-14T10:23:24"), "in-response-to": 2261, "sender-location":point("37.92,85.35"), "tags":{{"at&t", "touch-screen" }}, "message":" like at&t its touch-screen is good:)"}
-{"message-id": 96, "author-id": 6, "timestamp":datetime("2013-05-26T21:58:48"), "in-response-to": 280, "sender-location":point("39.87,80.62"), "tags":{{"t-mobile", "customization" }}, "message":" like t-mobile the customization is awesome"}
-{"message-id": 97, "author-id": 6, "timestamp":datetime("2005-07-01T04:06:00"), "in-response-to": 462, "sender-location":point("27.53,67.47"), "tags":{{"sprint", "platform" }}, "message":" love sprint its platform is awesome:)"}
-{"message-id": 98, "author-id": 6, "timestamp":datetime("2014-02-12T22:48:46"), "in-response-to": 996, "sender-location":point("36.86,91.88"), "tags":{{"iphone", "voicemail-service" }}, "message":" can't stand iphone the voicemail-service is bad"}
-{"message-id": 99, "author-id": 6, "timestamp":datetime("2013-10-05T11:15:27"), "in-response-to": 3164, "sender-location":point("27.61,71.67"), "tags":{{"iphone", "signal" }}, "message":" can't stand iphone its signal is OMG:("}
-{"message-id": 100, "author-id": 6, "timestamp":datetime("2012-07-24T09:54:47"), "in-response-to": 365, "sender-location":point("42.22,90.19"), "tags":{{"samsung", "wireless" }}, "message":" love samsung its wireless is mind-blowing"}
-{"message-id": 101, "author-id": 6, "timestamp":datetime("2005-07-09T00:56:29"), "in-response-to": 2184, "sender-location":point("42.77,78.23"), "tags":{{"samsung", "customer-service" }}, "message":" hate samsung its customer-service is horrible:("}
-{"message-id": 102, "author-id": 7, "timestamp":datetime("2005-11-21T09:32:30"), "in-response-to": 3226, "sender-location":point("27.37,80.74"), "tags":{{"motorola", "customization" }}, "message":" dislike motorola its customization is OMG"}
-{"message-id": 103, "author-id": 7, "timestamp":datetime("2008-05-10T03:25:13"), "in-response-to": 980, "sender-location":point("40.35,91.67"), "tags":{{"iphone", "speed" }}, "message":" hate iphone its speed is bad:("}
-{"message-id": 104, "author-id": 7, "timestamp":datetime("2010-04-25T19:49:11"), "in-response-to": 3065, "sender-location":point("46.22,85.23"), "tags":{{"sprint", "wireless" }}, "message":" can't stand sprint its wireless is bad"}
-{"message-id": 105, "author-id": 7, "timestamp":datetime("2012-07-07T17:18:28"), "in-response-to": 366, "sender-location":point("43.61,92.37"), "tags":{{"iphone", "wireless" }}, "message":" like iphone the wireless is awesome"}
-{"message-id": 106, "author-id": 7, "timestamp":datetime("2009-10-07T10:23:13"), "in-response-to": 523, "sender-location":point("34.0,95.86"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon its voicemail-service is good:)"}
-{"message-id": 107, "author-id": 7, "timestamp":datetime("2006-05-13T10:12:26"), "in-response-to": 1651, "sender-location":point("30.35,88.76"), "tags":{{"at&t", "shortcut-menu" }}, "message":" hate at&t its shortcut-menu is terrible"}
-{"message-id": 108, "author-id": 7, "timestamp":datetime("2012-02-09T08:03:39"), "in-response-to": 3190, "sender-location":point("37.51,70.13"), "tags":{{"samsung", "plan" }}, "message":" dislike samsung the plan is horrible"}
-{"message-id": 109, "author-id": 7, "timestamp":datetime("2006-05-12T01:04:32"), "in-response-to": 792, "sender-location":point("38.47,94.64"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" hate t-mobile its voicemail-service is OMG:("}
-{"message-id": 110, "author-id": 7, "timestamp":datetime("2013-02-16T14:24:58"), "in-response-to": 562, "sender-location":point("33.04,82.44"), "tags":{{"sprint", "wireless" }}, "message":" hate sprint the wireless is OMG:("}
-{"message-id": 111, "author-id": 7, "timestamp":datetime("2010-02-22T06:39:27"), "in-response-to": 989, "sender-location":point("24.33,84.21"), "tags":{{"verizon", "network" }}, "message":" love verizon the network is good"}
-{"message-id": 112, "author-id": 8, "timestamp":datetime("2007-04-25T21:41:54"), "in-response-to": 1041, "sender-location":point("44.55,92.36"), "tags":{{"t-mobile", "wireless" }}, "message":" hate t-mobile its wireless is horrible"}
-{"message-id": 113, "author-id": 8, "timestamp":datetime("2011-10-05T00:24:52"), "in-response-to": 1681, "sender-location":point("37.17,84.43"), "tags":{{"t-mobile", "customer-service" }}, "message":" love t-mobile its customer-service is awesome:)"}
-{"message-id": 114, "author-id": 8, "timestamp":datetime("2008-08-03T18:35:05"), "in-response-to": 1899, "sender-location":point("43.44,88.9"), "tags":{{"iphone", "customization" }}, "message":" like iphone its customization is awesome"}
-{"message-id": 115, "author-id": 8, "timestamp":datetime("2011-06-13T21:03:51"), "in-response-to": 1537, "sender-location":point("35.82,70.92"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola its platform is horrible"}
-{"message-id": 116, "author-id": 8, "timestamp":datetime("2007-04-03T11:14:40"), "in-response-to": 1006, "sender-location":point("25.65,88.14"), "tags":{{"t-mobile", "plan" }}, "message":" can't stand t-mobile the plan is terrible:("}
-{"message-id": 117, "author-id": 8, "timestamp":datetime("2007-06-13T11:13:36"), "in-response-to": 1261, "sender-location":point("27.19,72.59"), "tags":{{"at&t", "reachability" }}, "message":" like at&t the reachability is awesome"}
-{"message-id": 118, "author-id": 8, "timestamp":datetime("2010-07-25T18:44:45"), "in-response-to": 1991, "sender-location":point("45.68,89.25"), "tags":{{"t-mobile", "voice-command" }}, "message":" can't stand t-mobile its voice-command is terrible:("}
-{"message-id": 119, "author-id": 8, "timestamp":datetime("2007-08-14T14:17:10"), "in-response-to": 677, "sender-location":point("35.67,96.08"), "tags":{{"motorola", "network" }}, "message":" hate motorola the network is OMG:("}
-{"message-id": 120, "author-id": 8, "timestamp":datetime("2007-06-26T14:37:42"), "in-response-to": 2539, "sender-location":point("25.14,94.42"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" love t-mobile the voice-clarity is amazing"}
-{"message-id": 121, "author-id": 8, "timestamp":datetime("2009-05-06T21:10:11"), "in-response-to": 437, "sender-location":point("39.7,69.23"), "tags":{{"t-mobile", "voice-command" }}, "message":" like t-mobile its voice-command is amazing:)"}
-{"message-id": 122, "author-id": 9, "timestamp":datetime("2011-05-09T00:27:25"), "in-response-to": 1833, "sender-location":point("47.56,92.9"), "tags":{{"t-mobile", "plan" }}, "message":" can't stand t-mobile the plan is terrible:("}
-{"message-id": 123, "author-id": 9, "timestamp":datetime("2010-11-25T00:41:48"), "in-response-to": 2096, "sender-location":point("34.31,72.24"), "tags":{{"samsung", "customer-service" }}, "message":" like samsung its customer-service is amazing:)"}
-{"message-id": 124, "author-id": 9, "timestamp":datetime("2012-03-25T06:33:32"), "in-response-to": 1442, "sender-location":point("38.14,73.09"), "tags":{{"t-mobile", "platform" }}, "message":" dislike t-mobile the platform is bad:("}
-{"message-id": 125, "author-id": 9, "timestamp":datetime("2005-04-03T10:50:50"), "in-response-to": 2253, "sender-location":point("42.09,70.45"), "tags":{{"t-mobile", "3G" }}, "message":" hate t-mobile its 3G is horrible:("}
-{"message-id": 126, "author-id": 9, "timestamp":datetime("2008-06-25T01:28:22"), "in-response-to": 563, "sender-location":point("38.52,89.18"), "tags":{{"motorola", "customer-service" }}, "message":" can't stand motorola the customer-service is terrible:("}
-{"message-id": 127, "author-id": 9, "timestamp":datetime("2014-03-26T07:46:45"), "in-response-to": 1666, "sender-location":point("42.08,91.13"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon the shortcut-menu is good:)"}
-{"message-id": 128, "author-id": 9, "timestamp":datetime("2014-02-01T08:44:33"), "in-response-to": 263, "sender-location":point("32.43,72.51"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint its reachability is horrible:("}
-{"message-id": 129, "author-id": 9, "timestamp":datetime("2013-06-11T14:57:13"), "in-response-to": 1296, "sender-location":point("29.99,82.29"), "tags":{{"samsung", "shortcut-menu" }}, "message":" hate samsung its shortcut-menu is OMG:("}
-{"message-id": 130, "author-id": 9, "timestamp":datetime("2006-06-20T16:16:17"), "in-response-to": 1171, "sender-location":point("40.78,85.12"), "tags":{{"iphone", "plan" }}, "message":" dislike iphone the plan is horrible"}
-{"message-id": 131, "author-id": 10, "timestamp":datetime("2013-01-09T07:01:46"), "in-response-to": 288, "sender-location":point("24.09,82.75"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile the wireless is good:)"}
-{"message-id": 132, "author-id": 10, "timestamp":datetime("2011-12-03T19:04:06"), "in-response-to": 2569, "sender-location":point("44.15,81.22"), "tags":{{"iphone", "plan" }}, "message":" hate iphone its plan is bad:("}
-{"message-id": 133, "author-id": 10, "timestamp":datetime("2014-01-23T13:41:52"), "in-response-to": 1138, "sender-location":point("36.9,90.01"), "tags":{{"verizon", "voice-command" }}, "message":" can't stand verizon the voice-command is horrible:("}
-{"message-id": 134, "author-id": 10, "timestamp":datetime("2013-07-02T12:39:09"), "in-response-to": 2489, "sender-location":point("33.77,79.74"), "tags":{{"sprint", "network" }}, "message":" like sprint the network is mind-blowing:)"}
-{"message-id": 135, "author-id": 10, "timestamp":datetime("2009-08-11T16:35:59"), "in-response-to": 347, "sender-location":point("46.32,88.84"), "tags":{{"iphone", "voice-command" }}, "message":" like iphone its voice-command is mind-blowing"}
-{"message-id": 136, "author-id": 10, "timestamp":datetime("2006-04-15T08:35:22"), "in-response-to": 2617, "sender-location":point("42.98,68.89"), "tags":{{"samsung", "signal" }}, "message":" love samsung its signal is good:)"}
-{"message-id": 137, "author-id": 10, "timestamp":datetime("2012-02-28T12:11:29"), "in-response-to": 896, "sender-location":point("41.32,87.87"), "tags":{{"t-mobile", "reachability" }}, "message":" dislike t-mobile its reachability is terrible"}
-{"message-id": 138, "author-id": 10, "timestamp":datetime("2012-11-07T22:15:25"), "in-response-to": 2229, "sender-location":point("39.6,85.66"), "tags":{{"iphone", "plan" }}, "message":" like iphone the plan is good:)"}
-{"message-id": 139, "author-id": 10, "timestamp":datetime("2014-04-03T13:27:40"), "in-response-to": 1352, "sender-location":point("28.97,97.46"), "tags":{{"samsung", "platform" }}, "message":" love samsung the platform is awesome"}
-{"message-id": 140, "author-id": 11, "timestamp":datetime("2014-05-06T01:08:42"), "in-response-to": 360, "sender-location":point("24.29,66.25"), "tags":{{"t-mobile", "touch-screen" }}, "message":" can't stand t-mobile its touch-screen is terrible:("}
-{"message-id": 141, "author-id": 11, "timestamp":datetime("2014-03-01T08:11:19"), "in-response-to": 36, "sender-location":point("47.17,82.13"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone its voice-clarity is good:)"}
-{"message-id": 142, "author-id": 11, "timestamp":datetime("2011-03-10T22:00:27"), "in-response-to": 248, "sender-location":point("48.04,74.45"), "tags":{{"at&t", "shortcut-menu" }}, "message":" love at&t the shortcut-menu is amazing:)"}
-{"message-id": 143, "author-id": 11, "timestamp":datetime("2014-03-03T16:41:09"), "in-response-to": 2088, "sender-location":point("44.72,97.24"), "tags":{{"iphone", "customization" }}, "message":" like iphone the customization is amazing:)"}
-{"message-id": 144, "author-id": 11, "timestamp":datetime("2013-08-20T20:37:46"), "in-response-to": 2568, "sender-location":point("42.18,78.38"), "tags":{{"iphone", "customer-service" }}, "message":" dislike iphone its customer-service is bad"}
-{"message-id": 145, "author-id": 11, "timestamp":datetime("2014-04-25T16:01:21"), "in-response-to": 2622, "sender-location":point("31.9,88.62"), "tags":{{"iphone", "voicemail-service" }}, "message":" like iphone the voicemail-service is good"}
-{"message-id": 146, "author-id": 11, "timestamp":datetime("2011-05-04T15:00:07"), "in-response-to": 2424, "sender-location":point("37.08,82.62"), "tags":{{"iphone", "3G" }}, "message":" love iphone its 3G is good"}
-{"message-id": 147, "author-id": 11, "timestamp":datetime("2005-05-01T01:03:10"), "in-response-to": 2345, "sender-location":point("30.78,92.37"), "tags":{{"samsung", "3G" }}, "message":" love samsung its 3G is awesome:)"}
-{"message-id": 148, "author-id": 12, "timestamp":datetime("2012-11-03T07:59:42"), "in-response-to": 700, "sender-location":point("44.98,83.31"), "tags":{{"sprint", "network" }}, "message":" dislike sprint its network is horrible"}
-{"message-id": 149, "author-id": 12, "timestamp":datetime("2006-03-27T07:17:05"), "in-response-to": 3240, "sender-location":point("33.3,94.66"), "tags":{{"t-mobile", "wireless" }}, "message":" can't stand t-mobile the wireless is bad"}
-{"message-id": 150, "author-id": 12, "timestamp":datetime("2011-11-08T09:42:45"), "in-response-to": 754, "sender-location":point("42.71,92.39"), "tags":{{"verizon", "touch-screen" }}, "message":" love verizon its touch-screen is good:)"}
-{"message-id": 151, "author-id": 12, "timestamp":datetime("2011-07-04T15:42:15"), "in-response-to": 96, "sender-location":point("32.68,66.74"), "tags":{{"iphone", "touch-screen" }}, "message":" dislike iphone the touch-screen is horrible"}
-{"message-id": 152, "author-id": 12, "timestamp":datetime("2005-12-08T01:30:14"), "in-response-to": 2372, "sender-location":point("34.97,83.72"), "tags":{{"samsung", "network" }}, "message":" hate samsung the network is OMG:("}
-{"message-id": 153, "author-id": 12, "timestamp":datetime("2006-06-02T22:13:01"), "in-response-to": 697, "sender-location":point("34.44,78.13"), "tags":{{"at&t", "customization" }}, "message":" love at&t the customization is good:)"}
-{"message-id": 154, "author-id": 12, "timestamp":datetime("2005-01-06T22:57:44"), "in-response-to": 1660, "sender-location":point("26.59,90.99"), "tags":{{"at&t", "customization" }}, "message":" dislike at&t the customization is terrible"}
-{"message-id": 155, "author-id": 12, "timestamp":datetime("2006-05-05T08:23:02"), "in-response-to": 989, "sender-location":point("26.4,97.95"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t the voicemail-service is awesome:)"}
-{"message-id": 156, "author-id": 13, "timestamp":datetime("2011-04-20T21:36:36"), "in-response-to": 549, "sender-location":point("36.23,90.98"), "tags":{{"t-mobile", "speed" }}, "message":" like t-mobile the speed is awesome"}
-{"message-id": 157, "author-id": 13, "timestamp":datetime("2013-07-19T13:22:23"), "in-response-to": 3135, "sender-location":point("44.5,96.23"), "tags":{{"iphone", "shortcut-menu" }}, "message":" can't stand iphone the shortcut-menu is terrible"}
-{"message-id": 158, "author-id": 13, "timestamp":datetime("2006-10-06T06:33:27"), "in-response-to": 1125, "sender-location":point("48.99,82.24"), "tags":{{"at&t", "3G" }}, "message":" like at&t the 3G is good:)"}
-{"message-id": 159, "author-id": 13, "timestamp":datetime("2006-01-25T15:39:31"), "in-response-to": 788, "sender-location":point("24.38,88.86"), "tags":{{"sprint", "voice-clarity" }}, "message":" like sprint the voice-clarity is good"}
-{"message-id": 160, "author-id": 13, "timestamp":datetime("2014-06-02T00:17:39"), "in-response-to": 2307, "sender-location":point("28.05,92.06"), "tags":{{"motorola", "voice-command" }}, "message":" love motorola its voice-command is awesome:)"}
-{"message-id": 161, "author-id": 13, "timestamp":datetime("2011-01-14T01:48:43"), "in-response-to": 2075, "sender-location":point("32.19,81.86"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung its voice-clarity is OMG:("}
-{"message-id": 162, "author-id": 13, "timestamp":datetime("2013-05-22T01:25:32"), "in-response-to": 2003, "sender-location":point("25.69,74.54"), "tags":{{"verizon", "touch-screen" }}, "message":" hate verizon the touch-screen is bad"}
-{"message-id": 163, "author-id": 13, "timestamp":datetime("2013-11-25T19:04:12"), "in-response-to": 1493, "sender-location":point("27.52,76.93"), "tags":{{"samsung", "customer-service" }}, "message":" love samsung its customer-service is mind-blowing:)"}
-{"message-id": 164, "author-id": 14, "timestamp":datetime("2006-12-14T10:41:54"), "in-response-to": 2417, "sender-location":point("24.44,68.6"), "tags":{{"verizon", "platform" }}, "message":" hate verizon its platform is OMG:("}
-{"message-id": 165, "author-id": 14, "timestamp":datetime("2014-04-08T06:56:58"), "in-response-to": 1288, "sender-location":point("42.52,76.41"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone its voice-clarity is awesome:)"}
-{"message-id": 166, "author-id": 14, "timestamp":datetime("2012-04-09T12:30:44"), "in-response-to": 2800, "sender-location":point("28.68,86.32"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" hate t-mobile the voice-clarity is horrible:("}
-{"message-id": 167, "author-id": 14, "timestamp":datetime("2013-12-23T22:49:59"), "in-response-to": 1390, "sender-location":point("34.84,82.43"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile its plan is amazing"}
-{"message-id": 168, "author-id": 14, "timestamp":datetime("2008-11-03T22:57:15"), "in-response-to": 2717, "sender-location":point("38.32,97.97"), "tags":{{"at&t", "customer-service" }}, "message":" can't stand at&t its customer-service is terrible:("}
-{"message-id": 169, "author-id": 14, "timestamp":datetime("2013-02-28T01:20:35"), "in-response-to": 2149, "sender-location":point("29.86,66.26"), "tags":{{"verizon", "customer-service" }}, "message":" dislike verizon the customer-service is bad:("}
-{"message-id": 170, "author-id": 14, "timestamp":datetime("2009-03-04T08:01:06"), "in-response-to": 2606, "sender-location":point("39.06,95.53"), "tags":{{"verizon", "plan" }}, "message":" can't stand verizon the plan is terrible"}
-{"message-id": 171, "author-id": 15, "timestamp":datetime("2013-10-11T17:33:04"), "in-response-to": 1961, "sender-location":point("45.57,97.31"), "tags":{{"motorola", "touch-screen" }}, "message":" dislike motorola its touch-screen is bad"}
-{"message-id": 172, "author-id": 15, "timestamp":datetime("2005-06-27T00:37:40"), "in-response-to": 2519, "sender-location":point("28.92,88.75"), "tags":{{"motorola", "signal" }}, "message":" like motorola the signal is mind-blowing"}
-{"message-id": 173, "author-id": 15, "timestamp":datetime("2008-08-10T13:36:03"), "in-response-to": 2320, "sender-location":point("29.33,97.36"), "tags":{{"verizon", "plan" }}, "message":" love verizon the plan is awesome:)"}
-{"message-id": 174, "author-id": 15, "timestamp":datetime("2011-12-21T07:41:34"), "in-response-to": 2441, "sender-location":point("33.3,80.27"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola the voicemail-service is amazing"}
-{"message-id": 175, "author-id": 15, "timestamp":datetime("2012-09-11T15:01:07"), "in-response-to": 3187, "sender-location":point("28.3,85.7"), "tags":{{"iphone", "3G" }}, "message":" dislike iphone the 3G is OMG"}
-{"message-id": 176, "author-id": 15, "timestamp":datetime("2007-05-06T06:09:14"), "in-response-to": 1208, "sender-location":point("27.32,76.71"), "tags":{{"t-mobile", "customization" }}, "message":" hate t-mobile the customization is OMG"}
-{"message-id": 177, "author-id": 15, "timestamp":datetime("2006-05-28T13:24:43"), "in-response-to": 2955, "sender-location":point("25.17,71.73"), "tags":{{"at&t", "network" }}, "message":" hate at&t the network is terrible"}
-{"message-id": 178, "author-id": 16, "timestamp":datetime("2007-04-08T23:47:47"), "in-response-to": 332, "sender-location":point("34.1,80.9"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone the voice-clarity is bad:("}
-{"message-id": 179, "author-id": 16, "timestamp":datetime("2008-05-04T12:01:55"), "in-response-to": 2646, "sender-location":point("36.56,92.16"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is awesome"}
-{"message-id": 180, "author-id": 16, "timestamp":datetime("2010-01-01T12:39:58"), "in-response-to": 1000, "sender-location":point("39.21,76.57"), "tags":{{"sprint", "reachability" }}, "message":" hate sprint the reachability is bad:("}
-{"message-id": 181, "author-id": 16, "timestamp":datetime("2013-12-05T17:09:42"), "in-response-to": 2834, "sender-location":point("33.6,83.59"), "tags":{{"t-mobile", "signal" }}, "message":" dislike t-mobile the signal is terrible:("}
-{"message-id": 182, "author-id": 16, "timestamp":datetime("2009-07-26T01:22:38"), "in-response-to": 2821, "sender-location":point("27.93,86.14"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" like t-mobile its shortcut-menu is mind-blowing"}
-{"message-id": 183, "author-id": 16, "timestamp":datetime("2014-03-22T08:43:25"), "in-response-to": 2768, "sender-location":point("25.58,70.95"), "tags":{{"at&t", "touch-screen" }}, "message":" love at&t its touch-screen is awesome"}
-{"message-id": 184, "author-id": 16, "timestamp":datetime("2006-11-15T06:02:54"), "in-response-to": 3045, "sender-location":point("25.1,67.25"), "tags":{{"samsung", "voice-clarity" }}, "message":" like samsung the voice-clarity is mind-blowing:)"}
-{"message-id": 185, "author-id": 17, "timestamp":datetime("2009-02-20T15:09:48"), "in-response-to": 3171, "sender-location":point("40.21,85.1"), "tags":{{"t-mobile", "3G" }}, "message":" can't stand t-mobile the 3G is terrible"}
-{"message-id": 186, "author-id": 17, "timestamp":datetime("2014-04-05T09:47:04"), "in-response-to": 1943, "sender-location":point("39.77,90.23"), "tags":{{"verizon", "network" }}, "message":" dislike verizon the network is horrible"}
-{"message-id": 187, "author-id": 17, "timestamp":datetime("2014-01-17T04:36:14"), "in-response-to": 2014, "sender-location":point("33.76,88.49"), "tags":{{"verizon", "reachability" }}, "message":" dislike verizon its reachability is OMG"}
-{"message-id": 188, "author-id": 17, "timestamp":datetime("2008-06-26T06:33:56"), "in-response-to": 413, "sender-location":point("38.46,83.09"), "tags":{{"t-mobile", "reachability" }}, "message":" hate t-mobile its reachability is terrible"}
-{"message-id": 189, "author-id": 17, "timestamp":datetime("2008-12-26T15:14:04"), "in-response-to": 3167, "sender-location":point("30.5,83.91"), "tags":{{"at&t", "speed" }}, "message":" like at&t the speed is mind-blowing:)"}
-{"message-id": 190, "author-id": 17, "timestamp":datetime("2007-06-20T07:10:55"), "in-response-to": 2377, "sender-location":point("26.77,67.52"), "tags":{{"iphone", "platform" }}, "message":" like iphone the platform is amazing:)"}
-{"message-id": 191, "author-id": 17, "timestamp":datetime("2014-08-03T08:26:52"), "in-response-to": 2774, "sender-location":point("38.95,73.81"), "tags":{{"samsung", "wireless" }}, "message":" hate samsung the wireless is terrible:("}
-{"message-id": 192, "author-id": 18, "timestamp":datetime("2009-06-23T21:20:17"), "in-response-to": 543, "sender-location":point("42.98,94.4"), "tags":{{"samsung", "platform" }}, "message":" dislike samsung its platform is horrible"}
-{"message-id": 193, "author-id": 18, "timestamp":datetime("2010-03-16T06:14:18"), "in-response-to": 2665, "sender-location":point("41.93,72.74"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung the voice-clarity is horrible:("}
-{"message-id": 194, "author-id": 18, "timestamp":datetime("2012-08-10T19:21:24"), "in-response-to": 1281, "sender-location":point("45.31,88.34"), "tags":{{"verizon", "network" }}, "message":" hate verizon the network is bad"}
-{"message-id": 195, "author-id": 18, "timestamp":datetime("2012-07-25T19:42:27"), "in-response-to": 1772, "sender-location":point("48.93,66.5"), "tags":{{"verizon", "shortcut-menu" }}, "message":" hate verizon the shortcut-menu is OMG"}
-{"message-id": 196, "author-id": 18, "timestamp":datetime("2010-12-18T04:31:25"), "in-response-to": 1862, "sender-location":point("28.58,92.44"), "tags":{{"verizon", "platform" }}, "message":" like verizon the platform is good"}
-{"message-id": 197, "author-id": 18, "timestamp":datetime("2010-02-10T10:32:16"), "in-response-to": 3026, "sender-location":point("42.42,91.92"), "tags":{{"motorola", "touch-screen" }}, "message":" love motorola the touch-screen is amazing"}
-{"message-id": 198, "author-id": 19, "timestamp":datetime("2005-05-28T07:22:54"), "in-response-to": 370, "sender-location":point("40.01,77.73"), "tags":{{"at&t", "reachability" }}, "message":" like at&t the reachability is awesome:)"}
-{"message-id": 199, "author-id": 19, "timestamp":datetime("2013-06-17T13:03:19"), "in-response-to": 687, "sender-location":point("48.7,89.85"), "tags":{{"iphone", "touch-screen" }}, "message":" like iphone its touch-screen is awesome:)"}
-{"message-id": 200, "author-id": 19, "timestamp":datetime("2009-09-21T10:53:36"), "in-response-to": 2801, "sender-location":point("44.6,78.39"), "tags":{{"sprint", "customer-service" }}, "message":" hate sprint the customer-service is OMG:("}
-{"message-id": 201, "author-id": 19, "timestamp":datetime("2008-09-26T10:23:11"), "in-response-to": 3066, "sender-location":point("46.98,66.44"), "tags":{{"iphone", "signal" }}, "message":" love iphone its signal is mind-blowing"}
-{"message-id": 202, "author-id": 19, "timestamp":datetime("2014-08-20T10:43:34"), "in-response-to": 1443, "sender-location":point("31.43,78.46"), "tags":{{"at&t", "voice-clarity" }}, "message":" can't stand at&t its voice-clarity is horrible:("}
-{"message-id": 203, "author-id": 19, "timestamp":datetime("2011-06-05T04:44:47"), "in-response-to": 2515, "sender-location":point("31.24,69.02"), "tags":{{"t-mobile", "platform" }}, "message":" can't stand t-mobile its platform is horrible"}
-{"message-id": 204, "author-id": 20, "timestamp":datetime("2010-10-28T07:45:46"), "in-response-to": 603, "sender-location":point("38.15,66.68"), "tags":{{"verizon", "network" }}, "message":" love verizon its network is amazing:)"}
-{"message-id": 205, "author-id": 20, "timestamp":datetime("2010-10-16T18:24:06"), "in-response-to": 2699, "sender-location":point("30.56,70.17"), "tags":{{"sprint", "reachability" }}, "message":" love sprint its reachability is awesome:)"}
-{"message-id": 206, "author-id": 20, "timestamp":datetime("2013-07-01T16:17:32"), "in-response-to": 404, "sender-location":point("28.47,76.57"), "tags":{{"t-mobile", "platform" }}, "message":" hate t-mobile its platform is terrible"}
-{"message-id": 207, "author-id": 20, "timestamp":datetime("2010-12-27T22:02:50"), "in-response-to": 2019, "sender-location":point("45.37,90.31"), "tags":{{"verizon", "platform" }}, "message":" like verizon its platform is awesome"}
-{"message-id": 208, "author-id": 20, "timestamp":datetime("2007-09-06T14:32:47"), "in-response-to": 2345, "sender-location":point("29.6,66.14"), "tags":{{"verizon", "signal" }}, "message":" dislike verizon its signal is terrible"}
-{"message-id": 209, "author-id": 20, "timestamp":datetime("2011-05-19T16:08:36"), "in-response-to": 1706, "sender-location":point("24.63,97.45"), "tags":{{"samsung", "touch-screen" }}, "message":" hate samsung the touch-screen is terrible"}
-{"message-id": 210, "author-id": 21, "timestamp":datetime("2012-02-18T02:12:07"), "in-response-to": 2846, "sender-location":point("38.39,66.11"), "tags":{{"at&t", "speed" }}, "message":" love at&t the speed is good:)"}
-{"message-id": 211, "author-id": 21, "timestamp":datetime("2009-11-11T05:13:34"), "in-response-to": 1669, "sender-location":point("24.49,93.02"), "tags":{{"samsung", "touch-screen" }}, "message":" like samsung its touch-screen is awesome:)"}
-{"message-id": 212, "author-id": 21, "timestamp":datetime("2014-06-12T06:44:16"), "in-response-to": 135, "sender-location":point("41.83,79.91"), "tags":{{"at&t", "signal" }}, "message":" love at&t its signal is amazing:)"}
-{"message-id": 213, "author-id": 21, "timestamp":datetime("2010-06-23T04:26:29"), "in-response-to": 1814, "sender-location":point("31.77,70.51"), "tags":{{"t-mobile", "reachability" }}, "message":" can't stand t-mobile the reachability is terrible"}
-{"message-id": 214, "author-id": 21, "timestamp":datetime("2010-04-12T09:30:40"), "in-response-to": 1670, "sender-location":point("28.93,68.0"), "tags":{{"iphone", "platform" }}, "message":" love iphone the platform is mind-blowing:)"}
-{"message-id": 215, "author-id": 21, "timestamp":datetime("2009-08-01T18:25:39"), "in-response-to": 1776, "sender-location":point("37.2,71.94"), "tags":{{"verizon", "plan" }}, "message":" like verizon the plan is good:)"}
-{"message-id": 216, "author-id": 22, "timestamp":datetime("2008-08-16T03:07:24"), "in-response-to": 2409, "sender-location":point("26.98,69.17"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola the platform is horrible:("}
-{"message-id": 217, "author-id": 22, "timestamp":datetime("2008-12-22T22:05:56"), "in-response-to": 1375, "sender-location":point("39.16,87.45"), "tags":{{"at&t", "3G" }}, "message":" like at&t its 3G is awesome:)"}
-{"message-id": 218, "author-id": 22, "timestamp":datetime("2007-09-13T16:35:45"), "in-response-to": 2932, "sender-location":point("26.73,96.22"), "tags":{{"motorola", "signal" }}, "message":" like motorola its signal is good"}
-{"message-id": 219, "author-id": 22, "timestamp":datetime("2005-07-04T09:36:23"), "in-response-to": 1131, "sender-location":point("25.54,70.06"), "tags":{{"verizon", "3G" }}, "message":" hate verizon the 3G is terrible"}
-{"message-id": 220, "author-id": 22, "timestamp":datetime("2011-02-17T20:26:52"), "in-response-to": 1809, "sender-location":point("41.23,89.99"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon its voice-command is good:)"}
-{"message-id": 221, "author-id": 22, "timestamp":datetime("2014-07-27T03:33:04"), "in-response-to": 2231, "sender-location":point("40.28,71.82"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola its platform is OMG"}
-{"message-id": 222, "author-id": 23, "timestamp":datetime("2007-01-02T12:14:35"), "in-response-to": 1698, "sender-location":point("42.85,80.9"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola the shortcut-menu is horrible"}
-{"message-id": 223, "author-id": 23, "timestamp":datetime("2010-10-25T01:59:50"), "in-response-to": 2589, "sender-location":point("40.1,79.15"), "tags":{{"motorola", "platform" }}, "message":" love motorola the platform is mind-blowing"}
-{"message-id": 224, "author-id": 23, "timestamp":datetime("2006-03-09T04:30:23"), "in-response-to": 2370, "sender-location":point("41.5,94.44"), "tags":{{"sprint", "signal" }}, "message":" can't stand sprint its signal is OMG:("}
-{"message-id": 225, "author-id": 23, "timestamp":datetime("2013-09-03T21:54:36"), "in-response-to": 2794, "sender-location":point("44.58,92.6"), "tags":{{"motorola", "3G" }}, "message":" hate motorola the 3G is bad"}
-{"message-id": 226, "author-id": 23, "timestamp":datetime("2014-04-12T19:59:10"), "in-response-to": 3245, "sender-location":point("40.3,84.61"), "tags":{{"at&t", "customer-service" }}, "message":" hate at&t its customer-service is bad"}
-{"message-id": 227, "author-id": 23, "timestamp":datetime("2009-03-04T11:15:22"), "in-response-to": 3124, "sender-location":point("25.37,78.41"), "tags":{{"sprint", "platform" }}, "message":" like sprint the platform is good:)"}
-{"message-id": 228, "author-id": 24, "timestamp":datetime("2007-10-13T17:58:45"), "in-response-to": 2914, "sender-location":point("35.8,69.7"), "tags":{{"sprint", "wireless" }}, "message":" can't stand sprint its wireless is OMG:("}
-{"message-id": 229, "author-id": 24, "timestamp":datetime("2012-08-17T09:51:30"), "in-response-to": 3088, "sender-location":point("36.42,74.17"), "tags":{{"iphone", "voice-command" }}, "message":" like iphone the voice-command is awesome"}
-{"message-id": 230, "author-id": 24, "timestamp":datetime("2014-06-17T15:06:59"), "in-response-to": 1538, "sender-location":point("48.61,69.4"), "tags":{{"verizon", "3G" }}, "message":" love verizon its 3G is mind-blowing"}
-{"message-id": 231, "author-id": 24, "timestamp":datetime("2009-05-27T20:58:05"), "in-response-to": 101, "sender-location":point("24.99,88.22"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t its voicemail-service is awesome"}
-{"message-id": 232, "author-id": 24, "timestamp":datetime("2009-11-06T14:31:06"), "in-response-to": 2697, "sender-location":point("40.47,68.4"), "tags":{{"t-mobile", "platform" }}, "message":" can't stand t-mobile its platform is terrible:("}
-{"message-id": 233, "author-id": 25, "timestamp":datetime("2011-07-11T04:26:17"), "in-response-to": 258, "sender-location":point("36.6,91.85"), "tags":{{"motorola", "customization" }}, "message":" love motorola its customization is mind-blowing"}
-{"message-id": 234, "author-id": 25, "timestamp":datetime("2013-04-19T06:48:04"), "in-response-to": 180, "sender-location":point("36.23,78.06"), "tags":{{"at&t", "voicemail-service" }}, "message":" like at&t its voicemail-service is awesome:)"}
-{"message-id": 235, "author-id": 25, "timestamp":datetime("2013-05-26T10:01:38"), "in-response-to": 2043, "sender-location":point("41.82,78.2"), "tags":{{"samsung", "voice-clarity" }}, "message":" love samsung the voice-clarity is amazing:)"}
-{"message-id": 236, "author-id": 25, "timestamp":datetime("2005-04-26T19:38:31"), "in-response-to": 3110, "sender-location":point("43.36,77.75"), "tags":{{"at&t", "voicemail-service" }}, "message":" can't stand at&t its voicemail-service is horrible"}
-{"message-id": 237, "author-id": 25, "timestamp":datetime("2013-08-21T18:19:32"), "in-response-to": 2718, "sender-location":point("40.41,86.33"), "tags":{{"t-mobile", "platform" }}, "message":" love t-mobile the platform is mind-blowing:)"}
-{"message-id": 238, "author-id": 26, "timestamp":datetime("2013-01-01T00:51:31"), "in-response-to": 692, "sender-location":point("37.86,69.65"), "tags":{{"motorola", "platform" }}, "message":" like motorola the platform is amazing:)"}
-{"message-id": 239, "author-id": 26, "timestamp":datetime("2006-05-17T18:02:33"), "in-response-to": 2276, "sender-location":point("44.12,83.26"), "tags":{{"motorola", "voice-clarity" }}, "message":" love motorola its voice-clarity is mind-blowing:)"}
-{"message-id": 240, "author-id": 26, "timestamp":datetime("2010-04-26T04:33:54"), "in-response-to": 1827, "sender-location":point("25.47,79.6"), "tags":{{"sprint", "reachability" }}, "message":" hate sprint its reachability is terrible:("}
-{"message-id": 241, "author-id": 26, "timestamp":datetime("2012-10-07T16:34:14"), "in-response-to": 3159, "sender-location":point("40.31,69.57"), "tags":{{"iphone", "platform" }}, "message":" can't stand iphone its platform is OMG:("}
-{"message-id": 242, "author-id": 26, "timestamp":datetime("2010-05-07T17:39:13"), "in-response-to": 1930, "sender-location":point("32.18,87.08"), "tags":{{"samsung", "speed" }}, "message":" can't stand samsung the speed is OMG:("}
-{"message-id": 243, "author-id": 27, "timestamp":datetime("2007-02-14T13:26:52"), "in-response-to": 2593, "sender-location":point("34.84,86.54"), "tags":{{"iphone", "speed" }}, "message":" dislike iphone the speed is bad:("}
-{"message-id": 244, "author-id": 27, "timestamp":datetime("2014-08-15T07:08:56"), "in-response-to": 2062, "sender-location":point("41.56,74.83"), "tags":{{"iphone", "signal" }}, "message":" hate iphone the signal is OMG:("}
-{"message-id": 245, "author-id": 27, "timestamp":datetime("2008-12-21T22:53:01"), "in-response-to": 485, "sender-location":point("48.92,96.62"), "tags":{{"verizon", "voice-clarity" }}, "message":" can't stand verizon the voice-clarity is horrible:("}
-{"message-id": 246, "author-id": 27, "timestamp":datetime("2006-04-17T14:27:55"), "in-response-to": 676, "sender-location":point("34.28,78.09"), "tags":{{"samsung", "voicemail-service" }}, "message":" love samsung the voicemail-service is good"}
-{"message-id": 247, "author-id": 27, "timestamp":datetime("2009-07-23T21:46:38"), "in-response-to": 1334, "sender-location":point("44.72,77.32"), "tags":{{"verizon", "speed" }}, "message":" love verizon the speed is good"}
-{"message-id": 248, "author-id": 28, "timestamp":datetime("2013-12-26T18:08:30"), "in-response-to": 1534, "sender-location":point("38.68,66.83"), "tags":{{"iphone", "wireless" }}, "message":" love iphone the wireless is good"}
-{"message-id": 249, "author-id": 28, "timestamp":datetime("2007-05-08T09:02:00"), "in-response-to": 2023, "sender-location":point("38.94,84.95"), "tags":{{"iphone", "platform" }}, "message":" like iphone its platform is mind-blowing"}
-{"message-id": 250, "author-id": 28, "timestamp":datetime("2008-07-02T04:57:59"), "in-response-to": 3028, "sender-location":point("41.12,86.62"), "tags":{{"samsung", "voice-clarity" }}, "message":" hate samsung its voice-clarity is OMG:("}
-{"message-id": 251, "author-id": 28, "timestamp":datetime("2013-01-24T16:37:56"), "in-response-to": 1682, "sender-location":point("32.35,76.37"), "tags":{{"iphone", "customization" }}, "message":" like iphone its customization is mind-blowing"}
-{"message-id": 252, "author-id": 28, "timestamp":datetime("2009-10-03T19:49:12"), "in-response-to": 657, "sender-location":point("27.88,94.24"), "tags":{{"motorola", "voice-command" }}, "message":" dislike motorola the voice-command is bad:("}
-{"message-id": 253, "author-id": 29, "timestamp":datetime("2007-05-24T20:05:29"), "in-response-to": 1155, "sender-location":point("32.45,66.67"), "tags":{{"motorola", "3G" }}, "message":" like motorola the 3G is mind-blowing:)"}
-{"message-id": 254, "author-id": 29, "timestamp":datetime("2011-05-15T07:30:01"), "in-response-to": 809, "sender-location":point("36.35,68.96"), "tags":{{"sprint", "voice-command" }}, "message":" hate sprint the voice-command is OMG"}
-{"message-id": 255, "author-id": 29, "timestamp":datetime("2011-03-27T00:58:52"), "in-response-to": 698, "sender-location":point("29.11,84.27"), "tags":{{"motorola", "reachability" }}, "message":" dislike motorola the reachability is horrible:("}
-{"message-id": 256, "author-id": 29, "timestamp":datetime("2011-06-20T11:54:43"), "in-response-to": 401, "sender-location":point("26.28,90.99"), "tags":{{"samsung", "plan" }}, "message":" can't stand samsung its plan is bad"}
-{"message-id": 257, "author-id": 29, "timestamp":datetime("2006-10-06T01:06:19"), "in-response-to": 2818, "sender-location":point("33.26,88.96"), "tags":{{"verizon", "reachability" }}, "message":" like verizon its reachability is amazing:)"}
-{"message-id": 258, "author-id": 30, "timestamp":datetime("2007-03-16T10:32:36"), "in-response-to": 1398, "sender-location":point("46.81,95.87"), "tags":{{"at&t", "shortcut-menu" }}, "message":" love at&t its shortcut-menu is mind-blowing:)"}
-{"message-id": 259, "author-id": 30, "timestamp":datetime("2013-04-21T12:32:10"), "in-response-to": 2037, "sender-location":point("37.0,91.71"), "tags":{{"sprint", "reachability" }}, "message":" love sprint its reachability is good:)"}
-{"message-id": 260, "author-id": 30, "timestamp":datetime("2009-01-18T19:13:33"), "in-response-to": 3004, "sender-location":point("29.27,70.72"), "tags":{{"samsung", "speed" }}, "message":" hate samsung its speed is bad"}
-{"message-id": 261, "author-id": 30, "timestamp":datetime("2008-01-19T04:31:21"), "in-response-to": 2846, "sender-location":point("40.56,75.97"), "tags":{{"motorola", "reachability" }}, "message":" hate motorola the reachability is OMG:("}
-{"message-id": 262, "author-id": 30, "timestamp":datetime("2008-05-17T06:47:30"), "in-response-to": 3017, "sender-location":point("38.19,71.54"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" hate t-mobile the voice-clarity is terrible:("}
-{"message-id": 263, "author-id": 31, "timestamp":datetime("2012-11-24T17:46:09"), "in-response-to": 1532, "sender-location":point("24.78,93.69"), "tags":{{"motorola", "voice-command" }}, "message":" hate motorola its voice-command is terrible"}
-{"message-id": 264, "author-id": 31, "timestamp":datetime("2008-09-16T18:46:34"), "in-response-to": 577, "sender-location":point("27.49,73.87"), "tags":{{"verizon", "3G" }}, "message":" can't stand verizon the 3G is terrible:("}
-{"message-id": 265, "author-id": 31, "timestamp":datetime("2010-12-19T08:10:25"), "in-response-to": 1301, "sender-location":point("29.62,88.24"), "tags":{{"motorola", "signal" }}, "message":" hate motorola its signal is OMG:("}
-{"message-id": 266, "author-id": 31, "timestamp":datetime("2007-11-12T13:42:30"), "in-response-to": 1879, "sender-location":point("46.41,92.16"), "tags":{{"t-mobile", "platform" }}, "message":" like t-mobile its platform is awesome:)"}
-{"message-id": 267, "author-id": 31, "timestamp":datetime("2011-03-07T22:27:46"), "in-response-to": 987, "sender-location":point("36.66,84.48"), "tags":{{"samsung", "reachability" }}, "message":" hate samsung its reachability is bad:("}
-{"message-id": 268, "author-id": 32, "timestamp":datetime("2005-05-05T16:28:37"), "in-response-to": 1744, "sender-location":point("41.15,75.97"), "tags":{{"samsung", "3G" }}, "message":" like samsung its 3G is mind-blowing:)"}
-{"message-id": 269, "author-id": 32, "timestamp":datetime("2014-08-13T12:38:36"), "in-response-to": 2212, "sender-location":point("35.65,73.44"), "tags":{{"at&t", "voice-clarity" }}, "message":" like at&t the voice-clarity is awesome"}
-{"message-id": 270, "author-id": 32, "timestamp":datetime("2006-05-25T07:07:20"), "in-response-to": 279, "sender-location":point("42.4,75.11"), "tags":{{"motorola", "customer-service" }}, "message":" hate motorola the customer-service is OMG:("}
-{"message-id": 271, "author-id": 32, "timestamp":datetime("2010-09-12T01:53:43"), "in-response-to": 2146, "sender-location":point("40.73,89.12"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" love t-mobile the voice-clarity is good:)"}
-{"message-id": 272, "author-id": 32, "timestamp":datetime("2007-10-04T16:14:26"), "in-response-to": 246, "sender-location":point("35.0,91.16"), "tags":{{"motorola", "network" }}, "message":" love motorola its network is awesome:)"}
-{"message-id": 273, "author-id": 33, "timestamp":datetime("2013-10-27T17:04:33"), "in-response-to": 2893, "sender-location":point("29.26,87.66"), "tags":{{"at&t", "customer-service" }}, "message":" can't stand at&t the customer-service is terrible:("}
-{"message-id": 274, "author-id": 33, "timestamp":datetime("2013-06-27T22:04:09"), "in-response-to": 2007, "sender-location":point("36.19,86.5"), "tags":{{"samsung", "voicemail-service" }}, "message":" dislike samsung the voicemail-service is horrible"}
-{"message-id": 275, "author-id": 33, "timestamp":datetime("2008-08-24T18:31:15"), "in-response-to": 2922, "sender-location":point("26.73,93.49"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone its voice-command is terrible"}
-{"message-id": 276, "author-id": 33, "timestamp":datetime("2010-08-25T17:05:58"), "in-response-to": 2744, "sender-location":point("39.99,88.61"), "tags":{{"t-mobile", "3G" }}, "message":" like t-mobile the 3G is good:)"}
-{"message-id": 277, "author-id": 33, "timestamp":datetime("2013-09-20T06:26:23"), "in-response-to": 2989, "sender-location":point("43.77,92.71"), "tags":{{"iphone", "signal" }}, "message":" dislike iphone its signal is horrible"}
-{"message-id": 278, "author-id": 34, "timestamp":datetime("2010-06-22T13:39:09"), "in-response-to": 1357, "sender-location":point("24.34,66.92"), "tags":{{"iphone", "customer-service" }}, "message":" can't stand iphone the customer-service is OMG"}
-{"message-id": 279, "author-id": 34, "timestamp":datetime("2005-07-02T10:28:17"), "in-response-to": 2159, "sender-location":point("43.9,81.84"), "tags":{{"sprint", "plan" }}, "message":" like sprint the plan is mind-blowing:)"}
-{"message-id": 280, "author-id": 34, "timestamp":datetime("2005-06-17T23:54:43"), "in-response-to": 1904, "sender-location":point("39.25,72.92"), "tags":{{"t-mobile", "voice-command" }}, "message":" hate t-mobile the voice-command is OMG:("}
-{"message-id": 281, "author-id": 34, "timestamp":datetime("2013-06-14T18:06:57"), "in-response-to": 1227, "sender-location":point("35.03,77.64"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone the voice-clarity is bad:("}
-{"message-id": 282, "author-id": 35, "timestamp":datetime("2011-02-13T01:48:21"), "in-response-to": 1282, "sender-location":point("26.41,94.38"), "tags":{{"at&t", "touch-screen" }}, "message":" love at&t the touch-screen is mind-blowing:)"}
-{"message-id": 283, "author-id": 35, "timestamp":datetime("2007-12-12T18:40:38"), "in-response-to": 699, "sender-location":point("39.78,83.42"), "tags":{{"t-mobile", "touch-screen" }}, "message":" hate t-mobile its touch-screen is bad:("}
-{"message-id": 284, "author-id": 35, "timestamp":datetime("2008-11-21T17:24:14"), "in-response-to": 1709, "sender-location":point("45.62,81.91"), "tags":{{"samsung", "customization" }}, "message":" can't stand samsung its customization is bad"}
-{"message-id": 285, "author-id": 35, "timestamp":datetime("2010-11-25T03:50:00"), "in-response-to": 1027, "sender-location":point("28.08,73.35"), "tags":{{"verizon", "voicemail-service" }}, "message":" can't stand verizon the voicemail-service is terrible"}
-{"message-id": 286, "author-id": 36, "timestamp":datetime("2011-05-22T20:42:33"), "in-response-to": 2159, "sender-location":point("39.96,93.07"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola the voice-command is amazing"}
-{"message-id": 287, "author-id": 36, "timestamp":datetime("2009-06-11T07:11:32"), "in-response-to": 2842, "sender-location":point("26.44,75.02"), "tags":{{"samsung", "wireless" }}, "message":" like samsung the wireless is amazing"}
-{"message-id": 288, "author-id": 36, "timestamp":datetime("2008-08-07T03:48:29"), "in-response-to": 711, "sender-location":point("33.92,78.81"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile the plan is amazing"}
-{"message-id": 289, "author-id": 36, "timestamp":datetime("2007-06-04T12:07:42"), "in-response-to": 589, "sender-location":point("39.96,73.15"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" like t-mobile the shortcut-menu is awesome:)"}
-{"message-id": 290, "author-id": 37, "timestamp":datetime("2010-03-24T09:15:08"), "in-response-to": 2160, "sender-location":point("39.82,85.11"), "tags":{{"at&t", "customization" }}, "message":" like at&t the customization is awesome:)"}
-{"message-id": 291, "author-id": 37, "timestamp":datetime("2006-01-12T05:21:17"), "in-response-to": 150, "sender-location":point("45.37,68.27"), "tags":{{"samsung", "customer-service" }}, "message":" can't stand samsung its customer-service is OMG"}
-{"message-id": 292, "author-id": 37, "timestamp":datetime("2008-05-05T17:05:13"), "in-response-to": 2000, "sender-location":point("32.3,80.71"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone its voice-clarity is OMG"}
-{"message-id": 293, "author-id": 37, "timestamp":datetime("2013-12-20T03:58:14"), "in-response-to": 1954, "sender-location":point("28.41,97.47"), "tags":{{"samsung", "platform" }}, "message":" dislike samsung its platform is terrible"}
-{"message-id": 294, "author-id": 38, "timestamp":datetime("2010-01-26T16:02:39"), "in-response-to": 1722, "sender-location":point("40.28,69.62"), "tags":{{"iphone", "reachability" }}, "message":" love iphone its reachability is amazing"}
-{"message-id": 295, "author-id": 38, "timestamp":datetime("2011-02-19T00:22:56"), "in-response-to": 282, "sender-location":point("29.36,84.26"), "tags":{{"at&t", "3G" }}, "message":" hate at&t its 3G is horrible:("}
-{"message-id": 296, "author-id": 38, "timestamp":datetime("2014-01-14T06:14:07"), "in-response-to": 196, "sender-location":point("40.89,94.21"), "tags":{{"at&t", "voice-command" }}, "message":" like at&t the voice-command is amazing"}
-{"message-id": 297, "author-id": 38, "timestamp":datetime("2006-12-15T05:59:36"), "in-response-to": 1850, "sender-location":point("36.45,69.14"), "tags":{{"motorola", "shortcut-menu" }}, "message":" like motorola its shortcut-menu is good"}
-{"message-id": 298, "author-id": 39, "timestamp":datetime("2010-09-21T14:09:01"), "in-response-to": 733, "sender-location":point("29.77,82.32"), "tags":{{"iphone", "platform" }}, "message":" love iphone its platform is mind-blowing:)"}
-{"message-id": 299, "author-id": 39, "timestamp":datetime("2006-11-08T23:24:34"), "in-response-to": 2198, "sender-location":point("46.2,74.51"), "tags":{{"t-mobile", "customer-service" }}, "message":" can't stand t-mobile its customer-service is OMG"}
-{"message-id": 300, "author-id": 39, "timestamp":datetime("2014-03-24T04:54:39"), "in-response-to": 1365, "sender-location":point("30.77,70.73"), "tags":{{"motorola", "reachability" }}, "message":" dislike motorola the reachability is OMG"}
-{"message-id": 301, "author-id": 39, "timestamp":datetime("2013-11-18T19:23:02"), "in-response-to": 2465, "sender-location":point("30.4,83.17"), "tags":{{"samsung", "customer-service" }}, "message":" love samsung its customer-service is good:)"}
-{"message-id": 302, "author-id": 40, "timestamp":datetime("2013-04-18T14:48:07"), "in-response-to": 1479, "sender-location":point("37.52,79.4"), "tags":{{"at&t", "voicemail-service" }}, "message":" like at&t its voicemail-service is amazing"}
-{"message-id": 303, "author-id": 40, "timestamp":datetime("2011-06-13T06:50:35"), "in-response-to": 2487, "sender-location":point("28.68,95.68"), "tags":{{"iphone", "speed" }}, "message":" dislike iphone its speed is OMG"}
-{"message-id": 304, "author-id": 40, "timestamp":datetime("2008-06-16T04:26:40"), "in-response-to": 411, "sender-location":point("48.96,70.14"), "tags":{{"motorola", "voice-clarity" }}, "message":" like motorola its voice-clarity is good:)"}
-{"message-id": 305, "author-id": 40, "timestamp":datetime("2010-08-17T21:22:00"), "in-response-to": 1260, "sender-location":point("46.39,94.43"), "tags":{{"verizon", "customer-service" }}, "message":" love verizon its customer-service is mind-blowing:)"}
-{"message-id": 306, "author-id": 41, "timestamp":datetime("2012-08-25T10:03:44"), "in-response-to": 576, "sender-location":point("45.47,69.19"), "tags":{{"motorola", "signal" }}, "message":" love motorola its signal is awesome"}
-{"message-id": 307, "author-id": 41, "timestamp":datetime("2012-07-09T15:49:03"), "in-response-to": 1086, "sender-location":point("42.74,73.23"), "tags":{{"verizon", "platform" }}, "message":" dislike verizon its platform is terrible"}
-{"message-id": 308, "author-id": 41, "timestamp":datetime("2009-10-20T11:54:19"), "in-response-to": 1829, "sender-location":point("26.4,91.22"), "tags":{{"samsung", "shortcut-menu" }}, "message":" can't stand samsung its shortcut-menu is terrible:("}
-{"message-id": 309, "author-id": 41, "timestamp":datetime("2010-08-11T01:32:33"), "in-response-to": 1796, "sender-location":point("38.38,66.31"), "tags":{{"verizon", "speed" }}, "message":" hate verizon its speed is OMG:("}
-{"message-id": 310, "author-id": 42, "timestamp":datetime("2012-11-26T00:52:25"), "in-response-to": 256, "sender-location":point("48.73,93.77"), "tags":{{"samsung", "shortcut-menu" }}, "message":" love samsung its shortcut-menu is awesome"}
-{"message-id": 311, "author-id": 42, "timestamp":datetime("2010-12-11T12:36:29"), "in-response-to": 902, "sender-location":point("30.35,93.83"), "tags":{{"sprint", "customization" }}, "message":" hate sprint the customization is OMG:("}
-{"message-id": 312, "author-id": 42, "timestamp":datetime("2009-06-04T08:49:05"), "in-response-to": 2432, "sender-location":point("27.28,88.99"), "tags":{{"motorola", "3G" }}, "message":" like motorola its 3G is good"}
-{"message-id": 313, "author-id": 42, "timestamp":datetime("2012-04-28T16:45:05"), "in-response-to": 2459, "sender-location":point("35.81,73.62"), "tags":{{"samsung", "3G" }}, "message":" like samsung its 3G is good:)"}
-{"message-id": 314, "author-id": 43, "timestamp":datetime("2007-09-14T09:38:31"), "in-response-to": 260, "sender-location":point("35.01,66.28"), "tags":{{"samsung", "speed" }}, "message":" dislike samsung the speed is OMG:("}
-{"message-id": 315, "author-id": 43, "timestamp":datetime("2005-06-06T18:23:53"), "in-response-to": 580, "sender-location":point("26.28,79.3"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" like t-mobile the voicemail-service is awesome"}
-{"message-id": 316, "author-id": 43, "timestamp":datetime("2013-06-13T17:24:56"), "in-response-to": 208, "sender-location":point("37.07,79.8"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint the voicemail-service is horrible:("}
-{"message-id": 317, "author-id": 43, "timestamp":datetime("2011-11-08T22:08:51"), "in-response-to": 1752, "sender-location":point("41.06,68.81"), "tags":{{"at&t", "plan" }}, "message":" like at&t the plan is good"}
-{"message-id": 318, "author-id": 44, "timestamp":datetime("2007-03-07T18:40:58"), "in-response-to": 1519, "sender-location":point("39.92,96.53"), "tags":{{"sprint", "touch-screen" }}, "message":" hate sprint its touch-screen is horrible"}
-{"message-id": 319, "author-id": 44, "timestamp":datetime("2006-08-12T20:57:13"), "in-response-to": 474, "sender-location":point("32.38,77.12"), "tags":{{"sprint", "touch-screen" }}, "message":" love sprint its touch-screen is awesome"}
-{"message-id": 320, "author-id": 44, "timestamp":datetime("2010-01-22T01:59:10"), "in-response-to": 3092, "sender-location":point("27.39,74.64"), "tags":{{"at&t", "signal" }}, "message":" hate at&t its signal is OMG:("}
-{"message-id": 321, "author-id": 44, "timestamp":datetime("2009-10-17T23:25:49"), "in-response-to": 545, "sender-location":point("28.84,96.53"), "tags":{{"t-mobile", "plan" }}, "message":" love t-mobile the plan is mind-blowing:)"}
-{"message-id": 322, "author-id": 45, "timestamp":datetime("2008-09-10T11:02:56"), "in-response-to": 757, "sender-location":point("47.69,96.41"), "tags":{{"sprint", "shortcut-menu" }}, "message":" like sprint its shortcut-menu is amazing"}
-{"message-id": 323, "author-id": 45, "timestamp":datetime("2011-01-05T18:10:48"), "in-response-to": 1743, "sender-location":point("28.6,85.17"), "tags":{{"sprint", "platform" }}, "message":" like sprint its platform is amazing:)"}
-{"message-id": 324, "author-id": 45, "timestamp":datetime("2008-10-04T02:58:11"), "in-response-to": 2968, "sender-location":point("29.06,78.57"), "tags":{{"verizon", "speed" }}, "message":" dislike verizon its speed is OMG"}
-{"message-id": 325, "author-id": 45, "timestamp":datetime("2006-05-06T16:06:24"), "in-response-to": 137, "sender-location":point("27.64,93.6"), "tags":{{"t-mobile", "3G" }}, "message":" can't stand t-mobile the 3G is OMG:("}
-{"message-id": 326, "author-id": 46, "timestamp":datetime("2011-09-19T05:02:43"), "in-response-to": 1865, "sender-location":point("48.63,78.57"), "tags":{{"at&t", "wireless" }}, "message":" like at&t the wireless is awesome"}
-{"message-id": 327, "author-id": 46, "timestamp":datetime("2009-06-09T04:23:54"), "in-response-to": 1878, "sender-location":point("27.96,76.58"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint its voicemail-service is bad"}
-{"message-id": 328, "author-id": 46, "timestamp":datetime("2010-01-26T21:37:47"), "in-response-to": 2287, "sender-location":point("33.2,80.02"), "tags":{{"sprint", "speed" }}, "message":" can't stand sprint the speed is OMG:("}
-{"message-id": 329, "author-id": 46, "timestamp":datetime("2009-09-09T23:45:53"), "in-response-to": 1086, "sender-location":point("29.39,80.06"), "tags":{{"motorola", "3G" }}, "message":" like motorola its 3G is awesome:)"}
-{"message-id": 330, "author-id": 47, "timestamp":datetime("2008-11-05T16:48:55"), "in-response-to": 1350, "sender-location":point("32.44,93.0"), "tags":{{"at&t", "reachability" }}, "message":" can't stand at&t the reachability is terrible"}
-{"message-id": 331, "author-id": 47, "timestamp":datetime("2010-03-11T06:57:46"), "in-response-to": 1891, "sender-location":point("36.37,92.2"), "tags":{{"verizon", "signal" }}, "message":" love verizon its signal is amazing"}
-{"message-id": 332, "author-id": 47, "timestamp":datetime("2008-02-17T16:13:10"), "in-response-to": 2646, "sender-location":point("38.05,76.8"), "tags":{{"verizon", "customization" }}, "message":" love verizon the customization is awesome:)"}
-{"message-id": 333, "author-id": 47, "timestamp":datetime("2008-03-17T08:45:27"), "in-response-to": 2441, "sender-location":point("40.41,76.16"), "tags":{{"samsung", "shortcut-menu" }}, "message":" can't stand samsung its shortcut-menu is OMG:("}
-{"message-id": 334, "author-id": 48, "timestamp":datetime("2010-01-20T15:14:36"), "in-response-to": 1485, "sender-location":point("26.23,80.39"), "tags":{{"verizon", "customer-service" }}, "message":" hate verizon its customer-service is terrible:("}
-{"message-id": 335, "author-id": 48, "timestamp":datetime("2006-07-07T12:02:34"), "in-response-to": 1618, "sender-location":point("46.9,79.66"), "tags":{{"sprint", "voice-command" }}, "message":" love sprint the voice-command is awesome:)"}
-{"message-id": 336, "author-id": 48, "timestamp":datetime("2008-10-25T17:14:44"), "in-response-to": 884, "sender-location":point("27.1,89.67"), "tags":{{"iphone", "speed" }}, "message":" hate iphone its speed is OMG"}
-{"message-id": 337, "author-id": 48, "timestamp":datetime("2009-04-11T12:25:03"), "in-response-to": 2424, "sender-location":point("36.59,70.62"), "tags":{{"at&t", "platform" }}, "message":" love at&t the platform is amazing:)"}
-{"message-id": 338, "author-id": 49, "timestamp":datetime("2014-02-24T14:55:37"), "in-response-to": 1509, "sender-location":point("45.9,67.07"), "tags":{{"samsung", "voice-clarity" }}, "message":" dislike samsung the voice-clarity is OMG"}
-{"message-id": 339, "author-id": 49, "timestamp":datetime("2010-09-13T22:24:42"), "in-response-to": 2395, "sender-location":point("44.08,83.91"), "tags":{{"samsung", "platform" }}, "message":" can't stand samsung the platform is horrible"}
-{"message-id": 340, "author-id": 49, "timestamp":datetime("2013-06-10T18:29:56"), "in-response-to": 967, "sender-location":point("42.84,67.97"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon the voice-command is awesome:)"}
-{"message-id": 341, "author-id": 49, "timestamp":datetime("2007-02-08T12:13:32"), "in-response-to": 2470, "sender-location":point("30.24,78.17"), "tags":{{"at&t", "shortcut-menu" }}, "message":" can't stand at&t its shortcut-menu is OMG"}
-{"message-id": 342, "author-id": 50, "timestamp":datetime("2010-08-23T04:47:50"), "in-response-to": 1723, "sender-location":point("45.88,96.45"), "tags":{{"verizon", "signal" }}, "message":" like verizon the signal is good:)"}
-{"message-id": 343, "author-id": 50, "timestamp":datetime("2006-07-06T06:13:11"), "in-response-to": 1498, "sender-location":point("27.71,75.88"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is good"}
-{"message-id": 344, "author-id": 50, "timestamp":datetime("2010-11-07T20:16:21"), "in-response-to": 564, "sender-location":point("45.3,88.57"), "tags":{{"samsung", "platform" }}, "message":" like samsung the platform is amazing"}
-{"message-id": 345, "author-id": 50, "timestamp":datetime("2009-05-19T09:18:50"), "in-response-to": 2626, "sender-location":point("30.39,83.52"), "tags":{{"samsung", "customization" }}, "message":" love samsung the customization is good:)"}
-{"message-id": 346, "author-id": 51, "timestamp":datetime("2006-10-06T02:35:46"), "in-response-to": 982, "sender-location":point("37.51,69.92"), "tags":{{"verizon", "signal" }}, "message":" like verizon its signal is good"}
-{"message-id": 347, "author-id": 51, "timestamp":datetime("2007-01-03T18:18:00"), "in-response-to": 2044, "sender-location":point("34.68,92.57"), "tags":{{"t-mobile", "platform" }}, "message":" dislike t-mobile its platform is horrible"}
-{"message-id": 348, "author-id": 51, "timestamp":datetime("2013-06-01T18:06:02"), "in-response-to": 2501, "sender-location":point("39.63,87.88"), "tags":{{"at&t", "voice-command" }}, "message":" like at&t the voice-command is amazing"}
-{"message-id": 349, "author-id": 51, "timestamp":datetime("2007-06-02T02:36:06"), "in-response-to": 3188, "sender-location":point("31.14,88.34"), "tags":{{"verizon", "plan" }}, "message":" like verizon the plan is good:)"}
-{"message-id": 350, "author-id": 52, "timestamp":datetime("2005-09-13T04:06:17"), "in-response-to": 2004, "sender-location":point("42.42,74.06"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone the voice-clarity is good:)"}
-{"message-id": 351, "author-id": 52, "timestamp":datetime("2012-02-16T09:35:08"), "in-response-to": 2605, "sender-location":point("46.31,97.96"), "tags":{{"samsung", "voice-command" }}, "message":" love samsung its voice-command is mind-blowing:)"}
-{"message-id": 352, "author-id": 52, "timestamp":datetime("2008-08-19T23:06:41"), "in-response-to": 2572, "sender-location":point("30.45,91.43"), "tags":{{"samsung", "wireless" }}, "message":" can't stand samsung the wireless is terrible"}
-{"message-id": 353, "author-id": 52, "timestamp":datetime("2013-01-12T07:03:22"), "in-response-to": 2553, "sender-location":point("24.95,84.37"), "tags":{{"motorola", "shortcut-menu" }}, "message":" love motorola the shortcut-menu is amazing:)"}
-{"message-id": 354, "author-id": 53, "timestamp":datetime("2011-05-08T10:28:05"), "in-response-to": 641, "sender-location":point("43.55,69.06"), "tags":{{"iphone", "customer-service" }}, "message":" can't stand iphone the customer-service is OMG:("}
-{"message-id": 355, "author-id": 53, "timestamp":datetime("2014-02-11T15:12:15"), "in-response-to": 2292, "sender-location":point("45.14,75.59"), "tags":{{"samsung", "voice-command" }}, "message":" love samsung its voice-command is good:)"}
-{"message-id": 356, "author-id": 53, "timestamp":datetime("2005-05-08T18:10:27"), "in-response-to": 3248, "sender-location":point("40.26,85.74"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is good"}
-{"message-id": 357, "author-id": 54, "timestamp":datetime("2007-09-12T20:08:26"), "in-response-to": 1170, "sender-location":point("28.86,66.36"), "tags":{{"sprint", "3G" }}, "message":" hate sprint the 3G is OMG:("}
-{"message-id": 358, "author-id": 54, "timestamp":datetime("2013-06-28T18:49:17"), "in-response-to": 1406, "sender-location":point("37.76,91.78"), "tags":{{"motorola", "touch-screen" }}, "message":" can't stand motorola its touch-screen is horrible"}
-{"message-id": 359, "author-id": 54, "timestamp":datetime("2007-12-02T01:11:34"), "in-response-to": 2855, "sender-location":point("25.39,86.85"), "tags":{{"sprint", "voice-clarity" }}, "message":" hate sprint the voice-clarity is bad"}
-{"message-id": 360, "author-id": 55, "timestamp":datetime("2012-12-16T08:59:10"), "in-response-to": 333, "sender-location":point("46.05,75.65"), "tags":{{"samsung", "plan" }}, "message":" can't stand samsung the plan is OMG:("}
-{"message-id": 361, "author-id": 55, "timestamp":datetime("2007-05-11T00:12:37"), "in-response-to": 1608, "sender-location":point("48.76,82.84"), "tags":{{"motorola", "shortcut-menu" }}, "message":" dislike motorola the shortcut-menu is OMG:("}
-{"message-id": 362, "author-id": 55, "timestamp":datetime("2014-02-01T03:37:50"), "in-response-to": 1671, "sender-location":point("34.85,77.05"), "tags":{{"verizon", "plan" }}, "message":" hate verizon its plan is bad"}
-{"message-id": 363, "author-id": 56, "timestamp":datetime("2005-01-05T18:31:00"), "in-response-to": 2663, "sender-location":point("33.57,79.56"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone the voice-clarity is good"}
-{"message-id": 364, "author-id": 56, "timestamp":datetime("2014-07-21T21:06:33"), "in-response-to": 2283, "sender-location":point("26.36,69.53"), "tags":{{"t-mobile", "voice-command" }}, "message":" love t-mobile the voice-command is awesome"}
-{"message-id": 365, "author-id": 56, "timestamp":datetime("2014-05-24T15:46:17"), "in-response-to": 2732, "sender-location":point("45.16,74.3"), "tags":{{"sprint", "plan" }}, "message":" like sprint the plan is awesome"}
-{"message-id": 366, "author-id": 57, "timestamp":datetime("2010-06-20T14:39:56"), "in-response-to": 744, "sender-location":point("32.44,77.49"), "tags":{{"verizon", "shortcut-menu" }}, "message":" hate verizon the shortcut-menu is OMG"}
-{"message-id": 367, "author-id": 57, "timestamp":datetime("2007-09-09T22:26:07"), "in-response-to": 1684, "sender-location":point("43.5,82.71"), "tags":{{"at&t", "network" }}, "message":" like at&t the network is mind-blowing"}
-{"message-id": 368, "author-id": 57, "timestamp":datetime("2010-09-14T08:02:51"), "in-response-to": 2933, "sender-location":point("31.79,85.31"), "tags":{{"iphone", "voice-clarity" }}, "message":" dislike iphone its voice-clarity is horrible"}
-{"message-id": 369, "author-id": 58, "timestamp":datetime("2006-10-27T20:24:46"), "in-response-to": 2833, "sender-location":point("38.41,96.75"), "tags":{{"t-mobile", "voice-command" }}, "message":" love t-mobile its voice-command is good"}
-{"message-id": 370, "author-id": 58, "timestamp":datetime("2013-12-24T04:59:13"), "in-response-to": 3223, "sender-location":point("29.59,83.73"), "tags":{{"samsung", "wireless" }}, "message":" love samsung the wireless is awesome"}
-{"message-id": 371, "author-id": 58, "timestamp":datetime("2006-04-01T17:45:24"), "in-response-to": 614, "sender-location":point("24.89,88.93"), "tags":{{"at&t", "network" }}, "message":" hate at&t its network is horrible"}
-{"message-id": 372, "author-id": 59, "timestamp":datetime("2011-03-28T11:47:28"), "in-response-to": 79, "sender-location":point("37.95,73.59"), "tags":{{"samsung", "voicemail-service" }}, "message":" like samsung its voicemail-service is amazing:)"}
-{"message-id": 373, "author-id": 59, "timestamp":datetime("2008-07-18T06:18:25"), "in-response-to": 1416, "sender-location":point("33.17,76.45"), "tags":{{"t-mobile", "plan" }}, "message":" can't stand t-mobile its plan is terrible"}
-{"message-id": 374, "author-id": 59, "timestamp":datetime("2011-07-20T08:22:57"), "in-response-to": 1697, "sender-location":point("30.41,97.76"), "tags":{{"verizon", "wireless" }}, "message":" love verizon its wireless is mind-blowing:)"}
-{"message-id": 375, "author-id": 60, "timestamp":datetime("2009-07-17T23:53:18"), "in-response-to": 2412, "sender-location":point("37.81,75.84"), "tags":{{"motorola", "customization" }}, "message":" love motorola its customization is mind-blowing"}
-{"message-id": 376, "author-id": 60, "timestamp":datetime("2011-01-02T18:06:53"), "in-response-to": 3101, "sender-location":point("42.75,70.73"), "tags":{{"at&t", "speed" }}, "message":" like at&t the speed is awesome:)"}
-{"message-id": 377, "author-id": 60, "timestamp":datetime("2007-07-09T22:54:10"), "in-response-to": 275, "sender-location":point("29.19,92.2"), "tags":{{"sprint", "signal" }}, "message":" like sprint the signal is amazing"}
-{"message-id": 378, "author-id": 61, "timestamp":datetime("2013-10-19T14:33:12"), "in-response-to": 729, "sender-location":point("48.88,86.95"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone its voice-clarity is bad"}
-{"message-id": 379, "author-id": 61, "timestamp":datetime("2006-07-18T12:55:31"), "in-response-to": 2413, "sender-location":point("44.07,66.54"), "tags":{{"at&t", "wireless" }}, "message":" love at&t the wireless is amazing"}
-{"message-id": 380, "author-id": 61, "timestamp":datetime("2011-02-21T04:30:03"), "in-response-to": 1698, "sender-location":point("35.49,85.47"), "tags":{{"at&t", "signal" }}, "message":" like at&t its signal is awesome:)"}
-{"message-id": 381, "author-id": 62, "timestamp":datetime("2014-08-12T21:09:49"), "in-response-to": 113, "sender-location":point("25.76,79.89"), "tags":{{"iphone", "customer-service" }}, "message":" love iphone its customer-service is good"}
-{"message-id": 382, "author-id": 62, "timestamp":datetime("2007-09-21T04:25:04"), "in-response-to": 1912, "sender-location":point("41.1,96.45"), "tags":{{"motorola", "network" }}, "message":" like motorola its network is mind-blowing"}
-{"message-id": 383, "author-id": 62, "timestamp":datetime("2013-07-23T06:17:22"), "in-response-to": 594, "sender-location":point("47.35,87.46"), "tags":{{"t-mobile", "network" }}, "message":" hate t-mobile its network is bad:("}
-{"message-id": 384, "author-id": 63, "timestamp":datetime("2009-02-14T22:44:44"), "in-response-to": 2873, "sender-location":point("34.12,69.71"), "tags":{{"sprint", "network" }}, "message":" hate sprint its network is horrible:("}
-{"message-id": 385, "author-id": 63, "timestamp":datetime("2005-04-13T10:43:11"), "in-response-to": 911, "sender-location":point("48.33,66.15"), "tags":{{"motorola", "voice-command" }}, "message":" dislike motorola its voice-command is horrible"}
-{"message-id": 386, "author-id": 63, "timestamp":datetime("2011-08-13T18:00:38"), "in-response-to": 728, "sender-location":point("47.27,89.05"), "tags":{{"samsung", "touch-screen" }}, "message":" love samsung its touch-screen is mind-blowing"}
-{"message-id": 387, "author-id": 64, "timestamp":datetime("2011-01-17T20:51:58"), "in-response-to": 1528, "sender-location":point("35.34,88.42"), "tags":{{"sprint", "touch-screen" }}, "message":" love sprint the touch-screen is mind-blowing"}
-{"message-id": 388, "author-id": 64, "timestamp":datetime("2014-07-07T20:28:54"), "in-response-to": 2867, "sender-location":point("28.91,90.33"), "tags":{{"verizon", "customization" }}, "message":" like verizon the customization is awesome"}
-{"message-id": 389, "author-id": 64, "timestamp":datetime("2012-05-24T08:03:00"), "in-response-to": 1087, "sender-location":point("40.7,71.05"), "tags":{{"verizon", "voice-command" }}, "message":" can't stand verizon the voice-command is bad"}
-{"message-id": 390, "author-id": 65, "timestamp":datetime("2006-11-21T12:52:56"), "in-response-to": 262, "sender-location":point("39.89,97.22"), "tags":{{"motorola", "speed" }}, "message":" dislike motorola the speed is terrible:("}
-{"message-id": 391, "author-id": 65, "timestamp":datetime("2012-01-10T21:53:14"), "in-response-to": 2183, "sender-location":point("46.8,70.58"), "tags":{{"iphone", "wireless" }}, "message":" hate iphone its wireless is bad"}
-{"message-id": 392, "author-id": 65, "timestamp":datetime("2009-09-28T18:54:32"), "in-response-to": 2900, "sender-location":point("44.24,73.78"), "tags":{{"verizon", "customer-service" }}, "message":" love verizon the customer-service is mind-blowing:)"}
-{"message-id": 393, "author-id": 66, "timestamp":datetime("2012-08-15T20:19:00"), "in-response-to": 1258, "sender-location":point("47.55,70.58"), "tags":{{"samsung", "customization" }}, "message":" hate samsung the customization is OMG:("}
-{"message-id": 394, "author-id": 66, "timestamp":datetime("2006-02-17T14:45:29"), "in-response-to": 1587, "sender-location":point("41.13,97.37"), "tags":{{"iphone", "voicemail-service" }}, "message":" can't stand iphone the voicemail-service is terrible:("}
-{"message-id": 395, "author-id": 66, "timestamp":datetime("2013-12-18T11:45:43"), "in-response-to": 2062, "sender-location":point("37.55,69.58"), "tags":{{"at&t", "wireless" }}, "message":" dislike at&t its wireless is terrible:("}
-{"message-id": 396, "author-id": 67, "timestamp":datetime("2008-05-20T22:30:47"), "in-response-to": 2887, "sender-location":point("41.06,97.81"), "tags":{{"sprint", "plan" }}, "message":" like sprint the plan is amazing:)"}
-{"message-id": 397, "author-id": 67, "timestamp":datetime("2012-07-21T00:41:46"), "in-response-to": 1075, "sender-location":point("44.22,73.11"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola the platform is terrible:("}
-{"message-id": 398, "author-id": 67, "timestamp":datetime("2012-08-21T03:28:53"), "in-response-to": 62, "sender-location":point("39.0,84.62"), "tags":{{"iphone", "3G" }}, "message":" hate iphone its 3G is bad:("}
-{"message-id": 399, "author-id": 68, "timestamp":datetime("2006-05-21T20:09:27"), "in-response-to": 2226, "sender-location":point("43.97,73.07"), "tags":{{"iphone", "signal" }}, "message":" hate iphone the signal is horrible"}
-{"message-id": 400, "author-id": 68, "timestamp":datetime("2013-03-04T14:10:38"), "in-response-to": 2149, "sender-location":point("42.86,73.57"), "tags":{{"t-mobile", "customer-service" }}, "message":" like t-mobile the customer-service is awesome:)"}
-{"message-id": 401, "author-id": 68, "timestamp":datetime("2005-11-25T16:05:03"), "in-response-to": 480, "sender-location":point("48.82,70.47"), "tags":{{"samsung", "speed" }}, "message":" love samsung its speed is awesome"}
-{"message-id": 402, "author-id": 69, "timestamp":datetime("2009-07-06T04:22:21"), "in-response-to": 1659, "sender-location":point("28.91,80.1"), "tags":{{"at&t", "3G" }}, "message":" can't stand at&t the 3G is terrible"}
-{"message-id": 403, "author-id": 69, "timestamp":datetime("2014-04-01T05:15:32"), "in-response-to": 1019, "sender-location":point("25.89,87.18"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung the voice-clarity is OMG:("}
-{"message-id": 404, "author-id": 69, "timestamp":datetime("2005-09-27T21:53:16"), "in-response-to": 789, "sender-location":point("28.52,87.79"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon the voicemail-service is good:)"}
-{"message-id": 405, "author-id": 70, "timestamp":datetime("2007-08-23T12:38:10"), "in-response-to": 1025, "sender-location":point("30.85,92.16"), "tags":{{"iphone", "touch-screen" }}, "message":" love iphone the touch-screen is amazing:)"}
-{"message-id": 406, "author-id": 70, "timestamp":datetime("2010-03-26T14:05:33"), "in-response-to": 1603, "sender-location":point("36.04,91.05"), "tags":{{"verizon", "voice-command" }}, "message":" love verizon the voice-command is good"}
-{"message-id": 407, "author-id": 70, "timestamp":datetime("2013-01-19T06:44:59"), "in-response-to": 605, "sender-location":point("38.85,95.46"), "tags":{{"samsung", "platform" }}, "message":" hate samsung its platform is terrible:("}
-{"message-id": 408, "author-id": 71, "timestamp":datetime("2014-04-27T22:07:33"), "in-response-to": 2515, "sender-location":point("47.85,69.68"), "tags":{{"motorola", "platform" }}, "message":" hate motorola the platform is bad"}
-{"message-id": 409, "author-id": 71, "timestamp":datetime("2014-03-01T10:25:35"), "in-response-to": 1276, "sender-location":point("29.73,93.1"), "tags":{{"verizon", "voice-clarity" }}, "message":" hate verizon the voice-clarity is terrible:("}
-{"message-id": 410, "author-id": 71, "timestamp":datetime("2013-08-28T08:02:42"), "in-response-to": 2982, "sender-location":point("26.71,93.52"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon the shortcut-menu is mind-blowing:)"}
-{"message-id": 411, "author-id": 72, "timestamp":datetime("2008-09-10T19:33:26"), "in-response-to": 1778, "sender-location":point("29.4,85.65"), "tags":{{"motorola", "touch-screen" }}, "message":" like motorola the touch-screen is awesome"}
-{"message-id": 412, "author-id": 72, "timestamp":datetime("2010-11-01T12:34:16"), "in-response-to": 429, "sender-location":point("24.58,89.72"), "tags":{{"verizon", "customization" }}, "message":" hate verizon its customization is terrible:("}
-{"message-id": 413, "author-id": 72, "timestamp":datetime("2013-03-23T04:55:43"), "in-response-to": 3107, "sender-location":point("26.22,85.47"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t the voicemail-service is amazing:)"}
-{"message-id": 414, "author-id": 73, "timestamp":datetime("2010-05-27T18:38:31"), "in-response-to": 1689, "sender-location":point("48.01,66.11"), "tags":{{"samsung", "customer-service" }}, "message":" can't stand samsung its customer-service is bad"}
-{"message-id": 415, "author-id": 73, "timestamp":datetime("2013-02-03T01:49:42"), "in-response-to": 2581, "sender-location":point("41.13,75.83"), "tags":{{"t-mobile", "network" }}, "message":" dislike t-mobile its network is horrible"}
-{"message-id": 416, "author-id": 73, "timestamp":datetime("2011-03-04T11:13:01"), "in-response-to": 3015, "sender-location":point("36.19,77.87"), "tags":{{"at&t", "customer-service" }}, "message":" dislike at&t the customer-service is bad"}
-{"message-id": 417, "author-id": 74, "timestamp":datetime("2009-10-14T18:47:33"), "in-response-to": 1455, "sender-location":point("31.77,78.92"), "tags":{{"samsung", "customization" }}, "message":" can't stand samsung its customization is horrible"}
-{"message-id": 418, "author-id": 74, "timestamp":datetime("2010-08-14T01:23:47"), "in-response-to": 2910, "sender-location":point("34.94,82.67"), "tags":{{"sprint", "customer-service" }}, "message":" love sprint its customer-service is good:)"}
-{"message-id": 419, "author-id": 74, "timestamp":datetime("2006-11-05T09:53:26"), "in-response-to": 230, "sender-location":point("38.81,68.4"), "tags":{{"verizon", "speed" }}, "message":" hate verizon its speed is OMG:("}
-{"message-id": 420, "author-id": 75, "timestamp":datetime("2014-05-23T18:01:54"), "in-response-to": 1972, "sender-location":point("43.92,93.79"), "tags":{{"samsung", "wireless" }}, "message":" love samsung the wireless is awesome:)"}
-{"message-id": 421, "author-id": 75, "timestamp":datetime("2012-11-27T21:59:57"), "in-response-to": 2379, "sender-location":point("48.57,84.34"), "tags":{{"motorola", "plan" }}, "message":" hate motorola its plan is horrible:("}
-{"message-id": 422, "author-id": 75, "timestamp":datetime("2010-07-21T21:26:21"), "in-response-to": 1216, "sender-location":point("44.79,69.0"), "tags":{{"iphone", "signal" }}, "message":" love iphone the signal is mind-blowing"}
-{"message-id": 423, "author-id": 76, "timestamp":datetime("2011-04-02T06:45:14"), "in-response-to": 2519, "sender-location":point("28.84,85.41"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola the voicemail-service is amazing"}
-{"message-id": 424, "author-id": 76, "timestamp":datetime("2014-08-28T10:59:02"), "in-response-to": 1285, "sender-location":point("30.14,69.54"), "tags":{{"t-mobile", "platform" }}, "message":" can't stand t-mobile the platform is horrible"}
-{"message-id": 425, "author-id": 76, "timestamp":datetime("2011-10-02T06:58:08"), "in-response-to": 381, "sender-location":point("41.73,81.29"), "tags":{{"motorola", "speed" }}, "message":" dislike motorola its speed is terrible"}
-{"message-id": 426, "author-id": 77, "timestamp":datetime("2010-05-22T03:17:41"), "in-response-to": 662, "sender-location":point("41.16,96.92"), "tags":{{"at&t", "network" }}, "message":" like at&t the network is amazing"}
-{"message-id": 427, "author-id": 77, "timestamp":datetime("2014-04-07T19:06:07"), "in-response-to": 1193, "sender-location":point("34.0,92.95"), "tags":{{"at&t", "voice-command" }}, "message":" can't stand at&t its voice-command is terrible:("}
-{"message-id": 428, "author-id": 77, "timestamp":datetime("2013-03-12T06:28:22"), "in-response-to": 1616, "sender-location":point("40.93,73.23"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" like t-mobile its shortcut-menu is awesome:)"}
-{"message-id": 429, "author-id": 78, "timestamp":datetime("2008-09-19T01:17:14"), "in-response-to": 2510, "sender-location":point("38.27,70.01"), "tags":{{"at&t", "customization" }}, "message":" like at&t its customization is amazing:)"}
-{"message-id": 430, "author-id": 78, "timestamp":datetime("2007-09-07T18:09:35"), "in-response-to": 1869, "sender-location":point("26.1,89.41"), "tags":{{"samsung", "shortcut-menu" }}, "message":" hate samsung its shortcut-menu is terrible"}
-{"message-id": 431, "author-id": 78, "timestamp":datetime("2010-02-17T02:17:04"), "in-response-to": 36, "sender-location":point("26.82,84.53"), "tags":{{"verizon", "speed" }}, "message":" dislike verizon its speed is horrible"}
-{"message-id": 432, "author-id": 79, "timestamp":datetime("2014-03-17T07:55:45"), "in-response-to": 2813, "sender-location":point("47.6,95.01"), "tags":{{"motorola", "customization" }}, "message":" hate motorola its customization is horrible"}
-{"message-id": 433, "author-id": 79, "timestamp":datetime("2013-12-25T22:39:36"), "in-response-to": 2349, "sender-location":point("35.89,87.93"), "tags":{{"samsung", "voicemail-service" }}, "message":" hate samsung the voicemail-service is bad:("}
-{"message-id": 434, "author-id": 79, "timestamp":datetime("2013-10-04T06:04:50"), "in-response-to": 1256, "sender-location":point("38.89,92.41"), "tags":{{"motorola", "customization" }}, "message":" like motorola its customization is mind-blowing:)"}
-{"message-id": 435, "author-id": 80, "timestamp":datetime("2007-10-19T00:56:04"), "in-response-to": 1143, "sender-location":point("28.55,84.93"), "tags":{{"iphone", "shortcut-menu" }}, "message":" dislike iphone its shortcut-menu is bad:("}
-{"message-id": 436, "author-id": 80, "timestamp":datetime("2014-07-26T20:44:16"), "in-response-to": 2724, "sender-location":point("46.87,97.34"), "tags":{{"motorola", "customization" }}, "message":" can't stand motorola its customization is OMG:("}
-{"message-id": 437, "author-id": 80, "timestamp":datetime("2009-03-15T11:06:22"), "in-response-to": 3143, "sender-location":point("34.59,80.46"), "tags":{{"sprint", "network" }}, "message":" can't stand sprint the network is OMG"}
-{"message-id": 438, "author-id": 81, "timestamp":datetime("2008-07-12T03:14:32"), "in-response-to": 2871, "sender-location":point("47.66,94.44"), "tags":{{"sprint", "platform" }}, "message":" dislike sprint its platform is terrible:("}
-{"message-id": 439, "author-id": 81, "timestamp":datetime("2005-05-18T17:56:04"), "in-response-to": 2718, "sender-location":point("44.28,94.91"), "tags":{{"motorola", "network" }}, "message":" love motorola its network is mind-blowing"}
-{"message-id": 440, "author-id": 81, "timestamp":datetime("2010-08-14T04:11:35"), "in-response-to": 1522, "sender-location":point("27.23,81.81"), "tags":{{"verizon", "customer-service" }}, "message":" can't stand verizon the customer-service is terrible:("}
-{"message-id": 441, "author-id": 82, "timestamp":datetime("2009-09-18T21:12:52"), "in-response-to": 541, "sender-location":point("43.82,86.11"), "tags":{{"motorola", "plan" }}, "message":" love motorola its plan is mind-blowing:)"}
-{"message-id": 442, "author-id": 82, "timestamp":datetime("2006-02-01T13:46:02"), "in-response-to": 3063, "sender-location":point("45.29,79.44"), "tags":{{"sprint", "speed" }}, "message":" love sprint the speed is mind-blowing:)"}
-{"message-id": 443, "author-id": 82, "timestamp":datetime("2007-05-18T03:07:58"), "in-response-to": 961, "sender-location":point("31.68,85.75"), "tags":{{"t-mobile", "speed" }}, "message":" dislike t-mobile the speed is OMG"}
-{"message-id": 444, "author-id": 83, "timestamp":datetime("2009-03-03T00:02:19"), "in-response-to": 2847, "sender-location":point("38.93,67.75"), "tags":{{"at&t", "network" }}, "message":" love at&t its network is good"}
-{"message-id": 445, "author-id": 83, "timestamp":datetime("2010-07-28T00:34:41"), "in-response-to": 2363, "sender-location":point("29.33,91.91"), "tags":{{"sprint", "signal" }}, "message":" like sprint the signal is good"}
-{"message-id": 446, "author-id": 83, "timestamp":datetime("2010-09-10T07:23:02"), "in-response-to": 2002, "sender-location":point("33.55,87.63"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola its voicemail-service is amazing"}
-{"message-id": 447, "author-id": 84, "timestamp":datetime("2009-07-15T22:27:00"), "in-response-to": 2170, "sender-location":point("24.42,71.46"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" can't stand t-mobile its voice-clarity is OMG:("}
-{"message-id": 448, "author-id": 84, "timestamp":datetime("2011-05-02T07:19:06"), "in-response-to": 801, "sender-location":point("29.52,77.09"), "tags":{{"sprint", "speed" }}, "message":" love sprint the speed is good:)"}
-{"message-id": 449, "author-id": 84, "timestamp":datetime("2008-11-02T16:31:42"), "in-response-to": 2874, "sender-location":point("26.03,69.64"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon its voice-command is good:)"}
-{"message-id": 450, "author-id": 85, "timestamp":datetime("2012-07-26T13:33:40"), "in-response-to": 2707, "sender-location":point("28.27,83.16"), "tags":{{"samsung", "signal" }}, "message":" like samsung its signal is awesome:)"}
-{"message-id": 451, "author-id": 85, "timestamp":datetime("2007-04-28T22:26:44"), "in-response-to": 175, "sender-location":point("28.47,72.65"), "tags":{{"t-mobile", "reachability" }}, "message":" love t-mobile its reachability is good:)"}
-{"message-id": 452, "author-id": 85, "timestamp":datetime("2005-03-12T07:42:48"), "in-response-to": 1416, "sender-location":point("33.9,94.39"), "tags":{{"sprint", "voicemail-service" }}, "message":" can't stand sprint the voicemail-service is horrible"}
-{"message-id": 453, "author-id": 86, "timestamp":datetime("2006-06-27T03:29:49"), "in-response-to": 2738, "sender-location":point("38.86,71.81"), "tags":{{"at&t", "3G" }}, "message":" can't stand at&t its 3G is bad:("}
-{"message-id": 454, "author-id": 86, "timestamp":datetime("2010-03-02T06:29:03"), "in-response-to": 852, "sender-location":point("34.88,72.45"), "tags":{{"t-mobile", "voice-command" }}, "message":" can't stand t-mobile its voice-command is bad"}
-{"message-id": 455, "author-id": 86, "timestamp":datetime("2006-01-01T17:53:26"), "in-response-to": 2636, "sender-location":point("31.42,66.55"), "tags":{{"at&t", "customization" }}, "message":" love at&t its customization is mind-blowing"}
-{"message-id": 456, "author-id": 87, "timestamp":datetime("2011-07-22T17:21:43"), "in-response-to": 726, "sender-location":point("38.67,72.48"), "tags":{{"sprint", "3G" }}, "message":" love sprint the 3G is good:)"}
-{"message-id": 457, "author-id": 87, "timestamp":datetime("2014-05-12T23:50:00"), "in-response-to": 1978, "sender-location":point("46.37,95.43"), "tags":{{"sprint", "3G" }}, "message":" can't stand sprint its 3G is OMG"}
-{"message-id": 458, "author-id": 87, "timestamp":datetime("2013-03-27T20:00:00"), "in-response-to": 2742, "sender-location":point("34.37,67.85"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone the voice-command is terrible"}
-{"message-id": 459, "author-id": 88, "timestamp":datetime("2010-03-20T19:16:26"), "in-response-to": 1344, "sender-location":point("35.35,81.5"), "tags":{{"samsung", "plan" }}, "message":" like samsung its plan is good:)"}
-{"message-id": 460, "author-id": 88, "timestamp":datetime("2005-04-10T05:27:01"), "in-response-to": 1774, "sender-location":point("41.24,82.6"), "tags":{{"iphone", "voice-command" }}, "message":" dislike iphone its voice-command is OMG:("}
-{"message-id": 461, "author-id": 88, "timestamp":datetime("2005-10-06T15:28:14"), "in-response-to": 106, "sender-location":point("28.98,69.71"), "tags":{{"samsung", "touch-screen" }}, "message":" like samsung its touch-screen is good"}
-{"message-id": 462, "author-id": 89, "timestamp":datetime("2006-06-10T13:10:16"), "in-response-to": 517, "sender-location":point("37.83,96.7"), "tags":{{"verizon", "reachability" }}, "message":" hate verizon the reachability is OMG"}
-{"message-id": 463, "author-id": 89, "timestamp":datetime("2012-01-01T22:48:43"), "in-response-to": 2352, "sender-location":point("31.9,80.18"), "tags":{{"iphone", "network" }}, "message":" love iphone the network is awesome:)"}
-{"message-id": 464, "author-id": 89, "timestamp":datetime("2008-12-22T20:52:45"), "in-response-to": 784, "sender-location":point("34.64,76.36"), "tags":{{"at&t", "platform" }}, "message":" like at&t its platform is awesome:)"}
-{"message-id": 465, "author-id": 90, "timestamp":datetime("2013-09-06T06:43:50"), "in-response-to": 1330, "sender-location":point("35.51,92.06"), "tags":{{"sprint", "plan" }}, "message":" dislike sprint its plan is horrible"}
-{"message-id": 466, "author-id": 90, "timestamp":datetime("2012-12-20T01:04:15"), "in-response-to": 2503, "sender-location":point("45.69,83.87"), "tags":{{"at&t", "network" }}, "message":" love at&t the network is good"}
-{"message-id": 467, "author-id": 90, "timestamp":datetime("2006-01-01T16:33:06"), "in-response-to": 2122, "sender-location":point("40.84,91.11"), "tags":{{"sprint", "reachability" }}, "message":" hate sprint the reachability is horrible"}
-{"message-id": 468, "author-id": 91, "timestamp":datetime("2010-11-19T15:52:22"), "in-response-to": 1088, "sender-location":point("24.85,79.68"), "tags":{{"samsung", "signal" }}, "message":" love samsung its signal is amazing"}
-{"message-id": 469, "author-id": 91, "timestamp":datetime("2010-02-05T23:29:11"), "in-response-to": 1667, "sender-location":point("24.55,81.94"), "tags":{{"t-mobile", "platform" }}, "message":" hate t-mobile the platform is horrible"}
-{"message-id": 470, "author-id": 91, "timestamp":datetime("2006-01-10T00:03:40"), "in-response-to": 162, "sender-location":point("44.66,68.74"), "tags":{{"samsung", "voice-clarity" }}, "message":" love samsung the voice-clarity is amazing"}
-{"message-id": 471, "author-id": 92, "timestamp":datetime("2012-07-04T11:53:37"), "in-response-to": 1420, "sender-location":point("48.26,87.94"), "tags":{{"at&t", "voice-clarity" }}, "message":" like at&t the voice-clarity is good:)"}
-{"message-id": 472, "author-id": 92, "timestamp":datetime("2009-01-06T20:47:37"), "in-response-to": 1379, "sender-location":point("25.18,80.81"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is mind-blowing"}
-{"message-id": 473, "author-id": 92, "timestamp":datetime("2006-07-08T13:50:32"), "in-response-to": 2993, "sender-location":point("31.73,81.38"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung its voice-clarity is horrible"}
-{"message-id": 474, "author-id": 93, "timestamp":datetime("2013-10-18T15:54:29"), "in-response-to": 1319, "sender-location":point("35.53,95.18"), "tags":{{"sprint", "shortcut-menu" }}, "message":" can't stand sprint its shortcut-menu is horrible"}
-{"message-id": 475, "author-id": 93, "timestamp":datetime("2011-02-01T21:38:26"), "in-response-to": 1914, "sender-location":point("37.75,82.96"), "tags":{{"at&t", "speed" }}, "message":" hate at&t the speed is horrible:("}
-{"message-id": 476, "author-id": 94, "timestamp":datetime("2011-02-23T01:46:42"), "in-response-to": 48, "sender-location":point("28.26,88.25"), "tags":{{"at&t", "speed" }}, "message":" hate at&t the speed is bad:("}
-{"message-id": 477, "author-id": 94, "timestamp":datetime("2006-12-23T02:06:14"), "in-response-to": 2399, "sender-location":point("38.71,86.7"), "tags":{{"t-mobile", "3G" }}, "message":" can't stand t-mobile its 3G is bad:("}
-{"message-id": 478, "author-id": 95, "timestamp":datetime("2014-02-20T20:04:09"), "in-response-to": 3239, "sender-location":point("26.35,69.9"), "tags":{{"sprint", "customization" }}, "message":" dislike sprint its customization is OMG:("}
-{"message-id": 479, "author-id": 95, "timestamp":datetime("2005-09-05T20:48:15"), "in-response-to": 835, "sender-location":point("35.89,69.72"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" dislike t-mobile the voice-clarity is horrible"}
-{"message-id": 480, "author-id": 96, "timestamp":datetime("2007-10-22T12:09:52"), "in-response-to": 1859, "sender-location":point("42.67,68.97"), "tags":{{"sprint", "touch-screen" }}, "message":" love sprint its touch-screen is amazing:)"}
-{"message-id": 481, "author-id": 96, "timestamp":datetime("2007-07-20T17:44:54"), "in-response-to": 2950, "sender-location":point("48.04,93.9"), "tags":{{"motorola", "customization" }}, "message":" love motorola its customization is amazing:)"}
-{"message-id": 482, "author-id": 97, "timestamp":datetime("2007-09-21T19:26:22"), "in-response-to": 2812, "sender-location":point("32.59,68.19"), "tags":{{"at&t", "customer-service" }}, "message":" love at&t the customer-service is mind-blowing"}
-{"message-id": 483, "author-id": 97, "timestamp":datetime("2012-01-17T23:13:12"), "in-response-to": 166, "sender-location":point("38.39,87.2"), "tags":{{"verizon", "signal" }}, "message":" hate verizon the signal is horrible:("}
-{"message-id": 484, "author-id": 98, "timestamp":datetime("2010-07-19T06:48:41"), "in-response-to": 2411, "sender-location":point("36.8,76.33"), "tags":{{"at&t", "plan" }}, "message":" hate at&t the plan is OMG"}
-{"message-id": 485, "author-id": 98, "timestamp":datetime("2007-01-12T08:20:11"), "in-response-to": 1059, "sender-location":point("41.18,84.98"), "tags":{{"samsung", "wireless" }}, "message":" can't stand samsung the wireless is horrible:("}
-{"message-id": 486, "author-id": 99, "timestamp":datetime("2007-07-04T13:04:04"), "in-response-to": 2715, "sender-location":point("26.08,93.16"), "tags":{{"t-mobile", "3G" }}, "message":" dislike t-mobile the 3G is OMG"}
-{"message-id": 487, "author-id": 99, "timestamp":datetime("2011-08-10T23:47:28"), "in-response-to": 3071, "sender-location":point("33.83,81.48"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola the platform is OMG:("}
-{"message-id": 488, "author-id": 100, "timestamp":datetime("2006-05-22T06:43:22"), "in-response-to": 2294, "sender-location":point("34.22,97.77"), "tags":{{"t-mobile", "touch-screen" }}, "message":" love t-mobile the touch-screen is mind-blowing"}
-{"message-id": 489, "author-id": 100, "timestamp":datetime("2010-04-18T01:14:55"), "in-response-to": 2500, "sender-location":point("37.87,71.04"), "tags":{{"iphone", "plan" }}, "message":" love iphone the plan is awesome"}
-{"message-id": 490, "author-id": 101, "timestamp":datetime("2011-12-07T08:22:04"), "in-response-to": 82, "sender-location":point("29.84,74.52"), "tags":{{"motorola", "touch-screen" }}, "message":" like motorola the touch-screen is amazing:)"}
-{"message-id": 491, "author-id": 101, "timestamp":datetime("2012-05-16T19:31:15"), "in-response-to": 2498, "sender-location":point("43.36,94.0"), "tags":{{"at&t", "touch-screen" }}, "message":" like at&t its touch-screen is good:)"}
-{"message-id": 492, "author-id": 102, "timestamp":datetime("2012-05-12T17:29:27"), "in-response-to": 201, "sender-location":point("26.49,78.11"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" dislike t-mobile the shortcut-menu is OMG"}
-{"message-id": 493, "author-id": 102, "timestamp":datetime("2014-07-17T22:53:36"), "in-response-to": 2696, "sender-location":point("39.03,79.43"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone its voice-clarity is amazing:)"}
-{"message-id": 494, "author-id": 103, "timestamp":datetime("2007-06-03T14:37:15"), "in-response-to": 2996, "sender-location":point("40.46,81.7"), "tags":{{"iphone", "3G" }}, "message":" love iphone its 3G is mind-blowing:)"}
-{"message-id": 495, "author-id": 103, "timestamp":datetime("2006-02-10T09:09:18"), "in-response-to": 2700, "sender-location":point("25.01,88.73"), "tags":{{"verizon", "network" }}, "message":" like verizon its network is awesome"}
-{"message-id": 496, "author-id": 104, "timestamp":datetime("2012-06-12T09:02:06"), "in-response-to": 3249, "sender-location":point("24.02,69.02"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" like t-mobile its voice-clarity is mind-blowing:)"}
-{"message-id": 497, "author-id": 104, "timestamp":datetime("2008-12-24T07:26:30"), "in-response-to": 558, "sender-location":point("24.03,73.41"), "tags":{{"verizon", "plan" }}, "message":" love verizon its plan is good:)"}
-{"message-id": 498, "author-id": 105, "timestamp":datetime("2012-03-12T00:44:22"), "in-response-to": 1863, "sender-location":point("28.04,91.15"), "tags":{{"motorola", "3G" }}, "message":" love motorola the 3G is awesome:)"}
-{"message-id": 499, "author-id": 105, "timestamp":datetime("2014-02-10T23:47:09"), "in-response-to": 1179, "sender-location":point("27.95,91.12"), "tags":{{"verizon", "customization" }}, "message":" hate verizon the customization is bad"}
-{"message-id": 500, "author-id": 106, "timestamp":datetime("2011-01-21T17:01:19"), "in-response-to": 715, "sender-location":point("25.3,83.44"), "tags":{{"verizon", "voice-command" }}, "message":" dislike verizon its voice-command is bad:("}
-{"message-id": 501, "author-id": 106, "timestamp":datetime("2014-04-18T03:46:11"), "in-response-to": 1225, "sender-location":point("35.9,93.44"), "tags":{{"iphone", "reachability" }}, "message":" love iphone its reachability is awesome"}
-{"message-id": 502, "author-id": 107, "timestamp":datetime("2005-09-07T14:10:28"), "in-response-to": 531, "sender-location":point("37.01,91.15"), "tags":{{"verizon", "network" }}, "message":" love verizon the network is awesome:)"}
-{"message-id": 503, "author-id": 107, "timestamp":datetime("2010-04-17T12:42:04"), "in-response-to": 1757, "sender-location":point("29.54,77.36"), "tags":{{"iphone", "network" }}, "message":" love iphone its network is awesome"}
-{"message-id": 504, "author-id": 108, "timestamp":datetime("2006-04-20T09:48:01"), "in-response-to": 1098, "sender-location":point("32.81,66.19"), "tags":{{"verizon", "plan" }}, "message":" dislike verizon its plan is horrible"}
-{"message-id": 505, "author-id": 108, "timestamp":datetime("2011-07-18T00:06:17"), "in-response-to": 337, "sender-location":point("25.43,96.08"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" can't stand t-mobile its voicemail-service is OMG"}
-{"message-id": 506, "author-id": 109, "timestamp":datetime("2011-01-26T22:59:08"), "in-response-to": 3079, "sender-location":point("44.39,79.03"), "tags":{{"t-mobile", "touch-screen" }}, "message":" love t-mobile the touch-screen is good:)"}
-{"message-id": 507, "author-id": 109, "timestamp":datetime("2012-02-28T22:36:11"), "in-response-to": 22, "sender-location":point("36.91,73.99"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" can't stand t-mobile its shortcut-menu is bad:("}
-{"message-id": 508, "author-id": 110, "timestamp":datetime("2006-11-10T20:25:29"), "in-response-to": 1758, "sender-location":point("29.38,82.02"), "tags":{{"sprint", "signal" }}, "message":" can't stand sprint the signal is OMG:("}
-{"message-id": 509, "author-id": 110, "timestamp":datetime("2009-02-11T17:19:22"), "in-response-to": 1232, "sender-location":point("25.88,66.83"), "tags":{{"motorola", "3G" }}, "message":" like motorola its 3G is mind-blowing:)"}
-{"message-id": 510, "author-id": 111, "timestamp":datetime("2013-06-10T14:14:12"), "in-response-to": 2544, "sender-location":point("36.85,92.15"), "tags":{{"motorola", "voice-clarity" }}, "message":" can't stand motorola its voice-clarity is OMG:("}
-{"message-id": 511, "author-id": 111, "timestamp":datetime("2009-09-18T23:09:58"), "in-response-to": 345, "sender-location":point("40.74,74.8"), "tags":{{"at&t", "reachability" }}, "message":" love at&t its reachability is awesome:)"}
-{"message-id": 512, "author-id": 112, "timestamp":datetime("2008-04-03T03:58:44"), "in-response-to": 1279, "sender-location":point("27.25,72.12"), "tags":{{"iphone", "wireless" }}, "message":" can't stand iphone its wireless is OMG"}
-{"message-id": 513, "author-id": 112, "timestamp":datetime("2005-10-04T02:20:01"), "in-response-to": 1204, "sender-location":point("42.08,85.42"), "tags":{{"at&t", "signal" }}, "message":" hate at&t the signal is horrible"}
-{"message-id": 514, "author-id": 113, "timestamp":datetime("2006-08-23T23:42:14"), "in-response-to": 3225, "sender-location":point("30.77,94.0"), "tags":{{"samsung", "voice-clarity" }}, "message":" love samsung the voice-clarity is good:)"}
-{"message-id": 515, "author-id": 113, "timestamp":datetime("2005-05-18T09:17:14"), "in-response-to": 908, "sender-location":point("35.89,91.22"), "tags":{{"iphone", "voice-clarity" }}, "message":" dislike iphone its voice-clarity is horrible:("}
-{"message-id": 516, "author-id": 114, "timestamp":datetime("2012-04-15T13:15:26"), "in-response-to": 1035, "sender-location":point("42.19,87.34"), "tags":{{"motorola", "speed" }}, "message":" like motorola its speed is amazing"}
-{"message-id": 517, "author-id": 114, "timestamp":datetime("2009-03-18T10:03:43"), "in-response-to": 2649, "sender-location":point("47.44,67.1"), "tags":{{"iphone", "plan" }}, "message":" like iphone its plan is good"}
-{"message-id": 518, "author-id": 115, "timestamp":datetime("2013-01-14T07:09:54"), "in-response-to": 537, "sender-location":point("27.82,87.62"), "tags":{{"t-mobile", "signal" }}, "message":" like t-mobile its signal is good"}
-{"message-id": 519, "author-id": 115, "timestamp":datetime("2006-02-26T10:59:51"), "in-response-to": 106, "sender-location":point("37.54,79.79"), "tags":{{"t-mobile", "customer-service" }}, "message":" like t-mobile its customer-service is awesome:)"}
-{"message-id": 520, "author-id": 116, "timestamp":datetime("2010-06-18T05:03:58"), "in-response-to": 1459, "sender-location":point("27.07,77.73"), "tags":{{"t-mobile", "voice-command" }}, "message":" like t-mobile the voice-command is good"}
-{"message-id": 521, "author-id": 116, "timestamp":datetime("2011-10-27T21:25:40"), "in-response-to": 643, "sender-location":point("45.17,74.19"), "tags":{{"sprint", "shortcut-menu" }}, "message":" hate sprint the shortcut-menu is terrible:("}
-{"message-id": 522, "author-id": 117, "timestamp":datetime("2012-10-24T11:23:26"), "in-response-to": 1157, "sender-location":point("47.66,75.63"), "tags":{{"sprint", "signal" }}, "message":" dislike sprint its signal is bad:("}
-{"message-id": 523, "author-id": 117, "timestamp":datetime("2010-11-04T05:55:47"), "in-response-to": 3119, "sender-location":point("35.44,93.4"), "tags":{{"motorola", "wireless" }}, "message":" love motorola the wireless is mind-blowing"}
-{"message-id": 524, "author-id": 118, "timestamp":datetime("2012-04-04T07:45:24"), "in-response-to": 1432, "sender-location":point("43.6,89.81"), "tags":{{"samsung", "speed" }}, "message":" dislike samsung its speed is terrible"}
-{"message-id": 525, "author-id": 118, "timestamp":datetime("2014-05-11T20:07:02"), "in-response-to": 470, "sender-location":point("45.99,82.89"), "tags":{{"verizon", "customer-service" }}, "message":" can't stand verizon the customer-service is terrible"}
-{"message-id": 526, "author-id": 119, "timestamp":datetime("2013-10-03T23:13:59"), "in-response-to": 2298, "sender-location":point("45.52,74.44"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola the shortcut-menu is bad"}
-{"message-id": 527, "author-id": 119, "timestamp":datetime("2006-03-25T22:07:14"), "in-response-to": 1529, "sender-location":point("42.61,71.9"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" dislike t-mobile its shortcut-menu is terrible"}
-{"message-id": 528, "author-id": 120, "timestamp":datetime("2008-04-08T17:24:00"), "in-response-to": 1186, "sender-location":point("39.56,79.22"), "tags":{{"t-mobile", "reachability" }}, "message":" love t-mobile its reachability is mind-blowing"}
-{"message-id": 529, "author-id": 120, "timestamp":datetime("2010-03-23T20:39:45"), "in-response-to": 922, "sender-location":point("30.54,91.99"), "tags":{{"samsung", "platform" }}, "message":" love samsung the platform is awesome"}
-{"message-id": 530, "author-id": 121, "timestamp":datetime("2011-03-15T10:29:12"), "in-response-to": 674, "sender-location":point("34.7,85.58"), "tags":{{"verizon", "touch-screen" }}, "message":" dislike verizon its touch-screen is horrible:("}
-{"message-id": 531, "author-id": 121, "timestamp":datetime("2009-10-11T17:44:00"), "in-response-to": 159, "sender-location":point("45.45,80.75"), "tags":{{"verizon", "touch-screen" }}, "message":" hate verizon its touch-screen is OMG:("}
-{"message-id": 532, "author-id": 122, "timestamp":datetime("2014-04-14T01:13:49"), "in-response-to": 2217, "sender-location":point("30.45,87.54"), "tags":{{"iphone", "wireless" }}, "message":" like iphone the wireless is good:)"}
-{"message-id": 533, "author-id": 122, "timestamp":datetime("2010-11-19T23:00:01"), "in-response-to": 2510, "sender-location":point("33.56,74.54"), "tags":{{"motorola", "plan" }}, "message":" dislike motorola the plan is terrible"}
-{"message-id": 534, "author-id": 123, "timestamp":datetime("2013-02-26T19:10:01"), "in-response-to": 290, "sender-location":point("39.07,94.22"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile its shortcut-menu is mind-blowing:)"}
-{"message-id": 535, "author-id": 123, "timestamp":datetime("2009-09-16T16:09:24"), "in-response-to": 891, "sender-location":point("48.04,94.2"), "tags":{{"samsung", "shortcut-menu" }}, "message":" can't stand samsung the shortcut-menu is OMG:("}
-{"message-id": 536, "author-id": 124, "timestamp":datetime("2014-05-27T08:38:57"), "in-response-to": 2984, "sender-location":point("38.78,82.91"), "tags":{{"verizon", "wireless" }}, "message":" like verizon the wireless is amazing"}
-{"message-id": 537, "author-id": 124, "timestamp":datetime("2014-07-02T18:24:43"), "in-response-to": 961, "sender-location":point("46.76,67.89"), "tags":{{"verizon", "voicemail-service" }}, "message":" dislike verizon its voicemail-service is OMG"}
-{"message-id": 538, "author-id": 125, "timestamp":datetime("2010-04-18T18:08:44"), "in-response-to": 2868, "sender-location":point("45.37,94.67"), "tags":{{"samsung", "platform" }}, "message":" like samsung the platform is good"}
-{"message-id": 539, "author-id": 125, "timestamp":datetime("2012-11-28T23:02:35"), "in-response-to": 830, "sender-location":point("31.67,74.93"), "tags":{{"at&t", "customization" }}, "message":" like at&t its customization is good:)"}
-{"message-id": 540, "author-id": 126, "timestamp":datetime("2013-12-08T18:15:17"), "in-response-to": 2941, "sender-location":point("43.61,78.53"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint its voice-clarity is mind-blowing"}
-{"message-id": 541, "author-id": 126, "timestamp":datetime("2008-02-28T04:43:38"), "in-response-to": 2588, "sender-location":point("47.07,66.62"), "tags":{{"at&t", "voice-clarity" }}, "message":" dislike at&t its voice-clarity is horrible:("}
-{"message-id": 542, "author-id": 127, "timestamp":datetime("2012-11-23T03:34:33"), "in-response-to": 2243, "sender-location":point("35.7,76.55"), "tags":{{"verizon", "reachability" }}, "message":" can't stand verizon the reachability is OMG:("}
-{"message-id": 543, "author-id": 127, "timestamp":datetime("2011-04-25T05:54:50"), "in-response-to": 2234, "sender-location":point("25.06,79.03"), "tags":{{"t-mobile", "network" }}, "message":" love t-mobile its network is good:)"}
-{"message-id": 544, "author-id": 128, "timestamp":datetime("2011-03-19T00:02:32"), "in-response-to": 1747, "sender-location":point("25.42,88.77"), "tags":{{"motorola", "customization" }}, "message":" like motorola the customization is mind-blowing"}
-{"message-id": 545, "author-id": 128, "timestamp":datetime("2013-06-19T07:05:56"), "in-response-to": 1121, "sender-location":point("42.46,90.21"), "tags":{{"sprint", "signal" }}, "message":" love sprint the signal is mind-blowing:)"}
-{"message-id": 546, "author-id": 129, "timestamp":datetime("2006-11-21T21:00:22"), "in-response-to": 2727, "sender-location":point("39.22,94.96"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" love t-mobile the voicemail-service is good:)"}
-{"message-id": 547, "author-id": 129, "timestamp":datetime("2008-07-09T00:06:24"), "in-response-to": 1628, "sender-location":point("47.34,83.9"), "tags":{{"motorola", "voice-clarity" }}, "message":" like motorola the voice-clarity is amazing:)"}
-{"message-id": 548, "author-id": 130, "timestamp":datetime("2005-06-10T04:16:11"), "in-response-to": 2273, "sender-location":point("34.82,96.22"), "tags":{{"sprint", "voice-command" }}, "message":" like sprint its voice-command is mind-blowing"}
-{"message-id": 549, "author-id": 130, "timestamp":datetime("2006-11-10T13:39:34"), "in-response-to": 2781, "sender-location":point("40.21,86.88"), "tags":{{"samsung", "network" }}, "message":" dislike samsung its network is OMG"}
-{"message-id": 550, "author-id": 131, "timestamp":datetime("2006-10-08T03:04:54"), "in-response-to": 2094, "sender-location":point("38.43,89.3"), "tags":{{"iphone", "wireless" }}, "message":" hate iphone its wireless is horrible:("}
-{"message-id": 551, "author-id": 131, "timestamp":datetime("2011-08-21T21:17:41"), "in-response-to": 2451, "sender-location":point("45.84,81.12"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint the voicemail-service is OMG"}
-{"message-id": 552, "author-id": 132, "timestamp":datetime("2014-08-21T00:51:51"), "in-response-to": 332, "sender-location":point("37.47,80.87"), "tags":{{"sprint", "shortcut-menu" }}, "message":" hate sprint the shortcut-menu is OMG:("}
-{"message-id": 553, "author-id": 132, "timestamp":datetime("2010-01-15T01:40:18"), "in-response-to": 573, "sender-location":point("43.44,85.77"), "tags":{{"verizon", "customer-service" }}, "message":" like verizon the customer-service is good:)"}
-{"message-id": 554, "author-id": 133, "timestamp":datetime("2013-01-07T05:58:27"), "in-response-to": 969, "sender-location":point("47.47,69.31"), "tags":{{"verizon", "customization" }}, "message":" like verizon its customization is good"}
-{"message-id": 555, "author-id": 133, "timestamp":datetime("2009-07-26T02:53:51"), "in-response-to": 2593, "sender-location":point("39.27,72.79"), "tags":{{"motorola", "voicemail-service" }}, "message":" hate motorola the voicemail-service is OMG:("}
-{"message-id": 556, "author-id": 134, "timestamp":datetime("2011-03-05T19:24:06"), "in-response-to": 2202, "sender-location":point("30.18,80.25"), "tags":{{"verizon", "3G" }}, "message":" like verizon the 3G is mind-blowing"}
-{"message-id": 557, "author-id": 134, "timestamp":datetime("2012-04-14T01:47:58"), "in-response-to": 996, "sender-location":point("28.41,69.5"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola the voicemail-service is amazing"}
-{"message-id": 558, "author-id": 135, "timestamp":datetime("2011-01-20T22:32:52"), "in-response-to": 2955, "sender-location":point("43.72,79.49"), "tags":{{"t-mobile", "customer-service" }}, "message":" hate t-mobile its customer-service is OMG:("}
-{"message-id": 559, "author-id": 135, "timestamp":datetime("2011-05-04T17:48:02"), "in-response-to": 2982, "sender-location":point("25.57,91.27"), "tags":{{"samsung", "voicemail-service" }}, "message":" love samsung its voicemail-service is amazing:)"}
-{"message-id": 560, "author-id": 136, "timestamp":datetime("2005-10-01T08:38:24"), "in-response-to": 2883, "sender-location":point("36.31,77.01"), "tags":{{"t-mobile", "platform" }}, "message":" hate t-mobile its platform is horrible"}
-{"message-id": 561, "author-id": 136, "timestamp":datetime("2009-05-27T05:29:48"), "in-response-to": 2512, "sender-location":point("27.07,91.11"), "tags":{{"sprint", "voicemail-service" }}, "message":" love sprint the voicemail-service is awesome:)"}
-{"message-id": 562, "author-id": 137, "timestamp":datetime("2007-10-05T02:01:30"), "in-response-to": 1283, "sender-location":point("30.94,78.59"), "tags":{{"at&t", "signal" }}, "message":" hate at&t the signal is OMG"}
-{"message-id": 563, "author-id": 137, "timestamp":datetime("2009-02-01T03:13:45"), "in-response-to": 1501, "sender-location":point("36.49,90.4"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" love t-mobile its voicemail-service is good"}
-{"message-id": 564, "author-id": 138, "timestamp":datetime("2014-08-18T05:33:13"), "in-response-to": 2471, "sender-location":point("46.9,80.35"), "tags":{{"sprint", "customer-service" }}, "message":" like sprint the customer-service is good:)"}
-{"message-id": 565, "author-id": 138, "timestamp":datetime("2012-03-09T07:51:50"), "in-response-to": 2666, "sender-location":point("32.88,68.13"), "tags":{{"verizon", "speed" }}, "message":" like verizon the speed is awesome:)"}
-{"message-id": 566, "author-id": 139, "timestamp":datetime("2012-08-08T02:49:56"), "in-response-to": 2842, "sender-location":point("42.67,96.55"), "tags":{{"iphone", "platform" }}, "message":" like iphone the platform is awesome:)"}
-{"message-id": 567, "author-id": 139, "timestamp":datetime("2013-12-15T06:31:56"), "in-response-to": 2327, "sender-location":point("36.73,94.71"), "tags":{{"motorola", "plan" }}, "message":" can't stand motorola its plan is bad"}
-{"message-id": 568, "author-id": 140, "timestamp":datetime("2009-02-13T12:09:33"), "in-response-to": 646, "sender-location":point("37.93,72.47"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile the shortcut-menu is good"}
-{"message-id": 569, "author-id": 140, "timestamp":datetime("2008-07-27T06:29:37"), "in-response-to": 836, "sender-location":point("44.15,68.64"), "tags":{{"verizon", "platform" }}, "message":" can't stand verizon its platform is OMG:("}
-{"message-id": 570, "author-id": 141, "timestamp":datetime("2013-05-13T23:18:03"), "in-response-to": 2803, "sender-location":point("39.4,94.6"), "tags":{{"verizon", "voicemail-service" }}, "message":" can't stand verizon the voicemail-service is terrible:("}
-{"message-id": 571, "author-id": 141, "timestamp":datetime("2014-03-09T12:48:37"), "in-response-to": 795, "sender-location":point("34.44,84.65"), "tags":{{"verizon", "platform" }}, "message":" can't stand verizon the platform is terrible"}
-{"message-id": 572, "author-id": 142, "timestamp":datetime("2007-12-12T01:50:08"), "in-response-to": 1287, "sender-location":point("37.74,66.02"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon the voice-command is good:)"}
-{"message-id": 573, "author-id": 142, "timestamp":datetime("2006-12-08T15:15:23"), "in-response-to": 2393, "sender-location":point("37.85,97.57"), "tags":{{"verizon", "voice-clarity" }}, "message":" dislike verizon its voice-clarity is bad"}
-{"message-id": 574, "author-id": 143, "timestamp":datetime("2008-02-25T01:14:29"), "in-response-to": 343, "sender-location":point("30.18,80.77"), "tags":{{"iphone", "3G" }}, "message":" hate iphone the 3G is OMG"}
-{"message-id": 575, "author-id": 143, "timestamp":datetime("2011-06-09T01:36:23"), "in-response-to": 3045, "sender-location":point("27.81,92.2"), "tags":{{"iphone", "network" }}, "message":" like iphone its network is amazing:)"}
-{"message-id": 576, "author-id": 144, "timestamp":datetime("2006-01-06T16:44:53"), "in-response-to": 1990, "sender-location":point("26.24,72.25"), "tags":{{"at&t", "voice-command" }}, "message":" can't stand at&t the voice-command is bad:("}
-{"message-id": 577, "author-id": 144, "timestamp":datetime("2014-07-05T10:30:22"), "in-response-to": 1877, "sender-location":point("37.26,66.55"), "tags":{{"at&t", "customization" }}, "message":" can't stand at&t the customization is horrible:("}
-{"message-id": 578, "author-id": 145, "timestamp":datetime("2008-07-03T10:31:20"), "in-response-to": 2312, "sender-location":point("34.3,85.15"), "tags":{{"motorola", "signal" }}, "message":" can't stand motorola the signal is horrible"}
-{"message-id": 579, "author-id": 145, "timestamp":datetime("2011-06-19T00:00:57"), "in-response-to": 1589, "sender-location":point("41.77,92.73"), "tags":{{"iphone", "customization" }}, "message":" love iphone the customization is awesome:)"}
-{"message-id": 580, "author-id": 146, "timestamp":datetime("2005-08-17T09:12:14"), "in-response-to": 3114, "sender-location":point("44.54,75.96"), "tags":{{"iphone", "touch-screen" }}, "message":" can't stand iphone the touch-screen is terrible"}
-{"message-id": 581, "author-id": 146, "timestamp":datetime("2014-03-15T06:24:47"), "in-response-to": 2050, "sender-location":point("42.85,70.97"), "tags":{{"samsung", "plan" }}, "message":" can't stand samsung the plan is OMG"}
-{"message-id": 582, "author-id": 147, "timestamp":datetime("2005-01-27T20:09:18"), "in-response-to": 1904, "sender-location":point("25.7,76.17"), "tags":{{"at&t", "reachability" }}, "message":" love at&t the reachability is amazing:)"}
-{"message-id": 583, "author-id": 147, "timestamp":datetime("2013-05-02T19:33:40"), "in-response-to": 2794, "sender-location":point("32.52,85.36"), "tags":{{"at&t", "shortcut-menu" }}, "message":" can't stand at&t the shortcut-menu is horrible:("}
-{"message-id": 584, "author-id": 148, "timestamp":datetime("2012-02-11T18:46:58"), "in-response-to": 1977, "sender-location":point("46.5,66.99"), "tags":{{"samsung", "voice-clarity" }}, "message":" dislike samsung the voice-clarity is OMG"}
-{"message-id": 585, "author-id": 148, "timestamp":datetime("2009-06-15T02:45:36"), "in-response-to": 2100, "sender-location":point("31.82,95.85"), "tags":{{"sprint", "plan" }}, "message":" like sprint its plan is mind-blowing:)"}
-{"message-id": 586, "author-id": 149, "timestamp":datetime("2007-06-03T19:03:32"), "in-response-to": 361, "sender-location":point("27.3,79.1"), "tags":{{"iphone", "voicemail-service" }}, "message":" dislike iphone the voicemail-service is OMG"}
-{"message-id": 587, "author-id": 149, "timestamp":datetime("2005-06-15T21:37:00"), "in-response-to": 3233, "sender-location":point("31.52,93.65"), "tags":{{"sprint", "shortcut-menu" }}, "message":" love sprint its shortcut-menu is awesome"}
-{"message-id": 588, "author-id": 150, "timestamp":datetime("2007-09-10T01:20:03"), "in-response-to": 759, "sender-location":point("44.58,93.52"), "tags":{{"motorola", "wireless" }}, "message":" like motorola its wireless is amazing:)"}
-{"message-id": 589, "author-id": 150, "timestamp":datetime("2009-05-20T08:44:29"), "in-response-to": 1479, "sender-location":point("28.06,73.74"), "tags":{{"motorola", "network" }}, "message":" like motorola its network is amazing:)"}
-{"message-id": 590, "author-id": 151, "timestamp":datetime("2008-09-11T15:18:05"), "in-response-to": 2720, "sender-location":point("36.43,90.41"), "tags":{{"sprint", "wireless" }}, "message":" dislike sprint the wireless is OMG"}
-{"message-id": 591, "author-id": 151, "timestamp":datetime("2013-04-07T04:00:02"), "in-response-to": 1802, "sender-location":point("32.87,81.93"), "tags":{{"verizon", "voice-command" }}, "message":" dislike verizon its voice-command is terrible"}
-{"message-id": 592, "author-id": 152, "timestamp":datetime("2014-02-11T05:25:23"), "in-response-to": 2166, "sender-location":point("32.57,83.94"), "tags":{{"samsung", "signal" }}, "message":" love samsung its signal is amazing"}
-{"message-id": 593, "author-id": 152, "timestamp":datetime("2013-10-12T08:37:22"), "in-response-to": 2341, "sender-location":point("41.23,96.62"), "tags":{{"motorola", "network" }}, "message":" hate motorola its network is terrible:("}
-{"message-id": 594, "author-id": 153, "timestamp":datetime("2014-06-25T10:36:37"), "in-response-to": 1752, "sender-location":point("28.97,79.43"), "tags":{{"sprint", "voice-clarity" }}, "message":" hate sprint its voice-clarity is bad:("}
-{"message-id": 595, "author-id": 153, "timestamp":datetime("2005-05-19T07:41:19"), "in-response-to": 1323, "sender-location":point("26.51,70.48"), "tags":{{"iphone", "reachability" }}, "message":" like iphone the reachability is mind-blowing"}
-{"message-id": 596, "author-id": 154, "timestamp":datetime("2014-07-20T07:06:21"), "in-response-to": 1249, "sender-location":point("25.62,78.1"), "tags":{{"samsung", "platform" }}, "message":" can't stand samsung the platform is terrible"}
-{"message-id": 597, "author-id": 154, "timestamp":datetime("2008-12-28T06:06:03"), "in-response-to": 358, "sender-location":point("31.35,81.47"), "tags":{{"t-mobile", "signal" }}, "message":" love t-mobile the signal is good"}
-{"message-id": 598, "author-id": 155, "timestamp":datetime("2007-11-21T09:45:03"), "in-response-to": 4, "sender-location":point("47.97,96.27"), "tags":{{"iphone", "network" }}, "message":" dislike iphone the network is bad"}
-{"message-id": 599, "author-id": 155, "timestamp":datetime("2014-07-03T10:22:40"), "in-response-to": 589, "sender-location":point("26.09,94.04"), "tags":{{"at&t", "signal" }}, "message":" hate at&t its signal is terrible:("}
-{"message-id": 600, "author-id": 156, "timestamp":datetime("2005-08-05T18:57:13"), "in-response-to": 1533, "sender-location":point("24.19,87.92"), "tags":{{"sprint", "customization" }}, "message":" hate sprint its customization is horrible"}
-{"message-id": 601, "author-id": 156, "timestamp":datetime("2007-06-23T08:06:44"), "in-response-to": 2075, "sender-location":point("42.32,90.77"), "tags":{{"samsung", "signal" }}, "message":" like samsung the signal is amazing:)"}
-{"message-id": 602, "author-id": 157, "timestamp":datetime("2010-06-03T10:04:40"), "in-response-to": 172, "sender-location":point("33.91,95.01"), "tags":{{"verizon", "speed" }}, "message":" can't stand verizon the speed is OMG"}
-{"message-id": 603, "author-id": 157, "timestamp":datetime("2006-08-12T02:43:38"), "in-response-to": 2504, "sender-location":point("26.73,88.59"), "tags":{{"at&t", "platform" }}, "message":" love at&t its platform is good"}
-{"message-id": 604, "author-id": 158, "timestamp":datetime("2013-08-27T19:51:49"), "in-response-to": 937, "sender-location":point("33.02,74.62"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon its shortcut-menu is amazing"}
-{"message-id": 605, "author-id": 158, "timestamp":datetime("2011-09-10T15:11:22"), "in-response-to": 1032, "sender-location":point("32.85,83.09"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung the voice-clarity is terrible:("}
-{"message-id": 606, "author-id": 159, "timestamp":datetime("2009-12-22T11:11:26"), "in-response-to": 2777, "sender-location":point("43.16,70.09"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung the voice-clarity is terrible:("}
-{"message-id": 607, "author-id": 159, "timestamp":datetime("2012-06-15T01:06:13"), "in-response-to": 1133, "sender-location":point("38.7,77.96"), "tags":{{"samsung", "speed" }}, "message":" love samsung its speed is amazing"}
-{"message-id": 608, "author-id": 160, "timestamp":datetime("2012-08-16T14:40:11"), "in-response-to": 1854, "sender-location":point("42.82,89.15"), "tags":{{"t-mobile", "platform" }}, "message":" dislike t-mobile the platform is terrible:("}
-{"message-id": 609, "author-id": 160, "timestamp":datetime("2013-01-25T09:43:07"), "in-response-to": 2039, "sender-location":point("36.09,84.19"), "tags":{{"at&t", "voice-clarity" }}, "message":" like at&t the voice-clarity is awesome:)"}
-{"message-id": 610, "author-id": 161, "timestamp":datetime("2008-03-06T18:28:37"), "in-response-to": 1208, "sender-location":point("26.75,90.44"), "tags":{{"t-mobile", "customization" }}, "message":" hate t-mobile its customization is terrible:("}
-{"message-id": 611, "author-id": 161, "timestamp":datetime("2010-06-22T22:07:18"), "in-response-to": 1400, "sender-location":point("45.59,75.86"), "tags":{{"samsung", "voicemail-service" }}, "message":" can't stand samsung the voicemail-service is bad"}
-{"message-id": 612, "author-id": 162, "timestamp":datetime("2012-07-07T14:35:45"), "in-response-to": 1218, "sender-location":point("32.73,80.77"), "tags":{{"iphone", "customer-service" }}, "message":" hate iphone the customer-service is OMG"}
-{"message-id": 613, "author-id": 162, "timestamp":datetime("2009-11-14T08:37:37"), "in-response-to": 981, "sender-location":point("31.14,70.64"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon the voicemail-service is mind-blowing:)"}
-{"message-id": 614, "author-id": 163, "timestamp":datetime("2005-04-15T06:52:16"), "in-response-to": 2546, "sender-location":point("28.72,74.82"), "tags":{{"sprint", "wireless" }}, "message":" hate sprint the wireless is OMG:("}
-{"message-id": 615, "author-id": 163, "timestamp":datetime("2013-06-06T09:34:22"), "in-response-to": 921, "sender-location":point("29.15,68.06"), "tags":{{"sprint", "wireless" }}, "message":" hate sprint its wireless is terrible:("}
-{"message-id": 616, "author-id": 164, "timestamp":datetime("2010-08-15T16:29:59"), "in-response-to": 39, "sender-location":point("34.47,96.34"), "tags":{{"samsung", "touch-screen" }}, "message":" like samsung its touch-screen is good:)"}
-{"message-id": 617, "author-id": 164, "timestamp":datetime("2012-01-03T19:54:06"), "in-response-to": 551, "sender-location":point("31.07,80.92"), "tags":{{"verizon", "reachability" }}, "message":" can't stand verizon its reachability is terrible"}
-{"message-id": 618, "author-id": 165, "timestamp":datetime("2010-04-21T00:43:45"), "in-response-to": 2870, "sender-location":point("33.63,75.16"), "tags":{{"verizon", "platform" }}, "message":" hate verizon the platform is horrible:("}
-{"message-id": 619, "author-id": 165, "timestamp":datetime("2012-06-03T18:35:34"), "in-response-to": 3136, "sender-location":point("41.07,90.68"), "tags":{{"verizon", "plan" }}, "message":" hate verizon the plan is terrible"}
-{"message-id": 620, "author-id": 166, "timestamp":datetime("2008-08-16T21:35:00"), "in-response-to": 2887, "sender-location":point("43.81,73.37"), "tags":{{"verizon", "speed" }}, "message":" love verizon the speed is amazing"}
-{"message-id": 621, "author-id": 166, "timestamp":datetime("2005-07-07T22:27:35"), "in-response-to": 3070, "sender-location":point("35.62,70.48"), "tags":{{"samsung", "signal" }}, "message":" dislike samsung its signal is horrible:("}
-{"message-id": 622, "author-id": 167, "timestamp":datetime("2011-05-23T14:51:19"), "in-response-to": 1838, "sender-location":point("45.04,77.95"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" dislike t-mobile its voicemail-service is terrible"}
-{"message-id": 623, "author-id": 167, "timestamp":datetime("2012-03-05T13:51:52"), "in-response-to": 1678, "sender-location":point("32.71,73.54"), "tags":{{"samsung", "voice-clarity" }}, "message":" can't stand samsung its voice-clarity is horrible"}
-{"message-id": 624, "author-id": 168, "timestamp":datetime("2005-11-18T17:59:20"), "in-response-to": 2669, "sender-location":point("28.78,89.01"), "tags":{{"at&t", "plan" }}, "message":" hate at&t its plan is OMG:("}
-{"message-id": 625, "author-id": 168, "timestamp":datetime("2007-06-17T16:15:16"), "in-response-to": 1907, "sender-location":point("42.45,78.91"), "tags":{{"samsung", "touch-screen" }}, "message":" hate samsung the touch-screen is bad:("}
-{"message-id": 626, "author-id": 169, "timestamp":datetime("2014-01-15T14:04:53"), "in-response-to": 585, "sender-location":point("42.82,83.09"), "tags":{{"sprint", "plan" }}, "message":" hate sprint the plan is bad:("}
-{"message-id": 627, "author-id": 169, "timestamp":datetime("2014-05-24T12:57:43"), "in-response-to": 2357, "sender-location":point("35.53,74.74"), "tags":{{"at&t", "3G" }}, "message":" love at&t the 3G is amazing:)"}
-{"message-id": 628, "author-id": 170, "timestamp":datetime("2011-09-21T21:24:23"), "in-response-to": 2167, "sender-location":point("30.29,76.12"), "tags":{{"samsung", "voice-command" }}, "message":" like samsung its voice-command is good"}
-{"message-id": 629, "author-id": 170, "timestamp":datetime("2010-07-13T08:07:20"), "in-response-to": 858, "sender-location":point("33.32,81.88"), "tags":{{"iphone", "3G" }}, "message":" love iphone its 3G is mind-blowing"}
-{"message-id": 630, "author-id": 171, "timestamp":datetime("2006-11-05T03:08:57"), "in-response-to": 2543, "sender-location":point("32.5,89.7"), "tags":{{"sprint", "platform" }}, "message":" hate sprint the platform is horrible"}
-{"message-id": 631, "author-id": 171, "timestamp":datetime("2013-12-12T00:40:12"), "in-response-to": 910, "sender-location":point("35.03,71.2"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile its plan is amazing"}
-{"message-id": 632, "author-id": 172, "timestamp":datetime("2014-03-19T20:35:24"), "in-response-to": 1414, "sender-location":point("27.47,83.01"), "tags":{{"t-mobile", "plan" }}, "message":" like t-mobile its plan is amazing"}
-{"message-id": 633, "author-id": 172, "timestamp":datetime("2010-10-16T20:53:02"), "in-response-to": 2034, "sender-location":point("40.52,76.61"), "tags":{{"motorola", "signal" }}, "message":" love motorola its signal is mind-blowing"}
-{"message-id": 634, "author-id": 173, "timestamp":datetime("2007-11-13T23:31:54"), "in-response-to": 1814, "sender-location":point("35.15,72.04"), "tags":{{"verizon", "voicemail-service" }}, "message":" dislike verizon its voicemail-service is bad"}
-{"message-id": 635, "author-id": 173, "timestamp":datetime("2005-10-03T12:50:02"), "in-response-to": 789, "sender-location":point("47.83,91.04"), "tags":{{"samsung", "speed" }}, "message":" love samsung the speed is amazing"}
-{"message-id": 636, "author-id": 174, "timestamp":datetime("2005-08-21T13:30:00"), "in-response-to": 2178, "sender-location":point("35.6,90.85"), "tags":{{"motorola", "wireless" }}, "message":" dislike motorola its wireless is terrible"}
-{"message-id": 637, "author-id": 174, "timestamp":datetime("2013-04-11T00:06:13"), "in-response-to": 175, "sender-location":point("34.48,88.01"), "tags":{{"at&t", "reachability" }}, "message":" love at&t the reachability is good"}
-{"message-id": 638, "author-id": 175, "timestamp":datetime("2006-03-19T21:57:19"), "in-response-to": 1779, "sender-location":point("31.6,90.96"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t its voice-clarity is awesome"}
-{"message-id": 639, "author-id": 175, "timestamp":datetime("2005-01-26T15:22:04"), "in-response-to": 2636, "sender-location":point("45.34,80.99"), "tags":{{"samsung", "reachability" }}, "message":" like samsung the reachability is awesome"}
-{"message-id": 640, "author-id": 176, "timestamp":datetime("2009-06-25T06:47:17"), "in-response-to": 3246, "sender-location":point("36.58,69.4"), "tags":{{"verizon", "wireless" }}, "message":" like verizon the wireless is mind-blowing:)"}
-{"message-id": 641, "author-id": 176, "timestamp":datetime("2009-07-25T07:32:44"), "in-response-to": 968, "sender-location":point("28.19,66.21"), "tags":{{"at&t", "platform" }}, "message":" like at&t its platform is mind-blowing:)"}
-{"message-id": 642, "author-id": 177, "timestamp":datetime("2011-03-17T09:11:05"), "in-response-to": 2645, "sender-location":point("35.24,92.55"), "tags":{{"motorola", "wireless" }}, "message":" dislike motorola its wireless is horrible:("}
-{"message-id": 643, "author-id": 177, "timestamp":datetime("2006-11-11T22:08:38"), "in-response-to": 404, "sender-location":point("32.88,80.94"), "tags":{{"t-mobile", "voice-command" }}, "message":" dislike t-mobile its voice-command is bad:("}
-{"message-id": 644, "author-id": 178, "timestamp":datetime("2010-03-08T17:29:30"), "in-response-to": 1471, "sender-location":point("35.31,75.2"), "tags":{{"t-mobile", "customer-service" }}, "message":" love t-mobile its customer-service is awesome:)"}
-{"message-id": 645, "author-id": 178, "timestamp":datetime("2011-06-05T08:23:05"), "in-response-to": 815, "sender-location":point("38.15,68.74"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" like t-mobile its voice-clarity is awesome:)"}
-{"message-id": 646, "author-id": 179, "timestamp":datetime("2005-10-04T05:05:40"), "in-response-to": 2918, "sender-location":point("26.88,83.5"), "tags":{{"motorola", "network" }}, "message":" like motorola its network is amazing:)"}
-{"message-id": 647, "author-id": 179, "timestamp":datetime("2005-07-12T03:06:49"), "in-response-to": 854, "sender-location":point("40.24,83.23"), "tags":{{"samsung", "customization" }}, "message":" dislike samsung the customization is terrible"}
-{"message-id": 648, "author-id": 180, "timestamp":datetime("2006-10-20T21:23:14"), "in-response-to": 2962, "sender-location":point("43.03,96.56"), "tags":{{"sprint", "reachability" }}, "message":" dislike sprint its reachability is bad"}
-{"message-id": 649, "author-id": 180, "timestamp":datetime("2014-04-07T07:08:01"), "in-response-to": 782, "sender-location":point("45.78,93.81"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint the voice-clarity is mind-blowing:)"}
-{"message-id": 650, "author-id": 181, "timestamp":datetime("2007-04-12T10:06:10"), "in-response-to": 2609, "sender-location":point("46.75,83.76"), "tags":{{"motorola", "wireless" }}, "message":" dislike motorola the wireless is bad"}
-{"message-id": 651, "author-id": 181, "timestamp":datetime("2013-09-03T22:00:24"), "in-response-to": 1701, "sender-location":point("28.21,66.67"), "tags":{{"motorola", "touch-screen" }}, "message":" can't stand motorola the touch-screen is horrible"}
-{"message-id": 652, "author-id": 182, "timestamp":datetime("2009-09-22T03:39:54"), "in-response-to": 2895, "sender-location":point("46.02,81.29"), "tags":{{"at&t", "speed" }}, "message":" hate at&t the speed is terrible"}
-{"message-id": 653, "author-id": 182, "timestamp":datetime("2014-04-14T23:56:20"), "in-response-to": 2371, "sender-location":point("28.92,80.36"), "tags":{{"motorola", "customer-service" }}, "message":" can't stand motorola its customer-service is OMG:("}
-{"message-id": 654, "author-id": 183, "timestamp":datetime("2010-08-26T16:44:40"), "in-response-to": 1111, "sender-location":point("28.56,69.51"), "tags":{{"sprint", "voice-command" }}, "message":" hate sprint its voice-command is OMG:("}
-{"message-id": 655, "author-id": 183, "timestamp":datetime("2008-07-06T06:40:33"), "in-response-to": 893, "sender-location":point("40.86,71.02"), "tags":{{"motorola", "wireless" }}, "message":" dislike motorola the wireless is bad:("}
-{"message-id": 656, "author-id": 184, "timestamp":datetime("2008-10-06T10:47:12"), "in-response-to": 2212, "sender-location":point("40.49,72.43"), "tags":{{"at&t", "shortcut-menu" }}, "message":" can't stand at&t its shortcut-menu is bad"}
-{"message-id": 657, "author-id": 184, "timestamp":datetime("2013-04-19T00:20:16"), "in-response-to": 3176, "sender-location":point("33.22,88.03"), "tags":{{"sprint", "shortcut-menu" }}, "message":" can't stand sprint the shortcut-menu is terrible:("}
-{"message-id": 658, "author-id": 185, "timestamp":datetime("2007-10-16T12:23:46"), "in-response-to": 1503, "sender-location":point("33.97,78.06"), "tags":{{"motorola", "customer-service" }}, "message":" dislike motorola its customer-service is horrible"}
-{"message-id": 659, "author-id": 185, "timestamp":datetime("2008-09-14T03:08:53"), "in-response-to": 1128, "sender-location":point("27.68,73.55"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone the voice-command is bad"}
-{"message-id": 660, "author-id": 186, "timestamp":datetime("2005-04-24T17:15:30"), "in-response-to": 2390, "sender-location":point("39.9,67.84"), "tags":{{"iphone", "platform" }}, "message":" like iphone the platform is mind-blowing"}
-{"message-id": 661, "author-id": 186, "timestamp":datetime("2012-03-02T03:06:37"), "in-response-to": 456, "sender-location":point("33.67,95.11"), "tags":{{"t-mobile", "reachability" }}, "message":" can't stand t-mobile the reachability is OMG:("}
-{"message-id": 662, "author-id": 187, "timestamp":datetime("2012-12-15T21:04:47"), "in-response-to": 691, "sender-location":point("44.05,84.83"), "tags":{{"motorola", "plan" }}, "message":" love motorola the plan is awesome:)"}
-{"message-id": 663, "author-id": 187, "timestamp":datetime("2005-12-25T19:05:36"), "in-response-to": 501, "sender-location":point("47.47,97.78"), "tags":{{"motorola", "shortcut-menu" }}, "message":" love motorola the shortcut-menu is mind-blowing:)"}
-{"message-id": 664, "author-id": 188, "timestamp":datetime("2005-12-15T01:37:35"), "in-response-to": 1948, "sender-location":point("25.18,94.71"), "tags":{{"t-mobile", "wireless" }}, "message":" can't stand t-mobile its wireless is terrible:("}
-{"message-id": 665, "author-id": 188, "timestamp":datetime("2012-05-19T22:16:31"), "in-response-to": 58, "sender-location":point("44.66,79.67"), "tags":{{"at&t", "3G" }}, "message":" love at&t the 3G is mind-blowing"}
-{"message-id": 666, "author-id": 189, "timestamp":datetime("2013-11-06T02:34:46"), "in-response-to": 1268, "sender-location":point("38.22,95.05"), "tags":{{"verizon", "network" }}, "message":" like verizon the network is amazing"}
-{"message-id": 667, "author-id": 189, "timestamp":datetime("2008-07-15T14:17:12"), "in-response-to": 1188, "sender-location":point("37.09,86.12"), "tags":{{"verizon", "voice-clarity" }}, "message":" love verizon the voice-clarity is awesome"}
-{"message-id": 668, "author-id": 190, "timestamp":datetime("2007-03-09T12:30:33"), "in-response-to": 2996, "sender-location":point("27.97,81.26"), "tags":{{"iphone", "voice-command" }}, "message":" like iphone its voice-command is awesome:)"}
-{"message-id": 669, "author-id": 190, "timestamp":datetime("2005-02-14T06:53:40"), "in-response-to": 2004, "sender-location":point("48.65,88.18"), "tags":{{"sprint", "reachability" }}, "message":" love sprint the reachability is amazing:)"}
-{"message-id": 670, "author-id": 191, "timestamp":datetime("2009-08-20T19:12:29"), "in-response-to": 1111, "sender-location":point("47.99,91.54"), "tags":{{"samsung", "network" }}, "message":" love samsung its network is good:)"}
-{"message-id": 671, "author-id": 191, "timestamp":datetime("2012-11-19T16:46:05"), "in-response-to": 2343, "sender-location":point("25.88,72.48"), "tags":{{"motorola", "platform" }}, "message":" love motorola its platform is amazing"}
-{"message-id": 672, "author-id": 192, "timestamp":datetime("2005-03-09T21:20:12"), "in-response-to": 1258, "sender-location":point("42.8,81.23"), "tags":{{"motorola", "platform" }}, "message":" dislike motorola the platform is horrible:("}
-{"message-id": 673, "author-id": 192, "timestamp":datetime("2007-07-15T00:37:24"), "in-response-to": 3170, "sender-location":point("30.63,79.94"), "tags":{{"verizon", "reachability" }}, "message":" like verizon the reachability is amazing"}
-{"message-id": 674, "author-id": 193, "timestamp":datetime("2009-08-09T10:55:12"), "in-response-to": 2368, "sender-location":point("43.23,78.65"), "tags":{{"samsung", "wireless" }}, "message":" like samsung the wireless is good"}
-{"message-id": 675, "author-id": 193, "timestamp":datetime("2011-06-18T19:38:54"), "in-response-to": 1595, "sender-location":point("40.99,88.4"), "tags":{{"samsung", "plan" }}, "message":" hate samsung its plan is OMG:("}
-{"message-id": 676, "author-id": 194, "timestamp":datetime("2005-11-18T20:38:27"), "in-response-to": 696, "sender-location":point("42.15,79.18"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" like t-mobile the voicemail-service is mind-blowing:)"}
-{"message-id": 677, "author-id": 194, "timestamp":datetime("2014-01-15T02:13:00"), "in-response-to": 1701, "sender-location":point("36.29,70.38"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone the voice-clarity is good"}
-{"message-id": 678, "author-id": 195, "timestamp":datetime("2011-10-25T21:32:45"), "in-response-to": 509, "sender-location":point("28.82,91.76"), "tags":{{"at&t", "speed" }}, "message":" dislike at&t its speed is horrible:("}
-{"message-id": 679, "author-id": 195, "timestamp":datetime("2006-04-17T06:39:27"), "in-response-to": 2179, "sender-location":point("31.44,97.63"), "tags":{{"samsung", "speed" }}, "message":" dislike samsung its speed is bad:("}
-{"message-id": 680, "author-id": 196, "timestamp":datetime("2012-06-16T22:40:02"), "in-response-to": 2438, "sender-location":point("40.97,93.83"), "tags":{{"samsung", "3G" }}, "message":" like samsung its 3G is good"}
-{"message-id": 681, "author-id": 196, "timestamp":datetime("2010-09-18T12:28:36"), "in-response-to": 2443, "sender-location":point("28.6,75.52"), "tags":{{"iphone", "plan" }}, "message":" love iphone its plan is awesome:)"}
-{"message-id": 682, "author-id": 197, "timestamp":datetime("2008-05-08T11:27:30"), "in-response-to": 2742, "sender-location":point("47.82,80.39"), "tags":{{"at&t", "reachability" }}, "message":" love at&t its reachability is amazing"}
-{"message-id": 683, "author-id": 197, "timestamp":datetime("2009-06-09T12:11:16"), "in-response-to": 3141, "sender-location":point("30.38,91.27"), "tags":{{"iphone", "shortcut-menu" }}, "message":" hate iphone its shortcut-menu is OMG"}
-{"message-id": 684, "author-id": 198, "timestamp":datetime("2007-08-25T06:25:44"), "in-response-to": 966, "sender-location":point("25.9,81.51"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola the voice-command is mind-blowing:)"}
-{"message-id": 685, "author-id": 198, "timestamp":datetime("2011-03-22T22:06:28"), "in-response-to": 970, "sender-location":point("45.08,72.51"), "tags":{{"samsung", "customer-service" }}, "message":" like samsung its customer-service is awesome:)"}
-{"message-id": 686, "author-id": 199, "timestamp":datetime("2005-08-22T08:31:56"), "in-response-to": 1301, "sender-location":point("33.94,71.82"), "tags":{{"verizon", "shortcut-menu" }}, "message":" like verizon the shortcut-menu is mind-blowing"}
-{"message-id": 687, "author-id": 199, "timestamp":datetime("2011-08-15T20:33:46"), "in-response-to": 2313, "sender-location":point("38.75,86.4"), "tags":{{"verizon", "wireless" }}, "message":" hate verizon the wireless is terrible"}
-{"message-id": 688, "author-id": 200, "timestamp":datetime("2008-12-23T20:46:55"), "in-response-to": 258, "sender-location":point("45.83,78.0"), "tags":{{"verizon", "speed" }}, "message":" dislike verizon its speed is terrible"}
-{"message-id": 689, "author-id": 200, "timestamp":datetime("2008-10-10T14:18:58"), "in-response-to": 2668, "sender-location":point("25.17,96.21"), "tags":{{"sprint", "touch-screen" }}, "message":" hate sprint its touch-screen is bad"}
-{"message-id": 690, "author-id": 201, "timestamp":datetime("2009-10-19T22:41:56"), "in-response-to": 1821, "sender-location":point("41.63,73.73"), "tags":{{"verizon", "shortcut-menu" }}, "message":" can't stand verizon the shortcut-menu is OMG"}
-{"message-id": 691, "author-id": 201, "timestamp":datetime("2007-05-04T10:02:16"), "in-response-to": 2478, "sender-location":point("29.06,83.23"), "tags":{{"t-mobile", "voice-command" }}, "message":" dislike t-mobile the voice-command is terrible"}
-{"message-id": 692, "author-id": 202, "timestamp":datetime("2014-01-09T00:19:58"), "in-response-to": 571, "sender-location":point("26.05,92.35"), "tags":{{"at&t", "voice-command" }}, "message":" like at&t its voice-command is good"}
-{"message-id": 693, "author-id": 202, "timestamp":datetime("2014-04-26T09:16:41"), "in-response-to": 247, "sender-location":point("24.57,82.2"), "tags":{{"samsung", "reachability" }}, "message":" hate samsung its reachability is terrible:("}
-{"message-id": 694, "author-id": 203, "timestamp":datetime("2006-01-05T01:15:12"), "in-response-to": 2584, "sender-location":point("30.11,87.51"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint the voice-clarity is amazing"}
-{"message-id": 695, "author-id": 203, "timestamp":datetime("2008-06-10T09:35:53"), "in-response-to": 133, "sender-location":point("37.58,77.83"), "tags":{{"t-mobile", "plan" }}, "message":" dislike t-mobile the plan is OMG:("}
-{"message-id": 696, "author-id": 204, "timestamp":datetime("2005-02-01T02:30:45"), "in-response-to": 2222, "sender-location":point("36.15,91.36"), "tags":{{"sprint", "platform" }}, "message":" can't stand sprint its platform is terrible:("}
-{"message-id": 697, "author-id": 204, "timestamp":datetime("2012-09-24T11:01:10"), "in-response-to": 790, "sender-location":point("32.55,70.6"), "tags":{{"motorola", "customer-service" }}, "message":" love motorola the customer-service is awesome:)"}
-{"message-id": 698, "author-id": 205, "timestamp":datetime("2008-10-26T14:02:36"), "in-response-to": 109, "sender-location":point("40.52,96.69"), "tags":{{"motorola", "signal" }}, "message":" dislike motorola its signal is terrible:("}
-{"message-id": 699, "author-id": 205, "timestamp":datetime("2006-12-05T05:41:49"), "in-response-to": 1455, "sender-location":point("46.53,86.38"), "tags":{{"samsung", "voice-clarity" }}, "message":" like samsung the voice-clarity is mind-blowing"}
-{"message-id": 700, "author-id": 206, "timestamp":datetime("2014-07-11T10:09:29"), "in-response-to": 3194, "sender-location":point("39.4,70.45"), "tags":{{"verizon", "voice-clarity" }}, "message":" like verizon the voice-clarity is awesome:)"}
-{"message-id": 701, "author-id": 206, "timestamp":datetime("2011-06-27T20:19:57"), "in-response-to": 1674, "sender-location":point("44.89,74.98"), "tags":{{"verizon", "speed" }}, "message":" like verizon its speed is mind-blowing"}
-{"message-id": 702, "author-id": 207, "timestamp":datetime("2005-11-13T01:16:47"), "in-response-to": 3010, "sender-location":point("34.77,73.86"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint the reachability is OMG"}
-{"message-id": 703, "author-id": 207, "timestamp":datetime("2012-03-05T01:31:59"), "in-response-to": 316, "sender-location":point("28.32,77.91"), "tags":{{"samsung", "speed" }}, "message":" like samsung its speed is awesome:)"}
-{"message-id": 704, "author-id": 208, "timestamp":datetime("2011-01-28T22:39:31"), "in-response-to": 580, "sender-location":point("24.05,96.97"), "tags":{{"at&t", "network" }}, "message":" like at&t its network is awesome:)"}
-{"message-id": 705, "author-id": 208, "timestamp":datetime("2013-04-27T00:13:12"), "in-response-to": 3094, "sender-location":point("37.61,78.18"), "tags":{{"at&t", "customization" }}, "message":" hate at&t its customization is bad"}
-{"message-id": 706, "author-id": 209, "timestamp":datetime("2014-05-24T18:29:06"), "in-response-to": 1656, "sender-location":point("28.92,95.94"), "tags":{{"verizon", "3G" }}, "message":" hate verizon the 3G is OMG"}
-{"message-id": 707, "author-id": 210, "timestamp":datetime("2005-05-19T21:25:01"), "in-response-to": 9, "sender-location":point("28.76,77.84"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint the voicemail-service is bad:("}
-{"message-id": 708, "author-id": 211, "timestamp":datetime("2009-02-08T18:28:08"), "in-response-to": 528, "sender-location":point("27.02,85.66"), "tags":{{"sprint", "touch-screen" }}, "message":" hate sprint the touch-screen is terrible:("}
-{"message-id": 709, "author-id": 212, "timestamp":datetime("2005-10-27T19:09:27"), "in-response-to": 543, "sender-location":point("31.11,84.45"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is good"}
-{"message-id": 710, "author-id": 213, "timestamp":datetime("2012-07-25T11:34:22"), "in-response-to": 321, "sender-location":point("39.96,96.01"), "tags":{{"iphone", "touch-screen" }}, "message":" can't stand iphone its touch-screen is OMG:("}
-{"message-id": 711, "author-id": 214, "timestamp":datetime("2011-10-09T21:52:15"), "in-response-to": 2658, "sender-location":point("47.22,94.69"), "tags":{{"at&t", "plan" }}, "message":" love at&t the plan is awesome:)"}
-{"message-id": 712, "author-id": 215, "timestamp":datetime("2013-12-09T23:07:03"), "in-response-to": 2701, "sender-location":point("33.25,76.02"), "tags":{{"at&t", "customer-service" }}, "message":" love at&t its customer-service is mind-blowing"}
-{"message-id": 713, "author-id": 216, "timestamp":datetime("2007-02-01T18:57:01"), "in-response-to": 3250, "sender-location":point("42.48,78.94"), "tags":{{"motorola", "customer-service" }}, "message":" dislike motorola the customer-service is terrible"}
-{"message-id": 714, "author-id": 217, "timestamp":datetime("2010-10-05T08:49:35"), "in-response-to": 330, "sender-location":point("35.7,71.32"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is mind-blowing"}
-{"message-id": 715, "author-id": 218, "timestamp":datetime("2009-07-28T18:37:02"), "in-response-to": 1496, "sender-location":point("44.73,83.39"), "tags":{{"motorola", "customization" }}, "message":" hate motorola its customization is horrible"}
-{"message-id": 716, "author-id": 219, "timestamp":datetime("2005-04-09T04:20:20"), "in-response-to": 2059, "sender-location":point("31.69,89.68"), "tags":{{"motorola", "wireless" }}, "message":" can't stand motorola the wireless is terrible"}
-{"message-id": 717, "author-id": 220, "timestamp":datetime("2011-02-10T06:59:52"), "in-response-to": 2721, "sender-location":point("35.27,89.01"), "tags":{{"motorola", "speed" }}, "message":" like motorola the speed is mind-blowing:)"}
-{"message-id": 718, "author-id": 221, "timestamp":datetime("2014-02-12T00:31:47"), "in-response-to": 2744, "sender-location":point("31.07,82.95"), "tags":{{"samsung", "touch-screen" }}, "message":" dislike samsung its touch-screen is horrible"}
-{"message-id": 719, "author-id": 222, "timestamp":datetime("2008-06-09T10:32:47"), "in-response-to": 418, "sender-location":point("27.71,67.65"), "tags":{{"sprint", "customization" }}, "message":" dislike sprint the customization is horrible:("}
-{"message-id": 720, "author-id": 223, "timestamp":datetime("2012-12-18T15:48:34"), "in-response-to": 1706, "sender-location":point("35.43,77.31"), "tags":{{"samsung", "voicemail-service" }}, "message":" like samsung its voicemail-service is mind-blowing:)"}
-{"message-id": 721, "author-id": 224, "timestamp":datetime("2005-07-13T05:19:49"), "in-response-to": 2960, "sender-location":point("25.47,90.54"), "tags":{{"at&t", "signal" }}, "message":" can't stand at&t the signal is bad"}
-{"message-id": 722, "author-id": 225, "timestamp":datetime("2013-01-11T02:57:06"), "in-response-to": 396, "sender-location":point("31.8,77.59"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone the voice-clarity is good"}
-{"message-id": 723, "author-id": 226, "timestamp":datetime("2005-04-26T22:54:47"), "in-response-to": 1276, "sender-location":point("41.39,69.97"), "tags":{{"iphone", "plan" }}, "message":" like iphone the plan is amazing"}
-{"message-id": 724, "author-id": 227, "timestamp":datetime("2008-01-01T08:18:57"), "in-response-to": 1758, "sender-location":point("26.03,92.05"), "tags":{{"verizon", "touch-screen" }}, "message":" like verizon the touch-screen is amazing"}
-{"message-id": 725, "author-id": 228, "timestamp":datetime("2006-01-02T23:52:02"), "in-response-to": 301, "sender-location":point("46.58,93.77"), "tags":{{"iphone", "customer-service" }}, "message":" dislike iphone the customer-service is horrible:("}
-{"message-id": 726, "author-id": 229, "timestamp":datetime("2014-05-18T07:17:39"), "in-response-to": 2840, "sender-location":point("33.88,88.93"), "tags":{{"iphone", "signal" }}, "message":" hate iphone its signal is OMG:("}
-{"message-id": 727, "author-id": 230, "timestamp":datetime("2006-07-25T20:37:38"), "in-response-to": 2493, "sender-location":point("37.0,79.18"), "tags":{{"sprint", "touch-screen" }}, "message":" love sprint the touch-screen is mind-blowing:)"}
-{"message-id": 728, "author-id": 231, "timestamp":datetime("2014-07-28T23:06:51"), "in-response-to": 627, "sender-location":point("35.59,93.64"), "tags":{{"sprint", "network" }}, "message":" like sprint its network is mind-blowing:)"}
-{"message-id": 729, "author-id": 232, "timestamp":datetime("2006-09-19T19:42:51"), "in-response-to": 343, "sender-location":point("45.62,72.84"), "tags":{{"sprint", "customer-service" }}, "message":" can't stand sprint its customer-service is terrible:("}
-{"message-id": 730, "author-id": 233, "timestamp":datetime("2012-03-24T04:28:02"), "in-response-to": 2180, "sender-location":point("26.16,77.39"), "tags":{{"verizon", "reachability" }}, "message":" love verizon its reachability is amazing"}
-{"message-id": 731, "author-id": 234, "timestamp":datetime("2007-12-26T12:00:58"), "in-response-to": 2103, "sender-location":point("32.59,96.82"), "tags":{{"samsung", "voicemail-service" }}, "message":" hate samsung the voicemail-service is terrible:("}
-{"message-id": 732, "author-id": 235, "timestamp":datetime("2010-03-12T11:55:42"), "in-response-to": 291, "sender-location":point("34.93,95.75"), "tags":{{"verizon", "customer-service" }}, "message":" hate verizon the customer-service is horrible:("}
-{"message-id": 733, "author-id": 236, "timestamp":datetime("2010-04-18T01:32:47"), "in-response-to": 1754, "sender-location":point("28.67,80.61"), "tags":{{"motorola", "customization" }}, "message":" can't stand motorola the customization is OMG"}
-{"message-id": 734, "author-id": 237, "timestamp":datetime("2014-02-26T02:04:03"), "in-response-to": 1320, "sender-location":point("31.77,72.81"), "tags":{{"iphone", "customer-service" }}, "message":" like iphone the customer-service is amazing"}
-{"message-id": 735, "author-id": 238, "timestamp":datetime("2009-09-12T14:18:27"), "in-response-to": 2478, "sender-location":point("46.67,76.85"), "tags":{{"sprint", "signal" }}, "message":" love sprint its signal is awesome"}
-{"message-id": 736, "author-id": 239, "timestamp":datetime("2011-12-11T19:01:44"), "in-response-to": 1544, "sender-location":point("27.69,66.37"), "tags":{{"at&t", "customization" }}, "message":" can't stand at&t its customization is horrible:("}
-{"message-id": 737, "author-id": 240, "timestamp":datetime("2010-06-28T09:00:11"), "in-response-to": 133, "sender-location":point("28.62,67.04"), "tags":{{"t-mobile", "reachability" }}, "message":" like t-mobile its reachability is awesome:)"}
-{"message-id": 738, "author-id": 241, "timestamp":datetime("2012-01-01T01:18:29"), "in-response-to": 1925, "sender-location":point("30.32,70.73"), "tags":{{"iphone", "signal" }}, "message":" love iphone its signal is amazing"}
-{"message-id": 739, "author-id": 242, "timestamp":datetime("2009-02-24T18:54:06"), "in-response-to": 1087, "sender-location":point("24.8,89.8"), "tags":{{"samsung", "voice-clarity" }}, "message":" like samsung the voice-clarity is awesome:)"}
-{"message-id": 740, "author-id": 243, "timestamp":datetime("2005-08-27T16:10:28"), "in-response-to": 196, "sender-location":point("40.55,75.08"), "tags":{{"verizon", "plan" }}, "message":" like verizon its plan is awesome:)"}
-{"message-id": 741, "author-id": 244, "timestamp":datetime("2009-10-19T02:37:41"), "in-response-to": 1092, "sender-location":point("36.91,79.26"), "tags":{{"verizon", "voicemail-service" }}, "message":" dislike verizon its voicemail-service is OMG:("}
-{"message-id": 742, "author-id": 245, "timestamp":datetime("2008-03-04T15:40:42"), "in-response-to": 599, "sender-location":point("40.75,85.52"), "tags":{{"t-mobile", "signal" }}, "message":" can't stand t-mobile the signal is bad"}
-{"message-id": 743, "author-id": 246, "timestamp":datetime("2010-07-19T06:33:12"), "in-response-to": 2239, "sender-location":point("39.19,70.73"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" dislike t-mobile its shortcut-menu is OMG:("}
-{"message-id": 744, "author-id": 247, "timestamp":datetime("2005-08-04T16:27:18"), "in-response-to": 312, "sender-location":point("30.48,75.59"), "tags":{{"iphone", "signal" }}, "message":" hate iphone its signal is horrible:("}
-{"message-id": 745, "author-id": 248, "timestamp":datetime("2007-07-20T03:51:29"), "in-response-to": 395, "sender-location":point("28.75,78.83"), "tags":{{"motorola", "customization" }}, "message":" can't stand motorola the customization is horrible:("}
-{"message-id": 746, "author-id": 249, "timestamp":datetime("2005-10-07T13:00:00"), "in-response-to": 1234, "sender-location":point("38.54,73.67"), "tags":{{"at&t", "reachability" }}, "message":" like at&t the reachability is amazing:)"}
-{"message-id": 747, "author-id": 250, "timestamp":datetime("2012-07-03T02:57:31"), "in-response-to": 3184, "sender-location":point("24.54,94.45"), "tags":{{"samsung", "network" }}, "message":" love samsung the network is amazing"}
-{"message-id": 748, "author-id": 251, "timestamp":datetime("2007-11-16T04:47:15"), "in-response-to": 1829, "sender-location":point("33.1,94.39"), "tags":{{"sprint", "voice-command" }}, "message":" love sprint the voice-command is mind-blowing"}
-{"message-id": 749, "author-id": 252, "timestamp":datetime("2006-05-04T13:09:14"), "in-response-to": 2400, "sender-location":point("36.37,93.04"), "tags":{{"iphone", "shortcut-menu" }}, "message":" dislike iphone its shortcut-menu is horrible"}
-{"message-id": 750, "author-id": 253, "timestamp":datetime("2009-05-24T10:42:10"), "in-response-to": 1580, "sender-location":point("35.26,83.39"), "tags":{{"iphone", "3G" }}, "message":" hate iphone its 3G is bad"}
-{"message-id": 751, "author-id": 254, "timestamp":datetime("2011-10-25T06:12:01"), "in-response-to": 104, "sender-location":point("29.21,69.04"), "tags":{{"t-mobile", "reachability" }}, "message":" hate t-mobile its reachability is OMG:("}
-{"message-id": 752, "author-id": 255, "timestamp":datetime("2006-12-09T01:54:04"), "in-response-to": 2293, "sender-location":point("24.9,79.8"), "tags":{{"sprint", "voice-command" }}, "message":" like sprint the voice-command is amazing:)"}
-{"message-id": 753, "author-id": 256, "timestamp":datetime("2006-07-10T05:39:37"), "in-response-to": 700, "sender-location":point("29.83,75.41"), "tags":{{"motorola", "customization" }}, "message":" dislike motorola the customization is bad:("}
-{"message-id": 754, "author-id": 257, "timestamp":datetime("2005-09-12T13:52:34"), "in-response-to": 2349, "sender-location":point("27.15,83.79"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint the reachability is horrible:("}
-{"message-id": 755, "author-id": 258, "timestamp":datetime("2009-11-07T02:38:17"), "in-response-to": 2364, "sender-location":point("34.14,75.01"), "tags":{{"at&t", "reachability" }}, "message":" dislike at&t its reachability is terrible"}
-{"message-id": 756, "author-id": 259, "timestamp":datetime("2012-08-04T18:47:46"), "in-response-to": 438, "sender-location":point("29.24,89.65"), "tags":{{"verizon", "3G" }}, "message":" can't stand verizon its 3G is bad"}
-{"message-id": 757, "author-id": 260, "timestamp":datetime("2006-06-22T05:06:20"), "in-response-to": 1066, "sender-location":point("25.45,82.31"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile the customization is mind-blowing:)"}
-{"message-id": 758, "author-id": 261, "timestamp":datetime("2012-09-02T22:13:37"), "in-response-to": 2547, "sender-location":point("33.7,77.77"), "tags":{{"samsung", "wireless" }}, "message":" dislike samsung its wireless is horrible:("}
-{"message-id": 759, "author-id": 262, "timestamp":datetime("2011-02-19T04:45:08"), "in-response-to": 927, "sender-location":point("33.0,70.28"), "tags":{{"t-mobile", "speed" }}, "message":" love t-mobile its speed is awesome"}
-{"message-id": 760, "author-id": 263, "timestamp":datetime("2008-01-15T03:13:44"), "in-response-to": 2031, "sender-location":point("32.57,90.26"), "tags":{{"samsung", "voice-command" }}, "message":" can't stand samsung the voice-command is terrible"}
-{"message-id": 761, "author-id": 264, "timestamp":datetime("2012-03-10T11:38:39"), "in-response-to": 1949, "sender-location":point("33.12,92.05"), "tags":{{"samsung", "platform" }}, "message":" like samsung the platform is amazing"}
-{"message-id": 762, "author-id": 265, "timestamp":datetime("2010-08-14T20:05:57"), "in-response-to": 1978, "sender-location":point("40.51,94.52"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" dislike t-mobile the voice-clarity is OMG"}
-{"message-id": 763, "author-id": 266, "timestamp":datetime("2006-05-25T04:30:44"), "in-response-to": 2434, "sender-location":point("32.36,78.69"), "tags":{{"samsung", "customization" }}, "message":" dislike samsung its customization is OMG:("}
-{"message-id": 764, "author-id": 267, "timestamp":datetime("2009-03-08T14:52:34"), "in-response-to": 1595, "sender-location":point("34.33,90.64"), "tags":{{"iphone", "voice-clarity" }}, "message":" dislike iphone the voice-clarity is terrible"}
-{"message-id": 765, "author-id": 268, "timestamp":datetime("2013-04-12T00:14:18"), "in-response-to": 1139, "sender-location":point("44.0,92.82"), "tags":{{"verizon", "platform" }}, "message":" love verizon its platform is awesome"}
-{"message-id": 766, "author-id": 269, "timestamp":datetime("2013-06-10T07:41:15"), "in-response-to": 455, "sender-location":point("46.75,82.3"), "tags":{{"samsung", "network" }}, "message":" love samsung the network is awesome"}
-{"message-id": 767, "author-id": 270, "timestamp":datetime("2007-02-16T18:16:34"), "in-response-to": 2201, "sender-location":point("44.13,75.81"), "tags":{{"samsung", "reachability" }}, "message":" love samsung its reachability is awesome:)"}
-{"message-id": 768, "author-id": 271, "timestamp":datetime("2013-06-07T09:29:39"), "in-response-to": 1821, "sender-location":point("46.19,67.92"), "tags":{{"at&t", "signal" }}, "message":" like at&t its signal is amazing:)"}
-{"message-id": 769, "author-id": 272, "timestamp":datetime("2008-03-13T09:42:24"), "in-response-to": 1508, "sender-location":point("39.1,70.85"), "tags":{{"t-mobile", "wireless" }}, "message":" like t-mobile the wireless is good:)"}
-{"message-id": 770, "author-id": 273, "timestamp":datetime("2005-03-07T07:20:46"), "in-response-to": 2616, "sender-location":point("34.06,86.46"), "tags":{{"t-mobile", "customization" }}, "message":" like t-mobile its customization is good:)"}
-{"message-id": 771, "author-id": 274, "timestamp":datetime("2006-06-05T21:52:29"), "in-response-to": 2939, "sender-location":point("31.1,67.09"), "tags":{{"at&t", "customization" }}, "message":" dislike at&t its customization is OMG:("}
-{"message-id": 772, "author-id": 275, "timestamp":datetime("2010-04-26T05:29:27"), "in-response-to": 2717, "sender-location":point("44.23,76.61"), "tags":{{"t-mobile", "touch-screen" }}, "message":" love t-mobile the touch-screen is good:)"}
-{"message-id": 773, "author-id": 276, "timestamp":datetime("2014-01-07T00:53:40"), "in-response-to": 647, "sender-location":point("42.53,88.98"), "tags":{{"iphone", "shortcut-menu" }}, "message":" dislike iphone its shortcut-menu is bad"}
-{"message-id": 774, "author-id": 277, "timestamp":datetime("2014-06-28T02:35:25"), "in-response-to": 261, "sender-location":point("39.37,86.1"), "tags":{{"sprint", "customer-service" }}, "message":" love sprint the customer-service is good"}
-{"message-id": 775, "author-id": 278, "timestamp":datetime("2009-03-01T13:07:00"), "in-response-to": 879, "sender-location":point("44.1,70.88"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone the voice-command is OMG:("}
-{"message-id": 776, "author-id": 279, "timestamp":datetime("2007-03-11T16:09:56"), "in-response-to": 2624, "sender-location":point("43.78,85.82"), "tags":{{"samsung", "customer-service" }}, "message":" love samsung the customer-service is awesome:)"}
-{"message-id": 777, "author-id": 280, "timestamp":datetime("2012-06-03T11:36:59"), "in-response-to": 763, "sender-location":point("37.96,67.5"), "tags":{{"iphone", "touch-screen" }}, "message":" can't stand iphone its touch-screen is OMG:("}
-{"message-id": 778, "author-id": 281, "timestamp":datetime("2011-04-05T17:07:36"), "in-response-to": 559, "sender-location":point("27.08,72.05"), "tags":{{"sprint", "shortcut-menu" }}, "message":" love sprint its shortcut-menu is good:)"}
-{"message-id": 779, "author-id": 282, "timestamp":datetime("2014-03-02T17:31:55"), "in-response-to": 2380, "sender-location":point("36.74,86.25"), "tags":{{"sprint", "3G" }}, "message":" hate sprint its 3G is OMG:("}
-{"message-id": 780, "author-id": 283, "timestamp":datetime("2005-04-23T18:39:28"), "in-response-to": 859, "sender-location":point("35.25,71.25"), "tags":{{"at&t", "customization" }}, "message":" dislike at&t its customization is bad:("}
-{"message-id": 781, "author-id": 284, "timestamp":datetime("2013-10-26T02:49:19"), "in-response-to": 26, "sender-location":point("27.25,93.95"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" hate t-mobile its shortcut-menu is bad:("}
-{"message-id": 782, "author-id": 285, "timestamp":datetime("2012-12-28T02:41:23"), "in-response-to": 1749, "sender-location":point("33.68,84.74"), "tags":{{"at&t", "voice-command" }}, "message":" like at&t its voice-command is good:)"}
-{"message-id": 783, "author-id": 286, "timestamp":datetime("2005-04-01T09:56:09"), "in-response-to": 1954, "sender-location":point("39.46,89.41"), "tags":{{"iphone", "network" }}, "message":" love iphone its network is good"}
-{"message-id": 784, "author-id": 287, "timestamp":datetime("2005-12-28T03:49:05"), "in-response-to": 1414, "sender-location":point("38.31,83.29"), "tags":{{"samsung", "voice-clarity" }}, "message":" hate samsung its voice-clarity is bad"}
-{"message-id": 785, "author-id": 288, "timestamp":datetime("2008-10-19T05:40:16"), "in-response-to": 3173, "sender-location":point("39.86,76.23"), "tags":{{"verizon", "speed" }}, "message":" can't stand verizon the speed is terrible:("}
-{"message-id": 786, "author-id": 289, "timestamp":datetime("2014-02-10T22:21:33"), "in-response-to": 1994, "sender-location":point("32.53,90.14"), "tags":{{"t-mobile", "platform" }}, "message":" dislike t-mobile its platform is OMG"}
-{"message-id": 787, "author-id": 290, "timestamp":datetime("2008-12-05T12:18:41"), "in-response-to": 3033, "sender-location":point("25.88,97.6"), "tags":{{"at&t", "signal" }}, "message":" can't stand at&t the signal is OMG:("}
-{"message-id": 788, "author-id": 291, "timestamp":datetime("2010-01-16T18:04:10"), "in-response-to": 1002, "sender-location":point("39.06,77.31"), "tags":{{"verizon", "voice-command" }}, "message":" hate verizon the voice-command is bad:("}
-{"message-id": 789, "author-id": 292, "timestamp":datetime("2012-01-18T18:20:05"), "in-response-to": 1961, "sender-location":point("28.83,66.6"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint the voicemail-service is terrible:("}
-{"message-id": 790, "author-id": 293, "timestamp":datetime("2007-05-02T20:14:37"), "in-response-to": 1814, "sender-location":point("47.52,93.24"), "tags":{{"motorola", "reachability" }}, "message":" love motorola its reachability is good:)"}
-{"message-id": 791, "author-id": 294, "timestamp":datetime("2014-08-13T02:28:05"), "in-response-to": 159, "sender-location":point("27.7,83.0"), "tags":{{"t-mobile", "platform" }}, "message":" can't stand t-mobile its platform is OMG:("}
-{"message-id": 792, "author-id": 295, "timestamp":datetime("2007-05-27T14:45:39"), "in-response-to": 1149, "sender-location":point("29.42,91.47"), "tags":{{"at&t", "network" }}, "message":" love at&t its network is mind-blowing"}
-{"message-id": 793, "author-id": 296, "timestamp":datetime("2013-08-02T18:46:07"), "in-response-to": 3088, "sender-location":point("45.77,94.5"), "tags":{{"samsung", "voice-clarity" }}, "message":" love samsung its voice-clarity is mind-blowing:)"}
-{"message-id": 794, "author-id": 297, "timestamp":datetime("2014-06-16T03:50:50"), "in-response-to": 1709, "sender-location":point("42.0,81.91"), "tags":{{"motorola", "reachability" }}, "message":" love motorola the reachability is amazing"}
-{"message-id": 795, "author-id": 298, "timestamp":datetime("2006-09-25T02:34:45"), "in-response-to": 2316, "sender-location":point("48.19,84.19"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola its shortcut-menu is bad"}
-{"message-id": 796, "author-id": 299, "timestamp":datetime("2010-09-19T16:34:20"), "in-response-to": 788, "sender-location":point("39.0,69.51"), "tags":{{"at&t", "3G" }}, "message":" can't stand at&t the 3G is horrible"}
-{"message-id": 797, "author-id": 300, "timestamp":datetime("2013-06-19T20:39:08"), "in-response-to": 2232, "sender-location":point("28.19,79.38"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola the shortcut-menu is terrible:("}
-{"message-id": 798, "author-id": 301, "timestamp":datetime("2014-06-10T11:11:10"), "in-response-to": 2421, "sender-location":point("35.76,68.26"), "tags":{{"verizon", "3G" }}, "message":" love verizon its 3G is awesome:)"}
-{"message-id": 799, "author-id": 302, "timestamp":datetime("2007-01-05T04:39:56"), "in-response-to": 2455, "sender-location":point("35.77,72.12"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon its shortcut-menu is awesome"}
-{"message-id": 800, "author-id": 303, "timestamp":datetime("2013-02-26T22:18:41"), "in-response-to": 162, "sender-location":point("38.23,67.21"), "tags":{{"verizon", "signal" }}, "message":" like verizon its signal is good"}
-{"message-id": 801, "author-id": 304, "timestamp":datetime("2006-03-15T16:57:16"), "in-response-to": 273, "sender-location":point("42.68,94.36"), "tags":{{"sprint", "customer-service" }}, "message":" can't stand sprint its customer-service is horrible:("}
-{"message-id": 802, "author-id": 305, "timestamp":datetime("2008-11-05T03:46:26"), "in-response-to": 1344, "sender-location":point("40.91,75.38"), "tags":{{"iphone", "platform" }}, "message":" can't stand iphone the platform is OMG:("}
-{"message-id": 803, "author-id": 306, "timestamp":datetime("2009-01-22T07:43:31"), "in-response-to": 2091, "sender-location":point("44.79,83.69"), "tags":{{"sprint", "touch-screen" }}, "message":" dislike sprint its touch-screen is bad:("}
-{"message-id": 804, "author-id": 307, "timestamp":datetime("2008-03-22T16:52:44"), "in-response-to": 772, "sender-location":point("38.25,74.05"), "tags":{{"verizon", "customization" }}, "message":" like verizon the customization is amazing:)"}
-{"message-id": 805, "author-id": 308, "timestamp":datetime("2006-09-12T20:38:03"), "in-response-to": 330, "sender-location":point("43.06,80.45"), "tags":{{"motorola", "network" }}, "message":" love motorola the network is amazing"}
-{"message-id": 806, "author-id": 309, "timestamp":datetime("2013-09-08T03:50:15"), "in-response-to": 3118, "sender-location":point("26.5,89.15"), "tags":{{"at&t", "platform" }}, "message":" love at&t its platform is good"}
-{"message-id": 807, "author-id": 310, "timestamp":datetime("2009-01-24T03:37:30"), "in-response-to": 351, "sender-location":point("38.76,90.86"), "tags":{{"iphone", "network" }}, "message":" can't stand iphone its network is bad:("}
-{"message-id": 808, "author-id": 311, "timestamp":datetime("2014-02-23T06:58:53"), "in-response-to": 473, "sender-location":point("27.82,78.36"), "tags":{{"verizon", "signal" }}, "message":" like verizon the signal is mind-blowing:)"}
-{"message-id": 809, "author-id": 312, "timestamp":datetime("2014-02-07T01:47:15"), "in-response-to": 2041, "sender-location":point("30.99,91.28"), "tags":{{"samsung", "reachability" }}, "message":" love samsung its reachability is awesome"}
-{"message-id": 810, "author-id": 313, "timestamp":datetime("2014-05-07T11:22:51"), "in-response-to": 2668, "sender-location":point("25.24,70.58"), "tags":{{"samsung", "3G" }}, "message":" love samsung its 3G is good"}
-{"message-id": 811, "author-id": 314, "timestamp":datetime("2014-03-06T23:48:17"), "in-response-to": 270, "sender-location":point("28.21,94.8"), "tags":{{"sprint", "3G" }}, "message":" can't stand sprint the 3G is OMG:("}
-{"message-id": 812, "author-id": 315, "timestamp":datetime("2012-07-11T23:31:24"), "in-response-to": 3019, "sender-location":point("40.71,68.49"), "tags":{{"iphone", "reachability" }}, "message":" hate iphone the reachability is terrible"}
-{"message-id": 813, "author-id": 316, "timestamp":datetime("2005-05-17T14:45:10"), "in-response-to": 1078, "sender-location":point("26.83,82.88"), "tags":{{"at&t", "network" }}, "message":" like at&t its network is awesome"}
-{"message-id": 814, "author-id": 317, "timestamp":datetime("2014-01-12T17:34:23"), "in-response-to": 1660, "sender-location":point("28.76,76.55"), "tags":{{"iphone", "voice-clarity" }}, "message":" love iphone the voice-clarity is good"}
-{"message-id": 815, "author-id": 318, "timestamp":datetime("2014-06-14T03:41:31"), "in-response-to": 2037, "sender-location":point("27.74,68.09"), "tags":{{"sprint", "voice-clarity" }}, "message":" hate sprint its voice-clarity is bad"}
-{"message-id": 816, "author-id": 319, "timestamp":datetime("2010-01-28T02:16:00"), "in-response-to": 2410, "sender-location":point("29.55,97.11"), "tags":{{"samsung", "network" }}, "message":" dislike samsung its network is OMG:("}
-{"message-id": 817, "author-id": 320, "timestamp":datetime("2007-06-01T11:58:01"), "in-response-to": 2014, "sender-location":point("48.19,72.35"), "tags":{{"motorola", "plan" }}, "message":" can't stand motorola the plan is terrible:("}
-{"message-id": 818, "author-id": 321, "timestamp":datetime("2014-08-29T06:57:06"), "in-response-to": 3155, "sender-location":point("27.37,82.27"), "tags":{{"sprint", "plan" }}, "message":" can't stand sprint the plan is bad:("}
-{"message-id": 819, "author-id": 322, "timestamp":datetime("2007-08-15T14:02:32"), "in-response-to": 2168, "sender-location":point("38.36,84.25"), "tags":{{"t-mobile", "wireless" }}, "message":" dislike t-mobile its wireless is horrible:("}
-{"message-id": 820, "author-id": 323, "timestamp":datetime("2009-06-12T16:29:36"), "in-response-to": 1288, "sender-location":point("40.44,95.2"), "tags":{{"sprint", "voicemail-service" }}, "message":" like sprint its voicemail-service is amazing:)"}
-{"message-id": 821, "author-id": 324, "timestamp":datetime("2009-11-27T14:23:57"), "in-response-to": 177, "sender-location":point("36.35,92.0"), "tags":{{"at&t", "signal" }}, "message":" can't stand at&t the signal is OMG"}
-{"message-id": 822, "author-id": 325, "timestamp":datetime("2010-06-10T08:35:19"), "in-response-to": 151, "sender-location":point("39.76,82.66"), "tags":{{"iphone", "customer-service" }}, "message":" love iphone its customer-service is amazing"}
-{"message-id": 823, "author-id": 326, "timestamp":datetime("2014-06-28T15:57:40"), "in-response-to": 1539, "sender-location":point("30.83,88.99"), "tags":{{"samsung", "speed" }}, "message":" hate samsung its speed is horrible"}
-{"message-id": 824, "author-id": 327, "timestamp":datetime("2007-07-15T07:49:29"), "in-response-to": 2667, "sender-location":point("34.73,78.66"), "tags":{{"verizon", "voicemail-service" }}, "message":" hate verizon its voicemail-service is bad:("}
-{"message-id": 825, "author-id": 328, "timestamp":datetime("2013-12-22T08:54:57"), "in-response-to": 11, "sender-location":point("27.56,93.73"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone the voice-clarity is OMG"}
-{"message-id": 826, "author-id": 329, "timestamp":datetime("2006-06-14T08:56:18"), "in-response-to": 1410, "sender-location":point("28.72,93.49"), "tags":{{"motorola", "platform" }}, "message":" love motorola its platform is good"}
-{"message-id": 827, "author-id": 330, "timestamp":datetime("2009-08-21T15:18:01"), "in-response-to": 3127, "sender-location":point("48.49,95.43"), "tags":{{"motorola", "signal" }}, "message":" like motorola its signal is good"}
-{"message-id": 828, "author-id": 331, "timestamp":datetime("2013-02-23T00:45:41"), "in-response-to": 3113, "sender-location":point("29.93,77.08"), "tags":{{"verizon", "voice-clarity" }}, "message":" dislike verizon its voice-clarity is OMG"}
-{"message-id": 829, "author-id": 332, "timestamp":datetime("2009-07-06T00:25:00"), "in-response-to": 1834, "sender-location":point("33.05,88.76"), "tags":{{"at&t", "reachability" }}, "message":" can't stand at&t its reachability is OMG"}
-{"message-id": 830, "author-id": 333, "timestamp":datetime("2007-05-10T21:53:27"), "in-response-to": 1684, "sender-location":point("28.68,82.8"), "tags":{{"iphone", "wireless" }}, "message":" like iphone the wireless is mind-blowing:)"}
-{"message-id": 831, "author-id": 334, "timestamp":datetime("2014-02-18T05:15:35"), "in-response-to": 2648, "sender-location":point("34.8,89.61"), "tags":{{"verizon", "touch-screen" }}, "message":" love verizon the touch-screen is amazing"}
-{"message-id": 832, "author-id": 335, "timestamp":datetime("2007-09-03T01:47:45"), "in-response-to": 2389, "sender-location":point("39.62,95.21"), "tags":{{"sprint", "touch-screen" }}, "message":" dislike sprint the touch-screen is bad"}
-{"message-id": 833, "author-id": 336, "timestamp":datetime("2009-09-01T05:53:31"), "in-response-to": 919, "sender-location":point("41.4,76.21"), "tags":{{"at&t", "3G" }}, "message":" like at&t the 3G is mind-blowing"}
-{"message-id": 834, "author-id": 337, "timestamp":datetime("2012-01-12T06:33:04"), "in-response-to": 2657, "sender-location":point("47.26,95.56"), "tags":{{"verizon", "plan" }}, "message":" like verizon its plan is good:)"}
-{"message-id": 835, "author-id": 338, "timestamp":datetime("2014-06-01T08:25:19"), "in-response-to": 129, "sender-location":point("45.79,84.04"), "tags":{{"verizon", "plan" }}, "message":" can't stand verizon the plan is OMG:("}
-{"message-id": 836, "author-id": 339, "timestamp":datetime("2006-05-02T10:15:27"), "in-response-to": 1777, "sender-location":point("27.62,66.51"), "tags":{{"samsung", "plan" }}, "message":" love samsung its plan is good:)"}
-{"message-id": 837, "author-id": 340, "timestamp":datetime("2012-04-05T23:47:59"), "in-response-to": 721, "sender-location":point("33.97,87.93"), "tags":{{"verizon", "signal" }}, "message":" love verizon the signal is mind-blowing"}
-{"message-id": 838, "author-id": 341, "timestamp":datetime("2014-06-01T11:17:54"), "in-response-to": 3251, "sender-location":point("44.37,95.69"), "tags":{{"t-mobile", "speed" }}, "message":" love t-mobile the speed is awesome"}
-{"message-id": 839, "author-id": 342, "timestamp":datetime("2013-05-23T23:31:06"), "in-response-to": 2728, "sender-location":point("35.56,81.82"), "tags":{{"samsung", "voicemail-service" }}, "message":" dislike samsung its voicemail-service is terrible:("}
-{"message-id": 840, "author-id": 343, "timestamp":datetime("2008-11-19T02:17:36"), "in-response-to": 122, "sender-location":point("46.72,89.73"), "tags":{{"sprint", "wireless" }}, "message":" hate sprint the wireless is horrible"}
-{"message-id": 841, "author-id": 344, "timestamp":datetime("2007-01-11T22:25:19"), "in-response-to": 1552, "sender-location":point("30.81,86.72"), "tags":{{"t-mobile", "platform" }}, "message":" love t-mobile the platform is amazing:)"}
-{"message-id": 842, "author-id": 345, "timestamp":datetime("2012-08-26T11:54:16"), "in-response-to": 2735, "sender-location":point("37.99,67.49"), "tags":{{"at&t", "voice-command" }}, "message":" dislike at&t its voice-command is terrible:("}
-{"message-id": 843, "author-id": 346, "timestamp":datetime("2006-03-06T11:14:30"), "in-response-to": 1555, "sender-location":point("43.42,69.13"), "tags":{{"at&t", "signal" }}, "message":" hate at&t its signal is bad"}
-{"message-id": 844, "author-id": 347, "timestamp":datetime("2009-01-20T02:12:34"), "in-response-to": 2577, "sender-location":point("34.31,90.52"), "tags":{{"iphone", "network" }}, "message":" can't stand iphone its network is OMG"}
-{"message-id": 845, "author-id": 348, "timestamp":datetime("2006-07-08T17:41:35"), "in-response-to": 2562, "sender-location":point("46.44,68.63"), "tags":{{"samsung", "touch-screen" }}, "message":" love samsung the touch-screen is amazing:)"}
-{"message-id": 846, "author-id": 349, "timestamp":datetime("2014-01-21T22:22:49"), "in-response-to": 2452, "sender-location":point("36.75,80.7"), "tags":{{"sprint", "platform" }}, "message":" like sprint the platform is mind-blowing:)"}
-{"message-id": 847, "author-id": 350, "timestamp":datetime("2005-04-27T03:07:24"), "in-response-to": 1386, "sender-location":point("39.99,86.6"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t its voice-clarity is good"}
-{"message-id": 848, "author-id": 351, "timestamp":datetime("2006-06-17T09:39:49"), "in-response-to": 2006, "sender-location":point("42.89,91.2"), "tags":{{"at&t", "customer-service" }}, "message":" love at&t its customer-service is mind-blowing"}
-{"message-id": 849, "author-id": 352, "timestamp":datetime("2006-06-15T07:20:21"), "in-response-to": 2938, "sender-location":point("26.15,95.38"), "tags":{{"at&t", "platform" }}, "message":" like at&t its platform is amazing"}
-{"message-id": 850, "author-id": 353, "timestamp":datetime("2014-04-12T04:22:06"), "in-response-to": 865, "sender-location":point("35.23,84.23"), "tags":{{"motorola", "voice-clarity" }}, "message":" love motorola the voice-clarity is mind-blowing:)"}
-{"message-id": 851, "author-id": 354, "timestamp":datetime("2013-03-25T21:12:30"), "in-response-to": 510, "sender-location":point("39.27,68.61"), "tags":{{"iphone", "signal" }}, "message":" like iphone the signal is awesome:)"}
-{"message-id": 852, "author-id": 355, "timestamp":datetime("2006-12-04T13:23:29"), "in-response-to": 728, "sender-location":point("36.2,93.03"), "tags":{{"samsung", "speed" }}, "message":" love samsung the speed is amazing:)"}
-{"message-id": 853, "author-id": 356, "timestamp":datetime("2013-12-24T08:11:43"), "in-response-to": 1682, "sender-location":point("27.97,82.7"), "tags":{{"t-mobile", "wireless" }}, "message":" can't stand t-mobile its wireless is bad:("}
-{"message-id": 854, "author-id": 357, "timestamp":datetime("2014-05-07T19:53:56"), "in-response-to": 2453, "sender-location":point("41.9,71.06"), "tags":{{"verizon", "shortcut-menu" }}, "message":" can't stand verizon the shortcut-menu is OMG:("}
-{"message-id": 855, "author-id": 358, "timestamp":datetime("2014-03-16T19:05:13"), "in-response-to": 727, "sender-location":point("42.82,86.48"), "tags":{{"iphone", "network" }}, "message":" love iphone the network is amazing"}
-{"message-id": 856, "author-id": 359, "timestamp":datetime("2006-04-03T15:50:49"), "in-response-to": 873, "sender-location":point("30.79,86.44"), "tags":{{"t-mobile", "voice-command" }}, "message":" like t-mobile its voice-command is mind-blowing:)"}
-{"message-id": 857, "author-id": 360, "timestamp":datetime("2007-01-02T20:59:41"), "in-response-to": 2801, "sender-location":point("31.33,92.02"), "tags":{{"motorola", "platform" }}, "message":" like motorola its platform is mind-blowing"}
-{"message-id": 858, "author-id": 361, "timestamp":datetime("2012-03-13T12:14:01"), "in-response-to": 3119, "sender-location":point("39.26,69.77"), "tags":{{"sprint", "reachability" }}, "message":" can't stand sprint its reachability is terrible:("}
-{"message-id": 859, "author-id": 362, "timestamp":datetime("2009-09-13T02:42:39"), "in-response-to": 509, "sender-location":point("30.41,84.74"), "tags":{{"verizon", "signal" }}, "message":" dislike verizon the signal is terrible"}
-{"message-id": 860, "author-id": 363, "timestamp":datetime("2014-04-16T06:44:29"), "in-response-to": 954, "sender-location":point("41.73,77.6"), "tags":{{"motorola", "touch-screen" }}, "message":" can't stand motorola the touch-screen is horrible"}
-{"message-id": 861, "author-id": 364, "timestamp":datetime("2008-10-05T01:24:59"), "in-response-to": 879, "sender-location":point("33.57,90.13"), "tags":{{"iphone", "3G" }}, "message":" hate iphone the 3G is bad"}
-{"message-id": 862, "author-id": 365, "timestamp":datetime("2013-06-16T13:52:54"), "in-response-to": 3105, "sender-location":point("33.54,90.69"), "tags":{{"iphone", "voice-clarity" }}, "message":" dislike iphone its voice-clarity is bad:("}
-{"message-id": 863, "author-id": 366, "timestamp":datetime("2012-07-11T04:19:54"), "in-response-to": 880, "sender-location":point("29.29,79.13"), "tags":{{"motorola", "network" }}, "message":" dislike motorola the network is horrible"}
-{"message-id": 864, "author-id": 367, "timestamp":datetime("2006-07-07T18:20:08"), "in-response-to": 1508, "sender-location":point("25.19,72.68"), "tags":{{"sprint", "platform" }}, "message":" dislike sprint the platform is horrible"}
-{"message-id": 865, "author-id": 368, "timestamp":datetime("2010-05-27T16:37:20"), "in-response-to": 2403, "sender-location":point("34.39,66.65"), "tags":{{"samsung", "signal" }}, "message":" hate samsung the signal is bad:("}
-{"message-id": 866, "author-id": 369, "timestamp":datetime("2012-03-15T15:05:01"), "in-response-to": 2983, "sender-location":point("31.0,91.45"), "tags":{{"at&t", "plan" }}, "message":" love at&t the plan is good:)"}
-{"message-id": 867, "author-id": 370, "timestamp":datetime("2008-06-19T15:45:37"), "in-response-to": 392, "sender-location":point("31.09,81.29"), "tags":{{"motorola", "customer-service" }}, "message":" like motorola the customer-service is mind-blowing:)"}
-{"message-id": 868, "author-id": 371, "timestamp":datetime("2012-08-07T18:48:53"), "in-response-to": 597, "sender-location":point("34.93,77.52"), "tags":{{"sprint", "customer-service" }}, "message":" can't stand sprint the customer-service is terrible"}
-{"message-id": 869, "author-id": 372, "timestamp":datetime("2005-06-14T00:05:19"), "in-response-to": 2029, "sender-location":point("48.83,79.61"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint the voice-clarity is amazing"}
-{"message-id": 870, "author-id": 373, "timestamp":datetime("2012-10-18T01:01:53"), "in-response-to": 2733, "sender-location":point("42.67,70.51"), "tags":{{"sprint", "platform" }}, "message":" love sprint its platform is mind-blowing:)"}
-{"message-id": 871, "author-id": 374, "timestamp":datetime("2011-04-27T10:34:17"), "in-response-to": 843, "sender-location":point("35.83,75.16"), "tags":{{"motorola", "voice-command" }}, "message":" dislike motorola the voice-command is OMG:("}
-{"message-id": 872, "author-id": 375, "timestamp":datetime("2006-02-16T22:47:01"), "in-response-to": 642, "sender-location":point("41.05,69.52"), "tags":{{"verizon", "signal" }}, "message":" hate verizon its signal is horrible"}
-{"message-id": 873, "author-id": 376, "timestamp":datetime("2014-04-11T09:09:48"), "in-response-to": 1048, "sender-location":point("48.62,77.47"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint its voice-clarity is amazing:)"}
-{"message-id": 874, "author-id": 377, "timestamp":datetime("2012-10-17T10:51:52"), "in-response-to": 1041, "sender-location":point("43.33,83.67"), "tags":{{"iphone", "speed" }}, "message":" like iphone the speed is awesome:)"}
-{"message-id": 875, "author-id": 378, "timestamp":datetime("2012-05-15T22:49:41"), "in-response-to": 1801, "sender-location":point("32.74,66.69"), "tags":{{"verizon", "voice-command" }}, "message":" hate verizon the voice-command is OMG:("}
-{"message-id": 876, "author-id": 379, "timestamp":datetime("2005-10-04T04:45:55"), "in-response-to": 1776, "sender-location":point("35.74,87.01"), "tags":{{"sprint", "voice-command" }}, "message":" can't stand sprint the voice-command is horrible:("}
-{"message-id": 877, "author-id": 380, "timestamp":datetime("2011-04-24T18:50:51"), "in-response-to": 72, "sender-location":point("42.95,78.09"), "tags":{{"samsung", "voicemail-service" }}, "message":" like samsung its voicemail-service is amazing:)"}
-{"message-id": 878, "author-id": 381, "timestamp":datetime("2005-11-26T02:11:02"), "in-response-to": 963, "sender-location":point("33.04,72.2"), "tags":{{"sprint", "voicemail-service" }}, "message":" love sprint its voicemail-service is awesome:)"}
-{"message-id": 879, "author-id": 382, "timestamp":datetime("2005-01-01T09:05:24"), "in-response-to": 267, "sender-location":point("24.64,75.13"), "tags":{{"motorola", "signal" }}, "message":" dislike motorola the signal is horrible:("}
-{"message-id": 880, "author-id": 383, "timestamp":datetime("2012-05-18T21:47:53"), "in-response-to": 1140, "sender-location":point("47.37,74.08"), "tags":{{"at&t", "network" }}, "message":" hate at&t the network is horrible"}
-{"message-id": 881, "author-id": 384, "timestamp":datetime("2011-11-10T02:30:11"), "in-response-to": 607, "sender-location":point("40.05,73.95"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile the shortcut-menu is amazing:)"}
-{"message-id": 882, "author-id": 385, "timestamp":datetime("2010-04-11T16:04:24"), "in-response-to": 2151, "sender-location":point("35.12,74.93"), "tags":{{"t-mobile", "signal" }}, "message":" like t-mobile the signal is good"}
-{"message-id": 883, "author-id": 386, "timestamp":datetime("2011-08-16T19:33:30"), "in-response-to": 2537, "sender-location":point("25.88,97.24"), "tags":{{"at&t", "voicemail-service" }}, "message":" like at&t the voicemail-service is mind-blowing"}
-{"message-id": 884, "author-id": 387, "timestamp":datetime("2010-01-25T17:41:24"), "in-response-to": 1735, "sender-location":point("33.14,72.21"), "tags":{{"at&t", "plan" }}, "message":" like at&t its plan is mind-blowing"}
-{"message-id": 885, "author-id": 388, "timestamp":datetime("2009-11-22T09:34:31"), "in-response-to": 1330, "sender-location":point("24.62,88.7"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon its shortcut-menu is good:)"}
-{"message-id": 886, "author-id": 389, "timestamp":datetime("2010-05-17T13:51:04"), "in-response-to": 1745, "sender-location":point("30.35,94.72"), "tags":{{"sprint", "wireless" }}, "message":" dislike sprint the wireless is bad"}
-{"message-id": 887, "author-id": 390, "timestamp":datetime("2007-03-04T13:35:26"), "in-response-to": 1526, "sender-location":point("31.12,86.11"), "tags":{{"samsung", "speed" }}, "message":" love samsung the speed is amazing"}
-{"message-id": 888, "author-id": 391, "timestamp":datetime("2005-08-05T06:07:12"), "in-response-to": 249, "sender-location":point("37.03,91.2"), "tags":{{"verizon", "plan" }}, "message":" like verizon its plan is mind-blowing"}
-{"message-id": 889, "author-id": 392, "timestamp":datetime("2006-10-07T14:13:52"), "in-response-to": 88, "sender-location":point("27.61,86.66"), "tags":{{"verizon", "wireless" }}, "message":" can't stand verizon the wireless is terrible:("}
-{"message-id": 890, "author-id": 393, "timestamp":datetime("2013-06-05T06:33:37"), "in-response-to": 2295, "sender-location":point("29.79,97.08"), "tags":{{"sprint", "voicemail-service" }}, "message":" like sprint the voicemail-service is mind-blowing"}
-{"message-id": 891, "author-id": 394, "timestamp":datetime("2005-09-18T20:43:00"), "in-response-to": 1903, "sender-location":point("42.52,86.95"), "tags":{{"t-mobile", "touch-screen" }}, "message":" like t-mobile the touch-screen is amazing:)"}
-{"message-id": 892, "author-id": 395, "timestamp":datetime("2010-03-17T04:16:59"), "in-response-to": 2011, "sender-location":point("44.99,97.31"), "tags":{{"sprint", "3G" }}, "message":" hate sprint the 3G is bad:("}
-{"message-id": 893, "author-id": 396, "timestamp":datetime("2009-08-21T17:55:44"), "in-response-to": 1799, "sender-location":point("43.15,72.04"), "tags":{{"motorola", "wireless" }}, "message":" hate motorola its wireless is horrible"}
-{"message-id": 894, "author-id": 397, "timestamp":datetime("2005-09-13T21:32:33"), "in-response-to": 2497, "sender-location":point("30.63,78.04"), "tags":{{"t-mobile", "reachability" }}, "message":" dislike t-mobile its reachability is terrible"}
-{"message-id": 895, "author-id": 398, "timestamp":datetime("2014-08-17T18:11:03"), "in-response-to": 822, "sender-location":point("41.24,87.72"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone its voice-clarity is amazing:)"}
-{"message-id": 896, "author-id": 399, "timestamp":datetime("2008-07-28T18:46:37"), "in-response-to": 649, "sender-location":point("27.79,79.84"), "tags":{{"sprint", "customization" }}, "message":" like sprint the customization is mind-blowing"}
-{"message-id": 897, "author-id": 400, "timestamp":datetime("2010-08-19T10:30:07"), "in-response-to": 1810, "sender-location":point("28.57,74.92"), "tags":{{"samsung", "customization" }}, "message":" dislike samsung the customization is OMG"}
-{"message-id": 898, "author-id": 401, "timestamp":datetime("2005-10-07T23:21:53"), "in-response-to": 1340, "sender-location":point("35.52,68.53"), "tags":{{"verizon", "3G" }}, "message":" like verizon its 3G is awesome"}
-{"message-id": 899, "author-id": 402, "timestamp":datetime("2013-04-06T20:01:07"), "in-response-to": 6, "sender-location":point("36.89,90.73"), "tags":{{"iphone", "signal" }}, "message":" like iphone the signal is awesome"}
-{"message-id": 900, "author-id": 403, "timestamp":datetime("2013-03-20T01:48:58"), "in-response-to": 2708, "sender-location":point("48.99,81.99"), "tags":{{"motorola", "platform" }}, "message":" hate motorola its platform is OMG"}
-{"message-id": 901, "author-id": 404, "timestamp":datetime("2014-08-29T08:59:41"), "in-response-to": 1130, "sender-location":point("45.03,94.71"), "tags":{{"t-mobile", "3G" }}, "message":" hate t-mobile the 3G is bad:("}
-{"message-id": 902, "author-id": 405, "timestamp":datetime("2012-06-16T22:02:29"), "in-response-to": 1263, "sender-location":point("31.51,85.66"), "tags":{{"t-mobile", "network" }}, "message":" like t-mobile the network is mind-blowing"}
-{"message-id": 903, "author-id": 406, "timestamp":datetime("2006-02-27T03:46:47"), "in-response-to": 458, "sender-location":point("31.92,92.85"), "tags":{{"iphone", "reachability" }}, "message":" dislike iphone the reachability is OMG:("}
-{"message-id": 904, "author-id": 407, "timestamp":datetime("2005-06-25T23:27:33"), "in-response-to": 2027, "sender-location":point("31.21,97.85"), "tags":{{"samsung", "speed" }}, "message":" hate samsung its speed is OMG"}
-{"message-id": 905, "author-id": 408, "timestamp":datetime("2009-10-01T19:00:32"), "in-response-to": 853, "sender-location":point("31.13,75.68"), "tags":{{"sprint", "voicemail-service" }}, "message":" love sprint the voicemail-service is good:)"}
-{"message-id": 906, "author-id": 409, "timestamp":datetime("2012-02-05T16:20:34"), "in-response-to": 367, "sender-location":point("32.77,78.27"), "tags":{{"motorola", "3G" }}, "message":" love motorola the 3G is awesome:)"}
-{"message-id": 907, "author-id": 410, "timestamp":datetime("2011-10-16T15:52:11"), "in-response-to": 609, "sender-location":point("44.96,88.03"), "tags":{{"verizon", "network" }}, "message":" hate verizon the network is horrible"}
-{"message-id": 908, "author-id": 411, "timestamp":datetime("2007-09-18T05:47:54"), "in-response-to": 438, "sender-location":point("25.87,97.97"), "tags":{{"iphone", "customer-service" }}, "message":" hate iphone the customer-service is terrible:("}
-{"message-id": 909, "author-id": 412, "timestamp":datetime("2014-05-12T09:59:13"), "in-response-to": 2681, "sender-location":point("46.45,94.98"), "tags":{{"samsung", "voicemail-service" }}, "message":" hate samsung its voicemail-service is terrible"}
-{"message-id": 910, "author-id": 413, "timestamp":datetime("2007-12-08T12:49:50"), "in-response-to": 2983, "sender-location":point("40.76,89.96"), "tags":{{"verizon", "wireless" }}, "message":" like verizon its wireless is mind-blowing"}
-{"message-id": 911, "author-id": 414, "timestamp":datetime("2009-02-20T06:24:18"), "in-response-to": 2628, "sender-location":point("33.19,71.69"), "tags":{{"at&t", "signal" }}, "message":" love at&t the signal is awesome"}
-{"message-id": 912, "author-id": 415, "timestamp":datetime("2007-06-23T09:35:16"), "in-response-to": 599, "sender-location":point("35.77,85.54"), "tags":{{"t-mobile", "reachability" }}, "message":" hate t-mobile its reachability is bad:("}
-{"message-id": 913, "author-id": 416, "timestamp":datetime("2009-08-25T19:13:32"), "in-response-to": 2558, "sender-location":point("46.86,82.07"), "tags":{{"iphone", "wireless" }}, "message":" dislike iphone the wireless is OMG:("}
-{"message-id": 914, "author-id": 417, "timestamp":datetime("2011-01-07T12:26:32"), "in-response-to": 256, "sender-location":point("46.56,74.38"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" dislike t-mobile its voicemail-service is bad:("}
-{"message-id": 915, "author-id": 418, "timestamp":datetime("2010-07-07T16:31:44"), "in-response-to": 3124, "sender-location":point("48.4,82.49"), "tags":{{"sprint", "signal" }}, "message":" like sprint the signal is good"}
-{"message-id": 916, "author-id": 419, "timestamp":datetime("2008-01-23T11:32:54"), "in-response-to": 2221, "sender-location":point("42.39,71.37"), "tags":{{"at&t", "voice-clarity" }}, "message":" hate at&t the voice-clarity is OMG:("}
-{"message-id": 917, "author-id": 420, "timestamp":datetime("2006-12-13T16:07:58"), "in-response-to": 1293, "sender-location":point("41.86,67.53"), "tags":{{"sprint", "voice-command" }}, "message":" dislike sprint the voice-command is horrible:("}
-{"message-id": 918, "author-id": 421, "timestamp":datetime("2012-03-11T13:54:34"), "in-response-to": 1318, "sender-location":point("27.42,77.29"), "tags":{{"sprint", "speed" }}, "message":" love sprint the speed is mind-blowing:)"}
-{"message-id": 919, "author-id": 422, "timestamp":datetime("2014-01-28T05:04:40"), "in-response-to": 2094, "sender-location":point("30.81,97.82"), "tags":{{"sprint", "voice-clarity" }}, "message":" hate sprint its voice-clarity is horrible:("}
-{"message-id": 920, "author-id": 423, "timestamp":datetime("2014-01-26T02:44:37"), "in-response-to": 970, "sender-location":point("46.98,95.23"), "tags":{{"motorola", "shortcut-menu" }}, "message":" like motorola its shortcut-menu is mind-blowing"}
-{"message-id": 921, "author-id": 424, "timestamp":datetime("2005-01-12T15:55:33"), "in-response-to": 93, "sender-location":point("45.19,92.76"), "tags":{{"samsung", "voice-command" }}, "message":" hate samsung its voice-command is OMG:("}
-{"message-id": 922, "author-id": 425, "timestamp":datetime("2007-11-17T07:40:17"), "in-response-to": 532, "sender-location":point("24.86,89.46"), "tags":{{"iphone", "network" }}, "message":" hate iphone its network is terrible:("}
-{"message-id": 923, "author-id": 426, "timestamp":datetime("2005-11-12T21:44:15"), "in-response-to": 817, "sender-location":point("42.49,97.7"), "tags":{{"verizon", "plan" }}, "message":" can't stand verizon its plan is horrible"}
-{"message-id": 924, "author-id": 427, "timestamp":datetime("2006-03-27T23:08:47"), "in-response-to": 2681, "sender-location":point("41.27,85.64"), "tags":{{"sprint", "voicemail-service" }}, "message":" like sprint its voicemail-service is mind-blowing"}
-{"message-id": 925, "author-id": 428, "timestamp":datetime("2006-08-22T08:23:24"), "in-response-to": 3159, "sender-location":point("28.77,73.3"), "tags":{{"at&t", "speed" }}, "message":" love at&t its speed is good"}
-{"message-id": 926, "author-id": 429, "timestamp":datetime("2010-07-12T02:47:13"), "in-response-to": 2900, "sender-location":point("33.34,78.33"), "tags":{{"sprint", "network" }}, "message":" dislike sprint the network is bad:("}
-{"message-id": 927, "author-id": 430, "timestamp":datetime("2014-08-06T06:00:46"), "in-response-to": 1948, "sender-location":point("43.95,89.0"), "tags":{{"verizon", "reachability" }}, "message":" like verizon the reachability is mind-blowing"}
-{"message-id": 928, "author-id": 431, "timestamp":datetime("2012-05-18T09:33:13"), "in-response-to": 507, "sender-location":point("47.26,90.92"), "tags":{{"at&t", "signal" }}, "message":" can't stand at&t the signal is terrible:("}
-{"message-id": 929, "author-id": 432, "timestamp":datetime("2012-06-14T11:27:01"), "in-response-to": 767, "sender-location":point("24.33,68.05"), "tags":{{"verizon", "customer-service" }}, "message":" hate verizon the customer-service is terrible:("}
-{"message-id": 930, "author-id": 433, "timestamp":datetime("2012-09-19T14:09:43"), "in-response-to": 1676, "sender-location":point("30.71,81.83"), "tags":{{"at&t", "voice-clarity" }}, "message":" can't stand at&t its voice-clarity is terrible:("}
-{"message-id": 931, "author-id": 434, "timestamp":datetime("2006-09-22T08:57:46"), "in-response-to": 1644, "sender-location":point("43.84,67.63"), "tags":{{"iphone", "customization" }}, "message":" dislike iphone the customization is terrible:("}
-{"message-id": 932, "author-id": 435, "timestamp":datetime("2013-12-26T14:18:09"), "in-response-to": 1911, "sender-location":point("46.11,80.41"), "tags":{{"iphone", "shortcut-menu" }}, "message":" like iphone its shortcut-menu is good"}
-{"message-id": 933, "author-id": 436, "timestamp":datetime("2012-05-07T23:58:05"), "in-response-to": 96, "sender-location":point("29.06,75.99"), "tags":{{"motorola", "3G" }}, "message":" can't stand motorola its 3G is OMG:("}
-{"message-id": 934, "author-id": 437, "timestamp":datetime("2013-08-18T09:43:41"), "in-response-to": 1615, "sender-location":point("29.9,84.65"), "tags":{{"verizon", "speed" }}, "message":" hate verizon the speed is OMG:("}
-{"message-id": 935, "author-id": 438, "timestamp":datetime("2010-02-27T19:26:07"), "in-response-to": 1003, "sender-location":point("35.96,78.81"), "tags":{{"iphone", "touch-screen" }}, "message":" dislike iphone its touch-screen is OMG"}
-{"message-id": 936, "author-id": 439, "timestamp":datetime("2012-02-15T07:34:36"), "in-response-to": 181, "sender-location":point("47.47,75.01"), "tags":{{"sprint", "speed" }}, "message":" can't stand sprint the speed is horrible:("}
-{"message-id": 937, "author-id": 440, "timestamp":datetime("2012-06-06T03:53:35"), "in-response-to": 1232, "sender-location":point("26.71,88.19"), "tags":{{"t-mobile", "plan" }}, "message":" hate t-mobile the plan is horrible"}
-{"message-id": 938, "author-id": 441, "timestamp":datetime("2010-09-21T12:13:46"), "in-response-to": 1113, "sender-location":point("47.19,93.29"), "tags":{{"t-mobile", "speed" }}, "message":" love t-mobile its speed is good:)"}
-{"message-id": 939, "author-id": 442, "timestamp":datetime("2013-02-06T06:23:43"), "in-response-to": 3214, "sender-location":point("42.72,87.76"), "tags":{{"samsung", "reachability" }}, "message":" can't stand samsung the reachability is horrible:("}
-{"message-id": 940, "author-id": 443, "timestamp":datetime("2005-10-16T11:14:52"), "in-response-to": 1478, "sender-location":point("37.83,72.87"), "tags":{{"at&t", "voice-clarity" }}, "message":" dislike at&t its voice-clarity is bad:("}
-{"message-id": 941, "author-id": 444, "timestamp":datetime("2008-12-25T07:53:54"), "in-response-to": 2032, "sender-location":point("31.5,84.69"), "tags":{{"at&t", "customization" }}, "message":" can't stand at&t its customization is bad"}
-{"message-id": 942, "author-id": 445, "timestamp":datetime("2011-11-19T05:51:24"), "in-response-to": 3137, "sender-location":point("43.1,94.31"), "tags":{{"verizon", "voicemail-service" }}, "message":" hate verizon its voicemail-service is bad:("}
-{"message-id": 943, "author-id": 446, "timestamp":datetime("2006-08-10T09:23:43"), "in-response-to": 3085, "sender-location":point("48.44,95.59"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone the voice-command is OMG"}
-{"message-id": 944, "author-id": 447, "timestamp":datetime("2007-06-17T18:20:49"), "in-response-to": 2617, "sender-location":point("31.54,78.18"), "tags":{{"sprint", "touch-screen" }}, "message":" can't stand sprint its touch-screen is horrible:("}
-{"message-id": 945, "author-id": 448, "timestamp":datetime("2008-02-09T11:36:59"), "in-response-to": 3072, "sender-location":point("37.89,96.01"), "tags":{{"samsung", "customization" }}, "message":" hate samsung its customization is OMG"}
-{"message-id": 946, "author-id": 449, "timestamp":datetime("2007-05-04T21:01:20"), "in-response-to": 1447, "sender-location":point("24.98,96.69"), "tags":{{"t-mobile", "touch-screen" }}, "message":" dislike t-mobile the touch-screen is OMG:("}
-{"message-id": 947, "author-id": 450, "timestamp":datetime("2007-09-07T11:38:17"), "in-response-to": 2858, "sender-location":point("43.46,80.8"), "tags":{{"verizon", "voice-command" }}, "message":" love verizon its voice-command is amazing"}
-{"message-id": 948, "author-id": 451, "timestamp":datetime("2011-03-21T11:32:27"), "in-response-to": 364, "sender-location":point("30.39,86.96"), "tags":{{"sprint", "plan" }}, "message":" like sprint the plan is awesome"}
-{"message-id": 949, "author-id": 452, "timestamp":datetime("2013-05-08T13:16:32"), "in-response-to": 1156, "sender-location":point("48.16,78.07"), "tags":{{"samsung", "reachability" }}, "message":" can't stand samsung the reachability is horrible"}
-{"message-id": 950, "author-id": 453, "timestamp":datetime("2009-02-05T19:53:10"), "in-response-to": 3083, "sender-location":point("32.28,80.37"), "tags":{{"samsung", "3G" }}, "message":" love samsung the 3G is awesome:)"}
-{"message-id": 951, "author-id": 454, "timestamp":datetime("2014-03-01T12:59:06"), "in-response-to": 679, "sender-location":point("38.4,70.54"), "tags":{{"at&t", "shortcut-menu" }}, "message":" dislike at&t its shortcut-menu is horrible:("}
-{"message-id": 952, "author-id": 455, "timestamp":datetime("2007-10-08T06:02:29"), "in-response-to": 2952, "sender-location":point("43.24,73.24"), "tags":{{"t-mobile", "3G" }}, "message":" love t-mobile its 3G is awesome:)"}
-{"message-id": 953, "author-id": 456, "timestamp":datetime("2006-02-18T22:30:05"), "in-response-to": 40, "sender-location":point("38.96,87.65"), "tags":{{"samsung", "reachability" }}, "message":" dislike samsung its reachability is bad:("}
-{"message-id": 954, "author-id": 457, "timestamp":datetime("2006-11-10T14:32:59"), "in-response-to": 2181, "sender-location":point("44.0,80.33"), "tags":{{"sprint", "speed" }}, "message":" can't stand sprint the speed is horrible"}
-{"message-id": 955, "author-id": 458, "timestamp":datetime("2009-07-18T19:18:56"), "in-response-to": 472, "sender-location":point("36.89,81.92"), "tags":{{"sprint", "platform" }}, "message":" love sprint its platform is good:)"}
-{"message-id": 956, "author-id": 459, "timestamp":datetime("2011-02-09T01:36:30"), "in-response-to": 2542, "sender-location":point("27.07,90.19"), "tags":{{"motorola", "network" }}, "message":" like motorola its network is amazing"}
-{"message-id": 957, "author-id": 460, "timestamp":datetime("2007-03-23T05:31:58"), "in-response-to": 2934, "sender-location":point("27.2,89.82"), "tags":{{"sprint", "signal" }}, "message":" like sprint the signal is good"}
-{"message-id": 958, "author-id": 461, "timestamp":datetime("2008-03-26T06:24:44"), "in-response-to": 3191, "sender-location":point("30.67,82.94"), "tags":{{"sprint", "voice-command" }}, "message":" can't stand sprint its voice-command is horrible:("}
-{"message-id": 959, "author-id": 462, "timestamp":datetime("2011-07-27T08:17:32"), "in-response-to": 747, "sender-location":point("41.59,91.56"), "tags":{{"samsung", "voicemail-service" }}, "message":" love samsung the voicemail-service is mind-blowing"}
-{"message-id": 960, "author-id": 463, "timestamp":datetime("2010-11-24T14:52:27"), "in-response-to": 1693, "sender-location":point("44.79,83.78"), "tags":{{"sprint", "voice-clarity" }}, "message":" love sprint its voice-clarity is mind-blowing"}
-{"message-id": 961, "author-id": 464, "timestamp":datetime("2014-07-10T02:29:50"), "in-response-to": 3249, "sender-location":point("40.31,76.2"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" can't stand t-mobile the voice-clarity is horrible:("}
-{"message-id": 962, "author-id": 465, "timestamp":datetime("2010-01-12T02:42:59"), "in-response-to": 1970, "sender-location":point("39.29,87.51"), "tags":{{"iphone", "platform" }}, "message":" like iphone the platform is mind-blowing:)"}
-{"message-id": 963, "author-id": 466, "timestamp":datetime("2009-08-18T10:22:24"), "in-response-to": 1115, "sender-location":point("45.17,69.44"), "tags":{{"iphone", "platform" }}, "message":" dislike iphone the platform is horrible:("}
-{"message-id": 964, "author-id": 467, "timestamp":datetime("2011-03-16T18:31:11"), "in-response-to": 1994, "sender-location":point("47.22,93.85"), "tags":{{"iphone", "customization" }}, "message":" love iphone its customization is amazing"}
-{"message-id": 965, "author-id": 468, "timestamp":datetime("2012-03-14T04:41:52"), "in-response-to": 1831, "sender-location":point("28.55,66.46"), "tags":{{"t-mobile", "network" }}, "message":" love t-mobile its network is awesome"}
-{"message-id": 966, "author-id": 469, "timestamp":datetime("2012-01-21T11:08:14"), "in-response-to": 16, "sender-location":point("43.15,89.93"), "tags":{{"t-mobile", "voice-command" }}, "message":" love t-mobile the voice-command is awesome:)"}
-{"message-id": 967, "author-id": 470, "timestamp":datetime("2010-04-09T01:22:13"), "in-response-to": 1516, "sender-location":point("27.06,94.19"), "tags":{{"t-mobile", "network" }}, "message":" can't stand t-mobile the network is OMG"}
-{"message-id": 968, "author-id": 471, "timestamp":datetime("2005-07-25T06:11:44"), "in-response-to": 2885, "sender-location":point("25.36,67.55"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" hate t-mobile its shortcut-menu is OMG:("}
-{"message-id": 969, "author-id": 472, "timestamp":datetime("2006-05-09T18:37:24"), "in-response-to": 2856, "sender-location":point("39.11,78.98"), "tags":{{"iphone", "speed" }}, "message":" love iphone the speed is mind-blowing:)"}
-{"message-id": 970, "author-id": 473, "timestamp":datetime("2005-06-10T06:59:17"), "in-response-to": 2272, "sender-location":point("42.44,80.66"), "tags":{{"iphone", "touch-screen" }}, "message":" dislike iphone the touch-screen is terrible:("}
-{"message-id": 971, "author-id": 474, "timestamp":datetime("2014-04-24T20:03:10"), "in-response-to": 2392, "sender-location":point("33.03,94.35"), "tags":{{"at&t", "network" }}, "message":" hate at&t the network is horrible"}
-{"message-id": 972, "author-id": 475, "timestamp":datetime("2011-02-14T17:08:24"), "in-response-to": 1449, "sender-location":point("48.38,87.12"), "tags":{{"iphone", "signal" }}, "message":" like iphone its signal is mind-blowing:)"}
-{"message-id": 973, "author-id": 476, "timestamp":datetime("2006-08-02T19:43:06"), "in-response-to": 1276, "sender-location":point("48.29,70.58"), "tags":{{"iphone", "speed" }}, "message":" love iphone its speed is awesome:)"}
-{"message-id": 974, "author-id": 477, "timestamp":datetime("2009-04-06T13:14:16"), "in-response-to": 1313, "sender-location":point("44.35,81.53"), "tags":{{"motorola", "voice-command" }}, "message":" can't stand motorola its voice-command is bad"}
-{"message-id": 975, "author-id": 478, "timestamp":datetime("2007-09-02T19:39:34"), "in-response-to": 333, "sender-location":point("36.76,83.23"), "tags":{{"motorola", "voice-clarity" }}, "message":" like motorola its voice-clarity is mind-blowing:)"}
-{"message-id": 976, "author-id": 479, "timestamp":datetime("2008-04-24T18:25:16"), "in-response-to": 553, "sender-location":point("31.31,67.45"), "tags":{{"at&t", "network" }}, "message":" like at&t the network is mind-blowing:)"}
-{"message-id": 977, "author-id": 480, "timestamp":datetime("2013-04-01T17:48:05"), "in-response-to": 2871, "sender-location":point("30.51,80.58"), "tags":{{"sprint", "customer-service" }}, "message":" love sprint the customer-service is awesome"}
-{"message-id": 978, "author-id": 481, "timestamp":datetime("2007-03-05T05:04:05"), "in-response-to": 1999, "sender-location":point("41.67,96.1"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" like t-mobile its shortcut-menu is amazing"}
-{"message-id": 979, "author-id": 482, "timestamp":datetime("2005-01-23T05:29:12"), "in-response-to": 1630, "sender-location":point("45.5,76.06"), "tags":{{"motorola", "voicemail-service" }}, "message":" love motorola its voicemail-service is good"}
-{"message-id": 980, "author-id": 483, "timestamp":datetime("2014-06-11T02:16:25"), "in-response-to": 252, "sender-location":point("44.33,88.82"), "tags":{{"motorola", "speed" }}, "message":" hate motorola the speed is bad"}
-{"message-id": 981, "author-id": 484, "timestamp":datetime("2006-11-23T09:37:52"), "in-response-to": 316, "sender-location":point("34.56,88.47"), "tags":{{"iphone", "customer-service" }}, "message":" can't stand iphone the customer-service is OMG:("}
-{"message-id": 982, "author-id": 485, "timestamp":datetime("2013-09-09T00:40:25"), "in-response-to": 2809, "sender-location":point("43.93,90.51"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t the voice-clarity is amazing"}
-{"message-id": 983, "author-id": 486, "timestamp":datetime("2009-07-26T10:29:09"), "in-response-to": 2991, "sender-location":point("30.89,91.18"), "tags":{{"motorola", "voice-command" }}, "message":" love motorola its voice-command is awesome:)"}
-{"message-id": 984, "author-id": 487, "timestamp":datetime("2011-05-03T08:41:11"), "in-response-to": 829, "sender-location":point("37.39,91.0"), "tags":{{"at&t", "plan" }}, "message":" like at&t its plan is amazing"}
-{"message-id": 985, "author-id": 488, "timestamp":datetime("2010-10-09T04:05:48"), "in-response-to": 2641, "sender-location":point("24.95,73.17"), "tags":{{"samsung", "network" }}, "message":" can't stand samsung the network is OMG"}
-{"message-id": 986, "author-id": 489, "timestamp":datetime("2007-06-11T20:48:47"), "in-response-to": 3015, "sender-location":point("33.04,85.64"), "tags":{{"samsung", "voice-command" }}, "message":" can't stand samsung its voice-command is OMG:("}
-{"message-id": 987, "author-id": 490, "timestamp":datetime("2010-06-24T17:52:36"), "in-response-to": 697, "sender-location":point("48.75,95.93"), "tags":{{"at&t", "shortcut-menu" }}, "message":" love at&t its shortcut-menu is amazing:)"}
-{"message-id": 988, "author-id": 491, "timestamp":datetime("2005-03-28T02:37:04"), "in-response-to": 3057, "sender-location":point("25.28,81.37"), "tags":{{"sprint", "speed" }}, "message":" like sprint its speed is awesome:)"}
-{"message-id": 989, "author-id": 492, "timestamp":datetime("2011-04-04T01:43:22"), "in-response-to": 2312, "sender-location":point("26.27,73.93"), "tags":{{"iphone", "speed" }}, "message":" like iphone its speed is good:)"}
-{"message-id": 990, "author-id": 493, "timestamp":datetime("2011-02-25T09:37:46"), "in-response-to": 2904, "sender-location":point("48.19,93.84"), "tags":{{"sprint", "customization" }}, "message":" can't stand sprint its customization is bad:("}
-{"message-id": 991, "author-id": 494, "timestamp":datetime("2012-10-07T17:43:40"), "in-response-to": 1296, "sender-location":point("45.5,96.18"), "tags":{{"iphone", "speed" }}, "message":" dislike iphone the speed is terrible:("}
-{"message-id": 992, "author-id": 495, "timestamp":datetime("2009-06-15T01:12:04"), "in-response-to": 828, "sender-location":point("47.5,91.38"), "tags":{{"at&t", "shortcut-menu" }}, "message":" like at&t its shortcut-menu is good:)"}
-{"message-id": 993, "author-id": 496, "timestamp":datetime("2008-08-11T00:43:49"), "in-response-to": 3117, "sender-location":point("34.04,82.54"), "tags":{{"verizon", "customization" }}, "message":" hate verizon the customization is terrible:("}
-{"message-id": 994, "author-id": 497, "timestamp":datetime("2014-01-01T06:15:06"), "in-response-to": 964, "sender-location":point("42.36,95.5"), "tags":{{"samsung", "wireless" }}, "message":" dislike samsung the wireless is horrible:("}
-{"message-id": 995, "author-id": 498, "timestamp":datetime("2013-06-15T19:04:53"), "in-response-to": 1173, "sender-location":point("44.05,96.27"), "tags":{{"t-mobile", "plan" }}, "message":" dislike t-mobile its plan is bad"}
-{"message-id": 996, "author-id": 499, "timestamp":datetime("2008-09-15T04:09:19"), "in-response-to": 2702, "sender-location":point("45.67,73.03"), "tags":{{"sprint", "platform" }}, "message":" love sprint its platform is amazing:)"}
-{"message-id": 997, "author-id": 500, "timestamp":datetime("2010-06-02T07:01:57"), "in-response-to": 949, "sender-location":point("47.59,85.31"), "tags":{{"sprint", "voice-clarity" }}, "message":" can't stand sprint the voice-clarity is OMG"}
-{"message-id": 998, "author-id": 501, "timestamp":datetime("2014-01-24T19:42:19"), "in-response-to": 2079, "sender-location":point("45.38,89.97"), "tags":{{"iphone", "speed" }}, "message":" like iphone the speed is mind-blowing"}
-{"message-id": 999, "author-id": 502, "timestamp":datetime("2014-02-10T06:35:34"), "in-response-to": 905, "sender-location":point("34.02,97.15"), "tags":{{"motorola", "wireless" }}, "message":" can't stand motorola the wireless is OMG"}
-{"message-id": 1000, "author-id": 503, "timestamp":datetime("2007-03-20T11:19:04"), "in-response-to": 113, "sender-location":point("38.15,88.36"), "tags":{{"motorola", "voice-clarity" }}, "message":" dislike motorola its voice-clarity is OMG:("}
-{"message-id": 1001, "author-id": 504, "timestamp":datetime("2014-07-19T23:31:28"), "in-response-to": 1488, "sender-location":point("48.66,71.9"), "tags":{{"motorola", "touch-screen" }}, "message":" dislike motorola its touch-screen is OMG"}
-{"message-id": 1002, "author-id": 505, "timestamp":datetime("2006-02-04T15:22:47"), "in-response-to": 129, "sender-location":point("31.16,75.78"), "tags":{{"iphone", "3G" }}, "message":" hate iphone the 3G is OMG:("}
-{"message-id": 1003, "author-id": 506, "timestamp":datetime("2007-04-07T17:32:35"), "in-response-to": 809, "sender-location":point("24.57,89.41"), "tags":{{"samsung", "voice-command" }}, "message":" hate samsung the voice-command is OMG:("}
-{"message-id": 1004, "author-id": 507, "timestamp":datetime("2006-01-09T21:32:31"), "in-response-to": 243, "sender-location":point("47.34,69.75"), "tags":{{"iphone", "voicemail-service" }}, "message":" dislike iphone its voicemail-service is bad:("}
-{"message-id": 1005, "author-id": 508, "timestamp":datetime("2009-02-08T06:18:04"), "in-response-to": 1455, "sender-location":point("47.38,96.42"), "tags":{{"samsung", "wireless" }}, "message":" dislike samsung its wireless is horrible"}
-{"message-id": 1006, "author-id": 509, "timestamp":datetime("2006-09-01T02:01:23"), "in-response-to": 1978, "sender-location":point("43.79,68.44"), "tags":{{"sprint", "reachability" }}, "message":" like sprint its reachability is good:)"}
-{"message-id": 1007, "author-id": 510, "timestamp":datetime("2013-01-14T03:39:35"), "in-response-to": 2849, "sender-location":point("47.22,82.38"), "tags":{{"iphone", "customer-service" }}, "message":" hate iphone the customer-service is bad:("}
-{"message-id": 1008, "author-id": 511, "timestamp":datetime("2009-09-27T17:23:02"), "in-response-to": 527, "sender-location":point("38.81,82.31"), "tags":{{"samsung", "network" }}, "message":" hate samsung the network is bad:("}
-{"message-id": 1009, "author-id": 512, "timestamp":datetime("2006-07-06T14:09:41"), "in-response-to": 1495, "sender-location":point("29.79,91.41"), "tags":{{"samsung", "platform" }}, "message":" hate samsung its platform is horrible:("}
-{"message-id": 1010, "author-id": 513, "timestamp":datetime("2011-07-18T04:24:46"), "in-response-to": 1521, "sender-location":point("39.78,89.71"), "tags":{{"at&t", "network" }}, "message":" love at&t the network is good"}
-{"message-id": 1011, "author-id": 514, "timestamp":datetime("2011-04-16T13:17:34"), "in-response-to": 1381, "sender-location":point("34.38,77.86"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile its shortcut-menu is mind-blowing"}
-{"message-id": 1012, "author-id": 515, "timestamp":datetime("2007-03-06T00:48:03"), "in-response-to": 525, "sender-location":point("35.65,73.74"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon the voicemail-service is good:)"}
-{"message-id": 1013, "author-id": 516, "timestamp":datetime("2008-08-03T04:55:51"), "in-response-to": 1312, "sender-location":point("39.39,70.86"), "tags":{{"verizon", "platform" }}, "message":" love verizon the platform is mind-blowing"}
-{"message-id": 1014, "author-id": 517, "timestamp":datetime("2013-09-28T19:57:03"), "in-response-to": 347, "sender-location":point("29.08,71.39"), "tags":{{"samsung", "speed" }}, "message":" hate samsung its speed is terrible:("}
-{"message-id": 1015, "author-id": 518, "timestamp":datetime("2005-09-12T14:53:40"), "in-response-to": 321, "sender-location":point("25.65,93.35"), "tags":{{"motorola", "3G" }}, "message":" love motorola its 3G is amazing:)"}
-{"message-id": 1016, "author-id": 519, "timestamp":datetime("2009-02-06T00:56:51"), "in-response-to": 730, "sender-location":point("34.5,66.34"), "tags":{{"t-mobile", "reachability" }}, "message":" like t-mobile its reachability is awesome"}
-{"message-id": 1017, "author-id": 520, "timestamp":datetime("2013-12-16T09:20:16"), "in-response-to": 3212, "sender-location":point("44.21,78.9"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone the voice-clarity is good:)"}
-{"message-id": 1018, "author-id": 521, "timestamp":datetime("2005-11-01T08:29:46"), "in-response-to": 1810, "sender-location":point("31.19,86.29"), "tags":{{"motorola", "signal" }}, "message":" hate motorola its signal is OMG"}
-{"message-id": 1019, "author-id": 522, "timestamp":datetime("2009-12-15T21:55:27"), "in-response-to": 1689, "sender-location":point("24.92,66.96"), "tags":{{"motorola", "customization" }}, "message":" dislike motorola the customization is horrible:("}
-{"message-id": 1020, "author-id": 523, "timestamp":datetime("2009-07-19T09:11:16"), "in-response-to": 1864, "sender-location":point("35.08,68.98"), "tags":{{"motorola", "3G" }}, "message":" dislike motorola the 3G is horrible"}
-{"message-id": 1021, "author-id": 524, "timestamp":datetime("2008-04-18T11:48:10"), "in-response-to": 1888, "sender-location":point("40.47,94.74"), "tags":{{"at&t", "voicemail-service" }}, "message":" hate at&t the voicemail-service is bad:("}
-{"message-id": 1022, "author-id": 525, "timestamp":datetime("2006-08-05T02:54:46"), "in-response-to": 2140, "sender-location":point("42.94,80.57"), "tags":{{"verizon", "reachability" }}, "message":" can't stand verizon the reachability is horrible"}
-{"message-id": 1023, "author-id": 526, "timestamp":datetime("2008-03-27T01:33:55"), "in-response-to": 1065, "sender-location":point("31.8,76.66"), "tags":{{"sprint", "wireless" }}, "message":" love sprint the wireless is mind-blowing:)"}
-{"message-id": 1024, "author-id": 527, "timestamp":datetime("2011-08-02T11:56:39"), "in-response-to": 1556, "sender-location":point("29.36,87.01"), "tags":{{"iphone", "plan" }}, "message":" love iphone its plan is amazing"}
-{"message-id": 1025, "author-id": 528, "timestamp":datetime("2005-09-04T04:13:18"), "in-response-to": 2062, "sender-location":point("43.64,68.95"), "tags":{{"verizon", "touch-screen" }}, "message":" like verizon its touch-screen is amazing:)"}
-{"message-id": 1026, "author-id": 529, "timestamp":datetime("2013-02-19T16:17:00"), "in-response-to": 1410, "sender-location":point("47.35,84.0"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is good:)"}
-{"message-id": 1027, "author-id": 530, "timestamp":datetime("2008-06-04T19:14:52"), "in-response-to": 1174, "sender-location":point("48.12,90.09"), "tags":{{"verizon", "voice-command" }}, "message":" dislike verizon the voice-command is terrible"}
-{"message-id": 1028, "author-id": 531, "timestamp":datetime("2009-09-02T21:04:05"), "in-response-to": 395, "sender-location":point("25.83,86.0"), "tags":{{"motorola", "voice-command" }}, "message":" can't stand motorola its voice-command is bad:("}
-{"message-id": 1029, "author-id": 532, "timestamp":datetime("2006-05-10T17:53:29"), "in-response-to": 776, "sender-location":point("39.93,94.63"), "tags":{{"iphone", "signal" }}, "message":" love iphone the signal is mind-blowing:)"}
-{"message-id": 1030, "author-id": 533, "timestamp":datetime("2013-07-04T02:57:01"), "in-response-to": 916, "sender-location":point("44.45,90.38"), "tags":{{"samsung", "touch-screen" }}, "message":" hate samsung the touch-screen is bad:("}
-{"message-id": 1031, "author-id": 534, "timestamp":datetime("2006-12-05T17:37:54"), "in-response-to": 671, "sender-location":point("28.5,67.34"), "tags":{{"at&t", "customization" }}, "message":" love at&t its customization is mind-blowing:)"}
-{"message-id": 1032, "author-id": 535, "timestamp":datetime("2010-02-24T06:45:22"), "in-response-to": 857, "sender-location":point("47.8,95.64"), "tags":{{"verizon", "plan" }}, "message":" can't stand verizon the plan is horrible"}
-{"message-id": 1033, "author-id": 536, "timestamp":datetime("2013-06-23T10:25:06"), "in-response-to": 1279, "sender-location":point("32.47,84.09"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola its voicemail-service is awesome:)"}
-{"message-id": 1034, "author-id": 537, "timestamp":datetime("2006-09-22T07:41:47"), "in-response-to": 2572, "sender-location":point("41.3,91.64"), "tags":{{"verizon", "signal" }}, "message":" dislike verizon the signal is bad"}
-{"message-id": 1035, "author-id": 538, "timestamp":datetime("2007-02-22T04:53:39"), "in-response-to": 671, "sender-location":point("38.33,67.57"), "tags":{{"sprint", "wireless" }}, "message":" hate sprint its wireless is OMG"}
-{"message-id": 1036, "author-id": 539, "timestamp":datetime("2014-03-28T23:35:40"), "in-response-to": 2327, "sender-location":point("39.14,71.41"), "tags":{{"at&t", "signal" }}, "message":" like at&t the signal is amazing"}
-{"message-id": 1037, "author-id": 540, "timestamp":datetime("2011-07-07T16:46:24"), "in-response-to": 2227, "sender-location":point("33.9,68.57"), "tags":{{"verizon", "network" }}, "message":" can't stand verizon its network is terrible:("}
-{"message-id": 1038, "author-id": 541, "timestamp":datetime("2008-07-25T23:20:16"), "in-response-to": 1266, "sender-location":point("38.2,74.11"), "tags":{{"t-mobile", "customer-service" }}, "message":" dislike t-mobile the customer-service is OMG"}
-{"message-id": 1039, "author-id": 542, "timestamp":datetime("2013-11-18T18:51:19"), "in-response-to": 2509, "sender-location":point("37.87,92.04"), "tags":{{"samsung", "shortcut-menu" }}, "message":" like samsung its shortcut-menu is awesome"}
-{"message-id": 1040, "author-id": 543, "timestamp":datetime("2011-12-10T06:22:59"), "in-response-to": 1871, "sender-location":point("39.78,86.71"), "tags":{{"sprint", "touch-screen" }}, "message":" can't stand sprint its touch-screen is terrible"}
-{"message-id": 1041, "author-id": 544, "timestamp":datetime("2010-06-04T17:17:28"), "in-response-to": 3004, "sender-location":point("45.34,82.43"), "tags":{{"iphone", "customization" }}, "message":" like iphone its customization is amazing"}
-{"message-id": 1042, "author-id": 545, "timestamp":datetime("2012-10-24T09:04:04"), "in-response-to": 2213, "sender-location":point("24.23,70.85"), "tags":{{"t-mobile", "plan" }}, "message":" love t-mobile its plan is good"}
-{"message-id": 1043, "author-id": 546, "timestamp":datetime("2008-02-22T20:45:11"), "in-response-to": 128, "sender-location":point("40.59,83.93"), "tags":{{"at&t", "reachability" }}, "message":" like at&t the reachability is mind-blowing:)"}
-{"message-id": 1044, "author-id": 547, "timestamp":datetime("2006-08-10T12:17:19"), "in-response-to": 144, "sender-location":point("43.44,77.12"), "tags":{{"samsung", "platform" }}, "message":" dislike samsung the platform is horrible:("}
-{"message-id": 1045, "author-id": 548, "timestamp":datetime("2011-12-15T21:22:56"), "in-response-to": 2703, "sender-location":point("37.45,67.27"), "tags":{{"verizon", "reachability" }}, "message":" can't stand verizon its reachability is bad"}
-{"message-id": 1046, "author-id": 549, "timestamp":datetime("2011-01-08T05:57:35"), "in-response-to": 484, "sender-location":point("48.17,75.34"), "tags":{{"at&t", "touch-screen" }}, "message":" can't stand at&t the touch-screen is OMG:("}
-{"message-id": 1047, "author-id": 550, "timestamp":datetime("2013-02-03T08:56:52"), "in-response-to": 1323, "sender-location":point("35.96,79.24"), "tags":{{"sprint", "reachability" }}, "message":" love sprint the reachability is mind-blowing"}
-{"message-id": 1048, "author-id": 551, "timestamp":datetime("2008-02-05T15:35:47"), "in-response-to": 1965, "sender-location":point("40.54,68.3"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" hate t-mobile its shortcut-menu is horrible"}
-{"message-id": 1049, "author-id": 552, "timestamp":datetime("2006-01-03T20:52:00"), "in-response-to": 1099, "sender-location":point("33.86,94.71"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone the voice-clarity is bad"}
-{"message-id": 1050, "author-id": 553, "timestamp":datetime("2013-11-19T19:30:39"), "in-response-to": 717, "sender-location":point("33.88,82.84"), "tags":{{"iphone", "reachability" }}, "message":" hate iphone the reachability is bad:("}
-{"message-id": 1051, "author-id": 554, "timestamp":datetime("2013-12-15T23:30:40"), "in-response-to": 278, "sender-location":point("36.63,82.37"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is amazing"}
-{"message-id": 1052, "author-id": 555, "timestamp":datetime("2013-05-10T23:01:58"), "in-response-to": 553, "sender-location":point("33.47,77.69"), "tags":{{"motorola", "reachability" }}, "message":" love motorola its reachability is mind-blowing:)"}
-{"message-id": 1053, "author-id": 556, "timestamp":datetime("2008-06-17T04:18:11"), "in-response-to": 1632, "sender-location":point("39.7,86.38"), "tags":{{"motorola", "customization" }}, "message":" love motorola the customization is mind-blowing"}
-{"message-id": 1054, "author-id": 557, "timestamp":datetime("2012-11-01T01:16:57"), "in-response-to": 1439, "sender-location":point("29.39,89.85"), "tags":{{"iphone", "platform" }}, "message":" can't stand iphone the platform is bad"}
-{"message-id": 1055, "author-id": 558, "timestamp":datetime("2007-10-19T15:48:28"), "in-response-to": 2318, "sender-location":point("31.2,67.81"), "tags":{{"t-mobile", "voice-command" }}, "message":" dislike t-mobile the voice-command is OMG"}
-{"message-id": 1056, "author-id": 559, "timestamp":datetime("2013-05-02T19:49:25"), "in-response-to": 3046, "sender-location":point("31.04,70.74"), "tags":{{"motorola", "platform" }}, "message":" like motorola its platform is amazing:)"}
-{"message-id": 1057, "author-id": 560, "timestamp":datetime("2008-05-22T06:49:34"), "in-response-to": 1035, "sender-location":point("42.06,75.98"), "tags":{{"samsung", "platform" }}, "message":" love samsung the platform is amazing:)"}
-{"message-id": 1058, "author-id": 561, "timestamp":datetime("2014-05-17T08:40:16"), "in-response-to": 1693, "sender-location":point("45.92,82.08"), "tags":{{"t-mobile", "network" }}, "message":" hate t-mobile the network is bad"}
-{"message-id": 1059, "author-id": 562, "timestamp":datetime("2005-08-02T09:24:58"), "in-response-to": 3183, "sender-location":point("29.77,67.17"), "tags":{{"verizon", "speed" }}, "message":" like verizon the speed is mind-blowing:)"}
-{"message-id": 1060, "author-id": 563, "timestamp":datetime("2012-08-22T04:15:55"), "in-response-to": 1778, "sender-location":point("48.37,72.12"), "tags":{{"at&t", "wireless" }}, "message":" love at&t the wireless is awesome:)"}
-{"message-id": 1061, "author-id": 564, "timestamp":datetime("2009-09-07T01:22:03"), "in-response-to": 2823, "sender-location":point("40.62,90.33"), "tags":{{"iphone", "platform" }}, "message":" dislike iphone the platform is OMG"}
-{"message-id": 1062, "author-id": 565, "timestamp":datetime("2011-03-20T15:19:19"), "in-response-to": 308, "sender-location":point("39.89,67.99"), "tags":{{"iphone", "3G" }}, "message":" like iphone the 3G is amazing"}
-{"message-id": 1063, "author-id": 566, "timestamp":datetime("2009-10-11T11:15:28"), "in-response-to": 1940, "sender-location":point("34.75,74.08"), "tags":{{"verizon", "wireless" }}, "message":" love verizon the wireless is mind-blowing:)"}
-{"message-id": 1064, "author-id": 567, "timestamp":datetime("2009-07-15T17:19:30"), "in-response-to": 1538, "sender-location":point("25.92,96.14"), "tags":{{"samsung", "3G" }}, "message":" like samsung its 3G is good:)"}
-{"message-id": 1065, "author-id": 568, "timestamp":datetime("2014-01-06T13:47:10"), "in-response-to": 2777, "sender-location":point("36.14,66.75"), "tags":{{"iphone", "reachability" }}, "message":" dislike iphone the reachability is horrible"}
-{"message-id": 1066, "author-id": 569, "timestamp":datetime("2011-01-04T05:01:34"), "in-response-to": 2112, "sender-location":point("36.54,67.85"), "tags":{{"t-mobile", "network" }}, "message":" hate t-mobile its network is OMG:("}
-{"message-id": 1067, "author-id": 570, "timestamp":datetime("2009-12-18T14:23:57"), "in-response-to": 1311, "sender-location":point("30.39,73.28"), "tags":{{"t-mobile", "plan" }}, "message":" love t-mobile its plan is good"}
-{"message-id": 1068, "author-id": 571, "timestamp":datetime("2013-05-20T00:32:51"), "in-response-to": 1381, "sender-location":point("42.72,94.53"), "tags":{{"at&t", "platform" }}, "message":" love at&t its platform is awesome:)"}
-{"message-id": 1069, "author-id": 572, "timestamp":datetime("2013-11-17T00:53:03"), "in-response-to": 2291, "sender-location":point("39.72,75.41"), "tags":{{"motorola", "customer-service" }}, "message":" love motorola the customer-service is mind-blowing"}
-{"message-id": 1070, "author-id": 573, "timestamp":datetime("2013-04-17T10:24:04"), "in-response-to": 2478, "sender-location":point("45.81,80.72"), "tags":{{"verizon", "network" }}, "message":" hate verizon its network is terrible"}
-{"message-id": 1071, "author-id": 574, "timestamp":datetime("2012-12-19T16:32:22"), "in-response-to": 2254, "sender-location":point("28.82,97.76"), "tags":{{"t-mobile", "plan" }}, "message":" dislike t-mobile its plan is terrible"}
-{"message-id": 1072, "author-id": 575, "timestamp":datetime("2009-02-06T10:29:54"), "in-response-to": 3051, "sender-location":point("46.5,92.26"), "tags":{{"t-mobile", "customization" }}, "message":" dislike t-mobile the customization is terrible:("}
-{"message-id": 1073, "author-id": 576, "timestamp":datetime("2014-03-14T11:43:17"), "in-response-to": 867, "sender-location":point("30.91,68.99"), "tags":{{"samsung", "voicemail-service" }}, "message":" can't stand samsung the voicemail-service is terrible"}
-{"message-id": 1074, "author-id": 577, "timestamp":datetime("2006-04-27T05:17:13"), "in-response-to": 2203, "sender-location":point("25.67,94.87"), "tags":{{"samsung", "voicemail-service" }}, "message":" love samsung its voicemail-service is good:)"}
-{"message-id": 1075, "author-id": 578, "timestamp":datetime("2011-02-16T17:34:06"), "in-response-to": 1635, "sender-location":point("36.99,84.39"), "tags":{{"samsung", "network" }}, "message":" love samsung its network is mind-blowing:)"}
-{"message-id": 1076, "author-id": 579, "timestamp":datetime("2010-05-22T06:31:53"), "in-response-to": 164, "sender-location":point("45.9,68.93"), "tags":{{"iphone", "speed" }}, "message":" hate iphone the speed is terrible:("}
-{"message-id": 1077, "author-id": 580, "timestamp":datetime("2012-06-20T05:21:47"), "in-response-to": 2622, "sender-location":point("26.25,67.94"), "tags":{{"at&t", "customization" }}, "message":" can't stand at&t the customization is horrible:("}
-{"message-id": 1078, "author-id": 581, "timestamp":datetime("2010-07-05T06:51:01"), "in-response-to": 2769, "sender-location":point("28.33,71.44"), "tags":{{"t-mobile", "touch-screen" }}, "message":" love t-mobile the touch-screen is amazing:)"}
-{"message-id": 1079, "author-id": 582, "timestamp":datetime("2009-05-02T17:53:23"), "in-response-to": 2038, "sender-location":point("31.85,95.38"), "tags":{{"samsung", "shortcut-menu" }}, "message":" dislike samsung the shortcut-menu is bad:("}
-{"message-id": 1080, "author-id": 583, "timestamp":datetime("2013-09-10T12:23:48"), "in-response-to": 523, "sender-location":point("39.86,86.22"), "tags":{{"sprint", "platform" }}, "message":" like sprint the platform is awesome"}
-{"message-id": 1081, "author-id": 584, "timestamp":datetime("2008-09-23T21:17:34"), "in-response-to": 1250, "sender-location":point("48.89,77.34"), "tags":{{"motorola", "speed" }}, "message":" can't stand motorola the speed is horrible:("}
-{"message-id": 1082, "author-id": 585, "timestamp":datetime("2013-05-17T20:52:11"), "in-response-to": 2548, "sender-location":point("30.8,70.02"), "tags":{{"t-mobile", "3G" }}, "message":" dislike t-mobile the 3G is OMG:("}
-{"message-id": 1083, "author-id": 586, "timestamp":datetime("2014-08-07T00:10:31"), "in-response-to": 3062, "sender-location":point("28.33,74.53"), "tags":{{"at&t", "3G" }}, "message":" like at&t its 3G is awesome"}
-{"message-id": 1084, "author-id": 587, "timestamp":datetime("2006-02-14T03:16:03"), "in-response-to": 1517, "sender-location":point("30.68,82.26"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t the voice-clarity is awesome:)"}
-{"message-id": 1085, "author-id": 588, "timestamp":datetime("2008-03-24T11:00:24"), "in-response-to": 2999, "sender-location":point("43.52,72.4"), "tags":{{"samsung", "voice-command" }}, "message":" love samsung its voice-command is mind-blowing"}
-{"message-id": 1086, "author-id": 589, "timestamp":datetime("2010-06-02T23:14:10"), "in-response-to": 3233, "sender-location":point("37.46,67.67"), "tags":{{"at&t", "customer-service" }}, "message":" like at&t the customer-service is amazing"}
-{"message-id": 1087, "author-id": 590, "timestamp":datetime("2012-12-08T12:32:16"), "in-response-to": 2010, "sender-location":point("41.59,73.54"), "tags":{{"sprint", "3G" }}, "message":" hate sprint the 3G is terrible"}
-{"message-id": 1088, "author-id": 591, "timestamp":datetime("2013-12-14T18:14:17"), "in-response-to": 158, "sender-location":point("41.51,77.58"), "tags":{{"at&t", "customer-service" }}, "message":" can't stand at&t its customer-service is horrible:("}
-{"message-id": 1089, "author-id": 592, "timestamp":datetime("2008-07-16T23:08:48"), "in-response-to": 2566, "sender-location":point("37.26,74.59"), "tags":{{"t-mobile", "3G" }}, "message":" can't stand t-mobile the 3G is horrible:("}
-{"message-id": 1090, "author-id": 593, "timestamp":datetime("2014-07-28T07:11:54"), "in-response-to": 215, "sender-location":point("31.43,94.78"), "tags":{{"samsung", "network" }}, "message":" dislike samsung its network is horrible:("}
-{"message-id": 1091, "author-id": 594, "timestamp":datetime("2006-06-28T21:35:34"), "in-response-to": 437, "sender-location":point("48.84,83.31"), "tags":{{"at&t", "customization" }}, "message":" love at&t the customization is good:)"}
-{"message-id": 1092, "author-id": 595, "timestamp":datetime("2006-10-02T10:15:06"), "in-response-to": 303, "sender-location":point("47.9,85.14"), "tags":{{"samsung", "network" }}, "message":" dislike samsung the network is horrible"}
-{"message-id": 1093, "author-id": 596, "timestamp":datetime("2008-05-16T08:47:20"), "in-response-to": 2891, "sender-location":point("42.26,84.42"), "tags":{{"t-mobile", "touch-screen" }}, "message":" hate t-mobile the touch-screen is OMG:("}
-{"message-id": 1094, "author-id": 597, "timestamp":datetime("2013-06-21T02:47:06"), "in-response-to": 57, "sender-location":point("24.88,81.42"), "tags":{{"iphone", "speed" }}, "message":" love iphone the speed is good"}
-{"message-id": 1095, "author-id": 598, "timestamp":datetime("2005-07-10T19:49:48"), "in-response-to": 1711, "sender-location":point("47.84,82.76"), "tags":{{"iphone", "reachability" }}, "message":" like iphone the reachability is awesome"}
-{"message-id": 1096, "author-id": 599, "timestamp":datetime("2007-11-04T01:01:41"), "in-response-to": 1419, "sender-location":point("35.23,69.14"), "tags":{{"t-mobile", "plan" }}, "message":" dislike t-mobile its plan is OMG"}
-{"message-id": 1097, "author-id": 600, "timestamp":datetime("2012-08-06T13:02:10"), "in-response-to": 3031, "sender-location":point("31.96,90.95"), "tags":{{"samsung", "plan" }}, "message":" dislike samsung its plan is bad:("}
-{"message-id": 1098, "author-id": 601, "timestamp":datetime("2011-01-27T17:57:31"), "in-response-to": 275, "sender-location":point("45.29,80.8"), "tags":{{"t-mobile", "touch-screen" }}, "message":" dislike t-mobile its touch-screen is terrible"}
-{"message-id": 1099, "author-id": 602, "timestamp":datetime("2005-03-06T14:53:50"), "in-response-to": 3090, "sender-location":point("48.04,74.65"), "tags":{{"motorola", "touch-screen" }}, "message":" hate motorola its touch-screen is bad"}
-{"message-id": 1100, "author-id": 603, "timestamp":datetime("2012-11-13T15:53:18"), "in-response-to": 1981, "sender-location":point("25.44,74.84"), "tags":{{"motorola", "signal" }}, "message":" dislike motorola its signal is horrible:("}
-{"message-id": 1101, "author-id": 604, "timestamp":datetime("2007-09-17T22:18:09"), "in-response-to": 1157, "sender-location":point("48.21,72.17"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" hate t-mobile its voicemail-service is terrible:("}
-{"message-id": 1102, "author-id": 605, "timestamp":datetime("2012-08-06T11:57:22"), "in-response-to": 3093, "sender-location":point("33.67,70.79"), "tags":{{"t-mobile", "network" }}, "message":" dislike t-mobile its network is bad"}
-{"message-id": 1103, "author-id": 606, "timestamp":datetime("2013-11-20T04:18:43"), "in-response-to": 1928, "sender-location":point("29.56,97.03"), "tags":{{"verizon", "3G" }}, "message":" love verizon the 3G is awesome:)"}
-{"message-id": 1104, "author-id": 607, "timestamp":datetime("2014-03-22T04:24:47"), "in-response-to": 2155, "sender-location":point("37.2,80.23"), "tags":{{"motorola", "3G" }}, "message":" hate motorola its 3G is terrible"}
-{"message-id": 1105, "author-id": 608, "timestamp":datetime("2005-06-16T03:33:05"), "in-response-to": 2179, "sender-location":point("35.59,92.38"), "tags":{{"motorola", "shortcut-menu" }}, "message":" like motorola its shortcut-menu is amazing"}
-{"message-id": 1106, "author-id": 609, "timestamp":datetime("2010-12-22T15:14:05"), "in-response-to": 826, "sender-location":point("42.94,67.54"), "tags":{{"t-mobile", "voice-command" }}, "message":" like t-mobile the voice-command is good:)"}
-{"message-id": 1107, "author-id": 610, "timestamp":datetime("2013-04-14T13:59:27"), "in-response-to": 125, "sender-location":point("32.5,67.07"), "tags":{{"t-mobile", "network" }}, "message":" like t-mobile the network is good:)"}
-{"message-id": 1108, "author-id": 611, "timestamp":datetime("2006-11-22T23:05:58"), "in-response-to": 3133, "sender-location":point("24.34,88.36"), "tags":{{"samsung", "network" }}, "message":" love samsung the network is good:)"}
-{"message-id": 1109, "author-id": 612, "timestamp":datetime("2005-06-18T11:36:01"), "in-response-to": 1638, "sender-location":point("36.16,68.12"), "tags":{{"at&t", "reachability" }}, "message":" love at&t its reachability is amazing"}
-{"message-id": 1110, "author-id": 613, "timestamp":datetime("2008-07-02T05:56:30"), "in-response-to": 1474, "sender-location":point("36.31,83.6"), "tags":{{"t-mobile", "signal" }}, "message":" can't stand t-mobile the signal is horrible"}
-{"message-id": 1111, "author-id": 614, "timestamp":datetime("2005-03-25T01:45:01"), "in-response-to": 3063, "sender-location":point("30.16,67.6"), "tags":{{"samsung", "3G" }}, "message":" like samsung its 3G is awesome"}
-{"message-id": 1112, "author-id": 615, "timestamp":datetime("2005-10-18T08:04:41"), "in-response-to": 2986, "sender-location":point("44.6,73.23"), "tags":{{"samsung", "plan" }}, "message":" dislike samsung the plan is bad:("}
-{"message-id": 1113, "author-id": 616, "timestamp":datetime("2006-03-04T21:18:26"), "in-response-to": 1080, "sender-location":point("26.82,73.43"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola its voicemail-service is mind-blowing"}
-{"message-id": 1114, "author-id": 617, "timestamp":datetime("2013-01-04T20:26:53"), "in-response-to": 95, "sender-location":point("47.78,66.86"), "tags":{{"samsung", "signal" }}, "message":" like samsung its signal is amazing:)"}
-{"message-id": 1115, "author-id": 618, "timestamp":datetime("2005-07-15T23:54:13"), "in-response-to": 2780, "sender-location":point("46.73,68.12"), "tags":{{"iphone", "wireless" }}, "message":" hate iphone its wireless is horrible:("}
-{"message-id": 1116, "author-id": 619, "timestamp":datetime("2005-05-15T14:31:03"), "in-response-to": 2037, "sender-location":point("38.12,75.54"), "tags":{{"sprint", "plan" }}, "message":" love sprint the plan is good:)"}
-{"message-id": 1117, "author-id": 620, "timestamp":datetime("2005-06-23T09:47:10"), "in-response-to": 1808, "sender-location":point("30.24,67.13"), "tags":{{"verizon", "customer-service" }}, "message":" like verizon the customer-service is good"}
-{"message-id": 1118, "author-id": 621, "timestamp":datetime("2005-03-23T20:13:02"), "in-response-to": 268, "sender-location":point("33.92,75.88"), "tags":{{"sprint", "customer-service" }}, "message":" like sprint the customer-service is mind-blowing"}
-{"message-id": 1119, "author-id": 622, "timestamp":datetime("2007-12-22T15:44:07"), "in-response-to": 781, "sender-location":point("25.36,69.42"), "tags":{{"iphone", "voice-clarity" }}, "message":" hate iphone its voice-clarity is terrible"}
-{"message-id": 1120, "author-id": 623, "timestamp":datetime("2008-09-23T08:31:16"), "in-response-to": 117, "sender-location":point("38.89,77.48"), "tags":{{"samsung", "shortcut-menu" }}, "message":" dislike samsung the shortcut-menu is bad:("}
-{"message-id": 1121, "author-id": 624, "timestamp":datetime("2014-02-10T15:04:25"), "in-response-to": 2833, "sender-location":point("30.41,68.59"), "tags":{{"t-mobile", "signal" }}, "message":" dislike t-mobile the signal is terrible"}
-{"message-id": 1122, "author-id": 625, "timestamp":datetime("2012-02-19T12:14:51"), "in-response-to": 1170, "sender-location":point("41.97,79.71"), "tags":{{"iphone", "speed" }}, "message":" hate iphone its speed is horrible:("}
-{"message-id": 1123, "author-id": 626, "timestamp":datetime("2010-05-02T00:06:45"), "in-response-to": 1768, "sender-location":point("28.86,78.25"), "tags":{{"verizon", "touch-screen" }}, "message":" like verizon its touch-screen is amazing:)"}
-{"message-id": 1124, "author-id": 627, "timestamp":datetime("2011-09-15T22:03:12"), "in-response-to": 1407, "sender-location":point("32.29,87.83"), "tags":{{"verizon", "shortcut-menu" }}, "message":" love verizon the shortcut-menu is mind-blowing:)"}
-{"message-id": 1125, "author-id": 628, "timestamp":datetime("2008-11-26T21:29:11"), "in-response-to": 1902, "sender-location":point("36.71,91.33"), "tags":{{"samsung", "touch-screen" }}, "message":" love samsung the touch-screen is good"}
-{"message-id": 1126, "author-id": 629, "timestamp":datetime("2014-04-06T05:23:33"), "in-response-to": 392, "sender-location":point("43.22,95.11"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t its voicemail-service is amazing:)"}
-{"message-id": 1127, "author-id": 630, "timestamp":datetime("2012-06-14T02:16:27"), "in-response-to": 2917, "sender-location":point("46.74,85.62"), "tags":{{"verizon", "voice-command" }}, "message":" love verizon the voice-command is amazing"}
-{"message-id": 1128, "author-id": 631, "timestamp":datetime("2013-05-09T16:44:19"), "in-response-to": 1620, "sender-location":point("31.92,82.53"), "tags":{{"samsung", "voicemail-service" }}, "message":" like samsung its voicemail-service is amazing"}
-{"message-id": 1129, "author-id": 632, "timestamp":datetime("2009-03-19T12:37:23"), "in-response-to": 2936, "sender-location":point("42.65,68.54"), "tags":{{"samsung", "voice-clarity" }}, "message":" hate samsung its voice-clarity is horrible"}
-{"message-id": 1130, "author-id": 633, "timestamp":datetime("2011-11-26T12:25:14"), "in-response-to": 463, "sender-location":point("40.1,72.61"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is awesome:)"}
-{"message-id": 1131, "author-id": 634, "timestamp":datetime("2013-06-15T04:03:25"), "in-response-to": 2979, "sender-location":point("26.56,85.25"), "tags":{{"sprint", "signal" }}, "message":" can't stand sprint its signal is horrible:("}
-{"message-id": 1132, "author-id": 635, "timestamp":datetime("2008-12-22T13:06:58"), "in-response-to": 1919, "sender-location":point("43.63,93.89"), "tags":{{"samsung", "touch-screen" }}, "message":" dislike samsung its touch-screen is OMG"}
-{"message-id": 1133, "author-id": 636, "timestamp":datetime("2012-01-24T03:59:01"), "in-response-to": 610, "sender-location":point("37.89,71.67"), "tags":{{"sprint", "touch-screen" }}, "message":" like sprint the touch-screen is awesome"}
-{"message-id": 1134, "author-id": 637, "timestamp":datetime("2007-06-08T03:22:03"), "in-response-to": 432, "sender-location":point("25.25,86.25"), "tags":{{"sprint", "network" }}, "message":" like sprint its network is good"}
-{"message-id": 1135, "author-id": 638, "timestamp":datetime("2005-12-06T22:40:19"), "in-response-to": 2401, "sender-location":point("42.17,83.96"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" dislike t-mobile its shortcut-menu is terrible"}
-{"message-id": 1136, "author-id": 639, "timestamp":datetime("2011-05-03T21:08:20"), "in-response-to": 95, "sender-location":point("27.53,82.18"), "tags":{{"t-mobile", "network" }}, "message":" love t-mobile its network is good:)"}
-{"message-id": 1137, "author-id": 640, "timestamp":datetime("2005-03-15T10:11:11"), "in-response-to": 1802, "sender-location":point("41.53,66.55"), "tags":{{"iphone", "signal" }}, "message":" dislike iphone the signal is horrible:("}
-{"message-id": 1138, "author-id": 641, "timestamp":datetime("2006-02-01T15:03:51"), "in-response-to": 1226, "sender-location":point("25.55,86.29"), "tags":{{"sprint", "network" }}, "message":" like sprint its network is good"}
-{"message-id": 1139, "author-id": 642, "timestamp":datetime("2011-09-21T23:57:39"), "in-response-to": 136, "sender-location":point("29.75,76.41"), "tags":{{"motorola", "voice-command" }}, "message":" like motorola the voice-command is mind-blowing:)"}
-{"message-id": 1140, "author-id": 643, "timestamp":datetime("2007-08-07T07:19:41"), "in-response-to": 1983, "sender-location":point("34.08,79.42"), "tags":{{"verizon", "speed" }}, "message":" can't stand verizon the speed is horrible"}
-{"message-id": 1141, "author-id": 644, "timestamp":datetime("2009-06-08T15:32:42"), "in-response-to": 33, "sender-location":point("29.69,75.41"), "tags":{{"iphone", "signal" }}, "message":" can't stand iphone the signal is horrible"}
-{"message-id": 1142, "author-id": 645, "timestamp":datetime("2006-10-19T02:55:38"), "in-response-to": 547, "sender-location":point("40.92,86.58"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone its voice-clarity is mind-blowing"}
-{"message-id": 1143, "author-id": 646, "timestamp":datetime("2010-11-05T15:07:45"), "in-response-to": 735, "sender-location":point("27.9,95.19"), "tags":{{"iphone", "wireless" }}, "message":" can't stand iphone its wireless is horrible:("}
-{"message-id": 1144, "author-id": 647, "timestamp":datetime("2005-01-03T18:53:59"), "in-response-to": 493, "sender-location":point("46.24,91.87"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" hate t-mobile the shortcut-menu is OMG"}
-{"message-id": 1145, "author-id": 648, "timestamp":datetime("2013-07-21T19:31:57"), "in-response-to": 3242, "sender-location":point("25.42,67.71"), "tags":{{"iphone", "customization" }}, "message":" like iphone its customization is mind-blowing:)"}
-{"message-id": 1146, "author-id": 649, "timestamp":datetime("2014-08-14T02:53:38"), "in-response-to": 1382, "sender-location":point("34.35,87.17"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t the voicemail-service is amazing"}
-{"message-id": 1147, "author-id": 650, "timestamp":datetime("2012-11-08T21:07:42"), "in-response-to": 825, "sender-location":point("43.68,94.49"), "tags":{{"iphone", "voice-command" }}, "message":" can't stand iphone the voice-command is terrible:("}
-{"message-id": 1148, "author-id": 651, "timestamp":datetime("2013-11-24T15:50:37"), "in-response-to": 208, "sender-location":point("34.82,92.53"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" like t-mobile its voice-clarity is amazing"}
-{"message-id": 1149, "author-id": 652, "timestamp":datetime("2006-07-27T21:50:35"), "in-response-to": 2778, "sender-location":point("40.27,80.88"), "tags":{{"at&t", "signal" }}, "message":" love at&t its signal is good"}
-{"message-id": 1150, "author-id": 653, "timestamp":datetime("2010-02-21T07:20:40"), "in-response-to": 1366, "sender-location":point("46.85,77.71"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" love t-mobile the voice-clarity is mind-blowing"}
-{"message-id": 1151, "author-id": 654, "timestamp":datetime("2009-11-04T09:04:39"), "in-response-to": 183, "sender-location":point("28.47,97.28"), "tags":{{"motorola", "reachability" }}, "message":" hate motorola the reachability is horrible:("}
-{"message-id": 1152, "author-id": 655, "timestamp":datetime("2012-09-28T12:38:13"), "in-response-to": 2070, "sender-location":point("37.93,81.01"), "tags":{{"sprint", "plan" }}, "message":" can't stand sprint the plan is OMG:("}
-{"message-id": 1153, "author-id": 656, "timestamp":datetime("2009-06-01T21:49:29"), "in-response-to": 1115, "sender-location":point("25.63,88.78"), "tags":{{"iphone", "customization" }}, "message":" can't stand iphone its customization is bad"}
-{"message-id": 1154, "author-id": 657, "timestamp":datetime("2005-02-07T16:30:54"), "in-response-to": 565, "sender-location":point("46.65,68.07"), "tags":{{"verizon", "signal" }}, "message":" like verizon its signal is awesome:)"}
-{"message-id": 1155, "author-id": 658, "timestamp":datetime("2007-03-09T10:42:22"), "in-response-to": 2613, "sender-location":point("33.7,66.92"), "tags":{{"at&t", "voice-clarity" }}, "message":" hate at&t the voice-clarity is horrible:("}
-{"message-id": 1156, "author-id": 659, "timestamp":datetime("2010-12-08T17:40:41"), "in-response-to": 662, "sender-location":point("40.15,94.02"), "tags":{{"at&t", "voice-command" }}, "message":" love at&t the voice-command is awesome"}
-{"message-id": 1157, "author-id": 660, "timestamp":datetime("2010-03-24T17:15:25"), "in-response-to": 605, "sender-location":point("31.76,77.79"), "tags":{{"samsung", "customer-service" }}, "message":" can't stand samsung the customer-service is OMG"}
-{"message-id": 1158, "author-id": 661, "timestamp":datetime("2011-08-04T13:07:49"), "in-response-to": 1052, "sender-location":point("28.22,66.95"), "tags":{{"motorola", "wireless" }}, "message":" like motorola the wireless is amazing:)"}
-{"message-id": 1159, "author-id": 662, "timestamp":datetime("2005-11-10T07:44:12"), "in-response-to": 944, "sender-location":point("33.24,71.15"), "tags":{{"t-mobile", "touch-screen" }}, "message":" like t-mobile its touch-screen is mind-blowing:)"}
-{"message-id": 1160, "author-id": 663, "timestamp":datetime("2009-06-26T22:59:14"), "in-response-to": 2376, "sender-location":point("36.75,78.46"), "tags":{{"iphone", "voice-command" }}, "message":" dislike iphone the voice-command is horrible:("}
-{"message-id": 1161, "author-id": 664, "timestamp":datetime("2012-01-12T18:25:03"), "in-response-to": 657, "sender-location":point("39.44,70.39"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon the voice-command is amazing"}
-{"message-id": 1162, "author-id": 665, "timestamp":datetime("2013-11-14T06:22:44"), "in-response-to": 161, "sender-location":point("37.62,92.89"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" can't stand t-mobile its voicemail-service is bad:("}
-{"message-id": 1163, "author-id": 666, "timestamp":datetime("2006-03-04T17:14:27"), "in-response-to": 2947, "sender-location":point("42.86,80.03"), "tags":{{"at&t", "voicemail-service" }}, "message":" love at&t the voicemail-service is awesome:)"}
-{"message-id": 1164, "author-id": 667, "timestamp":datetime("2012-03-15T02:20:34"), "in-response-to": 1823, "sender-location":point("29.96,71.29"), "tags":{{"samsung", "speed" }}, "message":" like samsung its speed is awesome"}
-{"message-id": 1165, "author-id": 668, "timestamp":datetime("2011-04-25T23:40:47"), "in-response-to": 1015, "sender-location":point("30.63,78.71"), "tags":{{"at&t", "customization" }}, "message":" like at&t its customization is awesome:)"}
-{"message-id": 1166, "author-id": 669, "timestamp":datetime("2006-11-02T01:32:47"), "in-response-to": 1360, "sender-location":point("43.72,84.45"), "tags":{{"t-mobile", "wireless" }}, "message":" can't stand t-mobile the wireless is bad:("}
-{"message-id": 1167, "author-id": 670, "timestamp":datetime("2011-12-20T07:11:45"), "in-response-to": 368, "sender-location":point("33.35,93.8"), "tags":{{"iphone", "customer-service" }}, "message":" can't stand iphone the customer-service is horrible"}
-{"message-id": 1168, "author-id": 671, "timestamp":datetime("2005-02-01T20:32:30"), "in-response-to": 1634, "sender-location":point("35.48,68.04"), "tags":{{"samsung", "signal" }}, "message":" love samsung the signal is amazing:)"}
-{"message-id": 1169, "author-id": 672, "timestamp":datetime("2007-04-22T15:38:16"), "in-response-to": 2343, "sender-location":point("28.74,96.47"), "tags":{{"iphone", "wireless" }}, "message":" can't stand iphone the wireless is horrible"}
-{"message-id": 1170, "author-id": 673, "timestamp":datetime("2007-07-01T07:30:00"), "in-response-to": 2154, "sender-location":point("47.07,74.09"), "tags":{{"samsung", "customization" }}, "message":" dislike samsung its customization is horrible:("}
-{"message-id": 1171, "author-id": 674, "timestamp":datetime("2012-04-28T16:19:25"), "in-response-to": 1661, "sender-location":point("44.87,87.22"), "tags":{{"iphone", "wireless" }}, "message":" hate iphone its wireless is bad"}
-{"message-id": 1172, "author-id": 675, "timestamp":datetime("2014-02-17T05:58:11"), "in-response-to": 2310, "sender-location":point("42.93,92.42"), "tags":{{"motorola", "voice-command" }}, "message":" dislike motorola its voice-command is bad:("}
-{"message-id": 1173, "author-id": 676, "timestamp":datetime("2012-03-14T02:49:33"), "in-response-to": 899, "sender-location":point("26.08,75.08"), "tags":{{"at&t", "reachability" }}, "message":" hate at&t the reachability is horrible:("}
-{"message-id": 1174, "author-id": 677, "timestamp":datetime("2013-03-17T14:41:16"), "in-response-to": 2926, "sender-location":point("24.52,85.67"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t its voice-clarity is awesome"}
-{"message-id": 1175, "author-id": 678, "timestamp":datetime("2009-06-10T11:56:40"), "in-response-to": 2705, "sender-location":point("47.83,97.9"), "tags":{{"iphone", "shortcut-menu" }}, "message":" like iphone its shortcut-menu is mind-blowing:)"}
-{"message-id": 1176, "author-id": 679, "timestamp":datetime("2012-11-25T11:10:32"), "in-response-to": 1877, "sender-location":point("46.91,75.74"), "tags":{{"sprint", "customization" }}, "message":" hate sprint the customization is OMG:("}
-{"message-id": 1177, "author-id": 680, "timestamp":datetime("2006-02-06T08:37:26"), "in-response-to": 690, "sender-location":point("39.92,72.93"), "tags":{{"sprint", "shortcut-menu" }}, "message":" love sprint the shortcut-menu is mind-blowing:)"}
-{"message-id": 1178, "author-id": 681, "timestamp":datetime("2012-06-08T15:12:13"), "in-response-to": 1433, "sender-location":point("27.02,74.74"), "tags":{{"motorola", "speed" }}, "message":" like motorola the speed is mind-blowing"}
-{"message-id": 1179, "author-id": 682, "timestamp":datetime("2010-09-14T09:16:25"), "in-response-to": 2738, "sender-location":point("43.25,92.44"), "tags":{{"sprint", "shortcut-menu" }}, "message":" can't stand sprint its shortcut-menu is bad"}
-{"message-id": 1180, "author-id": 683, "timestamp":datetime("2008-07-14T14:14:49"), "in-response-to": 1332, "sender-location":point("46.98,97.5"), "tags":{{"verizon", "reachability" }}, "message":" hate verizon its reachability is terrible:("}
-{"message-id": 1181, "author-id": 684, "timestamp":datetime("2012-08-20T00:01:55"), "in-response-to": 2070, "sender-location":point("42.16,83.89"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is amazing"}
-{"message-id": 1182, "author-id": 685, "timestamp":datetime("2006-08-07T17:56:32"), "in-response-to": 1880, "sender-location":point("25.08,85.41"), "tags":{{"motorola", "voice-command" }}, "message":" dislike motorola the voice-command is bad"}
-{"message-id": 1183, "author-id": 686, "timestamp":datetime("2006-12-14T01:13:47"), "in-response-to": 2767, "sender-location":point("24.81,76.77"), "tags":{{"verizon", "customer-service" }}, "message":" hate verizon its customer-service is terrible"}
-{"message-id": 1184, "author-id": 687, "timestamp":datetime("2007-04-06T06:44:57"), "in-response-to": 2926, "sender-location":point("43.51,93.32"), "tags":{{"motorola", "voicemail-service" }}, "message":" like motorola its voicemail-service is amazing:)"}
-{"message-id": 1185, "author-id": 688, "timestamp":datetime("2014-02-21T01:06:35"), "in-response-to": 2249, "sender-location":point("30.63,71.95"), "tags":{{"sprint", "shortcut-menu" }}, "message":" like sprint its shortcut-menu is awesome:)"}
-{"message-id": 1186, "author-id": 689, "timestamp":datetime("2010-08-11T03:26:48"), "in-response-to": 2888, "sender-location":point("28.76,84.21"), "tags":{{"samsung", "reachability" }}, "message":" dislike samsung its reachability is bad:("}
-{"message-id": 1187, "author-id": 690, "timestamp":datetime("2010-12-17T18:03:33"), "in-response-to": 1748, "sender-location":point("47.25,73.86"), "tags":{{"sprint", "voicemail-service" }}, "message":" hate sprint its voicemail-service is OMG"}
-{"message-id": 1188, "author-id": 691, "timestamp":datetime("2007-05-18T02:29:04"), "in-response-to": 1015, "sender-location":point("37.87,92.24"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile the wireless is awesome"}
-{"message-id": 1189, "author-id": 692, "timestamp":datetime("2005-10-02T19:06:09"), "in-response-to": 2512, "sender-location":point("39.35,80.12"), "tags":{{"at&t", "touch-screen" }}, "message":" dislike at&t its touch-screen is bad"}
-{"message-id": 1190, "author-id": 693, "timestamp":datetime("2014-01-11T20:28:29"), "in-response-to": 3181, "sender-location":point("37.73,82.85"), "tags":{{"verizon", "touch-screen" }}, "message":" like verizon the touch-screen is good"}
-{"message-id": 1191, "author-id": 694, "timestamp":datetime("2010-03-19T03:48:00"), "in-response-to": 223, "sender-location":point("40.39,89.87"), "tags":{{"verizon", "voice-command" }}, "message":" can't stand verizon the voice-command is OMG"}
-{"message-id": 1192, "author-id": 695, "timestamp":datetime("2014-08-08T10:11:45"), "in-response-to": 139, "sender-location":point("45.45,91.3"), "tags":{{"iphone", "shortcut-menu" }}, "message":" like iphone the shortcut-menu is awesome:)"}
-{"message-id": 1193, "author-id": 696, "timestamp":datetime("2013-01-22T06:33:22"), "in-response-to": 2044, "sender-location":point("29.94,69.27"), "tags":{{"samsung", "shortcut-menu" }}, "message":" hate samsung the shortcut-menu is terrible"}
-{"message-id": 1194, "author-id": 697, "timestamp":datetime("2007-06-06T14:24:49"), "in-response-to": 385, "sender-location":point("45.57,89.6"), "tags":{{"samsung", "voicemail-service" }}, "message":" love samsung its voicemail-service is amazing:)"}
-{"message-id": 1195, "author-id": 698, "timestamp":datetime("2014-03-18T05:34:03"), "in-response-to": 292, "sender-location":point("40.22,83.0"), "tags":{{"sprint", "voice-clarity" }}, "message":" like sprint its voice-clarity is mind-blowing"}
-{"message-id": 1196, "author-id": 699, "timestamp":datetime("2007-04-25T13:14:31"), "in-response-to": 1427, "sender-location":point("37.92,77.15"), "tags":{{"at&t", "signal" }}, "message":" love at&t the signal is mind-blowing"}
-{"message-id": 1197, "author-id": 700, "timestamp":datetime("2011-06-09T01:58:56"), "in-response-to": 582, "sender-location":point("44.91,97.94"), "tags":{{"sprint", "customer-service" }}, "message":" dislike sprint its customer-service is OMG:("}
-{"message-id": 1198, "author-id": 701, "timestamp":datetime("2010-10-24T14:50:05"), "in-response-to": 1860, "sender-location":point("36.07,75.8"), "tags":{{"motorola", "plan" }}, "message":" love motorola the plan is good:)"}
-{"message-id": 1199, "author-id": 702, "timestamp":datetime("2005-11-11T06:30:09"), "in-response-to": 1441, "sender-location":point("34.37,93.58"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile the wireless is amazing:)"}
-{"message-id": 1200, "author-id": 703, "timestamp":datetime("2005-10-27T18:41:35"), "in-response-to": 2861, "sender-location":point("28.86,91.65"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" love t-mobile the voicemail-service is mind-blowing:)"}
-{"message-id": 1201, "author-id": 704, "timestamp":datetime("2005-10-26T11:09:31"), "in-response-to": 313, "sender-location":point("30.09,91.93"), "tags":{{"motorola", "customization" }}, "message":" dislike motorola the customization is horrible"}
-{"message-id": 1202, "author-id": 705, "timestamp":datetime("2009-02-22T12:48:43"), "in-response-to": 87, "sender-location":point("32.13,77.25"), "tags":{{"motorola", "voice-clarity" }}, "message":" can't stand motorola the voice-clarity is bad:("}
-{"message-id": 1203, "author-id": 706, "timestamp":datetime("2007-10-20T23:58:58"), "in-response-to": 932, "sender-location":point("37.65,75.06"), "tags":{{"motorola", "touch-screen" }}, "message":" love motorola its touch-screen is mind-blowing:)"}
-{"message-id": 1204, "author-id": 707, "timestamp":datetime("2010-10-23T17:49:39"), "in-response-to": 1647, "sender-location":point("32.13,81.65"), "tags":{{"motorola", "3G" }}, "message":" love motorola the 3G is amazing"}
-{"message-id": 1205, "author-id": 708, "timestamp":datetime("2013-11-17T04:22:55"), "in-response-to": 1139, "sender-location":point("38.14,97.94"), "tags":{{"at&t", "wireless" }}, "message":" love at&t its wireless is amazing"}
-{"message-id": 1206, "author-id": 709, "timestamp":datetime("2012-11-16T00:09:36"), "in-response-to": 1850, "sender-location":point("27.37,96.19"), "tags":{{"t-mobile", "network" }}, "message":" love t-mobile the network is good"}
-{"message-id": 1207, "author-id": 710, "timestamp":datetime("2011-03-14T22:19:53"), "in-response-to": 1257, "sender-location":point("46.22,67.06"), "tags":{{"verizon", "shortcut-menu" }}, "message":" can't stand verizon its shortcut-menu is bad:("}
-{"message-id": 1208, "author-id": 711, "timestamp":datetime("2008-04-11T02:32:00"), "in-response-to": 845, "sender-location":point("48.44,72.95"), "tags":{{"verizon", "network" }}, "message":" hate verizon its network is OMG"}
-{"message-id": 1209, "author-id": 712, "timestamp":datetime("2007-07-04T12:20:26"), "in-response-to": 652, "sender-location":point("29.21,69.58"), "tags":{{"verizon", "network" }}, "message":" dislike verizon its network is horrible:("}
-{"message-id": 1210, "author-id": 713, "timestamp":datetime("2007-10-25T18:00:11"), "in-response-to": 2978, "sender-location":point("43.43,69.34"), "tags":{{"motorola", "reachability" }}, "message":" like motorola its reachability is good:)"}
-{"message-id": 1211, "author-id": 714, "timestamp":datetime("2006-09-24T20:26:26"), "in-response-to": 1328, "sender-location":point("36.45,68.59"), "tags":{{"motorola", "wireless" }}, "message":" like motorola the wireless is amazing:)"}
-{"message-id": 1212, "author-id": 715, "timestamp":datetime("2005-02-08T20:23:44"), "in-response-to": 409, "sender-location":point("46.77,97.05"), "tags":{{"at&t", "voicemail-service" }}, "message":" dislike at&t the voicemail-service is terrible:("}
-{"message-id": 1213, "author-id": 716, "timestamp":datetime("2010-10-25T01:09:45"), "in-response-to": 1230, "sender-location":point("44.44,76.66"), "tags":{{"motorola", "plan" }}, "message":" can't stand motorola its plan is bad"}
-{"message-id": 1214, "author-id": 717, "timestamp":datetime("2010-04-02T01:57:48"), "in-response-to": 1263, "sender-location":point("31.65,85.29"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon its voicemail-service is good"}
-{"message-id": 1215, "author-id": 718, "timestamp":datetime("2005-08-14T23:42:13"), "in-response-to": 394, "sender-location":point("26.74,89.49"), "tags":{{"sprint", "voicemail-service" }}, "message":" dislike sprint its voicemail-service is horrible"}
-{"message-id": 1216, "author-id": 719, "timestamp":datetime("2014-04-24T23:23:08"), "in-response-to": 1824, "sender-location":point("42.0,69.34"), "tags":{{"verizon", "voice-command" }}, "message":" can't stand verizon its voice-command is bad"}
-{"message-id": 1217, "author-id": 720, "timestamp":datetime("2008-12-17T04:28:31"), "in-response-to": 711, "sender-location":point("36.97,80.66"), "tags":{{"motorola", "platform" }}, "message":" hate motorola the platform is horrible:("}
-{"message-id": 1218, "author-id": 721, "timestamp":datetime("2012-09-08T03:39:53"), "in-response-to": 1772, "sender-location":point("34.01,94.33"), "tags":{{"samsung", "voice-command" }}, "message":" dislike samsung the voice-command is bad:("}
-{"message-id": 1219, "author-id": 722, "timestamp":datetime("2007-03-09T16:16:16"), "in-response-to": 355, "sender-location":point("43.71,76.95"), "tags":{{"iphone", "plan" }}, "message":" dislike iphone the plan is horrible"}
-{"message-id": 1220, "author-id": 723, "timestamp":datetime("2007-04-04T02:47:34"), "in-response-to": 2446, "sender-location":point("43.9,93.16"), "tags":{{"at&t", "reachability" }}, "message":" hate at&t its reachability is terrible"}
-{"message-id": 1221, "author-id": 724, "timestamp":datetime("2010-03-14T12:13:12"), "in-response-to": 704, "sender-location":point("36.28,89.54"), "tags":{{"iphone", "speed" }}, "message":" can't stand iphone the speed is terrible"}
-{"message-id": 1222, "author-id": 725, "timestamp":datetime("2005-03-09T02:18:38"), "in-response-to": 2652, "sender-location":point("29.06,94.34"), "tags":{{"iphone", "shortcut-menu" }}, "message":" dislike iphone its shortcut-menu is bad:("}
-{"message-id": 1223, "author-id": 726, "timestamp":datetime("2012-10-24T13:00:39"), "in-response-to": 770, "sender-location":point("40.98,88.65"), "tags":{{"sprint", "voice-clarity" }}, "message":" can't stand sprint the voice-clarity is OMG"}
-{"message-id": 1224, "author-id": 727, "timestamp":datetime("2014-07-10T04:43:58"), "in-response-to": 2443, "sender-location":point("24.1,97.33"), "tags":{{"at&t", "customer-service" }}, "message":" love at&t its customer-service is mind-blowing"}
-{"message-id": 1225, "author-id": 728, "timestamp":datetime("2005-12-28T17:54:51"), "in-response-to": 875, "sender-location":point("44.74,72.17"), "tags":{{"sprint", "customer-service" }}, "message":" dislike sprint its customer-service is horrible:("}
-{"message-id": 1226, "author-id": 729, "timestamp":datetime("2008-03-15T04:26:16"), "in-response-to": 1474, "sender-location":point("44.18,89.33"), "tags":{{"verizon", "plan" }}, "message":" love verizon its plan is mind-blowing"}
-{"message-id": 1227, "author-id": 730, "timestamp":datetime("2013-12-20T15:30:14"), "in-response-to": 528, "sender-location":point("36.49,76.19"), "tags":{{"motorola", "voicemail-service" }}, "message":" can't stand motorola the voicemail-service is horrible"}
-{"message-id": 1228, "author-id": 731, "timestamp":datetime("2012-04-03T14:13:16"), "in-response-to": 374, "sender-location":point("47.26,84.72"), "tags":{{"samsung", "plan" }}, "message":" love samsung its plan is good:)"}
-{"message-id": 1229, "author-id": 732, "timestamp":datetime("2006-06-19T01:40:35"), "in-response-to": 2457, "sender-location":point("28.98,93.08"), "tags":{{"iphone", "3G" }}, "message":" love iphone the 3G is mind-blowing:)"}
-{"message-id": 1230, "author-id": 733, "timestamp":datetime("2013-08-15T17:20:41"), "in-response-to": 3159, "sender-location":point("42.43,83.82"), "tags":{{"verizon", "reachability" }}, "message":" dislike verizon its reachability is OMG"}
-{"message-id": 1231, "author-id": 734, "timestamp":datetime("2005-12-26T20:17:48"), "in-response-to": 1153, "sender-location":point("24.09,69.58"), "tags":{{"motorola", "plan" }}, "message":" love motorola its plan is awesome:)"}
-{"message-id": 1232, "author-id": 735, "timestamp":datetime("2014-03-05T22:43:11"), "in-response-to": 2504, "sender-location":point("32.26,83.84"), "tags":{{"motorola", "shortcut-menu" }}, "message":" can't stand motorola its shortcut-menu is terrible:("}
-{"message-id": 1233, "author-id": 736, "timestamp":datetime("2012-08-26T13:41:49"), "in-response-to": 1855, "sender-location":point("43.19,92.94"), "tags":{{"at&t", "touch-screen" }}, "message":" love at&t its touch-screen is amazing:)"}
-{"message-id": 1234, "author-id": 737, "timestamp":datetime("2013-04-19T16:11:05"), "in-response-to": 45, "sender-location":point("32.33,66.82"), "tags":{{"verizon", "shortcut-menu" }}, "message":" like verizon its shortcut-menu is mind-blowing:)"}
-{"message-id": 1235, "author-id": 738, "timestamp":datetime("2005-11-08T13:53:22"), "in-response-to": 1997, "sender-location":point("38.7,73.99"), "tags":{{"iphone", "voice-command" }}, "message":" hate iphone its voice-command is OMG:("}
-{"message-id": 1236, "author-id": 739, "timestamp":datetime("2010-03-21T04:17:46"), "in-response-to": 2116, "sender-location":point("32.31,78.91"), "tags":{{"verizon", "voice-clarity" }}, "message":" dislike verizon its voice-clarity is bad:("}
-{"message-id": 1237, "author-id": 740, "timestamp":datetime("2006-02-28T04:27:15"), "in-response-to": 1288, "sender-location":point("31.87,87.1"), "tags":{{"iphone", "voice-clarity" }}, "message":" like iphone its voice-clarity is awesome"}
-{"message-id": 1238, "author-id": 741, "timestamp":datetime("2011-09-23T09:36:43"), "in-response-to": 1787, "sender-location":point("33.3,73.61"), "tags":{{"samsung", "shortcut-menu" }}, "message":" can't stand samsung the shortcut-menu is OMG:("}
-{"message-id": 1239, "author-id": 742, "timestamp":datetime("2013-07-04T00:49:37"), "in-response-to": 292, "sender-location":point("39.03,79.18"), "tags":{{"at&t", "voicemail-service" }}, "message":" hate at&t the voicemail-service is bad"}
-{"message-id": 1240, "author-id": 743, "timestamp":datetime("2007-06-13T16:27:30"), "in-response-to": 2342, "sender-location":point("45.36,66.79"), "tags":{{"verizon", "voicemail-service" }}, "message":" dislike verizon the voicemail-service is terrible:("}
-{"message-id": 1241, "author-id": 744, "timestamp":datetime("2007-07-15T14:19:53"), "in-response-to": 1384, "sender-location":point("26.48,72.34"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" like t-mobile the voicemail-service is mind-blowing:)"}
-{"message-id": 1242, "author-id": 745, "timestamp":datetime("2010-01-18T20:12:04"), "in-response-to": 3182, "sender-location":point("31.68,70.33"), "tags":{{"samsung", "signal" }}, "message":" like samsung its signal is awesome:)"}
-{"message-id": 1243, "author-id": 746, "timestamp":datetime("2005-09-14T13:05:30"), "in-response-to": 1046, "sender-location":point("40.51,69.67"), "tags":{{"iphone", "plan" }}, "message":" love iphone its plan is amazing"}
-{"message-id": 1244, "author-id": 747, "timestamp":datetime("2008-03-23T09:20:50"), "in-response-to": 849, "sender-location":point("40.43,94.23"), "tags":{{"iphone", "shortcut-menu" }}, "message":" like iphone the shortcut-menu is awesome"}
-{"message-id": 1245, "author-id": 748, "timestamp":datetime("2005-08-11T17:30:14"), "in-response-to": 2160, "sender-location":point("39.78,91.16"), "tags":{{"iphone", "wireless" }}, "message":" love iphone the wireless is awesome"}
-{"message-id": 1246, "author-id": 749, "timestamp":datetime("2011-11-01T07:25:29"), "in-response-to": 1074, "sender-location":point("26.81,79.35"), "tags":{{"samsung", "shortcut-menu" }}, "message":" like samsung the shortcut-menu is good"}
-{"message-id": 1247, "author-id": 750, "timestamp":datetime("2014-08-01T05:04:53"), "in-response-to": 1165, "sender-location":point("39.93,66.42"), "tags":{{"samsung", "speed" }}, "message":" like samsung its speed is mind-blowing:)"}
-{"message-id": 1248, "author-id": 751, "timestamp":datetime("2011-05-07T15:43:56"), "in-response-to": 1629, "sender-location":point("24.79,88.26"), "tags":{{"motorola", "voicemail-service" }}, "message":" can't stand motorola its voicemail-service is terrible"}
-{"message-id": 1249, "author-id": 752, "timestamp":datetime("2012-06-22T14:10:14"), "in-response-to": 3215, "sender-location":point("36.7,83.52"), "tags":{{"t-mobile", "voice-clarity" }}, "message":" love t-mobile its voice-clarity is amazing:)"}
-{"message-id": 1250, "author-id": 753, "timestamp":datetime("2006-08-09T11:29:16"), "in-response-to": 1055, "sender-location":point("32.69,90.92"), "tags":{{"iphone", "platform" }}, "message":" love iphone the platform is good:)"}
-{"message-id": 1251, "author-id": 754, "timestamp":datetime("2011-01-06T13:01:48"), "in-response-to": 1309, "sender-location":point("24.7,97.82"), "tags":{{"t-mobile", "network" }}, "message":" love t-mobile the network is awesome:)"}
-{"message-id": 1252, "author-id": 755, "timestamp":datetime("2012-10-15T08:33:50"), "in-response-to": 1450, "sender-location":point("41.91,85.82"), "tags":{{"samsung", "network" }}, "message":" love samsung the network is awesome:)"}
-{"message-id": 1253, "author-id": 756, "timestamp":datetime("2006-11-13T04:57:26"), "in-response-to": 2124, "sender-location":point("39.92,72.52"), "tags":{{"samsung", "shortcut-menu" }}, "message":" can't stand samsung its shortcut-menu is horrible:("}
-{"message-id": 1254, "author-id": 757, "timestamp":datetime("2013-03-05T22:24:35"), "in-response-to": 2442, "sender-location":point("34.38,94.57"), "tags":{{"samsung", "wireless" }}, "message":" dislike samsung its wireless is terrible"}
-{"message-id": 1255, "author-id": 758, "timestamp":datetime("2009-07-22T14:09:12"), "in-response-to": 1802, "sender-location":point("25.5,81.05"), "tags":{{"samsung", "customization" }}, "message":" like samsung the customization is awesome:)"}
-{"message-id": 1256, "author-id": 759, "timestamp":datetime("2012-11-25T06:20:25"), "in-response-to": 347, "sender-location":point("30.65,68.26"), "tags":{{"at&t", "wireless" }}, "message":" love at&t the wireless is mind-blowing:)"}
-{"message-id": 1257, "author-id": 760, "timestamp":datetime("2013-05-11T10:03:03"), "in-response-to": 2099, "sender-location":point("25.13,85.61"), "tags":{{"t-mobile", "3G" }}, "message":" hate t-mobile its 3G is terrible"}
-{"message-id": 1258, "author-id": 761, "timestamp":datetime("2007-11-09T17:08:14"), "in-response-to": 3108, "sender-location":point("40.13,85.25"), "tags":{{"motorola", "3G" }}, "message":" dislike motorola its 3G is OMG:("}
-{"message-id": 1259, "author-id": 762, "timestamp":datetime("2006-08-07T07:02:07"), "in-response-to": 2450, "sender-location":point("38.75,67.41"), "tags":{{"sprint", "3G" }}, "message":" can't stand sprint its 3G is OMG"}
-{"message-id": 1260, "author-id": 763, "timestamp":datetime("2009-03-02T06:56:54"), "in-response-to": 1925, "sender-location":point("35.03,87.43"), "tags":{{"t-mobile", "speed" }}, "message":" dislike t-mobile its speed is terrible"}
-{"message-id": 1261, "author-id": 764, "timestamp":datetime("2005-12-13T00:47:05"), "in-response-to": 2023, "sender-location":point("46.56,97.36"), "tags":{{"iphone", "shortcut-menu" }}, "message":" love iphone its shortcut-menu is amazing"}
-{"message-id": 1262, "author-id": 765, "timestamp":datetime("2014-06-15T19:52:48"), "in-response-to": 985, "sender-location":point("48.11,97.18"), "tags":{{"sprint", "shortcut-menu" }}, "message":" hate sprint the shortcut-menu is terrible"}
-{"message-id": 1263, "author-id": 766, "timestamp":datetime("2008-04-26T01:42:10"), "in-response-to": 521, "sender-location":point("31.71,94.13"), "tags":{{"sprint", "reachability" }}, "message":" like sprint its reachability is awesome"}
-{"message-id": 1264, "author-id": 767, "timestamp":datetime("2009-05-04T17:44:01"), "in-response-to": 2947, "sender-location":point("44.01,92.09"), "tags":{{"samsung", "voice-clarity" }}, "message":" hate samsung its voice-clarity is horrible"}
-{"message-id": 1265, "author-id": 768, "timestamp":datetime("2010-11-15T22:30:33"), "in-response-to": 1414, "sender-location":point("39.55,78.45"), "tags":{{"t-mobile", "customization" }}, "message":" dislike t-mobile the customization is OMG:("}
-{"message-id": 1266, "author-id": 769, "timestamp":datetime("2011-09-28T11:11:29"), "in-response-to": 975, "sender-location":point("35.32,77.78"), "tags":{{"t-mobile", "voicemail-service" }}, "message":" can't stand t-mobile its voicemail-service is OMG"}
-{"message-id": 1267, "author-id": 770, "timestamp":datetime("2011-02-05T17:48:51"), "in-response-to": 1688, "sender-location":point("26.73,85.0"), "tags":{{"verizon", "shortcut-menu" }}, "message":" dislike verizon the shortcut-menu is horrible"}
-{"message-id": 1268, "author-id": 771, "timestamp":datetime("2009-10-21T14:18:40"), "in-response-to": 2825, "sender-location":point("38.43,84.63"), "tags":{{"sprint", "voicemail-service" }}, "message":" can't stand sprint its voicemail-service is bad:("}
-{"message-id": 1269, "author-id": 772, "timestamp":datetime("2010-11-20T19:29:29"), "in-response-to": 4, "sender-location":point("39.14,69.36"), "tags":{{"t-mobile", "wireless" }}, "message":" like t-mobile the wireless is mind-blowing:)"}
-{"message-id": 1270, "author-id": 773, "timestamp":datetime("2009-06-10T01:49:53"), "in-response-to": 2361, "sender-location":point("29.89,81.58"), "tags":{{"verizon", "3G" }}, "message":" can't stand verizon the 3G is terrible"}
-{"message-id": 1271, "author-id": 774, "timestamp":datetime("2014-06-18T00:45:59"), "in-response-to": 54, "sender-location":point("25.67,94.99"), "tags":{{"motorola", "plan" }}, "message":" dislike motorola its plan is bad"}
-{"message-id": 1272, "author-id": 775, "timestamp":datetime("2014-01-21T13:22:47"), "in-response-to": 2450, "sender-location":point("35.7,91.29"), "tags":{{"iphone", "plan" }}, "message":" like iphone its plan is mind-blowing:)"}
-{"message-id": 1273, "author-id": 776, "timestamp":datetime("2010-10-14T14:30:37"), "in-response-to": 1339, "sender-location":point("33.02,67.32"), "tags":{{"verizon", "signal" }}, "message":" like verizon its signal is awesome"}
-{"message-id": 1274, "author-id": 777, "timestamp":datetime("2014-02-15T12:25:14"), "in-response-to": 47, "sender-location":point("31.78,81.73"), "tags":{{"verizon", "3G" }}, "message":" hate verizon the 3G is terrible:("}
-{"message-id": 1275, "author-id": 778, "timestamp":datetime("2008-02-13T13:59:09"), "in-response-to": 724, "sender-location":point("31.48,84.9"), "tags":{{"iphone", "reachability" }}, "message":" like iphone the reachability is mind-blowing:)"}
-{"message-id": 1276, "author-id": 779, "timestamp":datetime("2010-03-18T20:42:10"), "in-response-to": 2771, "sender-location":point("27.59,70.52"), "tags":{{"motorola", "customer-service" }}, "message":" can't stand motorola its customer-service is horrible"}
-{"message-id": 1277, "author-id": 780, "timestamp":datetime("2008-11-13T23:51:17"), "in-response-to": 968, "sender-location":point("38.63,91.26"), "tags":{{"motorola", "plan" }}, "message":" dislike motorola the plan is horrible"}
-{"message-id": 1278, "author-id": 781, "timestamp":datetime("2008-05-20T12:31:37"), "in-response-to": 1341, "sender-location":point("39.92,76.77"), "tags":{{"t-mobile", "speed" }}, "message":" hate t-mobile its speed is horrible"}
-{"message-id": 1279, "author-id": 782, "timestamp":datetime("2010-11-21T08:54:20"), "in-response-to": 2317, "sender-location":point("46.47,72.27"), "tags":{{"samsung", "touch-screen" }}, "message":" love samsung the touch-screen is good:)"}
-{"message-id": 1280, "author-id": 783, "timestamp":datetime("2014-05-10T21:15:20"), "in-response-to": 2557, "sender-location":point("37.77,86.13"), "tags":{{"t-mobile", "reachability" }}, "message":" dislike t-mobile the reachability is terrible"}
-{"message-id": 1281, "author-id": 784, "timestamp":datetime("2005-03-07T22:53:52"), "in-response-to": 424, "sender-location":point("35.18,85.09"), "tags":{{"sprint", "speed" }}, "message":" like sprint its speed is amazing:)"}
-{"message-id": 1282, "author-id": 785, "timestamp":datetime("2005-06-23T17:51:57"), "in-response-to": 3092, "sender-location":point("28.95,76.93"), "tags":{{"at&t", "shortcut-menu" }}, "message":" love at&t its shortcut-menu is amazing:)"}
-{"message-id": 1283, "author-id": 786, "timestamp":datetime("2014-05-27T00:55:03"), "in-response-to": 557, "sender-location":point("30.57,78.64"), "tags":{{"samsung", "touch-screen" }}, "message":" love samsung its touch-screen is awesome:)"}
-{"message-id": 1284, "author-id": 787, "timestamp":datetime("2005-06-26T21:44:40"), "in-response-to": 1957, "sender-location":point("38.55,77.15"), "tags":{{"verizon", "touch-screen" }}, "message":" dislike verizon its touch-screen is horrible"}
-{"message-id": 1285, "author-id": 788, "timestamp":datetime("2010-05-01T10:25:29"), "in-response-to": 3236, "sender-location":point("47.86,78.64"), "tags":{{"iphone", "customer-service" }}, "message":" dislike iphone its customer-service is bad:("}
-{"message-id": 1286, "author-id": 789, "timestamp":datetime("2011-09-08T01:10:49"), "in-response-to": 196, "sender-location":point("43.28,97.99"), "tags":{{"t-mobile", "plan" }}, "message":" hate t-mobile its plan is terrible:("}
-{"message-id": 1287, "author-id": 790, "timestamp":datetime("2010-10-24T05:19:11"), "in-response-to": 1308, "sender-location":point("35.98,80.16"), "tags":{{"iphone", "plan" }}, "message":" hate iphone the plan is terrible:("}
-{"message-id": 1288, "author-id": 791, "timestamp":datetime("2005-10-28T05:41:43"), "in-response-to": 890, "sender-location":point("26.43,81.29"), "tags":{{"sprint", "network" }}, "message":" dislike sprint the network is bad"}
-{"message-id": 1289, "author-id": 792, "timestamp":datetime("2008-01-18T18:57:49"), "in-response-to": 1902, "sender-location":point("46.3,88.48"), "tags":{{"samsung", "plan" }}, "message":" like samsung its plan is awesome"}
-{"message-id": 1290, "author-id": 793, "timestamp":datetime("2011-01-22T13:23:10"), "in-response-to": 436, "sender-location":point("37.07,81.23"), "tags":{{"sprint", "plan" }}, "message":" dislike sprint its plan is bad:("}
-{"message-id": 1291, "author-id": 794, "timestamp":datetime("2008-11-02T14:59:19"), "in-response-to": 2515, "sender-location":point("32.11,82.62"), "tags":{{"verizon", "voice-command" }}, "message":" like verizon the voice-command is mind-blowing"}
-{"message-id": 1292, "author-id": 795, "timestamp":datetime("2010-12-10T12:00:12"), "in-response-to": 1698, "sender-location":point("37.91,84.53"), "tags":{{"motorola", "touch-screen" }}, "message":" like motorola the touch-screen is awesome:)"}
-{"message-id": 1293, "author-id": 796, "timestamp":datetime("2006-01-23T06:50:26"), "in-response-to": 1543, "sender-location":point("27.56,71.26"), "tags":{{"samsung", "customization" }}, "message":" love samsung its customization is mind-blowing"}
-{"message-id": 1294, "author-id": 797, "timestamp":datetime("2013-02-22T03:27:49"), "in-response-to": 1611, "sender-location":point("31.0,84.36"), "tags":{{"motorola", "customization" }}, "message":" love motorola the customization is mind-blowing"}
-{"message-id": 1295, "author-id": 798, "timestamp":datetime("2005-02-26T11:38:18"), "in-response-to": 2511, "sender-location":point("25.56,74.83"), "tags":{{"samsung", "touch-screen" }}, "message":" dislike samsung the touch-screen is terrible:("}
-{"message-id": 1296, "author-id": 799, "timestamp":datetime("2005-09-20T10:51:01"), "in-response-to": 2569, "sender-location":point("26.1,80.97"), "tags":{{"iphone", "network" }}, "message":" dislike iphone its network is horrible"}
-{"message-id": 1297, "author-id": 800, "timestamp":datetime("2008-10-04T21:39:48"), "in-response-to": 2982, "sender-location":point("24.74,92.79"), "tags":{{"verizon", "voice-command" }}, "message":" hate verizon the voice-command is bad"}
-{"message-id": 1298, "author-id": 801, "timestamp":datetime("2006-08-26T20:23:28"), "in-response-to": 2837, "sender-location":point("24.54,68.09"), "tags":{{"at&t", "voice-clarity" }}, "message":" love at&t its voice-clarity is amazing"}
-{"message-id": 1299, "author-id": 802, "timestamp":datetime("2008-11-15T04:33:56"), "in-response-to": 1622, "sender-location":point("48.23,80.27"), "tags":{{"iphone", "signal" }}, "message":" can't stand iphone the signal is bad"}
-{"message-id": 1300, "author-id": 803, "timestamp":datetime("2010-03-16T06:51:40"), "in-response-to": 2901, "sender-location":point("25.78,86.33"), "tags":{{"at&t", "customization" }}, "message":" like at&t its customization is awesome"}
-{"message-id": 1301, "author-id": 804, "timestamp":datetime("2013-02-01T08:40:14"), "in-response-to": 861, "sender-location":point("37.48,84.01"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is awesome"}
-{"message-id": 1302, "author-id": 805, "timestamp":datetime("2012-01-27T07:25:13"), "in-response-to": 2134, "sender-location":point("32.66,90.57"), "tags":{{"motorola", "voice-command" }}, "message":" love motorola the voice-command is awesome"}
-{"message-id": 1303, "author-id": 806, "timestamp":datetime("2007-06-28T22:04:48"), "in-response-to": 3000, "sender-location":point("36.1,86.99"), "tags":{{"samsung", "speed" }}, "message":" like samsung its speed is mind-blowing"}
-{"message-id": 1304, "author-id": 807, "timestamp":datetime("2005-12-12T07:21:22"), "in-response-to": 1466, "sender-location":point("40.07,88.78"), "tags":{{"t-mobile", "customization" }}, "message":" love t-mobile its customization is good"}
-{"message-id": 1305, "author-id": 808, "timestamp":datetime("2013-06-25T05:06:25"), "in-response-to": 123, "sender-location":point("42.91,73.88"), "tags":{{"sprint", "plan" }}, "message":" dislike sprint the plan is bad:("}
-{"message-id": 1306, "author-id": 809, "timestamp":datetime("2012-01-02T03:47:08"), "in-response-to": 609, "sender-location":point("46.68,69.77"), "tags":{{"samsung", "customization" }}, "message":" hate samsung the customization is horrible"}
-{"message-id": 1307, "author-id": 810, "timestamp":datetime("2010-10-17T11:19:58"), "in-response-to": 1312, "sender-location":point("25.99,77.8"), "tags":{{"motorola", "customization" }}, "message":" can't stand motorola its customization is horrible:("}
-{"message-id": 1308, "author-id": 811, "timestamp":datetime("2008-01-21T22:16:20"), "in-response-to": 1531, "sender-location":point("42.34,69.55"), "tags":{{"at&t", "plan" }}, "message":" like at&t the plan is awesome"}
-{"message-id": 1309, "author-id": 812, "timestamp":datetime("2013-01-15T12:29:47"), "in-response-to": 1857, "sender-location":point("39.54,70.53"), "tags":{{"verizon", "voicemail-service" }}, "message":" like verizon the voicemail-service is mind-blowing"}
-{"message-id": 1310, "author-id": 813, "timestamp":datetime("2005-01-09T16:57:52"), "in-response-to": 120, "sender-location":point("47.41,73.56"), "tags":{{"motorola", "voice-clarity" }}, "message":" like motorola the voice-clarity is amazing"}
-{"message-id": 1311, "author-id": 814, "timestamp":datetime("2012-07-22T18:45:25"), "in-response-to": 1736, "sender-location":point("48.63,84.74"), "tags":{{"samsung", "3G" }}, "message":" dislike samsung its 3G is terrible"}
-{"message-id": 1312, "author-id": 815, "timestamp":datetime("2012-07-10T09:36:09"), "in-response-to": 2578, "sender-location":point("30.14,91.02"), "tags":{{"motorola", "voice-command" }}, "message":" hate motorola the voice-command is bad"}
-{"message-id": 1313, "author-id": 816, "timestamp":datetime("2014-08-24T20:20:32"), "in-response-to": 3185, "sender-location":point("42.12,92.64"), "tags":{{"sprint", "customer-service" }}, "message":" hate sprint the customer-service is bad"}
-{"message-id": 1314, "author-id": 817, "timestamp":datetime("2008-06-25T21:01:21"), "in-response-to": 1698, "sender-location":point("48.36,82.81"), "tags":{{"at&t", "network" }}, "message":" like at&t the network is mind-blowing"}
-{"message-id": 1315, "author-id": 818, "timestamp":datetime("2013-12-21T10:09:45"), "in-response-to": 1457, "sender-location":point("29.5,74.4"), "tags":{{"t-mobile", "signal" }}, "message":" like t-mobile the signal is amazing:)"}
-{"message-id": 1316, "author-id": 819, "timestamp":datetime("2008-05-06T16:43:05"), "in-response-to": 306, "sender-location":point("34.05,91.03"), "tags":{{"sprint", "plan" }}, "message":" dislike sprint the plan is bad:("}
-{"message-id": 1317, "author-id": 820, "timestamp":datetime("2011-02-10T22:29:44"), "in-response-to": 3169, "sender-location":point("31.67,73.38"), "tags":{{"sprint", "shortcut-menu" }}, "message":" hate sprint its shortcut-menu is terrible:("}
-{"message-id": 1318, "author-id": 821, "timestamp":datetime("2012-06-25T10:01:39"), "in-response-to": 1340, "sender-location":point("41.64,96.35"), "tags":{{"samsung", "customer-service" }}, "message":" dislike samsung the customer-service is horrible:("}
-{"message-id": 1319, "author-id": 822, "timestamp":datetime("2014-03-23T19:49:17"), "in-response-to": 2937, "sender-location":point("37.15,66.46"), "tags":{{"t-mobile", "wireless" }}, "message":" love t-mobile its wireless is awesome"}
-{"message-id": 1320, "author-id": 823, "timestamp":datetime("2006-11-28T03:31:24"), "in-response-to": 890, "sender-location":point("28.91,82.27"), "tags":{{"sprint", "customization" }}, "message":" can't stand sprint the customization is horrible:("}
-{"message-id": 1321, "author-id": 824, "timestamp":datetime("2009-11-14T00:19:37"), "in-response-to": 1013, "sender-location":point("40.57,92.42"), "tags":{{"at&t", "network" }}, "message":" dislike at&t the network is terrible"}
-{"message-id": 1322, "author-id": 825, "timestamp":datetime("2006-06-25T07:15:08"), "in-response-to": 678, "sender-location":point("38.48,85.87"), "tags":{{"samsung", "touch-screen" }}, "message":" can't stand samsung its touch-screen is horrible"}
-{"message-id": 1323, "author-id": 826, "timestamp":datetime("2008-08-22T12:37:41"), "in-response-to": 664, "sender-location":point("44.3,79.68"), "tags":{{"motorola", "customer-service" }}, "message":" love motorola its customer-service is mind-blowing"}
-{"message-id": 1324, "author-id": 827, "timestamp":datetime("2014-01-22T01:28:27"), "in-response-to": 2077, "sender-location":point("36.69,96.57"), "tags":{{"motorola", "voicemail-service" }}, "message":" dislike motorola its voicemail-service is OMG"}
-{"message-id": 1325, "author-id": 828, "timestamp":datetime("2008-04-18T18:54:09"), "in-response-to": 1744, "sender-location":point("42.78,75.39"), "tags":{{"sprint", "3G" }}, "message":" like sprint the 3G is amazing"}
-{"message-id": 1326, "author-id": 829, "timestamp":datetime("2013-04-27T02:07:21"), "in-response-to": 1287, "sender-location":point("26.57,76.69"), "tags":{{"at&t", "wireless" }}, "message":" dislike at&t the wireless is OMG:("}
-{"message-id": 1327, "author-id": 830, "timestamp":datetime("2007-06-23T13:07:05"), "in-response-to": 804, "sender-location":point("32.63,67.55"), "tags":{{"sprint", "customization" }}, "message":" dislike sprint the customization is horrible:("}
-{"message-id": 1328, "author-id": 831, "timestamp":datetime("2005-10-04T02:34:24"), "in-response-to": 542, "sender-location":point("39.13,93.36"), "tags":{{"samsung", "customer-service" }}, "message":" can't stand samsung its customer-service is bad:("}
-{"message-id": 1329, "author-id": 832, "timestamp":datetime("2010-11-14T19:28:25"), "in-response-to": 1018, "sender-location":point("40.59,89.39"), "tags":{{"at&t", "voice-command" }}, "message":" love at&t the voice-command is mind-blowing"}
-{"message-id": 1330, "author-id": 833, "timestamp":datetime("2008-01-12T12:48:45"), "in-response-to": 1253, "sender-location":point("25.38,66.18"), "tags":{{"t-mobile", "shortcut-menu" }}, "message":" love t-mobile the shortcut-menu is amazing"}
-{"message-id": 1331, "author-id": 834, "timestamp":datetime("2007-11-05T05:13:39"), "in-response-to": 104, "sender-location":point("29.63,92.0"), "tags":{{"samsung", "wireless" }}, "message":" like samsung the wireless is mind-blowing"}
diff --git a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_users.adm b/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_users.adm
deleted file mode 100644
index 554412a..0000000
--- a/asterixdb/asterix-installer/src/main/resources/examples/mugshot/data/mugshot_users.adm
+++ /dev/null
@@ -1,901 +0,0 @@
-{"id": 1, "alias": "Dewitt000001", "name": "Dewitt Faqua", "user-since": datetime("2005-01-23T01:49:01"), "address": {"street":"2 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{358 }}, "employment":[{"organization-name":"Newcom","start-date":date("2012-05-08"),"end-date":date("2012-07-11")}]}
-{"id": 2, "alias": "Irene000002", "name": "Irene Sybilla", "user-since": datetime("2005-02-14T19:43:51"), "address": {"street":"50 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{822, 210, 884, 773, 493, 5, 553, 75, 666, 68, 271, 889, 643, 196, 100, 266 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2004-05-06"),"end-date":date("2006-04-10")}]}
-{"id": 3, "alias": "Teodoro000003", "name": "Teodoro Baskett", "user-since": datetime("2008-01-06T16:26:17"), "address": {"street":"24 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{857, 449, 203, 881, 179, 507, 143, 637, 767, 395 }}, "employment":[{"organization-name":"silfind","start-date":date("2002-04-16")}]}
-{"id": 4, "alias": "Austin000004", "name": "Austin Cox", "user-since": datetime("2012-08-06T14:52:05"), "address": {"street":"5 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{395, 26, 624, 724, 234, 341, 309, 202, 571, 10, 516, 245, 413, 53, 890, 512, 22, 261, 486 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2005-07-09"),"end-date":date("2007-12-14")}]}
-{"id": 5, "alias": "Devon000005", "name": "Devon Newman", "user-since": datetime("2012-03-18T17:48:55"), "address": {"street":"26 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{677, 397, 822, 641, 71, 521, 653, 169, 803, 197, 159, 307, 358, 208, 415, 774, 361, 681, 522, 369, 273, 532 }}, "employment":[{"organization-name":"Doncare","start-date":date("2007-06-17")}]}
-{"id": 6, "alias": "Clinton000006", "name": "Clinton Barkley", "user-since": datetime("2007-11-12T17:48:48"), "address": {"street":"19 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"goldendexon","start-date":date("2004-07-12")}]}
-{"id": 7, "alias": "Cal000007", "name": "Cal Widaman", "user-since": datetime("2013-04-09T14:53:54"), "address": {"street":"25 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{407, 296, 428, 160 }}, "employment":[{"organization-name":"overtech","start-date":date("2006-08-24"),"end-date":date("2010-10-07")}]}
-{"id": 8, "alias": "Karly000008", "name": "Karly Kimple", "user-since": datetime("2007-08-27T20:26:02"), "address": {"street":"31 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{452, 835, 351, 786, 770, 134, 157, 395, 190, 47, 138, 66, 651, 630, 674, 517, 610 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2000-03-03")}]}
-{"id": 9, "alias": "Lea000009", "name": "Lea Burns", "user-since": datetime("2014-01-21T05:36:07"), "address": {"street":"79 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{789, 536, 595, 581, 259 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2002-02-06")}]}
-{"id": 10, "alias": "Rick000010", "name": "Rick Bloise", "user-since": datetime("2013-03-19T10:26:10"), "address": {"street":"68 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{89, 834, 690, 638, 612, 207, 230, 761, 807, 861, 759, 576, 234, 850, 675, 33, 9 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2002-11-06"),"end-date":date("2004-03-22")}]}
-{"id": 11, "alias": "Caris000011", "name": "Caris Sholl", "user-since": datetime("2006-04-22T07:05:17"), "address": {"street":"45 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{484, 62, 212, 272, 641, 760, 786, 279, 765, 844, 550, 461, 354, 746, 82, 866 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2008-08-26"),"end-date":date("2011-12-21")}]}
-{"id": 12, "alias": "Walker000012", "name": "Walker Overholt", "user-since": datetime("2013-12-02T13:13:25"), "address": {"street":"83 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{224, 725, 271, 649 }}, "employment":[{"organization-name":"Doublezone","start-date":date("2012-02-27"),"end-date":date("2012-05-25")}]}
-{"id": 13, "alias": "Alwyn000013", "name": "Alwyn Gilman", "user-since": datetime("2010-04-11T12:04:29"), "address": {"street":"59 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{452, 547, 856, 700, 688, 574 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2003-10-07")}]}
-{"id": 14, "alias": "Tomoko000014", "name": "Tomoko Barth", "user-since": datetime("2010-01-02T22:53:29"), "address": {"street":"86 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{546, 173, 831, 143, 271, 54, 231, 490, 564, 459 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2002-08-09")}]}
-{"id": 15, "alias": "Val000015", "name": "Val Mang", "user-since": datetime("2012-03-18T02:51:26"), "address": {"street":"43 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{116, 86, 537, 42, 448, 875, 211, 155, 198, 518, 879, 417, 283, 362, 668, 349, 882, 673, 134 }}, "employment":[{"organization-name":"linedexon","start-date":date("2009-09-19")}]}
-{"id": 16, "alias": "Tatiana000016", "name": "Tatiana Berry", "user-since": datetime("2005-03-22T09:51:15"), "address": {"street":"27 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{87, 547, 94, 373, 396, 400, 863 }}, "employment":[{"organization-name":"Solophase","start-date":date("2005-06-02")}]}
-{"id": 17, "alias": "Rowland000017", "name": "Rowland Dennis", "user-since": datetime("2007-03-21T02:46:48"), "address": {"street":"31 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{441, 460, 195, 92, 601 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2005-02-11"),"end-date":date("2009-05-19")}]}
-{"id": 18, "alias": "Lewella000018", "name": "Lewella Wain", "user-since": datetime("2012-01-22T20:27:24"), "address": {"street":"5 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{74, 82, 553, 370, 364, 504, 26, 386, 868, 338 }}, "employment":[{"organization-name":"Greencare","start-date":date("2011-08-19")}]}
-{"id": 19, "alias": "Logan000019", "name": "Logan Carr", "user-since": datetime("2014-03-22T20:39:30"), "address": {"street":"65 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{352, 68, 883, 509, 282, 44, 537, 504, 295, 808, 866, 854, 363, 304, 578, 0, 585, 503, 115, 74 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2001-08-12"),"end-date":date("2001-12-07")}]}
-{"id": 20, "alias": "Sloan000020", "name": "Sloan Mingle", "user-since": datetime("2011-03-27T08:11:34"), "address": {"street":"88 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{850, 511, 429, 243, 326, 494, 452, 50, 112, 305, 719, 859, 352, 504, 566, 558, 206, 473, 849 }}, "employment":[{"organization-name":"Dancode","start-date":date("2000-09-26"),"end-date":date("2000-11-18")}]}
-{"id": 21, "alias": "Jacquelyn000021", "name": "Jacquelyn Berkheimer", "user-since": datetime("2009-02-11T02:33:59"), "address": {"street":"65 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{673, 69, 94, 170, 740, 38, 361, 573, 682, 369 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2009-12-09")}]}
-{"id": 22, "alias": "Rachel000022", "name": "Rachel Drumm", "user-since": datetime("2008-12-04T15:23:42"), "address": {"street":"97 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{611, 867, 279, 441, 215, 32, 59 }}, "employment":[{"organization-name":"Quoline","start-date":date("2010-10-11")}]}
-{"id": 23, "alias": "Tonya000023", "name": "Tonya Caldwell", "user-since": datetime("2011-12-10T18:12:02"), "address": {"street":"80 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{207, 566, 1, 671, 370, 116, 738, 77, 681, 214, 697, 558, 616, 415, 39, 453, 457, 305, 521, 732 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2009-06-25")}]}
-{"id": 24, "alias": "Quinton000024", "name": "Quinton Light", "user-since": datetime("2005-09-08T10:51:31"), "address": {"street":"42 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{669, 672, 800, 453, 454, 406, 207, 248, 683, 589, 527, 725, 349, 65, 587, 659, 274, 640, 846, 425, 445, 107 }}, "employment":[{"organization-name":"jaydax","start-date":date("2002-03-17"),"end-date":date("2003-06-04")}]}
-{"id": 25, "alias": "Madalyn000025", "name": "Madalyn Overstreet", "user-since": datetime("2006-04-27T19:57:58"), "address": {"street":"84 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{17, 383 }}, "employment":[{"organization-name":"Sancone","start-date":date("2002-06-07")}]}
-{"id": 26, "alias": "Jalisa000026", "name": "Jalisa Foster", "user-since": datetime("2012-11-03T13:31:03"), "address": {"street":"34 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{28, 268, 617, 495, 101, 408, 64, 363, 111, 289, 694, 661, 747, 375 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2012-05-25"),"end-date":date("2012-06-07")}]}
-{"id": 27, "alias": "Scotty000027", "name": "Scotty Cross", "user-since": datetime("2006-08-08T19:09:49"), "address": {"street":"60 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{292, 332, 751, 521, 457, 628, 504, 402, 229, 264, 112, 49, 124, 282 }}, "employment":[{"organization-name":"Sancone","start-date":date("2011-07-22"),"end-date":date("2011-12-20")}]}
-{"id": 28, "alias": "Kalyn000028", "name": "Kalyn Bynum", "user-since": datetime("2009-03-23T13:34:50"), "address": {"street":"99 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{609, 483, 785, 105, 827, 65 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2007-11-23")}]}
-{"id": 29, "alias": "Esmaralda000029", "name": "Esmaralda Shaffer", "user-since": datetime("2013-01-22T15:52:00"), "address": {"street":"95 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{307, 212, 736, 540, 340, 129, 631, 396, 478, 514, 265, 14, 782, 877, 459, 897, 541, 191, 799, 71, 473, 326 }}, "employment":[{"organization-name":"Medflex","start-date":date("2000-04-06")}]}
-{"id": 30, "alias": "Amos000030", "name": "Amos Millard", "user-since": datetime("2009-11-28T10:27:02"), "address": {"street":"57 Third Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{178, 711, 605, 681, 325, 720, 328, 721, 487, 628, 66, 6, 259, 765, 10, 210, 395, 690, 879, 100, 425, 138, 660 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2001-06-28"),"end-date":date("2007-01-22")}]}
-{"id": 31, "alias": "Ann000031", "name": "Ann Bennett", "user-since": datetime("2007-01-08T02:11:22"), "address": {"street":"49 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{792, 832, 54, 73, 390, 689, 686, 848, 157, 584, 752, 850, 205 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2003-04-23"),"end-date":date("2006-11-07")}]}
-{"id": 32, "alias": "Filiberto000032", "name": "Filiberto Harris", "user-since": datetime("2012-05-02T12:27:47"), "address": {"street":"43 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{212, 505, 647, 193, 882, 457, 771, 813, 558, 836, 694, 590, 318, 339, 98, 754 }}, "employment":[{"organization-name":"U-ron","start-date":date("2003-06-15")}]}
-{"id": 33, "alias": "Harriett000033", "name": "Harriett Marshall", "user-since": datetime("2007-07-24T02:06:40"), "address": {"street":"47 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{81, 707, 88, 901, 440, 68 }}, "employment":[{"organization-name":"Doublezone","start-date":date("2008-06-21")}]}
-{"id": 34, "alias": "Jacinto000034", "name": "Jacinto Simpson", "user-since": datetime("2013-07-03T06:37:05"), "address": {"street":"37 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{209, 861, 408, 269, 9, 519, 580, 138, 7, 452, 82, 676, 371, 691, 375, 364, 290, 620, 271, 265, 467, 291, 723 }}, "employment":[{"organization-name":"Tranzap","start-date":date("2000-03-14")}]}
-{"id": 35, "alias": "Wendell000035", "name": "Wendell Fields", "user-since": datetime("2010-11-17T23:09:25"), "address": {"street":"16 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{746, 89, 156 }}, "employment":[{"organization-name":"itlab","start-date":date("2008-03-21"),"end-date":date("2009-05-24")}]}
-{"id": 36, "alias": "Sommer000036", "name": "Sommer Johnson", "user-since": datetime("2013-11-09T12:55:59"), "address": {"street":"85 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{733, 588, 368, 730, 429, 314, 798, 513, 580 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2002-07-12")}]}
-{"id": 37, "alias": "Sharlene000037", "name": "Sharlene Maclagan", "user-since": datetime("2006-08-16T06:56:25"), "address": {"street":"60 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{862, 69, 465, 481, 612, 759, 353, 530, 251, 803, 348, 133, 847, 192, 156, 883 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2003-09-27"),"end-date":date("2007-07-24")}]}
-{"id": 38, "alias": "Pat000038", "name": "Pat Cox", "user-since": datetime("2011-04-17T13:14:19"), "address": {"street":"71 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{520, 555, 714, 796, 843, 466, 598, 493, 61, 384, 189, 562, 178, 20, 285, 422, 267 }}, "employment":[{"organization-name":"Vivaace","start-date":date("2008-07-18"),"end-date":date("2010-11-08")}]}
-{"id": 39, "alias": "Lillie000039", "name": "Lillie Miller", "user-since": datetime("2010-12-19T23:52:12"), "address": {"street":"11 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{492, 113, 313, 171, 269, 445, 887, 340, 398, 652, 190, 260, 758, 93, 125, 165, 659, 164, 614, 384, 86 }}, "employment":[{"organization-name":"Greencare","start-date":date("2003-01-08")}]}
-{"id": 40, "alias": "Indiana000040", "name": "Indiana Crom", "user-since": datetime("2008-02-28T21:30:52"), "address": {"street":"29 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{518, 483, 434, 176, 589, 601, 478, 362, 355, 147, 242 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2007-04-12"),"end-date":date("2010-06-24")}]}
-{"id": 41, "alias": "Unice000041", "name": "Unice Zaun", "user-since": datetime("2011-07-07T05:56:33"), "address": {"street":"20 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{532, 188, 802, 113, 565, 573, 610, 718, 115, 327, 872, 669, 494, 146, 631, 66, 743, 863, 822, 893 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2005-12-10"),"end-date":date("2007-08-17")}]}
-{"id": 42, "alias": "Dane000042", "name": "Dane Compton", "user-since": datetime("2010-03-26T10:46:37"), "address": {"street":"70 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{235, 414, 26, 732 }}, "employment":[{"organization-name":"Canline","start-date":date("2011-03-12")}]}
-{"id": 43, "alias": "Alberic000043", "name": "Alberic Archibald", "user-since": datetime("2010-11-25T00:38:56"), "address": {"street":"54 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{84, 431, 35, 407, 121, 254, 720, 87, 245, 131, 452, 677, 105, 498, 896, 240, 873 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2012-08-21")}]}
-{"id": 44, "alias": "Allegria000044", "name": "Allegria Mccallum", "user-since": datetime("2005-01-01T19:48:19"), "address": {"street":"82 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{273, 823, 395, 386, 194, 789, 699, 360, 862, 717, 518, 812, 879, 173, 22 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2007-01-25")}]}
-{"id": 45, "alias": "Calanthe000045", "name": "Calanthe Wortman", "user-since": datetime("2013-09-16T21:23:02"), "address": {"street":"70 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{124, 465, 742, 116, 477, 102, 229, 383, 820, 51, 63, 523, 8, 753 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2010-10-14"),"end-date":date("2011-02-08")}]}
-{"id": 46, "alias": "Avelina000046", "name": "Avelina Moore", "user-since": datetime("2013-01-08T23:34:04"), "address": {"street":"14 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{208, 176, 331, 598, 682, 313, 251, 741, 244, 584, 895, 612, 177, 841, 348 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2007-02-22"),"end-date":date("2009-10-05")}]}
-{"id": 47, "alias": "Sheri000047", "name": "Sheri Monahan", "user-since": datetime("2010-05-18T07:13:41"), "address": {"street":"71 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{850, 249, 867, 489, 833, 842, 809, 162, 276, 405, 640, 625 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2011-06-04"),"end-date":date("2011-03-21")}]}
-{"id": 48, "alias": "Garrick000048", "name": "Garrick Mcfall", "user-since": datetime("2007-04-22T08:59:58"), "address": {"street":"91 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{185, 254, 48 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2001-11-20"),"end-date":date("2004-11-21")}]}
-{"id": 49, "alias": "Leola000049", "name": "Leola Wilkerson", "user-since": datetime("2010-05-19T06:10:52"), "address": {"street":"85 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{569, 104, 854, 720, 601, 666, 458, 739, 883, 215, 361, 827, 736, 4, 379, 773 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2008-05-17")}]}
-{"id": 50, "alias": "Audie000050", "name": "Audie Agg", "user-since": datetime("2009-06-19T19:23:59"), "address": {"street":"44 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Trustbam","start-date":date("2002-06-02")}]}
-{"id": 51, "alias": "Debra000051", "name": "Debra Baird", "user-since": datetime("2013-01-21T10:21:43"), "address": {"street":"98 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{596, 25, 379, 470, 261, 522, 559, 268, 395, 740, 773, 501, 591, 126 }}, "employment":[{"organization-name":"highfax","start-date":date("2000-04-02")}]}
-{"id": 52, "alias": "Lyda000052", "name": "Lyda Reed", "user-since": datetime("2005-09-17T13:18:58"), "address": {"street":"97 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{414, 729, 453, 447, 409, 660, 765, 183, 466, 136 }}, "employment":[{"organization-name":"Canline","start-date":date("2011-06-26"),"end-date":date("2011-11-24")}]}
-{"id": 53, "alias": "Denzil000053", "name": "Denzil Giesler", "user-since": datetime("2009-04-20T03:04:22"), "address": {"street":"21 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{109, 432, 777, 228 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2001-01-12")}]}
-{"id": 54, "alias": "Felix000054", "name": "Felix Draudy", "user-since": datetime("2012-12-19T17:16:59"), "address": {"street":"52 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{30, 697, 43, 662, 427, 324, 438, 312, 873 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2007-08-23"),"end-date":date("2009-03-28")}]}
-{"id": 55, "alias": "Freeda000055", "name": "Freeda Stall", "user-since": datetime("2010-05-09T03:15:30"), "address": {"street":"30 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{853, 275, 269, 331, 41, 105, 260, 161, 644, 92, 457, 246, 743, 761, 737, 481, 379, 228 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2010-11-24"),"end-date":date("2010-01-03")}]}
-{"id": 56, "alias": "Byron000056", "name": "Byron Eckhardstein", "user-since": datetime("2006-06-26T15:46:39"), "address": {"street":"19 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{422, 342, 808, 893, 87, 1, 537, 697, 452, 521, 235, 93, 587, 614, 138, 864, 583, 554, 23, 204, 823, 374, 143 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2001-01-01")}]}
-{"id": 57, "alias": "Adrian000057", "name": "Adrian Schuth", "user-since": datetime("2014-02-08T13:49:51"), "address": {"street":"96 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{659, 660, 732, 456, 877, 280, 498 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2011-03-10")}]}
-{"id": 58, "alias": "Willy000058", "name": "Willy Zoucks", "user-since": datetime("2008-09-12T01:41:36"), "address": {"street":"40 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{590, 791, 19, 64, 624, 131, 44, 610, 221, 48, 656 }}, "employment":[{"organization-name":"highfax","start-date":date("2008-04-23"),"end-date":date("2009-07-23")}]}
-{"id": 59, "alias": "Delora000059", "name": "Delora Sanders", "user-since": datetime("2007-11-15T06:12:26"), "address": {"street":"24 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{80, 869, 823, 891, 325, 398, 629, 840, 892, 100, 719, 267, 248, 189, 615, 718, 33, 873, 688, 192, 440, 50 }}, "employment":[{"organization-name":"Solophase","start-date":date("2010-11-05")}]}
-{"id": 60, "alias": "Carolina000060", "name": "Carolina Herrold", "user-since": datetime("2013-10-26T02:49:14"), "address": {"street":"55 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{294, 416, 659, 544, 865, 757, 502, 578, 307, 322, 326, 295, 572, 219, 565 }}, "employment":[{"organization-name":"overtech","start-date":date("2007-09-15")}]}
-{"id": 61, "alias": "Drew000061", "name": "Drew Eisenman", "user-since": datetime("2006-08-22T15:48:29"), "address": {"street":"98 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{100 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2001-09-23")}]}
-{"id": 62, "alias": "Wisdom000062", "name": "Wisdom Wilson", "user-since": datetime("2009-07-13T15:09:40"), "address": {"street":"49 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{193, 414, 518, 866, 16, 541, 419, 397, 134, 575 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2008-09-22"),"end-date":date("2011-10-03")}]}
-{"id": 63, "alias": "Antony000063", "name": "Antony Johns", "user-since": datetime("2014-05-07T22:57:12"), "address": {"street":"46 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{334, 98, 848, 465, 352 }}, "employment":[{"organization-name":"jaydax","start-date":date("2005-06-03")}]}
-{"id": 64, "alias": "Luke000064", "name": "Luke Sanders", "user-since": datetime("2013-08-07T19:31:37"), "address": {"street":"9 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{408, 569 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2000-06-01")}]}
-{"id": 65, "alias": "Dora000065", "name": "Dora Steiner", "user-since": datetime("2013-02-21T05:31:14"), "address": {"street":"98 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{684, 120, 292, 829, 785, 55, 568, 138, 475, 602, 775, 581, 196 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2010-12-08"),"end-date":date("2010-06-03")}]}
-{"id": 66, "alias": "Kathi000066", "name": "Kathi Catherina", "user-since": datetime("2009-05-02T08:37:06"), "address": {"street":"15 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{713, 785, 546, 256, 312, 233, 446, 63, 547, 483, 143, 152, 643, 258, 12, 570, 489 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2012-05-04")}]}
-{"id": 67, "alias": "Adan000067", "name": "Adan Weldy", "user-since": datetime("2005-11-12T08:47:55"), "address": {"street":"32 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{415, 564, 328, 118, 871, 458, 708, 782, 684, 572, 319 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2012-03-27")}]}
-{"id": 68, "alias": "Corrie000068", "name": "Corrie Pittman", "user-since": datetime("2012-05-15T11:21:54"), "address": {"street":"11 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{304, 634, 145, 371, 207, 530, 101, 348, 891, 706, 305, 323, 854, 219, 794, 523, 503, 636 }}, "employment":[{"organization-name":"Keytech","start-date":date("2003-08-10"),"end-date":date("2005-10-24")}]}
-{"id": 69, "alias": "Alayna000069", "name": "Alayna Wardle", "user-since": datetime("2013-06-21T02:52:31"), "address": {"street":"85 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{887, 554, 818, 171, 360, 340, 153 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2008-02-13")}]}
-{"id": 70, "alias": "Carolee000070", "name": "Carolee Ewing", "user-since": datetime("2008-03-16T16:52:16"), "address": {"street":"44 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{138, 252, 466 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2009-01-04")}]}
-{"id": 71, "alias": "Channing000071", "name": "Channing Lane", "user-since": datetime("2012-08-07T08:06:25"), "address": {"street":"43 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{719, 856, 847, 238, 203, 507, 871, 42, 587, 839, 644, 882, 827, 514, 887, 486 }}, "employment":[{"organization-name":"ganjalax","start-date":date("2011-02-05"),"end-date":date("2011-10-23")}]}
-{"id": 72, "alias": "Gyles000072", "name": "Gyles Northey", "user-since": datetime("2012-04-13T09:27:47"), "address": {"street":"28 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{829, 554 }}, "employment":[{"organization-name":"Vivaace","start-date":date("2011-02-09")}]}
-{"id": 73, "alias": "Griselda000073", "name": "Griselda Mens", "user-since": datetime("2008-07-23T19:39:20"), "address": {"street":"49 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{695, 554, 882, 755, 330, 336, 493, 633, 595, 310, 236, 896, 463, 404, 694, 105, 159 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2009-07-22")}]}
-{"id": 74, "alias": "Scottie000074", "name": "Scottie Handyside", "user-since": datetime("2012-10-06T10:36:56"), "address": {"street":"70 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{606, 9, 655, 258, 475, 558, 880, 639, 397, 804, 218 }}, "employment":[{"organization-name":"Newcom","start-date":date("2012-04-07"),"end-date":date("2012-05-25")}]}
-{"id": 75, "alias": "Debby000075", "name": "Debby Painter", "user-since": datetime("2009-04-10T09:13:09"), "address": {"street":"64 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{496, 675, 305, 842, 880, 0, 151, 563, 104, 804, 180, 447, 173, 234, 531, 763, 183 }}, "employment":[{"organization-name":"U-ron","start-date":date("2009-12-12")}]}
-{"id": 76, "alias": "Stefan000076", "name": "Stefan Frankenberger", "user-since": datetime("2011-10-22T15:04:02"), "address": {"street":"66 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{173, 392, 185, 848, 489, 766, 367, 771, 706, 225, 745 }}, "employment":[{"organization-name":"highfax","start-date":date("2000-05-27")}]}
-{"id": 77, "alias": "Tad000077", "name": "Tad Hiles", "user-since": datetime("2006-10-10T04:37:17"), "address": {"street":"39 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{267, 400, 658, 806, 870 }}, "employment":[{"organization-name":"Keytech","start-date":date("2006-10-08")}]}
-{"id": 78, "alias": "Andera000078", "name": "Andera Wells", "user-since": datetime("2011-09-08T11:29:44"), "address": {"street":"8 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{77, 143, 799, 882, 125, 209, 847, 736, 631, 90, 217, 512, 318, 299, 267, 564, 52, 449, 70, 181 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2002-01-11")}]}
-{"id": 79, "alias": "Bradley000079", "name": "Bradley Ward", "user-since": datetime("2014-01-12T08:12:22"), "address": {"street":"39 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{273, 278, 189, 787, 144, 420, 372, 296, 264, 220, 295, 699, 439, 886, 448, 43, 201, 251, 92, 532 }}, "employment":[{"organization-name":"Greencare","start-date":date("2001-04-23")}]}
-{"id": 80, "alias": "Janice000080", "name": "Janice Hatherly", "user-since": datetime("2011-05-17T02:48:45"), "address": {"street":"46 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{41, 690, 99, 819, 794, 548, 179, 155, 585, 137, 647, 362, 442, 418, 229, 737, 597, 789, 741, 657 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2011-01-02")}]}
-{"id": 81, "alias": "So000081", "name": "So Beedell", "user-since": datetime("2009-06-18T00:29:46"), "address": {"street":"99 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{642, 15, 475, 517, 755, 208, 576, 493, 392, 656 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2003-06-04")}]}
-{"id": 82, "alias": "Lesley000082", "name": "Lesley Read", "user-since": datetime("2005-05-14T15:00:06"), "address": {"street":"48 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{310 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2000-03-17"),"end-date":date("2005-11-15")}]}
-{"id": 83, "alias": "Molly000083", "name": "Molly Bonner", "user-since": datetime("2007-11-09T01:24:02"), "address": {"street":"17 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{533, 652, 260, 97, 342, 880, 792, 454, 300, 320, 5 }}, "employment":[{"organization-name":"highfax","start-date":date("2005-02-03"),"end-date":date("2006-06-08")}]}
-{"id": 84, "alias": "Adolph000084", "name": "Adolph Hair", "user-since": datetime("2010-08-18T13:45:25"), "address": {"street":"30 Third Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{489, 578, 463, 277, 53, 636, 189, 349, 405, 406, 778, 530, 104, 380, 579, 55, 266, 628, 849, 142, 521, 164 }}, "employment":[{"organization-name":"Technohow","start-date":date("2008-01-27"),"end-date":date("2011-11-10")}]}
-{"id": 85, "alias": "Numbers000085", "name": "Numbers Stroble", "user-since": datetime("2013-07-07T04:20:03"), "address": {"street":"53 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{250, 823, 244, 23 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2012-04-24"),"end-date":date("2012-06-18")}]}
-{"id": 86, "alias": "Patti000086", "name": "Patti Wall", "user-since": datetime("2010-01-05T17:12:27"), "address": {"street":"71 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{470, 149, 899, 423, 75, 563, 286, 644, 106, 12, 831, 25, 86, 270, 875 }}, "employment":[{"organization-name":"subtam","start-date":date("2001-12-09")}]}
-{"id": 87, "alias": "Zavia000087", "name": "Zavia Holtzer", "user-since": datetime("2008-05-10T07:33:07"), "address": {"street":"88 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{534, 88, 791, 378, 323, 9, 448, 716, 437, 348, 617, 621, 695, 122 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2002-11-19")}]}
-{"id": 88, "alias": "Galen000088", "name": "Galen Fiscina", "user-since": datetime("2006-01-09T13:00:51"), "address": {"street":"95 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{312, 404, 764, 299, 289, 806, 753, 357, 537, 592, 486, 545, 57, 603, 256, 664, 582, 838, 198, 440, 826 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2004-05-19")}]}
-{"id": 89, "alias": "Alfred000089", "name": "Alfred Van", "user-since": datetime("2011-10-22T04:29:40"), "address": {"street":"97 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{608, 664, 521, 719, 695, 22, 331, 753, 362, 66, 815, 528, 493 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2000-07-07"),"end-date":date("2011-09-14")}]}
-{"id": 90, "alias": "Troy000090", "name": "Troy Appleby", "user-since": datetime("2012-10-08T22:02:23"), "address": {"street":"5 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{228, 269, 299, 775 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2002-01-26"),"end-date":date("2002-11-05")}]}
-{"id": 91, "alias": "Mackenzie000091", "name": "Mackenzie Eve", "user-since": datetime("2010-07-02T15:46:34"), "address": {"street":"86 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{571, 71, 51, 191 }}, "employment":[{"organization-name":"Newphase","start-date":date("2011-04-05")}]}
-{"id": 92, "alias": "Casey000092", "name": "Casey Reade", "user-since": datetime("2007-08-10T22:44:33"), "address": {"street":"1 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{1, 76, 193 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2007-06-25")}]}
-{"id": 93, "alias": "Leif000093", "name": "Leif Burnett", "user-since": datetime("2007-10-22T03:25:25"), "address": {"street":"20 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Statcode","start-date":date("2003-02-12")}]}
-{"id": 94, "alias": "Dave000094", "name": "Dave Bennett", "user-since": datetime("2014-08-15T23:46:55"), "address": {"street":"99 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{733, 152, 681, 371, 479, 640, 92, 759, 287, 503, 31, 406, 422, 7, 151, 123, 666, 488 }}, "employment":[{"organization-name":"Solophase","start-date":date("2006-06-13")}]}
-{"id": 95, "alias": "James000095", "name": "James Wiggins", "user-since": datetime("2013-12-04T02:18:05"), "address": {"street":"58 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{658, 848, 255, 470, 600, 106, 611, 277, 546, 147, 289, 428, 834, 328, 813, 811, 641, 190 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2004-01-28")}]}
-{"id": 96, "alias": "Theresa000096", "name": "Theresa Compton", "user-since": datetime("2007-07-04T05:51:44"), "address": {"street":"21 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Streettax","start-date":date("2003-09-14")}]}
-{"id": 97, "alias": "Wesley000097", "name": "Wesley Stroh", "user-since": datetime("2007-05-22T11:34:52"), "address": {"street":"34 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Qvohouse","start-date":date("2004-07-08")}]}
-{"id": 98, "alias": "Birdie000098", "name": "Birdie Snyder", "user-since": datetime("2009-07-11T22:57:39"), "address": {"street":"51 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{581, 186, 104 }}, "employment":[{"organization-name":"Newphase","start-date":date("2004-08-15"),"end-date":date("2010-03-20")}]}
-{"id": 99, "alias": "Remona000099", "name": "Remona Robinson", "user-since": datetime("2010-11-23T08:48:45"), "address": {"street":"61 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{61, 505, 599, 186, 706, 887, 842, 137, 540, 248, 210, 261, 489, 604, 326, 335, 646, 826, 657, 109 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2011-12-11")}]}
-{"id": 100, "alias": "Kimberlee000100", "name": "Kimberlee Warren", "user-since": datetime("2007-05-14T04:58:27"), "address": {"street":"26 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{272, 466, 897, 885, 784, 108, 175, 779, 530, 734, 210, 483, 196, 801, 414, 200, 323, 820, 563, 853 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2010-06-09"),"end-date":date("2011-02-08")}]}
-{"id": 101, "alias": "Aubrey000101", "name": "Aubrey Swarner", "user-since": datetime("2008-01-23T20:38:50"), "address": {"street":"28 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{268, 727, 819, 92, 816, 25, 757, 692, 449, 648, 805, 260, 222, 285, 225, 705, 666, 829, 662 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2008-03-17")}]}
-{"id": 102, "alias": "Amaryllis000102", "name": "Amaryllis Osteen", "user-since": datetime("2012-08-12T10:42:34"), "address": {"street":"8 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{217, 467, 237, 157, 109, 26, 159, 509, 375, 153, 864, 393, 729 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2007-12-16")}]}
-{"id": 103, "alias": "Taylor000103", "name": "Taylor Ropes", "user-since": datetime("2011-01-04T02:48:01"), "address": {"street":"78 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{137, 417, 659, 893, 800, 871, 781 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2003-02-19")}]}
-{"id": 104, "alias": "Porter000104", "name": "Porter Wilson", "user-since": datetime("2014-05-14T20:20:29"), "address": {"street":"36 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{205, 34, 553, 30, 225, 159, 733 }}, "employment":[{"organization-name":"Solfix","start-date":date("2000-05-27")}]}
-{"id": 105, "alias": "Rudyard000105", "name": "Rudyard Swift", "user-since": datetime("2012-09-26T12:41:37"), "address": {"street":"46 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{732, 708, 432, 415, 670, 449, 462, 455, 695, 885, 77, 73, 5, 716, 139 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2000-09-05")}]}
-{"id": 106, "alias": "Jaycob000106", "name": "Jaycob Thorley", "user-since": datetime("2012-07-24T11:27:32"), "address": {"street":"3 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{217, 655, 801, 109, 224, 8, 373 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2001-09-23"),"end-date":date("2004-09-10")}]}
-{"id": 107, "alias": "Odell000107", "name": "Odell Nehling", "user-since": datetime("2008-07-23T14:20:51"), "address": {"street":"69 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{661, 42, 780, 732, 143, 817, 309, 282, 719, 503, 538, 397, 717, 27 }}, "employment":[{"organization-name":"physcane","start-date":date("2011-03-22")}]}
-{"id": 108, "alias": "Lydia000108", "name": "Lydia Berry", "user-since": datetime("2005-08-26T09:52:56"), "address": {"street":"78 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{463, 796, 241, 239, 153, 140, 652, 90, 7, 712, 242 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2003-03-14"),"end-date":date("2011-05-01")}]}
-{"id": 109, "alias": "Richie000109", "name": "Richie Bullard", "user-since": datetime("2008-11-18T07:25:50"), "address": {"street":"42 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{520, 310, 364, 665, 587, 483, 825, 14, 260, 819, 259, 438, 564, 282, 641, 625, 287, 24, 724, 28 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2004-03-26"),"end-date":date("2009-11-24")}]}
-{"id": 110, "alias": "Anderson000110", "name": "Anderson Northey", "user-since": datetime("2012-12-25T20:04:08"), "address": {"street":"18 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{458, 486, 426, 479, 713, 612, 323, 493, 412, 380, 309, 460, 748, 621, 463, 634 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2010-07-21")}]}
-{"id": 111, "alias": "Jasmine000111", "name": "Jasmine Buttermore", "user-since": datetime("2007-02-03T03:37:30"), "address": {"street":"65 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{813 }}, "employment":[{"organization-name":"Newphase","start-date":date("2001-11-21"),"end-date":date("2003-02-19")}]}
-{"id": 112, "alias": "Lallie000112", "name": "Lallie Munson", "user-since": datetime("2008-05-03T19:14:45"), "address": {"street":"22 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{364, 58, 353, 588, 97, 64, 518, 308, 402, 694, 2, 732, 846, 855, 101, 284, 464, 314, 893, 621 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2005-02-03")}]}
-{"id": 113, "alias": "Brittni000113", "name": "Brittni Vorrasi", "user-since": datetime("2010-12-03T23:48:38"), "address": {"street":"100 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{427, 438, 476, 670, 579, 157, 419, 518, 668, 90, 111, 140, 170, 204, 209, 855, 726, 402, 370, 435 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2009-10-17")}]}
-{"id": 114, "alias": "Renea000114", "name": "Renea Houser", "user-since": datetime("2007-11-13T10:03:23"), "address": {"street":"76 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{180, 800, 499, 719, 851, 437, 510, 379, 862, 865, 575, 60, 850, 130, 122, 613, 253, 549 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2008-10-23")}]}
-{"id": 115, "alias": "Bunny000115", "name": "Bunny Vanleer", "user-since": datetime("2011-11-22T02:02:12"), "address": {"street":"79 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Codetechno","start-date":date("2003-12-13")}]}
-{"id": 116, "alias": "Ralphina000116", "name": "Ralphina Evans", "user-since": datetime("2013-02-12T03:35:01"), "address": {"street":"94 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{12, 404, 427, 732, 165, 695, 332, 179, 81, 277, 853, 640, 705, 731, 158, 444, 458, 322, 557, 714, 499, 417 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2007-05-04"),"end-date":date("2007-09-09")}]}
-{"id": 117, "alias": "Zola000117", "name": "Zola James", "user-since": datetime("2006-04-14T19:40:31"), "address": {"street":"26 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{583, 8, 290, 467, 78, 48, 331, 302, 97, 442, 684, 157, 738, 73, 795, 481, 88, 210, 514, 142, 794 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2011-07-26")}]}
-{"id": 118, "alias": "Cathy000118", "name": "Cathy Moulton", "user-since": datetime("2010-02-08T02:28:12"), "address": {"street":"26 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{504, 184, 142, 238, 218, 254, 814, 489, 84, 712, 274, 450 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2007-02-08"),"end-date":date("2009-12-27")}]}
-{"id": 119, "alias": "Jep000119", "name": "Jep Napier", "user-since": datetime("2011-08-25T20:31:40"), "address": {"street":"66 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{273, 531, 438, 63, 555, 872, 312, 712, 293, 376, 373, 257, 734, 647, 482, 390 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2000-01-12"),"end-date":date("2010-11-04")}]}
-{"id": 120, "alias": "Joandra000120", "name": "Joandra Wall", "user-since": datetime("2008-10-20T13:14:20"), "address": {"street":"74 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{489, 344, 312, 625, 288, 518, 176, 533, 385, 610 }}, "employment":[{"organization-name":"Striptaxon","start-date":date("2004-07-28")}]}
-{"id": 121, "alias": "Terresa000121", "name": "Terresa Gibson", "user-since": datetime("2010-09-03T03:30:37"), "address": {"street":"89 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{142, 223, 564, 716, 56, 325, 379, 549, 897, 78, 862, 143 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2003-01-22"),"end-date":date("2010-11-06")}]}
-{"id": 122, "alias": "Damion000122", "name": "Damion Newlove", "user-since": datetime("2011-10-27T06:38:31"), "address": {"street":"97 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{491, 719, 733, 295, 219, 704, 509 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2008-01-16")}]}
-{"id": 123, "alias": "Stuart000123", "name": "Stuart Garneis", "user-since": datetime("2011-02-25T08:05:27"), "address": {"street":"62 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{41, 840, 540, 345, 416, 510, 832, 153, 582, 773, 339, 572, 625, 370, 117, 475, 412, 479 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2006-01-27"),"end-date":date("2007-11-24")}]}
-{"id": 124, "alias": "Crofton000124", "name": "Crofton Tomco", "user-since": datetime("2010-10-12T13:08:51"), "address": {"street":"26 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{638, 668, 466, 602, 693 }}, "employment":[{"organization-name":"Newcom","start-date":date("2002-12-25")}]}
-{"id": 125, "alias": "Berry000125", "name": "Berry Baer", "user-since": datetime("2005-04-05T00:06:55"), "address": {"street":"14 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{293, 384, 487, 379, 480, 611, 331, 865, 825, 342, 214, 712, 117, 53 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2012-08-11")}]}
-{"id": 126, "alias": "Sidney000126", "name": "Sidney Fiscina", "user-since": datetime("2005-12-13T14:56:23"), "address": {"street":"45 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{536, 633, 506, 557, 24, 531, 64, 7, 12, 145, 197, 710, 51 }}, "employment":[{"organization-name":"Technohow","start-date":date("2011-04-21")}]}
-{"id": 127, "alias": "Bertram000127", "name": "Bertram Lineman", "user-since": datetime("2007-02-02T04:56:16"), "address": {"street":"65 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{181, 29, 333, 616, 402, 398, 105, 186, 435, 640, 41, 403, 43, 793, 702, 150, 789, 456, 258, 489, 766, 161, 51, 472 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2009-06-23"),"end-date":date("2009-12-03")}]}
-{"id": 128, "alias": "Gawain000128", "name": "Gawain Higgens", "user-since": datetime("2005-04-22T12:41:26"), "address": {"street":"48 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{205, 265 }}, "employment":[{"organization-name":"strongex","start-date":date("2002-06-19")}]}
-{"id": 129, "alias": "Madalyn000129", "name": "Madalyn Blatenberger", "user-since": datetime("2011-05-25T21:13:28"), "address": {"street":"7 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{390, 212, 90, 476, 113, 734, 161, 27, 798, 57, 183, 214, 800, 581, 788, 156, 249, 279, 512 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2004-04-22")}]}
-{"id": 130, "alias": "Wilton000130", "name": "Wilton Isemann", "user-since": datetime("2011-03-10T16:24:49"), "address": {"street":"94 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{73, 371, 98, 257, 210, 739, 324, 166, 730, 488, 544, 715, 723 }}, "employment":[{"organization-name":"linedexon","start-date":date("2010-11-08")}]}
-{"id": 131, "alias": "Millard000131", "name": "Millard Robinson", "user-since": datetime("2006-10-11T00:36:34"), "address": {"street":"99 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{498, 693, 447, 5, 182, 188, 137, 281, 140, 301, 713, 567, 170, 99 }}, "employment":[{"organization-name":"Hot-tech","start-date":date("2005-02-18"),"end-date":date("2010-04-21")}]}
-{"id": 132, "alias": "Buddy000132", "name": "Buddy Earhart", "user-since": datetime("2007-02-04T18:47:36"), "address": {"street":"23 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{151, 27, 202, 692 }}, "employment":[{"organization-name":"Solfix","start-date":date("2002-06-15")}]}
-{"id": 133, "alias": "Jennifer000133", "name": "Jennifer Mang", "user-since": datetime("2006-05-07T10:47:28"), "address": {"street":"89 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{514, 799, 432 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2007-04-11")}]}
-{"id": 134, "alias": "Franchesca000134", "name": "Franchesca Bauerle", "user-since": datetime("2006-05-06T10:38:49"), "address": {"street":"90 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{647, 632, 31, 165, 688, 573, 294, 312, 405, 742, 173, 215, 482, 770 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2006-08-14"),"end-date":date("2009-06-01")}]}
-{"id": 135, "alias": "Calanthe000135", "name": "Calanthe Painter", "user-since": datetime("2009-11-11T00:03:58"), "address": {"street":"71 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{231, 732, 324, 223, 333, 29, 130, 750, 796, 209, 44, 330 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2012-01-02"),"end-date":date("2012-02-14")}]}
-{"id": 136, "alias": "Erna000136", "name": "Erna Buck", "user-since": datetime("2009-09-06T03:45:00"), "address": {"street":"81 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{367, 815, 159, 869, 718, 24, 505, 441, 530, 837, 526, 613, 792, 175, 136 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2004-09-21")}]}
-{"id": 137, "alias": "Aurora000137", "name": "Aurora Burris", "user-since": datetime("2005-04-07T05:41:23"), "address": {"street":"51 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{551, 124, 693, 168, 333, 799, 390, 504, 308, 517, 193, 862, 584, 452, 377, 497, 725, 95, 211, 37, 360, 238, 613 }}, "employment":[{"organization-name":"Xx-drill","start-date":date("2004-06-26")}]}
-{"id": 138, "alias": "Eladia000138", "name": "Eladia Berkheimer", "user-since": datetime("2006-11-10T21:17:14"), "address": {"street":"30 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{585, 193, 139, 591, 313, 7, 555, 37, 50, 21, 660, 454, 698, 100, 306, 818, 632, 218, 433, 2 }}, "employment":[{"organization-name":"Coneflex","start-date":date("2007-10-09")}]}
-{"id": 139, "alias": "Darby000139", "name": "Darby Bishop", "user-since": datetime("2013-03-25T08:53:23"), "address": {"street":"10 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{131, 109, 369, 337, 609 }}, "employment":[{"organization-name":"freshdox","start-date":date("2010-04-16"),"end-date":date("2010-08-15")}]}
-{"id": 140, "alias": "Katherin000140", "name": "Katherin Sheets", "user-since": datetime("2011-08-23T04:22:52"), "address": {"street":"26 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{489, 528, 415, 273, 93, 247, 757, 594, 816, 680, 768, 67, 834, 788, 73, 157, 709, 588, 155, 92, 702 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2010-11-06")}]}
-{"id": 141, "alias": "Merla000141", "name": "Merla Quinn", "user-since": datetime("2013-06-28T17:59:30"), "address": {"street":"42 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{823, 862, 715, 90, 418, 781, 670, 427, 166 }}, "employment":[{"organization-name":"Technohow","start-date":date("2003-12-11")}]}
-{"id": 142, "alias": "Junior000142", "name": "Junior Kemerer", "user-since": datetime("2008-02-03T09:05:51"), "address": {"street":"26 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{187, 546, 427, 436, 821, 473, 108, 880, 25, 527 }}, "employment":[{"organization-name":"Solophase","start-date":date("2012-06-24"),"end-date":date("2012-06-11")}]}
-{"id": 143, "alias": "Gonzalo000143", "name": "Gonzalo Jackson", "user-since": datetime("2010-02-21T23:26:20"), "address": {"street":"65 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Doublezone","start-date":date("2012-04-05"),"end-date":date("2012-07-25")}]}
-{"id": 144, "alias": "Anselm000144", "name": "Anselm Wylie", "user-since": datetime("2005-12-20T12:01:39"), "address": {"street":"98 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{520, 820, 330, 785, 68, 754, 321, 606, 435, 203, 405, 62, 279, 233, 63, 617, 318, 775, 420, 643, 473 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2008-04-17")}]}
-{"id": 145, "alias": "Laura000145", "name": "Laura Stall", "user-since": datetime("2005-07-04T17:38:27"), "address": {"street":"76 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{30, 485, 365, 840, 14, 135 }}, "employment":[{"organization-name":"Goldcity","start-date":date("2004-06-08")}]}
-{"id": 146, "alias": "Sinclair000146", "name": "Sinclair Thorley", "user-since": datetime("2006-06-24T13:23:38"), "address": {"street":"45 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{75, 635, 305, 185, 388, 539, 750, 216, 164, 842, 748, 154, 586, 899, 255, 308, 379, 583, 251, 841, 391, 442, 453 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2010-10-12"),"end-date":date("2011-07-11")}]}
-{"id": 147, "alias": "Kolour000147", "name": "Kolour Hooker", "user-since": datetime("2010-10-09T23:22:14"), "address": {"street":"56 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{381, 133, 597, 479, 675, 794, 844, 359, 423, 471, 575, 759, 280, 664, 496, 681 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2012-03-18")}]}
-{"id": 148, "alias": "Lenora000148", "name": "Lenora Lazzo", "user-since": datetime("2010-03-14T14:07:16"), "address": {"street":"18 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{135 }}, "employment":[{"organization-name":"Indiex","start-date":date("2008-08-20"),"end-date":date("2010-09-21")}]}
-{"id": 149, "alias": "Roscoe000149", "name": "Roscoe Jackson", "user-since": datetime("2011-01-17T04:39:27"), "address": {"street":"3 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{393, 761, 760, 594, 736, 765, 200, 488, 410, 311 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2010-09-20"),"end-date":date("2011-03-09")}]}
-{"id": 150, "alias": "Canute000150", "name": "Canute Wire", "user-since": datetime("2005-01-20T22:24:49"), "address": {"street":"42 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{638, 493, 27, 848, 758, 205, 21, 12, 249, 608, 332, 585, 25, 321, 341, 870, 170, 456 }}, "employment":[{"organization-name":"Quoline","start-date":date("2004-09-02")}]}
-{"id": 151, "alias": "Amabel000151", "name": "Amabel Jelliman", "user-since": datetime("2007-04-12T17:00:05"), "address": {"street":"61 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{396, 220, 164, 398, 825, 293, 276, 535, 358, 692, 271 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2005-12-22")}]}
-{"id": 152, "alias": "Kenton000152", "name": "Kenton Hoffhants", "user-since": datetime("2013-08-15T03:21:31"), "address": {"street":"40 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{12, 870, 390, 861, 553, 341, 193, 271, 359, 195, 789, 708, 490, 703, 68, 827, 194, 225 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2004-06-09"),"end-date":date("2004-06-17")}]}
-{"id": 153, "alias": "Donella000153", "name": "Donella Weeks", "user-since": datetime("2013-07-13T16:17:03"), "address": {"street":"38 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{880, 238, 616, 874 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2009-10-27"),"end-date":date("2010-06-26")}]}
-{"id": 154, "alias": "Alexia000154", "name": "Alexia Kline", "user-since": datetime("2013-11-05T04:18:45"), "address": {"street":"10 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{894, 336, 365, 811, 556, 100, 406, 275 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2002-08-22")}]}
-{"id": 155, "alias": "Desmond000155", "name": "Desmond Osteen", "user-since": datetime("2007-10-21T19:39:05"), "address": {"street":"28 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{473, 183, 762, 391, 469, 170, 136, 270 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2001-08-22")}]}
-{"id": 156, "alias": "Peyton000156", "name": "Peyton Bell", "user-since": datetime("2008-03-21T18:29:12"), "address": {"street":"57 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{824 }}, "employment":[{"organization-name":"Solophase","start-date":date("2006-06-23")}]}
-{"id": 157, "alias": "Leia000157", "name": "Leia Brindle", "user-since": datetime("2008-01-10T08:27:21"), "address": {"street":"83 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{796, 683, 341, 583, 144, 794, 18, 334, 305, 107, 399, 319, 191, 545, 103, 83, 732, 43 }}, "employment":[{"organization-name":"over-it","start-date":date("2008-05-12"),"end-date":date("2009-11-13")}]}
-{"id": 158, "alias": "Lashonda000158", "name": "Lashonda Quirin", "user-since": datetime("2005-04-21T10:49:49"), "address": {"street":"2 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{428, 805, 655, 498, 8, 756, 304, 439, 150 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2006-06-17"),"end-date":date("2009-03-05")}]}
-{"id": 159, "alias": "Jessamine000159", "name": "Jessamine Parkinson", "user-since": datetime("2010-09-28T11:28:22"), "address": {"street":"7 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"freshdox","start-date":date("2010-02-13")}]}
-{"id": 160, "alias": "Floyd000160", "name": "Floyd Oneal", "user-since": datetime("2006-06-14T17:24:00"), "address": {"street":"67 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Doncare","start-date":date("2008-07-16")}]}
-{"id": 161, "alias": "Linwood000161", "name": "Linwood Schmiel", "user-since": datetime("2013-12-06T23:39:54"), "address": {"street":"44 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{607, 342, 117, 269, 159, 650, 305, 377, 829, 316, 761, 263, 111 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2007-12-20")}]}
-{"id": 162, "alias": "Laura000162", "name": "Laura Marshall", "user-since": datetime("2012-02-28T20:38:05"), "address": {"street":"80 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{832 }}, "employment":[{"organization-name":"Newcom","start-date":date("2010-10-04")}]}
-{"id": 163, "alias": "Queenie000163", "name": "Queenie Noton", "user-since": datetime("2011-05-07T02:25:37"), "address": {"street":"58 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{98, 538, 849, 66, 647, 542, 629, 26, 202, 491, 447, 825, 506, 361, 316, 521, 433, 319, 757, 182, 289, 156 }}, "employment":[{"organization-name":"linedexon","start-date":date("2010-06-15")}]}
-{"id": 164, "alias": "Teofila000164", "name": "Teofila Drumm", "user-since": datetime("2009-12-18T02:39:30"), "address": {"street":"65 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{857, 70, 740, 701, 582, 27, 141, 447, 490, 337, 377, 636, 405, 366, 633 }}, "employment":[{"organization-name":"Greencare","start-date":date("2012-05-28")}]}
-{"id": 165, "alias": "Elvis000165", "name": "Elvis Bousum", "user-since": datetime("2006-04-28T04:11:31"), "address": {"street":"29 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{811, 353, 368, 45, 901, 209, 767, 494, 608, 812, 854, 890 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2000-12-18")}]}
-{"id": 166, "alias": "Caren000166", "name": "Caren Berry", "user-since": datetime("2012-06-28T08:51:37"), "address": {"street":"10 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{630, 698, 64, 565, 851, 688, 470, 694, 375, 200, 30, 35, 787, 782, 31, 455, 834, 494, 32, 196, 721 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2001-01-25"),"end-date":date("2003-05-10")}]}
-{"id": 167, "alias": "Zeke000167", "name": "Zeke Carmichael", "user-since": datetime("2008-10-15T19:06:43"), "address": {"street":"54 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Doublezone","start-date":date("2004-06-01")}]}
-{"id": 168, "alias": "Khloe000168", "name": "Khloe Robinson", "user-since": datetime("2011-10-04T09:53:03"), "address": {"street":"35 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{703, 497 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2003-06-25"),"end-date":date("2004-04-25")}]}
-{"id": 169, "alias": "Susannah000169", "name": "Susannah Wallick", "user-since": datetime("2007-05-01T14:11:41"), "address": {"street":"16 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{226 }}, "employment":[{"organization-name":"Quoline","start-date":date("2011-01-25")}]}
-{"id": 170, "alias": "Reagan000170", "name": "Reagan Moore", "user-since": datetime("2012-08-11T15:36:37"), "address": {"street":"91 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{777, 595, 174, 529, 3, 728, 665, 705, 676, 557, 15, 88, 824, 817, 431, 178, 79, 871, 435, 303, 568, 572, 384, 218 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2006-10-23"),"end-date":date("2007-02-15")}]}
-{"id": 171, "alias": "Beatrice000171", "name": "Beatrice Bruxner", "user-since": datetime("2008-03-24T03:32:47"), "address": {"street":"15 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{26, 150, 236, 691, 845, 136, 484, 567, 79, 815, 593 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2012-04-02"),"end-date":date("2012-04-24")}]}
-{"id": 172, "alias": "Farah000172", "name": "Farah Stoddard", "user-since": datetime("2009-05-04T10:14:11"), "address": {"street":"30 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{14, 691, 719, 603, 559, 483, 675, 428, 622, 339, 604, 100, 46, 476, 4, 313, 766, 579, 585, 602, 310, 247 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2010-08-16")}]}
-{"id": 173, "alias": "Reggie000173", "name": "Reggie Law", "user-since": datetime("2014-01-24T23:25:59"), "address": {"street":"23 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{650, 644, 520, 63, 292 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2002-03-01")}]}
-{"id": 174, "alias": "Isa000174", "name": "Isa Chapman", "user-since": datetime("2007-01-28T11:22:32"), "address": {"street":"7 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{851, 64, 331, 764 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2003-04-01")}]}
-{"id": 175, "alias": "Florencio000175", "name": "Florencio Pfeifer", "user-since": datetime("2005-11-07T17:16:53"), "address": {"street":"10 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{666, 608, 191, 687, 204, 117, 51, 298, 224, 185, 864, 111, 706, 159, 242 }}, "employment":[{"organization-name":"Coneflex","start-date":date("2003-03-27"),"end-date":date("2004-08-26")}]}
-{"id": 176, "alias": "Greg000176", "name": "Greg Reese", "user-since": datetime("2008-01-22T05:38:57"), "address": {"street":"89 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{77, 453, 81, 709, 778, 429, 304, 298, 423, 865, 39 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2001-03-11")}]}
-{"id": 177, "alias": "Carlyle000177", "name": "Carlyle Weldi", "user-since": datetime("2007-09-10T03:59:49"), "address": {"street":"3 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{697 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2005-11-08"),"end-date":date("2007-06-13")}]}
-{"id": 178, "alias": "Tiara000178", "name": "Tiara Williams", "user-since": datetime("2012-10-02T01:08:07"), "address": {"street":"66 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{147, 554, 440, 535, 250, 450, 234, 141, 111, 562, 32, 504, 825, 788, 773 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2008-08-08")}]}
-{"id": 179, "alias": "Kade000179", "name": "Kade Pfeifer", "user-since": datetime("2007-09-11T14:52:59"), "address": {"street":"64 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{608, 897, 359, 325, 139, 212, 579, 523, 243, 179, 207, 287 }}, "employment":[{"organization-name":"Streettax","start-date":date("2012-07-28")}]}
-{"id": 180, "alias": "Jepson000180", "name": "Jepson Stroble", "user-since": datetime("2008-02-09T19:50:08"), "address": {"street":"5 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{97, 641, 540, 333, 568, 447, 437, 250, 459, 578, 681, 67, 770, 168, 263, 415, 405, 235, 782, 209, 354, 695 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2006-06-17")}]}
-{"id": 181, "alias": "Leonarda000181", "name": "Leonarda Holts", "user-since": datetime("2007-01-01T07:40:24"), "address": {"street":"97 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{149, 888, 308, 825, 123, 141, 60, 696, 243, 158, 671 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2006-02-16")}]}
-{"id": 182, "alias": "Jackie000182", "name": "Jackie Weldi", "user-since": datetime("2006-04-07T14:45:40"), "address": {"street":"77 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{671, 435, 130, 460, 735, 105, 776, 179, 550, 83, 702, 228, 13, 862, 479, 247, 618, 172, 891 }}, "employment":[{"organization-name":"Medflex","start-date":date("2002-09-26"),"end-date":date("2002-06-23")}]}
-{"id": 183, "alias": "Anamaria000183", "name": "Anamaria Wile", "user-since": datetime("2013-05-15T11:02:12"), "address": {"street":"16 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{660, 103, 781, 366, 884, 47, 376, 143, 720, 888, 119, 594, 321, 52, 619 }}, "employment":[{"organization-name":"Lexitechno","start-date":date("2000-06-15")}]}
-{"id": 184, "alias": "Moises000184", "name": "Moises Wall", "user-since": datetime("2013-07-20T08:57:30"), "address": {"street":"77 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{525, 602, 285, 803, 197, 287, 330, 618, 699, 439, 542, 267, 725, 61, 866 }}, "employment":[{"organization-name":"Sancone","start-date":date("2011-04-23")}]}
-{"id": 185, "alias": "Terrence000185", "name": "Terrence Schreckengost", "user-since": datetime("2007-07-04T04:03:14"), "address": {"street":"81 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{313, 404, 885, 686, 659, 88, 577, 491, 869, 162, 769, 12, 708, 202, 356, 79, 723, 49 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2001-08-16")}]}
-{"id": 186, "alias": "Lajuana000186", "name": "Lajuana Baughman", "user-since": datetime("2010-03-25T19:07:25"), "address": {"street":"70 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{795, 745, 32, 849, 478, 413 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2007-01-01"),"end-date":date("2007-11-28")}]}
-{"id": 187, "alias": "Rodger000187", "name": "Rodger Roose", "user-since": datetime("2010-02-26T07:23:17"), "address": {"street":"27 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{317, 738, 838, 45, 780, 186, 830, 360, 535, 299, 239, 537, 744 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2000-05-24")}]}
-{"id": 188, "alias": "Elmer000188", "name": "Elmer Wortman", "user-since": datetime("2012-01-07T09:20:09"), "address": {"street":"70 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{17, 781, 270, 806, 315, 833, 205, 271, 648, 491, 432, 398, 836, 27, 312, 434, 110, 227, 885, 285, 873, 257 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2009-02-21"),"end-date":date("2011-09-08")}]}
-{"id": 189, "alias": "Argelia000189", "name": "Argelia Coates", "user-since": datetime("2009-08-25T19:54:44"), "address": {"street":"4 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{753, 801, 169, 669, 70, 540, 650, 40, 309, 867, 85, 203, 869, 118 }}, "employment":[{"organization-name":"silfind","start-date":date("2010-09-03")}]}
-{"id": 190, "alias": "Stephen000190", "name": "Stephen Shallenberger", "user-since": datetime("2010-01-20T10:10:16"), "address": {"street":"10 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{214, 629, 519, 422 }}, "employment":[{"organization-name":"silfind","start-date":date("2003-01-13")}]}
-{"id": 191, "alias": "Mellie000191", "name": "Mellie Lalty", "user-since": datetime("2005-04-10T15:52:50"), "address": {"street":"41 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{819, 771, 327, 733, 87, 246, 415, 655, 221, 682, 24, 516, 830, 425, 251, 818, 524 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2011-02-25"),"end-date":date("2011-12-12")}]}
-{"id": 192, "alias": "Camie000192", "name": "Camie Coveney", "user-since": datetime("2009-10-22T13:58:10"), "address": {"street":"5 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{829, 306, 334, 416, 510, 99, 816 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2003-03-02"),"end-date":date("2003-09-19")}]}
-{"id": 193, "alias": "Amilia000193", "name": "Amilia Stiffey", "user-since": datetime("2012-09-06T00:36:16"), "address": {"street":"83 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{123, 476, 444, 803, 284, 769, 166, 499, 429, 475, 888, 687, 468, 550, 899, 150, 225, 458, 338, 442, 538, 666, 252, 603 }}, "employment":[{"organization-name":"Hot-tech","start-date":date("2000-03-21")}]}
-{"id": 194, "alias": "Merry000194", "name": "Merry Boyer", "user-since": datetime("2008-01-22T00:33:19"), "address": {"street":"44 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{656, 202, 500, 380, 729, 486, 159, 745, 31, 268 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2007-02-08"),"end-date":date("2009-05-27")}]}
-{"id": 195, "alias": "Vance000195", "name": "Vance Wood", "user-since": datetime("2007-05-12T22:24:12"), "address": {"street":"82 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{882, 374, 600, 276, 196, 290, 233, 850, 535, 68, 630, 852, 607, 749, 693, 396, 615, 889, 44 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2002-02-26")}]}
-{"id": 196, "alias": "Harrison000196", "name": "Harrison Brindle", "user-since": datetime("2007-07-17T13:28:58"), "address": {"street":"8 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{261, 243, 754, 874, 118, 174, 298, 75, 29, 8, 161 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2005-04-01"),"end-date":date("2007-05-15")}]}
-{"id": 197, "alias": "Kristie000197", "name": "Kristie Dennis", "user-since": datetime("2010-05-04T10:10:10"), "address": {"street":"76 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{441, 639, 867, 855, 652 }}, "employment":[{"organization-name":"highfax","start-date":date("2010-07-16"),"end-date":date("2011-05-20")}]}
-{"id": 198, "alias": "Shantel000198", "name": "Shantel Ling", "user-since": datetime("2006-06-20T02:07:35"), "address": {"street":"76 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{876, 269, 673, 855, 516, 20, 101, 828, 558, 384, 898, 387, 424, 97, 198, 634, 486, 493, 550, 376, 699, 663, 52 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2007-10-05")}]}
-{"id": 199, "alias": "Miquel000199", "name": "Miquel Wilkerson", "user-since": datetime("2012-01-18T04:07:54"), "address": {"street":"96 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{824 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2007-12-15")}]}
-{"id": 200, "alias": "Lita000200", "name": "Lita Archibald", "user-since": datetime("2007-04-03T13:06:42"), "address": {"street":"26 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{603, 719, 131, 414, 454, 30, 549, 232, 211, 263, 740, 346, 742, 143, 622, 611, 67, 894, 786, 106 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2003-08-05"),"end-date":date("2004-12-09")}]}
-{"id": 201, "alias": "Archie000201", "name": "Archie Philbrick", "user-since": datetime("2011-09-06T06:21:57"), "address": {"street":"37 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{896, 394, 834, 193, 468, 648, 100, 391, 895 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2012-05-22"),"end-date":date("2012-07-04")}]}
-{"id": 202, "alias": "Tyrese000202", "name": "Tyrese Thorley", "user-since": datetime("2012-04-11T10:31:50"), "address": {"street":"5 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{559, 790, 702, 109, 729, 564, 169, 246, 785, 311, 505, 793, 139, 678, 361, 333, 119, 888, 695 }}, "employment":[{"organization-name":"physcane","start-date":date("2011-04-21")}]}
-{"id": 203, "alias": "Paise000203", "name": "Paise Eisenmann", "user-since": datetime("2013-12-02T09:16:49"), "address": {"street":"32 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{583, 684, 481, 462, 596, 716, 390, 636, 250, 790, 361, 771, 108, 166, 133, 229, 343, 545, 671, 763, 160, 731, 27, 658 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2012-08-26")}]}
-{"id": 204, "alias": "Adam000204", "name": "Adam Graff", "user-since": datetime("2009-05-11T18:16:10"), "address": {"street":"60 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{722, 395, 757, 355, 153, 259, 232, 441, 872, 393, 42, 404, 856, 392, 836, 486, 116 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2010-11-24"),"end-date":date("2011-01-21")}]}
-{"id": 205, "alias": "Marlyn000205", "name": "Marlyn Highlands", "user-since": datetime("2008-05-02T00:14:25"), "address": {"street":"50 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{262, 332, 6, 570, 712, 137 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2003-02-03")}]}
-{"id": 206, "alias": "Newt000206", "name": "Newt Kava", "user-since": datetime("2013-07-09T18:16:06"), "address": {"street":"17 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{727, 249, 719, 11, 36, 107 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2000-02-15")}]}
-{"id": 207, "alias": "Dortha000207", "name": "Dortha Callison", "user-since": datetime("2009-08-06T01:07:33"), "address": {"street":"19 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{528, 279, 587, 431, 814, 733, 58, 229, 414, 349, 447, 582, 651, 491, 310, 688, 407, 546, 586, 889 }}, "employment":[{"organization-name":"jaydax","start-date":date("2006-12-20")}]}
-{"id": 208, "alias": "Shakira000208", "name": "Shakira Poorbaugh", "user-since": datetime("2013-12-13T20:01:39"), "address": {"street":"36 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{180, 420, 831, 310, 52, 695, 609, 581, 291, 590, 884, 490, 345 }}, "employment":[{"organization-name":"Indiex","start-date":date("2011-07-28")}]}
-{"id": 209, "alias": "Jewel000209", "name": "Jewel Stern", "user-since": datetime("2008-02-18T12:32:31"), "address": {"street":"100 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{37, 817, 250, 30, 847, 204, 260, 608, 47, 865, 523, 244, 469, 272, 194, 706 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2006-05-05"),"end-date":date("2007-04-11")}]}
-{"id": 210, "alias": "Leo000210", "name": "Leo Carter", "user-since": datetime("2007-09-04T17:53:18"), "address": {"street":"8 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{535, 304, 10, 706, 502, 372, 149, 280, 247, 418, 193, 576, 300, 607, 431, 462, 781, 686, 813, 523, 699, 796, 869 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2006-10-23"),"end-date":date("2011-01-26")}]}
-{"id": 211, "alias": "Deonne000211", "name": "Deonne Steiner", "user-since": datetime("2012-04-10T04:09:23"), "address": {"street":"70 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{193, 255, 551, 181, 575, 382, 621, 613, 260, 325, 266, 636, 603, 132, 352, 806, 431, 815, 238, 682, 651 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2004-12-14")}]}
-{"id": 212, "alias": "Alphonzo000212", "name": "Alphonzo Pycroft", "user-since": datetime("2012-09-14T22:03:27"), "address": {"street":"40 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{164, 748, 776, 536, 608, 302, 618, 353, 283, 95, 265, 345, 244, 600, 39, 521, 229, 67, 589, 529, 84, 534 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2012-07-16"),"end-date":date("2012-07-23")}]}
-{"id": 213, "alias": "America000213", "name": "America Gronko", "user-since": datetime("2010-04-20T04:18:43"), "address": {"street":"55 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{45, 273, 487, 789, 578, 899, 739, 633, 707, 447, 475 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2012-04-19")}]}
-{"id": 214, "alias": "Dean000214", "name": "Dean Jackson", "user-since": datetime("2011-06-13T06:48:40"), "address": {"street":"29 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{840, 472, 466, 96 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2006-07-07")}]}
-{"id": 215, "alias": "Leola000215", "name": "Leola Bruxner", "user-since": datetime("2012-12-28T07:01:22"), "address": {"street":"23 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{634, 774, 825, 247, 156, 141, 482, 396, 885, 530, 548, 363, 390, 778, 127, 293 }}, "employment":[{"organization-name":"Newphase","start-date":date("2009-07-09")}]}
-{"id": 216, "alias": "Ted000216", "name": "Ted Edwards", "user-since": datetime("2008-01-19T01:04:15"), "address": {"street":"41 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{811, 814, 513, 224, 225, 456, 866, 256, 202, 460, 466, 768, 500, 386, 588, 278, 56 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2005-04-09"),"end-date":date("2009-09-18")}]}
-{"id": 217, "alias": "Helga000217", "name": "Helga Rose", "user-since": datetime("2005-04-24T04:20:54"), "address": {"street":"91 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{844, 562, 861, 91, 317, 675, 432, 296, 724, 678, 530, 567, 538 }}, "employment":[{"organization-name":"Doncare","start-date":date("2000-03-06")}]}
-{"id": 218, "alias": "Maura000218", "name": "Maura Strickland", "user-since": datetime("2009-06-02T19:09:27"), "address": {"street":"65 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{730, 869, 569, 588, 584 }}, "employment":[{"organization-name":"Hot-tech","start-date":date("2003-08-06")}]}
-{"id": 219, "alias": "Isabelle000219", "name": "Isabelle Coughenour", "user-since": datetime("2013-01-08T04:32:54"), "address": {"street":"72 Third Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{698, 447, 465, 89, 578, 41, 811, 17, 850 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2010-03-23"),"end-date":date("2011-08-16")}]}
-{"id": 220, "alias": "Shawnee000220", "name": "Shawnee Brinigh", "user-since": datetime("2009-03-05T02:14:20"), "address": {"street":"30 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{142, 284, 833, 241, 106, 516, 335 }}, "employment":[{"organization-name":"Quoline","start-date":date("2001-04-20")}]}
-{"id": 221, "alias": "Luvenia000221", "name": "Luvenia Bailey", "user-since": datetime("2011-06-22T16:00:45"), "address": {"street":"36 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{487, 349, 324, 241, 725, 98, 777, 13, 817, 429, 332, 584, 306, 11, 146, 796 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2011-04-26"),"end-date":date("2011-04-26")}]}
-{"id": 222, "alias": "Nigella000222", "name": "Nigella Dennis", "user-since": datetime("2014-03-22T13:31:17"), "address": {"street":"41 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{308, 631 }}, "employment":[{"organization-name":"Solfix","start-date":date("2004-08-02")}]}
-{"id": 223, "alias": "Randi000223", "name": "Randi Jyllian", "user-since": datetime("2012-03-27T14:15:03"), "address": {"street":"26 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{464 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2003-02-28")}]}
-{"id": 224, "alias": "Aileen000224", "name": "Aileen Elliott", "user-since": datetime("2014-02-14T13:47:13"), "address": {"street":"29 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{270, 823, 774, 451, 669, 745, 580, 432, 319, 737, 37, 465, 532, 113, 260, 642, 882, 220, 629, 367, 299, 224 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2007-10-16"),"end-date":date("2010-11-03")}]}
-{"id": 225, "alias": "Jed000225", "name": "Jed Hector", "user-since": datetime("2014-04-24T20:00:18"), "address": {"street":"23 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{894, 428, 599, 330 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2002-09-18")}]}
-{"id": 226, "alias": "Sonny000226", "name": "Sonny Hobbs", "user-since": datetime("2012-09-01T14:23:24"), "address": {"street":"75 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{335, 450, 26, 438, 644, 375 }}, "employment":[{"organization-name":"ganjalax","start-date":date("2000-05-11"),"end-date":date("2002-09-23")}]}
-{"id": 227, "alias": "Annette000227", "name": "Annette Wickes", "user-since": datetime("2009-11-03T19:36:12"), "address": {"street":"62 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{79, 175, 431, 313, 274, 444 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2010-02-09"),"end-date":date("2011-08-20")}]}
-{"id": 228, "alias": "Bernadine000228", "name": "Bernadine Burris", "user-since": datetime("2014-06-27T13:12:01"), "address": {"street":"85 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{138, 661, 227, 741, 281, 476, 638, 134, 576, 187, 766, 804 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2009-08-02"),"end-date":date("2009-01-25")}]}
-{"id": 229, "alias": "Kieth000229", "name": "Kieth Taylor", "user-since": datetime("2013-05-20T12:41:54"), "address": {"street":"73 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{559, 488 }}, "employment":[{"organization-name":"itlab","start-date":date("2005-04-24")}]}
-{"id": 230, "alias": "Katrice000230", "name": "Katrice Ironmonger", "user-since": datetime("2010-11-25T10:42:05"), "address": {"street":"16 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{108, 147, 842, 569, 28, 352, 875 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2005-06-17")}]}
-{"id": 231, "alias": "Ricky000231", "name": "Ricky Orner", "user-since": datetime("2008-02-17T12:45:46"), "address": {"street":"63 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{425 }}, "employment":[{"organization-name":"Keytech","start-date":date("2009-02-06")}]}
-{"id": 232, "alias": "Humphry000232", "name": "Humphry Unk", "user-since": datetime("2014-01-22T06:08:36"), "address": {"street":"69 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{446, 580, 278, 386, 19, 108, 401, 289, 472, 100, 478, 449, 251 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2011-11-08"),"end-date":date("2011-11-08")}]}
-{"id": 233, "alias": "Kathrine000233", "name": "Kathrine Zoucks", "user-since": datetime("2013-08-27T17:00:22"), "address": {"street":"94 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{383, 350, 164, 27, 606, 569, 511, 129, 54, 212 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2005-05-16"),"end-date":date("2009-01-14")}]}
-{"id": 234, "alias": "Isiah000234", "name": "Isiah Light", "user-since": datetime("2009-10-15T20:41:17"), "address": {"street":"73 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{592, 144, 298, 540, 521, 133, 228, 589, 148, 616, 595, 322, 825, 411, 313, 468, 75, 886 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2000-04-06")}]}
-{"id": 235, "alias": "Tena000235", "name": "Tena Sloan", "user-since": datetime("2008-06-03T21:44:18"), "address": {"street":"84 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{271, 607, 438, 92, 533, 427, 772, 480, 12, 776, 865, 881 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2006-12-01"),"end-date":date("2008-10-06")}]}
-{"id": 236, "alias": "Nichelle000236", "name": "Nichelle Boyer", "user-since": datetime("2012-02-08T19:19:13"), "address": {"street":"85 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{856, 61, 435, 854, 238, 383, 610, 685, 7, 665, 52, 808, 495, 6, 39, 207, 314, 119, 236, 439, 859 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2007-10-09")}]}
-{"id": 237, "alias": "Pamila000237", "name": "Pamila Lester", "user-since": datetime("2012-08-10T02:54:22"), "address": {"street":"43 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{248, 372, 582, 866, 482, 878, 798, 572, 568, 696, 129, 504, 346, 361, 253, 226, 771, 667, 312 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2007-06-28")}]}
-{"id": 238, "alias": "Valentin000238", "name": "Valentin Weinstein", "user-since": datetime("2010-09-21T01:19:47"), "address": {"street":"56 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{813, 139, 357, 445, 454, 90, 613, 545, 401, 83, 793, 715, 273, 729, 866, 534, 853, 508, 664, 246, 443, 577, 154, 774 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2011-01-20"),"end-date":date("2011-09-28")}]}
-{"id": 239, "alias": "Lux000239", "name": "Lux Howe", "user-since": datetime("2006-05-02T03:00:26"), "address": {"street":"55 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{18, 895, 102, 501, 404, 108, 661, 546, 758, 725, 270 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2006-02-14")}]}
-{"id": 240, "alias": "Kalysta000240", "name": "Kalysta Bonner", "user-since": datetime("2008-10-03T00:03:08"), "address": {"street":"36 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{134, 764, 490, 407, 91, 485, 28, 517, 226, 684, 891, 122, 83, 90, 626, 224, 291, 41, 647 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2006-10-17"),"end-date":date("2009-11-19")}]}
-{"id": 241, "alias": "Dawn000241", "name": "Dawn Yates", "user-since": datetime("2005-06-16T07:07:56"), "address": {"street":"53 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{573, 174, 420, 767, 583, 773, 215, 44, 883, 620, 342, 141, 232, 54, 680, 546, 624, 419, 126 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2010-06-19"),"end-date":date("2010-01-06")}]}
-{"id": 242, "alias": "Chantal000242", "name": "Chantal Williams", "user-since": datetime("2013-01-09T03:05:35"), "address": {"street":"11 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{738 }}, "employment":[{"organization-name":"linedexon","start-date":date("2005-10-20")}]}
-{"id": 243, "alias": "Summer000243", "name": "Summer Whittier", "user-since": datetime("2012-07-20T08:17:05"), "address": {"street":"7 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{577, 843, 98, 897, 882, 608, 900, 69, 791, 429, 896, 181, 653, 864, 173, 571, 602, 860, 312, 199, 448 }}, "employment":[{"organization-name":"Goldcity","start-date":date("2001-06-27")}]}
-{"id": 244, "alias": "Kathlene000244", "name": "Kathlene Ashbaugh", "user-since": datetime("2009-10-24T00:42:32"), "address": {"street":"26 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{309, 807, 628, 461, 712, 661, 889, 140, 506, 479, 369, 493, 72, 749, 529, 498, 393 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2002-06-15"),"end-date":date("2008-05-07")}]}
-{"id": 245, "alias": "Josiah000245", "name": "Josiah James", "user-since": datetime("2007-07-17T06:22:52"), "address": {"street":"94 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{628, 366 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2012-06-10")}]}
-{"id": 246, "alias": "Haydee000246", "name": "Haydee Chapman", "user-since": datetime("2007-12-12T06:24:20"), "address": {"street":"85 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{537, 386, 97, 48, 459, 203, 331, 138, 635, 752, 571, 334, 171, 362, 644, 445, 729, 539 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2009-03-22")}]}
-{"id": 247, "alias": "James000247", "name": "James Ring", "user-since": datetime("2014-08-12T23:48:37"), "address": {"street":"86 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{603, 275, 138, 67, 565, 370, 100, 595, 619, 244, 170, 558, 200, 775, 349, 267, 656, 294 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2006-09-21")}]}
-{"id": 248, "alias": "Virgil000248", "name": "Virgil Armitage", "user-since": datetime("2007-09-09T15:04:05"), "address": {"street":"63 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{887, 4, 99, 202, 746, 605 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2003-05-19"),"end-date":date("2008-07-24")}]}
-{"id": 249, "alias": "Sophia000249", "name": "Sophia Sell", "user-since": datetime("2006-06-19T10:25:22"), "address": {"street":"14 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{247, 361, 128, 545, 114, 872, 206, 736, 848, 765, 828, 586, 301, 268, 87, 155, 19, 373, 129, 596, 773 }}, "employment":[{"organization-name":"Statcode","start-date":date("2000-01-04")}]}
-{"id": 250, "alias": "Pen000250", "name": "Pen Gronko", "user-since": datetime("2011-09-19T06:46:25"), "address": {"street":"65 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{125, 584, 672, 587, 391, 316, 210, 602, 304 }}, "employment":[{"organization-name":"over-it","start-date":date("2012-07-28")}]}
-{"id": 251, "alias": "Leland000251", "name": "Leland Lacon", "user-since": datetime("2009-01-07T14:14:07"), "address": {"street":"3 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{778, 398, 691, 336, 306, 775, 526 }}, "employment":[{"organization-name":"strongex","start-date":date("2010-07-08")}]}
-{"id": 252, "alias": "Joann000252", "name": "Joann Coates", "user-since": datetime("2005-04-19T17:52:43"), "address": {"street":"20 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{333, 858, 321, 276, 56, 636, 623, 79, 4, 787, 39, 310, 190, 60, 355, 691 }}, "employment":[{"organization-name":"physcane","start-date":date("2009-12-05")}]}
-{"id": 253, "alias": "Meda000253", "name": "Meda Fitzgerald", "user-since": datetime("2008-03-08T21:11:18"), "address": {"street":"40 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"itlab","start-date":date("2008-04-22")}]}
-{"id": 254, "alias": "Jodi000254", "name": "Jodi Joyce", "user-since": datetime("2010-06-28T22:36:43"), "address": {"street":"7 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{571, 701, 64, 88, 54, 6, 473, 388, 238, 457, 331, 898, 239, 881, 56, 221, 345, 480, 162, 234, 321 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2004-07-11"),"end-date":date("2006-12-20")}]}
-{"id": 255, "alias": "Rima000255", "name": "Rima Bonner", "user-since": datetime("2006-04-14T14:12:06"), "address": {"street":"43 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{604 }}, "employment":[{"organization-name":"Xx-drill","start-date":date("2008-08-13")}]}
-{"id": 256, "alias": "Yong000256", "name": "Yong Mcmichaels", "user-since": datetime("2010-08-23T16:32:04"), "address": {"street":"3 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Quoline","start-date":date("2003-10-06")}]}
-{"id": 257, "alias": "Avalon000257", "name": "Avalon Turzanski", "user-since": datetime("2014-06-04T13:07:02"), "address": {"street":"8 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{33, 390, 149, 857, 587, 611, 342, 557 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2006-03-02"),"end-date":date("2010-12-26")}]}
-{"id": 258, "alias": "Valarie000258", "name": "Valarie Ashbaugh", "user-since": datetime("2008-04-08T09:47:48"), "address": {"street":"76 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{342, 321, 679, 385, 279, 470, 500, 8, 400, 55, 517, 192, 17, 712, 59, 899, 736, 530, 842, 548, 136, 206, 283 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2000-02-05")}]}
-{"id": 259, "alias": "Clancy000259", "name": "Clancy Logue", "user-since": datetime("2007-08-15T19:04:21"), "address": {"street":"67 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{882, 331, 557, 300 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2000-12-28"),"end-date":date("2008-07-15")}]}
-{"id": 260, "alias": "Ernest000260", "name": "Ernest Guess", "user-since": datetime("2011-10-12T08:03:21"), "address": {"street":"91 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{453, 26 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2004-02-19"),"end-date":date("2011-08-26")}]}
-{"id": 261, "alias": "Irwin000261", "name": "Irwin Oppie", "user-since": datetime("2006-03-15T03:53:14"), "address": {"street":"61 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{730, 214 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2010-09-06"),"end-date":date("2011-02-12")}]}
-{"id": 262, "alias": "Rebecca000262", "name": "Rebecca Mckee", "user-since": datetime("2008-04-02T04:10:53"), "address": {"street":"18 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{557, 602, 246, 230, 799, 844, 500, 559, 186, 124, 343, 391, 183, 302, 7, 434, 47, 732, 410, 510, 158 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2010-02-26"),"end-date":date("2010-09-05")}]}
-{"id": 263, "alias": "Walt000263", "name": "Walt Whishaw", "user-since": datetime("2008-09-01T02:01:12"), "address": {"street":"25 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{682, 882, 797, 513, 264, 540, 80, 39, 47, 512, 484, 841, 567, 787, 127, 576, 360, 345, 433 }}, "employment":[{"organization-name":"Solophase","start-date":date("2008-10-19"),"end-date":date("2010-01-03")}]}
-{"id": 264, "alias": "Hisako000264", "name": "Hisako Warrick", "user-since": datetime("2010-09-19T21:53:13"), "address": {"street":"78 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{215, 708, 881, 269, 48, 39, 261, 806, 444, 355, 423, 549 }}, "employment":[{"organization-name":"Newphase","start-date":date("2009-10-11")}]}
-{"id": 265, "alias": "Augusta000265", "name": "Augusta Zoucks", "user-since": datetime("2011-06-20T05:37:46"), "address": {"street":"19 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{853, 359, 269, 214, 94, 575, 624 }}, "employment":[{"organization-name":"Solophase","start-date":date("2008-01-18")}]}
-{"id": 266, "alias": "Slyvia000266", "name": "Slyvia Williamson", "user-since": datetime("2014-03-18T09:14:27"), "address": {"street":"11 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{67, 183, 579 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2005-07-17"),"end-date":date("2008-12-01")}]}
-{"id": 267, "alias": "Arminda000267", "name": "Arminda Reighner", "user-since": datetime("2008-05-28T12:34:03"), "address": {"street":"60 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{371, 439, 272, 651, 528, 319 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2012-02-07")}]}
-{"id": 268, "alias": "Raven000268", "name": "Raven Auman", "user-since": datetime("2010-05-08T11:10:39"), "address": {"street":"67 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{864, 714, 411, 402, 263, 519, 561, 759, 660, 514, 860, 704, 447, 880, 206, 811 }}, "employment":[{"organization-name":"Inchex","start-date":date("2003-01-22")}]}
-{"id": 269, "alias": "Debera000269", "name": "Debera Olphert", "user-since": datetime("2013-08-10T04:13:37"), "address": {"street":"37 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{129, 374, 472, 641, 371, 529 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2012-07-24")}]}
-{"id": 270, "alias": "Jordon000270", "name": "Jordon Knapenberger", "user-since": datetime("2012-02-26T04:36:56"), "address": {"street":"32 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{316, 250, 795, 207, 501, 439, 840, 571, 3, 17 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2005-09-19"),"end-date":date("2007-12-01")}]}
-{"id": 271, "alias": "Luigi000271", "name": "Luigi Fiscina", "user-since": datetime("2010-05-23T07:26:48"), "address": {"street":"87 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{796, 649, 170, 87, 154, 157, 879, 334 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2003-05-06"),"end-date":date("2006-06-08")}]}
-{"id": 272, "alias": "Lalo000272", "name": "Lalo Batten", "user-since": datetime("2012-06-11T12:04:03"), "address": {"street":"75 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{808, 369, 741, 751, 117, 184, 22, 444, 795, 630, 604, 585, 685, 54, 223, 900, 850, 490, 120, 417, 216, 758 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2007-09-24")}]}
-{"id": 273, "alias": "Tanisha000273", "name": "Tanisha Moffat", "user-since": datetime("2005-01-18T13:22:07"), "address": {"street":"81 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{387 }}, "employment":[{"organization-name":"linedexon","start-date":date("2010-01-22")}]}
-{"id": 274, "alias": "Isolda000274", "name": "Isolda Kadel", "user-since": datetime("2010-11-23T16:06:47"), "address": {"street":"71 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{557 }}, "employment":[{"organization-name":"Goldcity","start-date":date("2008-05-21")}]}
-{"id": 275, "alias": "Adalberto000275", "name": "Adalberto Guest", "user-since": datetime("2007-07-22T21:02:45"), "address": {"street":"79 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{646, 554, 861, 721, 482, 746, 524, 452, 391 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2002-09-04")}]}
-{"id": 276, "alias": "Homer000276", "name": "Homer Glover", "user-since": datetime("2011-01-27T13:33:00"), "address": {"street":"79 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{34, 399, 421, 499, 116, 886, 879, 58, 43, 235, 128, 426, 900, 353, 684, 242, 155 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2001-11-04")}]}
-{"id": 277, "alias": "Stevie000277", "name": "Stevie Leslie", "user-since": datetime("2009-09-14T11:54:52"), "address": {"street":"86 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{472, 38, 37, 529, 260, 852, 66, 695, 201, 88, 835, 54, 259, 246, 429, 51, 193, 245, 391 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2004-07-23"),"end-date":date("2007-05-10")}]}
-{"id": 278, "alias": "Guadalupe000278", "name": "Guadalupe Enderly", "user-since": datetime("2005-07-11T18:45:23"), "address": {"street":"97 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{310, 82, 432, 368, 831, 269, 857, 134, 841, 557, 685, 693, 150, 105 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2012-03-01")}]}
-{"id": 279, "alias": "Tena000279", "name": "Tena Newlove", "user-since": datetime("2014-08-03T03:19:59"), "address": {"street":"2 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{495, 299, 463, 162, 570, 399, 8, 807 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2001-03-27"),"end-date":date("2002-11-12")}]}
-{"id": 280, "alias": "Maya000280", "name": "Maya Magor", "user-since": datetime("2013-09-08T08:22:02"), "address": {"street":"1 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{691, 106, 331, 767, 660, 466, 838, 247, 771, 684, 344, 299 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2005-09-24")}]}
-{"id": 281, "alias": "Eliseo000281", "name": "Eliseo Willcox", "user-since": datetime("2006-03-14T02:51:14"), "address": {"street":"76 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2012-01-25")}]}
-{"id": 282, "alias": "Cherri000282", "name": "Cherri Butt", "user-since": datetime("2008-07-28T04:38:43"), "address": {"street":"68 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{114, 207, 654, 623 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2007-06-06"),"end-date":date("2010-03-20")}]}
-{"id": 283, "alias": "Herb000283", "name": "Herb Simpson", "user-since": datetime("2009-07-06T10:52:26"), "address": {"street":"95 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{119, 727, 286, 542, 560, 805, 295, 223, 290, 493, 153, 832, 0, 535 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2011-05-27"),"end-date":date("2011-09-20")}]}
-{"id": 284, "alias": "Courtney000284", "name": "Courtney Howard", "user-since": datetime("2010-07-21T18:28:44"), "address": {"street":"53 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{794, 109, 633, 145 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2011-07-26"),"end-date":date("2011-05-16")}]}
-{"id": 285, "alias": "Liz000285", "name": "Liz Beard", "user-since": datetime("2010-10-26T21:25:13"), "address": {"street":"56 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{716, 694, 720, 856, 573, 480, 425, 538, 312, 855, 788, 340, 114, 238, 204, 44, 387, 213, 705, 119, 785, 748 }}, "employment":[{"organization-name":"Sublamdox","start-date":date("2008-03-25"),"end-date":date("2011-12-13")}]}
-{"id": 286, "alias": "Nena000286", "name": "Nena Garland", "user-since": datetime("2006-01-26T18:28:43"), "address": {"street":"84 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{645, 21, 309, 628, 607, 352, 835, 513, 849, 871, 475, 185, 427, 529, 282, 830, 596, 549, 892, 839, 498, 614, 485 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2008-07-28"),"end-date":date("2008-10-14")}]}
-{"id": 287, "alias": "Shela000287", "name": "Shela Fonblanque", "user-since": datetime("2009-07-02T15:38:23"), "address": {"street":"78 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{605, 808, 604, 170, 657, 393, 240, 149 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2008-11-13")}]}
-{"id": 288, "alias": "Clinton000288", "name": "Clinton Finck", "user-since": datetime("2012-07-09T13:53:15"), "address": {"street":"98 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{219, 78, 540, 669, 408, 264 }}, "employment":[{"organization-name":"Goldcity","start-date":date("2006-10-11")}]}
-{"id": 289, "alias": "Marlene000289", "name": "Marlene Lafortune", "user-since": datetime("2014-03-05T16:47:57"), "address": {"street":"78 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{627, 378, 772, 783, 116, 678, 361, 295 }}, "employment":[{"organization-name":"Freshfix","start-date":date("2009-01-24"),"end-date":date("2009-03-02")}]}
-{"id": 290, "alias": "August000290", "name": "August Eiford", "user-since": datetime("2011-05-08T23:48:35"), "address": {"street":"85 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{358, 428, 755, 772, 682, 577, 239, 332, 248, 325, 862, 16, 9, 422, 657, 555, 263, 402, 279, 631, 256, 866, 792, 88 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2005-11-07"),"end-date":date("2008-05-07")}]}
-{"id": 291, "alias": "Amanda000291", "name": "Amanda Brinigh", "user-since": datetime("2010-08-11T22:09:04"), "address": {"street":"45 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{843, 520, 190 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2006-11-23"),"end-date":date("2006-02-17")}]}
-{"id": 292, "alias": "Marleen000292", "name": "Marleen Dealtry", "user-since": datetime("2014-01-10T06:51:48"), "address": {"street":"82 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{720, 438, 450, 804, 777, 886, 857, 774, 2, 756, 90, 126, 380 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2001-07-17"),"end-date":date("2002-08-26")}]}
-{"id": 293, "alias": "Neal000293", "name": "Neal Kiefer", "user-since": datetime("2013-12-06T14:54:13"), "address": {"street":"39 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{286, 277 }}, "employment":[{"organization-name":"over-it","start-date":date("2004-05-11")}]}
-{"id": 294, "alias": "Winifred000294", "name": "Winifred Seidner", "user-since": datetime("2012-11-07T00:27:02"), "address": {"street":"63 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{36, 413, 899, 706, 143, 553, 593, 638, 526 }}, "employment":[{"organization-name":"Inchex","start-date":date("2000-09-18"),"end-date":date("2001-08-03")}]}
-{"id": 295, "alias": "Damien000295", "name": "Damien Porter", "user-since": datetime("2013-02-22T10:16:01"), "address": {"street":"50 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{513, 682, 232, 293, 782, 578, 843, 483, 43, 821, 122, 322, 127, 805, 278, 554, 17, 93, 859, 30, 9, 335, 205, 863 }}, "employment":[{"organization-name":"Streettax","start-date":date("2006-07-16"),"end-date":date("2010-08-01")}]}
-{"id": 296, "alias": "Idelle000296", "name": "Idelle Clewett", "user-since": datetime("2008-12-12T16:18:49"), "address": {"street":"55 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{132, 662, 181, 735, 554, 483, 225, 754, 745, 819, 524, 353 }}, "employment":[{"organization-name":"Doncare","start-date":date("2005-11-14")}]}
-{"id": 297, "alias": "Bennie000297", "name": "Bennie James", "user-since": datetime("2007-01-02T02:31:45"), "address": {"street":"68 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{792 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2011-10-06")}]}
-{"id": 298, "alias": "Nancy000298", "name": "Nancy Whittier", "user-since": datetime("2011-01-25T23:59:12"), "address": {"street":"94 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{275, 711, 428, 738, 3, 611, 409, 174, 768, 796, 529, 378, 287, 833, 277, 803, 199, 167, 632, 337, 373, 9, 136 }}, "employment":[{"organization-name":"Ganjastrip","start-date":date("2007-03-20")}]}
-{"id": 299, "alias": "Mona000299", "name": "Mona Ling", "user-since": datetime("2013-11-05T06:05:37"), "address": {"street":"20 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{146, 82 }}, "employment":[{"organization-name":"Coneflex","start-date":date("2007-05-19"),"end-date":date("2009-12-04")}]}
-{"id": 300, "alias": "Gayle000300", "name": "Gayle Echard", "user-since": datetime("2006-08-13T21:46:32"), "address": {"street":"13 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{440, 578, 602, 270, 698, 714, 550, 638, 683, 267, 667, 623, 615, 61, 60, 271 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2003-06-23")}]}
-{"id": 301, "alias": "Ehtel000301", "name": "Ehtel Hunter", "user-since": datetime("2014-08-02T17:08:28"), "address": {"street":"69 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{812, 57, 810, 664, 230, 419, 554 }}, "employment":[{"organization-name":"Ganjastrip","start-date":date("2008-03-19"),"end-date":date("2008-05-12")}]}
-{"id": 302, "alias": "Jonquil000302", "name": "Jonquil Throckmorton", "user-since": datetime("2012-04-10T17:13:32"), "address": {"street":"14 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{503, 674, 530, 877, 847, 23 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2006-05-09")}]}
-{"id": 303, "alias": "Craig000303", "name": "Craig Hurst", "user-since": datetime("2005-03-14T06:12:53"), "address": {"street":"57 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{631, 850, 881, 852, 608, 441, 178, 793, 227, 432, 130, 695, 468, 819, 147, 794, 109, 834, 251, 53, 550, 636, 319 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2001-01-19"),"end-date":date("2009-12-20")}]}
-{"id": 304, "alias": "Amina000304", "name": "Amina Jyllian", "user-since": datetime("2008-04-03T11:06:40"), "address": {"street":"10 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{834, 267, 122, 529, 655, 858 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2010-05-06")}]}
-{"id": 305, "alias": "Cecil000305", "name": "Cecil Kava", "user-since": datetime("2011-06-17T21:42:41"), "address": {"street":"72 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{293, 644 }}, "employment":[{"organization-name":"Newphase","start-date":date("2002-05-14")}]}
-{"id": 306, "alias": "Dwayne000306", "name": "Dwayne Smail", "user-since": datetime("2007-07-25T08:11:33"), "address": {"street":"47 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{738, 628, 433, 239, 557, 274, 509, 571, 537, 99, 180, 583, 725, 87, 121 }}, "employment":[{"organization-name":"Newphase","start-date":date("2008-02-19")}]}
-{"id": 307, "alias": "Patricia000307", "name": "Patricia Hanford", "user-since": datetime("2009-03-05T22:39:07"), "address": {"street":"18 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{390, 691, 701, 617, 398, 572, 340, 103, 649, 781, 125, 659 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2005-09-23")}]}
-{"id": 308, "alias": "Lilly000308", "name": "Lilly Groah", "user-since": datetime("2007-11-19T04:48:54"), "address": {"street":"64 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{894, 501, 780, 831, 178, 728, 610, 704, 897, 3, 865 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2012-04-03"),"end-date":date("2012-06-06")}]}
-{"id": 309, "alias": "Douglas000309", "name": "Douglas Knapp", "user-since": datetime("2012-09-15T03:59:17"), "address": {"street":"74 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{560, 631, 107, 602, 794, 799, 520, 634, 626, 347, 505, 770, 589, 704, 59, 85, 482, 424, 651, 548, 712, 745 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2005-01-22"),"end-date":date("2009-05-23")}]}
-{"id": 310, "alias": "Boyd000310", "name": "Boyd Wood", "user-since": datetime("2007-06-11T07:02:20"), "address": {"street":"17 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{262, 250, 507, 575, 499, 571, 387, 347, 365, 145, 78 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2005-04-22"),"end-date":date("2007-04-19")}]}
-{"id": 311, "alias": "Chuck000311", "name": "Chuck Lowe", "user-since": datetime("2009-08-20T00:51:23"), "address": {"street":"34 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{600, 597, 647, 109, 347, 81, 168 }}, "employment":[{"organization-name":"Doncare","start-date":date("2005-06-21")}]}
-{"id": 312, "alias": "Audrie000312", "name": "Audrie Neely", "user-since": datetime("2007-02-15T20:55:13"), "address": {"street":"77 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{128, 91, 421, 194, 872, 244, 37, 852, 815, 752, 288, 219, 281, 305 }}, "employment":[{"organization-name":"Sublamdox","start-date":date("2003-02-03")}]}
-{"id": 313, "alias": "Ashlie000313", "name": "Ashlie Blatenberger", "user-since": datetime("2013-10-14T21:57:47"), "address": {"street":"68 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{23, 30, 456, 458, 221, 1, 707, 12, 200, 102 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2000-04-26")}]}
-{"id": 314, "alias": "Marcie000314", "name": "Marcie Lineman", "user-since": datetime("2014-02-01T20:24:55"), "address": {"street":"42 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{727, 865, 4, 92, 730, 460, 154, 300, 176, 840, 122, 184, 722, 209, 127, 520, 719, 517, 807, 491, 467, 492, 202 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2002-04-06"),"end-date":date("2009-09-11")}]}
-{"id": 315, "alias": "Katie000315", "name": "Katie Johann", "user-since": datetime("2010-04-10T01:07:20"), "address": {"street":"62 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{598, 416, 221, 146, 276 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2007-12-07"),"end-date":date("2008-10-16")}]}
-{"id": 316, "alias": "Tilly000316", "name": "Tilly Fleming", "user-since": datetime("2013-04-04T13:47:00"), "address": {"street":"48 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{737, 358, 321, 715, 161, 280, 799, 164, 750, 220, 547 }}, "employment":[{"organization-name":"Doublezone","start-date":date("2007-10-27")}]}
-{"id": 317, "alias": "Monte000317", "name": "Monte Harrow", "user-since": datetime("2013-08-12T15:36:14"), "address": {"street":"50 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{91, 602, 854, 371, 8, 872, 781, 92, 594, 803, 323, 18, 189, 699, 241, 156, 739 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2012-03-22"),"end-date":date("2012-04-23")}]}
-{"id": 318, "alias": "Vincent000318", "name": "Vincent Richter", "user-since": datetime("2008-07-13T00:38:34"), "address": {"street":"69 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{486, 806, 698, 689, 741, 310 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2005-11-11"),"end-date":date("2005-09-09")}]}
-{"id": 319, "alias": "Petula000319", "name": "Petula Spring", "user-since": datetime("2008-05-26T12:48:55"), "address": {"street":"41 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{705, 64, 716, 414, 204, 396, 838, 75, 780, 640, 359, 164, 898, 451, 182, 390 }}, "employment":[{"organization-name":"over-it","start-date":date("2002-09-13"),"end-date":date("2010-03-25")}]}
-{"id": 320, "alias": "Bertie000320", "name": "Bertie Treeby", "user-since": datetime("2010-08-23T05:19:23"), "address": {"street":"80 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{19 }}, "employment":[{"organization-name":"strongex","start-date":date("2004-07-25"),"end-date":date("2007-06-28")}]}
-{"id": 321, "alias": "Darrel000321", "name": "Darrel Shotts", "user-since": datetime("2005-04-02T05:11:38"), "address": {"street":"45 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{625, 485, 232, 675, 314, 411, 815, 213, 234, 260, 114, 370, 752, 844, 164, 548, 149, 575, 359, 610, 178, 406, 247 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2010-06-23")}]}
-{"id": 322, "alias": "Pen000322", "name": "Pen Sachse", "user-since": datetime("2013-01-17T00:33:33"), "address": {"street":"88 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{199, 578, 293, 160, 127 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2001-01-08")}]}
-{"id": 323, "alias": "Carlyle000323", "name": "Carlyle Kellogg", "user-since": datetime("2013-03-24T20:58:22"), "address": {"street":"8 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{789, 265, 894, 594, 370, 11, 633 }}, "employment":[{"organization-name":"tresline","start-date":date("2012-05-27")}]}
-{"id": 324, "alias": "Taylor000324", "name": "Taylor Rose", "user-since": datetime("2010-10-11T22:34:46"), "address": {"street":"79 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{537, 565, 545, 710, 733, 332, 482, 416, 306, 657, 9, 231, 848, 691, 213, 178, 483, 164, 648, 721, 149, 10, 587 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2010-08-12"),"end-date":date("2011-10-11")}]}
-{"id": 325, "alias": "Melitta000325", "name": "Melitta Stone", "user-since": datetime("2013-04-25T18:11:14"), "address": {"street":"7 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{403, 865, 164, 368, 249, 773, 374, 16, 494, 622, 264, 508, 584, 529, 440, 358, 224, 505, 77, 114, 824, 533, 585, 356 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2006-06-23"),"end-date":date("2008-04-11")}]}
-{"id": 326, "alias": "Lenard000326", "name": "Lenard Summy", "user-since": datetime("2014-03-02T15:05:47"), "address": {"street":"18 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{319, 395, 162, 533, 790, 859, 372, 657, 45, 590, 837, 842, 456, 822, 397, 147, 746, 124 }}, "employment":[{"organization-name":"Canline","start-date":date("2003-12-09")}]}
-{"id": 327, "alias": "Mike000327", "name": "Mike Fischer", "user-since": datetime("2014-06-04T05:09:24"), "address": {"street":"92 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{197, 890, 866, 29, 17, 501, 145, 73, 89, 136, 478, 124, 753, 15, 319, 185, 207, 518, 38, 127, 399, 186, 833, 308 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2003-02-22")}]}
-{"id": 328, "alias": "Tad000328", "name": "Tad Mcclymonds", "user-since": datetime("2011-09-25T12:48:19"), "address": {"street":"70 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{147, 476, 686, 586 }}, "employment":[{"organization-name":"Indiex","start-date":date("2010-08-25"),"end-date":date("2011-09-14")}]}
-{"id": 329, "alias": "Maximilian000329", "name": "Maximilian Light", "user-since": datetime("2010-12-16T10:21:09"), "address": {"street":"33 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{830, 385, 895, 200, 63, 146, 152, 694, 691, 843, 409 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2008-03-12")}]}
-{"id": 330, "alias": "Esmond000330", "name": "Esmond Kepple", "user-since": datetime("2011-05-17T09:28:59"), "address": {"street":"47 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{815, 479, 703, 213, 7, 173, 423, 840, 63, 161, 448, 775, 603, 151, 556 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2001-12-05"),"end-date":date("2004-06-13")}]}
-{"id": 331, "alias": "Nia000331", "name": "Nia Hardy", "user-since": datetime("2008-11-07T11:28:47"), "address": {"street":"52 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{787, 188, 204, 380, 150, 744, 20 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2007-04-18")}]}
-{"id": 332, "alias": "Ted000332", "name": "Ted Polson", "user-since": datetime("2009-12-10T18:18:03"), "address": {"street":"68 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{432, 576, 38, 98, 497 }}, "employment":[{"organization-name":"Doncare","start-date":date("2006-01-22")}]}
-{"id": 333, "alias": "Elaine000333", "name": "Elaine Friedline", "user-since": datetime("2009-03-19T16:11:36"), "address": {"street":"42 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{507, 564 }}, "employment":[{"organization-name":"U-ron","start-date":date("2011-02-15")}]}
-{"id": 334, "alias": "Cecilia000334", "name": "Cecilia Wegley", "user-since": datetime("2005-01-16T08:18:34"), "address": {"street":"73 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{331, 499 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2009-03-15"),"end-date":date("2009-02-14")}]}
-{"id": 335, "alias": "Rico000335", "name": "Rico Pratt", "user-since": datetime("2012-04-12T00:50:44"), "address": {"street":"72 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{187, 309, 147, 170, 162 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2005-10-16"),"end-date":date("2006-09-01")}]}
-{"id": 336, "alias": "Yolanda000336", "name": "Yolanda Altman", "user-since": datetime("2013-04-23T04:52:24"), "address": {"street":"97 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{467, 741, 304, 758, 481, 617, 142, 344, 105, 303, 582, 864, 165, 148 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2008-07-13"),"end-date":date("2011-01-06")}]}
-{"id": 337, "alias": "Alvena000337", "name": "Alvena Osteen", "user-since": datetime("2008-10-28T00:51:38"), "address": {"street":"38 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{615, 782, 843, 229, 416, 130, 809, 712, 480, 77 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2010-02-08")}]}
-{"id": 338, "alias": "Luna000338", "name": "Luna Jube", "user-since": datetime("2011-10-04T09:48:34"), "address": {"street":"15 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{535, 499, 554, 160, 528, 705, 679, 545, 618, 615, 322, 18, 219, 115, 143, 492 }}, "employment":[{"organization-name":"Doncare","start-date":date("2005-12-02"),"end-date":date("2008-11-27")}]}
-{"id": 339, "alias": "Krysten000339", "name": "Krysten Bard", "user-since": datetime("2005-12-20T01:44:16"), "address": {"street":"28 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{504, 567, 124, 25 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2001-12-10"),"end-date":date("2001-09-03")}]}
-{"id": 340, "alias": "Maryann000340", "name": "Maryann Cram", "user-since": datetime("2007-12-23T05:09:51"), "address": {"street":"12 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{554 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2000-09-15")}]}
-{"id": 341, "alias": "Fidel000341", "name": "Fidel Errett", "user-since": datetime("2009-08-17T21:13:18"), "address": {"street":"2 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{437, 33, 382, 477, 146 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2006-09-09"),"end-date":date("2011-10-18")}]}
-{"id": 342, "alias": "Concha000342", "name": "Concha Tomey", "user-since": datetime("2008-07-23T00:39:19"), "address": {"street":"89 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{142, 742, 343, 261, 682, 896, 230, 350, 461, 516, 665, 325, 187, 850, 273, 26, 892, 565 }}, "employment":[{"organization-name":"Ganjastrip","start-date":date("2007-07-10")}]}
-{"id": 343, "alias": "Grant000343", "name": "Grant Bennett", "user-since": datetime("2007-11-08T00:28:10"), "address": {"street":"42 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{453, 473, 264, 488, 126, 88, 762, 690, 112, 56, 791, 533, 60, 782, 106, 442 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2001-02-24"),"end-date":date("2002-08-10")}]}
-{"id": 344, "alias": "Phillip000344", "name": "Phillip Ledgerwood", "user-since": datetime("2006-03-18T17:45:03"), "address": {"street":"69 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{201, 901, 822, 236, 756, 272, 261, 114, 490, 470, 601, 611, 883, 321 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2001-02-20")}]}
-{"id": 345, "alias": "Marci000345", "name": "Marci Warner", "user-since": datetime("2014-04-07T18:55:11"), "address": {"street":"49 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{348, 602, 408, 67, 234, 307, 50, 723, 554, 315, 812, 838, 675, 350, 449, 393, 239, 567, 68, 663, 713, 883, 231 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2007-11-02")}]}
-{"id": 346, "alias": "Roderick000346", "name": "Roderick Ratcliff", "user-since": datetime("2014-01-03T06:57:25"), "address": {"street":"33 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{855, 166, 66, 281, 577, 705, 586, 651, 185, 748, 715, 129 }}, "employment":[{"organization-name":"Striptaxon","start-date":date("2004-06-10")}]}
-{"id": 347, "alias": "Keren000347", "name": "Keren Green", "user-since": datetime("2008-07-18T19:03:21"), "address": {"street":"98 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{210, 576, 828, 209, 488, 101, 706, 848, 620, 152, 335, 204, 351, 9, 145, 233 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2001-01-01")}]}
-{"id": 348, "alias": "Deidre000348", "name": "Deidre Kellogg", "user-since": datetime("2009-08-27T12:56:27"), "address": {"street":"49 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{226, 671, 892 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2007-12-15")}]}
-{"id": 349, "alias": "Roger000349", "name": "Roger Stone", "user-since": datetime("2006-12-27T04:04:38"), "address": {"street":"29 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{426, 526, 10, 880, 765, 567, 142, 57, 177, 385, 580, 672, 719, 723 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2006-08-28")}]}
-{"id": 350, "alias": "Luci000350", "name": "Luci Osteen", "user-since": datetime("2013-07-05T01:31:03"), "address": {"street":"33 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{450, 103, 634, 34, 764, 152 }}, "employment":[{"organization-name":"Doncare","start-date":date("2000-02-21")}]}
-{"id": 351, "alias": "Shena000351", "name": "Shena Throckmorton", "user-since": datetime("2007-09-27T11:38:17"), "address": {"street":"3 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{560, 592, 564, 388, 306, 271, 874, 302, 279, 177, 799, 453 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2004-03-07"),"end-date":date("2009-01-26")}]}
-{"id": 352, "alias": "Euna000352", "name": "Euna Prechtl", "user-since": datetime("2007-12-02T08:45:43"), "address": {"street":"27 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{106, 710, 187, 883, 260, 144, 74, 672, 47, 542, 586, 300, 421, 138, 829, 152, 486, 348, 244, 314, 751, 580, 423 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2011-05-26"),"end-date":date("2011-07-12")}]}
-{"id": 353, "alias": "Kalysta000353", "name": "Kalysta Gottwine", "user-since": datetime("2014-07-04T21:48:58"), "address": {"street":"93 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Groovetex","start-date":date("2010-11-12")}]}
-{"id": 354, "alias": "Gina000354", "name": "Gina Schuth", "user-since": datetime("2009-11-14T03:19:49"), "address": {"street":"33 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{825, 300, 860, 486, 302, 242, 369, 337, 734, 846, 244, 431, 255, 490, 271, 735, 331, 450, 687, 316, 388, 597 }}, "employment":[{"organization-name":"Redelectronics","start-date":date("2000-08-09")}]}
-{"id": 355, "alias": "Rolland000355", "name": "Rolland Finlay", "user-since": datetime("2013-12-13T04:52:54"), "address": {"street":"51 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{358, 442, 750, 426 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2003-10-07")}]}
-{"id": 356, "alias": "Elouise000356", "name": "Elouise Snyder", "user-since": datetime("2006-05-10T09:03:22"), "address": {"street":"26 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{147, 277, 756, 20, 833 }}, "employment":[{"organization-name":"geomedia","start-date":date("2003-01-03")}]}
-{"id": 357, "alias": "Cordell000357", "name": "Cordell Whirlow", "user-since": datetime("2014-06-22T18:53:05"), "address": {"street":"3 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{98, 270, 621, 352, 598, 10, 57 }}, "employment":[{"organization-name":"jaydax","start-date":date("2011-10-13")}]}
-{"id": 358, "alias": "Max000358", "name": "Max Gettemy", "user-since": datetime("2013-08-04T01:34:54"), "address": {"street":"7 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{454, 133, 848, 517, 140, 583, 785 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2010-08-12"),"end-date":date("2010-03-15")}]}
-{"id": 359, "alias": "Quincy000359", "name": "Quincy Haile", "user-since": datetime("2006-11-25T10:57:58"), "address": {"street":"81 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{316, 559, 808, 741, 581, 260, 705, 520, 263, 333, 8, 857, 501, 2, 233, 27, 827, 763, 95 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2005-06-13"),"end-date":date("2005-09-16")}]}
-{"id": 360, "alias": "Heron000360", "name": "Heron Hatfield", "user-since": datetime("2014-06-15T19:59:40"), "address": {"street":"1 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{423, 258, 506, 845, 42, 380, 704, 128, 135, 248, 80, 766 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2012-03-23"),"end-date":date("2012-04-09")}]}
-{"id": 361, "alias": "Poppy000361", "name": "Poppy Dean", "user-since": datetime("2009-12-23T21:56:49"), "address": {"street":"86 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{468, 368, 230, 528, 539, 513, 426, 308, 76, 27, 550, 554, 752, 281, 541, 206, 84, 412, 786, 792, 140 }}, "employment":[{"organization-name":"Sancone","start-date":date("2002-02-22"),"end-date":date("2009-04-02")}]}
-{"id": 362, "alias": "Nannie000362", "name": "Nannie Mingle", "user-since": datetime("2013-03-25T05:46:13"), "address": {"street":"18 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{110 }}, "employment":[{"organization-name":"ganjalax","start-date":date("2008-06-21")}]}
-{"id": 363, "alias": "Sherilyn000363", "name": "Sherilyn Gibson", "user-since": datetime("2014-01-14T01:32:23"), "address": {"street":"72 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{358, 530, 821, 336, 297, 498, 404, 175, 343, 68, 745 }}, "employment":[{"organization-name":"Inchex","start-date":date("2000-07-04")}]}
-{"id": 364, "alias": "Nickole000364", "name": "Nickole Bishop", "user-since": datetime("2009-04-27T10:18:04"), "address": {"street":"63 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{403, 62, 630, 304, 160, 644, 809, 119, 858, 535, 165, 786 }}, "employment":[{"organization-name":"linedexon","start-date":date("2009-03-02")}]}
-{"id": 365, "alias": "Ellery000365", "name": "Ellery Simmons", "user-since": datetime("2006-11-08T18:39:04"), "address": {"street":"13 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{137, 882, 718, 110, 890, 783, 591, 553, 251, 119, 643, 66 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2009-04-14"),"end-date":date("2011-04-22")}]}
-{"id": 366, "alias": "Skyler000366", "name": "Skyler Jolce", "user-since": datetime("2014-06-05T10:28:38"), "address": {"street":"32 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{2 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2005-03-28"),"end-date":date("2007-02-08")}]}
-{"id": 367, "alias": "Sly000367", "name": "Sly Lafortune", "user-since": datetime("2014-04-03T20:57:58"), "address": {"street":"48 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{343, 311, 292, 823 }}, "employment":[{"organization-name":"Statcode","start-date":date("2000-03-01")}]}
-{"id": 368, "alias": "Tricia000368", "name": "Tricia Maclagan", "user-since": datetime("2012-11-08T16:38:31"), "address": {"street":"12 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{350, 879, 437 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2010-09-10"),"end-date":date("2011-08-28")}]}
-{"id": 369, "alias": "Bronte000369", "name": "Bronte Swarner", "user-since": datetime("2008-09-24T05:23:41"), "address": {"street":"11 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"U-electrics","start-date":date("2001-05-25")}]}
-{"id": 370, "alias": "Doreen000370", "name": "Doreen Emrick", "user-since": datetime("2011-08-23T06:58:29"), "address": {"street":"61 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{484, 58, 612, 578, 255, 876 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2000-08-11")}]}
-{"id": 371, "alias": "Reynold000371", "name": "Reynold Barrett", "user-since": datetime("2013-05-23T22:34:43"), "address": {"street":"48 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{132, 93 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2006-10-02"),"end-date":date("2008-05-17")}]}
-{"id": 372, "alias": "Trevor000372", "name": "Trevor Hardy", "user-since": datetime("2009-11-28T10:29:22"), "address": {"street":"12 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{358, 185, 874, 363, 21, 889 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2008-08-16")}]}
-{"id": 373, "alias": "Simon000373", "name": "Simon Eckhardstein", "user-since": datetime("2012-01-11T09:07:41"), "address": {"street":"79 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{844, 484, 627, 583, 614, 497, 126, 786, 689, 427, 401, 815, 30, 673, 199, 133, 805 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2003-04-01")}]}
-{"id": 374, "alias": "Sabina000374", "name": "Sabina Caldwell", "user-since": datetime("2009-02-20T02:34:02"), "address": {"street":"6 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{723, 589 }}, "employment":[{"organization-name":"Sublamdox","start-date":date("2007-09-01"),"end-date":date("2007-05-16")}]}
-{"id": 375, "alias": "Ray000375", "name": "Ray Carr", "user-since": datetime("2013-08-16T19:41:23"), "address": {"street":"83 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{50, 841, 109, 867, 409, 207, 148, 99, 424, 447, 751, 289, 61, 177, 658, 270, 676, 603, 284, 785, 374 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2003-08-12")}]}
-{"id": 376, "alias": "Brittany000376", "name": "Brittany Orbell", "user-since": datetime("2010-09-07T02:44:31"), "address": {"street":"23 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{257, 199, 127, 425, 621, 361, 141, 234, 164, 434, 443, 523, 366 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2002-02-03"),"end-date":date("2002-02-14")}]}
-{"id": 377, "alias": "Horatio000377", "name": "Horatio Blaine", "user-since": datetime("2009-07-20T18:43:18"), "address": {"street":"65 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{643, 128, 513 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2004-01-01"),"end-date":date("2005-10-17")}]}
-{"id": 378, "alias": "Arden000378", "name": "Arden Siegrist", "user-since": datetime("2012-11-10T19:27:38"), "address": {"street":"23 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{530, 99, 545, 474, 630 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2009-02-10")}]}
-{"id": 379, "alias": "Molly000379", "name": "Molly Gilman", "user-since": datetime("2008-09-15T07:23:04"), "address": {"street":"56 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{1, 38, 237 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2006-04-21"),"end-date":date("2010-09-12")}]}
-{"id": 380, "alias": "Luanna000380", "name": "Luanna Goldvogel", "user-since": datetime("2010-03-11T12:08:00"), "address": {"street":"85 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{104, 873, 889, 448 }}, "employment":[{"organization-name":"Lexitechno","start-date":date("2001-11-27")}]}
-{"id": 381, "alias": "Krystal000381", "name": "Krystal Blessig", "user-since": datetime("2008-11-03T03:52:37"), "address": {"street":"55 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{453, 284, 112, 296, 804, 510, 304, 312, 186 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2000-10-13"),"end-date":date("2008-09-17")}]}
-{"id": 382, "alias": "Marlin000382", "name": "Marlin Swabey", "user-since": datetime("2009-06-21T04:38:51"), "address": {"street":"27 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{166, 254, 19, 665, 579, 477, 54, 373, 202, 406, 110, 66, 405, 719, 770, 283, 724, 179, 425, 812 }}, "employment":[{"organization-name":"Newfase","start-date":date("2007-10-16")}]}
-{"id": 383, "alias": "Maryvonne000383", "name": "Maryvonne Ludwig", "user-since": datetime("2013-12-12T12:38:50"), "address": {"street":"5 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{490, 543, 244, 176, 639, 23, 238, 462, 96, 755, 765 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2004-02-10")}]}
-{"id": 384, "alias": "Melia000384", "name": "Melia Sanders", "user-since": datetime("2011-02-26T05:00:36"), "address": {"street":"97 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{745, 862, 196, 731, 727, 86, 305, 200, 646, 131, 278, 682, 282, 664, 792, 684, 472, 48, 421, 866 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2003-12-14"),"end-date":date("2010-03-04")}]}
-{"id": 385, "alias": "Kate000385", "name": "Kate Ruch", "user-since": datetime("2014-04-14T00:41:28"), "address": {"street":"2 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{311, 151, 80 }}, "employment":[{"organization-name":"silfind","start-date":date("2000-09-22")}]}
-{"id": 386, "alias": "Annabella000386", "name": "Annabella Wegley", "user-since": datetime("2007-08-28T17:18:56"), "address": {"street":"66 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{54, 84, 301, 340, 481, 788, 229, 1, 854, 806, 467, 385, 651, 22 }}, "employment":[{"organization-name":"Technohow","start-date":date("2002-03-15")}]}
-{"id": 387, "alias": "Lashay000387", "name": "Lashay Biery", "user-since": datetime("2013-07-03T23:06:08"), "address": {"street":"76 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{784, 138, 688, 770, 634, 247, 589 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2011-08-03")}]}
-{"id": 388, "alias": "Florinda000388", "name": "Florinda Buehler", "user-since": datetime("2014-08-07T07:12:04"), "address": {"street":"58 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{282, 149, 397, 82, 762, 547, 92, 109 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2006-02-26")}]}
-{"id": 389, "alias": "Alanis000389", "name": "Alanis Chappel", "user-since": datetime("2010-02-22T20:39:23"), "address": {"street":"48 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{5, 564 }}, "employment":[{"organization-name":"U-ron","start-date":date("2004-07-27")}]}
-{"id": 390, "alias": "Avelina000390", "name": "Avelina Vinsant", "user-since": datetime("2009-07-03T21:41:27"), "address": {"street":"66 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Codetechno","start-date":date("2009-03-25")}]}
-{"id": 391, "alias": "Jospeh000391", "name": "Jospeh Carbaugh", "user-since": datetime("2008-03-24T18:43:35"), "address": {"street":"1 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{155, 221, 291, 796, 126, 834 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2001-05-15")}]}
-{"id": 392, "alias": "Bennie000392", "name": "Bennie Vorrasi", "user-since": datetime("2010-10-09T13:34:07"), "address": {"street":"73 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{208, 849, 900, 108, 797, 783, 220, 403, 653, 885, 610, 235, 652, 149, 574, 431, 293, 361, 770, 206, 246 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2007-08-08"),"end-date":date("2010-07-16")}]}
-{"id": 393, "alias": "Scott000393", "name": "Scott Fair", "user-since": datetime("2007-04-06T02:47:31"), "address": {"street":"27 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{654, 82, 433, 562, 609, 272, 579, 455, 305, 132, 703, 321, 530, 275, 407, 594, 622, 144, 370 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2001-09-09"),"end-date":date("2003-07-28")}]}
-{"id": 394, "alias": "Quinn000394", "name": "Quinn Ironmonger", "user-since": datetime("2005-07-18T19:09:53"), "address": {"street":"58 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{427, 417, 136, 306, 362, 361, 239, 521, 860, 602, 805, 273, 605 }}, "employment":[{"organization-name":"silfind","start-date":date("2008-03-20"),"end-date":date("2010-09-09")}]}
-{"id": 395, "alias": "Galina000395", "name": "Galina Barkley", "user-since": datetime("2014-08-21T19:40:33"), "address": {"street":"95 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{631, 505, 862, 718, 173, 756, 713, 632, 589, 67, 279, 700, 416, 891, 896, 85, 318, 139, 794, 573 }}, "employment":[{"organization-name":"Newphase","start-date":date("2009-12-07")}]}
-{"id": 396, "alias": "Emely000396", "name": "Emely Hector", "user-since": datetime("2010-05-13T12:31:52"), "address": {"street":"70 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{602, 82, 214, 610 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2012-01-18")}]}
-{"id": 397, "alias": "Kasandra000397", "name": "Kasandra Bashline", "user-since": datetime("2010-05-10T15:23:01"), "address": {"street":"57 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{632 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2010-09-02")}]}
-{"id": 398, "alias": "Nick000398", "name": "Nick Lucy", "user-since": datetime("2014-04-20T15:19:17"), "address": {"street":"97 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{383, 466, 80, 551, 608, 373, 641, 391, 334, 814, 517, 446, 447, 559, 613, 598, 154, 228, 345, 61, 305, 304, 554 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2012-06-24"),"end-date":date("2012-07-07")}]}
-{"id": 399, "alias": "Nikolas000399", "name": "Nikolas Demuth", "user-since": datetime("2007-10-23T19:32:22"), "address": {"street":"74 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{422, 874, 576, 573, 659, 150, 655, 451, 281, 590, 245, 420, 599, 251, 861, 308, 185, 249, 349, 18, 557 }}, "employment":[{"organization-name":"geomedia","start-date":date("2003-02-25")}]}
-{"id": 400, "alias": "Savannah000400", "name": "Savannah Wheeler", "user-since": datetime("2012-01-22T06:05:51"), "address": {"street":"78 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{67, 316, 168, 256, 472, 858, 32, 476, 747, 406, 594, 704, 744, 167, 63, 470, 272, 38, 750 }}, "employment":[{"organization-name":"itlab","start-date":date("2006-12-09")}]}
-{"id": 401, "alias": "Giuseppe000401", "name": "Giuseppe Koster", "user-since": datetime("2012-10-24T13:13:02"), "address": {"street":"31 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{273, 176, 127, 632, 476, 528, 5, 697, 553, 562 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2010-09-24")}]}
-{"id": 402, "alias": "Charita000402", "name": "Charita Zadovsky", "user-since": datetime("2014-03-03T13:33:27"), "address": {"street":"11 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{243, 128, 98, 615, 101, 152, 816, 253, 899, 82, 90, 512, 863, 771, 254, 402, 560, 638, 838, 680 }}, "employment":[{"organization-name":"linedexon","start-date":date("2012-03-22"),"end-date":date("2012-06-02")}]}
-{"id": 403, "alias": "Rodney000403", "name": "Rodney Mosser", "user-since": datetime("2011-12-08T22:33:41"), "address": {"street":"87 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{397, 289, 386, 233, 30, 867, 619, 533, 396, 440, 608, 632, 66, 680, 277, 739, 541, 323, 853, 372, 490, 472, 426, 115 }}, "employment":[{"organization-name":"Inchex","start-date":date("2009-08-02"),"end-date":date("2010-07-22")}]}
-{"id": 404, "alias": "Alayna000404", "name": "Alayna Hill", "user-since": datetime("2006-04-17T08:22:20"), "address": {"street":"11 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{355, 278, 286, 214, 150, 241, 44, 647 }}, "employment":[{"organization-name":"highfax","start-date":date("2007-01-15")}]}
-{"id": 405, "alias": "Kathryn000405", "name": "Kathryn Davis", "user-since": datetime("2012-05-26T00:37:02"), "address": {"street":"40 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{777 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2012-05-25")}]}
-{"id": 406, "alias": "Dalia000406", "name": "Dalia Quinn", "user-since": datetime("2013-12-22T00:08:14"), "address": {"street":"74 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{128, 115, 560, 24, 164, 179, 627, 156, 816, 215, 245, 319, 429, 747, 519, 853, 496, 439, 109, 170, 479, 292 }}, "employment":[{"organization-name":"overtech","start-date":date("2005-06-24"),"end-date":date("2008-09-19")}]}
-{"id": 407, "alias": "Oswald000407", "name": "Oswald Hurst", "user-since": datetime("2005-08-25T16:15:27"), "address": {"street":"52 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{824 }}, "employment":[{"organization-name":"Zimcone","start-date":date("2001-11-15"),"end-date":date("2002-06-15")}]}
-{"id": 408, "alias": "Brittani000408", "name": "Brittani Baer", "user-since": datetime("2006-10-19T21:51:05"), "address": {"street":"80 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{332, 464 }}, "employment":[{"organization-name":"Newphase","start-date":date("2010-07-21")}]}
-{"id": 409, "alias": "Carrie000409", "name": "Carrie Wile", "user-since": datetime("2011-06-21T20:46:43"), "address": {"street":"47 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{645, 411, 488, 235, 716, 388, 332 }}, "employment":[{"organization-name":"Streettax","start-date":date("2005-10-25"),"end-date":date("2011-04-06")}]}
-{"id": 410, "alias": "Lorna000410", "name": "Lorna Aultman", "user-since": datetime("2005-02-21T19:46:42"), "address": {"street":"64 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Fax-fax","start-date":date("2002-05-28")}]}
-{"id": 411, "alias": "Garrett000411", "name": "Garrett Stern", "user-since": datetime("2006-06-04T05:04:21"), "address": {"street":"75 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{855 }}, "employment":[{"organization-name":"Newcom","start-date":date("2004-01-20")}]}
-{"id": 412, "alias": "Redd000412", "name": "Redd Hallauer", "user-since": datetime("2009-04-27T00:58:35"), "address": {"street":"23 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{292, 481 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2005-02-18")}]}
-{"id": 413, "alias": "Jerrie000413", "name": "Jerrie Altmann", "user-since": datetime("2010-09-27T21:57:18"), "address": {"street":"96 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{634 }}, "employment":[{"organization-name":"Newcom","start-date":date("2006-02-04")}]}
-{"id": 414, "alias": "Mike000414", "name": "Mike Swink", "user-since": datetime("2007-12-22T02:20:29"), "address": {"street":"50 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{448, 449, 181, 314, 16, 97, 546, 657, 534 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2002-07-08")}]}
-{"id": 415, "alias": "Thelma000415", "name": "Thelma Beach", "user-since": datetime("2008-01-14T08:09:25"), "address": {"street":"54 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{422, 91, 29, 818, 436 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2004-08-11"),"end-date":date("2008-03-12")}]}
-{"id": 416, "alias": "Jamey000416", "name": "Jamey Zadovsky", "user-since": datetime("2013-11-13T20:51:56"), "address": {"street":"16 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{433, 684 }}, "employment":[{"organization-name":"strongex","start-date":date("2003-02-13")}]}
-{"id": 417, "alias": "Alverta000417", "name": "Alverta Werner", "user-since": datetime("2008-04-12T21:27:37"), "address": {"street":"44 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{444, 208, 728, 463, 158, 421, 277, 271, 133, 520, 684, 506, 482, 117, 587, 320, 554, 661, 470, 841, 676, 883 }}, "employment":[{"organization-name":"Fixdintex","start-date":date("2010-03-27")}]}
-{"id": 418, "alias": "Hortensia000418", "name": "Hortensia Garneis", "user-since": datetime("2012-07-18T01:56:49"), "address": {"street":"40 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{812, 349, 559, 879, 317, 297, 707, 496, 200, 901, 402, 899, 573, 361, 633, 678, 328 }}, "employment":[{"organization-name":"subtam","start-date":date("2000-04-20"),"end-date":date("2006-01-06")}]}
-{"id": 419, "alias": "Vernie000419", "name": "Vernie Butler", "user-since": datetime("2008-01-05T20:57:54"), "address": {"street":"53 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{597, 429, 449, 558, 554, 591, 589, 509, 111, 351, 39, 543, 27, 762, 555, 280, 576, 218, 369 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2012-01-12")}]}
-{"id": 420, "alias": "Giles000420", "name": "Giles Fitzgerald", "user-since": datetime("2013-12-12T14:01:37"), "address": {"street":"31 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{215, 517, 364, 590, 572, 430, 549 }}, "employment":[{"organization-name":"Newfase","start-date":date("2012-06-04"),"end-date":date("2012-07-09")}]}
-{"id": 421, "alias": "Annabella000421", "name": "Annabella Myers", "user-since": datetime("2008-09-03T00:58:20"), "address": {"street":"13 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{700, 516, 430, 48, 274, 814, 487, 718, 139, 782, 777, 619, 476, 243 }}, "employment":[{"organization-name":"Greencare","start-date":date("2005-05-12")}]}
-{"id": 422, "alias": "Rosalind000422", "name": "Rosalind Reighner", "user-since": datetime("2011-08-07T03:00:47"), "address": {"street":"7 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{182, 343, 649, 499, 597, 215, 408, 230, 638, 518, 868, 766, 364, 432, 875, 111, 662, 152, 730, 804, 465 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2002-06-10")}]}
-{"id": 423, "alias": "Rigoberto000423", "name": "Rigoberto Wilks", "user-since": datetime("2011-10-19T13:49:02"), "address": {"street":"10 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{559, 440, 11, 872, 67, 122, 369, 159, 754, 326, 5, 696, 615, 281, 270, 826 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2010-05-10"),"end-date":date("2010-01-13")}]}
-{"id": 424, "alias": "Titania000424", "name": "Titania Kunkle", "user-since": datetime("2006-06-12T17:13:37"), "address": {"street":"10 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{97, 715 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2010-06-05")}]}
-{"id": 425, "alias": "Lilly000425", "name": "Lilly Bell", "user-since": datetime("2009-10-26T10:43:03"), "address": {"street":"76 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{523, 297, 530, 648, 568, 385, 2, 217, 121, 735, 358 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2009-11-16")}]}
-{"id": 426, "alias": "Elsy000426", "name": "Elsy Zeal", "user-since": datetime("2008-02-03T20:32:44"), "address": {"street":"100 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{334, 825, 295, 241, 550 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2000-06-25")}]}
-{"id": 427, "alias": "Delilah000427", "name": "Delilah Howard", "user-since": datetime("2013-02-24T06:41:02"), "address": {"street":"94 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{472, 441, 583, 52, 645, 758, 338, 698, 722, 693, 55, 622, 800, 554, 355, 184 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2010-04-23")}]}
-{"id": 428, "alias": "Laurence000428", "name": "Laurence Lambert", "user-since": datetime("2009-06-12T08:08:55"), "address": {"street":"6 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{555, 591, 626, 649, 34, 134, 727, 665, 844, 95, 594, 753, 10, 508, 158, 707, 55, 166, 438 }}, "employment":[{"organization-name":"Greencare","start-date":date("2012-07-19")}]}
-{"id": 429, "alias": "Chance000429", "name": "Chance Jenkins", "user-since": datetime("2014-08-12T14:16:01"), "address": {"street":"59 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{277, 425, 606, 683, 444, 90, 100, 322, 801, 525, 419, 602, 328, 488, 631, 580, 460, 278, 722 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2010-08-18")}]}
-{"id": 430, "alias": "Kolleen000430", "name": "Kolleen Cable", "user-since": datetime("2008-04-02T22:02:27"), "address": {"street":"31 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{427, 331, 612, 833, 386, 110, 88 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2002-08-08")}]}
-{"id": 431, "alias": "Ros000431", "name": "Ros Courtney", "user-since": datetime("2012-10-15T12:20:12"), "address": {"street":"33 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{573, 188, 329, 64, 253, 757, 605, 421, 875, 613, 574, 163, 104, 800, 52, 134, 43, 880, 848, 79, 3, 665 }}, "employment":[{"organization-name":"Newphase","start-date":date("2007-12-28")}]}
-{"id": 432, "alias": "Debbi000432", "name": "Debbi Mcmullen", "user-since": datetime("2010-05-08T07:41:43"), "address": {"street":"89 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{616, 396, 412, 597, 758, 816, 486, 191, 491, 594, 90, 619, 766, 702, 684, 213, 867, 636, 137, 476 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2009-05-26"),"end-date":date("2010-02-02")}]}
-{"id": 433, "alias": "Meghan000433", "name": "Meghan Garland", "user-since": datetime("2014-05-25T23:19:50"), "address": {"street":"10 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{510, 496, 438, 806, 219, 822 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2001-10-21")}]}
-{"id": 434, "alias": "Jordon000434", "name": "Jordon Felbrigge", "user-since": datetime("2013-02-28T06:12:00"), "address": {"street":"62 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{354, 349, 234, 388, 53 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2003-12-16")}]}
-{"id": 435, "alias": "Jaquelyn000435", "name": "Jaquelyn Moulton", "user-since": datetime("2014-06-04T08:44:22"), "address": {"street":"69 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{898, 779, 628, 489, 390, 534, 270 }}, "employment":[{"organization-name":"Newphase","start-date":date("2006-01-19"),"end-date":date("2009-11-09")}]}
-{"id": 436, "alias": "Sidony000436", "name": "Sidony Carter", "user-since": datetime("2013-12-18T17:16:00"), "address": {"street":"89 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{217, 301, 869, 643, 430, 362, 374, 415, 245, 13, 215, 438, 404, 83, 750, 859, 324, 496, 488, 670, 635 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2002-10-15")}]}
-{"id": 437, "alias": "Lina000437", "name": "Lina Clarke", "user-since": datetime("2009-11-02T02:16:58"), "address": {"street":"7 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{468, 881, 702, 66, 537, 676, 836, 99, 710 }}, "employment":[{"organization-name":"linedexon","start-date":date("2008-07-19"),"end-date":date("2009-04-02")}]}
-{"id": 438, "alias": "Leo000438", "name": "Leo Reese", "user-since": datetime("2005-08-28T07:51:37"), "address": {"street":"7 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{167, 565, 382, 466, 666, 543, 613, 853, 465, 862 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2004-02-19")}]}
-{"id": 439, "alias": "Alayna000439", "name": "Alayna Laurenzi", "user-since": datetime("2014-04-26T16:29:09"), "address": {"street":"37 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{561, 162, 444, 660, 112, 341, 723 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2004-06-11"),"end-date":date("2011-01-09")}]}
-{"id": 440, "alias": "Delores000440", "name": "Delores Wheeler", "user-since": datetime("2008-06-24T10:03:30"), "address": {"street":"28 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{471, 689, 568, 633, 43, 727, 453, 607, 640, 867, 514, 356, 893 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2011-02-25")}]}
-{"id": 441, "alias": "Cassarah000441", "name": "Cassarah Reese", "user-since": datetime("2006-07-19T17:26:43"), "address": {"street":"90 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{656, 739, 231, 229, 593, 724, 387, 833, 385, 530, 425, 190, 126, 26, 811, 569, 613, 121, 233, 452, 623, 713, 249, 64 }}, "employment":[{"organization-name":"Striptaxon","start-date":date("2010-06-14"),"end-date":date("2011-11-13")}]}
-{"id": 442, "alias": "Coty000442", "name": "Coty Guest", "user-since": datetime("2008-09-28T05:21:04"), "address": {"street":"53 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{341, 267, 634, 499, 674, 391, 295, 872, 152, 470, 678, 407, 493, 522, 150, 259, 723, 26, 846 }}, "employment":[{"organization-name":"Statcode","start-date":date("2008-09-19")}]}
-{"id": 443, "alias": "Linden000443", "name": "Linden Jenner", "user-since": datetime("2011-05-10T06:05:41"), "address": {"street":"37 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{15, 190, 150, 304, 614, 148, 822, 690, 38, 178 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2000-03-02"),"end-date":date("2011-03-14")}]}
-{"id": 444, "alias": "Rebeccah000444", "name": "Rebeccah Whitling", "user-since": datetime("2012-11-28T05:31:29"), "address": {"street":"92 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{83, 609, 530, 674, 764, 842, 43, 834, 495, 711, 125, 668, 19, 673, 245, 595, 680, 536 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2000-05-23")}]}
-{"id": 445, "alias": "Gertie000445", "name": "Gertie Lowe", "user-since": datetime("2008-12-23T01:22:57"), "address": {"street":"18 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{882, 37, 162, 484, 796, 29, 120, 821, 161, 641, 12, 198, 601, 793, 242, 278, 532, 605, 290, 283, 272 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2007-09-03"),"end-date":date("2009-11-03")}]}
-{"id": 446, "alias": "Myra000446", "name": "Myra Williamson", "user-since": datetime("2005-12-15T03:04:34"), "address": {"street":"15 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{172, 629, 250, 596, 569, 21, 732, 90, 735, 340, 824, 688, 197, 227, 570, 5, 545 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2011-06-14")}]}
-{"id": 447, "alias": "Linnet000447", "name": "Linnet Stern", "user-since": datetime("2005-05-24T14:05:27"), "address": {"street":"30 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{468, 236, 900, 669, 545, 773, 325, 691, 272 }}, "employment":[{"organization-name":"Basecone","start-date":date("2002-11-07")}]}
-{"id": 448, "alias": "Guinevere000448", "name": "Guinevere Kight", "user-since": datetime("2011-02-10T06:31:27"), "address": {"street":"61 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{111, 738, 807, 701, 755, 145, 495, 158, 341, 444, 720, 796, 451, 560 }}, "employment":[{"organization-name":"Redelectronics","start-date":date("2000-03-20")}]}
-{"id": 449, "alias": "Val000449", "name": "Val Bennett", "user-since": datetime("2014-02-27T04:33:20"), "address": {"street":"7 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{412, 884, 3, 630, 55 }}, "employment":[{"organization-name":"Striptaxon","start-date":date("2012-06-10")}]}
-{"id": 450, "alias": "Jarrett000450", "name": "Jarrett Faast", "user-since": datetime("2014-04-20T12:28:20"), "address": {"street":"54 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{535, 459, 600 }}, "employment":[{"organization-name":"Quoline","start-date":date("2009-01-25")}]}
-{"id": 451, "alias": "Oliva000451", "name": "Oliva Sandys", "user-since": datetime("2007-02-04T20:00:05"), "address": {"street":"30 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Villa-tech","start-date":date("2002-09-28"),"end-date":date("2010-09-24")}]}
-{"id": 452, "alias": "Marti000452", "name": "Marti Hayhurst", "user-since": datetime("2013-07-24T09:55:25"), "address": {"street":"93 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{412, 796, 177, 755, 629, 166, 844, 18 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2004-07-08"),"end-date":date("2011-01-24")}]}
-{"id": 453, "alias": "Bernetta000453", "name": "Bernetta Ling", "user-since": datetime("2009-06-17T07:53:43"), "address": {"street":"76 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Keytech","start-date":date("2010-04-22")}]}
-{"id": 454, "alias": "Candice000454", "name": "Candice Tanner", "user-since": datetime("2006-07-15T12:35:53"), "address": {"street":"14 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{428, 327, 876, 783, 746, 857, 721, 694 }}, "employment":[{"organization-name":"Inchex","start-date":date("2000-01-03"),"end-date":date("2003-12-13")}]}
-{"id": 455, "alias": "Orson000455", "name": "Orson Albright", "user-since": datetime("2012-11-26T02:03:27"), "address": {"street":"62 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{644, 791, 626, 504, 663, 251, 684 }}, "employment":[{"organization-name":"over-it","start-date":date("2012-06-05"),"end-date":date("2012-07-09")}]}
-{"id": 456, "alias": "Tyreek000456", "name": "Tyreek Carbaugh", "user-since": datetime("2014-01-12T16:49:45"), "address": {"street":"24 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{893, 714, 630, 347, 726, 1, 389, 555, 880, 875, 249, 688, 819, 208, 868 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2004-03-07"),"end-date":date("2004-09-17")}]}
-{"id": 457, "alias": "Booker000457", "name": "Booker Gottwine", "user-since": datetime("2010-10-22T04:55:46"), "address": {"street":"94 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{101, 568, 483, 746 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2005-03-20")}]}
-{"id": 458, "alias": "Mariabella000458", "name": "Mariabella Treeby", "user-since": datetime("2008-03-13T23:43:45"), "address": {"street":"76 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{141, 746, 287, 233, 636, 386, 898, 356, 303, 700, 866, 549, 69, 333, 11, 262, 843, 490, 684 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2006-04-03"),"end-date":date("2010-08-14")}]}
-{"id": 459, "alias": "Deanna000459", "name": "Deanna Overholt", "user-since": datetime("2012-09-04T05:14:29"), "address": {"street":"73 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{514, 758, 409, 850, 621, 785, 181, 5, 123, 881, 188, 649 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2000-05-15"),"end-date":date("2002-08-27")}]}
-{"id": 460, "alias": "Lowell000460", "name": "Lowell Newlove", "user-since": datetime("2007-04-15T15:58:52"), "address": {"street":"71 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{521, 577, 453, 320, 899, 220, 869, 644, 52, 583, 5, 671, 598, 433, 707 }}, "employment":[{"organization-name":"Redelectronics","start-date":date("2002-07-07"),"end-date":date("2009-03-26")}]}
-{"id": 461, "alias": "Gomer000461", "name": "Gomer Stough", "user-since": datetime("2007-01-27T23:34:36"), "address": {"street":"90 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{415, 53 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2001-01-16")}]}
-{"id": 462, "alias": "Liz000462", "name": "Liz Kunkle", "user-since": datetime("2013-11-14T08:46:39"), "address": {"street":"79 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{390, 142, 166, 231 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2008-01-10")}]}
-{"id": 463, "alias": "Octavio000463", "name": "Octavio Thorley", "user-since": datetime("2013-05-23T23:21:01"), "address": {"street":"93 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{30, 320 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2010-09-05"),"end-date":date("2010-05-28")}]}
-{"id": 464, "alias": "Laetitia000464", "name": "Laetitia Rodacker", "user-since": datetime("2009-07-23T02:25:37"), "address": {"street":"24 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{563, 810, 748, 887, 776, 408, 157, 337, 613, 659, 529, 285, 160, 82, 51, 128, 16 }}, "employment":[{"organization-name":"Basecone","start-date":date("2002-09-26"),"end-date":date("2004-04-08")}]}
-{"id": 465, "alias": "Kristopher000465", "name": "Kristopher Haile", "user-since": datetime("2007-11-23T12:13:49"), "address": {"street":"80 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{255, 408, 670, 221, 785, 600, 520, 67, 312, 900, 826, 622, 469, 724, 540 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2000-08-26"),"end-date":date("2004-10-14")}]}
-{"id": 466, "alias": "Erich000466", "name": "Erich Fiscina", "user-since": datetime("2009-03-08T10:36:10"), "address": {"street":"29 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{570, 514, 319, 298, 41, 136, 404, 124 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2012-07-28")}]}
-{"id": 467, "alias": "Brett000467", "name": "Brett Warrick", "user-since": datetime("2008-09-25T05:07:33"), "address": {"street":"78 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{605, 292, 294, 832, 190, 585, 37 }}, "employment":[{"organization-name":"silfind","start-date":date("2008-12-03")}]}
-{"id": 468, "alias": "Domingo000468", "name": "Domingo Overholt", "user-since": datetime("2011-10-16T13:14:15"), "address": {"street":"15 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{192, 342, 613, 505, 59, 672, 276, 464, 741, 209, 707, 633, 754 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2012-05-17")}]}
-{"id": 469, "alias": "Draven000469", "name": "Draven Eckert", "user-since": datetime("2012-04-14T22:08:56"), "address": {"street":"89 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{901, 76, 128, 538, 214, 160, 684, 571, 302, 154, 457, 430, 680 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2005-11-02"),"end-date":date("2010-10-24")}]}
-{"id": 470, "alias": "Gareth000470", "name": "Gareth Pirl", "user-since": datetime("2008-11-26T18:47:55"), "address": {"street":"52 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{738, 72, 450, 844, 667, 160, 750, 440, 788, 604, 673, 874, 73, 805, 716 }}, "employment":[{"organization-name":"Labzatron","start-date":date("2007-10-22"),"end-date":date("2007-01-03")}]}
-{"id": 471, "alias": "Brook000471", "name": "Brook Cypret", "user-since": datetime("2014-08-22T18:51:58"), "address": {"street":"86 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{510, 481, 685, 659, 85, 452, 282, 681, 718, 378 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2006-08-10")}]}
-{"id": 472, "alias": "Jessika000472", "name": "Jessika Hozier", "user-since": datetime("2013-04-06T02:15:38"), "address": {"street":"99 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{754, 788, 526, 603, 622, 225, 468, 299, 513 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2012-05-18")}]}
-{"id": 473, "alias": "Quintin000473", "name": "Quintin Fry", "user-since": datetime("2009-10-18T17:43:57"), "address": {"street":"16 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{250, 488, 259, 879, 631, 581, 369, 289, 482, 899, 270, 197, 675, 709, 862, 178, 520, 772, 885 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2009-04-11")}]}
-{"id": 474, "alias": "Corrie000474", "name": "Corrie Pirl", "user-since": datetime("2006-05-24T10:25:12"), "address": {"street":"74 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{280 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2005-05-27"),"end-date":date("2009-10-06")}]}
-{"id": 475, "alias": "Rita000475", "name": "Rita Buehler", "user-since": datetime("2013-10-24T10:30:52"), "address": {"street":"80 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{139, 548, 440, 731, 595, 882, 570, 346, 409, 676, 707, 184, 755, 788, 668, 392, 801, 890, 867 }}, "employment":[{"organization-name":"Doncare","start-date":date("2011-09-14")}]}
-{"id": 476, "alias": "Joshua000476", "name": "Joshua Harshman", "user-since": datetime("2012-09-09T06:46:29"), "address": {"street":"19 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{577, 464, 708, 725, 4, 274, 436, 796, 154, 846, 132, 175, 859, 899, 248, 368, 190, 632, 615 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2009-05-20")}]}
-{"id": 477, "alias": "Sigrid000477", "name": "Sigrid Frankenberger", "user-since": datetime("2011-07-12T08:04:27"), "address": {"street":"10 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{680, 604, 661, 316, 272, 474, 579, 577, 6, 250, 367, 887, 721, 307, 636, 835, 150, 571, 64, 155, 129, 472, 565 }}, "employment":[{"organization-name":"Tranzap","start-date":date("2007-07-14"),"end-date":date("2010-08-28")}]}
-{"id": 478, "alias": "Marquis000478", "name": "Marquis Fryer", "user-since": datetime("2006-06-20T14:23:57"), "address": {"street":"27 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{121, 299, 203 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2012-01-02"),"end-date":date("2012-05-13")}]}
-{"id": 479, "alias": "Amaryllis000479", "name": "Amaryllis Batten", "user-since": datetime("2005-11-03T23:22:47"), "address": {"street":"41 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{275, 283, 558, 0, 483, 655 }}, "employment":[{"organization-name":"Statcode","start-date":date("2000-09-25")}]}
-{"id": 480, "alias": "Nathaniel000480", "name": "Nathaniel Wolfe", "user-since": datetime("2010-08-11T03:19:00"), "address": {"street":"24 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{494, 217, 127, 469, 778, 799, 749, 781, 572, 365, 23, 151, 445, 883 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2012-07-06")}]}
-{"id": 481, "alias": "Jarvis000481", "name": "Jarvis Millhouse", "user-since": datetime("2014-08-19T14:24:34"), "address": {"street":"35 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{820, 607, 842, 355, 491, 531, 307, 544, 558, 791, 365, 794, 781, 15, 736, 857, 461, 133, 646, 496, 130, 156 }}, "employment":[{"organization-name":"U-ron","start-date":date("2005-03-28"),"end-date":date("2006-08-09")}]}
-{"id": 482, "alias": "Everette000482", "name": "Everette Arthur", "user-since": datetime("2006-05-11T09:28:50"), "address": {"street":"26 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{179 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2011-02-26"),"end-date":date("2011-02-13")}]}
-{"id": 483, "alias": "Emmie000483", "name": "Emmie Lane", "user-since": datetime("2006-01-19T14:44:39"), "address": {"street":"69 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{355 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2003-09-18"),"end-date":date("2009-05-19")}]}
-{"id": 484, "alias": "Forrest000484", "name": "Forrest Romanoff", "user-since": datetime("2007-09-08T14:01:55"), "address": {"street":"45 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{233, 538, 216, 566, 314, 104, 797, 406, 741, 179, 106 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2008-06-09")}]}
-{"id": 485, "alias": "Kat000485", "name": "Kat Houser", "user-since": datetime("2012-06-15T16:25:45"), "address": {"street":"93 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{683, 208, 218, 787, 295, 199, 131, 729, 249, 385, 504, 32, 241, 7, 350, 694 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2011-12-21")}]}
-{"id": 486, "alias": "Darius000486", "name": "Darius Sealis", "user-since": datetime("2007-02-20T16:19:38"), "address": {"street":"24 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{202, 799 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2000-11-12")}]}
-{"id": 487, "alias": "Loren000487", "name": "Loren Ullman", "user-since": datetime("2014-06-14T01:34:07"), "address": {"street":"12 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{551, 849 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2008-08-13"),"end-date":date("2010-02-09")}]}
-{"id": 488, "alias": "Meagan000488", "name": "Meagan Isemann", "user-since": datetime("2009-07-24T01:25:28"), "address": {"street":"87 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{93, 710, 770, 174, 568, 116, 623 }}, "employment":[{"organization-name":"subtam","start-date":date("2001-03-07")}]}
-{"id": 489, "alias": "Chanelle000489", "name": "Chanelle Bridger", "user-since": datetime("2009-09-19T16:16:19"), "address": {"street":"7 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{260, 668, 343, 106, 850, 828, 31, 189, 187, 445, 436, 461, 105, 430, 129, 325 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2001-07-26")}]}
-{"id": 490, "alias": "Sarina000490", "name": "Sarina Clark", "user-since": datetime("2014-08-09T21:19:01"), "address": {"street":"33 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{894, 423, 829, 835, 803, 646, 623, 404, 24, 402 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2009-02-08")}]}
-{"id": 491, "alias": "Jules000491", "name": "Jules Wallace", "user-since": datetime("2006-01-05T13:32:35"), "address": {"street":"80 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{742, 753, 489, 170, 765, 472 }}, "employment":[{"organization-name":"Lexitechno","start-date":date("2005-01-11"),"end-date":date("2006-05-05")}]}
-{"id": 492, "alias": "Wendell000492", "name": "Wendell Fye", "user-since": datetime("2007-06-06T01:57:32"), "address": {"street":"67 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{870, 839, 330, 227, 751, 514 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2010-11-28"),"end-date":date("2010-07-17")}]}
-{"id": 493, "alias": "Sammi000493", "name": "Sammi Gregory", "user-since": datetime("2006-10-18T03:32:41"), "address": {"street":"47 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{804, 167, 367, 309, 782, 600, 135, 535, 249, 628, 597, 460 }}, "employment":[{"organization-name":"strongex","start-date":date("2011-11-15")}]}
-{"id": 494, "alias": "Lolicia000494", "name": "Lolicia Sybilla", "user-since": datetime("2012-09-10T20:58:22"), "address": {"street":"71 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{341, 161, 53, 198, 746 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2000-12-25")}]}
-{"id": 495, "alias": "Reginald000495", "name": "Reginald Swartzbaugh", "user-since": datetime("2007-07-24T21:06:21"), "address": {"street":"99 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{708, 306, 835, 96, 337, 180, 583, 479, 677, 742, 399, 231, 581, 598, 847, 590 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2004-03-18")}]}
-{"id": 496, "alias": "Helga000496", "name": "Helga Tripp", "user-since": datetime("2010-01-10T00:30:33"), "address": {"street":"62 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{702, 816, 338, 139, 5, 243, 341, 122, 505, 118, 143 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2011-05-07")}]}
-{"id": 497, "alias": "Erykah000497", "name": "Erykah Hujsak", "user-since": datetime("2014-04-08T03:00:22"), "address": {"street":"50 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{662, 571, 373, 736, 462, 563, 556 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2002-06-06"),"end-date":date("2011-03-27")}]}
-{"id": 498, "alias": "Aislin000498", "name": "Aislin Tanner", "user-since": datetime("2007-03-14T09:36:24"), "address": {"street":"17 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Xx-technology","start-date":date("2002-09-16")}]}
-{"id": 499, "alias": "Roselyn000499", "name": "Roselyn Hoenshell", "user-since": datetime("2013-11-23T05:23:06"), "address": {"street":"89 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{48, 682, 576, 335, 568, 742, 899, 348, 492, 299, 747, 220, 61, 199, 54, 476, 369, 559, 417, 852, 66, 249, 692 }}, "employment":[{"organization-name":"Keytech","start-date":date("2000-06-15")}]}
-{"id": 500, "alias": "Lexie000500", "name": "Lexie Woolery", "user-since": datetime("2005-07-23T19:05:16"), "address": {"street":"40 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{602, 558, 706, 223, 790, 803, 157, 501, 533, 485, 81, 212, 17, 272, 550, 6, 91, 19 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2002-10-17")}]}
-{"id": 501, "alias": "Lavona000501", "name": "Lavona Rogers", "user-since": datetime("2011-07-02T04:16:41"), "address": {"street":"32 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{310, 64 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2007-07-05"),"end-date":date("2009-08-19")}]}
-{"id": 502, "alias": "Tanisha000502", "name": "Tanisha Dunkle", "user-since": datetime("2006-12-09T22:35:23"), "address": {"street":"57 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{311, 834, 326, 693, 815, 398, 521, 492, 453, 854, 291, 61, 372, 217, 78, 12 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2000-02-02")}]}
-{"id": 503, "alias": "Christianne000503", "name": "Christianne Nicholas", "user-since": datetime("2014-01-06T23:18:01"), "address": {"street":"68 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"sonstreet","start-date":date("2008-04-07"),"end-date":date("2011-08-17")}]}
-{"id": 504, "alias": "Cordell000504", "name": "Cordell Wyatt", "user-since": datetime("2010-01-16T04:44:32"), "address": {"street":"13 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{705, 865, 599, 360, 653, 446, 616, 787, 150, 54, 138, 291, 515, 462, 454 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2003-05-27"),"end-date":date("2010-09-05")}]}
-{"id": 505, "alias": "Phemie000505", "name": "Phemie Watkins", "user-since": datetime("2012-04-09T11:16:41"), "address": {"street":"8 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{284, 263, 150, 291, 285, 461, 331, 752, 370, 375 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2007-12-21")}]}
-{"id": 506, "alias": "Camellia000506", "name": "Camellia Bennett", "user-since": datetime("2013-08-17T01:25:07"), "address": {"street":"95 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{711, 23, 217, 452, 429, 192, 144, 630, 444, 647, 201, 251, 503, 292, 407 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2000-12-12")}]}
-{"id": 507, "alias": "Vera000507", "name": "Vera Demuth", "user-since": datetime("2011-02-18T16:16:13"), "address": {"street":"33 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{333, 469, 116, 877, 235, 538, 370, 59, 531, 265, 171, 742, 810, 569, 211, 130, 77, 695, 302, 40 }}, "employment":[{"organization-name":"over-it","start-date":date("2004-05-22")}]}
-{"id": 508, "alias": "Milan000508", "name": "Milan Cable", "user-since": datetime("2009-06-11T00:36:32"), "address": {"street":"36 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{599, 435, 754, 707, 783, 794, 521, 175, 118, 691, 515, 589, 528, 455, 880, 501, 747 }}, "employment":[{"organization-name":"jaydax","start-date":date("2005-07-23"),"end-date":date("2007-06-11")}]}
-{"id": 509, "alias": "Mathilda000509", "name": "Mathilda Shafer", "user-since": datetime("2011-12-10T09:02:35"), "address": {"street":"58 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{701, 198, 742, 327, 669, 325, 843, 727, 102, 119, 160, 136, 362, 426, 338, 109, 100, 624, 95 }}, "employment":[{"organization-name":"Vivaace","start-date":date("2002-01-10"),"end-date":date("2004-11-18")}]}
-{"id": 510, "alias": "Wendi000510", "name": "Wendi Tedrow", "user-since": datetime("2008-11-26T11:44:39"), "address": {"street":"23 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{854, 883, 794, 489, 599, 421, 533, 324, 369, 508, 268, 763, 24, 560, 600, 222, 645, 372, 168, 328, 686, 277, 513 }}, "employment":[{"organization-name":"jaydax","start-date":date("2002-02-03"),"end-date":date("2006-03-15")}]}
-{"id": 511, "alias": "Maris000511", "name": "Maris Williams", "user-since": datetime("2005-04-26T18:31:46"), "address": {"street":"64 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{641, 146, 716, 450, 372, 489, 628, 873, 612, 807, 861, 893, 131, 788, 325 }}, "employment":[{"organization-name":"Doublezone","start-date":date("2000-03-17"),"end-date":date("2011-09-20")}]}
-{"id": 512, "alias": "Chet000512", "name": "Chet Merryman", "user-since": datetime("2008-08-24T02:40:56"), "address": {"street":"57 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{516, 255, 483, 312, 230, 644, 323, 736, 126, 458, 278, 18, 369, 590, 227, 270, 60 }}, "employment":[{"organization-name":"over-it","start-date":date("2006-11-05")}]}
-{"id": 513, "alias": "Raelene000513", "name": "Raelene Altmann", "user-since": datetime("2011-08-07T19:03:38"), "address": {"street":"49 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{605, 190, 349, 584, 472, 18, 748, 857, 722, 676, 900, 369, 382, 770, 111, 547, 876, 345, 689, 486, 86, 664, 88 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2011-04-26")}]}
-{"id": 514, "alias": "Hilton000514", "name": "Hilton Faust", "user-since": datetime("2009-08-27T17:32:23"), "address": {"street":"25 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{633, 355, 377, 458, 666, 473 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2003-05-20")}]}
-{"id": 515, "alias": "Corey000515", "name": "Corey Woollard", "user-since": datetime("2013-07-27T10:52:20"), "address": {"street":"100 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{817, 885, 366, 305 }}, "employment":[{"organization-name":"Coneflex","start-date":date("2007-12-12")}]}
-{"id": 516, "alias": "Cathy000516", "name": "Cathy Kemble", "user-since": datetime("2011-01-13T13:52:03"), "address": {"street":"55 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{293, 850 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2003-11-25")}]}
-{"id": 517, "alias": "Latanya000517", "name": "Latanya Lacon", "user-since": datetime("2014-02-14T04:09:01"), "address": {"street":"93 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{763, 233, 742, 252, 668, 182, 616, 446, 648, 779 }}, "employment":[{"organization-name":"Vivaace","start-date":date("2005-03-19")}]}
-{"id": 518, "alias": "Keneth000518", "name": "Keneth Keppel", "user-since": datetime("2014-02-09T14:31:06"), "address": {"street":"3 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{879, 84, 463, 256, 224, 510, 690, 209, 112, 504, 12, 88, 767, 129, 368, 589, 772, 357, 787, 238, 773 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2001-12-13"),"end-date":date("2008-09-16")}]}
-{"id": 519, "alias": "Wilbur000519", "name": "Wilbur Morgan", "user-since": datetime("2010-06-19T19:09:18"), "address": {"street":"24 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{4, 783, 448, 752, 678, 295, 105, 808, 25, 481, 708 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2009-09-07"),"end-date":date("2010-01-24")}]}
-{"id": 520, "alias": "Qiana000520", "name": "Qiana Roby", "user-since": datetime("2009-07-24T13:10:01"), "address": {"street":"67 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{368, 687, 36, 711, 336, 470, 709, 779, 349, 708, 858, 195, 57, 120, 775, 412, 745 }}, "employment":[{"organization-name":"freshdox","start-date":date("2005-06-23"),"end-date":date("2007-12-17")}]}
-{"id": 521, "alias": "Isabell000521", "name": "Isabell Doverspike", "user-since": datetime("2007-02-08T15:18:27"), "address": {"street":"72 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{94, 306, 350 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2004-08-21"),"end-date":date("2011-09-21")}]}
-{"id": 522, "alias": "Mackenzie000522", "name": "Mackenzie Hooker", "user-since": datetime("2009-09-09T21:20:15"), "address": {"street":"52 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{540, 230, 838, 297, 470, 892, 755, 234, 483, 40, 581 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2000-10-11")}]}
-{"id": 523, "alias": "Shantelle000523", "name": "Shantelle Sidower", "user-since": datetime("2010-12-02T17:35:23"), "address": {"street":"46 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{328, 300, 154, 261, 664, 811, 342, 23, 784, 608, 315, 606, 238, 85, 21 }}, "employment":[{"organization-name":"Canline","start-date":date("2004-11-24")}]}
-{"id": 524, "alias": "Kaitlynn000524", "name": "Kaitlynn Poley", "user-since": datetime("2012-09-14T05:44:06"), "address": {"street":"41 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{603, 862, 121, 132, 128, 10, 282, 485, 417, 70, 454, 153, 467, 785, 731, 648, 217, 94, 646, 81 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2001-05-26"),"end-date":date("2004-07-11")}]}
-{"id": 525, "alias": "Bessie000525", "name": "Bessie Emrick", "user-since": datetime("2008-02-22T17:22:53"), "address": {"street":"73 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{706, 658, 621, 546, 64, 439, 395, 812, 361, 687, 48 }}, "employment":[{"organization-name":"Newcom","start-date":date("2012-02-02"),"end-date":date("2012-02-15")}]}
-{"id": 526, "alias": "Kristia000526", "name": "Kristia Swift", "user-since": datetime("2014-07-10T19:42:15"), "address": {"street":"93 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{312, 114, 362, 297, 686, 475, 624, 618, 394, 286 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2005-08-19"),"end-date":date("2011-09-09")}]}
-{"id": 527, "alias": "Craig000527", "name": "Craig Bunten", "user-since": datetime("2013-11-26T14:47:55"), "address": {"street":"41 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{856, 195, 83, 390, 236, 535, 129, 122, 682, 623, 749, 625, 337, 88, 113, 365, 531, 795, 894 }}, "employment":[{"organization-name":"sonstreet","start-date":date("2012-08-13")}]}
-{"id": 528, "alias": "Eugenia000528", "name": "Eugenia Echard", "user-since": datetime("2014-02-01T08:11:36"), "address": {"street":"9 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{879, 571, 265, 502, 778, 737, 368, 880 }}, "employment":[{"organization-name":"Coneflex","start-date":date("2008-11-24")}]}
-{"id": 529, "alias": "Terri000529", "name": "Terri Archibald", "user-since": datetime("2012-06-11T21:40:45"), "address": {"street":"66 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{427, 228, 47, 242, 713, 742, 687, 226, 298, 507, 825, 635, 91, 644, 570, 308, 524, 517, 480, 659, 550, 842, 249, 425 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2003-12-04"),"end-date":date("2006-04-27")}]}
-{"id": 530, "alias": "Quinn000530", "name": "Quinn Nehling", "user-since": datetime("2006-09-08T02:00:16"), "address": {"street":"98 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{306, 453, 516, 362, 548, 383, 809, 165, 60, 686, 377 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2009-04-17")}]}
-{"id": 531, "alias": "Tess000531", "name": "Tess White", "user-since": datetime("2014-05-05T07:24:18"), "address": {"street":"56 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{457, 661, 496, 636, 277, 202, 796, 433, 276, 506, 323, 135, 560, 86 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2012-02-07")}]}
-{"id": 532, "alias": "Aleta000532", "name": "Aleta Bennett", "user-since": datetime("2008-07-26T19:20:04"), "address": {"street":"61 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{840, 493, 344, 689, 829 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2010-03-24")}]}
-{"id": 533, "alias": "Irving000533", "name": "Irving Burkett", "user-since": datetime("2007-12-15T14:56:08"), "address": {"street":"16 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{454, 885, 462, 675, 265, 657, 206, 745, 687, 376, 677, 703, 836, 490, 535, 169, 182, 640, 706, 768, 804 }}, "employment":[{"organization-name":"Salthex","start-date":date("2000-12-26"),"end-date":date("2003-12-20")}]}
-{"id": 534, "alias": "Leila000534", "name": "Leila Shotts", "user-since": datetime("2011-08-12T14:56:18"), "address": {"street":"26 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Mathtech","start-date":date("2010-02-26")}]}
-{"id": 535, "alias": "Earnest000535", "name": "Earnest Eckhardstein", "user-since": datetime("2010-07-20T22:18:18"), "address": {"street":"42 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{6, 772, 530, 477, 56, 353, 458, 667, 698, 593, 691, 682, 582, 761, 706 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2003-09-01")}]}
-{"id": 536, "alias": "Eugena000536", "name": "Eugena Sybilla", "user-since": datetime("2012-12-11T01:17:36"), "address": {"street":"62 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{348, 93, 91, 24, 220 }}, "employment":[{"organization-name":"Inchex","start-date":date("2001-09-01")}]}
-{"id": 537, "alias": "Sacha000537", "name": "Sacha Warren", "user-since": datetime("2008-09-12T23:41:41"), "address": {"street":"38 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{87, 103, 502, 295, 727, 160, 564, 485, 263, 781, 770, 539, 433, 156 }}, "employment":[{"organization-name":"Indiex","start-date":date("2011-11-24")}]}
-{"id": 538, "alias": "Rowina000538", "name": "Rowina Hastings", "user-since": datetime("2011-06-09T10:06:01"), "address": {"street":"79 Third Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Hatcom","start-date":date("2002-04-19"),"end-date":date("2009-09-17")}]}
-{"id": 539, "alias": "Chad000539", "name": "Chad Cram", "user-since": datetime("2010-08-14T16:39:05"), "address": {"street":"60 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{577, 847, 865, 608, 654, 434, 633, 576, 73, 857, 844, 190, 525 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2001-08-11"),"end-date":date("2004-08-24")}]}
-{"id": 540, "alias": "Heidi000540", "name": "Heidi Baumgartner", "user-since": datetime("2005-09-01T14:04:09"), "address": {"street":"36 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{263, 108, 701, 217, 8, 132, 315, 120, 663, 590, 308, 491, 162, 564, 404, 238, 587, 197, 355, 354 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2009-04-21")}]}
-{"id": 541, "alias": "Galen000541", "name": "Galen Nash", "user-since": datetime("2007-11-20T04:32:06"), "address": {"street":"2 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{636, 119, 212, 486, 145, 621, 468, 686, 516, 167, 58, 137, 467, 24, 318, 504, 470, 531, 440 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2001-07-13")}]}
-{"id": 542, "alias": "Kynaston000542", "name": "Kynaston Barrett", "user-since": datetime("2006-10-09T19:40:36"), "address": {"street":"37 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{451, 160, 702 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2010-11-05")}]}
-{"id": 543, "alias": "Kori000543", "name": "Kori Patterson", "user-since": datetime("2007-03-14T16:41:00"), "address": {"street":"10 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{458 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2002-04-07")}]}
-{"id": 544, "alias": "Valerie000544", "name": "Valerie Todd", "user-since": datetime("2010-07-06T11:05:06"), "address": {"street":"20 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{0, 123, 680, 330, 655, 802, 328, 221, 435, 852, 351, 11, 795, 763, 786, 457, 669, 612, 338 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2009-02-24")}]}
-{"id": 545, "alias": "Cayley000545", "name": "Cayley Staymates", "user-since": datetime("2011-10-08T10:15:41"), "address": {"street":"39 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{60, 513, 139, 255, 121, 252, 89, 802, 77, 193, 169, 293, 348, 283, 62, 93 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2004-02-20"),"end-date":date("2009-08-27")}]}
-{"id": 546, "alias": "Melissa000546", "name": "Melissa Pennington", "user-since": datetime("2010-09-03T11:29:10"), "address": {"street":"63 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{66, 295 }}, "employment":[{"organization-name":"overtech","start-date":date("2003-03-12")}]}
-{"id": 547, "alias": "Soo000547", "name": "Soo Rummel", "user-since": datetime("2011-11-24T17:09:03"), "address": {"street":"100 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{537 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2007-06-16")}]}
-{"id": 548, "alias": "Braxton000548", "name": "Braxton Black", "user-since": datetime("2011-04-18T07:23:46"), "address": {"street":"98 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{359, 84, 689, 679, 1, 378, 357, 896, 227, 56, 15, 118, 147, 870 }}, "employment":[{"organization-name":"overtech","start-date":date("2009-03-28"),"end-date":date("2010-01-17")}]}
-{"id": 549, "alias": "Lindy000549", "name": "Lindy Mccallum", "user-since": datetime("2010-06-13T10:10:35"), "address": {"street":"47 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{255, 581 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2000-12-25")}]}
-{"id": 550, "alias": "Hector000550", "name": "Hector Patterson", "user-since": datetime("2005-05-03T22:44:00"), "address": {"street":"37 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{339, 499, 439, 198, 496, 159, 226, 577, 247, 861, 193, 601, 570, 587, 13, 348, 73, 881, 7 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2004-01-18")}]}
-{"id": 551, "alias": "Algar000551", "name": "Algar Mays", "user-since": datetime("2009-06-15T16:21:47"), "address": {"street":"19 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{567, 373, 371, 380, 174, 893, 810, 89, 150, 663, 596, 738, 798 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2000-09-21")}]}
-{"id": 552, "alias": "Jettie000552", "name": "Jettie Oppenheimer", "user-since": datetime("2013-01-05T03:20:29"), "address": {"street":"64 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{300, 793, 69, 860, 422, 110, 753, 57, 622, 204, 234 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2002-03-09"),"end-date":date("2007-02-27")}]}
-{"id": 553, "alias": "Anne000553", "name": "Anne Mckinnon", "user-since": datetime("2011-02-05T01:27:10"), "address": {"street":"34 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{226, 56, 250, 332, 575, 815, 776, 143, 201, 727, 207, 435 }}, "employment":[{"organization-name":"Villa-dox","start-date":date("2012-06-23")}]}
-{"id": 554, "alias": "Brack000554", "name": "Brack Scott", "user-since": datetime("2010-02-05T08:57:36"), "address": {"street":"48 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{159, 725, 483, 715, 447, 866 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2005-10-02")}]}
-{"id": 555, "alias": "Maranda000555", "name": "Maranda Bowman", "user-since": datetime("2005-02-15T22:45:38"), "address": {"street":"96 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{714, 143, 715, 811, 766, 344, 418, 707, 208, 753, 417, 34, 288, 624, 419 }}, "employment":[{"organization-name":"itlab","start-date":date("2008-12-20")}]}
-{"id": 556, "alias": "Meaghan000556", "name": "Meaghan Chase", "user-since": datetime("2005-04-07T03:39:18"), "address": {"street":"46 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{604, 56, 482, 180, 350, 39, 855, 352, 776, 459 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2007-04-17"),"end-date":date("2010-09-02")}]}
-{"id": 557, "alias": "Celinda000557", "name": "Celinda Foster", "user-since": datetime("2010-05-22T10:33:59"), "address": {"street":"65 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{541, 717, 288, 620, 421, 482, 473, 300, 46, 45, 733, 385, 686, 689, 437, 52, 637, 134, 714 }}, "employment":[{"organization-name":"Indiex","start-date":date("2005-04-09")}]}
-{"id": 558, "alias": "Radclyffe000558", "name": "Radclyffe Gibson", "user-since": datetime("2006-04-11T20:11:34"), "address": {"street":"72 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{393, 265, 887, 855, 376, 444, 217, 731, 720, 649, 75, 91, 817, 12, 461, 658, 589, 880, 186, 699, 866 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2001-12-19")}]}
-{"id": 559, "alias": "Patrick000559", "name": "Patrick Christopher", "user-since": datetime("2008-05-04T09:09:48"), "address": {"street":"25 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{353, 784, 711, 345, 400, 730, 140, 96, 777, 766 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2003-02-26")}]}
-{"id": 560, "alias": "Rosy000560", "name": "Rosy Raub", "user-since": datetime("2008-10-21T19:28:30"), "address": {"street":"43 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{375, 866, 381, 613, 516 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2004-08-25")}]}
-{"id": 561, "alias": "Gary000561", "name": "Gary Overstreet", "user-since": datetime("2011-04-18T17:00:51"), "address": {"street":"85 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{885, 695, 548, 588, 127, 510, 284, 888, 216, 597, 554, 838, 598, 87, 352, 61, 578, 353, 804, 203, 776, 788, 251 }}, "employment":[{"organization-name":"overtech","start-date":date("2011-09-12"),"end-date":date("2011-10-07")}]}
-{"id": 562, "alias": "Stacy000562", "name": "Stacy Curry", "user-since": datetime("2007-09-18T13:41:54"), "address": {"street":"3 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{892, 774, 414, 786, 749, 316, 549, 769, 267, 704, 9, 237 }}, "employment":[{"organization-name":"silfind","start-date":date("2010-08-26")}]}
-{"id": 563, "alias": "Seth000563", "name": "Seth Kepple", "user-since": datetime("2005-11-24T03:29:08"), "address": {"street":"89 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{222, 645, 735, 40, 462, 317, 171, 432, 862, 293, 270, 788 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2002-11-12")}]}
-{"id": 564, "alias": "Ward000564", "name": "Ward Herndon", "user-since": datetime("2005-04-02T07:31:38"), "address": {"street":"97 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{303 }}, "employment":[{"organization-name":"U-ron","start-date":date("2004-05-18")}]}
-{"id": 565, "alias": "Whitney000565", "name": "Whitney Howard", "user-since": datetime("2014-08-26T09:25:18"), "address": {"street":"92 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{207, 709, 463, 74, 642, 240, 840, 510, 725, 331, 299, 161, 159, 308, 474, 125, 317, 314, 133 }}, "employment":[{"organization-name":"jaydax","start-date":date("2003-04-25"),"end-date":date("2004-07-24")}]}
-{"id": 566, "alias": "Hughie000566", "name": "Hughie Law", "user-since": datetime("2008-10-28T07:13:07"), "address": {"street":"12 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{600, 454, 90, 884, 808, 332, 601, 153, 587, 882, 801, 713, 875, 324, 29, 143, 82, 32, 570, 822 }}, "employment":[{"organization-name":"geomedia","start-date":date("2005-10-26"),"end-date":date("2005-02-21")}]}
-{"id": 567, "alias": "Emilio000567", "name": "Emilio Koster", "user-since": datetime("2007-07-28T16:34:35"), "address": {"street":"52 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{570, 830, 411, 5, 550, 675, 373 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2003-05-09")}]}
-{"id": 568, "alias": "Lise000568", "name": "Lise Buzzard", "user-since": datetime("2010-02-14T09:27:15"), "address": {"street":"29 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{846, 782, 691, 144, 750, 816 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2009-01-01"),"end-date":date("2010-10-13")}]}
-{"id": 569, "alias": "Lyndsey000569", "name": "Lyndsey Buck", "user-since": datetime("2009-04-24T14:31:10"), "address": {"street":"53 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{242, 787, 849, 451, 29, 738, 41, 647, 92, 392, 105, 194, 110, 654, 608, 681 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2005-04-01")}]}
-{"id": 570, "alias": "Ulysses000570", "name": "Ulysses Riggle", "user-since": datetime("2007-10-23T22:27:45"), "address": {"street":"3 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{354, 260, 322, 61, 263, 505, 715, 677 }}, "employment":[{"organization-name":"Statcode","start-date":date("2005-11-09"),"end-date":date("2007-05-20")}]}
-{"id": 571, "alias": "Carlos000571", "name": "Carlos Hatherly", "user-since": datetime("2011-01-17T03:02:15"), "address": {"street":"33 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{832, 704, 29, 28, 173, 196, 156, 95, 529, 7, 542, 659, 561, 800, 360, 355, 200, 506, 585 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2001-09-21"),"end-date":date("2003-04-02")}]}
-{"id": 572, "alias": "Chang000572", "name": "Chang Clark", "user-since": datetime("2005-10-08T05:31:57"), "address": {"street":"2 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{609, 83, 561, 172, 44, 586, 863, 107, 247, 320, 410, 429, 379, 607, 213, 801, 385, 721, 271, 380, 330 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2001-06-19")}]}
-{"id": 573, "alias": "Annabell000573", "name": "Annabell Roche", "user-since": datetime("2012-01-26T11:39:04"), "address": {"street":"29 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{368, 727, 661, 755, 740, 889, 846, 750 }}, "employment":[{"organization-name":"Dancode","start-date":date("2002-09-19"),"end-date":date("2002-11-04")}]}
-{"id": 574, "alias": "Radcliff000574", "name": "Radcliff Williams", "user-since": datetime("2006-12-24T05:54:02"), "address": {"street":"23 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{11, 102, 476, 186, 518, 681, 282, 546, 347, 21, 433, 706, 817, 663, 421, 858, 442, 787, 242, 820, 606, 615 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2005-03-23")}]}
-{"id": 575, "alias": "Sheena000575", "name": "Sheena Giesen", "user-since": datetime("2013-09-23T08:59:20"), "address": {"street":"15 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{402, 850, 188, 702, 796, 755, 544, 582, 580 }}, "employment":[{"organization-name":"Quoline","start-date":date("2009-07-12")}]}
-{"id": 576, "alias": "Greg000576", "name": "Greg Shick", "user-since": datetime("2006-09-16T00:43:31"), "address": {"street":"37 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{504, 447, 889, 420, 468, 473, 569, 230, 331, 487, 679, 740 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2011-01-28"),"end-date":date("2011-02-06")}]}
-{"id": 577, "alias": "Raeann000577", "name": "Raeann Hice", "user-since": datetime("2014-07-21T03:03:02"), "address": {"street":"26 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{486, 718, 830, 24, 343, 84, 137, 428, 465, 569, 448, 726 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2002-01-22"),"end-date":date("2009-12-15")}]}
-{"id": 578, "alias": "Erwin000578", "name": "Erwin Adams", "user-since": datetime("2013-09-20T00:06:36"), "address": {"street":"71 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{258, 669, 721, 638, 437, 500, 267, 719, 309, 57, 322, 498, 621, 59, 210, 572 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2003-10-12"),"end-date":date("2004-10-24")}]}
-{"id": 579, "alias": "Alexus000579", "name": "Alexus Beedell", "user-since": datetime("2006-01-13T19:42:57"), "address": {"street":"13 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{430, 790, 818, 31, 386 }}, "employment":[{"organization-name":"Newfase","start-date":date("2007-08-01")}]}
-{"id": 580, "alias": "Quincey000580", "name": "Quincey Kettlewell", "user-since": datetime("2008-01-08T03:19:52"), "address": {"street":"34 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{741, 233, 591, 324, 898, 495, 128, 789 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2010-12-14")}]}
-{"id": 581, "alias": "Fern000581", "name": "Fern Lester", "user-since": datetime("2005-01-09T03:55:44"), "address": {"street":"36 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{815, 810, 901, 456, 194 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2008-03-17"),"end-date":date("2009-10-23")}]}
-{"id": 582, "alias": "Bebe000582", "name": "Bebe Dennis", "user-since": datetime("2011-11-05T09:30:12"), "address": {"street":"57 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"U-electrics","start-date":date("2010-09-15")}]}
-{"id": 583, "alias": "Christopher000583", "name": "Christopher Otis", "user-since": datetime("2006-06-25T23:37:58"), "address": {"street":"20 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{730, 251, 25, 892, 897, 385, 614, 396, 649, 192, 181, 444, 580, 870, 127, 143, 592, 703 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2002-02-23")}]}
-{"id": 584, "alias": "Dene000584", "name": "Dene Shaffer", "user-since": datetime("2014-08-14T03:30:39"), "address": {"street":"1 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Ransaofan","start-date":date("2010-08-22")}]}
-{"id": 585, "alias": "Scott000585", "name": "Scott Marjorie", "user-since": datetime("2014-02-28T21:34:43"), "address": {"street":"67 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{646, 893, 477, 693, 455, 649 }}, "employment":[{"organization-name":"Sublamdox","start-date":date("2006-12-07")}]}
-{"id": 586, "alias": "Madison000586", "name": "Madison Pearson", "user-since": datetime("2006-01-04T13:46:15"), "address": {"street":"39 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{263, 733, 639 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2002-07-01"),"end-date":date("2008-11-08")}]}
-{"id": 587, "alias": "Ginnie000587", "name": "Ginnie Fleming", "user-since": datetime("2008-10-09T23:41:23"), "address": {"street":"46 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{453 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2009-12-16"),"end-date":date("2009-11-25")}]}
-{"id": 588, "alias": "Angelina000588", "name": "Angelina Dimeling", "user-since": datetime("2007-12-28T12:47:06"), "address": {"street":"96 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{121, 758, 253, 59, 229, 91, 181, 395, 508, 416, 306 }}, "employment":[{"organization-name":"freshdox","start-date":date("2002-11-24"),"end-date":date("2004-01-25")}]}
-{"id": 589, "alias": "Mica000589", "name": "Mica Garry", "user-since": datetime("2013-06-11T06:52:24"), "address": {"street":"99 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{819, 304, 307, 775, 249, 831, 429, 787, 448, 337, 317, 87, 269, 454, 736, 554, 411, 51, 378, 852 }}, "employment":[{"organization-name":"strongex","start-date":date("2003-09-05")}]}
-{"id": 590, "alias": "Christopher000590", "name": "Christopher Hunter", "user-since": datetime("2007-09-08T07:41:12"), "address": {"street":"31 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{222, 796, 320, 323, 557, 889 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2002-03-11"),"end-date":date("2011-09-23")}]}
-{"id": 591, "alias": "Niles000591", "name": "Niles Warren", "user-since": datetime("2007-10-26T15:15:23"), "address": {"street":"15 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{170 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2002-08-20")}]}
-{"id": 592, "alias": "Lettice000592", "name": "Lettice Jenkins", "user-since": datetime("2009-03-02T16:26:42"), "address": {"street":"97 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{534, 155, 599, 51, 890, 295, 268, 193, 763, 716, 656, 71, 426, 328, 521, 734, 577, 647, 409, 282 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2000-09-24"),"end-date":date("2004-02-23")}]}
-{"id": 593, "alias": "Lavern000593", "name": "Lavern Wile", "user-since": datetime("2007-03-09T16:00:36"), "address": {"street":"19 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{677, 863, 834, 251, 649, 799, 139, 231, 33, 243, 57, 796, 302, 198, 847, 291, 213, 512, 448, 780, 167, 548, 421, 809 }}, "employment":[{"organization-name":"Striptaxon","start-date":date("2005-09-02"),"end-date":date("2007-08-16")}]}
-{"id": 594, "alias": "Xavior000594", "name": "Xavior Barnes", "user-since": datetime("2013-12-17T03:51:11"), "address": {"street":"89 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{464, 758, 864, 22, 865, 426, 874, 862, 400, 165, 589, 770, 12 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2000-07-13")}]}
-{"id": 595, "alias": "Angus000595", "name": "Angus Harper", "user-since": datetime("2006-09-15T02:34:05"), "address": {"street":"92 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{350, 135, 231, 381, 517, 45, 328, 23, 426, 788, 358, 289, 211, 16, 607, 467, 669, 256 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2004-09-27"),"end-date":date("2007-01-01")}]}
-{"id": 596, "alias": "Evander000596", "name": "Evander Leech", "user-since": datetime("2005-01-18T20:43:51"), "address": {"street":"36 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{477, 139, 52 }}, "employment":[{"organization-name":"Quoline","start-date":date("2000-12-21")}]}
-{"id": 597, "alias": "Romayne000597", "name": "Romayne Willcox", "user-since": datetime("2010-03-06T15:43:54"), "address": {"street":"17 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{380, 598, 84, 856, 703, 771, 623, 554 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2008-09-22")}]}
-{"id": 598, "alias": "Millard000598", "name": "Millard Armstrong", "user-since": datetime("2009-07-13T20:23:31"), "address": {"street":"37 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{622, 608, 86, 52, 522, 875, 212, 694, 586, 29, 403, 486 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2004-07-24"),"end-date":date("2009-11-08")}]}
-{"id": 599, "alias": "Leandra000599", "name": "Leandra Treeby", "user-since": datetime("2007-06-19T20:22:57"), "address": {"street":"99 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{530, 296, 362, 689, 260, 165, 849, 230, 314, 693, 242, 133, 87, 249 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2000-02-20")}]}
-{"id": 600, "alias": "Cecelia000600", "name": "Cecelia Omara", "user-since": datetime("2007-02-14T03:25:37"), "address": {"street":"60 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{400, 191, 266, 205, 493, 476, 216 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2005-08-11"),"end-date":date("2009-02-01")}]}
-{"id": 601, "alias": "Forrest000601", "name": "Forrest Casteel", "user-since": datetime("2006-01-16T15:30:26"), "address": {"street":"19 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{391, 834, 226, 782, 239, 819, 823, 623, 461 }}, "employment":[{"organization-name":"Canline","start-date":date("2008-03-08"),"end-date":date("2011-04-10")}]}
-{"id": 602, "alias": "Tristand000602", "name": "Tristand Harden", "user-since": datetime("2011-01-13T21:09:43"), "address": {"street":"79 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{36 }}, "employment":[{"organization-name":"Newcom","start-date":date("2011-09-17"),"end-date":date("2011-05-08")}]}
-{"id": 603, "alias": "Harold000603", "name": "Harold Sanner", "user-since": datetime("2012-09-06T01:50:11"), "address": {"street":"99 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{485, 698, 294, 288, 569, 687, 381, 227, 886, 852, 868, 439, 86, 600 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2000-04-23"),"end-date":date("2000-08-28")}]}
-{"id": 604, "alias": "Kimberleigh000604", "name": "Kimberleigh Biery", "user-since": datetime("2011-02-11T23:00:48"), "address": {"street":"51 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{312, 612, 873, 851, 371, 678, 818, 40, 342, 169, 19, 805, 248, 54, 547, 399, 376, 270, 163, 165 }}, "employment":[{"organization-name":"Streettax","start-date":date("2007-11-05")}]}
-{"id": 605, "alias": "Tracy000605", "name": "Tracy Losey", "user-since": datetime("2011-01-25T03:39:32"), "address": {"street":"64 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{653, 221, 265, 482, 650, 25, 452, 624 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2003-02-28")}]}
-{"id": 606, "alias": "Vince000606", "name": "Vince Wylie", "user-since": datetime("2007-05-07T02:20:00"), "address": {"street":"76 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{392, 458 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2003-08-10")}]}
-{"id": 607, "alias": "Elenor000607", "name": "Elenor Breitenstein", "user-since": datetime("2008-09-23T19:50:50"), "address": {"street":"7 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{568, 546, 230, 228, 892, 727, 258, 691, 149, 601 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2000-02-19")}]}
-{"id": 608, "alias": "Maximillian000608", "name": "Maximillian Wire", "user-since": datetime("2013-12-27T06:37:54"), "address": {"street":"67 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{603, 507, 465, 768, 897, 851, 167, 822, 129, 570, 365, 564, 722, 645, 63, 844, 652, 663, 104, 17, 253 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2000-05-20"),"end-date":date("2004-11-22")}]}
-{"id": 609, "alias": "Leida000609", "name": "Leida Coughenour", "user-since": datetime("2005-02-10T23:51:30"), "address": {"street":"58 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{111, 899, 336, 173, 537, 610, 491, 357, 521, 779, 450, 848, 188, 814, 434, 332, 873, 562, 574, 511, 465 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2002-05-03")}]}
-{"id": 610, "alias": "Selby000610", "name": "Selby Dennis", "user-since": datetime("2011-03-05T07:40:36"), "address": {"street":"50 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{618, 500, 217, 833, 370, 375, 155, 44, 799, 319, 198, 408, 136, 194, 521, 849, 563, 844, 121, 424 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2003-05-18"),"end-date":date("2007-12-26")}]}
-{"id": 611, "alias": "Lindsey000611", "name": "Lindsey Agg", "user-since": datetime("2014-05-22T15:36:49"), "address": {"street":"35 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{479, 305, 844, 828, 885, 259, 564, 877, 468, 684, 412, 139, 388, 548, 820, 777, 743 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2012-05-26")}]}
-{"id": 612, "alias": "Breana000612", "name": "Breana Hay", "user-since": datetime("2012-08-03T18:48:52"), "address": {"street":"7 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{434, 204, 112, 451, 534, 178, 605, 872, 770, 298, 745, 428, 136, 139, 620, 784, 344, 696, 7, 143, 248, 849 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2007-10-06")}]}
-{"id": 613, "alias": "Darius000613", "name": "Darius Faast", "user-since": datetime("2014-05-17T14:21:00"), "address": {"street":"84 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{226, 106, 783, 796, 245, 898, 880, 680, 182, 283 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2005-03-18"),"end-date":date("2007-03-23")}]}
-{"id": 614, "alias": "Qiana000614", "name": "Qiana Bonner", "user-since": datetime("2008-11-19T15:48:19"), "address": {"street":"15 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{853, 206, 169, 66, 434, 802, 681, 164, 289, 186, 720, 719, 147, 670, 261, 293, 249, 738, 127, 250 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2001-09-17")}]}
-{"id": 615, "alias": "Leighton000615", "name": "Leighton James", "user-since": datetime("2010-04-03T08:26:28"), "address": {"street":"79 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{761, 269, 737, 723, 261, 315, 594, 630, 415, 880, 119, 845, 707, 817, 582 }}, "employment":[{"organization-name":"Dancode","start-date":date("2012-04-21"),"end-date":date("2012-07-25")}]}
-{"id": 616, "alias": "Marina000616", "name": "Marina Shaffer", "user-since": datetime("2011-02-04T23:24:56"), "address": {"street":"72 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{207, 228, 833, 799 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2011-02-27")}]}
-{"id": 617, "alias": "Phoebe000617", "name": "Phoebe Werner", "user-since": datetime("2005-05-26T12:28:54"), "address": {"street":"28 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{11, 328, 49, 83, 211, 843, 105, 100, 690, 82, 18, 505, 751, 475, 762, 833, 756, 553, 164, 877, 95, 716, 399 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2001-05-07"),"end-date":date("2011-12-11")}]}
-{"id": 618, "alias": "Daren000618", "name": "Daren Read", "user-since": datetime("2012-03-21T05:32:53"), "address": {"street":"83 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{388, 546, 194, 735, 405, 447, 332, 70, 18, 99, 300, 496, 811, 774, 867, 865 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2007-12-19")}]}
-{"id": 619, "alias": "Debora000619", "name": "Debora Sommer", "user-since": datetime("2006-01-19T09:17:03"), "address": {"street":"28 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{369, 484, 424, 516, 389, 899, 445, 742, 330, 429, 142, 708, 491, 180, 317, 719, 129, 50, 34, 631, 582, 253, 404, 69 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2001-02-26"),"end-date":date("2007-08-02")}]}
-{"id": 620, "alias": "Calanthe000620", "name": "Calanthe Rhinehart", "user-since": datetime("2005-12-05T16:40:31"), "address": {"street":"66 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{210, 872, 776, 716, 29, 397, 195, 64, 13, 391, 204, 262, 455, 289, 704, 711, 580, 536 }}, "employment":[{"organization-name":"Solfix","start-date":date("2011-02-17")}]}
-{"id": 621, "alias": "Romey000621", "name": "Romey Ramsey", "user-since": datetime("2007-02-12T20:04:55"), "address": {"street":"22 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{353, 792, 800, 185, 134, 393, 535, 283 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2001-08-27"),"end-date":date("2004-02-02")}]}
-{"id": 622, "alias": "Lilian000622", "name": "Lilian Erskine", "user-since": datetime("2008-12-14T05:31:05"), "address": {"street":"16 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{115, 461, 5, 488, 478, 452, 464, 705, 751, 590, 805, 220, 109, 740, 270, 393, 349, 548, 242, 408, 865, 345, 487, 45 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2005-08-20")}]}
-{"id": 623, "alias": "Nana000623", "name": "Nana Stoddard", "user-since": datetime("2009-02-25T23:06:44"), "address": {"street":"25 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Coneflex","start-date":date("2007-12-02")}]}
-{"id": 624, "alias": "Marlyn000624", "name": "Marlyn Eastwood", "user-since": datetime("2006-06-15T16:25:44"), "address": {"street":"91 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{424, 715, 515, 636, 621, 791, 698, 27, 278, 108, 71, 627, 313, 210, 160, 226 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2011-02-06")}]}
-{"id": 625, "alias": "Renaldo000625", "name": "Renaldo Jackson", "user-since": datetime("2009-02-13T09:25:19"), "address": {"street":"72 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{65, 753, 823, 68, 454, 601, 567, 898, 370, 401, 846, 895, 324, 872, 254, 737 }}, "employment":[{"organization-name":"Salthex","start-date":date("2009-11-22"),"end-date":date("2011-08-12")}]}
-{"id": 626, "alias": "Jancis000626", "name": "Jancis Zaun", "user-since": datetime("2009-10-08T19:09:26"), "address": {"street":"8 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Fixdintex","start-date":date("2005-04-21")}]}
-{"id": 627, "alias": "Josslyn000627", "name": "Josslyn Guest", "user-since": datetime("2006-09-22T03:48:17"), "address": {"street":"79 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{752, 566, 786, 250, 590, 53, 71, 336, 826, 223 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2011-11-12"),"end-date":date("2011-06-14")}]}
-{"id": 628, "alias": "Reed000628", "name": "Reed Davis", "user-since": datetime("2007-04-03T04:00:14"), "address": {"street":"63 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{101, 469, 429, 54, 772, 516, 490, 758, 86, 384, 285, 326, 852, 529, 620, 202, 170 }}, "employment":[{"organization-name":"Technohow","start-date":date("2003-07-06"),"end-date":date("2010-08-07")}]}
-{"id": 629, "alias": "Clancy000629", "name": "Clancy Zalack", "user-since": datetime("2006-01-12T08:21:13"), "address": {"street":"86 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{162, 891, 430, 397, 493, 371, 78, 388, 672, 198, 597, 488, 890, 89, 636, 574, 257, 58, 510, 560, 322, 101 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2000-05-28"),"end-date":date("2011-02-06")}]}
-{"id": 630, "alias": "Deirdre000630", "name": "Deirdre Putnam", "user-since": datetime("2014-08-04T10:45:17"), "address": {"street":"67 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{133, 599, 138, 390, 365, 851, 154, 324, 553, 782, 342, 388, 160, 540, 454, 701, 26, 893, 870, 613, 118, 527, 688, 237 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2009-10-23"),"end-date":date("2009-03-02")}]}
-{"id": 631, "alias": "Madlyn000631", "name": "Madlyn Light", "user-since": datetime("2007-03-11T03:31:23"), "address": {"street":"89 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{274, 107, 731, 245, 316, 709, 494, 568, 867, 385, 615, 671, 460, 831, 355, 459, 859, 399 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2001-03-26"),"end-date":date("2002-11-26")}]}
-{"id": 632, "alias": "Ines000632", "name": "Ines Wain", "user-since": datetime("2013-05-14T23:39:09"), "address": {"street":"13 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{633, 181, 669, 293, 827, 683, 549, 14, 38, 230, 286, 714, 691, 677, 880, 580, 172, 27, 312, 713, 206, 540, 824 }}, "employment":[{"organization-name":"Alphadax","start-date":date("2012-04-11"),"end-date":date("2012-05-01")}]}
-{"id": 633, "alias": "Wilma000633", "name": "Wilma Brindle", "user-since": datetime("2011-05-09T11:49:05"), "address": {"street":"23 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{129, 662, 359, 172, 814, 243, 697, 656, 97, 479, 186 }}, "employment":[{"organization-name":"Redelectronics","start-date":date("2001-11-03"),"end-date":date("2011-04-11")}]}
-{"id": 634, "alias": "Doran000634", "name": "Doran Gearhart", "user-since": datetime("2005-10-07T14:47:56"), "address": {"street":"94 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{540, 315, 298, 498, 234, 532, 678, 784, 217, 330, 385, 53, 760, 842, 601, 183 }}, "employment":[{"organization-name":"Tanzumbam","start-date":date("2004-01-28")}]}
-{"id": 635, "alias": "Bart000635", "name": "Bart Philips", "user-since": datetime("2008-03-14T01:34:26"), "address": {"street":"91 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{751 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2001-12-07")}]}
-{"id": 636, "alias": "Bettie000636", "name": "Bettie Butterfill", "user-since": datetime("2009-05-15T12:52:32"), "address": {"street":"86 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{409, 789, 775, 194, 613, 302, 143, 658, 646, 182, 414 }}, "employment":[{"organization-name":"Xx-drill","start-date":date("2002-11-01"),"end-date":date("2003-08-26")}]}
-{"id": 637, "alias": "Stephania000637", "name": "Stephania Swartzbaugh", "user-since": datetime("2012-08-01T22:43:42"), "address": {"street":"98 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{750, 301, 269, 421, 543, 18, 90, 182, 146, 358, 84, 827, 829, 524 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2011-06-15"),"end-date":date("2011-09-09")}]}
-{"id": 638, "alias": "Xavier000638", "name": "Xavier Drabble", "user-since": datetime("2005-12-03T17:42:27"), "address": {"street":"56 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{83, 177, 676, 781, 836, 512, 527, 603 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2012-03-24")}]}
-{"id": 639, "alias": "Jacques000639", "name": "Jacques Bash", "user-since": datetime("2006-08-25T01:29:47"), "address": {"street":"95 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{307, 506, 663, 517, 291, 143, 179, 266, 601, 882 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2000-01-14")}]}
-{"id": 640, "alias": "Doug000640", "name": "Doug Burnett", "user-since": datetime("2005-11-22T15:12:04"), "address": {"street":"32 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{505, 482, 434, 768, 502, 238, 576, 878, 742, 300, 226, 687, 741, 361, 525, 42, 279, 290, 273, 225, 608, 261, 775 }}, "employment":[{"organization-name":"Salthex","start-date":date("2008-01-12"),"end-date":date("2008-12-13")}]}
-{"id": 641, "alias": "Derek000641", "name": "Derek Tanner", "user-since": datetime("2013-07-16T14:09:24"), "address": {"street":"63 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{667, 336, 216, 750, 619, 296, 190, 477, 263, 455, 622, 690 }}, "employment":[{"organization-name":"Basecone","start-date":date("2003-01-25")}]}
-{"id": 642, "alias": "Rowanne000642", "name": "Rowanne Garneys", "user-since": datetime("2014-02-14T01:06:14"), "address": {"street":"51 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{439, 117 }}, "employment":[{"organization-name":"kin-ron","start-date":date("2000-01-14")}]}
-{"id": 643, "alias": "Glenna000643", "name": "Glenna Young", "user-since": datetime("2012-10-28T22:18:20"), "address": {"street":"62 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{144, 633, 740, 860, 439 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2009-12-06"),"end-date":date("2010-09-22")}]}
-{"id": 644, "alias": "Kayla000644", "name": "Kayla Stainforth", "user-since": datetime("2005-03-10T11:33:34"), "address": {"street":"46 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{795, 444, 639, 70 }}, "employment":[{"organization-name":"physcane","start-date":date("2009-01-03"),"end-date":date("2011-02-11")}]}
-{"id": 645, "alias": "Jonas000645", "name": "Jonas Pfeifer", "user-since": datetime("2010-04-05T20:03:10"), "address": {"street":"42 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{85, 211, 425, 109, 460, 8, 825, 617, 540, 265, 506, 762, 646, 72, 10, 464, 788, 490 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2006-12-08"),"end-date":date("2010-09-03")}]}
-{"id": 646, "alias": "Tallulah000646", "name": "Tallulah Hill", "user-since": datetime("2014-07-15T07:54:36"), "address": {"street":"32 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{707, 136, 119, 720 }}, "employment":[{"organization-name":"Newfase","start-date":date("2002-06-27"),"end-date":date("2005-07-01")}]}
-{"id": 647, "alias": "Kimmy000647", "name": "Kimmy Hardy", "user-since": datetime("2006-12-17T12:51:01"), "address": {"street":"76 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{750, 59, 241, 18, 22, 555, 761, 654, 813, 154, 527, 871, 684, 351, 899, 667, 642, 881, 459, 862, 646 }}, "employment":[{"organization-name":"Greencare","start-date":date("2012-05-05")}]}
-{"id": 648, "alias": "Andreas000648", "name": "Andreas Diller", "user-since": datetime("2007-08-07T04:55:40"), "address": {"street":"43 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{746, 27, 798, 591, 143, 617, 460, 5, 622, 9, 285, 224, 695, 579, 75, 131, 228 }}, "employment":[{"organization-name":"Doublezone","start-date":date("2006-06-22"),"end-date":date("2011-07-20")}]}
-{"id": 649, "alias": "Harley000649", "name": "Harley Hall", "user-since": datetime("2009-12-05T21:56:00"), "address": {"street":"78 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{274, 91, 194, 894, 852, 75, 167, 534, 7, 393, 586, 861, 303, 446, 3, 24, 806, 895, 202, 731, 418, 128 }}, "employment":[{"organization-name":"Groovetex","start-date":date("2006-09-19"),"end-date":date("2010-04-19")}]}
-{"id": 650, "alias": "Mo000650", "name": "Mo Henry", "user-since": datetime("2009-04-25T07:22:25"), "address": {"street":"36 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{57, 75, 285, 610, 236, 887 }}, "employment":[{"organization-name":"tresline","start-date":date("2001-12-27"),"end-date":date("2004-05-20")}]}
-{"id": 651, "alias": "August000651", "name": "August Powers", "user-since": datetime("2008-02-06T07:17:25"), "address": {"street":"82 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{290, 815, 413, 551, 813, 303 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2011-09-06"),"end-date":date("2011-05-08")}]}
-{"id": 652, "alias": "Alverta000652", "name": "Alverta Weisgarber", "user-since": datetime("2008-01-03T13:49:59"), "address": {"street":"17 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{523, 59, 672, 659, 571, 792, 183, 395, 868, 557, 777, 748, 245, 536, 782 }}, "employment":[{"organization-name":"Unijobam","start-date":date("2010-08-26")}]}
-{"id": 653, "alias": "Garrick000653", "name": "Garrick Young", "user-since": datetime("2012-12-02T12:04:37"), "address": {"street":"98 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{134, 813, 840, 169, 537, 106, 889, 140, 527, 442, 30, 293, 136, 641, 326, 775, 146 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2011-09-07")}]}
-{"id": 654, "alias": "Reina000654", "name": "Reina Armstrong", "user-since": datetime("2008-07-28T14:37:24"), "address": {"street":"35 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{529, 422, 398, 524, 292, 727, 856, 276, 564, 579, 871, 200 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2003-02-25")}]}
-{"id": 655, "alias": "Maitland000655", "name": "Maitland Gisiko", "user-since": datetime("2010-12-21T09:10:29"), "address": {"street":"89 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{514, 842, 453, 872, 655, 692, 193, 530 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2001-10-12")}]}
-{"id": 656, "alias": "Lloyd000656", "name": "Lloyd Harrold", "user-since": datetime("2008-03-28T03:12:29"), "address": {"street":"61 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{418, 761, 677, 606, 858, 614, 778, 719, 829, 626, 257, 90, 774, 85, 430, 534, 508, 687, 338 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2008-12-21")}]}
-{"id": 657, "alias": "Adrianna000657", "name": "Adrianna Holtzer", "user-since": datetime("2005-11-09T13:10:05"), "address": {"street":"61 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{654, 33, 473, 254, 67, 441, 591, 518, 61, 487, 525, 220, 602, 782, 801, 149, 307, 763, 586, 711, 259, 545, 359, 848 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2001-11-04")}]}
-{"id": 658, "alias": "Jalisa000658", "name": "Jalisa Whishaw", "user-since": datetime("2006-10-12T06:00:56"), "address": {"street":"55 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{606, 718, 469, 186 }}, "employment":[{"organization-name":"Quoline","start-date":date("2001-11-15"),"end-date":date("2001-01-12")}]}
-{"id": 659, "alias": "Anabel000659", "name": "Anabel Hawker", "user-since": datetime("2013-08-06T23:42:42"), "address": {"street":"96 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{629, 861, 434, 805, 293, 495, 467, 596, 117 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2004-09-08"),"end-date":date("2010-06-10")}]}
-{"id": 660, "alias": "Bobby000660", "name": "Bobby Thomas", "user-since": datetime("2014-06-24T23:13:00"), "address": {"street":"33 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{726, 187, 775, 622, 665, 856, 523, 250, 855, 690, 300, 341, 654, 861, 708 }}, "employment":[{"organization-name":"Doncare","start-date":date("2006-07-03")}]}
-{"id": 661, "alias": "Candice000661", "name": "Candice Murray", "user-since": datetime("2008-08-03T11:43:54"), "address": {"street":"12 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{175, 109, 619, 138, 532, 200, 815, 826, 429, 719, 880, 658, 398, 106, 338, 541, 524, 704, 257, 530, 747, 27 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2007-10-09")}]}
-{"id": 662, "alias": "Andre000662", "name": "Andre Briner", "user-since": datetime("2008-08-03T12:03:57"), "address": {"street":"57 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{408 }}, "employment":[{"organization-name":"linedexon","start-date":date("2012-01-19"),"end-date":date("2012-02-28")}]}
-{"id": 663, "alias": "Rosaline000663", "name": "Rosaline Dale", "user-since": datetime("2005-03-04T04:01:58"), "address": {"street":"36 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Sancone","start-date":date("2011-07-22"),"end-date":date("2011-10-13")}]}
-{"id": 664, "alias": "Randolf000664", "name": "Randolf Ann", "user-since": datetime("2013-02-11T06:59:00"), "address": {"street":"14 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{545 }}, "employment":[{"organization-name":"Solophase","start-date":date("2012-04-16")}]}
-{"id": 665, "alias": "Andra000665", "name": "Andra Sholl", "user-since": datetime("2009-08-23T01:33:10"), "address": {"street":"61 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{719, 172, 710, 112, 78, 457 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2009-02-26")}]}
-{"id": 666, "alias": "Stephany000666", "name": "Stephany Raybould", "user-since": datetime("2012-05-26T01:10:27"), "address": {"street":"49 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{161, 880, 207, 838, 673, 638, 893, 66, 259, 394, 460, 832, 887, 434, 796 }}, "employment":[{"organization-name":"Hexsanhex","start-date":date("2012-07-16")}]}
-{"id": 667, "alias": "Vinnie000667", "name": "Vinnie Rummel", "user-since": datetime("2013-11-20T03:18:20"), "address": {"street":"77 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{516, 477, 469, 93, 655, 652, 475, 866 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2000-10-23")}]}
-{"id": 668, "alias": "Aurelio000668", "name": "Aurelio Patterson", "user-since": datetime("2010-02-11T19:42:32"), "address": {"street":"63 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{426, 193, 190, 355, 256, 488, 215, 6, 104, 733, 91, 855, 847, 351, 57, 93, 46, 634, 270, 561, 885, 818, 864 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2002-06-14"),"end-date":date("2002-05-24")}]}
-{"id": 669, "alias": "Bernie000669", "name": "Bernie Roberts", "user-since": datetime("2006-01-25T20:48:35"), "address": {"street":"48 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{98, 855, 380, 545, 381, 289, 460, 201, 847, 661, 13, 638 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2000-06-28")}]}
-{"id": 670, "alias": "Quiana000670", "name": "Quiana Huston", "user-since": datetime("2011-05-24T03:25:14"), "address": {"street":"35 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{246, 82, 871, 511, 841, 837, 305, 363, 101, 236, 390, 484, 752, 321, 353, 870, 499, 173, 637, 171, 604 }}, "employment":[{"organization-name":"Inchex","start-date":date("2007-12-12"),"end-date":date("2010-08-02")}]}
-{"id": 671, "alias": "Charles000671", "name": "Charles Ratcliff", "user-since": datetime("2013-05-14T08:01:26"), "address": {"street":"34 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{48, 46, 825, 225, 479, 209, 163, 352, 726, 228, 111, 629, 461, 603, 168, 360, 257, 637 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2004-08-19")}]}
-{"id": 672, "alias": "Jamika000672", "name": "Jamika Congdon", "user-since": datetime("2007-12-22T11:11:12"), "address": {"street":"58 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{284, 531, 534, 150 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2005-11-03")}]}
-{"id": 673, "alias": "Manual000673", "name": "Manual Raub", "user-since": datetime("2005-12-07T23:30:21"), "address": {"street":"94 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{541, 63, 708, 547, 345, 273, 298, 394 }}, "employment":[{"organization-name":"over-it","start-date":date("2010-03-12")}]}
-{"id": 674, "alias": "Crystal000674", "name": "Crystal Shick", "user-since": datetime("2011-07-05T05:21:03"), "address": {"street":"87 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{636, 438, 22, 695, 28, 833, 571, 91, 564, 392, 726, 112, 547, 628, 250, 289, 580, 108 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2007-04-14")}]}
-{"id": 675, "alias": "Romey000675", "name": "Romey Swabey", "user-since": datetime("2013-04-06T15:29:21"), "address": {"street":"45 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{356, 225, 486, 36, 610, 740, 376, 703, 663, 214, 37, 347, 109, 625, 808, 594, 742, 312, 886, 404, 857, 548, 16, 778 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2005-09-03")}]}
-{"id": 676, "alias": "Lourdes000676", "name": "Lourdes Basinger", "user-since": datetime("2014-05-21T23:50:11"), "address": {"street":"15 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{211, 92, 650, 353, 284, 7, 118, 32, 687, 863, 235, 34, 502, 214, 408, 888, 550, 256 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2006-08-19")}]}
-{"id": 677, "alias": "Shell000677", "name": "Shell Rader", "user-since": datetime("2006-07-22T12:54:43"), "address": {"street":"42 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{93, 163, 698, 56, 362, 329 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2005-05-22")}]}
-{"id": 678, "alias": "Ysabel000678", "name": "Ysabel Bennett", "user-since": datetime("2010-06-14T01:57:08"), "address": {"street":"50 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{211 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2000-10-11")}]}
-{"id": 679, "alias": "Kitty000679", "name": "Kitty Dimeling", "user-since": datetime("2005-03-12T03:05:44"), "address": {"street":"20 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{604, 761, 426, 218, 26, 411, 49, 810, 632, 200, 583, 454, 304, 443, 786, 712, 893, 690, 237, 209, 484, 508, 815 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2001-12-05")}]}
-{"id": 680, "alias": "Franklyn000680", "name": "Franklyn Grant", "user-since": datetime("2013-08-06T04:26:25"), "address": {"street":"52 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{432, 684, 739, 631, 821, 190, 512, 708, 198, 779, 466, 785, 853, 584, 429 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2000-09-16")}]}
-{"id": 681, "alias": "Silvestra000681", "name": "Silvestra Pheleps", "user-since": datetime("2007-02-21T16:52:00"), "address": {"street":"11 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{480, 765, 405 }}, "employment":[{"organization-name":"Xx-drill","start-date":date("2012-01-22")}]}
-{"id": 682, "alias": "Giselle000682", "name": "Giselle Mcindoe", "user-since": datetime("2010-03-23T20:05:32"), "address": {"street":"47 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{458, 346, 89, 736, 77, 692, 254, 556, 477, 109, 330, 136, 425 }}, "employment":[{"organization-name":"linedexon","start-date":date("2011-12-17")}]}
-{"id": 683, "alias": "Bettina000683", "name": "Bettina Elder", "user-since": datetime("2013-06-02T22:26:42"), "address": {"street":"43 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{412, 786, 706, 96, 407, 618, 865, 533, 431, 108, 572, 878, 508, 84, 418, 653, 453, 757 }}, "employment":[{"organization-name":"Salthex","start-date":date("2008-01-19")}]}
-{"id": 684, "alias": "Cairo000684", "name": "Cairo Robinson", "user-since": datetime("2013-10-18T22:30:14"), "address": {"street":"32 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{19 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2008-05-02")}]}
-{"id": 685, "alias": "Lettice000685", "name": "Lettice Jenner", "user-since": datetime("2009-12-20T23:33:29"), "address": {"street":"4 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{564, 200, 704, 622, 872, 373, 830, 756, 687, 225, 326, 38, 399, 430, 865 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2001-01-05")}]}
-{"id": 686, "alias": "Michel000686", "name": "Michel Fuchs", "user-since": datetime("2014-04-27T01:08:05"), "address": {"street":"10 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{143, 48, 637, 614, 604, 346 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2001-07-20")}]}
-{"id": 687, "alias": "Blanche000687", "name": "Blanche Thomas", "user-since": datetime("2006-12-09T06:22:51"), "address": {"street":"78 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{667, 30, 721, 37, 659, 195, 458, 212, 433, 499, 787, 414, 630, 894, 259, 449, 602, 814, 340, 145, 275, 210, 477 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2005-09-06"),"end-date":date("2006-02-17")}]}
-{"id": 688, "alias": "Howard000688", "name": "Howard Hill", "user-since": datetime("2010-07-26T23:07:32"), "address": {"street":"51 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{865, 258, 44, 405, 427, 477, 817, 190, 482, 64, 23, 784, 395, 54, 174, 726 }}, "employment":[{"organization-name":"Goldcity","start-date":date("2008-12-01")}]}
-{"id": 689, "alias": "Moses000689", "name": "Moses Weingarten", "user-since": datetime("2005-06-02T11:12:01"), "address": {"street":"24 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{308, 333, 414, 562 }}, "employment":[{"organization-name":"Solfix","start-date":date("2001-05-06"),"end-date":date("2002-07-05")}]}
-{"id": 690, "alias": "Samatha000690", "name": "Samatha Herndon", "user-since": datetime("2007-04-04T12:03:56"), "address": {"street":"63 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{606, 98, 146, 567, 757, 147, 484, 524, 734, 628, 181, 627, 126 }}, "employment":[{"organization-name":"Technohow","start-date":date("2005-01-13"),"end-date":date("2006-06-26")}]}
-{"id": 691, "alias": "Roxanne000691", "name": "Roxanne Sandford", "user-since": datetime("2010-01-27T22:49:47"), "address": {"street":"5 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{439, 77, 572, 712, 750, 878, 462, 757 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2009-05-26")}]}
-{"id": 692, "alias": "Laura000692", "name": "Laura Basinger", "user-since": datetime("2006-01-17T04:03:56"), "address": {"street":"95 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{680, 601, 744, 317, 156, 846, 459, 863, 668, 766, 283, 572, 75, 656 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2011-03-10"),"end-date":date("2011-05-08")}]}
-{"id": 693, "alias": "Heide000693", "name": "Heide Mccune", "user-since": datetime("2010-11-19T00:10:34"), "address": {"street":"90 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{42, 758, 212, 63, 204, 619, 172, 822, 173, 116, 543, 673, 643, 177, 754, 834, 639, 113, 701, 485, 712, 33, 195, 843 }}, "employment":[{"organization-name":"strongex","start-date":date("2011-12-19"),"end-date":date("2011-06-05")}]}
-{"id": 694, "alias": "Carson000694", "name": "Carson Stough", "user-since": datetime("2010-08-01T15:06:01"), "address": {"street":"39 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{156, 378, 845, 681, 392, 768 }}, "employment":[{"organization-name":"Quoline","start-date":date("2009-07-04")}]}
-{"id": 695, "alias": "Bernice000695", "name": "Bernice Erschoff", "user-since": datetime("2014-05-09T08:55:29"), "address": {"street":"12 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{790, 468, 795, 237, 527, 248, 367, 239, 270, 164, 277, 799, 871, 393, 244, 883, 593, 857, 389, 388 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2002-08-15"),"end-date":date("2002-10-28")}]}
-{"id": 696, "alias": "Pollie000696", "name": "Pollie Huey", "user-since": datetime("2013-06-20T15:10:09"), "address": {"street":"89 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{380, 305, 97, 660, 201 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2007-06-08")}]}
-{"id": 697, "alias": "Ormerod000697", "name": "Ormerod Hahn", "user-since": datetime("2006-05-13T18:05:38"), "address": {"street":"53 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{507, 477, 899, 542, 44, 235, 38, 736, 888, 262, 675, 720, 876 }}, "employment":[{"organization-name":"Ganjastrip","start-date":date("2007-10-09")}]}
-{"id": 698, "alias": "Saffie000698", "name": "Saffie Schneider", "user-since": datetime("2006-03-14T07:37:17"), "address": {"street":"11 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{646, 427, 844, 196, 695, 866, 732, 863, 425, 756, 294, 768, 487, 461, 213, 650, 321 }}, "employment":[{"organization-name":"Streettax","start-date":date("2009-04-07"),"end-date":date("2011-05-09")}]}
-{"id": 699, "alias": "Wallis000699", "name": "Wallis Buttermore", "user-since": datetime("2010-02-17T08:47:28"), "address": {"street":"97 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{845, 42, 43, 551, 540, 335, 344, 31, 654, 276, 815, 7, 586, 113, 169, 146, 46, 547 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2003-06-25")}]}
-{"id": 700, "alias": "Charles000700", "name": "Charles Pratt", "user-since": datetime("2010-01-24T05:11:22"), "address": {"street":"27 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{331, 54, 639, 535, 673, 816, 276, 889, 156, 701, 703, 195, 295, 289, 594, 346, 420, 817, 814 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2008-07-14")}]}
-{"id": 701, "alias": "Leah000701", "name": "Leah Swabey", "user-since": datetime("2009-09-13T20:17:31"), "address": {"street":"61 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{616, 41, 268, 647, 385, 64, 453, 860, 881, 12, 39, 701, 140, 531, 121, 378, 214, 673, 297, 7 }}, "employment":[{"organization-name":"Streettax","start-date":date("2002-12-10"),"end-date":date("2005-02-22")}]}
-{"id": 702, "alias": "Aline000702", "name": "Aline Logue", "user-since": datetime("2007-05-17T16:28:46"), "address": {"street":"26 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{448, 687, 42, 593, 307, 370, 889 }}, "employment":[{"organization-name":"Whitemedia","start-date":date("2008-03-03")}]}
-{"id": 703, "alias": "Maggie000703", "name": "Maggie Fulton", "user-since": datetime("2010-05-21T03:09:20"), "address": {"street":"12 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{203, 447, 735, 815, 365, 324, 659, 309, 110, 545, 617, 843, 459, 289 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2000-07-25")}]}
-{"id": 704, "alias": "Joshawa000704", "name": "Joshawa Potter", "user-since": datetime("2013-07-06T01:43:30"), "address": {"street":"23 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{548, 550 }}, "employment":[{"organization-name":"Tanzimcare","start-date":date("2000-02-09")}]}
-{"id": 705, "alias": "Yaron000705", "name": "Yaron Chase", "user-since": datetime("2006-10-26T10:09:00"), "address": {"street":"85 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{76 }}, "employment":[{"organization-name":"Hot-tech","start-date":date("2005-09-17"),"end-date":date("2010-04-14")}]}
-{"id": 706, "alias": "Dwayne000706", "name": "Dwayne Kifer", "user-since": datetime("2008-05-19T11:00:39"), "address": {"street":"62 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{511, 322, 541, 156, 817, 698, 378, 880, 607, 669, 108, 171, 14, 51, 884, 466, 381, 691, 405, 842 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2009-11-25"),"end-date":date("2010-07-28")}]}
-{"id": 707, "alias": "Jewell000707", "name": "Jewell Swarner", "user-since": datetime("2006-08-01T19:00:57"), "address": {"street":"57 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{327, 46, 539, 120, 800, 587, 516, 93, 437, 258, 459, 380, 273 }}, "employment":[{"organization-name":"strongex","start-date":date("2004-03-02")}]}
-{"id": 708, "alias": "Janis000708", "name": "Janis Agnes", "user-since": datetime("2011-10-13T05:56:23"), "address": {"street":"85 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{489, 174, 442, 772, 167, 241, 521, 611, 854, 160, 219, 4, 361, 127 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2009-04-04")}]}
-{"id": 709, "alias": "Carol000709", "name": "Carol Wallace", "user-since": datetime("2013-04-04T07:17:50"), "address": {"street":"89 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{406, 403, 600, 311, 378, 705, 296, 237, 74, 423, 140, 412, 718, 190, 786, 431, 776, 807, 477, 449, 195, 514, 701, 133 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2004-05-14")}]}
-{"id": 710, "alias": "Bernardina000710", "name": "Bernardina Ullman", "user-since": datetime("2008-02-14T06:00:43"), "address": {"street":"91 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{613, 612, 556, 541, 867, 549, 91, 309, 649, 726, 709, 186, 822, 71, 564, 170, 659, 421, 428, 286, 445, 873, 258 }}, "employment":[{"organization-name":"itlab","start-date":date("2009-07-01")}]}
-{"id": 711, "alias": "Terrell000711", "name": "Terrell Weldi", "user-since": datetime("2008-08-20T11:19:49"), "address": {"street":"90 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{264, 865, 697, 543, 840, 603, 103, 855, 471, 72, 671, 295, 6, 424, 88, 51, 509 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2007-02-09"),"end-date":date("2009-01-11")}]}
-{"id": 712, "alias": "Alex000712", "name": "Alex Knight", "user-since": datetime("2005-03-01T15:22:42"), "address": {"street":"69 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{698, 583, 745, 504, 759, 524, 23, 13, 844, 32, 664, 702, 449, 359, 871, 785, 324, 507, 875 }}, "employment":[{"organization-name":"overtech","start-date":date("2007-01-20"),"end-date":date("2007-07-26")}]}
-{"id": 713, "alias": "Kolleen000713", "name": "Kolleen Saylor", "user-since": datetime("2012-06-13T07:28:47"), "address": {"street":"33 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{21, 687, 92, 275, 156 }}, "employment":[{"organization-name":"physcane","start-date":date("2002-03-11"),"end-date":date("2010-10-15")}]}
-{"id": 714, "alias": "Loyd000714", "name": "Loyd Fox", "user-since": datetime("2005-08-28T11:25:29"), "address": {"street":"48 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{894, 169, 492, 749, 353, 338, 189, 54, 225, 596, 176, 490, 203, 154, 497, 806, 141, 662, 507, 895, 568 }}, "employment":[{"organization-name":"geomedia","start-date":date("2005-03-26")}]}
-{"id": 715, "alias": "Esmeralda000715", "name": "Esmeralda Endsley", "user-since": datetime("2009-04-06T17:11:45"), "address": {"street":"96 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{102, 169, 635, 363, 551, 562, 868, 776, 279 }}, "employment":[{"organization-name":"Sublamdox","start-date":date("2009-12-02")}]}
-{"id": 716, "alias": "Lalo000716", "name": "Lalo Erschoff", "user-since": datetime("2005-04-09T09:24:23"), "address": {"street":"96 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{326, 791, 893 }}, "employment":[{"organization-name":"Hexviafind","start-date":date("2012-03-20")}]}
-{"id": 717, "alias": "Marcel000717", "name": "Marcel Poley", "user-since": datetime("2006-07-19T04:39:08"), "address": {"street":"16 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{245, 391, 220, 890, 538, 616, 454, 433, 313, 701, 15, 493 }}, "employment":[{"organization-name":"Keytech","start-date":date("2003-10-07"),"end-date":date("2003-04-16")}]}
-{"id": 718, "alias": "Marylyn000718", "name": "Marylyn Henry", "user-since": datetime("2012-02-10T15:56:25"), "address": {"street":"71 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{32 }}, "employment":[{"organization-name":"geomedia","start-date":date("2001-04-27"),"end-date":date("2008-04-28")}]}
-{"id": 719, "alias": "Fortune000719", "name": "Fortune Children", "user-since": datetime("2012-03-22T14:30:00"), "address": {"street":"1 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{373, 259, 133 }}, "employment":[{"organization-name":"Vivaace","start-date":date("2010-01-04")}]}
-{"id": 720, "alias": "Arcelia000720", "name": "Arcelia Carpenter", "user-since": datetime("2013-02-25T15:31:22"), "address": {"street":"17 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{447, 521, 505, 295, 651, 26, 122, 509, 424, 149, 504, 854, 190, 248, 727, 366 }}, "employment":[{"organization-name":"Canline","start-date":date("2004-03-01"),"end-date":date("2004-12-19")}]}
-{"id": 721, "alias": "Connell000721", "name": "Connell Hindman", "user-since": datetime("2006-08-07T12:03:27"), "address": {"street":"58 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{279, 674 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2007-06-01")}]}
-{"id": 722, "alias": "Anamaria000722", "name": "Anamaria Poorbaugh", "user-since": datetime("2011-09-21T20:26:27"), "address": {"street":"88 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{457, 131, 145, 185, 219, 455, 332, 618, 854, 838, 872, 816, 438, 405, 83, 373, 516 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2006-03-02"),"end-date":date("2009-07-28")}]}
-{"id": 723, "alias": "Clement000723", "name": "Clement Fuchs", "user-since": datetime("2013-05-16T14:49:02"), "address": {"street":"76 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{1, 444, 795, 239, 233, 686, 99, 384, 110, 160, 319, 622 }}, "employment":[{"organization-name":"Viatechi","start-date":date("2005-02-13")}]}
-{"id": 724, "alias": "Dean000724", "name": "Dean Wire", "user-since": datetime("2005-11-23T12:13:43"), "address": {"street":"60 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{818, 565, 417, 641, 286, 114, 805, 560, 678, 125, 112, 873, 84, 866, 137, 578, 129, 178, 642, 553, 58, 466, 596, 661 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2000-02-11")}]}
-{"id": 725, "alias": "Kassidy000725", "name": "Kassidy Kistler", "user-since": datetime("2005-07-11T08:34:33"), "address": {"street":"21 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{661, 567, 397, 90, 597, 645, 801, 48, 275, 298, 670, 182, 744, 130, 60, 372, 115, 682, 427, 166, 757, 177, 438, 340 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2010-01-28"),"end-date":date("2011-07-23")}]}
-{"id": 726, "alias": "Katelyn000726", "name": "Katelyn Morgan", "user-since": datetime("2007-03-07T06:30:06"), "address": {"street":"49 Third Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{112, 641, 492, 759, 661, 727, 220, 68, 371, 561, 77, 622, 804, 111, 596, 118, 870, 675, 436, 705 }}, "employment":[{"organization-name":"Greencare","start-date":date("2004-11-19")}]}
-{"id": 727, "alias": "Norberto000727", "name": "Norberto Callison", "user-since": datetime("2014-04-19T22:13:01"), "address": {"street":"12 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{716, 606, 754, 286 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2007-06-11")}]}
-{"id": 728, "alias": "Darius000728", "name": "Darius Jenkins", "user-since": datetime("2010-12-14T03:10:20"), "address": {"street":"11 Third Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{425, 900, 806, 838, 38, 741, 72, 754, 572, 283 }}, "employment":[{"organization-name":"Newfase","start-date":date("2010-07-03"),"end-date":date("2011-10-26")}]}
-{"id": 729, "alias": "Liz000729", "name": "Liz Cribbs", "user-since": datetime("2013-01-15T22:13:24"), "address": {"street":"59 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{69, 284, 76, 573, 157, 301, 433, 734, 584, 689, 268, 364, 635, 42, 400, 109 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2004-12-17"),"end-date":date("2004-03-15")}]}
-{"id": 730, "alias": "Linsay000730", "name": "Linsay Hook", "user-since": datetime("2009-12-18T16:37:10"), "address": {"street":"81 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{87, 146, 299, 403 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2004-09-04")}]}
-{"id": 731, "alias": "Leo000731", "name": "Leo Agg", "user-since": datetime("2009-08-24T00:25:02"), "address": {"street":"94 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{824, 621, 245, 520, 156, 713, 808, 885, 747, 882, 23, 258, 433, 518, 330, 120, 542, 832, 651, 162, 342, 445, 813, 373 }}, "employment":[{"organization-name":"ganjalax","start-date":date("2009-09-14")}]}
-{"id": 732, "alias": "Dustin000732", "name": "Dustin Zaun", "user-since": datetime("2006-11-17T09:06:18"), "address": {"street":"98 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{280, 211, 358, 481, 502, 602, 867, 184, 620, 471, 567, 576, 753, 787, 365, 88, 439, 115, 714, 513, 89, 424, 493 }}, "employment":[{"organization-name":"Streettax","start-date":date("2011-05-28"),"end-date":date("2011-01-12")}]}
-{"id": 733, "alias": "Nan000733", "name": "Nan Huey", "user-since": datetime("2012-07-02T15:55:16"), "address": {"street":"66 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{122, 433, 657, 545, 203, 371 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2009-02-19"),"end-date":date("2010-10-04")}]}
-{"id": 734, "alias": "Harve000734", "name": "Harve Tomey", "user-since": datetime("2006-11-26T23:32:34"), "address": {"street":"84 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{39, 789 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2007-11-13")}]}
-{"id": 735, "alias": "Windy000735", "name": "Windy Feufer", "user-since": datetime("2010-03-16T16:01:32"), "address": {"street":"30 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{250, 261, 96, 655, 100, 616, 177, 271, 586, 488, 625, 417, 467, 440, 280, 112, 368, 43, 695, 759, 71 }}, "employment":[{"organization-name":"physcane","start-date":date("2003-05-27")}]}
-{"id": 736, "alias": "Jadyn000736", "name": "Jadyn Lalty", "user-since": datetime("2006-01-23T17:00:32"), "address": {"street":"65 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{783, 219, 111, 245, 17, 435, 557, 775, 208, 193, 369, 36, 434, 890, 882, 406, 622, 372, 892 }}, "employment":[{"organization-name":"Streettax","start-date":date("2009-07-11"),"end-date":date("2010-11-13")}]}
-{"id": 737, "alias": "Keysha000737", "name": "Keysha Murray", "user-since": datetime("2009-03-25T00:15:30"), "address": {"street":"34 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{609, 386, 393, 884, 659, 388, 40, 144, 672, 346, 547, 19, 242, 878, 767 }}, "employment":[{"organization-name":"Doncare","start-date":date("2001-08-15"),"end-date":date("2009-05-26")}]}
-{"id": 738, "alias": "Jamel000738", "name": "Jamel Buck", "user-since": datetime("2014-04-10T05:04:01"), "address": {"street":"84 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{159, 283, 334, 325, 777, 472, 369, 302, 752, 521, 457, 247, 894, 284, 870, 191, 790, 751, 624, 76, 344, 211 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2003-02-03")}]}
-{"id": 739, "alias": "Gil000739", "name": "Gil Olphert", "user-since": datetime("2006-07-24T01:04:11"), "address": {"street":"18 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{450, 745, 366, 512, 110, 757 }}, "employment":[{"organization-name":"geomedia","start-date":date("2008-12-08"),"end-date":date("2011-10-25")}]}
-{"id": 740, "alias": "Claudia000740", "name": "Claudia Cass", "user-since": datetime("2007-12-17T06:02:01"), "address": {"street":"4 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{804, 851, 695, 495, 613, 696, 528, 767, 793, 507, 522, 362, 885, 679, 707 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2007-01-01")}]}
-{"id": 741, "alias": "Walton000741", "name": "Walton Fields", "user-since": datetime("2014-07-02T12:41:11"), "address": {"street":"43 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{780, 724, 514, 109, 378, 403, 45, 122, 52, 746, 831, 160, 446, 36, 219, 707, 660, 675, 293, 855, 649, 663 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2009-02-10")}]}
-{"id": 742, "alias": "Grady000742", "name": "Grady Thompson", "user-since": datetime("2008-08-07T06:08:27"), "address": {"street":"57 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{722, 774, 677, 773, 593, 425, 729, 740, 708, 754, 713, 333, 250, 671, 453, 543, 309, 82, 583 }}, "employment":[{"organization-name":"Ransaofan","start-date":date("2006-02-04"),"end-date":date("2008-08-16")}]}
-{"id": 743, "alias": "Amaryllis000743", "name": "Amaryllis Weingarten", "user-since": datetime("2008-12-23T23:34:33"), "address": {"street":"78 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{340, 851 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2002-10-21")}]}
-{"id": 744, "alias": "Aleen000744", "name": "Aleen Wood", "user-since": datetime("2006-08-05T04:27:08"), "address": {"street":"3 Main Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{439, 239, 522, 151, 360, 814, 327, 849, 859, 862, 875, 624, 64, 378, 626, 302 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2010-07-21")}]}
-{"id": 745, "alias": "Chun000745", "name": "Chun Albright", "user-since": datetime("2010-09-22T15:05:00"), "address": {"street":"50 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{275, 240, 80, 490, 322, 68, 540, 544, 888, 82, 300, 230, 652, 722, 788, 547, 277, 550, 885, 776, 179 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2007-05-02")}]}
-{"id": 746, "alias": "Romayne000746", "name": "Romayne Cypret", "user-since": datetime("2008-12-06T13:29:57"), "address": {"street":"35 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{268, 542, 334, 336, 239, 151, 509, 262, 809, 711, 229, 372, 744, 782, 155, 504, 97, 436, 625, 110, 889 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2003-08-12"),"end-date":date("2003-09-09")}]}
-{"id": 747, "alias": "Tonisha000747", "name": "Tonisha Armstrong", "user-since": datetime("2006-09-06T13:29:11"), "address": {"street":"13 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{31, 536, 566, 447, 37, 587, 562, 657, 300, 715, 429, 94, 189, 802, 19, 284, 603, 55, 178, 605, 368 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2003-11-03")}]}
-{"id": 748, "alias": "Gregg000748", "name": "Gregg Saline", "user-since": datetime("2009-10-16T14:11:11"), "address": {"street":"44 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{708, 368, 69, 450, 797, 818, 612, 749, 581, 546, 805, 567, 575, 266, 804, 487, 402 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2007-10-10")}]}
-{"id": 749, "alias": "Rusty000749", "name": "Rusty Parrish", "user-since": datetime("2009-01-14T20:13:45"), "address": {"street":"69 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{757, 705, 159, 373, 112, 586, 235, 91, 537, 64, 729, 781, 300, 885, 14, 672 }}, "employment":[{"organization-name":"goldendexon","start-date":date("2004-01-21")}]}
-{"id": 750, "alias": "Brad000750", "name": "Brad Philips", "user-since": datetime("2008-12-10T15:52:28"), "address": {"street":"88 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Kongreen","start-date":date("2000-09-16"),"end-date":date("2007-12-26")}]}
-{"id": 751, "alias": "Hazel000751", "name": "Hazel Tavoularis", "user-since": datetime("2006-09-27T16:15:56"), "address": {"street":"93 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{729, 677, 412, 764, 338, 736 }}, "employment":[{"organization-name":"Solophase","start-date":date("2010-02-09")}]}
-{"id": 752, "alias": "Gerry000752", "name": "Gerry Newman", "user-since": datetime("2014-06-12T08:40:31"), "address": {"street":"79 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{741, 132, 815, 784, 52, 655, 43, 336, 645, 880, 49, 646, 408, 99, 216, 806, 197, 831, 265, 164, 293, 526, 270, 864 }}, "employment":[{"organization-name":"Sancone","start-date":date("2006-06-02")}]}
-{"id": 753, "alias": "Leo000753", "name": "Leo Muller", "user-since": datetime("2005-08-21T07:38:28"), "address": {"street":"60 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{635, 829, 882, 367, 884, 509, 870, 573, 517, 47, 75, 330, 872, 417, 189 }}, "employment":[{"organization-name":"Indiex","start-date":date("2012-03-21")}]}
-{"id": 754, "alias": "Sandra000754", "name": "Sandra Ulery", "user-since": datetime("2007-04-26T22:58:40"), "address": {"street":"77 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{369, 866, 55, 219, 769, 550, 546, 445, 472, 723, 190, 671, 642, 515 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2010-05-24")}]}
-{"id": 755, "alias": "Rodger000755", "name": "Rodger Overstreet", "user-since": datetime("2009-03-26T02:45:11"), "address": {"street":"25 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{0, 885, 479, 93, 730, 646 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2000-06-22"),"end-date":date("2009-02-02")}]}
-{"id": 756, "alias": "Leanora000756", "name": "Leanora Hiles", "user-since": datetime("2014-08-22T22:16:08"), "address": {"street":"56 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{26, 826, 646, 310, 810, 44, 413, 640, 139, 456, 896, 23, 535, 31, 340, 321, 472 }}, "employment":[{"organization-name":"Newphase","start-date":date("2010-05-13"),"end-date":date("2010-04-03")}]}
-{"id": 757, "alias": "Anemone000757", "name": "Anemone Yeskey", "user-since": datetime("2009-06-23T03:34:17"), "address": {"street":"20 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{736, 777, 843, 242, 498, 555, 624, 186, 867, 675, 449, 564, 644, 357, 728 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2006-08-14")}]}
-{"id": 758, "alias": "Gaenor000758", "name": "Gaenor Mcelroy", "user-since": datetime("2012-08-10T22:02:14"), "address": {"street":"39 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{514, 331, 394, 507, 791, 898, 76, 411 }}, "employment":[{"organization-name":"physcane","start-date":date("2012-02-11")}]}
-{"id": 759, "alias": "Oswald000759", "name": "Oswald Children", "user-since": datetime("2006-01-01T15:56:45"), "address": {"street":"71 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{72, 703, 868, 832, 418, 0, 435, 441, 486, 502, 276, 415, 399, 291, 389, 236, 249, 869, 130, 171, 739, 857, 332 }}, "employment":[{"organization-name":"Lexitechno","start-date":date("2008-12-10")}]}
-{"id": 760, "alias": "Dakota000760", "name": "Dakota Putnam", "user-since": datetime("2005-05-08T02:27:58"), "address": {"street":"4 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{96, 166, 688, 383, 318, 772, 334, 326, 53, 830, 458, 665, 172, 322, 182, 283 }}, "employment":[{"organization-name":"Medflex","start-date":date("2012-07-22")}]}
-{"id": 761, "alias": "Ted000761", "name": "Ted Hughes", "user-since": datetime("2012-03-18T03:46:37"), "address": {"street":"31 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{165, 806, 272, 135, 655, 630, 626, 319, 861, 65, 588, 358, 324, 719, 288, 510, 76, 784, 634, 715, 777, 832, 584 }}, "employment":[{"organization-name":"jaydax","start-date":date("2004-06-04"),"end-date":date("2008-08-21")}]}
-{"id": 762, "alias": "Canute000762", "name": "Canute Swift", "user-since": datetime("2008-11-26T19:49:25"), "address": {"street":"3 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{787, 664, 685, 168, 724, 819, 78, 309, 708, 424, 624, 853, 230, 501, 39 }}, "employment":[{"organization-name":"Streettax","start-date":date("2001-12-17")}]}
-{"id": 763, "alias": "Maranda000763", "name": "Maranda Bickerson", "user-since": datetime("2005-11-10T18:47:11"), "address": {"street":"90 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{216, 127, 384, 466, 122, 409, 295, 217, 669, 196, 479, 767, 383, 630, 734, 251, 898, 771, 715 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2009-06-10")}]}
-{"id": 764, "alias": "Gwenyth000764", "name": "Gwenyth Wylie", "user-since": datetime("2014-05-03T00:36:05"), "address": {"street":"86 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{70, 746, 875, 865, 617, 521, 398, 833, 384, 890, 695, 383 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2004-11-10"),"end-date":date("2008-06-12")}]}
-{"id": 765, "alias": "Mirna000765", "name": "Mirna Wile", "user-since": datetime("2014-01-08T12:57:49"), "address": {"street":"94 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{83, 591, 838, 777, 286, 23, 345, 640, 107, 772, 199, 872, 378, 265, 53 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2008-10-18"),"end-date":date("2009-01-27")}]}
-{"id": 766, "alias": "Jillie000766", "name": "Jillie Owens", "user-since": datetime("2011-12-04T08:08:23"), "address": {"street":"56 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{834, 471, 277, 525, 825, 95, 570, 789, 348, 398, 518, 859, 534, 227, 887, 242, 395, 720 }}, "employment":[{"organization-name":"Opeelectronics","start-date":date("2000-08-25"),"end-date":date("2011-11-14")}]}
-{"id": 767, "alias": "Stephanie000767", "name": "Stephanie Hoffhants", "user-since": datetime("2012-08-11T15:15:27"), "address": {"street":"79 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{425, 244, 461, 514, 409, 463, 147, 161, 864, 194, 491, 829, 151, 560, 806, 666, 553, 877 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2000-09-13"),"end-date":date("2004-11-17")}]}
-{"id": 768, "alias": "Hardy000768", "name": "Hardy Fisher", "user-since": datetime("2014-02-12T04:52:35"), "address": {"street":"13 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Goldcity","start-date":date("2009-05-23")}]}
-{"id": 769, "alias": "Vaughn000769", "name": "Vaughn Larson", "user-since": datetime("2010-03-10T17:34:42"), "address": {"street":"59 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{901, 246, 480, 402, 612, 881, 348, 824, 301, 280, 655, 880, 111, 389, 551, 288, 32, 714, 494, 66, 230, 547 }}, "employment":[{"organization-name":"Statcode","start-date":date("2005-04-16"),"end-date":date("2009-06-17")}]}
-{"id": 770, "alias": "Albert000770", "name": "Albert Eve", "user-since": datetime("2009-08-26T08:45:38"), "address": {"street":"8 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{462, 466, 409, 166, 843, 156, 303, 642, 590 }}, "employment":[{"organization-name":"Quoline","start-date":date("2008-06-06")}]}
-{"id": 771, "alias": "Nicolina000771", "name": "Nicolina Reese", "user-since": datetime("2012-01-20T17:12:59"), "address": {"street":"71 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{63, 556, 194, 707, 618, 686, 19, 71 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2011-05-07")}]}
-{"id": 772, "alias": "Porter000772", "name": "Porter Gaskins", "user-since": datetime("2008-08-22T02:45:21"), "address": {"street":"81 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{811, 301, 272, 809, 93, 432, 824, 80, 400, 87, 41, 144, 76, 525, 842, 822, 252, 514, 206, 896, 871 }}, "employment":[{"organization-name":"linedexon","start-date":date("2004-02-06"),"end-date":date("2010-10-09")}]}
-{"id": 773, "alias": "Columban000773", "name": "Columban Pennington", "user-since": datetime("2008-02-09T20:13:35"), "address": {"street":"11 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{366, 632, 708, 655, 14, 748, 605, 217, 401, 559, 681, 796, 261, 891, 383 }}, "employment":[{"organization-name":"whitestreet","start-date":date("2009-11-05"),"end-date":date("2011-03-08")}]}
-{"id": 774, "alias": "Kacie000774", "name": "Kacie Moffat", "user-since": datetime("2009-08-16T00:45:19"), "address": {"street":"82 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{261, 381, 856, 81, 170, 284, 761, 455, 120, 174, 432, 838 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2012-01-26"),"end-date":date("2012-05-17")}]}
-{"id": 775, "alias": "Bernard000775", "name": "Bernard Bennett", "user-since": datetime("2014-04-24T21:57:56"), "address": {"street":"13 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{318, 166, 753, 505 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2009-07-22"),"end-date":date("2009-01-27")}]}
-{"id": 776, "alias": "Xaviera000776", "name": "Xaviera Zundel", "user-since": datetime("2010-04-10T20:56:06"), "address": {"street":"82 Second Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{18, 606, 564, 787, 573, 647, 352, 753, 809, 493, 8, 135, 357 }}, "employment":[{"organization-name":"tresline","start-date":date("2006-02-19"),"end-date":date("2010-11-10")}]}
-{"id": 777, "alias": "Reina000777", "name": "Reina Park", "user-since": datetime("2009-02-07T02:10:52"), "address": {"street":"48 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{694, 419, 96, 604, 208, 424, 799, 661, 121, 75, 554, 824, 297, 665, 748, 898, 442, 229, 448, 854 }}, "employment":[{"organization-name":"Fixelectrics","start-date":date("2008-06-04")}]}
-{"id": 778, "alias": "Georgia000778", "name": "Georgia Gregory", "user-since": datetime("2014-02-17T18:25:15"), "address": {"street":"59 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{205, 200, 160, 190 }}, "employment":[{"organization-name":"Keytech","start-date":date("2008-07-01")}]}
-{"id": 779, "alias": "Wallis000779", "name": "Wallis Moore", "user-since": datetime("2005-04-23T13:47:19"), "address": {"street":"10 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{58, 749, 425, 387, 524, 599, 337, 626, 885, 163, 709, 795, 725, 547, 8, 370, 416, 691, 600, 733, 768, 819 }}, "employment":[{"organization-name":"silfind","start-date":date("2011-08-13"),"end-date":date("2011-07-15")}]}
-{"id": 780, "alias": "Christopher000780", "name": "Christopher Munson", "user-since": datetime("2013-05-28T14:42:05"), "address": {"street":"76 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{185, 746, 295, 870, 708, 301, 786, 702, 99 }}, "employment":[{"organization-name":"strongex","start-date":date("2009-08-24"),"end-date":date("2011-08-17")}]}
-{"id": 781, "alias": "Florance000781", "name": "Florance Mcindoe", "user-since": datetime("2007-01-26T15:31:57"), "address": {"street":"48 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{309, 457, 674, 459, 399, 486, 47, 344, 474, 427, 41, 814, 343, 129, 619 }}, "employment":[{"organization-name":"Ganjatax","start-date":date("2007-02-21"),"end-date":date("2010-11-23")}]}
-{"id": 782, "alias": "Lyn000782", "name": "Lyn Fuhrer", "user-since": datetime("2011-12-10T18:56:09"), "address": {"street":"91 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{712, 674, 723, 827, 692, 647, 672, 610, 285, 863, 281, 773, 195 }}, "employment":[{"organization-name":"tresline","start-date":date("2012-07-11")}]}
-{"id": 783, "alias": "Humbert000783", "name": "Humbert Polson", "user-since": datetime("2014-03-12T05:24:54"), "address": {"street":"82 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{74, 863, 811, 348, 591, 410, 753, 473, 630, 168, 521, 85 }}, "employment":[{"organization-name":"Basecone","start-date":date("2009-05-13"),"end-date":date("2009-03-24")}]}
-{"id": 784, "alias": "Nancy000784", "name": "Nancy Sanders", "user-since": datetime("2012-11-24T13:57:02"), "address": {"street":"68 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{304, 824, 844, 245, 115, 344, 322, 519, 862, 533, 607, 26, 798, 563, 177, 796, 160 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2010-06-11")}]}
-{"id": 785, "alias": "Tabby000785", "name": "Tabby Hujsak", "user-since": datetime("2007-03-27T13:09:00"), "address": {"street":"84 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{389, 304, 83, 767, 97, 518, 12, 423, 696, 883, 8, 547, 307, 642, 854, 274, 141 }}, "employment":[{"organization-name":"Sanjodax","start-date":date("2007-07-25"),"end-date":date("2007-06-24")}]}
-{"id": 786, "alias": "Kat000786", "name": "Kat Hindman", "user-since": datetime("2008-10-20T19:43:20"), "address": {"street":"83 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{780, 830, 127, 565, 705, 759, 17 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2002-07-26"),"end-date":date("2003-07-23")}]}
-{"id": 787, "alias": "Candi000787", "name": "Candi Casteel", "user-since": datetime("2011-04-24T16:21:19"), "address": {"street":"14 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{734, 458 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2008-06-13")}]}
-{"id": 788, "alias": "Juan000788", "name": "Juan Dealtry", "user-since": datetime("2008-12-21T10:27:48"), "address": {"street":"88 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{861, 504, 129, 317, 680, 102, 212, 563, 164, 650, 171, 454, 473, 12 }}, "employment":[{"organization-name":"highfax","start-date":date("2004-02-11"),"end-date":date("2009-03-12")}]}
-{"id": 789, "alias": "Preston000789", "name": "Preston Wile", "user-since": datetime("2013-12-04T08:02:09"), "address": {"street":"36 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{481, 553, 800, 867, 368, 339, 618 }}, "employment":[{"organization-name":"strongex","start-date":date("2008-11-26")}]}
-{"id": 790, "alias": "Garrick000790", "name": "Garrick Rahl", "user-since": datetime("2006-08-26T18:59:25"), "address": {"street":"34 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{540, 498, 353, 148, 275, 52, 78, 495, 23, 798, 643, 73, 757, 589, 238, 752 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2001-05-02"),"end-date":date("2002-08-22")}]}
-{"id": 791, "alias": "Hardy000791", "name": "Hardy Warner", "user-since": datetime("2010-06-12T18:24:22"), "address": {"street":"96 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{558, 241, 260, 836, 127, 479, 598, 417, 798, 21, 287, 253, 851, 143, 525, 373, 832, 464, 262, 840 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2001-08-10"),"end-date":date("2011-06-21")}]}
-{"id": 792, "alias": "Viola000792", "name": "Viola Weisgarber", "user-since": datetime("2007-08-06T03:28:15"), "address": {"street":"72 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{383, 242, 51, 684, 687, 695, 114, 785, 719, 96, 48, 227, 389, 688, 34, 805, 90, 351, 119, 105, 691, 892, 615, 478 }}, "employment":[{"organization-name":"Doncare","start-date":date("2010-05-04")}]}
-{"id": 793, "alias": "Gail000793", "name": "Gail Hoffhants", "user-since": datetime("2010-03-10T04:48:28"), "address": {"street":"49 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{325, 692, 279 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2006-01-17")}]}
-{"id": 794, "alias": "Gaylord000794", "name": "Gaylord Porter", "user-since": datetime("2013-09-15T01:38:02"), "address": {"street":"5 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{805, 245, 300, 421, 316, 477, 778, 73, 438, 491, 334, 95, 770, 763, 195, 759, 711, 59, 523 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2003-05-05")}]}
-{"id": 795, "alias": "Jon000795", "name": "Jon Maclagan", "user-since": datetime("2014-04-22T14:34:07"), "address": {"street":"95 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{687, 427, 501, 610, 143, 460, 344, 122, 352, 408, 123, 79, 577, 81, 873, 209, 106, 517, 388, 271, 316, 736 }}, "employment":[{"organization-name":"Basecone","start-date":date("2005-04-22"),"end-date":date("2011-11-06")}]}
-{"id": 796, "alias": "Freeman000796", "name": "Freeman Swabey", "user-since": datetime("2007-07-17T09:00:30"), "address": {"street":"65 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{278, 123, 684, 16, 323, 778, 17, 490, 873, 353, 741, 766, 112, 833, 440, 569, 641, 795, 533, 782 }}, "employment":[{"organization-name":"subtam","start-date":date("2007-02-17"),"end-date":date("2009-04-06")}]}
-{"id": 797, "alias": "Bessie000797", "name": "Bessie Ashmore", "user-since": datetime("2012-04-02T12:39:28"), "address": {"street":"10 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{54, 172, 131, 877, 840 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2001-01-24")}]}
-{"id": 798, "alias": "Jenny000798", "name": "Jenny James", "user-since": datetime("2007-12-27T20:17:52"), "address": {"street":"96 Park Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{625, 136, 771, 474, 891, 273, 237, 852, 862, 379, 409 }}, "employment":[{"organization-name":"Greencare","start-date":date("2008-04-25")}]}
-{"id": 799, "alias": "Sylvana000799", "name": "Sylvana Zimmer", "user-since": datetime("2008-07-19T09:28:04"), "address": {"street":"59 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{484, 677, 672, 781, 822, 112, 529, 167, 3, 452, 834, 830, 407 }}, "employment":[{"organization-name":"Techitechi","start-date":date("2007-04-19")}]}
-{"id": 800, "alias": "Oneida000800", "name": "Oneida Morgan", "user-since": datetime("2010-12-14T10:22:18"), "address": {"street":"3 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{327, 442, 323, 697, 129, 466, 505, 183, 8, 764, 799, 774, 568, 288, 342, 245, 344, 219 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2000-12-14")}]}
-{"id": 801, "alias": "Alayna000801", "name": "Alayna Garratt", "user-since": datetime("2014-01-18T20:50:45"), "address": {"street":"85 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{474, 287, 645, 469, 586, 580, 207, 79, 138 }}, "employment":[{"organization-name":"Scotcity","start-date":date("2012-03-15"),"end-date":date("2012-03-12")}]}
-{"id": 802, "alias": "Dwight000802", "name": "Dwight Hatfield", "user-since": datetime("2010-01-02T06:53:49"), "address": {"street":"50 First St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{82, 147, 6, 661, 610, 185, 261, 17, 38, 407, 197, 649, 93, 701, 330, 377, 736, 606, 556, 852, 417, 777 }}, "employment":[{"organization-name":"Solophase","start-date":date("2001-07-11")}]}
-{"id": 803, "alias": "Leann000803", "name": "Leann Dryfus", "user-since": datetime("2013-09-21T13:05:07"), "address": {"street":"38 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{541, 709, 805, 145, 100 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2004-10-27"),"end-date":date("2011-10-10")}]}
-{"id": 804, "alias": "Phyllida000804", "name": "Phyllida Dealtry", "user-since": datetime("2011-07-19T07:08:32"), "address": {"street":"63 First St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{733, 628, 686, 281, 661, 366, 770, 624, 65, 349 }}, "employment":[{"organization-name":"Dancode","start-date":date("2003-10-05"),"end-date":date("2008-09-02")}]}
-{"id": 805, "alias": "Beulah000805", "name": "Beulah Weidemann", "user-since": datetime("2014-06-08T22:22:38"), "address": {"street":"2 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{783, 67, 118, 266, 707, 190, 308, 534, 873, 758, 630, 785, 648, 394, 362, 420, 220, 239, 643, 85, 106, 685 }}, "employment":[{"organization-name":"Solophase","start-date":date("2005-11-19"),"end-date":date("2009-10-18")}]}
-{"id": 806, "alias": "Janis000806", "name": "Janis Parrish", "user-since": datetime("2005-03-26T12:45:13"), "address": {"street":"37 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{50, 87, 292, 640, 698, 141, 832 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2010-06-04")}]}
-{"id": 807, "alias": "Towanda000807", "name": "Towanda Day", "user-since": datetime("2013-07-21T21:33:29"), "address": {"street":"94 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{169, 535, 247, 882, 624, 701, 139, 789, 447 }}, "employment":[{"organization-name":"Basecone","start-date":date("2011-06-22")}]}
-{"id": 808, "alias": "Andres000808", "name": "Andres Lombardi", "user-since": datetime("2008-11-26T22:17:02"), "address": {"street":"58 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{111, 88, 282, 696, 454, 855, 316, 604, 303, 589 }}, "employment":[{"organization-name":"Medflex","start-date":date("2006-02-15"),"end-date":date("2010-08-28")}]}
-{"id": 809, "alias": "Stefanie000809", "name": "Stefanie Linton", "user-since": datetime("2014-08-27T00:28:27"), "address": {"street":"65 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{493, 131, 448, 452, 835, 19, 419, 149, 659, 395, 105, 247, 133, 539, 437, 302, 6, 406, 861, 213, 694 }}, "employment":[{"organization-name":"highfax","start-date":date("2005-06-15"),"end-date":date("2010-06-23")}]}
-{"id": 810, "alias": "Alvina000810", "name": "Alvina Birdsall", "user-since": datetime("2013-11-24T16:54:55"), "address": {"street":"5 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{758, 732, 218, 787, 4, 338, 619, 115, 200, 868, 138, 187, 226, 495, 896, 55, 177, 375, 231, 370, 529, 342, 881, 590 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2008-06-13")}]}
-{"id": 811, "alias": "Kermit000811", "name": "Kermit Fuchs", "user-since": datetime("2007-10-13T14:42:30"), "address": {"street":"50 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{641, 34, 220, 7, 210, 774, 382, 695, 685, 277, 569 }}, "employment":[{"organization-name":"Zununoing","start-date":date("2001-04-09")}]}
-{"id": 812, "alias": "Alix000812", "name": "Alix Mcelroy", "user-since": datetime("2007-04-21T01:57:13"), "address": {"street":"77 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{620, 38, 220, 19, 416, 683, 240 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2000-05-06"),"end-date":date("2002-12-20")}]}
-{"id": 813, "alias": "Clint000813", "name": "Clint Bode", "user-since": datetime("2005-12-27T12:50:07"), "address": {"street":"92 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{711, 557, 335, 627, 726, 70, 349, 451, 608, 5, 387, 543, 638, 881, 738, 817, 575, 220, 646, 150, 745 }}, "employment":[{"organization-name":"linedexon","start-date":date("2011-04-02"),"end-date":date("2011-01-05")}]}
-{"id": 814, "alias": "Alysha000814", "name": "Alysha Beard", "user-since": datetime("2008-03-23T07:53:08"), "address": {"street":"7 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{605, 546, 880, 373, 616, 237, 19, 248, 863, 1, 675, 120, 148, 737, 163, 878, 267, 348, 497, 13, 890, 41, 861 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2006-06-02")}]}
-{"id": 815, "alias": "Francene000815", "name": "Francene Edwards", "user-since": datetime("2005-11-10T12:02:59"), "address": {"street":"20 Hill Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{845, 752, 440, 668, 387, 16, 677, 582, 139, 438, 720, 893, 26, 763, 153, 436, 435, 39, 338, 671, 635, 794, 706, 252 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2000-09-19")}]}
-{"id": 816, "alias": "Shavon000816", "name": "Shavon Buehler", "user-since": datetime("2008-01-04T19:15:59"), "address": {"street":"18 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{637, 728, 704, 769, 570, 20, 798, 838, 597 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2008-01-18")}]}
-{"id": 817, "alias": "Martie000817", "name": "Martie Warner", "user-since": datetime("2006-05-22T21:29:38"), "address": {"street":"96 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{868, 327, 560, 27, 873, 590, 336, 97, 49, 284, 378, 241 }}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2009-01-15"),"end-date":date("2010-05-04")}]}
-{"id": 818, "alias": "Irish000818", "name": "Irish Larson", "user-since": datetime("2006-11-19T02:48:11"), "address": {"street":"26 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{412, 420, 831, 213, 755, 711, 512, 865, 753, 789, 295 }}, "employment":[{"organization-name":"Tranzap","start-date":date("2000-08-12"),"end-date":date("2002-05-05")}]}
-{"id": 819, "alias": "Valerie000819", "name": "Valerie Roadman", "user-since": datetime("2008-08-02T16:34:22"), "address": {"street":"57 Hill Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{519, 849, 344, 5, 853, 453, 699, 211, 310, 49, 574, 445, 298, 51, 389, 797, 471, 496, 318, 314, 886, 189, 331 }}, "employment":[{"organization-name":"Inchdox","start-date":date("2007-05-23")}]}
-{"id": 820, "alias": "Christa000820", "name": "Christa Seelig", "user-since": datetime("2006-01-09T09:22:30"), "address": {"street":"83 First St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{187, 175, 690, 772 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2011-11-11"),"end-date":date("2011-01-19")}]}
-{"id": 821, "alias": "Dwight000821", "name": "Dwight Osterwise", "user-since": datetime("2007-12-05T15:19:39"), "address": {"street":"37 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{889, 140, 706, 300, 606, 841, 322, 479, 668, 135, 315, 737, 477, 238, 391, 226 }}, "employment":[{"organization-name":"Roundhex","start-date":date("2002-08-15")}]}
-{"id": 822, "alias": "Deneen000822", "name": "Deneen Draudy", "user-since": datetime("2013-02-05T23:56:18"), "address": {"street":"49 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{680, 138, 310, 760, 300, 454, 374, 463, 813, 635, 639, 891, 768, 446, 705 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2007-08-16")}]}
-{"id": 823, "alias": "Stacia000823", "name": "Stacia Felbrigge", "user-since": datetime("2011-10-03T15:40:35"), "address": {"street":"84 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{387, 35, 359, 340, 813, 690, 27 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2006-02-06")}]}
-{"id": 824, "alias": "Genie000824", "name": "Genie Zundel", "user-since": datetime("2005-01-14T06:54:42"), "address": {"street":"51 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{177, 775, 51, 711, 164, 661, 691, 1, 587, 300, 450, 544, 895, 220, 856, 497, 542, 530, 679, 649 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2012-01-18")}]}
-{"id": 825, "alias": "Weston000825", "name": "Weston Gregory", "user-since": datetime("2007-10-18T15:10:37"), "address": {"street":"37 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{129, 494, 556, 698, 252, 736, 61, 483, 434, 636, 792, 670, 887, 801, 591, 540, 595 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2001-02-01"),"end-date":date("2007-02-09")}]}
-{"id": 826, "alias": "Jarod000826", "name": "Jarod Parrish", "user-since": datetime("2012-05-05T09:19:42"), "address": {"street":"70 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{606, 808, 432, 725, 257, 50, 43, 197, 79, 68, 129, 200, 417, 116, 572, 55 }}, "employment":[{"organization-name":"Plexlane","start-date":date("2003-12-24"),"end-date":date("2005-08-17")}]}
-{"id": 827, "alias": "Annabell000827", "name": "Annabell Yates", "user-since": datetime("2005-07-17T13:37:13"), "address": {"street":"10 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{117, 679, 204, 459, 544, 255, 73, 4 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2000-03-12")}]}
-{"id": 828, "alias": "Beatrix000828", "name": "Beatrix Woolery", "user-since": datetime("2014-05-12T05:43:38"), "address": {"street":"99 Hill Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{249, 194, 432, 276, 506, 883, 578 }}, "employment":[{"organization-name":"Tripplelane","start-date":date("2002-09-27"),"end-date":date("2011-06-26")}]}
-{"id": 829, "alias": "Marisha000829", "name": "Marisha Swift", "user-since": datetime("2008-09-16T22:18:45"), "address": {"street":"78 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{883, 439, 685, 152, 201 }}, "employment":[{"organization-name":"Hot-tech","start-date":date("2008-09-17")}]}
-{"id": 830, "alias": "Quincey000830", "name": "Quincey Woollard", "user-since": datetime("2006-06-22T02:14:06"), "address": {"street":"19 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{139, 363, 423, 412, 476, 163, 869, 749, 45, 131, 747, 264, 667, 69, 480, 147, 460 }}, "employment":[{"organization-name":"Ontotanin","start-date":date("2001-10-20")}]}
-{"id": 831, "alias": "Britton000831", "name": "Britton Schuck", "user-since": datetime("2005-05-19T05:50:16"), "address": {"street":"30 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{528, 392 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2000-05-07")}]}
-{"id": 832, "alias": "Jaye000832", "name": "Jaye Lineman", "user-since": datetime("2010-09-12T10:07:50"), "address": {"street":"35 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{187, 573, 688, 256, 44, 449, 767, 470, 347, 854, 758, 855, 809, 805, 495 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2000-10-11"),"end-date":date("2011-08-15")}]}
-{"id": 833, "alias": "Lilac000833", "name": "Lilac Eisenhart", "user-since": datetime("2011-10-23T09:34:58"), "address": {"street":"41 Second Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{377, 809, 13, 616, 846, 691, 743, 592, 670, 853, 568, 358 }}, "employment":[{"organization-name":"Rungozoom","start-date":date("2010-07-18")}]}
-{"id": 834, "alias": "Maurice000834", "name": "Maurice Countryman", "user-since": datetime("2007-01-22T15:07:10"), "address": {"street":"88 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{614, 743, 340, 215, 438, 114, 652, 20, 326, 491, 150, 815, 528, 184, 472 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2009-09-10")}]}
-{"id": 835, "alias": "Reuben000835", "name": "Reuben Smith", "user-since": datetime("2010-08-01T18:50:28"), "address": {"street":"61 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{28, 697, 208, 497, 134, 707, 94, 60, 350, 190, 656, 422, 23, 775, 101, 160, 643, 542, 365, 144 }}, "employment":[{"organization-name":"Technohow","start-date":date("2012-08-15"),"end-date":date("2012-08-22")}]}
-{"id": 836, "alias": "Linnette000836", "name": "Linnette Dugmore", "user-since": datetime("2006-08-16T20:56:10"), "address": {"street":"38 Maple St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{683, 467, 439, 285 }}, "employment":[{"organization-name":"ganjalax","start-date":date("2012-03-08")}]}
-{"id": 837, "alias": "Gertrude000837", "name": "Gertrude Lazzo", "user-since": datetime("2011-04-21T00:40:18"), "address": {"street":"43 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{314, 281, 700, 263, 222, 484, 872, 814, 302 }}, "employment":[{"organization-name":"Basecone","start-date":date("2001-11-13")}]}
-{"id": 838, "alias": "Simon000838", "name": "Simon Margaret", "user-since": datetime("2008-08-02T19:50:38"), "address": {"street":"79 Lake Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{298, 295, 191, 546, 875, 815, 12, 552, 684, 387, 323, 136, 424 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2011-06-19"),"end-date":date("2011-11-10")}]}
-{"id": 839, "alias": "Alline000839", "name": "Alline Foster", "user-since": datetime("2009-11-20T11:03:35"), "address": {"street":"97 Elm Blvd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{875, 510 }}, "employment":[{"organization-name":"Icerunin","start-date":date("2006-09-23")}]}
-{"id": 840, "alias": "Kazuko000840", "name": "Kazuko Brown", "user-since": datetime("2011-07-23T03:59:11"), "address": {"street":"87 Maple St.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{865, 720, 374, 63, 444, 53, 619, 339, 419, 622, 153, 273, 580, 816, 210, 656, 516, 258, 761, 4, 280, 833, 243, 272 }}, "employment":[{"organization-name":"Newfase","start-date":date("2007-06-09"),"end-date":date("2007-06-05")}]}
-{"id": 841, "alias": "Ria000841", "name": "Ria Goldvogel", "user-since": datetime("2008-09-24T11:19:05"), "address": {"street":"43 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{867, 182, 467, 139, 695, 245, 654, 576, 753, 653, 842, 651, 901, 42, 726, 424, 329, 853, 570, 38, 851, 689, 593 }}, "employment":[{"organization-name":"Y-geohex","start-date":date("2008-12-13")}]}
-{"id": 842, "alias": "Nenita000842", "name": "Nenita Bard", "user-since": datetime("2011-05-23T11:33:47"), "address": {"street":"12 Elm Blvd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{519, 313, 710, 84, 335, 123, 378, 407, 35, 318, 783, 661, 559, 15, 188, 733, 19, 814, 370, 761, 466, 590 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2005-11-01"),"end-date":date("2006-05-14")}]}
-{"id": 843, "alias": "Tammie000843", "name": "Tammie Glover", "user-since": datetime("2010-07-18T16:21:08"), "address": {"street":"6 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{205, 778, 401, 414, 555, 758, 645, 689, 636, 284, 183, 234, 192, 357, 529, 166, 532, 329, 714, 260, 97, 293, 635 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2004-02-24"),"end-date":date("2010-03-06")}]}
-{"id": 844, "alias": "Silvestra000844", "name": "Silvestra Kifer", "user-since": datetime("2008-02-28T09:01:48"), "address": {"street":"70 Park Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{200, 514, 306, 423, 823, 302, 274, 263, 477, 738, 296, 314, 877, 681, 706, 91, 377, 47, 243, 20, 327, 159, 614, 469 }}, "employment":[{"organization-name":"Qvohouse","start-date":date("2005-01-21")}]}
-{"id": 845, "alias": "Latanya000845", "name": "Latanya Whitehead", "user-since": datetime("2007-12-24T19:11:00"), "address": {"street":"98 Main Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{696, 644, 201, 571, 345, 771, 648, 790, 879, 303, 707, 439, 360, 502, 432, 184, 452 }}, "employment":[{"organization-name":"Ontohothex","start-date":date("2011-07-23"),"end-date":date("2011-12-21")}]}
-{"id": 846, "alias": "Maurine000846", "name": "Maurine Alcocke", "user-since": datetime("2007-10-25T18:55:43"), "address": {"street":"48 First St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{370, 791, 545, 541, 569, 497, 899, 85, 302, 358, 759, 793, 699 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2004-09-11")}]}
-{"id": 847, "alias": "Lupita000847", "name": "Lupita Rader", "user-since": datetime("2012-04-23T08:46:32"), "address": {"street":"16 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{309, 593, 612, 215, 376, 400, 121, 401, 387, 624, 383, 691, 845, 165, 464, 79, 467, 796, 564, 119, 363, 394, 362 }}, "employment":[{"organization-name":"Inchex","start-date":date("2000-01-25")}]}
-{"id": 848, "alias": "Carmelo000848", "name": "Carmelo Stephenson", "user-since": datetime("2014-04-08T16:04:52"), "address": {"street":"19 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{595, 338, 841, 266 }}, "employment":[{"organization-name":"Streettax","start-date":date("2002-04-11"),"end-date":date("2007-07-24")}]}
-{"id": 849, "alias": "Milda000849", "name": "Milda Sherlock", "user-since": datetime("2005-02-24T10:44:43"), "address": {"street":"6 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{8, 413, 766, 145, 82, 305, 326, 579, 63, 591, 411, 857, 605, 206, 576, 759, 227, 94, 346, 102, 468, 700, 729 }}, "employment":[{"organization-name":"Streettax","start-date":date("2011-12-11"),"end-date":date("2011-05-12")}]}
-{"id": 850, "alias": "Brendan000850", "name": "Brendan Erskine", "user-since": datetime("2009-09-17T08:22:21"), "address": {"street":"21 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{680, 46, 246, 483, 857, 536, 829, 105, 457, 381, 372, 767, 813, 851, 493, 357, 85, 92 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2005-11-15")}]}
-{"id": 851, "alias": "Aleisha000851", "name": "Aleisha Thompson", "user-since": datetime("2007-06-11T19:14:07"), "address": {"street":"75 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{309, 46, 382, 96, 500, 182, 375, 365, 495, 896, 84, 807, 271, 868 }}, "employment":[{"organization-name":"Quadlane","start-date":date("2009-05-03"),"end-date":date("2009-03-02")}]}
-{"id": 852, "alias": "Andres000852", "name": "Andres Mang", "user-since": datetime("2009-10-06T22:42:25"), "address": {"street":"38 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{362, 749, 756 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2010-11-06")}]}
-{"id": 853, "alias": "Marlena000853", "name": "Marlena Fraser", "user-since": datetime("2008-04-06T22:09:44"), "address": {"street":"74 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{892, 665, 869, 737, 581, 124, 35, 0, 675, 540, 799, 328, 617, 145, 901, 195, 734, 769, 596 }}, "employment":[{"organization-name":"Hatcom","start-date":date("2009-02-12"),"end-date":date("2011-01-01")}]}
-{"id": 854, "alias": "Guiscard000854", "name": "Guiscard Buck", "user-since": datetime("2008-10-10T15:27:31"), "address": {"street":"79 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{167, 179, 287, 366, 171, 542, 884, 762, 500, 648, 779, 581, 176, 403, 736, 688, 419, 858, 629, 814 }}, "employment":[{"organization-name":"silfind","start-date":date("2001-10-09")}]}
-{"id": 855, "alias": "Luke000855", "name": "Luke Ream", "user-since": datetime("2010-01-19T19:57:51"), "address": {"street":"73 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{500 }}, "employment":[{"organization-name":"Xx-drill","start-date":date("2006-09-20"),"end-date":date("2007-04-12")}]}
-{"id": 856, "alias": "Tarquin000856", "name": "Tarquin Friedline", "user-since": datetime("2012-03-09T10:35:25"), "address": {"street":"61 Main Rd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{258, 240, 419, 505, 298, 814, 205, 209, 742, 18, 356, 131, 323, 2, 538, 491, 311, 690, 861, 352, 884, 530 }}, "employment":[{"organization-name":"Voltlane","start-date":date("2002-12-15"),"end-date":date("2010-03-19")}]}
-{"id": 857, "alias": "Rhianna000857", "name": "Rhianna Rosenstiehl", "user-since": datetime("2010-04-24T22:39:02"), "address": {"street":"47 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{292, 171, 500, 634, 350, 54, 466, 202, 330, 71, 22, 354, 641, 344, 802, 727, 307, 624, 179, 194, 531, 791, 135, 689 }}, "employment":[{"organization-name":"over-it","start-date":date("2010-01-13")}]}
-{"id": 858, "alias": "Adam000858", "name": "Adam Roose", "user-since": datetime("2011-05-23T19:57:13"), "address": {"street":"55 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{296, 839, 20, 894 }}, "employment":[{"organization-name":"Solfix","start-date":date("2007-12-13")}]}
-{"id": 859, "alias": "Becky000859", "name": "Becky Carr", "user-since": datetime("2010-12-17T21:45:50"), "address": {"street":"22 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{352, 256, 520, 711, 698 }}, "employment":[{"organization-name":"Lexicone","start-date":date("2000-08-13"),"end-date":date("2011-05-14")}]}
-{"id": 860, "alias": "Brack000860", "name": "Brack James", "user-since": datetime("2005-10-18T04:29:22"), "address": {"street":"99 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{611, 552, 478, 747 }}, "employment":[{"organization-name":"strongex","start-date":date("2004-02-03")}]}
-{"id": 861, "alias": "Deborah000861", "name": "Deborah Handyside", "user-since": datetime("2011-09-16T13:05:31"), "address": {"street":"45 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{805, 739 }}, "employment":[{"organization-name":"Dandamace","start-date":date("2006-06-22")}]}
-{"id": 862, "alias": "Vin000862", "name": "Vin Cass", "user-since": datetime("2006-01-26T09:35:02"), "address": {"street":"73 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{875, 45, 508, 526, 144, 810 }}, "employment":[{"organization-name":"Codetechno","start-date":date("2008-03-15")}]}
-{"id": 863, "alias": "Nolene000863", "name": "Nolene Levett", "user-since": datetime("2009-09-21T08:46:54"), "address": {"street":"17 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{813, 787, 478, 455, 571, 819 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2010-02-05")}]}
-{"id": 864, "alias": "Wesley000864", "name": "Wesley Sholl", "user-since": datetime("2006-09-28T16:56:36"), "address": {"street":"57 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{461, 45, 587, 777 }}, "employment":[{"organization-name":"Zuncan","start-date":date("2002-02-28")}]}
-{"id": 865, "alias": "Adrian000865", "name": "Adrian Vinsant", "user-since": datetime("2011-10-01T12:30:15"), "address": {"street":"41 Park Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{490, 45, 816, 402, 81, 706, 730, 812, 285, 562, 31, 461, 395, 91, 794, 486, 296, 65, 506, 113, 810, 488, 564, 476 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2010-03-01"),"end-date":date("2010-10-26")}]}
-{"id": 866, "alias": "Anjelica000866", "name": "Anjelica Woodworth", "user-since": datetime("2011-05-03T03:36:33"), "address": {"street":"28 Second Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{809, 262, 415, 729 }}, "employment":[{"organization-name":"Indiex","start-date":date("2008-04-19")}]}
-{"id": 867, "alias": "Jody000867", "name": "Jody Bard", "user-since": datetime("2008-09-02T11:44:38"), "address": {"street":"81 Second Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{254, 612, 213, 837, 886, 597 }}, "employment":[{"organization-name":"Transhigh","start-date":date("2010-05-06"),"end-date":date("2010-02-05")}]}
-{"id": 868, "alias": "Jodi000868", "name": "Jodi Whittier", "user-since": datetime("2012-03-22T02:55:13"), "address": {"street":"87 Main Rd.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{875, 54, 874, 308, 329, 723, 701, 124, 825, 810, 209, 851, 332, 10, 15, 461, 4, 81, 582, 762, 125 }}, "employment":[{"organization-name":"Dancode","start-date":date("2012-03-19")}]}
-{"id": 869, "alias": "Gerard000869", "name": "Gerard Nehling", "user-since": datetime("2006-10-13T03:30:15"), "address": {"street":"39 Third Ave.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{629, 747, 849, 889, 255, 728, 462, 658, 91, 460, 717, 768, 220, 138, 659, 810, 336, 234, 541, 251, 674 }}, "employment":[{"organization-name":"Kanelectrics","start-date":date("2011-04-04"),"end-date":date("2011-12-14")}]}
-{"id": 870, "alias": "Romana000870", "name": "Romana Sullivan", "user-since": datetime("2012-01-23T01:55:24"), "address": {"street":"2 Third Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{143, 842, 455, 113, 254, 160, 803, 189, 200, 748, 347, 396 }}, "employment":[{"organization-name":"Vaiatech","start-date":date("2008-06-26")}]}
-{"id": 871, "alias": "Tolly000871", "name": "Tolly Eckhardstein", "user-since": datetime("2010-03-11T01:49:23"), "address": {"street":"6 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{702, 78, 165, 575, 108 }}, "employment":[{"organization-name":"zoomplus","start-date":date("2006-05-16")}]}
-{"id": 872, "alias": "Ewart000872", "name": "Ewart Ullman", "user-since": datetime("2009-01-02T18:49:11"), "address": {"street":"61 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{302, 900, 175, 896, 167, 322, 225, 367, 114, 135, 526, 499, 268, 589, 679, 729, 287 }}, "employment":[{"organization-name":"Voltbam","start-date":date("2007-05-13"),"end-date":date("2009-03-01")}]}
-{"id": 873, "alias": "Margarito000873", "name": "Margarito Ehret", "user-since": datetime("2007-03-18T00:30:06"), "address": {"street":"49 Third Ave.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{629, 298, 499, 533, 199, 881, 162, 13, 368, 429, 107, 503, 737, 725, 825, 676 }}, "employment":[{"organization-name":"Ronholdings","start-date":date("2002-10-25")}]}
-{"id": 874, "alias": "Marisol000874", "name": "Marisol Muller", "user-since": datetime("2010-05-02T07:03:02"), "address": {"street":"57 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{331, 674, 375, 649, 761, 527, 783, 53, 548, 793, 305, 405, 488, 434, 147, 626, 781, 370, 293 }}, "employment":[{"organization-name":"Tranzap","start-date":date("2005-05-15"),"end-date":date("2006-04-02")}]}
-{"id": 875, "alias": "Troy000875", "name": "Troy Hoopengarner", "user-since": datetime("2005-05-27T00:21:01"), "address": {"street":"11 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{464, 315, 393, 422, 209, 561, 717 }}, "employment":[{"organization-name":"jaydax","start-date":date("2004-12-03")}]}
-{"id": 876, "alias": "Cherlyn000876", "name": "Cherlyn Taggart", "user-since": datetime("2011-02-08T08:41:46"), "address": {"street":"36 Main Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{54, 225, 659, 621, 535, 69, 760, 803, 0, 415, 896, 56, 464, 111, 71, 122, 871 }}, "employment":[{"organization-name":"Fax-fax","start-date":date("2006-08-10"),"end-date":date("2010-10-15")}]}
-{"id": 877, "alias": "Ty000877", "name": "Ty Byers", "user-since": datetime("2010-10-09T04:48:35"), "address": {"street":"77 Second Ave.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{415, 803, 386, 139, 510, 743, 894, 244, 767, 37, 63, 479, 562, 284, 402 }}, "employment":[{"organization-name":"Sumlane","start-date":date("2011-01-25")}]}
-{"id": 878, "alias": "Krystle000878", "name": "Krystle Ashmore", "user-since": datetime("2009-11-10T04:34:25"), "address": {"street":"39 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{92, 845, 402, 774, 111, 160, 143 }}, "employment":[{"organization-name":"Newhotplus","start-date":date("2001-03-22"),"end-date":date("2002-11-04")}]}
-{"id": 879, "alias": "Wren000879", "name": "Wren Woodworth", "user-since": datetime("2006-04-18T20:09:45"), "address": {"street":"36 Park Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{608, 125, 812, 583 }}, "employment":[{"organization-name":"Technohow","start-date":date("2005-02-05"),"end-date":date("2009-01-18")}]}
-{"id": 880, "alias": "Denzil000880", "name": "Denzil Eisenhart", "user-since": datetime("2006-10-20T07:39:17"), "address": {"street":"93 Lake Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{416, 482, 521, 132, 553, 100, 275, 901, 749, 329, 686, 272, 188, 213, 776, 101, 823 }}, "employment":[{"organization-name":"Kongreen","start-date":date("2010-03-27"),"end-date":date("2011-05-22")}]}
-{"id": 881, "alias": "Randall000881", "name": "Randall Mitchell", "user-since": datetime("2012-03-11T11:49:49"), "address": {"street":"60 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{138, 740, 145, 169, 546, 189, 261 }}, "employment":[{"organization-name":"Newfase","start-date":date("2007-09-09")}]}
-{"id": 882, "alias": "Rodney000882", "name": "Rodney Hair", "user-since": datetime("2011-08-14T00:59:50"), "address": {"street":"25 Park Ave.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{302, 827, 535, 63, 807, 138, 507, 666, 334, 30, 483, 202, 178, 630, 591, 129, 845 }}, "employment":[{"organization-name":"strongex","start-date":date("2000-02-09"),"end-date":date("2001-03-13")}]}
-{"id": 883, "alias": "Marly000883", "name": "Marly Bishop", "user-since": datetime("2005-06-13T23:48:09"), "address": {"street":"8 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{394, 801, 120, 233, 33, 543, 829, 825, 166, 865, 295, 142, 231 }}, "employment":[{"organization-name":"geomedia","start-date":date("2000-08-04")}]}
-{"id": 884, "alias": "Hale000884", "name": "Hale Nicholas", "user-since": datetime("2011-01-18T21:57:06"), "address": {"street":"60 Park Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{639, 90, 435, 264, 844, 816, 370 }}, "employment":[{"organization-name":"Indiex","start-date":date("2012-07-15")}]}
-{"id": 885, "alias": "Laverne000885", "name": "Laverne Finlay", "user-since": datetime("2006-12-15T19:51:48"), "address": {"street":"23 First St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Fixdintex","start-date":date("2011-01-08")}]}
-{"id": 886, "alias": "Addison000886", "name": "Addison Mingle", "user-since": datetime("2012-10-25T12:18:50"), "address": {"street":"58 Third Ave.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{880, 131, 559, 1, 814, 523, 534, 170, 512, 40, 277, 522, 892, 572, 541, 251, 67, 578, 292, 443, 417 }}, "employment":[{"organization-name":"Sancone","start-date":date("2007-03-11")}]}
-{"id": 887, "alias": "Ferdie000887", "name": "Ferdie Warner", "user-since": datetime("2013-10-07T03:06:09"), "address": {"street":"82 Elm Blvd.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{592, 142 }}, "employment":[{"organization-name":"Inchex","start-date":date("2008-04-15")}]}
-{"id": 888, "alias": "Kermit000888", "name": "Kermit Adams", "user-since": datetime("2005-11-16T23:36:12"), "address": {"street":"86 Maple St.", "city":"New York", "state":"NY", "zip":"11232", "country":"US"}, "friend-ids": {{51, 668, 263, 68, 775, 616, 227, 766, 35, 323, 434, 744, 223, 679, 846, 132 }}, "employment":[{"organization-name":"Xx-technology","start-date":date("2009-03-25")}]}
-{"id": 889, "alias": "Ron000889", "name": "Ron Fischer", "user-since": datetime("2009-02-21T19:28:36"), "address": {"street":"96 Hill Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{683, 790, 139, 486, 84, 97, 82, 668, 22, 860, 879, 621 }}, "employment":[{"organization-name":"physcane","start-date":date("2000-11-09")}]}
-{"id": 890, "alias": "Dale000890", "name": "Dale Eastwood", "user-since": datetime("2010-10-17T13:57:22"), "address": {"street":"67 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{111, 240, 660, 524, 780, 361, 325, 41, 158, 691, 75, 650, 572, 632, 351, 622, 66, 570, 145, 345, 122 }}, "employment":[{"organization-name":"Villa-tech","start-date":date("2006-12-27")}]}
-{"id": 891, "alias": "Blanch000891", "name": "Blanch Rodacker", "user-since": datetime("2007-01-28T20:57:27"), "address": {"street":"93 Elm Blvd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{51, 832, 691 }}, "employment":[{"organization-name":"Mathtech","start-date":date("2012-05-19"),"end-date":date("2012-06-03")}]}
-{"id": 892, "alias": "Shevaun000892", "name": "Shevaun Tomlinson", "user-since": datetime("2006-03-28T16:41:54"), "address": {"street":"81 Main Rd.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{439, 832, 755, 753, 674, 588, 500, 650, 812, 164 }}, "employment":[{"organization-name":"U-electrics","start-date":date("2010-10-08")}]}
-{"id": 893, "alias": "Leslie000893", "name": "Leslie Cavalet", "user-since": datetime("2009-05-15T04:58:45"), "address": {"street":"47 Maple St.", "city":"New York", "state":"NY", "zip":"11215", "country":"US"}, "friend-ids": {{109, 890, 775, 52, 192, 25, 134, 781, 562, 739, 131 }}, "employment":[{"organization-name":"U-ron","start-date":date("2009-05-07"),"end-date":date("2011-07-13")}]}
-{"id": 894, "alias": "Logan000894", "name": "Logan Billimek", "user-since": datetime("2007-02-25T07:02:09"), "address": {"street":"15 Second Ave.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{900, 486, 606, 115, 41, 376, 31 }}, "employment":[{"organization-name":"Trustbam","start-date":date("2005-05-22")}]}
-{"id": 895, "alias": "Thad000895", "name": "Thad Huston", "user-since": datetime("2006-09-05T17:15:14"), "address": {"street":"15 Lake Rd.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{420, 808, 325, 781, 578, 877, 717, 489, 387, 810, 801, 710, 451, 267, 542, 614, 805, 291, 413, 277 }}, "employment":[{"organization-name":"Fix-touch","start-date":date("2002-05-21"),"end-date":date("2010-02-18")}]}
-{"id": 896, "alias": "Chelsie000896", "name": "Chelsie Toke", "user-since": datetime("2014-08-11T10:41:57"), "address": {"street":"49 Lake Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{281, 38, 147, 258, 858, 647, 839, 895, 553, 552, 899, 894, 174, 877, 82, 781, 227, 385, 721 }}, "employment":[{"organization-name":"Statcode","start-date":date("2001-04-03"),"end-date":date("2003-07-26")}]}
-{"id": 897, "alias": "Harriett000897", "name": "Harriett Baughman", "user-since": datetime("2011-03-20T02:05:26"), "address": {"street":"91 Lake Rd.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Zamcorporation","start-date":date("2001-09-09"),"end-date":date("2006-03-24")}]}
-{"id": 898, "alias": "Karly000898", "name": "Karly Wain", "user-since": datetime("2005-05-07T04:39:16"), "address": {"street":"59 First St.", "city":"Redwood Shores", "state":"CA", "zip":"94065", "country":"US"}, "friend-ids": {{350, 221, 160, 585, 622, 161, 890, 377 }}, "employment":[{"organization-name":"Ranhotfan","start-date":date("2010-07-02")}]}
-{"id": 899, "alias": "Lavena000899", "name": "Lavena Gronko", "user-since": datetime("2006-09-15T10:00:12"), "address": {"street":"90 Maple St.", "city":"San Jose", "state":"CA", "zip":"95134", "country":"US"}, "friend-ids": {{842, 826, 146, 613, 693, 60, 397, 714, 646, 410, 829, 559, 480, 366, 874, 68, 430, 648 }}, "employment":[{"organization-name":"Strongtone","start-date":date("2005-08-26")}]}
-{"id": 900, "alias": "Rosalee000900", "name": "Rosalee Carr", "user-since": datetime("2012-02-25T01:50:03"), "address": {"street":"81 Hill Rd.", "city":"Irvine", "state":"CA", "zip":"92617", "country":"US"}, "friend-ids": {{}}, "employment":[{"organization-name":"Whitemedia","start-date":date("2010-12-15")}]}
-{"id": 901, "alias": "Branden000901", "name": "Branden Yates", "user-since": datetime("2005-07-08T03:57:54"), "address": {"street":"61 Maple St.", "city":"San Jose", "state":"CA", "zip":"94089", "country":"US"}, "friend-ids": {{309, 126, 360, 4, 500, 386, 453, 251, 879, 468, 605, 21, 851, 159, 250, 679, 640, 319, 423, 892, 796, 305, 16, 819 }}, "employment":[{"organization-name":"Latsonity","start-date":date("2002-05-25")}]}
diff --git a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop b/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop
deleted file mode 100644
index 683e95d..0000000
--- a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop
+++ /dev/null
@@ -1,290 +0,0 @@
-#!/usr/bin/env bash
-
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-# The Hadoop command script
-#
-# Environment Variables
-#
-#   JAVA_HOME        The java implementation to use.  Overrides JAVA_HOME.
-#
-#   HADOOP_CLASSPATH Extra Java CLASSPATH entries.
-#
-#   HADOOP_HEAPSIZE  The maximum amount of heap to use, in MB. 
-#                    Default is 1000.
-#
-#   HADOOP_OPTS      Extra Java runtime options.
-#   
-#   HADOOP_NAMENODE_OPTS       These options are added to HADOOP_OPTS 
-#   HADOOP_CLIENT_OPTS         when the respective command is run.
-#   HADOOP_{COMMAND}_OPTS etc  HADOOP_JT_OPTS applies to JobTracker 
-#                              for e.g.  HADOOP_CLIENT_OPTS applies to 
-#                              more than one command (fs, dfs, fsck, 
-#                              dfsadmin etc)  
-#
-#   HADOOP_CONF_DIR  Alternate conf dir. Default is ${HADOOP_HOME}/conf.
-#
-#   HADOOP_ROOT_LOGGER The root appender. Default is INFO,console
-#
-
-bin=`dirname "$0"`
-bin=`cd "$bin"; pwd`
-
-. "$bin"/hadoop-config.sh
-
-cygwin=false
-case "`uname`" in
-CYGWIN*) cygwin=true;;
-esac
-
-# if no args specified, show usage
-if [ $# = 0 ]; then
-  echo "Usage: hadoop [--config confdir] COMMAND"
-  echo "where COMMAND is one of:"
-  echo "  namenode -format     format the DFS filesystem"
-  echo "  secondarynamenode    run the DFS secondary namenode"
-  echo "  namenode             run the DFS namenode"
-  echo "  datanode             run a DFS datanode"
-  echo "  dfsadmin             run a DFS admin client"
-  echo "  mradmin              run a Map-Reduce admin client"
-  echo "  fsck                 run a DFS filesystem checking utility"
-  echo "  fs                   run a generic filesystem user client"
-  echo "  balancer             run a cluster balancing utility"
-  echo "  jobtracker           run the MapReduce job Tracker node" 
-  echo "  pipes                run a Pipes job"
-  echo "  tasktracker          run a MapReduce task Tracker node" 
-  echo "  job                  manipulate MapReduce jobs"
-  echo "  queue                get information regarding JobQueues" 
-  echo "  version              print the version"
-  echo "  jar <jar>            run a jar file"
-  echo "  distcp <srcurl> <desturl> copy file or directories recursively"
-  echo "  archive -archiveName NAME <src>* <dest> create a hadoop archive"
-  echo "  daemonlog            get/set the log level for each daemon"
-  echo " or"
-  echo "  CLASSNAME            run the class named CLASSNAME"
-  echo "Most commands print help when invoked w/o parameters."
-  exit 1
-fi
-
-# get arguments
-COMMAND=$1
-shift
-
-if [ -f "${HADOOP_CONF_DIR}/hadoop-env.sh" ]; then
-  . "${HADOOP_CONF_DIR}/hadoop-env.sh"
-fi
-
-# some Java parameters
-if [ "$JAVA_HOME" != "" ]; then
-  #echo "run java in $JAVA_HOME"
-  JAVA_HOME=$JAVA_HOME
-fi
-  
-if [ "$JAVA_HOME" = "" ]; then
-  echo "Error: JAVA_HOME is not set."
-  exit 1
-fi
-
-JAVA=$JAVA_HOME/bin/java
-JAVA_HEAP_MAX=-Xmx1000m 
-
-# check envvars which might override default args
-if [ "$HADOOP_HEAPSIZE" != "" ]; then
-  #echo "run with heapsize $HADOOP_HEAPSIZE"
-  JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"
-  #echo $JAVA_HEAP_MAX
-fi
-
-# CLASSPATH initially contains $HADOOP_CONF_DIR
-CLASSPATH=${HADOOP_CONF_DIR}
-CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar
-
-# for developers, add Hadoop classes to CLASSPATH
-if [ -d "$HADOOP_HOME/build/classes" ]; then
-  CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/classes
-fi
-if [ -d "$HADOOP_HOME/build/webapps" ]; then
-  CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build
-fi
-if [ -d "$HADOOP_HOME/build/test/classes" ]; then
-  CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/test/classes
-fi
-if [ -d "$HADOOP_HOME/build/tools" ]; then
-  CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/tools
-fi
-
-# so that filenames w/ spaces are handled correctly in loops below
-IFS=
-
-# for releases, add core hadoop jar & webapps to CLASSPATH
-if [ -d "$HADOOP_HOME/webapps" ]; then
-  CLASSPATH=${CLASSPATH}:$HADOOP_HOME
-fi
-for f in $HADOOP_HOME/hadoop-*-core.jar; do
-  CLASSPATH=${CLASSPATH}:$f;
-done
-
-# add libs to CLASSPATH
-for f in $HADOOP_HOME/lib/*.jar; do
-  CLASSPATH=${CLASSPATH}:$f;
-done
-
-if [ -d "$HADOOP_HOME/build/ivy/lib/Hadoop/common" ]; then
-for f in $HADOOP_HOME/build/ivy/lib/Hadoop/common/*.jar; do
-  CLASSPATH=${CLASSPATH}:$f;
-done
-fi
-
-for f in $HADOOP_HOME/lib/jsp-2.1/*.jar; do
-  CLASSPATH=${CLASSPATH}:$f;
-done
-
-for f in $HADOOP_HOME/hadoop-*-tools.jar; do
-  TOOL_PATH=${TOOL_PATH}:$f;
-done
-for f in $HADOOP_HOME/build/hadoop-*-tools.jar; do
-  TOOL_PATH=${TOOL_PATH}:$f;
-done
-
-# add user-specified CLASSPATH last
-if [ "$HADOOP_CLASSPATH" != "" ]; then
-  CLASSPATH=${HADOOP_CLASSPATH}:${CLASSPATH}
-fi
-
-# default log directory & file
-if [ "$HADOOP_LOG_DIR" = "" ]; then
-  HADOOP_LOG_DIR="$HADOOP_HOME/logs"
-fi
-if [ "$HADOOP_LOGFILE" = "" ]; then
-  HADOOP_LOGFILE='hadoop.log'
-fi
-
-# default policy file for service-level authorization
-if [ "$HADOOP_POLICYFILE" = "" ]; then
-  HADOOP_POLICYFILE="hadoop-policy.xml"
-fi
-
-# restore ordinary behaviour
-unset IFS
-
-# figure out which class to run
-if [ "$COMMAND" = "namenode" ] ; then
-  CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
-elif [ "$COMMAND" = "secondarynamenode" ] ; then
-  CLASS='org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode'
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_SECONDARYNAMENODE_OPTS"
-elif [ "$COMMAND" = "datanode" ] ; then
-  CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode'
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_DATANODE_OPTS"
-elif [ "$COMMAND" = "fs" ] ; then
-  CLASS=org.apache.hadoop.fs.FsShell
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "dfs" ] ; then
-  CLASS=org.apache.hadoop.fs.FsShell
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "dfsadmin" ] ; then
-  CLASS=org.apache.hadoop.hdfs.tools.DFSAdmin
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "mradmin" ] ; then
-  CLASS=org.apache.hadoop.mapred.tools.MRAdmin
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "fsck" ] ; then
-  CLASS=org.apache.hadoop.hdfs.tools.DFSck
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "balancer" ] ; then
-  CLASS=org.apache.hadoop.hdfs.server.balancer.Balancer
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_BALANCER_OPTS"
-elif [ "$COMMAND" = "jobtracker" ] ; then
-  CLASS=org.apache.hadoop.mapred.JobTracker
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_JOBTRACKER_OPTS"
-elif [ "$COMMAND" = "tasktracker" ] ; then
-  CLASS=org.apache.hadoop.mapred.TaskTracker
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_TASKTRACKER_OPTS"
-elif [ "$COMMAND" = "job" ] ; then
-  CLASS=org.apache.hadoop.mapred.JobClient
-elif [ "$COMMAND" = "queue" ] ; then
-  CLASS=org.apache.hadoop.mapred.JobQueueClient
-elif [ "$COMMAND" = "pipes" ] ; then
-  CLASS=org.apache.hadoop.mapred.pipes.Submitter
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "version" ] ; then
-  CLASS=org.apache.hadoop.util.VersionInfo
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "jar" ] ; then
-  CLASS=org.apache.hadoop.util.RunJar
-elif [ "$COMMAND" = "distcp" ] ; then
-  CLASS=org.apache.hadoop.tools.DistCp
-  CLASSPATH=${CLASSPATH}:${TOOL_PATH}
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "daemonlog" ] ; then
-  CLASS=org.apache.hadoop.log.LogLevel
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "archive" ] ; then
-  CLASS=org.apache.hadoop.tools.HadoopArchives
-  CLASSPATH=${CLASSPATH}:${TOOL_PATH}
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-elif [ "$COMMAND" = "sampler" ] ; then
-  CLASS=org.apache.hadoop.mapred.lib.InputSampler
-  HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
-else
-  CLASS=$COMMAND
-fi
-
-# cygwin path translation
-if $cygwin; then
-  CLASSPATH=`cygpath -p -w "$CLASSPATH"`
-  HADOOP_HOME=`cygpath -w "$HADOOP_HOME"`
-  HADOOP_LOG_DIR=`cygpath -w "$HADOOP_LOG_DIR"`
-  TOOL_PATH=`cygpath -p -w "$TOOL_PATH"`
-fi
-# setup 'java.library.path' for native-hadoop code if necessary
-JAVA_LIBRARY_PATH=''
-if [ -d "${HADOOP_HOME}/build/native" -o -d "${HADOOP_HOME}/lib/native" ]; then
-  JAVA_PLATFORM=`CLASSPATH=${CLASSPATH} ${JAVA} -Xmx32m org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
-  
-  if [ -d "$HADOOP_HOME/build/native" ]; then
-    JAVA_LIBRARY_PATH=${HADOOP_HOME}/build/native/${JAVA_PLATFORM}/lib
-  fi
-  
-  if [ -d "${HADOOP_HOME}/lib/native" ]; then
-    if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
-      JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}
-    else
-      JAVA_LIBRARY_PATH=${HADOOP_HOME}/lib/native/${JAVA_PLATFORM}
-    fi
-  fi
-fi
-
-# cygwin path translation
-if $cygwin; then
-  JAVA_LIBRARY_PATH=`cygpath -p "$JAVA_LIBRARY_PATH"`
-fi
-
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.log.dir=$HADOOP_LOG_DIR"
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.log.file=$HADOOP_LOGFILE"
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.home.dir=$HADOOP_HOME"
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.id.str=$HADOOP_IDENT_STRING"
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.root.logger=${HADOOP_ROOT_LOGGER:-INFO,console}"
-if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
-  HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"
-fi  
-HADOOP_OPTS="$HADOOP_OPTS -Dhadoop.policy.file=$HADOOP_POLICYFILE"
-
-# run it
-#echo "exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@""
-exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
diff --git a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop-config.sh b/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop-config.sh
deleted file mode 100755
index bf0fe04..0000000
--- a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/bin/hadoop-config.sh
+++ /dev/null
@@ -1,85 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# included in all the hadoop scripts with source command
-# should not be executable directly
-# also should not be passed any arguments, since we need original $*
-
-# resolve links - $0 may be a softlink
-
-this="$0"
-while [ -h "$this" ]; do
-  ls=`ls -ld "$this"`
-  link=`expr "$ls" : '.*-> \(.*\)$'`
-  if expr "$link" : '.*/.*' > /dev/null; then
-    this="$link"
-  else
-    this=`dirname "$this"`/"$link"
-  fi
-done
-
-# convert relative path to absolute path
-bin=`dirname "$this"`
-script=`basename "$this"`
-bin=`cd "$bin"; pwd`
-this="$bin/$script"
-
-# the root of the Hadoop installation
-export HADOOP_HOME=`dirname "$this"`/..
-
-#check to see if the conf dir is given as an optional argument
-if [ $# -gt 1 ]
-then
-    if [ "--config" = "$1" ]
-      then
-          shift
-          confdir=$1
-          shift
-          HADOOP_CONF_DIR=$confdir
-    fi
-fi
-
-# Allow alternate conf dir location.
-HADOOP_CONF_DIR="${HADOOP_CONF_DIR:-$HADOOP_HOME/conf}"
-
-#check to see it is specified whether to use the slaves or the
-# masters file
-if [ $# -gt 1 ]
-then
-    if [ "--hosts" = "$1" ]
-    then
-        shift
-        slavesfile=$1
-        shift
-        export HADOOP_SLAVES="${HADOOP_CONF_DIR}/$slavesfile"
-    fi
-fi
diff --git a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/conf/hadoop-env.sh b/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/conf/hadoop-env.sh
deleted file mode 100755
index a67c408..0000000
--- a/asterixdb/asterix-installer/src/main/resources/hadoop-0.20.2/conf/hadoop-env.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# Set Hadoop-specific environment variables here.
-
-# The only required environment variable is JAVA_HOME.  All others are
-# optional.  When running a distributed configuration it is best to
-# set JAVA_HOME in this file, so that it is correctly defined on
-# remote nodes.
-
-# The java implementation to use.  Required.
-# export JAVA_HOME=$JAVA_HOME
-
-# Extra Java CLASSPATH elements.  Optional.
-# export HADOOP_CLASSPATH=
-
-# The maximum amount of heap to use, in MB. Default is 1000.
-# export HADOOP_HEAPSIZE=2000
-
-# Extra Java runtime options.  Empty by default.
-# export HADOOP_OPTS=-server
-
-# Command specific options appended to HADOOP_OPTS when specified
-export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
-export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
-export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
-export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
-export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
-# export HADOOP_TASKTRACKER_OPTS=
-# The following applies to multiple commands (fs, dfs, fsck, distcp etc)
-# export HADOOP_CLIENT_OPTS
-
-# Extra ssh options.  Empty by default.
-# export HADOOP_SSH_OPTS="-o ConnectTimeout=1 -o SendEnv=HADOOP_CONF_DIR"
-
-# Where log files are stored.  $HADOOP_HOME/logs by default.
-# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
-
-# File naming remote slave hosts.  $HADOOP_HOME/conf/slaves by default.
-# export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves
-
-# host:path where hadoop code should be rsync'd from.  Unset by default.
-# export HADOOP_MASTER=master:/home/$USER/src/hadoop
-
-# Seconds to sleep between slave commands.  Unset by default.  This
-# can be useful in large clusters, where, e.g., slave rsyncs can
-# otherwise arrive faster than the master can service them.
-# export HADOOP_SLAVE_SLEEP=0.1
-
-# The directory where pid files are stored. /tmp by default.
-# export HADOOP_PID_DIR=/var/hadoop/pids
-
-# A string representing this instance of hadoop. $USER by default.
-# export HADOOP_IDENT_STRING=$USER
-
-# The scheduling priority for daemon processes.  See 'man nice'.
-# export HADOOP_NICENESS=10
diff --git a/asterixdb/asterix-installer/src/main/resources/schema/jaxb-bindings.xjb b/asterixdb/asterix-installer/src/main/resources/schema/jaxb-bindings.xjb
deleted file mode 100644
index 0b191a6..0000000
--- a/asterixdb/asterix-installer/src/main/resources/schema/jaxb-bindings.xjb
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<jxb:bindings version="1.0"
-xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
-xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-<jxb:globalBindings>
-  <jxb:serializable uid="1"/>
-</jxb:globalBindings>
-
-</jxb:bindings>
diff --git a/asterixdb/asterix-installer/src/main/resources/scripts/managix b/asterixdb/asterix-installer/src/main/resources/scripts/managix
deleted file mode 100755
index ddda709..0000000
--- a/asterixdb/asterix-installer/src/main/resources/scripts/managix
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-if [ -z $MANAGIX_HOME ]
- then
-   pushd $(dirname $0) >/dev/null
-   cd ..
-   export MANAGIX_HOME=$(pwd)
-   popd >/dev/null
-fi
-
-MANAGIX_CLASSPATH=$MANAGIX_HOME/lib/*:$MANAGIX_HOME/conf/log4j.properties
-java $JAVA_OPTS -Dlog4j.configuration=file:$MANAGIX_HOME/conf/log4j.properties -cp $MANAGIX_CLASSPATH org.apache.asterix.installer.driver.InstallerDriver $@
diff --git a/asterixdb/asterix-installer/src/main/resources/scripts/validate_ssh.sh b/asterixdb/asterix-installer/src/main/resources/scripts/validate_ssh.sh
deleted file mode 100755
index c773336..0000000
--- a/asterixdb/asterix-installer/src/main/resources/scripts/validate_ssh.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-USERNAME=$1
-shift 1
-numargs=$#
-for ((i=1 ; i <= numargs ; i=i+1))
-do
- host=$1
- ssh -l $USERNAME -oNumberOfPasswordPrompts=0 $host "echo $host"
- shift 1
-done
diff --git a/asterixdb/asterix-installer/src/main/resources/scripts/verify.sh b/asterixdb/asterix-installer/src/main/resources/scripts/verify.sh
deleted file mode 100755
index 5df92f7..0000000
--- a/asterixdb/asterix-installer/src/main/resources/scripts/verify.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-INSTANCE_NAME=$1
-MASTER_NODE=$2
-shift 2
-numargs=$#
-for ((i=1 ; i <= numargs ; i=i+2))
-do
- host=$1
- nc_id=$2
- INFO=$(ssh $host "ps -ef | grep nc_join | grep -v grep | grep -v ssh| grep $nc_id" | head -n 1 )
- PARENT_ID=`echo  $INFO | cut -d " "  -f2`
- PID_INFO=$(ssh $host "ps -ef |  grep asterix | grep -v grep | grep -v nc_join |  grep $PARENT_ID") 
- PID=`echo $PID_INFO | cut -d " " -f2`
- echo "NC:$host:$nc_id:$PID"
- shift 2
-done
-
-CC_PARENT_ID_INFO=$(ssh $MASTER_NODE "ps -ef  | grep asterix | grep cc_start | grep -v ssh")
-CC_PARENT_ID=`echo $CC_PARENT_ID_INFO | tr -s " " | cut -d " " -f2` 
-CC_ID_INFO=$(ssh $MASTER_NODE "ps -ef | grep asterix | grep $CC_PARENT_ID | grep -v bash")
-CC_ID=`echo $CC_ID_INFO |  tr -s " " | cut -d " " -f2`
-echo "CC:$MASTER_NODE:N/A:$CC_ID"
diff --git a/asterixdb/asterix-installer/src/main/resources/zookeeper/start_zk.sh b/asterixdb/asterix-installer/src/main/resources/zookeeper/start_zk.sh
deleted file mode 100755
index 7ec0e55..0000000
--- a/asterixdb/asterix-installer/src/main/resources/zookeeper/start_zk.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-ZK_HOME=$1
-ZK_ID=$2
-JAVA_HOME=$3
-mkdir $ZK_HOME/data
-echo $2 > $ZK_HOME/data/myid
-CLASSPATH=$ZK_HOME/lib/*:$ZK_HOME/conf:$ZK_HOME/conf/log4j.properties
-ZK_CONF=$ZK_HOME/zk.cfg
-$JAVA_HOME/bin/java $JAVA_OPTS -Dlog4j.configuration="file:$ZK_HOME/conf/log4j.properties" -cp $CLASSPATH org.apache.zookeeper.server.quorum.QuorumPeerMain $ZK_CONF
diff --git a/asterixdb/asterix-installer/src/main/resources/zookeeper/stop_zk b/asterixdb/asterix-installer/src/main/resources/zookeeper/stop_zk
deleted file mode 100644
index 9adac4c..0000000
--- a/asterixdb/asterix-installer/src/main/resources/zookeeper/stop_zk
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-ZK_HOME=$1
-shift 1
-for zk_host in  $@
-do
-  ssh $zk_host "kill -15 `ps -ef | awk '/java.*[Q]uorumPeerMain/ {print $2}'`" &
-done
diff --git a/asterixdb/asterix-installer/src/main/resources/zookeeper/zk.init b/asterixdb/asterix-installer/src/main/resources/zookeeper/zk.init
deleted file mode 100644
index e15f3d5..0000000
--- a/asterixdb/asterix-installer/src/main/resources/zookeeper/zk.init
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-ZK_HOME=$1
-SERVER_JAVA_HOME=$2
-shift 2
-cd $MANAGIX_HOME/.installer/zookeeper
-tar cf zk.pkg.tar *
-zk_server_id=1
-for zk_host in  $@
-do
-  ssh $zk_host "mkdir -p $ZK_HOME"
-  scp ./zk.pkg.tar $zk_host:$ZK_HOME/
-  ssh $zk_host "cd $ZK_HOME && tar xf $ZK_HOME/zk.pkg.tar && chmod +x $ZK_HOME/bin/start_zk.sh"
-  ssh $zk_host "$ZK_HOME/bin/start_zk.sh $ZK_HOME $zk_server_id $SERVER_JAVA_HOME" &
-  zk_server_id=`expr $zk_server_id + 1`	
-done
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AbstractExecutionIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AbstractExecutionIT.java
deleted file mode 100644
index 06e5aed..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AbstractExecutionIT.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.external.util.ExternalDataConstants;
-import org.apache.asterix.external.util.IdentitiyResolverFactory;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.asterix.testframework.context.TestFileContext;
-import org.apache.asterix.testframework.xml.TestCase.CompilationUnit;
-import org.apache.asterix.testframework.xml.TestGroup;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.util.file.FileUtil;
-import org.codehaus.plexus.util.FileUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public abstract class AbstractExecutionIT {
-
-    protected static final Logger LOGGER = Logger.getLogger(AbstractExecutionIT.class.getName());
-
-    protected static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    protected static final String PATH_BASE = StringUtils
-            .join(new String[] { "..", "asterix-app", "src", "test", "resources", "runtimets" }, File.separator);
-
-    protected static final String HDFS_BASE = "../asterix-app/";
-
-    protected static final TestExecutor testExecutor = new TestExecutor();
-
-    private static final String EXTERNAL_LIBRARY_TEST_GROUP = "lib";
-
-    private static final List<String> badTestCases = new ArrayList<>();
-
-    private static String reportPath =
-            new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(
-            AsterixInstallerIntegrationUtil.getManagixHome(), reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        System.out.println("Starting setup");
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting setup");
-        }
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-
-        HDFSCluster.getInstance().setup(HDFS_BASE);
-
-        //This is nasty but there is no very nice way to set a system property on each NC that I can figure.
-        //The main issue is that we need the NC resolver to be the IdentityResolver and not the DNSResolver.
-        FileUtils
-                .copyFile(
-                        new File(StringUtils.join(new String[] { "src", "test", "resources", "integrationts",
-                                "asterix-configuration.xml" }, File.separator)),
-                        new File(AsterixInstallerIntegrationUtil.getManagixHome() + "/conf/asterix-configuration.xml"));
-
-        AsterixLifecycleIT.setUp();
-
-        File externalTestsJar = new File(StringUtils.join(
-                new String[] { "..", "asterix-external-data", "target" }, File.separator)).listFiles(
-                        (dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
-
-        FileUtils.copyFile(externalTestsJar, new File(
-                AsterixInstallerIntegrationUtil.getManagixHome() + "/clusters/local/working_dir/asterix/repo/",
-                externalTestsJar.getName()));
-
-        AsterixLifecycleIT.restartInstance();
-
-        FileUtils.copyDirectoryStructure(
-                new File(FileUtil.joinPath("..", "asterix-app", "data")),
-                new File(AsterixInstallerIntegrationUtil.getManagixHome() + "/clusters/local/working_dir/data"));
-
-        FileUtils.copyDirectoryStructure(
-                new File(FileUtil.joinPath("..", "asterix-app", "target", "data")),
-                new File(AsterixInstallerIntegrationUtil.getManagixHome() + "/clusters/local/working_dir/target/data"));
-
-        FileUtils.copyDirectoryStructure(new File(FileUtil.joinPath("target", "data")),
-                new File(AsterixInstallerIntegrationUtil.getManagixHome()
-                        + "/clusters/local/working_dir/target/data/csv"));
-
-        // Set the node resolver to be the identity resolver that expects node names
-        // to be node controller ids; a valid assumption in test environment.
-        System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
-                IdentitiyResolverFactory.class.getName());
-
-        reportPath = new File(FileUtil.joinPath("target", "failsafe-reports"))
-                .getAbsolutePath();
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        File[] files = outdir.listFiles();
-        if ((files == null) || (files.length == 0)) {
-            outdir.delete();
-        }
-        AsterixLifecycleIT.tearDown();
-        HDFSCluster.getInstance().cleanup();
-        if (!badTestCases.isEmpty()) {
-            System.out.println("The following test cases left some data");
-            for (String testCase : badTestCases) {
-                System.out.println(testCase);
-            }
-        }
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-
-    private TestCaseContext tcCtx;
-
-    public AbstractExecutionIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Test
-    public void test() throws Exception {
-        if (skip()) {
-            return;
-        }
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
-        testExecutor.cleanup(tcCtx.toString(), badTestCases);
-    }
-
-    protected boolean skip() {
-        // If the test case contains library commands, we skip them
-        List<CompilationUnit> cUnits = tcCtx.getTestCase().getCompilationUnit();
-        for (CompilationUnit cUnit : cUnits) {
-            List<TestFileContext> testFileCtxs = tcCtx.getTestFiles(cUnit);
-            for (TestFileContext ctx : testFileCtxs) {
-                if (ctx.getType().equals(EXTERNAL_LIBRARY_TEST_GROUP)) {
-                    return true;
-                }
-            }
-        }
-        // For now we skip api tests.
-        for (TestGroup group : tcCtx.getTestGroups()) {
-            if (group != null && "api".equals(group.getName())) {
-                LOGGER.info("Skipping test: " + tcCtx.toString());
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixClusterLifeCycleIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixClusterLifeCycleIT.java
deleted file mode 100644
index 759baed..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixClusterLifeCycleIT.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runners.Parameterized.Parameters;
-
-public class AsterixClusterLifeCycleIT {
-
-    private static final String PATH_BASE = StringUtils
-            .join(new String[] { "src", "test", "resources", "integrationts", "lifecycle" }, File.separator);
-    private static final String CLUSTER_BASE = StringUtils
-            .join(new String[] { "src", "test", "resources", "clusterts" }, File.separator);
-    private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    private static String managixFolderName;
-    private static final Logger LOGGER = Logger.getLogger(AsterixClusterLifeCycleIT.class.getName());
-    private static List<TestCaseContext> testCaseCollection;
-    private static File asterixProjectDir = new File(System.getProperty("user.dir"));
-    private final TestExecutor testExecutor = new TestExecutor();
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        // testcase setup
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        testCaseCollection = b.build(new File(PATH_BASE));
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-
-        // vagrant setup
-        File installerTargetDir = new File(asterixProjectDir, "target");
-        System.out.println(managixFolderName);
-        managixFolderName = installerTargetDir.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-installer")
-                        && name.endsWith("binary-assembly");
-            }
-
-        })[0];
-        invoke("cp", "-r", installerTargetDir.toString() + "/" + managixFolderName,
-                asterixProjectDir + "/" + CLUSTER_BASE);
-
-        logOutput(remoteInvoke("cp -r /vagrant/" + managixFolderName + " /tmp/asterix").getInputStream());
-
-        logOutput(managixInvoke("configure").getInputStream());
-        logOutput(managixInvoke("validate").getInputStream());
-
-        Process p = managixInvoke("create -n vagrant-ssh -c /vagrant/cluster.xml");
-        String pout = processOut(p);
-        LOGGER.info(pout);
-        Assert.assertTrue(checkOutput(pout, "ACTIVE"));
-        // TODO: I should check for 'WARNING' here, but issue 764 stops this
-        // from being reliable
-        LOGGER.info("Test start active cluster instance PASSED");
-
-        Process stop = managixInvoke("stop -n vagrant-ssh");
-        Assert.assertTrue(checkOutput(stop.getInputStream(), "Stopped Asterix instance"));
-        LOGGER.info("Test stop active cluster instance PASSED");
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        Process p = managixInvoke("delete -n vagrant-ssh");
-        Assert.assertTrue(checkOutput(p.getInputStream(), "Deleted Asterix instance"));
-        remoteInvoke("rm -rf /vagrant/managix-working");
-        LOGGER.info("Test delete active instance PASSED");
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        return testArgs;
-    }
-
-    public static boolean checkOutput(InputStream input, String requiredSubString) {
-        // right now im just going to look at the output, which is wholly
-        // inadequate
-        // TODO: try using cURL to actually poke the instance to see if it is
-        // more alive
-        String candidate;
-        try {
-            candidate = IOUtils.toString(input, StandardCharsets.UTF_8.name());
-        } catch (IOException e) {
-            LOGGER.warning("Could not check output of subprocess");
-            return false;
-        }
-        return candidate.contains(requiredSubString);
-    }
-
-    public static boolean checkOutput(String candidate, String requiredSubString) {
-        return candidate.contains(requiredSubString);
-    }
-
-    public static String processOut(Process p) throws IOException {
-        InputStream input = p.getInputStream();
-        return IOUtils.toString(input, StandardCharsets.UTF_8.name());
-    }
-
-    public static void logOutput(InputStream input) {
-        try {
-            LOGGER.info(IOUtils.toString(input, StandardCharsets.UTF_8.name()));
-        } catch (IOException e) {
-            LOGGER.warning("Could not print output of subprocess");
-        }
-    }
-
-    private static Process invoke(String... args) throws Exception {
-        ProcessBuilder pb = new ProcessBuilder(args);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        return p;
-    }
-
-    private static Process remoteInvoke(String cmd) throws Exception {
-        ProcessBuilder pb = new ProcessBuilder("vagrant", "ssh", "cc", "-c", "MANAGIX_HOME=/tmp/asterix/ " + cmd);
-        File cwd = new File(asterixProjectDir.toString() + "/" + CLUSTER_BASE);
-        pb.directory(cwd);
-        pb.redirectErrorStream(true);
-        Process p = pb.start();
-        return p;
-    }
-
-    private static Process managixInvoke(String cmd) throws Exception {
-        return remoteInvoke("/tmp/asterix/bin/managix " + cmd);
-    }
-
-    @Test
-    public void StartStopActiveInstance() throws Exception {
-        // TODO: is the instance actually live?
-        // TODO: is ZK still running?
-        try {
-            Process start = managixInvoke("start -n vagrant-ssh");
-            Assert.assertTrue(checkOutput(start.getInputStream(), "ACTIVE"));
-            Process stop = managixInvoke("stop -n vagrant-ssh");
-            Assert.assertTrue(checkOutput(stop.getInputStream(), "Stopped Asterix instance"));
-            LOGGER.info("Test start/stop active cluster instance PASSED");
-        } catch (Exception e) {
-            throw new Exception("Test start/stop FAILED!", e);
-        }
-    }
-
-    public void test() throws Exception {
-        for (TestCaseContext testCaseCtx : testCaseCollection) {
-            testExecutor.executeTest(PATH_ACTUAL, testCaseCtx, null, false);
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-            new AsterixClusterLifeCycleIT().test();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.severe("TEST CASE(S) FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java
deleted file mode 100644
index c379517..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.hyracks.util.file.FileUtil;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-
-public class AsterixExternalLibraryIT {
-
-    private static final String LIBRARY_NAME = "testlib";
-    private static final String LIBRARY_DATAVERSE = "externallibtest";
-    private static final String PATH_BASE = "src/test/resources/integrationts/library";
-    private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    private static final String LIBRARY_PATH = "target" + File.separator + "resources" + File.separator + "externallib"
-            + File.separator + "asterix-external-data-testlib.zip";
-    private static final Logger LOGGER = Logger.getLogger(AsterixExternalLibraryIT.class.getName());
-    private static List<TestCaseContext> testCaseCollection;
-    private static String reportPath =
-            new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
-
-    private final TestExecutor testExecutor = new TestExecutor();
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(
-            AsterixInstallerIntegrationUtil.getManagixHome(), reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        try {
-            AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH);
-            File asterixInstallerProjectDir = new File(System.getProperty("user.dir"));
-            String asterixExternalLibraryPath = asterixInstallerProjectDir.getAbsolutePath() + File.separator
-                    + LIBRARY_PATH;
-            LOGGER.info("Installing library :" + LIBRARY_NAME + " located at " + asterixExternalLibraryPath
-                    + " in dataverse " + LIBRARY_DATAVERSE);
-            AsterixInstallerIntegrationUtil.installLibrary(LIBRARY_NAME, LIBRARY_DATAVERSE, asterixExternalLibraryPath);
-            AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-            TestCaseContext.Builder b = new TestCaseContext.Builder();
-            testCaseCollection = b.build(new File(PATH_BASE));
-        } catch (Throwable th) {
-            th.printStackTrace();
-            throw th;
-        }
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        AsterixInstallerIntegrationUtil.deinit();
-    }
-
-    @Test
-    public void test() throws Exception {
-        for (TestCaseContext testCaseCtx : testCaseCollection) {
-            testExecutor.executeTest(PATH_ACTUAL, testCaseCtx, null, false);
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-            new AsterixExternalLibraryIT().test();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.info("TEST CASES FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java
deleted file mode 100644
index bfe63be..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.util.Map;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.command.CommandHandler;
-import org.apache.asterix.installer.driver.InstallerDriver;
-import org.apache.asterix.installer.schema.conf.Configuration;
-import org.apache.hyracks.api.client.HyracksConnection;
-import org.apache.hyracks.api.client.IHyracksClientConnection;
-
-public class AsterixInstallerIntegrationUtil {
-
-    private static String managixHome;
-    private static String clusterConfigurationPath;
-    private static final CommandHandler cmdHandler = new CommandHandler();
-    public static final String ASTERIX_INSTANCE_NAME = "asterix";
-    private static final String CC_IP_ADDRESS = "127.0.0.1";
-    private static final int DEFAULT_HYRACKS_CC_CLIENT_PORT = 1098;
-    private static final int zookeeperClientPort = 2900;
-    private static final int zookeeperTestClientPort = 3945;
-    private static IHyracksClientConnection hcc;
-    private static final String CLUSTERS_BASE_PATH = "clusters" + File.separator + "local" + File.separator;
-    public static final String LOCAL_CLUSTER_PATH = CLUSTERS_BASE_PATH + File.separator + "local.xml";
-    public static final String LOCAL_CLUSTER_CHAINED_DECLUSTERING_REP_PATH = CLUSTERS_BASE_PATH + File.separator
-            + "local_chained_declustering_rep.xml";
-    public static final String LOCAL_CLUSTER_METADATA_ONLY_REP_PATH = CLUSTERS_BASE_PATH + File.separator
-            + "local_metadata_only_rep.xml";
-
-    public static void deinit() throws Exception {
-        deleteInstance();
-        stopZookeeper();
-    }
-
-    public static void init(String clusterPath) throws Exception {
-        managixHome = getManagixHome();
-        System.setProperty("log4j.configuration",
-                managixHome + File.separator + "conf" + File.separator + "log4j.properties");
-
-        clusterConfigurationPath = managixHome + File.separator + clusterPath;
-
-        InstallerDriver.setManagixHome(managixHome);
-
-        String command = "configure";
-        cmdHandler.processCommand(command.split(" "));
-        command = "validate -c " + clusterConfigurationPath;
-        cmdHandler.processCommand(command.split(" "));
-
-        startZookeeper();
-        Thread.sleep(2000);
-        InstallerDriver.initConfig(true);
-        createInstance();
-        hcc = new HyracksConnection(CC_IP_ADDRESS, DEFAULT_HYRACKS_CC_CLIENT_PORT);
-    }
-
-    public static IHyracksClientConnection getHyracksConnection() {
-        return hcc;
-    }
-
-    private static void startZookeeper() throws Exception {
-        initZookeeperTestConfiguration(zookeeperClientPort);
-        String script = managixHome + File.separator + "bin" + File.separator + "managix";
-
-        // shutdown zookeeper if running
-        String command = "shutdown";
-        cmdHandler.processCommand(command.split(" "));
-
-        //TODO: This must be fixed, an arbitrary wait for 2s is not a reliable way to make sure the process have completed successfully.
-        Thread.sleep(2000);
-
-        // start zookeeper
-        initZookeeperTestConfiguration(zookeeperTestClientPort);
-        ProcessBuilder pb2 = new ProcessBuilder(script, "describe");
-        Map<String, String> env2 = pb2.environment();
-        env2.put("MANAGIX_HOME", managixHome);
-        pb2.start();
-
-    }
-
-    public static void createInstance() throws Exception {
-
-        String command = null;
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                .getAsterixInstance(ASTERIX_INSTANCE_NAME);
-        if (instance != null) {
-            transformIntoRequiredState(State.INACTIVE);
-            command = "delete -n " + ASTERIX_INSTANCE_NAME;
-            cmdHandler.processCommand(command.split(" "));
-        }
-
-        command = "create -n " + ASTERIX_INSTANCE_NAME + " " + "-c" + " " + clusterConfigurationPath;
-        cmdHandler.processCommand(command.split(" "));
-
-        instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(ASTERIX_INSTANCE_NAME);
-        AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-        assert (state.getFailedNCs().isEmpty() && state.isCcRunning());
-    }
-
-    private static void initZookeeperTestConfiguration(int port) throws JAXBException, FileNotFoundException {
-        String installerConfPath = InstallerDriver.getManagixHome() + File.separator + InstallerDriver.MANAGIX_CONF_XML;
-        JAXBContext ctx = JAXBContext.newInstance(Configuration.class);
-        Unmarshaller unmarshaller = ctx.createUnmarshaller();
-        Configuration configuration = (Configuration) unmarshaller.unmarshal(new File(installerConfPath));
-        configuration.getZookeeper().setClientPort(new BigInteger("" + port));
-        Marshaller marshaller = ctx.createMarshaller();
-        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-        marshaller.marshal(configuration, new FileOutputStream(installerConfPath));
-    }
-
-    public static void transformIntoRequiredState(AsterixInstance.State state) throws Exception {
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                .getAsterixInstance(ASTERIX_INSTANCE_NAME);
-        assert (instance != null);
-        if (instance.getState().equals(state)) {
-            return;
-        }
-        if (state.equals(AsterixInstance.State.UNUSABLE)) {
-            throw new IllegalArgumentException("Invalid desired state");
-        }
-
-        String command = null;
-        switch (instance.getState()) {
-            case ACTIVE:
-                command = "stop -n " + ASTERIX_INSTANCE_NAME;
-                break;
-            case INACTIVE:
-                command = "start -n " + ASTERIX_INSTANCE_NAME;
-                break;
-            case UNUSABLE:
-                command = "delete -n " + ASTERIX_INSTANCE_NAME;
-                cmdHandler.processCommand(command.split(" "));
-                throw new Exception("Cluster state was Unusable");
-        }
-        cmdHandler.processCommand(command.split(" "));
-    }
-
-    private static void stopZookeeper() throws IOException, JAXBException {
-        String script = managixHome + File.separator + "bin" + File.separator + "managix";
-        // shutdown zookeeper if running
-        ProcessBuilder pb = new ProcessBuilder(script, "shutdown");
-        Map<String, String> env = pb.environment();
-        env.put("MANAGIX_HOME", managixHome);
-        pb.start();
-    }
-
-    private static void deleteInstance() throws Exception {
-        String command = null;
-        AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                .getAsterixInstance(ASTERIX_INSTANCE_NAME);
-
-        if (instance == null) {
-            return;
-        } else {
-            transformIntoRequiredState(State.INACTIVE);
-            command = "delete -n " + ASTERIX_INSTANCE_NAME;
-            cmdHandler.processCommand(command.split(" "));
-        }
-        instance = ServiceProvider.INSTANCE.getLookupService().getAsterixInstance(ASTERIX_INSTANCE_NAME);
-        assert (instance == null);
-    }
-
-    public static String getManagixHome() {
-        File asterixProjectDir = new File(System.getProperty("user.dir"));
-
-        File installerTargetDir = new File(asterixProjectDir, "target");
-        String managixHomeDirName = installerTargetDir.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-installer")
-                        && name.endsWith("binary-assembly");
-            }
-
-        })[0];
-        return new File(installerTargetDir, managixHomeDirName).getAbsolutePath();
-    }
-
-    public static void installLibrary(String libraryName, String libraryDataverse, String libraryPath)
-            throws Exception {
-        transformIntoRequiredState(State.INACTIVE);
-        String command = "install -n " + ASTERIX_INSTANCE_NAME + " -d " + libraryDataverse + " -l " + libraryName
-                + " -p " + libraryPath;
-        cmdHandler.processCommand(command.split(" "));
-    }
-
-    public static void uninstallLibrary(String dataverseName, String libraryName) throws Exception {
-        transformIntoRequiredState(State.INACTIVE);
-        String command = "uninstall -n " + ASTERIX_INSTANCE_NAME + " -d " + dataverseName + " -l " + "libraryName";
-        cmdHandler.processCommand(command.split(" "));
-    }
-
-    public static void executeCommand(String command) throws Exception {
-        cmdHandler.processCommand(command.trim().split(" "));
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java
deleted file mode 100644
index 814e109..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.asterix.event.error.VerificationUtil;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.event.model.AsterixRuntimeState;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.installer.command.CommandHandler;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runners.MethodSorters;
-import org.junit.runners.Parameterized.Parameters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-
-public class AsterixLifecycleIT {
-
-    private static final int NUM_NC = 2;
-    private static final CommandHandler cmdHandler = new CommandHandler();
-    private static final String PATH_BASE = "src/test/resources/integrationts/lifecycle";
-    private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    private static final Logger LOGGER = Logger.getLogger(AsterixLifecycleIT.class.getName());
-    private static List<TestCaseContext> testCaseCollection;
-    private final TestExecutor testExecutor = new TestExecutor();
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH);
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        testCaseCollection = b.build(new File(PATH_BASE));
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        AsterixInstallerIntegrationUtil.deinit();
-        File outdir = new File(PATH_ACTUAL);
-        File[] files = outdir.listFiles();
-        if (files == null || files.length == 0) {
-            outdir.delete();
-        }
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<>();
-        return testArgs;
-    }
-
-    public static void restartInstance() throws Exception {
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.INACTIVE);
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-    }
-
-    @Test
-    public void test_1_StopActiveInstance() throws Exception {
-        try {
-            LOGGER.info("Starting test: test_1_StopActiveInstance");
-            AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-            String command = "stop -n " + AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME;
-            cmdHandler.processCommand(command.split(" "));
-            Thread.sleep(4000);
-            AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                    .getAsterixInstance(AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME);
-            AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-            assert (state.getFailedNCs().size() == NUM_NC && !state.isCcRunning());
-            LOGGER.info("PASSED: test_1_StopActiveInstance");
-        } catch (Exception e) {
-            throw new Exception("Test configure installer " + "\" FAILED!", e);
-        }
-    }
-
-    @Test
-    public void test_2_StartActiveInstance() throws Exception {
-        try {
-            LOGGER.info("Starting test: test_2_StartActiveInstance");
-            AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.INACTIVE);
-            String command = "start -n " + AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME;
-            cmdHandler.processCommand(command.split(" "));
-            AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                    .getAsterixInstance(AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME);
-            AsterixRuntimeState state = VerificationUtil.getAsterixRuntimeState(instance);
-            assert (state.getFailedNCs().size() == 0 && state.isCcRunning());
-            LOGGER.info("PASSED: test_2_StartActiveInstance");
-        } catch (Exception e) {
-            throw new Exception("Test configure installer " + "\" FAILED!", e);
-        }
-    }
-
-    @Test
-    public void test_3_DeleteActiveInstance() throws Exception {
-        try {
-            LOGGER.info("Starting test: test_3_DeleteActiveInstance");
-            AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.INACTIVE);
-            String command = "delete -n " + AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME;
-            cmdHandler.processCommand(command.split(" "));
-            AsterixInstance instance = ServiceProvider.INSTANCE.getLookupService()
-                    .getAsterixInstance(AsterixInstallerIntegrationUtil.ASTERIX_INSTANCE_NAME);
-            assert (instance == null);
-            LOGGER.info("PASSED: test_3_DeleteActiveInstance");
-        } catch (Exception e) {
-            throw new Exception("Test delete active instance " + "\" FAILED!", e);
-        } finally {
-            // recreate instance
-            AsterixInstallerIntegrationUtil.createInstance();
-        }
-    }
-
-    @Test
-    public void test() throws Exception {
-        for (TestCaseContext testCaseCtx : testCaseCollection) {
-            testExecutor.executeTest(PATH_ACTUAL, testCaseCtx, null, false);
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-            new AsterixLifecycleIT().test();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.info("TEST CASE(S) FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java
deleted file mode 100644
index d3fdc4a..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.hyracks.util.file.FileUtil;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-//This is just a simple derivative of all of the other IT test cases specifically for test cases which revolve around
-//some behavior where stopping and starting Asterix causes issues
-
-@RunWith(Parameterized.class)
-public class AsterixRestartIT {
-
-    private static final String PATH_BASE = "src/test/resources/integrationts/restart/";
-    private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    private static final Logger LOGGER = Logger.getLogger(AsterixRestartIT.class.getName());
-    private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
-
-    private final TestExecutor testExecutor = new TestExecutor();
-    private TestCaseContext tcCtx;
-    private static String scriptHomePath;
-    private static File asterixInstallerPath;
-    private static ProcessBuilder pb;
-    private static Map<String, String> env;
-
-
-    public AsterixRestartIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(AsterixInstallerIntegrationUtil.getManagixHome(), reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        try {
-            pb = new ProcessBuilder();
-            env = pb.environment();
-            asterixInstallerPath = new File(System.getProperty("user.dir"));
-            scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
-                    + "resources" + File.separator + "integrationts" + File.separator + "restart"
-                    + File.separator + "scripts";
-            env.put("SCRIPT_HOME", scriptHomePath);
-            AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH);
-        } catch (Throwable th) {
-            th.printStackTrace();
-            throw th;
-        }
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        AsterixInstallerIntegrationUtil.deinit();
-    }
-
-    @Before
-    public void before() throws Exception {
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.INACTIVE);
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-    }
-
-
-    @After
-    public void after() throws Exception{
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.INACTIVE);
-    }
-
-    @Test
-    public void test() throws Exception {
-            testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
-    }
-
-    @Parameterized.Parameters(name = "RestartIT {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        if (testArgs.size() == 0) {
-            testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        }
-        return testArgs;
-    }
-
-    protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ClusterExecutionIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ClusterExecutionIT.java
deleted file mode 100644
index 446e5e3..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ClusterExecutionIT.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.logging.Level;
-
-import org.apache.asterix.external.util.ExternalDataConstants;
-import org.apache.asterix.external.util.IdentitiyResolverFactory;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.util.file.FileUtil;
-import org.codehaus.plexus.util.FileUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public class ClusterExecutionIT extends AbstractExecutionIT {
-
-    private static final String CLUSTER_CC_ADDRESS = "10.10.0.2";
-    private static final int CLUSTER_CC_API_PORT = 19002;
-
-    private final static TestExecutor testExecutor = new TestExecutor(CLUSTER_CC_ADDRESS, CLUSTER_CC_API_PORT);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        System.out.println("Starting setup");
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting setup");
-        }
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-
-        HDFSCluster.getInstance().setup(HDFS_BASE);
-
-        AsterixClusterLifeCycleIT.setUp();
-
-        FileUtils.copyDirectoryStructure(
-                new File(FileUtil.joinPath("..", "asterix-app", "data")),
-                new File(StringUtils.join(
-                        new String[] { "src", "test", "resources", "clusterts", "managix-working", "data" },
-                        File.separator)));
-
-        // Set the node resolver to be the identity resolver that expects node names
-        // to be node controller ids; a valid assumption in test environment.
-        System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
-                IdentitiyResolverFactory.class.getName());
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        File[] files = outdir.listFiles();
-        if ((files == null) || (files.length == 0)) {
-            outdir.delete();
-        }
-
-        HDFSCluster.getInstance().cleanup();
-
-        AsterixClusterLifeCycleIT.tearDown();
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-
-    private TestCaseContext tcCtx;
-
-    public ClusterExecutionIT(TestCaseContext tcCtx) {
-        super(tcCtx);
-        this.tcCtx = tcCtx;
-    }
-
-    @Override
-    @Test
-    public void test() throws Exception {
-        if (skip()) {
-            return;
-        }
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/InstallerLicensingIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/InstallerLicensingIT.java
deleted file mode 100644
index 0fc06b8..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/InstallerLicensingIT.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import org.apache.asterix.server.test.LicensingIT;
-
-public class InstallerLicensingIT extends LicensingIT {
-
-    @Override
-    protected String getInstallerDirPattern() {
-        return "asterix-installer.*-binary-assembly";
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixExecutionIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixExecutionIT.java
deleted file mode 100644
index 6df34ce..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixExecutionIT.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.asterix.installer.test;
-
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public class ManagixExecutionIT extends AbstractExecutionIT {
-
-    public ManagixExecutionIT(TestCaseContext tcCtx) {
-        super(tcCtx);
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixSqlppExecutionIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixSqlppExecutionIT.java
deleted file mode 100644
index 2eada38..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ManagixSqlppExecutionIT.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2009-2013 by The Regents of the University of California
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * you may obtain a copy of the License from
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
- */
-@RunWith(Parameterized.class)
-public class ManagixSqlppExecutionIT extends ManagixExecutionIT {
-
-    @Parameters(name = "ManagixSqlppExecutionIT {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = buildTestsInXml("only_sqlpp.xml");
-        if (testArgs.size() == 0) {
-            testArgs = buildTestsInXml("testsuite_sqlpp.xml");
-        }
-        return testArgs;
-    }
-
-    protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-
-    }
-
-    public ManagixSqlppExecutionIT(TestCaseContext tcCtx) {
-        super(tcCtx);
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java
deleted file mode 100644
index 809e815..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/MetadataReplicationIT.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class MetadataReplicationIT {
-
-    private static final String PATH_BASE =
-            Paths.get("src", "test", "resources", "integrationts", "metadata_only_replication").toString()
-                    + File.separator;
-    private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator;
-    private static final Logger LOGGER = Logger.getLogger(MetadataReplicationIT.class.getName());
-    private static String reportPath = new File(
-            StringUtils.join(new String[] { "target", "failsafe-reports" }, File.separator)).getAbsolutePath();
-
-    private final TestExecutor testExecutor = new TestExecutor();
-    private TestCaseContext tcCtx;
-    private static String scriptHomePath;
-    private static File asterixInstallerPath;
-    private static ProcessBuilder pb;
-    private static Map<String, String> env;
-
-    public MetadataReplicationIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(AsterixInstallerIntegrationUtil.getManagixHome(), reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        try {
-            pb = new ProcessBuilder();
-            env = pb.environment();
-            asterixInstallerPath = new File(System.getProperty("user.dir"));
-            scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
-                    + "resources" + File.separator + "integrationts" + File.separator + "metadata_only_replication" + File.separator
-                    + "scripts";
-            env.put("SCRIPT_HOME", scriptHomePath);
-        } catch (Throwable th) {
-            th.printStackTrace();
-            throw th;
-        }
-    }
-
-    @Before
-    public void before() throws Exception {
-        LOGGER.info("Creating new instance...");
-        AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_METADATA_ONLY_REP_PATH);
-        LOGGER.info("Instance created.");
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-        LOGGER.info("Instance is in ACTIVE state.");
-    }
-
-    @RetainLogsRule.After
-    public void after() throws Exception {
-        LOGGER.info("Destroying instance...");
-        AsterixInstallerIntegrationUtil.deinit();
-        LOGGER.info("Instance destroyed.");
-    }
-
-    @Test
-    public void test() throws Exception {
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
-    }
-
-    @Parameterized.Parameters(name = "MetadataReplicationIT {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        if (testArgs.size() == 0) {
-            testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        }
-        return testArgs;
-    }
-
-    protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java
deleted file mode 100644
index 21f382b..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.asterix.event.model.AsterixInstance.State;
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.hyracks.util.file.FileUtil;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-@RunWith(Parameterized.class)
-public class ReplicationIT {
-
-    private static final String PATH_BASE = FileUtil.joinPath("src", "test", "resources", "integrationts",
-            "replication");
-    private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
-    private static final Logger LOGGER = Logger.getLogger(ReplicationIT.class.getName());
-    private static String reportPath = new File(
-            FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
-
-    private final TestExecutor testExecutor = new TestExecutor();
-    private TestCaseContext tcCtx;
-    private static String scriptHomePath;
-    private static File asterixInstallerPath;
-    private static ProcessBuilder pb;
-    private static Map<String, String> env;
-
-    public ReplicationIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(AsterixInstallerIntegrationUtil.getManagixHome(), reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        try {
-            pb = new ProcessBuilder();
-            env = pb.environment();
-            asterixInstallerPath = new File(System.getProperty("user.dir"));
-            scriptHomePath = FileUtil.joinPath(asterixInstallerPath.getPath(), "src", "test", "resources",
-                    "integrationts", "replication", "scripts");
-            env.put("SCRIPT_HOME", scriptHomePath);
-        } catch (Throwable th) {
-            th.printStackTrace();
-            throw th;
-        }
-    }
-
-    @Before
-    public void before() throws Exception {
-        LOGGER.info("Creating new instance...");
-        AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_CHAINED_DECLUSTERING_REP_PATH);
-        LOGGER.info("Instance created.");
-        AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE);
-        LOGGER.info("Instance is in ACTIVE state.");
-    }
-
-    @RetainLogsRule.After
-    public void after() throws Exception {
-        LOGGER.info("Destroying instance...");
-        AsterixInstallerIntegrationUtil.deinit();
-        LOGGER.info("Instance destroyed.");
-    }
-
-    @Test
-    public void test() throws Exception {
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
-    }
-
-    @Parameterized.Parameters(name = "ReplicationIT {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        if (testArgs.size() == 0) {
-            testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
-        }
-        return testArgs;
-    }
-
-    protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/DmlRecoveryIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/DmlRecoveryIT.java
deleted file mode 100644
index 4f04e79..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/DmlRecoveryIT.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.transaction;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.FileUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class DmlRecoveryIT {
-
-    // variable to indicate whether this test will be executed
-
-    private static final Logger LOGGER = Logger.getLogger(RecoveryIT.class.getName());
-    private static final String PATH_ACTUAL = "target" + File.separator + "rttest" + File.separator;
-
-    private static final String TESTSUITE_PATH_BASE = "../asterix-app/src/test/resources/runtimets/";
-
-    private TestCaseContext tcCtx;
-    private static File asterixInstallerPath;
-    private static File installerTargetPath;
-    private static String managixHomeDirName;
-    private static String managixHomePath;
-    private static String scriptHomePath;
-    private static String reportPath;
-    private static ProcessBuilder pb;
-    private static Map<String, String> env;
-    private final TestExecutor testExecutor = new TestExecutor();
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(managixHomePath, reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-
-        asterixInstallerPath = new File(System.getProperty("user.dir"));
-        installerTargetPath = new File(asterixInstallerPath, "target");
-        reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
-        managixHomeDirName = installerTargetPath.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-installer")
-                        && name.endsWith("binary-assembly");
-            }
-        })[0];
-        managixHomePath = new File(installerTargetPath, managixHomeDirName).getAbsolutePath();
-        LOGGER.info("MANAGIX_HOME=" + managixHomePath);
-
-        pb = new ProcessBuilder();
-        env = pb.environment();
-        env.put("MANAGIX_HOME", managixHomePath);
-        scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
-                + "resources" + File.separator + "transactionts" + File.separator + "scripts";
-        env.put("SCRIPT_HOME", scriptHomePath);
-
-        TestExecutor.executeScript(pb,
-                scriptHomePath + File.separator + "dml_recovery" + File.separator + "configure_and_validate.sh");
-        TestExecutor.executeScript(pb,
-                scriptHomePath + File.separator + "dml_recovery" + File.separator + "stop_and_delete.sh");
-
-        TestExecutor.executeScript(pb,
-                scriptHomePath + File.separator + "dml_recovery" + File.separator + "create_and_start.sh");
-
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        FileUtils.deleteDirectory(outdir);
-        TestExecutor.executeScript(pb,
-                scriptHomePath + File.separator + "dml_recovery" + File.separator + "stop_and_delete.sh");
-        TestExecutor.executeScript(pb,
-                scriptHomePath + File.separator + "dml_recovery" + File.separator + "shutdown.sh");
-
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(TESTSUITE_PATH_BASE))) {
-            if (ctx.getTestCase().getFilePath().equals("dml")) {
-                testArgs.add(new Object[] { ctx });
-            }
-        }
-        return testArgs;
-    }
-
-    public DmlRecoveryIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Test
-    public void test() throws Exception {
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, true);
-    }
-}
diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/RecoveryIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/RecoveryIT.java
deleted file mode 100644
index 0e7ac8b..0000000
--- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/transaction/RecoveryIT.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.installer.transaction;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.asterix.test.base.RetainLogsRule;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.commons.io.FileUtils;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class RecoveryIT {
-
-    private static final Logger LOGGER = Logger.getLogger(RecoveryIT.class.getName());
-    private static final String PATH_ACTUAL = "target" + File.separator + "rttest" + File.separator;
-    private static final String PATH_BASE = "src/test/resources/transactionts/";
-    private static final String HDFS_BASE = "../asterix-app/";
-    private TestCaseContext tcCtx;
-    private static File asterixInstallerPath;
-    private static File installerTargetPath;
-    private static String managixHomeDirName;
-    private static String managixHomePath;
-    private static String scriptHomePath;
-    private static String reportPath;
-    private static ProcessBuilder pb;
-    private static Map<String, String> env;
-    private final TestExecutor testExecutor = new TestExecutor();
-
-    @Rule
-    public TestRule retainLogs = new RetainLogsRule(managixHomePath, reportPath, this);
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-
-        asterixInstallerPath = new File(System.getProperty("user.dir"));
-        installerTargetPath = new File(asterixInstallerPath, "target");
-        reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
-        managixHomeDirName = installerTargetPath.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-installer")
-                        && name.endsWith("binary-assembly");
-            }
-        })[0];
-        managixHomePath = new File(installerTargetPath, managixHomeDirName).getAbsolutePath();
-        LOGGER.info("MANAGIX_HOME=" + managixHomePath);
-
-        pb = new ProcessBuilder();
-        env = pb.environment();
-        env.put("MANAGIX_HOME", managixHomePath);
-        scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
-                + "resources" + File.separator + "transactionts" + File.separator + "scripts";
-        env.put("SCRIPT_HOME", scriptHomePath);
-
-        TestExecutor.executeScript(pb, scriptHomePath + File.separator + "setup_teardown" + File.separator
-                + "configure_and_validate.sh");
-        TestExecutor.executeScript(pb, scriptHomePath + File.separator + "setup_teardown" + File.separator
-                + "stop_and_delete.sh");
-        HDFSCluster.getInstance().setup(HDFS_BASE);
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        File outdir = new File(PATH_ACTUAL);
-        FileUtils.deleteDirectory(outdir);
-        File dataCopyDir = new File(
-                managixHomePath + File.separator + ".." + File.separator + ".." + File.separator + "data");
-        FileUtils.deleteDirectory(dataCopyDir);
-        TestExecutor.executeScript(pb, scriptHomePath + File.separator + "setup_teardown" + File.separator
-                + "stop_and_delete.sh");
-        TestExecutor.executeScript(pb, scriptHomePath + File.separator + "setup_teardown" + File.separator
-                + "shutdown.sh");
-        HDFSCluster.getInstance().cleanup();
-    }
-
-    @Parameters(name = "RecoveryIT {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
-            testArgs.add(new Object[] { ctx });
-        }
-        return testArgs;
-    }
-
-    public RecoveryIT(TestCaseContext tcCtx) {
-        this.tcCtx = tcCtx;
-    }
-
-    @Test
-    public void test() throws Exception {
-        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
-    }
-
-}
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/Vagrantfile b/asterixdb/asterix-installer/src/test/resources/clusterts/Vagrantfile
deleted file mode 100644
index 781a4da..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/Vagrantfile
+++ /dev/null
@@ -1,76 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
-VAGRANTFILE_API_VERSION = "2"
-
-Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
-
-    config.vm.provision "file", source: "id_rsa", destination: "/home/vagrant/.ssh/id_rsa"
-    config.vm.provision "file", source: "id_rsa.pub", destination: "/home/vagrant/.ssh/id_rsa.pub"
-    config.vm.provision "file", source: "known_hosts", destination: "/home/vagrant/.ssh/known_hosts"
-    config.vm.provision "file", source: "hosts", destination: "/home/vagrant/hosts"
-
-    config.vm.provision "shell", inline: "mv /home/vagrant/hosts /etc/hosts"
-    config.vm.provision "shell", privileged: false, inline: "chmod 400 /home/vagrant/.ssh/id_rsa"
-    config.vm.provision "shell", privileged: false, inline: "cat /home/vagrant/.ssh/id_rsa.pub >> /home/vagrant/.ssh/authorized_keys"
-    config.vm.provision "shell", privileged: false, inline: "chmod 600 /home/vagrant/.ssh/authorized_keys"
-    $java_inst = <<-END
-        wget -q --no-cookies --no-check-certificate \
-        --header 'Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie' \
-        'http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm' \
-        -O /tmp/jdk.rpm;
-
-        sudo yum -y localinstall /tmp/jdk.rpm;
-        sudo yum -y install unzip;
-
-    END
-    config.vm.provision "shell", inline: $java_inst
-
-    config.vm.define "nc2" do |nc|
-        nc.vm.box = "bento/centos-6.7"
-        nc.vm.hostname = "nc2"
-        nc.vm.network "private_network", ip: "10.10.0.4"
-        config.vm.provider "virtualbox" do |v|
-            v.memory = 3096
-            v.cpus = 2
-        end
-    end
-    config.vm.define "nc1" do |nc|
-        nc.vm.box = "bento/centos-6.7"
-        nc.vm.hostname = "nc1"
-        nc.vm.network "private_network", ip: "10.10.0.3"
-        config.vm.provider "virtualbox" do |v|
-            v.memory = 3096
-            v.cpus = 2
-        end
-    end
-
-    config.vm.define "cc" do |cc|
-        cc.vm.box = "bento/centos-6.7"
-        cc.vm.hostname = "cc"
-        cc.vm.network "private_network", ip: "10.10.0.2"
-        config.vm.provider "virtualbox" do |v|
-            v.memory = 1024
-            v.cpus = 1
-        end
-    end
-
-end
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/cluster.xml b/asterixdb/asterix-installer/src/test/resources/clusterts/cluster.xml
deleted file mode 100644
index 9eb728f..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/cluster.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-
-  <name>vagrant</name>
-
-  <username>vagrant</username>
-
-  <working_dir>
-    <dir>/vagrant/managix-working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-
-  <log_dir>/home/vagrant/logs/</log_dir>
-  <txn_log_dir>/home/vagrant/tx_logs</txn_log_dir>
-  <iodevices>/home/vagrant/p1,/home/vagrant/p2</iodevices>
-
-  <store>storage</store>
-
-  <java_home>/usr/java/latest</java_home>
-
-  <master_node>
-    <id>cc</id>
-    <client_ip>10.10.0.2</client_ip>
-    <cluster_ip>10.10.0.2</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>10.10.0.3</cluster_ip>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>10.10.0.4</cluster_ip>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/cluster_with_replication.xml b/asterixdb/asterix-installer/src/test/resources/clusterts/cluster_with_replication.xml
deleted file mode 100644
index bb66131..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/cluster_with_replication.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-
-  <name>vagrant</name>
-
-  <username>vagrant</username>
-
-  <working_dir>
-    <dir>/vagrant/asterix/managix-working</dir>
-    <NFS>true</NFS>
-  </working_dir>
-
-  <log_dir>/home/vagrant/asterix/logs/</log_dir>
-  <txn_log_dir>/home/vagrant/asterix/tx_logs</txn_log_dir>
-  <iodevices>/home/vagrant/asterix/p1,/home/vagrant/asterix/p2</iodevices>
-
-  <store>storage</store>
-
-  <java_home>/usr/java/latest</java_home>
-  <metadata_node>nc1</metadata_node>
-
-  <data_replication>
-    <enabled>true</enabled>
-    <replication_port>2000</replication_port>
-    <replication_factor>2</replication_factor>
-    <auto_failover>true</auto_failover>
-    <replication_time_out>10</replication_time_out>
-  </data_replication>
-
-  <master_node>
-    <id>cc</id>
-    <client_ip>10.10.0.2</client_ip>
-    <cluster_ip>10.10.0.2</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>10.10.0.3</cluster_ip>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>10.10.0.4</cluster_ip>
-  </node>
-</cluster>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/hosts b/asterixdb/asterix-installer/src/test/resources/clusterts/hosts
deleted file mode 100644
index 9c68525..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/hosts
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-127.0.0.1	localhost localhost.localdomain localhost4 localhost4.localdomain4
-::1		localhost localhost.localdomain localhost6 localhost6.localdomain6
-10.10.0.2	cc
-10.10.0.3	nc1
-10.10.0.4	nc2
-10.10.0.5	nc3
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa b/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa
deleted file mode 100644
index 7d6a083..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI
-w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP
-kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2
-hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO
-Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW
-yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd
-ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1
-Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf
-TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK
-iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A
-sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf
-4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP
-cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk
-EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN
-CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX
-3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG
-YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj
-3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+
-dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz
-6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC
-P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF
-llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ
-kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH
-+vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ
-NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=
------END RSA PRIVATE KEY-----
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa.pub b/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa.pub
deleted file mode 100644
index f762934..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/id_rsa.pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ==
diff --git a/asterixdb/asterix-installer/src/test/resources/clusterts/known_hosts b/asterixdb/asterix-installer/src/test/resources/clusterts/known_hosts
deleted file mode 100644
index 273f9f3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/clusterts/known_hosts
+++ /dev/null
@@ -1,6 +0,0 @@
-::1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4DTPG2/P073Ak5htIlGYxFh9BYo3bwxBW/SZ1+MDtBUGSEFG0wP4dDRNxwzdmc2EB5JbiAb4t2wLtlFJUbhZUuhxxv2WP4Uastt+U2CWe8+/OsSCAieDv9+dvhT2YxkyAwSCFjyv9T+ftE7YyuIqgBoDTcsvCGzhcl80xd/mQuboneYdR8A0Q2cbd47BQ1D+76HW3l0t51N4fsvbds/LdkXtqVqCadiTKuZ/Ki9JkWlIwffF1IvtARdkW5hyA2fkdJcNBGcfIlxcEvXUvEcIi2FVdY+rJTR9014SrspPtfTyPe4mMgwNQGGT1dm9tnjhq/N6WrYOQ8J3HUn+r7tO5w==
-127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==
-nc1,10.10.0.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==
-nc2,10.10.0.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==10.10.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==
-10.10.0.4 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==
-10.10.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9gfVcSU968DdflnfJkup3em0MFX13uUTxsiaPisyahjcc++d+9yo+OL5Avffznal9Ev9hzptYclUw9Rx1fSs09g6w8qRiaRLHhYw3mgAer6vG9NZxaj2i2TAVUjdPKZDOSgtFzvPZiwWfhdqi6CmzMRi3MO5G3LzIRzB+qjMitgJ4p/R0mLTik40KTBQNxgN5EmegoANjyBDbdvBKf4vQvMwYGvByq4rMDyDCC8JgcR+B1kR8xNKwDYZFokuSrmAw6PXUmjyW6FaWaUFvrqaj64l1yHqLPcZDTbcSzum6+RaR5Gg2upfs3ahICOzzlnwnwtZxznWKU+rNd4T29cHOw==
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/docker/Dockerfile b/asterixdb/asterix-installer/src/test/resources/docker/Dockerfile
deleted file mode 100644
index 1b0193c..0000000
--- a/asterixdb/asterix-installer/src/test/resources/docker/Dockerfile
+++ /dev/null
@@ -1,54 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-FROM centos
-MAINTAINER AsterixDB Team
-
-RUN echo 'LANG="en_US.UTF-8"' > /etc/sysconfig/i18n ;echo 'ZONE="America/Los_Angeles"' > /etc/sysconfig/clock ;cp -a /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
-RUN echo "include_only=.us" >> /etc/yum/pluginconf.d/fastestmirror.conf
-RUN yum -y update
-RUN yum install -y unzip java-1.8.0-openjdk openssh-server openssh-clients python-setuptools wget curl net-tools
-
-RUN sshd-keygen
-RUN sed -i "s/UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config
-
-RUN useradd asterix -G wheel -s /bin/bash -m
-RUN echo 'asterix:asterix' | chpasswd
-RUN echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers
-RUN echo 'Host *' >> /etc/ssh/ssh_config
-RUN echo '    StrictHostKeyChecking no' >> /etc/ssh/ssh_config
-
-CMD ["/usr/sbin/sshd", "-D"]
-
-RUN mkdir /asterixdb
-RUN mkdir /asterixdb/asterix
-RUN mkdir /asterixdb/data
-COPY asterix-installer*.zip .
-RUN unzip asterix-installer*.zip -d /asterixdb/asterix-installer/
-COPY id_rsa /root/.ssh/id_rsa
-COPY id_rsa.pub /root/.ssh/id_rsa.pub
-COPY cluster-config.xml /asterixdb/
-
-RUN cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
-RUN chmod 600 /root/.ssh/id_rsa*
-RUN chmod 700 /root/.ssh/authorized_keys
-
-ENV JAVA_HOME /usr/lib/jvm/jre-1.8.0
-ENV JAVA_OPTS -Xmx2048m
-
-EXPOSE 19001 19002 8888 19003 50031 15001
diff --git a/asterixdb/asterix-installer/src/test/resources/docker/cluster-config.xml b/asterixdb/asterix-installer/src/test/resources/docker/cluster-config.xml
deleted file mode 100644
index 4d5d0bd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/docker/cluster-config.xml
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="cluster">
-
-  <name>asterix</name>
-
-  <username>root</username>
-
-  <working_dir>
-    <dir>/asterixdb/asterix/managix-working</dir>
-    <NFS>false</NFS>
-  </working_dir>
-
-  <log_dir>/asterixdb/data/logs/</log_dir>
-  <txn_log_dir>/asterixdb/data/tx_logs</txn_log_dir>
-  <iodevices>/asterixdb/data/p1,/asterixdb/data/p2</iodevices>
-
-  <store>storage</store>
-
-  <java_home>/usr/lib/jvm/jre-1.8.0</java_home>
-  <metadata_node>nc1</metadata_node>
-
-  <high_availability>
-    <enabled>true</enabled>
-    <data_replication>
-      <strategy>chained_declustering</strategy>
-      <replication_port>2016</replication_port>
-      <replication_time_out>30</replication_time_out>
-      <replication_factor>2</replication_factor>
-    </data_replication>
-    <fault_tolerance>
-       <strategy>auto</strategy>
-    </fault_tolerance>
-  </high_availability>
-
-  <master_node>
-    <id>cc</id>
-    <client_ip>172.20.0.2</client_ip>
-    <cluster_ip>172.20.0.2</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>172.20.0.3</cluster_ip>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>172.20.0.4</cluster_ip>
-  </node>
-  <node>
-    <id>nc3</id>
-    <cluster_ip>172.20.0.5</cluster_ip>
-  </node>
-  <node>
-    <id>nc4</id>
-    <cluster_ip>172.20.0.6</cluster_ip>
-  </node>
-</cluster>
diff --git a/asterixdb/asterix-installer/src/test/resources/docker/docker-compose.yml b/asterixdb/asterix-installer/src/test/resources/docker/docker-compose.yml
deleted file mode 100644
index 224b0a9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/docker/docker-compose.yml
+++ /dev/null
@@ -1,116 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-version: "3.1"
-
-services:
-  cc:
-    image: asterix-test
-    container_name: cc
-    stdin_open: true
-    tty: true
-    volumes:
-        - ./asterix:/asterix
-    deploy:
-      resources:
-        limits:
-          memory: 1024M
-    networks:
-      asterix_net:
-        ipv4_address: 172.20.0.2
-    ports:
-      - "19001:19001"
-
-  nc1:
-    image: asterix-test
-    container_name: nc1
-    stdin_open: true
-    tty: true
-    volumes:
-        - ./asterix:/asterix
-    deploy:
-      resources:
-        limits:
-          memory: 2560M
-    networks:
-      asterix_net:
-        ipv4_address: 172.20.0.3
-    ports:
-      - "6001:15001"
-
-  nc2:
-    image: asterix-test
-    container_name: nc2
-    stdin_open: true
-    tty: true
-    volumes:
-      - ./asterix:/asterix
-    deploy:
-      resources:
-        limits:
-          memory: 2560M
-    networks:
-      asterix_net:
-        ipv4_address: 172.20.0.4
-    ports:
-      - "6002:15001"
-
-  nc3:
-    image: asterix-test
-    container_name: nc3
-    stdin_open: true
-    tty: true
-    volumes:
-      - ./asterix:/asterix
-    deploy:
-      resources:
-        limits:
-          memory: 2560M
-    networks:
-      asterix_net:
-        ipv4_address: 172.20.0.5
-    ports:
-        - "6003:15001"
-
-  nc4:
-    image: asterix-test
-    container_name: nc4
-    stdin_open: true
-    tty: true
-    volumes:
-      - ./asterix:/asterix
-    deploy:
-      resources:
-        limits:
-          memory: 2560M
-    networks:
-      asterix_net:
-        ipv4_address: 172.20.0.6
-    ports:
-        - "6004:15001"
-
-
-networks:
-  asterix_net:
-    driver: bridge
-    driver_opts:
-      com.docker.network.enable_ipv6: "false"
-    ipam:
-      driver: default
-      config:
-      - subnet: 172.20.0.0/24
diff --git a/asterixdb/asterix-installer/src/test/resources/docker/id_rsa b/asterixdb/asterix-installer/src/test/resources/docker/id_rsa
deleted file mode 100644
index 7d6a083..0000000
--- a/asterixdb/asterix-installer/src/test/resources/docker/id_rsa
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzI
-w+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoP
-kcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2
-hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NO
-Td0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcW
-yLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQIBIwKCAQEA4iqWPJXtzZA68mKd
-ELs4jJsdyky+ewdZeNds5tjcnHU5zUYE25K+ffJED9qUWICcLZDc81TGWjHyAqD1
-Bw7XpgUwFgeUJwUlzQurAv+/ySnxiwuaGJfhFM1CaQHzfXphgVml+fZUvnJUTvzf
-TK2Lg6EdbUE9TarUlBf/xPfuEhMSlIE5keb/Zz3/LUlRg8yDqz5w+QWVJ4utnKnK
-iqwZN0mwpwU7YSyJhlT4YV1F3n4YjLswM5wJs2oqm0jssQu/BT0tyEXNDYBLEF4A
-sClaWuSJ2kjq7KhrrYXzagqhnSei9ODYFShJu8UWVec3Ihb5ZXlzO6vdNQ1J9Xsf
-4m+2ywKBgQD6qFxx/Rv9CNN96l/4rb14HKirC2o/orApiHmHDsURs5rUKDx0f9iP
-cXN7S1uePXuJRK/5hsubaOCx3Owd2u9gD6Oq0CsMkE4CUSiJcYrMANtx54cGH7Rk
-EjFZxK8xAv1ldELEyxrFqkbE4BKd8QOt414qjvTGyAK+OLD3M2QdCQKBgQDtx8pN
-CAxR7yhHbIWT1AH66+XWN8bXq7l3RO/ukeaci98JfkbkxURZhtxV/HHuvUhnPLdX
-3TwygPBYZFNo4pzVEhzWoTtnEtrFueKxyc3+LjZpuo+mBlQ6ORtfgkr9gBVphXZG
-YEzkCD3lVdl8L4cw9BVpKrJCs1c5taGjDgdInQKBgHm/fVvv96bJxc9x1tffXAcj
-3OVdUN0UgXNCSaf/3A/phbeBQe9xS+3mpc4r6qvx+iy69mNBeNZ0xOitIjpjBo2+
-dBEjSBwLk5q5tJqHmy/jKMJL4n9ROlx93XS+njxgibTvU6Fp9w+NOFD/HvxB3Tcz
-6+jJF85D5BNAG3DBMKBjAoGBAOAxZvgsKN+JuENXsST7F89Tck2iTcQIT8g5rwWC
-P9Vt74yboe2kDT531w8+egz7nAmRBKNM751U/95P9t88EDacDI/Z2OwnuFQHCPDF
-llYOUI+SpLJ6/vURRbHSnnn8a/XG+nzedGH5JGqEJNQsz+xT2axM0/W/CRknmGaJ
-kda/AoGANWrLCz708y7VYgAtW2Uf1DPOIYMdvo6fxIB5i9ZfISgcJ/bbCUkFrhoH
-+vq/5CIWxCPp0f85R4qxxQ5ihxJ0YDQT9Jpx4TMss4PSavPaBH3RXow5Ohe+bYoQ
-NE5OgEXk2wVfZczCZpigBKbKZHNYcelXtTt/nP3rsCuGcM4h53s=
------END RSA PRIVATE KEY-----
diff --git a/asterixdb/asterix-installer/src/test/resources/docker/id_rsa.pub b/asterixdb/asterix-installer/src/test/resources/docker/id_rsa.pub
deleted file mode 100644
index f762934..0000000
--- a/asterixdb/asterix-installer/src/test/resources/docker/id_rsa.pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ==
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
deleted file mode 100644
index f188629..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF 
-                  finds topics in each tweet. A topic is identified by a #. 
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-create type TestTypedAdapterOutputType as closed {
-  tweetid: int64,
-  message-text: string
-}
-
-create dataset TweetsTestAdapter(TestTypedAdapterOutputType)
-primary key tweetid;
-
-create feed TestTypedAdapterFeed
-using "testlib#test_typed_adapter" (
-("num_output_records"="5"),
-("type-name"="TestTypedAdapterOutputType"));
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
deleted file mode 100644
index 5f3d322..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-create type TweetInputType as closed {
-  id: string,
-  username : string,
-  location : string,
-  text : string,
-  timestamp : string
-}
-
-create type TweetOutputType as closed {
-  id: string,
-  username : string,
-  location : string,
-  text : string,
-  timestamp : string,
-  topics : {{string}}
-}
-
-create feed TweetFeed
-using localfs
-(("type-name"="TweetInputType"),
-("path"="asterix_nc1://../../../../../../asterix-app/data/twitter/obamatweets.adm"),
-("format"="adm"));
-
-create dataset TweetsFeedIngest(TweetOutputType)
-primary key id;
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.1.ddl.aql
deleted file mode 100644
index 725ed61..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.1.ddl.aql
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-drop dataverse Social if exists;
-create dataverse Social;
-use dataverse Social;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type UserType as closed {
-    id: int,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-create dataset Users(UserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.10.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.10.node.aql
deleted file mode 100644
index f4685df..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.10.node.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-kill asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.11.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.11.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.11.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.12.mgx.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.12.mgx.aql
deleted file mode 100644
index 369659b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.12.mgx.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-startnode -n asterix -nodes nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.13.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.13.sleep.aql
deleted file mode 100644
index dd83b4b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.13.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-20000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.14.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.14.ddl.aql
deleted file mode 100644
index eee7423..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.14.ddl.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-use dataverse Social;
-
-create dataset UsersAfterReplicaRecovery(UserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.15.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.15.node.aql
deleted file mode 100644
index 720f33e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.15.node.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-kill asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.16.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.16.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.16.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.17.mgx.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.17.mgx.aql
deleted file mode 100644
index 78a79c3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.17.mgx.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-startnode -n asterix -nodes nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.18.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.18.sleep.aql
deleted file mode 100644
index dd83b4b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.18.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-20000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.19.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.19.query.aql
deleted file mode 100644
index 5da6c59..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.19.query.aql
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-count(
-for $x in dataset Metadata.Dataset
-where $x.DatasetName ='UsersAfterRecovery'
-or $x.DatasetName ='UsersAfterReplicaRecovery'
-return $x.DatasetName
-);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.2.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.2.node.aql
deleted file mode 100644
index 720f33e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.2.node.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-kill asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.3.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.3.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.3.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.4.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.4.get.http
deleted file mode 100644
index fdacfd0..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.4.get.http
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.5.mgx.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.5.mgx.aql
deleted file mode 100644
index 78a79c3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.5.mgx.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-startnode -n asterix -nodes nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.6.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.6.sleep.aql
deleted file mode 100644
index dd83b4b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.6.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-20000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.7.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.7.get.http
deleted file mode 100644
index fdacfd0..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.7.get.http
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.8.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.8.query.aql
deleted file mode 100644
index 778e9f3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.8.query.aql
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-count(
-for $x in dataset Metadata.Dataset
-where $x.DatasetName ='Users'
-return $x.DatasetName
-);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.9.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.9.ddl.aql
deleted file mode 100644
index 376df70..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/queries/metadata_recovery/metadata_node_recovery/metadata_node_recovery.9.ddl.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Make sure metadata only replication completes as expected.
-                     The test goes as follows:
-                     start metadata node and a replica, update metadata, kill metadata node,
-                     start metadata node again, validate metadata, update metadata, kill replica,
-                     start replica, update metadata, kill metadata node, start metadata node,
-                     validate metadata.
- * Expected Result : Success
- * Date            : January 10 2017
- */
-use dataverse Social;
-
-create dataset UsersAfterRecovery(UserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm
deleted file mode 100644
index c327ecf..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.4.adm
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "metadata_node" : "asterix_nc1",
-  "partitions" : {
-    "0" : {
-      "active" : false,
-      "activeNodeId" : "asterix_nc1",
-      "iodeviceNum" : 0,
-      "nodeId" : "asterix_nc1",
-      "partitionId" : 0,
-      "pendingActivation" : false
-    },
-    "1" : {
-      "active" : false,
-      "activeNodeId" : "asterix_nc1",
-      "iodeviceNum" : 1,
-      "nodeId" : "asterix_nc1",
-      "partitionId" : 1,
-      "pendingActivation" : false
-    },
-    "2" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 0,
-      "nodeId" : "asterix_nc2",
-      "partitionId" : 2,
-      "pendingActivation" : false
-    },
-    "3" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 1,
-      "nodeId" : "asterix_nc2",
-      "partitionId" : 3,
-      "pendingActivation" : false
-    }
-  },
-  "state" : "UNUSABLE"
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.19.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.19.adm
deleted file mode 100644
index d8263ee..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.19.adm
+++ /dev/null
@@ -1 +0,0 @@
-2
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.8.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.8.adm
deleted file mode 100644
index 56a6051..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.query.8.adm
+++ /dev/null
@@ -1 +0,0 @@
-1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/testsuite.xml b/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/testsuite.xml
deleted file mode 100644
index d0ac325..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/testsuite.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
-  <test-group name="metadata_recovery">
-    <test-case FilePath="metadata_recovery">
-      <compilation-unit name="metadata_node_recovery">
-        <output-dir compare="Text">metadata_node_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.1.ddl.aql
deleted file mode 100644
index 2c49a01..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.1.ddl.aql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-
-drop dataverse TinySocial if exists;
-create dataverse TinySocial;
-use dataverse TinySocial;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type FacebookUserType as closed {
-    id: int,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-/********* 2. Create Datasets  ***********/
-use dataverse TinySocial;
-
-drop dataset FacebookUsers if exists;
-
-create dataset FacebookUsers(FacebookUserType)
-primary key id;
-
-create dataset FacebookUsersInMemory(FacebookUserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http
deleted file mode 100644
index 3faa945..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.11.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.11.query.aql
deleted file mode 100644
index b09c3d3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.11.query.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-
-use dataverse TinySocial;
-
-count (for $x in dataset FacebookUsersInMemory return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql
deleted file mode 100644
index e10896a..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-use dataverse TinySocial;
-
-load dataset FacebookUsers using localfs
-(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"),
-("format"="adm"));
-
-insert into dataset TinySocial.FacebookUsersInMemory(for $x in dataset TinySocial.FacebookUsers return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql
deleted file mode 100644
index 9d5dc9b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-kill asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.4.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.4.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.4.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http
deleted file mode 100644
index 3faa945..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.6.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.6.query.aql
deleted file mode 100644
index b09c3d3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.6.query.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-
-use dataverse TinySocial;
-
-count (for $x in dataset FacebookUsersInMemory return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.7.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.7.update.aql
deleted file mode 100644
index 56a88a2..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.7.update.aql
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : node_failback.aql
- * Description     : Make sure node failback completes as expected.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset,
-                     kill one node and wait until the failover complete, query cluster state,
-                     query data, insert new data, start the killed node and wait for failback,
-                     query cluster state, query data.
- * Expected Result : Success
- * Date            : February 3 2016
- */
-use dataverse TinySocial;
-
-/* insert ids 11-20 */
-insert into dataset TinySocial.FacebookUsersInMemory {"id":11,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":12,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":13,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":14,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":15,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":16,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":17,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":18,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":19,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
-
-insert into dataset TinySocial.FacebookUsersInMemory {"id":20,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]};
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql
deleted file mode 100644
index 78a79c3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-startnode -n asterix -nodes nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql
deleted file mode 100644
index dd83b4b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-20000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.1.ddl.aql
deleted file mode 100644
index 6a2441e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.1.ddl.aql
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-drop dataverse TinySocial if exists;
-create dataverse TinySocial;
-use dataverse TinySocial;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type FacebookUserType as closed {
-    id: int,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-/********* 2. Create Datasets  ***********/
-use dataverse TinySocial;
-
-drop dataset FacebookUsers if exists;
-
-create dataset FacebookUsers(FacebookUserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql
deleted file mode 100644
index 90ef6a7..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-use dataverse TinySocial;
-
-load dataset FacebookUsers using localfs
-(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"),
-("format"="adm"));
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql
deleted file mode 100644
index 118b7e8..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-kill asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql
deleted file mode 100644
index 9c8cb96..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-use dataverse TinySocial;
-
-count (for $x in dataset FacebookUsers return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.1.ddl.aql
deleted file mode 100644
index 8de2067..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.1.ddl.aql
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : mem_component_recovery.aql
- * Description     : Check that Memory LSM component are replicated and recovered correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset, query
-                     data from memory, kill one node and wait until the failover complete,
-                     query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-drop dataverse TinySocial if exists;
-create dataverse TinySocial;
-use dataverse TinySocial;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type FacebookUserType as closed {
-    id: int,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-/********* 2. Create Datasets  ***********/
-use dataverse TinySocial;
-
-drop dataset FacebookUsers if exists;
-
-create dataset FacebookUsers(FacebookUserType)
-primary key id;
-
-create dataset FacebookUsersInMemory(FacebookUserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql
deleted file mode 100644
index 18ce908..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : mem_component_recovery.aql
- * Description     : Check that Memory LSM component are replicated and recovered correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset, query
-                     data from memory, kill one node and wait until the failover complete,
-                     query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-use dataverse TinySocial;
-
-load dataset FacebookUsers using localfs
-(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"),("format"="adm"));
-
-insert into dataset TinySocial.FacebookUsersInMemory(for $x in dataset TinySocial.FacebookUsers return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql
deleted file mode 100644
index 118b7e8..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-kill asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql
deleted file mode 100644
index e25e409..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : mem_component_recovery.aql
- * Description     : Check that Memory LSM component are replicated and recovered correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, copy it to in-memory dataset, query
-                     data from memory, kill one node and wait until the failover complete,
-                     query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-use dataverse TinySocial;
-
-count (for $x in dataset FacebookUsersInMemory return $x);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.1.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.1.ddl.aql
deleted file mode 100644
index 113d144..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.1.ddl.aql
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Check that metadata node failover is done correctly.
-                     The test goes as follows:
-                     start 2 nodes, create a dataset, kill metadata node
-                     and wait until the failover complete, verify the
-                     dataset still exists.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-drop dataverse TinySocial if exists;
-create dataverse TinySocial;
-use dataverse TinySocial;
-
-create type EmploymentType as open {
-    organization-name: string,
-    start-date: date,
-    end-date: date?
-}
-
-create type FacebookUserType as closed {
-    id: int,
-    alias: string,
-    name: string,
-    user-since: datetime,
-    friend-ids: {{ int32 }},
-    employment: [EmploymentType]
-}
-
-/********* 2. Create Datasets  ***********/
-use dataverse TinySocial;
-
-drop dataset FacebookUsers if exists;
-
-create dataset FacebookUsers(FacebookUserType)
-primary key id;
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql
deleted file mode 100644
index 9d5dc9b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : bulkload.aql
- * Description     : Check that Bulkload LSM component are replicated correclty.
-                     The test goes as follows:
-                     start 2 nodes, bulkload a dataset, query data, kill one node
-                     and wait until the failover complete, query the data again.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-kill asterix_nc1
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql
deleted file mode 100644
index 9c50bf1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-60000
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql
deleted file mode 100644
index 3d525f6..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : metadata_node_recovery.aql
- * Description     : Check that metadata node failover is done correctly.
-                     The test goes as follows:
-                     start 2 nodes, create a dataset, kill metadata node
-                     and wait until the failover complete, verify the
-                     dataset still exists.
- * Expected Result : Success
- * Date            : January 6 2016
- */
-
-use dataverse TinySocial;
-
-count(
-for $x in dataset Metadata.Dataset
-where $x.DatasetName ='FacebookUsers'
-return $x.DatasetName
-);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm
deleted file mode 100644
index 15c200c..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "metadata_node" : "asterix_nc2",
-  "partitions" : {
-    "0" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 0,
-      "nodeId" : "asterix_nc1",
-      "partitionId" : 0,
-      "pendingActivation" : false
-    },
-    "1" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 1,
-      "nodeId" : "asterix_nc1",
-      "partitionId" : 1,
-      "pendingActivation" : false
-    },
-    "2" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 0,
-      "nodeId" : "asterix_nc2",
-      "partitionId" : 2,
-      "pendingActivation" : false
-    },
-    "3" : {
-      "active" : true,
-      "activeNodeId" : "asterix_nc2",
-      "iodeviceNum" : 1,
-      "nodeId" : "asterix_nc2",
-      "partitionId" : 3,
-      "pendingActivation" : false
-    }
-  },
-  "state" : "ACTIVE"
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.11.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.11.adm
deleted file mode 100644
index 2edeafb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.11.adm
+++ /dev/null
@@ -1 +0,0 @@
-20
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.6.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.6.adm
deleted file mode 100644
index 9a03714..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.query.6.adm
+++ /dev/null
@@ -1 +0,0 @@
-10
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.adm
deleted file mode 100644
index 9a03714..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.adm
+++ /dev/null
@@ -1 +0,0 @@
-10
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.adm
deleted file mode 100644
index 9a03714..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.adm
+++ /dev/null
@@ -1 +0,0 @@
-10
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/testsuite.xml b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/testsuite.xml
deleted file mode 100644
index 0f6b528..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/testsuite.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
-  <test-group name="failover">
-    <test-case FilePath="failover">
-      <compilation-unit name="bulkload">
-        <output-dir compare="Text">bulkload</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="failover">
-      <compilation-unit name="mem_component_recovery">
-        <output-dir compare="Text">mem_component_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="failover">
-      <compilation-unit name="metadata_node">
-        <output-dir compare="Text">metadata_node</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="failback">
-    <test-case FilePath="failback">
-      <compilation-unit name="node_failback">
-        <output-dir compare="Text">node_failback</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql
deleted file mode 100644
index 190891f..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
- /*
- * Description  : Reproduction scenario for ASTERIXDB-1636
- * Expected Res : Success
- * Date         : Oct 5th 2016
- */
-
-drop dataverse twitter if exists;
-create dataverse twitter if not exists;
-use dataverse twitter
-create type typeUser if not exists as open {
-    id: int64,
-    name: string,
-    screen_name : string,
-    lang : string,
-    location: string,
-    create_at: date,
-    description: string,
-    followers_count: int32,
-    friends_count: int32,
-    statues_count: int64
-}
-create type typePlace if not exists as open{
-    country : string,
-    country_code : string,
-    full_name : string,
-    id : string,
-    name : string,
-    place_type : string,
-    bounding_box : rectangle
-}
-create type typeGeoTag if not exists as open {
-    stateID: int32,
-    stateName: string,
-    countyID: int32,
-    countyName: string,
-    cityID: int32?,
-    cityName: string?
-}
-create type typeTweet if not exists as open{
-    create_at : datetime,
-    id: int64,
-    "text": string,
-    in_reply_to_status : int64,
-    in_reply_to_user : int64,
-    favorite_count : int64,
-    coordinate: point?,
-    retweet_count : int64,
-    lang : string,
-    is_retweet: boolean,
-    hashtags : {{ string }} ?,
-    user_mentions : {{ int64 }} ? ,
-    user : typeUser,
-    place : typePlace?,
-    geo_tag: typeGeoTag
-}
-
-create dataset ds_tweet(typeTweet) if not exists primary key id with filter on create_at;
-create index text_idx if not exists on ds_tweet("text") type keyword;
-create feed MessageFeed using localfs(
-("path"="localhost://../../../../../src/test/resources/integrationts/restart/828.h1w.adm"),
-("format"="adm"),
-("type-name"="typeTweet"));
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql
deleted file mode 100644
index fe30266..0000000
--- a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
- /*
- * Description  : Reproduction scenario for ASTERIXDB-1636
- * Expected Res : Success
- * Date         : Oct 5th 2016
- */
-
-use dataverse twitter;
-drop feed TweetFeed if exists;
-create feed TweetFeed using localfs
-(
-    ("path"="localhost://../../../../../target/tweets.json"),
-    ("format"="adm"),
-    ("type-name"="typeTweet")
-);
-set wait-for-completion-feed "true";
-connect feed TweetFeed to dataset ds_tweet;
-start feed TweetFeed;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
deleted file mode 100644
index b99ccdc..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- *
- * Big object (20 MB) loading test
- * Expected result: success
- *
- */
-
-use dataverse testdv2;
-
-set hash_merge "true"
-
-load dataset testds
-using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/target/data/big-object/big_object_20M.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql
deleted file mode 100644
index 2c74ac7..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a change feed with meta-data and test ingestion of records
- * Expected Res : Success
- * Date         : 24th Feb 2016
- */
-
-drop dataverse KeyVerse if exists;
-create dataverse KeyVerse;
-use dataverse KeyVerse;
-
-create type DocumentType as open{
-};
-
-create type KVMetaType as open{
-"key":string,
-vbucket:int32,
-seq:int64,
-cas:int64,
-expiration:int32,
-flags:int32,
-revSeq:int64,
-lockTime:int32
-};
-
-create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
-
-create feed KVChangeStream using adapter(
-    ("type-name"="DocumentType"),
-    ("meta-type-name"="KVMetaType"),
-    ("reader"="org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory"),
-    ("parser"="record-with-metadata"),
-    ("format"="dcp"),
-    ("record-format"="json"),
-    ("change-feed"="true"),
-    ("key-indexes"="0"),
-    ("key-indicators"="1"),
-    ("num-of-records"="1000")
-);
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
deleted file mode 100644
index cb8afd6..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql
deleted file mode 100644
index be29328..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_correlated_ngram_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 21 2017
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create dataset Fragile_raw (FragileTypeRaw)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
-/* Create dataset for cleaned Fragile data */
-create dataset Fragile (FragileType)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
deleted file mode 100644
index 5558005..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql
deleted file mode 100644
index 9443205..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 20 2017
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create dataset Fragile_raw (FragileTypeRaw)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
-/* Create dataset for cleaned Fragile data */
-create dataset Fragile (FragileType)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
deleted file mode 100644
index f48ccd5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql
deleted file mode 100644
index 618c6b1..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_default_correlated_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create dataset Fragile_raw (FragileTypeRaw)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
-/* Create dataset for cleaned Fragile data */
-create dataset Fragile (FragileType)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
deleted file mode 100644
index 6a18e6e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_default_correlated_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 8 2017
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
deleted file mode 100644
index ce01110..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
deleted file mode 100644
index 9bbef93..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql
deleted file mode 100644
index b1f61e2..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_keyword_correlated_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 21 2017
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create dataset Fragile_raw (FragileTypeRaw)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
-/* Create dataset for cleaned Fragile data */
-create dataset Fragile (FragileType)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
deleted file mode 100644
index f48ccd5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
deleted file mode 100644
index 0f245b5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql
deleted file mode 100644
index 69a6c9d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_multiple_correlated_secondary_indices.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : June 21 2017
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create dataset Fragile_raw (FragileTypeRaw)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
-/* Create dataset for cleaned Fragile data */
-create dataset Fragile (FragileType)
-primary key row_id
-using compaction policy "correlated-prefix"
-(("max-mergable-component-size"="16384"),("max-tolerance-component-count"="3"));
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
deleted file mode 100644
index f48ccd5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
deleted file mode 100644
index 0f245b5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
deleted file mode 100644
index ce01110..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
deleted file mode 100644
index 9bbef93..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
deleted file mode 100644
index 0f245b5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
deleted file mode 100644
index 1d24079..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_rtree_index_insert_and_delete.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
deleted file mode 100644
index 1d24079..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : primary_plus_rtree_index_insert_and_delete.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
- * Expected Result : Success
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.2.ddl.aql
deleted file mode 100644
index 9d4c55d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.2.ddl.aql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.4.txneu.aql
deleted file mode 100644
index 2c8886e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.4.txneu.aql
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.5.txnqbc.aql
deleted file mode 100644
index ff244d9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.5.txnqbc.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.8.txnqar.aql
deleted file mode 100644
index ff244d9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.8.txnqar.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_index_only/primary_index_only.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql
deleted file mode 100644
index df75adf..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-/* Create default secondary index on dataset clean Fragile */
-create index cfSidIdx on Fragile(sid);
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
deleted file mode 100644
index ce01110..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql
deleted file mode 100644
index 261e7b9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR,
-    "text": $t.text,
-    "location": $t.location,
-    "text2": $t.text2
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql
deleted file mode 100644
index 595acfb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Otc 15 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile where $x.sid=1 return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql
deleted file mode 100644
index 714fcbc..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile where $x.sid=1 return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql
deleted file mode 100644
index 107500e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-  
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-/* Create keyword secondary index on dataset clean Fragile */
-create index cfText on Fragile(text) type keyword;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql
deleted file mode 100644
index 7c1c623..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR,
-    "text": $t.text,
-    "location": $t.location,
-    "text2": $t.text2
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql
deleted file mode 100644
index 4d48e81..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-for $x in dataset Fragile 
-where word-tokens($x.text) ~= word-tokens(" 1 20130417 1")
-return $x.text;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql
deleted file mode 100644
index 4d48e81..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-for $x in dataset Fragile 
-where word-tokens($x.text) ~= word-tokens(" 1 20130417 1")
-return $x.text;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql
deleted file mode 100644
index 071f4e0..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-  
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-
-/* Create rtree secondary index on dataset clean Fragile */
-create index cfLocation on Fragile(location) type rtree;
-
-create index cfText on Fragile(text) type keyword;
-
-create index cfSidIdx on Fragile(sid);
-
-create index cfText2Ix on Fragile(text2) type ngram(3);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql
deleted file mode 100644
index 7c1c623..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR,
-    "text": $t.text,
-    "location": $t.location,
-    "text2": $t.text2
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql
deleted file mode 100644
index ca06f14..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Otc 15 2013
- */
-
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile 
-where contains($x.text2, "location") return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql
deleted file mode 100644
index 4738d05..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile 
-where contains($x.text2, "location") return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql
deleted file mode 100644
index 4d215d3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-/* Create default secondary index on dataset clean Fragile */
-create index cfText2Ix on Fragile(text2) type ngram(3);
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
deleted file mode 100644
index ce01110..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql
deleted file mode 100644
index 261e7b9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR,
-    "text": $t.text,
-    "location": $t.location,
-    "text2": $t.text2
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql
deleted file mode 100644
index dd499be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Otc 15 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile 
-where contains($x.text2, "location") return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql
deleted file mode 100644
index 07b177d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_default_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile 
-where contains($x.text2, "location") return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql
deleted file mode 100644
index 95a21b4..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float,
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-  
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float,
-  
-  /* new string field and location field*/
-  text: string,
-  location: point,
-  text2: string
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
-
-/* Create rtree secondary index on dataset clean Fragile */
-create index cfLocation on Fragile(location) type rtree;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
deleted file mode 100644
index 66adcef..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql
deleted file mode 100644
index 7c1c623..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_plus_keyword_secondary_index.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : Oct 15 2013
- */
-
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id % 28000,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR,
-    "text": $t.text,
-    "location": $t.location,
-    "text2": $t.text2
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql
deleted file mode 100644
index dc20c89..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-count (for $x in dataset Fragile where 
-spatial-intersect($x.location, create-polygon([0.0,0.0, 2.0,2.0, 0.0,2.0, 2.0,0.0]))
-return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql
deleted file mode 100644
index dc20c89..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-count (for $x in dataset Fragile where 
-spatial-intersect($x.location, create-polygon([0.0,0.0, 2.0,2.0, 0.0,2.0, 2.0,0.0]))
-return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/temp_primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.2.ddl.aql
deleted file mode 100644
index fc78710..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.2.ddl.aql
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : dataverse_recovery
- * Description     :
- * Expected Result :
- * Date            :
- */
-
-drop dataverse SampleDV if exists;
-create dataverse SampleDV;
-
-use dataverse SampleDV;
-
-create type SampleType as open {
-    id: int32,
-    text: string
-}
-
-create temporary dataset SampleDS(SampleType)
-primary key id;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.3.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.3.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.3.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.4.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.4.script.aql
deleted file mode 100644
index d844d13..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.4.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.5.errddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.5.errddl.aql
deleted file mode 100644
index bbd8044..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.5.errddl.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SampleDV;
-drop dataset SampleDS;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.6.script.aql
deleted file mode 100644
index f43dec7..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_dataset_recovery/dataset_recovery.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.2.ddl.aql
deleted file mode 100644
index 9d4c55d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.2.ddl.aql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.4.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.4.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.4.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.5.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.5.script.aql
deleted file mode 100644
index d844d13..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.5.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.6.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.6.update.aql
deleted file mode 100644
index f303a93..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.6.update.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-delete $r from dataset Fragile_raw 
-  where $r.row_id % 2 = 1
-;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.7.query.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.7.query.aql
deleted file mode 100644
index a290f58..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.7.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile_raw return $x);
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.8.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.8.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.8.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.2.ddl.aql
deleted file mode 100644
index 9d4c55d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.2.ddl.aql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.3.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.3.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.3.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.4.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.4.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.4.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.5.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.5.script.aql
deleted file mode 100644
index d844d13..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.5.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.6.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.6.update.aql
deleted file mode 100644
index c4e167a..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.6.update.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse recovery;
-
-/* Load Fragile data from raw dataset into cleaned dataset */
-insert into dataset Fragile (
-  for $t in dataset Fragile_raw
-  return {
-    "row_id": $t.row_id,
-    "sid": $t.sid,
-    "date": date($t.date),
-    "day": $t.day,
-    "time": parse-time($t.time, "h:m:s"),
-    "bpm": $t.bpm,
-    "RR": $t.RR
-  }
-);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.7.query.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.7.query.aql
deleted file mode 100644
index c193c29..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.7.query.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile return $x);
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.8.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.8.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.8.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.2.ddl.aql
deleted file mode 100644
index 9d4c55d..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.2.ddl.aql
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-drop dataverse recovery if exists;
-create dataverse recovery;
-use dataverse recovery;
-
-/* For raw Fragile data */
-create type FragileTypeRaw as closed {
-  row_id: int32,
-  sid: int32,
-  date: string,
-  day: int32,
-  time: string,
-  bpm: int32,
-  RR: float
-};
-
-/* For cleaned Fragile data */
-create type FragileType as closed {
-  row_id: int32,
-  sid: int32,
-  date: date,
-  day: int32,
-  time: time,
-  bpm: int32,
-  RR: float
-};
-
-/* Create dataset for loading raw Fragile data */
-create temporary dataset Fragile_raw (FragileTypeRaw)
-primary key row_id;
-
-/* Create dataset for cleaned Fragile data */
-create temporary dataset Fragile (FragileType)
-primary key row_id;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.3.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.3.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.3.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.4.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.4.script.aql
deleted file mode 100644
index 7087cd3..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.4.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.5.update.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.5.update.aql
deleted file mode 100644
index ab07679..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.5.update.aql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-load dataset Fragile_raw using localfs
-(("path"="asterix_nc1://../../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.6.query.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.6.query.aql
deleted file mode 100644
index ebac011..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.6.query.aql
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/* 
- * Test case Name  : primary_index_only.aql
- * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
- * Expected Result : Success
- * Date            : September 25 2013
- */
-
-use dataverse recovery;
-
-count (for $x in dataset Fragile_raw return $x);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.7.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.7.script.aql
deleted file mode 100644
index 40df6fb..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_load_after_recovery/load_after_recovery.7.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.1.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.1.script.aql
deleted file mode 100644
index 7d441cd..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.1.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-create_and_start.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.2.ddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.2.ddl.aql
deleted file mode 100644
index 3bcfdde..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.2.ddl.aql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Test case Name  : dataverse_recovery
- * Description     :
- * Expected Result :
- * Date            :
- */
-
-drop dataverse SampleDV if exists;
-create dataverse SampleDV;
-
-use dataverse SampleDV;
-
-create type SampleType as open {
-    id: int32,
-    text: string
-}
-
-create temporary dataset SampleDS(SampleType)
-primary key id;
-
-create index SampleDSix on SampleDS(text);
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.3.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.3.script.aql
deleted file mode 100644
index 4583455..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.3.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-kill_cc_and_nc.sh
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.4.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.4.script.aql
deleted file mode 100644
index d844d13..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.4.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_start.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.5.errddl.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.5.errddl.aql
deleted file mode 100644
index bcc8223..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.5.errddl.aql
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse SampleDV;
-drop index SampleDS.SampleDSix;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.6.script.aql b/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.6.script.aql
deleted file mode 100644
index f43dec7..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/temp_secondary_index_recovery/secondary_index_recovery.6.script.aql
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-stop_and_delete.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm b/asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm
deleted file mode 100644
index c31da8b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm
+++ /dev/null
@@ -1 +0,0 @@
-804
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.adm b/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.adm
deleted file mode 100644
index b1646d9..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_delete_after_recovery/delete_after_recovery.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-129088
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.adm b/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.adm
deleted file mode 100644
index 78b4996..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_insert_after_recovery/insert_after_recovery.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-258176
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.adm b/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.adm
deleted file mode 100644
index 78b4996..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/temp_load_after_recovery/load_after_recovery.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-258176
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh
deleted file mode 100755
index 3af1095..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix delete -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh
deleted file mode 100755
index 38b0f7a..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh
deleted file mode 100755
index d692d12..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh
deleted file mode 100755
index e30be0c..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix configure;
-$MANAGIX_HOME/bin/managix validate;
-$MANAGIX_HOME/bin/managix validate -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh
deleted file mode 100755
index 3af1095..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix delete -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/shutdown.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/shutdown.sh
deleted file mode 100755
index e46b4e5..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/shutdown.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix shutdown;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh
deleted file mode 100755
index 5a78f87..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix delete -n asterix 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh
deleted file mode 100755
index 66f27a2..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh
deleted file mode 100755
index 0e51f68..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh
deleted file mode 100755
index 6c39194..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix delete -n nc1 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix create -n nc1 -c $MANAGIX_HOME/clusters/local/local.xml;
-$MANAGIX_HOME/bin/managix stop -n nc1;
-cp $MANAGIX_HOME/../../../asterix-external-data/target/asterix-external-data-*-tests.jar \
-    $MANAGIX_HOME/clusters/local/working_dir/asterix/repo/
-$MANAGIX_HOME/bin/managix start -n nc1;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh
deleted file mode 100755
index 7002d00..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1;
-$MANAGIX_HOME/bin/managix delete -n nc1;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh
deleted file mode 100755
index 654fc22..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1;
-$MANAGIX_HOME/bin/managix start -n nc1;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh
deleted file mode 100755
index ac2cc79..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix delete -n nc1 1>/dev/null 2>&1;
-$MANAGIX_HOME/bin/managix create -n nc1 -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh
deleted file mode 100755
index 7002d00..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1;
-$MANAGIX_HOME/bin/managix delete -n nc1;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh
deleted file mode 100755
index 654fc22..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-$MANAGIX_HOME/bin/managix stop -n nc1;
-$MANAGIX_HOME/bin/managix start -n nc1;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh
deleted file mode 100755
index 789914b..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix create -n asterix -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh
deleted file mode 100755
index 2fb80ce..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix start -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh
deleted file mode 100755
index e30be0c..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix configure;
-$MANAGIX_HOME/bin/managix validate;
-$MANAGIX_HOME/bin/managix validate -c $MANAGIX_HOME/clusters/local/local.xml;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh
deleted file mode 100755
index 4b876be..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh b/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh
deleted file mode 100755
index eb1c01e..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-$MANAGIX_HOME/bin/managix stop -n asterix;
-$MANAGIX_HOME/bin/managix delete -n asterix;
-
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/testsuite.xml b/asterixdb/asterix-installer/src/test/resources/transactionts/testsuite.xml
deleted file mode 100644
index bd68075..0000000
--- a/asterixdb/asterix-installer/src/test/resources/transactionts/testsuite.xml
+++ /dev/null
@@ -1,293 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
-  <test-group name="query_after_restart">
-    <test-case FilePath="query_after_restart">
-      <compilation-unit name="dataset-with-meta-record">
-        <output-dir compare="Text">dataset-with-meta-record</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="query_after_restart">
-      <compilation-unit name="external_index">
-        <output-dir compare="Text">external_index</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="query_after_restart">
-      <compilation-unit name="big_object_20M">
-        <output-dir compare="Text">big_object_20M</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="dml_after_restart">
-    <test-case FilePath="dml_after_restart">
-      <compilation-unit name="multiple_secondary_indices">
-        <output-dir compare="Text">multiple_secondary_indices</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="recover_after_abort">
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_index_only">
-        <output-dir compare="Text">primary_index_only</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_default_secondary_index">
-        <output-dir compare="Text">primary_plus_default_secondary_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_default_correlated_secondary_index">
-        <output-dir compare="Text">primary_plus_default_secondary_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_rtree_index">
-        <output-dir compare="Text">primary_plus_rtree_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_correlated_rtree_index">
-        <output-dir compare="Text">primary_plus_rtree_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_rtree_index_insert_and_delete">
-        <output-dir compare="Text">primary_plus_rtree_index_insert_and_delete</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_keyword_secondary_index">
-        <output-dir compare="Text">primary_plus_keyword_secondary_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_keyword_correlated_secondary_index">
-        <output-dir compare="Text">primary_plus_keyword_secondary_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_ngram_index">
-        <output-dir compare="Text">primary_plus_ngram_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_correlated_ngram_index">
-        <output-dir compare="Text">primary_plus_ngram_index</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_multiple_secondary_indices">
-        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_multiple_correlated_secondary_indices">
-        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_index_only_filtered">
-        <output-dir compare="Text">primary_index_only_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_default_secondary_index_filtered">
-        <output-dir compare="Text">primary_plus_default_secondary_index_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_rtree_index_filtered">
-        <output-dir compare="Text">primary_plus_rtree_index_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_rtree_index_insert_and_delete_filtered">
-        <output-dir compare="Text">primary_plus_rtree_index_insert_and_delete_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_keyword_secondary_index_filtered">
-        <output-dir compare="Text">primary_plus_keyword_secondary_index_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_ngram_index">
-        <output-dir compare="Text">primary_plus_ngram_index_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_multiple_secondary_indices">
-        <output-dir compare="Text">primary_plus_multiple_secondary_indices_filtered</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="temp_primary_index_only">
-        <output-dir compare="Text">primary_index_only</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="temp_primary_plus_default_secondary_index">
-        <output-dir compare="Text">primary_plus_default_secondary_index</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="temp_primary_plus_rtree_index">
-        <output-dir compare="Text">primary_plus_rtree_index</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="temp_primary_plus_keyword_secondary_index">
-        <output-dir compare="Text">primary_plus_keyword_secondary_index</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException: Could not find dataset Fragile in dataverse recovery</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="temp_primary_plus_ngram_index">
-        <output-dir compare="Text">primary_plus_ngram_index</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recover_after_abort">
-      <compilation-unit name="primary_plus_multiple_secondary_indices"><!-- The only exception here is during the kill command which is in a different JVM, hence not caught -->
-        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
-        <!-- <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error> -->
-      </compilation-unit>
-    </test-case>
-  </test-group>
-
-  <test-group name="recovery_ddl">
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="dataverse_recovery">
-        <output-dir compare="Text">dataverse_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="datatype_recovery">
-        <output-dir compare="Text">datatype_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="dataset_recovery">
-        <output-dir compare="Text">dataset_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="secondary_index_recovery">
-        <output-dir compare="Text">secondary_index_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="load_after_recovery">
-        <output-dir compare="Text">load_after_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="insert_after_recovery">
-        <output-dir compare="Text">insert_after_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="delete_after_recovery">
-        <output-dir compare="Text">delete_after_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="function_recovery">
-        <output-dir compare="Text">function_recovery</output-dir>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="temp_dataset_recovery">
-        <output-dir compare="Text">dataset_recovery</output-dir>
-        <!-- <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error> -->
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="temp_delete_after_recovery">
-        <output-dir compare="Text">delete_after_recovery</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException: Cannot find dataset Fragile_raw in dataverse recovery</expected-error>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException: Could not find dataset Fragile_raw in dataverse recovery</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="temp_insert_after_recovery">
-        <output-dir compare="Text">insert_after_recovery</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException: Could not find dataset Fragile in dataverse recovery</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="temp_load_after_recovery">
-        <output-dir compare="Text">load_after_recovery</output-dir>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error>
-        <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException: Could not find dataset Fragile_raw in dataverse recovery</expected-error>
-      </compilation-unit>
-    </test-case>
-
-    <test-case FilePath="recovery_ddl">
-      <compilation-unit name="temp_secondary_index_recovery">
-        <output-dir compare="Text">secondary_index_recovery</output-dir>
-        <!-- <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error> -->
-      </compilation-unit>
-    </test-case>
-
-  </test-group>
-
-</test-suite>
diff --git a/asterixdb/asterix-lang-aql/pom.xml b/asterixdb/asterix-lang-aql/pom.xml
index 96e7523..099b00e 100644
--- a/asterixdb/asterix-lang-aql/pom.xml
+++ b/asterixdb/asterix-lang-aql/pom.xml
@@ -35,7 +35,7 @@
 
   <artifactId>asterix-lang-aql</artifactId>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
   <build>
     <plugins>
@@ -54,13 +54,6 @@
               <javaUnicodeEscape>true</javaUnicodeEscape>
             </configuration>
           </execution>
-          <execution>
-            <id>javacc-jjdoc</id>
-            <goals>
-              <goal>jjdoc</goal>
-            </goals>
-            <phase>process-sources</phase>
-          </execution>
         </executions>
       </plugin>
       <plugin>
@@ -121,6 +114,35 @@
     </pluginManagement>
   </build>
 
+  <profiles>
+    <profile>
+      <id>jjdoc</id>
+      <activation>
+        <property>
+          <name>jjdoc.skip</name>
+          <value>!true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>javacc-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>javacc-jjdoc</id>
+                <goals>
+                  <goal>jjdoc</goal>
+                </goals>
+                <phase>generate-test-sources</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.asterix</groupId>
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/FLWOGRExpression.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/FLWOGRExpression.java
index 10143f2..54fd8cf 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/FLWOGRExpression.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/FLWOGRExpression.java
@@ -22,12 +22,13 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.aql.visitor.base.IAQLVisitor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Clause.ClauseType;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
-public class FLWOGRExpression implements Expression {
+public class FLWOGRExpression extends AbstractExpression {
     private List<Clause> clauseList;
     private Expression returnExpr;
 
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/UnionExpr.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/UnionExpr.java
index 133cb46..bb29762 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/UnionExpr.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/expression/UnionExpr.java
@@ -23,15 +23,16 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.aql.visitor.base.IAQLVisitor;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 
-public class UnionExpr implements Expression {
+public class UnionExpr extends AbstractExpression {
 
     private List<Expression> exprs;
 
     public UnionExpr() {
-        exprs = new ArrayList<Expression>();
+        exprs = new ArrayList<>();
     }
 
     public UnionExpr(List<Expression> exprs) {
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/parser/FunctionParser.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/parser/FunctionParser.java
index 098b447..eb9631a 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/parser/FunctionParser.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/parser/FunctionParser.java
@@ -42,8 +42,8 @@
 
     public FunctionDecl getFunctionDecl(Function function) throws CompilationException {
         if (!function.getLanguage().equals(Function.LANGUAGE_AQL)) {
-            throw new CompilationException(ErrorCode.COMPILATION_INCOMPATIBLE_FUNCTION_LANGUAGE,
-                    Function.LANGUAGE_AQL, function.getLanguage());
+            throw new CompilationException(ErrorCode.COMPILATION_INCOMPATIBLE_FUNCTION_LANGUAGE, Function.LANGUAGE_AQL,
+                    function.getLanguage());
         }
         String functionBody = function.getFunctionBody();
         List<String> params = function.getParams();
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/rewrites/AqlQueryRewriter.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/rewrites/AqlQueryRewriter.java
index 977f6bb..d2cb64f 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/rewrites/AqlQueryRewriter.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/rewrites/AqlQueryRewriter.java
@@ -40,6 +40,7 @@
 import org.apache.asterix.lang.common.base.IReturningStatement;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
@@ -68,7 +69,8 @@
 
     @Override
     public void rewrite(List<FunctionDecl> declaredFunctions, IReturningStatement topStatement,
-            MetadataProvider metadataProvider, LangRewritingContext context) throws CompilationException {
+            MetadataProvider metadataProvider, LangRewritingContext context, boolean inlineUdfs)
+            throws CompilationException {
         setup(declaredFunctions, topStatement, metadataProvider, context);
         if (topStatement.isTopLevel()) {
             wrapInLets();
@@ -121,8 +123,8 @@
             declaredFunctions.addAll(storedFunctionDecls);
         }
         if (!declaredFunctions.isEmpty()) {
-            AQLInlineUdfsVisitor visitor = new AQLInlineUdfsVisitor(context, new AQLRewriterFactory(),
-                    declaredFunctions, metadataProvider);
+            AQLInlineUdfsVisitor visitor =
+                    new AQLInlineUdfsVisitor(context, new AQLRewriterFactory(), declaredFunctions, metadataProvider);
             while (topStatement.accept(visitor, declaredFunctions)) {
                 // loop until no more changes
             }
@@ -130,7 +132,8 @@
         declaredFunctions.removeAll(storedFunctionDecls);
     }
 
-    private Set<FunctionSignature> getFunctionCalls(Expression expression) throws CompilationException {
+    @Override
+    public Set<CallExpr> getFunctionCalls(Expression expression) throws CompilationException {
         GatherFunctionCalls gfc = new GatherFunctionCalls();
         expression.accept(gfc, null);
         return gfc.getCalls();
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/AQLVariableSubstitutionUtil.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/AQLVariableSubstitutionUtil.java
index 096b12f..f19afac 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/AQLVariableSubstitutionUtil.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/util/AQLVariableSubstitutionUtil.java
@@ -32,8 +32,8 @@
 
     public static ILangExpression substituteVariable(ILangExpression expression,
             Map<VariableExpr, Expression> varExprMap) throws CompilationException {
-        AQLCloneAndSubstituteVariablesVisitor visitor = new AQLCloneAndSubstituteVariablesVisitor(
-                new LangRewritingContext(0));
+        AQLCloneAndSubstituteVariablesVisitor visitor =
+                new AQLCloneAndSubstituteVariablesVisitor(new LangRewritingContext(0));
         VariableSubstitutionEnvironment env = new VariableSubstitutionEnvironment(varExprMap);
         return expression.accept(visitor, env).first;
     }
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLAstPrintVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLAstPrintVisitor.java
index 1f76f75..0c34b83 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLAstPrintVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLAstPrintVisitor.java
@@ -32,16 +32,8 @@
 
 class AQLAstPrintVisitor extends QueryPrintVisitor implements IAQLVisitor<Void, Integer> {
 
-    private final PrintWriter out;
-
-    public AQLAstPrintVisitor() {
-        super();
-        out = new PrintWriter(System.out);
-    }
-
     public AQLAstPrintVisitor(PrintWriter out) {
         super(out);
-        this.out = out;
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLCloneAndSubstituteVariablesVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLCloneAndSubstituteVariablesVisitor.java
index 0e7b4ad..6008723 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLCloneAndSubstituteVariablesVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLCloneAndSubstituteVariablesVisitor.java
@@ -93,8 +93,8 @@
     @Override
     public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(DistinctClause dc,
             VariableSubstitutionEnvironment env) throws CompilationException {
-        List<Expression> exprList = VariableCloneAndSubstitutionUtil.visitAndCloneExprList(dc.getDistinctByExpr(), env,
-                this);
+        List<Expression> exprList =
+                VariableCloneAndSubstitutionUtil.visitAndCloneExprList(dc.getDistinctByExpr(), env, this);
         DistinctClause dc2 = new DistinctClause(exprList);
         return new Pair<ILangExpression, VariableSubstitutionEnvironment>(dc2, env);
     }
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLFormatPrintVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLFormatPrintVisitor.java
index a12f089..eea398f 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLFormatPrintVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLFormatPrintVisitor.java
@@ -31,16 +31,8 @@
 
 public class AQLFormatPrintVisitor extends FormatPrintVisitor implements IAQLVisitor<Void, Integer> {
 
-    private final PrintWriter out;
-
-    public AQLFormatPrintVisitor() {
-        super();
-        out = new PrintWriter(System.out);
-    }
-
     public AQLFormatPrintVisitor(PrintWriter out) {
         super(out);
-        this.out = out;
     }
 
     @Override
@@ -80,5 +72,4 @@
         out.println();
         return null;
     }
-
 }
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
index 481dea7..8d84dbc 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AQLToSQLPPPrintVisitor.java
@@ -55,6 +55,7 @@
 import org.apache.asterix.lang.common.statement.InsertStatement;
 import org.apache.asterix.lang.common.statement.Query;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.FormatPrintVisitor;
 import org.apache.hyracks.algebricks.common.utils.Pair;
@@ -584,7 +585,7 @@
                     newWhereExpr.setExprList(expressions);
                     newWhereExpr.setCurrentop(true);
                     for (int operatorIndex = 0; operatorIndex < expressions.size(); ++operatorIndex) {
-                        newWhereExpr.addOperator("and");
+                        newWhereExpr.addOperator(OperatorType.AND);
                     }
                     results.add(new WhereClause(newWhereExpr));
                 } else {
diff --git a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
index 57370c5..e90f9a9 100644
--- a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
+++ b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/AqlDeleteRewriteVisitor.java
@@ -36,6 +36,7 @@
 import org.apache.asterix.lang.common.statement.DeleteStatement;
 import org.apache.asterix.lang.common.statement.Query;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 
 public class AqlDeleteRewriteVisitor extends AbstractAqlAstVisitor<Void, Void> {
 
@@ -48,8 +49,7 @@
                 : dataverseName.getValue() + "." + datasetName.getValue();
         LiteralExpr argumentLiteral = new LiteralExpr(new StringLiteral(arg));
         arguments.add(argumentLiteral);
-        CallExpr callExpression =
-                new CallExpr(new FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1), arguments);
+        CallExpr callExpression = new CallExpr(new FunctionSignature(BuiltinFunctions.DATASET), arguments);
 
         List<Clause> clauseList = new ArrayList<>();
         VariableExpr var = deleteStmt.getVariableExpr();
diff --git a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
index 0cc6789..7ddc5d2 100644
--- a/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
+++ b/asterixdb/asterix-lang-aql/src/main/javacc/AQL.jj
@@ -153,6 +153,7 @@
 import org.apache.asterix.metadata.utils.MetadataConstants;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.common.utils.Triple;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IndexedNLJoinExpressionAnnotation;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -440,17 +441,15 @@
   Pair<Identifier,Identifier> typeComponents = null;
   String adapterName = null;
   Map<String,String> properties = null;
-  Map<String,String> compactionPolicyProperties = null;
   FunctionSignature appliedFunction = null;
   Pair<List<Integer>, List<List<String>>> primaryKeyFields = null;
   String nodeGroupName = null;
   Map<String,String> hints = new HashMap<String,String>();
   DatasetDecl dsetDecl = null;
   boolean autogenerated = false;
-  String compactionPolicy = null;
-  boolean temp = false;
   Pair<Integer, List<String>> filterField = null;
   Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null);
+  RecordConstructor withRecord = null;
 }
 {
   (
@@ -460,30 +459,30 @@
     <USING> adapterName = AdapterName() properties = Configuration()
     ( <ON> nodeGroupName = Identifier() )?
     ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
+    ( <WITH> withRecord = RecordConstructor() )?
       {
         ExternalDetailsDecl edd = new ExternalDetailsDecl();
         edd.setAdapter(adapterName);
         edd.setProperties(properties);
-        dsetDecl = new DatasetDecl(nameComponents.first,
-                                   nameComponents.second,
-                                   typeComponents.first,
-                                   typeComponents.second,
-                                   metaTypeComponents.first,
-                                   metaTypeComponents.second,
-                                   nodeGroupName != null? new Identifier(nodeGroupName): null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
-                                   hints,
-                                   DatasetType.EXTERNAL,
-                                   edd,
-                                   ifNotExists);
+        try{
+            dsetDecl = new DatasetDecl(nameComponents.first,
+              nameComponents.second,
+              typeComponents.first,
+              typeComponents.second,
+              metaTypeComponents.first,
+              metaTypeComponents.second,
+              nodeGroupName != null? new Identifier(nodeGroupName): null,
+              hints,
+              DatasetType.EXTERNAL,
+              edd,
+              withRecord,
+              ifNotExists);
+       } catch (CompilationException e){
+           throw new ParseException(e.getMessage());
+       }
       }
 
-    | (<INTERNAL> | <TEMPORARY> {
-            temp = token.image.toLowerCase().equals("temporary");
-        }
-      )?
+    | ( <INTERNAL> )?
     <DATASET> nameComponents = QualifiedName()
     <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN>
     (
@@ -502,8 +501,8 @@
     ( <AUTOGENERATED> { autogenerated = true; } )?
     ( <ON> nodeGroupName = Identifier() )?
     ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (compactionPolicyProperties = Configuration())? )?
-    ( <WITH> <FILTER> <ON> filterField = NestedField() )?
+    ( LOOKAHEAD(2) <WITH> <FILTER> <ON> filterField = NestedField() )?
+    ( <WITH> withRecord = RecordConstructor() )?
       {
         if(filterField!=null && filterField.first!=0){
           throw new ParseException("A filter field can only be a field in the main record of the dataset.");
@@ -511,21 +510,23 @@
         InternalDetailsDecl idd = new InternalDetailsDecl(primaryKeyFields.second,
                                                           primaryKeyFields.first,
                                                           autogenerated,
-                                                          filterField == null? null : filterField.second,
-                                                          temp);
-        dsetDecl = new DatasetDecl(nameComponents.first,
+                                                          filterField == null? null : filterField.second);
+        try{
+          dsetDecl = new DatasetDecl(nameComponents.first,
                                    nameComponents.second,
                                    typeComponents.first,
                                    typeComponents.second,
                                    metaTypeComponents.first,
                                    metaTypeComponents.second,
                                    nodeGroupName != null ? new Identifier(nodeGroupName) : null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
                                    hints,
                                    DatasetType.INTERNAL,
                                    idd,
+                                   withRecord,
                                    ifNotExists);
+        } catch (CompilationException e){
+           throw new ParseException(e.getMessage());
+        }
       }
   )
     {
@@ -725,7 +726,7 @@
       signature = new FunctionSignature(fctName.dataverse, fctName.function, paramList.size());
       getCurrentScope().addFunctionDescriptor(signature, false);
       removeCurrentScope();
-      return new CreateFunctionStatement(signature, paramList, functionBody, ifNotExists);
+      return new CreateFunctionStatement(signature, paramList, functionBody, functionBodyExpr, ifNotExists);
     }
 }
 
@@ -733,19 +734,21 @@
 {
   Pair<Identifier,Identifier> nameComponents = null;
   boolean ifNotExists = false;
-  String adapterName = null;
-  Map<String,String> properties = null;
   CreateFeedStatement cfs = null;
   Pair<Identifier,Identifier> sourceNameComponents = null;
-
+  RecordConstructor withRecord = null;
 }
 {
   <FEED> nameComponents = QualifiedName() ifNotExists = IfNotExists()
-  <USING> adapterName = AdapterName() properties = Configuration()
-  {
-    cfs = new CreateFeedStatement(nameComponents, adapterName, properties, ifNotExists);
-    return cfs;
-  }
+  <WITH> withRecord = RecordConstructor()
+    {
+      try {
+        cfs = new CreateFeedStatement(nameComponents, withRecord, ifNotExists);
+        return cfs;
+      } catch (AlgebricksException e) {
+        throw new ParseException(e.getMessage());
+      }
+    }
 }
 
 CreateFeedPolicyStatement FeedPolicySpecification() throws ParseException:
@@ -2729,7 +2732,7 @@
   | <START: "start">
   | <STOP: "stop">
   | <SOME : "some">
-  | <TEMPORARY : "temporary">
+  | <TEMPORARY : "temporary"> // intentionally not used but reserved for future usage
   | <THEN : "then">
   | <TO : "to">
   | <TYPE : "type">
diff --git a/asterixdb/asterix-lang-common/pom.xml b/asterixdb/asterix-lang-common/pom.xml
index f510a5a..0fe7e6d 100644
--- a/asterixdb/asterix-lang-common/pom.xml
+++ b/asterixdb/asterix-lang-common/pom.xml
@@ -34,6 +34,11 @@
   </licenses>
 
   <artifactId>asterix-lang-common</artifactId>
+
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
+
   <build>
     <plugins>
       <plugin>
@@ -91,6 +96,10 @@
       <artifactId>commons-lang</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-collections4</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>algebricks-core</artifactId>
     </dependency>
@@ -99,10 +108,6 @@
       <artifactId>hyracks-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-data-std</artifactId>
     </dependency>
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExpression.java
index 536b195..44a05ef 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/AbstractExpression.java
@@ -28,7 +28,7 @@
 
     public void addHint(IExpressionAnnotation hint) {
         if (hints == null) {
-            hints = new ArrayList<IExpressionAnnotation>();
+            hints = new ArrayList<>();
         }
         hints.add(hint);
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
index 7da34fe..3afff76 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
@@ -19,9 +19,9 @@
 package org.apache.asterix.lang.common.base;
 
 public interface Expression extends ILangExpression {
-    public abstract Kind getKind();
+    Kind getKind();
 
-    public enum Kind {
+    enum Kind {
         LITERAL_EXPRESSION,
         FLWOGR_EXPRESSION,
         IF_EXPRESSION,
@@ -38,8 +38,6 @@
         UNION_EXPRESSION,
         SELECT_EXPRESSION,
         PRIMARY_EXPRESSION,
-        INDEPENDENT_SUBQUERY,
         CASE_EXPRESSION
     }
-
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
index 0c6c04c..05ab836 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IQueryRewriter.java
@@ -19,8 +19,10 @@
 package org.apache.asterix.lang.common.base;
 
 import java.util.List;
+import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.statement.FunctionDecl;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -39,6 +41,12 @@
      * @param context,
      *            manages ids of variables and guarantees uniqueness of variables.
      */
-    public void rewrite(List<FunctionDecl> declaredFunctions, IReturningStatement topExpr,
-            MetadataProvider metadataProvider, LangRewritingContext context) throws CompilationException;
+    void rewrite(List<FunctionDecl> declaredFunctions, IReturningStatement topExpr, MetadataProvider metadataProvider,
+            LangRewritingContext context, boolean inlineUdfs) throws CompilationException;
+
+    /**
+     * Find the function calls used by a given expression
+     */
+    Set<CallExpr> getFunctionCalls(Expression expression) throws CompilationException;
+
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IReturningStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IReturningStatement.java
index 02e5267..d31b765 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IReturningStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/IReturningStatement.java
@@ -19,6 +19,8 @@
 
 package org.apache.asterix.lang.common.base;
 
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+
 import java.util.List;
 
 /**
@@ -64,4 +66,16 @@
      *            the main body expression.
      */
     void setBody(Expression expr);
+
+    /**
+     * @return external (pre-defined) variables for the statement
+     */
+    List<VarIdentifier> getExternalVars();
+
+    /**
+     * Sets external (pre-defined) variables for the statement
+     *
+     * @param externalVars external variables
+     */
+    void setExternalVars(List<VarIdentifier> externalVars);
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java
index 1ca8ac46..c0beef4 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Literal.java
@@ -38,9 +38,9 @@
         LONG
     }
 
-    abstract public Object getValue();
+    public abstract Object getValue();
 
-    abstract public Type getLiteralType();
+    public abstract Type getLiteralType();
 
     public String getStringValue() {
         return getValue().toString();
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/GroupbyClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/GroupbyClause.java
index ac7cbbf..31c903e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/GroupbyClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/GroupbyClause.java
@@ -21,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
@@ -29,7 +30,6 @@
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public class GroupbyClause implements Clause {
@@ -146,11 +146,12 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(decorPairList, gbyPairList, groupAll, groupFieldList, groupVar,
-                hashGroupByHint, withVarMap);
+        return Objects.hash(decorPairList, gbyPairList, groupAll, groupFieldList, groupVar, hashGroupByHint,
+                withVarMap);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -159,10 +160,9 @@
             return false;
         }
         GroupbyClause target = (GroupbyClause) object;
-        boolean equals = ObjectUtils.equals(decorPairList, target.decorPairList)
-                && ObjectUtils.equals(gbyPairList, target.gbyPairList) && groupAll == target.groupAll
-                && ObjectUtils.equals(groupFieldList, target.groupFieldList);
-        return equals && ObjectUtils.equals(groupVar, target.groupVar) && hashGroupByHint == target.hashGroupByHint
-                && ObjectUtils.equals(withVarMap, target.withVarMap);
+        return Objects.equals(decorPairList, target.decorPairList) && Objects.equals(gbyPairList, target.gbyPairList)
+                && groupAll == target.groupAll && Objects.equals(groupFieldList, target.groupFieldList)
+                && Objects.equals(groupVar, target.groupVar) && hashGroupByHint == target.hashGroupByHint
+                && Objects.equals(withVarMap, target.withVarMap);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LetClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LetClause.java
index 7c813d3..df560ea 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LetClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LetClause.java
@@ -18,12 +18,13 @@
  */
 package org.apache.asterix.lang.common.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class LetClause implements Clause {
     private VariableExpr varExpr;
@@ -67,7 +68,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(bindExpr, varExpr);
+        return Objects.hash(bindExpr, varExpr);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LimitClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LimitClause.java
index 68220fc..fbfa64e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LimitClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/LimitClause.java
@@ -18,11 +18,12 @@
  */
 package org.apache.asterix.lang.common.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class LimitClause implements Clause {
     private Expression limitExpr;
@@ -69,7 +70,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(limitExpr, offset);
+        return Objects.hash(limitExpr, offset);
     }
 
     @Override
@@ -81,6 +82,6 @@
             return false;
         }
         LimitClause target = (LimitClause) object;
-        return limitExpr.equals(target.getLimitExpr()) && ObjectUtils.equals(offset, target.getOffset());
+        return limitExpr.equals(target.getLimitExpr()) && Objects.equals(offset, target.getOffset());
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/OrderbyClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/OrderbyClause.java
index 0dcbd8e..c1ceaa8 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/OrderbyClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/OrderbyClause.java
@@ -19,12 +19,12 @@
 package org.apache.asterix.lang.common.clause;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.hyracks.dataflow.common.data.partition.range.IRangeMap;
 
 public class OrderbyClause implements Clause {
@@ -100,7 +100,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(modifierList, numFrames, numTuples, orderbyList);
+        return Objects.hash(modifierList, numFrames, numTuples, orderbyList);
     }
 
     @Override
@@ -112,7 +112,7 @@
             return false;
         }
         OrderbyClause target = (OrderbyClause) object;
-        return ObjectUtils.equals(modifierList, target.modifierList) && numFrames == target.numFrames
+        return Objects.equals(modifierList, target.modifierList) && numFrames == target.numFrames
                 && numTuples == target.numTuples && orderbyList.equals(target.orderbyList);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/UpdateClause.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/UpdateClause.java
index 75f6fbd..4089c07 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/UpdateClause.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/clause/UpdateClause.java
@@ -18,6 +18,8 @@
  */
 package org.apache.asterix.lang.common.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
@@ -25,7 +27,6 @@
 import org.apache.asterix.lang.common.statement.InsertStatement;
 import org.apache.asterix.lang.common.statement.UpdateStatement;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class UpdateClause implements Clause {
 
@@ -118,10 +119,11 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(condition, ds, elsebranch, ifbranch, is, target, us, value);
+        return Objects.hash(condition, ds, elsebranch, ifbranch, is, target, us, value);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return false;
@@ -130,11 +132,10 @@
             return false;
         }
         UpdateClause other = (UpdateClause) object;
-        boolean equals = ObjectUtils.equals(condition, other.condition) && ObjectUtils.equals(ds, other.ds)
-                && ObjectUtils.equals(elsebranch, other.elsebranch) && ObjectUtils.equals(ifbranch, other.ifbranch);
-        equals = equals && ObjectUtils.equals(is, other.is) && ObjectUtils.equals(target, other.target)
-                && ObjectUtils.equals(us, other.us);
-        return equals && ObjectUtils.equals(value, other.value);
+        return Objects.equals(condition, other.condition) && Objects.equals(ds, other.ds)
+                && Objects.equals(elsebranch, other.elsebranch) && Objects.equals(ifbranch, other.ifbranch)
+                && Objects.equals(is, other.is) && Objects.equals(target, other.target) && Objects.equals(us, other.us)
+                && Objects.equals(value, other.value);
     }
 
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java
index ad277d3..bf46c5d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/context/Scope.java
@@ -18,40 +18,39 @@
  */
 package org.apache.asterix.lang.common.context;
 
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.Map;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.Set;
 
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.parser.ScopeChecker;
-import org.apache.asterix.lang.common.rewrites.VariableSubstitutionEnvironment;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.commons.collections4.iterators.ReverseListIterator;
 
 public final class Scope {
-    private Scope parent;
-    private Map<String, Identifier> symbols = new HashMap<String, Identifier>();
-    private Map<String, Expression> varExprMap = new HashMap<String, Expression>();
-    private FunctionSignatures functionSignatures = null;
     private final ScopeChecker scopeChecker;
-    private boolean maskParentScope = false;
-
-    public Scope(ScopeChecker scopeChecker, Scope parent) {
-        this.scopeChecker = scopeChecker;
-        this.parent = parent;
-    }
+    private final Scope parent;
+    private final LinkedHashMap<String, Identifier> symbols;
+    private final boolean maskParentScope;
+    private FunctionSignatures functionSignatures;
 
     public Scope(ScopeChecker scopeChecker) {
         this(scopeChecker, null);
     }
 
+    public Scope(ScopeChecker scopeChecker, Scope parent) {
+        this(scopeChecker, parent, false);
+    }
+
     public Scope(ScopeChecker scopeChecker, Scope parent, boolean maskParentScope) {
-        this(scopeChecker, parent);
+        this.scopeChecker = scopeChecker;
+        this.parent = parent;
         this.maskParentScope = maskParentScope;
+        this.symbols = new LinkedHashMap<>();
     }
 
     /**
@@ -81,36 +80,6 @@
         symbols.put(ident.getValue(), ident);
     }
 
-    /**
-     * Add a symbol and its definition expression into the scope
-     *
-     * @param ident
-     */
-    public void addSymbolExpressionMappingToScope(VariableExpr ident, Expression expr) {
-        varExprMap.put(ident.getVar().getValue(), expr);
-    }
-
-    /**
-     * Remove a symbol and its definition expression into the scope
-     *
-     * @param ident
-     */
-    public Expression removeSymbolExpressionMapping(VariableExpr ident) {
-        if (ident == null) {
-            return null;
-        }
-        return varExprMap.remove(ident.getVar().getValue());
-    }
-
-    /**
-     * @return the variable substituion environment for inlining variable references by its original
-     */
-    public VariableSubstitutionEnvironment getVarSubstitutionEnvironment() {
-        VariableSubstitutionEnvironment env = new VariableSubstitutionEnvironment();
-        env.addMappings(varExprMap);
-        return env;
-    }
-
     public void addNewVarSymbolToScope(VarIdentifier ident) {
         scopeChecker.incVarCounter();
         ident.setId(scopeChecker.getVarCounter());
@@ -120,8 +89,8 @@
     /**
      * Add a FunctionDescriptor into functionSignatures
      *
-     * @param fd
-     *            FunctionDescriptor
+     * @param signature
+     *            FunctionSignature
      * @param varargs
      *            whether this function has varargs
      */
@@ -163,7 +132,6 @@
         if (functionSignatures != null && scope.functionSignatures != null) {
             functionSignatures.addAll(scope.functionSignatures);
         }
-        varExprMap.putAll(scope.varExprMap);
     }
 
     /**
@@ -171,16 +139,17 @@
      *
      * @return an iterator of visible symbols.
      */
-    public Iterator<Identifier> liveSymbols() {
-        final Iterator<Identifier> identifierIterator = symbols.values().iterator();
-        final Iterator<Identifier> parentIterator = parent == null ? null : parent.liveSymbols();
+    public Iterator<Identifier> liveSymbols(Scope stopAtExclusive) {
+        final Iterator<Identifier> identifierIterator = new ReverseListIterator<>(new ArrayList<>(symbols.values()));
+        final Iterator<Identifier> parentIterator =
+                parent == null || parent == stopAtExclusive ? null : parent.liveSymbols(stopAtExclusive);
         return new Iterator<Identifier>() {
             private Identifier currentSymbol = null;
 
             @Override
             public boolean hasNext() {
                 currentSymbol = null;
-                if (identifierIterator != null && identifierIterator.hasNext()) {
+                if (identifierIterator.hasNext()) {
                     currentSymbol = identifierIterator.next();
                 } else if (!maskParentScope && parentIterator != null && parentIterator.hasNext()) {
                     do {
@@ -214,8 +183,12 @@
     }
 
     public Set<VariableExpr> getLiveVariables() {
-        Set<VariableExpr> vars = new HashSet<VariableExpr>();
-        Iterator<Identifier> identifierIterator = liveSymbols();
+        return getLiveVariables(null);
+    }
+
+    public Set<VariableExpr> getLiveVariables(Scope stopAtExclusive) {
+        LinkedHashSet<VariableExpr> vars = new LinkedHashSet<>();
+        Iterator<Identifier> identifierIterator = liveSymbols(stopAtExclusive);
         while (identifierIterator.hasNext()) {
             Identifier identifier = identifierIterator.next();
             if (identifier instanceof VarIdentifier) {
@@ -230,7 +203,7 @@
         return symbols.keySet();
     }
 
-    public Scope getParentScope(){
+    public Scope getParentScope() {
         return parent;
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
index 2b7b748..eb35c9c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/AbstractAccessor.java
@@ -18,10 +18,11 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.commons.lang.ObjectUtils;
 
-public abstract class AbstractAccessor implements Expression {
+public abstract class AbstractAccessor extends AbstractExpression {
     protected Expression expr;
 
     public AbstractAccessor(Expression expr) {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
index 30b7297..6582b9d 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/CallExpr.java
@@ -19,18 +19,17 @@
 package org.apache.asterix.lang.common.expression;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class CallExpr extends AbstractExpression {
     private FunctionSignature functionSignature;
     private List<Expression> exprList;
-    private boolean isBuiltin;
 
     public CallExpr(FunctionSignature functionSignature, List<Expression> exprList) {
         this.functionSignature = functionSignature;
@@ -45,10 +44,6 @@
         return exprList;
     }
 
-    public boolean isBuiltin() {
-        return isBuiltin;
-    }
-
     @Override
     public Kind getKind() {
         return Kind.CALL_EXPRESSION;
@@ -74,7 +69,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(exprList, functionSignature, isBuiltin);
+        return Objects.hash(exprList, functionSignature);
     }
 
     @Override
@@ -86,7 +81,6 @@
             return false;
         }
         CallExpr target = (CallExpr) object;
-        return ObjectUtils.equals(exprList, target.exprList)
-                && ObjectUtils.equals(functionSignature, target.functionSignature) && isBuiltin == target.isBuiltin;
+        return Objects.equals(exprList, target.exprList) && Objects.equals(functionSignature, target.functionSignature);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
index 7009d90..d47a509 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldAccessor.java
@@ -18,11 +18,12 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class FieldAccessor extends AbstractAccessor {
     private Identifier ident;
@@ -57,7 +58,7 @@
 
     @Override
     public int hashCode() {
-        return 31 * super.hashCode() + ObjectUtils.hashCode(ident);
+        return 31 * super.hashCode() + Objects.hashCode(ident);
     }
 
     @Override
@@ -69,6 +70,6 @@
             return false;
         }
         FieldAccessor target = (FieldAccessor) object;
-        return super.equals(target) && ObjectUtils.equals(ident, target.ident);
+        return super.equals(target) && Objects.equals(ident, target.ident);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
index afadddd..b9683eb 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/FieldBinding.java
@@ -18,8 +18,9 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.lang.common.base.Expression;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class FieldBinding {
     private Expression leftExpr;
@@ -53,7 +54,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(leftExpr, rightExpr);
+        return Objects.hash(leftExpr, rightExpr);
     }
 
     @Override
@@ -65,7 +66,7 @@
             return false;
         }
         FieldBinding target = (FieldBinding) object;
-        return ObjectUtils.equals(leftExpr, target.leftExpr) && ObjectUtils.equals(rightExpr, target.rightExpr);
+        return Objects.equals(leftExpr, target.leftExpr) && Objects.equals(rightExpr, target.rightExpr);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
index aaa6526..f436c39 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/GbyVariableExpressionPair.java
@@ -18,8 +18,9 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.lang.common.base.Expression;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class GbyVariableExpressionPair {
     private VariableExpr var; // can be null
@@ -53,7 +54,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(expr, var);
+        return Objects.hash(expr, var);
     }
 
     @Override
@@ -65,7 +66,7 @@
             return false;
         }
         GbyVariableExpressionPair target = (GbyVariableExpressionPair) object;
-        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(var, target.var);
+        return Objects.equals(expr, target.expr) && Objects.equals(var, target.var);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
index 26b9c83..754aad4 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IfExpr.java
@@ -18,12 +18,14 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class IfExpr implements Expression {
+public class IfExpr extends AbstractExpression {
     private Expression condExpr;
     private Expression thenExpr;
     private Expression elseExpr;
@@ -74,7 +76,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(condExpr, elseExpr, thenExpr);
+        return Objects.hash(condExpr, elseExpr, thenExpr);
     }
 
     @Override
@@ -86,8 +88,8 @@
             return false;
         }
         IfExpr target = (IfExpr) object;
-        return ObjectUtils.equals(condExpr, target.condExpr) && ObjectUtils.equals(elseExpr, target.elseExpr)
-                && ObjectUtils.equals(thenExpr, target.thenExpr);
+        return Objects.equals(condExpr, target.condExpr) && Objects.equals(elseExpr, target.elseExpr)
+                && Objects.equals(thenExpr, target.thenExpr);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
index 36111a6..102c133 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/IndexAccessor.java
@@ -18,10 +18,11 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class IndexAccessor extends AbstractAccessor {
     private boolean isAny;
@@ -63,7 +64,7 @@
 
     @Override
     public int hashCode() {
-        return 31 * super.hashCode() + ObjectUtils.hashCodeMulti(indexExpr, isAny);
+        return 31 * super.hashCode() + Objects.hash(indexExpr, isAny);
     }
 
     @Override
@@ -75,7 +76,7 @@
             return false;
         }
         IndexAccessor target = (IndexAccessor) object;
-        return super.equals(target) && isAny == target.isAny && ObjectUtils.equals(indexExpr, target.indexExpr);
+        return super.equals(target) && isAny == target.isAny && Objects.equals(indexExpr, target.indexExpr);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
index 9a6d3f6..ca5dd57 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/ListConstructor.java
@@ -19,13 +19,14 @@
 package org.apache.asterix.lang.common.expression;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class ListConstructor implements Expression {
+public class ListConstructor extends AbstractExpression {
     private List<Expression> exprList;
     private Type type;
 
@@ -71,7 +72,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(exprList, type);
+        return Objects.hash(exprList, type);
     }
 
     @Override
@@ -83,6 +84,6 @@
             return false;
         }
         ListConstructor target = (ListConstructor) object;
-        return ObjectUtils.equals(exprList, target.exprList) && ObjectUtils.equals(type, target.type);
+        return Objects.equals(exprList, target.exprList) && Objects.equals(type, target.type);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
index 600a82c..0c3fdb1 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/LiteralExpr.java
@@ -18,13 +18,24 @@
  */
 package org.apache.asterix.lang.common.expression;
 
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.Literal;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
+import java.util.Objects;
 
-public class LiteralExpr implements Expression {
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.base.AbstractExpression;
+import org.apache.asterix.lang.common.base.Literal;
+import org.apache.asterix.lang.common.literal.DoubleLiteral;
+import org.apache.asterix.lang.common.literal.LongIntegerLiteral;
+import org.apache.asterix.lang.common.literal.StringLiteral;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.object.base.AdmBigIntNode;
+import org.apache.asterix.object.base.AdmBooleanNode;
+import org.apache.asterix.object.base.AdmDoubleNode;
+import org.apache.asterix.object.base.AdmNullNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
+
+public class LiteralExpr extends AbstractExpression {
     private Literal value;
 
     public LiteralExpr() {
@@ -55,7 +66,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCode(value);
+        return Objects.hashCode(value);
     }
 
     @Override
@@ -67,7 +78,6 @@
             return false;
         }
         LiteralExpr target = (LiteralExpr) object;
-        return ObjectUtils.equals(value, target.value);
+        return Objects.equals(value, target.value);
     }
-
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
index 954f715..90b457e 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/OperatorExpr.java
@@ -20,20 +20,19 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Optional;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class OperatorExpr extends AbstractExpression {
     private List<Expression> exprList;
     private List<OperatorType> opList;
     private List<Integer> exprBroadcastIdx;
-    private boolean currentop = false;
+    private boolean currentop;
 
     public OperatorExpr() {
         super();
@@ -92,12 +91,18 @@
     }
 
     public void addOperator(String strOp) throws CompilationException {
-        Optional<OperatorType> op = OperatorType.fromSymbol(strOp);
-        if (op.isPresent()) {
-            opList.add(op.get());
-        } else {
+        OperatorType op = OperatorType.fromSymbol(strOp);
+        if (op == null) {
             throw new CompilationException("Unsupported operator: " + strOp);
         }
+        addOperator(op);
+    }
+
+    public void addOperator(OperatorType op) {
+        if (op == null) {
+            throw new NullPointerException();
+        }
+        opList.add(op);
     }
 
     @Override
@@ -121,7 +126,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(currentop, exprBroadcastIdx, exprList, opList);
+        return Objects.hash(currentop, exprBroadcastIdx, exprList, opList);
     }
 
     @Override
@@ -133,7 +138,7 @@
             return false;
         }
         OperatorExpr target = (OperatorExpr) object;
-        return currentop == target.isCurrentop() && ObjectUtils.equals(exprBroadcastIdx, target.exprBroadcastIdx)
-                && ObjectUtils.equals(exprList, target.exprList) && ObjectUtils.equals(opList, target.opList);
+        return currentop == target.isCurrentop() && Objects.equals(exprBroadcastIdx, target.exprBroadcastIdx)
+                && Objects.equals(exprList, target.exprList) && Objects.equals(opList, target.opList);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
index 40322d7..a35d975 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/QuantifiedExpression.java
@@ -19,14 +19,15 @@
 package org.apache.asterix.lang.common.expression;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.QuantifiedPair;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class QuantifiedExpression implements Expression {
+public class QuantifiedExpression extends AbstractExpression {
     private List<QuantifiedPair> quantifiedList;
     private Expression satisfiesExpr;
     private Quantifier quantifier;
@@ -83,7 +84,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(quantifiedList, quantifier, satisfiesExpr);
+        return Objects.hash(quantifiedList, quantifier, satisfiesExpr);
     }
 
     @Override
@@ -95,8 +96,7 @@
             return false;
         }
         QuantifiedExpression target = (QuantifiedExpression) object;
-        return ObjectUtils.equals(quantifiedList, target.quantifiedList)
-                && ObjectUtils.equals(quantifier, target.quantifier)
-                && ObjectUtils.equals(satisfiesExpr, target.satisfiesExpr);
+        return Objects.equals(quantifiedList, target.quantifiedList) && Objects.equals(quantifier, target.quantifier)
+                && Objects.equals(satisfiesExpr, target.satisfiesExpr);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
index 6b17461..cce92e6 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordConstructor.java
@@ -19,13 +19,13 @@
 package org.apache.asterix.lang.common.expression;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class RecordConstructor implements Expression {
+public class RecordConstructor extends AbstractExpression {
     private List<FieldBinding> fbList;
 
     public RecordConstructor() {
@@ -57,7 +57,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCode(fbList);
+        return Objects.hashCode(fbList);
     }
 
     @Override
@@ -69,6 +69,6 @@
             return false;
         }
         RecordConstructor target = (RecordConstructor) object;
-        return ObjectUtils.equals(fbList, target.fbList);
+        return Objects.equals(fbList, target.fbList);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
index 39fbbc4..4aecd92 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RecordTypeDefinition.java
@@ -20,12 +20,12 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.annotations.IRecordFieldDataGen;
 import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class RecordTypeDefinition implements TypeExpression {
 
@@ -102,11 +102,11 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(fieldDataGen, fieldNames, fieldTypes, optionalFields, recordKind,
-                undeclaredFieldsDataGen);
+        return Objects.hash(fieldDataGen, fieldNames, fieldTypes, optionalFields, recordKind, undeclaredFieldsDataGen);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -115,11 +115,10 @@
             return false;
         }
         RecordTypeDefinition target = (RecordTypeDefinition) object;
-        boolean equals = fieldDataGen.equals(target.getFieldDataGen()) && fieldNames.equals(target.getFieldNames())
-                && fieldTypes.equals(target.getFieldNames()) && optionalFields.equals(target.getOptionableFields());
-        equals = equals && ObjectUtils.equals(recordKind, target.getRecordKind())
-                && ObjectUtils.equals(undeclaredFieldsDataGen, target.getUndeclaredFieldsDataGen());
-        return equals;
+        return fieldDataGen.equals(target.getFieldDataGen()) && fieldNames.equals(target.getFieldNames())
+                && fieldTypes.equals(target.getFieldTypes()) && optionalFields.equals(target.getOptionableFields())
+                && Objects.equals(recordKind, target.getRecordKind())
+                && Objects.equals(undeclaredFieldsDataGen, target.getUndeclaredFieldsDataGen());
     }
 
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
index 99197c6..1421f4f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnaryExpr.java
@@ -18,15 +18,16 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.struct.UnaryExprType;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class UnaryExpr implements Expression {
+public class UnaryExpr extends AbstractExpression {
     private UnaryExprType unaryExprType;
     private Expression expr;
 
@@ -72,7 +73,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(expr, unaryExprType);
+        return Objects.hash(expr, unaryExprType);
     }
 
     @Override
@@ -84,6 +85,6 @@
             return false;
         }
         UnaryExpr target = (UnaryExpr) object;
-        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(unaryExprType, target.unaryExprType);
+        return Objects.equals(expr, target.expr) && Objects.equals(unaryExprType, target.unaryExprType);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
index 48be7d2..8f4b1b7 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/UnorderedListTypeDefinition.java
@@ -18,9 +18,10 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class UnorderedListTypeDefinition implements TypeExpression {
 
@@ -46,7 +47,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCode(itemTypeExpression);
+        return Objects.hashCode(itemTypeExpression);
     }
 
     @Override
@@ -58,6 +59,6 @@
             return false;
         }
         UnorderedListTypeDefinition target = (UnorderedListTypeDefinition) object;
-        return ObjectUtils.equals(itemTypeExpression, target.itemTypeExpression);
+        return Objects.equals(itemTypeExpression, target.itemTypeExpression);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
index 8fcd2ad..17d0d2f 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/VariableExpr.java
@@ -18,13 +18,14 @@
  */
 package org.apache.asterix.lang.common.expression;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class VariableExpr implements Expression {
+public class VariableExpr extends AbstractExpression {
     private VarIdentifier var;
     private boolean isNewVar;
 
@@ -67,7 +68,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCode(var);
+        return Objects.hashCode(var);
     }
 
     @Override
@@ -79,7 +80,7 @@
             return false;
         }
         VariableExpr expr = (VariableExpr) obj;
-        return ObjectUtils.equals(var, expr.var);
+        return Objects.equals(var, expr.var);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
index f362c15..5812b19 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/DoubleLiteral.java
@@ -23,9 +23,9 @@
 
 public class DoubleLiteral extends Literal {
     private static final long serialVersionUID = -5685491458356989250L;
-    private Double value;
+    private double value;
 
-    public DoubleLiteral(Double value) {
+    public DoubleLiteral(double value) {
         super();
         this.value = value;
     }
@@ -35,6 +35,10 @@
         return value;
     }
 
+    public double getDoubleValue() {
+        return value;
+    }
+
     public void setValue(Double value) {
         this.value = value;
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
index 66164d1..5e00cb8 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/literal/LongIntegerLiteral.java
@@ -35,6 +35,10 @@
         return value;
     }
 
+    public long getLongValue() {
+        return value;
+    }
+
     public void setValue(Long value) {
         this.value = value;
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
index 771ae16..7dadd67 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/parser/ScopeChecker.java
@@ -60,8 +60,7 @@
      * @return new scope
      */
     public final Scope createNewScope() {
-        Scope parent = scopeStack.peek();
-        Scope scope = new Scope(this, parent);// top one as parent
+        Scope scope = extendCurrentScopeNoPush(false);
         scopeStack.push(scope);
         return scope;
     }
@@ -72,20 +71,14 @@
      * @return
      */
     public final Scope extendCurrentScope() {
-        return extendCurrentScope(false);
-    }
-
-    public final Scope extendCurrentScope(boolean maskParentScope) {
-        Scope scope = extendCurrentScopeNoPush(maskParentScope);
-        scopeStack.pop();
-        scopeStack.push(scope);
+        Scope scope = extendCurrentScopeNoPush(false);
+        replaceCurrentScope(scope);
         return scope;
     }
 
-    public final Scope extendCurrentScopeNoPush(boolean maskParentScope) {
-        Scope scope = scopeStack.peek();
-        scope = new Scope(this, scope, maskParentScope);
-        return scope;
+    protected final Scope extendCurrentScopeNoPush(boolean maskParentScope) {
+        Scope parent = scopeStack.peek();
+        return new Scope(this, parent, maskParentScope);
     }
 
     public final void replaceCurrentScope(Scope scope) {
@@ -116,6 +109,15 @@
     }
 
     /**
+     * get scope preceding the current scope
+     * @return preceding scope or {@code null} if current scope is the top one
+     */
+    public final Scope getPrecedingScope() {
+        int n = scopeStack.size();
+        return n > 1 ? scopeStack.get(n - 2) : null;
+    }
+
+    /**
      * find symbol in the scope
      *
      * @return identifier
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
index 1e7a182..ba2cdc4 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFeedStatement.java
@@ -19,11 +19,14 @@
 package org.apache.asterix.lang.common.statement;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Statement;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.util.ExpressionUtils;
+import org.apache.asterix.lang.common.util.MergePolicyUtils;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.hadoop.io.compress.bzip2.CBZip2InputStream;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
 import java.util.Map;
@@ -36,15 +39,13 @@
 
     private final Pair<Identifier, Identifier> qName;
     private final boolean ifNotExists;
-    private final String adaptorName;
-    private final Map<String, String> adaptorConfiguration;
+    private final AdmObjectNode withObjectNode;
 
-    public CreateFeedStatement(Pair<Identifier, Identifier> qName, String adaptorName,
-            Map<String, String> adaptorConfiguration, boolean ifNotExists) {
+    public CreateFeedStatement(Pair<Identifier, Identifier> qName, RecordConstructor withRecord, boolean ifNotExists)
+            throws AlgebricksException {
         this.qName = qName;
         this.ifNotExists = ifNotExists;
-        this.adaptorName = adaptorName;
-        this.adaptorConfiguration = adaptorConfiguration;
+        this.withObjectNode = withRecord == null ? null : ExpressionUtils.toNode(withRecord);
     }
 
     public Identifier getDataverseName() {
@@ -59,14 +60,6 @@
         return this.ifNotExists;
     }
 
-    public String getAdaptorName() {
-        return adaptorName;
-    }
-
-    public Map<String, String> getAdaptorConfiguration() {
-        return adaptorConfiguration;
-    }
-
     @Override
     public byte getKind() {
         return Kind.CREATE_FEED;
@@ -81,4 +74,12 @@
     public byte getCategory() {
         return Category.DDL;
     }
+
+    public Map<String, String> getConfiguration() throws CompilationException {
+        return MergePolicyUtils.toProperties(withObjectNode);
+    }
+
+    public AdmObjectNode getWithObjectNode() {
+        return withObjectNode;
+    }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
index 6d74957..c817885 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/CreateFunctionStatement.java
@@ -23,6 +23,7 @@
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
@@ -31,21 +32,19 @@
 
     private final FunctionSignature signature;
     private final String functionBody;
+    private final Expression functionBodyExpression;
     private final boolean ifNotExists;
     private final List<String> paramList;
 
-    public FunctionSignature getaAterixFunction() {
-        return signature;
-    }
-
     public String getFunctionBody() {
         return functionBody;
     }
 
     public CreateFunctionStatement(FunctionSignature signature, List<VarIdentifier> parameterList, String functionBody,
-            boolean ifNotExists) {
+            Expression functionBodyExpression, boolean ifNotExists) {
         this.signature = signature;
         this.functionBody = functionBody;
+        this.functionBodyExpression = functionBodyExpression;
         this.ifNotExists = ifNotExists;
         this.paramList = new ArrayList<String>();
         for (VarIdentifier varId : parameterList) {
@@ -66,10 +65,14 @@
         return paramList;
     }
 
-    public FunctionSignature getSignature() {
+    public FunctionSignature getFunctionSignature() {
         return signature;
     }
 
+    public Expression getFunctionBodyExpression() {
+        return functionBodyExpression;
+    }
+
     @Override
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
         return visitor.visit(this, arg);
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
index 79d1774..e63dae6 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DatasetDecl.java
@@ -18,34 +18,47 @@
  */
 package org.apache.asterix.lang.common.statement;
 
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.lang.common.base.Statement;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.util.ExpressionUtils;
+import org.apache.asterix.lang.common.util.MergePolicyUtils;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 public class DatasetDecl implements Statement {
+    protected static final String[] WITH_OBJECT_FIELDS = new String[] { MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME };
+    protected static final Set<String> WITH_OBJECT_FIELDS_SET = new HashSet<>(Arrays.asList(WITH_OBJECT_FIELDS));
+
     protected final Identifier name;
     protected final Identifier dataverse;
     protected final Identifier itemTypeDataverse;
     protected final Identifier itemTypeName;
+    protected final Identifier metaItemTypeDataverse;
+    protected final Identifier metaItemTypeName;
     protected final Identifier nodegroupName;
-    protected final String compactionPolicy;
-    protected final Map<String, String> compactionPolicyProperties;
     protected final DatasetType datasetType;
     protected final IDatasetDetailsDecl datasetDetailsDecl;
     protected final Map<String, String> hints;
+    private final AdmObjectNode withObjectNode;
     protected final boolean ifNotExists;
 
-    protected final Identifier metaItemTypeDataverse;
-    protected final Identifier metaItemTypeName;
-
     public DatasetDecl(Identifier dataverse, Identifier name, Identifier itemTypeDataverse, Identifier itemTypeName,
             Identifier metaItemTypeDataverse, Identifier metaItemTypeName, Identifier nodeGroupName,
-            String compactionPolicy, Map<String, String> compactionPolicyProperties, Map<String, String> hints,
-            DatasetType datasetType, IDatasetDetailsDecl idd, boolean ifNotExists) {
+            Map<String, String> hints, DatasetType datasetType, IDatasetDetailsDecl idd, RecordConstructor withRecord,
+            boolean ifNotExists) throws CompilationException {
         this.dataverse = dataverse;
         this.name = name;
         this.itemTypeName = itemTypeName;
@@ -61,9 +74,15 @@
             this.metaItemTypeDataverse = metaItemTypeDataverse;
         }
         this.nodegroupName = nodeGroupName;
-        this.compactionPolicy = compactionPolicy;
-        this.compactionPolicyProperties = compactionPolicyProperties;
         this.hints = hints;
+        try {
+            this.withObjectNode = withRecord == null ? null : ExpressionUtils.toNode(withRecord);
+        } catch (CompilationException e) {
+            throw e;
+        } catch (AlgebricksException e) {
+            // TODO(tillw) make signatures throw Algebricks exceptions
+            throw new CompilationException(e);
+        }
         this.ifNotExists = ifNotExists;
         this.datasetType = datasetType;
         this.datasetDetailsDecl = idd;
@@ -121,12 +140,68 @@
         return nodegroupName;
     }
 
-    public String getCompactionPolicy() {
-        return compactionPolicy;
+    public String getCompactionPolicy() throws CompilationException {
+        AdmObjectNode mergePolicy = getMergePolicyObject();
+        if (mergePolicy == null) {
+            return null;
+        }
+        IAdmNode mergePolicyName = mergePolicy.get(MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME);
+        if (mergePolicyName == null) {
+            throw new CompilationException(ErrorCode.WITH_FIELD_MUST_CONTAIN_SUB_FIELD,
+                    MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME, MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME);
+        }
+        if (mergePolicyName.getType() != ATypeTag.STRING) {
+            throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE,
+                    MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME + '.'
+                            + MergePolicyUtils.MERGE_POLICY_NAME_PARAMETER_NAME,
+                    ATypeTag.STRING);
+        }
+        return ((AdmStringNode) mergePolicyName).get();
     }
 
-    public Map<String, String> getCompactionPolicyProperties() {
-        return compactionPolicyProperties;
+    private static AdmObjectNode validateWithObject(AdmObjectNode withObject) throws CompilationException {
+        if (withObject == null) {
+            return null;
+        }
+        for (String name : withObject.getFieldNames()) {
+            if (!WITH_OBJECT_FIELDS_SET.contains(name)) {
+                throw new CompilationException(ErrorCode.UNSUPPORTED_WITH_FIELD, name);
+            }
+        }
+        return withObject;
+    }
+
+    private AdmObjectNode getMergePolicyObject() throws CompilationException {
+        if (withObjectNode == null) {
+            return null;
+        }
+        IAdmNode mergePolicy = validateWithObject(withObjectNode).get(MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME);
+        if (mergePolicy == null) {
+            return null;
+        }
+        if (!mergePolicy.isObject()) {
+            throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE,
+                    MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME, ATypeTag.OBJECT);
+        }
+        return (AdmObjectNode) mergePolicy;
+    }
+
+    public Map<String, String> getCompactionPolicyProperties() throws CompilationException {
+        AdmObjectNode mergePolicy = getMergePolicyObject();
+        if (mergePolicy == null) {
+            return null;
+        }
+        IAdmNode mergePolicyParameters = mergePolicy.get(MergePolicyUtils.MERGE_POLICY_PARAMETERS_PARAMETER_NAME);
+        if (mergePolicyParameters == null) {
+            return null;
+        }
+        if (mergePolicyParameters.getType() != ATypeTag.OBJECT) {
+            throw new CompilationException(ErrorCode.WITH_FIELD_MUST_BE_OF_TYPE,
+                    MergePolicyUtils.MERGE_POLICY_PARAMETER_NAME + '.'
+                            + MergePolicyUtils.MERGE_POLICY_PARAMETERS_PARAMETER_NAME,
+                    ATypeTag.OBJECT);
+        }
+        return MergePolicyUtils.toProperties((AdmObjectNode) mergePolicyParameters);
     }
 
     public Map<String, String> getHints() {
@@ -156,4 +231,8 @@
         return Category.DDL;
     }
 
+    public AdmObjectNode getWithObjectNode() {
+        return withObjectNode;
+    }
+
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
index 7bf0db2..52be683 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/DeleteStatement.java
@@ -18,13 +18,14 @@
  */
 package org.apache.asterix.lang.common.statement;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class DeleteStatement implements Statement {
 
@@ -84,10 +85,11 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(condition, datasetName, dataverseName, rewrittenQuery, vars);
+        return Objects.hash(condition, datasetName, dataverseName, rewrittenQuery, vars);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -96,11 +98,10 @@
             return false;
         }
         DeleteStatement target = (DeleteStatement) object;
-        boolean equals =
-                ObjectUtils.equals(condition, target.condition) && ObjectUtils.equals(datasetName, target.datasetName)
-                        && ObjectUtils.equals(dataverseName, target.dataverseName);
-        return equals && ObjectUtils.equals(rewrittenQuery, target.rewrittenQuery)
-                && ObjectUtils.equals(vars, target.vars);
+        return Objects.equals(condition, target.condition) && Objects.equals(datasetName, target.datasetName)
+                && Objects.equals(dataverseName, target.dataverseName)
+                && Objects.equals(rewrittenQuery, target.rewrittenQuery) && Objects.equals(vars, target.vars)
+                && varCounter == target.varCounter;
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ExternalDetailsDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ExternalDetailsDecl.java
index b15579c..db599c4 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ExternalDetailsDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/ExternalDetailsDecl.java
@@ -40,9 +40,4 @@
         return properties;
     }
 
-    @Override
-    public boolean isTemp() {
-        return false;
-    }
-
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IDatasetDetailsDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IDatasetDetailsDecl.java
index da27f17..7f48c32 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IDatasetDetailsDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/IDatasetDetailsDecl.java
@@ -20,6 +20,4 @@
 
 public interface IDatasetDetailsDecl {
 
-    public boolean isTemp();
-
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
index cc72e1c..797f48a 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InsertStatement.java
@@ -20,6 +20,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
@@ -27,8 +28,8 @@
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class InsertStatement implements IReturningStatement {
 
@@ -114,16 +115,27 @@
     }
 
     @Override
+    public List<VarIdentifier> getExternalVars() {
+        return null;
+    }
+
+    @Override
+    public void setExternalVars(List<VarIdentifier> externalVars) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
         return visitor.visit(this, arg);
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(datasetName, dataverseName, query, varCounter, var, returnExpression);
+        return Objects.hash(datasetName, dataverseName, query, varCounter, var, returnExpression);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -132,10 +144,9 @@
             return false;
         }
         InsertStatement target = (InsertStatement) object;
-        return ObjectUtils.equals(datasetName, target.datasetName)
-                && ObjectUtils.equals(dataverseName, target.dataverseName) && ObjectUtils.equals(query, target.query)
-                && ObjectUtils.equals(varCounter, target.varCounter) && ObjectUtils.equals(var, target.var)
-                && ObjectUtils.equals(returnExpression, target.returnExpression);
+        return Objects.equals(datasetName, target.datasetName) && Objects.equals(dataverseName, target.dataverseName)
+                && Objects.equals(query, target.query) && Objects.equals(returnExpression, target.returnExpression)
+                && varCounter == target.varCounter && Objects.equals(var, target.var);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InternalDetailsDecl.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InternalDetailsDecl.java
index 41d97a8..f312ddd 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InternalDetailsDecl.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/InternalDetailsDecl.java
@@ -24,16 +24,14 @@
     private final List<List<String>> partitioningExprs;
     private final List<Integer> keySourceIndicators;
     private final boolean autogenerated;
-    private final boolean temp;
     private final List<String> filterField;
 
     public InternalDetailsDecl(List<List<String>> partitioningExpr, List<Integer> keySourceIndicators,
-            boolean autogenerated, List<String> filterField, boolean temp) {
+            boolean autogenerated, List<String> filterField) {
         this.partitioningExprs = partitioningExpr;
         this.keySourceIndicators = keySourceIndicators;
         this.autogenerated = autogenerated;
         this.filterField = filterField;
-        this.temp = temp;
     }
 
     public List<List<String>> getPartitioningExprs() {
@@ -48,11 +46,6 @@
         return autogenerated;
     }
 
-    @Override
-    public boolean isTemp() {
-        return temp;
-    }
-
     public List<String> getFilterField() {
         return filterField;
     }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
index 7274ae3..db74938 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/Query.java
@@ -20,18 +20,20 @@
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.IReturningStatement;
 import org.apache.asterix.lang.common.base.Statement;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class Query implements IReturningStatement {
     private final boolean explain;
     private boolean topLevel = true;
     private Expression body;
+    private List<VarIdentifier> externalVars;
     private int varCounter;
 
     public Query(boolean explain) {
@@ -39,10 +41,15 @@
     }
 
     public Query(boolean explain, boolean topLevel, Expression body, int varCounter) {
+        this(explain, topLevel, body, varCounter, null);
+    }
+
+    public Query(boolean explain, boolean topLevel, Expression body, int varCounter, List<VarIdentifier> externalVars) {
         this.explain = explain;
         this.topLevel = topLevel;
         this.body = body;
         this.varCounter = varCounter;
+        this.externalVars = externalVars;
     }
 
     @Override
@@ -79,6 +86,16 @@
         return topLevel;
     }
 
+    @Override
+    public List<VarIdentifier> getExternalVars() {
+        return externalVars;
+    }
+
+    @Override
+    public void setExternalVars(List<VarIdentifier> externalVars) {
+        this.externalVars = externalVars;
+    }
+
     public boolean isExplain() {
         return explain;
     }
@@ -95,7 +112,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(body, topLevel, explain);
+        return Objects.hash(body, topLevel, explain, varCounter);
     }
 
     @Override
@@ -107,7 +124,8 @@
             return false;
         }
         Query target = (Query) object;
-        return explain == target.explain && ObjectUtils.equals(body, target.body) && topLevel == target.topLevel;
+        return explain == target.explain && Objects.equals(body, target.body) && topLevel == target.topLevel
+                && varCounter == target.varCounter;
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
index 2f3be71..8f3dbfc 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/statement/UpdateStatement.java
@@ -19,6 +19,7 @@
 package org.apache.asterix.lang.common.statement;
 
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
@@ -26,7 +27,6 @@
 import org.apache.asterix.lang.common.clause.UpdateClause;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class UpdateStatement implements Statement {
 
@@ -70,7 +70,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(condition, target, ucs, vars);
+        return Objects.hash(condition, target, ucs, vars);
     }
 
     @Override
@@ -82,8 +82,8 @@
             return false;
         }
         UpdateStatement update = (UpdateStatement) object;
-        return ObjectUtils.equals(condition, update.condition) && ObjectUtils.equals(target, update.target)
-                && ObjectUtils.equals(ucs, update.ucs) && ObjectUtils.equals(vars, update.vars);
+        return Objects.equals(condition, update.condition) && Objects.equals(target, update.target)
+                && Objects.equals(ucs, update.ucs) && Objects.equals(vars, update.vars);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/OperatorType.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/OperatorType.java
index f00d3ca..e11f169 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/OperatorType.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/OperatorType.java
@@ -18,9 +18,6 @@
  */
 package org.apache.asterix.lang.common.struct;
 
-import java.util.Arrays;
-import java.util.Optional;
-
 public enum OperatorType {
     OR("or"),
     AND("and"),
@@ -47,6 +44,8 @@
     BETWEEN("between"),
     NOT_BETWEEN("not_between");
 
+    private static final OperatorType[] VALUES = values();
+
     private final String symbol;
 
     OperatorType(String s) {
@@ -58,7 +57,12 @@
         return symbol;
     }
 
-    public static Optional<OperatorType> fromSymbol(String symbol) {
-        return Arrays.stream(OperatorType.values()).filter(o -> o.symbol.equals(symbol)).findFirst();
+    public static OperatorType fromSymbol(String symbol) {
+        for (OperatorType opType : VALUES) {
+            if (opType.symbol.equals(symbol)) {
+                return opType;
+            }
+        }
+        return null;
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
index ab8a3f3..af5f814 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/QuantifiedPair.java
@@ -18,9 +18,10 @@
  */
 package org.apache.asterix.lang.common.struct;
 
+import java.util.Objects;
+
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class QuantifiedPair {
     private VariableExpr varExpr;
@@ -53,7 +54,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(expr, varExpr);
+        return Objects.hash(expr, varExpr);
     }
 
     @Override
@@ -62,6 +63,6 @@
             return false;
         }
         QuantifiedPair target = (QuantifiedPair) object;
-        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(varExpr, target.varExpr);
+        return Objects.equals(expr, target.expr) && Objects.equals(varExpr, target.varExpr);
     }
 }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
index ca165ac..587dd1c 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/struct/VarIdentifier.java
@@ -18,18 +18,16 @@
  */
 package org.apache.asterix.lang.common.struct;
 
-import org.apache.commons.lang3.ObjectUtils;
+import java.util.Objects;
 
 public final class VarIdentifier extends Identifier {
     private int id = 0;
-    private boolean namedValueAccess = false;
 
     public VarIdentifier() {
-        super();
     }
 
-    public VarIdentifier(VarIdentifier v){
-        this(v.getValue(), v.getId(), v.namedValueAccess());
+    public VarIdentifier(VarIdentifier v) {
+        this(v.getValue(), v.getId());
     }
 
     public VarIdentifier(String value) {
@@ -37,17 +35,10 @@
     }
 
     public VarIdentifier(String value, int id) {
-        this(value, id, false);
-    }
-
-    private VarIdentifier(String value, int id, boolean namedValueAccess) {
-        super();
         this.value = value;
         this.id = id;
-        this.namedValueAccess = namedValueAccess;
     }
 
-
     public void setId(int id) {
         this.id = id;
     }
@@ -58,22 +49,12 @@
 
     @Override
     public VarIdentifier clone() {
-        VarIdentifier vi = new VarIdentifier(this.value);
-        vi.setId(this.id);
-        return vi;
-    }
-
-    public void setNamedValueAccess(boolean namedValueAccess) {
-        this.namedValueAccess = namedValueAccess;
-    }
-
-    public boolean namedValueAccess() {
-        return namedValueAccess;
+        return new VarIdentifier(value, id);
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(value);
+        return Objects.hash(value);
     }
 
     @Override
@@ -82,7 +63,7 @@
             return false;
         }
         VarIdentifier vid = (VarIdentifier) obj;
-        return ObjectUtils.equals(value, vid.value);
+        return Objects.equals(value, vid.value);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
new file mode 100644
index 0000000..25f9d07
--- /dev/null
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/ExpressionUtils.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.lang.common.util;
+
+import java.util.List;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.Literal;
+import org.apache.asterix.lang.common.expression.FieldBinding;
+import org.apache.asterix.lang.common.expression.ListConstructor;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
+import org.apache.asterix.lang.common.expression.RecordConstructor;
+import org.apache.asterix.lang.common.literal.DoubleLiteral;
+import org.apache.asterix.lang.common.literal.LongIntegerLiteral;
+import org.apache.asterix.lang.common.literal.StringLiteral;
+import org.apache.asterix.object.base.AdmArrayNode;
+import org.apache.asterix.object.base.AdmBigIntNode;
+import org.apache.asterix.object.base.AdmBooleanNode;
+import org.apache.asterix.object.base.AdmDoubleNode;
+import org.apache.asterix.object.base.AdmNullNode;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+
+public class ExpressionUtils {
+    private ExpressionUtils() {
+    }
+
+    public static IAdmNode toNode(Expression expr) throws AlgebricksException {
+        switch (expr.getKind()) {
+            case LIST_CONSTRUCTOR_EXPRESSION:
+                return toNode((ListConstructor) expr);
+            case LITERAL_EXPRESSION:
+                return toNode((LiteralExpr) expr);
+            case RECORD_CONSTRUCTOR_EXPRESSION:
+                return toNode((RecordConstructor) expr);
+            default:
+                throw new CompilationException(ErrorCode.EXPRESSION_NOT_SUPPORTED_IN_CONSTANT_RECORD, expr.getKind());
+        }
+    }
+
+    public static AdmObjectNode toNode(RecordConstructor recordConstructor) throws AlgebricksException {
+        AdmObjectNode node = new AdmObjectNode();
+        final List<FieldBinding> fbList = recordConstructor.getFbList();
+        for (int i = 0; i < fbList.size(); i++) {
+            FieldBinding binding = fbList.get(i);
+            String key = LangRecordParseUtil.exprToStringLiteral(binding.getLeftExpr()).getStringValue();
+            IAdmNode value = ExpressionUtils.toNode(binding.getRightExpr());
+            node.set(key, value);
+        }
+        return node;
+    }
+
+    private static IAdmNode toNode(ListConstructor listConstructor) throws AlgebricksException {
+        final List<Expression> exprList = listConstructor.getExprList();
+        AdmArrayNode array = new AdmArrayNode(exprList.size());
+        for (int i = 0; i < exprList.size(); i++) {
+            array.add(ExpressionUtils.toNode(exprList.get(i)));
+        }
+        return array;
+    }
+
+    private static IAdmNode toNode(LiteralExpr literalExpr) throws AlgebricksException {
+        final Literal value = literalExpr.getValue();
+        final Literal.Type literalType = value.getLiteralType();
+        switch (literalType) {
+            case DOUBLE:
+                return new AdmDoubleNode(((DoubleLiteral) value).getDoubleValue());
+            case FALSE:
+            case TRUE:
+                return AdmBooleanNode.get((Boolean) value.getValue());
+            case LONG:
+                return new AdmBigIntNode(((LongIntegerLiteral) value).getLongValue());
+            case NULL:
+                return AdmNullNode.INSTANCE;
+            case STRING:
+                return new AdmStringNode(((StringLiteral) value).getValue());
+            default:
+                throw new CompilationException(ErrorCode.LITERAL_TYPE_NOT_SUPPORTED_IN_CONSTANT_RECORD, literalType);
+        }
+    }
+}
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
index 8d8ab73..3571dcf 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/FunctionUtil.java
@@ -20,6 +20,7 @@
 package org.apache.asterix.lang.common.util;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -27,12 +28,19 @@
 import org.apache.asterix.common.functions.FunctionConstants;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.IQueryRewriter;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.statement.FunctionDecl;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Function;
+import org.apache.asterix.metadata.utils.DatasetUtil;
 import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
 
@@ -50,7 +58,7 @@
 
     @FunctionalInterface
     public interface IFunctionCollector {
-        Set<FunctionSignature> getFunctionCalls(Expression expression) throws CompilationException;
+        Set<CallExpr> getFunctionCalls(Expression expression) throws CompilationException;
     }
 
     @FunctionalInterface
@@ -64,14 +72,16 @@
     }
 
     /**
-     * Retrieve stored functions (from CREATE FUNCTION statements) that have been used in an expression.
+     * Retrieve stored functions (from CREATE FUNCTION statements) that have been
+     * used in an expression.
      *
      * @param metadataProvider,
      *            the metadata provider
      * @param expression,
      *            the expression for analysis
      * @param declaredFunctions,
-     *            a set of declared functions in the query, which can potentially override stored functions.
+     *            a set of declared functions in the query, which can potentially
+     *            override stored functions.
      * @param functionCollector,
      *            for collecting function calls in the <code>expression</code>
      * @param functionParser,
@@ -84,15 +94,16 @@
             Expression expression, List<FunctionSignature> declaredFunctions, List<FunctionDecl> inputFunctionDecls,
             IFunctionCollector functionCollector, IFunctionParser functionParser,
             IFunctionNormalizer functionNormalizer) throws CompilationException {
-        List<FunctionDecl> functionDecls = inputFunctionDecls == null ? new ArrayList<>()
-                : new ArrayList<>(inputFunctionDecls);
+        List<FunctionDecl> functionDecls =
+                inputFunctionDecls == null ? new ArrayList<>() : new ArrayList<>(inputFunctionDecls);
         if (expression == null) {
             return functionDecls;
         }
         String value = metadataProvider.getConfig().get(FunctionUtil.IMPORT_PRIVATE_FUNCTIONS);
         boolean includePrivateFunctions = (value != null) ? Boolean.valueOf(value.toLowerCase()) : false;
-        Set<FunctionSignature> functionCalls = functionCollector.getFunctionCalls(expression);
-        for (FunctionSignature signature : functionCalls) {
+        Set<CallExpr> functionCalls = functionCollector.getFunctionCalls(expression);
+        for (CallExpr functionCall : functionCalls) {
+            FunctionSignature signature = functionCall.getFunctionSignature();
             if (declaredFunctions != null && declaredFunctions.contains(signature)) {
                 continue;
             }
@@ -101,12 +112,22 @@
             }
             String namespace = signature.getNamespace();
             // Checks the existence of the referred dataverse.
-            if (metadataProvider.findDataverse(namespace) == null
-                    && !namespace.equals(FunctionConstants.ASTERIX_NS)) {
-                throw new CompilationException("In function call \"" + namespace + "." + signature.getName()
-                        + "(...)\", the dataverse \"" + namespace + "\" cannot be found!");
+            try {
+                if (!namespace.equals(FunctionConstants.ASTERIX_NS)
+                        && !namespace.equals(AlgebricksBuiltinFunctions.ALGEBRICKS_NS)
+                        && metadataProvider.findDataverse(namespace) == null) {
+                    throw new CompilationException("In function call \"" + namespace + "." + signature.getName()
+                            + "(...)\", the dataverse \"" + namespace + "\" cannot be found!");
+                }
+            } catch (AlgebricksException e) {
+                throw new CompilationException(e);
             }
-            Function function = lookupUserDefinedFunctionDecl(metadataProvider.getMetadataTxnContext(), signature);
+            Function function;
+            try {
+                function = lookupUserDefinedFunctionDecl(metadataProvider.getMetadataTxnContext(), signature);
+            } catch (AlgebricksException e) {
+                throw new CompilationException(e);
+            }
             if (function == null) {
                 FunctionSignature normalizedSignature = functionNormalizer == null ? signature
                         : functionNormalizer.normalizeBuiltinFunctionSignature(signature);
@@ -141,8 +162,37 @@
         return functionDecls;
     }
 
+    public static List<List<List<String>>> getFunctionDependencies(IQueryRewriter rewriter, Expression expression,
+            MetadataProvider metadataProvider) throws CompilationException {
+        Set<CallExpr> functionCalls = rewriter.getFunctionCalls(expression);
+        //Get the List of used functions and used datasets
+        List<List<String>> datasourceDependencies = new ArrayList<>();
+        List<List<String>> functionDependencies = new ArrayList<>();
+        for (CallExpr functionCall : functionCalls) {
+            FunctionSignature signature = functionCall.getFunctionSignature();
+            FunctionIdentifier fid =
+                    new FunctionIdentifier(signature.getNamespace(), signature.getName(), signature.getArity());
+            if (fid.equals(BuiltinFunctions.DATASET)) {
+                Pair<String, String> path = DatasetUtil.getDatasetInfo(metadataProvider,
+                        ((LiteralExpr) functionCall.getExprList().get(0)).getValue().getStringValue());
+                datasourceDependencies.add(Arrays.asList(path.first, path.second));
+            }
+
+            else if (BuiltinFunctions.isBuiltinCompilerFunction(signature, false)) {
+                continue;
+            } else {
+                functionDependencies.add(Arrays.asList(signature.getNamespace(), signature.getName(),
+                        Integer.toString(signature.getArity())));
+            }
+        }
+        List<List<List<String>>> dependencies = new ArrayList<>();
+        dependencies.add(datasourceDependencies);
+        dependencies.add(functionDependencies);
+        return dependencies;
+    }
+
     private static Function lookupUserDefinedFunctionDecl(MetadataTransactionContext mdTxnCtx,
-            FunctionSignature signature) throws CompilationException {
+            FunctionSignature signature) throws AlgebricksException {
         if (signature.getNamespace() == null) {
             return null;
         }
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
index 080e2c4..c4b23ef 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/LangRecordParseUtil.java
@@ -26,6 +26,7 @@
 
 import org.apache.asterix.builders.OrderedListBuilder;
 import org.apache.asterix.builders.RecordBuilder;
+import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.lang.common.base.Expression;
@@ -56,22 +57,22 @@
 public class LangRecordParseUtil {
     private static final String NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE =
             "JSON record can only have expressions [%1$s, %2$s, %3$s]";
-    private static final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
-    private static final ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
-    private static final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
-    private static final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
-    private static final ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    private static final ISerializerDeserializer<ADouble> doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
+    private static final ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
+    private static final ISerializerDeserializer<AInt64> intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
+    private static final ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    private static final ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     private LangRecordParseUtil() {
     }
 
     private static void parseExpression(Expression expr, ArrayBackedValueStorage serialized)
-            throws HyracksDataException {
+            throws HyracksDataException, CompilationException {
         switch (expr.getKind()) {
             case LITERAL_EXPRESSION:
                 parseLiteral((LiteralExpr) expr, serialized);
@@ -84,14 +85,15 @@
                 break;
             default:
                 throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR,
-                        NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE, new Serializable[] { Expression.Kind.LITERAL_EXPRESSION
-                                .toString(), Expression.Kind.RECORD_CONSTRUCTOR_EXPRESSION.toString(),
+                        NOT_ALLOWED_EXPRESSIONS_ERROR_MESSAGE,
+                        new Serializable[] { Expression.Kind.LITERAL_EXPRESSION.toString(),
+                                Expression.Kind.RECORD_CONSTRUCTOR_EXPRESSION.toString(),
                                 Expression.Kind.LIST_CONSTRUCTOR_EXPRESSION.toString() });
         }
     }
 
     public static void parseRecord(RecordConstructor recordValue, ArrayBackedValueStorage serialized, boolean tagged,
-            List<Pair<String, String>> defaults) throws HyracksDataException {
+            List<Pair<String, String>> defaults) throws HyracksDataException, CompilationException {
         AMutableString fieldNameString = new AMutableString(null);
         ArrayBackedValueStorage fieldName = new ArrayBackedValueStorage();
         ArrayBackedValueStorage fieldValue = new ArrayBackedValueStorage();
@@ -106,8 +108,8 @@
             // get key
             fieldNameString.setValue(exprToStringLiteral(fb.getLeftExpr()).getStringValue());
             if (!fieldNames.add(fieldNameString.getStringValue())) {
-                throw new HyracksDataException("Field " + fieldNameString.getStringValue()
-                        + " was specified multiple times");
+                throw new HyracksDataException(
+                        "Field " + fieldNameString.getStringValue() + " was specified multiple times");
             }
             stringSerde.serialize(fieldNameString, fieldName.getDataOutput());
             // get value
@@ -127,25 +129,25 @@
         recordBuilder.write(serialized.getDataOutput(), tagged);
     }
 
-    public static Literal exprToStringLiteral(Expression expr) throws HyracksDataException {
+    public static Literal exprToStringLiteral(Expression expr) throws CompilationException {
         if (expr.getKind() != Expression.Kind.LITERAL_EXPRESSION) {
-            throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR,
-                    "Expected expression can only be of type %1$s", Expression.Kind.LITERAL_EXPRESSION);
+            throw new CompilationException(ErrorCode.PARSE_ERROR, "Expected expression can only be of type %1$s",
+                    Expression.Kind.LITERAL_EXPRESSION);
         }
         LiteralExpr keyLiteralExpr = (LiteralExpr) expr;
         Literal keyLiteral = keyLiteralExpr.getValue();
         if (keyLiteral.getLiteralType() != Literal.Type.STRING) {
-            throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR,
-                    "Expected Literal can only be of type %1$s", Literal.Type.STRING);
+            throw new CompilationException(ErrorCode.PARSE_ERROR, "Expected Literal can only be of type %1$s",
+                    Literal.Type.STRING);
         }
         return keyLiteral;
     }
 
     private static void parseList(ListConstructor valueExpr, ArrayBackedValueStorage serialized)
-            throws HyracksDataException {
+            throws CompilationException, HyracksDataException {
         if (valueExpr.getType() != ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR) {
-            throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR,
-                    "JSON List can't be of type %1$s", valueExpr.getType());
+            throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "JSON List can't be of type %1$s",
+                    valueExpr.getType());
         }
         ArrayBackedValueStorage serializedValue = new ArrayBackedValueStorage();
         OrderedListBuilder listBuilder = new OrderedListBuilder();
@@ -187,13 +189,12 @@
                 stringSerde.serialize(new AString((String) value.getValue()), serialized.getDataOutput());
                 break;
             default:
-                throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR,
-                        "Unknown Literal Type %1$s", value.getLiteralType());
+                throw new HyracksDataException(ErrorCode.ASTERIX, ErrorCode.PARSE_ERROR, "Unknown Literal Type %1$s",
+                        value.getLiteralType());
         }
     }
 
-    public static void recordToMap(Map<String, String> map, ARecord record)
-            throws AlgebricksException {
+    public static void recordToMap(Map<String, String> map, ARecord record) throws AlgebricksException {
         String[] keys = record.getType().getFieldNames();
         for (int i = 0; i < keys.length; i++) {
             String key = keys[i];
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java
new file mode 100644
index 0000000..6bb5c36
--- /dev/null
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/MergePolicyUtils.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.lang.common.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.object.base.AdmObjectNode;
+import org.apache.asterix.object.base.AdmStringNode;
+import org.apache.asterix.object.base.IAdmNode;
+
+public class MergePolicyUtils {
+    public static final String MERGE_POLICY_PARAMETER_NAME = "merge-policy";
+    public static final String MERGE_POLICY_NAME_PARAMETER_NAME = "name";
+    public static final String MERGE_POLICY_PARAMETERS_PARAMETER_NAME = "parameters";
+
+    private MergePolicyUtils() {
+    }
+
+    /**
+     * Convert the parameters object to a Map<String,String>
+     * This method should go away once we store the with object as it is in storage
+     *
+     * @param parameters
+     *            the parameters passed for the merge policy in the with clause
+     * @return the parameters as a map
+     */
+    public static Map<String, String> toProperties(AdmObjectNode parameters) throws CompilationException {
+        Map<String, String> map = new HashMap<>();
+        for (Entry<String, IAdmNode> field : parameters.getFields()) {
+            IAdmNode value = field.getValue();
+            switch (value.getType()) {
+                case BOOLEAN:
+                case DOUBLE:
+                case BIGINT:
+                    map.put(field.getKey(), value.toString());
+                    break;
+                case STRING:
+                    map.put(field.getKey(), ((AdmStringNode) value).get());
+                    break;
+                default:
+                    throw new CompilationException(ErrorCode.MERGE_POLICY_PARAMETER_INVALID_TYPE, value.getType());
+            }
+        }
+        return map;
+    }
+
+}
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
index 858a8c2..8ae67d6 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
@@ -23,6 +23,7 @@
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Expression.Kind;
@@ -56,6 +57,8 @@
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.common.visitor.base.AbstractQueryExpressionVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
+import org.apache.asterix.metadata.entities.Dataverse;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
 public abstract class AbstractInlineUdfsVisitor extends AbstractQueryExpressionVisitor<Boolean, List<FunctionDecl>> {
@@ -274,7 +277,7 @@
         } else {
             // Rewrite the function body itself (without setting unbounded variables to dataset access).
             // TODO(buyingyi): throw an exception for recursive function definition or limit the stack depth.
-            implem.setFuncBody(rewriteFunctionBody(implem.getFuncBody()));
+            implem.setFuncBody(rewriteFunctionBody(implem));
             // it's one of the functions we want to inline
             List<LetClause> clauses = new ArrayList<>();
             Iterator<VarIdentifier> paramIter = implem.getParamList().iterator();
@@ -321,13 +324,34 @@
         return new Pair<>(changed, newList);
     }
 
-    protected Expression rewriteFunctionBody(Expression expr) throws CompilationException {
+    private Expression rewriteFunctionBody(FunctionDecl fnDecl) throws CompilationException {
         Query wrappedQuery = new Query(false);
-        wrappedQuery.setBody(expr);
+        wrappedQuery.setBody(fnDecl.getFuncBody());
         wrappedQuery.setTopLevel(false);
-        IQueryRewriter queryRewriter = rewriterFactory.createQueryRewriter();
-        queryRewriter.rewrite(declaredFunctions, wrappedQuery, metadataProvider, context);
-        return wrappedQuery.getBody();
+        wrappedQuery.setExternalVars(fnDecl.getParamList());
+
+        String fnNamespace = fnDecl.getSignature().getNamespace();
+        Dataverse defaultDataverse = metadataProvider.getDefaultDataverse();
+
+        Dataverse fnDataverse;
+        if (fnNamespace == null || fnNamespace.equals(defaultDataverse.getDataverseName())) {
+            fnDataverse = defaultDataverse;
+        } else {
+            try {
+                fnDataverse = metadataProvider.findDataverse(fnNamespace);
+            } catch (AlgebricksException e) {
+                throw new CompilationException(ErrorCode.NO_DATAVERSE_WITH_NAME, e, fnNamespace);
+            }
+        }
+
+        metadataProvider.setDefaultDataverse(fnDataverse);
+        try {
+            IQueryRewriter queryRewriter = rewriterFactory.createQueryRewriter();
+            queryRewriter.rewrite(declaredFunctions, wrappedQuery, metadataProvider, context, true);
+            return wrappedQuery.getBody();
+        } finally {
+            metadataProvider.setDefaultDataverse(defaultDataverse);
+        }
     }
 
     protected static FunctionDecl findFuncDeclaration(FunctionSignature fid, List<FunctionDecl> sequence) {
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
index a2e7341..7ba01ce 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
@@ -108,17 +108,13 @@
     private final static String CREATE = "create ";
     private final static String FEED = " feed ";
     private final static String DEFAULT_DATAVERSE_FORMAT = "org.apache.asterix.runtime.formats.NonTaggedDataFormat";
-    private final PrintWriter out;
-    protected Set<Character> validIdentifierChars = new HashSet<Character>();
-    protected Set<Character> validIdentifierStartChars = new HashSet<Character>();
+    protected final PrintWriter out;
+    protected Set<Character> validIdentifierChars = new HashSet<>();
+    protected Set<Character> validIdentifierStartChars = new HashSet<>();
     protected String dataverseSymbol = " dataverse ";
     protected String datasetSymbol = " dataset ";
     protected String assignSymbol = ":=";
 
-    public FormatPrintVisitor() {
-        this(new PrintWriter(System.out));
-    }
-
     public FormatPrintVisitor(PrintWriter out) {
         this.out = out;
         for (char ch = 'a'; ch <= 'z'; ++ch) {
@@ -137,7 +133,7 @@
     }
 
     protected String skip(int step) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < step; i++) {
             sb.append("  ");
         }
@@ -190,9 +186,9 @@
         if (lc.getType().equals(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR)) {
             ordered = true;
         }
-        out.print(ordered == true ? "[" : "{{");
+        out.print(ordered ? "[" : "{{");
         printDelimitedExpressions(lc.getExprList(), COMMA, step + 2);
-        out.print(ordered == true ? "]" : "}}");
+        out.print(ordered ? "]" : "}}");
         return null;
     }
 
@@ -232,7 +228,7 @@
             out.print("(");
             exprList.get(0).accept(this, step + 1);
             for (int i = 1; i < exprList.size(); i++) {
-                OperatorType opType = opList.get(i - 1);;
+                OperatorType opType = opList.get(i - 1);
                 if (i == 1) {
                     printHints(operatorExpr.getHints(), step + 1);
                 }
@@ -365,7 +361,7 @@
     @Override
     public Void visit(FunctionDecl fd, Integer step) throws CompilationException {
         out.print(skip(step) + "declare function " + generateFullName(null, fd.getSignature().getName()) + "(");
-        List<Identifier> parameters = new ArrayList<Identifier>();
+        List<Identifier> parameters = new ArrayList<>();
         parameters.addAll(fd.getParamList());
         printDelimitedIdentifiers(parameters, COMMA);
         out.println(") {");
@@ -472,8 +468,7 @@
     @Override
     public Void visit(DatasetDecl dd, Integer step) throws CompilationException {
         if (dd.getDatasetType() == DatasetType.INTERNAL) {
-            String temp = dd.getDatasetDetailsDecl().isTemp() ? "temporary" : "";
-            out.print(skip(step) + "create " + temp + datasetSymbol + generateFullName(dd.getDataverse(), dd.getName())
+            out.print(skip(step) + "create " + datasetSymbol + generateFullName(dd.getDataverse(), dd.getName())
                     + generateIfNotExists(dd.getIfNotExists()) + "(" + dd.getQualifiedTypeName() + ")"
                     + " primary key ");
             printDelimitedKeys(((InternalDetailsDecl) dd.getDatasetDetailsDecl()).getPartitioningExprs(), ",");
@@ -497,13 +492,6 @@
             out.print(" hints ");
             printProperties(hints);
         }
-        if (dd.getCompactionPolicy() != null) {
-            out.print(" using compaction policy " + revertStringToQuoted(dd.getCompactionPolicy()));
-            Map<String, String> compactionPolicyProperties = dd.getCompactionPolicyProperties();
-            if (compactionPolicyProperties != null && compactionPolicyProperties.size() > 0) {
-                printConfiguration(compactionPolicyProperties);
-            }
-        }
         if (dd.getDatasetType() == DatasetType.INTERNAL) {
             List<String> filterField = ((InternalDetailsDecl) dd.getDatasetDetailsDecl()).getFilterField();
             if (filterField != null && filterField.size() > 0) {
@@ -511,6 +499,10 @@
                 printNestField(filterField);
             }
         }
+        if (dd.getWithObjectNode() != null) {
+            out.print(" with ");
+            out.print(dd.getWithObjectNode().toString());
+        }
         out.println(SEMICOLON);
         out.println();
         return null;
@@ -657,7 +649,7 @@
         out.print(skip(step) + CREATE + " index ");
         out.print(normalize(cis.getIndexName().getValue()) + " ");
         out.print(generateIfNotExists(cis.getIfNotExists()));
-        out.print(" on ");;
+        out.print(" on ");
         out.print(generateFullName(cis.getDataverseName(), cis.getDatasetName()));
 
         out.print(" (");
@@ -762,8 +754,10 @@
         out.print(skip(step) + "create " + FEED);
         out.print(generateFullName(cfs.getDataverseName(), cfs.getFeedName()));
         out.print(generateIfNotExists(cfs.getIfNotExists()));
-        out.print(" using " + cfs.getAdaptorName() + " ");
-        printConfiguration(cfs.getAdaptorConfiguration());
+        if (cfs.getWithObjectNode() != null) {
+            out.print(" with ");
+            out.print(cfs.getWithObjectNode().toString());
+        }
         out.println(SEMICOLON);
         return null;
     }
@@ -827,7 +821,8 @@
     public Void visit(CreateFunctionStatement cfs, Integer step) throws CompilationException {
         out.print(skip(step) + CREATE + " function ");
         out.print(generateIfNotExists(cfs.getIfNotExists()));
-        out.print(this.generateFullName(cfs.getSignature().getNamespace(), cfs.getSignature().getName()));
+        out.print(
+                this.generateFullName(cfs.getFunctionSignature().getNamespace(), cfs.getFunctionSignature().getName()));
         out.print("(");
         printDelimitedStrings(cfs.getParamList(), COMMA);
         out.println(") {");
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
index 8842d86..3d149fb 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
@@ -23,7 +23,6 @@
 import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
@@ -53,11 +52,11 @@
 
 public class GatherFunctionCallsVisitor extends AbstractQueryExpressionVisitor<Void, Void> {
 
-    protected final Set<FunctionSignature> calls = new HashSet<FunctionSignature>();
+    protected final Set<CallExpr> calls = new HashSet<>();
 
     @Override
     public Void visit(CallExpr pf, Void arg) throws CompilationException {
-        calls.add(pf.getFunctionSignature());
+        calls.add(pf);
         for (Expression e : pf.getExprList()) {
             e.accept(this, arg);
         }
@@ -202,7 +201,7 @@
         return null;
     }
 
-    public Set<FunctionSignature> getCalls() {
+    public Set<CallExpr> getCalls() {
         return calls;
     }
 
diff --git a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
index 5e01321..ff55880 100644
--- a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
+++ b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
@@ -65,19 +65,15 @@
 import org.apache.asterix.lang.common.struct.QuantifiedPair;
 import org.apache.asterix.lang.common.visitor.base.AbstractQueryExpressionVisitor;
 
-public class QueryPrintVisitor extends AbstractQueryExpressionVisitor<Void, Integer> {
-    private final PrintWriter out;
+public abstract class QueryPrintVisitor extends AbstractQueryExpressionVisitor<Void, Integer> {
+    protected final PrintWriter out;
 
-    public QueryPrintVisitor() {
-        out = new PrintWriter(System.out);
-    }
-
-    public QueryPrintVisitor(PrintWriter out) {
+    protected QueryPrintVisitor(PrintWriter out) {
         this.out = out;
     }
 
     protected String skip(int step) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < step; i++) {
             sb.append("  ");
         }
@@ -121,7 +117,7 @@
             ordered = true;
         }
 
-        out.println(skip(step) + (ordered == true ? "OrderedListConstructor " : "UnorderedListConstructor ") + "[");
+        out.println(skip(step) + (ordered ? "OrderedListConstructor " : "UnorderedListConstructor ") + "[");
         for (Expression e : lc.getExprList()) {
             e.accept(this, step + 1);
         }
diff --git a/asterixdb/asterix-lang-sqlpp/pom.xml b/asterixdb/asterix-lang-sqlpp/pom.xml
index 451acba..0321437 100644
--- a/asterixdb/asterix-lang-sqlpp/pom.xml
+++ b/asterixdb/asterix-lang-sqlpp/pom.xml
@@ -32,6 +32,9 @@
     </license>
   </licenses>
   <artifactId>asterix-lang-sqlpp</artifactId>
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -49,13 +52,6 @@
               <javaUnicodeEscape>true</javaUnicodeEscape>
             </configuration>
           </execution>
-          <execution>
-            <id>javacc-jjdoc</id>
-            <goals>
-              <goal>jjdoc</goal>
-            </goals>
-            <phase>process-sources</phase>
-          </execution>
         </executions>
       </plugin>
       <plugin>
@@ -109,6 +105,36 @@
       </plugins>
     </pluginManagement>
   </build>
+
+  <profiles>
+    <profile>
+      <id>jjdoc</id>
+      <activation>
+        <property>
+          <name>jjdoc.skip</name>
+          <value>!true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>javacc-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>javacc-jjdoc</id>
+                <goals>
+                  <goal>jjdoc</goal>
+                </goals>
+                <phase>generate-test-sources</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.asterix</groupId>
@@ -125,10 +151,6 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.asterix</groupId>
       <artifactId>asterix-metadata</artifactId>
       <version>${project.version}</version>
@@ -151,5 +173,9 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/AbstractBinaryCorrelateClause.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/AbstractBinaryCorrelateClause.java
index ed5f404..40a5ea5 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/AbstractBinaryCorrelateClause.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/AbstractBinaryCorrelateClause.java
@@ -19,11 +19,12 @@
 
 package org.apache.asterix.lang.sqlpp.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.sqlpp.optype.JoinType;
-import org.apache.commons.lang3.ObjectUtils;
 
 public abstract class AbstractBinaryCorrelateClause implements Clause {
 
@@ -66,7 +67,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(joinType, rightExpr, rightPosVar, rightVar);
+        return Objects.hash(joinType, rightExpr, rightPosVar, rightVar);
     }
 
     @Override
@@ -78,8 +79,8 @@
             return false;
         }
         AbstractBinaryCorrelateClause target = (AbstractBinaryCorrelateClause) object;
-        return ObjectUtils.equals(joinType, target.joinType) && ObjectUtils.equals(rightExpr, target.rightExpr)
-                && ObjectUtils.equals(rightPosVar, target.rightPosVar) && ObjectUtils.equals(rightVar, target.rightVar);
+        return Objects.equals(joinType, target.joinType) && Objects.equals(rightExpr, target.rightExpr)
+                && Objects.equals(rightPosVar, target.rightPosVar) && Objects.equals(rightVar, target.rightVar);
     }
 
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
index e4390d9..6860cfe 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/FromTerm.java
@@ -21,6 +21,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
@@ -28,7 +29,6 @@
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class FromTerm implements Clause {
     private Expression leftExpr;
@@ -91,7 +91,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(correlateClauses, leftExpr, leftVar, posVar);
+        return Objects.hash(correlateClauses, leftExpr, leftVar, posVar);
     }
 
     @Override
@@ -103,8 +103,7 @@
             return false;
         }
         FromTerm target = (FromTerm) object;
-        return ObjectUtils.equals(correlateClauses, target.correlateClauses)
-                && ObjectUtils.equals(leftExpr, target.leftExpr) && ObjectUtils.equals(leftVar, target.leftVar)
-                && ObjectUtils.equals(posVar, target.posVar);
+        return Objects.equals(correlateClauses, target.correlateClauses) && Objects.equals(leftExpr, target.leftExpr)
+                && Objects.equals(leftVar, target.leftVar) && Objects.equals(posVar, target.posVar);
     }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
index 28d447a..caf1056 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/Projection.java
@@ -19,12 +19,13 @@
 
 package org.apache.asterix.lang.sqlpp.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class Projection implements Clause {
 
@@ -85,7 +86,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(expr, exprStar, name, star);
+        return Objects.hash(expr, exprStar, name, star);
     }
 
     @Override
@@ -97,7 +98,7 @@
             return false;
         }
         Projection target = (Projection) object;
-        return ObjectUtils.equals(expr, target.expr) && ObjectUtils.equals(exprStar, target.exprStar)
-                && ObjectUtils.equals(name, target.name) && ObjectUtils.equals(star, target.star);
+        return Objects.equals(expr, target.expr) && Objects.equals(name, target.name) && exprStar == target.exprStar
+                && star == target.star;
     }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
index 155e576..0477b1c 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectBlock.java
@@ -21,6 +21,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
@@ -29,7 +30,6 @@
 import org.apache.asterix.lang.common.clause.WhereClause;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class SelectBlock implements Clause {
 
@@ -125,11 +125,12 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(fromClause, groupbyClause, havingClause, letClauses, letClausesAfterGby,
-                selectClause, whereClause);
+        return Objects.hash(fromClause, groupbyClause, havingClause, letClauses, letClausesAfterGby, selectClause,
+                whereClause);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -138,13 +139,10 @@
             return false;
         }
         SelectBlock target = (SelectBlock) object;
-        boolean equals = ObjectUtils.equals(fromClause, target.fromClause)
-                && ObjectUtils.equals(groupbyClause, target.groupbyClause)
-                && ObjectUtils.equals(havingClause, target.havingClause)
-                && ObjectUtils.equals(letClauses, target.letClauses);
-        return equals && ObjectUtils.equals(letClausesAfterGby, target.letClausesAfterGby)
-                && ObjectUtils.equals(selectClause, target.selectClause)
-                && ObjectUtils.equals(whereClause, target.whereClause);
+        return Objects.equals(fromClause, target.fromClause) && Objects.equals(groupbyClause, target.groupbyClause)
+                && Objects.equals(havingClause, target.havingClause) && Objects.equals(letClauses, target.letClauses)
+                && Objects.equals(letClausesAfterGby, target.letClausesAfterGby)
+                && Objects.equals(selectClause, target.selectClause) && Objects.equals(whereClause, target.whereClause);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
index 0a272f9..e5c3f56 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectClause.java
@@ -19,11 +19,12 @@
 
 package org.apache.asterix.lang.sqlpp.clause;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class SelectClause implements Clause {
 
@@ -75,7 +76,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(distinct, selectElement, selectRegular);
+        return Objects.hash(distinct, selectElement, selectRegular);
     }
 
     @Override
@@ -87,7 +88,7 @@
             return false;
         }
         SelectClause target = (SelectClause) object;
-        return distinct == target.distinct && ObjectUtils.equals(selectElement, target.selectElement)
-                && ObjectUtils.equals(selectRegular, target.selectRegular);
+        return distinct == target.distinct && Objects.equals(selectElement, target.selectElement)
+                && Objects.equals(selectRegular, target.selectRegular);
     }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectSetOperation.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectSetOperation.java
index ee622ea..18d9879 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectSetOperation.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/clause/SelectSetOperation.java
@@ -21,6 +21,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Clause;
@@ -28,7 +29,6 @@
 import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class SelectSetOperation implements Clause {
 
@@ -66,7 +66,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(leftInput, rightInputs);
+        return Objects.hash(leftInput, rightInputs);
     }
 
     @Override
@@ -78,7 +78,7 @@
             return false;
         }
         SelectSetOperation target = (SelectSetOperation) object;
-        return ObjectUtils.equals(leftInput, target.leftInput) && ObjectUtils.equals(rightInputs, target.rightInputs);
+        return Objects.equals(leftInput, target.leftInput) && Objects.equals(rightInputs, target.rightInputs);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/CaseExpression.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/CaseExpression.java
index 05300d1..10cc8f4 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/CaseExpression.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/CaseExpression.java
@@ -21,16 +21,17 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.literal.NullLiteral;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class CaseExpression implements Expression {
+public class CaseExpression extends AbstractExpression {
 
     private Expression conditionExpr;
     private List<Expression> whenExprs = new ArrayList<>();
@@ -110,7 +111,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(conditionExpr, elseExpr, thenExprs, whenExprs);
+        return Objects.hash(conditionExpr, elseExpr, thenExprs, whenExprs);
     }
 
     @Override
@@ -122,8 +123,7 @@
             return false;
         }
         CaseExpression target = (CaseExpression) object;
-        return ObjectUtils.equals(conditionExpr, target.conditionExpr) && ObjectUtils.equals(elseExpr, target.elseExpr)
-                && ObjectUtils.equals(thenExprs, target.thenExprs) && ObjectUtils.equals(thenExprs, thenExprs);
+        return Objects.equals(conditionExpr, target.conditionExpr) && Objects.equals(elseExpr, target.elseExpr)
+                && Objects.equals(thenExprs, target.thenExprs) && Objects.equals(thenExprs, thenExprs);
     }
-
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/IndependentSubquery.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/IndependentSubquery.java
deleted file mode 100644
index 24a6217..0000000
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/IndependentSubquery.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.lang.sqlpp.expression;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
-import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-
-public class IndependentSubquery implements Expression {
-
-    private Expression expr;
-
-    public IndependentSubquery(Expression enclosedExpr) {
-        this.expr = enclosedExpr;
-    }
-
-    @Override
-    public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws CompilationException {
-        return ((ISqlppVisitor<R, T>) visitor).visit(this, arg);
-    }
-
-    @Override
-    public Kind getKind() {
-        return Kind.INDEPENDENT_SUBQUERY;
-    }
-
-    public void setExpr(Expression expr) {
-        this.expr = expr;
-    }
-
-    public Expression getExpr() {
-        return this.expr;
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(expr);
-    }
-
-    @Override
-    public int hashCode() {
-        return expr.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        if (this == object) {
-            return true;
-        }
-        if (!(object instanceof IndependentSubquery)) {
-            return false;
-        }
-        IndependentSubquery target = (IndependentSubquery) object;
-        return this.expr.equals(target.getExpr());
-    }
-}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
index 0fb687a..62b8734 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/expression/SelectExpression.java
@@ -20,18 +20,18 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.AbstractExpression;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.clause.LimitClause;
 import org.apache.asterix.lang.common.clause.OrderbyClause;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
-public class SelectExpression implements Expression {
+public class SelectExpression extends AbstractExpression {
 
     private List<LetClause> letList = new ArrayList<>();
     private SelectSetOperation selectSetOperation;
@@ -98,10 +98,11 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(letList, limitClause, orderbyClause, selectSetOperation, subquery);
+        return Objects.hash(letList, limitClause, orderbyClause, selectSetOperation, subquery);
     }
 
     @Override
+    @SuppressWarnings("squid:S1067") // expressions should not be too complex
     public boolean equals(Object object) {
         if (this == object) {
             return true;
@@ -110,11 +111,9 @@
             return false;
         }
         SelectExpression target = (SelectExpression) object;
-        boolean equals =
-                ObjectUtils.equals(letList, target.letList) && ObjectUtils.equals(limitClause, target.limitClause)
-                        && ObjectUtils.equals(orderbyClause, target.orderbyClause)
-                        && ObjectUtils.equals(selectSetOperation, target.selectSetOperation);
-        return equals && subquery == target.subquery;
+        return Objects.equals(letList, target.letList) && Objects.equals(limitClause, target.limitClause)
+                && Objects.equals(orderbyClause, target.orderbyClause) && subquery == target.subquery
+                && Objects.equals(selectSetOperation, target.selectSetOperation);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
index fbf64f7..7858e58 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppFunctionBodyRewriter.java
@@ -30,8 +30,8 @@
 
     @Override
     public void rewrite(List<FunctionDecl> declaredFunctions, IReturningStatement topStatement,
-            MetadataProvider metadataProvider,
-            LangRewritingContext context) throws CompilationException {
+            MetadataProvider metadataProvider, LangRewritingContext context, boolean inlineUdfs)
+            throws CompilationException {
         // Sets up parameters.
         setup(declaredFunctions, topStatement, metadataProvider, context);
 
@@ -44,26 +44,25 @@
         // Substitutes group-by key expressions.
         substituteGroupbyKeyExpression();
 
-        // Rewrites SQL-92 global aggregations.
-        rewriteGlobalAggregations();
-
-        // Group-by core/sugar rewrites.
+        // Group-by core rewrites
         rewriteGroupBys();
 
         // Rewrites set operations.
         rewriteSetOperations();
 
+        // Generate ids for variables (considering scopes) and replace global variable access with the dataset function.
+        variableCheckAndRewrite();
+
+        // Rewrites SQL-92 global aggregations.
+        rewriteGroupByAggregationSugar();
+
         // Rewrites like/not-like expressions.
         rewriteOperatorExpression();
 
         // Rewrites several variable-arg functions into their corresponding internal list-input functions.
         rewriteListInputFunctions();
 
-        // Generates ids for variables (considering scopes) but DOES NOT replace unbounded variable access with the dataset function.
-        // An unbounded variable within a function could be a bounded variable in the top-level query.
-        variableCheckAndRewrite(false);
-
         // Inlines functions recursively.
-        inlineDeclaredUdfs();
+        inlineDeclaredUdfs(inlineUdfs);
     }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
index 60ccea6..befa5ab 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/SqlppQueryRewriter.java
@@ -28,6 +28,7 @@
 import org.apache.asterix.lang.common.base.IQueryRewriter;
 import org.apache.asterix.lang.common.base.IReturningStatement;
 import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.statement.FunctionDecl;
 import org.apache.asterix.lang.common.util.FunctionUtil;
@@ -46,7 +47,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.parser.FunctionParser;
 import org.apache.asterix.lang.sqlpp.parser.SqlppParserFactory;
@@ -57,7 +57,7 @@
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SetOperationVisitor;
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppBuiltinFunctionRewriteVisitor;
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppDistinctAggregationSugarVisitor;
-import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGlobalAggregationSugarVisitor;
+import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByAggregationSugarVisitor;
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupByVisitor;
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppInlineUdfsVisitor;
 import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppListInputFunctionRewriteVisitor;
@@ -87,12 +87,11 @@
 
     @Override
     public void rewrite(List<FunctionDecl> declaredFunctions, IReturningStatement topStatement,
-            MetadataProvider metadataProvider, LangRewritingContext context) throws CompilationException {
+            MetadataProvider metadataProvider, LangRewritingContext context, boolean inlineUdfs)
+            throws CompilationException {
         if (topStatement == null) {
             return;
         }
-        // Marks the current variable counter.
-        context.markCounter();
 
         // Sets up parameters.
         setup(declaredFunctions, topStatement, metadataProvider, context);
@@ -106,21 +105,21 @@
         // Substitutes group-by key expressions.
         substituteGroupbyKeyExpression();
 
-        // Rewrites SQL-92 global aggregations.
-        rewriteGlobalAggregations();
-
-        // Group-by core/sugar rewrites.
+        // Group-by core rewrites
         rewriteGroupBys();
 
         // Rewrites set operations.
         rewriteSetOperations();
 
+        // Generate ids for variables (considering scopes) and replace global variable access with the dataset function.
+        variableCheckAndRewrite();
+
+        // Rewrites SQL-92 aggregate functions
+        rewriteGroupByAggregationSugar();
+
         // Rewrites like/not-like expressions.
         rewriteOperatorExpression();
 
-        // Generate ids for variables (considering scopes) and replace global variable access with the dataset function.
-        variableCheckAndRewrite(true);
-
         // Inlines WITH expressions after variableCheckAndRewrite(...) so that the variable scoping for WITH
         // expression is correct.
         inlineWithExpressions();
@@ -129,7 +128,7 @@
         rewriteListInputFunctions();
 
         // Inlines functions.
-        inlineDeclaredUdfs();
+        inlineDeclaredUdfs(inlineUdfs);
 
         // Rewrites function names.
         // This should be done after inlineDeclaredUdfs() because user-defined function
@@ -139,21 +138,13 @@
         // Rewrites distinct aggregates into regular aggregates
         rewriteDistinctAggregations();
 
-        // Resets the variable counter to the previous marked value.
-        // Therefore, the variable ids in the final query plans will not be perturbed
-        // by the additon or removal of intermediate AST rewrites.
-        context.resetCounter();
-
-        // Replace global variable access with the dataset function for inlined expressions.
-        variableCheckAndRewrite(true);
-
         // Sets the var counter of the query.
         topStatement.setVarCounter(context.getVarCounter());
     }
 
-    protected void rewriteGlobalAggregations() throws CompilationException {
-        SqlppGlobalAggregationSugarVisitor globalAggregationVisitor = new SqlppGlobalAggregationSugarVisitor();
-        topExpr.accept(globalAggregationVisitor, null);
+    protected void rewriteGroupByAggregationSugar() throws CompilationException {
+        SqlppGroupByAggregationSugarVisitor visitor = new SqlppGroupByAggregationSugarVisitor(context);
+        topExpr.accept(visitor, null);
     }
 
     protected void rewriteDistinctAggregations() throws CompilationException {
@@ -213,9 +204,9 @@
         topExpr.accept(inlineColumnAliasVisitor, null);
     }
 
-    protected void variableCheckAndRewrite(boolean overwrite) throws CompilationException {
+    protected void variableCheckAndRewrite() throws CompilationException {
         VariableCheckAndRewriteVisitor variableCheckAndRewriteVisitor =
-                new VariableCheckAndRewriteVisitor(context, overwrite, metadataProvider);
+                new VariableCheckAndRewriteVisitor(context, metadataProvider, topExpr.getExternalVars());
         topExpr.accept(variableCheckAndRewriteVisitor, null);
     }
 
@@ -224,7 +215,7 @@
         topExpr.accept(groupByVisitor, null);
     }
 
-    protected void inlineDeclaredUdfs() throws CompilationException {
+    protected void inlineDeclaredUdfs(boolean inlineUdfs) throws CompilationException {
         List<FunctionSignature> funIds = new ArrayList<FunctionSignature>();
         for (FunctionDecl fdecl : declaredFunctions) {
             funIds.add(fdecl.getSignature());
@@ -237,7 +228,7 @@
                     signature -> FunctionMapUtil.normalizeBuiltinFunctionSignature(signature, false)));
         }
         declaredFunctions.addAll(usedStoredFunctionDecls);
-        if (!declaredFunctions.isEmpty()) {
+        if (inlineUdfs && !declaredFunctions.isEmpty()) {
             SqlppInlineUdfsVisitor visitor = new SqlppInlineUdfsVisitor(context,
                     new SqlppFunctionBodyRewriterFactory() /* the rewriter for function bodies expressions*/,
                     declaredFunctions, metadataProvider);
@@ -248,7 +239,8 @@
         declaredFunctions.removeAll(usedStoredFunctionDecls);
     }
 
-    private Set<FunctionSignature> getFunctionCalls(Expression expression) throws CompilationException {
+    @Override
+    public Set<CallExpr> getFunctionCalls(Expression expression) throws CompilationException {
         GatherFunctionCalls gfc = new GatherFunctionCalls();
         expression.accept(gfc, null);
         return gfc.getCalls();
@@ -384,12 +376,6 @@
         }
 
         @Override
-        public Void visit(IndependentSubquery independentSubquery, Void arg) throws CompilationException {
-            independentSubquery.getExpr().accept(this, arg);
-            return null;
-        }
-
-        @Override
         public Void visit(CaseExpression caseExpression, Void arg) throws CompilationException {
             caseExpression.getConditionExpr().accept(this, arg);
             for (Expression expr : caseExpression.getWhenExprs()) {
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
index 628bf57..270b366 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineColumnAliasVisitor.java
@@ -28,7 +28,6 @@
 import org.apache.asterix.lang.common.base.Expression.Kind;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.base.Literal;
-import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.FieldBinding;
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
@@ -45,6 +44,11 @@
 import org.apache.asterix.lang.sqlpp.visitor.SqlppSubstituteExpressionVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
 
+/**
+ * Syntactic sugar rewriting: inlines column aliases defines in SELECT clause into ORDER BY and LIMIT clauses. <br/>
+ * Note: column aliases are not cosidered new variables, but they can be referenced from ORDER BY and LIMIT clauses
+ *       because of this rewriting (like in SQL)
+ */
 public class InlineColumnAliasVisitor extends AbstractSqlppExpressionScopingVisitor {
 
     public InlineColumnAliasVisitor(LangRewritingContext context) {
@@ -67,18 +71,6 @@
         // Creates a substitution visitor.
         SqlppSubstituteExpressionVisitor visitor = new SqlppSubstituteExpressionVisitor(context, map);
 
-        // Rewrites GROUP BY/LET/HAVING clauses.
-        if (selectBlock.hasGroupbyClause()) {
-            selectBlock.getGroupbyClause().accept(visitor, arg);
-        }
-        if (selectBlock.hasLetClausesAfterGroupby()) {
-            for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
-                letClause.accept(visitor, arg);
-            }
-        }
-        if (selectBlock.hasHavingClause()) {
-            selectBlock.getHavingClause().accept(visitor, arg);
-        }
         SelectExpression selectExpression = (SelectExpression) arg;
 
         // For SET operation queries, column aliases will not substitute ORDER BY nor LIMIT expressions.
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineWithExpressionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineWithExpressionVisitor.java
index 54ef5ab..ebb7b10 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineWithExpressionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/InlineWithExpressionVisitor.java
@@ -66,8 +66,8 @@
             }
 
             // Inlines WITH expressions into the select expression.
-            SelectExpression newSelectExpression = (SelectExpression) substituteExpression(selectExpression,
-                    varExprMap, context);
+            SelectExpression newSelectExpression =
+                    (SelectExpression) substituteExpression(selectExpression, varExprMap, context);
 
             // Continues to visit the rewritten select expression.
             return super.visit(newSelectExpression, arg);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
index aa337e3..7e228f4 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/OperatorExpressionVisitor.java
@@ -24,6 +24,7 @@
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.functions.FunctionConstants;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
@@ -35,13 +36,13 @@
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.common.struct.QuantifiedPair;
+import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
 
 public class OperatorExpressionVisitor extends AbstractSqlppExpressionScopingVisitor {
 
-    private static final String CONCAT = "concat";
-
     public OperatorExpressionVisitor(LangRewritingContext context) {
         super(context);
     }
@@ -55,7 +56,7 @@
         operatorExpr.setExprList(newExprList);
         OperatorType opType = operatorExpr.getOpList().get(0);
         switch (opType) {
-        // There can only be one LIKE/NOT_LIKE/IN/NOT_IN in an operator expression (according to the grammar).
+            // There can only be one LIKE/NOT_LIKE/IN/NOT_IN in an operator expression (according to the grammar).
             case LIKE:
             case NOT_LIKE:
                 return processLikeOperator(operatorExpr, opType);
@@ -75,12 +76,17 @@
     }
 
     private Expression processLikeOperator(OperatorExpr operatorExpr, OperatorType opType) {
-        Expression likeExpr = new CallExpr(new FunctionSignature(null, "like", 2), operatorExpr.getExprList());
-        if (opType == OperatorType.LIKE) {
-            return likeExpr;
+        Expression likeExpr =
+                new CallExpr(new FunctionSignature(BuiltinFunctions.STRING_LIKE), operatorExpr.getExprList());
+        switch (opType) {
+            case LIKE:
+                return likeExpr;
+            case NOT_LIKE:
+                return new CallExpr(new FunctionSignature(BuiltinFunctions.NOT),
+                        new ArrayList<>(Collections.singletonList(likeExpr)));
+            default:
+                throw new IllegalArgumentException(String.valueOf(opType));
         }
-        return new CallExpr(new FunctionSignature(null, "not", 1),
- new ArrayList<>(Collections.singletonList(likeExpr)));
     }
 
     private Expression processInOperator(OperatorExpr operatorExpr, OperatorType opType) throws CompilationException {
@@ -92,19 +98,22 @@
         comparison.addOperand(bindingVar);
         comparison.setCurrentop(true);
         if (opType == OperatorType.IN) {
-            comparison.addOperator("=");
-            return new QuantifiedExpression(Quantifier.SOME, new ArrayList<>(
-                    Collections.singletonList(new QuantifiedPair(bindingVar, collectionExpr))), comparison);
+            comparison.addOperator(OperatorType.EQ);
+            return new QuantifiedExpression(Quantifier.SOME,
+                    new ArrayList<>(Collections.singletonList(new QuantifiedPair(bindingVar, collectionExpr))),
+                    comparison);
         } else {
-            comparison.addOperator("!=");
-            return new QuantifiedExpression(Quantifier.EVERY, new ArrayList<>(
-                    Collections.singletonList(new QuantifiedPair(bindingVar, collectionExpr))), comparison);
+            comparison.addOperator(OperatorType.NEQ);
+            return new QuantifiedExpression(Quantifier.EVERY,
+                    new ArrayList<>(Collections.singletonList(new QuantifiedPair(bindingVar, collectionExpr))),
+                    comparison);
         }
     }
 
     private Expression processConcatOperator(OperatorExpr operatorExpr) {
         // All operators have to be "||"s (according to the grammar).
-        return new CallExpr(new FunctionSignature(null, CONCAT, 1), operatorExpr.getExprList());
+        return new CallExpr(new FunctionSignature(FunctionConstants.ASTERIX_NS, FunctionMapUtil.CONCAT, 1),
+                operatorExpr.getExprList());
     }
 
     private Expression processBetweenOperator(OperatorExpr operatorExpr, OperatorType opType)
@@ -121,9 +130,9 @@
         OperatorExpr andExpr = new OperatorExpr();
         andExpr.addOperand(leftComparison);
         andExpr.addOperand(rightComparison);
-        andExpr.addOperator("and");
-        return opType == OperatorType.BETWEEN ? andExpr :
-                new CallExpr(new FunctionSignature(null, "not", 1),
+        andExpr.addOperator(OperatorType.AND);
+        return opType == OperatorType.BETWEEN ? andExpr
+                : new CallExpr(new FunctionSignature(BuiltinFunctions.NOT),
                         new ArrayList<>(Collections.singletonList(andExpr)));
     }
 
@@ -132,7 +141,7 @@
         OperatorExpr comparison = new OperatorExpr();
         comparison.addOperand(lhs);
         comparison.addOperand(rhs);
-        comparison.addOperator("<=");
+        comparison.addOperator(OperatorType.LE);
         if (hints != null) {
             for (IExpressionAnnotation hint : hints) {
                 comparison.addHint(hint);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppBuiltinFunctionRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppBuiltinFunctionRewriteVisitor.java
index f168ebd..8d59a3b 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppBuiltinFunctionRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppBuiltinFunctionRewriteVisitor.java
@@ -29,12 +29,12 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.literal.TrueLiteral;
+import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
 import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
-import org.apache.asterix.metadata.utils.MetadataConstants;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 
 public class SqlppBuiltinFunctionRewriteVisitor extends AbstractSqlppSimpleExpressionVisitor {
 
@@ -63,8 +63,7 @@
             return newCaseExpr;
         }
         // If the CASE expression does not contain a subquery, we rewrite it to a switch-case function call.
-        FunctionSignature functionSignature = new FunctionSignature(MetadataConstants.METADATA_DATAVERSE_NAME,
-                "switch-case", FunctionIdentifier.VARARGS);
+        FunctionSignature functionSignature = new FunctionSignature(BuiltinFunctions.SWITCH_CASE);
         List<Expression> whenExprList = newCaseExpr.getWhenExprs();
         List<Expression> thenExprList = newCaseExpr.getThenExprs();
         List<Expression> newExprList = new ArrayList<>();
@@ -90,7 +89,7 @@
             OperatorExpr operatorExpr = new OperatorExpr();
             operatorExpr.addOperand((Expression) SqlppRewriteUtil.deepCopy(expr));
             operatorExpr.addOperand(caseExpr.getConditionExpr());
-            operatorExpr.addOperator("=");
+            operatorExpr.addOperator(OperatorType.EQ);
             normalizedWhenExprs.add(operatorExpr);
         }
         return new CaseExpression(trueLiteral, normalizedWhenExprs, caseExpr.getThenExprs(), caseExpr.getElseExpr());
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
index c56bb9d..fd50c8e 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppDistinctAggregationSugarVisitor.java
@@ -72,8 +72,7 @@
             Expression newExpr = rewriteArgument(expr);
             newExprList.add(newExpr.accept(this, arg));
         }
-        callExpr.setFunctionSignature(
-                new FunctionSignature(newAggFn.getNamespace(), newAggFn.getName(), newAggFn.getArity()));
+        callExpr.setFunctionSignature(new FunctionSignature(newAggFn));
         callExpr.setExprList(newExprList);
         return callExpr;
     }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGlobalAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGlobalAggregationSugarVisitor.java
deleted file mode 100644
index 16ae05c..0000000
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGlobalAggregationSugarVisitor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.lang.sqlpp.rewrites.visitor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.clause.GroupbyClause;
-import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectClause;
-import org.apache.asterix.lang.sqlpp.visitor.CheckSql92AggregateVisitor;
-import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
-
-public class SqlppGlobalAggregationSugarVisitor extends AbstractSqlppSimpleExpressionVisitor {
-
-    @Override
-    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
-        SelectClause selectClause = selectBlock.getSelectClause();
-        if (!selectBlock.hasGroupbyClause() && selectBlock.hasFromClause()) {
-            boolean addImplicitGby;
-            if (selectClause.selectRegular()) {
-                addImplicitGby = isSql92Aggregate(selectClause.getSelectRegular(), selectBlock);
-            } else {
-                addImplicitGby = isSql92Aggregate(selectClause.getSelectElement(), selectBlock);
-            }
-            if (addImplicitGby) {
-                // Adds an implicit group-by clause for SQL-92 global aggregate.
-                List<GbyVariableExpressionPair> gbyPairList = new ArrayList<>();
-                List<GbyVariableExpressionPair> decorPairList = new ArrayList<>();
-                GroupbyClause gbyClause = new GroupbyClause(gbyPairList, decorPairList, new HashMap<>(), null, null,
-                        false, true);
-                selectBlock.setGroupbyClause(gbyClause);
-            }
-        }
-        return super.visit(selectBlock, arg);
-    }
-
-    private boolean isSql92Aggregate(ILangExpression expr, SelectBlock selectBlock) throws CompilationException {
-        CheckSql92AggregateVisitor visitor = new CheckSql92AggregateVisitor();
-        return expr.accept(visitor, selectBlock);
-    }
-}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java
new file mode 100644
index 0000000..c5f0a54
--- /dev/null
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByAggregationSugarVisitor.java
@@ -0,0 +1,302 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.lang.sqlpp.rewrites.visitor;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.functions.FunctionSignature;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.base.ILangExpression;
+import org.apache.asterix.lang.common.clause.GroupbyClause;
+import org.apache.asterix.lang.common.clause.LetClause;
+import org.apache.asterix.lang.common.clause.LimitClause;
+import org.apache.asterix.lang.common.clause.OrderbyClause;
+import org.apache.asterix.lang.common.expression.CallExpr;
+import org.apache.asterix.lang.common.expression.FieldAccessor;
+import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
+import org.apache.asterix.lang.common.expression.VariableExpr;
+import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
+import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.sqlpp.clause.FromClause;
+import org.apache.asterix.lang.sqlpp.clause.FromTerm;
+import org.apache.asterix.lang.sqlpp.clause.HavingClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
+import org.apache.asterix.lang.sqlpp.clause.SelectClause;
+import org.apache.asterix.lang.sqlpp.clause.SelectElement;
+import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
+import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
+import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
+import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
+import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
+import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An AST pre-processor to rewrite group-by sugar queries, which does the following transformations:
+ * 1. Rewrite the argument expression of an aggregation function into a subquery
+ * 2. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 1.
+ * <p>
+ * <p>
+ * For example, this visitor turns the following query:
+ * <pre>
+ * FROM Employee e
+ * JOIN Incentive i ON e.job_category = i.job_category
+ * JOIN SuperStars s ON e.id = s.id
+ * GROUP BY e.department_id AS deptId
+ * GROUP AS eis(e AS e, i AS i, s AS s)
+ * SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost;
+ * </pre>
+ * into the following core-version query:
+ * <pre>
+ * FROM Employee e
+ * JOIN Incentive i ON e.job_category = i.job_category
+ * JOIN SuperStars s ON e.id = s.id
+ * GROUP BY e.department_id AS deptId
+ * GROUP AS eis(e AS e, i AS i, s AS s)
+ * SELECT ELEMENT {
+ *          'deptId': deptId,
+ *          'star_cost': array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
+ * };
+ * </pre>
+ * where <code>SUM(e.salary + i.bonus)</code>
+ * is turned into <code>array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )</code>
+ */
+public class SqlppGroupByAggregationSugarVisitor extends AbstractSqlppExpressionScopingVisitor {
+
+    public SqlppGroupByAggregationSugarVisitor(LangRewritingContext context) {
+        super(context);
+    }
+
+    @Override
+    public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        // Traverses the select block in the order of "from", "let"s, "where",
+        // "group by", "let"s, "having" and "select".
+        FromClause fromClause = selectBlock.getFromClause();
+        if (selectBlock.hasFromClause()) {
+            fromClause.accept(this, arg);
+        }
+        if (selectBlock.hasLetClauses()) {
+            List<LetClause> letList = selectBlock.getLetList();
+            for (LetClause letClause : letList) {
+                letClause.accept(this, arg);
+            }
+        }
+        if (selectBlock.hasWhereClause()) {
+            selectBlock.getWhereClause().accept(this, arg);
+        }
+        if (selectBlock.hasGroupbyClause()) {
+            Set<VariableExpr> visibleVarsPreGroupByScope = scopeChecker.getCurrentScope().getLiveVariables();
+
+            GroupbyClause groupbyClause = selectBlock.getGroupbyClause();
+            groupbyClause.accept(this, arg);
+            Collection<VariableExpr> visibleVarsInCurrentScope = SqlppVariableUtil.getBindingVariables(groupbyClause);
+
+            VariableExpr groupVar = groupbyClause.getGroupVar();
+            Map<Expression, Identifier> groupFieldVars = getGroupFieldVariables(groupbyClause);
+
+            Collection<VariableExpr> freeVariablesInGbyLets = new HashSet<>();
+            if (selectBlock.hasLetClausesAfterGroupby()) {
+                List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
+                for (LetClause letClauseAfterGby : letListAfterGby) {
+                    letClauseAfterGby.accept(this, arg);
+                    // Rewrites each let clause after the group-by.
+                    rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, letClauseAfterGby,
+                            visibleVarsPreGroupByScope);
+                    Collection<VariableExpr> freeVariablesInLet =
+                            SqlppVariableUtil.getFreeVariables(letClauseAfterGby.getBindingExpr());
+                    freeVariablesInLet.removeAll(visibleVarsInCurrentScope);
+                    freeVariablesInGbyLets.addAll(freeVariablesInLet);
+                    visibleVarsInCurrentScope.add(letClauseAfterGby.getVarExpr());
+                }
+            }
+
+            Collection<VariableExpr> freeVariables = new HashSet<>();
+            if (selectBlock.hasHavingClause()) {
+                // Rewrites the having clause.
+                HavingClause havingClause = selectBlock.getHavingClause();
+                havingClause.accept(this, arg);
+                rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, havingClause, visibleVarsPreGroupByScope);
+                freeVariables.addAll(SqlppVariableUtil.getFreeVariables(havingClause));
+            }
+
+            SelectExpression parentSelectExpression = (SelectExpression) arg;
+            // We cannot rewrite ORDER BY and LIMIT if it's a SET operation query.
+            if (!parentSelectExpression.getSelectSetOperation().hasRightInputs()) {
+                if (parentSelectExpression.hasOrderby()) {
+                    // Rewrites the ORDER BY clause.
+                    OrderbyClause orderbyClause = parentSelectExpression.getOrderbyClause();
+                    orderbyClause.accept(this, arg);
+                    rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, orderbyClause,
+                            visibleVarsPreGroupByScope);
+                    freeVariables.addAll(SqlppVariableUtil.getFreeVariables(orderbyClause));
+                }
+                if (parentSelectExpression.hasLimit()) {
+                    // Rewrites the LIMIT clause.
+                    LimitClause limitClause = parentSelectExpression.getLimitClause();
+                    limitClause.accept(this, arg);
+                    rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, limitClause,
+                            visibleVarsPreGroupByScope);
+                    freeVariables.addAll(SqlppVariableUtil.getFreeVariables(limitClause));
+                }
+            }
+
+            // Visits the select clause.
+            SelectClause selectClause = selectBlock.getSelectClause();
+            selectClause.accept(this, arg);
+            // Rewrites the select clause.
+            rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, selectClause, visibleVarsPreGroupByScope);
+            freeVariables.addAll(SqlppVariableUtil.getFreeVariables(selectClause));
+            freeVariables.removeAll(visibleVarsInCurrentScope);
+
+            // Gets the final free variables.
+            freeVariables.addAll(freeVariablesInGbyLets);
+
+            // Gets outer scope variables.
+            Collection<VariableExpr> decorVars = scopeChecker.getCurrentScope().getLiveVariables();
+            decorVars.removeAll(visibleVarsInCurrentScope);
+
+            // Only retains used free variables.
+            if (!decorVars.containsAll(freeVariables)) {
+                throw new IllegalStateException(decorVars + ":" + freeVariables);
+            }
+            decorVars.retainAll(freeVariables);
+
+            if (!decorVars.isEmpty()) {
+                // Adds necessary decoration variables for the GROUP BY.
+                // NOTE: we need to include outer binding variables so as they can be evaluated before
+                // the GROUP BY instead of being inlined as part of nested pipepline. The current optimzier
+                // is not able to optimize the latter case. The following query is such an example:
+                // asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-11
+                List<GbyVariableExpressionPair> decorList = new ArrayList<>();
+                for (VariableExpr var : decorVars) {
+                    decorList.add(new GbyVariableExpressionPair((VariableExpr) SqlppRewriteUtil.deepCopy(var),
+                            (Expression) SqlppRewriteUtil.deepCopy(var)));
+                }
+                groupbyClause.getDecorPairList().addAll(decorList);
+            }
+        } else {
+            selectBlock.getSelectClause().accept(this, arg);
+        }
+        return null;
+    }
+
+    private Map<Expression, Identifier> getGroupFieldVariables(GroupbyClause groupbyClause) {
+        Map<Expression, Identifier> fieldVars = new HashMap<>();
+        for (Pair<Expression, Identifier> groupField : groupbyClause.getGroupFieldList()) {
+            fieldVars.put(groupField.first, groupField.second);
+        }
+        return fieldVars;
+    }
+
+    // Applying sugar rewriting for group-by.
+    private void rewriteExpressionUsingGroupVariable(VariableExpr groupVar, Map<Expression, Identifier> fieldVars,
+            ILangExpression expr, Set<VariableExpr> outerScopeVariables) throws CompilationException {
+        Sql92AggregateFunctionVisitor visitor =
+                new Sql92AggregateFunctionVisitor(groupVar, fieldVars, outerScopeVariables);
+        expr.accept(visitor, null);
+    }
+
+    private final class Sql92AggregateFunctionVisitor extends AbstractSqlppSimpleExpressionVisitor {
+
+        private final Expression groupVar;
+
+        private final Map<Expression, Identifier> fieldVars;
+
+        private final Collection<VariableExpr> outerVars;
+
+        private Sql92AggregateFunctionVisitor(Expression groupVar, Map<Expression, Identifier> fieldVars,
+                Collection<VariableExpr> outerVars) {
+            this.groupVar = groupVar;
+            this.fieldVars = fieldVars;
+            this.outerVars = outerVars;
+        }
+
+        @Override
+        public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+            List<Expression> newExprList = new ArrayList<>();
+            FunctionSignature signature = callExpr.getFunctionSignature();
+            boolean aggregate = FunctionMapUtil.isSql92AggregateFunction(signature);
+            boolean rewritten = false;
+            for (Expression expr : callExpr.getExprList()) {
+                Expression newExpr = aggregate ? wrapAggregationArgument(expr) : expr;
+                rewritten |= newExpr != expr;
+                newExprList.add(newExpr.accept(this, arg));
+            }
+            if (rewritten) {
+                // Rewrites the SQL-92 function name to core functions,
+                // e.g., SUM --> array_sum
+                callExpr.setFunctionSignature(FunctionMapUtil.sql92ToCoreAggregateFunction(signature));
+            }
+            callExpr.setExprList(newExprList);
+            return callExpr;
+        }
+
+        private Expression wrapAggregationArgument(Expression argExpr) throws CompilationException {
+            Expression expr = argExpr;
+            Set<VariableExpr> freeVars = SqlppRewriteUtil.getFreeVariable(expr);
+
+            VariableExpr fromBindingVar = new VariableExpr(context.newVariable());
+            FromTerm fromTerm = new FromTerm(groupVar, fromBindingVar, null, null);
+            FromClause fromClause = new FromClause(Collections.singletonList(fromTerm));
+
+            // Maps field variable expressions to field accesses.
+            Map<Expression, Expression> varExprMap = new HashMap<>();
+            for (VariableExpr usedVar : freeVars) {
+                // Reference to a field in the group variable.
+                if (fieldVars.containsKey(usedVar)) {
+                    // Rewrites to a reference to a field in the group variable.
+                    varExprMap.put(usedVar,
+                            new FieldAccessor(fromBindingVar, new VarIdentifier(fieldVars.get(usedVar).getValue())));
+                } else if (outerVars.contains(usedVar)) {
+                    // Do nothing
+                } else if (fieldVars.size() == 1) {
+                    // Rewrites to a reference to a single field in the group variable.
+                    varExprMap.put(usedVar,
+                            new FieldAccessor(new FieldAccessor(fromBindingVar, fieldVars.values().iterator().next()),
+                                    SqlppVariableUtil.toUserDefinedVariableName(usedVar.getVar())));
+                } else {
+                    throw new CompilationException("Cannot resolve alias reference for undefined identifier "
+                            + usedVar.getVar().getValue() + " in " + fieldVars);
+                }
+            }
+
+            // Select clause.
+            SelectElement selectElement =
+                    new SelectElement(SqlppRewriteUtil.substituteExpression(expr, varExprMap, context));
+            SelectClause selectClause = new SelectClause(selectElement, null, false);
+
+            // Construct the select expression.
+            SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null, null, null);
+            SelectSetOperation selectSetOperation =
+                    new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
+            return new SelectExpression(null, selectSetOperation, null, null, true);
+        }
+    }
+}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
deleted file mode 100644
index b7604ab..0000000
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupBySugarVisitor.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.lang.sqlpp.rewrites.visitor;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.lang.common.base.Expression;
-import org.apache.asterix.lang.common.base.ILangExpression;
-import org.apache.asterix.lang.common.expression.CallExpr;
-import org.apache.asterix.lang.common.expression.FieldAccessor;
-import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
-import org.apache.asterix.lang.sqlpp.clause.FromClause;
-import org.apache.asterix.lang.sqlpp.clause.FromTerm;
-import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
-import org.apache.asterix.lang.sqlpp.clause.SelectClause;
-import org.apache.asterix.lang.sqlpp.clause.SelectElement;
-import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
-import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
-import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
-import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
-
-/**
- * An AST pre-processor to rewrite group-by sugar queries, which does the following transformations:
- * 1. Rewrite the argument expression of an aggregation function into a subquery if the argument
- * expression is not a subquery;
- * 2. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 1.
- */
-
-// For example, this visitor turns the following query
-//
-// FROM Employee e
-// JOIN Incentive i ON e.job_category = i.job_category
-// JOIN SuperStars s ON e.id = s.id
-// GROUP BY e.department_id AS deptId
-// GROUP AS eis(e AS e, i AS i, s AS s)
-// SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost;
-//
-// into the following core-version query:
-//
-// FROM Employee e
-// JOIN Incentive i ON e.job_category = i.job_category
-// JOIN SuperStars s ON e.id = s.id
-// GROUP BY e.department_id AS deptId
-// GROUP AS eis(e AS e, i AS i, s AS s)
-// SELECT ELEMENT {
-//          'deptId': deptId,
-//          'star_cost': array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
-// };
-//
-// where SUM(e.salary + i.bonus) is turned into array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
-
-public class SqlppGroupBySugarVisitor extends AbstractSqlppExpressionScopingVisitor {
-
-    private final Expression groupVar;
-    private final Collection<VariableExpr> fieldVars;
-
-    public SqlppGroupBySugarVisitor(LangRewritingContext context, Expression groupVar,
-            Collection<VariableExpr> fieldVars) {
-        super(context);
-        this.groupVar = groupVar;
-        this.fieldVars = fieldVars;
-    }
-
-    @Override
-    public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
-        List<Expression> newExprList = new ArrayList<>();
-        FunctionSignature signature = callExpr.getFunctionSignature();
-        boolean aggregate = FunctionMapUtil.isSql92AggregateFunction(signature);
-        boolean rewritten = false;
-        for (Expression expr : callExpr.getExprList()) {
-            Expression newExpr = aggregate ? wrapAggregationArgument(expr) : expr;
-            rewritten |= newExpr != expr;
-            newExprList.add(newExpr.accept(this, arg));
-        }
-        if (rewritten) {
-            // Rewrites the SQL-92 function name to core functions,
-            // e.g., SUM --> array_sum
-            callExpr.setFunctionSignature(FunctionMapUtil.sql92ToCoreAggregateFunction(signature));
-        }
-        callExpr.setExprList(newExprList);
-        return callExpr;
-    }
-
-    private Expression wrapAggregationArgument(Expression argExpr) throws CompilationException {
-        Expression expr = argExpr;
-        Set<VariableExpr> freeVars = SqlppRewriteUtil.getFreeVariable(expr);
-
-        VariableExpr fromBindingVar = new VariableExpr(context.newVariable());
-        FromTerm fromTerm = new FromTerm(groupVar, fromBindingVar, null, null);
-        FromClause fromClause = new FromClause(Collections.singletonList(fromTerm));
-
-        // Maps field variable expressions to field accesses.
-        Map<Expression, Expression> varExprMap = new HashMap<>();
-        for (VariableExpr usedVar : freeVars) {
-            // Reference to a field in the group variable.
-            if (fieldVars.contains(usedVar)) {
-                // Rewrites to a reference to a field in the group variable.
-                varExprMap.put(usedVar, new FieldAccessor(fromBindingVar,
-                        SqlppVariableUtil.toUserDefinedVariableName(usedVar.getVar())));
-            }
-        }
-
-        // Select clause.
-        SelectElement selectElement =
-                new SelectElement(SqlppRewriteUtil.substituteExpression(expr, varExprMap, context));
-        SelectClause selectClause = new SelectClause(selectElement, null, false);
-
-        // Construct the select expression.
-        SelectBlock selectBlock = new SelectBlock(selectClause, fromClause, null, null, null, null, null);
-        SelectSetOperation selectSetOperation = new SelectSetOperation(new SetOperationInput(selectBlock, null), null);
-        return new SelectExpression(null, selectSetOperation, null, null, true);
-    }
-}
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
index dfe371e..bee5830 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppGroupByVisitor.java
@@ -18,254 +18,119 @@
  */
 package org.apache.asterix.lang.sqlpp.rewrites.visitor;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
-import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.clause.LimitClause;
-import org.apache.asterix.lang.common.clause.OrderbyClause;
 import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.struct.Identifier;
-import org.apache.asterix.lang.common.struct.VarIdentifier;
-import org.apache.asterix.lang.sqlpp.clause.FromClause;
-import org.apache.asterix.lang.sqlpp.clause.HavingClause;
 import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
 import org.apache.asterix.lang.sqlpp.clause.SelectClause;
-import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
-import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
+import org.apache.asterix.lang.sqlpp.visitor.CheckSql92AggregateVisitor;
+import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppSimpleExpressionVisitor;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 
-/**
- * A pre-processor that adds the group variable as well as its group field
- * list into the AST. It will also invoke SQL group-by aggregation sugar rewritings.
- */
-// This visitor rewrites non-core SQL++ group-by queries into their SQL++ core version
-// queries. For example, for the non-core query in
-// asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01/sugar-01.3.query.sqlpp,
-//
-// FROM Employee e
-// JOIN Incentive i ON e.job_category = i.job_category
-// JOIN SuperStars s ON e.id = s.id
-// GROUP BY e.department_id AS deptId
-// SELECT deptId as deptId, SUM(e.salary + i.bonus) AS star_cost;
-//
-// this visitor transforms it into the core version in
-// asterix-app/src/test/resources/runtimets/queries_sqlpp/group-by/sugar-01/sugar-01.3.query.sqlpp,
-//
-// FROM Employee e
-// JOIN Incentive i ON e.job_category = i.job_category
-// JOIN SuperStars s ON e.id = s.id
-// GROUP BY e.department_id AS deptId
-// GROUP AS eis(e AS e, i AS i, s AS s)
-// SELECT ELEMENT {
-//  'deptId': deptId,
-//  'star_cost': array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) )
-// };
-/**
- * The transformation include three things:
- * 1. Add a group variable as well as its definition, e.g., GROUP AS eis(e AS e, i AS i, s AS s);
- * 2. Rewrite the argument expression of an aggregation function into a subquery if the argument
- * expression is not a subquery;
- * 3. Turn a SQL-92 aggregate function into a SQL++ core aggregate function when performing 2, e.g.,
- * SUM(e.salary + i.bonus) becomes
- * array_sum( (FROM eis AS p SELECT ELEMENT p.e.salary + p.i.bonus) ).
- */
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
 
-public class SqlppGroupByVisitor extends AbstractSqlppExpressionScopingVisitor {
+/**
+ * A pre-processor that
+ * <ul>
+ *     <li>adds the group variable as well as its group field
+ *         list into the AST. e.g., GROUP AS eis(e AS e, i AS i, s AS s)</li>
+ *     <li>adds group by clause if select block contains SQL-92 agregate function but there's no group by clause</li>
+ * </ul>
+ */
+public class SqlppGroupByVisitor extends AbstractSqlppSimpleExpressionVisitor {
+
+    private final LangRewritingContext context;
 
     public SqlppGroupByVisitor(LangRewritingContext context) {
-        super(context);
+        this.context = context;
     }
 
     @Override
     public Expression visit(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
-        // Traverses the select block in the order of "from", "let"s, "where",
-        // "group by", "let"s, "having" and "select".
-        FromClause fromClause = selectBlock.getFromClause();
         if (selectBlock.hasFromClause()) {
-            fromClause.accept(this, arg);
-        }
-        if (selectBlock.hasLetClauses()) {
-            List<LetClause> letList = selectBlock.getLetList();
-            for (LetClause letClause : letList) {
-                letClause.accept(this, arg);
-            }
-        }
-        if (selectBlock.hasWhereClause()) {
-            selectBlock.getWhereClause().accept(this, arg);
-        }
-        if (selectBlock.hasGroupbyClause()) {
-            GroupbyClause groupbyClause = selectBlock.getGroupbyClause();
-            groupbyClause.accept(this, fromClause);
-            Collection<VariableExpr> visibleVarsInCurrentScope = SqlppVariableUtil.getBindingVariables(groupbyClause);
-
-            VariableExpr groupVar = groupbyClause.getGroupVar();
-            Set<VariableExpr> groupFieldVars = getGroupFieldVariables(groupbyClause);
-
-            Collection<VariableExpr> freeVariablesInGbyLets = new HashSet<>();
-            if (selectBlock.hasLetClausesAfterGroupby()) {
-                List<LetClause> letListAfterGby = selectBlock.getLetListAfterGroupby();
-                for (LetClause letClauseAfterGby : letListAfterGby) {
-                    letClauseAfterGby.accept(this, arg);
-                    // Rewrites each let clause after the group-by.
-                    SqlppRewriteUtil.rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, letClauseAfterGby,
-                            context);
-                    Collection<VariableExpr> freeVariablesInLet = SqlppVariableUtil.getFreeVariables(letClauseAfterGby
-                            .getBindingExpr());
-                    freeVariablesInLet.removeAll(visibleVarsInCurrentScope);
-                    freeVariablesInGbyLets.addAll(freeVariablesInLet);
-                    visibleVarsInCurrentScope.add(letClauseAfterGby.getVarExpr());
-                }
-            }
-
-            Collection<VariableExpr> freeVariables = new HashSet<>();
-            if (selectBlock.hasHavingClause()) {
-                // Rewrites the having clause.
-                HavingClause havingClause = selectBlock.getHavingClause();
-                havingClause.accept(this, arg);
-                SqlppRewriteUtil.rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, havingClause, context);
-                freeVariables.addAll(SqlppVariableUtil.getFreeVariables(havingClause));
-            }
-
-            SelectExpression parentSelectExpression = (SelectExpression) arg;
-            // We cannot rewrite ORDER BY and LIMIT if it's a SET operation query.
-            if (!parentSelectExpression.getSelectSetOperation().hasRightInputs()) {
-                if (parentSelectExpression.hasOrderby()) {
-                    // Rewrites the ORDER BY clause.
-                    OrderbyClause orderbyClause = parentSelectExpression.getOrderbyClause();
-                    orderbyClause.accept(this, arg);
-                    SqlppRewriteUtil.rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, orderbyClause,
-                            context);
-                    freeVariables.addAll(SqlppVariableUtil.getFreeVariables(orderbyClause));
-                }
-                if (parentSelectExpression.hasLimit()) {
-                    // Rewrites the LIMIT clause.
-                    LimitClause limitClause = parentSelectExpression.getLimitClause();
-                    limitClause.accept(this, arg);
-                    SqlppRewriteUtil
-                            .rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, limitClause, context);
-                    freeVariables.addAll(SqlppVariableUtil.getFreeVariables(limitClause));
-                }
-            }
-
-            // Visits the select clause.
-            SelectClause selectClause = selectBlock.getSelectClause();
-            selectClause.accept(this, arg);
-            // Rewrites the select clause.
-            SqlppRewriteUtil.rewriteExpressionUsingGroupVariable(groupVar, groupFieldVars, selectClause, context);
-            freeVariables.addAll(SqlppVariableUtil.getFreeVariables(selectClause));
-            freeVariables.removeAll(visibleVarsInCurrentScope);
-
-            // Gets the final free variables.
-            freeVariables.addAll(freeVariablesInGbyLets);
-
-            // Gets outer scope variables.
-            Collection<VariableExpr> decorVars = SqlppVariableUtil.getLiveVariables(
-                    scopeChecker.getCurrentScope(), true);
-            decorVars.removeAll(visibleVarsInCurrentScope);
-
-            // Need path resolution or not?
-            boolean needResolution = !decorVars.containsAll(freeVariables);
-            // If path resolution is needed, we need to include all outer scope variables in the decoration list.
-            // Otherwise, we only need to retain used free variables.
-            if (needResolution) {
-                // Tracks used variables, including WITH variables.
-                decorVars.retainAll(freeVariables);
-                // Adds all outer scope variables, for path resolution.
-                Collection<VariableExpr> visibleOuterScopeNonWithVars = SqlppVariableUtil.getLiveVariables(
-                        scopeChecker.getCurrentScope(), false);
-                visibleOuterScopeNonWithVars.removeAll(visibleVarsInCurrentScope);
-                decorVars.addAll(visibleOuterScopeNonWithVars);
+            if (selectBlock.hasGroupbyClause()) {
+                rewriteSelectWithGroupBy(selectBlock, arg);
             } else {
-                // Only retains used free variables.
-                decorVars.retainAll(freeVariables);
+                rewriteSelectWithoutGroupBy(selectBlock);
             }
-            if (!decorVars.isEmpty()) {
-                // Adds used WITH variables.
-                Collection<VariableExpr> visibleOuterScopeNonWithVars = SqlppVariableUtil.getLiveVariables(
-                        scopeChecker.getCurrentScope(), false);
-                visibleOuterScopeNonWithVars.retainAll(freeVariables);
-                decorVars.addAll(visibleOuterScopeNonWithVars);
-
-                // Adds necessary decoration variables for the GROUP BY.
-                // NOTE: we need to include WITH binding variables so as they can be evaluated before
-                // the GROUP BY instead of being inlined as part of nested pipepline. The current optimzier
-                // is not able to optimize the latter case. The following query is such an example:
-                // asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/dapd/q2-11
-                List<GbyVariableExpressionPair> decorList = new ArrayList<>();
-                for (VariableExpr var : decorVars) {
-                    decorList.add(new GbyVariableExpressionPair((VariableExpr) SqlppRewriteUtil.deepCopy(var),
-                            (Expression) SqlppRewriteUtil.deepCopy(var)));
-                }
-                groupbyClause.getDecorPairList().addAll(decorList);
-            }
-        } else {
-            selectBlock.getSelectClause().accept(this, arg);
         }
-        return null;
+        return super.visit(selectBlock, arg);
     }
 
-    @Override
-    public Expression visit(GroupbyClause gc, ILangExpression arg) throws CompilationException {
-        FromClause fromClause = (FromClause) arg;
-        Collection<VariableExpr> fromBindingVars =
-                fromClause == null ? new ArrayList<>() : SqlppVariableUtil.getBindingVariables(fromClause);
+    private void rewriteSelectWithGroupBy(SelectBlock selectBlock, ILangExpression arg) throws CompilationException {
+        GroupbyClause gbyClause = selectBlock.getGroupbyClause();
+
+        // Sets the group variable.
+        if (!gbyClause.hasGroupVar()) {
+            VariableExpr groupVar = new VariableExpr(context.newVariable());
+            gbyClause.setGroupVar(groupVar);
+        }
+
         // Sets the field list for the group variable.
-        List<Pair<Expression, Identifier>> groupFieldList = new ArrayList<>();
-        if (!gc.hasGroupFieldList()) {
-            for (VariableExpr varExpr : fromBindingVars) {
-                Pair<Expression, Identifier> varIdPair = new Pair<>(new VariableExpr(varExpr.getVar()),
-                        SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar()));
-                groupFieldList.add(varIdPair);
-            }
-            gc.setGroupFieldList(groupFieldList);
-        } else {
-            for (Pair<Expression, Identifier> groupField : gc.getGroupFieldList()) {
+        List<Pair<Expression, Identifier>> groupFieldList;
+        if (gbyClause.hasGroupFieldList()) {
+            groupFieldList = new ArrayList<>();
+            for (Pair<Expression, Identifier> groupField : gbyClause.getGroupFieldList()) {
                 Expression newFieldExpr = groupField.first.accept(this, arg);
                 groupFieldList.add(new Pair<>(newFieldExpr, groupField.second));
             }
+        } else {
+            groupFieldList = createGroupFieldList(selectBlock);
         }
-
-        gc.setGroupFieldList(groupFieldList);
-
-        // Sets the group variable.
-        if (!gc.hasGroupVar()) {
-            VariableExpr groupVar = new VariableExpr(context.newVariable());
-            gc.setGroupVar(groupVar);
-        }
-
-        // Adds the group variable into the "with" (i.e., re-binding) variable list.
-        VariableExpr gbyVarRef = new VariableExpr(gc.getGroupVar().getVar());
-        gbyVarRef.setIsNewVar(false);
-        Map<Expression, VariableExpr> withVarMap = new HashMap<>();
-        withVarMap.put(gbyVarRef, (VariableExpr) SqlppRewriteUtil.deepCopy(gbyVarRef));
-        gc.setWithVarMap(withVarMap);
-
-        // Call super.visit(...) to scope variables.
-        return super.visit(gc, arg);
+        gbyClause.setGroupFieldList(groupFieldList);
     }
 
-    private Set<VariableExpr> getGroupFieldVariables(GroupbyClause groupbyClause) {
-        Set<VariableExpr> fieldVars = new HashSet<>();
-        if (groupbyClause.hasGroupFieldList()) {
-            for (Pair<Expression, Identifier> groupField : groupbyClause.getGroupFieldList()) {
-                fieldVars.add(new VariableExpr(new VarIdentifier(SqlppVariableUtil
-                        .toInternalVariableName(groupField.second.getValue()))));
-            }
+    private void rewriteSelectWithoutGroupBy(SelectBlock selectBlock) throws CompilationException {
+        if (hasSql92Aggregate(selectBlock)) {
+            // Adds an implicit group-by clause for SQL-92 global aggregate.
+            List<GbyVariableExpressionPair> gbyPairList = new ArrayList<>();
+            List<GbyVariableExpressionPair> decorPairList = new ArrayList<>();
+            VariableExpr groupVar = new VariableExpr(context.newVariable());
+            List<Pair<Expression, Identifier>> groupFieldList = createGroupFieldList(selectBlock);
+            GroupbyClause gbyClause = new GroupbyClause(gbyPairList, decorPairList, new HashMap<>(), groupVar,
+                    groupFieldList, false, true);
+            selectBlock.setGroupbyClause(gbyClause);
         }
-        return fieldVars;
+    }
+
+    private boolean hasSql92Aggregate(SelectBlock selectBlock) throws CompilationException {
+        SelectClause selectClause = selectBlock.getSelectClause();
+        if (selectClause.selectRegular()) {
+            return isSql92Aggregate(selectClause.getSelectRegular(), selectBlock);
+        } else if (selectClause.selectElement()) {
+            return isSql92Aggregate(selectClause.getSelectElement(), selectBlock);
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+
+    private boolean isSql92Aggregate(ILangExpression expr, SelectBlock selectBlock) throws CompilationException {
+        CheckSql92AggregateVisitor visitor = new CheckSql92AggregateVisitor();
+        return expr.accept(visitor, selectBlock);
+    }
+
+    private List<Pair<Expression, Identifier>> createGroupFieldList(SelectBlock selectBlock) {
+        List<Pair<Expression, Identifier>> groupFieldList = new ArrayList<>();
+        addToGroupFieldList(groupFieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getFromClause()));
+        addToGroupFieldList(groupFieldList, SqlppVariableUtil.getBindingVariables(selectBlock.getLetList()));
+        return groupFieldList;
+    }
+
+    private void addToGroupFieldList(List<Pair<Expression, Identifier>> groupFieldList,
+            Collection<VariableExpr> fromBindingVars) {
+        for (VariableExpr varExpr : fromBindingVars) {
+            Pair<Expression, Identifier> varIdPair = new Pair<>(new VariableExpr(varExpr.getVar()),
+                    SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar()));
+            groupFieldList.add(varIdPair);
+        }
     }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
index 640b9b08..d1d95ac 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SqlppInlineUdfsVisitor.java
@@ -43,7 +43,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.util.SqlppRewriteUtil;
@@ -226,14 +225,6 @@
     }
 
     @Override
-    public Boolean visit(IndependentSubquery independentSubquery, List<FunctionDecl> funcs)
-            throws CompilationException {
-        Pair<Boolean, Expression> p = inlineUdfsInExpr(independentSubquery.getExpr(), funcs);
-        independentSubquery.setExpr(p.second);
-        return p.first;
-    }
-
-    @Override
     public Boolean visit(CaseExpression caseExpr, List<FunctionDecl> funcs) throws CompilationException {
         Pair<Boolean, Expression> result = inlineUdfsInExpr(caseExpr.getConditionExpr(), funcs);
         caseExpr.setConditionExpr(result.second);
@@ -257,8 +248,7 @@
         Map<Expression, Expression> varExprMap = new HashMap<>();
         for (LetClause lc : letClauses) {
             // inline let variables one by one iteratively.
-            lc.setBindingExpr(SqlppRewriteUtil.substituteExpression(lc.getBindingExpr(),
-                    varExprMap, context));
+            lc.setBindingExpr(SqlppRewriteUtil.substituteExpression(lc.getBindingExpr(), varExprMap, context));
             varExprMap.put(lc.getVarExpr(), lc.getBindingExpr());
         }
         return varExprMap;
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
index 6d4816b..f157f4f 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/SubstituteGroupbyExpressionWithVariableVisitor.java
@@ -60,8 +60,8 @@
             SubstituteGroupbyExpressionVisitor visitor = new SubstituteGroupbyExpressionVisitor(context, map);
 
             // Rewrites LET/HAVING/SELECT clauses.
-            if(selectBlock.hasLetClausesAfterGroupby()){
-                for(LetClause letClause : selectBlock.getLetListAfterGroupby()){
+            if (selectBlock.hasLetClausesAfterGroupby()) {
+                for (LetClause letClause : selectBlock.getLetListAfterGroupby()) {
                     letClause.accept(this, arg);
                 }
             }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
index c271365..04f8bc6 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/rewrites/visitor/VariableCheckAndRewriteVisitor.java
@@ -35,32 +35,27 @@
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
+import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
 import org.apache.asterix.lang.sqlpp.visitor.CheckDatasetOnlyResolutionVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppExpressionScopingVisitor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.metadata.utils.MetadataConstants;
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 public class VariableCheckAndRewriteVisitor extends AbstractSqlppExpressionScopingVisitor {
 
-    protected final FunctionSignature datasetFunction =
-            new FunctionSignature(MetadataConstants.METADATA_DATAVERSE_NAME, "dataset", 1);
-    protected final boolean overwrite;
+    private static final FunctionSignature FN_DATASET = new FunctionSignature(BuiltinFunctions.DATASET);
+
     protected final MetadataProvider metadataProvider;
 
     /**
-     * @param context,
-     *            manages ids of variables and guarantees uniqueness of variables.
-     * @param overwrite,
-     *            whether rewrite unbounded variables to dataset function calls.
-     *            This flag can only be true for rewriting a top-level query.
-     *            It should be false for rewriting the body expression of a user-defined function.
+     * @param context, manages ids of variables and guarantees uniqueness of variables.
      */
-    public VariableCheckAndRewriteVisitor(LangRewritingContext context, boolean overwrite,
-            MetadataProvider metadataProvider) {
-        super(context);
-        this.overwrite = overwrite;
+    public VariableCheckAndRewriteVisitor(LangRewritingContext context, MetadataProvider metadataProvider,
+            List<VarIdentifier> externalVars) {
+        super(context, externalVars);
         this.metadataProvider = metadataProvider;
     }
 
@@ -74,12 +69,12 @@
             VariableExpr varExpr = (VariableExpr) leadingExpr;
             String lastIdentifier = fa.getIdent().getValue();
             Expression resolvedExpr = resolve(varExpr,
-                    /** Resolves within the dataverse that has the same name as the variable name. */
+                    /* Resolves within the dataverse that has the same name as the variable name. */
                     SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar().getValue()).getValue(), lastIdentifier,
                     fa, parent);
             if (resolvedExpr.getKind() == Kind.CALL_EXPRESSION) {
                 CallExpr callExpr = (CallExpr) resolvedExpr;
-                if (callExpr.getFunctionSignature().equals(datasetFunction)) {
+                if (callExpr.getFunctionSignature().equals(FN_DATASET)) {
                     // The field access is resolved to be a dataset access in the form of "dataverse.dataset".
                     return resolvedExpr;
                 }
@@ -91,36 +86,69 @@
 
     @Override
     public Expression visit(VariableExpr varExpr, ILangExpression parent) throws CompilationException {
-        return resolve(varExpr, null /** Resolves within the default dataverse. */
-                , SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar().getValue()).getValue(), varExpr, parent);
+        return resolve(varExpr, metadataProvider.getDefaultDataverseName(),
+                SqlppVariableUtil.toUserDefinedVariableName(varExpr.getVar().getValue()).getValue(), varExpr, parent);
     }
 
     // Resolve a variable expression with dataverse name and dataset name.
     private Expression resolve(VariableExpr varExpr, String dataverseName, String datasetName,
-            Expression originalExprWithUndefinedIdentifier, ILangExpression parent)
-            throws CompilationException {
+            Expression originalExprWithUndefinedIdentifier, ILangExpression parent) throws CompilationException {
+
         String varName = varExpr.getVar().getValue();
-        checkError(varName);
-        if (!rewriteNeeded(varExpr)) {
+
+        VarIdentifier var = lookupVariable(varName);
+        if (var != null) {
+            // Exists such an identifier
+            varExpr.setIsNewVar(false);
+            varExpr.setVar(var);
             return varExpr;
         }
-        // Note: WITH variables are not used for path resolution. The reason is that
-        // the accurate typing for ordered list with an UNION item type is not implemented.
-        // We currently type it as [ANY]. If we include WITH variables for path resolution,
-        // it will lead to ambiguities and the plan is going to be very complex.  An example query is:
-        // asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/subquery/exists
-        Set<VariableExpr> liveVars = SqlppVariableUtil.getLiveVariables(scopeChecker.getCurrentScope(), false);
-        boolean resolveToDatasetOnly = resolveToDatasetOnly(originalExprWithUndefinedIdentifier, parent);
-        boolean resolveAsDataset = datasetExists(dataverseName, datasetName);
 
+        boolean resolveToDatasetOnly = resolveToDatasetOnly(originalExprWithUndefinedIdentifier, parent);
         if (resolveToDatasetOnly) {
-            if (resolveAsDataset) {
-                return wrapWithDatasetFunction(dataverseName, datasetName);
-            } else {
-                throwUnresolvableError(dataverseName, datasetName);
-            }
+            return resolveAsDataset(dataverseName, datasetName);
         }
-        return wrapWithResolveFunction(varExpr, liveVars);
+
+        Set<VariableExpr> localVars = scopeChecker.getCurrentScope().getLiveVariables(scopeChecker.getPrecedingScope());
+        switch (localVars.size()) {
+            case 0:
+                return resolveAsDataset(dataverseName, datasetName);
+            case 1:
+                return resolveAsFieldAccess(localVars.iterator().next(),
+                        SqlppVariableUtil.toUserDefinedVariableName(varName).getValue());
+            default:
+                // More than one possibilities.
+                throw new CompilationException("Cannot resolve ambiguous alias reference for undefined identifier "
+                        + SqlppVariableUtil.toUserDefinedVariableName(varName).getValue() + " in " + localVars);
+        }
+    }
+
+    private VarIdentifier lookupVariable(String varName) throws CompilationException {
+        if (scopeChecker.isInForbiddenScopes(varName)) {
+            throw new CompilationException(
+                    "Inside limit clauses, it is disallowed to reference a variable having the same name"
+                            + " as any variable bound in the same scope as the limit clause.");
+        }
+        Identifier ident = scopeChecker.lookupSymbol(varName);
+        return ident != null ? (VarIdentifier) ident : null;
+    }
+
+    private Expression resolveAsDataset(String dataverseName, String datasetName) throws CompilationException {
+        if (!datasetExists(dataverseName, datasetName)) {
+            throwUnresolvableError(dataverseName, datasetName);
+        }
+        String fullyQualifiedName = dataverseName == null ? datasetName : dataverseName + "." + datasetName;
+        List<Expression> argList = new ArrayList<>(1);
+        argList.add(new LiteralExpr(new StringLiteral(fullyQualifiedName)));
+        return new CallExpr(new FunctionSignature(BuiltinFunctions.DATASET), argList);
+    }
+
+    // Rewrites for an field access by name
+    private Expression resolveAsFieldAccess(VariableExpr var, String fieldName) throws CompilationException {
+        List<Expression> argList = new ArrayList<>(2);
+        argList.add(var);
+        argList.add(new LiteralExpr(new StringLiteral(fieldName)));
+        return new CallExpr(new FunctionSignature(BuiltinFunctions.FIELD_ACCESS_BY_NAME), argList);
     }
 
     private void throwUnresolvableError(String dataverseName, String datasetName) throws CompilationException {
@@ -135,16 +163,6 @@
                 + datasetName + "!");
     }
 
-    // Checks whether we need to error the variable reference, e.g., the variable is referred
-    // in a LIMIT clause.
-    private void checkError(String varName) throws CompilationException {
-        if (scopeChecker.isInForbiddenScopes(varName)) {
-            throw new CompilationException(
-                    "Inside limit clauses, it is disallowed to reference a variable having the same name"
-                            + " as any variable bound in the same scope as the limit clause.");
-        }
-    }
-
     // For a From/Join/UNNEST/Quantifiers binding expression, we resolve the undefined identifier reference as
     // a dataset access only.
     private boolean resolveToDatasetOnly(Expression originalExpressionWithUndefinedIdentifier, ILangExpression parent)
@@ -153,51 +171,29 @@
         return parent.accept(visitor, originalExpressionWithUndefinedIdentifier);
     }
 
-    // Whether a rewrite is needed for a variable reference expression.
-    private boolean rewriteNeeded(VariableExpr varExpr) throws CompilationException {
-        String varName = varExpr.getVar().getValue();
-        Identifier ident = scopeChecker.lookupSymbol(varName);
-        if (ident != null) {
-            // Exists such an identifier
-            varExpr.setIsNewVar(false);
-            varExpr.setVar((VarIdentifier) ident);
-            return false;
-        } else {
-            // Meets a undefined variable
-            return overwrite;
-        }
-    }
-
-    private Expression wrapWithDatasetFunction(String dataverseName, String datasetName) throws CompilationException {
-        String fullyQualifiedName = dataverseName == null ? datasetName : dataverseName + "." + datasetName;
-        List<Expression> argList = new ArrayList<>();
-        argList.add(new LiteralExpr(new StringLiteral(fullyQualifiedName)));
-        return new CallExpr(datasetFunction, argList);
-    }
-
     private boolean datasetExists(String dataverseName, String datasetName) throws CompilationException {
         try {
-            if (metadataProvider.findDataset(dataverseName, datasetName) != null) {
-                return true;
-            }
-            return fullyQualifiedDatasetNameExists(datasetName);
+            return metadataProvider.findDataset(dataverseName, datasetName) != null
+                    || fullyQualifiedDatasetNameExists(datasetName);
         } catch (AlgebricksException e) {
             throw new CompilationException(e);
         }
     }
 
     private boolean fullyQualifiedDatasetNameExists(String name) throws AlgebricksException {
-        if (!name.contains(".")) {
+        if (name.indexOf('.') < 0) {
             return false;
         }
-        String[] path = name.split("\\.");
-        if (path.length != 2) {
-            return false;
-        }
-        if (metadataProvider.findDataset(path[0], path[1]) != null) {
-            return true;
-        }
-        return false;
+        String[] path = StringUtils.split(name, '.');
+        return path.length == 2 && metadataProvider.findDataset(path[0], path[1]) != null;
     }
 
+    @Override
+    public Expression visit(CallExpr callExpr, ILangExpression arg) throws CompilationException {
+        // skip variables inside SQL-92 aggregates (they will be resolved by SqlppGroupByAggregationSugarVisitor)
+        if (FunctionMapUtil.isSql92AggregateFunction(callExpr.getFunctionSignature())) {
+            return callExpr;
+        }
+        return super.visit(callExpr, arg);
+    }
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationInput.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationInput.java
index 0c4b65b..a369010 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationInput.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationInput.java
@@ -18,12 +18,13 @@
  */
 package org.apache.asterix.lang.sqlpp.struct;
 
+import java.util.Objects;
+
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
 import org.apache.asterix.lang.sqlpp.clause.SelectBlock;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.visitor.base.ISqlppVisitor;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class SetOperationInput {
 
@@ -61,7 +62,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(selectBlock, subquery);
+        return Objects.hash(selectBlock, subquery);
     }
 
     @Override
@@ -73,7 +74,7 @@
             return false;
         }
         SetOperationInput target = (SetOperationInput) object;
-        return ObjectUtils.equals(selectBlock, target.selectBlock) && ObjectUtils.equals(subquery, target.subquery);
+        return Objects.equals(selectBlock, target.selectBlock) && Objects.equals(subquery, target.subquery);
     }
 
     @Override
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationRight.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationRight.java
index ade4119..02a1eb1 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationRight.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/struct/SetOperationRight.java
@@ -18,8 +18,9 @@
  */
 package org.apache.asterix.lang.sqlpp.struct;
 
+import java.util.Objects;
+
 import org.apache.asterix.lang.sqlpp.optype.SetOpType;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class SetOperationRight {
 
@@ -47,7 +48,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(opType, setOperationRightInput, setSemantics);
+        return Objects.hash(opType, setOperationRightInput, setSemantics);
     }
 
     @Override
@@ -59,8 +60,8 @@
             return false;
         }
         SetOperationRight target = (SetOperationRight) object;
-        return ObjectUtils.equals(opType, target.opType)
-                && ObjectUtils.equals(setOperationRightInput, target.setOperationRightInput)
+        return Objects.equals(opType, target.opType)
+                && Objects.equals(setOperationRightInput, target.setOperationRightInput)
                 && setSemantics == target.setSemantics;
     }
 
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/ExpressionToVariableUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/ExpressionToVariableUtil.java
index cd805a1..96c61f2 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/ExpressionToVariableUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/ExpressionToVariableUtil.java
@@ -26,11 +26,12 @@
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.sqlpp.parser.ParseException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExpressionToVariableUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(ExpressionToVariableUtil.class);
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private ExpressionToVariableUtil() {
     }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
index 8a8465d..1ff7c9e 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/FunctionMapUtil.java
@@ -36,6 +36,7 @@
 
 public class FunctionMapUtil {
 
+    public static final String CONCAT = "concat";
     private final static String CORE_AGGREGATE_PREFIX = "coll_";
     private final static String CORE_SQL_AGGREGATE_PREFIX = "array_";
     private final static String INTERNAL_SQL_AGGREGATE_PREFIX = "sql-";
@@ -44,7 +45,7 @@
     private static final Map<String, String> LIST_INPUT_FUNCTION_MAP = new HashMap<>();
 
     static {
-        LIST_INPUT_FUNCTION_MAP.put("concat", "string-concat");
+        LIST_INPUT_FUNCTION_MAP.put(CONCAT, BuiltinFunctions.STRING_CONCAT.getName());
         LIST_INPUT_FUNCTION_MAP.put("greatest", CORE_SQL_AGGREGATE_PREFIX + "max");
         LIST_INPUT_FUNCTION_MAP.put("least", CORE_SQL_AGGREGATE_PREFIX + "min");
     }
@@ -142,8 +143,8 @@
             return callExpr;
         }
         callExpr.setFunctionSignature(new FunctionSignature(FunctionConstants.ASTERIX_NS, internalFuncName, 1));
-        callExpr.setExprList(new ArrayList<>(Collections.singletonList(new ListConstructor(
-                ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR, callExpr.getExprList()))));
+        callExpr.setExprList(new ArrayList<>(Collections.singletonList(
+                new ListConstructor(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR, callExpr.getExprList()))));
         return callExpr;
     }
 
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
index a8c5ddc..228ea23 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppRewriteUtil.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.lang.sqlpp.util;
 
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -29,7 +28,6 @@
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.statement.Query;
-import org.apache.asterix.lang.sqlpp.rewrites.visitor.SqlppGroupBySugarVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.CheckSubqueryVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.DeepCopyVisitor;
 import org.apache.asterix.lang.sqlpp.visitor.FreeVariableVisitor;
@@ -40,14 +38,6 @@
     private SqlppRewriteUtil() {
     }
 
-    // Applying sugar rewriting for group-by.
-    public static Expression rewriteExpressionUsingGroupVariable(VariableExpr groupVar,
-            Collection<VariableExpr> fieldVars, ILangExpression expr, LangRewritingContext context)
-            throws CompilationException {
-        SqlppGroupBySugarVisitor visitor = new SqlppGroupBySugarVisitor(context, groupVar, fieldVars);
-        return expr.accept(visitor, null);
-    }
-
     public static Set<VariableExpr> getFreeVariable(Expression expr) throws CompilationException {
         Set<VariableExpr> vars = new HashSet<>();
         FreeVariableVisitor visitor = new FreeVariableVisitor();
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
index 2d6ac53..519627c 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppVariableUtil.java
@@ -22,15 +22,12 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
-import org.apache.asterix.lang.common.context.Scope;
 import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
 import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
@@ -77,22 +74,6 @@
         return varName;
     }
 
-    public static Set<VariableExpr> getLiveVariables(Scope scope, boolean includeWithVariables) {
-        Set<VariableExpr> results = new HashSet<>();
-        Set<VariableExpr> liveVars = scope.getLiveVariables();
-        Iterator<VariableExpr> liveVarIter = liveVars.iterator();
-        while (liveVarIter.hasNext()) {
-            VariableExpr liveVar = liveVarIter.next();
-            // Variables defined in WITH clauses are named value access.
-            // TODO(buyingi): remove this if block once we can accurately type
-            // ordered lists with UNION item type. Currently it is typed as [ANY].
-            if (includeWithVariables || !liveVar.getVar().namedValueAccess()) {
-                results.add(liveVar);
-            }
-        }
-        return results;
-    }
-
     public static String toInternalVariableName(String varName) {
         return USER_VAR_PREFIX + varName;
     }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
index cab7b5b..fe0c3a9 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
@@ -53,7 +53,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppQueryExpressionVisitor;
 
@@ -226,11 +225,6 @@
     }
 
     @Override
-    public Boolean visit(IndependentSubquery independentSubquery, ILangExpression arg) throws CompilationException {
-        return false;
-    }
-
-    @Override
     public Boolean visit(CaseExpression caseExpr, ILangExpression arg) throws CompilationException {
         return false;
     }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
index 1fd110c..cd91405 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
@@ -56,7 +56,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppQueryExpressionVisitor;
@@ -270,11 +269,6 @@
     }
 
     @Override
-    public Boolean visit(IndependentSubquery independentSubquery, ILangExpression arg) throws CompilationException {
-        return false;
-    }
-
-    @Override
     public Boolean visit(CaseExpression caseExpr, ILangExpression arg) throws CompilationException {
         return caseExpr.getConditionExpr().accept(this, arg) || visitExprList(caseExpr.getWhenExprs(), arg)
                 || visitExprList(caseExpr.getThenExprs(), arg) || caseExpr.getElseExpr().accept(this, arg);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
index 7f93b2f..c53d8d2 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
@@ -60,7 +60,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppQueryExpressionVisitor;
@@ -169,11 +168,6 @@
     }
 
     @Override
-    public Boolean visit(IndependentSubquery independentSubquery, ILangExpression arg) throws CompilationException {
-        return visit(independentSubquery.getExpr(), arg);
-    }
-
-    @Override
     public Boolean visit(CaseExpression caseExpression, ILangExpression arg) throws CompilationException {
         return visit(caseExpression.getConditionExpr(), arg) || visit(caseExpression.getWhenExprs(), arg)
                 || visit(caseExpression.getThenExprs(), arg) || visit(caseExpression.getElseExpr(), arg);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
index 37e4e26..ffd63d4 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
@@ -64,7 +64,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
@@ -232,7 +231,8 @@
 
     @Override
     public Query visit(Query q, Void arg) throws CompilationException {
-        return new Query(q.isExplain(), q.isTopLevel(), (Expression) q.getBody().accept(this, arg), q.getVarCounter());
+        return new Query(q.isExplain(), q.isTopLevel(), (Expression) q.getBody().accept(this, arg), q.getVarCounter(),
+                q.getExternalVars());
     }
 
     @Override
@@ -415,11 +415,6 @@
     }
 
     @Override
-    public ILangExpression visit(IndependentSubquery independentSubquery, Void arg) throws CompilationException {
-        return new IndependentSubquery((Expression) independentSubquery.getExpr().accept(this, arg));
-    }
-
-    @Override
     public ILangExpression visit(CaseExpression caseExpr, Void arg) throws CompilationException {
         Expression conditionExpr = (Expression) caseExpr.getConditionExpr().accept(this, arg);
         List<Expression> whenExprList = copyExprList(caseExpr.getWhenExprs(), arg);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
index e152b9b..b754533 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
@@ -61,7 +61,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
@@ -167,7 +166,8 @@
 
         selectBlock.getSelectClause().accept(this, selectFreeVars);
         // Removes group-by, from, let, and gby-let binding vars.
-        removeAllBindingVarsInSelectBlock(selectFreeVars, fromBindingVars, letsBindingVars, gbyLetsBindingVars);
+        removeAllBindingVarsInSelectBlock(selectFreeVars, fromBindingVars, letsBindingVars, gbyBindingVars,
+                gbyLetsBindingVars);
 
         if (selectBlock.hasFromClause()) {
             selectBlock.getFromClause().accept(this, fromFreeVars);
@@ -194,13 +194,15 @@
             }
             if (selectBlock.hasHavingClause()) {
                 selectBlock.getHavingClause().accept(this, selectFreeVars);
-                removeAllBindingVarsInSelectBlock(selectFreeVars, fromBindingVars, letsBindingVars, gbyLetsBindingVars);
+                removeAllBindingVarsInSelectBlock(selectFreeVars, fromBindingVars, letsBindingVars, gbyBindingVars,
+                        gbyLetsBindingVars);
             }
         }
 
         // Removes all binding vars from <code>freeVars</code>, which contains the free
         // vars in the order-by and limit.
-        removeAllBindingVarsInSelectBlock(freeVars, fromBindingVars, letsBindingVars, gbyLetsBindingVars);
+        removeAllBindingVarsInSelectBlock(freeVars, fromBindingVars, letsBindingVars, gbyBindingVars,
+                gbyLetsBindingVars);
 
         // Adds all free vars.
         freeVars.addAll(selectFreeVars);
@@ -408,19 +410,12 @@
     public Void visit(IndexAccessor ia, Collection<VariableExpr> freeVars) throws CompilationException {
         ia.getExpr().accept(this, freeVars);
         if (ia.getIndexExpr() != null) {
-            ia.getIndexExpr();
+            ia.getIndexExpr().accept(this, freeVars);
         }
         return null;
     }
 
     @Override
-    public Void visit(IndependentSubquery independentSubquery, Collection<VariableExpr> freeVars)
-            throws CompilationException {
-        independentSubquery.getExpr().accept(this, freeVars);
-        return null;
-    }
-
-    @Override
     public Void visit(CaseExpression caseExpr, Collection<VariableExpr> freeVars) throws CompilationException {
         caseExpr.getConditionExpr().accept(this, freeVars);
         visit(caseExpr.getWhenExprs(), freeVars);
@@ -470,23 +465,23 @@
 
     /**
      * Removes all binding variables defined in the select block for a free variable collection.
-     *
-     * @param freeVars,
+     *  @param selectFreeVars,
      *            free variables.
      * @param fromBindingVars,
      *            binding variables defined in the from clause of a select block.
      * @param letsBindingVars,
      *            binding variables defined in the let clauses of the select block.
-     * @param gbyLetsBindingVars,
-     *            binding variables defined in the let clauses after a group-by in the select block.
+     * @param gbyBindingVars
+     *            binding variables defined in the groupby clauses of the select block
+     * @param gbyLetsBindingVars
+     *            binding variables defined in the let clauses after groupby of the select block.
      */
     private void removeAllBindingVarsInSelectBlock(Collection<VariableExpr> selectFreeVars,
             Collection<VariableExpr> fromBindingVars, Collection<VariableExpr> letsBindingVars,
-            Collection<VariableExpr> gbyLetsBindingVars) {
+            Collection<VariableExpr> gbyBindingVars, Collection<VariableExpr> gbyLetsBindingVars) {
         selectFreeVars.removeAll(fromBindingVars);
         selectFreeVars.removeAll(letsBindingVars);
-        selectFreeVars.removeAll(gbyLetsBindingVars);
+        selectFreeVars.removeAll(gbyBindingVars);
         selectFreeVars.removeAll(gbyLetsBindingVars);
     }
-
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
index e52bee3..09eaa59 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppAstPrintVisitor.java
@@ -20,6 +20,7 @@
 
 import java.io.PrintWriter;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.functions.FunctionSignature;
@@ -28,6 +29,7 @@
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
+import org.apache.asterix.lang.common.expression.VariableExpr;
 import org.apache.asterix.lang.common.struct.Identifier;
 import org.apache.asterix.lang.common.visitor.QueryPrintVisitor;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
@@ -44,7 +46,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
@@ -54,16 +55,8 @@
 
 public class SqlppAstPrintVisitor extends QueryPrintVisitor implements ISqlppVisitor<Void, Integer> {
 
-    private final PrintWriter out;
-
-    public SqlppAstPrintVisitor() {
-        super();
-        out = new PrintWriter(System.out);
-    }
-
     public SqlppAstPrintVisitor(PrintWriter out) {
         super(out);
-        this.out = out;
     }
 
     @Override
@@ -273,15 +266,25 @@
     public Void visit(GroupbyClause gc, Integer step) throws CompilationException {
         if (gc.isGroupAll()) {
             out.println(skip(step) + "Group All");
-            return null;
-        }
-        out.println(skip(step) + "Groupby");
-        for (GbyVariableExpressionPair pair : gc.getGbyPairList()) {
-            if (pair.getVar() != null) {
-                pair.getVar().accept(this, step + 1);
-                out.println(skip(step + 1) + ":=");
+        } else {
+            out.println(skip(step) + "Groupby");
+            for (GbyVariableExpressionPair pair : gc.getGbyPairList()) {
+                if (pair.getVar() != null) {
+                    pair.getVar().accept(this, step + 1);
+                    out.println(skip(step + 1) + ":=");
+                }
+                pair.getExpr().accept(this, step + 1);
             }
-            pair.getExpr().accept(this, step + 1);
+        }
+        if (gc.hasDecorList()) {
+            out.println(skip(step + 1) + "DECOR");
+            for (GbyVariableExpressionPair pair : gc.getDecorPairList()) {
+                if (pair.getVar() != null) {
+                    pair.getVar().accept(this, step + 1);
+                    out.println(skip(step + 1) + ":=");
+                }
+                pair.getExpr().accept(this, step + 1);
+            }
         }
         if (gc.hasGroupVar()) {
             out.print(skip(step + 1) + "GROUP AS ");
@@ -295,17 +298,19 @@
                 out.println(skip(step + 1) + ")");
             }
         }
+        if (gc.hasWithMap()) {
+            out.println(skip(step + 1) + "WITH");
+            for (Map.Entry<Expression, VariableExpr> pair : gc.getWithVarMap().entrySet()) {
+                pair.getValue().accept(this, step + 1);
+                out.println(skip(step + 1) + ":=");
+                pair.getKey().accept(this, step + 1);
+            }
+        }
         out.println();
         return null;
     }
 
     @Override
-    public Void visit(IndependentSubquery independentSubquery, Integer arg) throws CompilationException {
-        independentSubquery.getExpr().accept(this, arg);
-        return null;
-    }
-
-    @Override
     public Void visit(CaseExpression caseExpr, Integer step) throws CompilationException {
         out.print(skip(step) + "CASE");
         caseExpr.getConditionExpr().accept(this, step + 2);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
index 8904241..65e9255 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppCloneAndSubstituteVariablesVisitor.java
@@ -49,7 +49,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
@@ -224,7 +223,7 @@
             for (LetClause letClause : selectBlock.getLetList()) {
                 newLet = letClause.accept(this, currentEnv);
                 currentEnv = newLet.second;
-                newLetClauses.add(letClause);
+                newLetClauses.add((LetClause) newLet.first);
             }
         }
 
@@ -347,7 +346,7 @@
         if (selectExpression.hasLetClauses()) {
             for (LetClause letClause : selectExpression.getLetList()) {
                 p = letClause.accept(this, currentEnv);
-                newLetList.add(letClause);
+                newLetList.add((LetClause) p.first);
                 currentEnv = p.second;
             }
         }
@@ -381,14 +380,6 @@
     }
 
     @Override
-    public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(IndependentSubquery independentSubquery,
-            VariableSubstitutionEnvironment env) throws CompilationException {
-        Pair<ILangExpression, VariableSubstitutionEnvironment> p = independentSubquery.getExpr().accept(this, env);
-        IndependentSubquery newSubquery = new IndependentSubquery((Expression) p.first);
-        return new Pair<>(newSubquery, p.second);
-    }
-
-    @Override
     public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(CaseExpression caseExpr,
             VariableSubstitutionEnvironment env) throws CompilationException {
         Expression conditionExpr = (Expression) caseExpr.getConditionExpr().accept(this, env).first;
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
index 680ce55..4542bab 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppDeleteRewriteVisitor.java
@@ -22,7 +22,6 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.asterix.common.functions.FunctionConstants;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.clause.WhereClause;
@@ -42,6 +41,7 @@
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationInput;
 import org.apache.asterix.lang.sqlpp.visitor.base.AbstractSqlppAstVisitor;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 
 /**
  * This class rewrites delete statement to contain a query that specifying
@@ -58,8 +58,7 @@
                 : dataverseName.getValue() + "." + datasetName.getValue();
         LiteralExpr argumentLiteral = new LiteralExpr(new StringLiteral(arg));
         arguments.add(argumentLiteral);
-        CallExpr callExpression =
-                new CallExpr(new FunctionSignature(FunctionConstants.ASTERIX_NS, "dataset", 1), arguments);
+        CallExpr callExpression = new CallExpr(new FunctionSignature(BuiltinFunctions.DATASET), arguments);
 
         // From clause.
         VariableExpr var = deleteStmt.getVariableExpr();
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
index a62a1cc..51444e8 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/SqlppFormatPrintVisitor.java
@@ -43,7 +43,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
@@ -51,15 +50,8 @@
 
 public class SqlppFormatPrintVisitor extends FormatPrintVisitor implements ISqlppVisitor<Void, Integer> {
 
-    private final PrintWriter out;
-
-    public SqlppFormatPrintVisitor() {
-        this(new PrintWriter(System.out));
-    }
-
     public SqlppFormatPrintVisitor(PrintWriter out) {
         super(out);
-        this.out = out;
 
         // Initialize symbols
         dataverseSymbol = " database ";
@@ -309,12 +301,6 @@
     }
 
     @Override
-    public Void visit(IndependentSubquery independentSubquery, Integer step) throws CompilationException {
-        independentSubquery.getExpr().accept(this, step);
-        return null;
-    }
-
-    @Override
     public Void visit(CaseExpression caseExpr, Integer step) throws CompilationException {
         out.print(skip(step) + "case ");
         caseExpr.getConditionExpr().accept(this, step + 2);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
index ec17484..5396768 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppAstVisitor.java
@@ -33,7 +33,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 
 /**
@@ -107,11 +106,6 @@
     }
 
     @Override
-    public R visit(IndependentSubquery independentSubquery, T arg) throws CompilationException {
-        return null;
-    }
-
-    @Override
     public R visit(CaseExpression caseExpr, T arg) throws CompilationException {
         return null;
     }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
index 96c5987..bcb131b 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppExpressionScopingVisitor.java
@@ -18,7 +18,6 @@
  */
 package org.apache.asterix.lang.sqlpp.visitor.base;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,19 +25,15 @@
 import java.util.Set;
 
 import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.ILangExpression;
 import org.apache.asterix.lang.common.clause.GroupbyClause;
 import org.apache.asterix.lang.common.clause.LetClause;
 import org.apache.asterix.lang.common.clause.LimitClause;
 import org.apache.asterix.lang.common.context.Scope;
-import org.apache.asterix.lang.common.expression.CallExpr;
 import org.apache.asterix.lang.common.expression.GbyVariableExpressionPair;
-import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
 import org.apache.asterix.lang.common.expression.VariableExpr;
-import org.apache.asterix.lang.common.literal.StringLiteral;
 import org.apache.asterix.lang.common.parser.ScopeChecker;
 import org.apache.asterix.lang.common.rewrites.LangRewritingContext;
 import org.apache.asterix.lang.common.statement.FunctionDecl;
@@ -54,19 +49,14 @@
 import org.apache.asterix.lang.sqlpp.clause.NestClause;
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
-import org.apache.asterix.metadata.utils.MetadataConstants;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.core.algebra.base.Counter;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 
 public class AbstractSqlppExpressionScopingVisitor extends AbstractSqlppSimpleExpressionVisitor {
 
-    protected final FunctionSignature resolveFunction =
-            new FunctionSignature(MetadataConstants.METADATA_DATAVERSE_NAME, "resolve", FunctionIdentifier.VARARGS);
     protected final ScopeChecker scopeChecker = new ScopeChecker();
     protected final LangRewritingContext context;
 
@@ -75,8 +65,23 @@
      *            manages ids of variables and guarantees uniqueness of variables.
      */
     public AbstractSqlppExpressionScopingVisitor(LangRewritingContext context) {
+        this(context, null);
+    }
+
+    /**
+     * @param context,
+     *            manages ids of variables and guarantees uniqueness of variables.
+     * @param externalVars
+     *            pre-defined (external) variables that must be added to the initial scope
+     */
+    public AbstractSqlppExpressionScopingVisitor(LangRewritingContext context, List<VarIdentifier> externalVars) {
         this.context = context;
         this.scopeChecker.setVarCounter(new Counter(context.getVarCounter()));
+        if (externalVars != null) {
+            for (VarIdentifier paramVar : externalVars) {
+                scopeChecker.getCurrentScope().addSymbolToScope(paramVar);
+            }
+        }
     }
 
     @Override
@@ -223,7 +228,7 @@
     public Expression visit(GroupbyClause gc, ILangExpression arg) throws CompilationException {
         // After a GROUP BY, variables defined before the current SELECT BLOCK (e.g., in a WITH clause
         // or an outer scope query) should still be visible.
-        Scope newScope = new Scope(scopeChecker, scopeChecker.getCurrentScope().getParentScope());
+        Scope newScope = new Scope(scopeChecker, scopeChecker.getPrecedingScope());
         // Puts all group-by variables into the symbol set of the new scope.
         for (GbyVariableExpressionPair gbyKeyVarExpr : gc.getGbyPairList()) {
             gbyKeyVarExpr.setExpr(visit(gbyKeyVarExpr.getExpr(), gc));
@@ -247,7 +252,7 @@
             }
         }
         if (gc.hasGroupVar()) {
-            addNewVarSymbolToScope(scopeChecker.getCurrentScope(), gc.getGroupVar().getVar());
+            addNewVarSymbolToScope(newScope, gc.getGroupVar().getVar());
         }
         if (gc.hasWithMap()) {
             Map<Expression, VariableExpr> newWithMap = new HashMap<>();
@@ -269,7 +274,7 @@
     public Expression visit(LimitClause limitClause, ILangExpression arg) throws CompilationException {
         scopeChecker.pushForbiddenScope(scopeChecker.getCurrentScope());
         limitClause.setLimitExpr(visit(limitClause.getLimitExpr(), limitClause));
-        if(limitClause.hasOffset()) {
+        if (limitClause.hasOffset()) {
             limitClause.setOffset(visit(limitClause.getOffset(), limitClause));
         }
         scopeChecker.popForbiddenScope();
@@ -292,8 +297,6 @@
         // visit let list
         if (selectExpression.hasLetClauses()) {
             for (LetClause letClause : selectExpression.getLetList()) {
-                // Variables defined in WITH clauses are considered as named access instead of real variables.
-                letClause.getVarExpr().getVar().setNamedValueAccess(true);
                 letClause.accept(this, selectExpression);
             }
             scopeChecker.createNewScope();
@@ -320,18 +323,6 @@
     }
 
     @Override
-    public Expression visit(IndependentSubquery independentSubquery, ILangExpression arg) throws CompilationException {
-        // Masks parent scopes so as that the subquery is independent of the environment.
-        // In this way, free variables defined in the subquery will not be resolved using
-        // variables defined in the parent scope.
-        Scope scope = new Scope(scopeChecker, scopeChecker.getCurrentScope(), true);
-        scopeChecker.pushExistingScope(scope);
-        independentSubquery.setExpr(visit(independentSubquery.getExpr(), independentSubquery));
-        scopeChecker.removeCurrentScope();
-        return independentSubquery;
-    }
-
-    @Override
     public Expression visit(QuantifiedExpression qe, ILangExpression arg) throws CompilationException {
         scopeChecker.createNewScope();
         for (QuantifiedPair pair : qe.getQuantifiedList()) {
@@ -381,22 +372,11 @@
         return null;
     }
 
-    // Rewrites for an undefined variable reference, which potentially could be a syntatic sugar.
-    protected Expression wrapWithResolveFunction(VariableExpr expr, Set<VariableExpr> liveVars)
-            throws CompilationException {
-        List<Expression> argList = new ArrayList<>();
-        //Ignore the parser-generated prefix "$" for a dataset.
-        String varName = SqlppVariableUtil.toUserDefinedVariableName(expr.getVar().getValue()).getValue();
-        argList.add(new LiteralExpr(new StringLiteral(varName)));
-        argList.addAll(liveVars);
-        return new CallExpr(resolveFunction, argList);
-    }
-
     // Adds a new encountered alias identifier into a scope
     private void addNewVarSymbolToScope(Scope scope, VarIdentifier var) throws CompilationException {
         if (scope.findLocalSymbol(var.getValue()) != null) {
-            throw new CompilationException("Duplicate alias definitions: "
-                    + SqlppVariableUtil.toUserDefinedName(var.getValue()));
+            throw new CompilationException(
+                    "Duplicate alias definitions: " + SqlppVariableUtil.toUserDefinedName(var.getValue()));
         }
         scope.addNewVarSymbolToScope(var);
     }
@@ -407,8 +387,7 @@
         for (String symbolToBeMerged : symbolsToBeMerged) {
             if (hostScope.findLocalSymbol(symbolToBeMerged) != null) {
                 throw new CompilationException(
-                        "Duplicate alias definitions: "
-                        + SqlppVariableUtil.toUserDefinedName(symbolToBeMerged));
+                        "Duplicate alias definitions: " + SqlppVariableUtil.toUserDefinedName(symbolToBeMerged));
             }
         }
         hostScope.merge(scopeToBeMerged);
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
index a2e43a21..4d35914 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
@@ -60,7 +60,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 import org.apache.asterix.lang.sqlpp.struct.SetOperationRight;
 
@@ -337,12 +336,6 @@
     }
 
     @Override
-    public Expression visit(IndependentSubquery independentSubquery, ILangExpression arg) throws CompilationException {
-        independentSubquery.setExpr(visit(independentSubquery.getExpr(), arg));
-        return independentSubquery;
-    }
-
-    @Override
     public Expression visit(CaseExpression caseExpr, ILangExpression arg) throws CompilationException {
         caseExpr.setConditionExpr(visit(caseExpr.getConditionExpr(), arg));
         caseExpr.setWhenExprs(visit(caseExpr.getWhenExprs(), arg));
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/ISqlppVisitor.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/ISqlppVisitor.java
index 639f3b5..02d9142 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/ISqlppVisitor.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/ISqlppVisitor.java
@@ -33,7 +33,6 @@
 import org.apache.asterix.lang.sqlpp.clause.SelectSetOperation;
 import org.apache.asterix.lang.sqlpp.clause.UnnestClause;
 import org.apache.asterix.lang.sqlpp.expression.CaseExpression;
-import org.apache.asterix.lang.sqlpp.expression.IndependentSubquery;
 import org.apache.asterix.lang.sqlpp.expression.SelectExpression;
 
 public interface ISqlppVisitor<R, T> extends ILangVisitor<R, T> {
@@ -64,7 +63,5 @@
 
     R visit(HavingClause havingClause, T arg) throws CompilationException;
 
-    R visit(IndependentSubquery independentSubquery, T arg) throws CompilationException;
-
     R visit(CaseExpression caseExpression, T arg) throws CompilationException;
 }
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index d3a64d8..fd5de86 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -64,6 +64,7 @@
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.functions.FunctionConstants;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.lang.common.base.Expression;
 import org.apache.asterix.lang.common.base.Literal;
@@ -142,6 +143,7 @@
 import org.apache.asterix.lang.common.statement.UpsertStatement;
 import org.apache.asterix.lang.common.statement.WriteStatement;
 import org.apache.asterix.lang.common.struct.Identifier;
+import org.apache.asterix.lang.common.struct.OperatorType;
 import org.apache.asterix.lang.common.struct.QuantifiedPair;
 import org.apache.asterix.lang.common.struct.VarIdentifier;
 import org.apache.asterix.lang.sqlpp.clause.AbstractBinaryCorrelateClause;
@@ -165,8 +167,10 @@
 import org.apache.asterix.lang.sqlpp.util.ExpressionToVariableUtil;
 import org.apache.asterix.lang.sqlpp.util.FunctionMapUtil;
 import org.apache.asterix.lang.sqlpp.util.SqlppVariableUtil;
+import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.algebricks.common.utils.Triple;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionAnnotation;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IndexedNLJoinExpressionAnnotation;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
@@ -491,17 +495,15 @@
   Pair<Identifier,Identifier> typeComponents = null;
   String adapterName = null;
   Map<String,String> properties = null;
-  Map<String,String> compactionPolicyProperties = null;
   FunctionSignature appliedFunction = null;
   Pair<List<Integer>, List<List<String>>> primaryKeyFields = null;
   String nodeGroupName = null;
   Map<String,String> hints = new HashMap<String,String>();
   DatasetDecl dsetDecl = null;
   boolean autogenerated = false;
-  String compactionPolicy = null;
-  boolean temp = false;
   Pair<Integer, List<String>> filterField = null;
   Pair<Identifier,Identifier> metaTypeComponents = new Pair<Identifier, Identifier>(null, null);
+  RecordConstructor withRecord = null;
 }
 {
   (
@@ -509,13 +511,14 @@
     <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN>
     ifNotExists = IfNotExists()
     <USING> adapterName = AdapterName() properties = Configuration()
-    (<ON> nodeGroupName = Identifier() )?
+    ( <ON> nodeGroupName = Identifier() )?
     ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (LOOKAHEAD(1) compactionPolicyProperties = Configuration())? )?
+    ( <WITH> withRecord = RecordConstructor() )?
       {
         ExternalDetailsDecl edd = new ExternalDetailsDecl();
         edd.setAdapter(adapterName);
         edd.setProperties(properties);
+        try{
         dsetDecl = new DatasetDecl(nameComponents.first,
                                    nameComponents.second,
                                    typeComponents.first,
@@ -523,15 +526,17 @@
                                    metaTypeComponents.first,
                                    metaTypeComponents.second,
                                    nodeGroupName != null? new Identifier(nodeGroupName): null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
                                    hints,
                                    DatasetType.EXTERNAL,
                                    edd,
+                                   withRecord,
                                    ifNotExists);
+        } catch (CompilationException e){
+           throw new ParseException(e.getMessage());
+        }
       }
 
-    | (<INTERNAL> | <TEMPORARY> { temp = true; })?
+    | ( <INTERNAL> )?
     Dataset() nameComponents = QualifiedName()
     <LEFTPAREN> typeComponents = TypeName() <RIGHTPAREN>
     (
@@ -550,8 +555,8 @@
     (<AUTOGENERATED> { autogenerated = true; } )?
     (<ON> nodeGroupName = Identifier() )?
     ( <HINTS> hints = Properties() )?
-    ( <USING> <COMPACTION> <POLICY> compactionPolicy = CompactionPolicy() (LOOKAHEAD(1) compactionPolicyProperties = Configuration())? )?
     ( LOOKAHEAD(2) <WITH> <FILTER> <ON>  filterField = NestedField() )?
+    ( <WITH> withRecord = RecordConstructor() )?
       {
         if(filterField!=null && filterField.first!=0){
           throw new ParseException("A filter field can only be a field in the main record of the dataset.");
@@ -559,8 +564,8 @@
         InternalDetailsDecl idd = new InternalDetailsDecl(primaryKeyFields.second,
                                                           primaryKeyFields.first,
                                                           autogenerated,
-                                                          filterField == null? null : filterField.second,
-                                                          temp);
+                                                          filterField == null? null : filterField.second);
+        try{
         dsetDecl = new DatasetDecl(nameComponents.first,
                                    nameComponents.second,
                                    typeComponents.first,
@@ -568,12 +573,14 @@
                                    metaTypeComponents.first,
                                    metaTypeComponents.second,
                                    nodeGroupName != null ? new Identifier(nodeGroupName) : null,
-                                   compactionPolicy,
-                                   compactionPolicyProperties,
                                    hints,
                                    DatasetType.INTERNAL,
                                    idd,
+                                   withRecord,
                                    ifNotExists);
+        } catch (CompilationException e){
+           throw new ParseException(e.getMessage());
+        }
       }
   )
     {
@@ -748,11 +755,15 @@
   Token beginPos;
   Token endPos;
   FunctionName fctName = null;
+  String currentDataverse = defaultDataverse;
 
   createNewScope();
 }
 {
   <FUNCTION> fctName = FunctionName()
+  {
+     defaultDataverse = fctName.dataverse;
+  }
   ifNotExists = IfNotExists()
   paramList = ParameterList()
   <LEFTBRACE>
@@ -767,7 +778,8 @@
       signature = new FunctionSignature(fctName.dataverse, fctName.function, paramList.size());
       getCurrentScope().addFunctionDescriptor(signature, false);
       removeCurrentScope();
-      return new CreateFunctionStatement(signature, paramList, functionBody, ifNotExists);
+      defaultDataverse = currentDataverse;
+      return new CreateFunctionStatement(signature, paramList, functionBody, functionBodyExpr, ifNotExists);
     }
 }
 
@@ -779,13 +791,18 @@
   Map<String,String> properties = null;
   CreateFeedStatement cfs = null;
   Pair<Identifier,Identifier> sourceNameComponents = null;
+  RecordConstructor withRecord = null;
 }
 {
   <FEED> nameComponents = QualifiedName() ifNotExists = IfNotExists()
-  <USING> adapterName = AdapterName() properties = Configuration()
+  <WITH> withRecord = RecordConstructor()
   {
-    cfs = new CreateFeedStatement(nameComponents, adapterName, properties, ifNotExists);
-    return cfs;
+    try {
+      cfs = new CreateFeedStatement(nameComponents, withRecord, ifNotExists);
+      return cfs;
+    } catch (AlgebricksException e) {
+      throw new ParseException(e.getMessage());
+    }
   }
 }
 
@@ -1856,7 +1873,7 @@
   (<NOT> { not = true; } )? inputExpr = RelExpr()
   {
     if(not){
-        FunctionSignature signature = new FunctionSignature(null, "not", 1);
+        FunctionSignature signature = new FunctionSignature(BuiltinFunctions.NOT);
         return new CallExpr(signature, new ArrayList<Expression>(Collections.singletonList(inputExpr)));
     } else {
         return inputExpr;
@@ -1968,6 +1985,7 @@
        <AND>
        operand = IsExpr()
        {
+         op.addOperator(OperatorType.AND);
          op.addOperand(operand);
        }
     )?
@@ -1985,16 +2003,23 @@
     Expression expr = null;
     Expression operand = null;
     boolean not = false;
+    FunctionIdentifier fn = null;
 }
 {
     operand = LikeExpr()
-    ( <IS> (<NOT> { not = true; })? (<NULL> | <MISSING> | <UNKOWN>)
+    ( <IS>
+        (<NOT> { not = true; })?
+        (
+            <NULL> { fn = BuiltinFunctions.IS_NULL; } |
+            <MISSING> { fn = BuiltinFunctions.IS_MISSING; } |
+            <UNKNOWN> { fn = BuiltinFunctions.IS_UNKNOWN; } |
+            <VALUED> { not = !not; fn = BuiltinFunctions.IS_UNKNOWN; }
+        )
       {
-        String functionName = "is-" + token.image.toLowerCase();
-        FunctionSignature signature = new FunctionSignature(null, functionName, 1);
+        FunctionSignature signature = new FunctionSignature(fn);
         expr = new CallExpr(signature, new ArrayList<Expression>(Collections.singletonList(operand)));
         if(not) {
-           FunctionSignature notSignature = new FunctionSignature(null, "not", 1);
+           FunctionSignature notSignature = new FunctionSignature(BuiltinFunctions.NOT);
            expr = new CallExpr(notSignature, new ArrayList<Expression>(Collections.singletonList(expr)));
         }
       }
@@ -3257,18 +3282,19 @@
   | <SOME : "some">
   | <START : "start">
   | <STOP : "stop">
-  | <TEMPORARY : "temporary">
+  | <TEMPORARY : "temporary"> // intentionally not used but reserved for future usage
   | <THEN : "then">
   | <TYPE : "type">
   | <TO : "to">
   | <UNION : "union">
-  | <UNKOWN : "unknown">
+  | <UNKNOWN : "unknown">
   | <UNNEST : "unnest">
   | <UPDATE : "update">
   | <UPSERT : "upsert">
   | <USE : "use">
   | <USING : "using">
   | <VALUE : "value">
+  | <VALUED : "valued">
   | <WHEN : "when">
   | <WHERE : "where">
   | <WITH : "with">
@@ -3373,7 +3399,8 @@
 TOKEN :
 {
     <#LETTER : ["A" - "Z", "a" - "z"]>
-  | <SPECIALCHARS : ["$", "_"]>
+  | <#IDENTIFIER_SPECIALCHARS_START : ["_"]>
+  | <#IDENTIFIER_SPECIALCHARS_REST : ["$"]>
 }
 
 <DEFAULT,IN_DBL_BRACE>
@@ -3424,7 +3451,8 @@
 <DEFAULT,IN_DBL_BRACE>
 TOKEN :
 {
-    <IDENTIFIER : <LETTER> (<LETTER> | <DIGIT> | <SPECIALCHARS>)*>
+    <IDENTIFIER : ( <LETTER> | <IDENTIFIER_SPECIALCHARS_START> )
+                  ( <LETTER> | <DIGIT> | <IDENTIFIER_SPECIALCHARS_START> | <IDENTIFIER_SPECIALCHARS_REST> )*>
 }
 
 <DEFAULT,IN_DBL_BRACE>
diff --git a/asterixdb/asterix-license/pom.xml b/asterixdb/asterix-license/pom.xml
index 61faa98..55abf98 100644
--- a/asterixdb/asterix-license/pom.xml
+++ b/asterixdb/asterix-license/pom.xml
@@ -35,6 +35,10 @@
     </license>
   </licenses>
 
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
+
   <build>
     <plugins>
       <plugin>
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
index 6a36970..16b09cb 100644
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
+++ b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/pom.xml
@@ -18,7 +18,6 @@
  !-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.asterix</groupId>
   <artifactId>asterix-evaluator-generator-maven-plugin</artifactId>
   <parent>
     <groupId>org.apache.asterix</groupId>
@@ -30,7 +29,7 @@
   <name>asterix-evaluator-generator-maven-plugin</name>
 
   <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <root.dir>${basedir}/../..</root.dir>
   </properties>
   <build>
     <plugins>
@@ -63,7 +62,6 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-project</artifactId>
-      <version>2.2.1</version>
     </dependency>
     <dependency>
       <groupId>org.reflections</groupId>
@@ -73,12 +71,10 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-model</artifactId>
-      <version>3.3.9</version>
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>3.5</version>
     </dependency>
     <dependency>
       <groupId>org.ow2.asm</groupId>
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
index adedee5..9339e8b 100644
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
+++ b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorMissingCheckVisitor.java
@@ -44,8 +44,8 @@
     private static final String TYPE_CHECKER_DESC = "L" + TYPE_CHECKER_CLASS + ";";
     private static final String TYPE_CHECKER_NAME = "typeChecker";
     private static final String IS_MISSING = "isMissing";
-    private static final String TYPECHECK_METHOD_DESC = "(Lorg/apache/hyracks/data/std/api/IPointable;"
-            + "Lorg/apache/hyracks/data/std/api/IPointable;)Z";
+    private static final String TYPECHECK_METHOD_DESC =
+            "(Lorg/apache/hyracks/data/std/api/IPointable;" + "Lorg/apache/hyracks/data/std/api/IPointable;)Z";
     private static final String CONSTRUCTOR = "<init>";
     private String className = null;
     private Label lastAddedLabel = null;
diff --git a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
index 30f810b..84bc320 100644
--- a/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
+++ b/asterixdb/asterix-maven-plugins/asterix-evaluator-generator-maven-plugin/src/main/java/org/apache/asterix/runtime/evaluators/staticcodegen/EvaluatorNullCheckVisitor.java
@@ -31,8 +31,8 @@
             + "IFrameTupleReference;Lorg/apache/hyracks/data/std/api/IPointable;)V";
     private final static String EVALUATE = "evaluate";
     private final static MethodIdentifier METHOD_IDENTIFIER = new MethodIdentifier(EVALUATE, EVALUATE_DESC, null);
-    private final static String TYPE_CHECKER_CLASS = "org/apache/asterix/runtime/evaluators/staticcodegen/"
-            + "TypeChecker";
+    private final static String TYPE_CHECKER_CLASS =
+            "org/apache/asterix/runtime/evaluators/staticcodegen/" + "TypeChecker";
     private final static String TYPE_CHECKER_DESC = "L" + TYPE_CHECKER_CLASS + ";";
     private final static String TYPE_CHECKER_NAME = "typeChecker";
     private final static String IS_NULL = "isNull";
diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml
index 76833ba..cf342fe 100644
--- a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml
+++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/pom.xml
@@ -25,6 +25,9 @@
   </parent>
   <artifactId>asterix-grammar-extension-maven-plugin</artifactId>
   <packaging>maven-plugin</packaging>
+  <properties>
+    <root.dir>${basedir}/../..</root.dir>
+  </properties>
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
@@ -102,13 +105,6 @@
               <outputDirectory>${project.build.directory}/generated-sources/javacc</outputDirectory>
             </configuration>
           </execution>
-          <execution>
-            <id>javacc-jjdoc</id>
-            <goals>
-              <goal>jjdoc</goal>
-            </goals>
-            <phase>generate-test-sources</phase>
-          </execution>
         </executions>
       </plugin>
       <plugin>
@@ -143,4 +139,32 @@
       </plugins>
     </pluginManagement>
   </build>
+  <profiles>
+    <profile>
+      <id>jjdoc</id>
+      <activation>
+        <property>
+          <name>jjdoc.skip</name>
+          <value>!true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>javacc-maven-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>javacc-jjdoc</id>
+                <goals>
+                  <goal>jjdoc</goal>
+                </goals>
+                <phase>generate-test-sources</phase>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
 </project>
\ No newline at end of file
diff --git a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java
index 17a71f2..52b2be5 100644
--- a/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java
+++ b/asterixdb/asterix-maven-plugins/asterix-grammar-extension-maven-plugin/src/main/java/org/apache/asterix/extension/grammar/GrammarExtensionMojo.java
@@ -61,8 +61,8 @@
     private static final char OPEN_PAREN = '(';
     private static final char CLOSE_PAREN = ')';
     private static final char SEMICOLON = ';';
-    private static final List<Character> SIG_SPECIAL_CHARS = Arrays
-            .asList(new Character[] { '(', ')', ':', '<', '>', ';', '.' });
+    private static final List<Character> SIG_SPECIAL_CHARS =
+            Arrays.asList(new Character[] { '(', ')', ':', '<', '>', ';', '.' });
     private static final String KWCLASS = "class";
     private static final String KWIMPORT = "import";
     private static final String KWUNIMPORT = "unimport";
@@ -80,8 +80,8 @@
     private static final String WITH = "with";
     private static final String OPTION_TRUE = "true";
     private static final String OPTION_FALSE = "false";
-    private static final List<String> KEYWORDS = Arrays
-            .asList(new String[] { KWCLASS, KWIMPORT, KWPACKAGE, PARSER_BEGIN, PARSER_END });
+    private static final List<String> KEYWORDS =
+            Arrays.asList(new String[] { KWCLASS, KWIMPORT, KWPACKAGE, PARSER_BEGIN, PARSER_END });
     private static final List<String> EXTENSIONKEYWORDS =
             Arrays.asList(new String[] { KWIMPORT, KWUNIMPORT, NEWPRODUCTION, NEW_AT_THE_END_PRODUCTION,
                     NEW_AT_THE_END_CLASS_DEFINITION, OVERRIDEPRODUCTION, MERGEPRODUCTION });
@@ -134,6 +134,9 @@
     @Override
     public void execute() throws MojoExecutionException {
         base = new File(base).getAbsolutePath();
+        gbase = resolvePath(gbase);
+        gextension = resolvePath(gextension);
+        output = resolvePath(output);
         getLog().info("Base dir: " + base);
         getLog().info("Grammar-base: " + gbase);
         getLog().info("Grammar-extension: " + gextension);
@@ -143,6 +146,10 @@
         generateOutput();
     }
 
+    private String resolvePath(String path) {
+        return new File(path).isAbsolute() ? path : new File(base, path).getAbsolutePath();
+    }
+
     private void generateOutput() throws MojoExecutionException {
         File outputFile = prepareOutputFile();
         try (BufferedWriter writer = Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8)) {
@@ -472,7 +479,7 @@
     }
 
     private void processBase() throws MojoExecutionException {
-        try (BufferedReader reader = Files.newBufferedReader(Paths.get(base, gbase), StandardCharsets.UTF_8)) {
+        try (BufferedReader reader = Files.newBufferedReader(Paths.get(gbase), StandardCharsets.UTF_8)) {
             StringBuilder identifier = new StringBuilder();
             while ((position.line = reader.readLine()) != null) {
                 if (position.line.trim().startsWith("//")) {
@@ -693,7 +700,7 @@
     }
 
     private void processExtension() throws MojoExecutionException {
-        try (BufferedReader reader = Files.newBufferedReader(Paths.get(base, gextension), StandardCharsets.UTF_8)) {
+        try (BufferedReader reader = Files.newBufferedReader(Paths.get(gextension), StandardCharsets.UTF_8)) {
             StringBuilder identifier = new StringBuilder();
             String nextOperation = OVERRIDEPRODUCTION;
             while (read || (position.line = reader.readLine()) != null) {
@@ -967,8 +974,8 @@
         int after = block.indexOf(AFTER);
         if (before >= 0) {
             // before exists
-            amendments[beforeIndex] = block.substring(before + BEFORE.length(),
-                    (after >= 0) ? after : block.length() - 1);
+            amendments[beforeIndex] =
+                    block.substring(before + BEFORE.length(), (after >= 0) ? after : block.length() - 1);
             if (amendments[beforeIndex].trim().length() == 0) {
                 amendments[beforeIndex] = null;
             }
@@ -989,7 +996,7 @@
 
     private File prepareOutputFile() throws MojoExecutionException {
         // write output
-        File outputFile = new File(base, output);
+        File outputFile = new File(output);
         if (outputFile.exists() && (!outputFile.delete())) {
             throw new MojoExecutionException("Unable to delete file " + output);
         }
diff --git a/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/pom.xml
index ded41ae..c709277 100644
--- a/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/pom.xml
+++ b/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/pom.xml
@@ -29,11 +29,18 @@
     <version>0.9.4-SNAPSHOT</version>
   </parent>
 
+  <properties>
+    <root.dir>${basedir}/../..</root.dir>
+  </properties>
+
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
       <artifactId>maven-project</artifactId>
-      <version>2.2.1</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
diff --git a/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/src/main/java/org/apache/hyracks/maven/plugin/TestDataGeneratorMojo.java b/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/src/main/java/org/apache/hyracks/maven/plugin/TestDataGeneratorMojo.java
index e1afb43..dc56a29 100644
--- a/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/src/main/java/org/apache/hyracks/maven/plugin/TestDataGeneratorMojo.java
+++ b/asterixdb/asterix-maven-plugins/asterix-test-datagenerator-maven-plugin/src/main/java/org/apache/hyracks/maven/plugin/TestDataGeneratorMojo.java
@@ -55,8 +55,17 @@
      */
     File outputDir;
 
+    /**
+     * @parameter default-value="${maven.test.skip}"
+     */
+    boolean skip;
+
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
+        if (skip) {
+            getLog().info("Skipping plugin execution (configured skip)");
+            return;
+        }
         FileSetManager mgr = new FileSetManager();
         // this seems pretty hacky, but necessary to get the correct result.
         File inputFilesDirectory = new File(inputFiles.getDirectory());
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/pom.xml
index d43aa04..fd5d72b 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/pom.xml
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/pom.xml
@@ -18,7 +18,6 @@
  !-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.asterix</groupId>
   <artifactId>lexer-generator-maven-plugin</artifactId>
   <parent>
     <artifactId>asterix-maven-plugins</artifactId>
@@ -30,7 +29,7 @@
   <name>lexer-generator-maven-plugin</name>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/../..</root.dir>
   </properties>
   <dependencies>
     <dependency>
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/main/java/org/apache/asterix/lexergenerator/LexerGenerator.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/main/java/org/apache/asterix/lexergenerator/LexerGenerator.java
index 3ae7339..83678a5 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/main/java/org/apache/asterix/lexergenerator/LexerGenerator.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/main/java/org/apache/asterix/lexergenerator/LexerGenerator.java
@@ -130,8 +130,7 @@
         StringBuilder result = new StringBuilder();
         Set<String> functions = main.neededAuxFunctions();
         for (String token : functions) {
-            result.append("private int parse_" + token
-                    + "(char currentChar) throws IOException {\n");
+            result.append("private int parse_" + token + "(char currentChar) throws IOException {\n");
             result.append(tokens.get(token).getNode().toJavaAuxFunction());
             result.append("\n}\n\n");
         }
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/Fixtures.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/Fixtures.java
index a6d0267..b7aa5e9 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/Fixtures.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/Fixtures.java
@@ -22,28 +22,28 @@
 import org.apache.asterix.lexergenerator.rules.RuleChar;
 
 public class Fixtures {
-    static  String token_name       = "MYTOKEN";
-    static  String token2_name       = "MYTOKEN2";
-    static  String token_return     = "return TOKEN_MYTOKEN;\n";
-    static  String token2_return     = "return TOKEN_MYTOKEN2;\n";
-    static  String token_parseerror = "return parseError(TOKEN_MYTOKEN);\n";
-    static  String token_tostring   = "! ";
-    static  String rule_action      = "myaction";
-    static  String rule_name        = "myrule";
-    static  String rule_match       = "matchCheck("+rule_name+")";
-    static  String rule2_action     = "myaction2";
-    static  String rule2_name       = "myrule2";
-    static  String rule2_match      = "matchCheck2("+rule_name+")";
+    static String token_name = "MYTOKEN";
+    static String token2_name = "MYTOKEN2";
+    static String token_return = "return TOKEN_MYTOKEN;\n";
+    static String token2_return = "return TOKEN_MYTOKEN2;\n";
+    static String token_parseerror = "return parseError(TOKEN_MYTOKEN);\n";
+    static String token_tostring = "! ";
+    static String rule_action = "myaction";
+    static String rule_name = "myrule";
+    static String rule_match = "matchCheck(" + rule_name + ")";
+    static String rule2_action = "myaction2";
+    static String rule2_name = "myrule2";
+    static String rule2_match = "matchCheck2(" + rule_name + ")";
 
-    static public Rule createRule(final String name){
-        return new Rule(){
-            String rule_name        = name;
-            String rule_action      = "myaction";
-            String rule_match       = "matchCheck("+rule_name+")";
+    static public Rule createRule(final String name) {
+        return new Rule() {
+            String rule_name = name;
+            String rule_action = "myaction";
+            String rule_match = "matchCheck(" + rule_name + ")";
 
             @Override
-            public Rule clone(){
-                return Fixtures.createRule(name+"_clone");
+            public Rule clone() {
+                return Fixtures.createRule(name + "_clone");
             }
 
             @Override
@@ -53,20 +53,20 @@
 
             @Override
             public String javaMatch(String action) {
-                return rule_match+"{"+action+"}";
+                return rule_match + "{" + action + "}";
             }
 
             @Override
-            public String toString(){
+            public String toString() {
                 return rule_name;
             }
 
         };
     }
 
-    static Rule rule = new Rule(){
+    static Rule rule = new Rule() {
 
-        public Rule clone(){
+        public Rule clone() {
             return null;
         }
 
@@ -77,19 +77,19 @@
 
         @Override
         public String javaMatch(String action) {
-            return rule_match+"{"+action+"}";
+            return rule_match + "{" + action + "}";
         }
 
         @Override
-        public String toString(){
+        public String toString() {
             return rule_name;
         }
 
     };
 
-    static Rule rule2 = new Rule(){
+    static Rule rule2 = new Rule() {
 
-        public Rule clone(){
+        public Rule clone() {
             return null;
         }
 
@@ -100,11 +100,11 @@
 
         @Override
         public String javaMatch(String act) {
-            return rule2_match+"{"+act+"}";
+            return rule2_match + "{" + act + "}";
         }
 
         @Override
-        public String toString(){
+        public String toString() {
             return rule2_name;
         }
 
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAddRuleTest.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAddRuleTest.java
index dee1255..da2241c 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAddRuleTest.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAddRuleTest.java
@@ -33,16 +33,10 @@
         node.append(rule);
         node.add(rule2);
         node.appendTokenName(token_name);
-        assertEquals(" ( " + rule_name +token_tostring + " || " + rule2_name + token_tostring + " ) ", node.toString());
-        assertEquals(rule_match+"{"
-                        +"\n" + rule_action
-                        +"\n" +token_return
-                     +"}"
-                     +rule2_match+"{"
-                        +"\n"+rule2_action
-                        +"\n"+token_return
-                     +"}"
-                     +token_parseerror , node.toJava());
+        assertEquals(" ( " + rule_name + token_tostring + " || " + rule2_name + token_tostring + " ) ",
+                node.toString());
+        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + rule2_match + "{" + "\n"
+                + rule2_action + "\n" + token_return + "}" + token_parseerror, node.toJava());
     }
 
     @Test
@@ -52,18 +46,11 @@
         node.add(ruleB);
         node.add(ruleC);
         node.appendTokenName(token_name);
-        assertEquals(" ( a" + token_tostring + " || b" + token_tostring + " || c" + token_tostring + " ) ", node.toString());
-        assertEquals("switch(currentChar){\n" +
-                "case 'a':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "case 'b':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "case 'c':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "}\n"+ token_parseerror , node.toJava());
+        assertEquals(" ( a" + token_tostring + " || b" + token_tostring + " || c" + token_tostring + " ) ",
+                node.toString());
+        assertEquals("switch(currentChar){\n" + "case 'a':" + "\n" + ruleABC_action + "\n" + token_return + "case 'b':"
+                + "\n" + ruleABC_action + "\n" + token_return + "case 'c':" + "\n" + ruleABC_action + "\n"
+                + token_return + "}\n" + token_parseerror, node.toJava());
     }
 
 }
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendNodeTest.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendNodeTest.java
index 206e69b..7838f5b 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendNodeTest.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendNodeTest.java
@@ -23,7 +23,6 @@
 
 import org.junit.Test;
 
-
 import org.apache.asterix.lexergenerator.LexerNode;
 import org.apache.asterix.lexergenerator.rules.RuleEpsilon;
 
@@ -94,6 +93,6 @@
         node.append(node2);
         // TODO
         // assertEquals(" ( A_clone! A_clone!  || A_clone!  ) ", node.toString());
-  }
+    }
 
 }
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendRuleTest.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendRuleTest.java
index e532cf8..28c5e31 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendRuleTest.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAppendRuleTest.java
@@ -31,7 +31,7 @@
         LexerNode node = new LexerNode();
         node.appendTokenName(token_name);
         assertEquals(token_tostring, node.toString());
-        assertEquals(token_return,   node.toJava());
+        assertEquals(token_return, node.toJava());
     }
 
     @Test
@@ -39,11 +39,9 @@
         LexerNode node = new LexerNode();
         node.append(rule);
         node.appendTokenName(token_name);
-        assertEquals(rule_name+token_tostring, node.toString());
-        assertEquals(rule_match+"{"
-                        +"\n"+rule_action
-                        +"\n"+token_return
-                     +"}"+token_parseerror, node.toJava());
+        assertEquals(rule_name + token_tostring, node.toString());
+        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + token_parseerror,
+                node.toJava());
     }
 
     @Test
@@ -52,14 +50,8 @@
         node.append(rule);
         node.append(rule2);
         node.appendTokenName(token_name);
-        assertEquals(rule_name+rule2_name+token_tostring, node.toString());
-        assertEquals(rule_match+"{"
-                        +"\n"+rule_action
-                        +"\n"+rule2_match+"{"
-                            +"\n"+rule2_action
-                            +"\n"+token_return
-                        +"}"
-                        +token_parseerror
-                     +"}"+token_parseerror, node.toJava());
+        assertEquals(rule_name + rule2_name + token_tostring, node.toString());
+        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + rule2_match + "{" + "\n" + rule2_action + "\n"
+                + token_return + "}" + token_parseerror + "}" + token_parseerror, node.toJava());
     }
 }
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAuxFunctionsTest.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAuxFunctionsTest.java
index 677d12e..7fd4aa7 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAuxFunctionsTest.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeAuxFunctionsTest.java
@@ -27,7 +27,6 @@
 
 import org.junit.Test;
 
-
 import org.apache.asterix.lexergenerator.LexerNode;
 import org.apache.asterix.lexergenerator.Token;
 import org.apache.asterix.lexergenerator.rules.RuleEpsilon;
@@ -42,16 +41,10 @@
         node.append(rule);
         node.add(rule2);
         node.appendTokenName(token_name);
-        assertEquals(" ( " + rule_name +token_tostring + " || " + rule2_name + token_tostring + " ) ", node.toString());
-        assertEquals(rule_match+"{"
-                        +"\n" + rule_action
-                        +"\n" +token_return
-                     +"}"
-                     +rule2_match+"{"
-                        +"\n"+rule2_action
-                        +"\n"+token_return
-                     +"}"
-                     +expectedDifferentReturn , node.toJavaAuxFunction());
+        assertEquals(" ( " + rule_name + token_tostring + " || " + rule2_name + token_tostring + " ) ",
+                node.toString());
+        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + rule2_match + "{" + "\n"
+                + rule2_action + "\n" + token_return + "}" + expectedDifferentReturn, node.toJavaAuxFunction());
     }
 
     @Test
@@ -61,18 +54,11 @@
         node.add(ruleB);
         node.add(ruleC);
         node.appendTokenName(token_name);
-        assertEquals(" ( a" + token_tostring + " || b" + token_tostring + " || c" + token_tostring + " ) ", node.toString());
-        assertEquals("switch(currentChar){\n" +
-                "case 'a':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "case 'b':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "case 'c':" +
-                "\n" + ruleABC_action +
-                "\n" + token_return   +
-                "}\n"+ expectedDifferentReturn , node.toJavaAuxFunction());
+        assertEquals(" ( a" + token_tostring + " || b" + token_tostring + " || c" + token_tostring + " ) ",
+                node.toString());
+        assertEquals("switch(currentChar){\n" + "case 'a':" + "\n" + ruleABC_action + "\n" + token_return + "case 'b':"
+                + "\n" + ruleABC_action + "\n" + token_return + "case 'c':" + "\n" + ruleABC_action + "\n"
+                + token_return + "}\n" + expectedDifferentReturn, node.toJavaAuxFunction());
     }
 
     @Test
@@ -90,7 +76,7 @@
         assertEquals(expectedNeededAuxFunctions, node.neededAuxFunctions());
     }
 
-    @Test(expected=Exception.class)
+    @Test(expected = Exception.class)
     public void NodeExpandFirstActionError() throws Exception {
         LexerNode node = new LexerNode();
         node.append(ruleA);
@@ -104,7 +90,8 @@
         try {
             node.expandFirstAction(tokens);
         } catch (Exception e) {
-            assertEquals("Cannot find a token used as part of another definition, missing token: token1", e.getMessage());
+            assertEquals("Cannot find a token used as part of another definition, missing token: token1",
+                    e.getMessage());
             throw e;
         }
     }
diff --git a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeMergeNodeTest.java b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeMergeNodeTest.java
index caee9a5..a9f6012 100644
--- a/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeMergeNodeTest.java
+++ b/asterixdb/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/org/apache/asterix/lexergenerator/LexerNodeMergeNodeTest.java
@@ -67,9 +67,11 @@
         node2.appendTokenName(token2_name);
         node.merge(node2);
 
-        assertEquals(" ( " + rule_name + token_tostring + " || " + rule2_name + token_tostring + " ) ", node.toString());
-        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + rule2_match + "{" + "\n"
-                + rule2_action + "\n" + token2_return + "}return parseError(TOKEN_MYTOKEN,TOKEN_MYTOKEN2);\n",
+        assertEquals(" ( " + rule_name + token_tostring + " || " + rule2_name + token_tostring + " ) ",
+                node.toString());
+        assertEquals(
+                rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + rule2_match + "{" + "\n"
+                        + rule2_action + "\n" + token2_return + "}return parseError(TOKEN_MYTOKEN,TOKEN_MYTOKEN2);\n",
                 node.toJava());
     }
 
diff --git a/asterixdb/asterix-maven-plugins/pom.xml b/asterixdb/asterix-maven-plugins/pom.xml
index c8238a0f..03bce12 100644
--- a/asterixdb/asterix-maven-plugins/pom.xml
+++ b/asterixdb/asterix-maven-plugins/pom.xml
@@ -19,10 +19,15 @@
  !-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.asterix</groupId>
   <artifactId>asterix-maven-plugins</artifactId>
   <packaging>pom</packaging>
 
+  <parent>
+    <artifactId>apache-asterixdb</artifactId>
+    <groupId>org.apache.asterix</groupId>
+    <version>0.9.4-SNAPSHOT</version>
+  </parent>
+
   <licenses>
     <license>
       <name>Apache License, Version 2.0</name>
@@ -33,24 +38,9 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
-  <parent>
-    <artifactId>apache-asterixdb</artifactId>
-    <groupId>org.apache.asterix</groupId>
-    <version>0.9.4-SNAPSHOT</version>
-  </parent>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-plugin-api</artifactId>
-      <type>jar</type>
-      <scope>compile</scope>
-    </dependency>
-  </dependencies>
-
   <modules>
     <module>lexer-generator-maven-plugin</module>
     <module>record-manager-generator-maven-plugin</module>
@@ -58,4 +48,4 @@
     <module>asterix-test-datagenerator-maven-plugin</module>
     <module>asterix-grammar-extension-maven-plugin</module>
   </modules>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/pom.xml b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/pom.xml
index f6a85b9..27656cd 100644
--- a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/pom.xml
+++ b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/pom.xml
@@ -18,7 +18,6 @@
  !-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.asterix</groupId>
   <artifactId>record-manager-generator-maven-plugin</artifactId>
   <parent>
     <artifactId>asterix-maven-plugins</artifactId>
@@ -30,13 +29,16 @@
   <name>record-manager-generator-maven-plugin</name>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/../..</root.dir>
   </properties>
   <dependencies>
     <dependency>
       <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
       <artifactId>maven-model</artifactId>
-      <version>3.3.9</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
diff --git a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/Generator.java b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/Generator.java
index ca53f66..805e194 100644
--- a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/Generator.java
+++ b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/Generator.java
@@ -34,13 +34,8 @@
         SUPPORT
     }
 
-    public static void generateSource(
-            TemplateType tmplType,
-            String packageName,
-            RecordType rec,
-            InputStream is,
-            StringBuilder sb,
-            boolean debug) {
+    public static void generateSource(TemplateType tmplType, String packageName, RecordType rec, InputStream is,
+            StringBuilder sb, boolean debug) {
         try {
             BufferedReader in = new BufferedReader(new InputStreamReader(is));
 
@@ -63,16 +58,12 @@
 
     }
 
-    private static void generateMemoryManagerSource(
-            String packageName,
-            RecordType resource,
-            BufferedReader in,
-            StringBuilder sb,
-            boolean debug) throws IOException {
+    private static void generateMemoryManagerSource(String packageName, RecordType resource, BufferedReader in,
+            StringBuilder sb, boolean debug) throws IOException {
         String line = null;
         String indent = "    ";
 
-        while((line = in.readLine()) != null) {
+        while ((line = in.readLine()) != null) {
             if (line.contains("@PACKAGE@")) {
                 line = line.replace("@PACKAGE@", packageName);
             }
@@ -114,16 +105,12 @@
         }
     }
 
-    private static void generateArenaManagerSource(
-            String packageName,
-            RecordType resource,
-            BufferedReader in,
-            StringBuilder sb,
-            boolean debug) throws IOException {
+    private static void generateArenaManagerSource(String packageName, RecordType resource, BufferedReader in,
+            StringBuilder sb, boolean debug) throws IOException {
         String line = null;
         String indent = "    ";
 
-        while((line = in.readLine()) != null) {
+        while ((line = in.readLine()) != null) {
             if (line.contains("@PACKAGE@")) {
                 line = line.replace("@PACKAGE@", packageName);
             }
@@ -152,13 +139,10 @@
         }
     }
 
-    private static void generateSupportFileSource(
-            String packageName,
-            BufferedReader in,
-            StringBuilder sb,
+    private static void generateSupportFileSource(String packageName, BufferedReader in, StringBuilder sb,
             boolean debug) throws IOException {
         String line = null;
-        while((line = in.readLine()) != null) {
+        while ((line = in.readLine()) != null) {
             if (line.contains("@PACKAGE@")) {
                 line = line.replace("@PACKAGE@", packageName);
             }
diff --git a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/RecordManagerGeneratorMojo.java b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/RecordManagerGeneratorMojo.java
index 909edc3..e5f50d3 100644
--- a/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/RecordManagerGeneratorMojo.java
+++ b/asterixdb/asterix-maven-plugins/record-manager-generator-maven-plugin/src/main/java/org/apache/asterix/recordmanagergenerator/RecordManagerGeneratorMojo.java
@@ -68,7 +68,6 @@
      */
     MavenProject project;
 
-
     String recordManagerTemplate = "RecordManager.java";
     String arenaManagerTemplate = "ArenaManager.java";
     String[] supportTemplates = { "RecordManagerStats.java", "AllocInfo.java", "TypeUtil.java" };
@@ -101,10 +100,8 @@
     }
 
     public void execute() throws MojoExecutionException, MojoFailureException {
-        String outputPath = project.getBuild().getDirectory() + File.separator
-                + "generated-sources" + File.separator
-                + "java" + File.separator
-                + packageName.replace('.', File.separatorChar);
+        String outputPath = project.getBuild().getDirectory() + File.separator + "generated-sources" + File.separator
+                + "java" + File.separator + packageName.replace('.', File.separatorChar);
         File dir = new File(outputPath);
         if (!dir.exists()) {
             dir.mkdirs();
@@ -122,7 +119,8 @@
         }
     }
 
-    private void generateSource(Generator.TemplateType mgrType, String template, String recordType, String outputPath) throws MojoFailureException {
+    private void generateSource(Generator.TemplateType mgrType, String template, String recordType, String outputPath)
+            throws MojoFailureException {
         InputStream is = getClass().getClassLoader().getResourceAsStream(template);
         if (is == null) {
             throw new MojoFailureException("template '" + template + "' not found in classpath");
diff --git a/asterixdb/asterix-metadata/pom.xml b/asterixdb/asterix-metadata/pom.xml
index 139fb09..5f3df49 100644
--- a/asterixdb/asterix-metadata/pom.xml
+++ b/asterixdb/asterix-metadata/pom.xml
@@ -26,7 +26,7 @@
   </parent>
   <artifactId>asterix-metadata</artifactId>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
   <licenses>
     <license>
@@ -56,12 +56,6 @@
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-events</artifactId>
-      <version>${project.version}</version>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-storage-am-lsm-invertedindex</artifactId>
     </dependency>
@@ -118,10 +112,6 @@
       <artifactId>algebricks-core</artifactId>
     </dependency>
     <dependency>
-      <groupId>javax.xml.bind</groupId>
-      <artifactId>jaxb-api</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
@@ -189,5 +179,9 @@
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-common</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/CachingTxnIdFactory.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/CachingTxnIdFactory.java
new file mode 100644
index 0000000..d44bb13
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/CachingTxnIdFactory.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.transactions.ITxnIdFactory;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.asterix.runtime.message.TxnIdBlockRequest;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Represents a factory to generate unique transaction IDs.
+ */
+class CachingTxnIdFactory implements ITxnIdFactory {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private final INcApplicationContext appCtx;
+    private volatile Block block = new Block(0, 0);
+
+    public CachingTxnIdFactory(INcApplicationContext appCtx) {
+        this.appCtx = appCtx;
+    }
+
+    @Override
+    public TxnId create() throws AlgebricksException {
+        while (true) {
+            try {
+                return new TxnId(block.nextId());
+            } catch (BlockExhaustedException ex) {
+                // retry
+                LOGGER.info("block exhausted; obtaining new block from supplier");
+                TxnIdBlockRequest.Block newBlock;
+                try {
+                    newBlock = TxnIdBlockRequest.send(appCtx);
+                } catch (HyracksDataException e) {
+                    throw new AlgebricksException(e);
+                }
+                block = new Block(newBlock.getStartingId(), newBlock.getBlockSize());
+            }
+        }
+    }
+
+    @Override
+    public void ensureMinimumId(long id) throws AlgebricksException {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public long getIdBlock(int blockSize) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public long getMaxTxnId() {
+        return block.endExclusive - 1;
+    }
+
+    static class Block {
+        private static final BlockExhaustedException BLOCK_EXHAUSTED_EXCEPTION = new BlockExhaustedException();
+        private final AtomicLong id;
+        private final long start;
+        private final long endExclusive;
+
+        private Block(long start, long blockSize) {
+            this.id = new AtomicLong(start);
+            this.start = start;
+            this.endExclusive = start + blockSize;
+        }
+
+        private long nextId() throws BlockExhaustedException {
+            long nextId = id.incrementAndGet();
+            if (nextId >= endExclusive && (endExclusive >= start || nextId < start)) {
+                throw BLOCK_EXHAUSTED_EXCEPTION;
+            }
+            return nextId;
+        }
+    }
+
+    private static class BlockExhaustedException extends Exception {
+    }
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/GarbageCollector.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/GarbageCollector.java
deleted file mode 100644
index a97e22a..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/GarbageCollector.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.metadata;
-
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Periodically recycle temporary datasets.
- *
- * @author yingyib
- */
-public class GarbageCollector implements Runnable {
-    private static final Logger LOGGER = Logger.getLogger(GarbageCollector.class.getName());
-
-    // TODO(mblow): make this configurable
-    private static final long CLEANUP_PERIOD = 1;
-    private static final TimeUnit CLEANUP_PERIOD_UNIT = TimeUnit.DAYS;
-
-    static {
-        // Starts the garbage collector thread which
-        // should always be running.
-        Thread gcThread = new Thread(new GarbageCollector(), "Metadata GC");
-        gcThread.setDaemon(true);
-        gcThread.start();
-    }
-
-    @Override
-    @SuppressWarnings({"squid:S2142", "squid:S2189"}) // rethrow/interrupt thread on InterruptedException, endless loop
-    public void run() {
-        LOGGER.info("Starting Metadata GC");
-        while (true) {
-            try {
-                synchronized (this) {
-                    CLEANUP_PERIOD_UNIT.timedWait(this, CLEANUP_PERIOD);
-                }
-                MetadataManager.INSTANCE.cleanupTempDatasets();
-            } catch (InterruptedException e) {
-                break;
-            } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Exception cleaning temp datasets", e);
-            }
-        }
-        LOGGER.info("Exiting Metadata GC");
-    }
-
-    public static void ensure() {
-        // no need to do anything, <clinit> does the work
-    }
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
index b9ced54..47c6432 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/IDatasetDetails.java
@@ -26,28 +26,7 @@
 
 public interface IDatasetDetails extends Serializable {
 
-    public DatasetType getDatasetType();
+    DatasetType getDatasetType();
 
-    public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException;
-
-    /**
-     * @return if the dataset is a temporary dataset.
-     *         Here is a summary of temporary datasets:
-     *         1. Different from a persistent dataset, reads and writes over a temporary dataset do not require any lock.
-     *         Writes over a temporary dataset do not generate any write-ahead update and commit log but generate
-     *         flush log and job commit log.
-     *         2. A temporary dataset can only be an internal dataset, stored in partitioned LSM-Btrees.
-     *         3. All secondary indexes for persistent datasets are supported for temporary datasets.
-     *         4. A temporary dataset will be automatically garbage collected if it is not active in the past 30 days.
-     *         A temporary dataset could be used for the following scenarios:
-     *         1. A data scientist wants to run some one-time data analysis queries over a dataset that s/he pre-processed
-     *         and the dataset is only used by her/himself in an one-query-at-a-time manner.
-     *         2. Articulate AQL with external systems such as Pregelix/IMRU/Spark. A user can first run an AQL
-     *         query to populate a temporary dataset, then kick off an external runtime to read this dataset,
-     *         dump the results of the external runtime to yet-another-temporary dataset, and finally run yet-another AQL
-     *         over the second temporary dataset.
-     */
-    public boolean isTemp();
-
-    public long getLastAccessTime();
+    void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException;
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
index 8f88ca7..a12b079 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
@@ -50,8 +50,6 @@
  */
 public class MetadataCache {
 
-    // Default life time period of a temp dataset. It is 30 days.
-    private final static long TEMP_DATASET_INACTIVE_TIME_THRESHOLD = 3600 * 24 * 30 * 1000L;
     // Key is dataverse name.
     protected final Map<String, Dataverse> dataverses = new HashMap<>();
     // Key is dataverse name. Key of value map is dataset name.
@@ -477,7 +475,7 @@
         }
     }
 
-    public DatasourceAdapter dropAdapter(DatasourceAdapter adapter) {
+    public DatasourceAdapter dropAdapterIfExists(DatasourceAdapter adapter) {
         synchronized (adapters) {
             Map<String, DatasourceAdapter> adaptersInDataverse =
                     adapters.get(adapter.getAdapterIdentifier().getNamespace());
@@ -546,7 +544,7 @@
         }
     }
 
-    public Feed dropFeed(Feed feed) {
+    public Feed dropFeedIfExists(Feed feed) {
         synchronized (feeds) {
             Map<String, Feed> feedsInDataverse = feeds.get(feed.getDataverseName());
             if (feedsInDataverse != null) {
@@ -574,28 +572,6 @@
     }
 
     /**
-     * Clean up temp datasets that are expired.
-     * The garbage collection will pause other dataset operations.
-     */
-    public void cleanupTempDatasets() {
-        synchronized (datasets) {
-            for (Map<String, Dataset> map : datasets.values()) {
-                Iterator<Dataset> datasetIterator = map.values().iterator();
-                while (datasetIterator.hasNext()) {
-                    Dataset dataset = datasetIterator.next();
-                    if (dataset.getDatasetDetails().isTemp()) {
-                        long currentTime = System.currentTimeMillis();
-                        long duration = currentTime - dataset.getDatasetDetails().getLastAccessTime();
-                        if (duration > TEMP_DATASET_INACTIVE_TIME_THRESHOLD) {
-                            datasetIterator.remove();
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
      * Represents a logical operation against the metadata.
      */
     protected class MetadataLogicalOperation {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index 23e6fb0..b2757f2 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -21,18 +21,22 @@
 
 import java.rmi.RemoteException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.asterix.common.config.MetadataProperties;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.ITxnIdFactory;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.metadata.api.IAsterixStateProxy;
 import org.apache.asterix.metadata.api.IExtensionMetadataEntity;
@@ -53,7 +57,7 @@
 import org.apache.asterix.metadata.entities.Node;
 import org.apache.asterix.metadata.entities.NodeGroup;
 import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.transaction.management.service.transaction.JobIdFactory;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 /**
@@ -88,69 +92,72 @@
  * cluster, i.e., metadata transaction ids shall never "accidentally" overlap
  * with transaction ids of regular jobs or other metadata transactions.
  */
-public class MetadataManager implements IMetadataManager {
+public abstract class MetadataManager implements IMetadataManager {
     private final MetadataCache cache = new MetadataCache();
-    protected final IAsterixStateProxy proxy;
+    protected final Collection<IAsterixStateProxy> proxies;
     protected IMetadataNode metadataNode;
     private final ReadWriteLock metadataLatch;
     protected boolean rebindMetadataNode = false;
 
-    // TODO(mblow): replace references of this (non-constant) field with a method, update field name accordingly
+    // TODO(mblow): replace references of this (non-constant) field with a method,
+    // update field name accordingly
     public static IMetadataManager INSTANCE;
 
-    private MetadataManager(IAsterixStateProxy proxy, IMetadataNode metadataNode) {
-        this(proxy);
+    private MetadataManager(Collection<IAsterixStateProxy> proxies, MetadataNode metadataNode) {
+        this(proxies);
         if (metadataNode == null) {
             throw new IllegalArgumentException("Null metadataNode given to MetadataManager");
         }
         this.metadataNode = metadataNode;
     }
 
-    private MetadataManager(IAsterixStateProxy proxy) {
-        if (proxy == null) {
-            throw new IllegalArgumentException("Null proxy given to MetadataManager");
+    private MetadataManager(Collection<IAsterixStateProxy> proxies) {
+        if (proxies == null || proxies.isEmpty()) {
+            throw new IllegalArgumentException("Null / empty list of proxies given to MetadataManager");
         }
-        this.proxy = proxy;
+        this.proxies = proxies;
         this.metadataLatch = new ReentrantReadWriteLock(true);
     }
 
+    protected abstract TxnId createTxnId();
+
     @Override
     public void init() throws HyracksDataException {
-        GarbageCollector.ensure();
+        // no op
     }
 
     @Override
-    public MetadataTransactionContext beginTransaction() throws RemoteException, ACIDException {
-        JobId jobId = JobIdFactory.generateJobId();
-        metadataNode.beginTransaction(jobId);
-        return new MetadataTransactionContext(jobId);
+    public MetadataTransactionContext beginTransaction() throws RemoteException {
+        TxnId txnId = createTxnId();
+        metadataNode.beginTransaction(txnId);
+        return new MetadataTransactionContext(txnId);
     }
 
     @Override
     public void commitTransaction(MetadataTransactionContext ctx) throws RemoteException, ACIDException {
-        metadataNode.commitTransaction(ctx.getJobId());
+        metadataNode.commitTransaction(ctx.getTxnId());
         cache.commit(ctx);
     }
 
     @Override
     public void abortTransaction(MetadataTransactionContext ctx) throws RemoteException, ACIDException {
-        metadataNode.abortTransaction(ctx.getJobId());
+        metadataNode.abortTransaction(ctx.getTxnId());
     }
 
     @Override
     public void lock(MetadataTransactionContext ctx, byte lockMode) throws RemoteException, ACIDException {
-        metadataNode.lock(ctx.getJobId(), lockMode);
+        metadataNode.lock(ctx.getTxnId(), lockMode);
     }
 
     @Override
     public void unlock(MetadataTransactionContext ctx, byte lockMode) throws RemoteException, ACIDException {
-        metadataNode.unlock(ctx.getJobId(), lockMode);
+        metadataNode.unlock(ctx.getTxnId(), lockMode);
     }
 
     @Override
-    public void addDataverse(MetadataTransactionContext ctx, Dataverse dataverse) throws MetadataException {
+    public void addDataverse(MetadataTransactionContext ctx, Dataverse dataverse) throws AlgebricksException {
         try {
-            metadataNode.addDataverse(ctx.getJobId(), dataverse);
+            metadataNode.addDataverse(ctx.getTxnId(), dataverse);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -158,9 +165,9 @@
     }
 
     @Override
-    public void dropDataverse(MetadataTransactionContext ctx, String dataverseName) throws MetadataException {
+    public void dropDataverse(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException {
         try {
-            metadataNode.dropDataverse(ctx.getJobId(), dataverseName);
+            metadataNode.dropDataverse(ctx.getTxnId(), dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -168,16 +175,16 @@
     }
 
     @Override
-    public List<Dataverse> getDataverses(MetadataTransactionContext ctx) throws MetadataException {
+    public List<Dataverse> getDataverses(MetadataTransactionContext ctx) throws AlgebricksException {
         try {
-            return metadataNode.getDataverses(ctx.getJobId());
+            return metadataNode.getDataverses(ctx.getTxnId());
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
     }
 
     @Override
-    public Dataverse getDataverse(MetadataTransactionContext ctx, String dataverseName) throws MetadataException {
+    public Dataverse getDataverse(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException {
         // First look in the context to see if this transaction created the
         // requested dataverse itself (but the dataverse is still uncommitted).
         Dataverse dataverse = ctx.getDataverse(dataverseName);
@@ -197,7 +204,7 @@
             return dataverse;
         }
         try {
-            dataverse = metadataNode.getDataverse(ctx.getJobId(), dataverseName);
+            dataverse = metadataNode.getDataverse(ctx.getTxnId(), dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -211,24 +218,12 @@
 
     @Override
     public List<Dataset> getDataverseDatasets(MetadataTransactionContext ctx, String dataverseName)
-            throws MetadataException {
+            throws AlgebricksException {
         List<Dataset> dataverseDatasets = new ArrayList<>();
-        // add uncommitted temporary datasets
-        for (Dataset dataset : ctx.getDataverseDatasets(dataverseName)) {
-            if (dataset.getDatasetDetails().isTemp()) {
-                dataverseDatasets.add(dataset);
-            }
-        }
-        // add the committed temporary datasets with the cache
-        for (Dataset dataset : cache.getDataverseDatasets(dataverseName)) {
-            if (dataset.getDatasetDetails().isTemp()) {
-                dataverseDatasets.add(dataset);
-            }
-        }
         try {
             // Assuming that the transaction can read its own writes on the
             // metadata node.
-            dataverseDatasets.addAll(metadataNode.getDataverseDatasets(ctx.getJobId(), dataverseName));
+            dataverseDatasets.addAll(metadataNode.getDataverseDatasets(ctx.getTxnId(), dataverseName));
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -238,40 +233,32 @@
     }
 
     @Override
-    public void addDataset(MetadataTransactionContext ctx, Dataset dataset) throws MetadataException {
+    public void addDataset(MetadataTransactionContext ctx, Dataset dataset) throws AlgebricksException {
         // add dataset into metadataNode
-        if (!dataset.getDatasetDetails().isTemp()) {
-            try {
-                metadataNode.addDataset(ctx.getJobId(), dataset);
-            } catch (RemoteException e) {
-                throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
-            }
+        try {
+            metadataNode.addDataset(ctx.getTxnId(), dataset);
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
-
         // reflect the dataset into the cache
         ctx.addDataset(dataset);
     }
 
     @Override
     public void dropDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName)
-            throws MetadataException {
-        Dataset dataset = findDataset(ctx, dataverseName, datasetName);
-        // If a dataset is not in the cache, then it could not be a temp dataset
-        if (dataset == null || !dataset.getDatasetDetails().isTemp()) {
-            try {
-                metadataNode.dropDataset(ctx.getJobId(), dataverseName, datasetName);
-            } catch (RemoteException e) {
-                throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
-            }
+            throws AlgebricksException {
+        try {
+            metadataNode.dropDataset(ctx.getTxnId(), dataverseName, datasetName);
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
-
         // Drops the dataset from cache
         ctx.dropDataset(dataverseName, datasetName);
     }
 
     @Override
     public Dataset getDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName)
-            throws MetadataException {
+            throws AlgebricksException {
 
         // First look in the context to see if this transaction created the
         // requested dataset itself (but the dataset is still uncommitted).
@@ -293,7 +280,7 @@
             return dataset;
         }
         try {
-            dataset = metadataNode.getDataset(ctx.getJobId(), dataverseName, datasetName);
+            dataset = metadataNode.getDataset(ctx.getTxnId(), dataverseName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -307,31 +294,25 @@
 
     @Override
     public List<Index> getDatasetIndexes(MetadataTransactionContext ctx, String dataverseName, String datasetName)
-            throws MetadataException {
+            throws AlgebricksException {
         List<Index> datasetIndexes = new ArrayList<>();
         Dataset dataset = findDataset(ctx, dataverseName, datasetName);
         if (dataset == null) {
             return datasetIndexes;
         }
-        if (dataset.getDatasetDetails().isTemp()) {
-            // for temp datsets
-            datasetIndexes = cache.getDatasetIndexes(dataverseName, datasetName);
-        } else {
-            try {
-                // for persistent datasets
-                datasetIndexes = metadataNode.getDatasetIndexes(ctx.getJobId(), dataverseName, datasetName);
-            } catch (RemoteException e) {
-                throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
-            }
+        try {
+            datasetIndexes = metadataNode.getDatasetIndexes(ctx.getTxnId(), dataverseName, datasetName);
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         return datasetIndexes;
     }
 
     @Override
     public void addCompactionPolicy(MetadataTransactionContext mdTxnCtx, CompactionPolicy compactionPolicy)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.addCompactionPolicy(mdTxnCtx.getJobId(), compactionPolicy);
+            metadataNode.addCompactionPolicy(mdTxnCtx.getTxnId(), compactionPolicy);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -340,11 +321,11 @@
 
     @Override
     public CompactionPolicy getCompactionPolicy(MetadataTransactionContext ctx, String dataverse, String policyName)
-            throws MetadataException {
+            throws AlgebricksException {
 
         CompactionPolicy compactionPolicy;
         try {
-            compactionPolicy = metadataNode.getCompactionPolicy(ctx.getJobId(), dataverse, policyName);
+            compactionPolicy = metadataNode.getCompactionPolicy(ctx.getTxnId(), dataverse, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -352,15 +333,15 @@
     }
 
     @Override
-    public void addDatatype(MetadataTransactionContext ctx, Datatype datatype) throws MetadataException {
+    public void addDatatype(MetadataTransactionContext ctx, Datatype datatype) throws AlgebricksException {
         try {
-            metadataNode.addDatatype(ctx.getJobId(), datatype);
+            metadataNode.addDatatype(ctx.getTxnId(), datatype);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         try {
             ctx.addDatatype(
-                    metadataNode.getDatatype(ctx.getJobId(), datatype.getDataverseName(), datatype.getDatatypeName()));
+                    metadataNode.getDatatype(ctx.getTxnId(), datatype.getDataverseName(), datatype.getDatatypeName()));
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -368,9 +349,9 @@
 
     @Override
     public void dropDatatype(MetadataTransactionContext ctx, String dataverseName, String datatypeName)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.dropDatatype(ctx.getJobId(), dataverseName, datatypeName);
+            metadataNode.dropDatatype(ctx.getTxnId(), dataverseName, datatypeName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -379,7 +360,7 @@
 
     @Override
     public Datatype getDatatype(MetadataTransactionContext ctx, String dataverseName, String datatypeName)
-            throws MetadataException {
+            throws AlgebricksException {
         // First look in the context to see if this transaction created the
         // requested datatype itself (but the datatype is still uncommitted).
         Datatype datatype = ctx.getDatatype(dataverseName, datatypeName);
@@ -397,9 +378,9 @@
         datatype = cache.getDatatype(dataverseName, datatypeName);
         if (datatype != null) {
             // Datatype is already in the cache, don't add it again.
-            //create a new Datatype object with a new ARecordType object in order to avoid
-            //concurrent access to UTF8StringPointable comparator in ARecordType object.
-            //see issue 510
+            // create a new Datatype object with a new ARecordType object in order to avoid
+            // concurrent access to UTF8StringPointable comparator in ARecordType object.
+            // see issue 510
             ARecordType aRecType = (ARecordType) datatype.getDatatype();
             return new Datatype(
                     datatype.getDataverseName(), datatype.getDatatypeName(), new ARecordType(aRecType.getTypeName(),
@@ -407,7 +388,7 @@
                     datatype.getIsAnonymous());
         }
         try {
-            datatype = metadataNode.getDatatype(ctx.getJobId(), dataverseName, datatypeName);
+            datatype = metadataNode.getDatatype(ctx.getTxnId(), dataverseName, datatypeName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -420,24 +401,19 @@
     }
 
     @Override
-    public void addIndex(MetadataTransactionContext ctx, Index index) throws MetadataException {
-        String dataverseName = index.getDataverseName();
-        String datasetName = index.getDatasetName();
-        Dataset dataset = findDataset(ctx, dataverseName, datasetName);
-        if (dataset == null || !dataset.getDatasetDetails().isTemp()) {
-            try {
-                metadataNode.addIndex(ctx.getJobId(), index);
-            } catch (RemoteException e) {
-                throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
-            }
+    public void addIndex(MetadataTransactionContext ctx, Index index) throws AlgebricksException {
+        try {
+            metadataNode.addIndex(ctx.getTxnId(), index);
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         ctx.addIndex(index);
     }
 
     @Override
-    public void addAdapter(MetadataTransactionContext mdTxnCtx, DatasourceAdapter adapter) throws MetadataException {
+    public void addAdapter(MetadataTransactionContext mdTxnCtx, DatasourceAdapter adapter) throws AlgebricksException {
         try {
-            metadataNode.addAdapter(mdTxnCtx.getJobId(), adapter);
+            metadataNode.addAdapter(mdTxnCtx.getTxnId(), adapter);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -447,23 +423,18 @@
 
     @Override
     public void dropIndex(MetadataTransactionContext ctx, String dataverseName, String datasetName, String indexName)
-            throws MetadataException {
-        Dataset dataset = findDataset(ctx, dataverseName, datasetName);
-        // If a dataset is not in the cache, then it could be an unloaded persistent dataset.
-        // If the dataset is a temp dataset, then we do not need to call any MedataNode operations.
-        if (dataset == null || !dataset.getDatasetDetails().isTemp()) {
-            try {
-                metadataNode.dropIndex(ctx.getJobId(), dataverseName, datasetName, indexName);
-            } catch (RemoteException e) {
-                throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
-            }
+            throws AlgebricksException {
+        try {
+            metadataNode.dropIndex(ctx.getTxnId(), dataverseName, datasetName, indexName);
+        } catch (RemoteException e) {
+            throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         ctx.dropIndex(dataverseName, datasetName, indexName);
     }
 
     @Override
     public Index getIndex(MetadataTransactionContext ctx, String dataverseName, String datasetName, String indexName)
-            throws MetadataException {
+            throws AlgebricksException {
 
         // First look in the context to see if this transaction created the
         // requested index itself (but the index is still uncommitted).
@@ -486,7 +457,7 @@
             return index;
         }
         try {
-            index = metadataNode.getIndex(ctx.getJobId(), dataverseName, datasetName, indexName);
+            index = metadataNode.getIndex(ctx.getTxnId(), dataverseName, datasetName, indexName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -499,18 +470,18 @@
     }
 
     @Override
-    public void addNode(MetadataTransactionContext ctx, Node node) throws MetadataException {
+    public void addNode(MetadataTransactionContext ctx, Node node) throws AlgebricksException {
         try {
-            metadataNode.addNode(ctx.getJobId(), node);
+            metadataNode.addNode(ctx.getTxnId(), node);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
     }
 
     @Override
-    public void addNodegroup(MetadataTransactionContext ctx, NodeGroup nodeGroup) throws MetadataException {
+    public void addNodegroup(MetadataTransactionContext ctx, NodeGroup nodeGroup) throws AlgebricksException {
         try {
-            metadataNode.addNodeGroup(ctx.getJobId(), nodeGroup);
+            metadataNode.addNodeGroup(ctx.getTxnId(), nodeGroup);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -519,10 +490,10 @@
 
     @Override
     public void dropNodegroup(MetadataTransactionContext ctx, String nodeGroupName, boolean failSilently)
-            throws MetadataException {
+            throws AlgebricksException {
         boolean dropped;
         try {
-            dropped = metadataNode.dropNodegroup(ctx.getJobId(), nodeGroupName, failSilently);
+            dropped = metadataNode.dropNodegroup(ctx.getTxnId(), nodeGroupName, failSilently);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -532,7 +503,7 @@
     }
 
     @Override
-    public NodeGroup getNodegroup(MetadataTransactionContext ctx, String nodeGroupName) throws MetadataException {
+    public NodeGroup getNodegroup(MetadataTransactionContext ctx, String nodeGroupName) throws AlgebricksException {
         // First look in the context to see if this transaction created the
         // requested dataverse itself (but the dataverse is still uncommitted).
         NodeGroup nodeGroup = ctx.getNodeGroup(nodeGroupName);
@@ -552,7 +523,7 @@
             return nodeGroup;
         }
         try {
-            nodeGroup = metadataNode.getNodeGroup(ctx.getJobId(), nodeGroupName);
+            nodeGroup = metadataNode.getNodeGroup(ctx.getTxnId(), nodeGroupName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -565,9 +536,9 @@
     }
 
     @Override
-    public void addFunction(MetadataTransactionContext mdTxnCtx, Function function) throws MetadataException {
+    public void addFunction(MetadataTransactionContext mdTxnCtx, Function function) throws AlgebricksException {
         try {
-            metadataNode.addFunction(mdTxnCtx.getJobId(), function);
+            metadataNode.addFunction(mdTxnCtx.getTxnId(), function);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -576,9 +547,9 @@
 
     @Override
     public void dropFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.dropFunction(ctx.getJobId(), functionSignature);
+            metadataNode.dropFunction(ctx.getTxnId(), functionSignature);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -587,7 +558,7 @@
 
     @Override
     public Function getFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature)
-            throws MetadataException {
+            throws AlgebricksException {
         // First look in the context to see if this transaction created the
         // requested dataset itself (but the dataset is still uncommitted).
         Function function = ctx.getFunction(functionSignature);
@@ -612,7 +583,7 @@
             return function;
         }
         try {
-            function = metadataNode.getFunction(ctx.getJobId(), functionSignature);
+            function = metadataNode.getFunction(ctx.getTxnId(), functionSignature);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -626,9 +597,10 @@
     }
 
     @Override
-    public List<Function> getFunctions(MetadataTransactionContext ctx, String dataverseName) throws MetadataException {
+    public List<Function> getFunctions(MetadataTransactionContext ctx, String dataverseName)
+            throws AlgebricksException {
         try {
-           return metadataNode.getFunctions(ctx.getJobId(), dataverseName);
+            return metadataNode.getFunctions(ctx.getTxnId(), dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(e);
         }
@@ -636,9 +608,9 @@
 
     @Override
     public void addFeedPolicy(MetadataTransactionContext mdTxnCtx, FeedPolicyEntity feedPolicy)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.addFeedPolicy(mdTxnCtx.getJobId(), feedPolicy);
+            metadataNode.addFeedPolicy(mdTxnCtx.getTxnId(), feedPolicy);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -646,16 +618,16 @@
     }
 
     @Override
-    public void initializeDatasetIdFactory(MetadataTransactionContext ctx) throws MetadataException {
+    public void initializeDatasetIdFactory(MetadataTransactionContext ctx) throws AlgebricksException {
         try {
-            metadataNode.initializeDatasetIdFactory(ctx.getJobId());
+            metadataNode.initializeDatasetIdFactory(ctx.getTxnId());
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
     }
 
     @Override
-    public int getMostRecentDatasetId() throws MetadataException {
+    public int getMostRecentDatasetId() throws AlgebricksException {
         try {
             return metadataNode.getMostRecentDatasetId();
         } catch (RemoteException e) {
@@ -665,12 +637,12 @@
 
     @Override
     public List<Function> getDataverseFunctions(MetadataTransactionContext ctx, String dataverseName)
-            throws MetadataException {
+            throws AlgebricksException {
         List<Function> dataverseFunctions;
         try {
             // Assuming that the transaction can read its own writes on the
             // metadata node.
-            dataverseFunctions = metadataNode.getDataverseFunctions(ctx.getJobId(), dataverseName);
+            dataverseFunctions = metadataNode.getDataverseFunctions(ctx.getTxnId(), dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -681,20 +653,21 @@
 
     @Override
     public void dropAdapter(MetadataTransactionContext ctx, String dataverseName, String name)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.dropAdapter(ctx.getJobId(), dataverseName, name);
+            metadataNode.dropAdapter(ctx.getTxnId(), dataverseName, name);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
+        ctx.dropAdapter(dataverseName, name);
     }
 
     @Override
     public DatasourceAdapter getAdapter(MetadataTransactionContext ctx, String dataverseName, String name)
-            throws MetadataException {
+            throws AlgebricksException {
         DatasourceAdapter adapter;
         try {
-            adapter = metadataNode.getAdapter(ctx.getJobId(), dataverseName, name);
+            adapter = metadataNode.getAdapter(ctx.getTxnId(), dataverseName, name);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -703,9 +676,9 @@
 
     @Override
     public void dropLibrary(MetadataTransactionContext ctx, String dataverseName, String libraryName)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.dropLibrary(ctx.getJobId(), dataverseName, libraryName);
+            metadataNode.dropLibrary(ctx.getTxnId(), dataverseName, libraryName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -714,12 +687,12 @@
 
     @Override
     public List<Library> getDataverseLibraries(MetadataTransactionContext ctx, String dataverseName)
-            throws MetadataException {
+            throws AlgebricksException {
         List<Library> dataverseLibaries;
         try {
             // Assuming that the transaction can read its own writes on the
             // metadata node.
-            dataverseLibaries = metadataNode.getDataverseLibraries(ctx.getJobId(), dataverseName);
+            dataverseLibaries = metadataNode.getDataverseLibraries(ctx.getTxnId(), dataverseName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -729,9 +702,9 @@
     }
 
     @Override
-    public void addLibrary(MetadataTransactionContext ctx, Library library) throws MetadataException {
+    public void addLibrary(MetadataTransactionContext ctx, Library library) throws AlgebricksException {
         try {
-            metadataNode.addLibrary(ctx.getJobId(), library);
+            metadataNode.addLibrary(ctx.getTxnId(), library);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -740,10 +713,10 @@
 
     @Override
     public Library getLibrary(MetadataTransactionContext ctx, String dataverseName, String libraryName)
-            throws MetadataException, RemoteException {
+            throws AlgebricksException, RemoteException {
         Library library;
         try {
-            library = metadataNode.getLibrary(ctx.getJobId(), dataverseName, libraryName);
+            library = metadataNode.getLibrary(ctx.getTxnId(), dataverseName, libraryName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -772,11 +745,11 @@
 
     @Override
     public FeedPolicyEntity getFeedPolicy(MetadataTransactionContext ctx, String dataverse, String policyName)
-            throws MetadataException {
+            throws AlgebricksException {
 
         FeedPolicyEntity feedPolicy;
         try {
-            feedPolicy = metadataNode.getFeedPolicy(ctx.getJobId(), dataverse, policyName);
+            feedPolicy = metadataNode.getFeedPolicy(ctx.getTxnId(), dataverse, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -784,10 +757,10 @@
     }
 
     @Override
-    public Feed getFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws MetadataException {
+    public Feed getFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws AlgebricksException {
         Feed feed;
         try {
-            feed = metadataNode.getFeed(ctx.getJobId(), dataverse, feedName);
+            feed = metadataNode.getFeed(ctx.getTxnId(), dataverse, feedName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -795,10 +768,10 @@
     }
 
     @Override
-    public List<Feed> getFeeds(MetadataTransactionContext ctx, String dataverse) throws MetadataException {
+    public List<Feed> getFeeds(MetadataTransactionContext ctx, String dataverse) throws AlgebricksException {
         List<Feed> feeds;
         try {
-            feeds = metadataNode.getFeeds(ctx.getJobId(), dataverse);
+            feeds = metadataNode.getFeeds(ctx.getTxnId(), dataverse);
         } catch (RemoteException e) {
             throw new MetadataException(e);
         }
@@ -806,15 +779,15 @@
     }
 
     @Override
-    public void dropFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws MetadataException {
+    public void dropFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws AlgebricksException {
         Feed feed = null;
         List<FeedConnection> feedConnections = null;
         try {
-            feed = metadataNode.getFeed(ctx.getJobId(), dataverse, feedName);
-            feedConnections = metadataNode.getFeedConnections(ctx.getJobId(), dataverse, feedName);
-            metadataNode.dropFeed(ctx.getJobId(), dataverse, feedName);
+            feed = metadataNode.getFeed(ctx.getTxnId(), dataverse, feedName);
+            feedConnections = metadataNode.getFeedConnections(ctx.getTxnId(), dataverse, feedName);
+            metadataNode.dropFeed(ctx.getTxnId(), dataverse, feedName);
             for (FeedConnection feedConnection : feedConnections) {
-                metadataNode.dropFeedConnection(ctx.getJobId(), dataverse, feedName, feedConnection.getDatasetName());
+                metadataNode.dropFeedConnection(ctx.getTxnId(), dataverse, feedName, feedConnection.getDatasetName());
                 ctx.dropFeedConnection(dataverse, feedName, feedConnection.getDatasetName());
             }
         } catch (RemoteException e) {
@@ -824,9 +797,9 @@
     }
 
     @Override
-    public void addFeed(MetadataTransactionContext ctx, Feed feed) throws MetadataException {
+    public void addFeed(MetadataTransactionContext ctx, Feed feed) throws AlgebricksException {
         try {
-            metadataNode.addFeed(ctx.getJobId(), feed);
+            metadataNode.addFeed(ctx.getTxnId(), feed);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -835,9 +808,9 @@
 
     @Override
     public void addFeedConnection(MetadataTransactionContext ctx, FeedConnection feedConnection)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.addFeedConnection(ctx.getJobId(), feedConnection);
+            metadataNode.addFeedConnection(ctx.getTxnId(), feedConnection);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -846,9 +819,9 @@
 
     @Override
     public void dropFeedConnection(MetadataTransactionContext ctx, String dataverseName, String feedName,
-            String datasetName) throws MetadataException {
+            String datasetName) throws AlgebricksException {
         try {
-            metadataNode.dropFeedConnection(ctx.getJobId(), dataverseName, feedName, datasetName);
+            metadataNode.dropFeedConnection(ctx.getTxnId(), dataverseName, feedName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -857,9 +830,9 @@
 
     @Override
     public FeedConnection getFeedConnection(MetadataTransactionContext ctx, String dataverseName, String feedName,
-            String datasetName) throws MetadataException {
+            String datasetName) throws AlgebricksException {
         try {
-            return metadataNode.getFeedConnection(ctx.getJobId(), dataverseName, feedName, datasetName);
+            return metadataNode.getFeedConnection(ctx.getTxnId(), dataverseName, feedName, datasetName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -867,9 +840,9 @@
 
     @Override
     public List<FeedConnection> getFeedConections(MetadataTransactionContext ctx, String dataverseName, String feedName)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            return metadataNode.getFeedConnections(ctx.getJobId(), dataverseName, feedName);
+            return metadataNode.getFeedConnections(ctx.getTxnId(), dataverseName, feedName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -877,10 +850,10 @@
 
     @Override
     public List<DatasourceAdapter> getDataverseAdapters(MetadataTransactionContext mdTxnCtx, String dataverse)
-            throws MetadataException {
+            throws AlgebricksException {
         List<DatasourceAdapter> dataverseAdapters;
         try {
-            dataverseAdapters = metadataNode.getDataverseAdapters(mdTxnCtx.getJobId(), dataverse);
+            dataverseAdapters = metadataNode.getDataverseAdapters(mdTxnCtx.getTxnId(), dataverse);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -889,11 +862,11 @@
 
     @Override
     public void dropFeedPolicy(MetadataTransactionContext mdTxnCtx, String dataverseName, String policyName)
-            throws MetadataException {
+            throws AlgebricksException {
         FeedPolicyEntity feedPolicy;
         try {
-            feedPolicy = metadataNode.getFeedPolicy(mdTxnCtx.getJobId(), dataverseName, policyName);
-            metadataNode.dropFeedPolicy(mdTxnCtx.getJobId(), dataverseName, policyName);
+            feedPolicy = metadataNode.getFeedPolicy(mdTxnCtx.getTxnId(), dataverseName, policyName);
+            metadataNode.dropFeedPolicy(mdTxnCtx.getTxnId(), dataverseName, policyName);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -901,10 +874,10 @@
     }
 
     public List<FeedPolicyEntity> getDataversePolicies(MetadataTransactionContext mdTxnCtx, String dataverse)
-            throws MetadataException {
+            throws AlgebricksException {
         List<FeedPolicyEntity> dataverseFeedPolicies;
         try {
-            dataverseFeedPolicies = metadataNode.getDataversePolicies(mdTxnCtx.getJobId(), dataverse);
+            dataverseFeedPolicies = metadataNode.getDataversePolicies(mdTxnCtx.getTxnId(), dataverse);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -913,10 +886,10 @@
 
     @Override
     public List<ExternalFile> getDatasetExternalFiles(MetadataTransactionContext mdTxnCtx, Dataset dataset)
-            throws MetadataException {
+            throws AlgebricksException {
         List<ExternalFile> externalFiles;
         try {
-            externalFiles = metadataNode.getExternalFiles(mdTxnCtx.getJobId(), dataset);
+            externalFiles = metadataNode.getExternalFiles(mdTxnCtx.getTxnId(), dataset);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -924,18 +897,18 @@
     }
 
     @Override
-    public void addExternalFile(MetadataTransactionContext ctx, ExternalFile externalFile) throws MetadataException {
+    public void addExternalFile(MetadataTransactionContext ctx, ExternalFile externalFile) throws AlgebricksException {
         try {
-            metadataNode.addExternalFile(ctx.getJobId(), externalFile);
+            metadataNode.addExternalFile(ctx.getTxnId(), externalFile);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
     }
 
     @Override
-    public void dropExternalFile(MetadataTransactionContext ctx, ExternalFile externalFile) throws MetadataException {
+    public void dropExternalFile(MetadataTransactionContext ctx, ExternalFile externalFile) throws AlgebricksException {
         try {
-            metadataNode.dropExternalFile(ctx.getJobId(), externalFile.getDataverseName(),
+            metadataNode.dropExternalFile(ctx.getTxnId(), externalFile.getDataverseName(),
                     externalFile.getDatasetName(), externalFile.getFileNumber());
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
@@ -944,31 +917,31 @@
 
     @Override
     public ExternalFile getExternalFile(MetadataTransactionContext ctx, String dataverseName, String datasetName,
-            Integer fileNumber) throws MetadataException {
+            Integer fileNumber) throws AlgebricksException {
         ExternalFile file;
         try {
-            file = metadataNode.getExternalFile(ctx.getJobId(), dataverseName, datasetName, fileNumber);
+            file = metadataNode.getExternalFile(ctx.getTxnId(), dataverseName, datasetName, fileNumber);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
         return file;
     }
 
-    //TODO: Optimize <-- use keys instead of object -->
+    // TODO: Optimize <-- use keys instead of object -->
     @Override
     public void dropDatasetExternalFiles(MetadataTransactionContext mdTxnCtx, Dataset dataset)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.dropExternalFiles(mdTxnCtx.getJobId(), dataset);
+            metadataNode.dropExternalFiles(mdTxnCtx.getTxnId(), dataset);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
     }
 
     @Override
-    public void updateDataset(MetadataTransactionContext ctx, Dataset dataset) throws MetadataException {
+    public void updateDataset(MetadataTransactionContext ctx, Dataset dataset) throws AlgebricksException {
         try {
-            metadataNode.updateDataset(ctx.getJobId(), dataset);
+            metadataNode.updateDataset(ctx.getTxnId(), dataset);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -977,11 +950,6 @@
         ctx.addDataset(dataset);
     }
 
-    @Override
-    public void cleanupTempDatasets() {
-        cache.cleanupTempDatasets();
-    }
-
     public Dataset findDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName) {
         Dataset dataset = ctx.getDataset(dataverseName, datasetName);
         if (dataset == null) {
@@ -992,9 +960,9 @@
 
     @Override
     public <T extends IExtensionMetadataEntity> void addEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.addEntity(mdTxnCtx.getJobId(), entity);
+            metadataNode.addEntity(mdTxnCtx.getTxnId(), entity);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1002,9 +970,9 @@
 
     @Override
     public <T extends IExtensionMetadataEntity> void upsertEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.upsertEntity(mdTxnCtx.getJobId(), entity);
+            metadataNode.upsertEntity(mdTxnCtx.getTxnId(), entity);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1012,9 +980,9 @@
 
     @Override
     public <T extends IExtensionMetadataEntity> void deleteEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
-            metadataNode.deleteEntity(mdTxnCtx.getJobId(), entity);
+            metadataNode.deleteEntity(mdTxnCtx.getTxnId(), entity);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1022,9 +990,9 @@
 
     @Override
     public <T extends IExtensionMetadataEntity> List<T> getEntities(MetadataTransactionContext mdTxnCtx,
-            IExtensionMetadataSearchKey searchKey) throws MetadataException {
+            IExtensionMetadataSearchKey searchKey) throws AlgebricksException {
         try {
-            return metadataNode.getEntities(mdTxnCtx.getJobId(), searchKey);
+            return metadataNode.getEntities(mdTxnCtx.getTxnId(), searchKey);
         } catch (RemoteException e) {
             throw new MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
         }
@@ -1035,20 +1003,40 @@
         rebindMetadataNode = true;
     }
 
-    public static void initialize(IAsterixStateProxy proxy, MetadataProperties metadataProperties) {
-        INSTANCE = new CCMetadataManagerImpl(proxy, metadataProperties);
+    public static void initialize(IAsterixStateProxy proxy, MetadataProperties metadataProperties,
+            ICcApplicationContext appCtx) {
+        INSTANCE = new CCMetadataManagerImpl(proxy, metadataProperties, appCtx);
     }
 
-    public static void initialize(IAsterixStateProxy proxy, MetadataNode metadataNode) {
-        INSTANCE = new MetadataManager(proxy, metadataNode);
+    public static void initialize(Collection<IAsterixStateProxy> proxies, MetadataNode metadataNode) {
+        INSTANCE = new NCMetadataManagerImpl(proxies, metadataNode);
     }
 
     private static class CCMetadataManagerImpl extends MetadataManager {
         private final MetadataProperties metadataProperties;
+        private final ICcApplicationContext appCtx;
 
-        public CCMetadataManagerImpl(IAsterixStateProxy proxy, MetadataProperties metadataProperties) {
-            super(proxy);
+        CCMetadataManagerImpl(IAsterixStateProxy proxy, MetadataProperties metadataProperties,
+                ICcApplicationContext appCtx) {
+            super(Collections.singleton(proxy));
             this.metadataProperties = metadataProperties;
+            this.appCtx = appCtx;
+        }
+
+        @Override
+        protected TxnId createTxnId() {
+            TxnId txnId;
+            try {
+                txnId = appCtx.getTxnIdFactory().create();
+            } catch (AlgebricksException e) {
+                throw new ACIDException(e);
+            }
+            return txnId;
+        }
+
+        @Override
+        public long getMaxTxnId() {
+            return appCtx.getTxnIdFactory().getMaxTxnId();
         }
 
         @Override
@@ -1057,8 +1045,8 @@
                 return;
             }
             try {
-                metadataNode =
-                        proxy.waitForMetadataNode(metadataProperties.getRegistrationTimeoutSecs(), TimeUnit.SECONDS);
+                metadataNode = proxies.iterator().next()
+                        .waitForMetadataNode(metadataProperties.getRegistrationTimeoutSecs(), TimeUnit.SECONDS);
                 if (metadataNode != null) {
                     rebindMetadataNode = false;
                 } else {
@@ -1075,4 +1063,27 @@
             super.init();
         }
     }
+
+    private static class NCMetadataManagerImpl extends MetadataManager {
+        private final ITxnIdFactory txnIdFactory;
+
+        NCMetadataManagerImpl(Collection<IAsterixStateProxy> proxies, MetadataNode metadataNode) {
+            super(proxies, metadataNode);
+            txnIdFactory = metadataNode.getTxnIdFactory();
+        }
+
+        @Override
+        protected TxnId createTxnId() {
+            try {
+                return txnIdFactory.create();
+            } catch (AlgebricksException e) {
+                throw new ACIDException(e);
+            }
+        }
+
+        @Override
+        public long getMaxTxnId() {
+            return txnIdFactory.getMaxTxnId();
+        }
+    }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 51cf988..681bae7 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -25,8 +25,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.INcApplicationContext;
@@ -34,16 +32,18 @@
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.common.dataflow.LSMIndexUtil;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
 import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
+import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.common.transactions.ImmutableDatasetId;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.api.ExtensionMetadataDataset;
@@ -100,7 +100,7 @@
 import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexModificationOperationCallback;
 import org.apache.asterix.transaction.management.opcallbacks.UpsertOperationCallback;
 import org.apache.asterix.transaction.management.service.transaction.DatasetIdFactory;
-import org.apache.asterix.transaction.management.service.transaction.TransactionContext;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -111,13 +111,14 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -125,7 +126,6 @@
 
 public class MetadataNode implements IMetadataNode {
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(MetadataNode.class.getName());
     private static final DatasetId METADATA_DATASET_ID =
             new ImmutableDatasetId(MetadataPrimaryIndexes.PROPERTIES_METADATA.getDatasetId());
 
@@ -133,6 +133,7 @@
     private IDatasetLifecycleManager datasetLifecycleManager;
     private ITransactionSubsystem transactionSubsystem;
     private int metadataStoragePartition;
+    private transient CachingTxnIdFactory txnIdFactory;
     // core only
     private transient MetadataTupleTranslatorProvider tupleTranslatorProvider;
     // extension only
@@ -145,11 +146,12 @@
     }
 
     public void initialize(INcApplicationContext runtimeContext,
-            MetadataTupleTranslatorProvider tupleTranslatorProvider, List<IMetadataExtension> metadataExtensions) {
+            MetadataTupleTranslatorProvider tupleTranslatorProvider, List<IMetadataExtension> metadataExtensions,
+            int partitionId) {
         this.tupleTranslatorProvider = tupleTranslatorProvider;
         this.transactionSubsystem = runtimeContext.getTransactionSubsystem();
         this.datasetLifecycleManager = runtimeContext.getDatasetLifecycleManager();
-        this.metadataStoragePartition = runtimeContext.getMetadataProperties().getMetadataPartition().getPartitionId();
+        this.metadataStoragePartition = partitionId;
         if (metadataExtensions != null) {
             extensionDatasets = new HashMap<>();
             for (IMetadataExtension metadataExtension : metadataExtensions) {
@@ -158,41 +160,38 @@
                 }
             }
         }
+        this.txnIdFactory = new CachingTxnIdFactory(runtimeContext);
+    }
+
+    public int getMetadataStoragePartition() {
+        return metadataStoragePartition;
     }
 
     @Override
-    public void beginTransaction(JobId transactionId) throws ACIDException, RemoteException {
-        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().beginTransaction(transactionId);
-        txnCtx.setMetadataTransaction(true);
+    public void beginTransaction(TxnId transactionId) throws ACIDException, RemoteException {
+        TransactionOptions options = new TransactionOptions(AtomicityLevel.ATOMIC);
+        transactionSubsystem.getTransactionManager().beginTransaction(transactionId, options);
     }
 
     @Override
-    public void commitTransaction(JobId jobId) throws RemoteException, ACIDException {
-        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-        transactionSubsystem.getTransactionManager().commitTransaction(txnCtx, DatasetId.NULL, -1);
+    public void commitTransaction(TxnId txnId) throws RemoteException, ACIDException {
+        transactionSubsystem.getTransactionManager().commitTransaction(txnId);
     }
 
     @Override
-    public void abortTransaction(JobId jobId) throws RemoteException, ACIDException {
-        try {
-            ITransactionContext txnCtx =
-                    transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            transactionSubsystem.getTransactionManager().abortTransaction(txnCtx, DatasetId.NULL, -1);
-        } catch (ACIDException e) {
-            LOGGER.log(Level.WARNING, "Exception aborting transaction", e);
-            throw e;
-        }
+    public void abortTransaction(TxnId txnId) throws RemoteException, ACIDException {
+        transactionSubsystem.getTransactionManager().abortTransaction(txnId);
     }
 
     @Override
-    public void lock(JobId jobId, byte lockMode) throws ACIDException, RemoteException {
-        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
+    public void lock(TxnId txnId, byte lockMode) throws ACIDException, RemoteException {
+        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(txnId);
         transactionSubsystem.getLockManager().lock(METADATA_DATASET_ID, -1, lockMode, txnCtx);
     }
 
     @Override
-    public void unlock(JobId jobId, byte lockMode) throws ACIDException, RemoteException {
-        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
+    public void unlock(TxnId txnId, byte lockMode) throws ACIDException, RemoteException {
+        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(txnId);
         transactionSubsystem.getLockManager().unlock(METADATA_DATASET_ID, -1, lockMode, txnCtx);
     }
 
@@ -200,158 +199,154 @@
     /**
      * Add entity to index
      *
-     * @param jobId
+     * @param txnId
      * @param entity
      * @param tupleTranslator
      * @param index
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    private <T> void addEntity(JobId jobId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
-            IMetadataIndex index) throws MetadataException {
+    private <T> void addEntity(TxnId txnId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
+            IMetadataIndex index) throws AlgebricksException {
         try {
             ITupleReference tuple = tupleTranslator.getTupleFromMetadataEntity(entity);
-            insertTupleIntoIndex(jobId, index, tuple);
+            insertTupleIntoIndex(txnId, index, tuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     /**
      * Upsert entity to index
      *
-     * @param jobId
+     * @param txnId
      * @param entity
      * @param tupleTranslator
      * @param index
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    private <T> void upsertEntity(JobId jobId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
-            IMetadataIndex index) throws MetadataException {
+    private <T> void upsertEntity(TxnId txnId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
+            IMetadataIndex index) throws AlgebricksException {
         try {
             ITupleReference tuple = tupleTranslator.getTupleFromMetadataEntity(entity);
-            upsertTupleIntoIndex(jobId, index, tuple);
+            upsertTupleIntoIndex(txnId, index, tuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     /**
      * Delete entity from index
      *
-     * @param jobId
+     * @param txnId
      * @param entity
      * @param tupleTranslator
      * @param index
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    private <T> void deleteEntity(JobId jobId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
-            IMetadataIndex index) throws MetadataException {
+    private <T> void deleteEntity(TxnId txnId, T entity, IMetadataEntityTupleTranslator<T> tupleTranslator,
+            IMetadataIndex index) throws AlgebricksException {
         try {
             ITupleReference tuple = tupleTranslator.getTupleFromMetadataEntity(entity);
-            deleteTupleFromIndex(jobId, index, tuple);
+            deleteTupleFromIndex(txnId, index, tuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     /**
      * retrieve all entities that matches the searchKey
      *
-     * @param jobId
+     * @param txnId
      * @param searchKey
      * @param tupleTranslator
      * @param index
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    private <T> List<T> getEntities(JobId jobId, ITupleReference searchKey,
+    private <T> List<T> getEntities(TxnId txnId, ITupleReference searchKey,
             IMetadataEntityTupleTranslator<T> tupleTranslator, IMetadataIndex index)
-            throws MetadataException, RemoteException {
+            throws AlgebricksException, RemoteException {
         try {
             IValueExtractor<T> valueExtractor = new MetadataEntityValueExtractor<>(tupleTranslator);
             List<T> results = new ArrayList<>();
-            searchIndex(jobId, index, searchKey, valueExtractor, results);
+            searchIndex(txnId, index, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <T extends IExtensionMetadataEntity> void addEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException {
+    public <T extends IExtensionMetadataEntity> void addEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException {
         ExtensionMetadataDataset<T> index = (ExtensionMetadataDataset<T>) extensionDatasets.get(entity.getDatasetId());
         if (index == null) {
-            throw new MetadataException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
+            throw new AlgebricksException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
         }
         IMetadataEntityTupleTranslator<T> tupleTranslator = index.getTupleTranslator();
-        addEntity(jobId, entity, tupleTranslator, index);
+        addEntity(txnId, entity, tupleTranslator, index);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <T extends IExtensionMetadataEntity> void upsertEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException {
+    public <T extends IExtensionMetadataEntity> void upsertEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException {
         ExtensionMetadataDataset<T> index = (ExtensionMetadataDataset<T>) extensionDatasets.get(entity.getDatasetId());
         if (index == null) {
-            throw new MetadataException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
+            throw new AlgebricksException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
         }
         IMetadataEntityTupleTranslator<T> tupleTranslator = index.getTupleTranslator();
-        upsertEntity(jobId, entity, tupleTranslator, index);
+        upsertEntity(txnId, entity, tupleTranslator, index);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <T extends IExtensionMetadataEntity> void deleteEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException {
+    public <T extends IExtensionMetadataEntity> void deleteEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException {
         ExtensionMetadataDataset<T> index = (ExtensionMetadataDataset<T>) extensionDatasets.get(entity.getDatasetId());
         if (index == null) {
-            throw new MetadataException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
+            throw new AlgebricksException("Metadata Extension Index: " + entity.getDatasetId() + " was not found");
         }
         IMetadataEntityTupleTranslator<T> tupleTranslator = index.getTupleTranslator();
-        deleteEntity(jobId, entity, tupleTranslator, index);
+        deleteEntity(txnId, entity, tupleTranslator, index);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
-    public <T extends IExtensionMetadataEntity> List<T> getEntities(JobId jobId, IExtensionMetadataSearchKey searchKey)
-            throws MetadataException, RemoteException {
+    public <T extends IExtensionMetadataEntity> List<T> getEntities(TxnId txnId, IExtensionMetadataSearchKey searchKey)
+            throws AlgebricksException, RemoteException {
         ExtensionMetadataDataset<T> index =
                 (ExtensionMetadataDataset<T>) extensionDatasets.get(searchKey.getDatasetId());
         if (index == null) {
-            throw new MetadataException("Metadata Extension Index: " + searchKey.getDatasetId() + " was not found");
+            throw new AlgebricksException("Metadata Extension Index: " + searchKey.getDatasetId() + " was not found");
         }
         IMetadataEntityTupleTranslator<T> tupleTranslator = index.getTupleTranslator();
-        return getEntities(jobId, searchKey.getSearchKey(), tupleTranslator, index);
+        return getEntities(txnId, searchKey.getSearchKey(), tupleTranslator, index);
     }
 
     @Override
-    public void addDataverse(JobId jobId, Dataverse dataverse) throws MetadataException, RemoteException {
+    public void addDataverse(TxnId txnId, Dataverse dataverse) throws AlgebricksException, RemoteException {
         try {
             DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(true);
             ITupleReference tuple = tupleReaderWriter.getTupleFromMetadataEntity(dataverse);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.DATAVERSE_DATASET, tuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.DATAVERSE_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException(
+                throw new AlgebricksException(
                         "A dataverse with this name " + dataverse.getDataverseName() + " already exists.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addDataset(JobId jobId, Dataset dataset) throws MetadataException, RemoteException {
+    public void addDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'dataset' dataset.
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(true);
             ITupleReference datasetTuple = tupleReaderWriter.getTupleFromMetadataEntity(dataset);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
 
             if (dataset.getDatasetType() == DatasetType.INTERNAL) {
                 // Add the primary index for the dataset.
@@ -360,256 +355,240 @@
                         dataset.getDatasetName(), IndexType.BTREE, id.getPrimaryKey(), id.getKeySourceIndicator(),
                         id.getPrimaryKeyType(), false, false, true, dataset.getPendingOp());
 
-                addIndex(jobId, primaryIndex);
+                addIndex(txnId, primaryIndex);
             }
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A dataset with this name " + dataset.getDatasetName()
+                throw new AlgebricksException("A dataset with this name " + dataset.getDatasetName()
                         + " already exists in dataverse '" + dataset.getDataverseName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addIndex(JobId jobId, Index index) throws MetadataException, RemoteException {
+    public void addIndex(TxnId txnId, Index index) throws AlgebricksException, RemoteException {
         try {
-            IndexTupleTranslator tupleWriter = tupleTranslatorProvider.getIndexTupleTranslator(jobId, this, true);
+            IndexTupleTranslator tupleWriter = tupleTranslatorProvider.getIndexTupleTranslator(txnId, this, true);
             ITupleReference tuple = tupleWriter.getTupleFromMetadataEntity(index);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.INDEX_DATASET, tuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.INDEX_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("An index with name '" + index.getIndexName() + "' already exists.", e);
+                throw new AlgebricksException("An index with name '" + index.getIndexName() + "' already exists.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addNode(JobId jobId, Node node) throws MetadataException, RemoteException {
+    public void addNode(TxnId txnId, Node node) throws AlgebricksException, RemoteException {
         try {
             NodeTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getNodeTupleTranslator(true);
             ITupleReference tuple = tupleReaderWriter.getTupleFromMetadataEntity(node);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.NODE_DATASET, tuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.NODE_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A node with name '" + node.getNodeName() + "' already exists.", e);
+                throw new AlgebricksException("A node with name '" + node.getNodeName() + "' already exists.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addNodeGroup(JobId jobId, NodeGroup nodeGroup) throws MetadataException, RemoteException {
+    public void addNodeGroup(TxnId txnId, NodeGroup nodeGroup) throws AlgebricksException, RemoteException {
         try {
             NodeGroupTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getNodeGroupTupleTranslator(true);
             ITupleReference tuple = tupleReaderWriter.getTupleFromMetadataEntity(nodeGroup);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.NODEGROUP_DATASET, tuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.NODEGROUP_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException(
+                throw new AlgebricksException(
                         "A nodegroup with name '" + nodeGroup.getNodeGroupName() + "' already exists.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addDatatype(JobId jobId, Datatype datatype) throws MetadataException, RemoteException {
+    public void addDatatype(TxnId txnId, Datatype datatype) throws AlgebricksException, RemoteException {
         try {
             DatatypeTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getDataTypeTupleTranslator(jobId, this, true);
+                    tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, true);
             ITupleReference tuple = tupleReaderWriter.getTupleFromMetadataEntity(datatype);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A datatype with name '" + datatype.getDatatypeName() + "' already exists.",
-                        e);
+                throw new AlgebricksException(
+                        "A datatype with name '" + datatype.getDatatypeName() + "' already exists.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addFunction(JobId jobId, Function function) throws MetadataException, RemoteException {
+    public void addFunction(TxnId txnId, Function function) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'function' dataset.
             FunctionTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFunctionTupleTranslator(true);
 
             ITupleReference functionTuple = tupleReaderWriter.getTupleFromMetadataEntity(function);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, functionTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, functionTuple);
 
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A function with this name " + function.getName() + " and arity "
+                throw new AlgebricksException("A function with this name " + function.getName() + " and arity "
                         + function.getArity() + " already exists in dataverse '" + function.getDataverseName() + "'.",
                         e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private void insertTupleIntoIndex(JobId jobId, IMetadataIndex metadataIndex, ITupleReference tuple)
+    private void insertTupleIntoIndex(TxnId txnId, IMetadataIndex metadataIndex, ITupleReference tuple)
             throws ACIDException, HyracksDataException {
-        long resourceID = metadataIndex.getResourceId();
-        String resourceName = metadataIndex.getFile().getRelativePath();
-        ILSMIndex lsmIndex = (ILSMIndex) datasetLifecycleManager.get(resourceName);
-        try {
-            datasetLifecycleManager.open(resourceName);
-
-            // prepare a Callback for logging
-            IModificationOperationCallback modCallback =
-                    createIndexModificationCallback(jobId, resourceID, metadataIndex, lsmIndex, Operation.INSERT);
-
-            ILSMIndexAccessor indexAccessor = lsmIndex.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
-
-            ITransactionContext txnCtx =
-                    transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            txnCtx.setWriteTxn(true);
-            txnCtx.registerIndexAndCallback(resourceID, lsmIndex, (AbstractOperationCallback) modCallback,
-                    metadataIndex.isPrimaryIndex());
-
-            LSMIndexUtil.checkAndSetFirstLSN((AbstractLSMIndex) lsmIndex, transactionSubsystem.getLogManager());
-
-            // TODO: fix exceptions once new BTree exception model is in hyracks.
-            indexAccessor.forceInsert(tuple);
-            //Manually complete the operation after the insert. This is to decrement the resource counters within the
-            //index that determine how many tuples are still 'in-flight' within the index. Normally the log flusher
-            //does this. The only exception is the index registered as the "primary" which we will let be decremented
-            //by the job commit log event
-            if (!((TransactionContext) txnCtx).getPrimaryIndexOpTracker().equals(lsmIndex.getOperationTracker())) {
-                lsmIndex.getOperationTracker().completeOperation(lsmIndex, LSMOperationType.FORCE_MODIFICATION, null,
-                        modCallback);
-            }
-        } finally {
-            datasetLifecycleManager.close(resourceName);
-        }
+        modifyMetadataIndex(Operation.INSERT, txnId, metadataIndex, tuple);
     }
 
-    private void upsertTupleIntoIndex(JobId jobId, IMetadataIndex metadataIndex, ITupleReference tuple)
+    private void upsertTupleIntoIndex(TxnId txnId, IMetadataIndex metadataIndex, ITupleReference tuple)
             throws ACIDException, HyracksDataException {
-        long resourceId = metadataIndex.getResourceId();
+        modifyMetadataIndex(Operation.UPSERT, txnId, metadataIndex, tuple);
+    }
+
+    private void modifyMetadataIndex(Operation op, TxnId txnId, IMetadataIndex metadataIndex, ITupleReference tuple)
+            throws ACIDException, HyracksDataException {
         String resourceName = metadataIndex.getFile().getRelativePath();
         ILSMIndex lsmIndex = (ILSMIndex) datasetLifecycleManager.get(resourceName);
         datasetLifecycleManager.open(resourceName);
         try {
-            // prepare a Callback for logging
-            ITransactionContext txnCtx =
-                    transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            IModificationOperationCallback modCallback =
-                    new UpsertOperationCallback(metadataIndex.getDatasetId(), metadataIndex.getPrimaryKeyIndexes(),
-                            txnCtx, transactionSubsystem.getLockManager(), transactionSubsystem, resourceId,
-                            metadataStoragePartition, ResourceType.LSM_BTREE, Operation.UPSERT);
-            ILSMIndexAccessor indexAccessor = lsmIndex.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
+            ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(txnId);
+            IModificationOperationCallback modCallback = createIndexModificationCallback(op, txnCtx, metadataIndex);
+            IIndexAccessParameters iap = new IndexAccessParameters(modCallback, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor indexAccessor = lsmIndex.createAccessor(iap);
             txnCtx.setWriteTxn(true);
-            txnCtx.registerIndexAndCallback(resourceId, lsmIndex, (AbstractOperationCallback) modCallback,
+            txnCtx.register(metadataIndex.getResourceId(),
+                    StoragePathUtil.getPartitionNumFromRelativePath(resourceName), lsmIndex, modCallback,
                     metadataIndex.isPrimaryIndex());
             LSMIndexUtil.checkAndSetFirstLSN((AbstractLSMIndex) lsmIndex, transactionSubsystem.getLogManager());
-            indexAccessor.forceUpsert(tuple);
-            //Manually complete the operation after the insert. This is to decrement the resource counters within the
-            //index that determine how many tuples are still 'in-flight' within the index. Normally the log flusher
-            //does this. The only exception is the index registered as the "primary" which we will let be decremented
-            //by the job commit log event
-            if (!((TransactionContext) txnCtx).getPrimaryIndexOpTracker().equals(lsmIndex.getOperationTracker())) {
-                lsmIndex.getOperationTracker().completeOperation(lsmIndex, LSMOperationType.FORCE_MODIFICATION, null,
-                        modCallback);
+            switch (op) {
+                case INSERT:
+                    indexAccessor.insert(tuple);
+                    break;
+                case DELETE:
+                    indexAccessor.delete(tuple);
+                    break;
+                case UPSERT:
+                    indexAccessor.upsert(tuple);
+                    break;
+                default:
+                    throw new IllegalStateException("Unknown operation type: " + op);
             }
         } finally {
             datasetLifecycleManager.close(resourceName);
         }
     }
 
-    private IModificationOperationCallback createIndexModificationCallback(JobId jobId, long resourceId,
-            IMetadataIndex metadataIndex, ILSMIndex lsmIndex, Operation indexOp) throws ACIDException {
-        ITransactionContext txnCtx = transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-
-        // Regardless of the index type (primary or secondary index), secondary index modification callback is given
-        // This is still correct since metadata index operation doesn't require any lock from ConcurrentLockMgr and
-        // The difference between primaryIndexModCallback and secondaryIndexModCallback is that primary index requires
-        // locks and secondary index doesn't.
-        return new SecondaryIndexModificationOperationCallback(metadataIndex.getDatasetId(),
-                metadataIndex.getPrimaryKeyIndexes(), txnCtx, transactionSubsystem.getLockManager(),
-                transactionSubsystem, resourceId, metadataStoragePartition, ResourceType.LSM_BTREE, indexOp);
+    private IModificationOperationCallback createIndexModificationCallback(Operation indexOp,
+            ITransactionContext txnCtx, IMetadataIndex metadataIndex) {
+        switch (indexOp) {
+            case INSERT:
+            case DELETE:
+                /*
+                 * Regardless of the index type (primary or secondary index), secondary index modification
+                 * callback is given. This is still correct since metadata index operation doesn't require
+                 * any lock from ConcurrentLockMgr.
+                 */
+                return new SecondaryIndexModificationOperationCallback(metadataIndex.getDatasetId(),
+                        metadataIndex.getPrimaryKeyIndexes(), txnCtx, transactionSubsystem.getLockManager(),
+                        transactionSubsystem, metadataIndex.getResourceId(), metadataStoragePartition,
+                        ResourceType.LSM_BTREE, indexOp);
+            case UPSERT:
+                return new UpsertOperationCallback(metadataIndex.getDatasetId(), metadataIndex.getPrimaryKeyIndexes(),
+                        txnCtx, transactionSubsystem.getLockManager(), transactionSubsystem,
+                        metadataIndex.getResourceId(), metadataStoragePartition, ResourceType.LSM_BTREE, indexOp);
+            default:
+                throw new IllegalStateException("Unknown operation type: " + indexOp);
+        }
     }
 
     @Override
-    public void dropDataverse(JobId jobId, String dataverseName) throws MetadataException, RemoteException {
+    public void dropDataverse(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException {
         try {
 
-            confirmDataverseCanBeDeleted(jobId, dataverseName);
-
-            List<Dataset> dataverseDatasets;
-            Dataset ds;
-            dataverseDatasets = getDataverseDatasets(jobId, dataverseName);
-            // Drop all datasets in this dataverse.
-            for (int i = 0; i < dataverseDatasets.size(); i++) {
-                ds = dataverseDatasets.get(i);
-                dropDataset(jobId, dataverseName, ds.getDatasetName());
-            }
-
-            //After dropping datasets, drop datatypes
-            List<Datatype> dataverseDatatypes;
-            // As a side effect, acquires an S lock on the 'datatype' dataset
-            // on behalf of txnId.
-            dataverseDatatypes = getDataverseDatatypes(jobId, dataverseName);
-            // Drop all types in this dataverse.
-            for (int i = 0; i < dataverseDatatypes.size(); i++) {
-                forceDropDatatype(jobId, dataverseName, dataverseDatatypes.get(i).getDatatypeName());
-            }
+            confirmDataverseCanBeDeleted(txnId, dataverseName);
 
             // As a side effect, acquires an S lock on the 'Function' dataset
             // on behalf of txnId.
-            List<Function> dataverseFunctions = getDataverseFunctions(jobId, dataverseName);
+            List<Function> dataverseFunctions = getDataverseFunctions(txnId, dataverseName);
             // Drop all functions in this dataverse.
             for (Function function : dataverseFunctions) {
-                dropFunction(jobId, new FunctionSignature(dataverseName, function.getName(), function.getArity()));
+                dropFunction(txnId, new FunctionSignature(dataverseName, function.getName(), function.getArity()),
+                        true);
+            }
+
+            List<Dataset> dataverseDatasets;
+            Dataset ds;
+            dataverseDatasets = getDataverseDatasets(txnId, dataverseName);
+            // Drop all datasets in this dataverse.
+            for (int i = 0; i < dataverseDatasets.size(); i++) {
+                ds = dataverseDatasets.get(i);
+                dropDataset(txnId, dataverseName, ds.getDatasetName(), true);
+            }
+
+            // After dropping datasets, drop datatypes
+            List<Datatype> dataverseDatatypes;
+            // As a side effect, acquires an S lock on the 'datatype' dataset
+            // on behalf of txnId.
+            dataverseDatatypes = getDataverseDatatypes(txnId, dataverseName);
+            // Drop all types in this dataverse.
+            for (int i = 0; i < dataverseDatatypes.size(); i++) {
+                forceDropDatatype(txnId, dataverseName, dataverseDatatypes.get(i).getDatatypeName());
             }
 
             // As a side effect, acquires an S lock on the 'Adapter' dataset
             // on behalf of txnId.
-            List<DatasourceAdapter> dataverseAdapters = getDataverseAdapters(jobId, dataverseName);
+            List<DatasourceAdapter> dataverseAdapters = getDataverseAdapters(txnId, dataverseName);
             // Drop all functions in this dataverse.
             for (DatasourceAdapter adapter : dataverseAdapters) {
-                dropAdapter(jobId, dataverseName, adapter.getAdapterIdentifier().getName());
+                dropAdapter(txnId, dataverseName, adapter.getAdapterIdentifier().getName());
             }
 
             List<Feed> dataverseFeeds;
             List<FeedConnection> feedConnections;
             Feed feed;
-            dataverseFeeds = getDataverseFeeds(jobId, dataverseName);
+            dataverseFeeds = getDataverseFeeds(txnId, dataverseName);
             // Drop all feeds&connections in this dataverse.
             for (int i = 0; i < dataverseFeeds.size(); i++) {
                 feed = dataverseFeeds.get(i);
-                feedConnections = getFeedConnections(jobId, dataverseName, feed.getFeedName());
+                feedConnections = getFeedConnections(txnId, dataverseName, feed.getFeedName());
                 for (FeedConnection feedConnection : feedConnections) {
-                    dropFeedConnection(jobId, dataverseName, feed.getFeedName(), feedConnection.getDatasetName());
+                    dropFeedConnection(txnId, dataverseName, feed.getFeedName(), feedConnection.getDatasetName());
                 }
-                dropFeed(jobId, dataverseName, feed.getFeedName());
+                dropFeed(txnId, dataverseName, feed.getFeedName());
             }
 
-            List<FeedPolicyEntity> feedPolicies = getDataversePolicies(jobId, dataverseName);
+            List<FeedPolicyEntity> feedPolicies = getDataversePolicies(txnId, dataverseName);
             if (feedPolicies != null && feedPolicies.size() > 0) {
                 // Drop all feed ingestion policies in this dataverse.
                 for (FeedPolicyEntity feedPolicy : feedPolicies) {
-                    dropFeedPolicy(jobId, dataverseName, feedPolicy.getPolicyName());
+                    dropFeedPolicy(txnId, dataverseName, feedPolicy.getPolicyName());
                 }
             }
 
@@ -617,30 +596,40 @@
             ITupleReference searchKey = createTuple(dataverseName);
             // As a side effect, acquires an S lock on the 'dataverse' dataset
             // on behalf of txnId.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATAVERSE_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATAVERSE_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATAVERSE_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATAVERSE_DATASET, tuple);
 
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop dataverse '" + dataverseName + "' because it doesn't exist.",
+                throw new AlgebricksException("Cannot drop dataverse '" + dataverseName + "' because it doesn't exist.",
                         e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropDataset(JobId jobId, String dataverseName, String datasetName)
-            throws MetadataException, RemoteException {
-        Dataset dataset = getDataset(jobId, dataverseName, datasetName);
+    public void dropDataset(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException {
+        dropDataset(txnId, dataverseName, datasetName, false);
+    }
+
+    public void dropDataset(TxnId txnId, String dataverseName, String datasetName, boolean force)
+            throws AlgebricksException, RemoteException {
+
+        if (!force) {
+            confirmDatasetCanBeDeleted(txnId, dataverseName, datasetName);
+        }
+
+        Dataset dataset = getDataset(txnId, dataverseName, datasetName);
         if (dataset == null) {
-            throw new MetadataException("Cannot drop dataset '" + datasetName + "' because it doesn't exist.");
+            throw new AlgebricksException("Cannot drop dataset '" + datasetName + "' because it doesn't exist.");
         }
         try {
             // Delete entry from the 'datasets' dataset.
@@ -649,13 +638,13 @@
             // lock on the 'dataset' dataset.
             ITupleReference datasetTuple = null;
             try {
-                datasetTuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey);
+                datasetTuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey);
 
                 // Delete entry(s) from the 'indexes' dataset.
-                List<Index> datasetIndexes = getDatasetIndexes(jobId, dataverseName, datasetName);
+                List<Index> datasetIndexes = getDatasetIndexes(txnId, dataverseName, datasetName);
                 if (datasetIndexes != null) {
                     for (Index index : datasetIndexes) {
-                        dropIndex(jobId, dataverseName, datasetName, index.getIndexName());
+                        dropIndex(txnId, dataverseName, datasetName, index.getIndexName());
                     }
                 }
 
@@ -663,11 +652,11 @@
                     // Delete External Files
                     // As a side effect, acquires an S lock on the 'ExternalFile' dataset
                     // on behalf of txnId.
-                    List<ExternalFile> datasetFiles = getExternalFiles(jobId, dataset);
+                    List<ExternalFile> datasetFiles = getExternalFiles(txnId, dataset);
                     if (datasetFiles != null && datasetFiles.size() > 0) {
                         // Drop all external files in this dataset.
                         for (ExternalFile file : datasetFiles) {
-                            dropExternalFile(jobId, dataverseName, file.getDatasetName(), file.getFileNumber());
+                            dropExternalFile(txnId, dataverseName, file.getDatasetName(), file.getFileNumber());
                         }
                     }
                 }
@@ -676,44 +665,44 @@
                 // artifacts.
                 if (!hde.getComponent().equals(ErrorCode.HYRACKS)
                         || hde.getErrorCode() != ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                    throw new MetadataException(hde);
+                    throw new AlgebricksException(hde);
                 }
             } finally {
-                deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
+                deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
             }
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropIndex(JobId jobId, String dataverseName, String datasetName, String indexName)
-            throws MetadataException, RemoteException {
+    public void dropIndex(TxnId txnId, String dataverseName, String datasetName, String indexName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datasetName, indexName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'index' dataset.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.INDEX_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.INDEX_DATASET, tuple);
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException(
+                throw new AlgebricksException(
                         "Cannot drop index '" + datasetName + "." + indexName + "' because it doesn't exist.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public boolean dropNodegroup(JobId jobId, String nodeGroupName, boolean failSilently)
-            throws MetadataException, RemoteException {
-        List<String> datasetNames = getDatasetNamesPartitionedOnThisNodeGroup(jobId, nodeGroupName);
+    public boolean dropNodegroup(TxnId txnId, String nodeGroupName, boolean failSilently)
+            throws AlgebricksException, RemoteException {
+        List<String> datasetNames = getDatasetNamesPartitionedOnThisNodeGroup(txnId, nodeGroupName);
         if (!datasetNames.isEmpty()) {
             if (failSilently) {
                 return false;
@@ -724,49 +713,49 @@
             for (int i = 0; i < datasetNames.size(); i++) {
                 sb.append("\n" + (i + 1) + "- " + datasetNames.get(i) + ".");
             }
-            throw new MetadataException(sb.toString());
+            throw new AlgebricksException(sb.toString());
         }
         try {
             ITupleReference searchKey = createTuple(nodeGroupName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'nodegroup' dataset.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.NODEGROUP_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.NODEGROUP_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.NODEGROUP_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.NODEGROUP_DATASET, tuple);
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
             return true;
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop nodegroup '" + nodeGroupName + "' because it doesn't exist",
+                throw new AlgebricksException("Cannot drop nodegroup '" + nodeGroupName + "' because it doesn't exist",
                         e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropDatatype(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
+    public void dropDatatype(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
 
-        confirmDatatypeIsUnused(jobId, dataverseName, datatypeName);
+        confirmDatatypeIsUnused(txnId, dataverseName, datatypeName);
 
         // Delete the datatype entry, including all it's nested anonymous types.
         try {
             ITupleReference searchKey = createTuple(dataverseName, datatypeName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'datatype' dataset.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey);
             // Get nested types
-            List<String> nestedTypes = getNestedComplexDatatypeNamesForThisDatatype(jobId, dataverseName, datatypeName);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
+            List<String> nestedTypes = getNestedComplexDatatypeNamesForThisDatatype(txnId, dataverseName, datatypeName);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
             for (String nestedType : nestedTypes) {
-                Datatype dt = getDatatype(jobId, dataverseName, nestedType);
+                Datatype dt = getDatatype(txnId, dataverseName, nestedType);
                 if (dt != null && dt.getIsAnonymous()) {
-                    dropDatatype(jobId, dataverseName, dt.getDatatypeName());
+                    dropDatatype(txnId, dataverseName, dt.getDatatypeName());
                 }
             }
 
@@ -775,250 +764,292 @@
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop type '" + datatypeName + "' because it doesn't exist", e);
+                throw new AlgebricksException("Cannot drop type '" + datatypeName + "' because it doesn't exist", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private void forceDropDatatype(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
+    private void forceDropDatatype(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datatypeName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'datatype' dataset.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, tuple);
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop type '" + datatypeName + "' because it doesn't exist", e);
+                throw new AlgebricksException("Cannot drop type '" + datatypeName + "' because it doesn't exist", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private void deleteTupleFromIndex(JobId jobId, IMetadataIndex metadataIndex, ITupleReference tuple)
+    private void deleteTupleFromIndex(TxnId txnId, IMetadataIndex metadataIndex, ITupleReference tuple)
             throws ACIDException, HyracksDataException {
-        long resourceID = metadataIndex.getResourceId();
-        String resourceName = metadataIndex.getFile().getRelativePath();
-        ILSMIndex lsmIndex = (ILSMIndex) datasetLifecycleManager.get(resourceName);
-        try {
-            datasetLifecycleManager.open(resourceName);
-            // prepare a Callback for logging
-            IModificationOperationCallback modCallback =
-                    createIndexModificationCallback(jobId, resourceID, metadataIndex, lsmIndex, Operation.DELETE);
-            ILSMIndexAccessor indexAccessor = lsmIndex.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
-
-            ITransactionContext txnCtx =
-                    transactionSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            txnCtx.setWriteTxn(true);
-            txnCtx.registerIndexAndCallback(resourceID, lsmIndex, (AbstractOperationCallback) modCallback,
-                    metadataIndex.isPrimaryIndex());
-
-            LSMIndexUtil.checkAndSetFirstLSN((AbstractLSMIndex) lsmIndex, transactionSubsystem.getLogManager());
-
-            indexAccessor.forceDelete(tuple);
-            //Manually complete the operation after the insert. This is to decrement the resource counters within the
-            //index that determine how many tuples are still 'in-flight' within the index. Normally the log flusher
-            //does this. The only exception is the index registered as the "primary" which we will let be decremented
-            //by the job commit log event
-            if (!((TransactionContext) txnCtx).getPrimaryIndexOpTracker().equals(lsmIndex.getOperationTracker())) {
-                lsmIndex.getOperationTracker().completeOperation(lsmIndex, LSMOperationType.FORCE_MODIFICATION, null,
-                        modCallback);
-            }
-        } finally {
-            datasetLifecycleManager.close(resourceName);
-        }
+        modifyMetadataIndex(Operation.DELETE, txnId, metadataIndex, tuple);
     }
 
     @Override
-    public List<Dataverse> getDataverses(JobId jobId) throws MetadataException, RemoteException {
+    public List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException, RemoteException {
         try {
             DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(false);
             IValueExtractor<Dataverse> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataverse> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATAVERSE_DATASET, null, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATAVERSE_DATASET, null, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public Dataverse getDataverse(JobId jobId, String dataverseName) throws MetadataException, RemoteException {
+    public Dataverse getDataverse(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             DataverseTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDataverseTupleTranslator(false);
             IValueExtractor<Dataverse> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataverse> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATAVERSE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATAVERSE_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Dataset> getDataverseDatasets(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
+    public List<Dataset> getDataverseDatasets(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
             IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataset> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Feed> getDataverseFeeds(JobId jobId, String dataverseName) throws MetadataException, RemoteException {
+    public List<Feed> getDataverseFeeds(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Feed> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Library> getDataverseLibraries(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
+    public List<Library> getDataverseLibraries(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(false);
             IValueExtractor<Library> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Library> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private List<Datatype> getDataverseDatatypes(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
+    private List<Datatype> getDataverseDatatypes(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             DatatypeTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getDataTypeTupleTranslator(jobId, this, false);
+                    tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false);
             IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Datatype> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public Dataset getDataset(JobId jobId, String dataverseName, String datasetName)
-            throws MetadataException, RemoteException {
+    public Dataset getDataset(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datasetName);
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
             List<Dataset> results = new ArrayList<>();
             IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    public List<Dataset> getAllDatasets(JobId jobId) throws MetadataException, RemoteException {
+    public List<Dataset> getAllDatasets(TxnId txnId) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = null;
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
             IValueExtractor<Dataset> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Dataset> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    public List<Datatype> getAllDatatypes(JobId jobId) throws MetadataException, RemoteException {
+    public List<Function> getAllFunctions(TxnId txnId) throws AlgebricksException, RemoteException {
+        try {
+            ITupleReference searchKey = null;
+            FunctionTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFunctionTupleTranslator(false);
+            IValueExtractor<Function> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
+            List<Function> results = new ArrayList<>();
+            searchIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
+            return results;
+        } catch (HyracksDataException e) {
+            throw new AlgebricksException(e);
+        }
+    }
+
+    public List<Datatype> getAllDatatypes(TxnId txnId) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = null;
             DatatypeTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getDataTypeTupleTranslator(jobId, this, false);
+                    tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false);
             IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Datatype> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private void confirmDataverseCanBeDeleted(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
-        //If a dataset from a DIFFERENT dataverse
-        //uses a type from this dataverse
-        //throw an error
-        List<Dataset> datasets = getAllDatasets(jobId);
+    private void confirmDataverseCanBeDeleted(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
+        // If a dataset from a DIFFERENT dataverse
+        // uses a type from this dataverse
+        // throw an error
+        List<Dataset> datasets = getAllDatasets(txnId);
         for (Dataset set : datasets) {
             if (set.getDataverseName().equals(dataverseName)) {
                 continue;
             }
             if (set.getItemTypeDataverseName().equals(dataverseName)) {
-                throw new MetadataException("Cannot drop dataverse. Type " + dataverseName + "." + set.getItemTypeName()
-                        + " used by dataset " + set.getDataverseName() + "." + set.getDatasetName());
+                throw new AlgebricksException(
+                        "Cannot drop dataverse. Type " + dataverseName + "." + set.getItemTypeName()
+                                + " used by dataset " + set.getDataverseName() + "." + set.getDatasetName());
+            }
+        }
+
+        // If a function from a DIFFERENT dataverse
+        // uses functions or datatypes from this dataverse
+        // throw an error
+        List<Function> functions = getAllFunctions(txnId);
+        for (Function function : functions) {
+            if (function.getDataverseName().equals(dataverseName)) {
+                continue;
+            }
+            for (List<String> datasetDependency : function.getDependencies().get(0)) {
+                if (datasetDependency.get(0).equals(dataverseName)) {
+                    throw new AlgebricksException("Cannot drop dataverse. Function " + function.getDataverseName() + "."
+                            + function.getName() + "@" + function.getArity() + " depends on dataset "
+                            + datasetDependency.get(0) + "." + datasetDependency.get(1));
+                }
+            }
+            for (List<String> functionDependency : function.getDependencies().get(1)) {
+                if (functionDependency.get(0).equals(dataverseName)) {
+                    throw new AlgebricksException(
+                            "Cannot drop dataverse. Function " + function.getDataverseName() + "." + function.getName()
+                                    + "@" + function.getArity() + " depends on function " + functionDependency.get(0)
+                                    + "." + functionDependency.get(1) + "@" + functionDependency.get(2));
+                }
             }
         }
     }
 
-    private void confirmDatatypeIsUnused(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
-        confirmDatatypeIsUnusedByDatatypes(jobId, dataverseName, datatypeName);
-        confirmDatatypeIsUnusedByDatasets(jobId, dataverseName, datatypeName);
+    private void confirmFunctionCanBeDeleted(TxnId txnId, FunctionSignature signature)
+            throws AlgebricksException, RemoteException {
+        // If any other function uses this function, throw an error
+        List<Function> functions = getAllFunctions(txnId);
+        for (Function function : functions) {
+            for (List<String> functionalDependency : function.getDependencies().get(1)) {
+                if (functionalDependency.get(0).equals(signature.getNamespace())
+                        && functionalDependency.get(1).equals(signature.getName())
+                        && functionalDependency.get(2).equals(Integer.toString(signature.getArity()))) {
+                    throw new AlgebricksException("Cannot drop function " + signature + " being used by function "
+                            + function.getDataverseName() + "." + function.getName() + "@" + function.getArity());
+                }
+            }
+        }
     }
 
-    private void confirmDatatypeIsUnusedByDatasets(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
-        //If any dataset uses this type, throw an error
-        List<Dataset> datasets = getAllDatasets(jobId);
+    private void confirmDatasetCanBeDeleted(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException {
+        // If any function uses this type, throw an error
+        List<Function> functions = getAllFunctions(txnId);
+        for (Function function : functions) {
+            for (List<String> datasetDependency : function.getDependencies().get(0)) {
+                if (datasetDependency.get(0).equals(dataverseName) && datasetDependency.get(1).equals(datasetName)) {
+                    throw new AlgebricksException("Cannot drop dataset " + dataverseName + "." + datasetName
+                            + " being used by function " + function.getDataverseName() + "." + function.getName() + "@"
+                            + function.getArity());
+                }
+            }
+        }
+    }
+
+    private void confirmDatatypeIsUnused(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
+        confirmDatatypeIsUnusedByDatatypes(txnId, dataverseName, datatypeName);
+        confirmDatatypeIsUnusedByDatasets(txnId, dataverseName, datatypeName);
+    }
+
+    private void confirmDatatypeIsUnusedByDatasets(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
+        // If any dataset uses this type, throw an error
+        List<Dataset> datasets = getAllDatasets(txnId);
         for (Dataset set : datasets) {
             if (set.getItemTypeName().equals(datatypeName) && set.getItemTypeDataverseName().equals(dataverseName)) {
-                throw new MetadataException("Cannot drop type " + dataverseName + "." + datatypeName
+                throw new AlgebricksException("Cannot drop type " + dataverseName + "." + datatypeName
                         + " being used by dataset " + set.getDataverseName() + "." + set.getDatasetName());
             }
         }
     }
 
-    private void confirmDatatypeIsUnusedByDatatypes(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
-        //If any datatype uses this type, throw an error
-        //TODO: Currently this loads all types into memory. This will need to be fixed for large numbers of types
-        Datatype dataTypeToBeDropped = getDatatype(jobId, dataverseName, datatypeName);
+    private void confirmDatatypeIsUnusedByDatatypes(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
+        // If any datatype uses this type, throw an error
+        // TODO: Currently this loads all types into memory. This will need to be fixed
+        // for large numbers of types
+        Datatype dataTypeToBeDropped = getDatatype(txnId, dataverseName, datatypeName);
         assert dataTypeToBeDropped != null;
         IAType typeToBeDropped = dataTypeToBeDropped.getDatatype();
-        List<Datatype> datatypes = getAllDatatypes(jobId);
+        List<Datatype> datatypes = getAllDatatypes(txnId);
         for (Datatype dataType : datatypes) {
-            //skip types in different dataverses as well as the type to be dropped itself
+            // skip types in different dataverses as well as the type to be dropped itself
             if (!dataType.getDataverseName().equals(dataverseName)
                     || dataType.getDatatype().getTypeName().equals(datatypeName)) {
                 continue;
@@ -1026,16 +1057,16 @@
 
             AbstractComplexType recType = (AbstractComplexType) dataType.getDatatype();
             if (recType.containsType(typeToBeDropped)) {
-                throw new MetadataException("Cannot drop type " + dataverseName + "." + datatypeName
+                throw new AlgebricksException("Cannot drop type " + dataverseName + "." + datatypeName
                         + " being used by type " + dataverseName + "." + recType.getTypeName());
             }
         }
     }
 
-    private List<String> getNestedComplexDatatypeNamesForThisDatatype(JobId jobId, String dataverseName,
-            String datatypeName) throws MetadataException, RemoteException {
-        //Return all field types that aren't builtin types
-        Datatype parentType = getDatatype(jobId, dataverseName, datatypeName);
+    private List<String> getNestedComplexDatatypeNamesForThisDatatype(TxnId txnId, String dataverseName,
+            String datatypeName) throws AlgebricksException, RemoteException {
+        // Return all field types that aren't builtin types
+        Datatype parentType = getDatatype(txnId, dataverseName, datatypeName);
 
         List<IAType> subTypes = null;
         if (parentType.getDatatype().getTypeTag() == ATypeTag.OBJECT) {
@@ -1057,11 +1088,12 @@
         return nestedTypes;
     }
 
-    public List<String> getDatasetNamesPartitionedOnThisNodeGroup(JobId jobId, String nodegroup)
-            throws MetadataException, RemoteException {
-        //this needs to scan the datasets and return the datasets that use this nodegroup
+    public List<String> getDatasetNamesPartitionedOnThisNodeGroup(TxnId txnId, String nodegroup)
+            throws AlgebricksException, RemoteException {
+        // this needs to scan the datasets and return the datasets that use this
+        // nodegroup
         List<String> nodeGroupDatasets = new ArrayList<>();
-        List<Dataset> datasets = getAllDatasets(jobId);
+        List<Dataset> datasets = getAllDatasets(txnId);
         for (Dataset set : datasets) {
             if (set.getNodeGroupName().equals(nodegroup)) {
                 nodeGroupDatasets.add(set.getDatasetName());
@@ -1072,117 +1104,126 @@
     }
 
     @Override
-    public Index getIndex(JobId jobId, String dataverseName, String datasetName, String indexName)
-            throws MetadataException, RemoteException {
+    public Index getIndex(TxnId txnId, String dataverseName, String datasetName, String indexName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datasetName, indexName);
             IndexTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getIndexTupleTranslator(jobId, this, false);
+                    tupleTranslatorProvider.getIndexTupleTranslator(txnId, this, false);
             IValueExtractor<Index> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Index> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Index> getDatasetIndexes(JobId jobId, String dataverseName, String datasetName)
-            throws MetadataException, RemoteException {
+    public List<Index> getDatasetIndexes(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datasetName);
             IndexTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getIndexTupleTranslator(jobId, this, false);
+                    tupleTranslatorProvider.getIndexTupleTranslator(txnId, this, false);
             IValueExtractor<Index> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Index> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.INDEX_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public Datatype getDatatype(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException {
+    public Datatype getDatatype(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, datatypeName);
             DatatypeTupleTranslator tupleReaderWriter =
-                    tupleTranslatorProvider.getDataTypeTupleTranslator(jobId, this, false);
+                    tupleTranslatorProvider.getDataTypeTupleTranslator(txnId, this, false);
             IValueExtractor<Datatype> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Datatype> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATATYPE_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public NodeGroup getNodeGroup(JobId jobId, String nodeGroupName) throws MetadataException, RemoteException {
+    public NodeGroup getNodeGroup(TxnId txnId, String nodeGroupName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(nodeGroupName);
             NodeGroupTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getNodeGroupTupleTranslator(false);
             IValueExtractor<NodeGroup> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<NodeGroup> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.NODEGROUP_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.NODEGROUP_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public Function getFunction(JobId jobId, FunctionSignature functionSignature)
-            throws MetadataException, RemoteException {
+    public Function getFunction(TxnId txnId, FunctionSignature functionSignature)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(functionSignature.getNamespace(), functionSignature.getName(),
                     "" + functionSignature.getArity());
             FunctionTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFunctionTupleTranslator(false);
             List<Function> results = new ArrayList<>();
             IValueExtractor<Function> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Function> getFunctions(JobId jobId, String dataverseName) throws MetadataException, RemoteException {
+    public List<Function> getFunctions(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             FunctionTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFunctionTupleTranslator(false);
             List<Function> results = new ArrayList<>();
             IValueExtractor<Function> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropFunction(JobId jobId, FunctionSignature functionSignature)
-            throws MetadataException, RemoteException {
+    public void dropFunction(TxnId txnId, FunctionSignature functionSignature)
+            throws AlgebricksException, RemoteException {
+        dropFunction(txnId, functionSignature, false);
+    }
 
-        Function function = getFunction(jobId, functionSignature);
+    private void dropFunction(TxnId txnId, FunctionSignature functionSignature, boolean force)
+            throws AlgebricksException, RemoteException {
+
+        if (!force) {
+            confirmFunctionCanBeDeleted(txnId, functionSignature);
+        }
+
+        Function function = getFunction(txnId, functionSignature);
 
         if (function == null) {
-            throw new MetadataException(
+            throw new AlgebricksException(
                     "Cannot drop function '" + functionSignature.toString() + "' because it doesn't exist.");
         }
         try {
@@ -1192,29 +1233,29 @@
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'function' dataset.
             ITupleReference functionTuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, functionTuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, functionTuple);
 
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("There is no function with the name " + functionSignature.getName()
+                throw new AlgebricksException("There is no function with the name " + functionSignature.getName()
                         + " and arity " + functionSignature.getArity(), e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
-    private ITupleReference getTupleToBeDeleted(JobId jobId, IMetadataIndex metadataIndex, ITupleReference searchKey)
-            throws MetadataException, HyracksDataException, RemoteException {
+    private ITupleReference getTupleToBeDeleted(TxnId txnId, IMetadataIndex metadataIndex, ITupleReference searchKey)
+            throws AlgebricksException, HyracksDataException, RemoteException {
         IValueExtractor<ITupleReference> valueExtractor = new TupleCopyValueExtractor(metadataIndex.getTypeTraits());
         List<ITupleReference> results = new ArrayList<>();
-        searchIndex(jobId, metadataIndex, searchKey, valueExtractor, results);
+        searchIndex(txnId, metadataIndex, searchKey, valueExtractor, results);
         if (results.isEmpty()) {
             // TODO: Temporarily a TreeIndexException to make it get caught by
             // caller in the appropriate catch block.
@@ -1233,9 +1274,8 @@
             String resourceName = index.getFile().toString();
             IIndex indexInstance = datasetLifecycleManager.get(resourceName);
             datasetLifecycleManager.open(resourceName);
-            IIndexAccessor indexAccessor =
-                    indexInstance.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-            ITreeIndexCursor rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+            IIndexAccessor indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
 
             RangePredicate rangePred = null;
             rangePred = new RangePredicate(null, null, true, true, null, null);
@@ -1247,16 +1287,15 @@
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING) }));
                 }
             } finally {
-                rangeCursor.close();
+                rangeCursor.destroy();
             }
             datasetLifecycleManager.close(resourceName);
 
             index = MetadataPrimaryIndexes.DATASET_DATASET;
             indexInstance = datasetLifecycleManager.get(resourceName);
             datasetLifecycleManager.open(resourceName);
-            indexAccessor =
-                    indexInstance.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-            rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+            indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            rangeCursor = indexAccessor.createSearchCursor(false);
 
             rangePred = null;
             rangePred = new RangePredicate(null, null, true, true, null, null);
@@ -1269,16 +1308,15 @@
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING) }));
                 }
             } finally {
-                rangeCursor.close();
+                rangeCursor.destroy();
             }
             datasetLifecycleManager.close(resourceName);
 
             index = MetadataPrimaryIndexes.INDEX_DATASET;
             indexInstance = datasetLifecycleManager.get(resourceName);
             datasetLifecycleManager.open(resourceName);
-            indexAccessor =
-                    indexInstance.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-            rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+            indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            rangeCursor = indexAccessor.createSearchCursor(false);
 
             rangePred = null;
             rangePred = new RangePredicate(null, null, true, true, null, null);
@@ -1292,7 +1330,7 @@
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING) }));
                 }
             } finally {
-                rangeCursor.close();
+                rangeCursor.destroy();
             }
             datasetLifecycleManager.close(resourceName);
         } catch (Exception e) {
@@ -1302,19 +1340,18 @@
         return sb.toString();
     }
 
-    private <ResultType> void searchIndex(JobId jobId, IMetadataIndex index, ITupleReference searchKey,
+    private <ResultType> void searchIndex(TxnId txnId, IMetadataIndex index, ITupleReference searchKey,
             IValueExtractor<ResultType> valueExtractor, List<ResultType> results)
-            throws MetadataException, HyracksDataException, RemoteException {
+            throws AlgebricksException, HyracksDataException, RemoteException {
         IBinaryComparatorFactory[] comparatorFactories = index.getKeyBinaryComparatorFactory();
         if (index.getFile() == null) {
-            throw new MetadataException("No file for Index " + index.getDataverseName() + "." + index.getIndexName());
+            throw new AlgebricksException("No file for Index " + index.getDataverseName() + "." + index.getIndexName());
         }
         String resourceName = index.getFile().getRelativePath();
         IIndex indexInstance = datasetLifecycleManager.get(resourceName);
         datasetLifecycleManager.open(resourceName);
-        IIndexAccessor indexAccessor =
-                indexInstance.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-        ITreeIndexCursor rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+        IIndexAccessor indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+        IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
 
         IBinaryComparator[] searchCmps = null;
         MultiComparator searchCmp = null;
@@ -1332,27 +1369,26 @@
         try {
             while (rangeCursor.hasNext()) {
                 rangeCursor.next();
-                ResultType result = valueExtractor.getValue(jobId, rangeCursor.getTuple());
+                ResultType result = valueExtractor.getValue(txnId, rangeCursor.getTuple());
                 if (result != null) {
                     results.add(result);
                 }
             }
         } finally {
-            rangeCursor.close();
+            rangeCursor.destroy();
         }
         datasetLifecycleManager.close(resourceName);
     }
 
     @Override
-    public void initializeDatasetIdFactory(JobId jobId) throws MetadataException, RemoteException {
+    public void initializeDatasetIdFactory(TxnId txnId) throws AlgebricksException, RemoteException {
         int mostRecentDatasetId = MetadataIndexImmutableProperties.FIRST_AVAILABLE_USER_DATASET_ID;
         try {
             String resourceName = MetadataPrimaryIndexes.DATASET_DATASET.getFile().getRelativePath();
             IIndex indexInstance = datasetLifecycleManager.get(resourceName);
             datasetLifecycleManager.open(resourceName);
             try {
-                IIndexAccessor indexAccessor =
-                        indexInstance.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                IIndexAccessor indexAccessor = indexInstance.createAccessor(NoOpIndexAccessParameters.INSTANCE);
                 IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
 
                 DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(false);
@@ -1366,21 +1402,21 @@
                     while (rangeCursor.hasNext()) {
                         rangeCursor.next();
                         final ITupleReference ref = rangeCursor.getTuple();
-                        final Dataset ds = valueExtractor.getValue(jobId, ref);
+                        final Dataset ds = valueExtractor.getValue(txnId, ref);
                         datasetId = ds.getDatasetId();
                         if (mostRecentDatasetId < datasetId) {
                             mostRecentDatasetId = datasetId;
                         }
                     }
                 } finally {
-                    rangeCursor.close();
+                    rangeCursor.destroy();
                 }
             } finally {
                 datasetLifecycleManager.close(resourceName);
             }
 
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
 
         DatasetIdFactory.initialize(mostRecentDatasetId);
@@ -1389,7 +1425,6 @@
     // TODO: Can use Hyrack's TupleUtils for this, once we switch to a newer
     // Hyracks version.
     public static ITupleReference createTuple(String... fields) {
-        @SuppressWarnings("unchecked")
         ISerializerDeserializer<AString> stringSerde =
                 SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
         AMutableString aString = new AMutableString("");
@@ -1410,46 +1445,46 @@
     }
 
     @Override
-    public List<Function> getDataverseFunctions(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
+    public List<Function> getDataverseFunctions(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             FunctionTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFunctionTupleTranslator(false);
             IValueExtractor<Function> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<Function> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FUNCTION_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addAdapter(JobId jobId, DatasourceAdapter adapter) throws MetadataException, RemoteException {
+    public void addAdapter(TxnId txnId, DatasourceAdapter adapter) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'Adapter' dataset.
             DatasourceAdapterTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getAdapterTupleTranslator(true);
             ITupleReference adapterTuple = tupleReaderWriter.getTupleFromMetadataEntity(adapter);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, adapterTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, adapterTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A adapter with this name " + adapter.getAdapterIdentifier().getName()
+                throw new AlgebricksException("A adapter with this name " + adapter.getAdapterIdentifier().getName()
                         + " already exists in dataverse '" + adapter.getAdapterIdentifier().getNamespace() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropAdapter(JobId jobId, String dataverseName, String adapterName)
-            throws MetadataException, RemoteException {
-        DatasourceAdapter adapter = getAdapter(jobId, dataverseName, adapterName);
+    public void dropAdapter(TxnId txnId, String dataverseName, String adapterName)
+            throws AlgebricksException, RemoteException {
+        DatasourceAdapter adapter = getAdapter(txnId, dataverseName, adapterName);
         if (adapter == null) {
-            throw new MetadataException("Cannot drop adapter '" + adapter + "' because it doesn't exist.");
+            throw new AlgebricksException("Cannot drop adapter '" + adapter + "' because it doesn't exist.");
         }
         try {
             // Delete entry from the 'Adapter' dataset.
@@ -1457,125 +1492,125 @@
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'Adapter' dataset.
             ITupleReference datasetTuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, datasetTuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, datasetTuple);
 
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop adapter '" + adapterName + " since it doesn't exist", e);
+                throw new AlgebricksException("Cannot drop adapter '" + adapterName + " since it doesn't exist", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
 
     }
 
     @Override
-    public DatasourceAdapter getAdapter(JobId jobId, String dataverseName, String adapterName)
-            throws MetadataException, RemoteException {
+    public DatasourceAdapter getAdapter(TxnId txnId, String dataverseName, String adapterName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, adapterName);
             DatasourceAdapterTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getAdapterTupleTranslator(false);
             List<DatasourceAdapter> results = new ArrayList<>();
             IValueExtractor<DatasourceAdapter> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addCompactionPolicy(JobId jobId, CompactionPolicy compactionPolicy)
-            throws MetadataException, RemoteException {
+    public void addCompactionPolicy(TxnId txnId, CompactionPolicy compactionPolicy)
+            throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'CompactionPolicy' dataset.
             CompactionPolicyTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getCompactionPolicyTupleTranslator(true);
             ITupleReference compactionPolicyTuple = tupleReaderWriter.getTupleFromMetadataEntity(compactionPolicy);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.COMPACTION_POLICY_DATASET, compactionPolicyTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.COMPACTION_POLICY_DATASET, compactionPolicyTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A compcation policy with this name " + compactionPolicy.getPolicyName()
+                throw new AlgebricksException("A compcation policy with this name " + compactionPolicy.getPolicyName()
                         + " already exists in dataverse '" + compactionPolicy.getPolicyName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public CompactionPolicy getCompactionPolicy(JobId jobId, String dataverse, String policyName)
-            throws MetadataException, RemoteException {
+    public CompactionPolicy getCompactionPolicy(TxnId txnId, String dataverse, String policyName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse, policyName);
             CompactionPolicyTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getCompactionPolicyTupleTranslator(false);
             List<CompactionPolicy> results = new ArrayList<>();
             IValueExtractor<CompactionPolicy> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.COMPACTION_POLICY_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.COMPACTION_POLICY_DATASET, searchKey, valueExtractor, results);
             if (!results.isEmpty()) {
                 return results.get(0);
             }
             return null;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<DatasourceAdapter> getDataverseAdapters(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException {
+    public List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName);
             DatasourceAdapterTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getAdapterTupleTranslator(false);
             IValueExtractor<DatasourceAdapter> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<DatasourceAdapter> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.DATASOURCE_ADAPTER_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addLibrary(JobId jobId, Library library) throws MetadataException, RemoteException {
+    public void addLibrary(TxnId txnId, Library library) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'Library' dataset.
             LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(true);
             ITupleReference libraryTuple = tupleReaderWriter.getTupleFromMetadataEntity(library);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.LIBRARY_DATASET, libraryTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.LIBRARY_DATASET, libraryTuple);
 
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A library with this name " + library.getDataverseName()
+                throw new AlgebricksException("A library with this name " + library.getDataverseName()
                         + " already exists in dataverse '" + library.getDataverseName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropLibrary(JobId jobId, String dataverseName, String libraryName)
-            throws MetadataException, RemoteException {
-        Library library = getLibrary(jobId, dataverseName, libraryName);
+    public void dropLibrary(TxnId txnId, String dataverseName, String libraryName)
+            throws AlgebricksException, RemoteException {
+        Library library = getLibrary(txnId, dataverseName, libraryName);
         if (library == null) {
-            throw new MetadataException("Cannot drop library '" + library + "' because it doesn't exist.");
+            throw new AlgebricksException("Cannot drop library '" + library + "' because it doesn't exist.");
         }
         try {
             // Delete entry from the 'Library' dataset.
@@ -1583,318 +1618,319 @@
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'Adapter' dataset.
             ITupleReference datasetTuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.LIBRARY_DATASET, datasetTuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.LIBRARY_DATASET, datasetTuple);
 
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop library '" + libraryName, e);
+                throw new AlgebricksException("Cannot drop library '" + libraryName, e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
 
     }
 
     @Override
-    public Library getLibrary(JobId jobId, String dataverseName, String libraryName)
-            throws MetadataException, RemoteException {
+    public Library getLibrary(TxnId txnId, String dataverseName, String libraryName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, libraryName);
             LibraryTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getLibraryTupleTranslator(false);
             List<Library> results = new ArrayList<>();
             IValueExtractor<Library> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.LIBRARY_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public int getMostRecentDatasetId() throws MetadataException, RemoteException {
+    public int getMostRecentDatasetId() throws AlgebricksException, RemoteException {
         return DatasetIdFactory.getMostRecentDatasetId();
     }
 
     @Override
-    public void addFeedPolicy(JobId jobId, FeedPolicyEntity feedPolicy) throws MetadataException, RemoteException {
+    public void addFeedPolicy(TxnId txnId, FeedPolicyEntity feedPolicy) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'FeedPolicy' dataset.
             FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(true);
             ITupleReference feedPolicyTuple = tupleReaderWriter.getTupleFromMetadataEntity(feedPolicy);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, feedPolicyTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, feedPolicyTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A feed policy with this name " + feedPolicy.getPolicyName()
+                throw new AlgebricksException("A feed policy with this name " + feedPolicy.getPolicyName()
                         + " already exists in dataverse '" + feedPolicy.getPolicyName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public FeedPolicyEntity getFeedPolicy(JobId jobId, String dataverse, String policyName)
-            throws MetadataException, RemoteException {
+    public FeedPolicyEntity getFeedPolicy(TxnId txnId, String dataverse, String policyName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse, policyName);
             FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(false);
             List<FeedPolicyEntity> results = new ArrayList<>();
             IValueExtractor<FeedPolicyEntity> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey, valueExtractor, results);
             if (!results.isEmpty()) {
                 return results.get(0);
             }
             return null;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addFeedConnection(JobId jobId, FeedConnection feedConnection) throws MetadataException {
+    public void addFeedConnection(TxnId txnId, FeedConnection feedConnection) throws AlgebricksException {
         try {
             FeedConnectionTupleTranslator tupleReaderWriter = new FeedConnectionTupleTranslator(true);
             ITupleReference feedConnTuple = tupleReaderWriter.getTupleFromMetadataEntity(feedConnection);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, feedConnTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, feedConnTuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<FeedConnection> getFeedConnections(JobId jobId, String dataverseName, String feedName)
-            throws MetadataException, RemoteException {
+    public List<FeedConnection> getFeedConnections(TxnId txnId, String dataverseName, String feedName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, feedName);
             FeedConnectionTupleTranslator tupleReaderWriter = new FeedConnectionTupleTranslator(false);
             List<FeedConnection> results = new ArrayList<>();
             IValueExtractor<FeedConnection> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public FeedConnection getFeedConnection(JobId jobId, String dataverseName, String feedName, String datasetName)
-            throws MetadataException, RemoteException {
+    public FeedConnection getFeedConnection(TxnId txnId, String dataverseName, String feedName, String datasetName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, feedName, datasetName);
             FeedConnectionTupleTranslator tupleReaderWriter = new FeedConnectionTupleTranslator(false);
             List<FeedConnection> results = new ArrayList<>();
             IValueExtractor<FeedConnection> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey, valueExtractor, results);
             if (!results.isEmpty()) {
                 return results.get(0);
             }
             return null;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropFeedConnection(JobId jobId, String dataverseName, String feedName, String datasetName)
-            throws MetadataException, RemoteException {
+    public void dropFeedConnection(TxnId txnId, String dataverseName, String feedName, String datasetName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, feedName, datasetName);
             ITupleReference tuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, tuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.FEED_CONNECTION_DATASET, tuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addFeed(JobId jobId, Feed feed) throws MetadataException, RemoteException {
+    public void addFeed(TxnId txnId, Feed feed) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'Feed' dataset.
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(true);
             ITupleReference feedTuple = tupleReaderWriter.getTupleFromMetadataEntity(feed);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.FEED_DATASET, feedTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.FEED_DATASET, feedTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("A feed with this name " + feed.getFeedName()
+                throw new AlgebricksException("A feed with this name " + feed.getFeedName()
                         + " already exists in dataverse '" + feed.getDataverseName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public Feed getFeed(JobId jobId, String dataverse, String feedName) throws MetadataException, RemoteException {
+    public Feed getFeed(TxnId txnId, String dataverse, String feedName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse, feedName);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             List<Feed> results = new ArrayList<>();
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
             if (!results.isEmpty()) {
                 return results.get(0);
             }
             return null;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<Feed> getFeeds(JobId jobId, String dataverse) throws MetadataException, RemoteException {
+    public List<Feed> getFeeds(TxnId txnId, String dataverse) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse);
             FeedTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedTupleTranslator(false);
             List<Feed> results = new ArrayList<>();
             IValueExtractor<Feed> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropFeed(JobId jobId, String dataverse, String feedName) throws MetadataException, RemoteException {
+    public void dropFeed(TxnId txnId, String dataverse, String feedName) throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse, feedName);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'nodegroup' dataset.
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.FEED_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.FEED_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.FEED_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.FEED_DATASET, tuple);
             // TODO: Change this to be a BTree specific exception, e.g.,
             // BTreeKeyDoesNotExistException.
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Cannot drop feed '" + feedName + "' because it doesn't exist", e);
+                throw new AlgebricksException("Cannot drop feed '" + feedName + "' because it doesn't exist", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropFeedPolicy(JobId jobId, String dataverseName, String policyName)
-            throws MetadataException, RemoteException {
+    public void dropFeedPolicy(TxnId txnId, String dataverseName, String policyName)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverseName, policyName);
-            ITupleReference tuple = getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, tuple);
+            ITupleReference tuple = getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, tuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Unknown feed policy " + policyName, e);
+                throw new AlgebricksException("Unknown feed policy " + policyName, e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<FeedPolicyEntity> getDataversePolicies(JobId jobId, String dataverse)
-            throws MetadataException, RemoteException {
+    public List<FeedPolicyEntity> getDataversePolicies(TxnId txnId, String dataverse)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataverse);
             FeedPolicyTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getFeedPolicyTupleTranslator(false);
             IValueExtractor<FeedPolicyEntity> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<FeedPolicyEntity> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.FEED_POLICY_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void addExternalFile(JobId jobId, ExternalFile externalFile) throws MetadataException, RemoteException {
+    public void addExternalFile(TxnId txnId, ExternalFile externalFile) throws AlgebricksException, RemoteException {
         try {
             // Insert into the 'externalFiles' dataset.
             ExternalFileTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getExternalFileTupleTranslator(true);
             ITupleReference externalFileTuple = tupleReaderWriter.getTupleFromMetadataEntity(externalFile);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, externalFileTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, externalFileTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS) && e.getErrorCode() == ErrorCode.DUPLICATE_KEY) {
-                throw new MetadataException("An externalFile with this number " + externalFile.getFileNumber()
+                throw new AlgebricksException("An externalFile with this number " + externalFile.getFileNumber()
                         + " already exists in dataset '" + externalFile.getDatasetName() + "' in dataverse '"
                         + externalFile.getDataverseName() + "'.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public List<ExternalFile> getExternalFiles(JobId jobId, Dataset dataset) throws MetadataException, RemoteException {
+    public List<ExternalFile> getExternalFiles(TxnId txnId, Dataset dataset)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createTuple(dataset.getDataverseName(), dataset.getDatasetName());
             ExternalFileTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getExternalFileTupleTranslator(false);
             IValueExtractor<ExternalFile> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<ExternalFile> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey, valueExtractor, results);
             return results;
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropExternalFile(JobId jobId, String dataverseName, String datasetName, int fileNumber)
-            throws MetadataException, RemoteException {
+    public void dropExternalFile(TxnId txnId, String dataverseName, String datasetName, int fileNumber)
+            throws AlgebricksException, RemoteException {
         try {
             // Delete entry from the 'ExternalFile' dataset.
             ITupleReference searchKey = createExternalFileSearchTuple(dataverseName, datasetName, fileNumber);
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'ExternalFile' dataset.
             ITupleReference datasetTuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, datasetTuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, datasetTuple);
         } catch (HyracksDataException e) {
             if (e.getComponent().equals(ErrorCode.HYRACKS)
                     && e.getErrorCode() == ErrorCode.UPDATE_OR_DELETE_NON_EXISTENT_KEY) {
-                throw new MetadataException("Couldn't drop externalFile.", e);
+                throw new AlgebricksException("Couldn't drop externalFile.", e);
             } else {
-                throw new MetadataException(e);
+                throw new AlgebricksException(e);
             }
         } catch (ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void dropExternalFiles(JobId jobId, Dataset dataset) throws MetadataException, RemoteException {
-        List<ExternalFile> files = getExternalFiles(jobId, dataset);
-        //loop through files and delete them
+    public void dropExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException {
+        List<ExternalFile> files = getExternalFiles(txnId, dataset);
+        // loop through files and delete them
         for (int i = 0; i < files.size(); i++) {
-            dropExternalFile(jobId, files.get(i).getDataverseName(), files.get(i).getDatasetName(),
+            dropExternalFile(txnId, files.get(i).getDataverseName(), files.get(i).getDatasetName(),
                     files.get(i).getFileNumber());
         }
     }
 
-    // This method is used to create a search tuple for external data file since the search tuple has an int value
-    @SuppressWarnings("unchecked")
+    // This method is used to create a search tuple for external data file since the
+    // search tuple has an int value
     public ITupleReference createExternalFileSearchTuple(String dataverseName, String datasetName, int fileNumber)
             throws HyracksDataException {
         ISerializerDeserializer<AString> stringSerde =
@@ -1905,17 +1941,17 @@
         AMutableString aString = new AMutableString("");
         ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(3);
 
-        //dataverse field
+        // dataverse field
         aString.setValue(dataverseName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
 
-        //dataset field
+        // dataset field
         aString.setValue(datasetName);
         stringSerde.serialize(aString, tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
 
-        //file number field
+        // file number field
         intSerde.serialize(new AInt32(fileNumber), tupleBuilder.getDataOutput());
         tupleBuilder.addFieldEndOffset();
 
@@ -1925,26 +1961,26 @@
     }
 
     @Override
-    public ExternalFile getExternalFile(JobId jobId, String dataverseName, String datasetName, Integer fileNumber)
-            throws MetadataException, RemoteException {
+    public ExternalFile getExternalFile(TxnId txnId, String dataverseName, String datasetName, Integer fileNumber)
+            throws AlgebricksException, RemoteException {
         try {
             ITupleReference searchKey = createExternalFileSearchTuple(dataverseName, datasetName, fileNumber);
             ExternalFileTupleTranslator tupleReaderWriter =
                     tupleTranslatorProvider.getExternalFileTupleTranslator(false);
             IValueExtractor<ExternalFile> valueExtractor = new MetadataEntityValueExtractor<>(tupleReaderWriter);
             List<ExternalFile> results = new ArrayList<>();
-            searchIndex(jobId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey, valueExtractor, results);
+            searchIndex(txnId, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET, searchKey, valueExtractor, results);
             if (results.isEmpty()) {
                 return null;
             }
             return results.get(0);
         } catch (HyracksDataException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
 
     @Override
-    public void updateDataset(JobId jobId, Dataset dataset) throws MetadataException, RemoteException {
+    public void updateDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException {
         try {
             // This method will delete previous entry of the dataset and insert the new one
             // Delete entry from the 'datasets' dataset.
@@ -1953,15 +1989,19 @@
             // Searches the index for the tuple to be deleted. Acquires an S
             // lock on the 'dataset' dataset.
             ITupleReference datasetTuple =
-                    getTupleToBeDeleted(jobId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey);
-            deleteTupleFromIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
+                    getTupleToBeDeleted(txnId, MetadataPrimaryIndexes.DATASET_DATASET, searchKey);
+            deleteTupleFromIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
             // Previous tuple was deleted
             // Insert into the 'dataset' dataset.
             DatasetTupleTranslator tupleReaderWriter = tupleTranslatorProvider.getDatasetTupleTranslator(true);
             datasetTuple = tupleReaderWriter.getTupleFromMetadataEntity(dataset);
-            insertTupleIntoIndex(jobId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
+            insertTupleIntoIndex(txnId, MetadataPrimaryIndexes.DATASET_DATASET, datasetTuple);
         } catch (HyracksDataException | ACIDException e) {
-            throw new MetadataException(e);
+            throw new AlgebricksException(e);
         }
     }
-}
+
+    public ITxnIdFactory getTxnIdFactory() {
+        return txnIdFactory;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index 72285d0..cb67ee5 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -22,7 +22,7 @@
 import java.util.ArrayList;
 
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.external.dataset.adapter.AdapterIdentifier;
 import org.apache.asterix.metadata.entities.CompactionPolicy;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -68,14 +68,14 @@
     protected MetadataCache droppedCache = new MetadataCache();
 
     protected ArrayList<MetadataLogicalOperation> opLog = new ArrayList<>();
-    private final JobId jobId;
+    private final TxnId txnId;
 
-    public MetadataTransactionContext(JobId jobId) {
-        this.jobId = jobId;
+    public MetadataTransactionContext(TxnId txnId) {
+        this.txnId = txnId;
     }
 
-    public JobId getJobId() {
-        return jobId;
+    public TxnId getTxnId() {
+        return txnId;
     }
 
     public void addDataverse(Dataverse dataverse) {
@@ -109,7 +109,7 @@
     }
 
     public void addAdapter(DatasourceAdapter adapter) {
-        droppedCache.dropAdapter(adapter);
+        droppedCache.dropAdapterIfExists(adapter);
         logAndApply(new MetadataLogicalOperation(adapter, true));
     }
 
@@ -158,7 +158,7 @@
 
     public void dropFunction(FunctionSignature signature) {
         Function function = new Function(signature.getNamespace(), signature.getName(), signature.getArity(), null,
-                null, null, null, null);
+                null, null, null, null, null);
         droppedCache.addFunctionIfNotExists(function);
         logAndApply(new MetadataLogicalOperation(function, false));
     }
@@ -228,13 +228,11 @@
     }
 
     public void addFeed(Feed feed) {
-        droppedCache.dropFeed(feed);
+        droppedCache.dropFeedIfExists(feed);
         logAndApply(new MetadataLogicalOperation(feed, true));
     }
 
-    public void dropFeed(String dataverseName, String feedName) {
-        Feed feed = null;
-        feed = new Feed(dataverseName, feedName, null, null);
+    public void dropFeed(Feed feed) {
         droppedCache.addFeedIfNotExists(feed);
         logAndApply(new MetadataLogicalOperation(feed, false));
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/ExtensionMetadataDatasetId.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/ExtensionMetadataDatasetId.java
index 4074cdc..d3e8bcf 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/ExtensionMetadataDatasetId.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/ExtensionMetadataDatasetId.java
@@ -19,9 +19,9 @@
 package org.apache.asterix.metadata.api;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import org.apache.asterix.common.api.ExtensionId;
-import org.apache.commons.lang3.ObjectUtils;
 
 public class ExtensionMetadataDatasetId implements Serializable {
 
@@ -49,14 +49,14 @@
         }
         if (o instanceof ExtensionMetadataDatasetId) {
             ExtensionMetadataDatasetId otherId = (ExtensionMetadataDatasetId) o;
-            return ObjectUtils.equals(extensionId, otherId.getExtensionId())
-                    && ObjectUtils.equals(datasetName, otherId.getDatasetName());
+            return Objects.equals(extensionId, otherId.getExtensionId())
+                    && Objects.equals(datasetName, otherId.getDatasetName());
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(datasetName, extensionId);
+        return Objects.hash(datasetName, extensionId);
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IClusterManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IClusterManager.java
deleted file mode 100644
index 4acd673..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IClusterManager.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.metadata.api;
-
-import java.util.Set;
-
-import org.apache.asterix.common.api.IClusterEventsSubscriber;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.schema.cluster.Node;
-
-public interface IClusterManager {
-
-    /**
-     * @param node
-     * @throws AsterixException
-     */
-    public void addNode(ICcApplicationContext appCtx, Node node) throws AsterixException;
-
-    /**
-     * @param node
-     * @throws AsterixException
-     */
-    public void removeNode(Node node) throws AsterixException;
-
-    /**
-     * @param subscriber
-     */
-    public void registerSubscriber(IClusterEventsSubscriber subscriber);
-
-    /**
-     * @param sunscriber
-     * @return
-     */
-    public boolean deregisterSubscriber(IClusterEventsSubscriber sunscriber);
-
-    /**
-     * @return
-     */
-    public Set<IClusterEventsSubscriber> getRegisteredClusterEventSubscribers();
-
-    void notifyStartupCompleted() throws Exception;
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IDatasourceFunction.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IDatasourceFunction.java
new file mode 100644
index 0000000..336c2dc
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IDatasourceFunction.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.api;
+
+import java.io.Serializable;
+
+import org.apache.asterix.external.api.IRecordReader;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+/**
+ * A function that is also a datasource
+ */
+public interface IDatasourceFunction extends Serializable {
+
+    /**
+     * @return the locations on which the function is to be run
+     */
+    AlgebricksAbsolutePartitionConstraint getPartitionConstraint();
+
+    /**
+     * The function record reader
+     *
+     * @param ctx
+     * @param partition
+     * @return
+     * @throws HyracksDataException
+     */
+    IRecordReader<char[]> createRecordReader(IHyracksTaskContext ctx, int partition) throws HyracksDataException;
+
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataEntityTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataEntityTupleTranslator.java
index fbeb353..cd84256 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataEntityTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataEntityTupleTranslator.java
@@ -19,11 +19,10 @@
 
 package org.apache.asterix.metadata.api;
 
-import java.io.IOException;
 import java.io.Serializable;
 import java.rmi.RemoteException;
 
-import org.apache.asterix.common.exceptions.MetadataException;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
@@ -36,19 +35,19 @@
 public interface IMetadataEntityTupleTranslator<T> extends Serializable {
 
     /**
-     * Transforms a metadata entity of type T from a given tuple to a Java
-     * object (deserializing the appropriate field(s) in the tuple as
-     * necessary).
+     * Transforms a metadata entity of type T from a given tuple to a Java object
+     * (deserializing the appropriate field(s) in the tuple as necessary).
      *
      * @param tuple
-     *            Tuple containing a serialized representation of a metadata
-     *            entity of type T.
+     *            Tuple containing a serialized representation of a metadata entity
+     *            of type T.
      * @return A new instance of a metadata entity of type T.
-     * @throws MetadataException
-     * @throws IOException
+     * @throws AlgebricksException
+     * @throws HyracksDataException
+     * @throws RemoteException
      */
-    public T getMetadataEntityFromTuple(ITupleReference tuple)
-            throws MetadataException, HyracksDataException, RemoteException;
+    T getMetadataEntityFromTuple(ITupleReference tuple)
+            throws AlgebricksException, HyracksDataException, RemoteException;
 
     /**
      * Serializes the given metadata entity of type T into an appropriate tuple
@@ -56,7 +55,8 @@
      *
      * @param metadataEntity
      *            Metadata entity to be written into a tuple.
+     * @throws AlgebricksException
      * @throws HyracksDataException
      */
-    public ITupleReference getTupleFromMetadataEntity(T metadataEntity) throws MetadataException, HyracksDataException;
+    ITupleReference getTupleFromMetadataEntity(T metadataEntity) throws AlgebricksException, HyracksDataException;
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
index 88153a3..e030db3 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
@@ -23,7 +23,6 @@
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.common.metadata.IMetadataBootstrap;
 import org.apache.asterix.external.indexing.ExternalFile;
@@ -41,6 +40,7 @@
 import org.apache.asterix.metadata.entities.Library;
 import org.apache.asterix.metadata.entities.Node;
 import org.apache.asterix.metadata.entities.NodeGroup;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 /**
  * A metadata manager provides user access to Asterix metadata (e.g., types,
@@ -86,8 +86,8 @@
     void abortTransaction(MetadataTransactionContext ctx) throws ACIDException, RemoteException;
 
     /**
-     * Locks the metadata in given mode. The lock acquisition is delegated to
-     * the metadata node. This method blocks until the lock can be acquired.
+     * Locks the metadata in given mode. The lock acquisition is delegated to the
+     * metadata node. This method blocks until the lock can be acquired.
      *
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
@@ -115,10 +115,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param dataverse
      *            Dataverse instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse already exists.
      */
-    void addDataverse(MetadataTransactionContext ctx, Dataverse dataverse) throws MetadataException;
+    void addDataverse(MetadataTransactionContext ctx, Dataverse dataverse) throws AlgebricksException;
 
     /**
      * Retrieves all dataverses
@@ -126,9 +126,9 @@
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
      * @return A list of dataverse instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    List<Dataverse> getDataverses(MetadataTransactionContext ctx) throws MetadataException;
+    List<Dataverse> getDataverses(MetadataTransactionContext ctx) throws AlgebricksException;
 
     /**
      * Retrieves a dataverse with given name.
@@ -138,10 +138,10 @@
      * @param dataverseName
      *            Name of the dataverse to retrieve.
      * @return A dataverse instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      */
-    Dataverse getDataverse(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    Dataverse getDataverse(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException;
 
     /**
      * Retrieves all datasets belonging to the given dataverse.
@@ -151,10 +151,10 @@
      * @param dataverseName
      *            Name of the dataverse of which to find all datasets.
      * @return A list of dataset instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      */
-    List<Dataset> getDataverseDatasets(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    List<Dataset> getDataverseDatasets(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException;
 
     /**
      * Deletes the dataverse with given name, and all it's associated datasets,
@@ -163,10 +163,10 @@
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
      * @return A list of dataset instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      */
-    void dropDataverse(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    void dropDataverse(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException;
 
     /**
      * Inserts a new dataset into the metadata.
@@ -175,10 +175,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param dataset
      *            Dataset instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset already exists.
      */
-    void addDataset(MetadataTransactionContext ctx, Dataset dataset) throws MetadataException;
+    void addDataset(MetadataTransactionContext ctx, Dataset dataset) throws AlgebricksException;
 
     /**
      * Retrieves a dataset within a given dataverse.
@@ -190,11 +190,11 @@
      * @param datasetName
      *            Name of dataset to be retrieved.
      * @return A dataset instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset does not exist.
      */
     Dataset getDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Retrieves all indexes of a dataset.
@@ -206,11 +206,11 @@
      * @param datasetName
      *            Name of dataset for which to retrieve all indexes.
      * @return A list of Index instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
      */
     List<Index> getDatasetIndexes(MetadataTransactionContext ctx, String dataverseName, String datasetName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Deletes the dataset with given name, and all it's associated indexes.
@@ -221,10 +221,11 @@
      *            Name of dataverse which holds the given dataset.
      * @param datasetName
      *            Name of dataset to delete.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
      */
-    void dropDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName) throws MetadataException;
+    void dropDataset(MetadataTransactionContext ctx, String dataverseName, String datasetName)
+            throws AlgebricksException;
 
     /**
      * Inserts an index into the metadata. The index itself knows its name, and
@@ -234,10 +235,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param index
      *            Index instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index already exists.
      */
-    void addIndex(MetadataTransactionContext ctx, Index index) throws MetadataException;
+    void addIndex(MetadataTransactionContext ctx, Index index) throws AlgebricksException;
 
     /**
      * Retrieves the index with given name, in given dataverse and dataset.
@@ -251,11 +252,11 @@
      * @param indexName
      *            Name of the index to retrieve.
      * @return An Index instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index does not exist.
      */
     Index getIndex(MetadataTransactionContext ctx, String dataverseName, String datasetName, String indexName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Deletes the index with given name, in given dataverse and dataset.
@@ -268,11 +269,11 @@
      *            Name of the dataset holding the index.
      * @param indexName
      *            Name of the index to retrieve.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index does not exist.
      */
     void dropIndex(MetadataTransactionContext ctx, String dataverseName, String datasetName, String indexName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Inserts a datatype.
@@ -281,10 +282,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param datatype
      *            Datatype instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the datatype already exists.
      */
-    void addDatatype(MetadataTransactionContext ctx, Datatype datatype) throws MetadataException;
+    void addDatatype(MetadataTransactionContext ctx, Datatype datatype) throws AlgebricksException;
 
     /**
      * Retrieves the datatype with given name in given dataverse.
@@ -296,11 +297,11 @@
      * @param datatypeName
      *            Name of datatype to be retrieved.
      * @return A datatype instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the datatype does not exist.
      */
     Datatype getDatatype(MetadataTransactionContext ctx, String dataverseName, String datatypeName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Deletes the given datatype in given dataverse.
@@ -311,12 +312,12 @@
      *            Name of dataverse holding the datatype.
      * @param datatypeName
      *            Name of datatype to be deleted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if there are still datasets using the type to be
      *             deleted.
      */
     void dropDatatype(MetadataTransactionContext ctx, String dataverseName, String datatypeName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Inserts a node group.
@@ -325,10 +326,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param nodeGroup
      *            Node group instance to insert.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node group already exists.
      */
-    void addNodegroup(MetadataTransactionContext ctx, NodeGroup nodeGroup) throws MetadataException;
+    void addNodegroup(MetadataTransactionContext ctx, NodeGroup nodeGroup) throws AlgebricksException;
 
     /**
      * Retrieves a node group.
@@ -337,10 +338,10 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param nodeGroupName
      *            Name of node group to be retrieved.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node group does not exist.
      */
-    NodeGroup getNodegroup(MetadataTransactionContext ctx, String nodeGroupName) throws MetadataException;
+    NodeGroup getNodegroup(MetadataTransactionContext ctx, String nodeGroupName) throws AlgebricksException;
 
     /**
      * Deletes a node group.
@@ -350,13 +351,14 @@
      * @param nodeGroupName
      *            Name of node group to be deleted.
      * @param failSilently
-     *            true means it's a no-op if the node group cannot be dropped; false means it will throw an exception.
-     * @throws MetadataException
+     *            true means it's a no-op if the node group cannot be dropped; false
+     *            means it will throw an exception.
+     * @throws AlgebricksException
      *             For example, there are still datasets partitioned on the node
      *             group to be deleted.
      */
     void dropNodegroup(MetadataTransactionContext ctx, String nodeGroupName, boolean failSilently)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * Inserts a node (machine).
@@ -365,20 +367,20 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param node
      *            Node instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node already exists.
      */
-    void addNode(MetadataTransactionContext ctx, Node node) throws MetadataException;
+    void addNode(MetadataTransactionContext ctx, Node node) throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param function
-     *            An instance of type Function that represents the function
-     *            being added
-     * @throws MetadataException
+     *            An instance of type Function that represents the function being
+     *            added
+     * @throws AlgebricksException
      */
-    void addFunction(MetadataTransactionContext mdTxnCtx, Function function) throws MetadataException;
+    void addFunction(MetadataTransactionContext mdTxnCtx, Function function) throws AlgebricksException;
 
     /**
      * @param ctx
@@ -386,21 +388,22 @@
      * @param functionSignature
      *            the functions signature (unique to the function)
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
 
-    Function getFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature) throws MetadataException;
+    Function getFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature)
+            throws AlgebricksException;
 
-    List<Function> getFunctions(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    List<Function> getFunctions(MetadataTransactionContext ctx, String dataverseName) throws AlgebricksException;
 
     /**
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param functionSignature
      *            the functions signature (unique to the function)
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature) throws MetadataException;
+    void dropFunction(MetadataTransactionContext ctx, FunctionSignature functionSignature) throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
@@ -408,9 +411,9 @@
      * @param adapter
      *            An instance of type Adapter that represents the adapter being
      *            added
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void addAdapter(MetadataTransactionContext mdTxnCtx, DatasourceAdapter adapter) throws MetadataException;
+    void addAdapter(MetadataTransactionContext mdTxnCtx, DatasourceAdapter adapter) throws AlgebricksException;
 
     /**
      * @param ctx
@@ -420,10 +423,10 @@
      * @param name
      *            name of the adapter
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     DatasourceAdapter getAdapter(MetadataTransactionContext ctx, String dataverseName, String name)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * @param ctx
@@ -432,9 +435,9 @@
      *            the dataverse associated with the adapter being dropped
      * @param name
      *            name of the adapter
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropAdapter(MetadataTransactionContext ctx, String dataverseName, String name) throws MetadataException;
+    void dropAdapter(MetadataTransactionContext ctx, String dataverseName, String name) throws AlgebricksException;
 
     /**
      * @param ctx
@@ -442,90 +445,91 @@
      * @param dataverseName
      *            the dataverse whose associated adapters are being requested
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     List<DatasourceAdapter> getDataverseAdapters(MetadataTransactionContext ctx, String dataverseName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * @param ctx
      * @param policy
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void addCompactionPolicy(MetadataTransactionContext ctx, CompactionPolicy policy) throws MetadataException;
+    void addCompactionPolicy(MetadataTransactionContext ctx, CompactionPolicy policy) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverse
      * @param policyName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     CompactionPolicy getCompactionPolicy(MetadataTransactionContext ctx, String dataverse, String policyName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverseName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    List<Function> getDataverseFunctions(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    List<Function> getDataverseFunctions(MetadataTransactionContext ctx, String dataverseName)
+            throws AlgebricksException;
 
     /**
      * @param ctx
      * @param feed
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void addFeed(MetadataTransactionContext ctx, Feed feed) throws MetadataException;
+    void addFeed(MetadataTransactionContext ctx, Feed feed) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverse
      * @param feedName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    Feed getFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws MetadataException;
+    Feed getFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws AlgebricksException;
 
-    List<Feed> getFeeds(MetadataTransactionContext ctx, String dataverse) throws MetadataException;
+    List<Feed> getFeeds(MetadataTransactionContext ctx, String dataverse) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverse
      * @param feedName
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws MetadataException;
+    void dropFeed(MetadataTransactionContext ctx, String dataverse, String feedName) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param policy
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void addFeedPolicy(MetadataTransactionContext ctx, FeedPolicyEntity policy) throws MetadataException;
+    void addFeedPolicy(MetadataTransactionContext ctx, FeedPolicyEntity policy) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverse
      * @param policyName
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropFeedPolicy(MetadataTransactionContext ctx, String dataverse, String policyName) throws MetadataException;
+    void dropFeedPolicy(MetadataTransactionContext ctx, String dataverse, String policyName) throws AlgebricksException;
 
     /**
      * @param ctx
      * @param dataverse
      * @param policyName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     FeedPolicyEntity getFeedPolicy(MetadataTransactionContext ctx, String dataverse, String policyName)
-            throws MetadataException;
+            throws AlgebricksException;
 
-    void initializeDatasetIdFactory(MetadataTransactionContext ctx) throws MetadataException;
+    void initializeDatasetIdFactory(MetadataTransactionContext ctx) throws AlgebricksException;
 
-    int getMostRecentDatasetId() throws MetadataException;
+    int getMostRecentDatasetId() throws AlgebricksException;
 
     void acquireWriteLatch();
 
@@ -536,32 +540,32 @@
     void releaseReadLatch();
 
     /**
-     * Removes a library , acquiring local locks on behalf of the given
-     * transaction id.
+     * Removes a library , acquiring local locks on behalf of the given transaction
+     * id.
      *
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param dataverseName
      *            dataverse asociated with the adapter that is to be deleted.
      * @param libraryName
-     *            Name of library to be deleted. MetadataException for example,
-     *            if the library does not exists.
-     * @throws MetadataException
+     *            Name of library to be deleted. AlgebricksException for example, if
+     *            the library does not exists.
+     * @throws AlgebricksException
      */
-    void dropLibrary(MetadataTransactionContext ctx, String dataverseName, String libraryName) throws MetadataException;
+    void dropLibrary(MetadataTransactionContext ctx, String dataverseName, String libraryName)
+            throws AlgebricksException;
 
     /**
-     * Adds a library, acquiring local locks on behalf of the given
-     * transaction id.
+     * Adds a library, acquiring local locks on behalf of the given transaction id.
      *
      * @param ctx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param library
      *            Library to be added
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             for example, if the library is already added.
      */
-    void addLibrary(MetadataTransactionContext ctx, Library library) throws MetadataException;
+    void addLibrary(MetadataTransactionContext ctx, Library library) throws AlgebricksException;
 
     /**
      * @param ctx
@@ -571,11 +575,11 @@
      * @param libraryName
      *            name of the library that is to be retrieved
      * @return Library
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
     Library getLibrary(MetadataTransactionContext ctx, String dataverseName, String libraryName)
-            throws MetadataException, RemoteException;
+            throws AlgebricksException, RemoteException;
 
     /**
      * Retireve libraries installed in a given dataverse.
@@ -585,19 +589,20 @@
      * @param dataverseName
      *            dataverse asociated with the library that is to be retrieved.
      * @return Library
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    List<Library> getDataverseLibraries(MetadataTransactionContext ctx, String dataverseName) throws MetadataException;
+    List<Library> getDataverseLibraries(MetadataTransactionContext ctx, String dataverseName)
+            throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param externalFile
-     *            An instance of type ExternalFile that represents the external file being
-     *            added
-     * @throws MetadataException
+     *            An instance of type ExternalFile that represents the external file
+     *            being added
+     * @throws AlgebricksException
      */
-    void addExternalFile(MetadataTransactionContext mdTxnCtx, ExternalFile externalFile) throws MetadataException;
+    void addExternalFile(MetadataTransactionContext mdTxnCtx, ExternalFile externalFile) throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
@@ -605,20 +610,20 @@
      * @param dataset
      *            An instance of type Dataset that represents the "external" dataset
      * @return A list of external files belonging to the dataset
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     List<ExternalFile> getDatasetExternalFiles(MetadataTransactionContext mdTxnCtx, Dataset dataset)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
      *            MetadataTransactionContext of an active metadata transaction.
      * @param externalFile
-     *            An instance of type ExternalFile that represents the external file being
-     *            dropped
-     * @throws MetadataException
+     *            An instance of type ExternalFile that represents the external file
+     *            being dropped
+     * @throws AlgebricksException
      */
-    void dropExternalFile(MetadataTransactionContext mdTxnCtx, ExternalFile externalFile) throws MetadataException;
+    void dropExternalFile(MetadataTransactionContext mdTxnCtx, ExternalFile externalFile) throws AlgebricksException;
 
     /**
      * @param mdTxnCtx
@@ -626,9 +631,9 @@
      * @param dataset
      *            An instance of type dataset that owns the external files being
      *            dropped
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropDatasetExternalFiles(MetadataTransactionContext mdTxnCtx, Dataset dataset) throws MetadataException;
+    void dropDatasetExternalFiles(MetadataTransactionContext mdTxnCtx, Dataset dataset) throws AlgebricksException;
 
     /**
      * Get en external file
@@ -638,10 +643,10 @@
      * @param datasetName
      * @param fileNumber
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     ExternalFile getExternalFile(MetadataTransactionContext mdTxnCtx, String dataverseName, String datasetName,
-            Integer fileNumber) throws MetadataException;
+            Integer fileNumber) throws AlgebricksException;
 
     /**
      * update an existing dataset in metadata.
@@ -650,76 +655,75 @@
      *            MetadataTransactionContext of an active metadata transaction.
      * @param dataset
      *            Existing Dataset.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset already exists.
      */
-    void updateDataset(MetadataTransactionContext ctx, Dataset dataset) throws MetadataException;
+    void updateDataset(MetadataTransactionContext ctx, Dataset dataset) throws AlgebricksException;
 
     /**
-     * Clean up temporary datasets that have not been active for a long time.
-     *
-     * @throws MetadataException
-     */
-    void cleanupTempDatasets() throws MetadataException;
-
-    /**
-     * Add an extension entity to its extension dataset under the ongoing metadata transaction
+     * Add an extension entity to its extension dataset under the ongoing metadata
+     * transaction
      *
      * @param mdTxnCtx
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     <T extends IExtensionMetadataEntity> void addEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
-     * Upsert an extension entity to its extension dataset under the ongoing metadata transaction
+     * Upsert an extension entity to its extension dataset under the ongoing
+     * metadata transaction
      *
      * @param mdTxnCtx
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     <T extends IExtensionMetadataEntity> void upsertEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
-     * Deletes an extension entity from its extension dataset under the ongoing metadata transaction
+     * Deletes an extension entity from its extension dataset under the ongoing
+     * metadata transaction
      *
      * @param mdTxnCtx
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     <T extends IExtensionMetadataEntity> void deleteEntity(MetadataTransactionContext mdTxnCtx, T entity)
-            throws MetadataException;
+            throws AlgebricksException;
 
     /**
-     * Gets a list of extension entities matching a search key under the ongoing metadata transaction
+     * Gets a list of extension entities matching a search key under the ongoing
+     * metadata transaction
      *
      * @param mdTxnCtx
      * @param searchKey
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     <T extends IExtensionMetadataEntity> List<T> getEntities(MetadataTransactionContext mdTxnCtx,
-            IExtensionMetadataSearchKey searchKey) throws MetadataException;
+            IExtensionMetadataSearchKey searchKey) throws AlgebricksException;
 
     /**
-     * Indicate when the metadata node has left or rejoined the cluster, and the MetadataManager should
-     * rebind it
+     * Indicate when the metadata node has left or rejoined the cluster, and the
+     * MetadataManager should rebind it
      */
     void rebindMetadataNode();
 
     /**
      * Feed Connection Related Metadata operations
      */
-    void addFeedConnection(MetadataTransactionContext ctx, FeedConnection feedConnection) throws MetadataException;
+    void addFeedConnection(MetadataTransactionContext ctx, FeedConnection feedConnection) throws AlgebricksException;
 
     void dropFeedConnection(MetadataTransactionContext ctx, String dataverseName, String feedName, String datasetName)
-            throws MetadataException;
+            throws AlgebricksException;
 
     FeedConnection getFeedConnection(MetadataTransactionContext ctx, String dataverseName, String feedName,
-            String datasetName) throws MetadataException;
+            String datasetName) throws AlgebricksException;
 
     List<FeedConnection> getFeedConections(MetadataTransactionContext ctx, String dataverseName, String feedName)
-            throws MetadataException;
+            throws AlgebricksException;
+
+    long getMaxTxnId();
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
index a990d29..f6abc53 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
@@ -25,9 +25,8 @@
 import java.util.List;
 
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.metadata.entities.CompactionPolicy;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -42,15 +41,15 @@
 import org.apache.asterix.metadata.entities.Library;
 import org.apache.asterix.metadata.entities.Node;
 import org.apache.asterix.metadata.entities.NodeGroup;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 /**
  * A metadata node stores metadata in its local storage structures (currently
  * BTrees). A metadata node services requests on behalf of the (possibly remote)
  * metadata manager by executing local transactions against its local storage.
- * This interface mirrors the methods in IMetadataManager.
- * Users wanting to lock/access metadata shall always go through the
- * MetadataManager, and should never call methods on the MetadataNode directly
- * for any reason.
+ * This interface mirrors the methods in IMetadataManager. Users wanting to
+ * lock/access metadata shall always go through the MetadataManager, and should
+ * never call methods on the MetadataNode directly for any reason.
  */
 public interface IMetadataNode extends Remote, Serializable {
 
@@ -60,7 +59,7 @@
      * @throws ACIDException
      * @throws RemoteException
      */
-    void beginTransaction(JobId jobId) throws ACIDException, RemoteException;
+    void beginTransaction(TxnId txnId) throws ACIDException, RemoteException;
 
     /**
      * Commits a local transaction against the metadata.
@@ -68,7 +67,7 @@
      * @throws ACIDException
      * @throws RemoteException
      */
-    void commitTransaction(JobId jobId) throws ACIDException, RemoteException;
+    void commitTransaction(TxnId txnId) throws ACIDException, RemoteException;
 
     /**
      * Aborts a local transaction against the metadata.
@@ -76,7 +75,7 @@
      * @throws ACIDException
      * @throws RemoteException
      */
-    void abortTransaction(JobId jobId) throws ACIDException, RemoteException;
+    void abortTransaction(TxnId txnId) throws ACIDException, RemoteException;
 
     /**
      * Locally locks the entire metadata in given mode on behalf of given
@@ -85,7 +84,7 @@
      * @throws ACIDException
      * @throws RemoteException
      */
-    void lock(JobId jobId, byte lockMode) throws ACIDException, RemoteException;
+    void lock(TxnId txnId, byte lockMode) throws ACIDException, RemoteException;
 
     /**
      * Releases all local locks of given transaction id.
@@ -93,163 +92,164 @@
      * @throws ACIDException
      * @throws RemoteException
      */
-    void unlock(JobId jobId, byte lockMode) throws ACIDException, RemoteException;
+    void unlock(TxnId txnId, byte lockMode) throws ACIDException, RemoteException;
 
     /**
-     * Inserts a new dataverse into the metadata, acquiring local locks on
-     * behalf of the given transaction id.
+     * Inserts a new dataverse into the metadata, acquiring local locks on behalf of
+     * the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverse
      *            Dataverse instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse already exists.
      * @throws RemoteException
      */
-    void addDataverse(JobId jobId, Dataverse dataverse) throws MetadataException, RemoteException;
+    void addDataverse(TxnId txnId, Dataverse dataverse) throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves all dataverses, acquiring local locks on behalf of
-     * the given transaction id.
+     * Retrieves all dataverses, acquiring local locks on behalf of the given
+     * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @return A list of dataverse instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      * @throws RemoteException
      */
-    List<Dataverse> getDataverses(JobId jobId) throws MetadataException, RemoteException;
+    List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves a dataverse with given name, acquiring local locks on behalf of
-     * the given transaction id.
+     * Retrieves a dataverse with given name, acquiring local locks on behalf of the
+     * given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of the dataverse to retrieve.
      * @return A dataverse instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      * @throws RemoteException
      */
-    Dataverse getDataverse(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    Dataverse getDataverse(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves all datasets belonging to the given dataverse, acquiring local
      * locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of the dataverse of which to find all datasets.
      * @return A list of dataset instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist. RemoteException
      */
-    List<Dataset> getDataverseDatasets(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    List<Dataset> getDataverseDatasets(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
      * Deletes the dataverse with given name, and all it's associated datasets,
-     * indexes, and types, acquiring local locks on behalf of the given
-     * transaction id.
+     * indexes, and types, acquiring local locks on behalf of the given transaction
+     * id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @return A list of dataset instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
      * @throws RemoteException
      */
-    void dropDataverse(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    void dropDataverse(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
-     * Inserts a new dataset into the metadata, acquiring local locks on behalf
-     * of the given transaction id.
+     * Inserts a new dataset into the metadata, acquiring local locks on behalf of
+     * the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataset
      *            Dataset instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset already exists.
      * @throws RemoteException
      */
-    void addDataset(JobId jobId, Dataset dataset) throws MetadataException, RemoteException;
+    void addDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves a dataset within a given dataverse, acquiring local locks on
-     * behalf of the given transaction id.
+     * Retrieves a dataset within a given dataverse, acquiring local locks on behalf
+     * of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Dataverse name to look for the dataset.
      * @param datasetName
      *            Name of dataset to be retrieved.
      * @return A dataset instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset does not exist.
      * @throws RemoteException
      */
-    Dataset getDataset(JobId jobId, String dataverseName, String datasetName) throws MetadataException, RemoteException;
+    Dataset getDataset(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves all indexes of a dataset, acquiring local locks on behalf of
-     * the given transaction id.
+     * Retrieves all indexes of a dataset, acquiring local locks on behalf of the
+     * given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of dataverse which holds the given dataset.
      * @param datasetName
      *            Name of dataset for which to retrieve all indexes.
      * @return A list of Index instances.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
      * @throws RemoteException
      */
-    List<Index> getDatasetIndexes(JobId jobId, String dataverseName, String datasetName)
-            throws MetadataException, RemoteException;
+    List<Index> getDatasetIndexes(TxnId txnId, String dataverseName, String datasetName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Deletes the dataset with given name, and all it's associated indexes,
      * acquiring local locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of dataverse which holds the given dataset.
      * @param datasetName
      *            Name of dataset to delete.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset and/or dataverse does not exist.
      * @throws RemoteException
      */
-    void dropDataset(JobId jobId, String dataverseName, String datasetName) throws MetadataException, RemoteException;
+    void dropDataset(TxnId txnId, String dataverseName, String datasetName) throws AlgebricksException, RemoteException;
 
     /**
-     * Inserts an index into the metadata, acquiring local locks on behalf of
-     * the given transaction id. The index itself knows its name, and which
-     * dataset it belongs to.
+     * Inserts an index into the metadata, acquiring local locks on behalf of the
+     * given transaction id. The index itself knows its name, and which dataset it
+     * belongs to.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param index
      *            Index instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index already exists.
      * @throws RemoteException
      */
-    void addIndex(JobId jobId, Index index) throws MetadataException, RemoteException;
+    void addIndex(TxnId txnId, Index index) throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves the index with given name, in given dataverse and dataset,
      * acquiring local locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of the datavers holding the given dataset.
@@ -257,346 +257,352 @@
      *            Name of the dataset holding the index.
      * @indexName Name of the index to retrieve.
      * @return An Index instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index does not exist.
      * @throws RemoteException
      */
-    Index getIndex(JobId jobId, String dataverseName, String datasetName, String indexName)
-            throws MetadataException, RemoteException;
+    Index getIndex(TxnId txnId, String dataverseName, String datasetName, String indexName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Deletes the index with given name, in given dataverse and dataset,
-     * acquiring local locks on behalf of the given transaction id.
+     * Deletes the index with given name, in given dataverse and dataset, acquiring
+     * local locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of the datavers holding the given dataset.
      * @param datasetName
      *            Name of the dataset holding the index.
      * @indexName Name of the index to retrieve.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index does not exist.
      * @throws RemoteException
      */
-    void dropIndex(JobId jobId, String dataverseName, String datasetName, String indexName)
-            throws MetadataException, RemoteException;
+    void dropIndex(TxnId txnId, String dataverseName, String datasetName, String indexName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Inserts a datatype, acquiring local locks on behalf of the given
-     * transaction id.
+     * Inserts a datatype, acquiring local locks on behalf of the given transaction
+     * id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param datatype
      *            Datatype instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the datatype already exists.
      * @throws RemoteException
      */
-    void addDatatype(JobId jobId, Datatype datatype) throws MetadataException, RemoteException;
+    void addDatatype(TxnId txnId, Datatype datatype) throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves the datatype with given name in given dataverse, acquiring
-     * local locks on behalf of the given transaction id.
+     * Retrieves the datatype with given name in given dataverse, acquiring local
+     * locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of dataverse holding the datatype.
      * @param datatypeName
      *            Name of datatype to be retrieved.
      * @return A datatype instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the datatype does not exist.
      * @throws RemoteException
      */
-    Datatype getDatatype(JobId jobId, String dataverseName, String datatypeName)
-            throws MetadataException, RemoteException;
+    Datatype getDatatype(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Deletes the given datatype in given dataverse, acquiring local locks on
      * behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of dataverse holding the datatype.
      * @param datatypeName
      *            Name of datatype to be deleted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if there are still datasets using the type to be
      *             deleted.
      * @throws RemoteException
      */
-    void dropDatatype(JobId jobId, String dataverseName, String datatypeName) throws MetadataException, RemoteException;
+    void dropDatatype(TxnId txnId, String dataverseName, String datatypeName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Inserts a node group, acquiring local locks on behalf of the given
      * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param nodeGroup
      *            Node group instance to insert.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node group already exists.
      * @throws RemoteException
      */
-    void addNodeGroup(JobId jobId, NodeGroup nodeGroup) throws MetadataException, RemoteException;
+    void addNodeGroup(TxnId txnId, NodeGroup nodeGroup) throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves a node group, acquiring local locks on behalf of the given
      * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param nodeGroupName
      *            Name of node group to be retrieved.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node group does not exist.
      * @throws RemoteException
      */
-    NodeGroup getNodeGroup(JobId jobId, String nodeGroupName) throws MetadataException, RemoteException;
+    NodeGroup getNodeGroup(TxnId txnId, String nodeGroupName) throws AlgebricksException, RemoteException;
 
     /**
      * Deletes a node group, acquiring local locks on behalf of the given
      * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param nodeGroupName
      *            Name of node group to be deleted.
      * @param failSilently
-     *            true means it's a no-op if the node group cannot be dropped; false means it will throw an exception.
+     *            true means it's a no-op if the node group cannot be dropped; false
+     *            means it will throw an exception.
      * @return Whether the node group has been successfully dropped.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, there are still datasets partitioned on the node
      *             group to be deleted.
      * @throws RemoteException
      */
-    boolean dropNodegroup(JobId jobId, String nodeGroupName, boolean failSilently)
-            throws MetadataException, RemoteException;
+    boolean dropNodegroup(TxnId txnId, String nodeGroupName, boolean failSilently)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Inserts a node (compute node), acquiring local locks on behalf of the
-     * given transaction id.
+     * Inserts a node (compute node), acquiring local locks on behalf of the given
+     * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param node
      *            Node instance to be inserted.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the node already exists.
      * @throws RemoteException
      */
-    void addNode(JobId jobId, Node node) throws MetadataException, RemoteException;
+    void addNode(TxnId txnId, Node node) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param functionSignature
      *            An instance of functionSignature representing the function
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    Function getFunction(JobId jobId, FunctionSignature functionSignature) throws MetadataException, RemoteException;
+    Function getFunction(TxnId txnId, FunctionSignature functionSignature) throws AlgebricksException, RemoteException;
 
-    List<Function> getFunctions(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    List<Function> getFunctions(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
-     * Deletes a function, acquiring local locks on behalf of the given
-     * transaction id.
+     * Deletes a function, acquiring local locks on behalf of the given transaction
+     * id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param functionSignature
      *            An instance of functionSignature representing the function
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, there are still datasets partitioned on the node
      *             group to be deleted.
      * @throws RemoteException
      */
-    void dropFunction(JobId jobId, FunctionSignature functionSignature) throws MetadataException, RemoteException;
+    void dropFunction(TxnId txnId, FunctionSignature functionSignature) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param function
      *            Function to be inserted
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             for example, if the function already exists or refers to an
      *             unknown function
      * @throws RemoteException
      */
-    void addFunction(JobId jobId, Function function) throws MetadataException, RemoteException;
+    void addFunction(TxnId txnId, Function function) throws AlgebricksException, RemoteException;
 
     /**
-     * @param ctx
+     * @param txnId
      * @param dataverseName
-     * @return List<Function> A list containing the functions in the specified dataverse
-     * @throws MetadataException
+     * @return List<Function> A list containing the functions in the specified
+     *         dataverse
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<Function> getDataverseFunctions(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    List<Function> getDataverseFunctions(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
-     * @param ctx
+     * @param txnId
      * @param dataverseName
-     * @return List<Adapter> A list containing the adapters in the specified dataverse
-     * @throws MetadataException
+     * @return List<Adapter> A list containing the adapters in the specified
+     *         dataverse
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<DatasourceAdapter> getDataverseAdapters(JobId jobId, String dataverseName)
-            throws MetadataException, RemoteException;
+    List<DatasourceAdapter> getDataverseAdapters(TxnId txnId, String dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverseName
      * @param adapterName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    DatasourceAdapter getAdapter(JobId jobId, String dataverseName, String adapterName)
-            throws MetadataException, RemoteException;
+    DatasourceAdapter getAdapter(TxnId txnId, String dataverseName, String adapterName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Deletes a adapter , acquiring local locks on behalf of the given
-     * transaction id.
+     * Deletes a adapter , acquiring local locks on behalf of the given transaction
+     * id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            dataverse asociated with the adapter that is to be deleted.
      * @param adapterName
-     *            Name of adapter to be deleted. MetadataException for example,
-     *            if the adapter does not exists.
+     *            Name of adapter to be deleted. AlgebricksException for example, if
+     *            the adapter does not exists.
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void dropAdapter(JobId jobId, String dataverseName, String adapterName) throws MetadataException, RemoteException;
+    void dropAdapter(TxnId txnId, String dataverseName, String adapterName) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param adapter
      *            Adapter to be inserted
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             for example, if the adapter already exists.
      * @throws RemoteException
      */
-    void addAdapter(JobId jobId, DatasourceAdapter adapter) throws MetadataException, RemoteException;
+    void addAdapter(TxnId txnId, DatasourceAdapter adapter) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param compactionPolicy
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void addCompactionPolicy(JobId jobId, CompactionPolicy compactionPolicy) throws MetadataException, RemoteException;
+    void addCompactionPolicy(TxnId txnId, CompactionPolicy compactionPolicy)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverse
      * @param policy
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    CompactionPolicy getCompactionPolicy(JobId jobId, String dataverse, String policy)
-            throws MetadataException, RemoteException;
+    CompactionPolicy getCompactionPolicy(TxnId txnId, String dataverse, String policy)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
-     * @throws MetadataException
+     * @param txnId
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void initializeDatasetIdFactory(JobId jobId) throws MetadataException, RemoteException;
+    void initializeDatasetIdFactory(TxnId txnId) throws AlgebricksException, RemoteException;
 
     /**
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    int getMostRecentDatasetId() throws MetadataException, RemoteException;
+    int getMostRecentDatasetId() throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param feed
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void addFeed(JobId jobId, Feed feed) throws MetadataException, RemoteException;
+    void addFeed(TxnId txnId, Feed feed) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverse
      * @param feedName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    Feed getFeed(JobId jobId, String dataverse, String feedName) throws MetadataException, RemoteException;
+    Feed getFeed(TxnId txnId, String dataverse, String feedName) throws AlgebricksException, RemoteException;
 
-    List<Feed> getFeeds(JobId jobId, String dataverse) throws MetadataException, RemoteException;
+    List<Feed> getFeeds(TxnId txnId, String dataverse) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverse
      * @param feedName
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void dropFeed(JobId jobId, String dataverse, String feedName) throws MetadataException, RemoteException;
+    void dropFeed(TxnId txnId, String dataverse, String feedName) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param feedPolicy
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void addFeedPolicy(JobId jobId, FeedPolicyEntity feedPolicy) throws MetadataException, RemoteException;
+    void addFeedPolicy(TxnId txnId, FeedPolicyEntity feedPolicy) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverse
      * @param policy
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    FeedPolicyEntity getFeedPolicy(JobId jobId, String dataverse, String policy)
-            throws MetadataException, RemoteException;
+    FeedPolicyEntity getFeedPolicy(TxnId txnId, String dataverse, String policy)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Removes a library , acquiring local locks on behalf of the given
-     * transaction id.
+     * Removes a library , acquiring local locks on behalf of the given transaction
+     * id.
      *
      * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            dataverse asociated with the adapter that is to be deleted.
      * @param libraryName
-     *            Name of library to be deleted. MetadataException for example,
-     *            if the library does not exists.
+     *            Name of library to be deleted. AlgebricksException for example, if
+     *            the library does not exists.
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void dropLibrary(JobId jobId, String dataverseName, String libraryName) throws MetadataException, RemoteException;
+    void dropLibrary(TxnId txnId, String dataverseName, String libraryName) throws AlgebricksException, RemoteException;
 
     /**
-     * Adds a library, acquiring local locks on behalf of the given
-     * transaction id.
+     * Adds a library, acquiring local locks on behalf of the given transaction id.
      *
      * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param library
      *            Library to be added
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             for example, if the library is already added.
      * @throws RemoteException
      */
-    void addLibrary(JobId jobId, Library library) throws MetadataException, RemoteException;
+    void addLibrary(TxnId txnId, Library library) throws AlgebricksException, RemoteException;
 
     /**
      * @param txnId
@@ -606,10 +612,11 @@
      * @param libraryName
      *            name of the library that is to be retrieved
      * @return Library
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    Library getLibrary(JobId jobId, String dataverseName, String libraryName) throws MetadataException, RemoteException;
+    Library getLibrary(TxnId txnId, String dataverseName, String libraryName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Retireve libraries installed in a given dataverse.
@@ -619,97 +626,101 @@
      * @param dataverseName
      *            dataverse asociated with the library that is to be retrieved.
      * @return Library
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<Library> getDataverseLibraries(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    List<Library> getDataverseLibraries(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverseName
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<Feed> getDataverseFeeds(JobId jobId, String dataverseName) throws MetadataException, RemoteException;
+    List<Feed> getDataverseFeeds(TxnId txnId, String dataverseName) throws AlgebricksException, RemoteException;
 
     /**
      * delete a give feed (ingestion) policy
      *
-     * @param jobId
+     * @param txnId
      * @param dataverseName
      * @param policyName
      * @return
      * @throws RemoteException
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
-    void dropFeedPolicy(JobId jobId, String dataverseName, String policyName) throws MetadataException, RemoteException;
+    void dropFeedPolicy(TxnId txnId, String dataverseName, String policyName)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      * @param dataverse
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<FeedPolicyEntity> getDataversePolicies(JobId jobId, String dataverse)
-            throws MetadataException, RemoteException;
+    List<FeedPolicyEntity> getDataversePolicies(TxnId txnId, String dataverse)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param externalFile
      *            An object representing the external file entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             for example, if the file already exists.
      * @throws RemoteException
      */
-    void addExternalFile(JobId jobId, ExternalFile externalFile) throws MetadataException, RemoteException;
+    void addExternalFile(TxnId txnId, ExternalFile externalFile) throws AlgebricksException, RemoteException;
 
     /**
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataset
      *            A dataset the files belongs to.
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    List<ExternalFile> getExternalFiles(JobId jobId, Dataset dataset) throws MetadataException, RemoteException;
+    List<ExternalFile> getExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
     /**
      * Deletes an externalFile , acquiring local locks on behalf of the given
      * transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
-     *            dataverse asociated with the external dataset that owns the file to be deleted.
+     *            dataverse asociated with the external dataset that owns the file
+     *            to be deleted.
      * @param datasetName
      *            Name of dataset owning the file to be deleted.
      * @param fileNumber
      *            the id number for the file to be deleted
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void dropExternalFile(JobId jobId, String dataverseName, String datasetName, int fileNumber)
-            throws MetadataException, RemoteException;
+    void dropExternalFile(TxnId txnId, String dataverseName, String datasetName, int fileNumber)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Deletes all external files belonging to a dataset, acquiring local locks on behalf of the given
-     * transaction id.
+     * Deletes all external files belonging to a dataset, acquiring local locks on
+     * behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataset
      *            An external dataset the files belong to.
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    void dropExternalFiles(JobId jobId, Dataset dataset) throws MetadataException, RemoteException;
+    void dropExternalFiles(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves the file with given number, in given dataverse and dataset,
      * acquiring local locks on behalf of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
      *            Name of the datavers holding the given dataset.
@@ -718,81 +729,81 @@
      * @param fileNumber
      *            Number of the file
      * @return An ExternalFile instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the index does not exist.
      * @throws RemoteException
      */
-    ExternalFile getExternalFile(JobId jobId, String dataverseName, String datasetName, Integer fileNumber)
-            throws MetadataException, RemoteException;
+    ExternalFile getExternalFile(TxnId txnId, String dataverseName, String datasetName, Integer fileNumber)
+            throws AlgebricksException, RemoteException;
 
     /**
      * update an existing dataset in the metadata, acquiring local locks on behalf
      * of the given transaction id.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataset
      *            updated Dataset instance.
-     * @throws MetadataException
+     * @throws AlgebricksException
      *             For example, if the dataset already exists.
      * @throws RemoteException
      */
-    void updateDataset(JobId jobId, Dataset dataset) throws MetadataException, RemoteException;
+    void updateDataset(TxnId txnId, Dataset dataset) throws AlgebricksException, RemoteException;
 
     /**
      * Adds an extension entity under the ongoing transaction job id
      *
-     * @param jobId
+     * @param txnId
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    <T extends IExtensionMetadataEntity> void addEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException;
+    <T extends IExtensionMetadataEntity> void addEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Upserts an extension entity under the ongoing transaction job id
      *
-     * @param jobId
+     * @param txnId
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    <T extends IExtensionMetadataEntity> void upsertEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException;
+    <T extends IExtensionMetadataEntity> void upsertEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Deletes an extension entity under the ongoing transaction job id
      *
-     * @param jobId
+     * @param txnId
      * @param entity
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    <T extends IExtensionMetadataEntity> void deleteEntity(JobId jobId, T entity)
-            throws MetadataException, RemoteException;
+    <T extends IExtensionMetadataEntity> void deleteEntity(TxnId txnId, T entity)
+            throws AlgebricksException, RemoteException;
 
     /**
-     * Gets a list of extension entities matching a search key under the ongoing transaction
+     * Gets a list of extension entities matching a search key under the ongoing
+     * transaction
      *
-     * @param jobId
+     * @param txnId
      * @param searchKey
      * @return
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws RemoteException
      */
-    <T extends IExtensionMetadataEntity> List<T> getEntities(JobId jobId, IExtensionMetadataSearchKey searchKey)
-            throws MetadataException, RemoteException;
+    <T extends IExtensionMetadataEntity> List<T> getEntities(TxnId txnId, IExtensionMetadataSearchKey searchKey)
+            throws AlgebricksException, RemoteException;
 
-    void addFeedConnection(JobId jobId, FeedConnection feedConnection) throws MetadataException, RemoteException;
+    void addFeedConnection(TxnId txnId, FeedConnection feedConnection) throws AlgebricksException, RemoteException;
 
-    FeedConnection getFeedConnection(JobId jobId, String dataverseName, String feedName, String datasetName)
-            throws MetadataException, RemoteException;
+    FeedConnection getFeedConnection(TxnId txnId, String dataverseName, String feedName, String datasetName)
+            throws AlgebricksException, RemoteException;
 
-    void dropFeedConnection(JobId jobId, String dataverseName, String feedName, String datasetName)
-            throws MetadataException, RemoteException;
+    void dropFeedConnection(TxnId txnId, String dataverseName, String feedName, String datasetName)
+            throws AlgebricksException, RemoteException;
 
-    List<FeedConnection> getFeedConnections(JobId jobId, String dataverseName, String feedName)
-            throws MetadataException, RemoteException;
-
+    List<FeedConnection> getFeedConnections(TxnId txnId, String dataverseName, String feedName)
+            throws AlgebricksException, RemoteException;
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IValueExtractor.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IValueExtractor.java
index c2b61ee..4cc7719 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IValueExtractor.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IValueExtractor.java
@@ -22,8 +22,8 @@
 import java.io.IOException;
 import java.rmi.RemoteException;
 
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
@@ -38,15 +38,14 @@
     /**
      * Extracts an object of type T from a given tuple.
      *
-     * @param jobId
+     * @param txnId
      *            A globally unique transaction id.
      * @param tuple
      *            Tuple from which an object shall be extracted.
      * @return New object of type T.
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws HyracksDataException
      * @throws IOException
      */
-    public T getValue(JobId jobId, ITupleReference tuple)
-            throws MetadataException, HyracksDataException, RemoteException;
+    T getValue(TxnId txnId, ITupleReference tuple) throws AlgebricksException, HyracksDataException, RemoteException;
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/AsterixStateProxy.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/AsterixStateProxy.java
index da6bb54..5357fc8 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/AsterixStateProxy.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/AsterixStateProxy.java
@@ -22,17 +22,18 @@
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
 
 import org.apache.asterix.metadata.api.IAsterixStateProxy;
 import org.apache.asterix.metadata.api.IMetadataNode;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Contains Asterix distributed state such as the AsterixProperties.
  */
 public class AsterixStateProxy implements IAsterixStateProxy {
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(AsterixStateProxy.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private IMetadataNode metadataNode;
     private static final IAsterixStateProxy cc = new AsterixStateProxy();
@@ -57,6 +58,7 @@
     @Override
     public IMetadataNode waitForMetadataNode(long waitFor, TimeUnit timeUnit) throws InterruptedException {
         synchronized (this) {
+            //TODO(mblow): replace with nanoTime() to avoid being affected by system clock adjustments...
             long timeToWait = TimeUnit.MILLISECONDS.convert(waitFor, timeUnit);
             while (metadataNode == null && timeToWait > 0) {
                 long startTime = System.currentTimeMillis();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
index a6f1ad0..23806bd 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBootstrap.java
@@ -23,17 +23,14 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.context.AsterixVirtualBufferCacheProvider;
 import org.apache.asterix.common.context.CorrelatedPrefixMergePolicyFactory;
+import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.MetadataException;
@@ -46,6 +43,7 @@
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.metadata.IDatasetDetails;
 import org.apache.asterix.metadata.MetadataManager;
+import org.apache.asterix.metadata.MetadataNode;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.api.IMetadataIndex;
 import org.apache.asterix.metadata.entities.BuiltinTypeMap;
@@ -69,6 +67,7 @@
 import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexOperationTrackerFactory;
 import org.apache.asterix.transaction.management.resource.DatasetLocalResourceFactory;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
@@ -79,6 +78,7 @@
 import org.apache.hyracks.storage.am.common.build.IndexBuilder;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelper;
 import org.apache.hyracks.storage.am.lsm.btree.dataflow.LSMBTreeLocalResourceFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
@@ -87,6 +87,9 @@
 import org.apache.hyracks.storage.am.lsm.common.impls.PrefixMergePolicyFactory;
 import org.apache.hyracks.storage.common.ILocalResourceRepository;
 import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Initializes the remote metadata storage facilities ("universe") using a
@@ -99,7 +102,7 @@
  */
 public class MetadataBootstrap {
     public static final boolean IS_DEBUG_MODE = false;
-    private static final Logger LOGGER = Logger.getLogger(MetadataBootstrap.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static INcApplicationContext appContext;
     private static ILocalResourceRepository localResourceRepository;
     private static IIOManager ioManager;
@@ -125,11 +128,11 @@
      * @param isNewUniverse
      * @throws ACIDException
      * @throws RemoteException
-     * @throws MetadataException
+     * @throws AlgebricksException
      * @throws Exception
      */
     public static void startUniverse(INCServiceContext ncServiceContext, boolean isNewUniverse)
-            throws RemoteException, ACIDException, MetadataException {
+            throws RemoteException, ACIDException, AlgebricksException {
         MetadataBootstrap.setNewUniverse(isNewUniverse);
         appContext = (INcApplicationContext) ncServiceContext.getApplicationContext();
 
@@ -148,7 +151,7 @@
             for (int i = 0; i < PRIMARY_INDEXES.length; i++) {
                 enlistMetadataDataset(ncServiceContext, PRIMARY_INDEXES[i]);
             }
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(
                         "Finished enlistment of metadata B-trees in " + (isNewUniverse ? "new" : "old") + " universe");
             }
@@ -161,7 +164,7 @@
                 insertInitialAdapters(mdTxnCtx);
                 BuiltinFeedPolicies.insertInitialFeedPolicies(mdTxnCtx);
                 insertInitialCompactionPolicies(mdTxnCtx);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Finished creating metadata B-trees.");
                 }
             }
@@ -171,7 +174,7 @@
         } catch (Exception e) {
             try {
                 if (IS_DEBUG_MODE) {
-                    LOGGER.log(Level.SEVERE, "Failure during metadata bootstrap", e);
+                    LOGGER.log(Level.ERROR, "Failure during metadata bootstrap", e);
                 }
                 MetadataManager.INSTANCE.abortTransaction(mdTxnCtx);
             } catch (Exception e2) {
@@ -183,7 +186,7 @@
         }
     }
 
-    private static void insertInitialDataverses(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertInitialDataverses(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         String dataFormat = NonTaggedDataFormat.NON_TAGGED_DATA_FORMAT;
         MetadataManager.INSTANCE.addDataverse(mdTxnCtx,
                 new Dataverse(MetadataConstants.METADATA_DATAVERSE_NAME, dataFormat, MetadataUtil.PENDING_NO_OP));
@@ -191,19 +194,19 @@
     }
 
     /**
-     * Inserts a metadata dataset to the physical dataset index
-     * Should be performed on a bootstrap of a new universe
+     * Inserts a metadata dataset to the physical dataset index Should be performed
+     * on a bootstrap of a new universe
      *
      * @param mdTxnCtx
      * @param indexes
-     * @throws MetadataException
+     * @throws AlgebricksException
      */
     public static void insertMetadataDatasets(MetadataTransactionContext mdTxnCtx, IMetadataIndex[] indexes)
-            throws MetadataException {
+            throws AlgebricksException {
         for (int i = 0; i < indexes.length; i++) {
             IDatasetDetails id = new InternalDatasetDetails(FileStructure.BTREE, PartitioningStrategy.HASH,
                     indexes[i].getPartitioningExpr(), indexes[i].getPartitioningExpr(), null,
-                    indexes[i].getPartitioningExprType(), false, null, false);
+                    indexes[i].getPartitioningExprType(), false, null);
             MetadataManager.INSTANCE.addDataset(mdTxnCtx,
                     new Dataset(indexes[i].getDataverseName(), indexes[i].getIndexedDatasetName(),
                             indexes[i].getDataverseName(), indexes[i].getPayloadRecordType().getTypeName(),
@@ -211,7 +214,7 @@
                             GlobalConfig.DEFAULT_COMPACTION_POLICY_PROPERTIES, id, new HashMap<String, String>(),
                             DatasetType.INTERNAL, indexes[i].getDatasetId().getId(), MetadataUtil.PENDING_NO_OP));
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished inserting initial datasets.");
         }
     }
@@ -222,7 +225,7 @@
         }
     }
 
-    private static void insertMetadataDatatypes(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertMetadataDatatypes(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         ArrayList<IAType> types = new ArrayList<>();
         types.addAll(BuiltinTypeMap.getAllBuiltinTypes());
         getMetadataTypes(types);
@@ -231,37 +234,38 @@
                     types.get(i).getTypeName(), types.get(i), false));
         }
         MetadataManager.INSTANCE.addDatatype(mdTxnCtx, MetadataBuiltinEntities.ANY_OBJECT_DATATYPE);
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished inserting initial datatypes.");
         }
     }
 
-    private static void insertNodes(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertNodes(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         for (String nodesName : nodeNames) {
             MetadataManager.INSTANCE.addNode(mdTxnCtx, new Node(nodesName, 0, 0));
         }
     }
 
-    private static void insertInitialGroups(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertInitialGroups(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         List<String> metadataGroupNodeNames = new ArrayList<>();
         metadataGroupNodeNames.add(metadataNodeName);
         NodeGroup groupRecord = new NodeGroup(MetadataConstants.METADATA_NODEGROUP_NAME, metadataGroupNodeNames);
         MetadataManager.INSTANCE.addNodegroup(mdTxnCtx, groupRecord);
     }
 
-    private static void insertInitialAdapters(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertInitialAdapters(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         String[] builtInAdapterClassNames = new String[] { GenericAdapterFactory.class.getName() };
         DatasourceAdapter adapter;
         for (String adapterClassName : builtInAdapterClassNames) {
             adapter = getAdapter(adapterClassName);
             MetadataManager.INSTANCE.addAdapter(mdTxnCtx, adapter);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished inserting built-in adapters.");
         }
     }
 
-    private static void insertInitialCompactionPolicies(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    private static void insertInitialCompactionPolicies(MetadataTransactionContext mdTxnCtx)
+            throws AlgebricksException {
         String[] builtInCompactionPolicyClassNames =
                 new String[] { ConstantMergePolicyFactory.class.getName(), PrefixMergePolicyFactory.class.getName(),
                         NoMergePolicyFactory.class.getName(), CorrelatedPrefixMergePolicyFactory.class.getName() };
@@ -271,7 +275,7 @@
         }
     }
 
-    private static DatasourceAdapter getAdapter(String adapterFactoryClassName) throws MetadataException {
+    private static DatasourceAdapter getAdapter(String adapterFactoryClassName) throws AlgebricksException {
         try {
             String adapterName = ((IAdapterFactory) (Class.forName(adapterFactoryClassName).newInstance())).getAlias();
             return new DatasourceAdapter(new AdapterIdentifier(MetadataConstants.METADATA_DATAVERSE_NAME, adapterName),
@@ -282,7 +286,7 @@
     }
 
     private static CompactionPolicy getCompactionPolicyEntity(String compactionPolicyClassName)
-            throws MetadataException {
+            throws AlgebricksException {
         try {
             String policyName =
                     ((ILSMMergePolicyFactory) (Class.forName(compactionPolicyClassName).newInstance())).getName();
@@ -294,8 +298,8 @@
     }
 
     /**
-     * Enlist a metadata index so it is available for metadata operations
-     * should be performed upon bootstrapping
+     * Enlist a metadata index so it is available for metadata operations should be
+     * performed upon bootstrapping
      *
      * @param index
      * @throws HyracksDataException
@@ -307,24 +311,27 @@
         if (!appContext.getDatasetMemoryManager().reserve(index.getDatasetId().getId())) {
             throw new IllegalStateException("Failed to reserve memory for metadata dataset (" + datasetId + ")");
         }
-        ClusterPartition metadataPartition = appContext.getMetadataProperties().getMetadataPartition();
-        int metadataDeviceId = metadataPartition.getIODeviceNum();
-        String metadataPartitionPath = StoragePathUtil.prepareStoragePartitionPath(
-                ClusterProperties.INSTANCE.getStorageDirectoryName(), metadataPartition.getPartitionId());
+        String metadataPartitionPath =
+                StoragePathUtil.prepareStoragePartitionPath(MetadataNode.INSTANCE.getMetadataStoragePartition());
         String resourceName = metadataPartitionPath + File.separator + index.getFileNameRelativePath();
-        FileReference file = ioManager.getFileReference(metadataDeviceId, resourceName);
+        FileReference file = ioManager.resolve(resourceName);
         index.setFile(file);
         ITypeTraits[] typeTraits = index.getTypeTraits();
         IBinaryComparatorFactory[] cmpFactories = index.getKeyBinaryComparatorFactory();
         int[] bloomFilterKeyFields = index.getBloomFilterKeyFields();
 
-        // opTrackerProvider and ioOpCallbackFactory should both be acquired through IStorageManager
-        // We are unable to do this since IStorageManager needs a dataset to determine the appropriate
+        // opTrackerProvider and ioOpCallbackFactory should both be acquired through
+        // IStorageManager
+        // We are unable to do this since IStorageManager needs a dataset to determine
+        // the appropriate
         // objects
         ILSMOperationTrackerFactory opTrackerFactory =
                 index.isPrimaryIndex() ? new PrimaryIndexOperationTrackerFactory(datasetId)
                         : new SecondaryIndexOperationTrackerFactory(datasetId);
-        ILSMIOOperationCallbackFactory ioOpCallbackFactory = LSMBTreeIOOperationCallbackFactory.INSTANCE;
+        ILSMComponentIdGeneratorFactory idGeneratorProvider =
+                new DatasetLSMComponentIdGeneratorFactory(index.getDatasetId().getId());
+        ILSMIOOperationCallbackFactory ioOpCallbackFactory =
+                new LSMBTreeIOOperationCallbackFactory(idGeneratorProvider);
         IStorageComponentProvider storageComponentProvider = appContext.getStorageComponentProvider();
         if (isNewUniverse()) {
             LSMBTreeLocalResourceFactory lsmBtreeFactory = new LSMBTreeLocalResourceFactory(
@@ -336,7 +343,8 @@
                     bloomFilterKeyFields, appContext.getBloomFilterFalsePositiveRate(), true, null);
             DatasetLocalResourceFactory dsLocalResourceFactory =
                     new DatasetLocalResourceFactory(datasetId, lsmBtreeFactory);
-            // TODO(amoudi) Creating the index should be done through the same code path as other indexes
+            // TODO(amoudi) Creating the index should be done through the same code path as
+            // other indexes
             // This is to be done by having a metadata dataset associated with each index
             IIndexBuilder indexBuilder = new IndexBuilder(ncServiceCtx, storageComponentProvider.getStorageManager(),
                     index::getResourceId, file, dsLocalResourceFactory, true);
@@ -349,7 +357,8 @@
                                 .get(appContext.getTransactionSubsystem().getId())
                         + " to intialize as a new instance. (WARNING: all data will be lost.)");
             }
-            // Why do we care about metadata dataset's resource ids? why not assign them ids similar to other resources?
+            // Why do we care about metadata dataset's resource ids? why not assign them ids
+            // similar to other resources?
             if (index.getResourceId() != resource.getId()) {
                 throw new HyracksDataException("Resource Id doesn't match expected metadata index resource id");
             }
@@ -363,12 +372,13 @@
     /**
      * Perform recovery of DDL operations metadata records
      */
-    public static void startDDLRecovery() throws MetadataException {
+    public static void startDDLRecovery() throws AlgebricksException {
         // #. clean up any record which has pendingAdd/DelOp flag
-        // as traversing all records from DATAVERSE_DATASET to DATASET_DATASET, and then to INDEX_DATASET.
+        // as traversing all records from DATAVERSE_DATASET to DATASET_DATASET, and then
+        // to INDEX_DATASET.
         MetadataTransactionContext mdTxnCtx = null;
         MetadataManager.INSTANCE.acquireWriteLatch();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Starting DDL recovery ...");
         }
 
@@ -378,15 +388,16 @@
             for (Dataverse dataverse : dataverses) {
                 recoverDataverse(mdTxnCtx, dataverse);
             }
-            // the commit wasn't there before. yet, everything was working correctly!!!!!!!!!!!
+            // the commit wasn't there before. yet, everything was working
+            // correctly!!!!!!!!!!!
             MetadataManager.INSTANCE.commitTransaction(mdTxnCtx);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Completed DDL recovery.");
             }
         } catch (Exception e) {
             try {
                 if (IS_DEBUG_MODE) {
-                    LOGGER.log(Level.SEVERE, "Failure during DDL recovery", e);
+                    LOGGER.log(Level.ERROR, "Failure during DDL recovery", e);
                 }
                 MetadataManager.INSTANCE.abortTransaction(mdTxnCtx);
             } catch (Exception e2) {
@@ -399,11 +410,11 @@
     }
 
     private static void recoverDataverse(MetadataTransactionContext mdTxnCtx, Dataverse dataverse)
-            throws MetadataException {
+            throws AlgebricksException {
         if (dataverse.getPendingOp() != MetadataUtil.PENDING_NO_OP) {
             // drop pending dataverse
             MetadataManager.INSTANCE.dropDataverse(mdTxnCtx, dataverse.getDataverseName());
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Dropped a pending dataverse: " + dataverse.getDataverseName());
             }
         } else {
@@ -415,11 +426,12 @@
         }
     }
 
-    private static void recoverDataset(MetadataTransactionContext mdTxnCtx, Dataset dataset) throws MetadataException {
+    private static void recoverDataset(MetadataTransactionContext mdTxnCtx, Dataset dataset)
+            throws AlgebricksException {
         if (dataset.getPendingOp() != MetadataUtil.PENDING_NO_OP) {
             // drop pending dataset
             MetadataManager.INSTANCE.dropDataset(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName());
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(
                         "Dropped a pending dataset: " + dataset.getDataverseName() + "." + dataset.getDatasetName());
             }
@@ -431,7 +443,7 @@
                     // drop pending index
                     MetadataManager.INSTANCE.dropIndex(mdTxnCtx, dataset.getDataverseName(), dataset.getDatasetName(),
                             index.getIndexName());
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Dropped a pending index: " + dataset.getDataverseName() + "."
                                 + dataset.getDatasetName() + "." + index.getIndexName());
                     }
@@ -446,7 +458,7 @@
                 List<ExternalFile> files = MetadataManager.INSTANCE.getDatasetExternalFiles(mdTxnCtx, dataset);
                 for (ExternalFile file : files) {
                     MetadataManager.INSTANCE.dropExternalFile(mdTxnCtx, file);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Dropped an external file: " + dataset.getDataverseName() + "."
                                 + dataset.getDatasetName() + "." + file.getFileNumber());
                     }
@@ -462,4 +474,5 @@
     public static void setNewUniverse(boolean isNewUniverse) {
         MetadataBootstrap.isNewUniverse = isNewUniverse;
     }
+
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
index d796fed..c4f5bcb 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataBuiltinEntities.java
@@ -22,8 +22,6 @@
 import org.apache.asterix.metadata.entities.Dataverse;
 import org.apache.asterix.metadata.utils.MetadataConstants;
 import org.apache.asterix.metadata.utils.MetadataUtil;
-import org.apache.asterix.om.types.ARecordType;
-import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.utils.RecordUtil;
 import org.apache.asterix.runtime.formats.NonTaggedDataFormat;
 
@@ -33,10 +31,8 @@
     public static final Dataverse DEFAULT_DATAVERSE =
             new Dataverse(DEFAULT_DATAVERSE_NAME, NonTaggedDataFormat.class.getName(), MetadataUtil.PENDING_NO_OP);
     //--------------------------------------- Datatypes -----------------------------------------//
-    public static final ARecordType ANY_OBJECT_RECORD_TYPE =
-            new ARecordType("AnyObject", new String[0], new IAType[0], true);
     public static final Datatype ANY_OBJECT_DATATYPE = new Datatype(MetadataConstants.METADATA_DATAVERSE_NAME,
-            ANY_OBJECT_RECORD_TYPE.getTypeName(), RecordUtil.FULLY_OPEN_RECORD_TYPE, false);
+            RecordUtil.FULLY_OPEN_RECORD_TYPE.getTypeName(), RecordUtil.FULLY_OPEN_RECORD_TYPE, false);
 
     private MetadataBuiltinEntities() {
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
index 2a04b58..54a69eb 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/bootstrap/MetadataRecordTypes.java
@@ -48,6 +48,7 @@
     public static final String FIELD_NAME_DATAVERSE_NAME = "DataverseName";
     public static final String FIELD_NAME_DATA_FORMAT = "DataFormat";
     public static final String FIELD_NAME_DEFINITION = "Definition";
+    public static final String FIELD_NAME_DEPENDENCIES = "Dependencies";
     public static final String FIELD_NAME_DERIVED = "Derived";
     public static final String FIELD_NAME_DESCRIPTION = "Description";
     public static final String FIELD_NAME_EXTERNAL_DETAILS = "ExternalDetails";
@@ -321,16 +322,20 @@
     public static final int FUNCTION_ARECORD_FUNCTION_DEFINITION_FIELD_INDEX = 5;
     public static final int FUNCTION_ARECORD_FUNCTION_LANGUAGE_FIELD_INDEX = 6;
     public static final int FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX = 7;
+    public static final int FUNCTION_ARECORD_FUNCTION_DEPENDENCIES_FIELD_INDEX = 8;
     public static final ARecordType FUNCTION_RECORDTYPE = createRecordType(
             // RecordTypeName
             RECORD_NAME_FUNCTION,
             // FieldNames
             new String[] { FIELD_NAME_DATAVERSE_NAME, FIELD_NAME_NAME, FIELD_NAME_ARITY, FIELD_NAME_PARAMS,
-                    FIELD_NAME_RETURN_TYPE, FIELD_NAME_DEFINITION, FIELD_NAME_LANGUAGE, FIELD_NAME_KIND },
+                    FIELD_NAME_RETURN_TYPE, FIELD_NAME_DEFINITION, FIELD_NAME_LANGUAGE, FIELD_NAME_KIND,
+                    FIELD_NAME_DEPENDENCIES },
             // FieldTypes
             new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING,
                     new AOrderedListType(BuiltinType.ASTRING, null), BuiltinType.ASTRING, BuiltinType.ASTRING,
-                    BuiltinType.ASTRING, BuiltinType.ASTRING },
+                    BuiltinType.ASTRING, BuiltinType.ASTRING,
+                    new AOrderedListType(new AOrderedListType(new AOrderedListType(BuiltinType.ASTRING, null), null),
+                            null) },
             //IsOpen?
             true);
     //------------------------------------------ Adapter ----------------------------------------//
@@ -356,17 +361,16 @@
     public static final String RECORD_NAME_FEED = "FeedRecordType";
     public static final int FEED_ARECORD_DATAVERSE_NAME_FIELD_INDEX = 0;
     public static final int FEED_ARECORD_FEED_NAME_FIELD_INDEX = 1;
-    public static final int FEED_ARECORD_ADAPTOR_NAME_INDEX = 2;
-    public static final int FEED_ARECORD_ADAPTOR_CONFIG_INDEX = 3;
-    public static final int FEED_ARECORD_TIMESTAMP_FIELD_INDEX = 4;
+    public static final int FEED_ARECORD_ADAPTOR_CONFIG_INDEX = 2;
+    public static final int FEED_ARECORD_TIMESTAMP_FIELD_INDEX = 3;
     public static final ARecordType FEED_RECORDTYPE = createRecordType(
             // RecordTypeName
             RECORD_NAME_FEED,
             // FieldNames
-            new String[] { FIELD_NAME_DATAVERSE_NAME, FIELD_NAME_FEED_NAME, FIELD_NAME_ADAPTER_NAME,
-                    FIELD_NAME_ADAPTER_CONFIGURATION, FIELD_NAME_TIMESTAMP },
+            new String[] { FIELD_NAME_DATAVERSE_NAME, FIELD_NAME_FEED_NAME, FIELD_NAME_ADAPTER_CONFIGURATION,
+                    FIELD_NAME_TIMESTAMP },
             // FieldTypes
-            new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING,
+            new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING,
                     new AUnorderedListType(FEED_ADAPTER_CONFIGURATION_RECORDTYPE, null), BuiltinType.ASTRING },
             //IsOpen?
             true);
@@ -380,7 +384,6 @@
     public static final int FEED_CONN_APPLIED_FUNCTIONS_FIELD_INDEX = 4;
     public static final int FEED_CONN_POLICY_FIELD_INDEX = 5;
 
-
     public static final ARecordType FEED_CONNECTION_RECORDTYPE = createRecordType(
             // RecordTypeName
             RECORD_NAME_FEED_CONNECTION,
@@ -389,7 +392,7 @@
                     FIELD_NAME_RETURN_TYPE, FIELD_NAME_APPLIED_FUNCTIONS, FIELD_NAME_POLICY_NAME },
             // FieldTypes
             new IAType[] { BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING, BuiltinType.ASTRING,
-                    new AUnorderedListType(BuiltinType.ASTRING, null), BuiltinType.ASTRING},
+                    new AUnorderedListType(BuiltinType.ASTRING, null), BuiltinType.ASTRING },
             //IsOpen?
             true);
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/AbstractClusterManagementWork.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/AbstractClusterManagementWork.java
index 3c9e2d2..c6ef6e1 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/AbstractClusterManagementWork.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/AbstractClusterManagementWork.java
@@ -39,8 +39,6 @@
         this.workId = WorkIdGenerator.getNextWorkId();
     }
 
-
-
     private static class WorkIdGenerator {
         private static AtomicInteger workId = new AtomicInteger(0);
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagementWorkResponse.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagementWorkResponse.java
index 61a35e3..396ada6 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagementWorkResponse.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagementWorkResponse.java
@@ -32,7 +32,6 @@
         this.status = Status.IN_PROGRESS;
     }
 
-
     @Override
     public IClusterManagementWork getWork() {
         return work;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManager.java
deleted file mode 100644
index 1b4f5dc..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManager.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.metadata.cluster;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.asterix.common.api.IClusterEventsSubscriber;
-import org.apache.asterix.common.api.IClusterManagementWork;
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.config.ExternalProperties;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.management.AsterixEventServiceClient;
-import org.apache.asterix.event.model.AsterixInstance;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.event.schema.pattern.Pattern;
-import org.apache.asterix.event.schema.pattern.Patterns;
-import org.apache.asterix.event.service.AsterixEventService;
-import org.apache.asterix.event.service.AsterixEventServiceUtil;
-import org.apache.asterix.event.service.ILookupService;
-import org.apache.asterix.event.service.ServiceProvider;
-import org.apache.asterix.event.util.PatternCreator;
-import org.apache.asterix.installer.schema.conf.Configuration;
-import org.apache.asterix.metadata.api.IClusterManager;
-
-public class ClusterManager implements IClusterManager {
-
-    private static final Logger LOGGER = Logger.getLogger(ClusterManager.class.getName());
-
-    public static final IClusterManager INSTANCE = ClusterManagerProvider.getClusterManager();
-
-    private final AsterixEventServiceClient client;
-
-    private final ILookupService lookupService;
-
-    private final Set<IClusterEventsSubscriber> eventSubscribers = new HashSet<>();
-
-    ClusterManager(String eventHome) {
-        String asterixDir = System.getProperty("user.dir") + File.separator + "asterix";
-        File configFile = new File(System.getProperty("user.dir") + File.separator + "configuration.xml");
-        Configuration configuration = null;
-
-        try {
-            JAXBContext configCtx = JAXBContext.newInstance(Configuration.class);
-            Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-            configuration = (Configuration) unmarshaller.unmarshal(configFile);
-            AsterixEventService.initialize(configuration, asterixDir, eventHome);
-            client = AsterixEventService.getAsterixEventServiceClient(ClusterProperties.INSTANCE.getCluster());
-
-            lookupService = ServiceProvider.INSTANCE.getLookupService();
-            if (!lookupService.isRunning(configuration)) {
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.info("Lookup service not running. Starting lookup service ...");
-                }
-                lookupService.startService(configuration);
-            } else {
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.info("Lookup service running");
-                }
-            }
-
-        } catch (Exception e) {
-            throw new IllegalStateException("Unable to initialize cluster manager" + e);
-        }
-    }
-
-    @Override
-    public void addNode(ICcApplicationContext appCtx, Node node) throws AsterixException {
-        try {
-            Cluster cluster = ClusterProperties.INSTANCE.getCluster();
-            List<Pattern> pattern = new ArrayList<>();
-            String asterixInstanceName = appCtx.getMetadataProperties().getInstanceName();
-            Patterns prepareNode = PatternCreator.INSTANCE.createPrepareNodePattern(asterixInstanceName,
-                    ClusterProperties.INSTANCE.getCluster(), node);
-            cluster.getNode().add(node);
-            client.submit(prepareNode);
-
-            ExternalProperties externalProps = appCtx.getExternalProperties();
-            AsterixEventServiceUtil.poulateClusterEnvironmentProperties(cluster, externalProps.getCCJavaParams(),
-                    externalProps.getNCJavaParams());
-
-            pattern.clear();
-            String ccHost = cluster.getMasterNode().getClusterIp();
-            String hostId = node.getId();
-            String nodeControllerId = asterixInstanceName + "_" + node.getId();
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            Pattern startNC =
-                    PatternCreator.INSTANCE.createNCStartPattern(ccHost, hostId, nodeControllerId, iodevices, false);
-            pattern.add(startNC);
-            Patterns startNCPattern = new Patterns(pattern);
-            client.submit(startNCPattern);
-
-            removeNode(cluster.getSubstituteNodes().getNode(), node);
-
-            AsterixInstance instance = lookupService.getAsterixInstance(cluster.getInstanceName());
-            instance.getCluster().getNode().add(node);
-            removeNode(instance.getCluster().getSubstituteNodes().getNode(), node);
-            lookupService.updateAsterixInstance(instance);
-
-        } catch (Exception e) {
-            throw new AsterixException(e);
-        }
-
-    }
-
-    private void removeNode(List<Node> list, Node node) {
-        Node nodeToRemove = null;
-        for (Node n : list) {
-            if (n.getId().equals(node.getId())) {
-                nodeToRemove = n;
-                break;
-            }
-        }
-        if (nodeToRemove != null) {
-            boolean removed = list.remove(nodeToRemove);
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("attempt to remove node :" + nodeToRemove + " successful " + removed);
-            }
-        }
-    }
-
-    @Override
-    public void removeNode(Node node) throws AsterixException {
-        // to be implemented later.
-    }
-
-    @Override
-    public void registerSubscriber(IClusterEventsSubscriber subscriber) {
-        eventSubscribers.add(subscriber);
-    }
-
-    @Override
-    public boolean deregisterSubscriber(IClusterEventsSubscriber subscriber) {
-        return eventSubscribers.remove(subscriber);
-    }
-
-    @Override
-    public Set<IClusterEventsSubscriber> getRegisteredClusterEventSubscribers() {
-        return eventSubscribers;
-    }
-
-    @Override
-    public void notifyStartupCompleted() throws Exception {
-        // Notify Zookeeper that the startup is complete
-        lookupService.reportClusterState(ClusterProperties.INSTANCE.getCluster().getInstanceName(),
-                IClusterManagementWork.ClusterState.ACTIVE);
-    }
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagerProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagerProvider.java
deleted file mode 100644
index d11e70d..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/cluster/ClusterManagerProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.metadata.cluster;
-
-import java.util.Collections;
-import java.util.Set;
-
-import org.apache.asterix.common.api.IClusterEventsSubscriber;
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.metadata.api.IClusterManager;
-
-public class ClusterManagerProvider {
-
-    private ClusterManagerProvider() {
-    }
-
-    public static IClusterManager getClusterManager() {
-        return Holder.INSTANCE;
-    }
-
-    private static final class Holder {
-        static final IClusterManager INSTANCE;
-
-        static {
-            Cluster asterixCluster = ClusterProperties.INSTANCE.getCluster();
-            String eventHome = asterixCluster == null ? null
-                    : asterixCluster.getWorkingDir() == null ? null : asterixCluster.getWorkingDir().getDir();
-
-            if (eventHome != null) {
-                INSTANCE = new ClusterManager(eventHome);
-            } else {
-                INSTANCE = new NoopClusterManager();
-            }
-        }
-
-        private Holder() {
-        }
-    }
-    private static class NoopClusterManager implements IClusterManager {
-        @Override
-        public void addNode(ICcApplicationContext appCtx, Node node) throws AsterixException {
-            // no-op
-        }
-
-        @Override
-        public void removeNode(Node node) throws AsterixException {
-            // no-op
-        }
-
-        @Override
-        public void registerSubscriber(IClusterEventsSubscriber subscriber) {
-            // no-op
-        }
-
-        @Override
-        public boolean deregisterSubscriber(IClusterEventsSubscriber sunscriber) {
-            return true;
-        }
-
-        @Override
-        public Set<IClusterEventsSubscriber> getRegisteredClusterEventSubscribers() {
-            return Collections.emptySet();
-        }
-
-        @Override
-        public void notifyStartupCompleted() throws Exception {
-            // no-op
-        }
-    }
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/AbstractDatasourceFunction.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/AbstractDatasourceFunction.java
new file mode 100644
index 0000000..0aff4c3
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/AbstractDatasourceFunction.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.declared;
+
+import org.apache.asterix.metadata.api.IDatasourceFunction;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+
+public abstract class AbstractDatasourceFunction implements IDatasourceFunction {
+
+    private static final long serialVersionUID = 1L;
+    private final transient AlgebricksAbsolutePartitionConstraint locations;
+
+    public AbstractDatasourceFunction(AlgebricksAbsolutePartitionConstraint locations) {
+        this.locations = locations;
+    }
+
+    @Override
+    public final AlgebricksAbsolutePartitionConstraint getPartitionConstraint() {
+        return locations;
+    }
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/BTreeResourceFactoryProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/BTreeResourceFactoryProvider.java
index bfc6a8e..301aafb 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/BTreeResourceFactoryProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/BTreeResourceFactoryProvider.java
@@ -69,7 +69,6 @@
         ITypeTraits[] typeTraits = getTypeTraits(mdProvider, dataset, index, recordType, metaType);
         IBinaryComparatorFactory[] cmpFactories = getCmpFactories(mdProvider, dataset, index, recordType, metaType);
         int[] bloomFilterFields = getBloomFilterFields(dataset, index);
-        boolean durable = !dataset.isTemp();
         double bloomFilterFalsePositiveRate = mdProvider.getStorageProperties().getBloomFilterFalsePositiveRate();
         ILSMOperationTrackerFactory opTrackerFactory = dataset.getIndexOperationTrackerFactory(index);
         ILSMIOOperationCallbackFactory ioOpCallbackFactory = dataset.getIoOperationCallbackFactory(index);
@@ -84,12 +83,12 @@
                         ? new ExternalBTreeLocalResourceFactory(storageManager, typeTraits, cmpFactories,
                                 filterTypeTraits, filterCmpFactories, filterFields, opTrackerFactory,
                                 ioOpCallbackFactory, metadataPageManagerFactory, ioSchedulerProvider,
-                                mergePolicyFactory, mergePolicyProperties, durable, bloomFilterFields,
+                                mergePolicyFactory, mergePolicyProperties, true, bloomFilterFields,
                                 bloomFilterFalsePositiveRate, false, btreeFields)
                         : new ExternalBTreeWithBuddyLocalResourceFactory(storageManager, typeTraits, cmpFactories,
                                 filterTypeTraits, filterCmpFactories, filterFields, opTrackerFactory,
                                 ioOpCallbackFactory, metadataPageManagerFactory, ioSchedulerProvider,
-                                mergePolicyFactory, mergePolicyProperties, durable, bloomFilterFields,
+                                mergePolicyFactory, mergePolicyProperties, true, bloomFilterFields,
                                 bloomFilterFalsePositiveRate, false, btreeFields);
             case INTERNAL:
                 AsterixVirtualBufferCacheProvider vbcProvider =
@@ -97,7 +96,7 @@
                 return new LSMBTreeLocalResourceFactory(storageManager, typeTraits, cmpFactories, filterTypeTraits,
                         filterCmpFactories, filterFields, opTrackerFactory, ioOpCallbackFactory,
                         metadataPageManagerFactory, vbcProvider, ioSchedulerProvider, mergePolicyFactory,
-                        mergePolicyProperties, durable, bloomFilterFields, bloomFilterFalsePositiveRate,
+                        mergePolicyProperties, true, bloomFilterFields, bloomFilterFalsePositiveRate,
                         index.isPrimaryIndex(), btreeFields);
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_UNKNOWN_DATASET_TYPE,
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSource.java
index fa874d5..66283d6 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSource.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DataSource.java
@@ -57,14 +57,15 @@
         public static final byte EXTERNAL_DATASET = 0x01;
         public static final byte FEED = 0x02;
         public static final byte LOADABLE = 0x03;
+        public static final byte FUNCTION = 0x04;
 
         // Hide implicit public constructor
         private Type() {
         }
     }
 
-    public DataSource(DataSourceId id, IAType itemType, IAType metaItemType, byte datasourceType,
-            INodeDomain domain) throws AlgebricksException {
+    public DataSource(DataSourceId id, IAType itemType, IAType metaItemType, byte datasourceType, INodeDomain domain)
+            throws AlgebricksException {
         this.id = id;
         this.itemType = itemType;
         this.metaItemType = metaItemType;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DatasetDataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DatasetDataSource.java
index 3f3a27f..d682484 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DatasetDataSource.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/DatasetDataSource.java
@@ -48,8 +48,7 @@
     private Dataset dataset;
 
     public DatasetDataSource(DataSourceId id, Dataset dataset, IAType itemType, IAType metaItemType,
-            byte datasourceType, IDatasetDetails datasetDetails, INodeDomain datasetDomain)
-            throws AlgebricksException {
+            byte datasourceType, IDatasetDetails datasetDetails, INodeDomain datasetDomain) throws AlgebricksException {
         super(id, itemType, metaItemType, datasourceType, datasetDomain);
         this.dataset = dataset;
         switch (dataset.getDatasetType()) {
@@ -116,9 +115,9 @@
 
                 int[] minFilterFieldIndexes = createFilterIndexes(minFilterVars, opSchema);
                 int[] maxFilterFieldIndexes = createFilterIndexes(maxFilterVars, opSchema);
-                return metadataProvider.buildBtreeRuntime(jobSpec, opSchema, typeEnv, context, true,
-                        false, ((DatasetDataSource) dataSource).getDataset(), primaryIndex.getIndexName(), null, null,
-                        true, true, false, minFilterFieldIndexes, maxFilterFieldIndexes);
+                return metadataProvider.buildBtreeRuntime(jobSpec, opSchema, typeEnv, context, true, false,
+                        ((DatasetDataSource) dataSource).getDataset(), primaryIndex.getIndexName(), null, null, true,
+                        true, false, minFilterFieldIndexes, maxFilterFieldIndexes);
             default:
                 throw new AlgebricksException("Unknown datasource type");
         }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
new file mode 100644
index 0000000..d2b9871
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSource.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.declared;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.asterix.common.cluster.IClusterStateManager;
+import org.apache.asterix.external.adapter.factory.GenericAdapterFactory;
+import org.apache.asterix.metadata.api.IDatasourceFunction;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
+import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSource;
+import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSourcePropertiesProvider;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
+import org.apache.hyracks.algebricks.core.algebra.properties.INodeDomain;
+import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
+import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
+import org.apache.hyracks.api.job.JobSpecification;
+
+public abstract class FunctionDataSource extends DataSource {
+
+    public FunctionDataSource(DataSourceId id, INodeDomain domain) throws AlgebricksException {
+        super(id, RecordUtil.FULLY_OPEN_RECORD_TYPE, null, DataSource.Type.FUNCTION, domain);
+        schemaTypes = new IAType[] { itemType };
+    }
+
+    @Override
+    public boolean isScanAccessPathALeaf() {
+        return true;
+    }
+
+    @Override
+    public IDataSourcePropertiesProvider getPropertiesProvider() {
+        // Unordered Random partitioning on all nodes
+        return scanVariables -> new StructuralPropertiesVector(new RandomPartitioningProperty(domain),
+                Collections.emptyList());
+    }
+
+    @Override
+    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> buildDatasourceScanRuntime(
+            MetadataProvider metadataProvider, IDataSource<DataSourceId> dataSource,
+            List<LogicalVariable> scanVariables, List<LogicalVariable> projectVariables, boolean projectPushed,
+            List<LogicalVariable> minFilterVars, List<LogicalVariable> maxFilterVars, IOperatorSchema opSchema,
+            IVariableTypeEnvironment typeEnv, JobGenContext context, JobSpecification jobSpec, Object implConfig)
+            throws AlgebricksException {
+        GenericAdapterFactory adapterFactory = new GenericAdapterFactory();
+        adapterFactory.setOutputType(RecordUtil.FULLY_OPEN_RECORD_TYPE);
+        IClusterStateManager csm = metadataProvider.getApplicationContext().getClusterStateManager();
+        FunctionDataSourceFactory factory =
+                new FunctionDataSourceFactory(createFunction(metadataProvider, getLocations(csm)));
+        adapterFactory.configure(factory);
+        return metadataProvider.buildExternalDatasetDataScannerRuntime(jobSpec, itemType, adapterFactory);
+    }
+
+    protected abstract IDatasourceFunction createFunction(MetadataProvider metadataProvider,
+            AlgebricksAbsolutePartitionConstraint locations);
+
+    protected static AlgebricksAbsolutePartitionConstraint getLocations(IClusterStateManager csm) {
+        String[] allPartitions = csm.getClusterLocations().getLocations();
+        Set<String> ncs = new HashSet<>(Arrays.asList(allPartitions));
+        return new AlgebricksAbsolutePartitionConstraint(ncs.toArray(new String[ncs.size()]));
+    }
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSourceFactory.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSourceFactory.java
new file mode 100644
index 0000000..1e0ddbf
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/FunctionDataSourceFactory.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.declared;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.asterix.external.api.IRecordReader;
+import org.apache.asterix.external.api.IRecordReaderFactory;
+import org.apache.asterix.metadata.api.IDatasourceFunction;
+import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.application.IServiceContext;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class FunctionDataSourceFactory implements IRecordReaderFactory<char[]> {
+
+    private static final long serialVersionUID = 1L;
+    private final IDatasourceFunction function;
+
+    public FunctionDataSourceFactory(IDatasourceFunction function) {
+        this.function = function;
+    }
+
+    @Override
+    public final DataSourceType getDataSourceType() {
+        return DataSourceType.RECORDS;
+    }
+
+    @Override
+    public AlgebricksAbsolutePartitionConstraint getPartitionConstraint() throws AlgebricksException {
+        return function.getPartitionConstraint();
+    }
+
+    @Override
+    public void configure(IServiceContext ctx, Map<String, String> configuration)
+            throws AlgebricksException, HyracksDataException {
+        // No Op
+    }
+
+    @Override
+    public IRecordReader<? extends char[]> createRecordReader(IHyracksTaskContext ctx, int partition)
+            throws HyracksDataException {
+        return function.createRecordReader(ctx, partition);
+    }
+
+    @Override
+    public Class<?> getRecordClass() {
+        return char[].class;
+    }
+
+    @Override
+    public List<String> getRecordReaderNames() {
+        return Collections.emptyList();
+    }
+}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/LoadableDataSource.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/LoadableDataSource.java
index b13f4c2..91030bf 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/LoadableDataSource.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/LoadableDataSource.java
@@ -65,17 +65,13 @@
         if (isPKAutoGenerated) {
             // Since the key is auto-generated, we need to use another
             // record type (possibly nested) which has all fields except the PK
-            try {
-                recType = getStrippedPKType(new LinkedList<>(partitioningKeys.get(0)), recType);
-            } catch (AsterixException e) {
-                throw new AlgebricksException(e);
-            }
+            recType = getStrippedPKType(new LinkedList<>(partitioningKeys.get(0)), recType);
         }
         schemaTypes = new IAType[] { recType };
     }
 
     private ARecordType getStrippedPKType(List<String> partitioningKeys, ARecordType recType)
-            throws AsterixException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         List<String> fieldNames = new LinkedList<>();
         List<IAType> fieldTypes = new LinkedList<>();
         int j = 0;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
index 97c6ed2..abadfb2 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataManagerUtil.java
@@ -23,7 +23,6 @@
 
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -52,13 +51,7 @@
         if (dataverse == null || typeName == null) {
             return null;
         }
-        Datatype type;
-        try {
-            type = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, dataverse, typeName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(
-                    "Metadata exception while looking up type '" + typeName + "' in dataverse '" + dataverse + "'", e);
-        }
+        Datatype type = MetadataManager.INSTANCE.getDatatype(mdTxnCtx, dataverse, typeName);
         if (type == null) {
             throw new AlgebricksException("Type name '" + typeName + "' unknown in dataverse '" + dataverse + "'");
         }
@@ -81,7 +74,7 @@
     }
 
     public static DatasourceAdapter getAdapter(MetadataTransactionContext mdTxnCtx, String dataverseName,
-            String adapterName) throws MetadataException {
+            String adapterName) throws AlgebricksException {
         DatasourceAdapter adapter;
         // search in default namespace (built-in adapter)
         adapter = MetadataManager.INSTANCE.getAdapter(mdTxnCtx, MetadataConstants.METADATA_DATAVERSE_NAME, adapterName);
@@ -95,11 +88,7 @@
 
     public static Dataset findDataset(MetadataTransactionContext mdTxnCtx, String dataverse, String dataset)
             throws AlgebricksException {
-        try {
-            return MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, dataset);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return MetadataManager.INSTANCE.getDataset(mdTxnCtx, dataverse, dataset);
     }
 
     public static Dataset findExistingDataset(MetadataTransactionContext mdTxnCtx, String dataverseName,
@@ -131,47 +120,27 @@
 
     public static Feed findFeed(MetadataTransactionContext mdTxnCtx, String dataverse, String feedName)
             throws AlgebricksException {
-        try {
-            return MetadataManager.INSTANCE.getFeed(mdTxnCtx, dataverse, feedName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return MetadataManager.INSTANCE.getFeed(mdTxnCtx, dataverse, feedName);
     }
 
     public static FeedConnection findFeedConnection(MetadataTransactionContext mdTxnCtx, String dataverse,
             String feedName, String datasetName) throws AlgebricksException {
-        try {
-            return MetadataManager.INSTANCE.getFeedConnection(mdTxnCtx, dataverse, feedName, datasetName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return MetadataManager.INSTANCE.getFeedConnection(mdTxnCtx, dataverse, feedName, datasetName);
     }
 
     public static FeedPolicyEntity findFeedPolicy(MetadataTransactionContext mdTxnCtx, String dataverse,
             String policyName) throws AlgebricksException {
-        try {
-            return MetadataManager.INSTANCE.getFeedPolicy(mdTxnCtx, dataverse, policyName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return MetadataManager.INSTANCE.getFeedPolicy(mdTxnCtx, dataverse, policyName);
     }
 
     public static List<Index> getDatasetIndexes(MetadataTransactionContext mdTxnCtx, String dataverseName,
             String datasetName) throws AlgebricksException {
-        try {
-            return MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, dataverseName, datasetName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx, dataverseName, datasetName);
     }
 
     public static DataSource findDataSource(IClusterStateManager clusterStateManager,
             MetadataTransactionContext mdTxnCtx, DataSourceId id) throws AlgebricksException {
-        try {
-            return lookupSourceInMetadata(clusterStateManager, mdTxnCtx, id);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        return lookupSourceInMetadata(clusterStateManager, mdTxnCtx, id);
     }
 
     public static DataSource lookupSourceInMetadata(IClusterStateManager clusterStateManager,
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
index 2f94ad74..7a24400 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/declared/MetadataProvider.java
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.ExternalFilePendingOp;
@@ -36,10 +37,8 @@
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.dataflow.LSMTreeInsertDeleteOperatorDescriptor;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.metadata.LockList;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.external.adapter.factory.LookupAdapterFactory;
@@ -57,7 +56,6 @@
 import org.apache.asterix.external.util.ExternalDataConstants;
 import org.apache.asterix.external.util.FeedConstants;
 import org.apache.asterix.formats.base.IDataFormat;
-import org.apache.asterix.om.functions.IFunctionExtensionManager;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
 import org.apache.asterix.formats.nontagged.LinearizeComparatorFactoryProvider;
 import org.apache.asterix.formats.nontagged.TypeTraitProvider;
@@ -79,6 +77,7 @@
 import org.apache.asterix.metadata.utils.MetadataConstants;
 import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
 import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionExtensionManager;
 import org.apache.asterix.om.functions.IFunctionManager;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.ATypeTag;
@@ -86,7 +85,8 @@
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
 import org.apache.asterix.runtime.base.AsterixTupleFilterFactory;
 import org.apache.asterix.runtime.formats.FormatUtils;
-import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
+import org.apache.asterix.runtime.operators.LSMIndexBulkLoadOperatorDescriptor;
+import org.apache.asterix.runtime.operators.LSMIndexBulkLoadOperatorDescriptor.BulkLoadUsage;
 import org.apache.asterix.runtime.operators.LSMSecondaryUpsertOperatorDescriptor;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
@@ -133,7 +133,6 @@
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
-import org.apache.hyracks.storage.am.common.dataflow.TreeIndexBulkLoadOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.invertedindex.dataflow.BinaryTokenizerOperatorDescriptor;
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
@@ -146,25 +145,25 @@
     private final IStorageComponentProvider storageComponentProvider;
     private final StorageProperties storageProperties;
     private final IFunctionManager functionManager;
-    private final Dataverse defaultDataverse;
     private final LockList locks;
     private final Map<String, String> config;
 
+    private Dataverse defaultDataverse;
     private MetadataTransactionContext mdTxnCtx;
     private boolean isWriteTransaction;
     private IAWriterFactory writerFactory;
     private FileSplit outputFile;
     private boolean asyncResults;
+    private long maxResultReads;
     private ResultSetId resultSetId;
     private IResultSerializerFactoryProvider resultSerializerFactoryProvider;
-    private JobId jobId;
+    private TxnId txnId;
     private Map<String, Integer> externalDataLocks;
-    private boolean isTemporaryDatasetWriteJob = true;
     private boolean blockingOperatorDisabled = false;
 
     public MetadataProvider(ICcApplicationContext appCtx, Dataverse defaultDataverse) {
         this.appCtx = appCtx;
-        this.defaultDataverse = defaultDataverse == null ? MetadataBuiltinEntities.DEFAULT_DATAVERSE : defaultDataverse;
+        setDefaultDataverse(defaultDataverse);
         this.storageComponentProvider = appCtx.getStorageComponentProvider();
         storageProperties = appCtx.getStorageProperties();
         functionManager = ((IFunctionExtensionManager) appCtx.getExtensionManager()).getFunctionManager();
@@ -189,8 +188,12 @@
         return config;
     }
 
-    public void setJobId(JobId jobId) {
-        this.jobId = jobId;
+    public void setTxnId(TxnId txnId) {
+        this.txnId = txnId;
+    }
+
+    public void setDefaultDataverse(Dataverse defaultDataverse) {
+        this.defaultDataverse = defaultDataverse == null ? MetadataBuiltinEntities.DEFAULT_DATAVERSE : defaultDataverse;
     }
 
     public Dataverse getDefaultDataverse() {
@@ -198,7 +201,7 @@
     }
 
     public String getDefaultDataverseName() {
-        return defaultDataverse == null ? null : defaultDataverse.getDataverseName();
+        return defaultDataverse.getDataverseName();
     }
 
     public void setWriteTransaction(boolean writeTransaction) {
@@ -237,6 +240,14 @@
         this.asyncResults = asyncResults;
     }
 
+    public void setMaxResultReads(long maxResultReads) {
+        this.maxResultReads = maxResultReads;
+    }
+
+    public long getMaxResultReads() {
+        return maxResultReads;
+    }
+
     public ResultSetId getResultSetId() {
         return resultSetId;
     }
@@ -258,11 +269,6 @@
         return isWriteTransaction;
     }
 
-    public boolean isTemporaryDatasetWriteJob() {
-        // The transaction only writes temporary datasets.
-        return isTemporaryDatasetWriteJob;
-    }
-
     public IFunctionManager getFunctionManager() {
         return functionManager;
     }
@@ -350,8 +356,7 @@
             throws AlgebricksException {
         DataSource source = findDataSource(dataSourceId);
         Dataset dataset = ((DatasetDataSource) source).getDataset();
-        String indexName = indexId;
-        Index secondaryIndex = getIndex(dataset.getDataverseName(), dataset.getDatasetName(), indexName);
+        Index secondaryIndex = getIndex(dataset.getDataverseName(), dataset.getDatasetName(), indexId);
         return (secondaryIndex != null)
                 ? new DataSourceIndex(secondaryIndex, dataset.getDataverseName(), dataset.getDatasetName(), this)
                 : null;
@@ -376,39 +381,32 @@
             List<LogicalVariable> projectVariables, boolean projectPushed, List<LogicalVariable> minFilterVars,
             List<LogicalVariable> maxFilterVars, IOperatorSchema opSchema, IVariableTypeEnvironment typeEnv,
             JobGenContext context, JobSpecification jobSpec, Object implConfig) throws AlgebricksException {
-        try {
-            return ((DataSource) dataSource).buildDatasourceScanRuntime(this, dataSource, scanVariables,
-                    projectVariables, projectPushed, minFilterVars, maxFilterVars, opSchema, typeEnv, context, jobSpec,
-                    implConfig);
-        } catch (AsterixException e) {
-            throw new AlgebricksException(e);
-        }
+        return ((DataSource) dataSource).buildDatasourceScanRuntime(this, dataSource, scanVariables, projectVariables,
+                projectPushed, minFilterVars, maxFilterVars, opSchema, typeEnv, context, jobSpec, implConfig);
     }
 
     protected Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> buildLoadableDatasetScan(
             JobSpecification jobSpec, IAdapterFactory adapterFactory, RecordDescriptor rDesc)
             throws AlgebricksException {
         ExternalScanOperatorDescriptor dataScanner = new ExternalScanOperatorDescriptor(jobSpec, rDesc, adapterFactory);
-        AlgebricksPartitionConstraint constraint;
         try {
-            constraint = adapterFactory.getPartitionConstraint();
+            return new Pair<>(dataScanner, adapterFactory.getPartitionConstraint());
         } catch (Exception e) {
             throw new AlgebricksException(e);
         }
-        return new Pair<>(dataScanner, constraint);
     }
 
-    public Dataverse findDataverse(String dataverseName) throws CompilationException {
+    public Dataverse findDataverse(String dataverseName) throws AlgebricksException {
         return MetadataManager.INSTANCE.getDataverse(mdTxnCtx, dataverseName);
     }
 
     public Triple<IOperatorDescriptor, AlgebricksPartitionConstraint, IAdapterFactory> buildFeedIntakeRuntime(
             JobSpecification jobSpec, Feed feed, FeedPolicyAccessor policyAccessor) throws Exception {
         Triple<IAdapterFactory, RecordDescriptor, IDataSourceAdapter.AdapterType> factoryOutput;
-        factoryOutput = FeedMetadataUtil.getPrimaryFeedFactoryAndOutput(feed, policyAccessor, mdTxnCtx,
-                getApplicationContext());
-        ARecordType recordType = FeedMetadataUtil.getOutputType(feed, feed.getAdapterConfiguration(),
-                ExternalDataConstants.KEY_TYPE_NAME);
+        factoryOutput =
+                FeedMetadataUtil.getFeedFactoryAndOutput(feed, policyAccessor, mdTxnCtx, getApplicationContext());
+        ARecordType recordType =
+                FeedMetadataUtil.getOutputType(feed, feed.getConfiguration().get(ExternalDataConstants.KEY_TYPE_NAME));
         IAdapterFactory adapterFactory = factoryOutput.first;
         FeedIntakeOperatorDescriptor feedIngestor = null;
         switch (factoryOutput.third) {
@@ -417,8 +415,8 @@
                         policyAccessor, factoryOutput.second);
                 break;
             case EXTERNAL:
-                String libraryName =
-                        feed.getAdapterName().trim().split(FeedConstants.NamingConstants.LIBRARY_NAME_SEPARATOR)[0];
+                String libraryName = feed.getConfiguration().get(ExternalDataConstants.KEY_ADAPTER_NAME).trim()
+                        .split(FeedConstants.NamingConstants.LIBRARY_NAME_SEPARATOR)[0];
                 feedIngestor = new FeedIntakeOperatorDescriptor(jobSpec, feed, libraryName,
                         adapterFactory.getClass().getName(), recordType, policyAccessor, factoryOutput.second);
                 break;
@@ -436,47 +434,39 @@
             boolean lowKeyInclusive, boolean highKeyInclusive, boolean propagateFilter, int[] minFilterFieldIndexes,
             int[] maxFilterFieldIndexes) throws AlgebricksException {
         boolean isSecondary = true;
-        try {
-            Index primaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), dataset.getDatasetName());
-            if (primaryIndex != null && (dataset.getDatasetType() != DatasetType.EXTERNAL)) {
-                isSecondary = !indexName.equals(primaryIndex.getIndexName());
-            }
-            Index theIndex =
-                    isSecondary
-                            ? MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                                    dataset.getDatasetName(), indexName)
-                            : primaryIndex;
-            int numPrimaryKeys = dataset.getPrimaryKeys().size();
-            RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> spPc =
-                    getSplitProviderAndConstraints(dataset, theIndex.getIndexName());
-            int[] primaryKeyFields = new int[numPrimaryKeys];
-            for (int i = 0; i < numPrimaryKeys; i++) {
-                primaryKeyFields[i] = i;
-            }
-
-            ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
-                    storageComponentProvider, theIndex, jobId, IndexOperation.SEARCH, primaryKeyFields);
-            IStorageManager storageManager = getStorageComponentProvider().getStorageManager();
-            IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(storageManager, spPc.first);
-            BTreeSearchOperatorDescriptor btreeSearchOp;
-            if (dataset.getDatasetType() == DatasetType.INTERNAL) {
-                btreeSearchOp = new BTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields, highKeyFields,
-                        lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput, retainMissing,
-                        context.getMissingWriterFactory(), searchCallbackFactory, minFilterFieldIndexes,
-                        maxFilterFieldIndexes, propagateFilter);
-            } else {
-                btreeSearchOp = new ExternalBTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields,
-                        highKeyFields, lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput,
-                        retainMissing, context.getMissingWriterFactory(), searchCallbackFactory, minFilterFieldIndexes,
-                        maxFilterFieldIndexes,
-                        ExternalDatasetsRegistry.INSTANCE.getAndLockDatasetVersion(dataset, this));
-            }
-            return new Pair<>(btreeSearchOp, spPc.second);
-        } catch (MetadataException me) {
-            throw new AlgebricksException(me);
+        Index primaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), dataset.getDatasetName());
+        if (primaryIndex != null && (dataset.getDatasetType() != DatasetType.EXTERNAL)) {
+            isSecondary = !indexName.equals(primaryIndex.getIndexName());
         }
+        Index theIndex = isSecondary ? MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName) : primaryIndex;
+        int numPrimaryKeys = dataset.getPrimaryKeys().size();
+        RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> spPc =
+                getSplitProviderAndConstraints(dataset, theIndex.getIndexName());
+        int[] primaryKeyFields = new int[numPrimaryKeys];
+        for (int i = 0; i < numPrimaryKeys; i++) {
+            primaryKeyFields[i] = i;
+        }
+
+        ISearchOperationCallbackFactory searchCallbackFactory = dataset
+                .getSearchCallbackFactory(storageComponentProvider, theIndex, IndexOperation.SEARCH, primaryKeyFields);
+        IStorageManager storageManager = getStorageComponentProvider().getStorageManager();
+        IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(storageManager, spPc.first);
+        BTreeSearchOperatorDescriptor btreeSearchOp;
+        if (dataset.getDatasetType() == DatasetType.INTERNAL) {
+            btreeSearchOp = new BTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields, highKeyFields,
+                    lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput, retainMissing,
+                    context.getMissingWriterFactory(), searchCallbackFactory, minFilterFieldIndexes,
+                    maxFilterFieldIndexes, propagateFilter);
+        } else {
+            btreeSearchOp = new ExternalBTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, lowKeyFields,
+                    highKeyFields, lowKeyInclusive, highKeyInclusive, indexHelperFactory, retainInput, retainMissing,
+                    context.getMissingWriterFactory(), searchCallbackFactory, minFilterFieldIndexes,
+                    maxFilterFieldIndexes, ExternalDatasetsRegistry.INSTANCE.getAndLockDatasetVersion(dataset, this));
+        }
+        return new Pair<>(btreeSearchOp, spPc.second);
     }
 
     public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> buildRtreeRuntime(JobSpecification jobSpec,
@@ -484,43 +474,39 @@
             JobGenContext context, boolean retainInput, boolean retainMissing, Dataset dataset, String indexName,
             int[] keyFields, boolean propagateFilter, int[] minFilterFieldIndexes, int[] maxFilterFieldIndexes)
             throws AlgebricksException {
-        try {
-            int numPrimaryKeys = dataset.getPrimaryKeys().size();
-            Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), indexName);
-            if (secondaryIndex == null) {
-                throw new AlgebricksException(
-                        "Code generation error: no index " + indexName + " for dataset " + dataset.getDatasetName());
-            }
-            RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> spPc =
-                    getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
-            int[] primaryKeyFields = new int[numPrimaryKeys];
-            for (int i = 0; i < numPrimaryKeys; i++) {
-                primaryKeyFields[i] = i;
-            }
-
-            ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
-                    storageComponentProvider, secondaryIndex, jobId, IndexOperation.SEARCH, primaryKeyFields);
-            RTreeSearchOperatorDescriptor rtreeSearchOp;
-            IIndexDataflowHelperFactory indexDataflowHelperFactory =
-                    new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), spPc.first);
-            if (dataset.getDatasetType() == DatasetType.INTERNAL) {
-                rtreeSearchOp = new RTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true,
-                        indexDataflowHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(),
-                        searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes, propagateFilter);
-            } else {
-                // Create the operator
-                rtreeSearchOp = new ExternalRTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true,
-                        indexDataflowHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(),
-                        searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes,
-                        ExternalDatasetsRegistry.INSTANCE.getAndLockDatasetVersion(dataset, this));
-            }
-
-            return new Pair<>(rtreeSearchOp, spPc.second);
-        } catch (MetadataException me) {
-            throw new AlgebricksException(me);
+        int numPrimaryKeys = dataset.getPrimaryKeys().size();
+        Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName);
+        if (secondaryIndex == null) {
+            throw new AlgebricksException(
+                    "Code generation error: no index " + indexName + " for dataset " + dataset.getDatasetName());
         }
+        RecordDescriptor outputRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> spPc =
+                getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
+        int[] primaryKeyFields = new int[numPrimaryKeys];
+        for (int i = 0; i < numPrimaryKeys; i++) {
+            primaryKeyFields[i] = i;
+        }
+
+        ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
+                storageComponentProvider, secondaryIndex, IndexOperation.SEARCH, primaryKeyFields);
+        RTreeSearchOperatorDescriptor rtreeSearchOp;
+        IIndexDataflowHelperFactory indexDataflowHelperFactory =
+                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), spPc.first);
+        if (dataset.getDatasetType() == DatasetType.INTERNAL) {
+            rtreeSearchOp = new RTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true,
+                    indexDataflowHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(),
+                    searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes, propagateFilter);
+        } else {
+            // Create the operator
+            rtreeSearchOp = new ExternalRTreeSearchOperatorDescriptor(jobSpec, outputRecDesc, keyFields, true, true,
+                    indexDataflowHelperFactory, retainInput, retainMissing, context.getMissingWriterFactory(),
+                    searchCallbackFactory, minFilterFieldIndexes, maxFilterFieldIndexes,
+                    ExternalDatasetsRegistry.INSTANCE.getAndLockDatasetVersion(dataset, this));
+        }
+
+        return new Pair<>(rtreeSearchOp, spPc.second);
     }
 
     @Override
@@ -550,7 +536,7 @@
             IResultSerializerFactory resultSerializedAppenderFactory = resultSerializerFactoryProvider
                     .getAqlResultSerializerFactoryProvider(printColumns, printerFactories, getWriterFactory());
             resultWriter = new ResultWriterOperatorDescriptor(spec, rsId, ordered, getResultAsyncMode(),
-                    resultSerializedAppenderFactory);
+                    resultSerializedAppenderFactory, getMaxResultReads());
         } catch (IOException e) {
             throw new AlgebricksException(e);
         }
@@ -582,26 +568,20 @@
             fieldPermutation[numKeys + 1] = idx;
         }
 
-        try {
-            boolean temp = dataset.getDatasetDetails().isTemp();
-            isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
-                    getSplitProviderAndConstraints(dataset);
-            long numElementsHint = getCardinalityPerPartitionHint(dataset);
-            // TODO
-            // figure out the right behavior of the bulkload and then give the
-            // right callback
-            // (ex. what's the expected behavior when there is an error during
-            // bulkload?)
-            IIndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
-                    storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
-            TreeIndexBulkLoadOperatorDescriptor btreeBulkLoad =
-                    new TreeIndexBulkLoadOperatorDescriptor(spec, null, fieldPermutation,
-                            GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, true, indexHelperFactory);
-            return new Pair<>(btreeBulkLoad, splitsAndConstraint.second);
-        } catch (MetadataException me) {
-            throw new AlgebricksException(me);
-        }
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
+                getSplitProviderAndConstraints(dataset);
+        long numElementsHint = getCardinalityPerPartitionHint(dataset);
+        // TODO
+        // figure out the right behavior of the bulkload and then give the
+        // right callback
+        // (ex. what's the expected behavior when there is an error during
+        // bulkload?)
+        IIndexDataflowHelperFactory indexHelperFactory =
+                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
+        LSMIndexBulkLoadOperatorDescriptor btreeBulkLoad = new LSMIndexBulkLoadOperatorDescriptor(spec, null,
+                fieldPermutation, GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, true,
+                indexHelperFactory, null, BulkLoadUsage.LOAD, dataset.getDatasetId());
+        return new Pair<>(btreeBulkLoad, splitsAndConstraint.second);
     }
 
     @Override
@@ -679,13 +659,8 @@
         }
 
         Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
-        Index secondaryIndex;
-        try {
-            secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), indexName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName);
         // TokenizeOperator only supports a keyword or n-gram index.
         switch (secondaryIndex.getIndexType()) {
             case SINGLE_PARTITION_WORD_INVIX:
@@ -702,8 +677,8 @@
 
     /**
      * Calculate an estimate size of the bloom filter. Note that this is an
-     * estimation which assumes that the data is going to be uniformly
-     * distributed across all partitions.
+     * estimation which assumes that the data is going to be uniformly distributed
+     * across all partitions.
      *
      * @param dataset
      * @return Number of elements that will be used to create a bloom filter per
@@ -757,8 +732,8 @@
         }
     }
 
-    public JobId getJobId() {
-        return jobId;
+    public TxnId getTxnId() {
+        return txnId;
     }
 
     public static ILinearizeComparatorFactory proposeLinearizer(ATypeTag keyType, int numKeyFields)
@@ -774,11 +749,11 @@
 
     public FileSplit[] splitsForIndex(MetadataTransactionContext mdTxnCtx, Dataset dataset, String indexName)
             throws AlgebricksException {
-        return SplitsAndConstraintsUtil.getIndexSplits(appCtx.getClusterStateManager(), dataset, indexName, mdTxnCtx);
+        return SplitsAndConstraintsUtil.getIndexSplits(dataset, indexName, mdTxnCtx, appCtx.getClusterStateManager());
     }
 
     public DatasourceAdapter getAdapter(MetadataTransactionContext mdTxnCtx, String dataverseName, String adapterName)
-            throws MetadataException {
+            throws AlgebricksException {
         DatasourceAdapter adapter;
         // search in default namespace (built-in adapter)
         adapter = MetadataManager.INSTANCE.getAdapter(mdTxnCtx, MetadataConstants.METADATA_DATAVERSE_NAME, adapterName);
@@ -815,10 +790,11 @@
             // Create the file index data flow helper
             IIndexDataflowHelperFactory indexDataflowHelperFactory =
                     new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), spPc.first);
-            // Create the out record descriptor, appContext and fileSplitProvider for the files index
+            // Create the out record descriptor, appContext and fileSplitProvider for the
+            // files index
             RecordDescriptor outRecDesc = JobGenHelper.mkRecordDescriptor(typeEnv, opSchema, context);
-            ISearchOperationCallbackFactory searchOpCallbackFactory = dataset
-                    .getSearchCallbackFactory(storageComponentProvider, fileIndex, jobId, IndexOperation.SEARCH, null);
+            ISearchOperationCallbackFactory searchOpCallbackFactory =
+                    dataset.getSearchCallbackFactory(storageComponentProvider, fileIndex, IndexOperation.SEARCH, null);
             // Create the operator
             ExternalLookupOperatorDescriptor op = new ExternalLookupOperatorDescriptor(jobSpec, adapterFactory,
                     outRecDesc, indexDataflowHelperFactory, searchOpCallbackFactory,
@@ -841,8 +817,6 @@
             throw new AlgebricksException(
                     "Unknown dataset " + datasetName + " in dataverse " + dataSource.getId().getDataverseName());
         }
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
         int numKeys = primaryKeys.size();
         int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
         int numOfAdditionalFields = additionalNonFilterFields == null ? 0 : additionalNonFilterFields.size();
@@ -876,8 +850,7 @@
     }
 
     public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> buildExternalDatasetDataScannerRuntime(
-            JobSpecification jobSpec, IAType itemType, IAdapterFactory adapterFactory)
-            throws AlgebricksException {
+            JobSpecification jobSpec, IAType itemType, IAdapterFactory adapterFactory) throws AlgebricksException {
         if (itemType.getTypeTag() != ATypeTag.OBJECT) {
             throw new AlgebricksException("Can only scan datasets of records.");
         }
@@ -955,9 +928,6 @@
         String datasetName = dataSource.getId().getDatasourceName();
         Dataset dataset =
                 MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataSource.getId().getDataverseName(), datasetName);
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
-
         int numKeys = keys.size();
         int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
         // Move key fields to front.
@@ -983,34 +953,31 @@
             }
         }
 
-        try {
-            Index primaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), dataset.getDatasetName());
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
-                    getSplitProviderAndConstraints(dataset);
+        Index primaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), dataset.getDatasetName());
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
+                getSplitProviderAndConstraints(dataset);
 
-            // prepare callback
-            int[] primaryKeyFields = new int[numKeys];
-            for (i = 0; i < numKeys; i++) {
-                primaryKeyFields[i] = i;
-            }
-            IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                    storageComponentProvider, primaryIndex, jobId, indexOp, primaryKeyFields);
-            IIndexDataflowHelperFactory idfh = new IndexDataflowHelperFactory(
-                    storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
-            IOperatorDescriptor op;
-            if (bulkload) {
-                long numElementsHint = getCardinalityPerPartitionHint(dataset);
-                op = new TreeIndexBulkLoadOperatorDescriptor(spec, inputRecordDesc, fieldPermutation,
-                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, true, numElementsHint, true, idfh);
-            } else {
-                op = new LSMTreeInsertDeleteOperatorDescriptor(spec, inputRecordDesc, fieldPermutation, indexOp, idfh,
-                        null, true, modificationCallbackFactory);
-            }
-            return new Pair<>(op, splitsAndConstraint.second);
-        } catch (MetadataException me) {
-            throw new AlgebricksException(me);
+        // prepare callback
+        int[] primaryKeyFields = new int[numKeys];
+        for (i = 0; i < numKeys; i++) {
+            primaryKeyFields[i] = i;
         }
+        IModificationOperationCallbackFactory modificationCallbackFactory = dataset
+                .getModificationCallbackFactory(storageComponentProvider, primaryIndex, indexOp, primaryKeyFields);
+        IIndexDataflowHelperFactory idfh =
+                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
+        IOperatorDescriptor op;
+        if (bulkload) {
+            long numElementsHint = getCardinalityPerPartitionHint(dataset);
+            op = new LSMIndexBulkLoadOperatorDescriptor(spec, inputRecordDesc, fieldPermutation,
+                    GlobalConfig.DEFAULT_TREE_FILL_FACTOR, true, numElementsHint, true, idfh, null, BulkLoadUsage.LOAD,
+                    dataset.getDatasetId());
+        } else {
+            op = new LSMTreeInsertDeleteOperatorDescriptor(spec, inputRecordDesc, fieldPermutation, indexOp, idfh, null,
+                    true, modificationCallbackFactory);
+        }
+        return new Pair<>(op, splitsAndConstraint.second);
     }
 
     private Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getIndexInsertOrDeleteOrUpsertRuntime(
@@ -1026,13 +993,8 @@
         String datasetName = dataSourceIndex.getDataSource().getId().getDatasourceName();
 
         Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
-        Index secondaryIndex;
-        try {
-            secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), indexName);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
-        }
+        Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName);
 
         ArrayList<LogicalVariable> prevAdditionalFilteringKeys = null;
         if (indexOp == IndexOperation.UPSERT && prevAdditionalFilteringKey != null) {
@@ -1070,9 +1032,6 @@
             JobSpecification spec, IndexOperation indexOp, boolean bulkload, List<LogicalVariable> prevSecondaryKeys,
             List<LogicalVariable> prevAdditionalFilteringKeys) throws AlgebricksException {
         Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
-
         int numKeys = primaryKeys.size() + secondaryKeys.size();
         int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
 
@@ -1127,16 +1086,16 @@
             Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
                     getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
             // prepare callback
-            JobId jobId = ((JobEventListenerFactory) spec.getJobletEventListenerFactory()).getJobId();
             IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                    storageComponentProvider, secondaryIndex, jobId, indexOp, modificationCallbackPrimaryKeyFields);
+                    storageComponentProvider, secondaryIndex, indexOp, modificationCallbackPrimaryKeyFields);
             IIndexDataflowHelperFactory idfh = new IndexDataflowHelperFactory(
                     storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
             IOperatorDescriptor op;
             if (bulkload) {
                 long numElementsHint = getCardinalityPerPartitionHint(dataset);
-                op = new TreeIndexBulkLoadOperatorDescriptor(spec, inputRecordDesc, fieldPermutation,
-                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false, idfh);
+                op = new LSMIndexBulkLoadOperatorDescriptor(spec, inputRecordDesc, fieldPermutation,
+                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false, idfh, null,
+                        BulkLoadUsage.LOAD, dataset.getDatasetId());
             } else if (indexOp == IndexOperation.UPSERT) {
                 op = new LSMSecondaryUpsertOperatorDescriptor(spec, inputRecordDesc, fieldPermutation, idfh,
                         filterFactory, modificationCallbackFactory, prevFieldPermutation);
@@ -1156,101 +1115,92 @@
             AsterixTupleFilterFactory filterFactory, RecordDescriptor recordDesc, JobGenContext context,
             JobSpecification spec, IndexOperation indexOp, boolean bulkload, List<LogicalVariable> prevSecondaryKeys,
             List<LogicalVariable> prevAdditionalFilteringKeys) throws AlgebricksException {
+        Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
+        String itemTypeName = dataset.getItemTypeName();
+        IAType itemType = MetadataManager.INSTANCE
+                .getDatatype(mdTxnCtx, dataset.getItemTypeDataverseName(), itemTypeName).getDatatype();
+        validateRecordType(itemType);
+        ARecordType recType = (ARecordType) itemType;
+        Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName);
+        List<List<String>> secondaryKeyExprs = secondaryIndex.getKeyFieldNames();
+        List<IAType> secondaryKeyTypes = secondaryIndex.getKeyFieldTypes();
+        Pair<IAType, Boolean> keyPairType =
+                Index.getNonNullableOpenFieldType(secondaryKeyTypes.get(0), secondaryKeyExprs.get(0), recType);
+        IAType spatialType = keyPairType.first;
+        int dimension = NonTaggedFormatUtil.getNumDimensions(spatialType.getTypeTag());
+        int numSecondaryKeys = dimension * 2;
+        int numPrimaryKeys = primaryKeys.size();
+        int numKeys = numSecondaryKeys + numPrimaryKeys;
 
-        try {
-            Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
-            boolean temp = dataset.getDatasetDetails().isTemp();
-            isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
+        int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
+        int[] fieldPermutation = new int[numKeys + numFilterFields];
+        int[] modificationCallbackPrimaryKeyFields = new int[primaryKeys.size()];
+        int i = 0;
+        int j = 0;
 
-            String itemTypeName = dataset.getItemTypeName();
-            IAType itemType = MetadataManager.INSTANCE
-                    .getDatatype(mdTxnCtx, dataset.getItemTypeDataverseName(), itemTypeName).getDatatype();
-            validateRecordType(itemType);
-            ARecordType recType = (ARecordType) itemType;
-            Index secondaryIndex = MetadataManager.INSTANCE.getIndex(mdTxnCtx, dataset.getDataverseName(),
-                    dataset.getDatasetName(), indexName);
-            List<List<String>> secondaryKeyExprs = secondaryIndex.getKeyFieldNames();
-            List<IAType> secondaryKeyTypes = secondaryIndex.getKeyFieldTypes();
-            Pair<IAType, Boolean> keyPairType =
-                    Index.getNonNullableOpenFieldType(secondaryKeyTypes.get(0), secondaryKeyExprs.get(0), recType);
-            IAType spatialType = keyPairType.first;
-            int dimension = NonTaggedFormatUtil.getNumDimensions(spatialType.getTypeTag());
-            int numSecondaryKeys = dimension * 2;
-            int numPrimaryKeys = primaryKeys.size();
-            int numKeys = numSecondaryKeys + numPrimaryKeys;
+        for (LogicalVariable varKey : secondaryKeys) {
+            int idx = propagatedSchema.findVariable(varKey);
+            fieldPermutation[i] = idx;
+            i++;
+        }
+        for (LogicalVariable varKey : primaryKeys) {
+            int idx = propagatedSchema.findVariable(varKey);
+            fieldPermutation[i] = idx;
+            modificationCallbackPrimaryKeyFields[j] = i;
+            i++;
+            j++;
+        }
 
-            int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
-            int[] fieldPermutation = new int[numKeys + numFilterFields];
-            int[] modificationCallbackPrimaryKeyFields = new int[primaryKeys.size()];
-            int i = 0;
-            int j = 0;
+        if (numFilterFields > 0) {
+            int idx = propagatedSchema.findVariable(additionalNonKeyFields.get(0));
+            fieldPermutation[numKeys] = idx;
+        }
 
-            for (LogicalVariable varKey : secondaryKeys) {
+        int[] prevFieldPermutation = null;
+        if (indexOp == IndexOperation.UPSERT) {
+            // Get field permutation for previous value
+            prevFieldPermutation = new int[numKeys + numFilterFields];
+            i = 0;
+
+            // Get field permutation for new value
+            for (LogicalVariable varKey : prevSecondaryKeys) {
                 int idx = propagatedSchema.findVariable(varKey);
-                fieldPermutation[i] = idx;
+                prevFieldPermutation[i] = idx;
                 i++;
             }
-            for (LogicalVariable varKey : primaryKeys) {
-                int idx = propagatedSchema.findVariable(varKey);
-                fieldPermutation[i] = idx;
-                modificationCallbackPrimaryKeyFields[j] = i;
+            for (int k = 0; k < numPrimaryKeys; k++) {
+                prevFieldPermutation[k + i] = fieldPermutation[k + i];
                 i++;
-                j++;
             }
 
             if (numFilterFields > 0) {
-                int idx = propagatedSchema.findVariable(additionalNonKeyFields.get(0));
-                fieldPermutation[numKeys] = idx;
+                int idx = propagatedSchema.findVariable(prevAdditionalFilteringKeys.get(0));
+                prevFieldPermutation[numKeys] = idx;
             }
-
-            int[] prevFieldPermutation = null;
-            if (indexOp == IndexOperation.UPSERT) {
-                // Get field permutation for previous value
-                prevFieldPermutation = new int[numKeys + numFilterFields];
-                i = 0;
-
-                // Get field permutation for new value
-                for (LogicalVariable varKey : prevSecondaryKeys) {
-                    int idx = propagatedSchema.findVariable(varKey);
-                    prevFieldPermutation[i] = idx;
-                    i++;
-                }
-                for (int k = 0; k < numPrimaryKeys; k++) {
-                    prevFieldPermutation[k + i] = fieldPermutation[k + i];
-                    i++;
-                }
-
-                if (numFilterFields > 0) {
-                    int idx = propagatedSchema.findVariable(prevAdditionalFilteringKeys.get(0));
-                    prevFieldPermutation[numKeys] = idx;
-                }
-            }
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
-                    getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
-
-            // prepare callback
-            JobId jobId = ((JobEventListenerFactory) spec.getJobletEventListenerFactory()).getJobId();
-            IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                    storageComponentProvider, secondaryIndex, jobId, indexOp, modificationCallbackPrimaryKeyFields);
-            IIndexDataflowHelperFactory indexDataflowHelperFactory = new IndexDataflowHelperFactory(
-                    storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
-            IOperatorDescriptor op;
-            if (bulkload) {
-                long numElementsHint = getCardinalityPerPartitionHint(dataset);
-                op = new TreeIndexBulkLoadOperatorDescriptor(spec, recordDesc, fieldPermutation,
-                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false,
-                        indexDataflowHelperFactory);
-            } else if (indexOp == IndexOperation.UPSERT) {
-                op = new LSMSecondaryUpsertOperatorDescriptor(spec, recordDesc, fieldPermutation,
-                        indexDataflowHelperFactory, filterFactory, modificationCallbackFactory, prevFieldPermutation);
-            } else {
-                op = new LSMTreeInsertDeleteOperatorDescriptor(spec, recordDesc, fieldPermutation, indexOp,
-                        indexDataflowHelperFactory, filterFactory, false, modificationCallbackFactory);
-            }
-            return new Pair<>(op, splitsAndConstraint.second);
-        } catch (MetadataException e) {
-            throw new AlgebricksException(e);
         }
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
+                getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
+
+        // prepare callback
+        IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
+                storageComponentProvider, secondaryIndex, indexOp, modificationCallbackPrimaryKeyFields);
+        IIndexDataflowHelperFactory indexDataflowHelperFactory =
+                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
+        IOperatorDescriptor op;
+        if (bulkload) {
+            long numElementsHint = getCardinalityPerPartitionHint(dataset);
+            op = new LSMIndexBulkLoadOperatorDescriptor(spec, recordDesc, fieldPermutation,
+                    GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false, indexDataflowHelperFactory,
+                    null, BulkLoadUsage.LOAD, dataset.getDatasetId());
+        } else if (indexOp == IndexOperation.UPSERT) {
+            op = new LSMSecondaryUpsertOperatorDescriptor(spec, recordDesc, fieldPermutation,
+                    indexDataflowHelperFactory, filterFactory, modificationCallbackFactory, prevFieldPermutation);
+        } else {
+            op = new LSMTreeInsertDeleteOperatorDescriptor(spec, recordDesc, fieldPermutation, indexOp,
+                    indexDataflowHelperFactory, filterFactory, false, modificationCallbackFactory);
+        }
+        return new Pair<>(op, splitsAndConstraint.second);
     }
 
     private Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getInvertedIndexRuntime(String dataverseName,
@@ -1279,9 +1229,6 @@
             throw new AlgebricksException("Cannot create composite inverted index on multiple fields.");
         }
         Dataset dataset = MetadataManagerUtil.findExistingDataset(mdTxnCtx, dataverseName, datasetName);
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob && temp;
-
         // For tokenization, sorting and loading.
         // One token (+ optional partitioning field) + primary keys: [token,
         // number of token, PK]
@@ -1345,16 +1292,16 @@
                     getSplitProviderAndConstraints(dataset, secondaryIndex.getIndexName());
 
             // prepare callback
-            JobId jobId = ((JobEventListenerFactory) spec.getJobletEventListenerFactory()).getJobId();
             IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                    storageComponentProvider, secondaryIndex, jobId, indexOp, modificationCallbackPrimaryKeyFields);
+                    storageComponentProvider, secondaryIndex, indexOp, modificationCallbackPrimaryKeyFields);
             IIndexDataflowHelperFactory indexDataFlowFactory = new IndexDataflowHelperFactory(
                     storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
             IOperatorDescriptor op;
             if (bulkload) {
                 long numElementsHint = getCardinalityPerPartitionHint(dataset);
-                op = new TreeIndexBulkLoadOperatorDescriptor(spec, recordDesc, fieldPermutation,
-                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false, indexDataFlowFactory);
+                op = new LSMIndexBulkLoadOperatorDescriptor(spec, recordDesc, fieldPermutation,
+                        GlobalConfig.DEFAULT_TREE_FILL_FACTOR, false, numElementsHint, false, indexDataFlowFactory,
+                        null, BulkLoadUsage.LOAD, dataset.getDatasetId());
             } else if (indexOp == IndexOperation.UPSERT) {
                 op = new LSMSecondaryUpsertOperatorDescriptor(spec, recordDesc, fieldPermutation, indexDataFlowFactory,
                         filterFactory, modificationCallbackFactory, prevFieldPermutation);
@@ -1593,4 +1540,8 @@
     public ICcApplicationContext getApplicationContext() {
         return appCtx;
     }
+
+    public ITxnIdFactory getTxnIdFactory() {
+        return appCtx.getTxnIdFactory();
+    }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/BuiltinTypeMap.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/BuiltinTypeMap.java
index 1f0a08e..a531add 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/BuiltinTypeMap.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/BuiltinTypeMap.java
@@ -26,11 +26,12 @@
 import java.util.Set;
 
 import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.metadata.MetadataNode;
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 /**
  * Maps from a string representation of an Asterix type to an Asterix type.
@@ -92,12 +93,12 @@
         return new HashSet<>(_builtinTypeMap.values());
     }
 
-    public static IAType getTypeFromTypeName(MetadataNode metadataNode, JobId jobId, String dataverseName,
-            String typeName, boolean optional) throws MetadataException {
+    public static IAType getTypeFromTypeName(MetadataNode metadataNode, TxnId txnId, String dataverseName,
+            String typeName, boolean optional) throws AlgebricksException {
         IAType type = _builtinTypeMap.get(typeName);
         if (type == null) {
             try {
-                Datatype dt = metadataNode.getDatatype(jobId, dataverseName, typeName);
+                Datatype dt = metadataNode.getDatatype(txnId, dataverseName, typeName);
                 type = dt.getDatatype();
             } catch (RemoteException e) {
                 throw new MetadataException(e);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
index 8e1c34d..8cd7053 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Dataset.java
@@ -23,14 +23,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.IntStream;
 
 import org.apache.asterix.active.IActiveEntityEventsListener;
 import org.apache.asterix.active.IActiveNotificationHandler;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.context.CorrelatedPrefixMergePolicyFactory;
+import org.apache.asterix.common.context.DatasetLSMComponentIdGeneratorFactory;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.dataflow.NoOpFrameOperationCallbackFactory;
 import org.apache.asterix.common.exceptions.CompilationException;
@@ -41,9 +40,9 @@
 import org.apache.asterix.common.ioopcallbacks.LSMRTreeIOOperationCallbackFactory;
 import org.apache.asterix.common.metadata.IDataset;
 import org.apache.asterix.common.transactions.IRecoveryManager.ResourceType;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.common.utils.JobUtils;
 import org.apache.asterix.common.utils.JobUtils.ProgressState;
+import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.external.feed.management.FeedConnectionId;
 import org.apache.asterix.external.indexing.IndexingConstants;
 import org.apache.asterix.formats.nontagged.BinaryHashFunctionFactoryProvider;
@@ -75,8 +74,6 @@
 import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexModificationOperationCallbackFactory;
 import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexOperationTrackerFactory;
 import org.apache.asterix.transaction.management.opcallbacks.SecondaryIndexSearchOperationCallbackFactory;
-import org.apache.asterix.transaction.management.opcallbacks.TempDatasetPrimaryIndexModificationOperationCallbackFactory;
-import org.apache.asterix.transaction.management.opcallbacks.TempDatasetSecondaryIndexModificationOperationCallbackFactory;
 import org.apache.asterix.transaction.management.opcallbacks.UpsertOperationCallbackFactory;
 import org.apache.asterix.transaction.management.resource.DatasetLocalResourceFactory;
 import org.apache.asterix.transaction.management.runtime.CommitRuntimeFactory;
@@ -107,10 +104,14 @@
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameOperationCallbackFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
 import org.apache.hyracks.storage.common.IResourceFactory;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -124,7 +125,7 @@
      * Constants
      */
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(Dataset.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     //TODO: Remove Singletons
     private static final BTreeResourceFactoryProvider bTreeResourceFactoryProvider =
             BTreeResourceFactoryProvider.INSTANCE;
@@ -505,15 +506,15 @@
             case BTREE:
                 return getDatasetType() == DatasetType.EXTERNAL
                         && !index.getIndexName().equals(IndexingConstants.getFilesIndexName(getDatasetName()))
-                                ? LSMBTreeWithBuddyIOOperationCallbackFactory.INSTANCE
-                                : LSMBTreeIOOperationCallbackFactory.INSTANCE;
+                                ? new LSMBTreeWithBuddyIOOperationCallbackFactory(getComponentIdGeneratorFactory())
+                                : new LSMBTreeIOOperationCallbackFactory(getComponentIdGeneratorFactory());
             case RTREE:
-                return LSMRTreeIOOperationCallbackFactory.INSTANCE;
+                return new LSMRTreeIOOperationCallbackFactory(getComponentIdGeneratorFactory());
             case LENGTH_PARTITIONED_NGRAM_INVIX:
             case LENGTH_PARTITIONED_WORD_INVIX:
             case SINGLE_PARTITION_NGRAM_INVIX:
             case SINGLE_PARTITION_WORD_INVIX:
-                return LSMInvertedIndexIOOperationCallbackFactory.INSTANCE;
+                return new LSMInvertedIndexIOOperationCallbackFactory(getComponentIdGeneratorFactory());
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_UNKNOWN_INDEX_TYPE,
                         index.getIndexType().toString());
@@ -532,13 +533,15 @@
                 : new SecondaryIndexOperationTrackerFactory(getDatasetId());
     }
 
+    public ILSMComponentIdGeneratorFactory getComponentIdGeneratorFactory() {
+        return new DatasetLSMComponentIdGeneratorFactory(getDatasetId());
+    }
+
     /**
      * Get search callback factory for this dataset with the passed index and operation
      *
      * @param index
      *            the index
-     * @param jobId
-     *            the job id being compiled
      * @param op
      *            the operation this search is part of
      * @param primaryKeyFields
@@ -549,19 +552,22 @@
      *             if the callback factory could not be created
      */
     public ISearchOperationCallbackFactory getSearchCallbackFactory(IStorageComponentProvider storageComponentProvider,
-            Index index, JobId jobId, IndexOperation op, int[] primaryKeyFields) throws AlgebricksException {
-        if (getDatasetDetails().isTemp()) {
-            return NoOpOperationCallbackFactory.INSTANCE;
-        } else if (index.isPrimaryIndex()) {
-            /**
+            Index index, IndexOperation op, int[] primaryKeyFields) throws AlgebricksException {
+        if (index.isPrimaryIndex()) {
+            /*
              * Due to the read-committed isolation level,
              * we may acquire very short duration lock(i.e., instant lock) for readers.
              */
             return (op == IndexOperation.UPSERT)
-                    ? new LockThenSearchOperationCallbackFactory(jobId, getDatasetId(), primaryKeyFields,
+                    ? new LockThenSearchOperationCallbackFactory(getDatasetId(), primaryKeyFields,
                             storageComponentProvider.getTransactionSubsystemProvider(), ResourceType.LSM_BTREE)
-                    : new PrimaryIndexInstantSearchOperationCallbackFactory(jobId, getDatasetId(), primaryKeyFields,
+                    : new PrimaryIndexInstantSearchOperationCallbackFactory(getDatasetId(), primaryKeyFields,
                             storageComponentProvider.getTransactionSubsystemProvider(), ResourceType.LSM_BTREE);
+        } else if (index.getKeyFieldNames().isEmpty()) {
+            // this is the case where the index is secondary primary index and locking is required
+            // since the secondary primary index replaces the dataset index (which locks)
+            return new PrimaryIndexInstantSearchOperationCallbackFactory(getDatasetId(), primaryKeyFields,
+                    storageComponentProvider.getTransactionSubsystemProvider(), ResourceType.LSM_BTREE);
         }
         return new SecondaryIndexSearchOperationCallbackFactory();
     }
@@ -571,8 +577,6 @@
      *
      * @param index
      *            the index
-     * @param jobId
-     *            the job id of the job being compiled
      * @param op
      *            the operation performed for this callback
      * @param primaryKeyFields
@@ -583,31 +587,19 @@
      *             If the callback factory could not be created
      */
     public IModificationOperationCallbackFactory getModificationCallbackFactory(
-            IStorageComponentProvider componentProvider, Index index, JobId jobId, IndexOperation op,
-            int[] primaryKeyFields) throws AlgebricksException {
-        if (getDatasetDetails().isTemp()) {
-            return op == IndexOperation.DELETE || op == IndexOperation.INSERT || op == IndexOperation.UPSERT
-                    ? index.isPrimaryIndex()
-                            ? new TempDatasetPrimaryIndexModificationOperationCallbackFactory(jobId, datasetId,
-                                    primaryKeyFields, componentProvider.getTransactionSubsystemProvider(),
-                                    Operation.get(op), index.resourceType())
-                            : new TempDatasetSecondaryIndexModificationOperationCallbackFactory(jobId, getDatasetId(),
-                                    primaryKeyFields, componentProvider.getTransactionSubsystemProvider(),
-                                    Operation.get(op), index.resourceType())
-                    : NoOpOperationCallbackFactory.INSTANCE;
-        } else if (index.isPrimaryIndex()) {
-            return op == IndexOperation.UPSERT
-                    ? new UpsertOperationCallbackFactory(jobId, getDatasetId(), primaryKeyFields,
-                            componentProvider.getTransactionSubsystemProvider(), Operation.get(op),
-                            index.resourceType())
+            IStorageComponentProvider componentProvider, Index index, IndexOperation op, int[] primaryKeyFields)
+            throws AlgebricksException {
+        if (index.isPrimaryIndex()) {
+            return op == IndexOperation.UPSERT ? new UpsertOperationCallbackFactory(getDatasetId(), primaryKeyFields,
+                    componentProvider.getTransactionSubsystemProvider(), Operation.get(op), index.resourceType())
                     : op == IndexOperation.DELETE || op == IndexOperation.INSERT
-                            ? new PrimaryIndexModificationOperationCallbackFactory(jobId, getDatasetId(),
-                                    primaryKeyFields, componentProvider.getTransactionSubsystemProvider(),
-                                    Operation.get(op), index.resourceType())
+                            ? new PrimaryIndexModificationOperationCallbackFactory(getDatasetId(), primaryKeyFields,
+                                    componentProvider.getTransactionSubsystemProvider(), Operation.get(op),
+                                    index.resourceType())
                             : NoOpOperationCallbackFactory.INSTANCE;
         } else {
             return op == IndexOperation.DELETE || op == IndexOperation.INSERT || op == IndexOperation.UPSERT
-                    ? new SecondaryIndexModificationOperationCallbackFactory(jobId, getDatasetId(), primaryKeyFields,
+                    ? new SecondaryIndexModificationOperationCallbackFactory(getDatasetId(), primaryKeyFields,
                             componentProvider.getTransactionSubsystemProvider(), Operation.get(op),
                             index.resourceType())
                     : NoOpOperationCallbackFactory.INSTANCE;
@@ -620,7 +612,7 @@
         try {
             return mapper.writeValueAsString(toMap());
         } catch (JsonProcessingException e) {
-            LOGGER.log(Level.WARNING, "Unable to convert map to json String", e);
+            LOGGER.log(Level.WARN, "Unable to convert map to json String", e);
             return dataverseName + "." + datasetName;
         }
     }
@@ -654,8 +646,6 @@
      *
      * @param metadataProvider,
      *            the metadata provider.
-     * @param jobId,
-     *            the AsterixDB job id for transaction management.
      * @param primaryKeyFieldPermutation,
      *            the primary key field permutation according to the input.
      * @param isSink,
@@ -663,22 +653,17 @@
      * @return the commit runtime factory for inserting/upserting/deleting operations on this dataset.
      * @throws AlgebricksException
      */
-    public IPushRuntimeFactory getCommitRuntimeFactory(MetadataProvider metadataProvider, JobId jobId,
+    public IPushRuntimeFactory getCommitRuntimeFactory(MetadataProvider metadataProvider,
             int[] primaryKeyFieldPermutation, boolean isSink) throws AlgebricksException {
         int[] datasetPartitions = getDatasetPartitions(metadataProvider);
-        return new CommitRuntimeFactory(jobId, datasetId, primaryKeyFieldPermutation,
-                metadataProvider.isTemporaryDatasetWriteJob(), metadataProvider.isWriteTransaction(), datasetPartitions,
-                isSink);
+        return new CommitRuntimeFactory(datasetId, primaryKeyFieldPermutation, metadataProvider.isWriteTransaction(),
+                datasetPartitions, isSink);
     }
 
     public IFrameOperationCallbackFactory getFrameOpCallbackFactory() {
         return NoOpFrameOperationCallbackFactory.INSTANCE;
     }
 
-    public boolean isTemp() {
-        return getDatasetDetails().isTemp();
-    }
-
     public boolean isCorrelated() {
         return CorrelatedPrefixMergePolicyFactory.NAME.equals(compactionPolicyFactory);
     }
@@ -834,6 +819,10 @@
     protected int[] getDatasetPartitions(MetadataProvider metadataProvider) throws AlgebricksException {
         FileSplit[] splitsForDataset =
                 metadataProvider.splitsForIndex(metadataProvider.getMetadataTxnContext(), this, getDatasetName());
-        return IntStream.range(0, splitsForDataset.length).toArray();
+        int[] partitions = new int[splitsForDataset.length];
+        for (int i = 0; i < partitions.length; i++) {
+            partitions[i] = StoragePathUtil.getPartitionNumFromRelativePath(splitsForDataset[i].getPath());
+        }
+        return partitions;
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DatasourceAdapter.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DatasourceAdapter.java
index 5a85327..b72c058 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DatasourceAdapter.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/DatasourceAdapter.java
@@ -44,7 +44,7 @@
 
     @Override
     public DatasourceAdapter dropFromCache(MetadataCache cache) {
-        return cache.dropAdapter(this);
+        return cache.dropAdapterIfExists(this);
     }
 
     public AdapterIdentifier getAdapterIdentifier() {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
index b9b4cd9..48d2908 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/ExternalDatasetDetails.java
@@ -23,8 +23,6 @@
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.OrderedListBuilder;
@@ -44,6 +42,9 @@
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -51,10 +52,9 @@
 public class ExternalDatasetDetails implements IDatasetDetails {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(ExternalDatasetDetails.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final String adapter;
     private final Map<String, String> properties;
-    private final long addToCacheTime;
     private Date lastRefreshTime;
     private TransactionState state;
 
@@ -62,7 +62,6 @@
             TransactionState state) {
         this.properties = properties;
         this.adapter = adapter;
-        this.addToCacheTime = System.currentTimeMillis();
         this.lastRefreshTime = lastRefreshTime;
         this.state = state;
     }
@@ -90,12 +89,12 @@
         externalRecordBuilder.reset(MetadataRecordTypes.EXTERNAL_DETAILS_RECORDTYPE);
         AMutableString aString = new AMutableString("");
 
-        ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ASTRING);
-        ISerializerDeserializer<ADateTime> dateTimeSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ADATETIME);
-        ISerializerDeserializer<AInt32> intSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.AINT32);
+        ISerializerDeserializer<AString> stringSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
+        ISerializerDeserializer<ADateTime> dateTimeSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
+        ISerializerDeserializer<AInt32> intSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
 
         // write field 0
         fieldValue.reset();
@@ -132,16 +131,6 @@
         externalRecordBuilder.write(out, true);
     }
 
-    @Override
-    public boolean isTemp() {
-        return false;
-    }
-
-    @Override
-    public long getLastAccessTime() {
-        return addToCacheTime;
-    }
-
     public Date getTimestamp() {
         return lastRefreshTime;
     }
@@ -164,7 +153,7 @@
         try {
             return mapper.writeValueAsString(toMap());
         } catch (JsonProcessingException e) {
-            LOGGER.log(Level.WARNING, "Unable to convert map to json String", e);
+            LOGGER.log(Level.WARN, "Unable to convert map to json String", e);
             return getClass().getSimpleName();
         }
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
index ea0e4eb..40c7ede 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Feed.java
@@ -37,16 +37,13 @@
     private EntityId feedId;
     /** A string representation of the instance **/
     private String displayName;
-    /** A string representation of the adapter name **/
-    private String adapterName;
-    /** Adapter configuration */
-    private Map<String, String> adapterConfiguration;
+    /** Feed configurations */
+    private Map<String, String> feedConfiguration;
 
-    public Feed(String dataverseName, String feedName,String adapterName, Map<String, String> configuration) {
+    public Feed(String dataverseName, String feedName, Map<String, String> feedConfiguration) {
         this.feedId = new EntityId(EXTENSION_NAME, dataverseName, feedName);
         this.displayName = "(" + feedId + ")";
-        this.adapterName = adapterName;
-        this.adapterConfiguration = configuration;
+        this.feedConfiguration = feedConfiguration;
     }
 
     @Override
@@ -93,16 +90,11 @@
 
     @Override
     public Feed dropFromCache(MetadataCache cache) {
-        return cache.dropFeed(this);
+        return cache.dropFeedIfExists(this);
     }
 
     @Override
-    public String getAdapterName() {
-        return adapterName;
-    }
-
-    @Override
-    public Map<String, String> getAdapterConfiguration() {
-        return adapterConfiguration;
+    public Map<String, String> getConfiguration() {
+        return feedConfiguration;
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
index 1d1db37..8bdbaba 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/Function.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.metadata.entities;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.asterix.metadata.MetadataCache;
@@ -36,13 +37,14 @@
     private final String name;
     private final int arity;
     private final List<String> params;
+    private final List<List<List<String>>> dependencies;
     private final String body;
     private final String returnType;
     private final String language;
     private final String kind;
 
     public Function(String dataverseName, String functionName, int arity, List<String> params, String returnType,
-            String functionBody, String language, String functionKind) {
+            String functionBody, String language, String functionKind, List<List<List<String>>> dependencies) {
         this.dataverse = dataverseName;
         this.name = functionName;
         this.params = params;
@@ -51,6 +53,13 @@
         this.language = language;
         this.kind = functionKind;
         this.arity = arity;
+        if (dependencies == null) {
+            this.dependencies = new ArrayList<>();
+            this.dependencies.add(new ArrayList<>());
+            this.dependencies.add(new ArrayList<>());
+        } else {
+            this.dependencies = dependencies;
+        }
     }
 
     public String getDataverseName() {
@@ -65,6 +74,10 @@
         return params;
     }
 
+    public List<List<List<String>>> getDependencies() {
+        return dependencies;
+    }
+
     public String getFunctionBody() {
         return body;
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
index 4b64f47..80c4f3d 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entities/InternalDatasetDetails.java
@@ -61,8 +61,6 @@
     private final List<List<String>> primaryKeys;
     private final List<IAType> primaryKeyTypes;
     private final boolean autogenerated;
-    private final boolean temp;
-    private long lastAccessTime;
     private final List<String> filterField;
     private final List<Integer> keySourceIndicators;
 
@@ -71,7 +69,7 @@
 
     public InternalDatasetDetails(FileStructure fileStructure, PartitioningStrategy partitioningStrategy,
             List<List<String>> partitioningKey, List<List<String>> primaryKey, List<Integer> keyFieldIndicators,
-            List<IAType> primaryKeyType, boolean autogenerated, List<String> filterField, boolean temp) {
+            List<IAType> primaryKeyType, boolean autogenerated, List<String> filterField) {
         this.fileStructure = fileStructure;
         this.partitioningStrategy = partitioningStrategy;
         this.partitioningKeys = partitioningKey;
@@ -87,8 +85,6 @@
         this.primaryKeyTypes = primaryKeyType;
         this.autogenerated = autogenerated;
         this.filterField = filterField;
-        this.temp = temp;
-        this.lastAccessTime = System.currentTimeMillis();
     }
 
     public List<List<String>> getPartitioningKey() {
@@ -125,21 +121,10 @@
 
     @Override
     public DatasetType getDatasetType() {
-        lastAccessTime = System.currentTimeMillis();
         return DatasetType.INTERNAL;
     }
 
     @Override
-    public long getLastAccessTime() {
-        return lastAccessTime;
-    }
-
-    @Override
-    public boolean isTemp() {
-        return temp;
-    }
-
-    @Override
     public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException {
 
         IARecordBuilder internalRecordBuilder = new RecordBuilder();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
index 2d2f895..e9e6366 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/AbstractTupleTranslator.java
@@ -41,14 +41,14 @@
     private static final long serialVersionUID = 1L;
     protected AMutableString aString = new AMutableString("");
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    protected ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt32> int32Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    protected ISerializerDeserializer<AInt32> int32Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
 
     protected final transient IARecordBuilder recordBuilder;
     protected final transient ArrayBackedValueStorage fieldValue;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
index 3c409da..6595d97 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/CompactionPolicyTupleTranslator.java
@@ -23,13 +23,13 @@
 import java.io.DataInput;
 import java.io.DataInputStream;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
 import org.apache.asterix.metadata.entities.CompactionPolicy;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -82,7 +82,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(CompactionPolicy compactionPolicy)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
 
         tupleBuilder.reset();
         aString.setValue(compactionPolicy.getDataverseName());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
index 8da34c0..d5e179b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslator.java
@@ -37,7 +37,6 @@
 import org.apache.asterix.builders.UnorderedListBuilder;
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.TransactionState;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.IDatasetDetails;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
@@ -65,6 +64,7 @@
 import org.apache.asterix.om.types.AUnorderedListType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -207,11 +207,8 @@
                     }
                 }
 
-                // Temporary dataset only lives in the compiler therefore the temp field is false.
-                //  DatasetTupleTranslator always read from the metadata node, so the temp flag should be always false.
                 datasetDetails = new InternalDatasetDetails(fileStructure, partitioningStrategy, partitioningKey,
-                        partitioningKey, keyFieldSourceIndicator, partitioningKeyType, autogenerated, filterField,
-                        false);
+                        partitioningKey, keyFieldSourceIndicator, partitioningKeyType, autogenerated, filterField);
                 break;
             }
 
@@ -270,7 +267,8 @@
     }
 
     @Override
-    public ITupleReference getTupleFromMetadataEntity(Dataset dataset) throws HyracksDataException, MetadataException {
+    public ITupleReference getTupleFromMetadataEntity(Dataset dataset)
+            throws HyracksDataException, AlgebricksException {
         OrderedListBuilder listBuilder = new OrderedListBuilder();
         ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage();
         // write the key in the first 2 fields of the tuple
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
index 9cd73d7..a58e5d6 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatasourceAdapterTupleTranslator.java
@@ -24,7 +24,6 @@
 import java.io.DataInputStream;
 import java.util.Calendar;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.external.api.IDataSourceAdapter;
 import org.apache.asterix.external.dataset.adapter.AdapterIdentifier;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
@@ -33,6 +32,7 @@
 import org.apache.asterix.metadata.entities.DatasourceAdapter;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -58,7 +58,7 @@
 
     @Override
     public DatasourceAdapter getMetadataEntityFromTuple(ITupleReference tuple)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         byte[] serRecord = tuple.getFieldData(ADAPTER_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordStartOffset = tuple.getFieldStart(ADAPTER_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordLength = tuple.getFieldLength(ADAPTER_PAYLOAD_TUPLE_FIELD_INDEX);
@@ -86,7 +86,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(DatasourceAdapter adapter)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
         aString.setValue(adapter.getAdapterIdentifier().getNamespace());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
index fe0b40d..6d7e25f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DatatypeTupleTranslator.java
@@ -29,8 +29,7 @@
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.OrderedListBuilder;
 import org.apache.asterix.builders.RecordBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.MetadataNode;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
@@ -51,6 +50,7 @@
 import org.apache.asterix.om.types.AbstractComplexType;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -79,17 +79,17 @@
     private ISerializerDeserializer<ARecord> recordSerDes =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(MetadataRecordTypes.DATATYPE_RECORDTYPE);
     private final MetadataNode metadataNode;
-    private final JobId jobId;
+    private final TxnId txnId;
 
-    protected DatatypeTupleTranslator(JobId jobId, MetadataNode metadataNode, boolean getTuple) {
+    protected DatatypeTupleTranslator(TxnId txnId, MetadataNode metadataNode, boolean getTuple) {
         super(getTuple, MetadataPrimaryIndexes.DATATYPE_DATASET.getFieldCount());
-        this.jobId = jobId;
+        this.txnId = txnId;
         this.metadataNode = metadataNode;
     }
 
     @Override
     public Datatype getMetadataEntityFromTuple(ITupleReference frameTuple)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         byte[] serRecord = frameTuple.getFieldData(DATATYPE_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordStartOffset = frameTuple.getFieldStart(DATATYPE_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordLength = frameTuple.getFieldLength(DATATYPE_PAYLOAD_TUPLE_FIELD_INDEX);
@@ -99,7 +99,7 @@
         return createDataTypeFromARecord(datatypeRecord);
     }
 
-    private Datatype createDataTypeFromARecord(ARecord datatypeRecord) throws MetadataException {
+    private Datatype createDataTypeFromARecord(ARecord datatypeRecord) throws AlgebricksException {
         String dataverseName =
                 ((AString) datatypeRecord.getValueByPos(MetadataRecordTypes.DATATYPE_ARECORD_DATAVERSENAME_FIELD_INDEX))
                         .getStringValue();
@@ -142,7 +142,7 @@
                         boolean isNullable = ((ABoolean) field
                                 .getValueByPos(MetadataRecordTypes.FIELD_ARECORD_ISNULLABLE_FIELD_INDEX)).getBoolean()
                                         .booleanValue();
-                        fieldTypes[fieldId] = BuiltinTypeMap.getTypeFromTypeName(metadataNode, jobId, dataverseName,
+                        fieldTypes[fieldId] = BuiltinTypeMap.getTypeFromTypeName(metadataNode, txnId, dataverseName,
                                 fieldTypeName, isNullable);
                         fieldId++;
                     }
@@ -154,7 +154,7 @@
                             .getValueByPos(MetadataRecordTypes.DERIVEDTYPE_ARECORD_UNORDEREDLIST_FIELD_INDEX))
                                     .getStringValue();
                     return new Datatype(dataverseName, datatypeName,
-                            new AUnorderedListType(BuiltinTypeMap.getTypeFromTypeName(metadataNode, jobId,
+                            new AUnorderedListType(BuiltinTypeMap.getTypeFromTypeName(metadataNode, txnId,
                                     dataverseName, unorderedlistTypeName, false), datatypeName),
                             isAnonymous);
                 }
@@ -163,7 +163,7 @@
                             .getValueByPos(MetadataRecordTypes.DERIVEDTYPE_ARECORD_ORDEREDLIST_FIELD_INDEX))
                                     .getStringValue();
                     return new Datatype(dataverseName, datatypeName,
-                            new AOrderedListType(BuiltinTypeMap.getTypeFromTypeName(metadataNode, jobId, dataverseName,
+                            new AOrderedListType(BuiltinTypeMap.getTypeFromTypeName(metadataNode, txnId, dataverseName,
                                     orderedlistTypeName, false), datatypeName),
                             isAnonymous);
                 }
@@ -176,7 +176,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(Datatype dataType)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first two fields of the tuple
         tupleBuilder.reset();
         aString.setValue(dataType.getDataverseName());
@@ -202,7 +202,7 @@
         recordBuilder.addField(MetadataRecordTypes.DATATYPE_ARECORD_DATATYPENAME_FIELD_INDEX, fieldValue);
 
         IAType fieldType = dataType.getDatatype();
-        //unwrap nullable type out of the union
+        // unwrap nullable type out of the union
         if (fieldType.getTypeTag() == ATypeTag.UNION) {
             fieldType = ((AUnionType) dataType.getDatatype()).getActualType();
         }
@@ -365,9 +365,10 @@
     private String handleNestedDerivedType(String typeName, AbstractComplexType nestedType, Datatype topLevelType,
             String dataverseName, String datatypeName) throws HyracksDataException {
         try {
-            metadataNode.addDatatype(jobId, new Datatype(dataverseName, typeName, nestedType, true));
-        } catch (MetadataException e) {
-            // The nested record type may have been inserted by a previous DDL statement or by
+            metadataNode.addDatatype(txnId, new Datatype(dataverseName, typeName, nestedType, true));
+        } catch (AlgebricksException e) {
+            // The nested record type may have been inserted by a previous DDL statement or
+            // by
             // a previous nested type.
             if (!(e.getCause() instanceof HyracksDataException)) {
                 throw HyracksDataException.create(e);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java
index 4b20a5b..3100b10 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/DataverseTupleTranslator.java
@@ -24,7 +24,6 @@
 import java.io.DataInputStream;
 import java.util.Calendar;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
@@ -34,6 +33,7 @@
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -77,7 +77,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(Dataverse instance)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first field of the tuple
         tupleBuilder.reset();
         aString.setValue(instance.getDataverseName());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
index a29048e..d058d90 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
@@ -24,7 +24,6 @@
 import java.util.Date;
 
 import org.apache.asterix.common.config.DatasetConfig.ExternalFilePendingOp;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
@@ -38,6 +37,7 @@
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -76,7 +76,7 @@
 
     @Override
     public ExternalFile getMetadataEntityFromTuple(ITupleReference tuple)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         byte[] serRecord = tuple.getFieldData(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordStartOffset = tuple.getFieldStart(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordLength = tuple.getFieldLength(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
@@ -108,7 +108,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(ExternalFile externalFile)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         // write the key in the first 3 fields of the tuple
         tupleBuilder.reset();
         // dataverse name
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
index ac78b8f..269497b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedConnectionTupleTranslator.java
@@ -27,7 +27,6 @@
 
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.UnorderedListBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.functions.FunctionSignature;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
@@ -40,6 +39,7 @@
 import org.apache.asterix.om.base.AUnorderedList;
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AUnorderedListType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -62,7 +62,7 @@
 
     @Override
     public FeedConnection getMetadataEntityFromTuple(ITupleReference frameTuple)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         byte[] serRecord = frameTuple.getFieldData(FEED_CONN_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordStartOffset = frameTuple.getFieldStart(FEED_CONN_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordLength = frameTuple.getFieldLength(FEED_CONN_PAYLOAD_TUPLE_FIELD_INDEX);
@@ -106,7 +106,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(FeedConnection me)
-            throws MetadataException, HyracksDataException {
+            throws AlgebricksException, HyracksDataException {
         tupleBuilder.reset();
 
         // key: dataverse
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
index ec22735..e80b96f4 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedPolicyTupleTranslator.java
@@ -29,7 +29,6 @@
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.RecordBuilder;
 import org.apache.asterix.builders.UnorderedListBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
@@ -42,6 +41,7 @@
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AUnorderedListType;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -110,7 +110,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(FeedPolicyEntity feedPolicy)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first three fields of the tuple
         ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage();
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedTupleTranslator.java
index 2541e97..4e1056e 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FeedTupleTranslator.java
@@ -30,7 +30,6 @@
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.RecordBuilder;
 import org.apache.asterix.builders.UnorderedListBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
@@ -42,6 +41,7 @@
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AUnorderedListType;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -89,8 +89,6 @@
 
         AUnorderedList feedConfig =
                 (AUnorderedList) feedRecord.getValueByPos(MetadataRecordTypes.FEED_ARECORD_ADAPTOR_CONFIG_INDEX);
-        String adapterName = ((AString) feedRecord.getValueByPos(MetadataRecordTypes.FEED_ARECORD_ADAPTOR_NAME_INDEX))
-                .getStringValue();
 
         IACursor cursor = feedConfig.getCursor();
 
@@ -104,12 +102,12 @@
             value = ((AString) field.getValueByPos(MetadataRecordTypes.PROPERTIES_VALUE_FIELD_INDEX)).getStringValue();
             adaptorConfiguration.put(key, value);
         }
-        feed = new Feed(dataverseName, feedName, adapterName, adaptorConfiguration);
+        feed = new Feed(dataverseName, feedName, adaptorConfiguration);
         return feed;
     }
 
     @Override
-    public ITupleReference getTupleFromMetadataEntity(Feed feed) throws HyracksDataException, MetadataException {
+    public ITupleReference getTupleFromMetadataEntity(Feed feed) throws HyracksDataException, AlgebricksException {
         // write the key in the first two fields of the tuple
         tupleBuilder.reset();
         aString.setValue(feed.getDataverseName());
@@ -134,12 +132,6 @@
         stringSerde.serialize(aString, fieldValue.getDataOutput());
         recordBuilder.addField(MetadataRecordTypes.FEED_ARECORD_FEED_NAME_FIELD_INDEX, fieldValue);
 
-        // adaptor name
-        fieldValue.reset();
-        aString.setValue(feed.getAdapterName());
-        stringSerde.serialize(aString, fieldValue.getDataOutput());
-        recordBuilder.addField(MetadataRecordTypes.FEED_ARECORD_ADAPTOR_NAME_INDEX, fieldValue);
-
         // write adaptor configuration
         fieldValue.reset();
         writeFeedAdaptorField(recordBuilder, feed, fieldValue);
@@ -165,7 +157,7 @@
 
         listBuilder.reset((AUnorderedListType) MetadataRecordTypes.FEED_RECORDTYPE
                 .getFieldTypes()[MetadataRecordTypes.FEED_ARECORD_ADAPTOR_CONFIG_INDEX]);
-        for (Map.Entry<String, String> property : feed.getAdapterConfiguration().entrySet()) {
+        for (Map.Entry<String, String> property : feed.getConfiguration().entrySet()) {
             String name = property.getKey();
             String value = property.getValue();
             listEleBuffer.reset();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
index 858d443..273c78a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/FunctionTupleTranslator.java
@@ -26,7 +26,6 @@
 import java.util.List;
 
 import org.apache.asterix.builders.OrderedListBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
@@ -36,6 +35,8 @@
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AOrderedListType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -56,7 +57,13 @@
     // Payload field containing serialized Function.
     public static final int FUNCTION_PAYLOAD_TUPLE_FIELD_INDEX = 3;
 
-    @SuppressWarnings("unchecked")
+    private transient OrderedListBuilder dependenciesListBuilder = new OrderedListBuilder();
+    private transient OrderedListBuilder dependencyListBuilder = new OrderedListBuilder();
+    private transient OrderedListBuilder dependencyNameListBuilder = new OrderedListBuilder();
+    private transient AOrderedListType stringList = new AOrderedListType(BuiltinType.ASTRING, null);
+    private transient AOrderedListType ListofLists =
+            new AOrderedListType(new AOrderedListType(BuiltinType.ASTRING, null), null);
+
     private ISerializerDeserializer<ARecord> recordSerDes =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(MetadataRecordTypes.FUNCTION_RECORDTYPE);
 
@@ -104,14 +111,39 @@
         String functionKind =
                 ((AString) functionRecord.getValueByPos(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX))
                         .getStringValue();
+
+        IACursor dependenciesCursor = ((AOrderedList) functionRecord
+                .getValueByPos(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_DEPENDENCIES_FIELD_INDEX)).getCursor();
+        List<List<List<String>>> dependencies = new ArrayList<>();
+        AOrderedList dependencyList;
+        AOrderedList qualifiedList;
+        int i = 0;
+        while (dependenciesCursor.next()) {
+            dependencies.add(new ArrayList<>());
+            dependencyList = (AOrderedList) dependenciesCursor.get();
+            IACursor qualifiedDependencyCursor = dependencyList.getCursor();
+            int j = 0;
+            while (qualifiedDependencyCursor.next()) {
+                qualifiedList = (AOrderedList) qualifiedDependencyCursor.get();
+                IACursor qualifiedNameCursor = qualifiedList.getCursor();
+                dependencies.get(i).add(new ArrayList<>());
+                while (qualifiedNameCursor.next()) {
+                    dependencies.get(i).get(j).add(((AString) qualifiedNameCursor.get()).getStringValue());
+                }
+                j++;
+            }
+            i++;
+
+        }
+
         return new Function(dataverseName, functionName, Integer.parseInt(arity), params, returnType, definition,
-                language, functionKind);
+                language, functionKind, dependencies);
 
     }
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(Function function)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
         aString.setValue(function.getDataverseName());
@@ -185,6 +217,33 @@
         stringSerde.serialize(aString, fieldValue.getDataOutput());
         recordBuilder.addField(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_KIND_FIELD_INDEX, fieldValue);
 
+        // write field 8
+        dependenciesListBuilder.reset((AOrderedListType) MetadataRecordTypes.FUNCTION_RECORDTYPE
+                .getFieldTypes()[MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_DEPENDENCIES_FIELD_INDEX]);
+        List<List<List<String>>> dependenciesList = function.getDependencies();
+        for (List<List<String>> dependencies : dependenciesList) {
+            dependencyListBuilder.reset(ListofLists);
+            for (List<String> dependency : dependencies) {
+                dependencyNameListBuilder.reset(stringList);
+                for (String subName : dependency) {
+                    itemValue.reset();
+                    aString.setValue(subName);
+                    stringSerde.serialize(aString, itemValue.getDataOutput());
+                    dependencyNameListBuilder.addItem(itemValue);
+                }
+                itemValue.reset();
+                dependencyNameListBuilder.write(itemValue.getDataOutput(), true);
+                dependencyListBuilder.addItem(itemValue);
+
+            }
+            itemValue.reset();
+            dependencyListBuilder.write(itemValue.getDataOutput(), true);
+            dependenciesListBuilder.addItem(itemValue);
+        }
+        fieldValue.reset();
+        dependenciesListBuilder.write(fieldValue.getDataOutput(), true);
+        recordBuilder.addField(MetadataRecordTypes.FUNCTION_ARECORD_FUNCTION_DEPENDENCIES_FIELD_INDEX, fieldValue);
+
         // write record
         recordBuilder.write(tupleBuilder.getDataOutput(), true);
         tupleBuilder.addFieldEndOffset();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
index fec4ddc..a154d7f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
@@ -29,8 +29,7 @@
 
 import org.apache.asterix.builders.OrderedListBuilder;
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.MetadataNode;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
@@ -95,16 +94,17 @@
     private ISerializerDeserializer<ARecord> recordSerde =
             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(MetadataRecordTypes.INDEX_RECORDTYPE);
     private final MetadataNode metadataNode;
-    private final JobId jobId;
+    private final TxnId txnId;
 
-    protected IndexTupleTranslator(JobId jobId, MetadataNode metadataNode, boolean getTuple) {
+    protected IndexTupleTranslator(TxnId txnId, MetadataNode metadataNode, boolean getTuple) {
         super(getTuple, MetadataPrimaryIndexes.INDEX_DATASET.getFieldCount());
-        this.jobId = jobId;
+        this.txnId = txnId;
         this.metadataNode = metadataNode;
     }
 
     @Override
-    public Index getMetadataEntityFromTuple(ITupleReference frameTuple) throws MetadataException, HyracksDataException {
+    public Index getMetadataEntityFromTuple(ITupleReference frameTuple)
+            throws AlgebricksException, HyracksDataException {
         byte[] serRecord = frameTuple.getFieldData(INDEX_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordStartOffset = frameTuple.getFieldStart(INDEX_PAYLOAD_TUPLE_FIELD_INDEX);
         int recordLength = frameTuple.getFieldLength(INDEX_PAYLOAD_TUPLE_FIELD_INDEX);
@@ -141,7 +141,7 @@
         List<IAType> searchKeyType = new ArrayList<>(searchKey.size());
         while (fieldTypeCursor.next()) {
             String typeName = ((AString) fieldTypeCursor.get()).getStringValue();
-            IAType fieldType = BuiltinTypeMap.getTypeFromTypeName(metadataNode, jobId, dvName, typeName, false);
+            IAType fieldType = BuiltinTypeMap.getTypeFromTypeName(metadataNode, txnId, dvName, typeName, false);
             searchKeyType.add(fieldType);
         }
         boolean isOverridingKeyTypes = !searchKeyType.isEmpty();
@@ -176,26 +176,23 @@
             }
         }
 
-        // index key type information is not persisted, thus we extract type information from the record metadata
+        // index key type information is not persisted, thus we extract type information
+        // from the record metadata
         if (searchKeyType.isEmpty()) {
             try {
-                Dataset dSet = metadataNode.getDataset(jobId, dvName, dsName);
+                Dataset dSet = metadataNode.getDataset(txnId, dvName, dsName);
                 String datatypeName = dSet.getItemTypeName();
                 String datatypeDataverseName = dSet.getItemTypeDataverseName();
                 ARecordType recordDt = (ARecordType) metadataNode
-                        .getDatatype(jobId, datatypeDataverseName, datatypeName).getDatatype();
+                        .getDatatype(txnId, datatypeDataverseName, datatypeName).getDatatype();
                 String metatypeName = dSet.getMetaItemTypeName();
                 String metatypeDataverseName = dSet.getMetaItemTypeDataverseName();
                 ARecordType metaDt = null;
                 if (metatypeName != null && metatypeDataverseName != null) {
-                    metaDt = (ARecordType) metadataNode.getDatatype(jobId, metatypeDataverseName, metatypeName)
+                    metaDt = (ARecordType) metadataNode.getDatatype(txnId, metatypeDataverseName, metatypeName)
                             .getDatatype();
                 }
-                try {
-                    searchKeyType = KeyFieldTypeUtil.getKeyTypes(recordDt, metaDt, searchKey, keyFieldSourceIndicator);
-                } catch (AlgebricksException e) {
-                    throw new MetadataException(e);
-                }
+                searchKeyType = KeyFieldTypeUtil.getKeyTypes(recordDt, metaDt, searchKey, keyFieldSourceIndicator);
             } catch (RemoteException re) {
                 throw HyracksDataException.create(re);
             }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
index 9c2b824..f001ec4 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/LibraryTupleTranslator.java
@@ -24,13 +24,13 @@
 import java.io.DataInputStream;
 import java.util.Calendar;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
 import org.apache.asterix.metadata.entities.Library;
 import org.apache.asterix.om.base.ARecord;
 import org.apache.asterix.om.base.AString;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -79,7 +79,8 @@
     }
 
     @Override
-    public ITupleReference getTupleFromMetadataEntity(Library library) throws HyracksDataException, MetadataException {
+    public ITupleReference getTupleFromMetadataEntity(Library library)
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first 2 fields of the tuple
         tupleBuilder.reset();
         aString.setValue(library.getDataverseName());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
index 20f04c4..0625fc4 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/MetadataTupleTranslatorProvider.java
@@ -18,7 +18,7 @@
  */
 package org.apache.asterix.metadata.entitytupletranslators;
 
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.metadata.MetadataNode;
 
 public class MetadataTupleTranslatorProvider {
@@ -35,9 +35,9 @@
         return new DatasourceAdapterTupleTranslator(getTuple);
     }
 
-    public DatatypeTupleTranslator getDataTypeTupleTranslator(JobId jobId, MetadataNode metadataNode,
+    public DatatypeTupleTranslator getDataTypeTupleTranslator(TxnId txnId, MetadataNode metadataNode,
             boolean getTuple) {
-        return new DatatypeTupleTranslator(jobId, metadataNode, getTuple);
+        return new DatatypeTupleTranslator(txnId, metadataNode, getTuple);
     }
 
     public DataverseTupleTranslator getDataverseTupleTranslator(boolean getTuple) {
@@ -60,8 +60,8 @@
         return new FunctionTupleTranslator(getTuple);
     }
 
-    public IndexTupleTranslator getIndexTupleTranslator(JobId jobId, MetadataNode metadataNode, boolean getTuple) {
-        return new IndexTupleTranslator(jobId, metadataNode, getTuple);
+    public IndexTupleTranslator getIndexTupleTranslator(TxnId txnId, MetadataNode metadataNode, boolean getTuple) {
+        return new IndexTupleTranslator(txnId, metadataNode, getTuple);
     }
 
     public LibraryTupleTranslator getLibraryTupleTranslator(boolean getTuple) {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeGroupTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeGroupTupleTranslator.java
index 5329df4..5733de9 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeGroupTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeGroupTupleTranslator.java
@@ -27,7 +27,6 @@
 import java.util.List;
 
 import org.apache.asterix.builders.UnorderedListBuilder;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.metadata.bootstrap.MetadataPrimaryIndexes;
 import org.apache.asterix.metadata.bootstrap.MetadataRecordTypes;
@@ -37,6 +36,7 @@
 import org.apache.asterix.om.base.AUnorderedList;
 import org.apache.asterix.om.base.IACursor;
 import org.apache.asterix.om.types.AUnorderedListType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -86,7 +86,7 @@
 
     @Override
     public ITupleReference getTupleFromMetadataEntity(NodeGroup instance)
-            throws HyracksDataException, MetadataException {
+            throws HyracksDataException, AlgebricksException {
         // write the key in the first field of the tuple
         tupleBuilder.reset();
         aString.setValue(instance.getNodeGroupName());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeTupleTranslator.java
index b1847fd..f67ae3b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/NodeTupleTranslator.java
@@ -27,6 +27,7 @@
 import org.apache.asterix.om.base.AInt64;
 import org.apache.asterix.om.base.AMutableInt64;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -84,7 +85,7 @@
     }
 
     @Override
-    public ITupleReference getTupleFromMetadataEntity(Node instance) throws HyracksDataException, MetadataException {
+    public ITupleReference getTupleFromMetadataEntity(Node instance) throws HyracksDataException, AlgebricksException {
         // write the key in the first field of the tuple
         tupleBuilder.reset();
         aString.setValue(instance.getNodeName());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/BuiltinFeedPolicies.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/BuiltinFeedPolicies.java
index 41b356a..f9ce755 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/BuiltinFeedPolicies.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/BuiltinFeedPolicies.java
@@ -20,19 +20,19 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.external.feed.policy.FeedPolicyAccessor;
 import org.apache.asterix.metadata.MetadataManager;
 import org.apache.asterix.metadata.MetadataTransactionContext;
 import org.apache.asterix.metadata.entities.FeedPolicyEntity;
 import org.apache.asterix.metadata.utils.MetadataConstants;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class BuiltinFeedPolicies {
 
-    private static final Logger LOGGER = Logger.getLogger(BuiltinFeedPolicies.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final FeedPolicyEntity BASIC = initializeBasicPolicy();
 
@@ -61,7 +61,7 @@
         return null;
     }
 
-    //Basic
+    // Basic
     private static FeedPolicyEntity initializeBasicPolicy() {
         Map<String, String> policyParams = new HashMap<>();
         policyParams.put(FeedPolicyAccessor.ELASTIC, Boolean.toString(false));
@@ -106,13 +106,11 @@
                 policyParams);
     }
 
-    public static void insertInitialFeedPolicies(MetadataTransactionContext mdTxnCtx) throws MetadataException {
+    public static void insertInitialFeedPolicies(MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
         for (FeedPolicyEntity feedPolicy : BuiltinFeedPolicies.POLICIES) {
             MetadataManager.INSTANCE.addFeedPolicy(mdTxnCtx, feedPolicy);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Finished adding built-in feed policies.");
-        }
+        LOGGER.info("Finished adding built-in feed policies.");
     }
 
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/FeedMetadataUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/FeedMetadataUtil.java
index 3f9c002..8a0cf84 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/FeedMetadataUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/feeds/FeedMetadataUtil.java
@@ -54,8 +54,8 @@
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 
 /**
- * A utility class for providing helper functions for feeds
- * TODO: Refactor this class.
+ * A utility class for providing helper functions for feeds TODO: Refactor this
+ * class.
  */
 public class FeedMetadataUtil {
 
@@ -77,7 +77,7 @@
     }
 
     public static Feed validateIfFeedExists(String dataverse, String feedName, MetadataTransactionContext ctx)
-            throws CompilationException {
+            throws AlgebricksException {
         Feed feed = MetadataManager.INSTANCE.getFeed(ctx, dataverse, feedName);
         if (feed == null) {
             throw new CompilationException("Unknown source feed: " + feedName);
@@ -86,7 +86,7 @@
     }
 
     public static FeedPolicyEntity validateIfPolicyExists(String dataverse, String policyName,
-            MetadataTransactionContext ctx) throws CompilationException {
+            MetadataTransactionContext ctx) throws AlgebricksException {
         FeedPolicyEntity feedPolicy = MetadataManager.INSTANCE.getFeedPolicy(ctx, dataverse, policyName);
         if (feedPolicy == null) {
             feedPolicy =
@@ -99,14 +99,17 @@
     }
 
     public static void validateFeed(Feed feed, MetadataTransactionContext mdTxnCtx, ICcApplicationContext appCtx)
-            throws AsterixException {
+            throws AlgebricksException {
         try {
-            String adapterName = feed.getAdapterName();
-            Map<String, String> configuration = feed.getAdapterConfiguration();
-            ARecordType adapterOutputType = getOutputType(feed, configuration, ExternalDataConstants.KEY_TYPE_NAME);
-            ARecordType metaType = getOutputType(feed, configuration, ExternalDataConstants.KEY_META_TYPE_NAME);
+            Map<String, String> configuration = feed.getConfiguration();
+            ARecordType adapterOutputType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_TYPE_NAME));
+            ARecordType metaType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_META_TYPE_NAME));
             ExternalDataUtils.prepareFeed(configuration, feed.getDataverseName(), feed.getFeedName());
             // Get adapter from metadata dataset <Metadata dataverse>
+            String adapterName = configuration.get(ExternalDataConstants.KEY_ADAPTER_NAME);
+            if (adapterName == null) {
+                throw new AlgebricksException("cannot find adatper name");
+            }
             DatasourceAdapter adapterEntity = MetadataManager.INSTANCE.getAdapter(mdTxnCtx,
                     MetadataConstants.METADATA_DATAVERSE_NAME, adapterName);
             // Get adapter from metadata dataset <The feed dataverse>
@@ -140,7 +143,7 @@
                         adapterOutputType, metaType);
             }
             if (metaType == null && configuration.containsKey(ExternalDataConstants.KEY_META_TYPE_NAME)) {
-                metaType = getOutputType(feed, configuration, ExternalDataConstants.KEY_META_TYPE_NAME);
+                metaType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_META_TYPE_NAME));
                 if (metaType == null) {
                     throw new AsterixException("Unknown specified feed meta output data type "
                             + configuration.get(ExternalDataConstants.KEY_META_TYPE_NAME));
@@ -150,7 +153,7 @@
                 if (!configuration.containsKey(ExternalDataConstants.KEY_TYPE_NAME)) {
                     throw new AsterixException("Unspecified feed output data type");
                 }
-                adapterOutputType = getOutputType(feed, configuration, ExternalDataConstants.KEY_TYPE_NAME);
+                adapterOutputType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_TYPE_NAME));
                 if (adapterOutputType == null) {
                     throw new AsterixException("Unknown specified feed output data type "
                             + configuration.get(ExternalDataConstants.KEY_TYPE_NAME));
@@ -162,7 +165,7 @@
     }
 
     @SuppressWarnings("rawtypes")
-    public static Triple<IAdapterFactory, RecordDescriptor, AdapterType> getPrimaryFeedFactoryAndOutput(Feed feed,
+    public static Triple<IAdapterFactory, RecordDescriptor, AdapterType> getFeedFactoryAndOutput(Feed feed,
             FeedPolicyAccessor policyAccessor, MetadataTransactionContext mdTxnCtx, ICcApplicationContext appCtx)
             throws AlgebricksException {
         // This method needs to be re-visited
@@ -175,11 +178,11 @@
         Triple<IAdapterFactory, RecordDescriptor, IDataSourceAdapter.AdapterType> feedProps = null;
         IDataSourceAdapter.AdapterType adapterType = null;
         try {
-            adapterName = feed.getAdapterName();
-            Map<String, String> configuration = feed.getAdapterConfiguration();
+            Map<String, String> configuration = feed.getConfiguration();
+            adapterName = configuration.get(ExternalDataConstants.KEY_ADAPTER_NAME);
             configuration.putAll(policyAccessor.getFeedPolicy());
-            adapterOutputType = getOutputType(feed, configuration, ExternalDataConstants.KEY_TYPE_NAME);
-            metaType = getOutputType(feed, configuration, ExternalDataConstants.KEY_META_TYPE_NAME);
+            adapterOutputType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_TYPE_NAME));
+            metaType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_META_TYPE_NAME));
             ExternalDataUtils.prepareFeed(configuration, feed.getDataverseName(), feed.getFeedName());
             // Get adapter from metadata dataset <Metadata dataverse>
             adapterEntity = MetadataManager.INSTANCE.getAdapter(mdTxnCtx, MetadataConstants.METADATA_DATAVERSE_NAME,
@@ -214,13 +217,13 @@
                 adapterType = IDataSourceAdapter.AdapterType.INTERNAL;
             }
             if (metaType == null) {
-                metaType = getOutputType(feed, configuration, ExternalDataConstants.KEY_META_TYPE_NAME);
+                metaType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_META_TYPE_NAME));
             }
             if (adapterOutputType == null) {
                 if (!configuration.containsKey(ExternalDataConstants.KEY_TYPE_NAME)) {
                     throw new AsterixException("Unspecified feed output data type");
                 }
-                adapterOutputType = getOutputType(feed, configuration, ExternalDataConstants.KEY_TYPE_NAME);
+                adapterOutputType = getOutputType(feed, configuration.get(ExternalDataConstants.KEY_TYPE_NAME));
             }
             int numOfOutputs = 1;
             if (metaType != null) {
@@ -272,10 +275,8 @@
         }
     }
 
-    public static ARecordType getOutputType(IFeed feed, Map<String, String> configuration, String key)
-            throws MetadataException {
+    public static ARecordType getOutputType(IFeed feed, String fqOutputType) throws AlgebricksException {
         ARecordType outputType = null;
-        String fqOutputType = configuration.get(key);
 
         if (fqOutputType == null) {
             return null;
@@ -291,7 +292,7 @@
             dataverseName = dataverseAndType[0];
             datatypeName = dataverseAndType[1];
         } else {
-            throw new IllegalArgumentException("Invalid value for the parameter " + key);
+            throw new IllegalArgumentException("Invalid parameter value " + fqOutputType);
         }
 
         MetadataTransactionContext ctx = null;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
index c0d9bda..3d80d0f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtil.java
@@ -52,7 +52,7 @@
     private static Pattern unorderedListPattern = Pattern.compile("[{{*}}]");
 
     public static IFunctionInfo getExternalFunctionInfo(MetadataTransactionContext txnCtx, Function function)
-            throws MetadataException {
+            throws AlgebricksException {
 
         String functionKind = function.getKind();
         IFunctionInfo finfo = null;
@@ -69,9 +69,9 @@
     }
 
     private static IFunctionInfo getScalarFunctionInfo(MetadataTransactionContext txnCtx, Function function)
-            throws MetadataException {
-        FunctionIdentifier fid = new FunctionIdentifier(function.getDataverseName(), function.getName(),
-                function.getArity());
+            throws AlgebricksException {
+        FunctionIdentifier fid =
+                new FunctionIdentifier(function.getDataverseName(), function.getName(), function.getArity());
         IResultTypeComputer typeComputer = getResultTypeComputer(txnCtx, function);
         List<IAType> arguments = new ArrayList<IAType>();
         IAType returnType = null;
@@ -87,7 +87,7 @@
     }
 
     private static IAType getTypeInfo(String paramType, MetadataTransactionContext txnCtx, Function function)
-            throws MetadataException {
+            throws AlgebricksException {
         if (paramType.equalsIgnoreCase(BuiltinType.AINT32.getDisplayName())) {
             return (BuiltinType.AINT32);
         } else if (paramType.equalsIgnoreCase(BuiltinType.AFLOAT.getDisplayName())) {
@@ -112,7 +112,7 @@
     }
 
     private static IAType getCollectionType(String paramType, MetadataTransactionContext txnCtx, Function function)
-            throws MetadataException {
+            throws AlgebricksException {
 
         Matcher matcher = orderedListPattern.matcher(paramType);
         if (matcher.find()) {
@@ -129,7 +129,7 @@
     }
 
     private static IResultTypeComputer getResultTypeComputer(final MetadataTransactionContext txnCtx,
-            final Function function) throws MetadataException {
+            final Function function) throws AlgebricksException {
 
         final IAType type = getTypeInfo(function.getReturnType(), txnCtx, function);
         switch (type.getTypeTag()) {
@@ -163,8 +163,7 @@
                     @Override
                     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
                             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
-
-                        return new AUnorderedListType(type, type.getTypeName());
+                        return new AUnorderedListType(((AUnorderedListType) type).getItemType(), type.getTypeName());
                     }
 
                 };
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
index 8625756..93165dc 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/ExternalScalarFunctionInfo.java
@@ -29,10 +29,9 @@
 
     private static final long serialVersionUID = 1L;
 
-    public ExternalScalarFunctionInfo(String namespace, String name, int arity, IAType
-            returnType,
-            String body, String language, List<IAType> argumentTypes, IResultTypeComputer rtc) {
-        super(namespace, name, arity , FunctionKind.SCALAR, argumentTypes, returnType, rtc, body, language);
+    public ExternalScalarFunctionInfo(String namespace, String name, int arity, IAType returnType, String body,
+            String language, List<IAType> argumentTypes, IResultTypeComputer rtc) {
+        super(namespace, name, arity, FunctionKind.SCALAR, argumentTypes, returnType, rtc, body, language);
     }
 
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
deleted file mode 100644
index 137e625..0000000
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/functions/MetadataBuiltinFunctions.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.metadata.functions;
-
-import org.apache.asterix.metadata.declared.MetadataProvider;
-import org.apache.asterix.metadata.entities.Dataset;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.utils.ConstantExpressionUtil;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
-
-public class MetadataBuiltinFunctions {
-
-    static {
-        addMetadataBuiltinFunctions();
-        BuiltinFunctions.addUnnestFun(BuiltinFunctions.DATASET, false);
-        BuiltinFunctions.addDatasetFunction(BuiltinFunctions.DATASET);
-        BuiltinFunctions.addUnnestFun(BuiltinFunctions.FEED_COLLECT, false);
-        BuiltinFunctions.addDatasetFunction(BuiltinFunctions.FEED_COLLECT);
-        BuiltinFunctions.addUnnestFun(BuiltinFunctions.FEED_INTERCEPT, false);
-        BuiltinFunctions.addDatasetFunction(BuiltinFunctions.FEED_INTERCEPT);
-    }
-
-    public static void addMetadataBuiltinFunctions() {
-
-        BuiltinFunctions.addFunction(BuiltinFunctions.DATASET, new IResultTypeComputer() {
-
-            @Override
-            public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
-                    IMetadataProvider<?, ?> mp) throws AlgebricksException {
-                AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
-                if (f.getArguments().size() != 1) {
-                    throw new AlgebricksException("dataset arity is 1, not " + f.getArguments().size());
-                }
-                ILogicalExpression a1 = f.getArguments().get(0).getValue();
-                IAType t1 = (IAType) env.getType(a1);
-                if (t1.getTypeTag() == ATypeTag.ANY) {
-                    return BuiltinType.ANY;
-                }
-                if (t1.getTypeTag() != ATypeTag.STRING) {
-                    throw new AlgebricksException("Illegal type " + t1 + " for dataset() argument.");
-                }
-                String datasetArg = ConstantExpressionUtil.getStringConstant(a1);
-                if (datasetArg == null) {
-                    return BuiltinType.ANY;
-                }
-                MetadataProvider metadata = (MetadataProvider) mp;
-                Pair<String, String> datasetInfo = getDatasetInfo(metadata, datasetArg);
-                String dataverseName = datasetInfo.first;
-                String datasetName = datasetInfo.second;
-                if (dataverseName == null) {
-                    throw new AlgebricksException("Unspecified dataverse!");
-                }
-                Dataset dataset = metadata.findDataset(dataverseName, datasetName);
-                if (dataset == null) {
-                    throw new AlgebricksException(
-                            "Could not find dataset " + datasetName + " in dataverse " + dataverseName);
-                }
-                String tn = dataset.getItemTypeName();
-                IAType t2 = metadata.findType(dataset.getItemTypeDataverseName(), tn);
-                if (t2 == null) {
-                    throw new AlgebricksException("No type for dataset " + datasetName);
-                }
-                return t2;
-            }
-        }, true);
-
-        BuiltinFunctions.addPrivateFunction(BuiltinFunctions.FEED_COLLECT, new IResultTypeComputer() {
-
-            @Override
-            public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
-                    IMetadataProvider<?, ?> mp) throws AlgebricksException {
-                AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
-                if (f.getArguments().size() != BuiltinFunctions.FEED_COLLECT.getArity()) {
-                    throw new AlgebricksException("Incorrect number of arguments -> arity is "
-                            + BuiltinFunctions.FEED_COLLECT.getArity() + ", not " + f.getArguments().size());
-                }
-                ILogicalExpression a1 = f.getArguments().get(5).getValue();
-                IAType t1 = (IAType) env.getType(a1);
-                if (t1.getTypeTag() == ATypeTag.ANY) {
-                    return BuiltinType.ANY;
-                }
-                if (t1.getTypeTag() != ATypeTag.STRING) {
-                    throw new AlgebricksException("Illegal type " + t1 + " for feed-ingest argument.");
-                }
-                String typeArg = ConstantExpressionUtil.getStringConstant(a1);
-                if (typeArg == null) {
-                    return BuiltinType.ANY;
-                }
-                MetadataProvider metadata = (MetadataProvider) mp;
-                Pair<String, String> argInfo = getDatasetInfo(metadata, typeArg);
-                String dataverseName = argInfo.first;
-                String typeName = argInfo.second;
-                if (dataverseName == null) {
-                    throw new AlgebricksException("Unspecified dataverse!");
-                }
-                IAType t2 = metadata.findType(dataverseName, typeName);
-                if (t2 == null) {
-                    throw new AlgebricksException("Unknown type  " + typeName);
-                }
-                return t2;
-            }
-        }, true);
-
-        BuiltinFunctions.addFunction(BuiltinFunctions.FEED_INTERCEPT, new IResultTypeComputer() {
-
-            @Override
-            public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
-                    IMetadataProvider<?, ?> mp) throws AlgebricksException {
-                AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expression;
-                if (f.getArguments().size() != 1) {
-                    throw new AlgebricksException("dataset arity is 1, not " + f.getArguments().size());
-                }
-                ILogicalExpression a1 = f.getArguments().get(0).getValue();
-                IAType t1 = (IAType) env.getType(a1);
-                if (t1.getTypeTag() == ATypeTag.ANY) {
-                    return BuiltinType.ANY;
-                }
-                if (t1.getTypeTag() != ATypeTag.STRING) {
-                    throw new AlgebricksException("Illegal type " + t1 + " for dataset() argument.");
-                }
-                String datasetArg = ConstantExpressionUtil.getStringConstant(a1);
-                if (datasetArg == null) {
-                    return BuiltinType.ANY;
-                }
-                MetadataProvider metadata = (MetadataProvider) mp;
-                Pair<String, String> datasetInfo = getDatasetInfo(metadata, datasetArg);
-                String dataverseName = datasetInfo.first;
-                String datasetName = datasetInfo.second;
-                if (dataverseName == null) {
-                    throw new AlgebricksException("Unspecified dataverse!");
-                }
-                Dataset dataset = metadata.findDataset(dataverseName, datasetName);
-                if (dataset == null) {
-                    throw new AlgebricksException(
-                            "Could not find dataset " + datasetName + " in dataverse " + dataverseName);
-                }
-                String tn = dataset.getItemTypeName();
-                IAType t2 = metadata.findType(dataset.getItemTypeDataverseName(), tn);
-                if (t2 == null) {
-                    throw new AlgebricksException("No type for dataset " + datasetName);
-                }
-                return t2;
-            }
-        }, true);
-    }
-
-    private static Pair<String, String> getDatasetInfo(MetadataProvider metadata, String datasetArg) {
-        String[] nameComponents = datasetArg.split("\\.");
-        String first;
-        String second;
-        if (nameComponents.length == 1) {
-            first = metadata.getDefaultDataverse() == null ? null : metadata.getDefaultDataverse().getDataverseName();
-            second = nameComponents[0];
-        } else {
-            first = nameComponents[0];
-            second = nameComponents[1];
-        }
-        return new Pair<String, String>(first, second);
-    }
-}
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
index bc302c2..b35d02a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/DatasetLock.java
@@ -24,9 +24,9 @@
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.metadata.IMetadataLock;
-import org.apache.asterix.common.utils.InterruptUtil;
 import org.apache.commons.lang3.mutable.MutableInt;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.util.InvokeUtil;
 
 public class DatasetLock implements IMetadataLock {
 
@@ -90,7 +90,7 @@
     }
 
     private void incrementModifyCounter() {
-        InterruptUtil.doUninterruptibly(() -> {
+        InvokeUtil.doUninterruptibly(() -> {
             synchronized (indexBuildCounter) {
                 while (indexBuildCounter.getValue() > 0) {
                     indexBuildCounter.wait();
@@ -132,7 +132,7 @@
             if (indexBuildCounter.getValue() > 0) {
                 indexBuildCounter.increment();
             } else {
-                InterruptUtil.doUninterruptibly(() -> {
+                InvokeUtil.doUninterruptibly(() -> {
                     while (true) {
                         synchronized (dsModifyCounter) {
                             if (dsModifyCounter.getValue() == 0) {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java
index 779fe2a..61bcbc7 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/lock/MetadataLockManager.java
@@ -22,7 +22,6 @@
 import java.util.function.Function;
 
 import org.apache.asterix.common.api.IMetadataLockManager;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.IMetadataLock;
 import org.apache.asterix.common.metadata.LockList;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -49,147 +48,149 @@
     }
 
     @Override
-    public void acquireDataverseReadLock(LockList locks, String dataverseName) throws AsterixException {
+    public void acquireDataverseReadLock(LockList locks, String dataverseName) throws AlgebricksException {
         String key = DATAVERSE_PREFIX + dataverseName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireDataverseWriteLock(LockList locks, String dataverseName) throws AsterixException {
+    public void acquireDataverseWriteLock(LockList locks, String dataverseName) throws AlgebricksException {
         String key = DATAVERSE_PREFIX + dataverseName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireDatasetReadLock(LockList locks, String datasetName) throws AsterixException {
+    public void acquireDatasetReadLock(LockList locks, String datasetName) throws AlgebricksException {
         String key = DATASET_PREFIX + datasetName;
         DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireDatasetWriteLock(LockList locks, String datasetName) throws AsterixException {
+    public void acquireDatasetWriteLock(LockList locks, String datasetName) throws AlgebricksException {
         String key = DATASET_PREFIX + datasetName;
         DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireDatasetModifyLock(LockList locks, String datasetName) throws AsterixException {
+    public void acquireDatasetModifyLock(LockList locks, String datasetName) throws AlgebricksException {
         String key = DATASET_PREFIX + datasetName;
         DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.MODIFY, lock);
     }
 
     @Override
-    public void acquireDatasetCreateIndexLock(LockList locks, String datasetName) throws AsterixException {
+    public void acquireDatasetCreateIndexLock(LockList locks, String datasetName) throws AlgebricksException {
         String dsKey = DATASET_PREFIX + datasetName;
         DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(dsKey, DATASET_LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.INDEX_BUILD, lock);
     }
 
     @Override
-    public void acquireDatasetExclusiveModificationLock(LockList locks, String datasetName) throws AsterixException {
+    public void acquireDatasetExclusiveModificationLock(LockList locks, String datasetName) throws AlgebricksException {
         String key = DATASET_PREFIX + datasetName;
         DatasetLock lock = (DatasetLock) mdlocks.computeIfAbsent(key, DATASET_LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.EXCLUSIVE_MODIFY, lock);
     }
 
     @Override
-    public void acquireFunctionReadLock(LockList locks, String functionName) throws AsterixException {
+    public void acquireFunctionReadLock(LockList locks, String functionName) throws AlgebricksException {
         String key = FUNCTION_PREFIX + functionName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireFunctionWriteLock(LockList locks, String functionName) throws AsterixException {
+    public void acquireFunctionWriteLock(LockList locks, String functionName) throws AlgebricksException {
         String key = FUNCTION_PREFIX + functionName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireNodeGroupReadLock(LockList locks, String nodeGroupName) throws AsterixException {
+    public void acquireNodeGroupReadLock(LockList locks, String nodeGroupName) throws AlgebricksException {
         String key = NODE_GROUP_PREFIX + nodeGroupName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireNodeGroupWriteLock(LockList locks, String nodeGroupName) throws AsterixException {
+    public void acquireNodeGroupWriteLock(LockList locks, String nodeGroupName) throws AlgebricksException {
         String key = NODE_GROUP_PREFIX + nodeGroupName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireActiveEntityReadLock(LockList locks, String entityName) throws AsterixException {
+    public void acquireActiveEntityReadLock(LockList locks, String entityName) throws AlgebricksException {
         String key = ACTIVE_PREFIX + entityName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireActiveEntityWriteLock(LockList locks, String entityName) throws AsterixException {
+    public void acquireActiveEntityWriteLock(LockList locks, String entityName) throws AlgebricksException {
         String key = ACTIVE_PREFIX + entityName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireFeedPolicyWriteLock(LockList locks, String feedPolicyName) throws AsterixException {
+    public void acquireFeedPolicyWriteLock(LockList locks, String feedPolicyName) throws AlgebricksException {
         String key = FEED_POLICY_PREFIX + feedPolicyName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireFeedPolicyReadLock(LockList locks, String feedPolicyName) throws AsterixException {
+    public void acquireFeedPolicyReadLock(LockList locks, String feedPolicyName) throws AlgebricksException {
         String key = FEED_POLICY_PREFIX + feedPolicyName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireMergePolicyReadLock(LockList locks, String mergePolicyName) throws AsterixException {
+    public void acquireMergePolicyReadLock(LockList locks, String mergePolicyName) throws AlgebricksException {
         String key = MERGE_POLICY_PREFIX + mergePolicyName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireMergePolicyWriteLock(LockList locks, String mergePolicyName) throws AsterixException {
+    public void acquireMergePolicyWriteLock(LockList locks, String mergePolicyName) throws AlgebricksException {
         String key = MERGE_POLICY_PREFIX + mergePolicyName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireDataTypeReadLock(LockList locks, String datatypeName) throws AsterixException {
+    public void acquireDataTypeReadLock(LockList locks, String datatypeName) throws AlgebricksException {
         String key = DATATYPE_PREFIX + datatypeName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireDataTypeWriteLock(LockList locks, String datatypeName) throws AsterixException {
+    public void acquireDataTypeWriteLock(LockList locks, String datatypeName) throws AlgebricksException {
         String key = DATATYPE_PREFIX + datatypeName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
     }
 
     @Override
-    public void acquireExtensionReadLock(LockList locks, String extension, String entityName) throws AsterixException {
+    public void acquireExtensionReadLock(LockList locks, String extension, String entityName)
+            throws AlgebricksException {
         String key = EXTENSION_PREFIX + extension + entityName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.READ, lock);
     }
 
     @Override
-    public void acquireExtensionWriteLock(LockList locks, String extension, String entityName) throws AsterixException {
+    public void acquireExtensionWriteLock(LockList locks, String extension, String entityName)
+            throws AlgebricksException {
         String key = EXTENSION_PREFIX + extension + entityName;
         IMetadataLock lock = mdlocks.computeIfAbsent(key, LOCK_FUNCTION);
         locks.add(IMetadataLock.Mode.WRITE, lock);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
index 53c3dc0..6d81145 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/DatasetUtil.java
@@ -25,7 +25,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
-import java.util.logging.Logger;
 
 import org.apache.asterix.builders.IARecordBuilder;
 import org.apache.asterix.builders.RecordBuilder;
@@ -37,9 +36,7 @@
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.transactions.IRecoveryManager;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.external.indexing.IndexingConstants;
 import org.apache.asterix.formats.base.IDataFormat;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
@@ -58,7 +55,6 @@
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.asterix.runtime.operators.LSMPrimaryUpsertOperatorDescriptor;
 import org.apache.asterix.runtime.utils.RuntimeUtils;
 import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexInstantSearchOperationCallbackFactory;
@@ -89,14 +85,15 @@
 import org.apache.hyracks.storage.am.common.dataflow.IndexCreateOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
 import org.apache.hyracks.storage.am.lsm.common.dataflow.LSMTreeIndexCompactOperatorDescriptor;
 import org.apache.hyracks.storage.common.IResourceFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetUtil {
-    private static final Logger LOGGER = Logger.getLogger(DatasetUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     /*
      * Dataset related operations
      */
@@ -176,10 +173,11 @@
         return btreeFields;
     }
 
-    public static int getPositionOfPartitioningKeyField(Dataset dataset, String fieldExpr) {
+    public static int getPositionOfPartitioningKeyField(Dataset dataset, List<String> fieldExpr) {
         List<List<String>> partitioningKeys = dataset.getPrimaryKeys();
         for (int i = 0; i < partitioningKeys.size(); i++) {
-            if ((partitioningKeys.get(i).size() == 1) && partitioningKeys.get(i).get(0).equals(fieldExpr)) {
+            List<String> partitioningKey = partitioningKeys.get(i);
+            if (partitioningKey.equals(fieldExpr)) {
                 return i;
             }
         }
@@ -206,7 +204,6 @@
         return new Pair<>(mergePolicyFactory, properties);
     }
 
-    @SuppressWarnings("unchecked")
     public static void writePropertyTypeRecord(String name, String value, DataOutput out, ARecordType recordType)
             throws HyracksDataException {
         IARecordBuilder propertyRecordBuilder = new RecordBuilder();
@@ -293,12 +290,13 @@
         LOGGER.info("CREATING File Splits: " + sb.toString());
         Pair<ILSMMergePolicyFactory, Map<String, String>> compactionInfo =
                 DatasetUtil.getMergePolicyFactory(dataset, metadataProvider.getMetadataTxnContext());
-        //prepare a LocalResourceMetadata which will be stored in NC's local resource repository
+        // prepare a LocalResourceMetadata which will be stored in NC's local resource
+        // repository
         IResourceFactory resourceFactory = dataset.getResourceFactory(metadataProvider, index, itemType, metaItemType,
                 compactionInfo.first, compactionInfo.second);
         IndexBuilderFactory indexBuilderFactory =
                 new IndexBuilderFactory(metadataProvider.getStorageComponentProvider().getStorageManager(),
-                        splitsAndConstraint.first, resourceFactory, !dataset.isTemp());
+                        splitsAndConstraint.first, resourceFactory, true);
         IndexCreateOperatorDescriptor indexCreateOp = new IndexCreateOperatorDescriptor(spec, indexBuilderFactory);
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, indexCreateOp,
                 splitsAndConstraint.second);
@@ -337,13 +335,11 @@
      *            the metadata provider.
      * @param dataset,
      *            the dataset to scan.
-     * @param jobId,
-     *            the AsterixDB job id for transaction management.
      * @return a primary index scan operator.
      * @throws AlgebricksException
      */
     public static IOperatorDescriptor createPrimaryIndexScanOp(JobSpecification spec, MetadataProvider metadataProvider,
-            Dataset dataset, JobId jobId) throws AlgebricksException {
+            Dataset dataset) throws AlgebricksException {
         Pair<IFileSplitProvider, AlgebricksPartitionConstraint> primarySplitsAndConstraint =
                 metadataProvider.getSplitProviderAndConstraints(dataset);
         IFileSplitProvider primaryFileSplitProvider = primarySplitsAndConstraint.first;
@@ -353,11 +349,9 @@
         // +Infinity
         int[] highKeyFields = null;
         ITransactionSubsystemProvider txnSubsystemProvider = TransactionSubsystemProvider.INSTANCE;
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        ISearchOperationCallbackFactory searchCallbackFactory = temp ? NoOpOperationCallbackFactory.INSTANCE
-                : new PrimaryIndexInstantSearchOperationCallbackFactory(jobId, dataset.getDatasetId(),
-                        dataset.getPrimaryBloomFilterFields(), txnSubsystemProvider,
-                        IRecoveryManager.ResourceType.LSM_BTREE);
+        ISearchOperationCallbackFactory searchCallbackFactory = new PrimaryIndexInstantSearchOperationCallbackFactory(
+                dataset.getDatasetId(), dataset.getPrimaryBloomFilterFields(), txnSubsystemProvider,
+                IRecoveryManager.ResourceType.LSM_BTREE);
         IndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
                 metadataProvider.getStorageComponentProvider().getStorageManager(), primaryFileSplitProvider);
         BTreeSearchOperatorDescriptor primarySearchOp = new BTreeSearchOperatorDescriptor(spec,
@@ -393,74 +387,68 @@
         int numFilterFields = DatasetUtil.getFilterField(dataset) == null ? 0 : 1;
         ARecordType itemType = (ARecordType) metadataProvider.findType(dataset);
         ARecordType metaItemType = (ARecordType) metadataProvider.findMetaType(dataset);
-        try {
-            Index primaryIndex = metadataProvider.getIndex(dataset.getDataverseName(), dataset.getDatasetName(),
-                    dataset.getDatasetName());
-            Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
-                    metadataProvider.getSplitProviderAndConstraints(dataset);
+        Index primaryIndex = metadataProvider.getIndex(dataset.getDataverseName(), dataset.getDatasetName(),
+                dataset.getDatasetName());
+        Pair<IFileSplitProvider, AlgebricksPartitionConstraint> splitsAndConstraint =
+                metadataProvider.getSplitProviderAndConstraints(dataset);
 
-            // prepare callback
-            JobId jobId = ((JobEventListenerFactory) spec.getJobletEventListenerFactory()).getJobId();
-            int[] primaryKeyFields = new int[numKeys];
-            for (int i = 0; i < numKeys; i++) {
-                primaryKeyFields[i] = i;
-            }
-            boolean hasSecondaries =
-                    metadataProvider.getDatasetIndexes(dataset.getDataverseName(), dataset.getDatasetName()).size() > 1;
-            IStorageComponentProvider storageComponentProvider = metadataProvider.getStorageComponentProvider();
-            IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
-                    storageComponentProvider, primaryIndex, jobId, IndexOperation.UPSERT, primaryKeyFields);
-            ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
-                    storageComponentProvider, primaryIndex, jobId, IndexOperation.UPSERT, primaryKeyFields);
-            IIndexDataflowHelperFactory idfh = new IndexDataflowHelperFactory(
-                    storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
-            LSMPrimaryUpsertOperatorDescriptor op;
-            ITypeTraits[] outputTypeTraits = new ITypeTraits[inputRecordDesc.getFieldCount()
-                    + (dataset.hasMetaPart() ? 2 : 1) + numFilterFields];
-            ISerializerDeserializer<?>[] outputSerDes = new ISerializerDeserializer[inputRecordDesc.getFieldCount()
-                    + (dataset.hasMetaPart() ? 2 : 1) + numFilterFields];
-            IDataFormat dataFormat = metadataProvider.getDataFormat();
-
-            // add the previous record first
-            int f = 0;
-            outputSerDes[f] = dataFormat.getSerdeProvider().getSerializerDeserializer(itemType);
-            f++;
-            // add the previous meta second
-            if (dataset.hasMetaPart()) {
-                outputSerDes[f] = dataFormat.getSerdeProvider().getSerializerDeserializer(metaItemType);
-                outputTypeTraits[f] = dataFormat.getTypeTraitProvider().getTypeTrait(metaItemType);
-                f++;
-            }
-            // add the previous filter third
-            int fieldIdx = -1;
-            if (numFilterFields > 0) {
-                String filterField = DatasetUtil.getFilterField(dataset).get(0);
-                String[] fieldNames = itemType.getFieldNames();
-                int i = 0;
-                for (; i < fieldNames.length; i++) {
-                    if (fieldNames[i].equals(filterField)) {
-                        break;
-                    }
-                }
-                fieldIdx = i;
-                outputTypeTraits[f] =
-                        dataFormat.getTypeTraitProvider().getTypeTrait(itemType.getFieldTypes()[fieldIdx]);
-                outputSerDes[f] =
-                        dataFormat.getSerdeProvider().getSerializerDeserializer(itemType.getFieldTypes()[fieldIdx]);
-                f++;
-            }
-            for (int j = 0; j < inputRecordDesc.getFieldCount(); j++) {
-                outputTypeTraits[j + f] = inputRecordDesc.getTypeTraits()[j];
-                outputSerDes[j + f] = inputRecordDesc.getFields()[j];
-            }
-            RecordDescriptor outputRecordDesc = new RecordDescriptor(outputSerDes, outputTypeTraits);
-            op = new LSMPrimaryUpsertOperatorDescriptor(spec, outputRecordDesc, fieldPermutation, idfh,
-                    missingWriterFactory, modificationCallbackFactory, searchCallbackFactory,
-                    dataset.getFrameOpCallbackFactory(), numKeys, itemType, fieldIdx, hasSecondaries);
-            return new Pair<>(op, splitsAndConstraint.second);
-        } catch (MetadataException me) {
-            throw new AlgebricksException(me);
+        // prepare callback
+        int[] primaryKeyFields = new int[numKeys];
+        for (int i = 0; i < numKeys; i++) {
+            primaryKeyFields[i] = i;
         }
+        boolean hasSecondaries =
+                metadataProvider.getDatasetIndexes(dataset.getDataverseName(), dataset.getDatasetName()).size() > 1;
+        IStorageComponentProvider storageComponentProvider = metadataProvider.getStorageComponentProvider();
+        IModificationOperationCallbackFactory modificationCallbackFactory = dataset.getModificationCallbackFactory(
+                storageComponentProvider, primaryIndex, IndexOperation.UPSERT, primaryKeyFields);
+        ISearchOperationCallbackFactory searchCallbackFactory = dataset.getSearchCallbackFactory(
+                storageComponentProvider, primaryIndex, IndexOperation.UPSERT, primaryKeyFields);
+        IIndexDataflowHelperFactory idfh =
+                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), splitsAndConstraint.first);
+        LSMPrimaryUpsertOperatorDescriptor op;
+        ITypeTraits[] outputTypeTraits =
+                new ITypeTraits[inputRecordDesc.getFieldCount() + (dataset.hasMetaPart() ? 2 : 1) + numFilterFields];
+        ISerializerDeserializer<?>[] outputSerDes = new ISerializerDeserializer[inputRecordDesc.getFieldCount()
+                + (dataset.hasMetaPart() ? 2 : 1) + numFilterFields];
+        IDataFormat dataFormat = metadataProvider.getDataFormat();
+
+        // add the previous record first
+        int f = 0;
+        outputSerDes[f] = dataFormat.getSerdeProvider().getSerializerDeserializer(itemType);
+        f++;
+        // add the previous meta second
+        if (dataset.hasMetaPart()) {
+            outputSerDes[f] = dataFormat.getSerdeProvider().getSerializerDeserializer(metaItemType);
+            outputTypeTraits[f] = dataFormat.getTypeTraitProvider().getTypeTrait(metaItemType);
+            f++;
+        }
+        // add the previous filter third
+        int fieldIdx = -1;
+        if (numFilterFields > 0) {
+            String filterField = DatasetUtil.getFilterField(dataset).get(0);
+            String[] fieldNames = itemType.getFieldNames();
+            int i = 0;
+            for (; i < fieldNames.length; i++) {
+                if (fieldNames[i].equals(filterField)) {
+                    break;
+                }
+            }
+            fieldIdx = i;
+            outputTypeTraits[f] = dataFormat.getTypeTraitProvider().getTypeTrait(itemType.getFieldTypes()[fieldIdx]);
+            outputSerDes[f] =
+                    dataFormat.getSerdeProvider().getSerializerDeserializer(itemType.getFieldTypes()[fieldIdx]);
+            f++;
+        }
+        for (int j = 0; j < inputRecordDesc.getFieldCount(); j++) {
+            outputTypeTraits[j + f] = inputRecordDesc.getTypeTraits()[j];
+            outputSerDes[j + f] = inputRecordDesc.getFields()[j];
+        }
+        RecordDescriptor outputRecordDesc = new RecordDescriptor(outputSerDes, outputTypeTraits);
+        op = new LSMPrimaryUpsertOperatorDescriptor(spec, outputRecordDesc, fieldPermutation, idfh,
+                missingWriterFactory, modificationCallbackFactory, searchCallbackFactory,
+                dataset.getFrameOpCallbackFactory(), numKeys, itemType, fieldIdx, hasSecondaries);
+        return new Pair<>(op, splitsAndConstraint.second);
     }
 
     /**
@@ -503,7 +491,7 @@
     }
 
     public static boolean isFullyQualifiedName(String datasetName) {
-        return datasetName.indexOf('.') > 0; //NOSONAR a fully qualified name can't start with a .
+        return datasetName.indexOf('.') > 0; // NOSONAR a fully qualified name can't start with a .
     }
 
     public static String getFullyQualifiedName(Dataset dataset) {
@@ -559,4 +547,19 @@
         MetadataManager.INSTANCE.addNodegroup(mdTxnCtx, new NodeGroup(nodeGroup, new ArrayList<>(ncNames)));
         return nodeGroup;
     }
+
+    // This doesn't work if the dataset  or the dataverse name contains a '.'
+    public static Pair<String, String> getDatasetInfo(MetadataProvider metadata, String datasetArg) {
+        String first;
+        String second;
+        int i = datasetArg.indexOf('.');
+        if (i > 0 && i < datasetArg.length() - 1) {
+            first = datasetArg.substring(0, i);
+            second = datasetArg.substring(i + 1);
+        } else {
+            first = metadata.getDefaultDataverse() == null ? null : metadata.getDefaultDataverse().getDataverseName();
+            second = datasetArg;
+        }
+        return new Pair<>(first, second);
+    }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ExternalIndexingOperations.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ExternalIndexingOperations.java
index 5bb0aa9..a3c3842 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ExternalIndexingOperations.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/ExternalIndexingOperations.java
@@ -25,8 +25,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.DatasetConfig.ExternalFilePendingOp;
@@ -75,9 +73,11 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
 import org.apache.hyracks.storage.common.IResourceFactory;
 import org.apache.hyracks.storage.common.IStorageManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalIndexingOperations {
-    private static final Logger LOGGER = Logger.getLogger(ExternalIndexingOperations.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final List<List<String>> FILE_INDEX_FIELD_NAMES =
             Collections.unmodifiableList(Collections.singletonList(Collections.singletonList("")));
     public static final List<IAType> FILE_INDEX_FIELD_TYPES =
@@ -141,7 +141,7 @@
             }
             return files;
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception while trying to get snapshot from external system", e);
+            LOGGER.warn("Exception while trying to get snapshot from external system", e);
             throw new AlgebricksException("Unable to get list of HDFS files " + e);
         }
     }
@@ -202,9 +202,9 @@
         IResourceFactory resourceFactory = dataset.getResourceFactory(metadataProvider, fileIndex, recordType, null,
                 mergePolicyFactory, mergePolicyProperties);
         IIndexBuilderFactory indexBuilderFactory = new IndexBuilderFactory(storageComponentProvider.getStorageManager(),
-                secondaryFileSplitProvider, resourceFactory, !dataset.isTemp());
-        IIndexDataflowHelperFactory dataflowHelperFactory =
-                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), secondaryFileSplitProvider);
+                secondaryFileSplitProvider, resourceFactory, true);
+        IIndexDataflowHelperFactory dataflowHelperFactory = new IndexDataflowHelperFactory(
+                storageComponentProvider.getStorageManager(), secondaryFileSplitProvider);
         ExternalFilesIndexCreateOperatorDescriptor externalFilesOp = new ExternalFilesIndexCreateOperatorDescriptor(
                 spec, indexBuilderFactory, dataflowHelperFactory, externalFilesSnapshot);
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, externalFilesOp,
@@ -221,8 +221,8 @@
         Pair<IFileSplitProvider, AlgebricksPartitionConstraint> secondarySplitsAndConstraint = metadataProvider
                 .getSplitProviderAndConstraints(dataset, IndexingConstants.getFilesIndexName(dataset.getDatasetName()));
         IFileSplitProvider secondaryFileSplitProvider = secondarySplitsAndConstraint.first;
-        IIndexDataflowHelperFactory dataflowHelperFactory =
-                new IndexDataflowHelperFactory(storageComponentProvider.getStorageManager(), secondaryFileSplitProvider);
+        IIndexDataflowHelperFactory dataflowHelperFactory = new IndexDataflowHelperFactory(
+                storageComponentProvider.getStorageManager(), secondaryFileSplitProvider);
         ExternalFilesIndexModificationOperatorDescriptor externalFilesOp =
                 new ExternalFilesIndexModificationOperatorDescriptor(spec, dataflowHelperFactory,
                         externalFilesSnapshot);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
index cc6923e..eb14bae 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
@@ -18,7 +18,7 @@
  */
 package org.apache.asterix.metadata.utils;
 
-import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.*;
+import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
 
 import java.util.EnumSet;
 import java.util.List;
@@ -28,20 +28,18 @@
 import org.apache.asterix.common.config.OptimizationConfUtil;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.external.indexing.ExternalFile;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
-import org.apache.asterix.transaction.management.service.transaction.JobIdFactory;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.rewriter.base.PhysicalOptimizationConfig;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
 import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.api.job.JobSpecification;
-import org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor;
 
 public class IndexUtil {
 
@@ -162,13 +160,13 @@
      *            the metadata provider.
      * @return the AsterixDB job id for transaction management.
      */
-    public static JobId bindJobEventListener(JobSpecification spec, MetadataProvider metadataProvider) {
-        JobId jobId = JobIdFactory.generateJobId();
-        metadataProvider.setJobId(jobId);
+    public static void bindJobEventListener(JobSpecification spec, MetadataProvider metadataProvider)
+            throws AlgebricksException {
+        TxnId txnId = metadataProvider.getTxnIdFactory().create();
+        metadataProvider.setTxnId(txnId);
         boolean isWriteTransaction = metadataProvider.isWriteTransaction();
-        IJobletEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(jobId, isWriteTransaction);
+        IJobletEventListenerFactory jobEventListenerFactory = new JobEventListenerFactory(txnId, isWriteTransaction);
         spec.setJobletEventListenerFactory(jobEventListenerFactory);
-        return jobId;
     }
 
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java
index 362305e..43cc0ec 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/InvertedIndexResourceFactoryProvider.java
@@ -110,7 +110,6 @@
         AsterixVirtualBufferCacheProvider vbcProvider = new AsterixVirtualBufferCacheProvider(dataset.getDatasetId());
         ILSMIOOperationSchedulerProvider ioSchedulerProvider =
                 storageComponentProvider.getIoOperationSchedulerProvider();
-        boolean durable = !dataset.isTemp();
         double bloomFilterFalsePositiveRate = mdProvider.getStorageProperties().getBloomFilterFalsePositiveRate();
         ITypeTraits[] typeTraits = getInvListTypeTraits(mdProvider, dataset, recordType, metaType);
         IBinaryComparatorFactory[] cmpFactories =
@@ -122,7 +121,7 @@
         return new LSMInvertedIndexLocalResourceFactory(storageManager, typeTraits, cmpFactories, filterTypeTraits,
                 filterCmpFactories, secondaryFilterFields, opTrackerFactory, ioOpCallbackFactory,
                 metadataPageManagerFactory, vbcProvider, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties,
-                durable, tokenTypeTraits, tokenCmpFactories, tokenizerFactory, isPartitioned, invertedIndexFields,
+                true, tokenTypeTraits, tokenCmpFactories, tokenizerFactory, isPartitioned, invertedIndexFields,
                 secondaryFilterFieldsForNonBulkLoadOps, invertedIndexFieldsForNonBulkLoadOps,
                 bloomFilterFalsePositiveRate);
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java
index 4cf25f7..baac712 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/MetadataLockUtil.java
@@ -19,8 +19,8 @@
 package org.apache.asterix.metadata.utils;
 
 import org.apache.asterix.common.api.IMetadataLockManager;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.LockList;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 public class MetadataLockUtil {
 
@@ -30,7 +30,7 @@
     public static void createDatasetBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
             String itemTypeDataverseName, String itemTypeFullyQualifiedName, String metaItemTypeDataverseName,
             String metaItemTypeFullyQualifiedName, String nodeGroupName, String compactionPolicyName,
-            String datasetFullyQualifiedName, boolean isDefaultCompactionPolicy) throws AsterixException {
+            String datasetFullyQualifiedName, boolean isDefaultCompactionPolicy) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         if (!dataverseName.equals(itemTypeDataverseName)) {
             lockMgr.acquireDataverseReadLock(locks, itemTypeDataverseName);
@@ -54,113 +54,113 @@
     }
 
     public static void createIndexBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetCreateIndexLock(locks, datasetFullyQualifiedName);
     }
 
     public static void dropIndexBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetWriteLock(locks, datasetFullyQualifiedName);
     }
 
     public static void createTypeBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String itemTypeFullyQualifiedName) throws AsterixException {
+            String itemTypeFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDataTypeWriteLock(locks, itemTypeFullyQualifiedName);
     }
 
     public static void dropDatasetBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetWriteLock(locks, datasetFullyQualifiedName);
     }
 
     public static void dropTypeBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String dataTypeFullyQualifiedName) throws AsterixException {
+            String dataTypeFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDataTypeWriteLock(locks, dataTypeFullyQualifiedName);
     }
 
     public static void functionStatementBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String functionFullyQualifiedName) throws AsterixException {
+            String functionFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireFunctionWriteLock(locks, functionFullyQualifiedName);
     }
 
     public static void modifyDatasetBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetModifyLock(locks, datasetFullyQualifiedName);
     }
 
     public static void insertDeleteUpsertBegin(IMetadataLockManager lockMgr, LockList locks,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks,
                 MetadataUtil.getDataverseFromFullyQualifiedName(datasetFullyQualifiedName));
         lockMgr.acquireDatasetModifyLock(locks, datasetFullyQualifiedName);
     }
 
     public static void dropFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String feedFullyQualifiedName) throws AsterixException {
+            String feedFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityWriteLock(locks, feedFullyQualifiedName);
     }
 
     public static void dropFeedPolicyBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String policyName) throws AsterixException {
+            String policyName) throws AlgebricksException {
         lockMgr.acquireActiveEntityWriteLock(locks, policyName);
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
     }
 
     public static void startFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String feedName) throws AsterixException {
+            String feedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityReadLock(locks, feedName);
     }
 
     public static void stopFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String feedName) throws AsterixException {
+            String feedName) throws AlgebricksException {
         // TODO: dataset lock?
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityReadLock(locks, feedName);
     }
 
     public static void createFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String feedFullyQualifiedName) throws AsterixException {
+            String feedFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityWriteLock(locks, feedFullyQualifiedName);
     }
 
     public static void connectFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName, String feedFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName, String feedFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityReadLock(locks, feedFullyQualifiedName);
         lockMgr.acquireDatasetReadLock(locks, datasetFullyQualifiedName);
     }
 
     public static void createFeedPolicyBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String policyName) throws AsterixException {
+            String policyName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireFeedPolicyWriteLock(locks, policyName);
     }
 
     public static void disconnectFeedBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName, String feedFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName, String feedFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireActiveEntityReadLock(locks, feedFullyQualifiedName);
         lockMgr.acquireDatasetReadLock(locks, datasetFullyQualifiedName);
     }
 
     public static void compactBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetReadLock(locks, datasetFullyQualifiedName);
     }
 
     public static void refreshDatasetBegin(IMetadataLockManager lockMgr, LockList locks, String dataverseName,
-            String datasetFullyQualifiedName) throws AsterixException {
+            String datasetFullyQualifiedName) throws AlgebricksException {
         lockMgr.acquireDataverseReadLock(locks, dataverseName);
         lockMgr.acquireDatasetExclusiveModificationLock(locks, datasetFullyQualifiedName);
     }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/RTreeResourceFactoryProvider.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/RTreeResourceFactoryProvider.java
index 425f8a1d..5075adc 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/RTreeResourceFactoryProvider.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/RTreeResourceFactoryProvider.java
@@ -142,7 +142,6 @@
                 storageComponentProvider.getMetadataPageManagerFactory();
         ILSMIOOperationSchedulerProvider ioSchedulerProvider =
                 storageComponentProvider.getIoOperationSchedulerProvider();
-        boolean durable = !dataset.isTemp();
         ILinearizeComparatorFactory linearizeCmpFactory =
                 MetadataProvider.proposeLinearizer(keyType, secondaryComparatorFactories.length);
         ITypeTraits[] typeTraits = getTypeTraits(mdProvider, dataset, index, recordType, metaType);
@@ -159,12 +158,12 @@
             return new LSMRTreeWithAntiMatterLocalResourceFactory(storageManager, typeTraits, rtreeCmpFactories,
                     filterTypeTraits, filterCmpFactories, secondaryFilterFields, opTrackerFactory, ioOpCallbackFactory,
                     metadataPageManagerFactory, vbcProvider, ioSchedulerProvider, mergePolicyFactory,
-                    mergePolicyProperties, durable, valueProviderFactories, rTreePolicyType, linearizeCmpFactory,
+                    mergePolicyProperties, true, valueProviderFactories, rTreePolicyType, linearizeCmpFactory,
                     rtreeFields, isPointMBR, btreeCompFactories);
         } else {
             return new ExternalRTreeLocalResourceFactory(storageManager, typeTraits, rtreeCmpFactories,
                     filterTypeTraits, filterCmpFactories, secondaryFilterFields, opTrackerFactory, ioOpCallbackFactory,
-                    metadataPageManagerFactory, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties, durable,
+                    metadataPageManagerFactory, ioSchedulerProvider, mergePolicyFactory, mergePolicyProperties, true,
                     btreeCompFactories, valueProviderFactories, rTreePolicyType, linearizeCmpFactory, rtreeFields,
                     new int[] { numNestedSecondaryKeyFields }, isPointMBR,
                     mdProvider.getStorageProperties().getBloomFilterFalsePositiveRate());
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
index 78d9c19..cf6338a 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
@@ -22,7 +22,6 @@
 
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.external.indexing.IndexingConstants;
 import org.apache.asterix.external.operators.ExternalScanOperatorDescriptor;
 import org.apache.asterix.metadata.declared.MetadataProvider;
@@ -126,51 +125,57 @@
             spec.setConnectorPolicyAssignmentPolicy(new ConnectorPolicyAssignmentPolicy());
             return spec;
         } else {
-            // Create dummy key provider for feeding the primary index scan.
-            IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset,
-                    metadataProvider);
-            JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+            // job spec:
+            // key provider -> primary idx -> (cast assign)? -> assign -> (select)? -> (sort)? -> bulk load -> sink
+            IndexUtil.bindJobEventListener(spec, metadataProvider);
 
-            // Create primary index scan op.
-            IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset,
-                    jobId);
+            // dummy key provider ----> primary index scan
+            IOperatorDescriptor sourceOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
+            IOperatorDescriptor targetOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset);
+            spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
 
-            // Assign op.
-            IOperatorDescriptor sourceOp = primaryScanOp;
+            sourceOp = targetOp;
             if (isOverridingKeyFieldTypes && !enforcedItemType.equals(itemType)) {
-                sourceOp = createCastOp(spec, dataset.getDatasetType(), index.isEnforced());
-                spec.connect(new OneToOneConnectorDescriptor(spec), primaryScanOp, 0, sourceOp, 0);
+                // primary index scan ----> cast assign
+                targetOp = createCastOp(spec, dataset.getDatasetType(), index.isEnforced());
+                spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
+                sourceOp = targetOp;
             }
-            AlgebricksMetaOperatorDescriptor asterixAssignOp =
-                    createAssignOp(spec, index.getKeyFieldNames().size(), secondaryRecDesc);
+            // primary index OR cast assign ----> assign op
+            targetOp = createAssignOp(spec, index.getKeyFieldNames().size(), secondaryRecDesc);
+            spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
 
-            // If any of the secondary fields are nullable, then add a select op that filters nulls.
-            AlgebricksMetaOperatorDescriptor selectOp = null;
+            sourceOp = targetOp;
             if (anySecondaryKeyIsNullable || isOverridingKeyFieldTypes) {
-                selectOp = createFilterNullsSelectOp(spec, index.getKeyFieldNames().size(), secondaryRecDesc);
+                // if any of the secondary fields are nullable, then add a select op that filters nulls.
+                // assign op ----> select op
+                targetOp = createFilterNullsSelectOp(spec, index.getKeyFieldNames().size(), secondaryRecDesc);
+                spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
+                sourceOp = targetOp;
             }
 
-            // Sort by secondary keys.
-            ExternalSortOperatorDescriptor sortOp = createSortOp(spec, secondaryComparatorFactories, secondaryRecDesc);
-            // Create secondary BTree bulk load op.
-            TreeIndexBulkLoadOperatorDescriptor secondaryBulkLoadOp = createTreeIndexBulkLoadOp(spec, fieldPermutation,
-                    dataflowHelperFactory, GlobalConfig.DEFAULT_TREE_FILL_FACTOR);
+            // no need to sort if the index is secondary primary index
+            if (!index.getKeyFieldNames().isEmpty()) {
+                // sort by secondary keys.
+                // assign op OR select op ----> sort op
+                targetOp = createSortOp(spec, secondaryComparatorFactories, secondaryRecDesc);
+                spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
+                sourceOp = targetOp;
+            }
 
-            AlgebricksMetaOperatorDescriptor metaOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
+            // assign op OR select op OR sort op ----> bulk load op
+            targetOp = createTreeIndexBulkLoadOp(spec, fieldPermutation, dataflowHelperFactory,
+                    GlobalConfig.DEFAULT_TREE_FILL_FACTOR);
+            spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
+
+            // bulk load op ----> sink op
+            sourceOp = targetOp;
+            targetOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                     new IPushRuntimeFactory[] { new SinkRuntimeFactory() },
                     new RecordDescriptor[] { secondaryRecDesc });
-            // Connect the operators.
-            spec.connect(new OneToOneConnectorDescriptor(spec), keyProviderOp, 0, primaryScanOp, 0);
-            spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, asterixAssignOp, 0);
-            if (anySecondaryKeyIsNullable || isOverridingKeyFieldTypes) {
-                spec.connect(new OneToOneConnectorDescriptor(spec), asterixAssignOp, 0, selectOp, 0);
-                spec.connect(new OneToOneConnectorDescriptor(spec), selectOp, 0, sortOp, 0);
-            } else {
-                spec.connect(new OneToOneConnectorDescriptor(spec), asterixAssignOp, 0, sortOp, 0);
-            }
-            spec.connect(new OneToOneConnectorDescriptor(spec), sortOp, 0, secondaryBulkLoadOp, 0);
-            spec.connect(new OneToOneConnectorDescriptor(spec), secondaryBulkLoadOp, 0, metaOp, 0);
-            spec.addRoot(metaOp);
+            spec.connect(new OneToOneConnectorDescriptor(spec), sourceOp, 0, targetOp, 0);
+
+            spec.addRoot(targetOp);
             spec.setConnectorPolicyAssignmentPolicy(new ConnectorPolicyAssignmentPolicy());
             return spec;
         }
@@ -199,7 +204,6 @@
      *      ====== ========= ........ ........
      */
     @Override
-    @SuppressWarnings("rawtypes")
     protected void setSecondaryRecDescAndComparators() throws AlgebricksException {
         int numSecondaryKeys = index.getKeyFieldNames().size();
         secondaryFieldAccessEvalFactories = new IScalarEvaluatorFactory[numSecondaryKeys + numFilterFields];
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
index 8ef5f34..7791cad 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedBTreeOperationsHelper.java
@@ -21,7 +21,6 @@
 import java.util.List;
 
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
@@ -72,14 +71,14 @@
 
         // only handle internal datasets
         // Create dummy key provider for feeding the primary index scan.
-        JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+        IndexUtil.bindJobEventListener(spec, metadataProvider);
 
         // Create dummy key provider for feeding the primary index scan.
         IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
 
         // Create primary index scan op.
         IOperatorDescriptor primaryScanOp = createPrimaryIndexScanDiskComponentsOp(spec, metadataProvider,
-                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)), jobId);
+                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)));
 
         // Assign op.
         IOperatorDescriptor sourceOp = primaryScanOp;
@@ -124,7 +123,6 @@
     }
 
     @Override
-    @SuppressWarnings("rawtypes")
     protected void setSecondaryRecDescAndComparators() throws AlgebricksException {
         int numSecondaryKeys = index.getKeyFieldNames().size();
         secondaryFieldAccessEvalFactories = new IScalarEvaluatorFactory[numSecondaryKeys + numFilterFields];
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
index 262b259..b91d65f 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedInvertedIndexOperationsHelper.java
@@ -21,7 +21,6 @@
 import org.apache.asterix.common.config.DatasetConfig.IndexType;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -79,7 +78,6 @@
     }
 
     @Override
-    @SuppressWarnings("rawtypes")
     protected void setSecondaryRecDescAndComparators() throws AlgebricksException {
         int numSecondaryKeys = index.getKeyFieldNames().size();
         IndexType indexType = index.getIndexType();
@@ -206,14 +204,14 @@
     @Override
     public JobSpecification buildLoadingJobSpec() throws AlgebricksException {
         JobSpecification spec = RuntimeUtils.createJobSpecification(metadataProvider.getApplicationContext());
-        JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+        IndexUtil.bindJobEventListener(spec, metadataProvider);
 
         // Create dummy key provider for feeding the primary index scan.
         IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
 
         // Create primary index scan op.
         IOperatorDescriptor primaryScanOp = createPrimaryIndexScanDiskComponentsOp(spec, metadataProvider,
-                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)), jobId);
+                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)));
 
         IOperatorDescriptor sourceOp = primaryScanOp;
         boolean isOverridingKeyFieldTypes = index.isOverridingKeyFieldTypes();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
index b663b42..bf5178c 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedRTreeOperationsHelper.java
@@ -23,7 +23,6 @@
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.formats.nontagged.TypeTraitProvider;
@@ -52,7 +51,6 @@
 import org.apache.hyracks.dataflow.std.sort.ExternalSortOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory;
 
-@SuppressWarnings("rawtypes")
 public class SecondaryCorrelatedRTreeOperationsHelper extends SecondaryCorrelatedTreeIndexOperationsHelper {
 
     protected IPrimitiveValueProviderFactory[] valueProviderFactories;
@@ -155,7 +153,7 @@
     }
 
     @Override
-    public JobSpecification buildLoadingJobSpec() throws AsterixException, AlgebricksException {
+    public JobSpecification buildLoadingJobSpec() throws AlgebricksException {
         /***************************************************
          * [ About PointMBR Optimization ]
          * Instead of storing a MBR(4 doubles) for a point(2 doubles) in RTree leaf node,
@@ -184,11 +182,11 @@
 
         // Create dummy key provider for feeding the primary index scan.
         IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
-        JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+        IndexUtil.bindJobEventListener(spec, metadataProvider);
 
         // Create primary index scan op.
         IOperatorDescriptor primaryScanOp = createPrimaryIndexScanDiskComponentsOp(spec, metadataProvider,
-                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)), jobId);
+                getTaggedRecordDescriptor(dataset.getPrimaryRecordDescriptor(metadataProvider)));
 
         // Assign op.
         IOperatorDescriptor sourceOp = primaryScanOp;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java
index b99ae2f..48982c0 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryCorrelatedTreeIndexOperationsHelper.java
@@ -24,14 +24,11 @@
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.transactions.IRecoveryManager;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
-import org.apache.asterix.om.functions.BuiltinFunctions;
-import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.runtime.operators.LSMSecondaryIndexBulkLoadOperatorDescriptor;
 import org.apache.asterix.runtime.operators.LSMSecondaryIndexCreationTupleProcessorOperatorDescriptor;
 import org.apache.asterix.transaction.management.opcallbacks.PrimaryIndexInstantSearchOperationCallbackFactory;
@@ -58,7 +55,6 @@
 import org.apache.hyracks.dataflow.std.sort.ExternalSortOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.btree.dataflow.LSMBTreeDiskComponentScanOperatorDescriptor;
 
 /**
@@ -105,7 +101,6 @@
     }
 
     protected RecordDescriptor getTaggedRecordDescriptor(RecordDescriptor recDescriptor) {
-        @SuppressWarnings("rawtypes")
         ISerializerDeserializer[] fields =
                 new ISerializerDeserializer[recDescriptor.getFields().length + NUM_TAG_FIELDS];
         ITypeTraits[] traits = null;
@@ -268,21 +263,19 @@
 
         LSMSecondaryIndexBulkLoadOperatorDescriptor treeIndexBulkLoadOp =
                 new LSMSecondaryIndexBulkLoadOperatorDescriptor(spec, taggedSecondaryRecDesc, primaryIndexHelperFactory,
-                        secondaryIndexHelperFactory, fieldPermutation, NUM_TAG_FIELDS, numSecondaryKeys,
-                        numPrimaryKeys, hasBuddyBtree);
+                        secondaryIndexHelperFactory, fieldPermutation, NUM_TAG_FIELDS, numSecondaryKeys, numPrimaryKeys,
+                        hasBuddyBtree);
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, treeIndexBulkLoadOp,
                 secondaryPartitionConstraint);
         return treeIndexBulkLoadOp;
     }
 
     protected IOperatorDescriptor createPrimaryIndexScanDiskComponentsOp(JobSpecification spec,
-            MetadataProvider metadataProvider, RecordDescriptor outRecDesc, JobId jobId) throws AlgebricksException {
+            MetadataProvider metadataProvider, RecordDescriptor outRecDesc) throws AlgebricksException {
         ITransactionSubsystemProvider txnSubsystemProvider = TransactionSubsystemProvider.INSTANCE;
-        boolean temp = dataset.getDatasetDetails().isTemp();
-        ISearchOperationCallbackFactory searchCallbackFactory = temp ? NoOpOperationCallbackFactory.INSTANCE
-                : new PrimaryIndexInstantSearchOperationCallbackFactory(jobId, dataset.getDatasetId(),
-                        dataset.getPrimaryBloomFilterFields(), txnSubsystemProvider,
-                        IRecoveryManager.ResourceType.LSM_BTREE);
+        ISearchOperationCallbackFactory searchCallbackFactory = new PrimaryIndexInstantSearchOperationCallbackFactory(
+                dataset.getDatasetId(), dataset.getPrimaryBloomFilterFields(), txnSubsystemProvider,
+                IRecoveryManager.ResourceType.LSM_BTREE);
         IndexDataflowHelperFactory indexHelperFactory = new IndexDataflowHelperFactory(
                 metadataProvider.getStorageComponentProvider().getStorageManager(), primaryFileSplitProvider);
         LSMBTreeDiskComponentScanOperatorDescriptor primaryScanOp = new LSMBTreeDiskComponentScanOperatorDescriptor(
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
index 5dac407..065eb72 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryIndexOperationsHelper.java
@@ -19,8 +19,6 @@
 
 package org.apache.asterix.metadata.utils;
 
-import static org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
-
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -51,6 +49,8 @@
 import org.apache.asterix.runtime.evaluators.functions.AndDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsUnknownDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.NotDescriptor;
+import org.apache.asterix.runtime.operators.LSMIndexBulkLoadOperatorDescriptor;
+import org.apache.asterix.runtime.operators.LSMIndexBulkLoadOperatorDescriptor.BulkLoadUsage;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraintHelper;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -71,6 +71,8 @@
 import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
 import org.apache.hyracks.dataflow.std.sort.ExternalSortOperatorDescriptor;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.dataflow.IndexDropOperatorDescriptor.DropOption;
 import org.apache.hyracks.storage.am.common.dataflow.TreeIndexBulkLoadOperatorDescriptor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicyFactory;
 
@@ -124,8 +126,8 @@
         this.index = index;
         this.physOptConf = physOptConf;
         this.metadataProvider = metadataProvider;
-        this.itemType = (ARecordType) metadataProvider.findType(dataset.getItemTypeDataverseName(),
-                dataset.getItemTypeName());
+        this.itemType =
+                (ARecordType) metadataProvider.findType(dataset.getItemTypeDataverseName(), dataset.getItemTypeName());
         this.metaType = DatasetUtil.getMetaType(metadataProvider, dataset);
         Pair<ARecordType, ARecordType> enforcedTypes = getEnforcedType(index, itemType, metaType);
         this.enforcedItemType = enforcedTypes.first;
@@ -145,19 +147,19 @@
         SecondaryIndexOperationsHelper indexOperationsHelper;
         switch (index.getIndexType()) {
             case BTREE:
-                indexOperationsHelper = new SecondaryBTreeOperationsHelper(dataset, index, physOptConf,
-                        metadataProvider);
+                indexOperationsHelper =
+                        new SecondaryBTreeOperationsHelper(dataset, index, physOptConf, metadataProvider);
                 break;
             case RTREE:
-                indexOperationsHelper = new SecondaryRTreeOperationsHelper(dataset, index, physOptConf,
-                        metadataProvider);
+                indexOperationsHelper =
+                        new SecondaryRTreeOperationsHelper(dataset, index, physOptConf, metadataProvider);
                 break;
             case SINGLE_PARTITION_WORD_INVIX:
             case SINGLE_PARTITION_NGRAM_INVIX:
             case LENGTH_PARTITIONED_WORD_INVIX:
             case LENGTH_PARTITIONED_NGRAM_INVIX:
-                indexOperationsHelper = new SecondaryInvertedIndexOperationsHelper(dataset, index, physOptConf,
-                        metadataProvider);
+                indexOperationsHelper =
+                        new SecondaryInvertedIndexOperationsHelper(dataset, index, physOptConf, metadataProvider);
                 break;
             default:
                 throw new CompilationException(ErrorCode.COMPILATION_UNKNOWN_INDEX_TYPE, index.getIndexType());
@@ -263,7 +265,6 @@
 
     protected abstract void setSecondaryRecDescAndComparators() throws AlgebricksException;
 
-
     protected AlgebricksMetaOperatorDescriptor createAssignOp(JobSpecification spec, int numSecondaryKeyFields,
             RecordDescriptor secondaryRecDesc) throws AlgebricksException {
         int[] outColumns = new int[numSecondaryKeyFields + numFilterFields];
@@ -341,11 +342,15 @@
         return sortOp;
     }
 
-    protected TreeIndexBulkLoadOperatorDescriptor createTreeIndexBulkLoadOp(JobSpecification spec,
+    protected LSMIndexBulkLoadOperatorDescriptor createTreeIndexBulkLoadOp(JobSpecification spec,
             int[] fieldPermutation, IIndexDataflowHelperFactory dataflowHelperFactory, float fillFactor)
             throws AlgebricksException {
-        TreeIndexBulkLoadOperatorDescriptor treeIndexBulkLoadOp = new TreeIndexBulkLoadOperatorDescriptor(spec,
-                secondaryRecDesc, fieldPermutation, fillFactor, false, numElementsHint, false, dataflowHelperFactory);
+        IndexDataflowHelperFactory primaryIndexDataflowHelperFactory = new IndexDataflowHelperFactory(
+                metadataProvider.getStorageComponentProvider().getStorageManager(), primaryFileSplitProvider);
+
+        LSMIndexBulkLoadOperatorDescriptor treeIndexBulkLoadOp = new LSMIndexBulkLoadOperatorDescriptor(spec,
+                secondaryRecDesc, fieldPermutation, fillFactor, false, numElementsHint, false, dataflowHelperFactory,
+                primaryIndexDataflowHelperFactory, BulkLoadUsage.CREATE_INDEX, dataset.getDatasetId());
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, treeIndexBulkLoadOp,
                 secondaryPartitionConstraint);
         return treeIndexBulkLoadOp;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
index 077e431..d31ca3b 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryInvertedIndexOperationsHelper.java
@@ -22,7 +22,6 @@
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.dataflow.data.nontagged.MissingWriterFactory;
 import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
@@ -82,7 +81,6 @@
     }
 
     @Override
-    @SuppressWarnings("rawtypes")
     protected void setSecondaryRecDescAndComparators() throws AlgebricksException {
         int numSecondaryKeys = index.getKeyFieldNames().size();
         IndexType indexType = index.getIndexType();
@@ -208,14 +206,13 @@
     @Override
     public JobSpecification buildLoadingJobSpec() throws AlgebricksException {
         JobSpecification spec = RuntimeUtils.createJobSpecification(metadataProvider.getApplicationContext());
-        JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+        IndexUtil.bindJobEventListener(spec, metadataProvider);
 
         // Create dummy key provider for feeding the primary index scan.
         IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
 
         // Create primary index scan op.
-        IOperatorDescriptor primaryScanOp =
-                DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset, jobId);
+        IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset);
 
         IOperatorDescriptor sourceOp = primaryScanOp;
         boolean isOverridingKeyFieldTypes = index.isOverridingKeyFieldTypes();
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
index 1726470..8e6e0e9 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryRTreeOperationsHelper.java
@@ -23,7 +23,6 @@
 import org.apache.asterix.common.config.DatasetConfig.DatasetType;
 import org.apache.asterix.common.config.GlobalConfig;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.external.indexing.IndexingConstants;
 import org.apache.asterix.external.operators.ExternalScanOperatorDescriptor;
 import org.apache.asterix.formats.nontagged.BinaryComparatorFactoryProvider;
@@ -58,7 +57,6 @@
 import org.apache.hyracks.storage.am.common.dataflow.IndexDataflowHelperFactory;
 import org.apache.hyracks.storage.am.common.dataflow.TreeIndexBulkLoadOperatorDescriptor;
 
-@SuppressWarnings("rawtypes")
 public class SecondaryRTreeOperationsHelper extends SecondaryTreeIndexOperationsHelper {
 
     protected IPrimitiveValueProviderFactory[] valueProviderFactories;
@@ -172,7 +170,7 @@
     }
 
     @Override
-    public JobSpecification buildLoadingJobSpec() throws AsterixException, AlgebricksException {
+    public JobSpecification buildLoadingJobSpec() throws AlgebricksException {
         /***************************************************
          * [ About PointMBR Optimization ]
          * Instead of storing a MBR(4 doubles) for a point(2 doubles) in RTree leaf node,
@@ -201,11 +199,10 @@
         if (dataset.getDatasetType() == DatasetType.INTERNAL) {
             // Create dummy key provider for feeding the primary index scan.
             IOperatorDescriptor keyProviderOp = DatasetUtil.createDummyKeyProviderOp(spec, dataset, metadataProvider);
-            JobId jobId = IndexUtil.bindJobEventListener(spec, metadataProvider);
+            IndexUtil.bindJobEventListener(spec, metadataProvider);
 
             // Create primary index scan op.
-            IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset,
-                    jobId);
+            IOperatorDescriptor primaryScanOp = DatasetUtil.createPrimaryIndexScanOp(spec, metadataProvider, dataset);
 
             // Assign op.
             IOperatorDescriptor sourceOp = primaryScanOp;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryTreeIndexOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryTreeIndexOperationsHelper.java
index b63ea16..185cf8c 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryTreeIndexOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryTreeIndexOperationsHelper.java
@@ -59,7 +59,7 @@
         IResourceFactory resourceFactory = dataset.getResourceFactory(metadataProvider, index, itemType, metaType,
                 mergePolicyFactory, mergePolicyProperties);
         IIndexBuilderFactory indexBuilderFactory = new IndexBuilderFactory(storageComponentProvider.getStorageManager(),
-                secondaryFileSplitProvider, resourceFactory, !dataset.isTemp());
+                secondaryFileSplitProvider, resourceFactory, true);
         IndexCreateOperatorDescriptor secondaryIndexCreateOp =
                 new IndexCreateOperatorDescriptor(spec, indexBuilderFactory);
         AlgebricksPartitionConstraintHelper.setPartitionConstraintInJobSpec(spec, secondaryIndexCreateOp,
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
index 5b7ea59..8ac69e4 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SplitsAndConstraintsUtil.java
@@ -20,11 +20,12 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.asterix.metadata.MetadataManager;
@@ -43,29 +44,26 @@
     }
 
     private static FileSplit[] getDataverseSplits(IClusterStateManager clusterStateManager, String dataverseName) {
-        File relPathFile = new File(dataverseName);
         List<FileSplit> splits = new ArrayList<>();
         // get all partitions
         ClusterPartition[] clusterPartition = clusterStateManager.getClusterPartitons();
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
         for (int j = 0; j < clusterPartition.length; j++) {
-            File f = new File(
-                    StoragePathUtil.prepareStoragePartitionPath(storageDirName, clusterPartition[j].getPartitionId())
-                            + File.separator + relPathFile);
+            File f = new File(StoragePathUtil.prepareStoragePartitionPath(clusterPartition[j].getPartitionId()),
+                    dataverseName);
             splits.add(StoragePathUtil.getFileSplitForClusterPartition(clusterPartition[j], f.getPath()));
         }
         return splits.toArray(new FileSplit[] {});
     }
 
-    public static FileSplit[] getIndexSplits(IClusterStateManager clusterStateManager, Dataset dataset,
-            String indexName, MetadataTransactionContext mdTxnCtx) throws AlgebricksException {
+    public static FileSplit[] getIndexSplits(Dataset dataset, String indexName, MetadataTransactionContext mdTxnCtx,
+            IClusterStateManager csm) throws AlgebricksException {
         try {
             NodeGroup nodeGroup = MetadataManager.INSTANCE.getNodegroup(mdTxnCtx, dataset.getNodeGroupName());
             if (nodeGroup == null) {
                 throw new AlgebricksException("Couldn't find node group " + dataset.getNodeGroupName());
             }
             List<String> nodeList = nodeGroup.getNodeNames();
-            return getIndexSplits(clusterStateManager, dataset, indexName, nodeList);
+            return getIndexSplits(csm, dataset, indexName, nodeList);
         } catch (MetadataException me) {
             throw new AlgebricksException(me);
         }
@@ -73,26 +71,13 @@
 
     public static FileSplit[] getIndexSplits(IClusterStateManager clusterStateManager, Dataset dataset,
             String indexName, List<String> nodes) {
-        File relPathFile = new File(StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
-                dataset.getDatasetName(), indexName, dataset.getRebalanceCount()));
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        List<FileSplit> splits = new ArrayList<>();
-        for (String nd : nodes) {
-            int numPartitions = clusterStateManager.getNodePartitionsCount(nd);
-            ClusterPartition[] nodePartitions = clusterStateManager.getNodePartitions(nd);
-            // currently this case is never executed since the metadata group doesn't exists
-            if (dataset.getNodeGroupName().compareTo(MetadataConstants.METADATA_NODEGROUP_NAME) == 0) {
-                numPartitions = 1;
-            }
-
-            for (int k = 0; k < numPartitions; k++) {
-                // format: 'storage dir name'/partition_#/dataverse/dataset_idx_index
-                File f = new File(StoragePathUtil.prepareStoragePartitionPath(storageDirName,
-                        nodePartitions[k].getPartitionId())
-                        + (dataset.isTemp() ? (File.separator + StoragePathUtil.TEMP_DATASETS_STORAGE_FOLDER) : "")
-                        + File.separator + relPathFile);
-                splits.add(StoragePathUtil.getFileSplitForClusterPartition(nodePartitions[k], f.getPath()));
-            }
+        final String relPath = StoragePathUtil.prepareDataverseIndexName(dataset.getDataverseName(),
+                dataset.getDatasetName(), indexName, dataset.getRebalanceCount());
+        final List<ClusterPartition> datasetPartitions = getDatasetPartitions(clusterStateManager, dataset, nodes);
+        final List<FileSplit> splits = new ArrayList<>();
+        for (ClusterPartition partition : datasetPartitions) {
+            File f = new File(StoragePathUtil.prepareStoragePartitionPath(partition.getPartitionId()), relPath);
+            splits.add(StoragePathUtil.getFileSplitForClusterPartition(partition, f.getPath()));
         }
         return splits.toArray(new FileSplit[] {});
     }
@@ -103,9 +88,16 @@
         return StoragePathUtil.splitProviderAndPartitionConstraints(splits);
     }
 
-    public static String getIndexPath(String partitionPath, int partition, String dataverse, String fullIndexName) {
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        return partitionPath + StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition) + File.separator
-                + StoragePathUtil.prepareDataverseIndexName(dataverse, fullIndexName);
+    private static List<ClusterPartition> getDatasetPartitions(IClusterStateManager clusterStateManager,
+            Dataset dataset, List<String> nodes) {
+        if (dataset.getNodeGroupName().compareTo(MetadataConstants.METADATA_NODEGROUP_NAME) == 0) {
+            return Collections.singletonList(clusterStateManager.getMetadataPartition());
+        }
+        final List<ClusterPartition> datasetPartitions = new ArrayList<>();
+        for (String node : nodes) {
+            final ClusterPartition[] nodePartitions = clusterStateManager.getNodePartitions(node);
+            datasetPartitions.addAll(Arrays.asList(nodePartitions));
+        }
+        return datasetPartitions;
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/MetadataEntityValueExtractor.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/MetadataEntityValueExtractor.java
index ff65994..54d94a9 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/MetadataEntityValueExtractor.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/MetadataEntityValueExtractor.java
@@ -21,10 +21,10 @@
 
 import java.rmi.RemoteException;
 
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.metadata.api.IMetadataEntityTupleTranslator;
 import org.apache.asterix.metadata.api.IValueExtractor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
@@ -39,8 +39,8 @@
     }
 
     @Override
-    public T getValue(JobId jobId, ITupleReference tuple)
-            throws MetadataException, HyracksDataException, RemoteException {
+    public T getValue(TxnId txnId, ITupleReference tuple)
+            throws AlgebricksException, HyracksDataException, RemoteException {
         return tupleReaderWriter.getMetadataEntityFromTuple(tuple);
     }
 }
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/NestedDatatypeNameValueExtractor.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/NestedDatatypeNameValueExtractor.java
index 5f0525b..cf02930 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/NestedDatatypeNameValueExtractor.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/NestedDatatypeNameValueExtractor.java
@@ -24,9 +24,9 @@
 import java.io.DataInputStream;
 import java.io.IOException;
 
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.metadata.api.IValueExtractor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.util.string.UTF8StringReader;
@@ -49,7 +49,7 @@
     private final UTF8StringReader reader = new UTF8StringReader();
 
     @Override
-    public String getValue(JobId jobId, ITupleReference tuple) throws MetadataException, HyracksDataException {
+    public String getValue(TxnId txnId, ITupleReference tuple) throws AlgebricksException, HyracksDataException {
         byte[] serRecord = tuple.getFieldData(2);
         int recordStartOffset = tuple.getFieldStart(2);
         int recordLength = tuple.getFieldLength(2);
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/TupleCopyValueExtractor.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/TupleCopyValueExtractor.java
index 1928d7e..8960ba6 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/TupleCopyValueExtractor.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/valueextractors/TupleCopyValueExtractor.java
@@ -21,9 +21,9 @@
 
 import java.nio.ByteBuffer;
 
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.metadata.api.IValueExtractor;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
@@ -48,7 +48,8 @@
     }
 
     @Override
-    public ITupleReference getValue(JobId jobId, ITupleReference tuple) throws MetadataException, HyracksDataException {
+    public ITupleReference getValue(TxnId txnId, ITupleReference tuple)
+            throws AlgebricksException, HyracksDataException {
         int numBytes = tupleWriter.bytesRequired(tuple);
         tupleBytes = new byte[numBytes];
         tupleWriter.writeTuple(tuple, tupleBytes, 0);
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
index e5d0d7d..b87ef2a 100644
--- a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/DatasetTupleTranslatorTest.java
@@ -30,6 +30,7 @@
 import org.apache.asterix.metadata.entities.InternalDatasetDetails.FileStructure;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails.PartitioningStrategy;
 import org.apache.asterix.om.types.BuiltinType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.junit.Assert;
 import org.junit.Test;
@@ -37,7 +38,7 @@
 public class DatasetTupleTranslatorTest {
 
     @Test
-    public void test() throws MetadataException, IOException {
+    public void test() throws AlgebricksException, IOException {
         Integer[] indicators = { 0, 1, null };
         for (Integer indicator : indicators) {
             Map<String, String> compactionPolicyProperties = new HashMap<>();
@@ -48,7 +49,7 @@
                     Collections.singletonList(Collections.singletonList("row_id")),
                     Collections.singletonList(Collections.singletonList("row_id")),
                     indicator == null ? null : Collections.singletonList(indicator),
-                    Collections.singletonList(BuiltinType.AINT64), false, Collections.emptyList(), false);
+                    Collections.singletonList(BuiltinType.AINT64), false, Collections.emptyList());
 
             Dataset dataset =
                     new Dataset("test", "log", "foo", "LogType", "CB", "MetaType", "DEFAULT_NG_ALL_NODES", "prefix",
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
index cdbaad3..ab4229c 100644
--- a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslatorTest.java
@@ -41,6 +41,7 @@
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.junit.Assert;
 import org.junit.Test;
@@ -48,7 +49,7 @@
 public class IndexTupleTranslatorTest {
 
     @Test
-    public void test() throws MetadataException, IOException {
+    public void test() throws AlgebricksException, IOException {
         Integer[] indicators = { 0, 1, null };
         for (Integer indicator : indicators) {
             Map<String, String> compactionPolicyProperties = new HashMap<>();
@@ -59,7 +60,7 @@
                     Collections.singletonList(Collections.singletonList("row_id")),
                     Collections.singletonList(Collections.singletonList("row_id")),
                     indicator == null ? null : Collections.singletonList(indicator),
-                    Collections.singletonList(BuiltinType.AINT64), false, Collections.emptyList(), false);
+                    Collections.singletonList(BuiltinType.AINT64), false, Collections.emptyList());
 
             Dataset dataset =
                     new Dataset("test", "d1", "foo", "LogType", "CB", "MetaType", "DEFAULT_NG_ALL_NODES", "prefix",
diff --git a/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtilTest.java b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtilTest.java
new file mode 100644
index 0000000..5e5b26a
--- /dev/null
+++ b/asterixdb/asterix-metadata/src/test/java/org/apache/asterix/metadata/functions/ExternalFunctionCompilerUtilTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.metadata.functions;
+
+import java.util.LinkedList;
+
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.asterix.metadata.MetadataTransactionContext;
+import org.apache.asterix.metadata.entities.Function;
+import org.apache.asterix.om.types.AUnorderedListType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ExternalFunctionCompilerUtilTest {
+    @Test
+    public void test() throws AlgebricksException {
+        // given
+        MetadataTransactionContext txnCtx = new MetadataTransactionContext(new TxnId(1));
+        Function function =
+                new Function("test", "test", 0, new LinkedList<>(), "{{ASTRING}}", "", "JAVA", "SCALAR", null);
+
+        // when
+        ExternalScalarFunctionInfo info =
+                (ExternalScalarFunctionInfo) ExternalFunctionCompilerUtil.getExternalFunctionInfo(txnCtx, function);
+        IAType type = info.getResultTypeComputer().computeType(null, null, null);
+
+        // then
+        IAType expectedType = new AUnorderedListType(BuiltinType.ASTRING, "AUnorderedList");
+        Assert.assertEquals(expectedType, info.getReturnType());
+        Assert.assertEquals(expectedType, type);
+    }
+}
diff --git a/asterixdb/asterix-om/pom.xml b/asterixdb/asterix-om/pom.xml
index f198d8e..45cf7c8 100644
--- a/asterixdb/asterix-om/pom.xml
+++ b/asterixdb/asterix-om/pom.xml
@@ -35,7 +35,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <dependencies>
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/IAsterixListBuilder.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/IAsterixListBuilder.java
index 5aa95ef..9a7d0c4ee 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/IAsterixListBuilder.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/IAsterixListBuilder.java
@@ -29,7 +29,7 @@
      * @param listType
      *            Type of the list: AUnorderedListType or AOrderedListType.
      */
-    public void reset(AbstractCollectionType listType) throws HyracksDataException;
+    public void reset(AbstractCollectionType listType);
 
     /**
      * @param item
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
index 797901e..975b4f4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/builders/RecordBuilder.java
@@ -80,10 +80,10 @@
         this.openFieldNameLengths = new int[DEFAULT_NUM_OPEN_FIELDS];
         this.numberOfOpenFields = 0;
 
-        this.utf8HashFunction = new PointableBinaryHashFunctionFactory(UTF8StringPointable.FACTORY)
-                .createBinaryHashFunction();
-        this.utf8Comparator = new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY)
-                .createBinaryComparator();
+        this.utf8HashFunction =
+                new PointableBinaryHashFunctionFactory(UTF8StringPointable.FACTORY).createBinaryHashFunction();
+        this.utf8Comparator =
+                new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY).createBinaryComparator();
 
         this.openPartOffsetArray = null;
         this.openPartOffsetArraySize = 0;
@@ -195,11 +195,11 @@
         }
         if (numberOfOpenFields == openPartOffsets.length) {
             openPartOffsets = Arrays.copyOf(openPartOffsets, openPartOffsets.length + DEFAULT_NUM_OPEN_FIELDS);
-            openFieldNameLengths = Arrays.copyOf(openFieldNameLengths,
-                    openFieldNameLengths.length + DEFAULT_NUM_OPEN_FIELDS);
+            openFieldNameLengths =
+                    Arrays.copyOf(openFieldNameLengths, openFieldNameLengths.length + DEFAULT_NUM_OPEN_FIELDS);
         }
-        int fieldNameHashCode = utf8HashFunction.hash(name.getByteArray(), name.getStartOffset() + 1,
-                name.getLength() - 1);
+        int fieldNameHashCode =
+                utf8HashFunction.hash(name.getByteArray(), name.getStartOffset() + 1, name.getLength() - 1);
         if (recType != null) {
             int cFieldPos;
             cFieldPos = recTypeInfo.getFieldIndex(name.getByteArray(), name.getStartOffset() + 1, name.getLength() - 1);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/ExpressionTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/ExpressionTypeComputer.java
index 5933dd9..e4cf000 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/ExpressionTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/ExpressionTypeComputer.java
@@ -68,7 +68,7 @@
         FunctionIdentifier fi = expr.getFunctionIdentifier();
         // Note: built-in functions + udfs
         IResultTypeComputer rtc;
-        FunctionSignature signature = new FunctionSignature(fi.getNamespace(), fi.getName(), fi.getArity());
+        FunctionSignature signature = new FunctionSignature(fi);
         if (BuiltinFunctions.isBuiltinCompilerFunction(signature, true)) {
             rtc = BuiltinFunctions.getResultTypeComputer(fi);
         } else {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/PartialAggregationTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/PartialAggregationTypeComputer.java
index 1a73af3..4a0384d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/PartialAggregationTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/common/PartialAggregationTypeComputer.java
@@ -38,8 +38,8 @@
         if (partialFid.equals(BuiltinFunctions.SERIAL_GLOBAL_AVG)) {
             partialFid = BuiltinFunctions.SERIAL_LOCAL_AVG;
         }
-        AggregateFunctionCallExpression partialAgg = BuiltinFunctions.makeAggregateFunctionExpression(partialFid,
-                agg.getArguments());
+        AggregateFunctionCallExpression partialAgg =
+                BuiltinFunctions.makeAggregateFunctionExpression(partialFid, agg.getArguments());
         return getTypeForFunction(partialAgg, env, metadataProvider);
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ACirclePartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ACirclePartialBinaryComparatorFactory.java
index a5709ba..961b4dd 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ACirclePartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ACirclePartialBinaryComparatorFactory.java
@@ -49,24 +49,24 @@
                     int c = Double
                             .compare(
                                     ADoubleSerializerDeserializer.getDouble(
-                                            b1,
-                                            s1
-                                                    + ACircleSerializerDeserializer
-                                                            .getCenterPointCoordinateOffset(Coordinate.X) - 1),
-                                    ADoubleSerializerDeserializer.getDouble(
-                                            b2,
-                                            s2
-                                                    + ACircleSerializerDeserializer
-                                                            .getCenterPointCoordinateOffset(Coordinate.X) - 1));
+                                            b1, s1 + ACircleSerializerDeserializer
+                                                    .getCenterPointCoordinateOffset(Coordinate.X) - 1),
+                                    ADoubleSerializerDeserializer.getDouble(b2, s2
+                                            + ACircleSerializerDeserializer.getCenterPointCoordinateOffset(Coordinate.X)
+                                            - 1));
                     if (c == 0) {
                         // center.y
-                        c = Double.compare(
-                                ADoubleSerializerDeserializer.getDouble(b1,
-                                        s1 + ACircleSerializerDeserializer.getCenterPointCoordinateOffset(Coordinate.Y)
-                                                - 1),
-                                ADoubleSerializerDeserializer.getDouble(b2,
-                                        s2 + ACircleSerializerDeserializer.getCenterPointCoordinateOffset(Coordinate.Y)
-                                                - 1));
+                        c = Double
+                                .compare(
+                                        ADoubleSerializerDeserializer.getDouble(b1,
+                                                s1 + ACircleSerializerDeserializer
+                                                        .getCenterPointCoordinateOffset(Coordinate.Y) - 1),
+                                        ADoubleSerializerDeserializer
+                                                .getDouble(
+                                                        b2, s2
+                                                                + ACircleSerializerDeserializer
+                                                                        .getCenterPointCoordinateOffset(Coordinate.Y)
+                                                                - 1));
                         if (c == 0) {
                             // radius
                             return Double.compare(
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ADurationPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ADurationPartialBinaryComparatorFactory.java
index da8696b..ed9c051 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ADurationPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ADurationPartialBinaryComparatorFactory.java
@@ -28,7 +28,8 @@
 
     private static final long serialVersionUID = 1L;
 
-    public static final ADurationPartialBinaryComparatorFactory INSTANCE = new ADurationPartialBinaryComparatorFactory();
+    public static final ADurationPartialBinaryComparatorFactory INSTANCE =
+            new ADurationPartialBinaryComparatorFactory();
 
     private ADurationPartialBinaryComparatorFactory() {
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalAscPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalAscPartialBinaryComparatorFactory.java
index bb96d5d..fb2b112 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalAscPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalAscPartialBinaryComparatorFactory.java
@@ -26,7 +26,8 @@
 
     private static final long serialVersionUID = 1L;
 
-    public static final AIntervalAscPartialBinaryComparatorFactory INSTANCE = new AIntervalAscPartialBinaryComparatorFactory();
+    public static final AIntervalAscPartialBinaryComparatorFactory INSTANCE =
+            new AIntervalAscPartialBinaryComparatorFactory();
 
     private AIntervalAscPartialBinaryComparatorFactory() {
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalDescPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalDescPartialBinaryComparatorFactory.java
index 5ee553c..32994ab 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalDescPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AIntervalDescPartialBinaryComparatorFactory.java
@@ -26,7 +26,8 @@
 
     private static final long serialVersionUID = 1L;
 
-    public static final AIntervalDescPartialBinaryComparatorFactory INSTANCE = new AIntervalDescPartialBinaryComparatorFactory();
+    public static final AIntervalDescPartialBinaryComparatorFactory INSTANCE =
+            new AIntervalDescPartialBinaryComparatorFactory();
 
     private AIntervalDescPartialBinaryComparatorFactory() {
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ALinePartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ALinePartialBinaryComparatorFactory.java
index 9eae119..405e063 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ALinePartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ALinePartialBinaryComparatorFactory.java
@@ -45,39 +45,50 @@
             @Override
             public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
                 try {
-                    int c = Double.compare(
-                            ADoubleSerializerDeserializer.getDouble(b1,
-                                    s1 + ALineSerializerDeserializer.getStartPointCoordinateOffset(Coordinate.X) - 1),
-                            ADoubleSerializerDeserializer.getDouble(b2,
-                                    s2 + ALineSerializerDeserializer.getStartPointCoordinateOffset(Coordinate.X) - 1));
-                    if (c == 0) {
-                        c = Double.compare(
-                                ADoubleSerializerDeserializer.getDouble(b1,
-                                        s1 + ALineSerializerDeserializer.getStartPointCoordinateOffset(Coordinate.Y)
-                                                - 1),
-                                ADoubleSerializerDeserializer.getDouble(b2,
-                                        s2 + ALineSerializerDeserializer.getStartPointCoordinateOffset(Coordinate.Y)
-                                                - 1));
-                        if (c == 0) {
-                            c = Double.compare(
-                                    ADoubleSerializerDeserializer.getDouble(b1,
-                                            s1 + ALineSerializerDeserializer.getEndPointCoordinateOffset(Coordinate.X)
-                                                    - 1),
+                    int c = Double
+                            .compare(
+                                    ADoubleSerializerDeserializer.getDouble(
+                                            b1, s1 + ALineSerializerDeserializer
+                                                    .getStartPointCoordinateOffset(Coordinate.X) - 1),
                                     ADoubleSerializerDeserializer.getDouble(b2,
-                                            s2 + ALineSerializerDeserializer.getEndPointCoordinateOffset(Coordinate.X)
+                                            s2 + ALineSerializerDeserializer.getStartPointCoordinateOffset(Coordinate.X)
                                                     - 1));
+                    if (c == 0) {
+                        c = Double
+                                .compare(
+                                        ADoubleSerializerDeserializer.getDouble(b1,
+                                                s1 + ALineSerializerDeserializer
+                                                        .getStartPointCoordinateOffset(Coordinate.Y) - 1),
+                                        ADoubleSerializerDeserializer
+                                                .getDouble(
+                                                        b2, s2
+                                                                + ALineSerializerDeserializer
+                                                                        .getStartPointCoordinateOffset(Coordinate.Y)
+                                                                - 1));
+                        if (c == 0) {
+                            c = Double
+                                    .compare(
+                                            ADoubleSerializerDeserializer.getDouble(b1,
+                                                    s1 + ALineSerializerDeserializer
+                                                            .getEndPointCoordinateOffset(Coordinate.X) - 1),
+                                            ADoubleSerializerDeserializer
+                                                    .getDouble(
+                                                            b2, s2
+                                                                    + ALineSerializerDeserializer
+                                                                            .getEndPointCoordinateOffset(Coordinate.X)
+                                                                    - 1));
                             if (c == 0) {
-                                return Double.compare(
-                                        ADoubleSerializerDeserializer.getDouble(
-                                                b1,
-                                                s1
-                                                        + ALineSerializerDeserializer
-                                                                .getEndPointCoordinateOffset(Coordinate.Y) - 1),
-                                        ADoubleSerializerDeserializer.getDouble(
-                                                b2,
-                                                s2
-                                                        + ALineSerializerDeserializer
-                                                                .getEndPointCoordinateOffset(Coordinate.Y) - 1));
+                                return Double
+                                        .compare(
+                                                ADoubleSerializerDeserializer
+                                                        .getDouble(b1,
+                                                                s1 + ALineSerializerDeserializer
+                                                                        .getEndPointCoordinateOffset(Coordinate.Y) - 1),
+                                                ADoubleSerializerDeserializer
+                                                        .getDouble(b2,
+                                                                s2 + ALineSerializerDeserializer
+                                                                        .getEndPointCoordinateOffset(Coordinate.Y)
+                                                                        - 1));
                             }
                         }
                     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectAscBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectAscBinaryComparatorFactory.java
index e74d5ec..61b47c2 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectAscBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectAscBinaryComparatorFactory.java
@@ -57,51 +57,51 @@
             // BOOLEAN
             final IBinaryComparator ascBoolComp = BooleanBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // TINYINT
-            final IBinaryComparator ascByteComp = new PointableBinaryComparatorFactory(BytePointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascByteComp =
+                    new PointableBinaryComparatorFactory(BytePointable.FACTORY).createBinaryComparator();
             // SMALLINT
-            final IBinaryComparator ascShortComp = new PointableBinaryComparatorFactory(ShortPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascShortComp =
+                    new PointableBinaryComparatorFactory(ShortPointable.FACTORY).createBinaryComparator();
             // INTEGER
-            final IBinaryComparator ascIntComp = new PointableBinaryComparatorFactory(IntegerPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascIntComp =
+                    new PointableBinaryComparatorFactory(IntegerPointable.FACTORY).createBinaryComparator();
             // BIGINT
             final IBinaryComparator ascLongComp = LongBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // STRING
-            final IBinaryComparator ascStrComp = new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascStrComp =
+                    new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY).createBinaryComparator();
             // BINARY
-            final IBinaryComparator ascByteArrayComp = new PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascByteArrayComp =
+                    new PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY).createBinaryComparator();
             // FLOAT
-            final IBinaryComparator ascFloatComp = new PointableBinaryComparatorFactory(FloatPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascFloatComp =
+                    new PointableBinaryComparatorFactory(FloatPointable.FACTORY).createBinaryComparator();
             // DOUBLE
-            final IBinaryComparator ascDoubleComp = new PointableBinaryComparatorFactory(DoublePointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascDoubleComp =
+                    new PointableBinaryComparatorFactory(DoublePointable.FACTORY).createBinaryComparator();
             // RECTANGLE
-            final IBinaryComparator ascRectangleComp = ARectanglePartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascRectangleComp =
+                    ARectanglePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // CIRCLE
-            final IBinaryComparator ascCircleComp = ACirclePartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascCircleComp =
+                    ACirclePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // DURATION
-            final IBinaryComparator ascDurationComp = ADurationPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascDurationComp =
+                    ADurationPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // INTERVAL
-            final IBinaryComparator ascIntervalComp = AIntervalAscPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascIntervalComp =
+                    AIntervalAscPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // LINE
             final IBinaryComparator ascLineComp = ALinePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // POINT
-            final IBinaryComparator ascPointComp = APointPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascPointComp =
+                    APointPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // POINT3D
-            final IBinaryComparator ascPoint3DComp = APoint3DPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascPoint3DComp =
+                    APoint3DPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // POLYGON
-            final IBinaryComparator ascPolygonComp = APolygonPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascPolygonComp =
+                    APolygonPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // UUID
             final IBinaryComparator ascUUIDComp = AUUIDPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             // RAW
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectDescBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectDescBinaryComparatorFactory.java
index 5db1bcd..3260527 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectDescBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AObjectDescBinaryComparatorFactory.java
@@ -41,8 +41,8 @@
             // INTERVAL
             // Interval asc and desc comparator factories are not the inverse of each other.
             // Thus, we need to specify the interval desc comparator factory for descending comparisons.
-            final IBinaryComparator descIntervalComp = AIntervalDescPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator descIntervalComp =
+                    AIntervalDescPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
 
             @Override
             public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) throws HyracksDataException {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APoint3DPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APoint3DPartialBinaryComparatorFactory.java
index de07035..dfba1d1 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APoint3DPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APoint3DPartialBinaryComparatorFactory.java
@@ -45,21 +45,29 @@
             @Override
             public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
                 try {
-                    int c = Double.compare(
-                            ADoubleSerializerDeserializer.getDouble(b1,
-                                    s1 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.X) - 1),
-                            ADoubleSerializerDeserializer.getDouble(b2,
-                                    s2 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.X) - 1));
+                    int c = Double
+                            .compare(
+                                    ADoubleSerializerDeserializer
+                                            .getDouble(b1,
+                                                    s1 + APoint3DSerializerDeserializer
+                                                            .getCoordinateOffset(Coordinate.X) - 1),
+                                    ADoubleSerializerDeserializer.getDouble(b2,
+                                            s2 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.X) - 1));
                     if (c == 0) {
-                        c = Double.compare(
-                                ADoubleSerializerDeserializer.getDouble(b1,
-                                        s1 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.Y) - 1),
-                                ADoubleSerializerDeserializer.getDouble(b2,
-                                        s2 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.Y) - 1));
+                        c = Double
+                                .compare(
+                                        ADoubleSerializerDeserializer.getDouble(
+                                                b1, s1 + APoint3DSerializerDeserializer
+                                                        .getCoordinateOffset(Coordinate.Y) - 1),
+                                        ADoubleSerializerDeserializer.getDouble(b2,
+                                                s2 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.Y)
+                                                        - 1));
                         if (c == 0) {
                             return Double.compare(
-                                    ADoubleSerializerDeserializer.getDouble(b1,
-                                            s1 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.Z) - 1),
+                                    ADoubleSerializerDeserializer
+                                            .getDouble(b1,
+                                                    s1 + APoint3DSerializerDeserializer
+                                                            .getCoordinateOffset(Coordinate.Z) - 1),
                                     ADoubleSerializerDeserializer.getDouble(b2,
                                             s2 + APoint3DSerializerDeserializer.getCoordinateOffset(Coordinate.Z) - 1));
                         }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APointPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APointPartialBinaryComparatorFactory.java
index a6df87c..b0eeb2b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APointPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APointPartialBinaryComparatorFactory.java
@@ -48,11 +48,13 @@
                             ADoubleSerializerDeserializer.getDouble(b2,
                                     s2 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.X) - 1));
                     if (c == 0) {
-                        return Double.compare(
-                                ADoubleSerializerDeserializer.getDouble(b1,
-                                        s1 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y) - 1),
-                                ADoubleSerializerDeserializer.getDouble(b2,
-                                        s2 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y) - 1));
+                        return Double
+                                .compare(
+                                        ADoubleSerializerDeserializer.getDouble(
+                                                b1, s1 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)
+                                                        - 1),
+                                        ADoubleSerializerDeserializer.getDouble(b2, s2
+                                                + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y) - 1));
                     }
                     return c;
                 } catch (HyracksDataException hex) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APolygonPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APolygonPartialBinaryComparatorFactory.java
index 407fa23..577f6a3 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APolygonPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/APolygonPartialBinaryComparatorFactory.java
@@ -48,27 +48,31 @@
                 try {
                     short pointCount1 = AInt16SerializerDeserializer.getShort(b1,
                             s1 + APolygonSerializerDeserializer.getNumberOfPointsOffset() - 1);
-                    int c = Short.compare(
-                            pointCount1,
-                            AInt16SerializerDeserializer.getShort(b2,
-                                    s2 + APolygonSerializerDeserializer.getNumberOfPointsOffset() - 1));
+                    int c = Short.compare(pointCount1, AInt16SerializerDeserializer.getShort(b2,
+                            s2 + APolygonSerializerDeserializer.getNumberOfPointsOffset() - 1));
 
                     if (c == 0) {
                         int ci = 0;
                         for (int i = 0; i < pointCount1; i++) {
-                            ci = Double.compare(
-                                    DoublePointable.getDouble(b1, s1 + APolygonSerializerDeserializer.getCoordinateOffset(i, Coordinate.X)
-                                    - 1),
-                                    DoublePointable.getDouble(b2, s1 + APolygonSerializerDeserializer.getCoordinateOffset(i, Coordinate.X)
-                                    - 1));
+                            ci = Double
+                                    .compare(
+                                            DoublePointable.getDouble(b1,
+                                                    s1 + APolygonSerializerDeserializer.getCoordinateOffset(i,
+                                                            Coordinate.X) - 1),
+                                            DoublePointable.getDouble(b2, s1 + APolygonSerializerDeserializer
+                                                    .getCoordinateOffset(i, Coordinate.X) - 1));
                             if (ci == 0) {
-                                ci = Double.compare(
-                                        DoublePointable.getDouble(b1, s1
-                                        + APolygonSerializerDeserializer.getCoordinateOffset(i,
-                                                Coordinate.Y) - 1),
-                                        DoublePointable.getDouble(b2, s1
-                                        + APolygonSerializerDeserializer.getCoordinateOffset(i,
-                                                Coordinate.Y) - 1));
+                                ci = Double
+                                        .compare(
+                                                DoublePointable.getDouble(b1,
+                                                        s1 + APolygonSerializerDeserializer.getCoordinateOffset(i,
+                                                                Coordinate.Y) - 1),
+                                                DoublePointable
+                                                        .getDouble(
+                                                                b2, s1
+                                                                        + APolygonSerializerDeserializer
+                                                                                .getCoordinateOffset(i, Coordinate.Y)
+                                                                        - 1));
                                 if (ci == 0) {
                                     continue;
                                 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ARectanglePartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ARectanglePartialBinaryComparatorFactory.java
index 4bd7c78..12f358f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ARectanglePartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ARectanglePartialBinaryComparatorFactory.java
@@ -25,7 +25,8 @@
 public class ARectanglePartialBinaryComparatorFactory implements IBinaryComparatorFactory {
     private static final long serialVersionUID = 1L;
 
-    public final static ARectanglePartialBinaryComparatorFactory INSTANCE = new ARectanglePartialBinaryComparatorFactory();
+    public final static ARectanglePartialBinaryComparatorFactory INSTANCE =
+            new ARectanglePartialBinaryComparatorFactory();
 
     private ARectanglePartialBinaryComparatorFactory() {
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AUUIDPartialBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AUUIDPartialBinaryComparatorFactory.java
index 67233e0..0810341 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AUUIDPartialBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/AUUIDPartialBinaryComparatorFactory.java
@@ -35,11 +35,9 @@
 
             @Override
             public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
-                int msbCompare = Long.compare(LongPointable.getLong(b1, s1),
-                        LongPointable.getLong(b2, s2));
+                int msbCompare = Long.compare(LongPointable.getLong(b1, s1), LongPointable.getLong(b2, s2));
                 if (msbCompare == 0) {
-                    return Long.compare(LongPointable.getLong(b1, s1 + 8),
-                            LongPointable.getLong(b2, s2 + 8));
+                    return Long.compare(LongPointable.getLong(b1, s1 + 8), LongPointable.getLong(b2, s2 + 8));
                 } else {
                     return msbCompare;
                 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ListItemBinaryComparatorFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ListItemBinaryComparatorFactory.java
index 09db0ba..cff39a70 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ListItemBinaryComparatorFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/comparators/ListItemBinaryComparatorFactory.java
@@ -50,35 +50,35 @@
             final boolean ignoreCase) {
         return new IBinaryComparator() {
             final IBinaryComparator ascBoolComp = BooleanBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-            final IBinaryComparator ascIntComp = new PointableBinaryComparatorFactory(IntegerPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascIntComp =
+                    new PointableBinaryComparatorFactory(IntegerPointable.FACTORY).createBinaryComparator();
             final IBinaryComparator ascLongComp = LongBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-            final IBinaryComparator ascStrComp = new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY)
-                    .createBinaryComparator();
-            final IBinaryComparator ascLowerCaseStrComp = new PointableBinaryComparatorFactory(
-                    UTF8StringLowercasePointable.FACTORY).createBinaryComparator();
-            final IBinaryComparator ascFloatComp = new PointableBinaryComparatorFactory(FloatPointable.FACTORY)
-                    .createBinaryComparator();
-            final IBinaryComparator ascDoubleComp = new PointableBinaryComparatorFactory(DoublePointable.FACTORY)
-                    .createBinaryComparator();
-            final IBinaryComparator ascRectangleComp = ARectanglePartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
-            final IBinaryComparator ascCircleComp = ACirclePartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
-            final IBinaryComparator ascDurationComp = ADurationPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
-            final IBinaryComparator ascIntervalComp = AIntervalAscPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascStrComp =
+                    new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY).createBinaryComparator();
+            final IBinaryComparator ascLowerCaseStrComp =
+                    new PointableBinaryComparatorFactory(UTF8StringLowercasePointable.FACTORY).createBinaryComparator();
+            final IBinaryComparator ascFloatComp =
+                    new PointableBinaryComparatorFactory(FloatPointable.FACTORY).createBinaryComparator();
+            final IBinaryComparator ascDoubleComp =
+                    new PointableBinaryComparatorFactory(DoublePointable.FACTORY).createBinaryComparator();
+            final IBinaryComparator ascRectangleComp =
+                    ARectanglePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+            final IBinaryComparator ascCircleComp =
+                    ACirclePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+            final IBinaryComparator ascDurationComp =
+                    ADurationPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+            final IBinaryComparator ascIntervalComp =
+                    AIntervalAscPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             final IBinaryComparator ascLineComp = ALinePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-            final IBinaryComparator ascPointComp = APointPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
-            final IBinaryComparator ascPoint3DComp = APoint3DPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
-            final IBinaryComparator ascPolygonComp = APolygonPartialBinaryComparatorFactory.INSTANCE
-                    .createBinaryComparator();
+            final IBinaryComparator ascPointComp =
+                    APointPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+            final IBinaryComparator ascPoint3DComp =
+                    APoint3DPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+            final IBinaryComparator ascPolygonComp =
+                    APolygonPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
             final IBinaryComparator ascUUIDComp = AUUIDPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
-            final IBinaryComparator ascByteArrayComp = new PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY)
-                    .createBinaryComparator();
+            final IBinaryComparator ascByteArrayComp =
+                    new PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY).createBinaryComparator();
             final IBinaryComparator rawComp = RawBinaryComparatorFactory.INSTANCE.createBinaryComparator();
 
             @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AObjectBinaryHashFunctionFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AObjectBinaryHashFunctionFactory.java
index e02ac3d..a8fa8a4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AObjectBinaryHashFunctionFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/AObjectBinaryHashFunctionFactory.java
@@ -35,8 +35,8 @@
     @Override
     public IBinaryHashFunction createBinaryHashFunction() {
         return new IBinaryHashFunction() {
-            private IBinaryHashFunction genericBinaryHash = MurmurHash3BinaryHashFunctionFamily.INSTANCE
-                    .createBinaryHashFunction(0);
+            private IBinaryHashFunction genericBinaryHash =
+                    MurmurHash3BinaryHashFunctionFamily.INSTANCE.createBinaryHashFunction(0);
 
             @Override
             public int hash(byte[] bytes, int offset, int length) throws HyracksDataException {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/ListItemBinaryHashFunctionFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/ListItemBinaryHashFunctionFactory.java
index d7cf9ae..a3a826e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/ListItemBinaryHashFunctionFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/hash/ListItemBinaryHashFunctionFactory.java
@@ -53,10 +53,11 @@
     public IBinaryHashFunction createBinaryHashFunction(final ATypeTag itemTypeTag, final boolean ignoreCase) {
         return new IBinaryHashFunction() {
 
-            private IBinaryHashFunction lowerCaseStringHash = new PointableBinaryHashFunctionFactory(
-                    UTF8StringLowercasePointable.FACTORY).createBinaryHashFunction();
-            private IBinaryHashFunction genericBinaryHash = MurmurHash3BinaryHashFunctionFamily.INSTANCE
-                    .createBinaryHashFunction(0);
+            private IBinaryHashFunction lowerCaseStringHash =
+                    new PointableBinaryHashFunctionFactory(UTF8StringLowercasePointable.FACTORY)
+                            .createBinaryHashFunction();
+            private IBinaryHashFunction genericBinaryHash =
+                    MurmurHash3BinaryHashFunctionFamily.INSTANCE.createBinaryHashFunction(0);
             private GrowableArray taggedBytes = new GrowableArray();
 
             @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AUUIDNormalizedKeyComputerFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AUUIDNormalizedKeyComputerFactory.java
new file mode 100644
index 0000000..c8a774d
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AUUIDNormalizedKeyComputerFactory.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.dataflow.data.nontagged.keynormalizers;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
+import org.apache.hyracks.dataflow.common.data.normalizers.Integer64NormalizedKeyComputerFactory;
+
+public class AUUIDNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
+    private static final long serialVersionUID = 1L;
+
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 4;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return true;
+        }
+    };
+
+    private final INormalizedKeyComputerFactory int64NormalizerFactory;
+    private final int int64NormalizedKeyLength;
+
+    public AUUIDNormalizedKeyComputerFactory() {
+        int64NormalizerFactory = new Integer64NormalizedKeyComputerFactory();
+        int64NormalizedKeyLength = int64NormalizerFactory.getNormalizedKeyProperties().getNormalizedKeyLength();
+    }
+
+    @Override
+    public INormalizedKeyComputer createNormalizedKeyComputer() {
+        final INormalizedKeyComputer nkc = int64NormalizerFactory.createNormalizedKeyComputer();
+        return new INormalizedKeyComputer() {
+
+            @Override
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                // normalize msb
+                nkc.normalize(bytes, start, length, normalizedKeys, keyStart);
+                // normalize lsb
+                nkc.normalize(bytes, start + Long.BYTES, length - Long.BYTES, normalizedKeys,
+                        keyStart + int64NormalizedKeyLength);
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
+            }
+        };
+
+    }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
+
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedAscNormalizedKeyComputerFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedAscNormalizedKeyComputerFactory.java
index de214fc..c676d13 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedAscNormalizedKeyComputerFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedAscNormalizedKeyComputerFactory.java
@@ -21,6 +21,7 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 
 /**
  * This class uses a decorator pattern to wrap an ASC ordered INomralizedKeyComputerFactory implementation to
@@ -41,11 +42,22 @@
         return new INormalizedKeyComputer() {
 
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
                 // start +1, length -1 is because in ASTERIX data format, there is always a type tag before the value
-                return nkc.normalize(bytes, start + 1, length - 1);
+                nkc.normalize(bytes, start + 1, length - 1, normalizedKeys, keyStart);
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return nkc.getNormalizedKeyProperties();
             }
         };
+
+    }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return nkcf.getNormalizedKeyProperties();
     }
 
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedDescNormalizedKeyComputerFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedDescNormalizedKeyComputerFactory.java
index 6e02029..86b33e8 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedDescNormalizedKeyComputerFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/keynormalizers/AWrappedDescNormalizedKeyComputerFactory.java
@@ -21,6 +21,7 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 
 /**
  * This class uses a decorator pattern to wrap an ASC ordered INomralizedKeyComputerFactory implementation
@@ -30,9 +31,11 @@
 
     private static final long serialVersionUID = 1L;
     private final INormalizedKeyComputerFactory nkcf;
+    private final int normalizedKeyLength;
 
     public AWrappedDescNormalizedKeyComputerFactory(INormalizedKeyComputerFactory nkcf) {
         this.nkcf = nkcf;
+        this.normalizedKeyLength = nkcf.getNormalizedKeyProperties().getNormalizedKeyLength();
     }
 
     @Override
@@ -41,11 +44,24 @@
         return new INormalizedKeyComputer() {
 
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                int key = nkc.normalize(bytes, start + 1, length - 1);
-                return (int) ((long) 0xffffffff - (long) key);
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                nkc.normalize(bytes, start + 1, length - 1, normalizedKeys, keyStart);
+                for (int i = 0; i < normalizedKeyLength; i++) {
+                    int key = normalizedKeys[keyStart + i];
+                    normalizedKeys[keyStart + i] = ~key;
+                }
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return nkc.getNormalizedKeyProperties();
             }
         };
     }
 
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return nkcf.getNormalizedKeyProperties();
+    }
+
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ADoublePrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ADoublePrinterFactory.java
index 49455d5..051d00b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ADoublePrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ADoublePrinterFactory.java
@@ -29,8 +29,7 @@
     private static final long serialVersionUID = 1L;
     public static final ADoublePrinterFactory INSTANCE = new ADoublePrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDouble(b, s,
-            ps);
+    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDouble(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AObjectPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AObjectPrinterFactory.java
index 9e81b19..21880dd 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AObjectPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AObjectPrinterFactory.java
@@ -123,12 +123,12 @@
 
     @Override
     public IPrinter createPrinter() {
-        final ARecordVisitablePointable rPointable = new ARecordVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
-        final AListVisitablePointable olPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
-        final AListVisitablePointable ulPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
+        final ARecordVisitablePointable rPointable =
+                new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+        final AListVisitablePointable olPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
+        final AListVisitablePointable ulPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
         final Pair<PrintStream, ATypeTag> streamTag = new Pair<>(null, null);
 
         final IPrintVisitor visitor = new APrintVisitor();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOptionalFieldPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOptionalFieldPrinterFactory.java
index 8797bdc..f44b834 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOptionalFieldPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOptionalFieldPrinterFactory.java
@@ -46,8 +46,7 @@
 
             @Override
             public void init() throws HyracksDataException {
-                nullPrinter = (ADMPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.ANULL))
-                        .createPrinter();
+                nullPrinter = (ADMPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.ANULL)).createPrinter();
                 fieldPrinter = (ADMPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getActualType()))
                         .createPrinter();
             }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOrderedlistPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOrderedlistPrinterFactory.java
index 0eef522..322ce7c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOrderedlistPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AOrderedlistPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = orderedlistType == null
-                ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY) : orderedlistType;
+        final IAType inputType = orderedlistType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY)
+                : orderedlistType;
         final IVisitablePointable listAccessor = allocator.allocateListValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ARecordPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ARecordPrinterFactory.java
index 0ea2d96..718a49c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ARecordPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/ARecordPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT)
-                : recType;
+        final IAType inputType =
+                recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT) : recType;
         final IVisitablePointable recAccessor = allocator.allocateRecordValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUnionPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUnionPrinterFactory.java
index d8a412f..105bef0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUnionPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/adm/AUnionPrinterFactory.java
@@ -49,8 +49,9 @@
                 unionList = unionType.getUnionList();
                 printers = new IPrinter[unionType.getUnionList().size()];
                 for (int i = 0; i < printers.length; i++) {
-                    printers[i] = (ADMPrinterFactoryProvider.INSTANCE
-                            .getPrinterFactory(unionType.getUnionList().get(i))).createPrinter();
+                    printers[i] =
+                            (ADMPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getUnionList().get(i)))
+                                    .createPrinter();
                     printers[i].init();
                 }
             }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ADoublePrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ADoublePrinterFactory.java
index 29f11c4..79d20cb 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ADoublePrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ADoublePrinterFactory.java
@@ -29,8 +29,7 @@
     private static final long serialVersionUID = 1L;
     public static final ADoublePrinterFactory INSTANCE = new ADoublePrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDouble(b, s,
-            ps);
+    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDouble(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt16PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt16PrinterFactory.java
index 8c6ec22..5de8aea 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt16PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt16PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt16PrinterFactory INSTANCE = new AInt16PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt16SerializerDeserializer.getShort(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt16SerializerDeserializer.getShort(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt32PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt32PrinterFactory.java
index ef3f9d9..c260b55 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt32PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt32PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt32PrinterFactory INSTANCE = new AInt32PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt32SerializerDeserializer.getInt(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt32SerializerDeserializer.getInt(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt64PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt64PrinterFactory.java
index 403d0f4..4a8dd8a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt64PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt64PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt64PrinterFactory INSTANCE = new AInt64PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt64SerializerDeserializer.getLong(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt64SerializerDeserializer.getLong(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt8PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt8PrinterFactory.java
index c9d4165..8de0264 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt8PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AInt8PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt8PrinterFactory INSTANCE = new AInt8PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt8SerializerDeserializer.getByte(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt8SerializerDeserializer.getByte(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AObjectPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AObjectPrinterFactory.java
index 2fddc83..f1e2300 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AObjectPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AObjectPrinterFactory.java
@@ -119,8 +119,8 @@
 
     @Override
     public IPrinter createPrinter() {
-        final ARecordVisitablePointable rPointable = new ARecordVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+        final ARecordVisitablePointable rPointable =
+                new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
         final Pair<PrintStream, ATypeTag> streamTag = new Pair<>(null, null);
 
         final IPrintVisitor visitor = new APrintVisitor();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AOptionalFieldPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AOptionalFieldPrinterFactory.java
index ca01935..ef212f4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AOptionalFieldPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AOptionalFieldPrinterFactory.java
@@ -46,8 +46,8 @@
 
             @Override
             public void init() throws HyracksDataException {
-                nullPrinter = (CSVPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.AMISSING))
-                        .createPrinter();
+                nullPrinter =
+                        (CSVPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.AMISSING)).createPrinter();
                 fieldPrinter = (CSVPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getActualType()))
                         .createPrinter();
             }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ARecordPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ARecordPrinterFactory.java
index bf55410..909fd60 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ARecordPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/ARecordPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT)
-                : recType;
+        final IAType inputType =
+                recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT) : recType;
         final IVisitablePointable recAccessor = allocator.allocateRecordValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUnionPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUnionPrinterFactory.java
index 62cbf1a..28e0321 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUnionPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/csv/AUnionPrinterFactory.java
@@ -51,8 +51,9 @@
                 unionList = unionType.getUnionList();
                 printers = new IPrinter[unionType.getUnionList().size()];
                 for (int i = 0; i < printers.length; i++) {
-                    printers[i] = (CSVPrinterFactoryProvider.INSTANCE
-                            .getPrinterFactory(unionType.getUnionList().get(i))).createPrinter();
+                    printers[i] =
+                            (CSVPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getUnionList().get(i)))
+                                    .createPrinter();
                     printers[i].init();
                 }
             }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ADoublePrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ADoublePrinterFactory.java
index 2081162..2b4d3f7 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ADoublePrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ADoublePrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final ADoublePrinterFactory INSTANCE = new ADoublePrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDoubleForJson(b,
-            s, ps);
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDoubleForJson(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AFloatPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AFloatPrinterFactory.java
index 46ff2f7..31b1f97 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AFloatPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AFloatPrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AFloatPrinterFactory INSTANCE = new AFloatPrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printFloatForJson(b,
-            s, ps);
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printFloatForJson(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt16PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt16PrinterFactory.java
index 4454aa6..6a6ae38 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt16PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt16PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt16PrinterFactory INSTANCE = new AInt16PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt16SerializerDeserializer.getShort(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt16SerializerDeserializer.getShort(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt32PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt32PrinterFactory.java
index 40bf33d..fc6943d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt32PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt32PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt32PrinterFactory INSTANCE = new AInt32PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt32SerializerDeserializer.getInt(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt32SerializerDeserializer.getInt(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt64PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt64PrinterFactory.java
index 5fe8e3a..8aa5de1 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt64PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt64PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt64PrinterFactory INSTANCE = new AInt64PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt64SerializerDeserializer.getLong(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt64SerializerDeserializer.getLong(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt8PrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt8PrinterFactory.java
index a6c3c97..3552b96 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt8PrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AInt8PrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AInt8PrinterFactory INSTANCE = new AInt8PrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> ps
-            .print(AInt8SerializerDeserializer.getByte(b, s + 1));
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> ps.print(AInt8SerializerDeserializer.getByte(b, s + 1));
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AObjectPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AObjectPrinterFactory.java
index 624613a..5cae68c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AObjectPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AObjectPrinterFactory.java
@@ -120,12 +120,12 @@
 
     @Override
     public IPrinter createPrinter() {
-        final ARecordVisitablePointable rPointable = new ARecordVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
-        final AListVisitablePointable olPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
-        final AListVisitablePointable ulPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
+        final ARecordVisitablePointable rPointable =
+                new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+        final AListVisitablePointable olPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
+        final AListVisitablePointable ulPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
         final Pair<PrintStream, ATypeTag> streamTag = new Pair<>(null, null);
 
         final IPrintVisitor visitor = new APrintVisitor();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOptionalFieldPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOptionalFieldPrinterFactory.java
index c933c05..188773b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOptionalFieldPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOptionalFieldPrinterFactory.java
@@ -47,8 +47,8 @@
             public void init() throws HyracksDataException {
                 nullPrinter = (CleanJSONPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.AMISSING))
                         .createPrinter();
-                fieldPrinter = (CleanJSONPrinterFactoryProvider.INSTANCE
-                        .getPrinterFactory(unionType.getActualType())).createPrinter();
+                fieldPrinter = (CleanJSONPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getActualType()))
+                        .createPrinter();
             }
 
             @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOrderedlistPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOrderedlistPrinterFactory.java
index a6e3347..36e13fb 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOrderedlistPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/AOrderedlistPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = orderedlistType == null
-                ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY) : orderedlistType;
+        final IAType inputType = orderedlistType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY)
+                : orderedlistType;
         final IVisitablePointable listAccessor = allocator.allocateListValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ARecordPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ARecordPrinterFactory.java
index 430bf66..a188952 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ARecordPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/clean/ARecordPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT)
-                : recType;
+        final IAType inputType =
+                recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT) : recType;
         final IVisitablePointable recAccessor = allocator.allocateRecordValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ADoublePrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ADoublePrinterFactory.java
index 5d74980..61444cd 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ADoublePrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ADoublePrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final ADoublePrinterFactory INSTANCE = new ADoublePrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDoubleForJson(b,
-            s, ps);
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printDoubleForJson(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AFloatPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AFloatPrinterFactory.java
index 6ed3f98..13c23a5 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AFloatPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AFloatPrinterFactory.java
@@ -29,8 +29,8 @@
     private static final long serialVersionUID = 1L;
     public static final AFloatPrinterFactory INSTANCE = new AFloatPrinterFactory();
 
-    public static final IPrinter PRINTER = (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printFloatForJson(b,
-            s, ps);
+    public static final IPrinter PRINTER =
+            (byte[] b, int s, int l, PrintStream ps) -> PrintTools.printFloatForJson(b, s, ps);
 
     @Override
     public IPrinter createPrinter() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AObjectPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AObjectPrinterFactory.java
index 947229c..3c1c449 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AObjectPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AObjectPrinterFactory.java
@@ -120,12 +120,12 @@
 
     @Override
     public IPrinter createPrinter() {
-        final ARecordVisitablePointable rPointable = new ARecordVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
-        final AListVisitablePointable olPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
-        final AListVisitablePointable ulPointable = new AListVisitablePointable(
-                DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
+        final ARecordVisitablePointable rPointable =
+                new ARecordVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE);
+        final AListVisitablePointable olPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE);
+        final AListVisitablePointable ulPointable =
+                new AListVisitablePointable(DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE);
         final Pair<PrintStream, ATypeTag> streamTag = new Pair<>(null, null);
 
         final IPrintVisitor visitor = new APrintVisitor();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOptionalFieldPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOptionalFieldPrinterFactory.java
index a0ac3cd..62d0591 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOptionalFieldPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOptionalFieldPrinterFactory.java
@@ -47,8 +47,9 @@
             public void init() throws HyracksDataException {
                 nullPrinter = (LosslessJSONPrinterFactoryProvider.INSTANCE.getPrinterFactory(BuiltinType.AMISSING))
                         .createPrinter();
-                fieldPrinter = (LosslessJSONPrinterFactoryProvider.INSTANCE
-                        .getPrinterFactory(unionType.getActualType())).createPrinter();
+                fieldPrinter =
+                        (LosslessJSONPrinterFactoryProvider.INSTANCE.getPrinterFactory(unionType.getActualType()))
+                                .createPrinter();
             }
 
             @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOrderedlistPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOrderedlistPrinterFactory.java
index 7c210b6..c5993e8 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOrderedlistPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/AOrderedlistPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = orderedlistType == null
-                ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY) : orderedlistType;
+        final IAType inputType = orderedlistType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.ARRAY)
+                : orderedlistType;
         final IVisitablePointable listAccessor = allocator.allocateListValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ARecordPrinterFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ARecordPrinterFactory.java
index 4bab638..8a3ec39 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ARecordPrinterFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/printers/json/lossless/ARecordPrinterFactory.java
@@ -44,8 +44,8 @@
     @Override
     public IPrinter createPrinter() {
         final PointableAllocator allocator = new PointableAllocator();
-        final IAType inputType = recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT)
-                : recType;
+        final IAType inputType =
+                recType == null ? DefaultOpenFieldType.getDefaultOpenFieldType(ATypeTag.OBJECT) : recType;
         final IVisitablePointable recAccessor = allocator.allocateRecordValue(inputType);
         final APrintVisitor printVisitor = new APrintVisitor();
         final Pair<PrintStream, ATypeTag> arg = new Pair<>(null, null);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AOrderedListSerializerDeserializer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AOrderedListSerializerDeserializer.java
index df720f1..9307627 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AOrderedListSerializerDeserializer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AOrderedListSerializerDeserializer.java
@@ -25,7 +25,6 @@
 import java.util.List;
 
 import org.apache.asterix.builders.OrderedListBuilder;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.formats.nontagged.SerializerDeserializerProvider;
 import org.apache.asterix.om.base.AOrderedList;
 import org.apache.asterix.om.base.IAObject;
@@ -97,7 +96,7 @@
             }
             AOrderedListType type = new AOrderedListType(currentItemType, "orderedlist");
             return new AOrderedList(type, items);
-        } catch (AsterixException | IOException e) {
+        } catch (IOException e) {
             throw HyracksDataException.create(e);
         }
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
index fafa397..af36c78 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/ARecordSerializerDeserializer.java
@@ -197,8 +197,8 @@
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public static void serializeSchemalessRecord(ARecord record, DataOutput dataOutput, boolean writeTypeTag)
             throws HyracksDataException {
-        ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ASTRING);
+        ISerializerDeserializer<AString> stringSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
         RecordBuilder confRecordBuilder = new RecordBuilder();
         confRecordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE);
         ArrayBackedValueStorage fieldNameBytes = new ArrayBackedValueStorage();
@@ -219,8 +219,8 @@
     @SuppressWarnings("unchecked")
     public static void serializeSimpleSchemalessRecord(List<Pair<String, String>> record, DataOutput dataOutput,
             boolean writeTypeTag) throws HyracksDataException {
-        ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ASTRING);
+        ISerializerDeserializer<AString> stringSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
         RecordBuilder confRecordBuilder = new RecordBuilder();
         confRecordBuilder.reset(RecordUtil.FULLY_OPEN_RECORD_TYPE);
         ArrayBackedValueStorage fieldNameBytes = new ArrayBackedValueStorage();
@@ -317,11 +317,11 @@
         int fieldUtflength = UTF8StringUtil.getUTFLength(fieldName, nstart + 1);
         int fieldUtfMetaLen = UTF8StringUtil.getNumBytesToStoreLength(fieldUtflength);
 
-        IBinaryHashFunction utf8HashFunction = BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE
-                .createBinaryHashFunction();
+        IBinaryHashFunction utf8HashFunction =
+                BinaryHashFunctionFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryHashFunction();
 
-        IBinaryComparator utf8BinaryComparator = BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE
-                .createBinaryComparator();
+        IBinaryComparator utf8BinaryComparator =
+                BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator();
 
         int fieldNameHashCode = utf8HashFunction.hash(fieldName, nstart + 1, fieldUtflength + fieldUtfMetaLen);
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUnorderedListSerializerDeserializer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUnorderedListSerializerDeserializer.java
index b9afeb0..438a9bf 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUnorderedListSerializerDeserializer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/serde/AUnorderedListSerializerDeserializer.java
@@ -36,6 +36,7 @@
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.om.types.TypeTagUtil;
 import org.apache.asterix.om.utils.NonTaggedFormatUtil;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
@@ -98,7 +99,7 @@
             }
             AUnorderedListType type = new AUnorderedListType(currentItemType, "unorderedlist");
             return new AUnorderedList(type, items);
-        } catch (AsterixException | IOException e) {
+        } catch (IOException e) {
             throw HyracksDataException.create(e);
         }
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/valueproviders/PrimitiveValueProviderFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/valueproviders/PrimitiveValueProviderFactory.java
index 1a7810e..abc235d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/valueproviders/PrimitiveValueProviderFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/dataflow/data/nontagged/valueproviders/PrimitiveValueProviderFactory.java
@@ -39,12 +39,12 @@
     @Override
     public IPrimitiveValueProvider createPrimitiveValueProvider() {
         return new IPrimitiveValueProvider() {
-            final IPrimitiveValueProvider intProvider = IntegerPrimitiveValueProviderFactory.INSTANCE
-                    .createPrimitiveValueProvider();
-            final IPrimitiveValueProvider floatProvider = FloatPrimitiveValueProviderFactory.INSTANCE
-                    .createPrimitiveValueProvider();
-            final IPrimitiveValueProvider doubleProvider = DoublePrimitiveValueProviderFactory.INSTANCE
-                    .createPrimitiveValueProvider();
+            final IPrimitiveValueProvider intProvider =
+                    IntegerPrimitiveValueProviderFactory.INSTANCE.createPrimitiveValueProvider();
+            final IPrimitiveValueProvider floatProvider =
+                    FloatPrimitiveValueProviderFactory.INSTANCE.createPrimitiveValueProvider();
+            final IPrimitiveValueProvider doubleProvider =
+                    DoublePrimitiveValueProviderFactory.INSTANCE.createPrimitiveValueProvider();
 
             @Override
             public double getValue(byte[] bytes, int offset) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryTokenizerFactoryProvider.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryTokenizerFactoryProvider.java
index b5fd171..5ef7702 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryTokenizerFactoryProvider.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/BinaryTokenizerFactoryProvider.java
@@ -36,7 +36,7 @@
 
     private static final IBinaryTokenizerFactory aqlStringTokenizer =
             new DelimitedUTF8StringBinaryTokenizerFactory(true, true,
-            new UTF8WordTokenFactory(ATypeTag.SERIALIZED_STRING_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG));
+                    new UTF8WordTokenFactory(ATypeTag.SERIALIZED_STRING_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG));
 
     private static final IBinaryTokenizerFactory aqlStringNoTypeTagTokenizer =
             new DelimitedUTF8StringBinaryTokenizerFactory(true, false,
@@ -46,11 +46,11 @@
             new DelimitedUTF8StringBinaryTokenizerFactory(true, true, new HashedUTF8WordTokenFactory(
                     ATypeTag.SERIALIZED_INT32_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG));
 
-    private static final IBinaryTokenizerFactory orderedListTokenizer = new AOrderedListBinaryTokenizerFactory(
-            new AListElementTokenFactory());
+    private static final IBinaryTokenizerFactory orderedListTokenizer =
+            new AOrderedListBinaryTokenizerFactory(new AListElementTokenFactory());
 
-    private static final IBinaryTokenizerFactory unorderedListTokenizer = new AUnorderedListBinaryTokenizerFactory(
-            new AListElementTokenFactory());
+    private static final IBinaryTokenizerFactory unorderedListTokenizer =
+            new AUnorderedListBinaryTokenizerFactory(new AListElementTokenFactory());
 
     @Override
     public IBinaryTokenizerFactory getWordTokenizerFactory(ATypeTag typeTag, boolean hashedTokens,
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/LinearizeComparatorFactoryProvider.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/LinearizeComparatorFactoryProvider.java
index 3e54e99..91fb96a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/LinearizeComparatorFactoryProvider.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/LinearizeComparatorFactoryProvider.java
@@ -52,8 +52,8 @@
                 || typeTag == ATypeTag.BIGINT) {
             return addOffset(new ZCurveIntComparatorFactory(dimension), ascending);
         } else {
-            throw new AlgebricksException("Cannot propose linearizer for key with type " + typeTag + " and dimension "
-                    + dimension + ".");
+            throw new AlgebricksException(
+                    "Cannot propose linearizer for key with type " + typeTag + " and dimension " + dimension + ".");
         }
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/NormalizedKeyComputerFactoryProvider.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/NormalizedKeyComputerFactoryProvider.java
index d17fc5a..d372062 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/NormalizedKeyComputerFactoryProvider.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/formats/nontagged/NormalizedKeyComputerFactoryProvider.java
@@ -18,6 +18,7 @@
  */
 package org.apache.asterix.formats.nontagged;
 
+import org.apache.asterix.dataflow.data.nontagged.keynormalizers.AUUIDNormalizedKeyComputerFactory;
 import org.apache.asterix.dataflow.data.nontagged.keynormalizers.AWrappedAscNormalizedKeyComputerFactory;
 import org.apache.asterix.dataflow.data.nontagged.keynormalizers.AWrappedDescNormalizedKeyComputerFactory;
 import org.apache.asterix.om.types.IAType;
@@ -59,6 +60,8 @@
                     return new AWrappedAscNormalizedKeyComputerFactory(new UTF8StringNormalizedKeyComputerFactory());
                 case BINARY:
                     return new AWrappedAscNormalizedKeyComputerFactory(new ByteArrayNormalizedKeyComputerFactory());
+                case UUID:
+                    return new AWrappedAscNormalizedKeyComputerFactory(new AUUIDNormalizedKeyComputerFactory());
                 default:
                     return null;
             }
@@ -81,6 +84,8 @@
                     return new AWrappedDescNormalizedKeyComputerFactory(new UTF8StringNormalizedKeyComputerFactory());
                 case BINARY:
                     return new AWrappedDescNormalizedKeyComputerFactory(new ByteArrayNormalizedKeyComputerFactory());
+                case UUID:
+                    return new AWrappedDescNormalizedKeyComputerFactory(new AUUIDNormalizedKeyComputerFactory());
                 default:
                     return null;
             }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
new file mode 100644
index 0000000..e489cd5
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmArrayNode.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmArrayNode implements IAdmNode {
+    private final List<IAdmNode> children;
+
+    public AdmArrayNode() {
+        children = new ArrayList<>();
+    }
+
+    public AdmArrayNode(int initialCapacity) {
+        children = new ArrayList<>(initialCapacity);
+    }
+
+    public IAdmNode set(int index, boolean value) {
+        return set(index, AdmBooleanNode.get(value));
+    }
+
+    public void add(boolean value) {
+        add(AdmBooleanNode.get(value));
+    }
+
+    public void add(IAdmNode value) {
+        if (value == null) {
+            value = AdmNullNode.INSTANCE; // NOSONAR
+        }
+        children.add(value);
+    }
+
+    public IAdmNode set(int index, IAdmNode value) {
+        if (value == null) {
+            value = AdmNullNode.INSTANCE; // NOSONAR
+        }
+        return children.set(index, value);
+    }
+
+    public IAdmNode get(int index) {
+        return children.get(index);
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.ARRAY;
+    }
+
+    @Override
+    public void reset() {
+        children.clear();
+    }
+
+    @Override
+    public String toString() {
+        return children.toString();
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
new file mode 100644
index 0000000..0006668
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBigIntNode.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmBigIntNode implements IAdmNode {
+    private long value;
+
+    public AdmBigIntNode() {
+    }
+
+    public AdmBigIntNode(long value) {
+        this.value = value;
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.BIGINT;
+    }
+
+    public void set(long value) {
+        this.value = value;
+    }
+
+    public long get() {
+        return value;
+    }
+
+    @Override
+    public void reset() {
+        value = 0;
+    }
+
+    @Override
+    public String toString() {
+        return Long.toString(value);
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
new file mode 100644
index 0000000..aeebd86
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmBooleanNode.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmBooleanNode implements IAdmNode {
+
+    public static final AdmBooleanNode TRUE = new AdmBooleanNode(true);
+    public static final AdmBooleanNode FALSE = new AdmBooleanNode(false);
+    private final boolean value;
+
+    private AdmBooleanNode(boolean value) {
+        this.value = value;
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.BOOLEAN;
+    }
+
+    public boolean get() {
+        return value;
+    }
+
+    @Override
+    public void reset() {
+        // Nothing to do
+    }
+
+    public static AdmBooleanNode get(boolean value) {
+        return value ? TRUE : FALSE;
+    }
+
+    public static AdmBooleanNode get(Boolean value) {
+        return value.booleanValue() ? TRUE : FALSE;
+    }
+
+    @Override
+    public String toString() {
+        return Boolean.toString(value);
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
new file mode 100644
index 0000000..0150b4e
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmDoubleNode.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmDoubleNode implements IAdmNode {
+    private double value;
+
+    public AdmDoubleNode() {
+
+    }
+
+    public AdmDoubleNode(double value) {
+        this.value = value;
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.DOUBLE;
+    }
+
+    public void set(double value) {
+        this.value = value;
+    }
+
+    public double get() {
+        return value;
+    }
+
+    @Override
+    public void reset() {
+        value = 0;
+    }
+
+    @Override
+    public String toString() {
+        return Double.toString(value);
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
new file mode 100644
index 0000000..2804ca3
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmNullNode.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmNullNode implements IAdmNode {
+
+    public static final AdmNullNode INSTANCE = new AdmNullNode();
+
+    private AdmNullNode() {
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.NULL;
+    }
+
+    @Override
+    public void reset() {
+        // Nothing to reset
+    }
+
+    @Override
+    public String toString() {
+        return "null";
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
new file mode 100644
index 0000000..e35b28f
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmObjectNode.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+/**
+ * An adm object instance
+ */
+public class AdmObjectNode implements IAdmNode {
+    private final Map<String, IAdmNode> children;
+
+    public AdmObjectNode() {
+        children = new HashMap<>();
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.OBJECT;
+    }
+
+    public int size() {
+        return children.size();
+    }
+
+    public IAdmNode get(String fieldName) {
+        return children.get(fieldName);
+    }
+
+    public Set<String> getFieldNames() {
+        return children.keySet();
+    }
+
+    public Set<Entry<String, IAdmNode>> getFields() {
+        return children.entrySet();
+    }
+
+    public AdmObjectNode set(String fieldName, IAdmNode value) {
+        if (value == null) {
+            value = AdmNullNode.INSTANCE; // NOSONAR
+        }
+        children.put(fieldName, value);
+        return this;
+    }
+
+    public IAdmNode remove(String fieldName) {
+        return children.remove(fieldName);
+    }
+
+    @Override
+    public void reset() {
+        children.clear();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("{");
+        int count = 0;
+        for (Map.Entry<String, IAdmNode> en : children.entrySet()) {
+            if (count > 0) {
+                sb.append(",");
+            }
+            ++count;
+            sb.append('"');
+            sb.append(en.getKey());
+            sb.append('"');
+            sb.append(':');
+            sb.append(en.getValue().toString());
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
new file mode 100644
index 0000000..4c92f09
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/AdmStringNode.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+public class AdmStringNode implements IAdmNode {
+    private String value;
+
+    public AdmStringNode() {
+    }
+
+    public AdmStringNode(String value) {
+        this.value = value;
+    }
+
+    @Override
+    public ATypeTag getType() {
+        return ATypeTag.STRING;
+    }
+
+    public String get() {
+        return value;
+    }
+
+    @Override
+    public void reset() {
+        value = null;
+    }
+
+    @Override
+    public String toString() {
+        return "\"" + value + "\"";
+    }
+
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
new file mode 100644
index 0000000..c382fd2
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/object/base/IAdmNode.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.object.base;
+
+import org.apache.asterix.om.types.ATypeTag;
+
+/**
+ * An interface representing an adm node
+ */
+public interface IAdmNode {
+
+    /**
+     * @return true if the object is a value, false if the object is a container
+     */
+    default boolean isValueNode() {
+        switch (getType()) {
+            case ARRAY:
+            case OBJECT:
+            case MULTISET:
+                return false;
+            default:
+                return true;
+        }
+    }
+
+    /**
+     * @return true if the object is an array, false otherwise
+     */
+    default boolean isArray() {
+        return getType() == ATypeTag.ARRAY;
+    }
+
+    /**
+     * @return true if the object is an adm object, false otherwise
+     */
+    default boolean isObject() {
+        return getType() == ATypeTag.OBJECT;
+    }
+
+    /**
+     * @return the type tag of the object
+     */
+    ATypeTag getType();
+
+    /**
+     * reset the node
+     */
+    void reset();
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
index 4bcd4c9..ff32903 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABinary.java
@@ -105,7 +105,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
index a0c572c..5589205 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ABoolean.java
@@ -74,7 +74,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         return new ObjectMapper().createObjectNode().put("ABoolean", bVal);
     }
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
index 9c2369d..93f8663 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ACircle.java
@@ -75,7 +75,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
index 3d7639e..2a80f28 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
@@ -89,7 +89,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
index cf6fff0..efcb828 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADateTime.java
@@ -130,7 +130,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADayTimeDuration.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADayTimeDuration.java
index 95e677b..6017d4b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADayTimeDuration.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADayTimeDuration.java
@@ -41,7 +41,7 @@
      * @see org.apache.hyracks.api.dataflow.value.JSONSerializable#toJSON()
      */
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
index 4c307f4..0a6c7d4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADouble.java
@@ -71,7 +71,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
index 618f130..5e22711 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADuration.java
@@ -110,7 +110,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
index 4ad1b50..a44034a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AFloat.java
@@ -71,7 +71,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AGeneratedUUID.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AGeneratedUUID.java
index da1b35b..f0071b6 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AGeneratedUUID.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AGeneratedUUID.java
@@ -26,12 +26,13 @@
 public class AGeneratedUUID extends AUUID {
 
     private static class Holder {
-        static final byte [] hostUnique = new byte[4];
+        static final byte[] hostUnique = new byte[4];
 
         static {
             new SecureRandom().nextBytes(hostUnique);
-       }
+        }
     }
+
     static final Random random = new Random();
     static final AtomicInteger nextInstance = new AtomicInteger(random.nextInt());
 
@@ -45,10 +46,10 @@
         System.arraycopy(Holder.hostUnique, 0, uuidBytes, 0, 4);
 
         // overwrite the next four bytes with the thread unique value
-        uuidBytes[5] = (byte)(unique >> 24);
-        uuidBytes[6] = (byte)(unique >> 16);
-        uuidBytes[7] = (byte)(unique >> 8);
-        uuidBytes[8] = (byte)unique;
+        uuidBytes[5] = (byte) (unique >> 24);
+        uuidBytes[6] = (byte) (unique >> 16);
+        uuidBytes[7] = (byte) (unique >> 8);
+        uuidBytes[8] = (byte) unique;
     }
 
     public void nextUUID() {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
index 65c53ac..727ba45 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt16.java
@@ -61,7 +61,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
 
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
index ae96578..2da4708 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt32.java
@@ -72,7 +72,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
index ef69856..5e20f67 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt64.java
@@ -60,7 +60,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
index 9d0f4b2..53ecd54 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInt8.java
@@ -60,7 +60,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
index 2d54786..150575f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AInterval.java
@@ -64,15 +64,15 @@
             return false;
         } else {
             AInterval t = (AInterval) o;
-            return (t.intervalStart == this.intervalStart || t.intervalEnd == this.intervalEnd
-                    && t.typetag == this.typetag);
+            return (t.intervalStart == this.intervalStart
+                    || t.intervalEnd == this.intervalEnd && t.typetag == this.typetag);
         }
     }
 
     @Override
     public int hashCode() {
-        return (int) (((int) (this.intervalStart ^ (this.intervalStart >>> 32))) * 31 + (int) (this.intervalEnd ^ (this.intervalEnd >>> 32)))
-                * 31 + (int) this.typetag;
+        return (int) (((int) (this.intervalStart ^ (this.intervalStart >>> 32))) * 31
+                + (int) (this.intervalEnd ^ (this.intervalEnd >>> 32))) * 31 + (int) this.typetag;
     }
 
     /* (non-Javadoc)
@@ -99,9 +99,8 @@
             if (typetag == ATypeTag.DATE.serialize()) {
                 sbder.append("date: { ");
 
-                GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(
-                        intervalStart * ADate.CHRONON_OF_DAY, 0, sbder, GregorianCalendarSystem.Fields.YEAR,
-                        GregorianCalendarSystem.Fields.DAY, false);
+                GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalStart * ADate.CHRONON_OF_DAY,
+                        0, sbder, GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.DAY, false);
 
                 sbder.append(" }, date: {");
                 GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(intervalEnd * ADate.CHRONON_OF_DAY,
@@ -145,7 +144,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         // TODO(madhusudancs): Remove this method when a printer based JSON serializer is implemented.
         return null;
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
index 67ae2d5..66ec23e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ALine.java
@@ -68,7 +68,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMissing.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMissing.java
index a404032..e38dc76 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMissing.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMissing.java
@@ -52,7 +52,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
index c9e581c..2fb69ab 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AMutableUUID.java
@@ -27,9 +27,9 @@
         if (tokenImage.length() != UUID_CHARS) {
             throw new HyracksDataException("This is not a correct UUID value: " + tokenImage);
         }
-        byte [] hexBytes = new byte[UUID_CHARS];
+        byte[] hexBytes = new byte[UUID_CHARS];
         for (int i = 0; i < tokenImage.length(); i++) {
-            hexBytes[i] = (byte)tokenImage.charAt(i);
+            hexBytes[i] = (byte) tokenImage.charAt(i);
         }
         parseUUIDHexBytes(hexBytes, 0);
     }
@@ -68,9 +68,9 @@
     }
 
     // Calculate a long value from a hex string.
-    private static void decodeBytesFromHex(byte[] hexArray, int hexArrayOffset, byte[] outputArray, int outputOffset, int length)
-            throws HyracksDataException {
-        for (int i = hexArrayOffset; i < hexArrayOffset + length; ) {
+    private static void decodeBytesFromHex(byte[] hexArray, int hexArrayOffset, byte[] outputArray, int outputOffset,
+            int length) throws HyracksDataException {
+        for (int i = hexArrayOffset; i < hexArrayOffset + length;) {
             int hi = transformHexCharToInt(hexArray[i++]);
             outputArray[outputOffset++] = (byte) (hi << 4 | transformHexCharToInt(hexArray[i++]));
         }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ANull.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ANull.java
index 6be4832..ee7b822 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ANull.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ANull.java
@@ -52,7 +52,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
         json.put("ANull", "null");
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
index 3c1a165..785c62d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AOrderedList.java
@@ -120,7 +120,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
index 66e96f0..d2d45f9 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint.java
@@ -68,7 +68,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
         ObjectNode point = om.createObjectNode();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
index 9a4a06e..81f8a6b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APoint3D.java
@@ -74,7 +74,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
index eb4f1b4..3cb0f5c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/APolygon.java
@@ -88,7 +88,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
index aed969c..d964079 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARecord.java
@@ -99,7 +99,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
index d6da9e5..8a527c9 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ARectangle.java
@@ -68,7 +68,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
index aefe5f7..e6b8f7c8 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AString.java
@@ -72,7 +72,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
index a14d386..5375f7e 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ATime.java
@@ -105,7 +105,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
index 0ed9d3f..433ff8b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUUID.java
@@ -56,7 +56,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
         json.put("AUUID", toString());
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
index 894421c..137171d 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AUnorderedList.java
@@ -103,7 +103,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
index 8321848..fd35adf 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/AYearMonthDuration.java
@@ -55,7 +55,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateTimeParserFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateTimeParserFactory.java
index b5cac1b..9cee5869 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateTimeParserFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADateTimeParserFactory.java
@@ -59,8 +59,8 @@
 
                 chrononTimeInMs = ADateParserFactory.parseDatePart(buffer, start, timeOffset);
 
-                chrononTimeInMs += ATimeParserFactory.parseTimePart(buffer, start + timeOffset + 1, length - timeOffset
-                        - 1);
+                chrononTimeInMs +=
+                        ATimeParserFactory.parseTimePart(buffer, start + timeOffset + 1, length - timeOffset - 1);
 
                 try {
                     out.writeLong(chrononTimeInMs);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADurationParserFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADurationParserFactory.java
index cca37e4..6e7721f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADurationParserFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ADurationParserFactory.java
@@ -35,7 +35,8 @@
 
     private static final long serialVersionUID = 1L;
 
-    private static final String durationErrorMessage = "Wrong Input Format for a duration/year-month-duration/day-time-duration Value";
+    private static final String durationErrorMessage =
+            "Wrong Input Format for a duration/year-month-duration/day-time-duration Value";
     private static final String onlyYearMonthErrorMessage = "Only year-month fields are allowed";
     private static final String onlyDayTimeErrorMessage = "Only day-time fields are allowed";
 
@@ -214,11 +215,11 @@
                                 if (charAccessor.getCharAt(offset + i) >= '0'
                                         && charAccessor.getCharAt(offset + i) <= '9') {
                                     if (i < 4) {
-                                        millisecond = millisecond * DECIMAL_UNIT
-                                                + (charAccessor.getCharAt(offset + i) - '0');
+                                        millisecond =
+                                                millisecond * DECIMAL_UNIT + (charAccessor.getCharAt(offset + i) - '0');
                                     } else {
-                                        throw new HyracksDataException(durationErrorMessage
-                                                + ": wrong MILLISECOND field.");
+                                        throw new HyracksDataException(
+                                                durationErrorMessage + ": wrong MILLISECOND field.");
                                     }
                                 } else {
                                     break;
@@ -253,10 +254,9 @@
         }
 
         int totalMonths = sign * (year * 12 + month);
-        long totalMilliseconds = sign
-                * (day * GregorianCalendarSystem.CHRONON_OF_DAY + hour * GregorianCalendarSystem.CHRONON_OF_HOUR
-                        + minute * GregorianCalendarSystem.CHRONON_OF_MINUTE + second
-                        * GregorianCalendarSystem.CHRONON_OF_SECOND + millisecond);
+        long totalMilliseconds = sign * (day * GregorianCalendarSystem.CHRONON_OF_DAY
+                + hour * GregorianCalendarSystem.CHRONON_OF_HOUR + minute * GregorianCalendarSystem.CHRONON_OF_MINUTE
+                + second * GregorianCalendarSystem.CHRONON_OF_SECOND + millisecond);
 
         if (sign > 0) {
             if (totalMonths < 0) {
@@ -264,9 +264,8 @@
                         + ": total number of months is beyond its max value (-2147483647 to 2147483647).");
             }
             if (totalMilliseconds < 0) {
-                throw new HyracksDataException(
-                        durationErrorMessage
-                                + ": total number of milliseconds is beyond its max value (-9223372036854775808 to 9223372036854775807).");
+                throw new HyracksDataException(durationErrorMessage
+                        + ": total number of milliseconds is beyond its max value (-9223372036854775808 to 9223372036854775807).");
             }
         }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ATimeParserFactory.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ATimeParserFactory.java
index 2b97005..e14720a 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ATimeParserFactory.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/ATimeParserFactory.java
@@ -146,7 +146,8 @@
             }
 
             // error is thrown if more than three digits are seen for the millisecond part
-            if (length > offset && timeString.charAt(start + offset) >= '0' && timeString.charAt(start + offset) <= '9') {
+            if (length > offset && timeString.charAt(start + offset) >= '0'
+                    && timeString.charAt(start + offset) <= '9') {
                 throw new HyracksDataException(timeErrorMessage + ": too many fields for millisecond.");
             }
         }
@@ -188,16 +189,17 @@
             int temp_offset = (timeString.charAt(start + 3) == ':') ? 1 : 0;
 
             for (int i = 0; i < 2; i++) {
-                if ((timeString.charAt(start + temp_offset + 3 + i) >= '0' && timeString.charAt(start + temp_offset + 3
-                        + i) <= '9')) {
-                    timezoneMinute = (short) (timezoneMinute * 10 + timeString.charAt(start + temp_offset + 3 + i) - '0');
+                if ((timeString.charAt(start + temp_offset + 3 + i) >= '0'
+                        && timeString.charAt(start + temp_offset + 3 + i) <= '9')) {
+                    timezoneMinute =
+                            (short) (timezoneMinute * 10 + timeString.charAt(start + temp_offset + 3 + i) - '0');
                 } else {
                     throw new HyracksDataException(timeErrorMessage + ": Non-numeric value in timezone minute field");
                 }
             }
 
-            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR + timezoneMinute
-                    * GregorianCalendarSystem.CHRONON_OF_MINUTE);
+            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR
+                    + timezoneMinute * GregorianCalendarSystem.CHRONON_OF_MINUTE);
 
             if (timeString.charAt(start) == '+') {
                 timezone *= -1;
@@ -343,15 +345,16 @@
             int temp_offset = (timeString[start + 3] == ':') ? 1 : 0;
 
             for (int i = 0; i < 2; i++) {
-                if ((timeString[start + temp_offset + 3 + i] >= '0' && timeString[start + temp_offset + 3 + i] <= '9')) {
+                if ((timeString[start + temp_offset + 3 + i] >= '0'
+                        && timeString[start + temp_offset + 3 + i] <= '9')) {
                     timezoneMinute = (short) (timezoneMinute * 10 + timeString[start + temp_offset + 3 + i] - '0');
                 } else {
                     throw new HyracksDataException(timeErrorMessage + ": Non-numeric value in timezone minute field");
                 }
             }
 
-            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR + timezoneMinute
-                    * GregorianCalendarSystem.CHRONON_OF_MINUTE);
+            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR
+                    + timezoneMinute * GregorianCalendarSystem.CHRONON_OF_MINUTE);
 
             if (timeString[start] == '+') {
                 timezone *= -1;
@@ -497,15 +500,16 @@
             int temp_offset = (timeString[start + 3] == ':') ? 1 : 0;
 
             for (int i = 0; i < 2; i++) {
-                if ((timeString[start + temp_offset + 3 + i] >= '0' && timeString[start + temp_offset + 3 + i] <= '9')) {
+                if ((timeString[start + temp_offset + 3 + i] >= '0'
+                        && timeString[start + temp_offset + 3 + i] <= '9')) {
                     timezoneMinute = (short) (timezoneMinute * 10 + timeString[start + temp_offset + 3 + i] - '0');
                 } else {
                     throw new HyracksDataException(timeErrorMessage + ": Non-numeric value in timezone minute field");
                 }
             }
 
-            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR + timezoneMinute
-                    * GregorianCalendarSystem.CHRONON_OF_MINUTE);
+            timezone = (int) (timezoneHour * GregorianCalendarSystem.CHRONON_OF_HOUR
+                    + timezoneMinute * GregorianCalendarSystem.CHRONON_OF_MINUTE);
 
             if (timeString[start] == '+') {
                 timezone *= -1;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
index 1051458..300d696 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/DateTimeFormatUtils.java
@@ -308,8 +308,8 @@
                     break;
                 case DAY_CHAR:
                     processState = DateTimeProcessState.DAY;
-                    pointerMove = parseFormatField(format, formatStart, formatLength, formatPointer, DAY_CHAR,
-                            MAX_DAY_CHARS);
+                    pointerMove =
+                            parseFormatField(format, formatStart, formatLength, formatPointer, DAY_CHAR, MAX_DAY_CHARS);
                     formatPointer += pointerMove;
                     formatCharCopies += pointerMove;
                     break;
@@ -762,8 +762,8 @@
                     break;
                 case DAY_CHAR:
                     processState = DateTimeProcessState.DAY;
-                    pointerMove = parseFormatField(format, formatStart, formatLength, formatPointer, DAY_CHAR,
-                            MAX_DAY_CHARS);
+                    pointerMove =
+                            parseFormatField(format, formatStart, formatLength, formatPointer, DAY_CHAR, MAX_DAY_CHARS);
                     formatPointer += pointerMove;
                     formatCharCopies += pointerMove;
                     break;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
index 7f79478..dd711a8 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/temporal/GregorianCalendarSystem.java
@@ -212,8 +212,8 @@
      */
     public long getChronon(int year, int month, int day, int hour, int min, int sec, int millis, int timezone) {
         // Added milliseconds for all fields but month and day
-        long chrononTime = chrononizeBeginningOfYear(year) + hour * CHRONON_OF_HOUR + min * CHRONON_OF_MINUTE + sec
-                * CHRONON_OF_SECOND + millis + timezone;
+        long chrononTime = chrononizeBeginningOfYear(year) + hour * CHRONON_OF_HOUR + min * CHRONON_OF_MINUTE
+                + sec * CHRONON_OF_SECOND + millis + timezone;
 
         // Added milliseconds for days of the month.
         chrononTime += (day - 1 + DAYS_SINCE_MONTH_BEGIN_ORDI[month - 1]) * CHRONON_OF_DAY;
@@ -238,8 +238,8 @@
      */
     public int getChronon(int hour, int min, int sec, int millis, int timezone) {
         // Added milliseconds for all fields but month and day
-        long chrononTime = hour * CHRONON_OF_HOUR + min * CHRONON_OF_MINUTE + sec * CHRONON_OF_SECOND + millis
-                + timezone;
+        long chrononTime =
+                hour * CHRONON_OF_HOUR + min * CHRONON_OF_MINUTE + sec * CHRONON_OF_SECOND + millis + timezone;
         return (int) chrononTime;
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java
index c84b9e2..699629b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/exceptions/InvalidExpressionException.java
@@ -32,15 +32,13 @@
 
     public InvalidExpressionException(FunctionIdentifier fid, int index, ILogicalExpression actualExpr,
             LogicalExpressionTag... exprKinds) {
-        super(ErrorCode.COMPILATION_INVALID_EXPRESSION, fid.getName(), indexToPosition(index),
-                actualExpr.toString(),
+        super(ErrorCode.COMPILATION_INVALID_EXPRESSION, fid.getName(), indexToPosition(index), actualExpr.toString(),
                 toExpectedTypeString(exprKinds));
     }
 
     public InvalidExpressionException(String functionName, int index, ILogicalExpression actualExpr,
             LogicalExpressionTag... exprKinds) {
-        super(ErrorCode.COMPILATION_INVALID_EXPRESSION, functionName, indexToPosition(index),
-                actualExpr.toString(),
+        super(ErrorCode.COMPILATION_INVALID_EXPRESSION, functionName, indexToPosition(index), actualExpr.toString(),
                 toExpectedTypeString(exprKinds));
     }
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index 863847b..d749899 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -134,7 +134,7 @@
     private static final Map<IFunctionInfo, IResultTypeComputer> funTypeComputer = new HashMap<>();
 
     private static final Set<IFunctionInfo> builtinAggregateFunctions = new HashSet<>();
-    private static final Set<IFunctionInfo> datasetFunctions = new HashSet<>();
+    private static final Map<IFunctionInfo, IFunctionToDataSourceRewriter> datasourceFunctions = new HashMap<>();
     private static final Set<IFunctionInfo> similarityFunctions = new HashSet<>();
     private static final Set<IFunctionInfo> globalAggregateFunctions = new HashSet<>();
     private static final Map<IFunctionInfo, IFunctionInfo> aggregateToLocalAggregate = new HashMap<>();
@@ -149,395 +149,395 @@
     private static final Map<IFunctionInfo, SpatialFilterKind> spatialFilterFunctions = new HashMap<>();
 
     public static final FunctionIdentifier TYPE_OF = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "type-of", 1);
-    public static final FunctionIdentifier GET_HANDLE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-handle", 2);
-    public static final FunctionIdentifier GET_DATA = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-data",
-            2);
+    public static final FunctionIdentifier GET_HANDLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-handle", 2);
+    public static final FunctionIdentifier GET_DATA =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-data", 2);
 
-    public static final FunctionIdentifier GET_ITEM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-item",
-            2);
-    public static final FunctionIdentifier ANY_COLLECTION_MEMBER = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "any-collection-member", 1);
+    public static final FunctionIdentifier GET_ITEM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-item", 2);
+    public static final FunctionIdentifier ANY_COLLECTION_MEMBER =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "any-collection-member", 1);
     public static final FunctionIdentifier LISTIFY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "listify", 1);
     public static final FunctionIdentifier LEN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "len", 1);
 
-    public static final FunctionIdentifier CONCAT_NON_NULL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "concat-non-null", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier EMPTY_STREAM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "empty-stream", 0);
-    public static final FunctionIdentifier NON_EMPTY_STREAM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "non-empty-stream", 0);
+    public static final FunctionIdentifier CONCAT_NON_NULL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "concat-non-null", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier EMPTY_STREAM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "empty-stream", 0);
+    public static final FunctionIdentifier NON_EMPTY_STREAM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "non-empty-stream", 0);
     public static final FunctionIdentifier ORDERED_LIST_CONSTRUCTOR = new FunctionIdentifier(
             FunctionConstants.ASTERIX_NS, "ordered-list-constructor", FunctionIdentifier.VARARGS);
     public static final FunctionIdentifier UNORDERED_LIST_CONSTRUCTOR = new FunctionIdentifier(
             FunctionConstants.ASTERIX_NS, "unordered-list-constructor", FunctionIdentifier.VARARGS);
 
-    public static final FunctionIdentifier DEEP_EQUAL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "deep-equal", 2);
+    public static final FunctionIdentifier DEEP_EQUAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "deep-equal", 2);
 
     // objects
-    public static final FunctionIdentifier RECORD_MERGE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "object-merge", 2);
-    public static final FunctionIdentifier REMOVE_FIELDS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "object-remove-fields", 2);
-    public static final FunctionIdentifier ADD_FIELDS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "object-add-fields", 2);
+    public static final FunctionIdentifier RECORD_MERGE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "object-merge", 2);
+    public static final FunctionIdentifier REMOVE_FIELDS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "object-remove-fields", 2);
+    public static final FunctionIdentifier ADD_FIELDS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "object-add-fields", 2);
 
     public static final FunctionIdentifier CLOSED_RECORD_CONSTRUCTOR = new FunctionIdentifier(
             FunctionConstants.ASTERIX_NS, "closed-object-constructor", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier OPEN_RECORD_CONSTRUCTOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "open-object-constructor", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier FIELD_ACCESS_BY_INDEX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "field-access-by-index", 2);
-    public static final FunctionIdentifier FIELD_ACCESS_BY_NAME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "field-access-by-name", 2);
-    public static final FunctionIdentifier FIELD_ACCESS_NESTED = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "field-access-nested", 2);
-    public static final FunctionIdentifier GET_RECORD_FIELDS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-object-fields", 1);
-    public static final FunctionIdentifier GET_RECORD_FIELD_VALUE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-object-field-value", 2);
-    public static final FunctionIdentifier RECORD_PAIRS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "object-pairs", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier OPEN_RECORD_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "open-object-constructor", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier FIELD_ACCESS_BY_INDEX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "field-access-by-index", 2);
+    public static final FunctionIdentifier FIELD_ACCESS_BY_NAME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "field-access-by-name", 2);
+    public static final FunctionIdentifier FIELD_ACCESS_NESTED =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "field-access-nested", 2);
+    public static final FunctionIdentifier GET_RECORD_FIELDS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-object-fields", 1);
+    public static final FunctionIdentifier GET_RECORD_FIELD_VALUE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-object-field-value", 2);
+    public static final FunctionIdentifier RECORD_PAIRS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "object-pairs", FunctionIdentifier.VARARGS);
 
     // numeric
-    public static final FunctionIdentifier NUMERIC_UNARY_MINUS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-unary-minus", 1);
-    public static final FunctionIdentifier NUMERIC_SUBTRACT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-subtract", 2);
-    public static final FunctionIdentifier NUMERIC_MULTIPLY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-multiply", 2);
-    public static final FunctionIdentifier NUMERIC_DIVIDE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-divide", 2);
-    public static final FunctionIdentifier NUMERIC_MOD = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-mod", 2);
-    public static final FunctionIdentifier NUMERIC_IDIV = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "numeric-idiv", 2);
+    public static final FunctionIdentifier NUMERIC_UNARY_MINUS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-unary-minus", 1);
+    public static final FunctionIdentifier NUMERIC_SUBTRACT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-subtract", 2);
+    public static final FunctionIdentifier NUMERIC_MULTIPLY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-multiply", 2);
+    public static final FunctionIdentifier NUMERIC_DIVIDE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-divide", 2);
+    public static final FunctionIdentifier NUMERIC_MOD =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-mod", 2);
+    public static final FunctionIdentifier NUMERIC_IDIV =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "numeric-idiv", 2);
     public static final FunctionIdentifier CARET = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "caret", 2);
     public static final FunctionIdentifier NUMERIC_ABS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "abs", 1);
-    public static final FunctionIdentifier NUMERIC_ACOS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "acos",
-            1);
-    public static final FunctionIdentifier NUMERIC_ASIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "asin",
-            1);
-    public static final FunctionIdentifier NUMERIC_ATAN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "atan",
-            1);
-    public static final FunctionIdentifier NUMERIC_ATAN2 = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "atan2",
-            2);
+    public static final FunctionIdentifier NUMERIC_ACOS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "acos", 1);
+    public static final FunctionIdentifier NUMERIC_ASIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "asin", 1);
+    public static final FunctionIdentifier NUMERIC_ATAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "atan", 1);
+    public static final FunctionIdentifier NUMERIC_ATAN2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "atan2", 2);
     public static final FunctionIdentifier NUMERIC_COS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "cos", 1);
     public static final FunctionIdentifier NUMERIC_SIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sin", 1);
     public static final FunctionIdentifier NUMERIC_TAN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "tan", 1);
     public static final FunctionIdentifier NUMERIC_EXP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "exp", 1);
     public static final FunctionIdentifier NUMERIC_LN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ln", 1);
     public static final FunctionIdentifier NUMERIC_LOG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "log", 1);
-    public static final FunctionIdentifier NUMERIC_SQRT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sqrt",
-            1);
-    public static final FunctionIdentifier NUMERIC_SIGN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sign",
-            1);
+    public static final FunctionIdentifier NUMERIC_SQRT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sqrt", 1);
+    public static final FunctionIdentifier NUMERIC_SIGN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sign", 1);
 
-    public static final FunctionIdentifier NUMERIC_CEILING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "ceiling", 1);
-    public static final FunctionIdentifier NUMERIC_FLOOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "floor",
-            1);
-    public static final FunctionIdentifier NUMERIC_ROUND = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "round",
-            1);
-    public static final FunctionIdentifier NUMERIC_ROUND_HALF_TO_EVEN = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "round-half-to-even", 1);
-    public static final FunctionIdentifier NUMERIC_ROUND_HALF_TO_EVEN2 = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "round-half-to-even", 2);
-    public static final FunctionIdentifier NUMERIC_TRUNC = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trunc",
-            2);
+    public static final FunctionIdentifier NUMERIC_CEILING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ceiling", 1);
+    public static final FunctionIdentifier NUMERIC_FLOOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "floor", 1);
+    public static final FunctionIdentifier NUMERIC_ROUND =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "round", 1);
+    public static final FunctionIdentifier NUMERIC_ROUND_HALF_TO_EVEN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "round-half-to-even", 1);
+    public static final FunctionIdentifier NUMERIC_ROUND_HALF_TO_EVEN2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "round-half-to-even", 2);
+    public static final FunctionIdentifier NUMERIC_TRUNC =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trunc", 2);
 
     // binary functions
-    public static final FunctionIdentifier BINARY_LENGTH = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "binary-length", 1);
-    public static final FunctionIdentifier PARSE_BINARY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "parse-binary", 2);
-    public static final FunctionIdentifier PRINT_BINARY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "print-binary", 2);
-    public static final FunctionIdentifier BINARY_CONCAT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "binary-concat", 1);
-    public static final FunctionIdentifier SUBBINARY_FROM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sub-binary", 2);
-    public static final FunctionIdentifier SUBBINARY_FROM_TO = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sub-binary", 3);
-    public static final FunctionIdentifier FIND_BINARY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "find-binary", 2);
-    public static final FunctionIdentifier FIND_BINARY_FROM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "find-binary", 3);
+    public static final FunctionIdentifier BINARY_LENGTH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "binary-length", 1);
+    public static final FunctionIdentifier PARSE_BINARY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "parse-binary", 2);
+    public static final FunctionIdentifier PRINT_BINARY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "print-binary", 2);
+    public static final FunctionIdentifier BINARY_CONCAT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "binary-concat", 1);
+    public static final FunctionIdentifier SUBBINARY_FROM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sub-binary", 2);
+    public static final FunctionIdentifier SUBBINARY_FROM_TO =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sub-binary", 3);
+    public static final FunctionIdentifier FIND_BINARY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "find-binary", 2);
+    public static final FunctionIdentifier FIND_BINARY_FROM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "find-binary", 3);
     // String funcitons
-    public static final FunctionIdentifier STRING_EQUAL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string-equal", 2);
-    public static final FunctionIdentifier STRING_MATCHES = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "matches", 2);
-    public static final FunctionIdentifier STRING_MATCHES_WITH_FLAG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "matches", 3);
-    public static final FunctionIdentifier STRING_REGEXP_LIKE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "regexp-like", 2);
-    public static final FunctionIdentifier STRING_REGEXP_LIKE_WITH_FLAG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "regexp-like", 3);
-    public static final FunctionIdentifier STRING_REGEXP_POSITION = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "regexp-position", 2);
-    public static final FunctionIdentifier STRING_REGEXP_POSITION_WITH_FLAG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "regexp-position", 3);
-    public static final FunctionIdentifier STRING_LOWERCASE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "lowercase", 1);
-    public static final FunctionIdentifier STRING_UPPERCASE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "uppercase", 1);
-    public static final FunctionIdentifier STRING_INITCAP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "initcap", 1);
-    public static final FunctionIdentifier STRING_TRIM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trim",
-            1);
-    public static final FunctionIdentifier STRING_LTRIM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ltrim",
-            1);
-    public static final FunctionIdentifier STRING_RTRIM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "rtrim",
-            1);
-    public static final FunctionIdentifier STRING_TRIM2 = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trim",
-            2);
-    public static final FunctionIdentifier STRING_LTRIM2 = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "ltrim", 2);
-    public static final FunctionIdentifier STRING_RTRIM2 = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "rtrim", 2);
-    public static final FunctionIdentifier STRING_POSITION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "position", 2);
-    public static final FunctionIdentifier STRING_REPLACE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "replace", 3);
-    public static final FunctionIdentifier STRING_REPLACE_WITH_FLAG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "replace", 4);
-    public static final FunctionIdentifier STRING_LENGTH = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string-length", 1);
-    public static final FunctionIdentifier STRING_LIKE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "like",
-            2);
-    public static final FunctionIdentifier STRING_CONTAINS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "contains", 2);
-    public static final FunctionIdentifier STRING_STARTS_WITH = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "starts-with", 2);
-    public static final FunctionIdentifier STRING_ENDS_WITH = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "ends-with", 2);
-    public static final FunctionIdentifier SUBSTRING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "substring",
-            3);
-    public static final FunctionIdentifier SUBSTRING2 = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "substring", 2);
-    public static final FunctionIdentifier SUBSTRING_BEFORE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "substring-before", 2);
-    public static final FunctionIdentifier SUBSTRING_AFTER = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "substring-after", 2);
-    public static final FunctionIdentifier STRING_TO_CODEPOINT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string-to-codepoint", 1);
-    public static final FunctionIdentifier CODEPOINT_TO_STRING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "codepoint-to-string", 1);
-    public static final FunctionIdentifier STRING_CONCAT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string-concat", 1);
-    public static final FunctionIdentifier STRING_JOIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string-join", 2);
-    public static final FunctionIdentifier STRING_REPEAT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "repeat", 2);
-    public static final FunctionIdentifier STRING_SPLIT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "split",
-            2);
+    public static final FunctionIdentifier STRING_EQUAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-equal", 2);
+    public static final FunctionIdentifier STRING_MATCHES =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "matches", 2);
+    public static final FunctionIdentifier STRING_MATCHES_WITH_FLAG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "matches", 3);
+    public static final FunctionIdentifier STRING_REGEXP_LIKE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "regexp-like", 2);
+    public static final FunctionIdentifier STRING_REGEXP_LIKE_WITH_FLAG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "regexp-like", 3);
+    public static final FunctionIdentifier STRING_REGEXP_POSITION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "regexp-position", 2);
+    public static final FunctionIdentifier STRING_REGEXP_POSITION_WITH_FLAG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "regexp-position", 3);
+    public static final FunctionIdentifier STRING_LOWERCASE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "lowercase", 1);
+    public static final FunctionIdentifier STRING_UPPERCASE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "uppercase", 1);
+    public static final FunctionIdentifier STRING_INITCAP =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "initcap", 1);
+    public static final FunctionIdentifier STRING_TRIM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trim", 1);
+    public static final FunctionIdentifier STRING_LTRIM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ltrim", 1);
+    public static final FunctionIdentifier STRING_RTRIM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "rtrim", 1);
+    public static final FunctionIdentifier STRING_TRIM2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "trim", 2);
+    public static final FunctionIdentifier STRING_LTRIM2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ltrim", 2);
+    public static final FunctionIdentifier STRING_RTRIM2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "rtrim", 2);
+    public static final FunctionIdentifier STRING_POSITION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "position", 2);
+    public static final FunctionIdentifier STRING_REPLACE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "replace", 3);
+    public static final FunctionIdentifier STRING_REPLACE_WITH_FLAG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "replace", 4);
+    public static final FunctionIdentifier STRING_LENGTH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-length", 1);
+    public static final FunctionIdentifier STRING_LIKE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "like", 2);
+    public static final FunctionIdentifier STRING_CONTAINS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "contains", 2);
+    public static final FunctionIdentifier STRING_STARTS_WITH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "starts-with", 2);
+    public static final FunctionIdentifier STRING_ENDS_WITH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ends-with", 2);
+    public static final FunctionIdentifier SUBSTRING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "substring", 3);
+    public static final FunctionIdentifier SUBSTRING2 =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "substring", 2);
+    public static final FunctionIdentifier SUBSTRING_BEFORE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "substring-before", 2);
+    public static final FunctionIdentifier SUBSTRING_AFTER =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "substring-after", 2);
+    public static final FunctionIdentifier STRING_TO_CODEPOINT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-to-codepoint", 1);
+    public static final FunctionIdentifier CODEPOINT_TO_STRING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "codepoint-to-string", 1);
+    public static final FunctionIdentifier STRING_CONCAT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-concat", 1);
+    public static final FunctionIdentifier STRING_JOIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string-join", 2);
+    public static final FunctionIdentifier STRING_REPEAT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "repeat", 2);
+    public static final FunctionIdentifier STRING_SPLIT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "split", 2);
 
     public static final FunctionIdentifier DATASET = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "dataset", 1);
-    public static final FunctionIdentifier FEED_COLLECT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "feed-collect", 6);
-    public static final FunctionIdentifier FEED_INTERCEPT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "feed-intercept", 1);
+    public static final FunctionIdentifier FEED_COLLECT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "feed-collect", 6);
+    public static final FunctionIdentifier FEED_INTERCEPT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "feed-intercept", 1);
 
-    public static final FunctionIdentifier INDEX_SEARCH = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "index-search", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier INDEX_SEARCH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "index-search", FunctionIdentifier.VARARGS);
 
-    public static final FunctionIdentifier MAKE_FIELD_INDEX_HANDLE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "make-field-index-handle", 2);
-    public static final FunctionIdentifier MAKE_FIELD_NESTED_HANDLE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "make-field-nested-handle", 3);
-    public static final FunctionIdentifier MAKE_FIELD_NAME_HANDLE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "make-field-name-handle", 1);
+    public static final FunctionIdentifier MAKE_FIELD_INDEX_HANDLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "make-field-index-handle", 2);
+    public static final FunctionIdentifier MAKE_FIELD_NESTED_HANDLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "make-field-nested-handle", 3);
+    public static final FunctionIdentifier MAKE_FIELD_NAME_HANDLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "make-field-name-handle", 1);
 
     public static final FunctionIdentifier AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-avg", 1);
     public static final FunctionIdentifier COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-count", 1);
     public static final FunctionIdentifier SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sum", 1);
-    public static final FunctionIdentifier LOCAL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-sum", 1);
+    public static final FunctionIdentifier LOCAL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-sum", 1);
     public static final FunctionIdentifier MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-max", 1);
-    public static final FunctionIdentifier LOCAL_MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-max", 1);
+    public static final FunctionIdentifier LOCAL_MAX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-max", 1);
     public static final FunctionIdentifier MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-min", 1);
-    public static final FunctionIdentifier LOCAL_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-min", 1);
-    public static final FunctionIdentifier GLOBAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-global-avg", 1);
-    public static final FunctionIdentifier INTERMEDIATE_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-intermediate-avg", 1);
-    public static final FunctionIdentifier LOCAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-avg", 1);
-    public static final FunctionIdentifier FIRST_ELEMENT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-first-element", 1);
-    public static final FunctionIdentifier LOCAL_FIRST_ELEMENT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-first-element", 1);
+    public static final FunctionIdentifier LOCAL_MIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-min", 1);
+    public static final FunctionIdentifier GLOBAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-global-avg", 1);
+    public static final FunctionIdentifier INTERMEDIATE_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-intermediate-avg", 1);
+    public static final FunctionIdentifier LOCAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-avg", 1);
+    public static final FunctionIdentifier FIRST_ELEMENT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-first-element", 1);
+    public static final FunctionIdentifier LOCAL_FIRST_ELEMENT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-first-element", 1);
 
     public static final FunctionIdentifier SCALAR_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "avg", 1);
-    public static final FunctionIdentifier SCALAR_COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "count",
-            1);
+    public static final FunctionIdentifier SCALAR_COUNT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "count", 1);
     public static final FunctionIdentifier SCALAR_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sum", 1);
     public static final FunctionIdentifier SCALAR_MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "max", 1);
     public static final FunctionIdentifier SCALAR_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "min", 1);
-    public static final FunctionIdentifier SCALAR_GLOBAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "global-avg", 1);
-    public static final FunctionIdentifier SCALAR_LOCAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-avg", 1);
-    public static final FunctionIdentifier SCALAR_FIRST_ELEMENT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "first-element", 1);
+    public static final FunctionIdentifier SCALAR_GLOBAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "global-avg", 1);
+    public static final FunctionIdentifier SCALAR_LOCAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-avg", 1);
+    public static final FunctionIdentifier SCALAR_FIRST_ELEMENT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "first-element", 1);
 
     // serializable aggregate functions
-    public static final FunctionIdentifier SERIAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "count-serial", 1);
-    public static final FunctionIdentifier SERIAL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sum-serial", 1);
-    public static final FunctionIdentifier SERIAL_LOCAL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-sum-serial", 1);
-    public static final FunctionIdentifier SERIAL_GLOBAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "global-avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_LOCAL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_INTERMEDIATE_AVG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "intermediate-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_COUNT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "count-serial", 1);
+    public static final FunctionIdentifier SERIAL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sum-serial", 1);
+    public static final FunctionIdentifier SERIAL_LOCAL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-sum-serial", 1);
+    public static final FunctionIdentifier SERIAL_GLOBAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "global-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_LOCAL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_INTERMEDIATE_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "intermediate-avg-serial", 1);
 
     // distinct aggregate functions
 
-    public static final FunctionIdentifier COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-count-distinct", 1);
-    public static final FunctionIdentifier SCALAR_COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "count-distinct", 1);
-    public static final FunctionIdentifier SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sum-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sum-distinct", 1);
-    public static final FunctionIdentifier AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-avg-distinct", 1);
-    public static final FunctionIdentifier SCALAR_AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "avg-distinct", 1);
-    public static final FunctionIdentifier MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-max-distinct", 1);
-    public static final FunctionIdentifier SCALAR_MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "max-distinct", 1);
-    public static final FunctionIdentifier MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-min-distinct", 1);
-    public static final FunctionIdentifier SCALAR_MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "min-distinct", 1);
+    public static final FunctionIdentifier COUNT_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-count-distinct", 1);
+    public static final FunctionIdentifier SCALAR_COUNT_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "count-distinct", 1);
+    public static final FunctionIdentifier SUM_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sum-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SUM_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sum-distinct", 1);
+    public static final FunctionIdentifier AVG_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-avg-distinct", 1);
+    public static final FunctionIdentifier SCALAR_AVG_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "avg-distinct", 1);
+    public static final FunctionIdentifier MAX_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-max-distinct", 1);
+    public static final FunctionIdentifier SCALAR_MAX_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "max-distinct", 1);
+    public static final FunctionIdentifier MIN_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-min-distinct", 1);
+    public static final FunctionIdentifier SCALAR_MIN_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "min-distinct", 1);
 
     // sql aggregate functions
-    public static final FunctionIdentifier SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-avg",
-            1);
-    public static final FunctionIdentifier INTERMEDIATE_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "intermediate-agg-sql-avg", 1);
-    public static final FunctionIdentifier SQL_COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-count", 1);
-    public static final FunctionIdentifier SQL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-sum",
-            1);
-    public static final FunctionIdentifier LOCAL_SQL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-sql-sum", 1);
-    public static final FunctionIdentifier SQL_MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-max",
-            1);
-    public static final FunctionIdentifier LOCAL_SQL_MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-sql-max", 1);
-    public static final FunctionIdentifier SQL_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-min",
-            1);
-    public static final FunctionIdentifier LOCAL_SQL_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-sql-min", 1);
-    public static final FunctionIdentifier GLOBAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-global-sql-avg", 1);
-    public static final FunctionIdentifier LOCAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-local-sql-avg", 1);
+    public static final FunctionIdentifier SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-avg", 1);
+    public static final FunctionIdentifier INTERMEDIATE_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "intermediate-agg-sql-avg", 1);
+    public static final FunctionIdentifier SQL_COUNT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-count", 1);
+    public static final FunctionIdentifier SQL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-sum", 1);
+    public static final FunctionIdentifier LOCAL_SQL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-sql-sum", 1);
+    public static final FunctionIdentifier SQL_MAX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-max", 1);
+    public static final FunctionIdentifier LOCAL_SQL_MAX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-sql-max", 1);
+    public static final FunctionIdentifier SQL_MIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-min", 1);
+    public static final FunctionIdentifier LOCAL_SQL_MIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-sql-min", 1);
+    public static final FunctionIdentifier GLOBAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-global-sql-avg", 1);
+    public static final FunctionIdentifier LOCAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-local-sql-avg", 1);
 
-    public static final FunctionIdentifier SCALAR_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-avg", 1);
-    public static final FunctionIdentifier SCALAR_SQL_COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-count", 1);
-    public static final FunctionIdentifier SCALAR_SQL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-sum", 1);
-    public static final FunctionIdentifier SCALAR_SQL_MAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-max", 1);
-    public static final FunctionIdentifier SCALAR_SQL_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-min", 1);
-    public static final FunctionIdentifier SCALAR_GLOBAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "global-sql-avg", 1);
-    public static final FunctionIdentifier SCALAR_LOCAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-sql-avg", 1);
+    public static final FunctionIdentifier SCALAR_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-avg", 1);
+    public static final FunctionIdentifier SCALAR_SQL_COUNT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-count", 1);
+    public static final FunctionIdentifier SCALAR_SQL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-sum", 1);
+    public static final FunctionIdentifier SCALAR_SQL_MAX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-max", 1);
+    public static final FunctionIdentifier SCALAR_SQL_MIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-min", 1);
+    public static final FunctionIdentifier SCALAR_GLOBAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "global-sql-avg", 1);
+    public static final FunctionIdentifier SCALAR_LOCAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-sql-avg", 1);
 
     // serializable sql aggregate functions
-    public static final FunctionIdentifier SERIAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_SQL_COUNT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-count-serial", 1);
-    public static final FunctionIdentifier SERIAL_SQL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sql-sum-serial", 1);
-    public static final FunctionIdentifier SERIAL_LOCAL_SQL_SUM = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-sql-sum-serial", 1);
-    public static final FunctionIdentifier SERIAL_GLOBAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "global-sql-avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_INTERMEDIATE_SQL_AVG = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "intermediate-sql-avg-serial", 1);
-    public static final FunctionIdentifier SERIAL_LOCAL_SQL_AVG = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "local-sql-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_SQL_COUNT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-count-serial", 1);
+    public static final FunctionIdentifier SERIAL_SQL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-sum-serial", 1);
+    public static final FunctionIdentifier SERIAL_LOCAL_SQL_SUM =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-sql-sum-serial", 1);
+    public static final FunctionIdentifier SERIAL_GLOBAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "global-sql-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_INTERMEDIATE_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "intermediate-sql-avg-serial", 1);
+    public static final FunctionIdentifier SERIAL_LOCAL_SQL_AVG =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "local-sql-avg-serial", 1);
 
     // distinct sql aggregate functions
-    public static final FunctionIdentifier SQL_COUNT_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-count-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SQL_COUNT_DISTINCT = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "sql-count-distinct", 1);
-    public static final FunctionIdentifier SQL_SUM_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-sum-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SQL_SUM_DISTINCT = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "sql-sum-distinct", 1);
-    public static final FunctionIdentifier SQL_AVG_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-avg-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SQL_AVG_DISTINCT = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "sql-avg-distinct", 1);
-    public static final FunctionIdentifier SQL_MAX_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-max-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SQL_MAX_DISTINCT = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "sql-max-distinct", 1);
-    public static final FunctionIdentifier SQL_MIN_DISTINCT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "agg-sql-min-distinct", 1);
-    public static final FunctionIdentifier SCALAR_SQL_MIN_DISTINCT = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "sql-min-distinct", 1);
+    public static final FunctionIdentifier SQL_COUNT_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-count-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SQL_COUNT_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-count-distinct", 1);
+    public static final FunctionIdentifier SQL_SUM_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-sum-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SQL_SUM_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-sum-distinct", 1);
+    public static final FunctionIdentifier SQL_AVG_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-avg-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SQL_AVG_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-avg-distinct", 1);
+    public static final FunctionIdentifier SQL_MAX_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-max-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SQL_MAX_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-max-distinct", 1);
+    public static final FunctionIdentifier SQL_MIN_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "agg-sql-min-distinct", 1);
+    public static final FunctionIdentifier SCALAR_SQL_MIN_DISTINCT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sql-min-distinct", 1);
 
-    public static final FunctionIdentifier SCAN_COLLECTION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "scan-collection", 1);
-    public static final FunctionIdentifier SUBSET_COLLECTION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "subset-collection", 3);
+    public static final FunctionIdentifier SCAN_COLLECTION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "scan-collection", 1);
+    public static final FunctionIdentifier SUBSET_COLLECTION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "subset-collection", 3);
 
     public static final FunctionIdentifier RANGE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "range", 2);
 
     // fuzzy functions:
-    public static final FunctionIdentifier FUZZY_EQ = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "fuzzy-eq",
-            2);
+    public static final FunctionIdentifier FUZZY_EQ =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "fuzzy-eq", 2);
 
-    public static final FunctionIdentifier PREFIX_LEN_JACCARD = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "prefix-len-jaccard", 2);
+    public static final FunctionIdentifier PREFIX_LEN_JACCARD =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "prefix-len-jaccard", 2);
 
-    public static final FunctionIdentifier SIMILARITY_JACCARD = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "similarity-jaccard", 2);
-    public static final FunctionIdentifier SIMILARITY_JACCARD_CHECK = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "similarity-jaccard-check", 3);
-    public static final FunctionIdentifier SIMILARITY_JACCARD_SORTED = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "similarity-jaccard-sorted", 2);
-    public static final FunctionIdentifier SIMILARITY_JACCARD_SORTED_CHECK = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "similarity-jaccard-sorted-check", 3);
-    public static final FunctionIdentifier SIMILARITY_JACCARD_PREFIX = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "similarity-jaccard-prefix", 6);
-    public static final FunctionIdentifier SIMILARITY_JACCARD_PREFIX_CHECK = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "similarity-jaccard-prefix-check", 6);
+    public static final FunctionIdentifier SIMILARITY_JACCARD =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard", 2);
+    public static final FunctionIdentifier SIMILARITY_JACCARD_CHECK =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard-check", 3);
+    public static final FunctionIdentifier SIMILARITY_JACCARD_SORTED =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard-sorted", 2);
+    public static final FunctionIdentifier SIMILARITY_JACCARD_SORTED_CHECK =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard-sorted-check", 3);
+    public static final FunctionIdentifier SIMILARITY_JACCARD_PREFIX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard-prefix", 6);
+    public static final FunctionIdentifier SIMILARITY_JACCARD_PREFIX_CHECK =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "similarity-jaccard-prefix-check", 6);
 
-    public static final FunctionIdentifier EDIT_DISTANCE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "edit-distance", 2);
-    public static final FunctionIdentifier EDIT_DISTANCE_CHECK = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "edit-distance-check", 3);
-    public static final FunctionIdentifier EDIT_DISTANCE_LIST_IS_FILTERABLE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "edit-distance-list-is-filterable", 2);
-    public static final FunctionIdentifier EDIT_DISTANCE_STRING_IS_FILTERABLE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "edit-distance-string-is-filterable", 4);
-    public static final FunctionIdentifier EDIT_DISTANCE_CONTAINS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "edit-distance-contains", 3);
+    public static final FunctionIdentifier EDIT_DISTANCE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "edit-distance", 2);
+    public static final FunctionIdentifier EDIT_DISTANCE_CHECK =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "edit-distance-check", 3);
+    public static final FunctionIdentifier EDIT_DISTANCE_LIST_IS_FILTERABLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "edit-distance-list-is-filterable", 2);
+    public static final FunctionIdentifier EDIT_DISTANCE_STRING_IS_FILTERABLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "edit-distance-string-is-filterable", 4);
+    public static final FunctionIdentifier EDIT_DISTANCE_CONTAINS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "edit-distance-contains", 3);
 
     // full-text
     public static final FunctionIdentifier FULLTEXT_CONTAINS =
@@ -547,271 +547,269 @@
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ftcontains", 2);
 
     // tokenizers:
-    public static final FunctionIdentifier WORD_TOKENS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "word-tokens", 1);
-    public static final FunctionIdentifier HASHED_WORD_TOKENS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "hashed-word-tokens", 1);
-    public static final FunctionIdentifier COUNTHASHED_WORD_TOKENS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "counthashed-word-tokens", 1);
-    public static final FunctionIdentifier GRAM_TOKENS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "gram-tokens", 3);
-    public static final FunctionIdentifier HASHED_GRAM_TOKENS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "hashed-gram-tokens", 3);
-    public static final FunctionIdentifier COUNTHASHED_GRAM_TOKENS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "counthashed-gram-tokens", 3);
+    public static final FunctionIdentifier WORD_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "word-tokens", 1);
+    public static final FunctionIdentifier HASHED_WORD_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "hashed-word-tokens", 1);
+    public static final FunctionIdentifier COUNTHASHED_WORD_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "counthashed-word-tokens", 1);
+    public static final FunctionIdentifier GRAM_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "gram-tokens", 3);
+    public static final FunctionIdentifier HASHED_GRAM_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "hashed-gram-tokens", 3);
+    public static final FunctionIdentifier COUNTHASHED_GRAM_TOKENS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "counthashed-gram-tokens", 3);
 
     public static final FunctionIdentifier TID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "tid", 0);
     public static final FunctionIdentifier GTID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "gtid", 0);
 
     // constructors:
-    public static final FunctionIdentifier BOOLEAN_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "boolean", 1);
-    public static final FunctionIdentifier STRING_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "string", 1);
-    public static final FunctionIdentifier BINARY_HEX_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "hex", 1);
-    public static final FunctionIdentifier BINARY_BASE64_CONSTRUCTOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "base64", 1);
-    public static final FunctionIdentifier INT8_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "int8", 1);
-    public static final FunctionIdentifier INT16_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "int16", 1);
-    public static final FunctionIdentifier INT32_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "int32", 1);
-    public static final FunctionIdentifier INT64_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "int64", 1);
-    public static final FunctionIdentifier FLOAT_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "float", 1);
-    public static final FunctionIdentifier DOUBLE_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "double", 1);
-    public static final FunctionIdentifier POINT_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "point", 1);
-    public static final FunctionIdentifier POINT3D_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "point3d", 1);
-    public static final FunctionIdentifier LINE_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "line", 1);
-    public static final FunctionIdentifier CIRCLE_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "circle", 1);
-    public static final FunctionIdentifier RECTANGLE_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "rectangle", 1);
-    public static final FunctionIdentifier POLYGON_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "polygon", 1);
-    public static final FunctionIdentifier TIME_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "time", 1);
-    public static final FunctionIdentifier DATE_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "date", 1);
-    public static final FunctionIdentifier DATETIME_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "datetime", 1);
-    public static final FunctionIdentifier DURATION_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "duration", 1);
-    public static final FunctionIdentifier UUID_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "uuid", 1);
+    public static final FunctionIdentifier BOOLEAN_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "boolean", 1);
+    public static final FunctionIdentifier STRING_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "string", 1);
+    public static final FunctionIdentifier BINARY_HEX_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "hex", 1);
+    public static final FunctionIdentifier BINARY_BASE64_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "base64", 1);
+    public static final FunctionIdentifier INT8_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "int8", 1);
+    public static final FunctionIdentifier INT16_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "int16", 1);
+    public static final FunctionIdentifier INT32_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "int32", 1);
+    public static final FunctionIdentifier INT64_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "int64", 1);
+    public static final FunctionIdentifier FLOAT_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "float", 1);
+    public static final FunctionIdentifier DOUBLE_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "double", 1);
+    public static final FunctionIdentifier POINT_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "point", 1);
+    public static final FunctionIdentifier POINT3D_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "point3d", 1);
+    public static final FunctionIdentifier LINE_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "line", 1);
+    public static final FunctionIdentifier CIRCLE_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "circle", 1);
+    public static final FunctionIdentifier RECTANGLE_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "rectangle", 1);
+    public static final FunctionIdentifier POLYGON_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "polygon", 1);
+    public static final FunctionIdentifier TIME_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "time", 1);
+    public static final FunctionIdentifier DATE_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "date", 1);
+    public static final FunctionIdentifier DATETIME_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "datetime", 1);
+    public static final FunctionIdentifier DURATION_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "duration", 1);
+    public static final FunctionIdentifier UUID_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "uuid", 1);
 
-    public static final FunctionIdentifier YEAR_MONTH_DURATION_CONSTRUCTOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "year-month-duration", 1);
-    public static final FunctionIdentifier DAY_TIME_DURATION_CONSTRUCTOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "day-time-duration", 1);
+    public static final FunctionIdentifier YEAR_MONTH_DURATION_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "year-month-duration", 1);
+    public static final FunctionIdentifier DAY_TIME_DURATION_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "day-time-duration", 1);
 
-    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval", 2);
-    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_DATE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "interval-start-from-date", 2);
-    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_TIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "interval-start-from-time", 2);
-    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_DATETIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "interval-start-from-datetime", 2);
-    public static final FunctionIdentifier INTERVAL_BEFORE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-before", 2);
-    public static final FunctionIdentifier INTERVAL_AFTER = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-after", 2);
-    public static final FunctionIdentifier INTERVAL_MEETS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-meets", 2);
-    public static final FunctionIdentifier INTERVAL_MET_BY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-met-by", 2);
-    public static final FunctionIdentifier INTERVAL_OVERLAPS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-overlaps", 2);
-    public static final FunctionIdentifier INTERVAL_OVERLAPPED_BY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-overlapped-by", 2);
-    public static final FunctionIdentifier INTERVAL_OVERLAPPING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-overlapping", 2);
-    public static final FunctionIdentifier INTERVAL_STARTS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-starts", 2);
-    public static final FunctionIdentifier INTERVAL_STARTED_BY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-started-by", 2);
-    public static final FunctionIdentifier INTERVAL_COVERS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-covers", 2);
-    public static final FunctionIdentifier INTERVAL_COVERED_BY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-covered-by", 2);
-    public static final FunctionIdentifier INTERVAL_ENDS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-ends", 2);
-    public static final FunctionIdentifier INTERVAL_ENDED_BY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-ended-by", 2);
-    public static final FunctionIdentifier CURRENT_TIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "current-time", 0);
-    public static final FunctionIdentifier CURRENT_DATE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "current-date", 0);
-    public static final FunctionIdentifier CURRENT_DATETIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "current-datetime", 0);
-    public static final FunctionIdentifier DURATION_EQUAL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "duration-equal", 2);
-    public static final FunctionIdentifier YEAR_MONTH_DURATION_GREATER_THAN = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "year-month-duration-greater-than", 2);
-    public static final FunctionIdentifier YEAR_MONTH_DURATION_LESS_THAN = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "year-month-duration-less-than", 2);
-    public static final FunctionIdentifier DAY_TIME_DURATION_GREATER_THAN = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "day-time-duration-greater-than", 2);
-    public static final FunctionIdentifier DAY_TIME_DURATION_LESS_THAN = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "day-time-duration-less-than", 2);
-    public static final FunctionIdentifier DURATION_FROM_MONTHS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "duration-from-months", 1);
-    public static final FunctionIdentifier MONTHS_FROM_YEAR_MONTH_DURATION = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "months-from-year-month-duration", 1);
-    public static final FunctionIdentifier DURATION_FROM_MILLISECONDS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "duration-from-ms", 1);
-    public static final FunctionIdentifier MILLISECONDS_FROM_DAY_TIME_DURATION = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "ms-from-day-time-duration", 1);
+    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval", 2);
+    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-start-from-date", 2);
+    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-start-from-time", 2);
+    public static final FunctionIdentifier INTERVAL_CONSTRUCTOR_START_FROM_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-start-from-datetime", 2);
+    public static final FunctionIdentifier INTERVAL_BEFORE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-before", 2);
+    public static final FunctionIdentifier INTERVAL_AFTER =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-after", 2);
+    public static final FunctionIdentifier INTERVAL_MEETS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-meets", 2);
+    public static final FunctionIdentifier INTERVAL_MET_BY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-met-by", 2);
+    public static final FunctionIdentifier INTERVAL_OVERLAPS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-overlaps", 2);
+    public static final FunctionIdentifier INTERVAL_OVERLAPPED_BY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-overlapped-by", 2);
+    public static final FunctionIdentifier INTERVAL_OVERLAPPING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-overlapping", 2);
+    public static final FunctionIdentifier INTERVAL_STARTS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-starts", 2);
+    public static final FunctionIdentifier INTERVAL_STARTED_BY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-started-by", 2);
+    public static final FunctionIdentifier INTERVAL_COVERS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-covers", 2);
+    public static final FunctionIdentifier INTERVAL_COVERED_BY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-covered-by", 2);
+    public static final FunctionIdentifier INTERVAL_ENDS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-ends", 2);
+    public static final FunctionIdentifier INTERVAL_ENDED_BY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-ended-by", 2);
+    public static final FunctionIdentifier CURRENT_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "current-time", 0);
+    public static final FunctionIdentifier CURRENT_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "current-date", 0);
+    public static final FunctionIdentifier CURRENT_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "current-datetime", 0);
+    public static final FunctionIdentifier DURATION_EQUAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "duration-equal", 2);
+    public static final FunctionIdentifier YEAR_MONTH_DURATION_GREATER_THAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "year-month-duration-greater-than", 2);
+    public static final FunctionIdentifier YEAR_MONTH_DURATION_LESS_THAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "year-month-duration-less-than", 2);
+    public static final FunctionIdentifier DAY_TIME_DURATION_GREATER_THAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "day-time-duration-greater-than", 2);
+    public static final FunctionIdentifier DAY_TIME_DURATION_LESS_THAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "day-time-duration-less-than", 2);
+    public static final FunctionIdentifier DURATION_FROM_MONTHS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "duration-from-months", 1);
+    public static final FunctionIdentifier MONTHS_FROM_YEAR_MONTH_DURATION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "months-from-year-month-duration", 1);
+    public static final FunctionIdentifier DURATION_FROM_MILLISECONDS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "duration-from-ms", 1);
+    public static final FunctionIdentifier MILLISECONDS_FROM_DAY_TIME_DURATION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "ms-from-day-time-duration", 1);
 
-    public static final FunctionIdentifier GET_YEAR_MONTH_DURATION = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-year-month-duration", 1);
-    public static final FunctionIdentifier GET_DAY_TIME_DURATION = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-day-time-duration", 1);
-    public static final FunctionIdentifier DURATION_FROM_INTERVAL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "duration-from-interval", 1);
+    public static final FunctionIdentifier GET_YEAR_MONTH_DURATION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-year-month-duration", 1);
+    public static final FunctionIdentifier GET_DAY_TIME_DURATION =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-day-time-duration", 1);
+    public static final FunctionIdentifier DURATION_FROM_INTERVAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "duration-from-interval", 1);
 
     // spatial
-    public static final FunctionIdentifier CREATE_POINT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-point", 2);
-    public static final FunctionIdentifier CREATE_LINE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-line", 2);
-    public static final FunctionIdentifier CREATE_POLYGON = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-polygon", 1);
-    public static final FunctionIdentifier CREATE_CIRCLE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-circle", 2);
-    public static final FunctionIdentifier CREATE_RECTANGLE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-rectangle", 2);
-    public static final FunctionIdentifier SPATIAL_INTERSECT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "spatial-intersect", 2);
-    public static final FunctionIdentifier SPATIAL_AREA = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "spatial-area", 1);
-    public static final FunctionIdentifier SPATIAL_DISTANCE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "spatial-distance", 2);
-    public static final FunctionIdentifier CREATE_MBR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-mbr", 3);
-    public static final FunctionIdentifier SPATIAL_CELL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "spatial-cell", 4);
-    public static final FunctionIdentifier SWITCH_CASE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "switch-case", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier SLEEP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "sleep", 2);
-    public static final FunctionIdentifier INJECT_FAILURE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "inject-failure", 2);
-    public static final FunctionIdentifier FLOW_RECORD = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "flow-object", 1);
-    public static final FunctionIdentifier CAST_TYPE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "cast", 1);
-    public static final FunctionIdentifier CAST_TYPE_LAX = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "cast-lax", 1);
+    public static final FunctionIdentifier CREATE_POINT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-point", 2);
+    public static final FunctionIdentifier CREATE_LINE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-line", 2);
+    public static final FunctionIdentifier CREATE_POLYGON =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-polygon", 1);
+    public static final FunctionIdentifier CREATE_CIRCLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-circle", 2);
+    public static final FunctionIdentifier CREATE_RECTANGLE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-rectangle", 2);
+    public static final FunctionIdentifier SPATIAL_INTERSECT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "spatial-intersect", 2);
+    public static final FunctionIdentifier SPATIAL_AREA =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "spatial-area", 1);
+    public static final FunctionIdentifier SPATIAL_DISTANCE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "spatial-distance", 2);
+    public static final FunctionIdentifier CREATE_MBR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-mbr", 3);
+    public static final FunctionIdentifier SPATIAL_CELL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "spatial-cell", 4);
+    public static final FunctionIdentifier SWITCH_CASE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "switch-case", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier SLEEP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "sleep", 2);
+    public static final FunctionIdentifier INJECT_FAILURE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "inject-failure", 2);
+    public static final FunctionIdentifier FLOW_RECORD =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "flow-object", 1);
+    public static final FunctionIdentifier CAST_TYPE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "cast", 1);
+    public static final FunctionIdentifier CAST_TYPE_LAX =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "cast-lax", 1);
 
-    public static final FunctionIdentifier CREATE_UUID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-uuid", 0);
+    public static final FunctionIdentifier CREATE_UUID =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-uuid", 0);
     public static final FunctionIdentifier UUID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "uuid", 0);
-    public static final FunctionIdentifier CREATE_QUERY_UID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "create-query-uid", 0);
+    public static final FunctionIdentifier CREATE_QUERY_UID =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "create-query-uid", 0);
 
     // Spatial and temporal type accessors
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_YEAR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-year", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MONTH = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-month", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_DAY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-day", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_HOUR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-hour", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-minute", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_SEC = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-second", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MILLISEC = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-millisecond", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-start", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-end", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_DATETIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-start-datetime", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_DATETIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-end-datetime", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_DATE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-start-date", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_DATE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-end-date", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_TIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-start-time", 1);
-    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_TIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-interval-end-time", 1);
-    public static final FunctionIdentifier INTERVAL_BIN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "interval-bin", 3);
-    public static final FunctionIdentifier OVERLAP_BINS = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "overlap-bins", 3);
-    public static final FunctionIdentifier GET_OVERLAPPING_INTERVAL = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-overlapping-interval", 2);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_YEAR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-year", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MONTH =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-month", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_DAY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-day", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_HOUR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-hour", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-minute", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_SEC =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-second", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_MILLISEC =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-millisecond", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-start", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-end", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-start-datetime", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-end-datetime", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-start-date", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-end-date", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_START_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-start-time", 1);
+    public static final FunctionIdentifier ACCESSOR_TEMPORAL_INTERVAL_END_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-interval-end-time", 1);
+    public static final FunctionIdentifier INTERVAL_BIN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "interval-bin", 3);
+    public static final FunctionIdentifier OVERLAP_BINS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "overlap-bins", 3);
+    public static final FunctionIdentifier GET_OVERLAPPING_INTERVAL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-overlapping-interval", 2);
 
     // Temporal functions
-    public static final FunctionIdentifier UNIX_TIME_FROM_DATE_IN_DAYS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "unix-time-from-date-in-days", 1);
-    public final static FunctionIdentifier UNIX_TIME_FROM_TIME_IN_MS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "unix-time-from-time-in-ms", 1);
-    public final static FunctionIdentifier UNIX_TIME_FROM_DATETIME_IN_MS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "unix-time-from-datetime-in-ms", 1);
-    public final static FunctionIdentifier UNIX_TIME_FROM_DATETIME_IN_SECS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "unix-time-from-datetime-in-secs", 1);
-    public static final FunctionIdentifier DATE_FROM_UNIX_TIME_IN_DAYS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "date-from-unix-time-in-days", 1);
-    public static final FunctionIdentifier DATE_FROM_DATETIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-date-from-datetime", 1);
-    public static final FunctionIdentifier TIME_FROM_UNIX_TIME_IN_MS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "time-from-unix-time-in-ms", 1);
-    public static final FunctionIdentifier TIME_FROM_DATETIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "get-time-from-datetime", 1);
-    public static final FunctionIdentifier DATETIME_FROM_UNIX_TIME_IN_MS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "datetime-from-unix-time-in-ms", 1);
-    public static final FunctionIdentifier DATETIME_FROM_UNIX_TIME_IN_SECS = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "datetime-from-unix-time-in-secs", 1);
-    public static final FunctionIdentifier DATETIME_FROM_DATE_TIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "datetime-from-date-time", 2);
-    public static final FunctionIdentifier CALENDAR_DURATION_FROM_DATETIME = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "calendar-duration-from-datetime", 2);
-    public static final FunctionIdentifier CALENDAR_DURATION_FROM_DATE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "calendar-duration-from-date", 2);
-    public static final FunctionIdentifier ADJUST_TIME_FOR_TIMEZONE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "adjust-time-for-timezone", 2);
-    public static final FunctionIdentifier ADJUST_DATETIME_FOR_TIMEZONE = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "adjust-datetime-for-timezone", 2);
-    public static final FunctionIdentifier DAY_OF_WEEK = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "day-of-week", 1);
-    public static final FunctionIdentifier PARSE_DATE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "parse-date", 2);
-    public static final FunctionIdentifier PARSE_TIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "parse-time", 2);
-    public static final FunctionIdentifier PARSE_DATETIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "parse-datetime", 2);
-    public static final FunctionIdentifier PRINT_DATE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "print-date", 2);
-    public static final FunctionIdentifier PRINT_TIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "print-time", 2);
-    public static final FunctionIdentifier PRINT_DATETIME = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "print-datetime", 2);
+    public static final FunctionIdentifier UNIX_TIME_FROM_DATE_IN_DAYS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "unix-time-from-date-in-days", 1);
+    public final static FunctionIdentifier UNIX_TIME_FROM_TIME_IN_MS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "unix-time-from-time-in-ms", 1);
+    public final static FunctionIdentifier UNIX_TIME_FROM_DATETIME_IN_MS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "unix-time-from-datetime-in-ms", 1);
+    public final static FunctionIdentifier UNIX_TIME_FROM_DATETIME_IN_SECS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "unix-time-from-datetime-in-secs", 1);
+    public static final FunctionIdentifier DATE_FROM_UNIX_TIME_IN_DAYS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "date-from-unix-time-in-days", 1);
+    public static final FunctionIdentifier DATE_FROM_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-date-from-datetime", 1);
+    public static final FunctionIdentifier TIME_FROM_UNIX_TIME_IN_MS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "time-from-unix-time-in-ms", 1);
+    public static final FunctionIdentifier TIME_FROM_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-time-from-datetime", 1);
+    public static final FunctionIdentifier DATETIME_FROM_UNIX_TIME_IN_MS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "datetime-from-unix-time-in-ms", 1);
+    public static final FunctionIdentifier DATETIME_FROM_UNIX_TIME_IN_SECS =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "datetime-from-unix-time-in-secs", 1);
+    public static final FunctionIdentifier DATETIME_FROM_DATE_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "datetime-from-date-time", 2);
+    public static final FunctionIdentifier CALENDAR_DURATION_FROM_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "calendar-duration-from-datetime", 2);
+    public static final FunctionIdentifier CALENDAR_DURATION_FROM_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "calendar-duration-from-date", 2);
+    public static final FunctionIdentifier ADJUST_TIME_FOR_TIMEZONE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "adjust-time-for-timezone", 2);
+    public static final FunctionIdentifier ADJUST_DATETIME_FOR_TIMEZONE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "adjust-datetime-for-timezone", 2);
+    public static final FunctionIdentifier DAY_OF_WEEK =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "day-of-week", 1);
+    public static final FunctionIdentifier PARSE_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "parse-date", 2);
+    public static final FunctionIdentifier PARSE_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "parse-time", 2);
+    public static final FunctionIdentifier PARSE_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "parse-datetime", 2);
+    public static final FunctionIdentifier PRINT_DATE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "print-date", 2);
+    public static final FunctionIdentifier PRINT_TIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "print-time", 2);
+    public static final FunctionIdentifier PRINT_DATETIME =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "print-datetime", 2);
 
-    public static final FunctionIdentifier GET_POINT_X_COORDINATE_ACCESSOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-x", 1);
-    public static final FunctionIdentifier GET_POINT_Y_COORDINATE_ACCESSOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-y", 1);
-    public static final FunctionIdentifier GET_CIRCLE_RADIUS_ACCESSOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-radius", 1);
-    public static final FunctionIdentifier GET_CIRCLE_CENTER_ACCESSOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-center", 1);
-    public static final FunctionIdentifier GET_POINTS_LINE_RECTANGLE_POLYGON_ACCESSOR = new FunctionIdentifier(
-            FunctionConstants.ASTERIX_NS, "get-points", 1);
+    public static final FunctionIdentifier GET_POINT_X_COORDINATE_ACCESSOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-x", 1);
+    public static final FunctionIdentifier GET_POINT_Y_COORDINATE_ACCESSOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-y", 1);
+    public static final FunctionIdentifier GET_CIRCLE_RADIUS_ACCESSOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-radius", 1);
+    public static final FunctionIdentifier GET_CIRCLE_CENTER_ACCESSOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-center", 1);
+    public static final FunctionIdentifier GET_POINTS_LINE_RECTANGLE_POLYGON_ACCESSOR =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-points", 1);
 
     public static final FunctionIdentifier EQ = AlgebricksBuiltinFunctions.EQ;
     public static final FunctionIdentifier LE = AlgebricksBuiltinFunctions.LE;
@@ -825,32 +823,32 @@
     public static final FunctionIdentifier NUMERIC_ADD = AlgebricksBuiltinFunctions.NUMERIC_ADD;
     public static final FunctionIdentifier IS_MISSING = AlgebricksBuiltinFunctions.IS_MISSING;
     public static final FunctionIdentifier IS_NULL = AlgebricksBuiltinFunctions.IS_NULL;
-    public static final FunctionIdentifier IS_UNKOWN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "is-unknown", 1);
-    public static final FunctionIdentifier IS_BOOLEAN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "is-boolean", 1);
-    public static final FunctionIdentifier IS_NUMBER = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-number",
-            1);
-    public static final FunctionIdentifier IS_STRING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-string",
-            1);
-    public static final FunctionIdentifier IS_ARRAY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-array",
-            1);
-    public static final FunctionIdentifier IS_OBJECT = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-object",
-            1);
+    public static final FunctionIdentifier IS_UNKNOWN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-unknown", 1);
+    public static final FunctionIdentifier IS_BOOLEAN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-boolean", 1);
+    public static final FunctionIdentifier IS_NUMBER =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-number", 1);
+    public static final FunctionIdentifier IS_STRING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-string", 1);
+    public static final FunctionIdentifier IS_ARRAY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-array", 1);
+    public static final FunctionIdentifier IS_OBJECT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-object", 1);
 
-    public static final FunctionIdentifier IS_SYSTEM_NULL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "is-system-null", 1);
-    public static final FunctionIdentifier CHECK_UNKNOWN = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "check-unknown", 1);
-    public static final FunctionIdentifier COLLECTION_TO_SEQUENCE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "collection-to-sequence", 1);
+    public static final FunctionIdentifier IS_SYSTEM_NULL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-system-null", 1);
+    public static final FunctionIdentifier CHECK_UNKNOWN =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "check-unknown", 1);
+    public static final FunctionIdentifier COLLECTION_TO_SEQUENCE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "collection-to-sequence", 1);
 
-    public static final FunctionIdentifier IF_MISSING = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "if-missing", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier IF_NULL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "if-null", FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier IF_MISSING_OR_NULL = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "if-missing-or-null", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier IF_MISSING =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-missing", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier IF_NULL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-null", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier IF_MISSING_OR_NULL =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "if-missing-or-null", FunctionIdentifier.VARARGS);
 
     public static final FunctionIdentifier TO_BOOLEAN =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-boolean", 1);
@@ -861,15 +859,16 @@
     public static final FunctionIdentifier TO_BIGINT =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "to-bigint", 1);
 
-    public static final FunctionIdentifier EXTERNAL_LOOKUP = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-            "external-lookup", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier EXTERNAL_LOOKUP =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "external-lookup", FunctionIdentifier.VARARGS);
 
-    public static final FunctionIdentifier META = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta",
-            FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier META_KEY = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta-key",
-            FunctionIdentifier.VARARGS);
-    public static final FunctionIdentifier RESOLVE = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "resolve",
-            FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier GET_JOB_PARAMETER =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "get-job-param", 1);
+
+    public static final FunctionIdentifier META =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier META_KEY =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "meta-key", FunctionIdentifier.VARARGS);
 
     public static IFunctionInfo getAsterixFunctionInfo(FunctionIdentifier fid) {
         return registeredFunctions.get(fid);
@@ -883,7 +882,7 @@
 
         // first, take care of Algebricks builtin functions
         addFunction(IS_MISSING, BooleanOnlyTypeComputer.INSTANCE, true);
-        addFunction(IS_UNKOWN, BooleanOnlyTypeComputer.INSTANCE, true);
+        addFunction(IS_UNKNOWN, BooleanOnlyTypeComputer.INSTANCE, true);
         addFunction(IS_NULL, BooleanOrMissingTypeComputer.INSTANCE, true);
         addFunction(IS_SYSTEM_NULL, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_BOOLEAN, ABooleanTypeComputer.INSTANCE, true);
@@ -1181,7 +1180,7 @@
         addPrivateFunction(OPEN_RECORD_CONSTRUCTOR, OpenRecordConstructorResultType.INSTANCE, true);
         addPrivateFunction(FIELD_ACCESS_BY_INDEX, FieldAccessByIndexResultType.INSTANCE, true);
         addPrivateFunction(FIELD_ACCESS_NESTED, FieldAccessNestedResultType.INSTANCE, true);
-        addPrivateFunction(FIELD_ACCESS_BY_NAME, FieldAccessByNameResultType.INSTANCE, true);
+        addFunction(FIELD_ACCESS_BY_NAME, FieldAccessByNameResultType.INSTANCE, true);
         addFunction(GET_RECORD_FIELDS, OrderedListOfAnyTypeComputer.INSTANCE, true);
         addFunction(GET_RECORD_FIELD_VALUE, FieldAccessNestedResultType.INSTANCE, true);
         addFunction(RECORD_PAIRS, RecordPairsTypeComputer.INSTANCE, true);
@@ -1267,23 +1266,18 @@
         // meta() function
         addFunction(META, OpenARecordTypeComputer.INSTANCE, true);
         addPrivateFunction(META_KEY, AnyTypeComputer.INSTANCE, false);
-        addFunction(RESOLVE, AnyTypeComputer.INSTANCE, false);
 
         addPrivateFunction(COLLECTION_TO_SEQUENCE, CollectionToSequenceTypeComputer.INSTANCE, true);
 
         // external lookup
         addPrivateFunction(EXTERNAL_LOOKUP, AnyTypeComputer.INSTANCE, false);
 
+        // get job parameter
+        addFunction(GET_JOB_PARAMETER, AnyTypeComputer.INSTANCE, false);
+
         // unnesting function
         addPrivateFunction(SCAN_COLLECTION, CollectionMemberResultType.INSTANCE, true);
 
-        String metadataFunctionLoaderClassName = "org.apache.asterix.metadata.functions.MetadataBuiltinFunctions";
-        try {
-            Class.forName(metadataFunctionLoaderClassName);
-        } catch (ClassNotFoundException e) {
-            throw new RuntimeException(e);
-        }
-
     }
 
     static {
@@ -1524,32 +1518,22 @@
     }
 
     static {
-        datasetFunctions.add(getAsterixFunctionInfo(DATASET));
-        datasetFunctions.add(getAsterixFunctionInfo(FEED_COLLECT));
-        datasetFunctions.add(getAsterixFunctionInfo(FEED_INTERCEPT));
-        datasetFunctions.add(getAsterixFunctionInfo(INDEX_SEARCH));
-    }
-
-    static {
-        addUnnestFun(DATASET, false);
-        addUnnestFun(FEED_COLLECT, false);
-        addUnnestFun(FEED_INTERCEPT, false);
         addUnnestFun(RANGE, true);
         addUnnestFun(SCAN_COLLECTION, false);
         addUnnestFun(SUBSET_COLLECTION, false);
     }
 
-    public static void addDatasetFunction(FunctionIdentifier fi) {
-        datasetFunctions.add(getAsterixFunctionInfo(fi));
+    public static void addDatasourceFunction(FunctionIdentifier fi, IFunctionToDataSourceRewriter transformer) {
+        datasourceFunctions.put(getAsterixFunctionInfo(fi), transformer);
     }
 
-    public static boolean isDatasetFunction(FunctionIdentifier fi) {
-        return datasetFunctions.contains(getAsterixFunctionInfo(fi));
+    public static IFunctionToDataSourceRewriter getDatasourceTransformer(FunctionIdentifier fi) {
+        return datasourceFunctions.getOrDefault(getAsterixFunctionInfo(fi), IFunctionToDataSourceRewriter.NOOP);
     }
 
     public static boolean isBuiltinCompilerFunction(FunctionSignature signature, boolean includePrivateFunctions) {
-        FunctionIdentifier fi = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, signature.getName(),
-                signature.getArity());
+        FunctionIdentifier fi =
+                new FunctionIdentifier(FunctionConstants.ASTERIX_NS, signature.getName(), signature.getArity());
         IFunctionInfo finfo = getAsterixFunctionInfo(fi);
         if (builtinPublicFunctionsSet.keySet().contains(finfo)
                 || (includePrivateFunctions && builtinPrivateFunctionsSet.keySet().contains(finfo))) {
@@ -1715,8 +1699,7 @@
     }
 
     static {
-        spatialFilterFunctions.put(getAsterixFunctionInfo(BuiltinFunctions.SPATIAL_INTERSECT),
-                SpatialFilterKind.SI);
+        spatialFilterFunctions.put(getAsterixFunctionInfo(BuiltinFunctions.SPATIAL_INTERSECT), SpatialFilterKind.SI);
     }
 
     public static boolean isGlobalAggregateFunction(FunctionIdentifier fi) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
index 0042b26..1bbfc43 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/ExternalFunctionInfo.java
@@ -35,8 +35,8 @@
     private final FunctionKind kind;
     private final IAType returnType;
 
-    public ExternalFunctionInfo(String namespace, String name, int arity, FunctionKind kind,
-            List<IAType> argumentTypes, IAType returnType, IResultTypeComputer rtc, String body, String language) {
+    public ExternalFunctionInfo(String namespace, String name, int arity, FunctionKind kind, List<IAType> argumentTypes,
+            IAType returnType, IResultTypeComputer rtc, String body, String language) {
         super(namespace, name, arity, true);
         this.rtc = rtc;
         this.argumentTypes = argumentTypes;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfoRepository.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfoRepository.java
index b4622b5..20839f9 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfoRepository.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/FunctionInfoRepository.java
@@ -29,12 +29,12 @@
     private final Map<FunctionSignature, IFunctionInfo> functionMap;
 
     public FunctionInfoRepository() {
-        functionMap = new ConcurrentHashMap<FunctionSignature, IFunctionInfo>();
+        functionMap = new ConcurrentHashMap<>();
     }
 
     public IFunctionInfo get(String namespace, String name, int arity) {
-        FunctionSignature fname = new FunctionSignature(namespace, name, arity);
-        return functionMap.get(fname);
+        FunctionSignature functionSignature = new FunctionSignature(namespace, name, arity);
+        return functionMap.get(functionSignature);
     }
 
     public IFunctionInfo get(FunctionIdentifier fid) {
@@ -42,7 +42,7 @@
     }
 
     public void put(FunctionIdentifier fid, IFunctionInfo fInfo) {
-        FunctionSignature functionSignature = new FunctionSignature(fid.getNamespace(), fid.getName(), fid.getArity());
+        FunctionSignature functionSignature = new FunctionSignature(fid);
         functionMap.put(functionSignature, fInfo);
     }
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionToDataSourceRewriter.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionToDataSourceRewriter.java
new file mode 100644
index 0000000..2793c4d
--- /dev/null
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionToDataSourceRewriter.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.om.functions;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+
+public interface IFunctionToDataSourceRewriter {
+    public static final IFunctionToDataSourceRewriter NOOP = (o, c) -> false;
+
+    /**
+     * Replace the unnest operator by a datasource operator
+     *
+     * @param opRef
+     *            UnnestOperator to be replaced by DataSourceScanOperator
+     * @param context
+     *            optimization context
+     * @return true if transformed, false otherwise
+     * @throws AlgebricksException
+     */
+    boolean rewrite(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException;
+}
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionTypeInferer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionTypeInferer.java
index b8e27e1..97042e2 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionTypeInferer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/IFunctionTypeInferer.java
@@ -19,11 +19,12 @@
 
 package org.apache.asterix.om.functions;
 
+import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
 
 public interface IFunctionTypeInferer {
-    void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-            throws AlgebricksException;
+    void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+            CompilerProperties compilerProps) throws AlgebricksException;
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/ARecordVisitablePointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/ARecordVisitablePointable.java
index 45e56aba..b6ba848 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/ARecordVisitablePointable.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/ARecordVisitablePointable.java
@@ -227,8 +227,8 @@
                         }
                     } else {
                         typeTag = fieldTypes[fieldNumber].getTypeTag();
-                        fieldValueLength = NonTaggedFormatUtil.getFieldValueLength(b, fieldOffsets[fieldNumber],
-                                typeTag, false);
+                        fieldValueLength =
+                                NonTaggedFormatUtil.getFieldValueLength(b, fieldOffsets[fieldNumber], typeTag, false);
                     }
                     // set field value (including the type tag)
                     int fstart = dataBos.size();
@@ -246,8 +246,8 @@
                 for (int i = 0; i < numberOfOpenFields; i++) {
                     // set the field name (including a type tag, which is
                     // astring)
-                    int fieldValueLength = NonTaggedFormatUtil.getFieldValueLength(b, fieldOffset, ATypeTag.STRING,
-                            false);
+                    int fieldValueLength =
+                            NonTaggedFormatUtil.getFieldValueLength(b, fieldOffset, ATypeTag.STRING, false);
                     int fnstart = dataBos.size();
                     dataDos.writeByte(ATypeTag.SERIALIZED_STRING_TYPE_TAG);
                     dataDos.write(b, fieldOffset, fieldValueLength);
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/PointableAllocator.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/PointableAllocator.java
index 3322924..abd4841 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/PointableAllocator.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/PointableAllocator.java
@@ -19,7 +19,6 @@
 
 package org.apache.asterix.om.pointables;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.types.AOrderedListType;
@@ -30,6 +29,7 @@
 import org.apache.asterix.om.util.container.IObjectFactory;
 import org.apache.asterix.om.util.container.IObjectPool;
 import org.apache.asterix.om.util.container.ListObjectPool;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 /**
  * This class is the ONLY place to create IVisitablePointable object instances,
@@ -37,21 +37,21 @@
  */
 public class PointableAllocator {
 
-    private IObjectPool<IVisitablePointable, IAType> flatValueAllocator = new ListObjectPool<IVisitablePointable, IAType>(
-            AFlatValuePointable.FACTORY);
-    private IObjectPool<IVisitablePointable, IAType> recordValueAllocator = new ListObjectPool<IVisitablePointable, IAType>(
-            ARecordVisitablePointable.FACTORY);
-    private IObjectPool<IVisitablePointable, IAType> listValueAllocator = new ListObjectPool<IVisitablePointable, IAType>(
-            AListVisitablePointable.FACTORY);
-    private IObjectPool<AOrderedListType, IAType> orederedListTypeAllocator = new ListObjectPool<AOrderedListType, IAType>(
-            new IObjectFactory<AOrderedListType, IAType>() {
+    private IObjectPool<IVisitablePointable, IAType> flatValueAllocator =
+            new ListObjectPool<IVisitablePointable, IAType>(AFlatValuePointable.FACTORY);
+    private IObjectPool<IVisitablePointable, IAType> recordValueAllocator =
+            new ListObjectPool<IVisitablePointable, IAType>(ARecordVisitablePointable.FACTORY);
+    private IObjectPool<IVisitablePointable, IAType> listValueAllocator =
+            new ListObjectPool<IVisitablePointable, IAType>(AListVisitablePointable.FACTORY);
+    private IObjectPool<AOrderedListType, IAType> orederedListTypeAllocator =
+            new ListObjectPool<AOrderedListType, IAType>(new IObjectFactory<AOrderedListType, IAType>() {
                 @Override
                 public AOrderedListType create(IAType type) {
                     return new AOrderedListType(type, type.getTypeName() + "OrderedList");
                 }
             });
-    private IObjectPool<AOrderedListType, IAType> unorederedListTypeAllocator = new ListObjectPool<AOrderedListType, IAType>(
-            new IObjectFactory<AOrderedListType, IAType>() {
+    private IObjectPool<AOrderedListType, IAType> unorederedListTypeAllocator =
+            new ListObjectPool<AOrderedListType, IAType>(new IObjectFactory<AOrderedListType, IAType>() {
                 @Override
                 public AOrderedListType create(IAType type) {
                     return new AOrderedListType(type, type.getTypeName() + "UnorderedList");
@@ -95,7 +95,7 @@
      * @param typeTag
      * @return the pointable object
      */
-    public IVisitablePointable allocateFieldValue(ATypeTag typeTag, byte[] b, int offset) throws AsterixException {
+    public IVisitablePointable allocateFieldValue(ATypeTag typeTag, byte[] b, int offset) throws HyracksDataException {
         if (typeTag == null)
             return flatValueAllocator.allocate(null);
         else if (typeTag.equals(ATypeTag.OBJECT))
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/base/DefaultOpenFieldType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/base/DefaultOpenFieldType.java
index 3b8f233..868aab5 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/base/DefaultOpenFieldType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/base/DefaultOpenFieldType.java
@@ -42,12 +42,12 @@
     }
 
     // nested open list type
-    public static AOrderedListType NESTED_OPEN_AORDERED_LIST_TYPE = new AOrderedListType(BuiltinType.ANY,
-            "nested-ordered-list");
+    public static AOrderedListType NESTED_OPEN_AORDERED_LIST_TYPE =
+            new AOrderedListType(BuiltinType.ANY, "nested-ordered-list");
 
     // nested open list type
-    public static AUnorderedListType NESTED_OPEN_AUNORDERED_LIST_TYPE = new AUnorderedListType(BuiltinType.ANY,
-            "nested-unordered-list");
+    public static AUnorderedListType NESTED_OPEN_AUNORDERED_LIST_TYPE =
+            new AUnorderedListType(BuiltinType.ANY, "nested-unordered-list");
 
     public static IAType getDefaultOpenFieldType(ATypeTag tag) {
         if (tag.equals(ATypeTag.OBJECT))
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
index 72e3072..6eb7d4c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ACastVisitor.java
@@ -112,8 +112,8 @@
             arg.first.set(accessor);
             return null;
         }
-        ATypeTag inputTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(accessor.getByteArray()[accessor.getStartOffset()]);
+        ATypeTag inputTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(accessor.getByteArray()[accessor.getStartOffset()]);
         if (!needPromote(inputTypeTag, reqTypeTag)) {
             arg.first.set(accessor);
         } else {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
index 9635ac7..ace6769 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/AListCaster.java
@@ -46,8 +46,8 @@
 
     // for storing the cast result
     private final IVisitablePointable itemTempReference = PointableAllocator.allocateUnrestableEmpty();
-    private final Triple<IVisitablePointable, IAType, Boolean> itemVisitorArg = new Triple<>(itemTempReference, null,
-            null);
+    private final Triple<IVisitablePointable, IAType, Boolean> itemVisitorArg =
+            new Triple<>(itemTempReference, null, null);
 
     private final UnorderedListBuilder unOrderedListBuilder = new UnorderedListBuilder();
     private final OrderedListBuilder orderedListBuilder = new OrderedListBuilder();
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
index 25a2f2b..aa6e26b 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/cast/ARecordCaster.java
@@ -73,15 +73,15 @@
     private final IVisitablePointable nullTypeTag = PointableAllocator.allocateUnrestableEmpty();
     private final IVisitablePointable missingTypeTag = PointableAllocator.allocateUnrestableEmpty();
 
-    private final IBinaryComparator fieldNameComparator = PointableBinaryComparatorFactory
-            .of(UTF8StringPointable.FACTORY).createBinaryComparator();
+    private final IBinaryComparator fieldNameComparator =
+            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY).createBinaryComparator();
 
     private final ByteArrayAccessibleOutputStream outputBos = new ByteArrayAccessibleOutputStream();
     private final DataOutputStream outputDos = new DataOutputStream(outputBos);
 
     private final IVisitablePointable fieldTempReference = PointableAllocator.allocateUnrestableEmpty();
-    private final Triple<IVisitablePointable, IAType, Boolean> nestedVisitorArg = new Triple<>(fieldTempReference, null,
-            null);
+    private final Triple<IVisitablePointable, IAType, Boolean> nestedVisitorArg =
+            new Triple<>(fieldTempReference, null, null);
 
     private int numInputFields = 0;
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
index 7a2efe0..7c74a69 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/AListPointable.java
@@ -189,8 +189,7 @@
         }
     }
 
-    public void getItemValue(AbstractCollectionType inputType, int index, DataOutput dOut)
-            throws IOException, AsterixException {
+    public void getItemValue(AbstractCollectionType inputType, int index, DataOutput dOut) throws IOException {
         if (getType() != ATypeTag.ANY.serialize()) {
             dOut.writeByte(getType());
         }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
index 0aa256f..77491e8 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/pointables/nonvisitor/ARecordPointable.java
@@ -219,8 +219,7 @@
     // Closed field accessors.
     // -----------------------
 
-    public void getClosedFieldValue(ARecordType recordType, int fieldId, DataOutput dOut)
-            throws IOException, AsterixException {
+    public void getClosedFieldValue(ARecordType recordType, int fieldId, DataOutput dOut) throws IOException {
         if (isClosedFieldNull(recordType, fieldId)) {
             dOut.writeByte(ATypeTag.SERIALIZED_NULL_TYPE_TAG);
         } else if (isClosedFieldMissing(recordType, fieldId)) {
@@ -286,8 +285,7 @@
     // Open field accessors.
     // -----------------------
 
-    public void getOpenFieldValue(ARecordType recordType, int fieldId, DataOutput dOut)
-            throws IOException, AsterixException {
+    public void getOpenFieldValue(ARecordType recordType, int fieldId, DataOutput dOut) throws IOException {
         dOut.write(bytes, getOpenFieldValueOffset(recordType, fieldId), getOpenFieldValueSize(recordType, fieldId));
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/CollectionMemberResultType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/CollectionMemberResultType.java
index f8f6925..cc2f9b6 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/CollectionMemberResultType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/CollectionMemberResultType.java
@@ -37,8 +37,7 @@
     protected void checkArgType(String funcName, int argIndex, IAType type) throws AlgebricksException {
         ATypeTag actualTypeTag = type.getTypeTag();
         if (type.getTypeTag() != ATypeTag.MULTISET && type.getTypeTag() != ATypeTag.ARRAY) {
-            throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.MULTISET,
-                    ATypeTag.ARRAY);
+            throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.MULTISET, ATypeTag.ARRAY);
         }
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessNestedResultType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessNestedResultType.java
index 21593d9e..3eae173 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessNestedResultType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/FieldAccessNestedResultType.java
@@ -59,8 +59,7 @@
                     checkOrderedList(funcName, type);
                     break;
                 default:
-                    throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.STRING,
-                            ATypeTag.ARRAY);
+                    throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.STRING, ATypeTag.ARRAY);
             }
         }
     }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
index a81ef34..575ec52 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/NonTaggedGetItemResultType.java
@@ -41,8 +41,7 @@
         ATypeTag actualTypeTag = type.getTypeTag();
         if (argIndex == 0) {
             if (type.getTypeTag() != ATypeTag.MULTISET && type.getTypeTag() != ATypeTag.ARRAY) {
-                throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.STRING,
-                        ATypeTag.ARRAY);
+                throw new TypeMismatchException(funcName, argIndex, actualTypeTag, ATypeTag.STRING, ATypeTag.ARRAY);
             }
         } else {
             if (!ATypeHierarchy.isCompatible(type.getTypeTag(), ATypeTag.INTEGER)) {
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
index 5167f30..db4d1c4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordMergeTypeComputer.java
@@ -131,17 +131,17 @@
                 // If a sub-record do merge, else ignore and let the values decide what to do
                 if (fieldType1Copy.getFieldTypes()[i].getTypeTag() == ATypeTag.OBJECT) {
                     IAType[] oldTypes = resultType.getFieldTypes();
-                    oldTypes[pos] = mergedNestedType(fname, fieldType1Copy.getFieldTypes()[i],
-                            resultType.getFieldTypes()[pos]);
+                    oldTypes[pos] =
+                            mergedNestedType(fname, fieldType1Copy.getFieldTypes()[i], resultType.getFieldTypes()[pos]);
                     resultType = new ARecordType(resultType.getTypeName(), resultType.getFieldNames(), oldTypes,
-                                resultType.isOpen());
+                            resultType.isOpen());
                 }
             } else {
-                IAType[] combinedFieldTypes = ArrayUtils.addAll(resultType.getFieldTypes().clone(),
-                            fieldType1Copy.getFieldTypes()[i]);
+                IAType[] combinedFieldTypes =
+                        ArrayUtils.addAll(resultType.getFieldTypes().clone(), fieldType1Copy.getFieldTypes()[i]);
                 resultType = new ARecordType(resultType.getTypeName(),
-                            ArrayUtils.addAll(resultType.getFieldNames(), fieldType1Copy.getFieldNames()[i]),
-                            combinedFieldTypes, resultType.isOpen());
+                        ArrayUtils.addAll(resultType.getFieldNames(), fieldType1Copy.getFieldNames()[i]),
+                        combinedFieldTypes, resultType.isOpen());
             }
         }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordRemoveFieldsTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordRemoveFieldsTypeComputer.java
index 3bd64d6..e0b10d1 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordRemoveFieldsTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/RecordRemoveFieldsTypeComputer.java
@@ -128,8 +128,7 @@
     }
 
     private void computeTypeFromNonConstantExpression(String funcName, ILogicalExpression expression,
-            Set<String> fieldNameSet,
-            List<List<String>> pathList) throws AlgebricksException {
+            Set<String> fieldNameSet, List<List<String>> pathList) throws AlgebricksException {
         AbstractFunctionCallExpression funcExp = (AbstractFunctionCallExpression) expression;
         List<Mutable<ILogicalExpression>> args = funcExp.getArguments();
 
@@ -188,8 +187,8 @@
 
     private boolean setFieldNameSet(ILogicalExpression expr, Set<String> fieldNameSet) {
         if (expr.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
-            AOrderedList orderedList = (AOrderedList) (((AsterixConstantValue) ((ConstantExpression) expr).getValue())
-                    .getObject());
+            AOrderedList orderedList =
+                    (AOrderedList) (((AsterixConstantValue) ((ConstantExpression) expr).getValue()).getObject());
             for (int i = 0; i < orderedList.size(); i++) {
                 AString as = (AString) orderedList.getItem(i);
                 fieldNameSet.add(as.getStringValue());
@@ -320,8 +319,7 @@
                 destFieldTypes.toArray(new IAType[n]), isOpen);
     }
 
-    private static ARecordType getRecordTypeFromType(String funcName, IAType type0)
-            throws AlgebricksException {
+    private static ARecordType getRecordTypeFromType(String funcName, IAType type0) throws AlgebricksException {
         switch (type0.getTypeTag()) {
             case OBJECT:
                 return (ARecordType) type0;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/SubsetCollectionTypeComputer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/SubsetCollectionTypeComputer.java
index 7867cf6..0ab49d0 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/SubsetCollectionTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/SubsetCollectionTypeComputer.java
@@ -55,8 +55,7 @@
             case UNION: {
                 AUnionType ut = (AUnionType) t;
                 if (!ut.isUnknownableType()) {
-                    throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET,
-                            ATypeTag.ARRAY);
+                    throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET, ATypeTag.ARRAY);
                 }
                 IAType t2 = ut.getActualType();
                 ATypeTag tag2 = t2.getTypeTag();
@@ -64,14 +63,12 @@
                     AbstractCollectionType act = (AbstractCollectionType) t2;
                     return act.getItemType();
                 }
-                throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET,
-                        ATypeTag.ARRAY);
+                throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET, ATypeTag.ARRAY);
             }
             case ANY:
                 return BuiltinType.ANY;
             default:
-                throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET,
-                        ATypeTag.ARRAY);
+                throw new TypeMismatchException(funcName, 0, actualTypeTag, ATypeTag.MULTISET, ATypeTag.ARRAY);
         }
     }
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java
index 1c1bdbc..7cb383f 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AOrderedListType.java
@@ -77,7 +77,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode type = om.createObjectNode();
         type.put("type", AOrderedListType.class.getName());
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ATypeTag.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ATypeTag.java
index 6889934..825ed70 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ATypeTag.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/ATypeTag.java
@@ -130,8 +130,7 @@
     }
 
     public boolean isDerivedType() {
-        return this == ATypeTag.OBJECT || this == ATypeTag.ARRAY || this == ATypeTag.MULTISET
-                || this == ATypeTag.UNION;
+        return this == ATypeTag.OBJECT || this == ATypeTag.ARRAY || this == ATypeTag.MULTISET || this == ATypeTag.UNION;
     }
 
     @Override
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java
index ace3b6c..007f072 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnionType.java
@@ -196,7 +196,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode type = om.createObjectNode();
         type.put("type", AUnionType.class.getName());
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java
index 6de918a..8d088f7 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/AUnorderedListType.java
@@ -27,7 +27,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    public static final AUnorderedListType FULLY_OPEN_UNORDEREDLIST_TYPE = new AUnorderedListType(null,"");
+    public static final AUnorderedListType FULLY_OPEN_UNORDEREDLIST_TYPE = new AUnorderedListType(null, "");
 
     /**
      * @param itemType
@@ -77,7 +77,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode type = om.createObjectNode();
         type.put("type", AUnorderedListType.class.getName());
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/EnumDeserializer.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/EnumDeserializer.java
index 8ec8989..05f265c 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/EnumDeserializer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/EnumDeserializer.java
@@ -23,8 +23,8 @@
 
 public class EnumDeserializer<E extends Enum<E> & IEnumSerializer> {
 
-    public static final EnumDeserializer<ATypeTag> ATYPETAGDESERIALIZER = new EnumDeserializer<ATypeTag>(
-            ATypeTag.class);
+    public static final EnumDeserializer<ATypeTag> ATYPETAGDESERIALIZER =
+            new EnumDeserializer<ATypeTag>(ATypeTag.class);
 
     private Map<Byte, E> enumvalMap = new HashMap<Byte, E>();
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeTagUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeTagUtil.java
index 5d91d2f..cfc1b55 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeTagUtil.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/TypeTagUtil.java
@@ -18,13 +18,13 @@
  */
 package org.apache.asterix.om.types;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.utils.RecordUtil;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
 public class TypeTagUtil {
 
-    public static IAType getBuiltinTypeByTag(ATypeTag typeTag) throws AsterixException {
+    public static IAType getBuiltinTypeByTag(ATypeTag typeTag) throws HyracksDataException {
         switch (typeTag) {
             case TINYINT:
                 return BuiltinType.AINT8;
@@ -89,7 +89,8 @@
             case ARRAY:
                 return AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
             default:
-                throw new AsterixException("Typetag " + typeTag + " is not a built-in type");
+                // TODO(tillw) should be an internal error
+                throw new HyracksDataException("Typetag " + typeTag + " is not a built-in type");
         }
     }
 
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/runtime/RuntimeRecordTypeInfo.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/runtime/RuntimeRecordTypeInfo.java
index a34bd40..55108a1 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/runtime/RuntimeRecordTypeInfo.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/types/runtime/RuntimeRecordTypeInfo.java
@@ -53,10 +53,10 @@
     private ARecordType cachedRecType = null;
 
     public RuntimeRecordTypeInfo() {
-        fieldNameComparator = new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY)
-                .createBinaryComparator();
-        fieldNameHashFunction = new PointableBinaryHashFunctionFactory(UTF8StringPointable.FACTORY)
-                .createBinaryHashFunction();
+        fieldNameComparator =
+                new PointableBinaryComparatorFactory(UTF8StringPointable.FACTORY).createBinaryComparator();
+        fieldNameHashFunction =
+                new PointableBinaryHashFunctionFactory(UTF8StringPointable.FACTORY).createBinaryHashFunction();
         writer = new UTF8StringWriter();
     }
 
@@ -88,8 +88,8 @@
                     serializedFieldNameOffsets[i] = baaos.size();
                     writer.writeUTF8(fieldNames[i], dos);
                     length = baaos.size() - serializedFieldNameOffsets[i];
-                    hashCodeIndexPairs[i] = fieldNameHashFunction.hash(baaos.getByteArray(),
-                            serializedFieldNameOffsets[i], length);
+                    hashCodeIndexPairs[i] =
+                            fieldNameHashFunction.hash(baaos.getByteArray(), serializedFieldNameOffsets[i], length);
                     hashCodeIndexPairs[i] = hashCodeIndexPairs[i] << 32;
                     hashCodeIndexPairs[i] = hashCodeIndexPairs[i] | i;
                 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/RecordUtil.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/RecordUtil.java
index 031669a..ec1c7cb 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/RecordUtil.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/utils/RecordUtil.java
@@ -29,7 +29,7 @@
      * A fully open record type which has the name OpenRecord
      */
     public static final ARecordType FULLY_OPEN_RECORD_TYPE =
-            new ARecordType("OpenRecord", new String[0], new IAType[0], true);
+            new ARecordType("AnyObject", new String[0], new IAType[0], true);
 
     private RecordUtil() {
     }
diff --git a/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerTestUtils.java b/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerTestUtils.java
index 4d41092..68923a1 100644
--- a/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerTestUtils.java
+++ b/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SerializerDeserializerTestUtils.java
@@ -64,19 +64,19 @@
         ARecord addr12 = new ARecord(addrRecordType,
                 new IAObject[] { new AString("210 University Drive"), new AString("Philadelphia"), new AString("PA"),
                         new AInt16((short) 10086), new AInterval(100, 300, (byte) 0) });
-        ARecord addr21 = new ARecord(addrRecordType,
-                new IAObject[] { new AString("1 College Street"), new AString("Seattle"), new AString("WA"),
-                        new AInt16((short) 20012), new AInterval(400, 500, (byte) 0) });
-        ARecord addr22 = new ARecord(addrRecordType,
-                new IAObject[] { new AString("20 Lindsay Avenue"), new AString("Columbus"), new AString("OH"),
-                        new AInt16((short) 30120), new AInterval(600, 900, (byte) 0) });
-        ARecord addr31 = new ARecord(addrRecordType,
-                new IAObject[] { new AString("200 14th Avenue"), new AString("Long Island"), new AString("NY"),
-                        new AInt16((short) 95011), new AInterval(12000, 14000, (byte) 0) });
+        ARecord addr21 =
+                new ARecord(addrRecordType, new IAObject[] { new AString("1 College Street"), new AString("Seattle"),
+                        new AString("WA"), new AInt16((short) 20012), new AInterval(400, 500, (byte) 0) });
+        ARecord addr22 =
+                new ARecord(addrRecordType, new IAObject[] { new AString("20 Lindsay Avenue"), new AString("Columbus"),
+                        new AString("OH"), new AInt16((short) 30120), new AInterval(600, 900, (byte) 0) });
+        ARecord addr31 =
+                new ARecord(addrRecordType, new IAObject[] { new AString("200 14th Avenue"), new AString("Long Island"),
+                        new AString("NY"), new AInt16((short) 95011), new AInterval(12000, 14000, (byte) 0) });
         // With nested open field addr31.
-        ARecord addr32 = new ARecord(addrRecordType,
-                new IAObject[] { new AString("51 8th Street"), new AString("Orlando"), new AString("FL"),
-                        new AInt16((short) 49045), new AInterval(190000, 200000, (byte) 0) });
+        ARecord addr32 =
+                new ARecord(addrRecordType, new IAObject[] { new AString("51 8th Street"), new AString("Orlando"),
+                        new AString("FL"), new AInt16((short) 49045), new AInterval(190000, 200000, (byte) 0) });
 
         ARecord record1 = new ARecord(employeeType, new IAObject[] { new AInt64(0L), new AString("Tom"),
                 new AOrderedList(addrListType, Arrays.asList(new IAObject[] { addr11, addr12 })) });
diff --git a/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SimpleSerializerDeserializerTest.java b/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SimpleSerializerDeserializerTest.java
index 8a5270f..a661f64 100644
--- a/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SimpleSerializerDeserializerTest.java
+++ b/asterixdb/asterix-om/src/test/java/org/apache/asterix/dataflow/data/nontagged/serde/SimpleSerializerDeserializerTest.java
@@ -32,8 +32,8 @@
     @Test
     public void test() {
         Reflections reflections = new Reflections("org.apache.asterix.dataflow.data.nontagged.serde");
-        Set<Class<? extends ISerializerDeserializer>> allClasses = reflections
-                .getSubTypesOf(ISerializerDeserializer.class);
+        Set<Class<? extends ISerializerDeserializer>> allClasses =
+                reflections.getSubTypesOf(ISerializerDeserializer.class);
 
         for (Class<? extends ISerializerDeserializer> cl : allClasses) {
             String className = cl.getName();
diff --git a/asterixdb/asterix-replication/pom.xml b/asterixdb/asterix-replication/pom.xml
index 320c1ecf..787a0b4 100644
--- a/asterixdb/asterix-replication/pom.xml
+++ b/asterixdb/asterix-replication/pom.xml
@@ -14,6 +14,9 @@
       <comments>A business-friendly OSS license</comments>
     </license>
   </licenses>
+  <properties>
+    <root.dir>${basedir}/..</root.dir>
+  </properties>
   <build>
     <plugins>
       <plugin>
@@ -43,11 +46,6 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-metadata</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-api</artifactId>
     </dependency>
@@ -56,10 +54,6 @@
       <artifactId>hyracks-util</artifactId>
     </dependency>
     <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-storage-am-lsm-common</artifactId>
     </dependency>
@@ -76,6 +70,18 @@
       <artifactId>asterix-transactions</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicaTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicaTask.java
new file mode 100644
index 0000000..807ae5f
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicaTask.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.api;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface IReplicaTask extends IReplicationMessage {
+
+    /**
+     * Performs the task on the replica
+     *
+     * @param appCtx
+     * @param worker
+     * @throws HyracksDataException
+     */
+    void perform(INcApplicationContext appCtx, IReplicationWorker worker) throws HyracksDataException;
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationMessage.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationMessage.java
new file mode 100644
index 0000000..bc6e87b
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationMessage.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.api;
+
+import java.io.OutputStream;
+
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public interface IReplicationMessage {
+
+    /**
+     * @return the message type
+     */
+    ReplicationProtocol.ReplicationRequestType getMessageType();
+
+    /**
+     * Serializes {@link IReplicationMessage} to {@code out}
+     *
+     * @param out
+     * @throws HyracksDataException
+     */
+    void serialize(OutputStream out) throws HyracksDataException;
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationWorker.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationWorker.java
new file mode 100644
index 0000000..8840c3f
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/IReplicationWorker.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.api;
+
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+
+import org.apache.asterix.common.transactions.LogRecord;
+
+public interface IReplicationWorker extends Runnable {
+
+    /**
+     * @return The replication socket channel.
+     */
+    SocketChannel getChannel();
+
+    /**
+     * Gets a reusable buffer that can be used to send data
+     *
+     * @return the reusable buffer
+     */
+    ByteBuffer getReusableBuffer();
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/PartitionReplica.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/PartitionReplica.java
new file mode 100644
index 0000000..d3ddc43
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/PartitionReplica.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.api;
+
+import static org.apache.asterix.common.replication.IPartitionReplica.PartitionReplicaStatus.CATCHING_UP;
+import static org.apache.asterix.common.replication.IPartitionReplica.PartitionReplicaStatus.DISCONNECTED;
+import static org.apache.asterix.common.replication.IPartitionReplica.PartitionReplicaStatus.IN_SYNC;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.storage.ReplicaIdentifier;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.replication.sync.ReplicaSynchronizer;
+import org.apache.hyracks.util.JSONUtil;
+import org.apache.hyracks.util.StorageUtil;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+@ThreadSafe
+public class PartitionReplica implements IPartitionReplica {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private static final int INITIAL_BUFFER_SIZE = StorageUtil.getIntSizeInBytes(4, StorageUtil.StorageUnit.KILOBYTE);
+    private final INcApplicationContext appCtx;
+    private final ReplicaIdentifier id;
+    private ByteBuffer reusbaleBuf;
+    private PartitionReplicaStatus status = DISCONNECTED;
+    private SocketChannel sc;
+
+    public PartitionReplica(ReplicaIdentifier id, INcApplicationContext appCtx) {
+        this.id = id;
+        this.appCtx = appCtx;
+    }
+
+    @Override
+    public synchronized PartitionReplicaStatus getStatus() {
+        return status;
+    }
+
+    @Override
+    public ReplicaIdentifier getIdentifier() {
+        return id;
+    }
+
+    @Override
+    public synchronized void notifyFailure(Exception failure) {
+        setStatus(DISCONNECTED);
+    }
+
+    public synchronized void sync() {
+        if (status == IN_SYNC || status == CATCHING_UP) {
+            return;
+        }
+        setStatus(CATCHING_UP);
+        appCtx.getThreadExecutor().execute(() -> {
+            try {
+                new ReplicaSynchronizer(appCtx, this).sync();
+                setStatus(IN_SYNC);
+            } catch (Exception e) {
+                LOGGER.error(() -> "Failed to sync replica " + this, e);
+                notifyFailure(e);
+            } finally {
+                close();
+            }
+        });
+    }
+
+    public synchronized SocketChannel getChannel() {
+        try {
+            if (sc == null || !sc.isOpen() || !sc.isConnected()) {
+                sc = SocketChannel.open();
+                sc.configureBlocking(true);
+                sc.connect(id.getLocation());
+            }
+            return sc;
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public synchronized void close() {
+        try {
+            if (sc != null && sc.isOpen()) {
+                ReplicationProtocol.sendGoodbye(sc);
+                sc.close();
+                sc = null;
+            }
+        } catch (IOException e) {
+            LOGGER.warn("Failed to close channel", e);
+        }
+    }
+
+    public synchronized ByteBuffer getReusableBuffer() {
+        if (reusbaleBuf == null) {
+            reusbaleBuf = ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
+        }
+        return reusbaleBuf;
+    }
+
+    private JsonNode asJson() {
+        ObjectNode json = OBJECT_MAPPER.createObjectNode();
+        json.put("id", id.toString());
+        json.put("status", status.name());
+        return json;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        PartitionReplica that = (PartitionReplica) o;
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        try {
+            return OBJECT_MAPPER.writeValueAsString(asJson());
+        } catch (JsonProcessingException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    private synchronized void setStatus(PartitionReplicaStatus status) {
+        if (this.status == status) {
+            return;
+        }
+        LOGGER.info(() -> "Replica " + this + " status changing: " + this.status + " -> " + status);
+        this.status = status;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/ReplicationDestination.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/ReplicationDestination.java
new file mode 100644
index 0000000..a092322
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/api/ReplicationDestination.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.api;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.channels.SocketChannel;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.replication.IReplicationDestination;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ReplicationDestination implements IReplicationDestination {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final Set<IPartitionReplica> replicas = new HashSet<>();
+    private final InetSocketAddress location;
+    private SocketChannel logRepChannel;
+
+    private ReplicationDestination(InetSocketAddress location) {
+        this.location = location;
+    }
+
+    public static ReplicationDestination at(InetSocketAddress location) {
+        return new ReplicationDestination(location);
+    }
+
+    @Override
+    public synchronized void add(IPartitionReplica replica) {
+        replicas.add(replica);
+    }
+
+    @Override
+    public synchronized void remove(IPartitionReplica replica) {
+        replicas.remove(replica);
+    }
+
+    @Override
+    public synchronized void notifyFailure(Exception failure) {
+        replicas.forEach(replica -> replica.notifyFailure(failure));
+        closeLogReplicationChannel();
+    }
+
+    @Override
+    public Set<IPartitionReplica> getReplicas() {
+        return new HashSet<>(replicas);
+    }
+
+    public synchronized Optional<IPartitionReplica> getPartitionReplica(int partition) {
+        return replicas.stream().filter(replica -> replica.getIdentifier().getPartition() == partition
+                && replica.getStatus() == IPartitionReplica.PartitionReplicaStatus.IN_SYNC).findAny();
+    }
+
+    public synchronized SocketChannel getLogReplicationChannel() {
+        try {
+            if (logRepChannel == null || !logRepChannel.isOpen() || !logRepChannel.isConnected()) {
+                logRepChannel = SocketChannel.open();
+                logRepChannel.configureBlocking(true);
+                logRepChannel.connect(location);
+            }
+            return logRepChannel;
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    private synchronized void closeLogReplicationChannel() {
+        try {
+            if (logRepChannel != null && logRepChannel.isOpen()) {
+                ReplicationProtocol.sendGoodbye(logRepChannel);
+                logRepChannel.close();
+                logRepChannel = null;
+            }
+        } catch (IOException e) {
+            LOGGER.warn("Exception while closing socket", e);
+        }
+    }
+
+    @Override
+    public InetSocketAddress getLocation() {
+        return location;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        ReplicationDestination that = (ReplicationDestination) o;
+        return Objects.equals(location, that.location);
+    }
+
+    @Override
+    public String toString() {
+        return location.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(location);
+    }
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaFilesRequest.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaFilesRequest.java
deleted file mode 100644
index f5b2378..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaFilesRequest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.functions;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashSet;
-import java.util.Set;
-
-public class ReplicaFilesRequest {
-    private final Set<Integer> partitionIds;
-    private final Set<String> existingFiles;
-
-    public ReplicaFilesRequest(Set<Integer> partitionIds, Set<String> existingFiles) {
-        this.partitionIds = partitionIds;
-        this.existingFiles = existingFiles;
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeInt(partitionIds.size());
-        for (Integer partitionId : partitionIds) {
-            dos.writeInt(partitionId);
-        }
-        dos.writeInt(existingFiles.size());
-        for (String fileName : existingFiles) {
-            dos.writeUTF(fileName);
-        }
-    }
-
-    public static ReplicaFilesRequest create(DataInput input) throws IOException {
-        int size = input.readInt();
-        Set<Integer> partitionIds = new HashSet<>(size);
-        for (int i = 0; i < size; i++) {
-            partitionIds.add(input.readInt());
-        }
-        int filesCount = input.readInt();
-        Set<String> existingFiles = new HashSet<>(filesCount);
-        for (int i = 0; i < filesCount; i++) {
-            existingFiles.add(input.readUTF());
-        }
-        return new ReplicaFilesRequest(partitionIds, existingFiles);
-    }
-
-    public Set<Integer> getPartitionIds() {
-        return partitionIds;
-    }
-
-    public Set<String> getExistingFiles() {
-        return existingFiles;
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaIndexFlushRequest.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaIndexFlushRequest.java
deleted file mode 100644
index a3c269d..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaIndexFlushRequest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.functions;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashSet;
-import java.util.Set;
-
-public class ReplicaIndexFlushRequest {
-    Set<Long> laggingRescouresIds;
-
-    public ReplicaIndexFlushRequest(Set<Long> laggingRescouresIds) {
-        this.laggingRescouresIds = laggingRescouresIds;
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeInt(laggingRescouresIds.size());
-        for (Long resourceId : laggingRescouresIds) {
-            dos.writeLong(resourceId);
-        }
-    }
-
-    public static ReplicaIndexFlushRequest create(DataInput input) throws IOException {
-        int numOfResources = input.readInt();
-        Set<Long> laggingRescouresIds = new HashSet<Long>(numOfResources);
-        for (int i = 0; i < numOfResources; i++) {
-            laggingRescouresIds.add(input.readLong());
-        }
-        return new ReplicaIndexFlushRequest(laggingRescouresIds);
-    }
-
-    public Set<Long> getLaggingRescouresIds() {
-        return laggingRescouresIds;
-    }
-
-    public void setLaggingRescouresIds(Set<Long> laggingRescouresIds) {
-        this.laggingRescouresIds = laggingRescouresIds;
-    }
-
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaLogsRequest.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaLogsRequest.java
deleted file mode 100644
index 90df1e7..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicaLogsRequest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.functions;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashSet;
-import java.util.Set;
-
-public class ReplicaLogsRequest {
-    Set<String> replicaIds;
-    long fromLSN;
-
-    public ReplicaLogsRequest(Set<String> replicaIds, long fromLSN) {
-        this.replicaIds = replicaIds;
-        this.fromLSN = fromLSN;
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeInt(replicaIds.size());
-        for (String replicaId : replicaIds) {
-            dos.writeUTF(replicaId);
-        }
-        dos.writeLong(fromLSN);
-    }
-
-    public static ReplicaLogsRequest create(DataInput input) throws IOException {
-        int size = input.readInt();
-        Set<String> replicaIds = new HashSet<String>(size);
-        for (int i = 0; i < size; i++) {
-            replicaIds.add(input.readUTF());
-        }
-        long fromLSN = input.readLong();
-        return new ReplicaLogsRequest(replicaIds, fromLSN);
-    }
-
-    public Set<String> getReplicaIds() {
-        return replicaIds;
-    }
-
-    public void setReplicaIds(Set<String> replicaIds) {
-        this.replicaIds = replicaIds;
-    }
-
-    public long getFromLSN() {
-        return fromLSN;
-    }
-
-    public void setFromLSN(long fromLSN) {
-        this.fromLSN = fromLSN;
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicationProtocol.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicationProtocol.java
deleted file mode 100644
index 8a52529..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/functions/ReplicationProtocol.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.functions;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-
-import org.apache.asterix.common.replication.ReplicaEvent;
-import org.apache.asterix.replication.management.NetworkingUtil;
-import org.apache.asterix.replication.storage.LSMComponentProperties;
-import org.apache.asterix.replication.storage.LSMIndexFileProperties;
-import org.apache.hyracks.data.std.util.ExtendedByteArrayOutputStream;
-
-public class ReplicationProtocol {
-
-    /**
-     * All replication messages start with ReplicationRequestType (4 bytes), then the length of the request in bytes
-     */
-    public static final String JOB_REPLICATION_ACK = "$";
-
-    public final static int REPLICATION_REQUEST_TYPE_SIZE = Integer.BYTES;
-    public final static int REPLICATION_REQUEST_HEADER_SIZE = REPLICATION_REQUEST_TYPE_SIZE + Integer.BYTES;
-
-    /*
-     * ReplicationRequestType:
-     * REPLICATE_LOG: txn log replication
-     * REPLICATE_FILE: replicate a file(s)
-     * DELETE_FILE: delete a file(s)
-     * GET_REPLICA_FILES: used during remote recovery to request lost LSM Components
-     * GET_REPLICA_MAX_LSN: used during remote recovery initialize a log manager LSN
-     * GOODBYE: used to notify replicas that the replication request has been completed
-     * REPLICA_EVENT: used to notify replicas about a remote replica split/merge.
-     * LSM_COMPONENT_PROPERTIES: used to send the properties of an LSM Component before its physical files are sent
-     * ACK: used to notify the requesting replica that the request has been completed successfully
-     * FLUSH_INDEX: request remote replica to flush an LSM component
-     */
-    public enum ReplicationRequestType {
-        REPLICATE_LOG,
-        REPLICATE_FILE,
-        DELETE_FILE,
-        GET_REPLICA_FILES,
-        GET_REPLICA_MAX_LSN,
-        GOODBYE,
-        REPLICA_EVENT,
-        LSM_COMPONENT_PROPERTIES,
-        ACK,
-        FLUSH_INDEX
-    }
-
-    public static ByteBuffer readRequest(SocketChannel socketChannel, ByteBuffer dataBuffer) throws IOException {
-        //read request size
-        NetworkingUtil.readBytes(socketChannel, dataBuffer, Integer.BYTES);
-        int requestSize = dataBuffer.getInt();
-
-        if (dataBuffer.capacity() < requestSize) {
-            dataBuffer = ByteBuffer.allocate(requestSize);
-        }
-
-        //read request
-        NetworkingUtil.readBytes(socketChannel, dataBuffer, requestSize);
-
-        return dataBuffer;
-    }
-
-    public static ByteBuffer writeLSMComponentPropertiesRequest(LSMComponentProperties lsmCompProp, ByteBuffer buffer)
-            throws IOException {
-        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
-        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
-            lsmCompProp.serialize(oos);
-            int requestSize = REPLICATION_REQUEST_HEADER_SIZE + oos.size();
-            if (buffer.capacity() < requestSize) {
-                buffer = ByteBuffer.allocate(requestSize);
-            } else {
-                buffer.clear();
-            }
-            buffer.putInt(ReplicationRequestType.LSM_COMPONENT_PROPERTIES.ordinal());
-            buffer.putInt(oos.size());
-            buffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
-            buffer.flip();
-            return buffer;
-        }
-    }
-
-    public static ReplicationRequestType getRequestType(SocketChannel socketChannel, ByteBuffer byteBuffer)
-            throws IOException {
-        //read replication request type
-        NetworkingUtil.readBytes(socketChannel, byteBuffer, REPLICATION_REQUEST_TYPE_SIZE);
-
-        ReplicationRequestType requestType = ReplicationProtocol.ReplicationRequestType.values()[byteBuffer.getInt()];
-        return requestType;
-    }
-
-    public static LSMComponentProperties readLSMPropertiesRequest(ByteBuffer buffer) throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
-        DataInputStream dis = new DataInputStream(bais);
-        return LSMComponentProperties.create(dis);
-    }
-
-    public static ByteBuffer getGoodbyeBuffer() {
-        ByteBuffer bb = ByteBuffer.allocate(REPLICATION_REQUEST_TYPE_SIZE);
-        bb.putInt(ReplicationRequestType.GOODBYE.ordinal());
-        bb.flip();
-        return bb;
-    }
-
-    public static ByteBuffer getAckBuffer() {
-        ByteBuffer bb = ByteBuffer.allocate(REPLICATION_REQUEST_TYPE_SIZE);
-        bb.putInt(ReplicationRequestType.ACK.ordinal());
-        bb.flip();
-        return bb;
-    }
-
-    public static ByteBuffer writeFileReplicationRequest(ByteBuffer requestBuffer, LSMIndexFileProperties afp,
-            ReplicationRequestType requestType) throws IOException {
-        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
-        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
-            afp.serialize(oos);
-            int requestSize = REPLICATION_REQUEST_HEADER_SIZE + oos.size();
-            if (requestBuffer.capacity() < requestSize) {
-                requestBuffer = ByteBuffer.allocate(requestSize);
-            } else {
-                requestBuffer.clear();
-            }
-            requestBuffer.putInt(requestType.ordinal());
-            requestBuffer.putInt(oos.size());
-            requestBuffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
-            requestBuffer.flip();
-            return requestBuffer;
-        }
-    }
-
-    public static LSMIndexFileProperties readFileReplicationRequest(ByteBuffer buffer) throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
-        DataInputStream dis = new DataInputStream(bais);
-        return LSMIndexFileProperties.create(dis);
-    }
-
-    public static ByteBuffer writeReplicaEventRequest(ReplicaEvent event) throws IOException {
-        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
-        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
-            event.serialize(oos);
-            ByteBuffer buffer = ByteBuffer.allocate(REPLICATION_REQUEST_HEADER_SIZE + oos.size());
-            buffer.putInt(ReplicationRequestType.REPLICA_EVENT.ordinal());
-            buffer.putInt(oos.size());
-            buffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
-            buffer.flip();
-            return buffer;
-        }
-    }
-
-    public static ReplicaEvent readReplicaEventRequest(ByteBuffer buffer) throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
-        DataInputStream dis = new DataInputStream(bais);
-
-        return ReplicaEvent.create(dis);
-    }
-
-    public static ByteBuffer writeGetReplicaFilesRequest(ByteBuffer buffer, ReplicaFilesRequest request)
-            throws IOException {
-        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
-        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
-            request.serialize(oos);
-
-            int requestSize = REPLICATION_REQUEST_HEADER_SIZE + oos.size();
-            if (buffer.capacity() < requestSize) {
-                buffer = ByteBuffer.allocate(requestSize);
-            } else {
-                buffer.clear();
-            }
-            buffer.putInt(ReplicationRequestType.GET_REPLICA_FILES.ordinal());
-            buffer.putInt(oos.size());
-            buffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
-            buffer.flip();
-            return buffer;
-        }
-    }
-
-    public static ByteBuffer writeGetReplicaIndexFlushRequest(ByteBuffer buffer, ReplicaIndexFlushRequest request)
-            throws IOException {
-        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
-        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
-            request.serialize(oos);
-            int requestSize = REPLICATION_REQUEST_HEADER_SIZE + oos.size();
-            if (buffer.capacity() < requestSize) {
-                buffer = ByteBuffer.allocate(requestSize);
-            } else {
-                buffer.clear();
-            }
-            buffer.putInt(ReplicationRequestType.FLUSH_INDEX.ordinal());
-            buffer.putInt(oos.size());
-            buffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
-            buffer.flip();
-            return buffer;
-        }
-    }
-
-    public static ReplicaFilesRequest readReplicaFileRequest(ByteBuffer buffer) throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
-        DataInputStream dis = new DataInputStream(bais);
-        return ReplicaFilesRequest.create(dis);
-    }
-
-    public static ReplicaIndexFlushRequest readReplicaIndexFlushRequest(ByteBuffer buffer) throws IOException {
-        ByteArrayInputStream bais = new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
-        DataInputStream dis = new DataInputStream(bais);
-        return ReplicaIndexFlushRequest.create(dis);
-    }
-
-    public static void writeGetReplicaMaxLSNRequest(ByteBuffer requestBuffer) {
-        requestBuffer.clear();
-        requestBuffer.putInt(ReplicationRequestType.GET_REPLICA_MAX_LSN.ordinal());
-        requestBuffer.flip();
-    }
-
-    public static int getJobIdFromLogAckMessage(String msg) {
-        return Integer.parseInt(msg.substring((msg.indexOf(JOB_REPLICATION_ACK) + 1)));
-    }
-
-    public static String getNodeIdFromLogAckMessage(String msg) {
-        return msg.substring(0, msg.indexOf(JOB_REPLICATION_ACK));
-    }
-
-    /**
-     * Sends a goodbye request to a remote replica indicating the end of a replication request.
-     *
-     * @param socketChannel
-     *            the remote replica socket.
-     * @throws IOException
-     */
-    public static void sendGoodbye(SocketChannel socketChannel) throws IOException {
-        ByteBuffer goodbyeBuffer = ReplicationProtocol.getGoodbyeBuffer();
-        NetworkingUtil.transferBufferToChannel(socketChannel, goodbyeBuffer);
-    }
-
-    public static void sendAck(SocketChannel socketChannel) throws IOException {
-        ByteBuffer ackBuffer = ReplicationProtocol.getAckBuffer();
-        NetworkingUtil.transferBufferToChannel(socketChannel, ackBuffer);
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogMapping.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogMapping.java
deleted file mode 100644
index 3b2aff7..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogMapping.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.logging;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class RemoteLogMapping {
-
-    private String remoteNodeID;
-    private long remoteLSN;
-    private long localLSN;
-    public AtomicInteger numOfFlushedIndexes = new AtomicInteger();
-
-    public String getRemoteNodeID() {
-        return remoteNodeID;
-    }
-
-    public void setRemoteNodeID(String remoteNodeID) {
-        this.remoteNodeID = remoteNodeID;
-    }
-
-    public long getRemoteLSN() {
-        return remoteLSN;
-    }
-
-    public void setRemoteLSN(long remoteLSN) {
-        this.remoteLSN = remoteLSN;
-    }
-
-    public long getLocalLSN() {
-        return localLSN;
-    }
-
-    public void setLocalLSN(long localLSN) {
-        this.localLSN = localLSN;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Remote Node: " + remoteNodeID);
-        sb.append(" Remote LSN: " + remoteLSN);
-        sb.append(" Local LSN: " + localLSN);
-        return sb.toString();
-    }
-
-    public String getNodeUniqueLSN() {
-        return TxnLogUtil.getNodeUniqueLSN(remoteNodeID, remoteLSN);
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogRecord.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogRecord.java
new file mode 100644
index 0000000..0b496b8
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogRecord.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.logging;
+
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.transactions.LogRecord;
+
+public class RemoteLogRecord extends LogRecord {
+
+    private long masterLsn;
+    private IReplicationWorker replicationWorker;
+
+    public long getMasterLsn() {
+        return masterLsn;
+    }
+
+    public void setMasterLsn(long masterLsn) {
+        this.masterLsn = masterLsn;
+    }
+
+    public IReplicationWorker getReplicationWorker() {
+        return replicationWorker;
+    }
+
+    public void setReplicationWorker(IReplicationWorker replicationWorker) {
+        this.replicationWorker = replicationWorker;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsNotifier.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsNotifier.java
new file mode 100644
index 0000000..366abce
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsNotifier.java
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.logging;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.dataflow.DatasetLocalResource;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.transactions.LogType;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+class RemoteLogsNotifier implements Runnable {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final PersistentLocalResourceRepository localResourceRep;
+    private final IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
+    private final LinkedBlockingQueue<RemoteLogRecord> remoteLogsQ;
+    private final INcApplicationContext appCtx;
+
+    public RemoteLogsNotifier(INcApplicationContext appCtx, LinkedBlockingQueue<RemoteLogRecord> remoteLogsQ) {
+        this.appCtx = appCtx;
+        this.remoteLogsQ = remoteLogsQ;
+        localResourceRep = (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        indexCheckpointManagerProvider = appCtx.getIndexCheckpointManagerProvider();
+    }
+
+    @Override
+    public void run() {
+        final String nodeId = appCtx.getServiceContext().getNodeId();
+        Thread.currentThread().setName(nodeId + RemoteLogsNotifier.class.getSimpleName());
+        while (!Thread.currentThread().isInterrupted()) {
+            try {
+                final RemoteLogRecord logRecord = remoteLogsQ.take();
+                switch (logRecord.getLogType()) {
+                    case LogType.JOB_COMMIT:
+                    case LogType.ABORT:
+                        // send ACK to requester
+                        logRecord.getReplicationWorker().getChannel().socket().getOutputStream()
+                                .write((nodeId + ReplicationProtocol.LOG_REPLICATION_ACK + logRecord.getTxnId()
+                                        + System.lineSeparator()).getBytes());
+                        break;
+                    case LogType.FLUSH:
+                        checkpointReplicaIndexes(logRecord, logRecord.getDatasetId());
+                        break;
+                    default:
+                        throw new IllegalStateException("Unexpected log type: " + logRecord.getLogType());
+                }
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            } catch (IOException e) {
+                LOGGER.error("Failed to process replicated log", e);
+            }
+        }
+    }
+
+    private void checkpointReplicaIndexes(RemoteLogRecord remoteLogMapping, int datasetId) throws HyracksDataException {
+        final Set<Integer> masterPartitions = appCtx.getReplicaManager().getPartitions();
+        final Predicate<LocalResource> replicaIndexesPredicate = lr -> {
+            DatasetLocalResource dls = (DatasetLocalResource) lr.getResource();
+            return dls.getDatasetId() == datasetId && !masterPartitions.contains(dls.getPartition());
+        };
+        final Map<Long, LocalResource> resources = localResourceRep.getResources(replicaIndexesPredicate);
+        final List<DatasetResourceReference> replicaIndexesRef =
+                resources.values().stream().map(DatasetResourceReference::of).collect(Collectors.toList());
+        for (DatasetResourceReference replicaIndexRef : replicaIndexesRef) {
+            final IIndexCheckpointManager indexCheckpointManager = indexCheckpointManagerProvider.get(replicaIndexRef);
+            synchronized (indexCheckpointManager) {
+                indexCheckpointManager.masterFlush(remoteLogMapping.getMasterLsn(), remoteLogMapping.getLSN());
+            }
+        }
+    }
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsProcessor.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsProcessor.java
new file mode 100644
index 0000000..5009614
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/RemoteLogsProcessor.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.logging;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.transactions.ILogManager;
+import org.apache.asterix.common.transactions.ILogRecord;
+import org.apache.asterix.common.transactions.ILogRequester;
+import org.apache.asterix.common.transactions.LogSource;
+import org.apache.asterix.common.transactions.LogType;
+import org.apache.asterix.common.utils.TransactionUtil;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class RemoteLogsProcessor implements ILogRequester {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final LinkedBlockingQueue<RemoteLogRecord> remoteLogsQ;
+    private final ILogManager logManager;
+
+    public RemoteLogsProcessor(INcApplicationContext appCtx) {
+        logManager = appCtx.getTransactionSubsystem().getLogManager();
+        remoteLogsQ = new LinkedBlockingQueue<>();
+        appCtx.getThreadExecutor().execute(new RemoteLogsNotifier(appCtx, remoteLogsQ));
+    }
+
+    public void process(ByteBuffer logsBatch, RemoteLogRecord reusableLog, IReplicationWorker worker) {
+        while (logsBatch.hasRemaining()) {
+            // get rid of log size
+            logsBatch.getInt();
+            reusableLog.readRemoteLog(logsBatch);
+            reusableLog.setLogSource(LogSource.REMOTE);
+            switch (reusableLog.getLogType()) {
+                case LogType.UPDATE:
+                case LogType.ENTITY_COMMIT:
+                    logManager.log(reusableLog);
+                    break;
+                case LogType.JOB_COMMIT:
+                case LogType.ABORT:
+                    RemoteLogRecord jobTerminationLog = new RemoteLogRecord();
+                    TransactionUtil.formJobTerminateLogRecord(jobTerminationLog, reusableLog.getTxnId(),
+                            reusableLog.getLogType() == LogType.JOB_COMMIT);
+                    jobTerminationLog.setRequester(this);
+                    jobTerminationLog.setReplicationWorker(worker);
+                    jobTerminationLog.setLogSource(LogSource.REMOTE);
+                    logManager.log(jobTerminationLog);
+                    break;
+                case LogType.FLUSH:
+                    RemoteLogRecord flushLog = new RemoteLogRecord();
+                    TransactionUtil.formFlushLogRecord(flushLog, reusableLog.getDatasetId(), null);
+                    flushLog.setRequester(this);
+                    flushLog.setLogSource(LogSource.REMOTE);
+                    flushLog.setMasterLsn(reusableLog.getLSN());
+                    logManager.log(flushLog);
+                    break;
+                default:
+                    LOGGER.error(() -> "Unsupported LogType: " + reusableLog.getLogType());
+            }
+        }
+    }
+
+    @Override
+    public void notifyFlushed(ILogRecord logRecord) {
+        remoteLogsQ.add((RemoteLogRecord) logRecord);
+    }
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/ReplicationLogBuffer.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/ReplicationLogBuffer.java
index 283f69f..a94f073 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/ReplicationLogBuffer.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/ReplicationLogBuffer.java
@@ -22,9 +22,10 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.asterix.common.transactions.ILogRecord;
-import org.apache.asterix.replication.management.ReplicationManager;
+import org.apache.asterix.replication.management.LogReplicationManager;
 
 public class ReplicationLogBuffer {
+
     private final int logBufferSize;
     private final AtomicBoolean full;
     private int appendOffset;
@@ -32,10 +33,10 @@
     private final ByteBuffer appendBuffer;
     private final ByteBuffer replicationBuffer;
     private boolean stop;
-    private ReplicationManager replicationManager;
+    private final LogReplicationManager replicationManager;
     private final int batchSize;
 
-    public ReplicationLogBuffer(ReplicationManager replicationManager, int logBufferSize, int batchSize) {
+    public ReplicationLogBuffer(LogReplicationManager replicationManager, int logBufferSize, int batchSize) {
         this.replicationManager = replicationManager;
         this.logBufferSize = logBufferSize;
         this.batchSize = batchSize;
@@ -116,7 +117,7 @@
     private void transferBuffer(ByteBuffer buffer) {
         if (buffer.remaining() <= batchSize) {
             //the current batch can be sent as it is
-            replicationManager.replicateTxnLogBatch(buffer);
+            replicationManager.transferBatch(buffer);
             return;
         }
         /**
@@ -141,7 +142,7 @@
                 //return to the beginning of the batch position
                 buffer.reset();
             }
-            replicationManager.replicateTxnLogBatch(buffer);
+            replicationManager.transferBatch(buffer);
             //return the original limit to check the new remaining size
             buffer.limit(totalTransferLimit);
         }
@@ -159,7 +160,7 @@
         return logBufferSize;
     }
 
-    public ReplicationManager getReplicationManager() {
+    public LogReplicationManager getReplicationManager() {
         return replicationManager;
     }
 }
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAck.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAck.java
new file mode 100644
index 0000000..1b0ac23
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAck.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.logging;
+
+import java.util.Set;
+
+import org.apache.asterix.common.replication.IReplicationDestination;
+import org.apache.asterix.common.transactions.ILogRecord;
+
+public class TxnAck {
+
+    private final Set<IReplicationDestination> pendingAcks;
+    private final ILogRecord logRecord;
+
+    public TxnAck(ILogRecord logRecord, Set<IReplicationDestination> pendingAcks) {
+        this.logRecord = logRecord;
+        this.pendingAcks = pendingAcks;
+    }
+
+    public synchronized void ack(IReplicationDestination dest) {
+        pendingAcks.remove(dest);
+        if (allAcked()) {
+            synchronized (logRecord) {
+                logRecord.setReplicated(true);
+                logRecord.notifyAll();
+            }
+        }
+    }
+
+    public synchronized boolean allAcked() {
+        return pendingAcks.isEmpty();
+    }
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAckTracker.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAckTracker.java
new file mode 100644
index 0000000..23e6f3c
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnAckTracker.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.logging;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.asterix.common.replication.IReplicationDestination;
+import org.apache.asterix.common.transactions.ILogRecord;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class TxnAckTracker {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final Map<Long, TxnAck> txnsAcks = new HashMap<>();
+
+    public synchronized void track(ILogRecord logRecord, Set<IReplicationDestination> replicas) {
+        if (replicas.isEmpty()) {
+            logRecord.setReplicated(true);
+            return;
+        }
+        final long txnId = logRecord.getTxnId();
+        //TODO use LSN instead of txnId when all logs have LSN
+        txnsAcks.put(txnId, new TxnAck(logRecord, replicas));
+    }
+
+    public synchronized void ack(long txnId, IReplicationDestination replica) {
+        if (!txnsAcks.containsKey(txnId)) {
+            LOGGER.warn("Received ack for unknown txn {}", txnId);
+            return;
+        }
+        TxnAck txnAcks = txnsAcks.get(txnId);
+        txnAcks.ack(replica);
+        if (txnAcks.allAcked()) {
+            txnsAcks.remove(txnId);
+        }
+    }
+
+    public synchronized void unregister(IReplicationDestination replica) {
+        // assume the ack was received from leaving replicas
+        final HashSet<Long> pendingTxn = new HashSet<>(txnsAcks.keySet());
+        pendingTxn.forEach(txnId -> ack(txnId, replica));
+    }
+}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogReplicator.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogReplicator.java
index 118fde6..2e4cb50 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogReplicator.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogReplicator.java
@@ -21,14 +21,15 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * This class is responsible for sending transactions logs to remote replicas.
  */
 public class TxnLogReplicator implements Callable<Boolean> {
-    private static final Logger LOGGER = Logger.getLogger(TxnLogReplicator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final ReplicationLogBuffer POISON_PILL = new ReplicationLogBuffer(null, 0, 0);
     private final LinkedBlockingQueue<ReplicationLogBuffer> emptyQ;
     private final LinkedBlockingQueue<ReplicationLogBuffer> flushQ;
@@ -97,10 +98,7 @@
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
             } catch (Exception e) {
-                if (LOGGER.isLoggable(Level.SEVERE)) {
-                    LOGGER.log(Level.SEVERE, "TxnLogReplicator is terminating abnormally. Logs Replication Stopped.",
-                            e);
-                }
+                LOGGER.error("TxnLogReplicator is terminating abnormally. Logs Replication Stopped.", e);
                 throw e;
             }
         }
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogUtil.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogUtil.java
deleted file mode 100644
index f51a64d..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/logging/TxnLogUtil.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.logging;
-
-public class TxnLogUtil {
-
-    private TxnLogUtil() {
-        //prevent util class construction
-    }
-
-    /**
-     * @param nodeId
-     * @param LSN
-     * @return Concatenation of nodeId and LSN
-     */
-    public static String getNodeUniqueLSN(String nodeId, long LSN) {
-        return nodeId + LSN;
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/IndexReplicationManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/IndexReplicationManager.java
new file mode 100644
index 0000000..b6f752f
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/IndexReplicationManager.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.management;
+
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.replication.IReplicationDestination;
+import org.apache.asterix.common.replication.IReplicationManager;
+import org.apache.asterix.common.replication.IReplicationStrategy;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.ResourceReference;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.asterix.replication.api.ReplicationDestination;
+import org.apache.asterix.replication.sync.IndexSynchronizer;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.replication.IReplicationJob;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexReplicationJob;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class IndexReplicationManager {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final IReplicationManager replicationManager;
+    private final Set<ReplicationDestination> destinations = new HashSet<>();
+    private final LinkedBlockingQueue<IReplicationJob> replicationJobsQ = new LinkedBlockingQueue<>();
+    private final IReplicationStrategy replicationStrategy;
+    private final PersistentLocalResourceRepository resourceRepository;
+    private final INcApplicationContext appCtx;
+    private final Object transferLock = new Object();
+    private final Set<ReplicationDestination> failedDest = new HashSet<>();
+
+    public IndexReplicationManager(INcApplicationContext appCtx, IReplicationManager replicationManager) {
+        this.appCtx = appCtx;
+        this.replicationManager = replicationManager;
+        this.resourceRepository = (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        replicationStrategy = replicationManager.getReplicationStrategy();
+        appCtx.getThreadExecutor().execute(new ReplicationJobsProcessor());
+    }
+
+    public void register(ReplicationDestination dest) {
+        synchronized (transferLock) {
+            LOGGER.info(() -> "register " + dest);
+            destinations.add(dest);
+            failedDest.remove(dest);
+        }
+    }
+
+    public void unregister(IReplicationDestination dest) {
+        synchronized (transferLock) {
+            LOGGER.info(() -> "unregister " + dest);
+            destinations.remove(dest);
+            failedDest.remove(dest);
+        }
+    }
+
+    private void handleFailure(ReplicationDestination dest, Exception e) {
+        synchronized (transferLock) {
+            if (failedDest.contains(dest)) {
+                return;
+            }
+            LOGGER.error("Replica failed", e);
+            if (destinations.contains(dest)) {
+                failedDest.add(dest);
+            }
+            replicationManager.notifyFailure(dest, e);
+        }
+    }
+
+    public void accept(IReplicationJob job) {
+        if (job.getExecutionType() == IReplicationJob.ReplicationExecutionType.ASYNC) {
+            replicationJobsQ.add(job);
+            return;
+        }
+        process(job);
+    }
+
+    private void process(IReplicationJob job) {
+        try {
+            if (skip(job)) {
+                return;
+            }
+            synchronized (transferLock) {
+                if (destinations.isEmpty()) {
+                    return;
+                }
+                final IndexSynchronizer synchronizer = new IndexSynchronizer(job, appCtx);
+                final int indexPartition = getJobPartition(job);
+                for (ReplicationDestination dest : destinations) {
+                    try {
+                        Optional<IPartitionReplica> partitionReplica = dest.getPartitionReplica(indexPartition);
+                        if (!partitionReplica.isPresent()) {
+                            continue;
+                        }
+                        PartitionReplica replica = (PartitionReplica) partitionReplica.get();
+                        synchronizer.sync(replica);
+                    } catch (Exception e) {
+                        handleFailure(dest, e);
+                    }
+                }
+                closeChannels();
+            }
+        } finally {
+            afterReplication(job);
+        }
+    }
+
+    private boolean skip(IReplicationJob job) {
+        try {
+            final DatasetResourceReference indexFileRef =
+                    resourceRepository.getLocalResourceReference(job.getAnyFile());
+            return !replicationStrategy.isMatch(indexFileRef.getDatasetId());
+        } catch (HyracksDataException e) {
+            throw new IllegalStateException("Couldn't find resource for " + job.getAnyFile(), e);
+        }
+    }
+
+    private int getJobPartition(IReplicationJob job) {
+        return ResourceReference.of(job.getAnyFile()).getPartitionNum();
+    }
+
+    private void closeChannels() {
+        if (!replicationJobsQ.isEmpty()) {
+            return;
+        }
+        LOGGER.log(Level.INFO, "No pending replication jobs. Closing connections to replicas");
+        for (ReplicationDestination dest : destinations) {
+            dest.getReplicas().stream().map(PartitionReplica.class::cast).forEach(PartitionReplica::close);
+        }
+    }
+
+    private static void afterReplication(IReplicationJob job) {
+        try {
+            if (job.getOperation() == IReplicationJob.ReplicationOperation.REPLICATE
+                    && job instanceof ILSMIndexReplicationJob) {
+                ((ILSMIndexReplicationJob) job).endReplication();
+            }
+        } catch (HyracksDataException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    private class ReplicationJobsProcessor implements Runnable {
+
+        @Override
+        public void run() {
+            Thread.currentThread().setName(ReplicationJobsProcessor.class.getSimpleName());
+            while (!Thread.currentThread().isInterrupted()) {
+                try {
+                    final IReplicationJob job = replicationJobsQ.take();
+                    process(job);
+                } catch (InterruptedException e) {
+                    LOGGER.warn(() -> ReplicationJobsProcessor.class.getSimpleName() + " interrupted.", e);
+                    Thread.currentThread().interrupt();
+                }
+            }
+            LOGGER.warn("{} stopped.", ReplicationJobsProcessor.class.getSimpleName());
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/LogReplicationManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/LogReplicationManager.java
new file mode 100644
index 0000000..7a9d75f
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/LogReplicationManager.java
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.management;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousCloseException;
+import java.nio.channels.SocketChannel;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.config.ReplicationProperties;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.common.replication.IReplicationDestination;
+import org.apache.asterix.common.replication.IReplicationManager;
+import org.apache.asterix.common.transactions.ILogRecord;
+import org.apache.asterix.common.transactions.LogType;
+import org.apache.asterix.replication.api.ReplicationDestination;
+import org.apache.asterix.replication.logging.ReplicationLogBuffer;
+import org.apache.asterix.replication.logging.TxnAckTracker;
+import org.apache.asterix.replication.logging.TxnLogReplicator;
+import org.apache.asterix.replication.messaging.ReplicateLogsTask;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class LogReplicationManager {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final LinkedBlockingQueue<ReplicationLogBuffer> emptyLogBuffersQ;
+    private final LinkedBlockingQueue<ReplicationLogBuffer> pendingFlushLogBuffersQ;
+    private final ByteBuffer txnLogsBatchSizeBuffer = ByteBuffer.allocate(Integer.BYTES);
+    private final Map<ReplicationDestination, SocketChannel> destinations = new HashMap<>();
+    private final IReplicationManager replicationManager;
+    private final Executor executor;
+    private final TxnAckTracker ackTracker = new TxnAckTracker();
+    private final Set<SocketChannel> failedSockets = new HashSet<>();
+    private final Object transferLock = new Object();
+    private final INcApplicationContext appCtx;
+    private final int logPageSize;
+    private final int logBatchSize;
+    private ReplicationLogBuffer currentTxnLogBuffer;
+    private SocketChannel[] destSockets;
+
+    public LogReplicationManager(INcApplicationContext appCtx, IReplicationManager replicationManager) {
+        this.appCtx = appCtx;
+        this.replicationManager = replicationManager;
+        final ReplicationProperties replicationProperties = appCtx.getReplicationProperties();
+        logPageSize = replicationProperties.getLogBufferPageSize();
+        logBatchSize = replicationProperties.getLogBatchSize();
+        executor = appCtx.getThreadExecutor();
+        emptyLogBuffersQ = new LinkedBlockingQueue<>();
+        pendingFlushLogBuffersQ = new LinkedBlockingQueue<>();
+        initBuffers(replicationProperties.getLogBufferNumOfPages());
+        TxnLogReplicator txnlogReplicator = new TxnLogReplicator(emptyLogBuffersQ, pendingFlushLogBuffersQ);
+        ((ExecutorService) executor).submit(txnlogReplicator);
+    }
+
+    private void initBuffers(int buffers) {
+        for (int i = 0; i < buffers; i++) {
+            emptyLogBuffersQ.add(new ReplicationLogBuffer(this, logPageSize, logBatchSize));
+        }
+        try {
+            getAndInitNewPage();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new ReplicationException(e);
+        }
+    }
+
+    public void register(ReplicationDestination dest) {
+        synchronized (transferLock) {
+            synchronized (destinations) {
+                if (destinations.containsKey(dest)) {
+                    return;
+                }
+                LOGGER.info(() -> "register " + dest);
+                SocketChannel socketChannel = dest.getLogReplicationChannel();
+                handshake(dest, socketChannel);
+                destinations.put(dest, socketChannel);
+                failedSockets.remove(socketChannel);
+                destSockets = destinations.values().toArray(new SocketChannel[destinations.size()]);
+            }
+        }
+    }
+
+    public void unregister(IReplicationDestination dest) {
+        synchronized (transferLock) {
+            synchronized (destinations) {
+                if (!destinations.containsKey(dest)) {
+                    return;
+                }
+                LOGGER.info(() -> "unregister " + dest);
+                ackTracker.unregister(dest);
+                SocketChannel destSocket = destinations.remove(dest);
+                failedSockets.remove(destSocket);
+                destSockets = destinations.values().toArray(new SocketChannel[destinations.size()]);
+                endReplication(destSocket);
+            }
+        }
+    }
+
+    public void replicate(ILogRecord logRecord) throws InterruptedException {
+        if (logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT) {
+            synchronized (destinations) {
+                ackTracker.track(logRecord, new HashSet<>(destinations.keySet()));
+            }
+        }
+        appendToLogBuffer(logRecord);
+    }
+
+    public void transferBatch(final ByteBuffer buffer) {
+        // prepare the batch size buffer
+        txnLogsBatchSizeBuffer.clear();
+        txnLogsBatchSizeBuffer.putInt(buffer.remaining());
+        txnLogsBatchSizeBuffer.flip();
+
+        buffer.mark();
+        synchronized (transferLock) {
+            if (destSockets != null) {
+                for (SocketChannel replicaSocket : destSockets) {
+                    try {
+                        // send batch size then the batch itself
+                        NetworkingUtil.transferBufferToChannel(replicaSocket, txnLogsBatchSizeBuffer);
+                        NetworkingUtil.transferBufferToChannel(replicaSocket, buffer);
+                    } catch (IOException e) {
+                        handleFailure(replicaSocket, e);
+                    } finally {
+                        txnLogsBatchSizeBuffer.position(0);
+                        buffer.reset();
+                    }
+                }
+            }
+        }
+        // move the buffer position to the sent limit
+        buffer.position(buffer.limit());
+    }
+
+    public int getLogPageSize() {
+        return logPageSize;
+    }
+
+    private synchronized void appendToLogBuffer(ILogRecord logRecord) throws InterruptedException {
+        if (!currentTxnLogBuffer.hasSpace(logRecord)) {
+            currentTxnLogBuffer.isFull(true);
+            if (logRecord.getLogSize() > logPageSize) {
+                getAndInitNewLargePage(logRecord.getLogSize());
+            } else {
+                getAndInitNewPage();
+            }
+        }
+        currentTxnLogBuffer.append(logRecord);
+    }
+
+    private void getAndInitNewPage() throws InterruptedException {
+        currentTxnLogBuffer = null;
+        while (currentTxnLogBuffer == null) {
+            currentTxnLogBuffer = emptyLogBuffersQ.take();
+        }
+        currentTxnLogBuffer.reset();
+        pendingFlushLogBuffersQ.add(currentTxnLogBuffer);
+    }
+
+    private void getAndInitNewLargePage(int pageSize) {
+        // for now, alloc a new buffer for each large page
+        currentTxnLogBuffer = new ReplicationLogBuffer(this, pageSize, logBatchSize);
+        pendingFlushLogBuffersQ.add(currentTxnLogBuffer);
+    }
+
+    private void handshake(ReplicationDestination dest, SocketChannel socketChannel) {
+        final String nodeId = appCtx.getServiceContext().getNodeId();
+        final ReplicateLogsTask task = new ReplicateLogsTask(nodeId);
+        ReplicationProtocol.sendTo(socketChannel, task, null);
+        executor.execute(new TxnAckListener(dest, socketChannel));
+    }
+
+    private void endReplication(SocketChannel socketChannel) {
+        if (socketChannel.isConnected()) {
+            // end log replication (by sending a dummy log with a single byte)
+            final ByteBuffer endLogRepBuffer = ReplicationProtocol.getEndLogReplicationBuffer();
+            try {
+                NetworkingUtil.transferBufferToChannel(socketChannel, endLogRepBuffer);
+            } catch (IOException e) {
+                LOGGER.warn("Failed to end txn log", e);
+            }
+        }
+    }
+
+    private synchronized void handleFailure(SocketChannel replicaSocket, IOException e) {
+        if (failedSockets.contains(replicaSocket)) {
+            return;
+        }
+        LOGGER.error("Replica failed", e);
+        failedSockets.add(replicaSocket);
+        Optional<ReplicationDestination> socketDest = destinations.entrySet().stream()
+                .filter(entry -> entry.getValue().equals(replicaSocket)).map(Map.Entry::getKey).findFirst();
+        socketDest.ifPresent(dest -> replicationManager.notifyFailure(dest, e));
+    }
+
+    private class TxnAckListener implements Runnable {
+        private final ReplicationDestination dest;
+        private final SocketChannel replicaSocket;
+
+        TxnAckListener(ReplicationDestination dest, SocketChannel replicaSocket) {
+            this.dest = dest;
+            this.replicaSocket = replicaSocket;
+        }
+
+        @Override
+        public void run() {
+            Thread.currentThread().setName("TxnAckListener (" + dest + ")");
+            LOGGER.info("Started listening on socket: {}", dest);
+            try (BufferedReader incomingResponse =
+                    new BufferedReader(new InputStreamReader(replicaSocket.socket().getInputStream()))) {
+                while (true) {
+                    final String response = incomingResponse.readLine();
+                    if (response == null) {
+                        handleFailure(replicaSocket, new IOException("Unexpected response from replica " + dest));
+                        break;
+                    }
+                    // read ACK
+                    final int txnId = ReplicationProtocol.getTxnIdFromLogAckMessage(response);
+                    ackTracker.ack(txnId, dest);
+                }
+            } catch (AsynchronousCloseException e) {
+                LOGGER.debug(() -> "Stopped listening on socket:" + dest, e);
+            } catch (IOException e) {
+                handleFailure(replicaSocket, e);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/NetworkingUtil.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/NetworkingUtil.java
index 62c1e4a..c93920f 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/NetworkingUtil.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/NetworkingUtil.java
@@ -23,13 +23,17 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.NetworkInterface;
+import java.net.SocketAddress;
 import java.net.SocketException;
+import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.channels.SocketChannel;
 import java.util.Enumeration;
 
+import org.apache.hyracks.api.comm.NetworkAddress;
+
 public class NetworkingUtil {
 
     private NetworkingUtil() {
@@ -119,4 +123,8 @@
         int port = socketChannel.socket().getPort();
         return InetSocketAddress.createUnresolved(hostAddress, port);
     }
+
+    public static SocketAddress getSocketAddress(NetworkAddress netAddr) throws UnknownHostException {
+        return new InetSocketAddress(InetAddress.getByAddress(netAddr.lookupIpAddress()), netAddr.getPort());
+    }
 }
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicaStateChecker.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicaStateChecker.java
deleted file mode 100644
index be7cdc5..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicaStateChecker.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.management;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.nio.channels.UnresolvedAddressException;
-import java.util.concurrent.Callable;
-
-import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.common.replication.Replica.ReplicaState;
-import org.apache.asterix.replication.functions.ReplicationProtocol;
-
-public class ReplicaStateChecker implements Callable<Void> {
-
-    private final int WAIT_TIME = 2000;
-    private final Replica replica;
-    private final int replicationTimeOut;
-    private final ReplicationManager replicationManager;
-    private final ReplicationProperties asterixReplicationProperties;
-    private final boolean suspendReplication;
-
-    public ReplicaStateChecker(Replica replica, int replicationTimeOut, ReplicationManager replicationManager,
-            ReplicationProperties asterixReplicationProperties, boolean suspendReplication) {
-        this.replica = replica;
-        this.replicationTimeOut = replicationTimeOut;
-        this.replicationManager = replicationManager;
-        this.asterixReplicationProperties = asterixReplicationProperties;
-        this.suspendReplication = suspendReplication;
-    }
-
-    @Override
-    public Void call() throws Exception {
-        Thread.currentThread().setName("ReplicaConnector Thread");
-
-        long startTime = System.currentTimeMillis();
-        InetSocketAddress replicaAddress = replica.getAddress(asterixReplicationProperties);
-
-        while (true) {
-            try (SocketChannel connection = SocketChannel.open()) {
-                connection.configureBlocking(true);
-                connection.connect(new InetSocketAddress(replicaAddress.getHostString(), replicaAddress.getPort()));
-                ByteBuffer buffer = ReplicationProtocol.getGoodbyeBuffer();
-                connection.write(buffer);
-                replicationManager.updateReplicaState(replica.getId(), ReplicaState.ACTIVE, suspendReplication);
-                return null;
-            } catch (IOException | UnresolvedAddressException e) {
-                Thread.sleep(WAIT_TIME);
-
-                //check if connection to replica timed out
-                if (((System.currentTimeMillis() - startTime) / 1000) >= replicationTimeOut) {
-                    replicationManager.updateReplicaState(replica.getId(), ReplicaState.DEAD, suspendReplication);
-                    return null;
-                }
-            }
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationChannel.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationChannel.java
index 5e58802..417164c 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationChannel.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationChannel.java
@@ -18,633 +18,130 @@
  */
 package org.apache.asterix.replication.management;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
+import java.nio.channels.AsynchronousCloseException;
 import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.common.context.IndexInfo;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
 import org.apache.asterix.common.replication.IReplicationChannel;
-import org.apache.asterix.common.replication.IReplicationManager;
-import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.IReplicationThread;
-import org.apache.asterix.common.replication.ReplicaEvent;
-import org.apache.asterix.common.storage.IndexFileProperties;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
-import org.apache.asterix.common.transactions.ILogManager;
-import org.apache.asterix.common.transactions.LogRecord;
-import org.apache.asterix.common.transactions.LogSource;
-import org.apache.asterix.common.transactions.LogType;
-import org.apache.asterix.common.utils.StoragePathUtil;
-import org.apache.asterix.common.utils.TransactionUtil;
-import org.apache.asterix.replication.functions.ReplicaFilesRequest;
-import org.apache.asterix.replication.functions.ReplicaIndexFlushRequest;
-import org.apache.asterix.replication.functions.ReplicationProtocol;
-import org.apache.asterix.replication.functions.ReplicationProtocol.ReplicationRequestType;
-import org.apache.asterix.replication.logging.RemoteLogMapping;
-import org.apache.asterix.replication.storage.LSMComponentLSNSyncTask;
-import org.apache.asterix.replication.storage.LSMComponentProperties;
-import org.apache.asterix.replication.storage.LSMIndexFileProperties;
-import org.apache.asterix.replication.storage.ReplicaResourcesManager;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.hyracks.api.application.INCServiceContext;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
-import org.apache.hyracks.util.StorageUtil;
-import org.apache.hyracks.util.StorageUtil.StorageUnit;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.replication.logging.RemoteLogsProcessor;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.replication.messaging.ReplicationProtocol.ReplicationRequestType;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * This class is used to receive and process replication requests from remote replicas or replica events from CC
  */
 public class ReplicationChannel extends Thread implements IReplicationChannel {
 
-    private static final Logger LOGGER = Logger.getLogger(ReplicationChannel.class.getName());
-    private static final int LOG_REPLICATION_END_HANKSHAKE_LOG_SIZE = 1;
-    private final ExecutorService replicationThreads;
-    private final String localNodeID;
-    private final ILogManager logManager;
-    private final ReplicaResourcesManager replicaResourcesManager;
-    private SocketChannel socketChannel = null;
+    private static final Logger LOGGER = LogManager.getLogger();
     private ServerSocketChannel serverSocketChannel = null;
-    private final IReplicationManager replicationManager;
-    private final ReplicationProperties replicationProperties;
-    private final IAppRuntimeContextProvider appContextProvider;
-    private static final int INTIAL_BUFFER_SIZE = StorageUtil.getIntSizeInBytes(4, StorageUnit.KILOBYTE);
-    private final LinkedBlockingQueue<LSMComponentLSNSyncTask> lsmComponentRemoteLSN2LocalLSNMappingTaskQ;
-    private final LinkedBlockingQueue<LogRecord> pendingNotificationRemoteLogsQ;
-    private final Map<String, LSMComponentProperties> lsmComponentId2PropertiesMap;
-    private final Map<String, RemoteLogMapping> replicaUniqueLSN2RemoteMapping;
-    private final LSMComponentsSyncService lsmComponentLSNMappingService;
-    private final Set<Integer> nodeHostedPartitions;
-    private final ReplicationNotifier replicationNotifier;
-    private final Object flushLogslock = new Object();
-    private final IDatasetLifecycleManager dsLifecycleManager;
-    private final PersistentLocalResourceRepository localResourceRep;
+    private final INcApplicationContext appCtx;
+    private final RemoteLogsProcessor logsProcessor;
 
-    public ReplicationChannel(String nodeId, ReplicationProperties replicationProperties, ILogManager logManager,
-            IReplicaResourcesManager replicaResoucesManager, IReplicationManager replicationManager,
-            INCServiceContext ncServiceContext, IAppRuntimeContextProvider asterixAppRuntimeContextProvider) {
-        this.logManager = logManager;
-        this.localNodeID = nodeId;
-        this.replicaResourcesManager = (ReplicaResourcesManager) replicaResoucesManager;
-        this.replicationManager = replicationManager;
-        this.replicationProperties = replicationProperties;
-        this.appContextProvider = asterixAppRuntimeContextProvider;
-        this.dsLifecycleManager = asterixAppRuntimeContextProvider.getDatasetLifecycleManager();
-        this.localResourceRep =
-                (PersistentLocalResourceRepository) asterixAppRuntimeContextProvider.getLocalResourceRepository();
-        lsmComponentRemoteLSN2LocalLSNMappingTaskQ = new LinkedBlockingQueue<>();
-        pendingNotificationRemoteLogsQ = new LinkedBlockingQueue<>();
-        lsmComponentId2PropertiesMap = new ConcurrentHashMap<>();
-        replicaUniqueLSN2RemoteMapping = new ConcurrentHashMap<>();
-        lsmComponentLSNMappingService = new LSMComponentsSyncService();
-        replicationNotifier = new ReplicationNotifier();
-        replicationThreads = Executors.newCachedThreadPool(ncServiceContext.getThreadFactory());
-        Map<String, ClusterPartition[]> nodePartitions =
-                asterixAppRuntimeContextProvider.getAppContext().getMetadataProperties().getNodePartitions();
-        Set<String> nodeReplicationClients = replicationProperties.getRemotePrimaryReplicasIds(nodeId);
-        List<Integer> clientsPartitions = new ArrayList<>();
-        for (String clientId : nodeReplicationClients) {
-            for (ClusterPartition clusterPartition : nodePartitions.get(clientId)) {
-                clientsPartitions.add(clusterPartition.getPartitionId());
-            }
-        }
-        nodeHostedPartitions = new HashSet<>(clientsPartitions.size());
-        nodeHostedPartitions.addAll(clientsPartitions);
+    public ReplicationChannel(INcApplicationContext appCtx) {
+        this.appCtx = appCtx;
+        logsProcessor = new RemoteLogsProcessor(appCtx);
     }
 
     @Override
     public void run() {
-        Thread.currentThread().setName("Replication Channel Thread");
-
-        String nodeIP = replicationProperties.getReplicaIPAddress(localNodeID);
-        int dataPort = replicationProperties.getDataReplicationPort(localNodeID);
+        final String nodeId = appCtx.getServiceContext().getNodeId();
+        Thread.currentThread().setName(nodeId + " Replication Channel Thread");
+        final ReplicationProperties replicationProperties = appCtx.getReplicationProperties();
+        final String nodeIP = replicationProperties.getReplicationAddress();
+        final int dataPort = replicationProperties.getReplicationPort();
         try {
             serverSocketChannel = ServerSocketChannel.open();
             serverSocketChannel.configureBlocking(true);
             InetSocketAddress replicationChannelAddress =
                     new InetSocketAddress(InetAddress.getByName(nodeIP), dataPort);
             serverSocketChannel.socket().bind(replicationChannelAddress);
-            lsmComponentLSNMappingService.start();
-            replicationNotifier.start();
             LOGGER.log(Level.INFO, "opened Replication Channel @ IP Address: " + nodeIP + ":" + dataPort);
-
-            //start accepting replication requests
-            while (true) {
-                socketChannel = serverSocketChannel.accept();
+            while (serverSocketChannel.isOpen()) {
+                SocketChannel socketChannel = serverSocketChannel.accept();
                 socketChannel.configureBlocking(true);
                 //start a new thread to handle the request
-                replicationThreads.execute(new ReplicationThread(socketChannel));
+                appCtx.getThreadExecutor().execute(new ReplicationWorker(socketChannel));
             }
+        } catch (AsynchronousCloseException e) {
+            LOGGER.debug("Replication channel closed", e);
         } catch (IOException e) {
-            throw new IllegalStateException(
-                    "Could not open replication channel @ IP Address: " + nodeIP + ":" + dataPort, e);
+            throw new IllegalStateException("Failed to bind replication channel @ " + nodeIP + ":" + dataPort, e);
         }
     }
 
-    private void updateLSMComponentRemainingFiles(String lsmComponentId) throws IOException {
-        LSMComponentProperties lsmCompProp = lsmComponentId2PropertiesMap.get(lsmComponentId);
-        int remainingFile = lsmCompProp.markFileComplete();
-
-        //clean up when all the LSM component files have been received.
-        if (remainingFile == 0) {
-            if (lsmCompProp.getOpType() == LSMOperationType.FLUSH && lsmCompProp.getReplicaLSN() != null
-                    && replicaUniqueLSN2RemoteMapping.containsKey(lsmCompProp.getNodeUniqueLSN())) {
-                int remainingIndexes =
-                        replicaUniqueLSN2RemoteMapping.get(lsmCompProp.getNodeUniqueLSN()).numOfFlushedIndexes
-                                .decrementAndGet();
-                if (remainingIndexes == 0) {
-                    /**
-                     * Note: there is a chance that this will never be removed because some
-                     * index in the dataset was not flushed because it is empty. This could
-                     * be solved by passing only the number of successfully flushed indexes.
-                     */
-                    replicaUniqueLSN2RemoteMapping.remove(lsmCompProp.getNodeUniqueLSN());
-                }
-            }
-
-            //delete mask to indicate that this component is now valid.
-            replicaResourcesManager.markLSMComponentReplicaAsValid(lsmCompProp);
-            lsmComponentId2PropertiesMap.remove(lsmComponentId);
-            LOGGER.log(Level.INFO, "Completed LSMComponent " + lsmComponentId + " Replication.");
-        }
+    public RemoteLogsProcessor getRemoteLogsProcessor() {
+        return logsProcessor;
     }
 
     @Override
     public void close() throws IOException {
-        if (!serverSocketChannel.isOpen()) {
+        if (serverSocketChannel != null) {
             serverSocketChannel.close();
-            LOGGER.log(Level.INFO, "Replication channel closed.");
+            LOGGER.info("Replication channel closed.");
         }
     }
 
-    /**
-     * A replication thread is created per received replication request.
-     */
-    private class ReplicationThread implements IReplicationThread {
+    private class ReplicationWorker implements IReplicationWorker {
         private final SocketChannel socketChannel;
-        private final LogRecord remoteLog;
-        private ByteBuffer inBuffer;
-        private ByteBuffer outBuffer;
+        private final ByteBuffer inBuffer;
+        private final ByteBuffer outBuffer;
 
-        public ReplicationThread(SocketChannel socketChannel) {
+        public ReplicationWorker(SocketChannel socketChannel) {
             this.socketChannel = socketChannel;
-            inBuffer = ByteBuffer.allocate(INTIAL_BUFFER_SIZE);
-            outBuffer = ByteBuffer.allocate(INTIAL_BUFFER_SIZE);
-            remoteLog = new LogRecord();
+            inBuffer = ByteBuffer.allocate(ReplicationProtocol.INITIAL_BUFFER_SIZE);
+            outBuffer = ByteBuffer.allocate(ReplicationProtocol.INITIAL_BUFFER_SIZE);
         }
 
         @Override
         public void run() {
-            Thread.currentThread().setName("Replication Thread");
+            final String oldName = Thread.currentThread().getName();
+            Thread.currentThread().setName("Replication Worker");
             try {
-                ReplicationRequestType replicationFunction =
-                        ReplicationProtocol.getRequestType(socketChannel, inBuffer);
-                while (replicationFunction != ReplicationRequestType.GOODBYE) {
-                    switch (replicationFunction) {
-                        case REPLICATE_LOG:
-                            handleLogReplication();
-                            break;
-                        case LSM_COMPONENT_PROPERTIES:
-                            handleLSMComponentProperties();
-                            break;
-                        case REPLICATE_FILE:
-                            handleReplicateFile();
-                            break;
-                        case DELETE_FILE:
-                            handleDeleteFile();
-                            break;
-                        case REPLICA_EVENT:
-                            handleReplicaEvent();
-                            break;
-                        case GET_REPLICA_MAX_LSN:
-                            handleGetReplicaMaxLSN();
-                            break;
-                        case GET_REPLICA_FILES:
-                            handleGetReplicaFiles();
-                            break;
-                        case FLUSH_INDEX:
-                            handleFlushIndex();
-                            break;
-                        default:
-                            throw new IllegalStateException("Unknown replication request");
-                    }
-                    replicationFunction = ReplicationProtocol.getRequestType(socketChannel, inBuffer);
+                ReplicationRequestType requestType = ReplicationProtocol.getRequestType(socketChannel, inBuffer);
+                while (requestType != ReplicationRequestType.GOODBYE) {
+                    handle(requestType);
+                    requestType = ReplicationProtocol.getRequestType(socketChannel, inBuffer);
                 }
             } catch (Exception e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Unexpectedly error during replication.", e);
-                }
+                LOGGER.warn("Unexpectedly error during replication.", e);
             } finally {
                 if (socketChannel.isOpen()) {
                     try {
                         socketChannel.close();
                     } catch (IOException e) {
-                        if (LOGGER.isLoggable(Level.WARNING)) {
-                            LOGGER.log(Level.WARNING, "Filed to close replication socket.", e);
-                        }
+                        LOGGER.warn("Failed to close replication socket.", e);
                     }
                 }
+                Thread.currentThread().setName(oldName);
             }
         }
 
-        private void handleFlushIndex() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            //read which indexes are requested to be flushed from remote replica
-            ReplicaIndexFlushRequest request = ReplicationProtocol.readReplicaIndexFlushRequest(inBuffer);
-            Set<Long> requestedIndexesToBeFlushed = request.getLaggingRescouresIds();
-
-            /**
-             * check which indexes can be flushed (open indexes) and which cannot be
-             * flushed (closed or have empty memory component).
-             */
-            IDatasetLifecycleManager datasetLifeCycleManager = appContextProvider.getDatasetLifecycleManager();
-            List<IndexInfo> openIndexesInfo = datasetLifeCycleManager.getOpenIndexesInfo();
-            Set<Integer> datasetsToForceFlush = new HashSet<>();
-            for (IndexInfo iInfo : openIndexesInfo) {
-                if (requestedIndexesToBeFlushed.contains(iInfo.getResourceId())) {
-                    AbstractLSMIOOperationCallback ioCallback =
-                            (AbstractLSMIOOperationCallback) iInfo.getIndex().getIOOperationCallback();
-                    //if an index has a pending flush, then the request to flush it will succeed.
-                    if (ioCallback.hasPendingFlush()) {
-                        //remove index to indicate that it will be flushed
-                        requestedIndexesToBeFlushed.remove(iInfo.getResourceId());
-                    } else if (!((AbstractLSMIndex) iInfo.getIndex()).isCurrentMutableComponentEmpty()) {
-                        /**
-                         * if an index has something to be flushed, then the request to flush it
-                         * will succeed and we need to schedule it to be flushed.
-                         */
-                        datasetsToForceFlush.add(iInfo.getDatasetId());
-                        //remove index to indicate that it will be flushed
-                        requestedIndexesToBeFlushed.remove(iInfo.getResourceId());
-                    }
-                }
-            }
-
-            //schedule flush for datasets requested to be flushed
-            for (int datasetId : datasetsToForceFlush) {
-                datasetLifeCycleManager.flushDataset(datasetId, true);
-            }
-
-            //the remaining indexes in the requested set are those which cannot be flushed.
-            //respond back to the requester that those indexes cannot be flushed
-            ReplicaIndexFlushRequest laggingIndexesResponse = new ReplicaIndexFlushRequest(requestedIndexesToBeFlushed);
-            outBuffer = ReplicationProtocol.writeGetReplicaIndexFlushRequest(outBuffer, laggingIndexesResponse);
-            NetworkingUtil.transferBufferToChannel(socketChannel, outBuffer);
-        }
-
-        private void handleLSMComponentProperties() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            LSMComponentProperties lsmCompProp = ReplicationProtocol.readLSMPropertiesRequest(inBuffer);
-            //create mask to indicate that this component is not valid yet
-            replicaResourcesManager.createRemoteLSMComponentMask(lsmCompProp);
-            lsmComponentId2PropertiesMap.put(lsmCompProp.getComponentId(), lsmCompProp);
-        }
-
-        private void handleReplicateFile() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            LSMIndexFileProperties afp = ReplicationProtocol.readFileReplicationRequest(inBuffer);
-
-            //get index path
-            String indexPath = replicaResourcesManager.getIndexPath(afp);
-            String replicaFilePath = indexPath + File.separator + afp.getFileName();
-
-            //create file
-            File destFile = new File(replicaFilePath);
-            destFile.createNewFile();
-
-            try (RandomAccessFile fileOutputStream = new RandomAccessFile(destFile, "rw");
-                    FileChannel fileChannel = fileOutputStream.getChannel()) {
-                fileOutputStream.setLength(afp.getFileSize());
-                NetworkingUtil.downloadFile(fileChannel, socketChannel);
-                fileChannel.force(true);
-
-                if (afp.requiresAck()) {
-                    ReplicationProtocol.sendAck(socketChannel);
-                }
-                if (afp.isLSMComponentFile()) {
-                    String componentId = LSMComponentProperties.getLSMComponentID(afp.getFilePath());
-                    if (afp.getLSNByteOffset() > AbstractLSMIOOperationCallback.INVALID) {
-                        LSMComponentLSNSyncTask syncTask = new LSMComponentLSNSyncTask(componentId,
-                                destFile.getAbsolutePath(), afp.getLSNByteOffset());
-                        lsmComponentRemoteLSN2LocalLSNMappingTaskQ.offer(syncTask);
-                    } else {
-                        updateLSMComponentRemainingFiles(componentId);
-                    }
-                } else {
-                    //index metadata file
-                    replicaResourcesManager.initializeReplicaIndexLSNMap(indexPath, logManager.getAppendLSN());
-                }
-            }
-        }
-
-        private void handleGetReplicaMaxLSN() throws IOException {
-            long maxLNS = logManager.getAppendLSN();
-            outBuffer.clear();
-            outBuffer.putLong(maxLNS);
-            outBuffer.flip();
-            NetworkingUtil.transferBufferToChannel(socketChannel, outBuffer);
-        }
-
-        private void handleGetReplicaFiles() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            ReplicaFilesRequest request = ReplicationProtocol.readReplicaFileRequest(inBuffer);
-
-            LSMIndexFileProperties fileProperties = new LSMIndexFileProperties();
-
-            List<String> filesList;
-            Set<Integer> partitionIds = request.getPartitionIds();
-            Set<String> requesterExistingFiles = request.getExistingFiles();
-            Map<Integer, ClusterPartition> clusterPartitions =
-                    appContextProvider.getAppContext().getMetadataProperties().getClusterPartitions();
-
-            final IReplicationStrategy repStrategy = replicationProperties.getReplicationStrategy();
-            // Flush replicated datasets to generate the latest LSM components
-            dsLifecycleManager.flushDataset(repStrategy);
-            for (Integer partitionId : partitionIds) {
-                ClusterPartition partition = clusterPartitions.get(partitionId);
-                filesList = replicaResourcesManager.getPartitionIndexesFiles(partition.getPartitionId(), false);
-                //start sending files
-                for (String filePath : filesList) {
-                    // Send only files of datasets that are replciated.
-                    IndexFileProperties indexFileRef = localResourceRep.getIndexFileRef(filePath);
-                    if (!repStrategy.isMatch(indexFileRef.getDatasetId())) {
-                        continue;
-                    }
-                    String relativeFilePath = StoragePathUtil.getIndexFileRelativePath(filePath);
-                    //if the file already exists on the requester, skip it
-                    if (!requesterExistingFiles.contains(relativeFilePath)) {
-                        try (RandomAccessFile fromFile = new RandomAccessFile(filePath, "r");
-                                FileChannel fileChannel = fromFile.getChannel();) {
-                            long fileSize = fileChannel.size();
-                            fileProperties.initialize(filePath, fileSize, partition.getNodeId(), false,
-                                    AbstractLSMIOOperationCallback.INVALID, false);
-                            outBuffer = ReplicationProtocol.writeFileReplicationRequest(outBuffer, fileProperties,
-                                    ReplicationRequestType.REPLICATE_FILE);
-
-                            //send file info
-                            NetworkingUtil.transferBufferToChannel(socketChannel, outBuffer);
-
-                            //transfer file
-                            NetworkingUtil.sendFile(fileChannel, socketChannel);
-                        }
-                    }
-                }
-            }
-
-            //send goodbye (end of files)
-            ReplicationProtocol.sendGoodbye(socketChannel);
-        }
-
-        private void handleReplicaEvent() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            ReplicaEvent event = ReplicationProtocol.readReplicaEventRequest(inBuffer);
-            replicationManager.reportReplicaEvent(event);
-        }
-
-        private void handleDeleteFile() throws IOException {
-            inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-            LSMIndexFileProperties fileProp = ReplicationProtocol.readFileReplicationRequest(inBuffer);
-            replicaResourcesManager.deleteIndexFile(fileProp);
-            if (fileProp.requiresAck()) {
-                ReplicationProtocol.sendAck(socketChannel);
-            }
-        }
-
-        private void handleLogReplication() throws IOException, ACIDException {
-            //set initial buffer size to a log buffer page size
-            inBuffer = ByteBuffer.allocate(logManager.getLogPageSize());
-            while (true) {
-                //read a batch of logs
-                inBuffer = ReplicationProtocol.readRequest(socketChannel, inBuffer);
-                //check if it is end of handshake (a single byte log)
-                if (inBuffer.remaining() == LOG_REPLICATION_END_HANKSHAKE_LOG_SIZE) {
-                    break;
-                }
-
-                processLogsBatch(inBuffer);
-            }
-        }
-
-        private void processLogsBatch(ByteBuffer buffer) throws ACIDException {
-            while (buffer.hasRemaining()) {
-                //get rid of log size
-                inBuffer.getInt();
-                //Deserialize log
-                remoteLog.readRemoteLog(inBuffer);
-                remoteLog.setLogSource(LogSource.REMOTE);
-
-                switch (remoteLog.getLogType()) {
-                    case LogType.UPDATE:
-                    case LogType.ENTITY_COMMIT:
-                        //if the log partition belongs to a partitions hosted on this node, replicate it
-                        if (nodeHostedPartitions.contains(remoteLog.getResourcePartition())) {
-                            logManager.log(remoteLog);
-                        }
-                        break;
-                    case LogType.JOB_COMMIT:
-                    case LogType.ABORT:
-                        LogRecord jobTerminationLog = new LogRecord();
-                        TransactionUtil.formJobTerminateLogRecord(jobTerminationLog, remoteLog.getJobId(),
-                                remoteLog.getLogType() == LogType.JOB_COMMIT);
-                        jobTerminationLog.setReplicationThread(this);
-                        jobTerminationLog.setLogSource(LogSource.REMOTE);
-                        logManager.log(jobTerminationLog);
-                        break;
-                    case LogType.FLUSH:
-                        //store mapping information for flush logs to use them in incoming LSM components.
-                        RemoteLogMapping flushLogMap = new RemoteLogMapping();
-                        flushLogMap.setRemoteNodeID(remoteLog.getNodeId());
-                        flushLogMap.setRemoteLSN(remoteLog.getLSN());
-                        logManager.log(remoteLog);
-                        //the log LSN value is updated by logManager.log(.) to a local value
-                        flushLogMap.setLocalLSN(remoteLog.getLSN());
-                        flushLogMap.numOfFlushedIndexes.set(remoteLog.getNumOfFlushedIndexes());
-                        replicaUniqueLSN2RemoteMapping.put(flushLogMap.getNodeUniqueLSN(), flushLogMap);
-                        synchronized (flushLogslock) {
-                            flushLogslock.notify();
-                        }
-                        break;
-                    default:
-                        LOGGER.severe("Unsupported LogType: " + remoteLog.getLogType());
-                }
-            }
-        }
-
-        /**
-         * this method is called sequentially by LogPage (notifyReplicationTerminator)
-         * for JOB_COMMIT and JOB_ABORT log types.
-         */
-        @Override
-        public void notifyLogReplicationRequester(LogRecord logRecord) {
-            pendingNotificationRemoteLogsQ.offer(logRecord);
-        }
-
         @Override
-        public SocketChannel getReplicationClientSocket() {
+        public SocketChannel getChannel() {
             return socketChannel;
         }
-    }
-
-    /**
-     * This thread is responsible for sending JOB_COMMIT/ABORT ACKs to replication clients.
-     */
-    private class ReplicationNotifier extends Thread {
-        @Override
-        public void run() {
-            Thread.currentThread().setName("ReplicationNotifier Thread");
-            while (true) {
-                try {
-                    LogRecord logRecord = pendingNotificationRemoteLogsQ.take();
-                    //send ACK to requester
-                    logRecord.getReplicationThread().getReplicationClientSocket().socket().getOutputStream()
-                            .write((localNodeID + ReplicationProtocol.JOB_REPLICATION_ACK + logRecord.getJobId()
-                                    + System.lineSeparator()).getBytes());
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                } catch (IOException e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Failed to send job replication ACK", e);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * This thread is responsible for synchronizing the LSN of
-     * the received LSM components to a local LSN.
-     */
-    private class LSMComponentsSyncService extends Thread {
-        private static final int BULKLOAD_LSN = 0;
 
         @Override
-        public void run() {
-            Thread.currentThread().setName("LSMComponentsSyncService Thread");
-
-            while (true) {
-                try {
-                    LSMComponentLSNSyncTask syncTask = lsmComponentRemoteLSN2LocalLSNMappingTaskQ.take();
-                    LSMComponentProperties lsmCompProp = lsmComponentId2PropertiesMap.get(syncTask.getComponentId());
-                    syncLSMComponentFlushLSN(lsmCompProp, syncTask);
-                    updateLSMComponentRemainingFiles(lsmCompProp.getComponentId());
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                } catch (Exception e) {
-                    if (LOGGER.isLoggable(Level.SEVERE)) {
-                        LOGGER.log(Level.SEVERE, "Unexpected exception during LSN synchronization", e);
-                    }
-                }
-
-            }
+        public ByteBuffer getReusableBuffer() {
+            return outBuffer;
         }
 
-        private void syncLSMComponentFlushLSN(LSMComponentProperties lsmCompProp, LSMComponentLSNSyncTask syncTask)
-                throws InterruptedException, IOException {
-            long remoteLSN = lsmCompProp.getOriginalLSN();
-            //LSN=0 (bulkload) does not need to be updated and there is no flush log corresponding to it
-            if (remoteLSN == BULKLOAD_LSN) {
-                //since this is the first LSM component of this index,
-                //then set the mapping in the LSN_MAP to the current log LSN because
-                //no other log could've been received for this index since bulkload replication is synchronous.
-                lsmCompProp.setReplicaLSN(logManager.getAppendLSN());
-                return;
-            }
-
-            //path to the LSM component file
-            Path path = Paths.get(syncTask.getComponentFilePath());
-            if (lsmCompProp.getReplicaLSN() == null) {
-                if (lsmCompProp.getOpType() == LSMOperationType.FLUSH) {
-                    //need to look up LSN mapping from memory
-                    RemoteLogMapping remoteLogMap = replicaUniqueLSN2RemoteMapping.get(lsmCompProp.getNodeUniqueLSN());
-                    //wait until flush log arrives, and verify the LSM component file still exists
-                    //The component file could be deleted if its NC fails.
-                    while (remoteLogMap == null && Files.exists(path)) {
-                        synchronized (flushLogslock) {
-                            flushLogslock.wait();
-                        }
-                        remoteLogMap = replicaUniqueLSN2RemoteMapping.get(lsmCompProp.getNodeUniqueLSN());
-                    }
-
-                    /**
-                     * file has been deleted due to its remote primary replica failure
-                     * before its LSN could've been synchronized.
-                     */
-                    if (remoteLogMap == null) {
-                        return;
-                    }
-                    lsmCompProp.setReplicaLSN(remoteLogMap.getLocalLSN());
-                } else if (lsmCompProp.getOpType() == LSMOperationType.MERGE) {
-                    //need to load the LSN mapping from disk
-                    Map<Long, Long> lsmMap = replicaResourcesManager
-                            .getReplicaIndexLSNMap(lsmCompProp.getReplicaComponentPath(replicaResourcesManager));
-                    Long mappingLSN = lsmMap.get(lsmCompProp.getOriginalLSN());
-                    if (mappingLSN == null) {
-                        /**
-                         * this shouldn't happen unless this node just recovered and
-                         * the first component it received is a merged component due
-                         * to an on-going merge operation while recovery on the remote
-                         * replica. In this case, we use the current append LSN since
-                         * no new records exist for this index, otherwise they would've
-                         * been flushed. This could be prevented by waiting for any IO
-                         * to finish on the remote replica during recovery.
-                         */
-                        mappingLSN = logManager.getAppendLSN();
-                    }
-                    lsmCompProp.setReplicaLSN(mappingLSN);
-                }
-            }
-
-            if (Files.notExists(path)) {
-                /**
-                 * This could happen when a merged component arrives and deletes
-                 * the flushed component (which we are trying to update) before
-                 * its flush log arrives since logs and components are received
-                 * on different threads.
-                 */
-                return;
-            }
-
-            File destFile = new File(syncTask.getComponentFilePath());
-            //prepare local LSN buffer
-            ByteBuffer metadataBuffer = ByteBuffer.allocate(Long.BYTES);
-            metadataBuffer.putLong(lsmCompProp.getReplicaLSN());
-            metadataBuffer.flip();
-
-            //replace the remote LSN value by the local one
-            try (RandomAccessFile fileOutputStream = new RandomAccessFile(destFile, "rw");
-                    FileChannel fileChannel = fileOutputStream.getChannel()) {
-                long lsnStartOffset = syncTask.getLSNByteOffset();
-                while (metadataBuffer.hasRemaining()) {
-                    lsnStartOffset += fileChannel.write(metadataBuffer, lsnStartOffset);
-                }
-                fileChannel.force(true);
-            }
+        private void handle(ReplicationRequestType requestType) throws HyracksDataException {
+            final IReplicaTask task =
+                    (IReplicaTask) ReplicationProtocol.readMessage(requestType, socketChannel, inBuffer);
+            task.perform(appCtx, this);
         }
     }
 }
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationManager.java
index 126114b..727a379 100644
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationManager.java
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/management/ReplicationManager.java
@@ -18,1334 +18,120 @@
  */
 package org.apache.asterix.replication.management;
 
-import java.io.BufferedReader;
-import java.io.File;
 import java.io.IOException;
-import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.RandomAccessFile;
 import java.net.InetSocketAddress;
-import java.nio.ByteBuffer;
-import java.nio.channels.AsynchronousCloseException;
-import java.nio.channels.FileChannel;
-import java.nio.channels.SocketChannel;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
 
-import org.apache.asterix.common.cluster.ClusterPartition;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.common.dataflow.LSMIndexUtil;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
+import org.apache.asterix.common.replication.IPartitionReplica;
+import org.apache.asterix.common.replication.IReplicationDestination;
 import org.apache.asterix.common.replication.IReplicationManager;
 import org.apache.asterix.common.replication.IReplicationStrategy;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.common.replication.Replica.ReplicaState;
-import org.apache.asterix.common.replication.ReplicaEvent;
-import org.apache.asterix.common.replication.ReplicationJob;
-import org.apache.asterix.common.storage.IndexFileProperties;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
-import org.apache.asterix.common.transactions.ILogManager;
+import org.apache.asterix.common.replication.ReplicationStrategyFactory;
 import org.apache.asterix.common.transactions.ILogRecord;
-import org.apache.asterix.common.transactions.LogType;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.asterix.replication.functions.ReplicaFilesRequest;
-import org.apache.asterix.replication.functions.ReplicaIndexFlushRequest;
-import org.apache.asterix.replication.functions.ReplicationProtocol;
-import org.apache.asterix.replication.functions.ReplicationProtocol.ReplicationRequestType;
-import org.apache.asterix.replication.logging.ReplicationLogBuffer;
-import org.apache.asterix.replication.logging.TxnLogReplicator;
-import org.apache.asterix.replication.storage.LSMComponentProperties;
-import org.apache.asterix.replication.storage.LSMIndexFileProperties;
-import org.apache.asterix.replication.storage.ReplicaResourcesManager;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.asterix.replication.api.ReplicationDestination;
 import org.apache.hyracks.api.replication.IReplicationJob;
-import org.apache.hyracks.api.replication.IReplicationJob.ReplicationExecutionType;
-import org.apache.hyracks.api.replication.IReplicationJob.ReplicationJobType;
-import org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexReplicationJob;
-import org.apache.hyracks.util.StorageUtil;
-import org.apache.hyracks.util.StorageUtil.StorageUnit;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
-/**
- * This class is used to process replication jobs and maintain remote replicas states
- */
+@ThreadSafe
 public class ReplicationManager implements IReplicationManager {
 
-    private static final Logger LOGGER = Logger.getLogger(ReplicationManager.class.getName());
-    private static final int INITIAL_REPLICATION_FACTOR = 1;
-    private static final int MAX_JOB_COMMIT_ACK_WAIT = 10000;
-    private final String nodeId;
-    private ExecutorService replicationListenerThreads;
-    private final Map<Integer, Set<String>> jobCommitAcks;
-    private final Map<Integer, ILogRecord> replicationJobsPendingAcks;
-    private ByteBuffer dataBuffer;
-    private final LinkedBlockingQueue<IReplicationJob> replicationJobsQ;
-    private final LinkedBlockingQueue<ReplicaEvent> replicaEventsQ;
-
-    private int replicationFactor = 1;
-    private final ReplicaResourcesManager replicaResourcesManager;
-    private final ILogManager logManager;
-    private final IAppRuntimeContextProvider asterixAppRuntimeContextProvider;
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final Map<InetSocketAddress, ReplicationDestination> dests = new HashMap<>();
     private final ReplicationProperties replicationProperties;
-    private final Map<String, Replica> replicas;
-    private final Map<String, Set<Integer>> replica2PartitionsMap;
+    private final IReplicationStrategy strategy;
+    private final INcApplicationContext appCtx;
+    private final LogReplicationManager logReplicationManager;
+    private final IndexReplicationManager lsnIndexReplicationManager;
 
-    private final AtomicBoolean replicationSuspended;
-    private AtomicBoolean terminateJobsReplication;
-    private AtomicBoolean jobsReplicationSuspended;
-    private static final int INITIAL_BUFFER_SIZE = StorageUtil.getIntSizeInBytes(4, StorageUnit.KILOBYTE);
-    private final Set<String> shuttingDownReplicaIds;
-    //replication threads
-    private ReplicationJobsProccessor replicationJobsProcessor;
-    private final ReplicasEventsMonitor replicationMonitor;
-    //dummy job used to stop ReplicationJobsProccessor thread.
-    private static final IReplicationJob REPLICATION_JOB_POISON_PILL = new ReplicationJob(ReplicationJobType.METADATA,
-            ReplicationOperation.REPLICATE, ReplicationExecutionType.ASYNC, null);
-    //used to identify the correct IP address when the node has multiple network interfaces
-    private String hostIPAddressFirstOctet = null;
-
-    private LinkedBlockingQueue<ReplicationLogBuffer> emptyLogBuffersQ;
-    private LinkedBlockingQueue<ReplicationLogBuffer> pendingFlushLogBuffersQ;
-    protected ReplicationLogBuffer currentTxnLogBuffer;
-    private TxnLogReplicator txnlogReplicator;
-    private Future<? extends Object> txnLogReplicatorTask;
-    private SocketChannel[] logsRepSockets;
-    private final ByteBuffer txnLogsBatchSizeBuffer = ByteBuffer.allocate(Integer.BYTES);
-    private final IReplicationStrategy replicationStrategy;
-    private final PersistentLocalResourceRepository localResourceRepo;
-
-    //TODO this class needs to be refactored by moving its private classes to separate files
-    //and possibly using MessageBroker to send/receive remote replicas events.
-    public ReplicationManager(String nodeId, ReplicationProperties replicationProperties,
-            IReplicaResourcesManager remoteResoucesManager, ILogManager logManager,
-            IAppRuntimeContextProvider asterixAppRuntimeContextProvider) {
-        this.nodeId = nodeId;
+    public ReplicationManager(INcApplicationContext appCtx, ReplicationProperties replicationProperties) {
         this.replicationProperties = replicationProperties;
-        replicationStrategy = replicationProperties.getReplicationStrategy();
-        this.replicaResourcesManager = (ReplicaResourcesManager) remoteResoucesManager;
-        this.asterixAppRuntimeContextProvider = asterixAppRuntimeContextProvider;
-        this.logManager = logManager;
-        localResourceRepo =
-                (PersistentLocalResourceRepository) asterixAppRuntimeContextProvider.getLocalResourceRepository();
-        this.hostIPAddressFirstOctet = replicationProperties.getReplicaIPAddress(nodeId).substring(0, 3);
-        replicas = new HashMap<>();
-        replicationJobsQ = new LinkedBlockingQueue<>();
-        replicaEventsQ = new LinkedBlockingQueue<>();
-        terminateJobsReplication = new AtomicBoolean(false);
-        jobsReplicationSuspended = new AtomicBoolean(true);
-        replicationSuspended = new AtomicBoolean(true);
-        jobCommitAcks = new ConcurrentHashMap<>();
-        replicationJobsPendingAcks = new ConcurrentHashMap<>();
-        shuttingDownReplicaIds = new HashSet<>();
-        dataBuffer = ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
-        replicationMonitor = new ReplicasEventsMonitor();
-        //add list of replicas from configurations (To be read from another source e.g. Zookeeper)
-        Set<Replica> replicaNodes = replicationProperties.getReplicationStrategy().getRemoteReplicas(nodeId);
+        this.appCtx = appCtx;
+        strategy = ReplicationStrategyFactory.create(replicationProperties.getReplicationStrategy());
+        logReplicationManager = new LogReplicationManager(appCtx, this);
+        lsnIndexReplicationManager = new IndexReplicationManager(appCtx, this);
+    }
 
-        //Used as async listeners from replicas
-        replicationListenerThreads = Executors.newCachedThreadPool();
-        replicationJobsProcessor = new ReplicationJobsProccessor();
-
-        Map<String, ClusterPartition[]> nodePartitions =
-                asterixAppRuntimeContextProvider.getAppContext().getMetadataProperties().getNodePartitions();
-        replica2PartitionsMap = new HashMap<>(replicaNodes.size());
-        for (Replica replica : replicaNodes) {
-            replicas.put(replica.getId(), replica);
-            //for each remote replica, get the list of replication clients
-            Set<String> nodeReplicationClients = replicationProperties.getRemotePrimaryReplicasIds(replica.getId());
-            //get the partitions of each client
-            List<Integer> clientPartitions = new ArrayList<>();
-            for (String clientId : nodeReplicationClients) {
-                for (ClusterPartition clusterPartition : nodePartitions.get(clientId)) {
-                    clientPartitions.add(clusterPartition.getPartitionId());
-                }
-            }
-            Set<Integer> clientPartitonsSet = new HashSet<>(clientPartitions.size());
-            clientPartitonsSet.addAll(clientPartitions);
-            replica2PartitionsMap.put(replica.getId(), clientPartitonsSet);
-        }
-        int numLogBuffers = replicationProperties.getLogBufferNumOfPages();
-        emptyLogBuffersQ = new LinkedBlockingQueue<>(numLogBuffers);
-        pendingFlushLogBuffersQ = new LinkedBlockingQueue<>(numLogBuffers);
-
-        int logBufferSize = replicationProperties.getLogBufferPageSize();
-        for (int i = 0; i < numLogBuffers; i++) {
-            emptyLogBuffersQ
-                    .offer(new ReplicationLogBuffer(this, logBufferSize, replicationProperties.getLogBatchSize()));
+    @Override
+    public void register(IPartitionReplica replica) {
+        synchronized (dests) {
+            final InetSocketAddress location = replica.getIdentifier().getLocation();
+            final ReplicationDestination replicationDest = dests.computeIfAbsent(location, ReplicationDestination::at);
+            replicationDest.add(replica);
+            logReplicationManager.register(replicationDest);
+            lsnIndexReplicationManager.register(replicationDest);
         }
     }
 
     @Override
-    public void submitJob(IReplicationJob job) throws IOException {
-        if (job.getExecutionType() == ReplicationExecutionType.ASYNC) {
-            replicationJobsQ.offer(job);
-        } else {
-            //wait until replication is resumed
-            while (replicationSuspended.get()) {
-                synchronized (replicationSuspended) {
-                    try {
-                        replicationSuspended.wait();
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                    }
-                }
-            }
-            processJob(job, null, null);
-        }
-    }
-
-    @Override
-    public void replicateLog(ILogRecord logRecord) throws InterruptedException {
-        if (logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT) {
-            //if replication is suspended, wait until it is resumed.
-            while (replicationSuspended.get()) {
-                synchronized (replicationSuspended) {
-                    replicationSuspended.wait();
-                }
-            }
-            Set<String> replicaIds = Collections.synchronizedSet(new HashSet<String>());
-            replicaIds.add(nodeId);
-            jobCommitAcks.put(logRecord.getJobId(), replicaIds);
-        }
-
-        appendToLogBuffer(logRecord);
-    }
-
-    protected void getAndInitNewLargePage(int pageSize) {
-        // for now, alloc a new buffer for each large page
-        // TODO: consider pooling large pages
-        currentTxnLogBuffer = new ReplicationLogBuffer(this, pageSize, replicationProperties.getLogBufferPageSize());
-        pendingFlushLogBuffersQ.offer(currentTxnLogBuffer);
-    }
-
-    protected void getAndInitNewPage() throws InterruptedException {
-        currentTxnLogBuffer = null;
-        while (currentTxnLogBuffer == null) {
-            currentTxnLogBuffer = emptyLogBuffersQ.take();
-        }
-        currentTxnLogBuffer.reset();
-        pendingFlushLogBuffersQ.offer(currentTxnLogBuffer);
-    }
-
-    private synchronized void appendToLogBuffer(ILogRecord logRecord) throws InterruptedException {
-        if (!currentTxnLogBuffer.hasSpace(logRecord)) {
-            currentTxnLogBuffer.isFull(true);
-            if (logRecord.getLogSize() > getLogPageSize()) {
-                getAndInitNewLargePage(logRecord.getLogSize());
-            } else {
-                getAndInitNewPage();
-            }
-        }
-        currentTxnLogBuffer.append(logRecord);
-    }
-
-    /**
-     * Processes the replication job based on its specifications
-     *
-     * @param job
-     *            The replication job
-     * @param replicasSockets
-     *            The remote replicas sockets to send the request to.
-     * @param requestBuffer
-     *            The buffer to use to send the request.
-     * @throws IOException
-     */
-    private void processJob(IReplicationJob job, Map<String, SocketChannel> replicasSockets, ByteBuffer requestBuffer)
-            throws IOException {
-        try {
-
-            //all of the job's files belong to a single storage partition.
-            //get any of them to determine the partition from the file path.
-            String jobFile = job.getJobFiles().iterator().next();
-            IndexFileProperties indexFileRef = localResourceRepo.getIndexFileRef(jobFile);
-            if (!replicationStrategy.isMatch(indexFileRef.getDatasetId())) {
+    public void unregister(IPartitionReplica replica) {
+        synchronized (dests) {
+            final InetSocketAddress location = replica.getIdentifier().getLocation();
+            final ReplicationDestination dest = dests.get(location);
+            if (dest == null) {
+                LOGGER.warn(() -> "Asked to unregister unknown replica " + replica);
                 return;
             }
-
-            int jobPartitionId = indexFileRef.getPartitionId();
-
-            ByteBuffer responseBuffer = null;
-            LSMIndexFileProperties asterixFileProperties = new LSMIndexFileProperties();
-            if (requestBuffer == null) {
-                requestBuffer = ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
+            LOGGER.info(() -> "unregister " + replica);
+            dest.remove(replica);
+            if (dest.getReplicas().isEmpty()) {
+                LOGGER.info(() -> "Removing destination with no replicas " + dest);
+                logReplicationManager.unregister(dest);
+                lsnIndexReplicationManager.unregister(dest);
+                dests.remove(location);
             }
-
-            boolean isLSMComponentFile = job.getJobType() == ReplicationJobType.LSM_COMPONENT;
-            try {
-                //if there isn't already a connection, establish a new one
-                if (replicasSockets == null) {
-                    replicasSockets = getActiveRemoteReplicasSockets();
-                }
-
-                int remainingFiles = job.getJobFiles().size();
-                if (job.getOperation() == ReplicationOperation.REPLICATE) {
-                    //if the replication job is an LSM_COMPONENT, its properties are sent first, then its files.
-                    ILSMIndexReplicationJob LSMComponentJob = null;
-                    if (job.getJobType() == ReplicationJobType.LSM_COMPONENT) {
-                        //send LSMComponent properties
-                        LSMComponentJob = (ILSMIndexReplicationJob) job;
-                        LSMComponentProperties lsmCompProp = new LSMComponentProperties(LSMComponentJob, nodeId);
-                        requestBuffer =
-                                ReplicationProtocol.writeLSMComponentPropertiesRequest(lsmCompProp, requestBuffer);
-                        sendRequest(replicasSockets, requestBuffer);
-                    }
-
-                    for (String filePath : job.getJobFiles()) {
-                        remainingFiles--;
-                        Path path = Paths.get(filePath);
-                        if (Files.notExists(path)) {
-                            LOGGER.log(Level.SEVERE, "File deleted before replication: " + filePath);
-                            continue;
-                        }
-
-                        LOGGER.log(Level.INFO, "Replicating file: " + filePath);
-                        //open file for reading
-                        try (RandomAccessFile fromFile = new RandomAccessFile(filePath, "r");
-                                FileChannel fileChannel = fromFile.getChannel();) {
-
-                            long fileSize = fileChannel.size();
-
-                            if (LSMComponentJob != null) {
-                                /**
-                                 * since this is LSM_COMPONENT REPLICATE job, the job will contain
-                                 * only the component being replicated.
-                                 */
-                                ILSMDiskComponent diskComponent = LSMComponentJob.getLSMIndexOperationContext()
-                                        .getComponentsToBeReplicated().get(0);
-                                long lsnOffset = LSMIndexUtil.getComponentFileLSNOffset(LSMComponentJob.getLSMIndex(),
-                                        diskComponent, filePath);
-                                asterixFileProperties.initialize(filePath, fileSize, nodeId, isLSMComponentFile,
-                                        lsnOffset, remainingFiles == 0);
-                            } else {
-                                asterixFileProperties.initialize(filePath, fileSize, nodeId, isLSMComponentFile, -1L,
-                                        remainingFiles == 0);
-                            }
-                            requestBuffer = ReplicationProtocol.writeFileReplicationRequest(requestBuffer,
-                                    asterixFileProperties, ReplicationRequestType.REPLICATE_FILE);
-
-                            Iterator<Map.Entry<String, SocketChannel>> iterator = replicasSockets.entrySet().iterator();
-                            while (iterator.hasNext()) {
-                                Map.Entry<String, SocketChannel> entry = iterator.next();
-                                //if the remote replica is not interested in this partition, skip it.
-                                if (!replica2PartitionsMap.get(entry.getKey()).contains(jobPartitionId)) {
-                                    continue;
-                                }
-                                SocketChannel socketChannel = entry.getValue();
-                                //transfer request header & file
-                                try {
-                                    NetworkingUtil.transferBufferToChannel(socketChannel, requestBuffer);
-                                    NetworkingUtil.sendFile(fileChannel, socketChannel);
-                                    if (asterixFileProperties.requiresAck()) {
-                                        ReplicationRequestType responseType =
-                                                waitForResponse(socketChannel, responseBuffer);
-                                        if (responseType != ReplicationRequestType.ACK) {
-                                            throw new IOException(
-                                                    "Could not receive ACK from replica " + entry.getKey());
-                                        }
-                                    }
-                                } catch (IOException e) {
-                                    handleReplicationFailure(socketChannel, e);
-                                    iterator.remove();
-                                } finally {
-                                    requestBuffer.position(0);
-                                }
-                            }
-                        }
-                    }
-                } else if (job.getOperation() == ReplicationOperation.DELETE) {
-                    for (String filePath : job.getJobFiles()) {
-                        remainingFiles--;
-                        asterixFileProperties.initialize(filePath, -1, nodeId, isLSMComponentFile, -1L,
-                                remainingFiles == 0);
-                        ReplicationProtocol.writeFileReplicationRequest(requestBuffer, asterixFileProperties,
-                                ReplicationRequestType.DELETE_FILE);
-
-                        Iterator<Map.Entry<String, SocketChannel>> iterator = replicasSockets.entrySet().iterator();
-                        while (iterator.hasNext()) {
-                            Map.Entry<String, SocketChannel> entry = iterator.next();
-                            //if the remote replica is not interested in this partition, skip it.
-                            if (!replica2PartitionsMap.get(entry.getKey()).contains(jobPartitionId)) {
-                                continue;
-                            }
-                            SocketChannel socketChannel = entry.getValue();
-                            try {
-                                sendRequest(replicasSockets, requestBuffer);
-                                if (asterixFileProperties.requiresAck()) {
-                                    waitForResponse(socketChannel, responseBuffer);
-                                }
-                            } catch (IOException e) {
-                                handleReplicationFailure(socketChannel, e);
-                                iterator.remove();
-                            } finally {
-                                requestBuffer.position(0);
-                            }
-                        }
-                    }
-                }
-            } finally {
-                //if sync, close sockets with replicas since they wont be reused
-                if (job.getExecutionType() == ReplicationExecutionType.SYNC) {
-                    closeReplicaSockets(replicasSockets);
-                }
-            }
-        } finally {
-            exitReplicatedLSMComponent(job);
         }
     }
 
-    private static void exitReplicatedLSMComponent(IReplicationJob job) throws HyracksDataException {
-        if (job.getOperation() == ReplicationOperation.REPLICATE && job instanceof ILSMIndexReplicationJob) {
-            //exit the replicated LSM components
-            ILSMIndexReplicationJob aJob = (ILSMIndexReplicationJob) job;
-            aJob.endReplication();
-        }
+    @Override
+    public void notifyFailure(IReplicationDestination dest, Exception failure) {
+        LOGGER.info(() -> "processing failure for " + dest);
+        appCtx.getThreadExecutor().execute(() -> {
+            logReplicationManager.unregister(dest);
+            lsnIndexReplicationManager.unregister(dest);
+            dest.notifyFailure(failure);
+        });
     }
 
-    /**
-     * Waits and reads a response from a remote replica
-     *
-     * @param socketChannel
-     *            The socket to read the response from
-     * @param responseBuffer
-     *            The response buffer to read the response to.
-     * @return The response type.
-     * @throws IOException
-     */
-    private static ReplicationRequestType waitForResponse(SocketChannel socketChannel, ByteBuffer responseBuffer)
-            throws IOException {
-        if (responseBuffer == null) {
-            responseBuffer = ByteBuffer.allocate(ReplicationProtocol.REPLICATION_REQUEST_TYPE_SIZE);
-        } else {
-            responseBuffer.clear();
-        }
+    @Override
+    public void replicate(ILogRecord logRecord) throws InterruptedException {
+        logReplicationManager.replicate(logRecord);
+    }
 
-        //read response from remote replicas
-        ReplicationRequestType responseFunction = ReplicationProtocol.getRequestType(socketChannel, responseBuffer);
-        return responseFunction;
+    @Override
+    public IReplicationStrategy getReplicationStrategy() {
+        return strategy;
+    }
+
+    @Override
+    public void submitJob(IReplicationJob job) {
+        lsnIndexReplicationManager.accept(job);
     }
 
     @Override
     public boolean isReplicationEnabled() {
-        return replicationProperties.isParticipant(nodeId);
-    }
-
-    @Override
-    public synchronized void updateReplicaInfo(Replica replicaNode) {
-        Replica replica = replicas.get(replicaNode.getNode().getId());
-        //should not update the info of an active replica
-        if (replica.getState() == ReplicaState.ACTIVE) {
-            return;
-        }
-        replica.getNode().setClusterIp(replicaNode.getNode().getClusterIp());
-    }
-
-    /**
-     * Suspends processing replication jobs/logs.
-     *
-     * @param force
-     *            a flag indicates if replication should be suspended right away or when the pending jobs are completed.
-     */
-    private void suspendReplication(boolean force) {
-        //suspend replication jobs processing
-        if (replicationJobsProcessor != null && replicationJobsProcessor.isAlive()) {
-            if (force) {
-                terminateJobsReplication.set(true);
-            }
-            replicationJobsQ.offer(REPLICATION_JOB_POISON_PILL);
-
-            //wait until the jobs are suspended
-            synchronized (jobsReplicationSuspended) {
-                while (!jobsReplicationSuspended.get()) {
-                    try {
-                        jobsReplicationSuspended.wait();
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                    }
-                }
-            }
-        }
-
-        //suspend logs replication
-        if (txnlogReplicator != null) {
-            endTxnLogReplicationHandshake();
-        }
-    }
-
-    /**
-     * Opens a new connection with Active remote replicas and starts a listen thread per connection.
-     */
-    private void establishTxnLogReplicationHandshake() {
-        Map<String, SocketChannel> activeRemoteReplicasSockets = getActiveRemoteReplicasSockets();
-        logsRepSockets = new SocketChannel[activeRemoteReplicasSockets.size()];
-        int i = 0;
-        //start a listener thread per connection
-        for (Entry<String, SocketChannel> entry : activeRemoteReplicasSockets.entrySet()) {
-            logsRepSockets[i] = entry.getValue();
-            replicationListenerThreads
-                    .execute(new TxnLogsReplicationResponseListener(entry.getKey(), entry.getValue()));
-            i++;
-        }
-
-        /*
-         * establish log replication handshake
-         */
-        ByteBuffer handshakeBuffer = ByteBuffer.allocate(ReplicationProtocol.REPLICATION_REQUEST_TYPE_SIZE)
-                .putInt(ReplicationProtocol.ReplicationRequestType.REPLICATE_LOG.ordinal());
-        handshakeBuffer.flip();
-        //send handshake request
-        for (SocketChannel replicaSocket : logsRepSockets) {
-            try {
-                NetworkingUtil.transferBufferToChannel(replicaSocket, handshakeBuffer);
-            } catch (IOException e) {
-                handleReplicationFailure(replicaSocket, e);
-            } finally {
-                handshakeBuffer.position(0);
-            }
-        }
-    }
-
-    private void handleReplicationFailure(SocketChannel socketChannel, Throwable t) {
-        if (LOGGER.isLoggable(Level.WARNING)) {
-            LOGGER.log(Level.WARNING, "Could not complete replication request.", t);
-        }
-        if (socketChannel.isOpen()) {
-            try {
-                socketChannel.close();
-            } catch (IOException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Could not close socket.", e);
-                }
-            }
-        }
-        reportFailedReplica(getReplicaIdBySocket(socketChannel));
-    }
-
-    /**
-     * Stops TxnLogReplicator and closes the sockets used to replicate logs.
-     */
-    private void endTxnLogReplicationHandshake() {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Terminating TxnLogReplicator thread ...");
-        }
-        txnlogReplicator.terminate();
-        try {
-            txnLogReplicatorTask.get();
-        } catch (ExecutionException | InterruptedException e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "TxnLogReplicator thread terminated abnormally", e);
-            }
-        }
-
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("TxnLogReplicator thread was terminated.");
-        }
-
-        /*
-         * End log replication handshake (by sending a dummy log with a single byte)
-         */
-        ByteBuffer endLogRepHandshake = ByteBuffer.allocate(Integer.SIZE + 1).putInt(1).put((byte) 0);
-        endLogRepHandshake.flip();
-        for (SocketChannel replicaSocket : logsRepSockets) {
-            try {
-                NetworkingUtil.transferBufferToChannel(replicaSocket, endLogRepHandshake);
-            } catch (IOException e) {
-                handleReplicationFailure(replicaSocket, e);
-            } finally {
-                endLogRepHandshake.position(0);
-            }
-        }
-
-        //wait for any ACK to arrive before closing sockets.
-        if (logsRepSockets != null) {
-            synchronized (jobCommitAcks) {
-                try {
-                    long waitStartTime = System.currentTimeMillis();
-                    while (!jobCommitAcks.isEmpty()) {
-                        jobCommitAcks.wait(1000);
-                        long waitDuration = System.currentTimeMillis() - waitStartTime;
-                        if (waitDuration > MAX_JOB_COMMIT_ACK_WAIT) {
-                            LOGGER.log(Level.SEVERE,
-                                    "Timeout before receving all job ACKs from replicas. Pending jobs ("
-                                            + jobCommitAcks.keySet().toString() + ")");
-                            break;
-                        }
-                    }
-                } catch (InterruptedException e) {
-                    if (LOGGER.isLoggable(Level.SEVERE)) {
-                        LOGGER.log(Level.SEVERE, "Interrupted while waiting for jobs ACK", e);
-                    }
-                    Thread.currentThread().interrupt();
-                }
-            }
-        }
-
-        /*
-         * Close log replication sockets
-         */
-        ByteBuffer goodbyeBuffer = ReplicationProtocol.getGoodbyeBuffer();
-        for (SocketChannel replicaSocket : logsRepSockets) {
-            try {
-                //send goodbye to remote replica
-                NetworkingUtil.transferBufferToChannel(replicaSocket, goodbyeBuffer);
-                replicaSocket.close();
-            } catch (IOException e) {
-                handleReplicationFailure(replicaSocket, e);
-            } finally {
-                goodbyeBuffer.position(0);
-            }
-        }
-        logsRepSockets = null;
-    }
-
-    /**
-     * Sends a shutdown event to remote replicas notifying them
-     * no more logs/files will be sent from this local replica.
-     *
-     * @throws IOException
-     */
-    private void sendShutdownNotifiction() throws IOException {
-        Node node = new Node();
-        node.setId(nodeId);
-        node.setClusterIp(NetworkingUtil.getHostAddress(hostIPAddressFirstOctet));
-        Replica replica = new Replica(node);
-        ReplicaEvent event = new ReplicaEvent(replica, ClusterEventType.NODE_SHUTTING_DOWN);
-        ByteBuffer buffer = ReplicationProtocol.writeReplicaEventRequest(event);
-        Map<String, SocketChannel> replicaSockets = getActiveRemoteReplicasSockets();
-        sendRequest(replicaSockets, buffer);
-        closeReplicaSockets(replicaSockets);
-    }
-
-    /**
-     * Sends a request to remote replicas
-     *
-     * @param replicaSockets
-     *            The sockets to send the request to.
-     * @param requestBuffer
-     *            The buffer that contains the request.
-     */
-    private void sendRequest(Map<String, SocketChannel> replicaSockets, ByteBuffer requestBuffer) {
-        Iterator<Map.Entry<String, SocketChannel>> iterator = replicaSockets.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Entry<String, SocketChannel> replicaSocket = iterator.next();
-            SocketChannel clientSocket = replicaSocket.getValue();
-            try {
-                NetworkingUtil.transferBufferToChannel(clientSocket, requestBuffer);
-            } catch (IOException e) {
-                handleReplicationFailure(clientSocket, e);
-                iterator.remove();
-            } finally {
-                requestBuffer.position(0);
-            }
-        }
-    }
-
-    /**
-     * Closes the passed replication sockets by sending GOODBYE request to remote replicas.
-     *
-     * @param replicaSockets
-     */
-    private void closeReplicaSockets(Map<String, SocketChannel> replicaSockets) {
-        //send goodbye
-        ByteBuffer goodbyeBuffer = ReplicationProtocol.getGoodbyeBuffer();
-        sendRequest(replicaSockets, goodbyeBuffer);
-
-        Iterator<Map.Entry<String, SocketChannel>> iterator = replicaSockets.entrySet().iterator();
-        while (iterator.hasNext()) {
-            Entry<String, SocketChannel> replicaSocket = iterator.next();
-            SocketChannel clientSocket = replicaSocket.getValue();
-            if (clientSocket.isOpen()) {
-                try {
-                    clientSocket.close();
-                } catch (IOException e) {
-                    handleReplicationFailure(clientSocket, e);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void initializeReplicasState() {
-        for (Replica replica : replicas.values()) {
-            checkReplicaState(replica.getNode().getId(), false, false);
-        }
-    }
-
-    /**
-     * Checks the state of a remote replica by trying to ping it.
-     *
-     * @param replicaId
-     *            The replica to check the state for.
-     * @param async
-     *            a flag indicating whether to wait for the result or not.
-     * @param suspendReplication
-     *            a flag indicating whether to suspend replication on replica state change or not.
-     */
-    private void checkReplicaState(String replicaId, boolean async, boolean suspendReplication) {
-        Replica replica = replicas.get(replicaId);
-
-        ReplicaStateChecker connector = new ReplicaStateChecker(replica, replicationProperties.getReplicationTimeOut(),
-                this, replicationProperties, suspendReplication);
-        Future<? extends Object> ft = asterixAppRuntimeContextProvider.getThreadExecutor().submit(connector);
-
-        if (!async) {
-            //wait until task is done
-            while (!ft.isDone()) {
-                try {
-                    Thread.sleep(1000);
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                }
-            }
-        }
-    }
-
-    /**
-     * Updates the state of a remote replica.
-     *
-     * @param replicaId
-     *            The replica id to update.
-     * @param newState
-     *            The new state of the replica.
-     * @param suspendReplication
-     *            a flag indicating whether to suspend replication on state change or not.
-     * @throws InterruptedException
-     */
-    public synchronized void updateReplicaState(String replicaId, ReplicaState newState, boolean suspendReplication)
-            throws InterruptedException {
-        Replica replica = replicas.get(replicaId);
-
-        if (replica.getState() == newState) {
-            return;
-        }
-
-        if (suspendReplication) {
-            //prevent new jobs/logs from coming in
-            replicationSuspended.set(true);
-
-            if (newState == ReplicaState.DEAD) {
-                //assume the dead replica ACK has been received for all pending jobs
-                synchronized (jobCommitAcks) {
-                    for (Integer jobId : jobCommitAcks.keySet()) {
-                        addAckToJob(jobId, replicaId);
-                    }
-                }
-            }
-
-            //force replication threads to stop in order to change the replication factor
-            suspendReplication(true);
-        }
-
-        replica.setState(newState);
-
-        if (newState == ReplicaState.ACTIVE) {
-            replicationFactor++;
-        } else if (newState == ReplicaState.DEAD && replicationFactor > INITIAL_REPLICATION_FACTOR) {
-            replicationFactor--;
-        }
-
-        LOGGER.log(Level.WARNING, "Replica " + replicaId + " state changed to: " + newState.name()
-                + ". Replication factor changed to: " + replicationFactor);
-
-        if (suspendReplication) {
-            startReplicationThreads();
-        }
-    }
-
-    /**
-     * When an ACK for a JOB_COMMIT is received, it is added to the corresponding job.
-     *
-     * @param jobId
-     * @param replicaId
-     *            The remote replica id the ACK received from.
-     */
-    private void addAckToJob(int jobId, String replicaId) {
-        synchronized (jobCommitAcks) {
-            //add ACK to the job
-            if (jobCommitAcks.containsKey(jobId)) {
-                Set<String> replicaIds = jobCommitAcks.get(jobId);
-                replicaIds.add(replicaId);
-            } else {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Invalid job replication ACK received for jobId(" + jobId + ")");
-                }
-                return;
-            }
-
-            //if got ACKs from all remote replicas, notify pending jobs if any
-
-            if (jobCommitAcks.get(jobId).size() == replicationFactor && replicationJobsPendingAcks.containsKey(jobId)) {
-                ILogRecord pendingLog = replicationJobsPendingAcks.get(jobId);
-                synchronized (pendingLog) {
-                    pendingLog.notifyAll();
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean hasBeenReplicated(ILogRecord logRecord) {
-        int jobId = logRecord.getJobId();
-        if (jobCommitAcks.containsKey(jobId)) {
-            synchronized (jobCommitAcks) {
-                //check if all ACKs have been received
-                if (jobCommitAcks.get(jobId).size() == replicationFactor) {
-                    jobCommitAcks.remove(jobId);
-
-                    //remove from pending jobs if exists
-                    replicationJobsPendingAcks.remove(jobId);
-
-                    //notify any threads waiting for all jobs to finish
-                    if (jobCommitAcks.size() == 0) {
-                        jobCommitAcks.notifyAll();
-                    }
-                    return true;
-                } else {
-                    replicationJobsPendingAcks.putIfAbsent(jobId, logRecord);
-                    return false;
-                }
-            }
-        }
-        //presume replicated
-        return true;
-    }
-
-    private Map<String, SocketChannel> getActiveRemoteReplicasSockets() {
-        Map<String, SocketChannel> replicaNodesSockets = new HashMap<>();
-        for (Replica replica : replicas.values()) {
-            if (replica.getState() == ReplicaState.ACTIVE) {
-                try {
-                    SocketChannel sc = getReplicaSocket(replica.getId());
-                    replicaNodesSockets.put(replica.getId(), sc);
-                } catch (IOException e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Could not get replica socket", e);
-                    }
-                    reportFailedReplica(replica.getId());
-                }
-            }
-        }
-        return replicaNodesSockets;
-    }
-
-    /**
-     * Establishes a connection with a remote replica.
-     *
-     * @param replicaId
-     *            The replica to connect to.
-     * @return The socket of the remote replica
-     * @throws IOException
-     */
-    private SocketChannel getReplicaSocket(String replicaId) throws IOException {
-        Replica replica = replicationProperties.getReplicaById(replicaId);
-        SocketChannel sc = SocketChannel.open();
-        sc.configureBlocking(true);
-        InetSocketAddress address = replica.getAddress(replicationProperties);
-        sc.connect(new InetSocketAddress(address.getHostString(), address.getPort()));
-        return sc;
-    }
-
-    @Override
-    public Set<String> getDeadReplicasIds() {
-        Set<String> replicasIds = new HashSet<>();
-        for (Replica replica : replicas.values()) {
-            if (replica.getState() == ReplicaState.DEAD) {
-                replicasIds.add(replica.getNode().getId());
-            }
-        }
-        return replicasIds;
-    }
-
-    @Override
-    public Set<String> getActiveReplicasIds() {
-        Set<String> replicasIds = new HashSet<>();
-        for (Replica replica : replicas.values()) {
-            if (replica.getState() == ReplicaState.ACTIVE) {
-                replicasIds.add(replica.getNode().getId());
-            }
-        }
-        return replicasIds;
-    }
-
-    @Override
-    public int getActiveReplicasCount() {
-        return getActiveReplicasIds().size();
+        return replicationProperties.isReplicationEnabled();
     }
 
     @Override
     public void start() {
-        //do nothing
+        // no op
     }
 
     @Override
-    public void dumpState(OutputStream os) throws IOException {
-        //do nothing
-    }
-
-    /**
-     * Called during NC shutdown to notify remote replicas about the shutdown
-     * and wait for remote replicas shutdown notification then closes the local
-     * replication channel.
-     */
-    @Override
-    public void stop(boolean dumpState, OutputStream ouputStream) throws IOException {
-        //stop replication thread afters all jobs/logs have been processed
-        suspendReplication(false);
-
-        /*
-         * If this node has any remote replicas, it needs to inform them
-         * that it is shutting down.
-         */
-        if (!replicationStrategy.getRemoteReplicas(nodeId).isEmpty()) {
-            //send shutdown event to remote replicas
-            sendShutdownNotifiction();
-        }
-
-        /*
-         * If this node has any remote primary replicas, then it needs to wait
-         * until all of them send the shutdown notification.
-         */
-        // find active remote primary replicas
-        Set<String> activeRemotePrimaryReplicas = replicationStrategy.getRemotePrimaryReplicas(nodeId).stream()
-                .map(Replica::getId).filter(getActiveReplicasIds()::contains).collect(Collectors.toSet());
-
-        if (!activeRemotePrimaryReplicas.isEmpty()) {
-            //wait until all shutdown events come from all remote primary replicas
-            synchronized (shuttingDownReplicaIds) {
-                while (!shuttingDownReplicaIds.containsAll(activeRemotePrimaryReplicas)) {
-                    try {
-                        shuttingDownReplicaIds.wait();
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                    }
-                }
-            }
-        }
-
-        LOGGER.log(Level.INFO, "Got shutdown notification from all remote replicas");
-        //close replication channel
-        asterixAppRuntimeContextProvider.getAppContext().getReplicationChannel().close();
-
-        LOGGER.log(Level.INFO, "Replication manager stopped.");
+    public void dumpState(OutputStream os) {
+        // no op
     }
 
     @Override
-    public void reportReplicaEvent(ReplicaEvent event) {
-        replicaEventsQ.offer(event);
-    }
-
-    /**
-     * Suspends replications and sends a remote replica failure event to ReplicasEventsMonitor.
-     *
-     * @param replicaId
-     *            the failed replica id.
-     */
-    public void reportFailedReplica(String replicaId) {
-        Replica replica = replicas.get(replicaId);
-        if (replica == null) {
-            return;
-        }
-        if (replica.getState() == ReplicaState.DEAD) {
-            return;
-        }
-
-        //need to stop processing any new logs or jobs
-        terminateJobsReplication.set(true);
-
-        ReplicaEvent event = new ReplicaEvent(replica, ClusterEventType.NODE_FAILURE);
-        reportReplicaEvent(event);
-    }
-
-    private String getReplicaIdBySocket(SocketChannel socketChannel) {
-        InetSocketAddress socketAddress = NetworkingUtil.getSocketAddress(socketChannel);
-        for (Replica replica : replicas.values()) {
-            InetSocketAddress replicaAddress = replica.getAddress(replicationProperties);
-            if (replicaAddress.getHostName().equals(socketAddress.getHostName())
-                    && replicaAddress.getPort() == socketAddress.getPort()) {
-                return replica.getId();
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void startReplicationThreads() throws InterruptedException {
-        replicationJobsProcessor = new ReplicationJobsProccessor();
-
-        //start/continue processing jobs/logs
-        if (logsRepSockets == null) {
-            establishTxnLogReplicationHandshake();
-            getAndInitNewPage();
-            txnlogReplicator = new TxnLogReplicator(emptyLogBuffersQ, pendingFlushLogBuffersQ);
-            txnLogReplicatorTask = asterixAppRuntimeContextProvider.getThreadExecutor().submit(txnlogReplicator);
-        }
-
-        replicationJobsProcessor.start();
-
-        if (!replicationMonitor.isAlive()) {
-            replicationMonitor.start();
-        }
-
-        //notify any waiting threads that replication has been resumed
-        synchronized (replicationSuspended) {
-            LOGGER.log(Level.INFO, "Replication started/resumed");
-            replicationSuspended.set(false);
-            replicationSuspended.notifyAll();
-        }
-    }
-
-    @Override
-    public void requestFlushLaggingReplicaIndexes(long nonSharpCheckpointTargetLSN) throws IOException {
-        long startLSN = logManager.getAppendLSN();
-        Set<String> replicaIds = getActiveReplicasIds();
-        if (replicaIds.isEmpty()) {
-            return;
-        }
-        ByteBuffer requestBuffer = ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
-        for (String replicaId : replicaIds) {
-            //1. identify replica indexes with LSN less than nonSharpCheckpointTargetLSN.
-            Map<Long, String> laggingIndexes =
-                    replicaResourcesManager.getLaggingReplicaIndexesId2PathMap(replicaId, nonSharpCheckpointTargetLSN);
-
-            if (laggingIndexes.size() > 0) {
-                //2. send request to remote replicas that have lagging indexes.
-                ReplicaIndexFlushRequest laggingIndexesResponse = null;
-                try (SocketChannel socketChannel = getReplicaSocket(replicaId)) {
-                    ReplicaIndexFlushRequest laggingIndexesRequest =
-                            new ReplicaIndexFlushRequest(laggingIndexes.keySet());
-                    requestBuffer =
-                            ReplicationProtocol.writeGetReplicaIndexFlushRequest(requestBuffer, laggingIndexesRequest);
-                    NetworkingUtil.transferBufferToChannel(socketChannel, requestBuffer);
-
-                    //3. remote replicas will respond with indexes that were not flushed.
-                    ReplicationRequestType responseFunction = waitForResponse(socketChannel, requestBuffer);
-
-                    if (responseFunction == ReplicationRequestType.FLUSH_INDEX) {
-                        requestBuffer = ReplicationProtocol.readRequest(socketChannel, requestBuffer);
-                        //returning the indexes that were not flushed
-                        laggingIndexesResponse = ReplicationProtocol.readReplicaIndexFlushRequest(requestBuffer);
-                    }
-                    //send goodbye
-                    ReplicationProtocol.sendGoodbye(socketChannel);
-                }
-
-                /*
-                 * 4. update the LSN_MAP for indexes that were not flushed
-                 * to the current append LSN to indicate no operations happened
-                 * since the checkpoint start.
-                 */
-                if (laggingIndexesResponse != null) {
-                    for (Long resouceId : laggingIndexesResponse.getLaggingRescouresIds()) {
-                        String indexPath = laggingIndexes.get(resouceId);
-                        Map<Long, Long> indexLSNMap = replicaResourcesManager.getReplicaIndexLSNMap(indexPath);
-                        indexLSNMap.put(ReplicaResourcesManager.REPLICA_INDEX_CREATION_LSN, startLSN);
-                        replicaResourcesManager.updateReplicaIndexLSNMap(indexPath, indexLSNMap);
-                    }
-                }
-            }
-        }
-    }
-
-    //Recovery Method
-    @Override
-    public long getMaxRemoteLSN(Set<String> remoteReplicas) throws IOException {
-        long maxRemoteLSN = 0;
-
-        ReplicationProtocol.writeGetReplicaMaxLSNRequest(dataBuffer);
-        Map<String, SocketChannel> replicaSockets = new HashMap<>();
-        try {
-            for (String replicaId : remoteReplicas) {
-                replicaSockets.put(replicaId, getReplicaSocket(replicaId));
-            }
-
-            //send request
-            Iterator<Map.Entry<String, SocketChannel>> iterator = replicaSockets.entrySet().iterator();
-            while (iterator.hasNext()) {
-                Entry<String, SocketChannel> replicaSocket = iterator.next();
-                SocketChannel clientSocket = replicaSocket.getValue();
-                NetworkingUtil.transferBufferToChannel(clientSocket, dataBuffer);
-                dataBuffer.position(0);
-            }
-
-            iterator = replicaSockets.entrySet().iterator();
-            while (iterator.hasNext()) {
-                Entry<String, SocketChannel> replicaSocket = iterator.next();
-                SocketChannel clientSocket = replicaSocket.getValue();
-                //read response
-                NetworkingUtil.readBytes(clientSocket, dataBuffer, Long.BYTES);
-                maxRemoteLSN = Math.max(maxRemoteLSN, dataBuffer.getLong());
-            }
-        } finally {
-            closeReplicaSockets(replicaSockets);
-        }
-
-        return maxRemoteLSN;
-    }
-
-    //Recovery Method
-    @Override
-    public void requestReplicaFiles(String selectedReplicaId, Set<Integer> partitionsToRecover,
-            Set<String> existingFiles) throws IOException {
-        ReplicaFilesRequest request = new ReplicaFilesRequest(partitionsToRecover, existingFiles);
-        dataBuffer = ReplicationProtocol.writeGetReplicaFilesRequest(dataBuffer, request);
-
-        try (SocketChannel socketChannel = getReplicaSocket(selectedReplicaId)) {
-
-            //transfer request
-            NetworkingUtil.transferBufferToChannel(socketChannel, dataBuffer);
-
-            String indexPath;
-            String destFilePath;
-            ReplicationRequestType responseFunction = ReplicationProtocol.getRequestType(socketChannel, dataBuffer);
-            LSMIndexFileProperties fileProperties;
-            while (responseFunction != ReplicationRequestType.GOODBYE) {
-                dataBuffer = ReplicationProtocol.readRequest(socketChannel, dataBuffer);
-
-                fileProperties = ReplicationProtocol.readFileReplicationRequest(dataBuffer);
-
-                //get index path
-                indexPath = replicaResourcesManager.getIndexPath(fileProperties);
-                destFilePath = indexPath + File.separator + fileProperties.getFileName();
-
-                //create file
-                File destFile = new File(destFilePath);
-                destFile.createNewFile();
-
-                try (RandomAccessFile fileOutputStream = new RandomAccessFile(destFile, "rw");
-                        FileChannel fileChannel = fileOutputStream.getChannel();) {
-                    fileOutputStream.setLength(fileProperties.getFileSize());
-
-                    NetworkingUtil.downloadFile(fileChannel, socketChannel);
-                    fileChannel.force(true);
-                }
-
-                //we need to create LSN map for .metadata files that belong to remote replicas
-                if (!fileProperties.isLSMComponentFile() && !fileProperties.getNodeId().equals(nodeId)) {
-                    //replica index
-                    replicaResourcesManager.initializeReplicaIndexLSNMap(indexPath, logManager.getAppendLSN());
-                }
-
-                responseFunction = ReplicationProtocol.getRequestType(socketChannel, dataBuffer);
-            }
-
-            //send goodbye
-            ReplicationProtocol.sendGoodbye(socketChannel);
-        }
-    }
-
-    public int getLogPageSize() {
-        return replicationProperties.getLogBufferPageSize();
-    }
-
-    @Override
-    public void replicateTxnLogBatch(final ByteBuffer buffer) {
-        //if replication is suspended, wait until it is resumed
-        try {
-            while (replicationSuspended.get()) {
-                synchronized (replicationSuspended) {
-                    replicationSuspended.wait();
-                }
-            }
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-        //prepare the batch size buffer
-        txnLogsBatchSizeBuffer.clear();
-        txnLogsBatchSizeBuffer.putInt(buffer.remaining());
-        txnLogsBatchSizeBuffer.flip();
-
-        buffer.mark();
-        for (SocketChannel replicaSocket : logsRepSockets) {
-            try {
-                //send batch size
-                NetworkingUtil.transferBufferToChannel(replicaSocket, txnLogsBatchSizeBuffer);
-                //send log
-                NetworkingUtil.transferBufferToChannel(replicaSocket, buffer);
-            } catch (IOException e) {
-                handleReplicationFailure(replicaSocket, e);
-            } finally {
-                txnLogsBatchSizeBuffer.position(0);
-                buffer.reset();
-            }
-        }
-        //move the buffer position to the sent limit
-        buffer.position(buffer.limit());
-    }
-
-    //supporting classes
-    /**
-     * This class is responsible for processing replica events.
-     */
-    private class ReplicasEventsMonitor extends Thread {
-        ReplicaEvent event;
-
-        @Override
-        public void run() {
-            while (true) {
-                try {
-                    event = replicaEventsQ.take();
-
-                    switch (event.getEventType()) {
-                        case NODE_FAILURE:
-                            handleReplicaFailure(event.getReplica().getId());
-                            break;
-                        case NODE_JOIN:
-                            updateReplicaInfo(event.getReplica());
-                            checkReplicaState(event.getReplica().getId(), false, true);
-                            break;
-                        case NODE_SHUTTING_DOWN:
-                            handleShutdownEvent(event.getReplica().getId());
-                            break;
-                        default:
-                            break;
-                    }
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                }
-            }
-        }
-
-        public void handleReplicaFailure(String replicaId) throws InterruptedException {
-            Replica replica = replicas.get(replicaId);
-
-            if (replica.getState() == ReplicaState.DEAD) {
-                return;
-            }
-
-            updateReplicaState(replicaId, ReplicaState.DEAD, true);
-
-            //delete any invalid LSMComponents for this replica
-            replicaResourcesManager.cleanInvalidLSMComponents(replicaId);
-        }
-
-        public void handleShutdownEvent(String replicaId) {
-            synchronized (shuttingDownReplicaIds) {
-                shuttingDownReplicaIds.add(replicaId);
-                shuttingDownReplicaIds.notifyAll();
-            }
-        }
-    }
-
-    /**
-     * This class process is responsible for processing ASYNC replication job.
-     */
-    private class ReplicationJobsProccessor extends Thread {
-        Map<String, SocketChannel> replicaSockets;
-        ByteBuffer reusableBuffer = ByteBuffer.allocate(INITIAL_BUFFER_SIZE);
-
-        @Override
-        public void run() {
-            Thread.currentThread().setName("ReplicationJobsProccessor Thread");
-            terminateJobsReplication.set(false);
-            jobsReplicationSuspended.set(false);
-
-            while (true) {
-                try {
-                    if (terminateJobsReplication.get()) {
-                        closeSockets();
-                        break;
-                    }
-
-                    IReplicationJob job = replicationJobsQ.take();
-                    if (job == REPLICATION_JOB_POISON_PILL) {
-                        terminateJobsReplication.set(true);
-                        continue;
-                    }
-
-                    //if there isn't already a connection, establish a new one
-                    if (replicaSockets == null) {
-                        replicaSockets = getActiveRemoteReplicasSockets();
-                    }
-                    processJob(job, replicaSockets, reusableBuffer);
-
-                    //if no more jobs to process, close sockets
-                    if (replicationJobsQ.isEmpty()) {
-                        LOGGER.log(Level.INFO, "No pending replication jobs. Closing connections to replicas");
-                        closeSockets();
-                    }
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                } catch (IOException e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Couldn't complete processing replication job", e);
-                    }
-                }
-            }
-
-            synchronized (jobsReplicationSuspended) {
-                jobsReplicationSuspended.set(true);
-                jobsReplicationSuspended.notifyAll();
-            }
-            LOGGER.log(Level.INFO, "ReplicationJobsProccessor stopped. ");
-        }
-
-        private void closeSockets() {
-            if (replicaSockets != null) {
-                closeReplicaSockets(replicaSockets);
-                replicaSockets.clear();
-                replicaSockets = null;
-            }
-        }
-    }
-
-    /**
-     * This class is responsible for listening on sockets that belong to TxnLogsReplicator.
-     */
-    private class TxnLogsReplicationResponseListener implements Runnable {
-        final SocketChannel replicaSocket;
-        final String replicaId;
-
-        public TxnLogsReplicationResponseListener(String replicaId, SocketChannel replicaSocket) {
-            this.replicaId = replicaId;
-            this.replicaSocket = replicaSocket;
-        }
-
-        @Override
-        public void run() {
-            Thread.currentThread().setName("TxnLogs Replication Listener Thread");
-            LOGGER.log(Level.INFO, "Started listening on socket: " + replicaSocket.socket().getRemoteSocketAddress());
-
-            try (BufferedReader incomingResponse =
-                    new BufferedReader(new InputStreamReader(replicaSocket.socket().getInputStream()))) {
-                while (true) {
-                    String responseLine = incomingResponse.readLine();
-                    if (responseLine == null) {
-                        break;
-                    }
-                    //read ACK for job commit log
-                    String ackFrom = ReplicationProtocol.getNodeIdFromLogAckMessage(responseLine);
-                    int jobId = ReplicationProtocol.getJobIdFromLogAckMessage(responseLine);
-                    addAckToJob(jobId, ackFrom);
-                }
-            } catch (AsynchronousCloseException e) {
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.log(Level.INFO, "Replication listener stopped for remote replica: " + replicaId, e);
-                }
-            } catch (IOException e) {
-                handleReplicationFailure(replicaSocket, e);
-            }
-        }
+    public void stop(boolean dumpState, OutputStream ouputStream) throws IOException {
+        LOGGER.info("Closing replication channel");
+        appCtx.getReplicationChannel().close();
+        LOGGER.info("Replication manager stopped");
     }
 }
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/CheckpointPartitionIndexesTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/CheckpointPartitionIndexesTask.java
new file mode 100644
index 0000000..84922cd
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/CheckpointPartitionIndexesTask.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.common.LocalResource;
+
+/**
+ * A task to initialize the checkpoints for all indexes in a partition with the replica's current LSN
+ */
+public class CheckpointPartitionIndexesTask implements IReplicaTask {
+
+    private final int partition;
+
+    public CheckpointPartitionIndexesTask(int partition) {
+        this.partition = partition;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) throws HyracksDataException {
+        final IIndexCheckpointManagerProvider indexCheckpointManagerProvider =
+                appCtx.getIndexCheckpointManagerProvider();
+        PersistentLocalResourceRepository resRepo =
+                (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        final Collection<LocalResource> partitionResources = resRepo.getPartitionResources(partition).values();
+        final long currentLSN = appCtx.getTransactionSubsystem().getLogManager().getAppendLSN();
+        for (LocalResource ls : partitionResources) {
+            final IIndexCheckpointManager indexCheckpointManager =
+                    indexCheckpointManagerProvider.get(DatasetResourceReference.of(ls));
+            indexCheckpointManager.delete();
+            indexCheckpointManager.init(currentLSN);
+        }
+        ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.CHECKPOINT_PARTITION;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeInt(partition);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static CheckpointPartitionIndexesTask create(DataInput input) throws HyracksDataException {
+        try {
+            int partition = input.readInt();
+            return new CheckpointPartitionIndexesTask(partition);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ComponentMaskTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ComponentMaskTask.java
new file mode 100644
index 0000000..d5dc51d
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ComponentMaskTask.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.io.IIOManager;
+
+/**
+ * A task to create a mask file for an incoming lsm component from master
+ */
+public class ComponentMaskTask implements IReplicaTask {
+
+    private final String file;
+
+    public ComponentMaskTask(String file) {
+        this.file = file;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        try {
+            // create mask
+            final Path maskPath = getComponentMaskPath(appCtx, file);
+            Files.createFile(maskPath);
+            ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public static Path getComponentMaskPath(INcApplicationContext appCtx, String componentFile) throws IOException {
+        final IIOManager ioManager = appCtx.getIoManager();
+        final FileReference localPath = ioManager.resolve(componentFile);
+        final Path resourceDir = Files.createDirectories(localPath.getFile().getParentFile().toPath());
+        final String componentId = PersistentLocalResourceRepository.getComponentId(componentFile);
+        return Paths.get(resourceDir.toString(), StorageConstants.COMPONENT_MASK_FILE_PREFIX + componentId);
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.LSM_COMPONENT_MASK;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            final DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(file);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static ComponentMaskTask create(DataInput input) throws IOException {
+        String indexFile = input.readUTF();
+        return new ComponentMaskTask(indexFile);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DeleteFileTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DeleteFileTask.java
new file mode 100644
index 0000000..1b5470d
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DeleteFileTask.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.IIOManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * A task to delete a file on a replica if exists
+ */
+public class DeleteFileTask implements IReplicaTask {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final String file;
+
+    public DeleteFileTask(String file) {
+        this.file = file;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        try {
+            final IIOManager ioManager = appCtx.getIoManager();
+            final File localFile = ioManager.resolve(file).getFile();
+            if (localFile.exists()) {
+                Files.delete(localFile.toPath());
+                LOGGER.info(() -> "Deleted file: " + localFile.getAbsolutePath());
+            } else {
+                LOGGER.warn(() -> "Requested to delete a non-existing file: " + localFile.getAbsolutePath());
+            }
+            ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.DELETE_RESOURCE_FILE;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(file);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static DeleteFileTask create(DataInput input) throws IOException {
+        return new DeleteFileTask(input.readUTF());
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DropIndexTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DropIndexTask.java
new file mode 100644
index 0000000..b7f0985
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/DropIndexTask.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.logging.Logger;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.util.IoUtil;
+
+/**
+ * A task to drop an index that was dropped on master
+ */
+public class DropIndexTask implements IReplicaTask {
+
+    private static final Logger LOGGER = Logger.getLogger(DeleteFileTask.class.getName());
+    private final String file;
+
+    public DropIndexTask(String file) {
+        this.file = file;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        try {
+            final IIOManager ioManager = appCtx.getIoManager();
+            final File indexFile = ioManager.resolve(file).getFile();
+            if (indexFile.exists()) {
+                File indexDir = indexFile.getParentFile();
+                IoUtil.deleteDirectory(indexDir);
+                LOGGER.info(() -> "Deleted index: " + indexFile.getAbsolutePath());
+            } else {
+                LOGGER.warning(() -> "Requested to delete a non-existing index: " + indexFile.getAbsolutePath());
+            }
+            ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.REPLICATE_RESOURCE_FILE;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(file);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static DropIndexTask create(DataInput input) throws IOException {
+        return new DropIndexTask(input.readUTF());
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/MarkComponentValidTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/MarkComponentValidTask.java
new file mode 100644
index 0000000..b581321
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/MarkComponentValidTask.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.ResourceReference;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
+
+/**
+ * A task to mark a replicated LSM component as valid
+ */
+public class MarkComponentValidTask implements IReplicaTask {
+
+    private final long masterLsn;
+    private final String file;
+
+    public MarkComponentValidTask(String file, long masterLsn) {
+        this.file = file;
+        this.masterLsn = masterLsn;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        try {
+            if (masterLsn > 0) {
+                ensureComponentLsnFlushed(appCtx);
+            }
+            // delete mask
+            final Path maskPath = ComponentMaskTask.getComponentMaskPath(appCtx, file);
+            Files.delete(maskPath);
+            ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+        } catch (IOException | InterruptedException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    private void ensureComponentLsnFlushed(INcApplicationContext appCtx)
+            throws HyracksDataException, InterruptedException {
+        final ResourceReference indexRef = ResourceReference.of(file);
+        final IIndexCheckpointManagerProvider checkpointManagerProvider = appCtx.getIndexCheckpointManagerProvider();
+        final IIndexCheckpointManager indexCheckpointManager = checkpointManagerProvider.get(indexRef);
+        long replicationTimeOut = TimeUnit.SECONDS.toMillis(appCtx.getReplicationProperties().getReplicationTimeOut());
+        final long startTime = System.nanoTime();
+        synchronized (indexCheckpointManager) {
+            // wait until the lsn mapping is flushed to disk
+            while (!indexCheckpointManager.isFlushed(masterLsn)) {
+                if (replicationTimeOut <= 0) {
+                    throw new ReplicationException(new TimeoutException("Couldn't receive flush lsn from master"));
+                }
+                indexCheckpointManager.wait(replicationTimeOut);
+                replicationTimeOut -= TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime);
+            }
+            final String componentEndTime = AbstractLSMIndexFileManager.getComponentEndTime(indexRef.getName());
+            indexCheckpointManager.replicated(componentEndTime, masterLsn);
+        }
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.MARK_COMPONENT_VALID;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            final DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(file);
+            dos.writeLong(masterLsn);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static MarkComponentValidTask create(DataInput input) throws IOException {
+        final String indexFile = input.readUTF();
+        final long lsn = input.readLong();
+        return new MarkComponentValidTask(indexFile, lsn);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListResponse.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListResponse.java
new file mode 100644
index 0000000..561a6bf
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListResponse.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.asterix.replication.api.IReplicationMessage;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class PartitionResourcesListResponse implements IReplicationMessage {
+
+    private final int partition;
+    private final List<String> resources;
+
+    public PartitionResourcesListResponse(int partition, List<String> resources) {
+        this.partition = partition;
+        this.resources = resources;
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.PARTITION_RESOURCES_RESPONSE;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeInt(partition);
+            dos.writeInt(resources.size());
+            for (String file : resources) {
+                dos.writeUTF(file);
+            }
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public List<String> getResources() {
+        return resources;
+    }
+
+    public static PartitionResourcesListResponse create(DataInput input) throws IOException {
+        int partition = input.readInt();
+        int size = input.readInt();
+        List<String> resources = new ArrayList<>();
+        for (int i = 0; i < size; i++) {
+            resources.add(input.readUTF());
+        }
+        return new PartitionResourcesListResponse(partition, resources);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListTask.java
new file mode 100644
index 0000000..54d3a02
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/PartitionResourcesListTask.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+/**
+ * A task to get the list of the files in a partition on a replica
+ */
+public class PartitionResourcesListTask implements IReplicaTask {
+
+    private final int partition;
+
+    public PartitionResourcesListTask(int partition) {
+        this.partition = partition;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) throws HyracksDataException {
+        final PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        localResourceRepository.cleanup(partition);
+        final List<String> partitionResources = localResourceRepository.getPartitionIndexesFiles(partition).stream()
+                .map(StoragePathUtil::getFileRelativePath).collect(Collectors.toList());
+        final PartitionResourcesListResponse response =
+                new PartitionResourcesListResponse(partition, partitionResources);
+        ReplicationProtocol.sendTo(worker.getChannel(), response, worker.getReusableBuffer());
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.PARTITION_RESOURCES_REQUEST;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeInt(partition);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static PartitionResourcesListTask create(DataInput input) throws HyracksDataException {
+        try {
+            int partition = input.readInt();
+            return new PartitionResourcesListTask(partition);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateFileTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateFileTask.java
new file mode 100644
index 0000000..ca0fcca
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateFileTask.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.ResourceReference;
+import org.apache.asterix.common.utils.StorageConstants;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.replication.management.NetworkingUtil;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.io.IIOManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * A task to replicate a file from a master replica
+ */
+public class ReplicateFileTask implements IReplicaTask {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final String file;
+    private final long size;
+    private final boolean indexMetadata;
+
+    public ReplicateFileTask(String file, long size, boolean indexMetadata) {
+        this.file = file;
+        this.size = size;
+        this.indexMetadata = indexMetadata;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        try {
+            final IIOManager ioManager = appCtx.getIoManager();
+            // resolve path
+            final FileReference localPath = ioManager.resolve(file);
+            final Path resourceDir = Files.createDirectories(localPath.getFile().getParentFile().toPath());
+            // create mask
+            final Path maskPath = Paths.get(resourceDir.toString(),
+                    StorageConstants.MASK_FILE_PREFIX + localPath.getFile().getName());
+            Files.createFile(maskPath);
+
+            // receive actual file
+            final Path filePath = Paths.get(resourceDir.toString(), localPath.getFile().getName());
+            Files.createFile(filePath);
+            try (RandomAccessFile fileOutputStream = new RandomAccessFile(filePath.toFile(), "rw");
+                    FileChannel fileChannel = fileOutputStream.getChannel()) {
+                fileOutputStream.setLength(size);
+                NetworkingUtil.downloadFile(fileChannel, worker.getChannel());
+                fileChannel.force(true);
+            }
+            if (indexMetadata) {
+                initIndexCheckpoint(appCtx);
+            }
+            //delete mask
+            Files.delete(maskPath);
+            LOGGER.info(() -> "Replicated file: " + localPath);
+            ReplicationProtocol.sendAck(worker.getChannel(), worker.getReusableBuffer());
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    private void initIndexCheckpoint(INcApplicationContext appCtx) throws HyracksDataException {
+        final ResourceReference indexRef = ResourceReference.of(file);
+        final IIndexCheckpointManagerProvider checkpointManagerProvider = appCtx.getIndexCheckpointManagerProvider();
+        final IIndexCheckpointManager indexCheckpointManager = checkpointManagerProvider.get(indexRef);
+        final long currentLSN = appCtx.getTransactionSubsystem().getLogManager().getAppendLSN();
+        indexCheckpointManager.delete();
+        indexCheckpointManager.init(currentLSN);
+        LOGGER.info(() -> "Checkpoint index: " + indexRef);
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.REPLICATE_RESOURCE_FILE;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(file);
+            dos.writeLong(size);
+            dos.writeBoolean(indexMetadata);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static ReplicateFileTask create(DataInput input) throws IOException {
+        final String s = input.readUTF();
+        final long i = input.readLong();
+        final boolean isMetadata = input.readBoolean();
+        return new ReplicateFileTask(s, i, isMetadata);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateLogsTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateLogsTask.java
new file mode 100644
index 0000000..b71f4b8
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicateLogsTask.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.DataInput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationWorker;
+import org.apache.asterix.common.transactions.ILogManager;
+import org.apache.asterix.replication.api.IReplicaTask;
+import org.apache.asterix.replication.logging.RemoteLogRecord;
+import org.apache.asterix.replication.logging.RemoteLogsProcessor;
+import org.apache.asterix.replication.management.ReplicationChannel;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+/**
+ * A task to replicate transaction logs from master replica
+ */
+public class ReplicateLogsTask implements IReplicaTask {
+
+    public static final int END_REPLICATION_LOG_SIZE = 1;
+    private final String nodeId;
+
+    public ReplicateLogsTask(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    @Override
+    public void perform(INcApplicationContext appCtx, IReplicationWorker worker) {
+        final ReplicationChannel replicationChannel = (ReplicationChannel) appCtx.getReplicationChannel();
+        final RemoteLogsProcessor logsProcessor = replicationChannel.getRemoteLogsProcessor();
+        final ILogManager logManager = appCtx.getTransactionSubsystem().getLogManager();
+        final RemoteLogRecord reusableLog = new RemoteLogRecord();
+        final SocketChannel channel = worker.getChannel();
+        ByteBuffer logsBuffer = ByteBuffer.allocate(logManager.getLogPageSize());
+        try {
+            while (true) {
+                // read a batch of logs
+                logsBuffer = ReplicationProtocol.readRequest(channel, logsBuffer);
+                // check if it is end of handshake
+                if (logsBuffer.remaining() == END_REPLICATION_LOG_SIZE) {
+                    break;
+                }
+                logsProcessor.process(logsBuffer, reusableLog, worker);
+            }
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    @Override
+    public ReplicationProtocol.ReplicationRequestType getMessageType() {
+        return ReplicationProtocol.ReplicationRequestType.REPLICATE_LOGS;
+    }
+
+    @Override
+    public void serialize(OutputStream out) throws HyracksDataException {
+        try {
+            DataOutputStream dos = new DataOutputStream(out);
+            dos.writeUTF(nodeId);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static ReplicateLogsTask create(DataInput input) throws IOException {
+        final String node = input.readUTF();
+        return new ReplicateLogsTask(node);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicationProtocol.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicationProtocol.java
new file mode 100644
index 0000000..280a2d4
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/messaging/ReplicationProtocol.java
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.messaging;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.api.IReplicationMessage;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.asterix.replication.management.NetworkingUtil;
+import org.apache.hyracks.data.std.util.ExtendedByteArrayOutputStream;
+import org.apache.hyracks.util.StorageUtil;
+
+public class ReplicationProtocol {
+
+    /**
+     * All replication messages start with ReplicationRequestType (4 bytes), then the length of the request in bytes
+     */
+    public static final String LOG_REPLICATION_ACK = "$";
+    public static final int INITIAL_BUFFER_SIZE = StorageUtil.getIntSizeInBytes(4, StorageUtil.StorageUnit.KILOBYTE);
+    private static final int REPLICATION_REQUEST_TYPE_SIZE = Integer.BYTES;
+    private static final int REPLICATION_REQUEST_HEADER_SIZE = REPLICATION_REQUEST_TYPE_SIZE + Integer.BYTES;
+
+    public enum ReplicationRequestType {
+        GOODBYE,
+        ACK,
+        PARTITION_RESOURCES_REQUEST,
+        PARTITION_RESOURCES_RESPONSE,
+        REPLICATE_RESOURCE_FILE,
+        DELETE_RESOURCE_FILE,
+        CHECKPOINT_PARTITION,
+        LSM_COMPONENT_MASK,
+        MARK_COMPONENT_VALID,
+        DROP_INDEX,
+        REPLICATE_LOGS
+    }
+
+    private static final Map<Integer, ReplicationRequestType> TYPES = new HashMap<>();
+
+    static {
+        Stream.of(ReplicationRequestType.values()).forEach(type -> TYPES.put(type.ordinal(), type));
+    }
+
+    public static ByteBuffer readRequest(SocketChannel socketChannel, ByteBuffer dataBuffer) throws IOException {
+        // read request size
+        NetworkingUtil.readBytes(socketChannel, dataBuffer, Integer.BYTES);
+        final int requestSize = dataBuffer.getInt();
+        final ByteBuffer buf = ensureSize(dataBuffer, requestSize);
+        // read request
+        NetworkingUtil.readBytes(socketChannel, buf, requestSize);
+        return dataBuffer;
+    }
+
+    public static ReplicationRequestType getRequestType(SocketChannel socketChannel, ByteBuffer byteBuffer)
+            throws IOException {
+        // read replication request type
+        NetworkingUtil.readBytes(socketChannel, byteBuffer, REPLICATION_REQUEST_TYPE_SIZE);
+        return TYPES.get(byteBuffer.getInt());
+    }
+
+    private static ByteBuffer getGoodbyeBuffer() {
+        ByteBuffer bb = ByteBuffer.allocate(REPLICATION_REQUEST_TYPE_SIZE);
+        bb.putInt(ReplicationRequestType.GOODBYE.ordinal());
+        bb.flip();
+        return bb;
+    }
+
+    public static int getTxnIdFromLogAckMessage(String msg) {
+        return Integer.parseInt(msg.substring(msg.indexOf(LOG_REPLICATION_ACK) + 1));
+    }
+
+    public static void sendGoodbye(SocketChannel socketChannel) throws IOException {
+        ByteBuffer goodbyeBuffer = ReplicationProtocol.getGoodbyeBuffer();
+        NetworkingUtil.transferBufferToChannel(socketChannel, goodbyeBuffer);
+    }
+
+    public static void sendAck(SocketChannel socketChannel, ByteBuffer buf) {
+        try {
+            buf.clear();
+            buf.putInt(ReplicationRequestType.ACK.ordinal());
+            buf.flip();
+            NetworkingUtil.transferBufferToChannel(socketChannel, buf);
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public static void waitForAck(PartitionReplica replica) throws IOException {
+        final SocketChannel channel = replica.getChannel();
+        final ByteBuffer buf = replica.getReusableBuffer();
+        ReplicationRequestType responseFunction = ReplicationProtocol.getRequestType(channel, buf);
+        if (responseFunction != ReplicationRequestType.ACK) {
+            throw new IllegalStateException("Unexpected response while waiting for ack.");
+        }
+    }
+
+    public static void sendTo(PartitionReplica replica, IReplicationMessage task) {
+        final SocketChannel channel = replica.getChannel();
+        final ByteBuffer buf = replica.getReusableBuffer();
+        sendTo(channel, task, buf);
+    }
+
+    public static void sendTo(SocketChannel channel, IReplicationMessage task, ByteBuffer buf) {
+        ExtendedByteArrayOutputStream outputStream = new ExtendedByteArrayOutputStream();
+        try (DataOutputStream oos = new DataOutputStream(outputStream)) {
+            task.serialize(oos);
+            final int requestSize = REPLICATION_REQUEST_HEADER_SIZE + oos.size();
+            final ByteBuffer requestBuffer = ensureSize(buf, requestSize);
+            requestBuffer.putInt(task.getMessageType().ordinal());
+            requestBuffer.putInt(oos.size());
+            requestBuffer.put(outputStream.getByteArray(), 0, outputStream.getLength());
+            requestBuffer.flip();
+            NetworkingUtil.transferBufferToChannel(channel, requestBuffer);
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public static IReplicationMessage read(SocketChannel socketChannel, ByteBuffer buffer) throws IOException {
+        final ReplicationRequestType type = getRequestType(socketChannel, buffer);
+        return readMessage(type, socketChannel, buffer);
+    }
+
+    public static IReplicationMessage readMessage(ReplicationRequestType type, SocketChannel socketChannel,
+            ByteBuffer buffer) {
+        try {
+            ReplicationProtocol.readRequest(socketChannel, buffer);
+            final ByteArrayInputStream input =
+                    new ByteArrayInputStream(buffer.array(), buffer.position(), buffer.limit());
+            try (DataInputStream dis = new DataInputStream(input)) {
+                switch (type) {
+                    case PARTITION_RESOURCES_REQUEST:
+                        return PartitionResourcesListTask.create(dis);
+                    case PARTITION_RESOURCES_RESPONSE:
+                        return PartitionResourcesListResponse.create(dis);
+                    case REPLICATE_RESOURCE_FILE:
+                        return ReplicateFileTask.create(dis);
+                    case DELETE_RESOURCE_FILE:
+                        return DeleteFileTask.create(dis);
+                    case CHECKPOINT_PARTITION:
+                        return CheckpointPartitionIndexesTask.create(dis);
+                    case LSM_COMPONENT_MASK:
+                        return ComponentMaskTask.create(dis);
+                    case DROP_INDEX:
+                        return DropIndexTask.create(dis);
+                    case MARK_COMPONENT_VALID:
+                        return MarkComponentValidTask.create(dis);
+                    case REPLICATE_LOGS:
+                        return ReplicateLogsTask.create(dis);
+                    default:
+                        throw new IllegalStateException("Unrecognized replication message");
+                }
+            }
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public static ByteBuffer getEndLogReplicationBuffer() {
+        final int logsBatchSize = 1;
+        final ByteBuffer endLogRepBuffer =
+                ByteBuffer.allocate(Integer.BYTES + ReplicateLogsTask.END_REPLICATION_LOG_SIZE);
+        endLogRepBuffer.putInt(logsBatchSize);
+        endLogRepBuffer.put((byte) 0);
+        endLogRepBuffer.flip();
+        return endLogRepBuffer;
+    }
+
+    private static ByteBuffer ensureSize(ByteBuffer buffer, int size) {
+        if (buffer == null || buffer.capacity() < size) {
+            return ByteBuffer.allocate(size);
+        }
+        buffer.clear();
+        return buffer;
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
deleted file mode 100644
index df17987..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/recovery/RemoteRecoveryManager.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.recovery;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.config.ReplicationProperties;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.replication.IRemoteRecoveryManager;
-import org.apache.asterix.common.replication.IReplicationManager;
-import org.apache.asterix.common.transactions.ILogManager;
-import org.apache.asterix.common.transactions.IRecoveryManager;
-import org.apache.asterix.replication.storage.ReplicaResourcesManager;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class RemoteRecoveryManager implements IRemoteRecoveryManager {
-
-    private final IReplicationManager replicationManager;
-    private static final Logger LOGGER = Logger.getLogger(RemoteRecoveryManager.class.getName());
-    private final INcApplicationContext runtimeContext;
-    private final ReplicationProperties replicationProperties;
-    private Map<String, Set<String>> failbackRecoveryReplicas;
-
-    public RemoteRecoveryManager(IReplicationManager replicationManager, INcApplicationContext runtimeContext,
-            ReplicationProperties replicationProperties) {
-        this.replicationManager = replicationManager;
-        this.runtimeContext = runtimeContext;
-        this.replicationProperties = replicationProperties;
-    }
-
-    private Map<String, Set<String>> constructRemoteRecoveryPlan() {
-        //1. identify which replicas reside in this node
-        String localNodeId = runtimeContext.getTransactionSubsystem().getId();
-
-        Set<String> nodes = replicationProperties.getNodeReplicasIds(localNodeId);
-        Map<String, Set<String>> recoveryCandidates = new HashMap<>();
-        Map<String, Integer> candidatesScore = new HashMap<>();
-
-        //2. identify which nodes has backup per lost node data
-        for (String node : nodes) {
-            Set<String> locations = replicationProperties.getNodeReplicasIds(node);
-
-            //since the local node just started, remove it from candidates
-            locations.remove(localNodeId);
-
-            //remove any dead replicas
-            Set<String> deadReplicas = replicationManager.getDeadReplicasIds();
-            for (String deadReplica : deadReplicas) {
-                locations.remove(deadReplica);
-            }
-
-            //no active replicas to recover from
-            if (locations.isEmpty()) {
-                throw new IllegalStateException("Could not find any ACTIVE replica to recover " + node + " data.");
-            }
-
-            for (String location : locations) {
-                if (candidatesScore.containsKey(location)) {
-                    candidatesScore.put(location, candidatesScore.get(location) + 1);
-                } else {
-                    candidatesScore.put(location, 1);
-                }
-            }
-            recoveryCandidates.put(node, locations);
-        }
-
-        Map<String, Set<String>> recoveryList = new HashMap<>();
-
-        //3. find best candidate to recover from per lost replica data
-        recoveryCandidates.forEach((key, value) -> {
-            int winnerScore = -1;
-            String winner = "";
-            for (String node : value) {
-
-                int nodeScore = candidatesScore.get(node);
-
-                if (nodeScore > winnerScore) {
-                    winnerScore = nodeScore;
-                    winner = node;
-                }
-            }
-
-            if (recoveryList.containsKey(winner)) {
-                recoveryList.get(winner).add(key);
-            } else {
-                Set<String> nodesToRecover = new HashSet<>();
-                nodesToRecover.add(key);
-                recoveryList.put(winner, nodesToRecover);
-            }
-
-        });
-
-        return recoveryList;
-    }
-
-    @Override
-    public void replayReplicaPartitionLogs(Set<Integer> partitions, boolean flush) throws HyracksDataException {
-        ILogManager logManager = runtimeContext.getTransactionSubsystem().getLogManager();
-        long minLSN = runtimeContext.getReplicaResourcesManager().getPartitionsMinLSN(partitions);
-        long readableSmallestLSN = logManager.getReadableSmallestLSN();
-        if (minLSN < readableSmallestLSN) {
-            minLSN = readableSmallestLSN;
-        }
-
-        //replay logs > minLSN that belong to these partitions
-        IRecoveryManager recoveryManager = runtimeContext.getTransactionSubsystem().getRecoveryManager();
-        try {
-            recoveryManager.replayPartitionsLogs(partitions, logManager.getLogReader(true), minLSN);
-            if (flush) {
-                runtimeContext.getDatasetLifecycleManager().flushAllDatasets();
-            }
-        } catch (IOException | ACIDException e) {
-            throw new HyracksDataException(e);
-        }
-    }
-
-    @Override
-    public void takeoverPartitons(Integer[] partitions) throws IOException, ACIDException {
-        /*
-         * TODO even though the takeover is always expected to succeed,
-         * in case of any failure during the takeover, the CC should be
-         * notified that the takeover failed.
-         */
-        Set<Integer> partitionsToTakeover = new HashSet<>(Arrays.asList(partitions));
-        replayReplicaPartitionLogs(partitionsToTakeover, false);
-
-        //mark these partitions as active in this node
-        PersistentLocalResourceRepository resourceRepository =
-                (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
-        for (Integer patitionId : partitions) {
-            resourceRepository.addActivePartition(patitionId);
-        }
-    }
-
-    @Override
-    public void startFailbackProcess() {
-        int maxRecoveryAttempts = replicationProperties.getMaxRemoteRecoveryAttempts();
-        PersistentLocalResourceRepository resourceRepository =
-                (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
-        IDatasetLifecycleManager datasetLifeCycleManager = runtimeContext.getDatasetLifecycleManager();
-        Map<String, ClusterPartition[]> nodePartitions = runtimeContext.getMetadataProperties().getNodePartitions();
-
-        while (true) {
-            //start recovery steps
-            try {
-                if (maxRecoveryAttempts <= 0) {
-                    //to avoid infinite loop in case of unexpected behavior.
-                    throw new IllegalStateException("Failed to perform remote recovery.");
-                }
-
-                /*** Prepare for Recovery ***/
-                //1. check remote replicas states
-                replicationManager.initializeReplicasState();
-                int activeReplicasCount = replicationManager.getActiveReplicasCount();
-
-                if (activeReplicasCount == 0) {
-                    throw new IllegalStateException("no ACTIVE remote replica(s) exists to perform remote recovery");
-                }
-
-                //2. clean any memory data that could've existed from previous failed recovery attempt
-                datasetLifeCycleManager.closeAllDatasets();
-
-                //3. remove any existing storage data and initialize storage metadata
-                resourceRepository.deleteStorageData(true);
-                resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
-
-                //4. select remote replicas to recover from per lost replica data
-                failbackRecoveryReplicas = constructRemoteRecoveryPlan();
-
-                /*** Start Recovery Per Lost Replica ***/
-                for (Entry<String, Set<String>> remoteReplica : failbackRecoveryReplicas.entrySet()) {
-                    String replicaId = remoteReplica.getKey();
-                    Set<String> ncsToRecoverFor = remoteReplica.getValue();
-                    Set<Integer> partitionsIds = new HashSet<>();
-                    for (String node : ncsToRecoverFor) {
-                        partitionsIds.addAll((Arrays.asList(nodePartitions.get(node))).stream()
-                                .map(ClusterPartition::getPartitionId).collect(Collectors.toList()));
-                    }
-
-                    //1. Request indexes metadata and LSM components
-                    replicationManager.requestReplicaFiles(replicaId, partitionsIds, new HashSet<String>());
-                }
-                break;
-            } catch (IOException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Failed during remote recovery. Attempting again...", e);
-                }
-                maxRecoveryAttempts--;
-            }
-        }
-    }
-
-    @Override
-    public void completeFailbackProcess() throws IOException, InterruptedException {
-        ILogManager logManager = runtimeContext.getTransactionSubsystem().getLogManager();
-        ReplicaResourcesManager replicaResourcesManager =
-                (ReplicaResourcesManager) runtimeContext.getReplicaResourcesManager();
-        Map<String, ClusterPartition[]> nodePartitions = runtimeContext.getMetadataProperties().getNodePartitions();
-
-        /*
-         * for each lost partition, get the remaining files from replicas
-         * to complete the failback process.
-         */
-        try {
-            for (Entry<String, Set<String>> remoteReplica : failbackRecoveryReplicas.entrySet()) {
-                String replicaId = remoteReplica.getKey();
-                Set<String> NCsDataToRecover = remoteReplica.getValue();
-                Set<String> existingFiles = new HashSet<>();
-                Set<Integer> partitionsToRecover = new HashSet<>();
-                for (String nodeId : NCsDataToRecover) {
-                    //get partitions that will be recovered from this node
-                    ClusterPartition[] replicaPartitions = nodePartitions.get(nodeId);
-                    for (ClusterPartition partition : replicaPartitions) {
-                        existingFiles.addAll(
-                                replicaResourcesManager.getPartitionIndexesFiles(partition.getPartitionId(), true));
-                        partitionsToRecover.add(partition.getPartitionId());
-                    }
-                }
-
-                //Request remaining indexes files
-                replicationManager.requestReplicaFiles(replicaId, partitionsToRecover, existingFiles);
-            }
-        } catch (IOException e) {
-            /*
-             * in case of failure during failback completion process we need to construct a new plan
-             * and get all the files from the start since the remote replicas will change in the new plan.
-             */
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.log(Level.WARNING, "Failed during completing failback. Restarting failback process...", e);
-            }
-            startFailbackProcess();
-        }
-
-        //get max LSN from selected remote replicas
-        long maxRemoteLSN = replicationManager.getMaxRemoteLSN(failbackRecoveryReplicas.keySet());
-
-        //6. force LogManager to start from a partition > maxLSN in selected remote replicas
-        logManager.renewLogFilesAndStartFromLSN(maxRemoteLSN);
-
-        //start replication service after failback completed
-        runtimeContext.getReplicationChannel().start();
-        runtimeContext.getReplicationManager().startReplicationThreads();
-
-        failbackRecoveryReplicas = null;
-    }
-
-    //TODO refactor common code between remote recovery and failback process
-    @Override
-    public void doRemoteRecoveryPlan(Map<String, Set<Integer>> recoveryPlan) throws HyracksDataException {
-        int maxRecoveryAttempts = replicationProperties.getMaxRemoteRecoveryAttempts();
-        PersistentLocalResourceRepository resourceRepository =
-                (PersistentLocalResourceRepository) runtimeContext.getLocalResourceRepository();
-        IDatasetLifecycleManager datasetLifeCycleManager = runtimeContext.getDatasetLifecycleManager();
-        ILogManager logManager = runtimeContext.getTransactionSubsystem().getLogManager();
-        while (true) {
-            //start recovery steps
-            try {
-                if (maxRecoveryAttempts <= 0) {
-                    //to avoid infinite loop in case of unexpected behavior.
-                    throw new IllegalStateException("Failed to perform remote recovery.");
-                }
-
-                /*** Prepare for Recovery ***/
-                //1. clean any memory data that could've existed from previous failed recovery attempt
-                datasetLifeCycleManager.closeAllDatasets();
-
-                //2. remove any existing storage data and initialize storage metadata
-                resourceRepository.deleteStorageData(true);
-                resourceRepository.initializeNewUniverse(ClusterProperties.INSTANCE.getStorageDirectoryName());
-
-                /*** Start Recovery Per Lost Replica ***/
-                for (Entry<String, Set<Integer>> remoteReplica : recoveryPlan.entrySet()) {
-                    String replicaId = remoteReplica.getKey();
-                    Set<Integer> partitionsToRecover = remoteReplica.getValue();
-
-                    //Request indexes metadata and LSM components
-                    replicationManager.requestReplicaFiles(replicaId, partitionsToRecover, new HashSet<String>());
-                }
-
-                //get max LSN from selected remote replicas
-                long maxRemoteLSN = replicationManager.getMaxRemoteLSN(recoveryPlan.keySet());
-
-                //6. force LogManager to start from a partition > maxLSN in selected remote replicas
-                logManager.renewLogFilesAndStartFromLSN(maxRemoteLSN);
-                break;
-            } catch (IOException e) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Failed during remote recovery. Attempting again...", e);
-                }
-                maxRecoveryAttempts--;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentLSNSyncTask.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentLSNSyncTask.java
deleted file mode 100644
index f11adc2..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentLSNSyncTask.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.storage;
-
-public class LSMComponentLSNSyncTask {
-    private String componentFilePath;
-    private String componentId;
-    private long LSNByteOffset;
-
-    public LSMComponentLSNSyncTask(String componentId, String componentFilePath, long LSNByteOffset) {
-        this.componentId = componentId;
-        this.componentFilePath = componentFilePath;
-        this.LSNByteOffset = LSNByteOffset;
-    }
-
-    public String getComponentFilePath() {
-        return componentFilePath;
-    }
-
-    public void setComponentFilePath(String componentFilePath) {
-        this.componentFilePath = componentFilePath;
-    }
-
-    public String getComponentId() {
-        return componentId;
-    }
-
-    public void setComponentId(String componentId) {
-        this.componentId = componentId;
-    }
-
-    public long getLSNByteOffset() {
-        return LSNByteOffset;
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentProperties.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentProperties.java
deleted file mode 100644
index a8b15d2..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMComponentProperties.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.storage;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
-import org.apache.asterix.replication.logging.TxnLogUtil;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexReplicationJob;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
-
-public class LSMComponentProperties {
-
-    private AtomicInteger numberOfFiles;
-    private String componentId;
-    private long lsnOffset;
-    private long originalLSN;
-    private String nodeId;
-    private Long replicaLSN;
-    private String maskPath = null;
-    private String replicaPath = null;
-    private LSMOperationType opType;
-
-    public LSMComponentProperties(ILSMIndexReplicationJob job, String nodeId) {
-        this.nodeId = nodeId;
-        componentId = LSMComponentProperties.getLSMComponentID((String) job.getJobFiles().toArray()[0]);
-        numberOfFiles = new AtomicInteger(job.getJobFiles().size());
-        originalLSN = LSMComponentProperties.getLSMComponentLSN((AbstractLSMIndex) job.getLSMIndex(),
-                job.getLSMIndexOperationContext());
-        opType = job.getLSMOpType();
-    }
-
-    public LSMComponentProperties() {
-    }
-
-    public static long getLSMComponentLSN(AbstractLSMIndex lsmIndex, ILSMIndexOperationContext ctx) {
-        long componentLSN = -1;
-        try {
-            componentLSN = ((AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback())
-                    .getComponentLSN(ctx.getComponentsToBeReplicated());
-        } catch (HyracksDataException e) {
-            e.printStackTrace();
-        }
-        if (componentLSN < 0) {
-            componentLSN = 0;
-        }
-        return componentLSN;
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeUTF(componentId);
-        dos.writeUTF(nodeId);
-        dos.writeInt(numberOfFiles.get());
-        dos.writeLong(originalLSN);
-        dos.writeLong(lsnOffset);
-        dos.writeInt(opType.ordinal());
-    }
-
-    public static LSMComponentProperties create(DataInput input) throws IOException {
-        LSMComponentProperties lsmCompProp = new LSMComponentProperties();
-        lsmCompProp.componentId = input.readUTF();
-        lsmCompProp.nodeId = input.readUTF();
-        lsmCompProp.numberOfFiles = new AtomicInteger(input.readInt());
-        lsmCompProp.originalLSN = input.readLong();
-        lsmCompProp.lsnOffset = input.readLong();
-        lsmCompProp.opType = LSMOperationType.values()[input.readInt()];
-        return lsmCompProp;
-    }
-
-    public String getMaskPath(ReplicaResourcesManager resourceManager) {
-        if (maskPath == null) {
-            LSMIndexFileProperties afp = new LSMIndexFileProperties(this);
-            //split the index file path to get the LSM component file name
-            afp.splitFileName();
-            maskPath = getReplicaComponentPath(resourceManager) + File.separator + afp.getFileName()
-                    + ReplicaResourcesManager.LSM_COMPONENT_MASK_SUFFIX;
-        }
-        return maskPath;
-    }
-
-    public String getReplicaComponentPath(ReplicaResourcesManager resourceManager) {
-        if (replicaPath == null) {
-            LSMIndexFileProperties afp = new LSMIndexFileProperties(this);
-            replicaPath = resourceManager.getIndexPath(afp);
-        }
-        return replicaPath;
-    }
-
-    /***
-     * @param filePath
-     *            any file of the LSM component
-     * @return a unique id based on the timestamp of the component
-     */
-    public static String getLSMComponentID(String filePath) {
-        String[] tokens = filePath.split(File.separator);
-
-        int arraySize = tokens.length;
-        String fileName = tokens[arraySize - 1];
-        String idxName = tokens[arraySize - 2];
-        String dataverse = tokens[arraySize - 3];
-        String partitionName = tokens[arraySize - 4];
-
-        StringBuilder componentId = new StringBuilder();
-        componentId.append(partitionName);
-        componentId.append(File.separator);
-        componentId.append(dataverse);
-        componentId.append(File.separator);
-        componentId.append(idxName);
-        componentId.append(File.separator);
-        componentId.append(fileName.substring(0, fileName.lastIndexOf(AbstractLSMIndexFileManager.DELIMITER)));
-        return componentId.toString();
-    }
-
-    public String getComponentId() {
-        return componentId;
-    }
-
-    public long getOriginalLSN() {
-        return originalLSN;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public int getNumberOfFiles() {
-        return numberOfFiles.get();
-    }
-
-    public int markFileComplete() {
-        return numberOfFiles.decrementAndGet();
-    }
-
-    public void setNumberOfFiles(AtomicInteger numberOfFiles) {
-        this.numberOfFiles = numberOfFiles;
-    }
-
-    public Long getReplicaLSN() {
-        return replicaLSN;
-    }
-
-    public void setReplicaLSN(Long replicaLSN) {
-        this.replicaLSN = replicaLSN;
-    }
-
-    public LSMOperationType getOpType() {
-        return opType;
-    }
-
-    public void setOpType(LSMOperationType opType) {
-        this.opType = opType;
-    }
-
-    public String getNodeUniqueLSN() {
-        return TxnLogUtil.getNodeUniqueLSN(nodeId, originalLSN);
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMIndexFileProperties.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMIndexFileProperties.java
deleted file mode 100644
index eb9e82d..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/LSMIndexFileProperties.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.storage;
-
-import java.io.DataInput;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.asterix.common.utils.StoragePathUtil;
-
-public class LSMIndexFileProperties {
-
-    private String fileName;
-    private long fileSize;
-    private String nodeId;
-    private String dataverse;
-    private String idxName;
-    private boolean lsmComponentFile;
-    private String filePath;
-    private boolean requiresAck = false;
-    private long LSNByteOffset;
-    private int partition;
-
-    public LSMIndexFileProperties() {
-    }
-
-    public LSMIndexFileProperties(String filePath, long fileSize, String nodeId, boolean lsmComponentFile,
-            long LSNByteOffset, boolean requiresAck) {
-        initialize(filePath, fileSize, nodeId, lsmComponentFile, LSNByteOffset, requiresAck);
-    }
-
-    public LSMIndexFileProperties(LSMComponentProperties lsmComponentProperties) {
-        initialize(lsmComponentProperties.getComponentId(), -1, lsmComponentProperties.getNodeId(), false, -1L, false);
-    }
-
-    public void initialize(String filePath, long fileSize, String nodeId, boolean lsmComponentFile, long LSNByteOffset,
-            boolean requiresAck) {
-        this.filePath = filePath;
-        this.fileSize = fileSize;
-        this.nodeId = nodeId;
-        this.lsmComponentFile = lsmComponentFile;
-        this.LSNByteOffset = LSNByteOffset;
-        this.requiresAck = requiresAck;
-    }
-
-    public void splitFileName() {
-        String[] tokens = filePath.split(File.separator);
-        int arraySize = tokens.length;
-        this.fileName = tokens[arraySize - 1];
-        this.idxName = tokens[arraySize - 2];
-        this.dataverse = tokens[arraySize - 3];
-        this.partition = StoragePathUtil.getPartitionNumFromName(tokens[arraySize - 4]);
-    }
-
-    public void serialize(OutputStream out) throws IOException {
-        DataOutputStream dos = new DataOutputStream(out);
-        dos.writeUTF(nodeId);
-        dos.writeUTF(filePath);
-        dos.writeLong(fileSize);
-        dos.writeBoolean(lsmComponentFile);
-        dos.writeLong(LSNByteOffset);
-        dos.writeBoolean(requiresAck);
-    }
-
-    public static LSMIndexFileProperties create(DataInput input) throws IOException {
-        String nodeId = input.readUTF();
-        String filePath = input.readUTF();
-        long fileSize = input.readLong();
-        boolean lsmComponentFile = input.readBoolean();
-        long LSNByteOffset = input.readLong();
-        boolean requiresAck = input.readBoolean();
-        LSMIndexFileProperties fileProp = new LSMIndexFileProperties(filePath, fileSize, nodeId, lsmComponentFile,
-                LSNByteOffset, requiresAck);
-        return fileProp;
-    }
-
-    public String getFilePath() {
-        return filePath;
-    }
-
-    public long getFileSize() {
-        return fileSize;
-    }
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public String getDataverse() {
-        return dataverse;
-    }
-
-    public void setDataverse(String dataverse) {
-        this.dataverse = dataverse;
-    }
-
-    public String getIdxName() {
-        return idxName;
-    }
-
-    public boolean isLSMComponentFile() {
-        return lsmComponentFile;
-    }
-
-    public boolean requiresAck() {
-        return requiresAck;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("File Name: " + fileName + "  ");
-        sb.append("File Size: " + fileSize + "  ");
-        sb.append("Node ID: " + nodeId + "  ");
-        sb.append("Partition: " + partition + "  ");
-        sb.append("IDX Name: " + idxName + "  ");
-        sb.append("isLSMComponentFile : " + lsmComponentFile + "  ");
-        sb.append("Dataverse: " + dataverse);
-        sb.append("LSN Byte Offset: " + LSNByteOffset);
-        return sb.toString();
-    }
-
-    public long getLSNByteOffset() {
-        return LSNByteOffset;
-    }
-
-    public int getPartition() {
-        return partition;
-    }
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/ReplicaResourcesManager.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/ReplicaResourcesManager.java
deleted file mode 100644
index cf8e001..0000000
--- a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/storage/ReplicaResourcesManager.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.replication.storage;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.ClusterProperties;
-import org.apache.asterix.common.config.MetadataProperties;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
-import org.apache.asterix.common.utils.StoragePathUtil;
-import org.apache.asterix.metadata.utils.SplitsAndConstraintsUtil;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.common.ILocalResourceRepository;
-import org.apache.hyracks.storage.common.LocalResource;
-
-public class ReplicaResourcesManager implements IReplicaResourcesManager {
-    private static final Logger LOGGER = Logger.getLogger(ReplicaResourcesManager.class.getName());
-    public final static String LSM_COMPONENT_MASK_SUFFIX = "_mask";
-    private final static String REPLICA_INDEX_LSN_MAP_NAME = ".LSN_MAP";
-    public static final long REPLICA_INDEX_CREATION_LSN = -1;
-    private final PersistentLocalResourceRepository localRepository;
-    private final Map<String, ClusterPartition[]> nodePartitions;
-
-    public ReplicaResourcesManager(ILocalResourceRepository localRepository,
-            MetadataProperties metadataProperties) {
-        this.localRepository = (PersistentLocalResourceRepository) localRepository;
-        nodePartitions = metadataProperties.getNodePartitions();
-    }
-
-    public void deleteIndexFile(LSMIndexFileProperties afp) {
-        String indexPath = getIndexPath(afp);
-        if (indexPath != null) {
-            if (afp.isLSMComponentFile()) {
-                //delete index file
-                String indexFilePath = indexPath + File.separator + afp.getFileName();
-                File destFile = new File(indexFilePath);
-                FileUtils.deleteQuietly(destFile);
-            } else {
-                //delete index directory
-                FileUtils.deleteQuietly(new File(indexPath));
-            }
-        }
-    }
-
-    public String getIndexPath(LSMIndexFileProperties fileProperties) {
-        fileProperties.splitFileName();
-        //get partition path in this node
-        String partitionPath = localRepository.getPartitionPath(fileProperties.getPartition());
-        //get index path
-        String indexPath = SplitsAndConstraintsUtil.getIndexPath(partitionPath, fileProperties.getPartition(),
-                fileProperties.getDataverse(), fileProperties.getIdxName());
-
-        Path path = Paths.get(indexPath);
-        if (!Files.exists(path)) {
-            File indexFolder = new File(indexPath);
-            indexFolder.mkdirs();
-        }
-        return indexPath;
-    }
-
-    public void initializeReplicaIndexLSNMap(String indexPath, long currentLSN) throws IOException {
-        HashMap<Long, Long> lsnMap = new HashMap<Long, Long>();
-        lsnMap.put(REPLICA_INDEX_CREATION_LSN, currentLSN);
-        updateReplicaIndexLSNMap(indexPath, lsnMap);
-    }
-
-    public void createRemoteLSMComponentMask(LSMComponentProperties lsmComponentProperties) throws IOException {
-        String maskPath = lsmComponentProperties.getMaskPath(this);
-        Path path = Paths.get(maskPath);
-        if (!Files.exists(path)) {
-            File maskFile = new File(maskPath);
-            maskFile.createNewFile();
-        }
-    }
-
-    public void markLSMComponentReplicaAsValid(LSMComponentProperties lsmComponentProperties) throws IOException {
-        //remove mask to mark component as valid
-        String maskPath = lsmComponentProperties.getMaskPath(this);
-        Path path = Paths.get(maskPath);
-        Files.deleteIfExists(path);
-
-        //add component LSN to the index LSNs map
-        Map<Long, Long> lsnMap = getReplicaIndexLSNMap(lsmComponentProperties.getReplicaComponentPath(this));
-        lsnMap.put(lsmComponentProperties.getOriginalLSN(), lsmComponentProperties.getReplicaLSN());
-
-        //update map on disk
-        updateReplicaIndexLSNMap(lsmComponentProperties.getReplicaComponentPath(this), lsnMap);
-    }
-
-    public Set<File> getReplicaIndexes(String replicaId) {
-        Set<File> remoteIndexesPaths = new HashSet<File>();
-        ClusterPartition[] partitions = nodePartitions.get(replicaId);
-        for (ClusterPartition partition : partitions) {
-            remoteIndexesPaths.addAll(getPartitionIndexes(partition.getPartitionId()));
-        }
-        return remoteIndexesPaths;
-    }
-
-    @Override
-    public long getPartitionsMinLSN(Set<Integer> partitions) {
-        long minRemoteLSN = Long.MAX_VALUE;
-        for (Integer partition : partitions) {
-            //for every index in replica
-            Set<File> remoteIndexes = getPartitionIndexes(partition);
-            for (File indexFolder : remoteIndexes) {
-                //read LSN map
-                try {
-                    //get max LSN per index
-                    long remoteIndexMaxLSN = getReplicaIndexMaxLSN(indexFolder);
-
-                    //get min of all maximums
-                    minRemoteLSN = Math.min(minRemoteLSN, remoteIndexMaxLSN);
-                } catch (IOException e) {
-                    LOGGER.log(Level.INFO,
-                            indexFolder.getAbsolutePath() + " Couldn't read LSN map for index " + indexFolder);
-                    continue;
-                }
-            }
-        }
-        return minRemoteLSN;
-    }
-
-    public Map<Long, String> getLaggingReplicaIndexesId2PathMap(String replicaId, long targetLSN) throws IOException {
-        Map<Long, String> laggingReplicaIndexes = new HashMap<Long, String>();
-        try {
-            //for every index in replica
-            Set<File> remoteIndexes = getReplicaIndexes(replicaId);
-            for (File indexFolder : remoteIndexes) {
-                if (getReplicaIndexMaxLSN(indexFolder) < targetLSN) {
-                    File localResource = new File(
-                            indexFolder + File.separator + PersistentLocalResourceRepository.METADATA_FILE_NAME);
-                    LocalResource resource = PersistentLocalResourceRepository.readLocalResource(localResource);
-                    laggingReplicaIndexes.put(resource.getId(), indexFolder.getAbsolutePath());
-                }
-            }
-        } catch (HyracksDataException e) {
-            e.printStackTrace();
-        }
-
-        return laggingReplicaIndexes;
-    }
-
-    private long getReplicaIndexMaxLSN(File indexFolder) throws IOException {
-        long remoteIndexMaxLSN = 0;
-        //get max LSN per index
-        Map<Long, Long> lsnMap = getReplicaIndexLSNMap(indexFolder.getAbsolutePath());
-        if (lsnMap != null) {
-            for (Long lsn : lsnMap.values()) {
-                remoteIndexMaxLSN = Math.max(remoteIndexMaxLSN, lsn);
-            }
-        }
-        return remoteIndexMaxLSN;
-    }
-
-    public void cleanInvalidLSMComponents(String replicaId) {
-        //for every index in replica
-        Set<File> remoteIndexes = getReplicaIndexes(replicaId);
-        for (File remoteIndexFile : remoteIndexes) {
-            //search for any mask
-            File[] masks = remoteIndexFile.listFiles(LSM_COMPONENTS_MASKS_FILTER);
-
-            for (File mask : masks) {
-                //delete all files belonging to this mask
-                deleteLSMComponentFilesForMask(mask);
-                //delete the mask itself
-                mask.delete();
-            }
-        }
-    }
-
-    private static void deleteLSMComponentFilesForMask(File maskFile) {
-        String lsmComponentTimeStamp = maskFile.getName().substring(0,
-                maskFile.getName().length() - LSM_COMPONENT_MASK_SUFFIX.length());
-        File indexFolder = maskFile.getParentFile();
-        File[] lsmComponentsFiles = indexFolder.listFiles(LSM_COMPONENTS_NON_MASKS_FILTER);
-        for (File lsmComponentFile : lsmComponentsFiles) {
-            if (lsmComponentFile.getName().contains(lsmComponentTimeStamp)) {
-                //match based on time stamp
-                lsmComponentFile.delete();
-            }
-        }
-    }
-
-    @SuppressWarnings({ "unchecked" })
-    public synchronized Map<Long, Long> getReplicaIndexLSNMap(String indexPath) throws IOException {
-        try (FileInputStream fis = new FileInputStream(indexPath + File.separator + REPLICA_INDEX_LSN_MAP_NAME);
-                ObjectInputStream oisFromFis = new ObjectInputStream(fis)) {
-            Map<Long, Long> lsnMap = null;
-            try {
-                lsnMap = (Map<Long, Long>) oisFromFis.readObject();
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            }
-            return lsnMap;
-        }
-    }
-
-    public synchronized void updateReplicaIndexLSNMap(String indexPath, Map<Long, Long> lsnMap) throws IOException {
-        try (FileOutputStream fos = new FileOutputStream(indexPath + File.separator + REPLICA_INDEX_LSN_MAP_NAME);
-                ObjectOutputStream oosToFos = new ObjectOutputStream(fos)) {
-            oosToFos.writeObject(lsnMap);
-            oosToFos.flush();
-        }
-    }
-
-    /**
-     * @param partition
-     * @return Set of file references to each index in the partition
-     */
-    public Set<File> getPartitionIndexes(int partition) {
-        Set<File> partitionIndexes = new HashSet<File>();
-        String storageDirName = ClusterProperties.INSTANCE.getStorageDirectoryName();
-        String partitionStoragePath = localRepository.getPartitionPath(partition)
-                + StoragePathUtil.prepareStoragePartitionPath(storageDirName, partition);
-        File partitionRoot = new File(partitionStoragePath);
-        if (partitionRoot.exists() && partitionRoot.isDirectory()) {
-            File[] dataverseFileList = partitionRoot.listFiles();
-            if (dataverseFileList != null) {
-                for (File dataverseFile : dataverseFileList) {
-                    if (dataverseFile.isDirectory()) {
-                        File[] indexFileList = dataverseFile.listFiles();
-                        if (indexFileList != null) {
-                            for (File indexFile : indexFileList) {
-                                if (indexFile.isDirectory()) {
-                                    partitionIndexes.add(indexFile);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return partitionIndexes;
-    }
-
-    /**
-     * @param partition
-     * @return Absolute paths to all partition files
-     */
-    public List<String> getPartitionIndexesFiles(int partition, boolean relativePath) {
-        List<String> partitionFiles = new ArrayList<String>();
-        Set<File> partitionIndexes = getPartitionIndexes(partition);
-        for (File indexDir : partitionIndexes) {
-            if (indexDir.isDirectory()) {
-                File[] indexFiles = indexDir.listFiles(LSM_INDEX_FILES_FILTER);
-                if (indexFiles != null) {
-                    for (File file : indexFiles) {
-                        if (!relativePath) {
-                            partitionFiles.add(file.getAbsolutePath());
-                        } else {
-                            partitionFiles.add(
-                                    StoragePathUtil.getIndexFileRelativePath(file.getAbsolutePath()));
-                        }
-                    }
-                }
-            }
-        }
-        return partitionFiles;
-    }
-
-    private static final FilenameFilter LSM_COMPONENTS_MASKS_FILTER = new FilenameFilter() {
-        @Override
-        public boolean accept(File dir, String name) {
-            return name.endsWith(LSM_COMPONENT_MASK_SUFFIX);
-        }
-    };
-
-    private static final FilenameFilter LSM_COMPONENTS_NON_MASKS_FILTER = new FilenameFilter() {
-        @Override
-        public boolean accept(File dir, String name) {
-            return !name.endsWith(LSM_COMPONENT_MASK_SUFFIX);
-        }
-    };
-
-    private static final FilenameFilter LSM_INDEX_FILES_FILTER = new FilenameFilter() {
-        @Override
-        public boolean accept(File dir, String name) {
-            return name.equalsIgnoreCase(PersistentLocalResourceRepository.METADATA_FILE_NAME) || !name.startsWith(".");
-        }
-    };
-}
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/FileSynchronizer.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/FileSynchronizer.java
new file mode 100644
index 0000000..cc0f7b4
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/FileSynchronizer.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.sync;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.nio.channels.SocketChannel;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.exceptions.ReplicationException;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.replication.management.NetworkingUtil;
+import org.apache.asterix.replication.messaging.DeleteFileTask;
+import org.apache.asterix.replication.messaging.ReplicateFileTask;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.io.IIOManager;
+
+public class FileSynchronizer {
+
+    private final INcApplicationContext appCtx;
+    private final PartitionReplica replica;
+
+    public FileSynchronizer(INcApplicationContext appCtx, PartitionReplica replica) {
+        this.appCtx = appCtx;
+        this.replica = replica;
+    }
+
+    public void replicate(String file) {
+        replicate(file, false);
+    }
+
+    public void replicate(String file, boolean metadata) {
+        try {
+            final IIOManager ioManager = appCtx.getIoManager();
+            final SocketChannel channel = replica.getChannel();
+            final FileReference filePath = ioManager.resolve(file);
+            ReplicateFileTask task = new ReplicateFileTask(file, filePath.getFile().length(), metadata);
+            ReplicationProtocol.sendTo(replica, task);
+            // send the file itself
+            try (RandomAccessFile fromFile = new RandomAccessFile(filePath.getFile(), "r");
+                    FileChannel fileChannel = fromFile.getChannel()) {
+                NetworkingUtil.sendFile(fileChannel, channel);
+            }
+            ReplicationProtocol.waitForAck(replica);
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+
+    public void delete(String file) {
+        try {
+            final DeleteFileTask task = new DeleteFileTask(file);
+            ReplicationProtocol.sendTo(replica, task);
+            ReplicationProtocol.waitForAck(replica);
+        } catch (IOException e) {
+            throw new ReplicationException(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/IndexSynchronizer.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/IndexSynchronizer.java
new file mode 100644
index 0000000..95ae690
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/IndexSynchronizer.java
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.sync;
+
+import static org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation.DELETE;
+import static org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation.REPLICATE;
+
+import java.io.IOException;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
+import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.asterix.replication.messaging.ComponentMaskTask;
+import org.apache.asterix.replication.messaging.DropIndexTask;
+import org.apache.asterix.replication.messaging.MarkComponentValidTask;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.replication.IReplicationJob;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexReplicationJob;
+import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class IndexSynchronizer {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final IReplicationJob job;
+    private final INcApplicationContext appCtx;
+
+    public IndexSynchronizer(IReplicationJob job, INcApplicationContext appCtx) {
+        this.job = job;
+        this.appCtx = appCtx;
+    }
+
+    public void sync(PartitionReplica replica) throws IOException {
+        switch (job.getJobType()) {
+            case LSM_COMPONENT:
+                syncComponent(replica);
+                break;
+            case METADATA:
+                syncMetadata(replica);
+                break;
+            default:
+                throw new IllegalStateException("unrecognized job type: " + job.getJobType().name());
+        }
+    }
+
+    private void syncComponent(PartitionReplica replica) throws IOException {
+        if (job.getOperation() == REPLICATE) {
+            replicateComponent(replica);
+        } else if (job.getOperation() == DELETE) {
+            deleteComponent(replica);
+        }
+    }
+
+    private void syncMetadata(PartitionReplica replica) throws IOException {
+        if (job.getOperation() == REPLICATE) {
+            replicateIndexMetadata(replica);
+        } else if (job.getOperation() == DELETE) {
+            deleteIndexMetadata(replica);
+        }
+    }
+
+    private void replicateComponent(PartitionReplica replica) throws IOException {
+        // send component header
+        final String anyFile = job.getAnyFile();
+        final String indexFile = StoragePathUtil.getFileRelativePath(anyFile);
+        final ComponentMaskTask maskTask = new ComponentMaskTask(indexFile);
+        ReplicationProtocol.sendTo(replica, maskTask);
+        ReplicationProtocol.waitForAck(replica);
+        // send component files
+        final FileSynchronizer fileSynchronizer = new FileSynchronizer(appCtx, replica);
+        job.getJobFiles().stream().map(StoragePathUtil::getFileRelativePath).forEach(fileSynchronizer::replicate);
+        // send mark component valid
+        MarkComponentValidTask markValidTask = new MarkComponentValidTask(indexFile, getReplicatedComponentLsn());
+        ReplicationProtocol.sendTo(replica, markValidTask);
+        ReplicationProtocol.waitForAck(replica);
+        LOGGER.debug("Replicated component ({}) to replica {}", indexFile, replica);
+    }
+
+    private void deleteComponent(PartitionReplica replica) {
+        FileSynchronizer fileSynchronizer = new FileSynchronizer(appCtx, replica);
+        job.getJobFiles().stream().map(StoragePathUtil::getFileRelativePath).forEach(fileSynchronizer::delete);
+    }
+
+    private void replicateIndexMetadata(PartitionReplica replica) {
+        // send the index metadata file
+        final FileSynchronizer fileSynchronizer = new FileSynchronizer(appCtx, replica);
+        job.getJobFiles().stream().map(StoragePathUtil::getFileRelativePath)
+                .forEach(file -> fileSynchronizer.replicate(file, true));
+    }
+
+    private void deleteIndexMetadata(PartitionReplica replica) throws IOException {
+        final String file = StoragePathUtil.getFileRelativePath(job.getAnyFile());
+        final DropIndexTask task = new DropIndexTask(file);
+        ReplicationProtocol.sendTo(replica, task);
+        ReplicationProtocol.waitForAck(replica);
+    }
+
+    private long getReplicatedComponentLsn() throws HyracksDataException {
+        final ILSMIndexReplicationJob indexReplJob = (ILSMIndexReplicationJob) job;
+        if (indexReplJob.getLSMOpType() != LSMOperationType.FLUSH) {
+            return AbstractLSMIOOperationCallback.INVALID;
+        }
+        final ILSMIndex lsmIndex = indexReplJob.getLSMIndex();
+        final ILSMIndexOperationContext ctx = indexReplJob.getLSMIndexOperationContext();
+        return ((AbstractLSMIOOperationCallback) lsmIndex.getIOOperationCallback())
+                .getComponentLSN(ctx.getComponentsToBeReplicated());
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaFilesSynchronizer.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaFilesSynchronizer.java
new file mode 100644
index 0000000..5658779
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaFilesSynchronizer.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.sync;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.utils.StoragePathUtil;
+import org.apache.asterix.replication.api.PartitionReplica;
+import org.apache.asterix.replication.messaging.PartitionResourcesListResponse;
+import org.apache.asterix.replication.messaging.PartitionResourcesListTask;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
+
+/**
+ * Ensures that the files between master and a replica are synchronized
+ */
+public class ReplicaFilesSynchronizer {
+
+    private final PartitionReplica replica;
+    private final INcApplicationContext appCtx;
+
+    public ReplicaFilesSynchronizer(INcApplicationContext appCtx, PartitionReplica replica) {
+        this.appCtx = appCtx;
+        this.replica = replica;
+    }
+
+    public void sync() throws IOException {
+        final int partition = replica.getIdentifier().getPartition();
+        final Set<String> replicaFiles = getReplicaFiles(partition);
+        final PersistentLocalResourceRepository localResourceRepository =
+                (PersistentLocalResourceRepository) appCtx.getLocalResourceRepository();
+        final Set<String> masterFiles = localResourceRepository.getPartitionIndexesFiles(partition).stream()
+                .map(StoragePathUtil::getFileRelativePath).collect(Collectors.toSet());
+        // find files on master and not on replica
+        final List<String> replicaMissingFiles =
+                masterFiles.stream().filter(file -> !replicaFiles.contains(file)).collect(Collectors.toList());
+        replicateMissingFiles(replicaMissingFiles);
+        // find files on replica and not on master
+        final List<String> replicaInvalidFiles =
+                replicaFiles.stream().filter(file -> !masterFiles.contains(file)).collect(Collectors.toList());
+        deleteInvalidFiles(replicaInvalidFiles);
+    }
+
+    private Set<String> getReplicaFiles(int partition) throws IOException {
+        final PartitionResourcesListTask replicaFilesRequest = new PartitionResourcesListTask(partition);
+        final SocketChannel channel = replica.getChannel();
+        final ByteBuffer reusableBuffer = replica.getReusableBuffer();
+        ReplicationProtocol.sendTo(replica, replicaFilesRequest);
+        final PartitionResourcesListResponse response =
+                (PartitionResourcesListResponse) ReplicationProtocol.read(channel, reusableBuffer);
+        return new HashSet<>(response.getResources());
+    }
+
+    private void replicateMissingFiles(List<String> files) {
+        final FileSynchronizer sync = new FileSynchronizer(appCtx, replica);
+        files.forEach(sync::replicate);
+    }
+
+    private void deleteInvalidFiles(List<String> files) {
+        final FileSynchronizer sync = new FileSynchronizer(appCtx, replica);
+        files.forEach(sync::delete);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaSynchronizer.java b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaSynchronizer.java
new file mode 100644
index 0000000..9f397d2
--- /dev/null
+++ b/asterixdb/asterix-replication/src/main/java/org/apache/asterix/replication/sync/ReplicaSynchronizer.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.replication.sync;
+
+import java.io.IOException;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.replication.IReplicationStrategy;
+import org.apache.asterix.replication.messaging.ReplicationProtocol;
+import org.apache.asterix.replication.messaging.CheckpointPartitionIndexesTask;
+import org.apache.asterix.replication.api.PartitionReplica;
+
+/**
+ * Performs the steps required to ensure any newly added replica
+ * will be in-sync with master
+ */
+public class ReplicaSynchronizer {
+
+    private final INcApplicationContext appCtx;
+    private final PartitionReplica replica;
+
+    public ReplicaSynchronizer(INcApplicationContext appCtx, PartitionReplica replica) {
+        this.appCtx = appCtx;
+        this.replica = replica;
+    }
+
+    public void sync() throws IOException {
+        syncFiles();
+        checkpointReplicaIndexes();
+        appCtx.getReplicationManager().register(replica);
+    }
+
+    private void syncFiles() throws IOException {
+        final ReplicaFilesSynchronizer fileSync = new ReplicaFilesSynchronizer(appCtx, replica);
+        fileSync.sync();
+        // flush replicated dataset to generate disk component for any remaining in-memory components
+        final IReplicationStrategy replStrategy = appCtx.getReplicationManager().getReplicationStrategy();
+        appCtx.getDatasetLifecycleManager().flushDataset(replStrategy);
+        // sync any newly generated files
+        fileSync.sync();
+    }
+
+    private void checkpointReplicaIndexes() throws IOException {
+        CheckpointPartitionIndexesTask task =
+                new CheckpointPartitionIndexesTask(replica.getIdentifier().getPartition());
+        ReplicationProtocol.sendTo(replica, task);
+        ReplicationProtocol.waitForAck(replica);
+    }
+}
diff --git a/asterixdb/asterix-replication/src/test/resources/data/fbu.adm b/asterixdb/asterix-replication/src/test/resources/data/fbu.adm
deleted file mode 100644
index 7e99ea4..0000000
--- a/asterixdb/asterix-replication/src/test/resources/data/fbu.adm
+++ /dev/null
@@ -1,10 +0,0 @@
-{"id":1,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]}
-{"id":2,"alias":"Isbel","name":"IsbelDull","user-since":datetime("2011-01-22T10:10:00"),"friend-ids":{{1,4}},"employment":[{"organization-name":"Hexviafind","start-date":date("2010-04-27")}]}
-{"id":3,"alias":"Emory","name":"EmoryUnk","user-since":datetime("2012-07-10T10:10:00"),"friend-ids":{{1,5,8,9}},"employment":[{"organization-name":"geomedia","start-date":date("2010-06-17"),"end-date":date("2010-01-26")}]}
-{"id":4,"alias":"Nicholas","name":"NicholasStroh","user-since":datetime("2010-12-27T10:10:00"),"friend-ids":{{2}},"employment":[{"organization-name":"Zamcorporation","start-date":date("2010-06-08")}]}
-{"id":5,"alias":"Von","name":"VonKemble","user-since":datetime("2010-01-05T10:10:00"),"friend-ids":{{3,6,10}},"employment":[{"organization-name":"Kongreen","start-date":date("2010-11-27")}]}
-{"id":6,"alias":"Willis","name":"WillisWynne","user-since":datetime("2005-01-17T10:10:00"),"friend-ids":{{1,3,7}},"employment":[{"organization-name":"jaydax","start-date":date("2009-05-15")}]}
-{"id":7,"alias":"Suzanna","name":"SuzannaTillson","user-since":datetime("2012-08-07T10:10:00"),"friend-ids":{{6}},"employment":[{"organization-name":"Labzatron","start-date":date("2011-04-19")}]}
-{"id":8,"alias":"Nila","name":"NilaMilliron","user-since":datetime("2008-01-01T10:10:00"),"friend-ids":{{3}},"employment":[{"organization-name":"Plexlane","start-date":date("2010-02-28")}]}
-{"id":9,"alias":"Woodrow","name":"WoodrowNehling","user-since":datetime("2005-09-20T10:10:00"),"friend-ids":{{3,10}},"employment":[{"organization-name":"Zuncan","start-date":date("2003-04-22"),"end-date":date("2009-12-13")}]}
-{"id":10,"alias":"Bram","name":"BramHatch","user-since":datetime("2010-10-16T10:10:00"),"friend-ids":{{1,5,9}},"employment":[{"organization-name":"physcane","start-date":date("2007-06-05"),"end-date":date("2011-11-05")}]}
diff --git a/asterixdb/asterix-replication/src/test/resources/scripts/kill_cc_and_nc.sh b/asterixdb/asterix-replication/src/test/resources/scripts/kill_cc_and_nc.sh
index 4b876be..9c6b9f5 100755
--- a/asterixdb/asterix-replication/src/test/resources/scripts/kill_cc_and_nc.sh
+++ b/asterixdb/asterix-replication/src/test/resources/scripts/kill_cc_and_nc.sh
@@ -16,3 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-runtime/pom.xml b/asterixdb/asterix-runtime/pom.xml
index 0bd3f05..239b01a 100644
--- a/asterixdb/asterix-runtime/pom.xml
+++ b/asterixdb/asterix-runtime/pom.xml
@@ -25,7 +25,7 @@
   </parent>
   <artifactId>asterix-runtime</artifactId>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
   <licenses>
     <license>
@@ -198,5 +198,9 @@
       <version>1.10.19</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/scalar/AbstractScalarAggregateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/scalar/AbstractScalarAggregateDescriptor.java
index 643098f..e929f0f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/scalar/AbstractScalarAggregateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/scalar/AbstractScalarAggregateDescriptor.java
@@ -55,8 +55,8 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 // Use ScanCollection to iterate over list items.
-                ScanCollectionUnnestingFunctionFactory scanCollectionFactory = new ScanCollectionUnnestingFunctionFactory(
-                        args[0]);
+                ScanCollectionUnnestingFunctionFactory scanCollectionFactory =
+                        new ScanCollectionUnnestingFunctionFactory(args[0]);
                 return new GenericScalarAggregateFunction(aggFuncFactory.createAggregateEvaluator(ctx),
                         scanCollectionFactory, ctx);
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableAvgAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableAvgAggregateFunction.java
index 8fad5e8..db12b85 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableAvgAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableAvgAggregateFunction.java
@@ -81,14 +81,14 @@
     private ClosedRecordConstructorEval recordEval;
 
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+    private ISerializerDeserializer<ADouble> doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<AInt64> longSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<AInt64> longSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    private ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     public AbstractSerializableAvgAggregateFunction(IScalarEvaluatorFactory[] args, IHyracksTaskContext context)
             throws HyracksDataException {
@@ -194,7 +194,7 @@
         try {
             if (aggType == ATypeTag.SYSTEM_NULL) {
                 if (GlobalConfig.DEBUG) {
-                    GlobalConfig.ASTERIX_LOGGER.finest("AVG aggregate ran over empty input.");
+                    GlobalConfig.ASTERIX_LOGGER.trace("AVG aggregate ran over empty input.");
                 }
                 result.writeByte(ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
             } else if (aggType == ATypeTag.NULL) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableCountAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableCountAggregateFunction.java
index b010735..9a7cc98 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableCountAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/AbstractSerializableCountAggregateFunction.java
@@ -47,11 +47,11 @@
 
     private AMutableInt64 result = new AMutableInt64(-1);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<AInt64> int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    private ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
     private IPointable inputVal = new VoidPointable();
     private IScalarEvaluator eval;
 
@@ -75,8 +75,8 @@
         boolean metNull = BufferSerDeUtil.getBoolean(state, start);
         long cnt = BufferSerDeUtil.getLong(state, start + 1);
         eval.evaluate(tuple, inputVal);
-        ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
+        ATypeTag typeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
         if (typeTag == ATypeTag.MISSING || typeTag == ATypeTag.NULL) {
             processNull(state, start);
         } else {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSqlSumAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSqlSumAggregateFunction.java
index 4c42f98..c42c350 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSqlSumAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSqlSumAggregateFunction.java
@@ -50,8 +50,7 @@
         // but if all input value are system null, then we should return
         // null in finish().
         if (isLocalAgg) {
-            throw new UnsupportedItemTypeException(BuiltinFunctions.SQL_SUM,
-                    ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
+            throw new UnsupportedItemTypeException(BuiltinFunctions.SQL_SUM, ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
         }
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSumAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSumAggregateFunction.java
index c4f85a2..60e34fa 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSumAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/serializable/std/SerializableSumAggregateFunction.java
@@ -58,8 +58,7 @@
         // but if all input value are system null, then we should return
         // null in finish().
         if (isLocalAgg) {
-            throw new UnsupportedItemTypeException(BuiltinFunctions.SUM,
-                    ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
+            throw new UnsupportedItemTypeException(BuiltinFunctions.SUM, ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
         }
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractAvgAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractAvgAggregateFunction.java
index 60e7127..bf45c0b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractAvgAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractAvgAggregateFunction.java
@@ -84,14 +84,14 @@
     private ClosedRecordConstructorEval recordEval;
 
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+    private ISerializerDeserializer<ADouble> doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<AInt64> longSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<AInt64> longSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    private ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     public AbstractAvgAggregateFunction(IScalarEvaluatorFactory[] args, IHyracksTaskContext context)
             throws HyracksDataException {
@@ -182,7 +182,7 @@
             // Double check that count 0 is accounted
             if (aggType == ATypeTag.SYSTEM_NULL) {
                 if (GlobalConfig.DEBUG) {
-                    GlobalConfig.ASTERIX_LOGGER.finest("AVG aggregate ran over empty input.");
+                    GlobalConfig.ASTERIX_LOGGER.trace("AVG aggregate ran over empty input.");
                 }
                 resultStorage.getDataOutput().writeByte(ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
                 result.set(resultStorage);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractCountAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractCountAggregateFunction.java
index bd0243b..38e8d8b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractCountAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractCountAggregateFunction.java
@@ -43,8 +43,8 @@
 public abstract class AbstractCountAggregateFunction implements IAggregateEvaluator {
     private AMutableInt64 result = new AMutableInt64(-1);
     @SuppressWarnings("unchecked")
-    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    private ISerializerDeserializer<AInt64> int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     private IPointable inputVal = new VoidPointable();
     private IScalarEvaluator eval;
     protected long cnt;
@@ -64,8 +64,8 @@
     @Override
     public void step(IFrameTupleReference tuple) throws HyracksDataException {
         eval.evaluate(tuple, inputVal);
-        ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
+        ATypeTag typeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
         // Ignore SYSTEM_NULL.
         if (typeTag == ATypeTag.NULL || typeTag == ATypeTag.MISSING) {
             processNull();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractMinMaxAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractMinMaxAggregateFunction.java
index b7c70aa..32c40e6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractMinMaxAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/AbstractMinMaxAggregateFunction.java
@@ -68,8 +68,8 @@
             return;
         }
         eval.evaluate(tuple, inputVal);
-        ATypeTag typeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
+        ATypeTag typeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(inputVal.getByteArray()[inputVal.getStartOffset()]);
         if (typeTag == ATypeTag.MISSING || typeTag == ATypeTag.NULL) {
             processNull();
             return;
@@ -81,8 +81,8 @@
             // First value encountered. Set type, comparator, and initial value.
             aggType = typeTag;
             // Set comparator.
-            IBinaryComparatorFactory cmpFactory = BinaryComparatorFactoryProvider.INSTANCE
-                    .getBinaryComparatorFactory(aggType, isMin);
+            IBinaryComparatorFactory cmpFactory =
+                    BinaryComparatorFactoryProvider.INSTANCE.getBinaryComparatorFactory(aggType, isMin);
             cmp = cmpFactory.createBinaryComparator();
             // Initialize min value.
             outputVal.assign(inputVal);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SqlSumAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SqlSumAggregateFunction.java
index 09e8822..663ed69 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SqlSumAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SqlSumAggregateFunction.java
@@ -49,8 +49,7 @@
         // but if all input value are system null, then we should return
         // null in finish().
         if (isLocalAgg) {
-            throw new UnsupportedItemTypeException(BuiltinFunctions.SQL_SUM,
-                    ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
+            throw new UnsupportedItemTypeException(BuiltinFunctions.SQL_SUM, ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
         }
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SumAggregateFunction.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SumAggregateFunction.java
index d406846..2b3beef 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SumAggregateFunction.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/std/SumAggregateFunction.java
@@ -55,8 +55,7 @@
         // but if all input value are system null, then we should return
         // null in finish().
         if (isLocalAgg) {
-            throw new UnsupportedItemTypeException(BuiltinFunctions.SUM,
-                    ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
+            throw new UnsupportedItemTypeException(BuiltinFunctions.SUM, ATypeTag.SERIALIZED_SYSTEM_NULL_TYPE_TAG);
         }
     }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/EmptyStreamAggregateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/EmptyStreamAggregateDescriptor.java
index 66d81f6..dc2b355 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/EmptyStreamAggregateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/EmptyStreamAggregateDescriptor.java
@@ -62,8 +62,8 @@
 
                     private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     @SuppressWarnings("rawtypes")
-                    private ISerializerDeserializer serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     boolean res = true;
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/NonEmptyStreamAggregateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/NonEmptyStreamAggregateDescriptor.java
index 2c8f409..e9330d3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/NonEmptyStreamAggregateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/aggregates/stream/NonEmptyStreamAggregateDescriptor.java
@@ -60,8 +60,8 @@
 
                     private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     @SuppressWarnings("rawtypes")
-                    private ISerializerDeserializer serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     boolean res = false;
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
index 857ac2e..e10bd07 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleCenterAccessor.java
@@ -72,8 +72,8 @@
                     private final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     private final AMutablePoint aPoint = new AMutablePoint(0, 0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<APoint> pointSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.APOINT);
+                    private final ISerializerDeserializer<APoint> pointSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.APOINT);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
index fcc0b0a..2fc24e4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/CircleRadiusAccessor.java
@@ -70,8 +70,8 @@
                     private final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     private final AMutableDouble aDouble = new AMutableDouble(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+                    private final ISerializerDeserializer<ADouble> doubleSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
index 7330cc1..66de80a 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/LineRectanglePolygonAccessor.java
@@ -80,8 +80,8 @@
                     private final AOrderedListType pointListType = new AOrderedListType(BuiltinType.APOINT, null);
                     private final AMutablePoint aPoint = new AMutablePoint(0, 0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<APoint> pointSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.APOINT);
+                    private final ISerializerDeserializer<APoint> pointSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.APOINT);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
index a90e6c63..0aa38f3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointXCoordinateAccessor.java
@@ -70,8 +70,8 @@
                     private final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     private final AMutableDouble aDouble = new AMutableDouble(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+                    private final ISerializerDeserializer<ADouble> doubleSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
index 5a0840c..cfaa5d5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/PointYCoordinateAccessor.java
@@ -74,8 +74,8 @@
                     private final IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     private final AMutableDouble aDouble = new AMutableDouble(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADouble> doubleSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+                    private final ISerializerDeserializer<ADouble> doubleSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
index c19acde..4e62659 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalDayAccessor.java
@@ -79,8 +79,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
index 08bb71d..7ba57f9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalHourAccessor.java
@@ -81,8 +81,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
index d3ac99b..0d5d01c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndAccessor.java
@@ -75,16 +75,16 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private final ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private final AMutableDate aDate = new AMutableDate(0);
                     @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<ADateTime> datetimeSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
                     private final AMutableDateTime aDateTime = new AMutableDateTime(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private final ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private final AMutableTime aTime = new AMutableTime(0);
 
                     @Override
@@ -96,8 +96,8 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
                                 long endTime = AIntervalSerializerDeserializer.getIntervalEnd(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
                                     aDate.setValue((int) (endTime));
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
index 5c888eb..b83cbd1 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDateAccessor.java
@@ -71,8 +71,8 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private final ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private final AMutableDate aDate = new AMutableDate(0);
 
                     @Override
@@ -84,8 +84,8 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
                                 long endTime = AIntervalSerializerDeserializer.getIntervalEnd(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
                                     aDate.setValue((int) (endTime));
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
index 66e6e02..c806db1 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndDatetimeAccessor.java
@@ -86,8 +86,8 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
                                 long endTime = AIntervalSerializerDeserializer.getIntervalEnd(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATETIME_TYPE_TAG) {
                                     aDateTime.setValue(endTime);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
index 833079b..8131385 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalEndTimeAccessor.java
@@ -70,8 +70,8 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private final ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private final AMutableTime aTime = new AMutableTime(0);
 
                     @Override
@@ -83,8 +83,8 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
                                 long endTime = AIntervalSerializerDeserializer.getIntervalEnd(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_TIME_TYPE_TAG) {
                                     aTime.setValue((int) (endTime));
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
index 0c9639f..04da6d2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartAccessor.java
@@ -75,16 +75,16 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private final ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private final AMutableDate aDate = new AMutableDate(0);
                     @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<ADateTime> datetimeSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
                     private final AMutableDateTime aDateTime = new AMutableDateTime(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private final ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private final AMutableTime aTime = new AMutableTime(0);
 
                     @Override
@@ -96,10 +96,10 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
-                                long startTime = AIntervalSerializerDeserializer.getIntervalStart(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
+                                long startTime =
+                                        AIntervalSerializerDeserializer.getIntervalStart(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
                                     aDate.setValue((int) (startTime));
                                     dateSerde.serialize(aDate, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
index f3a6dfd..971fd13 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDateAccessor.java
@@ -73,8 +73,8 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private final ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private final AMutableDate aDate = new AMutableDate(0);
 
                     @Override
@@ -86,10 +86,10 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
-                                long startTime = AIntervalSerializerDeserializer.getIntervalStart(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
+                                long startTime =
+                                        AIntervalSerializerDeserializer.getIntervalStart(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATE_TYPE_TAG) {
                                     aDate.setValue((int) (startTime));
                                     dateSerde.serialize(aDate, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
index 61aeaff..d785e90 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartDatetimeAccessor.java
@@ -83,10 +83,10 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
-                                long startTime = AIntervalSerializerDeserializer.getIntervalStart(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
+                                long startTime =
+                                        AIntervalSerializerDeserializer.getIntervalStart(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_DATETIME_TYPE_TAG) {
                                     aDateTime.setValue(startTime);
                                     datetimeSerde.serialize(aDateTime, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
index 649f7b9..2075b95 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalIntervalStartTimeAccessor.java
@@ -71,8 +71,8 @@
 
                     // possible output
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private final ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private final AMutableTime aTime = new AMutableTime(0);
 
                     @Override
@@ -84,10 +84,10 @@
                         resultStorage.reset();
                         try {
                             if (bytes[startOffset] == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG) {
-                                byte timeType = AIntervalSerializerDeserializer.getIntervalTimeType(bytes,
-                                        startOffset + 1);
-                                long startTime = AIntervalSerializerDeserializer.getIntervalStart(bytes,
-                                        startOffset + 1);
+                                byte timeType =
+                                        AIntervalSerializerDeserializer.getIntervalTimeType(bytes, startOffset + 1);
+                                long startTime =
+                                        AIntervalSerializerDeserializer.getIntervalStart(bytes, startOffset + 1);
                                 if (timeType == ATypeTag.SERIALIZED_TIME_TYPE_TAG) {
                                     aTime.setValue((int) (startTime));
                                     timeSerde.serialize(aTime, out);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
index 9777d0a..292f410 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMillisecondAccessor.java
@@ -79,8 +79,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
index eb264e1..a92344b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMinuteAccessor.java
@@ -82,8 +82,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
index da8333b..bbdc9a0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalMonthAccessor.java
@@ -79,8 +79,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
index f8c3816..ecee642 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalSecondAccessor.java
@@ -79,8 +79,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
index 37ac977..49d841c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/accessors/TemporalYearAccessor.java
@@ -80,8 +80,8 @@
 
                     // for output: type integer
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aMutableInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
index 0782f06..32196e5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/CreateMBREvalFactory.java
@@ -327,10 +327,10 @@
                                 }
                                 break;
                             default:
-                                throw new TypeMismatchException(BuiltinFunctions.CREATE_MBR, 0,
-                                        data0[startOffset0], ATypeTag.SERIALIZED_POINT_TYPE_TAG,
-                                        ATypeTag.SERIALIZED_LINE_TYPE_TAG, ATypeTag.SERIALIZED_POLYGON_TYPE_TAG,
-                                        ATypeTag.SERIALIZED_CIRCLE_TYPE_TAG, ATypeTag.SERIALIZED_RECTANGLE_TYPE_TAG);
+                                throw new TypeMismatchException(BuiltinFunctions.CREATE_MBR, 0, data0[startOffset0],
+                                        ATypeTag.SERIALIZED_POINT_TYPE_TAG, ATypeTag.SERIALIZED_LINE_TYPE_TAG,
+                                        ATypeTag.SERIALIZED_POLYGON_TYPE_TAG, ATypeTag.SERIALIZED_CIRCLE_TYPE_TAG,
+                                        ATypeTag.SERIALIZED_RECTANGLE_TYPE_TAG);
                         }
                     } else {
                         throw new NotImplementedException(dimension + "D is not supported");
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
index b6e9ae9..dece292 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceCheckEvaluator.java
@@ -50,8 +50,8 @@
     protected final OrderedListBuilder listBuilder;
     protected ArrayBackedValueStorage listItemVal;
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected final ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
     public EditDistanceCheckEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext context)
             throws HyracksDataException {
@@ -65,11 +65,11 @@
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         firstStringEval.evaluate(tuple, argPtr1);
-        firstTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
+        firstTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
         secondStringEval.evaluate(tuple, argPtr2);
-        secondTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
+        secondTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
         edThreshEval.evaluate(tuple, argPtrThreshold);
 
         if (!checkArgTypes(firstTypeTag, secondTypeTag)) {
@@ -92,8 +92,7 @@
     }
 
     @Override
-    protected int computeResult(IPointable left, IPointable right, ATypeTag argType)
-            throws HyracksDataException {
+    protected int computeResult(IPointable left, IPointable right, ATypeTag argType) throws HyracksDataException {
         byte[] leftBytes = left.getByteArray();
         int leftStartOffset = left.getStartOffset();
         byte[] rightBytes = right.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
index 3df6e83..85fd334 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/EditDistanceEvaluator.java
@@ -59,8 +59,8 @@
     protected int editDistance = 0;
     protected final AMutableInt64 aInt64 = new AMutableInt64(-1);
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    protected final ISerializerDeserializer<AInt64> int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     protected ATypeTag itemTypeTag;
 
     protected ATypeTag firstTypeTag;
@@ -76,11 +76,11 @@
     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
         resultStorage.reset();
         firstStringEval.evaluate(tuple, argPtr1);
-        firstTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
+        firstTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
         secondStringEval.evaluate(tuple, argPtr2);
-        secondTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
+        secondTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
 
         if (!checkArgTypes(firstTypeTag, secondTypeTag)) {
             result.set(resultStorage);
@@ -96,8 +96,7 @@
         result.set(resultStorage);
     }
 
-    protected int computeResult(IPointable left, IPointable right, ATypeTag argType)
-            throws HyracksDataException {
+    protected int computeResult(IPointable left, IPointable right, ATypeTag argType) throws HyracksDataException {
         byte[] leftBytes = left.getByteArray();
         int leftStartOffset = left.getStartOffset();
         byte[] rightBytes = right.getByteArray();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
index a7160ac..3bd2587 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/FullTextContainsEvaluator.java
@@ -57,10 +57,10 @@
 
     protected final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
     protected final DataOutput out = resultStorage.getDataOutput();
-    protected final TaggedValuePointable argLeft = (TaggedValuePointable) TaggedValuePointable.FACTORY
-            .createPointable();
-    protected final TaggedValuePointable argRight = (TaggedValuePointable) TaggedValuePointable.FACTORY
-            .createPointable();
+    protected final TaggedValuePointable argLeft =
+            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+    protected final TaggedValuePointable argRight =
+            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
     protected TaggedValuePointable[] argOptions;
     protected final IScalarEvaluator evalLeft;
     protected final IScalarEvaluator evalRight;
@@ -335,6 +335,8 @@
      * for that option. (e.g., argOptions[0] = "mode", argOptions[1] = "all")
      */
     private void setFullTextOption(IPointable[] argOptions, int uniqueQueryTokenCount) throws HyracksDataException {
+        // By default, we conduct a conjunctive search.
+        occurrenceThreshold = uniqueQueryTokenCount;
         for (int i = 0; i < optionArgsLength; i = i + 2) {
             // mode option
             if (compareStrInByteArrayAndPointable(FullTextContainsDescriptor.getSearchModeOptionArray(), argOptions[i],
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityFiltersCache.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityFiltersCache.java
index 37b06af..4f5fb69 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityFiltersCache.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityFiltersCache.java
@@ -45,8 +45,8 @@
             bbis.setByteBuffer(ByteBuffer.wrap(similarityNameBytes), startOffset + 1);
             String similarityName = utf8SerDer.deserialize(dis);
             similarityNameBytesCached = Arrays.copyOfRange(similarityNameBytes, startOffset, len);
-            similarityFiltersCached = SimilarityFiltersFactory.getSimilarityFilters(similarityName,
-                    similarityThreshold);
+            similarityFiltersCached =
+                    SimilarityFiltersFactory.getSimilarityFilters(similarityName, similarityThreshold);
         }
         return similarityFiltersCached;
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
index 4f7a30f..60b5592 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardCheckEvaluator.java
@@ -48,8 +48,8 @@
     protected OrderedListBuilder listBuilder;
     protected ArrayBackedValueStorage inputVal;
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected final ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
     protected final AOrderedListType listType = new AOrderedListType(BuiltinType.ANY, "list");
 
     public SimilarityJaccardCheckEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext context)
@@ -68,15 +68,15 @@
         secondOrdListEval.evaluate(tuple, argPtr2);
         jaccThreshEval.evaluate(tuple, jaccThreshPointable);
 
-        firstTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
-        secondTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
+        firstTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
+        secondTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
 
-        firstItemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset() + 1]);
-        secondItemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset() + 1]);
+        firstItemTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset() + 1]);
+        secondItemTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset() + 1]);
 
         jaccThresh = AFloatSerializerDeserializer.getFloat(jaccThreshPointable.getByteArray(),
                 jaccThreshPointable.getStartOffset() + TYPE_INDICATOR_SIZE);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
index f69248d..1e5ad3c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/common/SimilarityJaccardEvaluator.java
@@ -73,8 +73,8 @@
 
     protected final AMutableFloat aFloat = new AMutableFloat(0);
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<AFloat> floatSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AFLOAT);
+    protected final ISerializerDeserializer<AFloat> floatSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT);
 
     protected ATypeTag firstTypeTag;
     protected ATypeTag secondTypeTag;
@@ -107,15 +107,15 @@
         firstOrdListEval.evaluate(tuple, argPtr1);
         secondOrdListEval.evaluate(tuple, argPtr2);
 
-        firstTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
-        secondTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
+        firstTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset()]);
+        secondTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset()]);
 
-        firstItemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset() + 1]);
-        secondItemTypeTag = EnumDeserializer.ATYPETAGDESERIALIZER
-                .deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset() + 1]);
+        firstItemTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr1.getByteArray()[argPtr1.getStartOffset() + 1]);
+        secondItemTypeTag =
+                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(argPtr2.getByteArray()[argPtr2.getStartOffset() + 1]);
 
         if (!checkArgTypes(firstTypeTag, secondTypeTag)) {
             result.set(resultStorage);
@@ -229,10 +229,10 @@
             return;
         }
 
-        IBinaryHashFunction putHashFunc = ListItemBinaryHashFunctionFactory.INSTANCE
-                .createBinaryHashFunction(buildItemTypeTag, ignoreCase);
-        IBinaryHashFunction getHashFunc = ListItemBinaryHashFunctionFactory.INSTANCE
-                .createBinaryHashFunction(probeItemTypeTag, ignoreCase);
+        IBinaryHashFunction putHashFunc =
+                ListItemBinaryHashFunctionFactory.INSTANCE.createBinaryHashFunction(buildItemTypeTag, ignoreCase);
+        IBinaryHashFunction getHashFunc =
+                ListItemBinaryHashFunctionFactory.INSTANCE.createBinaryHashFunction(probeItemTypeTag, ignoreCase);
         IBinaryComparator cmp = ListItemBinaryComparatorFactory.INSTANCE.createBinaryComparator(buildItemTypeTag,
                 probeItemTypeTag, ignoreCase);
         hashMap = new BinaryHashMap(hashTableSize, TABLE_FRAME_SIZE, putHashFunc, getHashFunc, cmp);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
index a1e60a6..620c543 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/AbstractComparisonEvaluator.java
@@ -52,11 +52,11 @@
     private ComparisonHelper ch = new ComparisonHelper();
 
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ABoolean> serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected ISerializerDeserializer<ABoolean> serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ANULL);
+    protected ISerializerDeserializer<ANull> nullSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
     public AbstractComparisonEvaluator(IScalarEvaluatorFactory evalLeftFactory,
             IScalarEvaluatorFactory evalRightFactory, IHyracksTaskContext context) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
index e4aa4ad..163bd9f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/ComparisonHelper.java
@@ -51,28 +51,28 @@
     private static final long serialVersionUID = 1L;
     static final String COMPARISON = "comparison operations (>, >=, <, and <=)";
 
-    private final IBinaryComparator strBinaryComp = BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator circleBinaryComp = ACirclePartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator durationBinaryComp = ADurationPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator intervalBinaryComp = AIntervalAscPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator lineBinaryComparator = ALinePartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator pointBinaryComparator = APointPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator point3DBinaryComparator = APoint3DPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator polygonBinaryComparator = APolygonPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator rectangleBinaryComparator = ARectanglePartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator uuidBinaryComparator = AUUIDPartialBinaryComparatorFactory.INSTANCE
-            .createBinaryComparator();
-    private final IBinaryComparator byteArrayComparator = new PointableBinaryComparatorFactory(
-            ByteArrayPointable.FACTORY).createBinaryComparator();
+    private final IBinaryComparator strBinaryComp =
+            BinaryComparatorFactoryProvider.UTF8STRING_POINTABLE_INSTANCE.createBinaryComparator();
+    private final IBinaryComparator circleBinaryComp =
+            ACirclePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator durationBinaryComp =
+            ADurationPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator intervalBinaryComp =
+            AIntervalAscPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator lineBinaryComparator =
+            ALinePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator pointBinaryComparator =
+            APointPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator point3DBinaryComparator =
+            APoint3DPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator polygonBinaryComparator =
+            APolygonPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator rectangleBinaryComparator =
+            ARectanglePartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator uuidBinaryComparator =
+            AUUIDPartialBinaryComparatorFactory.INSTANCE.createBinaryComparator();
+    private final IBinaryComparator byteArrayComparator =
+            new PointableBinaryComparatorFactory(ByteArrayPointable.FACTORY).createBinaryComparator();
 
     public int compare(ATypeTag typeTag1, ATypeTag typeTag2, IPointable arg1, IPointable arg2)
             throws HyracksDataException {
@@ -177,7 +177,7 @@
     private int compareStringWithArg(ATypeTag typeTag2, IPointable arg1, IPointable arg2) throws HyracksDataException {
         if (typeTag2 == ATypeTag.STRING) {
             return strBinaryComp.compare(arg1.getByteArray(), arg1.getStartOffset(), arg1.getLength() - 1,
-                        arg2.getByteArray(), arg2.getStartOffset(), arg2.getLength() - 1);
+                    arg2.getByteArray(), arg2.getStartOffset(), arg2.getLength() - 1);
         }
         throw new IncompatibleTypeException(COMPARISON, ATypeTag.SERIALIZED_STRING_TYPE_TAG, typeTag2.serialize());
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/DeepEqualAssessor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/DeepEqualAssessor.java
index 0c397f0..21b19aa 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/DeepEqualAssessor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/comparisons/DeepEqualAssessor.java
@@ -43,7 +43,7 @@
     private final DeepEqualityVisitor equalityVisitor = new DeepEqualityVisitor();
 
     public boolean isEqual(IVisitablePointable leftPointable, IVisitablePointable rightPointable)
-            throws HyracksDataException, AsterixException {
+            throws HyracksDataException {
         if (leftPointable == null || rightPointable == null) {
             return false;
         }
@@ -60,9 +60,9 @@
             if (ATypeHierarchy.isSameTypeDomain(leftTypeTag, rightTypeTag, false)
                     && ATypeHierarchy.getTypeDomain(leftTypeTag) == Domain.NUMERIC) {
                 double leftVal = ATypeHierarchy.getDoubleValue(DEEP_EQUAL, 0, leftPointable.getByteArray(),
-                            leftPointable.getStartOffset());
+                        leftPointable.getStartOffset());
                 double rightVal = ATypeHierarchy.getDoubleValue(DEEP_EQUAL, 1, rightPointable.getByteArray(),
-                            rightPointable.getStartOffset());
+                        rightPointable.getStartOffset());
                 return Math.abs(leftVal - rightVal) < EPSILON;
             } else {
                 return false;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
index 5b9a36b..9309591 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalConstructorDescriptor.java
@@ -74,8 +74,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
                     private AMutableInterval aInterval = new AMutableInterval(0L, 0L, (byte) 0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInterval> intervalSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINTERVAL);
+                    private ISerializerDeserializer<AInterval> intervalSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
index a8597c9..0e1942ec 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateConstructorDescriptor.java
@@ -84,8 +84,8 @@
                     private AMutableInterval aInterval = new AMutableInterval(0L, 0L, (byte) 0);
                     private AMutableDuration aDuration = new AMutableDuration(0, 0L);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInterval> intervalSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINTERVAL);
+                    private ISerializerDeserializer<AInterval> intervalSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
index 6d56b1b..3e61405 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromDateTimeConstructorDescriptor.java
@@ -82,8 +82,8 @@
                     private AMutableInterval aInterval = new AMutableInterval(0L, 0L, (byte) 0);
                     private AMutableDuration aDuration = new AMutableDuration(0, 0L);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInterval> intervalSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINTERVAL);
+                    private ISerializerDeserializer<AInterval> intervalSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
index d64e468..fa402bd 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/AIntervalStartFromTimeConstructorDescriptor.java
@@ -82,8 +82,8 @@
                     private AMutableInterval aInterval = new AMutableInterval(0L, 0L, (byte) 0);
                     private AMutableDuration aDuration = new AMutableDuration(0, 0L);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInterval> intervalSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINTERVAL);
+                    private ISerializerDeserializer<AInterval> intervalSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
index 56f6e38..c338a35 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/constructors/ATimeConstructorDescriptor.java
@@ -70,8 +70,8 @@
                     private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     private AMutableTime aTime = new AMutableTime(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
 
                     @Override
@@ -97,8 +97,8 @@
                                             ATypeTag.SERIALIZED_POLYGON_TYPE_TAG);
                                 }
 
-                                int chrononTimeInMs = ATimeParserFactory.parseTimePart(serString, startOffset,
-                                        stringLength);
+                                int chrononTimeInMs =
+                                        ATimeParserFactory.parseTimePart(serString, startOffset, stringLength);
 
                                 if (chrononTimeInMs < 0) {
                                     chrononTimeInMs += GregorianCalendarSystem.CHRONON_OF_DAY;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
index dce2462..9c38fbc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java
@@ -35,8 +35,8 @@
 
     // For outputting results.
     @SuppressWarnings({ "rawtypes" })
-    private ISerializerDeserializer boolSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    private ISerializerDeserializer boolSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
     public AbstractBinaryStringBoolEval(IHyracksTaskContext context, IScalarEvaluatorFactory evalLeftFactory,
             IScalarEvaluatorFactory evalRightFactory, FunctionIdentifier funcID) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringIntEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringIntEval.java
index 5aaee4c..ebe1273 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringIntEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringIntEval.java
@@ -36,8 +36,8 @@
 
     // For outputting results.
     @SuppressWarnings({ "rawtypes" })
-    private ISerializerDeserializer intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    private ISerializerDeserializer intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     private AMutableInt32 resultValue = new AMutableInt32(0);
 
     public AbstractBinaryStringIntEval(IHyracksTaskContext context, IScalarEvaluatorFactory evalLeftFactory,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
index 45e9ee1..936415d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractNumericArithmeticEval.java
@@ -279,8 +279,7 @@
                     }
 
                     @SuppressWarnings("unchecked")
-                    private void evaluateTemporalArthmeticOperation(ATypeTag leftType)
-                            throws HyracksDataException {
+                    private void evaluateTemporalArthmeticOperation(ATypeTag leftType) throws HyracksDataException {
                         byte[] bytes1 = argPtr1.getByteArray();
                         int offset1 = argPtr1.getStartOffset();
                         ATypeTag rightType = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(bytes1[offset1]);
@@ -318,10 +317,10 @@
                                             AYearMonthDurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1));
                                     break;
                                 case DAYTIMEDURATION:
-                                    leftChronon = ADayTimeDurationSerializerDeserializer.getDayTime(bytes0,
-                                            offset0 + 1);
-                                    rightChronon = ADayTimeDurationSerializerDeserializer.getDayTime(bytes1,
-                                            offset1 + 1);
+                                    leftChronon =
+                                            ADayTimeDurationSerializerDeserializer.getDayTime(bytes0, offset0 + 1);
+                                    rightChronon =
+                                            ADayTimeDurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1);
                                     break;
                                 default:
                                     throw new UnsupportedTypeException(getIdentifier(), bytes1[offset1]);
@@ -354,8 +353,8 @@
                                             break;
                                         case DURATION:
                                             dayTime = ADurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1);
-                                            yearMonth = ADurationSerializerDeserializer.getYearMonth(bytes1,
-                                                    offset1 + 1);
+                                            yearMonth =
+                                                    ADurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1);
                                             break;
                                         default:
                                             throw new IncompatibleTypeException(getIdentifier(), bytes0[offset0],
@@ -377,8 +376,8 @@
                                     }
                                     switch (rightType) {
                                         case DURATION:
-                                            yearMonth = ADurationSerializerDeserializer.getYearMonth(bytes1,
-                                                    offset1 + 1);
+                                            yearMonth =
+                                                    ADurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1);
                                             dayTime = ADurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1);
                                             break;
                                         case YEARMONTHDURATION:
@@ -395,8 +394,8 @@
                                     }
                                     break;
                                 case YEARMONTHDURATION:
-                                    yearMonth = AYearMonthDurationSerializerDeserializer.getYearMonth(bytes0,
-                                            offset0 + 1);
+                                    yearMonth =
+                                            AYearMonthDurationSerializerDeserializer.getYearMonth(bytes0, offset0 + 1);
                                     switch (rightType) {
                                         case DATETIME:
                                             serde = SerializerDeserializerProvider.INSTANCE
@@ -421,8 +420,8 @@
                                     dayTime = ADurationSerializerDeserializer.getDayTime(bytes0, offset0 + 1);
                                 case DAYTIMEDURATION:
                                     if (leftType == ATypeTag.DAYTIMEDURATION) {
-                                        dayTime = ADayTimeDurationSerializerDeserializer.getDayTime(bytes0,
-                                                offset0 + 1);
+                                        dayTime =
+                                                ADayTimeDurationSerializerDeserializer.getDayTime(bytes0, offset0 + 1);
                                     }
                                     switch (rightType) {
                                         case DATETIME:
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
index b607309..1b7c679 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractQuadStringStringEval.java
@@ -59,8 +59,8 @@
 
     private AMutableString resultBuffer = new AMutableString("");
     @SuppressWarnings("rawtypes")
-    private ISerializerDeserializer strSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    private ISerializerDeserializer strSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
 
     private final UTF8StringPointable strPtr1st = new UTF8StringPointable();
     private final UTF8StringPointable strPtr2nd = new UTF8StringPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringOffsetConfigurableDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringOffsetConfigurableDescriptor.java
new file mode 100644
index 0000000..3f8f45f
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractStringOffsetConfigurableDescriptor.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+
+public abstract class AbstractStringOffsetConfigurableDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+
+    private static final long serialVersionUID = 1L;
+
+    protected int stringOffset;
+
+    @Override
+    public void setImmutableStates(Object... states) {
+        stringOffset = (int) states[0];
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
index c7d839e..830f2ff 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringBoolEval.java
@@ -34,8 +34,8 @@
 public abstract class AbstractTripleStringBoolEval extends AbstractTripleStringEval {
 
     @SuppressWarnings("rawtypes")
-    private ISerializerDeserializer boolSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    private ISerializerDeserializer boolSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
     public AbstractTripleStringBoolEval(IHyracksTaskContext context, IScalarEvaluatorFactory eval0,
             IScalarEvaluatorFactory eval1, IScalarEvaluatorFactory eval2, FunctionIdentifier funcID)
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringIntEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringIntEval.java
index 2aa2f1a..7f0076b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringIntEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringIntEval.java
@@ -35,8 +35,8 @@
 public abstract class AbstractTripleStringIntEval extends AbstractTripleStringEval {
 
     @SuppressWarnings("rawtypes")
-    private final ISerializerDeserializer intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    private final ISerializerDeserializer intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     private final AMutableInt32 resultValue = new AMutableInt32(0);
 
     public AbstractTripleStringIntEval(IHyracksTaskContext context, IScalarEvaluatorFactory eval0,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
index b7bd056..48ef5f7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractTripleStringStringEval.java
@@ -34,8 +34,8 @@
 public abstract class AbstractTripleStringStringEval extends AbstractTripleStringEval {
 
     @SuppressWarnings("rawtypes")
-    private final ISerializerDeserializer stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    private final ISerializerDeserializer stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
     private final AMutableString resultValue = new AMutableString("");
 
     public AbstractTripleStringStringEval(IHyracksTaskContext context, IScalarEvaluatorFactory eval0,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
index c56d58f..06dcc17 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryNumericFunctionEval.java
@@ -72,23 +72,23 @@
     private final IScalarEvaluator argEval;
 
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer int8Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT8);
+    protected ISerializerDeserializer int8Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT8);
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer int16Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT16);
+    protected ISerializerDeserializer int16Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT16);
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer int32Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT32);
+    protected ISerializerDeserializer int32Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer int64Serde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    protected ISerializerDeserializer int64Serde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer floatSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AFLOAT);
+    protected ISerializerDeserializer floatSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT);
     @SuppressWarnings("rawtypes")
-    protected ISerializerDeserializer doubleSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+    protected ISerializerDeserializer doubleSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
 
     // The function identifier, used for error messages.
     private final FunctionIdentifier funcID;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
index 1f9909c..95b6ef6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractUnaryStringStringEval.java
@@ -22,8 +22,8 @@
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.runtime.exceptions.TypeMismatchException;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -57,7 +57,6 @@
         this.funcID = funcID;
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable) throws HyracksDataException {
         resultStorage.reset();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/BinaryHashMap.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/BinaryHashMap.java
index 2864473..f0edf5f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/BinaryHashMap.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/BinaryHashMap.java
@@ -57,9 +57,8 @@
     private int nextOff;
     private int size;
 
-
-    public BinaryHashMap(int tableSize, int frameSize, IBinaryHashFunction putHashFunc,
-            IBinaryHashFunction getHashFunc, IBinaryComparator cmp) {
+    public BinaryHashMap(int tableSize, int frameSize, IBinaryHashFunction putHashFunc, IBinaryHashFunction getHashFunc,
+            IBinaryComparator cmp) {
         listHeads = new long[tableSize];
         this.frameSize = frameSize;
         this.putHashFunc = putHashFunc;
@@ -198,8 +197,8 @@
     }
 
     public class BinaryHashMapIterator implements Iterator<Pair<BinaryEntry, BinaryEntry>> {
-        private final Pair<BinaryEntry, BinaryEntry> val = new Pair<BinaryEntry, BinaryEntry>(new BinaryEntry(),
-                new BinaryEntry());
+        private final Pair<BinaryEntry, BinaryEntry> val =
+                new Pair<BinaryEntry, BinaryEntry>(new BinaryEntry(), new BinaryEntry());
         private int listHeadIndex;
         private ByteBuffer frame;
         private int frameIndex;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
index cbe04e2..35335c6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CastTypeLaxEvaluator.java
@@ -25,13 +25,13 @@
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class CastTypeLaxEvaluator extends CastTypeEvaluator {
 
-    private static final Logger LOGGER = Logger.getLogger(CastTypeLaxEvaluator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final byte[] MISSING_BYTES = new byte[] { ATypeTag.SERIALIZED_MISSING_TYPE_TAG };
 
@@ -49,8 +49,8 @@
         try {
             super.cast(result);
         } catch (HyracksDataException e) {
-            if (LOGGER.isLoggable(Level.FINEST)) {
-                LOGGER.log(Level.FINEST, e.toString(), e);
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.log(Level.TRACE, e.toString(), e);
             }
             result.set(MISSING_BYTES, 0, MISSING_BYTES.length);
         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CountHashedGramTokensDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CountHashedGramTokensDescriptor.java
index 8998122..dd36671 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CountHashedGramTokensDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CountHashedGramTokensDescriptor.java
@@ -58,8 +58,8 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 ITokenFactory tokenFactory = new HashedUTF8NGramTokenFactory();
-                NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(3, true, false, true,
-                        tokenFactory);
+                NGramUTF8StringBinaryTokenizer tokenizer =
+                        new NGramUTF8StringBinaryTokenizer(3, true, false, true, tokenFactory);
                 return new GramTokensEvaluator(args, ctx, tokenizer, BuiltinType.AINT32);
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
index 7dbba41..4866583 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateCircleDescriptor.java
@@ -75,8 +75,8 @@
                     private AMutablePoint aPoint = new AMutablePoint(0, 0);
                     private AMutableCircle aCircle = new AMutableCircle(null, 0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ACircle> circleSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ACIRCLE);
+                    private ISerializerDeserializer<ACircle> circleSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ACIRCLE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
index 8165a55..0c8c12f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateLineDescriptor.java
@@ -75,8 +75,8 @@
                     private AMutableLine aLine = new AMutableLine(null, null);
                     private AMutablePoint[] aPoint = { new AMutablePoint(0, 0), new AMutablePoint(0, 0) };
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ALine> lineSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ALINE);
+                    private ISerializerDeserializer<ALine> lineSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ALINE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
@@ -104,15 +104,15 @@
                                             ADoubleSerializerDeserializer.getDouble(bytes0,
                                                     offset0 + APointSerializerDeserializer
                                                             .getCoordinateOffset(Coordinate.X)),
-                                    ADoubleSerializerDeserializer.getDouble(bytes0,
-                                            offset0 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
+                                            ADoubleSerializerDeserializer.getDouble(bytes0, offset0
+                                                    + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
                             aPoint[1]
                                     .setValue(
                                             ADoubleSerializerDeserializer.getDouble(bytes1,
                                                     offset1 + APointSerializerDeserializer
                                                             .getCoordinateOffset(Coordinate.X)),
-                                    ADoubleSerializerDeserializer.getDouble(bytes1,
-                                            offset1 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
+                                            ADoubleSerializerDeserializer.getDouble(bytes1, offset1
+                                                    + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
                             aLine.setValue(aPoint[0], aPoint[1]);
                             lineSerde.serialize(aLine, out);
                         } catch (IOException e1) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
index 9399f6b..e34091b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreatePointDescriptor.java
@@ -69,8 +69,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
                     private AMutablePoint aPoint = new AMutablePoint(0, 0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<APoint> pointSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.APOINT);
+                    private ISerializerDeserializer<APoint> pointSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.APOINT);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
index b51042f..59cc2c1 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateRectangleDescriptor.java
@@ -104,15 +104,15 @@
                                             ADoubleSerializerDeserializer.getDouble(bytes0,
                                                     offset0 + APointSerializerDeserializer
                                                             .getCoordinateOffset(Coordinate.X)),
-                                    ADoubleSerializerDeserializer.getDouble(bytes0,
-                                            offset0 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
+                                            ADoubleSerializerDeserializer.getDouble(bytes0, offset0
+                                                    + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
                             aPoint[1]
                                     .setValue(
                                             ADoubleSerializerDeserializer.getDouble(bytes1,
                                                     offset1 + APointSerializerDeserializer
                                                             .getCoordinateOffset(Coordinate.X)),
-                                    ADoubleSerializerDeserializer.getDouble(bytes1,
-                                            offset1 + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
+                                            ADoubleSerializerDeserializer.getDouble(bytes1, offset1
+                                                    + APointSerializerDeserializer.getCoordinateOffset(Coordinate.Y)));
                             if (aPoint[0].getX() > aPoint[1].getX() && aPoint[0].getY() > aPoint[1].getY()) {
                                 aRectangle.setValue(aPoint[1], aPoint[0]);
                             } else if (aPoint[0].getX() < aPoint[1].getX() && aPoint[0].getY() < aPoint[1].getY()) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
index 829f684..8f43bb9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/CreateUUIDDescriptor.java
@@ -56,8 +56,8 @@
             private static final long serialVersionUID = 1L;
 
             @SuppressWarnings("unchecked")
-            private final ISerializerDeserializer<AUUID> uuidSerDe = SerializerDeserializerProvider.INSTANCE
-                    .getSerializerDeserializer(BuiltinType.AUUID);
+            private final ISerializerDeserializer<AUUID> uuidSerDe =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AUUID);
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
index 51497ed..79c63e7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/DeepEqualityDescriptor.java
@@ -76,8 +76,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
             @SuppressWarnings("unchecked")
-            private final ISerializerDeserializer<ABoolean> boolSerde = SerializerDeserializerProvider.INSTANCE
-                    .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+            private final ISerializerDeserializer<ABoolean> boolSerde =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
index 9c4fb41..0f4ebee 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/EditDistanceListIsFilterableDescriptor.java
@@ -92,8 +92,8 @@
         protected final IScalarEvaluator edThreshEval;
 
         @SuppressWarnings("unchecked")
-        private final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+        private final ISerializerDeserializer<ABoolean> booleanSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
         public EditDistanceListIsFilterableEvaluator(IScalarEvaluatorFactory[] args, IHyracksTaskContext context)
                 throws HyracksDataException {
@@ -122,16 +122,15 @@
                     listLen = AOrderedListSerializerDeserializer.getNumberOfItems(bytes, offset);
                     break;
                 default:
-                    throw new TypeMismatchException(BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE,
-                            0, ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG,
-                            ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG);
+                    throw new TypeMismatchException(BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE, 0,
+                            ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG, ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG);
             }
 
             // Check type and extract edit-distance threshold.
             bytes = edThreshPtr.getByteArray();
             offset = edThreshPtr.getStartOffset();
-            long edThresh = ATypeHierarchy.getIntegerValue(
-                    BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE.getName(), 1, bytes, offset);
+            long edThresh = ATypeHierarchy.getIntegerValue(BuiltinFunctions.EDIT_DISTANCE_LIST_IS_FILTERABLE.getName(),
+                    1, bytes, offset);
 
             // Compute result.
             long lowerBound = listLen - edThresh;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsDescriptor.java
index 48541cb..810f6c4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsDescriptor.java
@@ -47,10 +47,10 @@
     public static final String CONJUNCTIVE_SEARCH_MODE_OPTION = "all";
 
     private static final byte[] SEARCH_MODE_OPTION_ARRAY = UTF8StringUtil.writeStringToBytes(SEARCH_MODE_OPTION);
-    private static final byte[] DISJUNCTIVE_SEARCH_MODE_OPTION_ARRAY = UTF8StringUtil
-            .writeStringToBytes(DISJUNCTIVE_SEARCH_MODE_OPTION);
-    private static final byte[] CONJUNCTIVE_SEARCH_MODE_OPTION_ARRAY = UTF8StringUtil
-            .writeStringToBytes(CONJUNCTIVE_SEARCH_MODE_OPTION);
+    private static final byte[] DISJUNCTIVE_SEARCH_MODE_OPTION_ARRAY =
+            UTF8StringUtil.writeStringToBytes(DISJUNCTIVE_SEARCH_MODE_OPTION);
+    private static final byte[] CONJUNCTIVE_SEARCH_MODE_OPTION_ARRAY =
+            UTF8StringUtil.writeStringToBytes(CONJUNCTIVE_SEARCH_MODE_OPTION);
 
     static {
         paramTypeMap.put(SEARCH_MODE_OPTION, ATypeTag.STRING);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsWithoutOptionDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsWithoutOptionDescriptor.java
index 7cfaa62..6ab87ac 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsWithoutOptionDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/FullTextContainsWithoutOptionDescriptor.java
@@ -64,5 +64,4 @@
         return BuiltinFunctions.FULLTEXT_CONTAINS_WO_OPTION;
     }
 
-
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetJobParameterByNameDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetJobParameterByNameDescriptor.java
new file mode 100644
index 0000000..17f7a96
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GetJobParameterByNameDescriptor.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.evaluators.functions;
+
+import java.io.IOException;
+
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
+
+public class GetJobParameterByNameDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+    public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
+        @Override
+        public IFunctionDescriptor createFunctionDescriptor() {
+            return new GetJobParameterByNameDescriptor();
+        }
+    };
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
+                return new AbstractUnaryStringStringEval(ctx, args[0],
+                        GetJobParameterByNameDescriptor.this.getIdentifier()) {
+                    private byte[] result;
+
+                    @Override
+                    protected void process(UTF8StringPointable inputString, IPointable resultPointable)
+                            throws IOException {
+                        result = ctx.getJobParameter(inputString.getByteArray(), inputString.getStartOffset(),
+                                inputString.getLength());
+                    }
+
+                    @Override
+                    void writeResult(IPointable resultPointable) throws IOException {
+                        resultPointable.set(result, 0, result.length);
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.GET_JOB_PARAMETER;
+    }
+
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GramTokensDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GramTokensDescriptor.java
index ec545ff..190013b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GramTokensDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/GramTokensDescriptor.java
@@ -56,8 +56,8 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 ITokenFactory tokenFactory = new UTF8NGramTokenFactory();
-                NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(3, true, true, true,
-                        tokenFactory);
+                NGramUTF8StringBinaryTokenizer tokenizer =
+                        new NGramUTF8StringBinaryTokenizer(3, true, true, true, tokenFactory);
                 return new GramTokensEvaluator(args, ctx, tokenizer, BuiltinType.ASTRING);
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/HashedGramTokensDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/HashedGramTokensDescriptor.java
index 49d9f27..32dc292 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/HashedGramTokensDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/HashedGramTokensDescriptor.java
@@ -56,8 +56,8 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 ITokenFactory tokenFactory = new HashedUTF8NGramTokenFactory();
-                NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(3, true, true, true,
-                        tokenFactory);
+                NGramUTF8StringBinaryTokenizer tokenizer =
+                        new NGramUTF8StringBinaryTokenizer(3, true, true, true, tokenFactory);
                 return new GramTokensEvaluator(args, ctx, tokenizer, BuiltinType.AINT32);
             }
         };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/InjectFailureDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/InjectFailureDescriptor.java
index af5f690..25b6c5d9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/InjectFailureDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/InjectFailureDescriptor.java
@@ -18,9 +18,6 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
@@ -38,12 +35,15 @@
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class InjectFailureDescriptor extends AbstractScalarFunctionDynamicDescriptor {
 
     private static final long serialVersionUID = 1L;
 
-    private static final Logger LOGGER = Logger.getLogger(SleepDescriptor.class.getSimpleName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
@@ -81,7 +81,7 @@
                             boolean argResult = ABooleanSerializerDeserializer.getBoolean(argPtr.getByteArray(),
                                     argPtr.getStartOffset() + 1);
                             if (argResult) {
-                                LOGGER.log(Level.SEVERE, ctx.getTaskAttemptId() + " injecting failure");
+                                LOGGER.log(Level.ERROR, ctx.getTaskAttemptId() + " injecting failure");
                                 throw new RuntimeDataException(ErrorCode.INJECTED_FAILURE, getIdentifier());
                             }
                         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
index bf080d3..0a8d86d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsUnknownDescriptor.java
@@ -61,7 +61,7 @@
 
     @Override
     public FunctionIdentifier getIdentifier() {
-        return BuiltinFunctions.IS_UNKOWN;
+        return BuiltinFunctions.IS_UNKNOWN;
     }
 
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
index cc0ae77..4268fc7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/LenDescriptor.java
@@ -71,8 +71,8 @@
                     // result
                     private final AMutableInt64 res = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
@@ -83,8 +83,8 @@
 
                         if (serList[offset] != ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG
                                 && serList[offset] != ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG) {
-                            throw new TypeMismatchException(getIdentifier(), 0,
-                                    serList[offset], ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG,
+                            throw new TypeMismatchException(getIdentifier(), 0, serList[offset],
+                                    ATypeTag.SERIALIZED_ORDEREDLIST_TYPE_TAG,
                                     ATypeTag.SERIALIZED_UNORDEREDLIST_TYPE_TAG);
                         }
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
index 6b15167..40cb659 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericATan2Descriptor.java
@@ -72,8 +72,8 @@
                     // For the output.
                     private final AMutableDouble aDouble = new AMutableDouble(0.0);
                     @SuppressWarnings("rawtypes")
-                    private final ISerializerDeserializer outputSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADOUBLE);
+                    private final ISerializerDeserializer outputSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
                     private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     private final DataOutput out = resultStorage.getDataOutput();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCaretDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCaretDescriptor.java
index 642bf71..3b72072 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCaretDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericCaretDescriptor.java
@@ -43,7 +43,7 @@
      */
     @Override
     protected long evaluateInteger(long lhs, long rhs) throws HyracksDataException {
-        if(rhs > Integer.MAX_VALUE){
+        if (rhs > Integer.MAX_VALUE) {
             throw new ArithmeticException("Exponent cannot be larger than 2^31-1");
         }
         return LongMath.checkedPow(lhs, (int) rhs);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
index b6f9117..7cda149 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericDivideDescriptor.java
@@ -46,7 +46,7 @@
         if (rhs == 0) {
             throw new ArithmeticException("Division by Zero.");
         }
-        if ( (lhs == Long.MIN_VALUE) && (rhs == -1L) ) {
+        if ((lhs == Long.MIN_VALUE) && (rhs == -1L)) {
             throw new ArithmeticException(("Overflow in integer division"));
         }
         return lhs / rhs;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
index e2cf5e7..fb52641 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/NumericTruncDescriptor.java
@@ -118,9 +118,9 @@
             } else if (bytes[offset] == ATypeTag.SERIALIZED_INT64_TYPE_TAG) {
                 return (int) AInt64SerializerDeserializer.getLong(bytes, offset + 1);
             } else {
-                throw new TypeMismatchException(getIdentifier(), 1, bytes[offset],
-                        ATypeTag.SERIALIZED_INT8_TYPE_TAG, ATypeTag.SERIALIZED_INT16_TYPE_TAG,
-                        ATypeTag.SERIALIZED_INT32_TYPE_TAG, ATypeTag.SERIALIZED_INT64_TYPE_TAG);
+                throw new TypeMismatchException(getIdentifier(), 1, bytes[offset], ATypeTag.SERIALIZED_INT8_TYPE_TAG,
+                        ATypeTag.SERIALIZED_INT16_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG,
+                        ATypeTag.SERIALIZED_INT64_TYPE_TAG);
             }
         }
 
@@ -178,10 +178,10 @@
                     serde.serialize(aDouble, out);
                 }
             } else {
-                throw new TypeMismatchException(getIdentifier(), 0, data[offset],
-                        ATypeTag.SERIALIZED_INT8_TYPE_TAG, ATypeTag.SERIALIZED_INT16_TYPE_TAG,
-                        ATypeTag.SERIALIZED_INT32_TYPE_TAG, ATypeTag.SERIALIZED_INT64_TYPE_TAG,
-                        ATypeTag.SERIALIZED_FLOAT_TYPE_TAG, ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG);
+                throw new TypeMismatchException(getIdentifier(), 0, data[offset], ATypeTag.SERIALIZED_INT8_TYPE_TAG,
+                        ATypeTag.SERIALIZED_INT16_TYPE_TAG, ATypeTag.SERIALIZED_INT32_TYPE_TAG,
+                        ATypeTag.SERIALIZED_INT64_TYPE_TAG, ATypeTag.SERIALIZED_FLOAT_TYPE_TAG,
+                        ATypeTag.SERIALIZED_DOUBLE_TYPE_TAG);
             }
             result.set(resultStorage);
         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
index 5a293f3..df8fc75 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PointableHelper.java
@@ -21,7 +21,6 @@
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.om.pointables.base.IVisitablePointable;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.EnumDeserializer;
@@ -41,8 +40,8 @@
  */
 
 public class PointableHelper {
-    private static final IBinaryComparator STRING_BINARY_COMPARATOR = PointableBinaryComparatorFactory.of(
-            UTF8StringPointable.FACTORY).createBinaryComparator();
+    private static final IBinaryComparator STRING_BINARY_COMPARATOR =
+            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY).createBinaryComparator();
     private final UTF8StringWriter utf8Writer;
 
     public PointableHelper() {
@@ -112,7 +111,7 @@
      * @param writeTag
      *            Specifying whether a tag for the string should also be written
      */
-    public void serializeString(String str, IMutableValueStorage vs, boolean writeTag) throws AsterixException {
+    public void serializeString(String str, IMutableValueStorage vs, boolean writeTag) throws HyracksDataException {
         vs.reset();
         try {
             DataOutput output = vs.getDataOutput();
@@ -121,7 +120,7 @@
             }
             utf8Writer.writeUTF8(str, output);
         } catch (IOException e) {
-            throw new AsterixException("Could not serialize " + str);
+            throw new HyracksDataException("Could not serialize " + str);
         }
     }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenDescriptor.java
index 362d808..c9a865b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenDescriptor.java
@@ -49,8 +49,8 @@
 public class PrefixLenDescriptor extends AbstractScalarFunctionDynamicDescriptor {
 
     private static final long serialVersionUID = 1L;
-    private final static FunctionIdentifier FID = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "prefix-len@3",
-            3);
+    private final static FunctionIdentifier FID =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "prefix-len@3", 3);
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
         public IFunctionDescriptor createFunctionDescriptor() {
@@ -80,8 +80,8 @@
                     // result
                     private final AMutableInt32 res = new AMutableInt32(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt32> int32Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT32);
+                    private final ISerializerDeserializer<AInt32> int32Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
@@ -115,8 +115,8 @@
                             throw new TypeMismatchException(getIdentifier(), 2, data[offset],
                                     ATypeTag.SERIALIZED_STRING_TYPE_TAG);
                         }
-                        SimilarityFilters similarityFilters = similarityFiltersCache.get(similarityThreshold, data,
-                                offset, len);
+                        SimilarityFilters similarityFilters =
+                                similarityFiltersCache.get(similarityThreshold, data, offset, len);
 
                         int prefixLength = similarityFilters.getPrefixLength(length);
                         res.setValue(prefixLength);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
index 5a67121..25d4be3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/PrefixLenJaccardDescriptor.java
@@ -78,8 +78,8 @@
                     // result
                     private final AMutableInt32 res = new AMutableInt32(0);
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt32> int32Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT32);
+                    private final ISerializerDeserializer<AInt32> int32Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT32);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityJaccardPrefixCheckDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityJaccardPrefixCheckDescriptor.java
index 2d88402..e1b5f3f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityJaccardPrefixCheckDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SimilarityJaccardPrefixCheckDescriptor.java
@@ -73,11 +73,11 @@
         private final OrderedListBuilder listBuilder;
         private ArrayBackedValueStorage inputVal;
         @SuppressWarnings("unchecked")
-        private final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+        private final ISerializerDeserializer<ABoolean> booleanSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
         @SuppressWarnings("unchecked")
-        private final ISerializerDeserializer<AFloat> floatSerde = SerializerDeserializerProvider.INSTANCE
-                .getSerializerDeserializer(BuiltinType.AFLOAT);
+        private final ISerializerDeserializer<AFloat> floatSerde =
+                SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AFLOAT);
         private final AMutableFloat aFloat = new AMutableFloat(0);
 
         private final AOrderedListType listType = new AOrderedListType(BuiltinType.ANY, "list");
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SleepDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SleepDescriptor.java
index a186b32..8bced98 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SleepDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SleepDescriptor.java
@@ -18,9 +18,6 @@
  */
 package org.apache.asterix.runtime.evaluators.functions;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
@@ -33,12 +30,15 @@
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class SleepDescriptor extends AbstractScalarFunctionDynamicDescriptor {
 
     private static final long serialVersionUID = 1L;
 
-    private static final Logger LOGGER = Logger.getLogger(SleepDescriptor.class.getSimpleName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final IFunctionDescriptorFactory FACTORY = SleepDescriptor::new;
 
@@ -65,14 +65,14 @@
                         final long time = ATypeHierarchy.getLongValue(getIdentifier().getName(), 1, bytes, offset);
 
                         try {
-                            if (LOGGER.isLoggable(Level.INFO)) {
+                            if (LOGGER.isInfoEnabled()) {
                                 LOGGER.log(Level.INFO, ctx.getTaskAttemptId() + " sleeping for " + time + " ms");
                             }
                             Thread.sleep(time);
                         } catch (InterruptedException e) {
                             Thread.currentThread().interrupt();
                         } finally {
-                            if (LOGGER.isLoggable(Level.INFO)) {
+                            if (LOGGER.isInfoEnabled()) {
                                 LOGGER.log(Level.INFO, ctx.getTaskAttemptId() + " done sleeping for " + time + " ms");
                             }
                         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
index 6edbf6f..4229f87 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SpatialIntersectDescriptor.java
@@ -92,14 +92,14 @@
 
                     private boolean pointOnLine(double pX, double pY, double startX, double startY, double endX,
                             double endY) throws HyracksDataException {
-                        double crossProduct = SpatialUtils.crossProduct(pY - startY, pX - startX, endY - startY,
-                                endX - startX);
+                        double crossProduct =
+                                SpatialUtils.crossProduct(pY - startY, pX - startX, endY - startY, endX - startX);
                         if (Math.abs(crossProduct) > SpatialUtils.doubleEpsilon()) { // crossProduct != 0
                             return false;
                         }
 
-                        double dotProduct = SpatialUtils.dotProduct((pX - startX), (pY - startY), (endX - startX),
-                                (endY - startY));
+                        double dotProduct =
+                                SpatialUtils.dotProduct((pX - startX), (pY - startY), (endX - startX), (endY - startY));
                         if (dotProduct < 0.0) {
                             return false;
                         }
@@ -536,8 +536,8 @@
                             min1 = spatialUtils.getMinProjection();
                             max1 = spatialUtils.getMaxProjection();
 
-                            dotProduct = SpatialUtils.dotProduct(spatialUtils.getXAxis(), spatialUtils.getYAxis(), cX,
-                                    cY);
+                            dotProduct =
+                                    SpatialUtils.dotProduct(spatialUtils.getXAxis(), spatialUtils.getYAxis(), cX, cY);
                             max2 = dotProduct + radius;
                             min2 = dotProduct - radius;
 
@@ -687,9 +687,9 @@
                         trianglesX1.reset();
                         trianglesY1.reset();
                         while (true) {
-                            middleVertex1 = triangulatePolygon(bytes1, offset1, numOfPoints1, pointsOffsets1,
-                                    trianglesX1, trianglesY1, numOfTriangles1, nonSimplePolygonDetection1,
-                                    middleVertex1);
+                            middleVertex1 =
+                                    triangulatePolygon(bytes1, offset1, numOfPoints1, pointsOffsets1, trianglesX1,
+                                            trianglesY1, numOfTriangles1, nonSimplePolygonDetection1, middleVertex1);
 
                             if (middleVertex1 == -1) {
                                 break;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java
index f55ef3d..46865cf 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java
@@ -49,8 +49,7 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
 
-                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1],
-                        BuiltinFunctions.STRING_CONTAINS) {
+                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], BuiltinFunctions.STRING_CONTAINS) {
                     @Override
                     protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException {
                         return UTF8StringPointable.contains(left, right, false);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java
index ab0cfd3..6422158 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java
@@ -49,8 +49,7 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
 
-                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1],
-                        BuiltinFunctions.STRING_ENDS_WITH) {
+                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], BuiltinFunctions.STRING_ENDS_WITH) {
 
                     @Override
                     protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java
index 6a7ad51..71a5742 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java
@@ -49,8 +49,7 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
 
-                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1],
-                        BuiltinFunctions.STRING_EQUAL) {
+                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], BuiltinFunctions.STRING_EQUAL) {
 
                     @Override
                     protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
index 58d63d1..bf62316 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLengthDescriptor.java
@@ -66,8 +66,8 @@
                     private IPointable inputArg = new VoidPointable();
                     private IScalarEvaluator eval = args[0].createScalarEvaluator(ctx);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable)
@@ -83,8 +83,8 @@
                                 result.setValue(len);
                                 int64Serde.serialize(result, out);
                             } else {
-                                throw new TypeMismatchException(getIdentifier(), 0,
-                                        serString[offset], ATypeTag.SERIALIZED_STRING_TYPE_TAG);
+                                throw new TypeMismatchException(getIdentifier(), 0, serString[offset],
+                                        ATypeTag.SERIALIZED_STRING_TYPE_TAG);
                             }
                             resultPointable.set(resultStorage);
                         } catch (IOException e1) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringPositionDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringPositionDescriptor.java
index 6f4d116..e9ec211 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringPositionDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringPositionDescriptor.java
@@ -24,7 +24,8 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -32,7 +33,7 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 
-public class StringPositionDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class StringPositionDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
 
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -40,6 +41,11 @@
         public IFunctionDescriptor createFunctionDescriptor() {
             return new StringPositionDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -47,6 +53,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 return new AbstractBinaryStringIntEval(ctx, args[0], args[1],
@@ -55,7 +63,7 @@
                     @Override
                     protected int compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException {
                         int pos = UTF8StringPointable.find(left, right, false);
-                        return pos < 0 ? pos : pos + 1;
+                        return pos < 0 ? pos : pos + baseOffset;
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRTrim2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRTrim2Descriptor.java
index 1c6b1f7..5d32bca 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRTrim2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRTrim2Descriptor.java
@@ -70,5 +70,4 @@
         };
     }
 
-
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java
index 1bb0fdc..b39c473 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java
@@ -24,8 +24,9 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.runtime.evaluators.functions.utils.RegExpMatcher;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -33,7 +34,7 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 
-public class StringRegExpPositionDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class StringRegExpPositionDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
 
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -41,6 +42,11 @@
         public IFunctionDescriptor createFunctionDescriptor() {
             return new StringRegExpPositionDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -48,6 +54,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 return new AbstractBinaryStringIntEval(ctx, args[0], args[1],
@@ -55,11 +63,10 @@
                     private final RegExpMatcher matcher = new RegExpMatcher();
 
                     @Override
-                    protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr)
-                            throws IOException {
+                    protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) {
                         matcher.build(srcPtr, patternPtr);
                         int pos = matcher.postion();
-                        return pos < 0 ? pos : pos + 1;
+                        return pos < 0 ? pos : pos + baseOffset;
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java
index 35eb3b1..16d428f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java
@@ -24,8 +24,9 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.runtime.evaluators.functions.utils.RegExpMatcher;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -33,7 +34,7 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.primitive.UTF8StringPointable;
 
-public class StringRegExpPositionWithFlagDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class StringRegExpPositionWithFlagDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
 
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -41,6 +42,11 @@
         public IFunctionDescriptor createFunctionDescriptor() {
             return new StringRegExpPositionWithFlagDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -48,6 +54,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
                 return new AbstractTripleStringIntEval(ctx, args[0], args[1], args[2],
@@ -56,10 +64,10 @@
 
                     @Override
                     protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr,
-                            UTF8StringPointable flagPtr) throws IOException {
+                            UTF8StringPointable flagPtr) {
                         matcher.build(srcPtr, patternPtr, flagPtr);
                         int pos = matcher.postion();
-                        return pos < 0 ? pos : pos + 1;
+                        return pos < 0 ? pos : pos + baseOffset;
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
index fe864f4..77c4f20 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRepeatDescriptor.java
@@ -83,8 +83,8 @@
                         // Gets the repeating times.
                         byte[] bytes = argNumber.getByteArray();
                         int offset = argNumber.getStartOffset();
-                        int repeatingTimes = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes,
-                                offset);
+                        int repeatingTimes =
+                                ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset);
                         // Checks repeatingTimes. It should be a non-negative value.
                         if (repeatingTimes < 0) {
                             throw new RuntimeDataException(ErrorCode.NEGATIVE_VALUE, getIdentifier(), 1,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
index 7027343..f788366 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringSplitDescriptor.java
@@ -117,8 +117,8 @@
 
                             // Gets the string length of the source string.
                             int inputStringLen = UTF8StringUtil.getUTFLength(srcString, srcOffset + 1);
-                            int inputStringStart = srcOffset + 1
-                                    + UTF8StringUtil.getNumBytesToStoreLength(inputStringLen);
+                            int inputStringStart =
+                                    srcOffset + 1 + UTF8StringUtil.getNumBytesToStoreLength(inputStringLen);
                             // Gets the string length of the pattern string.
                             int inputPatternLen = UTF8StringUtil.getUTFLength(patternString, patternOffset + 1);
                             // Handles the case that the pattern is "".
@@ -128,8 +128,8 @@
                             listBuilder.reset(intListType);
                             int itemStrStart = 0;
                             int nextMatchStart;
-                            while (itemStrStart < inputStringLen && (nextMatchStart = UTF8StringPointable
-                                    .find(argStrPtr, argPatternPtr, false, itemStrStart)) >= 0) {
+                            while (itemStrStart < inputStringLen && (nextMatchStart =
+                                    UTF8StringPointable.find(argStrPtr, argPatternPtr, false, itemStrStart)) >= 0) {
                                 // Adds an item string.
                                 addItemString(srcString, inputStringStart, itemStrStart,
                                         emptyStringPattern ? nextMatchStart + 1 : nextMatchStart);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java
index 75ffeca..aa43e66 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java
@@ -49,8 +49,7 @@
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
 
-                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1],
-                        BuiltinFunctions.STRING_STARTS_WITH) {
+                return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], BuiltinFunctions.STRING_STARTS_WITH) {
 
                     @Override
                     protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
index fa06e4d..fe5ad9f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringToCodePointDescriptor.java
@@ -74,8 +74,8 @@
                     private ArrayBackedValueStorage inputVal = new ArrayBackedValueStorage();
 
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 aInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringTrimDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringTrimDescriptor.java
index a459f42..bc4d150 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringTrimDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringTrimDescriptor.java
@@ -68,5 +68,4 @@
         };
     }
 
-
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
index 5a36942..8ebfb94 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/Substring2Descriptor.java
@@ -26,10 +26,11 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -43,13 +44,18 @@
 import org.apache.hyracks.data.std.util.UTF8StringBuilder;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class Substring2Descriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class Substring2Descriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
         public IFunctionDescriptor createFunctionDescriptor() {
             return new Substring2Descriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -57,6 +63,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
                 return new IScalarEvaluator() {
@@ -78,7 +86,8 @@
 
                         byte[] bytes = argStart.getByteArray();
                         int offset = argStart.getStartOffset();
-                        int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset) - 1;
+                        int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 1, bytes, offset)
+                                - baseOffset;
                         bytes = argString.getByteArray();
                         offset = argString.getStartOffset();
                         int len = argString.getLength();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
index caaa11a..d2a1203 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/SubstringDescriptor.java
@@ -26,10 +26,11 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.types.ATypeTag;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
 import org.apache.asterix.runtime.exceptions.TypeMismatchException;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -43,7 +44,7 @@
 import org.apache.hyracks.data.std.util.UTF8StringBuilder;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class SubstringDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class SubstringDescriptor extends AbstractStringOffsetConfigurableDescriptor {
 
     private static final long serialVersionUID = 1L;
 
@@ -52,6 +53,11 @@
         public IFunctionDescriptor createFunctionDescriptor() {
             return new SubstringDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -59,6 +65,8 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
                 return new IScalarEvaluator() {
@@ -85,7 +93,8 @@
 
                         byte[] bytes = argStart.getByteArray();
                         int offset = argStart.getStartOffset();
-                        int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset) - 1;
+                        int start = ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 0, bytes, offset)
+                                - baseOffset;
 
                         bytes = argLen.getByteArray();
                         offset = argLen.getStartOffset();
@@ -103,8 +112,7 @@
                         try {
                             UTF8StringPointable.substr(string, start, len, builder, array);
                         } catch (StringIndexOutOfBoundsException e) {
-                            throw new RuntimeDataException(ErrorCode.OUT_OF_BOUND, getIdentifier(), 1,
-                                    start + len - 1);
+                            throw new RuntimeDataException(ErrorCode.OUT_OF_BOUND, getIdentifier(), 1, start + len - 1);
                         } catch (IOException e) {
                             throw new HyracksDataException(e);
                         }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
index ae6aca5..704630e 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToBooleanDescriptor.java
@@ -95,8 +95,7 @@
                                 setInteger(UTF8StringUtil.getStringLength(bytes, offset + 1), result);
                                 break;
                             case ARRAY:
-                                setInteger(AOrderedListSerializerDeserializer.getNumberOfItems(bytes, offset),
-                                        result);
+                                setInteger(AOrderedListSerializerDeserializer.getNumberOfItems(bytes, offset), result);
                                 break;
                             case MULTISET:
                                 setInteger(AUnorderedListSerializerDeserializer.getNumberOfItems(bytes, offset),
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
index a7e4d94..71cdbe5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ToDoubleDescriptor.java
@@ -60,7 +60,7 @@
                 return new AbstractDoubleConstructorEvaluator(args[0].createScalarEvaluator(ctx)) {
                     @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<ANull> nullSerde =
-                        SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
 
                     @Override
                     protected void evaluateImpl(IPointable result) throws IOException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/UUIDDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/UUIDDescriptor.java
index e4980f1..a254738 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/UUIDDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/UUIDDescriptor.java
@@ -57,8 +57,8 @@
             private static final long serialVersionUID = 1L;
 
             @SuppressWarnings("unchecked")
-            private final ISerializerDeserializer<AUUID> uuidSerDe = SerializerDeserializerProvider.INSTANCE
-                    .getSerializerDeserializer(BuiltinType.AUUID);
+            private final ISerializerDeserializer<AUUID> uuidSerDe =
+                    SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AUUID);
 
             @Override
             public IScalarEvaluator createScalarEvaluator(IHyracksTaskContext ctx) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
index a1f097d..c88fe25 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractFindBinaryEvaluator.java
@@ -35,18 +35,20 @@
 public abstract class AbstractFindBinaryEvaluator extends AbstractBinaryScalarEvaluator {
 
     private static final ATypeTag[] EXPECTED_INPUT_TAG = { ATypeTag.BINARY, ATypeTag.BINARY };
-    protected String functionName;
-    protected AMutableInt64 result = new AMutableInt64(-1);
+    protected final int baseOffset;
+    protected final String functionName;
+    protected final AMutableInt64 result = new AMutableInt64(-1);
     protected final ByteArrayPointable textPtr = new ByteArrayPointable();
     protected final ByteArrayPointable wordPtr = new ByteArrayPointable();
 
     @SuppressWarnings("unchecked")
-    protected ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.AINT64);
+    protected ISerializerDeserializer<AInt64> intSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
     public AbstractFindBinaryEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory[] copyEvaluatorFactories,
-            String functionName) throws HyracksDataException {
+            int baseOffset, String functionName) throws HyracksDataException {
         super(context, copyEvaluatorFactories);
+        this.baseOffset = baseOffset;
         this.functionName = functionName;
     }
 
@@ -64,9 +66,9 @@
         checkTypeMachingThrowsIfNot(functionName, EXPECTED_INPUT_TAG, textTag, wordTag);
         textPtr.set(pointables[0].getByteArray(), pointables[0].getStartOffset() + 1, pointables[0].getLength() - 1);
         wordPtr.set(pointables[1].getByteArray(), pointables[0].getStartOffset() + 1, pointables[1].getLength() - 1);
-        result.setValue(1L + indexOf(textPtr.getByteArray(), textPtr.getContentStartOffset(),
-                textPtr.getContentLength(), wordPtr.getByteArray(), wordPtr.getContentStartOffset(),
-                wordPtr.getContentLength(), fromOffset));
+        int pos = indexOf(textPtr.getByteArray(), textPtr.getContentStartOffset(), textPtr.getContentLength(),
+                wordPtr.getByteArray(), wordPtr.getContentStartOffset(), wordPtr.getContentLength(), fromOffset);
+        result.setValue(pos < 0 ? pos : pos + baseOffset);
         intSerde.serialize(result, dataOutput);
         resultPointable.set(resultStorage);
     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
index d777bc7..fc049a4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/AbstractSubBinaryEvaluator.java
@@ -36,13 +36,15 @@
 
     private ByteArrayPointable byteArrayPointable = new ByteArrayPointable();
     private byte[] metaBuffer = new byte[5];
+    protected final int baseOffset;
     protected final String functionName;
 
     private static final ATypeTag[] EXPECTED_INPUT_TAGS = { ATypeTag.BINARY, ATypeTag.INTEGER };
 
     public AbstractSubBinaryEvaluator(IHyracksTaskContext context, IScalarEvaluatorFactory[] copyEvaluatorFactories,
-            String functionName) throws HyracksDataException {
+            int baseOffset, String functionName) throws HyracksDataException {
         super(context, copyEvaluatorFactories);
+        this.baseOffset = baseOffset;
         this.functionName = functionName;
     }
 
@@ -54,10 +56,10 @@
         }
 
         try {
-            ATypeTag argTag0 = ATypeTag.VALUE_TYPE_MAPPING[pointables[0].getByteArray()[pointables[0]
-                    .getStartOffset()]];
-            ATypeTag argTag1 = ATypeTag.VALUE_TYPE_MAPPING[pointables[1].getByteArray()[pointables[1]
-                    .getStartOffset()]];
+            ATypeTag argTag0 =
+                    ATypeTag.VALUE_TYPE_MAPPING[pointables[0].getByteArray()[pointables[0].getStartOffset()]];
+            ATypeTag argTag1 =
+                    ATypeTag.VALUE_TYPE_MAPPING[pointables[1].getByteArray()[pointables[1].getStartOffset()]];
             checkTypeMachingThrowsIfNot(functionName, EXPECTED_INPUT_TAGS, argTag0, argTag1);
 
             byteArrayPointable.set(pointables[0].getByteArray(), pointables[0].getStartOffset() + 1,
@@ -67,9 +69,8 @@
 
             int subStart;
 
-            // strange SQL index convention
-            subStart = ATypeHierarchy.getIntegerValue(BuiltinFunctions.SUBBINARY_FROM.getName(), 1, startBytes,
-                    offset) - 1;
+            subStart = ATypeHierarchy.getIntegerValue(BuiltinFunctions.SUBBINARY_FROM.getName(), 1, startBytes, offset)
+                    - baseOffset;
 
             int totalLength = byteArrayPointable.getContentLength();
             int subLength = getSubLength(tuple);
@@ -78,7 +79,10 @@
                 subStart = 0;
             }
 
-            if (subStart >= totalLength || subLength < 0) {
+            if (subStart >= totalLength) {
+                subStart = 0;
+                subLength = 0;
+            } else if (subLength < 0) {
                 subLength = 0;
             } else if (subLength > totalLength // for the IntMax case
                     || subStart + subLength > totalLength) {
@@ -88,6 +92,7 @@
             dataOutput.write(ATypeTag.BINARY.serialize());
             int metaLength = VarLenIntEncoderDecoder.encode(subLength, metaBuffer, 0);
             dataOutput.write(metaBuffer, 0, metaLength);
+
             dataOutput.write(byteArrayPointable.getByteArray(), byteArrayPointable.getContentStartOffset() + subStart,
                     subLength);
         } catch (IOException e) {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
index 41fb805..2c53225 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/BinaryLengthDescriptor.java
@@ -60,8 +60,8 @@
 
                     private AMutableInt64 result = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> intSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> intSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable resultPointable)
@@ -72,7 +72,7 @@
                                 .getStartOffset()]];
                         checkTypeMachingThrowsIfNot(getIdentifier().getName(), EXPECTED_TAGS, tag);
                         int len = ByteArrayPointable.getContentLength(pointables[0].getByteArray(),
-                                    pointables[0].getStartOffset() + 1);
+                                pointables[0].getStartOffset() + 1);
                         result.setValue(len);
                         intSerde.serialize(result, dataOutput);
                         resultPointable.set(resultStorage);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryDescriptor.java
index 61a24c4..307585d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryDescriptor.java
@@ -22,7 +22,9 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.asterix.runtime.evaluators.functions.AbstractStringOffsetConfigurableDescriptor;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -30,13 +32,18 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class FindBinaryDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class FindBinaryDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
         public IFunctionDescriptor createFunctionDescriptor() {
             return new FindBinaryDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -49,11 +56,13 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractFindBinaryEvaluator(ctx, args, getIdentifier().getName()) {
+                return new AbstractFindBinaryEvaluator(ctx, args, baseOffset, getIdentifier().getName()) {
                     @Override
-                    protected int getFromOffset(IFrameTupleReference tuple) throws HyracksDataException {
+                    protected int getFromOffset(IFrameTupleReference tuple) {
                         return 0;
                     }
                 };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryFromDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryFromDescriptor.java
index 299eaec..243d344 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryFromDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/FindBinaryFromDescriptor.java
@@ -22,8 +22,10 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.AbstractStringOffsetConfigurableDescriptor;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -31,7 +33,7 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class FindBinaryFromDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class FindBinaryFromDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
 
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
@@ -39,6 +41,11 @@
         public IFunctionDescriptor createFunctionDescriptor() {
             return new FindBinaryFromDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -51,14 +58,15 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractFindBinaryEvaluator(ctx, args, getIdentifier().getName()) {
+                return new AbstractFindBinaryEvaluator(ctx, args, baseOffset, getIdentifier().getName()) {
                     @Override
                     protected int getFromOffset(IFrameTupleReference tuple) throws HyracksDataException {
                         return ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 2,
-                                pointables[2].getByteArray(),
-                                    pointables[2].getStartOffset());
+                                pointables[2].getByteArray(), pointables[2].getStartOffset()) - baseOffset;
                     }
                 };
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
index 36a0b1e..67d7b0f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/ParseBinaryDescriptor.java
@@ -70,8 +70,8 @@
                 return new AbstractBinaryScalarEvaluator(ctx, args) {
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ABinary> binarySerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABINARY);
+                    private ISerializerDeserializer<ABinary> binarySerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABINARY);
 
                     private AMutableBinary aBinary = new AMutableBinary(new byte[0], 0, 0);
                     private final UTF8StringPointable stringPointable = new UTF8StringPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromDescriptor.java
index a677072..3b07c6c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromDescriptor.java
@@ -22,7 +22,9 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
+import org.apache.asterix.runtime.evaluators.functions.AbstractStringOffsetConfigurableDescriptor;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -30,13 +32,18 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class SubBinaryFromDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class SubBinaryFromDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
         public IFunctionDescriptor createFunctionDescriptor() {
             return new SubBinaryFromDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -49,11 +56,13 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
-                return new AbstractSubBinaryEvaluator(ctx, args, getIdentifier().getName()) {
+                return new AbstractSubBinaryEvaluator(ctx, args, baseOffset, getIdentifier().getName()) {
                     @Override
-                    protected int getSubLength(IFrameTupleReference tuple) throws HyracksDataException {
+                    protected int getSubLength(IFrameTupleReference tuple) {
                         return Integer.MAX_VALUE;
                     }
                 };
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromToDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromToDescriptor.java
index d91c0f4..961edbf 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromToDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/binary/SubBinaryFromToDescriptor.java
@@ -22,8 +22,10 @@
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.functions.IFunctionTypeInferer;
 import org.apache.asterix.om.types.hierachy.ATypeHierarchy;
-import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.AbstractStringOffsetConfigurableDescriptor;
+import org.apache.asterix.runtime.functions.FunctionTypeInferers;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
 import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
@@ -31,13 +33,18 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
-public class SubBinaryFromToDescriptor extends AbstractScalarFunctionDynamicDescriptor {
+public class SubBinaryFromToDescriptor extends AbstractStringOffsetConfigurableDescriptor {
     private static final long serialVersionUID = 1L;
     public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() {
         @Override
         public IFunctionDescriptor createFunctionDescriptor() {
             return new SubBinaryFromToDescriptor();
         }
+
+        @Override
+        public IFunctionTypeInferer createFunctionTypeInferer() {
+            return FunctionTypeInferers.SET_STRING_OFFSET;
+        }
     };
 
     @Override
@@ -50,10 +57,12 @@
         return new IScalarEvaluatorFactory() {
             private static final long serialVersionUID = 1L;
 
+            private final int baseOffset = stringOffset;
+
             @Override
             public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
 
-                return new AbstractSubBinaryEvaluator(ctx, args, getIdentifier().getName()) {
+                return new AbstractSubBinaryEvaluator(ctx, args, baseOffset, getIdentifier().getName()) {
                     @Override
                     protected int getSubLength(IFrameTupleReference tuple) throws HyracksDataException {
                         return ATypeHierarchy.getIntegerValue(getIdentifier().getName(), 2,
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
index 72d2e69..9a3f3b9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/GetRecordFieldsEvalFactory.java
@@ -52,8 +52,8 @@
     public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
         return new IScalarEvaluator() {
 
-            private final ARecordPointable recordPointable = (ARecordPointable) ARecordPointable.FACTORY
-                    .createPointable();
+            private final ARecordPointable recordPointable =
+                    (ARecordPointable) ARecordPointable.FACTORY.createPointable();
             private IPointable inputArg0 = new VoidPointable();
             private IScalarEvaluator eval0 = recordEvalFactory.createScalarEvaluator(ctx);
             private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
@@ -78,8 +78,6 @@
                     rfu.processRecord(recordPointable, recordType, out, 0);
                 } catch (IOException e) {
                     throw new HyracksDataException(e);
-                } catch (AsterixException e) {
-                    throw new HyracksDataException(e);
                 }
                 result.set(resultStorage);
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
index 97a9ee0..71a8291 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordAddFieldsDescriptor.java
@@ -113,12 +113,8 @@
                 final ArrayBackedValueStorage fieldNamePointable = new ArrayBackedValueStorage();
                 final ArrayBackedValueStorage fieldValuePointer = new ArrayBackedValueStorage();
                 final PointableHelper pointableHelper = new PointableHelper();
-                try {
-                    pointableHelper.serializeString("field-name", fieldNamePointable, true);
-                    pointableHelper.serializeString("field-value", fieldValuePointer, true);
-                } catch (AsterixException e) {
-                    throw new HyracksDataException(e);
-                }
+                pointableHelper.serializeString("field-name", fieldNamePointable, true);
+                pointableHelper.serializeString("field-value", fieldValuePointer, true);
 
                 return new IScalarEvaluator() {
                     public static final int TABLE_FRAME_SIZE = 32768; // the default 32k frame size
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordFieldsUtil.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordFieldsUtil.java
index 6127c28..d93d572 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordFieldsUtil.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordFieldsUtil.java
@@ -59,30 +59,30 @@
     private final static AString nestedName = new AString("nested");
     private final static AString listName = new AString("list");
 
-    private IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool = new ListObjectPool<IARecordBuilder, ATypeTag>(
-            new RecordBuilderFactory());
-    private IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool = new ListObjectPool<IAsterixListBuilder, ATypeTag>(
-            new ListBuilderFactory());
-    private IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool = new ListObjectPool<IMutableValueStorage, ATypeTag>(
-            new AbvsBuilderFactory());
-    private IObjectPool<IPointable, ATypeTag> recordPointablePool = new ListObjectPool<IPointable, ATypeTag>(
-            ARecordPointable.ALLOCATOR);
-    private IObjectPool<IPointable, ATypeTag> listPointablePool = new ListObjectPool<IPointable, ATypeTag>(
-            AListPointable.ALLOCATOR);
+    private IObjectPool<IARecordBuilder, ATypeTag> recordBuilderPool =
+            new ListObjectPool<IARecordBuilder, ATypeTag>(new RecordBuilderFactory());
+    private IObjectPool<IAsterixListBuilder, ATypeTag> listBuilderPool =
+            new ListObjectPool<IAsterixListBuilder, ATypeTag>(new ListBuilderFactory());
+    private IObjectPool<IMutableValueStorage, ATypeTag> abvsBuilderPool =
+            new ListObjectPool<IMutableValueStorage, ATypeTag>(new AbvsBuilderFactory());
+    private IObjectPool<IPointable, ATypeTag> recordPointablePool =
+            new ListObjectPool<IPointable, ATypeTag>(ARecordPointable.ALLOCATOR);
+    private IObjectPool<IPointable, ATypeTag> listPointablePool =
+            new ListObjectPool<IPointable, ATypeTag>(AListPointable.ALLOCATOR);
 
     private final static AOrderedListType listType = new AOrderedListType(BuiltinType.ANY, "fields");
     //Better not be a static object.
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<AString> stringSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ASTRING);
+    protected final ISerializerDeserializer<AString> stringSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ASTRING);
     @SuppressWarnings("unchecked")
-    protected final ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+    protected final ISerializerDeserializer<ABoolean> booleanSerde =
+            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
     private final static ARecordType openType = DefaultOpenFieldType.NESTED_OPEN_RECORD_TYPE;
 
     public void processRecord(ARecordPointable recordAccessor, ARecordType recType, DataOutput out, int level)
-            throws IOException, AsterixException {
+            throws IOException {
         if (level == 0) {
             // Resets pools for recycling objects before processing a top-level record.
             resetPools();
@@ -175,8 +175,7 @@
         orderedListBuilder.write(out, true);
     }
 
-    public void addNameField(IValueReference nameArg, IARecordBuilder fieldRecordBuilder)
-            throws HyracksDataException, AsterixException {
+    public void addNameField(IValueReference nameArg, IARecordBuilder fieldRecordBuilder) throws HyracksDataException {
         ArrayBackedValueStorage fieldAbvs = getTempBuffer();
 
         fieldAbvs.reset();
@@ -184,8 +183,7 @@
         fieldRecordBuilder.addField(fieldAbvs, nameArg);
     }
 
-    public void addFieldType(byte tagId, IARecordBuilder fieldRecordBuilder)
-            throws HyracksDataException, AsterixException {
+    public void addFieldType(byte tagId, IARecordBuilder fieldRecordBuilder) throws HyracksDataException {
         ArrayBackedValueStorage fieldAbvs = getTempBuffer();
         ArrayBackedValueStorage valueAbvs = getTempBuffer();
 
@@ -201,8 +199,7 @@
         fieldRecordBuilder.addField(fieldAbvs, valueAbvs);
     }
 
-    public void addIsOpenField(boolean isOpen, IARecordBuilder fieldRecordBuilder)
-            throws HyracksDataException, AsterixException {
+    public void addIsOpenField(boolean isOpen, IARecordBuilder fieldRecordBuilder) throws HyracksDataException {
         ArrayBackedValueStorage fieldAbvs = getTempBuffer();
         ArrayBackedValueStorage valueAbvs = getTempBuffer();
 
@@ -220,7 +217,7 @@
     }
 
     public void addListField(IValueReference listArg, IAType fieldType, IARecordBuilder fieldRecordBuilder, int level)
-            throws AsterixException, IOException {
+            throws IOException {
         ArrayBackedValueStorage fieldAbvs = getTempBuffer();
         ArrayBackedValueStorage valueAbvs = getTempBuffer();
 
@@ -234,7 +231,7 @@
     }
 
     public void addNestedField(IValueReference recordArg, IAType fieldType, IARecordBuilder fieldRecordBuilder,
-            int level) throws IOException, AsterixException {
+            int level) throws IOException {
         ArrayBackedValueStorage fieldAbvs = getTempBuffer();
         ArrayBackedValueStorage valueAbvs = getTempBuffer();
 
@@ -256,7 +253,7 @@
     }
 
     public void processListValue(IValueReference listArg, IAType fieldType, DataOutput out, int level)
-            throws AsterixException, IOException {
+            throws IOException {
         ArrayBackedValueStorage itemValue = getTempBuffer();
         IARecordBuilder listRecordBuilder = getRecordBuilder();
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
index ce7ed6e..9ff670f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordMergeDescriptor.java
@@ -24,7 +24,6 @@
 import java.util.List;
 
 import org.apache.asterix.builders.RecordBuilder;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.exceptions.RuntimeDataException;
 import org.apache.asterix.om.functions.BuiltinFunctions;
@@ -132,7 +131,7 @@
                         try {
                             mergeFields(outRecType, rp0, rp1, true, 0);
                             rbStack.get(0).write(out, true);
-                        } catch (IOException | AsterixException e) {
+                        } catch (IOException e) {
                             throw new HyracksDataException(e);
                         }
                         result.set(resultStorage);
@@ -140,7 +139,7 @@
 
                     private void mergeFields(ARecordType combinedType, ARecordVisitablePointable leftRecord,
                             ARecordVisitablePointable rightRecord, boolean openFromParent, int nestedLevel)
-                            throws IOException, AsterixException, HyracksDataException {
+                            throws IOException {
                         if (rbStack.size() < (nestedLevel + 1)) {
                             rbStack.add(new RecordBuilder());
                         }
@@ -169,8 +168,7 @@
                                                 openFromParent, nestedLevel);
                                         foundMatch = true;
                                     } else {
-                                        throw new RuntimeDataException(ErrorCode.DUPLICATE_FIELD_NAME,
-                                                getIdentifier());
+                                        throw new RuntimeDataException(ErrorCode.DUPLICATE_FIELD_NAME, getIdentifier());
                                     }
                                 }
                             }
@@ -207,7 +205,7 @@
                      */
                     private void addFieldToSubRecord(ARecordType combinedType, IVisitablePointable fieldNamePointable,
                             IVisitablePointable leftValue, IVisitablePointable rightValue, boolean openFromParent,
-                            int nestedLevel) throws IOException, AsterixException, HyracksDataException {
+                            int nestedLevel) throws IOException {
 
                         runtimeRecordTypeInfo.reset(combinedType);
                         int pos = runtimeRecordTypeInfo.getFieldIndex(fieldNamePointable.getByteArray(),
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordPairsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordPairsDescriptor.java
index e5ed628..2bf2530 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordPairsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordPairsDescriptor.java
@@ -108,8 +108,8 @@
                 return new IScalarEvaluator() {
                     private final IScalarEvaluator argEvaluator = args[0].createScalarEvaluator(ctx);
                     private final IPointable argPtr = new VoidPointable();
-                    private final ARecordVisitablePointable recordVisitablePointable = new ARecordVisitablePointable(
-                            recType);
+                    private final ARecordVisitablePointable recordVisitablePointable =
+                            new ARecordVisitablePointable(recType);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
index 2f55cd7..192a14b 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/records/RecordRemoveFieldsEvalFactory.java
@@ -118,15 +118,14 @@
                     rbStack.clear();
                     processRecord(requiredRecType, recordPointable, listPointable, 0);
                     rbStack.get(0).write(out, true);
-                } catch (IOException | AsterixException e) {
+                } catch (IOException e) {
                     throw new HyracksDataException(e);
                 }
                 result.set(resultStorage);
             }
 
             private void processRecord(ARecordType requiredType, ARecordVisitablePointable srp,
-                    AListVisitablePointable inputList, int nestedLevel)
-                    throws IOException, AsterixException, HyracksDataException {
+                    AListVisitablePointable inputList, int nestedLevel) throws IOException {
                 if (rbStack.size() < (nestedLevel + 1)) {
                     rbStack.add(new RecordBuilder());
                 }
@@ -156,8 +155,7 @@
 
             private void addKeptFieldToSubRecord(ARecordType requiredType, IVisitablePointable fieldNamePointable,
                     IVisitablePointable fieldValuePointable, IVisitablePointable fieldTypePointable,
-                    AListVisitablePointable inputList, int nestedLevel)
-                    throws IOException, AsterixException, HyracksDataException {
+                    AListVisitablePointable inputList, int nestedLevel) throws IOException {
 
                 runtimeRecordTypeInfo.reset(requiredType);
                 int pos = runtimeRecordTypeInfo.getFieldIndex(fieldNamePointable.getByteArray(),
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
index fb7b235..0a1bcf5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/AbstractIntervalLogicFuncDescriptor.java
@@ -54,21 +54,21 @@
                     protected final IntervalLogic il = new IntervalLogic();
                     private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     private DataOutput out = resultStorage.getDataOutput();
-                    private TaggedValuePointable argPtr0 = (TaggedValuePointable) TaggedValuePointable.FACTORY
-                            .createPointable();
-                    private TaggedValuePointable argPtr1 = (TaggedValuePointable) TaggedValuePointable.FACTORY
-                            .createPointable();
-                    private AIntervalPointable interval0 = (AIntervalPointable) AIntervalPointable.FACTORY
-                            .createPointable();
-                    private AIntervalPointable interval1 = (AIntervalPointable) AIntervalPointable.FACTORY
-                            .createPointable();
+                    private TaggedValuePointable argPtr0 =
+                            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+                    private TaggedValuePointable argPtr1 =
+                            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+                    private AIntervalPointable interval0 =
+                            (AIntervalPointable) AIntervalPointable.FACTORY.createPointable();
+                    private AIntervalPointable interval1 =
+                            (AIntervalPointable) AIntervalPointable.FACTORY.createPointable();
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     // possible output types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ABoolean> booleanSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer<ABoolean> booleanSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
index a06b440..3dab641 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDuartionFromDateDescriptor.java
@@ -75,8 +75,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADuration> durationSerde = SerializerDeserializerProvider.
-                            INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
+                    private ISerializerDeserializer<ADuration> durationSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
 
                     private AMutableDuration aDuration = new AMutableDuration(0, 0);
 
@@ -103,8 +103,8 @@
                                     ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
                         }
 
-                        int yearMonthDurationInMonths = ADurationSerializerDeserializer.getYearMonth(bytes1,
-                                offset1 + 1);
+                        int yearMonthDurationInMonths =
+                                ADurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1);
                         long dayTimeDurationInMs = ADurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1);
 
                         long startingTimePoint = ADateSerializerDeserializer.getChronon(bytes0, offset0 + 1)
@@ -174,8 +174,7 @@
                                 boolean isLeapYear = calInstanct.isLeapYear(year1);
                                 // need to "borrow" the days in previous month to make the day positive; when month is
                                 // 1 (Jan), Dec will be borrowed
-                                day += isLeapYear
-                                        ? (GregorianCalendarSystem.DAYS_OF_MONTH_LEAP[(12 + month1 - 2) % 12])
+                                day += isLeapYear ? (GregorianCalendarSystem.DAYS_OF_MONTH_LEAP[(12 + month1 - 2) % 12])
                                         : (GregorianCalendarSystem.DAYS_OF_MONTH_ORDI[(12 + month1 - 2) % 12]);
                                 month -= 1;
                             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
index 904200e..867d030 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CalendarDurationFromDateTimeDescriptor.java
@@ -92,8 +92,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADuration> durationSerde = SerializerDeserializerProvider.
-                            INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
+                    private ISerializerDeserializer<ADuration> durationSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
 
                     private AMutableDuration aDuration = new AMutableDuration(0, 0);
 
@@ -120,8 +120,8 @@
                                     ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
                         }
 
-                        int yearMonthDurationInMonths = ADurationSerializerDeserializer.getYearMonth(bytes1,
-                                offset1 + 1);
+                        int yearMonthDurationInMonths =
+                                ADurationSerializerDeserializer.getYearMonth(bytes1, offset1 + 1);
                         long dayTimeDurationInMs = ADurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1);
 
                         long startingTimePoint = ADateTimeSerializerDeserializer.getChronon(bytes0, offset0 + 1);
@@ -188,8 +188,7 @@
                                 boolean isLeapYear = calInstanct.isLeapYear(year1);
                                 // need to "borrow" the days in previous month to make the day positive; when month is
                                 // 1 (Jan), Dec will be borrowed
-                                day += isLeapYear
-                                        ? (GregorianCalendarSystem.DAYS_OF_MONTH_LEAP[(12 + month1 - 2) % 12])
+                                day += isLeapYear ? (GregorianCalendarSystem.DAYS_OF_MONTH_LEAP[(12 + month1 - 2) % 12])
                                         : (GregorianCalendarSystem.DAYS_OF_MONTH_ORDI[(12 + month1 - 2) % 12]);
                                 month -= 1;
                             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateDescriptor.java
index 2174432..8d4cff5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateDescriptor.java
@@ -66,8 +66,8 @@
                     private DataOutput out = resultStorage.getDataOutput();
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private AMutableDate aDate = new AMutableDate(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateTimeDescriptor.java
index 9c284b5..5491c39 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentDateTimeDescriptor.java
@@ -67,8 +67,8 @@
                     private DataOutput out = resultStorage.getDataOutput();
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATETIME);
+                    private ISerializerDeserializer<ADateTime> datetimeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
                     private AMutableDateTime aDateTime = new AMutableDateTime(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentTimeDescriptor.java
index 3ce0e5a..f9cfbf2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/CurrentTimeDescriptor.java
@@ -68,8 +68,8 @@
                     private DataOutput out = resultStorage.getDataOutput();
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private AMutableTime aTime = new AMutableTime(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
index 557591e..cfac2e9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromDatetimeDescriptor.java
@@ -72,8 +72,8 @@
 
                     // possible returning types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
                     private AMutableDate aDate = new AMutableDate(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
index 09c74e0..a365989 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DateFromUnixTimeInDaysDescriptor.java
@@ -70,8 +70,8 @@
 
                     // possible returning types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
index 87ef5d2..f70a6e2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromDateAndTimeDescriptor.java
@@ -77,8 +77,8 @@
 
                     // possible returning types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATETIME);
+                    private ISerializerDeserializer<ADateTime> datetimeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
                     private AMutableDateTime aDateTime = new AMutableDateTime(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
index d4db02e..87e83d7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInMsDescriptor.java
@@ -78,8 +78,8 @@
 
                     // possible output types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATETIME);
+                    private ISerializerDeserializer<ADateTime> datetimeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
 
                     private AMutableDateTime aDatetime = new AMutableDateTime(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
index 2bbbd5c..abf4016 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DatetimeFromUnixTimeInSecsDescriptor.java
@@ -77,8 +77,8 @@
 
                     // possible output types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATETIME);
+                    private ISerializerDeserializer<ADateTime> datetimeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
 
                     private AMutableDateTime aDatetime = new AMutableDateTime(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
index 4e93872..6a3e128 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayOfWeekDescriptor.java
@@ -75,8 +75,8 @@
 
                     // possible returning types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private AMutableInt64 aInt64 = new AMutableInt64(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
index dd5c2c5..cb26c58 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DayTimeDurationComparatorDescriptor.java
@@ -68,8 +68,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ABoolean> boolSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer<ABoolean> boolSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
index 0f6730a..9b29ca8 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationEqualDescriptor.java
@@ -69,8 +69,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ABoolean> boolSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer<ABoolean> boolSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
@@ -96,10 +96,10 @@
                                 offset0 + 1) == ADurationSerializerDeserializer.getDayTime(bytes1, offset1 + 1))
                                 && (ADurationSerializerDeserializer.getYearMonth(bytes0,
                                         offset0 + 1) == ADurationSerializerDeserializer.getYearMonth(bytes1,
-                                                    offset1 + 1))) {
-                                boolSerde.serialize(ABoolean.TRUE, out);
+                                                offset1 + 1))) {
+                            boolSerde.serialize(ABoolean.TRUE, out);
                         } else {
-                                boolSerde.serialize(ABoolean.FALSE, out);
+                            boolSerde.serialize(ABoolean.FALSE, out);
                         }
                         result.set(resultStorage);
                     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
index f17f330..d8be601 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromIntervalDescriptor.java
@@ -71,8 +71,8 @@
 
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ADayTimeDuration> dayTimeDurationSerde =
-                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
-                                    BuiltinType.ADAYTIMEDURATION);
+                            SerializerDeserializerProvider.INSTANCE
+                                    .getSerializerDeserializer(BuiltinType.ADAYTIMEDURATION);
 
                     private AMutableDayTimeDuration aDayTimeDuration = new AMutableDayTimeDuration(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
index 38eaa1b..f1987ca 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMillisecondsDescriptor.java
@@ -73,8 +73,8 @@
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADuration> durationSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADURATION);
+                    private ISerializerDeserializer<ADuration> durationSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
 
                     AMutableDuration aDuration = new AMutableDuration(0, 0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
index 6277525..b066c0d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/DurationFromMonthsDescriptor.java
@@ -68,8 +68,8 @@
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADuration> durationSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADURATION);
+                    private ISerializerDeserializer<ADuration> durationSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADURATION);
 
                     AMutableDuration aDuration = new AMutableDuration(0, 0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
index 3707f38..9410e6d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetDayTimeDurationDescriptor.java
@@ -70,8 +70,8 @@
 
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<ADayTimeDuration> dayTimeDurationSerde =
-                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
-                                    BuiltinType.ADAYTIMEDURATION);
+                            SerializerDeserializerProvider.INSTANCE
+                                    .getSerializerDeserializer(BuiltinType.ADAYTIMEDURATION);
 
                     AMutableDayTimeDuration aDayTimeDuration = new AMutableDayTimeDuration(0);
 
@@ -88,8 +88,7 @@
                                     ATypeTag.SERIALIZED_DURATION_TYPE_TAG);
                         }
 
-                        aDayTimeDuration
-                                    .setMilliseconds(ADurationSerializerDeserializer.getDayTime(bytes, offset + 1));
+                        aDayTimeDuration.setMilliseconds(ADurationSerializerDeserializer.getDayTime(bytes, offset + 1));
                         dayTimeDurationSerde.serialize(aDayTimeDuration, out);
                         result.set(resultStorage);
                     }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
index d7145ca..4bd3ede 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetOverlappingIntervalDescriptor.java
@@ -65,22 +65,22 @@
                     protected final IntervalLogic il = new IntervalLogic();
                     private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     private DataOutput out = resultStorage.getDataOutput();
-                    private TaggedValuePointable argPtr0 = (TaggedValuePointable) TaggedValuePointable.FACTORY
-                            .createPointable();
-                    private TaggedValuePointable argPtr1 = (TaggedValuePointable) TaggedValuePointable.FACTORY
-                            .createPointable();
-                    private AIntervalPointable interval0 = (AIntervalPointable) AIntervalPointable.FACTORY
-                            .createPointable();
-                    private AIntervalPointable interval1 = (AIntervalPointable) AIntervalPointable.FACTORY
-                            .createPointable();
+                    private TaggedValuePointable argPtr0 =
+                            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+                    private TaggedValuePointable argPtr1 =
+                            (TaggedValuePointable) TaggedValuePointable.FACTORY.createPointable();
+                    private AIntervalPointable interval0 =
+                            (AIntervalPointable) AIntervalPointable.FACTORY.createPointable();
+                    private AIntervalPointable interval1 =
+                            (AIntervalPointable) AIntervalPointable.FACTORY.createPointable();
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     private final AMutableInterval aInterval = new AMutableInterval(0, 0, (byte) -1);
 
                     @SuppressWarnings("unchecked")
-                    private final ISerializerDeserializer<ANull> nullSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ANULL);
+                    private final ISerializerDeserializer<ANull> nullSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ANULL);
                     @SuppressWarnings("unchecked")
                     private final ISerializerDeserializer<AInterval> intervalSerde =
                             SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINTERVAL);
@@ -93,7 +93,6 @@
                         byte type0 = argPtr0.getTag();
                         byte type1 = argPtr1.getTag();
 
-
                         if (type0 == ATypeTag.SERIALIZED_INTERVAL_TYPE_TAG && type0 == type1) {
                             argPtr0.getValue(interval0);
                             argPtr1.getValue(interval1);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
index 1b033cd..fd58d6c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/GetYearMonthDurationDescriptor.java
@@ -69,8 +69,8 @@
 
                     @SuppressWarnings("unchecked")
                     private ISerializerDeserializer<AYearMonthDuration> yearMonthDurationSerde =
-                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(
-                                    BuiltinType.AYEARMONTHDURATION);
+                            SerializerDeserializerProvider.INSTANCE
+                                    .getSerializerDeserializer(BuiltinType.AYEARMONTHDURATION);
 
                     AMutableYearMonthDuration aYearMonthDuration = new AMutableYearMonthDuration(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
index 3426c28..5694c27 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/IntervalBinDescriptor.java
@@ -198,12 +198,12 @@
                                 binEndChronon = DurationArithmeticOperations.addDuration(chrononToStart,
                                         yearMonth * ((int) binIndex + 1), dayTime * (binIndex + 1), false);
 
-                                binStartChronon = binStartChronon / GregorianCalendarSystem.CHRONON_OF_DAY
-                                        + ((binStartChronon < 0
+                                binStartChronon =
+                                        binStartChronon / GregorianCalendarSystem.CHRONON_OF_DAY + ((binStartChronon < 0
                                                 && binStartChronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0) ? -1
                                                         : 0);
-                                binEndChronon = binEndChronon / GregorianCalendarSystem.CHRONON_OF_DAY
-                                        + ((binEndChronon < 0
+                                binEndChronon =
+                                        binEndChronon / GregorianCalendarSystem.CHRONON_OF_DAY + ((binEndChronon < 0
                                                 && binEndChronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0) ? -1
                                                         : 0);
                                 break;
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
index bab73e5..c3bf58d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MillisecondsFromDayTimeDurationDescriptor.java
@@ -68,8 +68,8 @@
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     AMutableInt64 aInt64 = new AMutableInt64(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
index 5eed081..3d595c3 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/MonthsFromYearMonthDurationDescriptor.java
@@ -68,8 +68,8 @@
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     AMutableInt64 aInt64 = new AMutableInt64(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
index 8e1064f..6980c65 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/OverlapBinsDescriptor.java
@@ -220,8 +220,8 @@
                                             + ((binStartChronon < 0
                                                     && binStartChronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0)
                                                             ? -1 : 0);
-                                    binEndChronon = binEndChronon / GregorianCalendarSystem.CHRONON_OF_DAY
-                                            + ((binEndChronon < 0
+                                    binEndChronon =
+                                            binEndChronon / GregorianCalendarSystem.CHRONON_OF_DAY + ((binEndChronon < 0
                                                     && binEndChronon % GregorianCalendarSystem.CHRONON_OF_DAY != 0) ? -1
                                                             : 0);
                                     aInterval.setValue(binStartChronon, binEndChronon, intervalTypeTag);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
index a615b09..e463eed 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateDescriptor.java
@@ -80,8 +80,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADate> dateSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATE);
+                    private ISerializerDeserializer<ADate> dateSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATE);
 
                     private AMutableDate aDate = new AMutableDate(0);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
index c63a4e5..a391529 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseDateTimeDescriptor.java
@@ -75,8 +75,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ADateTime> datetimeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ADATETIME);
+                    private ISerializerDeserializer<ADateTime> datetimeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADATETIME);
 
                     private AMutableDateTime aDateTime = new AMutableDateTime(0);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
index 8fa1d56..948c779 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/ParseTimeDescriptor.java
@@ -76,8 +76,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
 
                     private AMutableTime aTime = new AMutableTime(0);
                     private final UTF8StringPointable utf8Ptr = new UTF8StringPointable();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
index 6ebed0f..273cba4 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromDatetimeDescriptor.java
@@ -76,8 +76,8 @@
 
                     // possible returning types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
                     private AMutableTime aTime = new AMutableTime(0);
 
                     @Override
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
index ce4a5c4..a253a89 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/TimeFromUnixTimeInMsDescriptor.java
@@ -70,8 +70,8 @@
 
                     // possible output types
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ATime> timeSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ATIME);
+                    private ISerializerDeserializer<ATime> timeSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ATIME);
 
                     private AMutableTime aTime = new AMutableTime(0);
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
index 53f521b..3dc449d 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDateInDaysDescriptor.java
@@ -71,8 +71,8 @@
                     // possible returning types
                     private AMutableInt64 aInt64 = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
index f5628d4..2dc57c5 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInMsDescriptor.java
@@ -69,8 +69,8 @@
                     // possible returning types
                     private AMutableInt64 aInt64 = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
index ade2093..34fedb6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromDatetimeInSecsDescriptor.java
@@ -75,8 +75,8 @@
                     // possible returning types
                     private AMutableInt64 aInt64 = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
index 382feb0..0909764 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/UnixTimeFromTimeInMsDescriptor.java
@@ -71,8 +71,8 @@
                     // possible returning types
                     private AMutableInt64 aInt64 = new AMutableInt64(0);
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<AInt64> int64Serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer<AInt64> int64Serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
index 42809d8..5748956 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/temporal/YearMonthDurationComparatorDescriptor.java
@@ -68,8 +68,8 @@
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
 
                     @SuppressWarnings("unchecked")
-                    private ISerializerDeserializer<ABoolean> boolSerde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.ABOOLEAN);
+                    private ISerializerDeserializer<ABoolean> boolSerde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ABOOLEAN);
 
                     @Override
                     public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java
index 9206262..8d238df 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java
@@ -113,8 +113,8 @@
             StringEvaluatorUtils.copyResetUTF8Pointable(patternPtr, lastPatternStorage, lastPatternPtr);
             // ! object creation !
             String inputPatternString = lastPatternPtr.toString();
-            String patternString = patternGenerator == null ? inputPatternString : patternGenerator
-                    .toRegExpPatternString(inputPatternString);
+            String patternString = patternGenerator == null ? inputPatternString
+                    : patternGenerator.toRegExpPatternString(inputPatternString);
             if (newFlag) {
                 pattern = Pattern.compile(patternString, StringEvaluatorUtils.toFlag(flagPtr.toString()));
 
@@ -167,8 +167,8 @@
      */
     public String replace(UTF8StringPointable replaceStrPtr) {
         // Sets up a new replacement string if necessary.
-        final boolean newReplace = replaceStrPtr != null
-                && (replaceStr == null || lastReplaceStrPtr.compareTo(replaceStrPtr) != 0);
+        final boolean newReplace =
+                replaceStrPtr != null && (replaceStr == null || lastReplaceStrPtr.compareTo(replaceStrPtr) != 0);
         if (newReplace) {
             StringEvaluatorUtils.copyResetUTF8Pointable(replaceStrPtr, lastReplaceStorage, lastReplaceStrPtr);
             replaceStr = replaceStrPtr.toString();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/DeepEqualityVisitorHelper.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/DeepEqualityVisitorHelper.java
index 000425e..cc842e6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/DeepEqualityVisitorHelper.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/DeepEqualityVisitorHelper.java
@@ -32,8 +32,10 @@
     public static final int TABLE_SIZE = 100;
     public static final int TABLE_FRAME_SIZE = 32768;
 
-    private final ListItemBinaryHashFunctionFactory listItemBinaryHashFunctionFactory = ListItemBinaryHashFunctionFactory.INSTANCE;
-    private final ListItemBinaryComparatorFactory listItemBinaryComparatorFactory = ListItemBinaryComparatorFactory.INSTANCE;
+    private final ListItemBinaryHashFunctionFactory listItemBinaryHashFunctionFactory =
+            ListItemBinaryHashFunctionFactory.INSTANCE;
+    private final ListItemBinaryComparatorFactory listItemBinaryComparatorFactory =
+            ListItemBinaryComparatorFactory.INSTANCE;
 
     private final IBinaryHashFunction putHashFunc = listItemBinaryHashFunctionFactory.createBinaryHashFunction();
     private final IBinaryHashFunction getHashFunc = listItemBinaryHashFunctionFactory.createBinaryHashFunction();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/ListDeepEqualityChecker.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/ListDeepEqualityChecker.java
index bcb41f5..6341b79 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/ListDeepEqualityChecker.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/ListDeepEqualityChecker.java
@@ -40,7 +40,8 @@
     private BinaryEntry valEntry = new BinaryEntry();
 
     private final DeepEqualityVisitorHelper deepEqualityVisitorHelper = new DeepEqualityVisitorHelper();
-    private final Pair<IVisitablePointable, Boolean> itemVisitorArg = new Pair<IVisitablePointable, Boolean>(null, false);
+    private final Pair<IVisitablePointable, Boolean> itemVisitorArg =
+            new Pair<IVisitablePointable, Boolean>(null, false);
 
     public ListDeepEqualityChecker() {
         hashMap = deepEqualityVisitorHelper.initializeHashMap(valEntry);
@@ -50,22 +51,22 @@
             DeepEqualityVisitor visitor) throws HyracksDataException {
         this.visitor = visitor;
 
-        AListVisitablePointable listLeft = (AListVisitablePointable)listPointableLeft;
+        AListVisitablePointable listLeft = (AListVisitablePointable) listPointableLeft;
         List<IVisitablePointable> itemsLeft = listLeft.getItems();
         List<IVisitablePointable> itemTagTypesLeft = listLeft.getItemTags();
 
-
-        AListVisitablePointable listRight = (AListVisitablePointable)listPointableRight;
+        AListVisitablePointable listRight = (AListVisitablePointable) listPointableRight;
         List<IVisitablePointable> itemsRight = listRight.getItems();
         List<IVisitablePointable> itemTagTypesRight = listRight.getItemTags();
 
-        if (itemsLeft.size() != itemsRight.size()) return false;
+        if (itemsLeft.size() != itemsRight.size())
+            return false;
 
         boolean isOrderedRight = listLeft.ordered();
         if (isOrderedRight != listRight.ordered())
             return false;
 
-        if( isOrderedRight) {
+        if (isOrderedRight) {
             return processOrderedList(itemsLeft, itemTagTypesLeft, itemsRight, itemTagTypesRight);
         } else {
             return processUnorderedList(itemsLeft, itemTagTypesLeft, itemsRight, itemTagTypesRight);
@@ -75,9 +76,10 @@
     private boolean processOrderedList(List<IVisitablePointable> itemsLeft, List<IVisitablePointable> itemTagTypesLeft,
             List<IVisitablePointable> itemsRight, List<IVisitablePointable> itemTagTypesRight)
             throws HyracksDataException {
-        for(int i=0; i<itemsLeft.size(); i++) {
+        for (int i = 0; i < itemsLeft.size(); i++) {
             ATypeTag fieldTypeLeft = PointableHelper.getTypeTag(itemTagTypesLeft.get(i));
-            if(fieldTypeLeft.isDerivedType() && fieldTypeLeft != PointableHelper.getTypeTag(itemTagTypesRight.get(i))) {
+            if (fieldTypeLeft.isDerivedType()
+                    && fieldTypeLeft != PointableHelper.getTypeTag(itemTagTypesRight.get(i))) {
                 return false;
             }
             itemVisitorArg.first = itemsRight.get(i);
@@ -89,13 +91,13 @@
         return true;
     }
 
-    private boolean processUnorderedList(List<IVisitablePointable> itemsLeft, List<IVisitablePointable> itemTagTypesLeft,
-            List<IVisitablePointable> itemsRight, List<IVisitablePointable> itemTagTypesRight)
-            throws HyracksDataException {
+    private boolean processUnorderedList(List<IVisitablePointable> itemsLeft,
+            List<IVisitablePointable> itemTagTypesLeft, List<IVisitablePointable> itemsRight,
+            List<IVisitablePointable> itemTagTypesRight) throws HyracksDataException {
 
         hashMap.clear();
         // Build phase: Add items into hash map, starting with first list.
-        for(int i=0; i<itemsLeft.size(); i++) {
+        for (int i = 0; i < itemsLeft.size(); i++) {
             IVisitablePointable item = itemsLeft.get(i);
             byte[] buf = item.getByteArray();
             int off = item.getStartOffset();
@@ -108,12 +110,11 @@
         return probeHashMap(itemsLeft, itemTagTypesLeft, itemsRight, itemTagTypesRight);
     }
 
-
     private boolean probeHashMap(List<IVisitablePointable> itemsLeft, List<IVisitablePointable> itemTagTypesLeft,
             List<IVisitablePointable> itemsRight, List<IVisitablePointable> itemTagTypesRight)
             throws HyracksDataException {
         // Probe phase: Probe items from second list
-        for(int indexRight=0; indexRight<itemsRight.size(); indexRight++) {
+        for (int indexRight = 0; indexRight < itemsRight.size(); indexRight++) {
             IVisitablePointable itemRight = itemsRight.get(indexRight);
             byte[] buf = itemRight.getByteArray();
             int off = itemRight.getStartOffset();
@@ -128,7 +129,8 @@
 
             int indexLeft = IntegerPointable.getInteger(entry.getBuf(), entry.getOffset());
             ATypeTag fieldTypeLeft = PointableHelper.getTypeTag(itemTagTypesLeft.get(indexLeft));
-            if(fieldTypeLeft.isDerivedType() && fieldTypeLeft != PointableHelper.getTypeTag(itemTagTypesRight.get(indexRight))) {
+            if (fieldTypeLeft.isDerivedType()
+                    && fieldTypeLeft != PointableHelper.getTypeTag(itemTagTypesRight.get(indexRight))) {
                 return false;
             }
 
@@ -140,4 +142,3 @@
         return true;
     }
 }
-
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/RecordDeepEqualityChecker.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/RecordDeepEqualityChecker.java
index 699f2f8..1c033e9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/RecordDeepEqualityChecker.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/visitors/RecordDeepEqualityChecker.java
@@ -32,8 +32,8 @@
 import org.apache.hyracks.data.std.util.BinaryEntry;
 
 class RecordDeepEqualityChecker {
-    private final Pair<IVisitablePointable, Boolean> nestedVisitorArg = new Pair<IVisitablePointable, Boolean>(null,
-            false);
+    private final Pair<IVisitablePointable, Boolean> nestedVisitorArg =
+            new Pair<IVisitablePointable, Boolean>(null, false);
     private final DeepEqualityVisitorHelper deepEqualityVisitorHelper = new DeepEqualityVisitorHelper();
     private DeepEqualityVisitor visitor;
     private BinaryEntry keyEntry = new BinaryEntry();
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/IncompatibleTypeException.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/IncompatibleTypeException.java
index 3e5b311..5feb87f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/IncompatibleTypeException.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/IncompatibleTypeException.java
@@ -35,8 +35,7 @@
 
     // Incompatible input parameters, e.g., "1.0" > 1.0
     public IncompatibleTypeException(String functionName, byte typeTagLeft, byte typeTagRight) {
-        super(ErrorCode.TYPE_INCOMPATIBLE, functionName,
-                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTagLeft),
+        super(ErrorCode.TYPE_INCOMPATIBLE, functionName, EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTagLeft),
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTagRight));
     }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/TypeMismatchException.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/TypeMismatchException.java
index c061197..f6cf1c7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/TypeMismatchException.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/TypeMismatchException.java
@@ -41,5 +41,4 @@
                 EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(actualTypeTag));
     }
 
-
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnsupportedTypeException.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnsupportedTypeException.java
index af86bd8..29b3819 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnsupportedTypeException.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/exceptions/UnsupportedTypeException.java
@@ -34,7 +34,6 @@
 
     // Unsupported input type.
     public UnsupportedTypeException(String funcName, byte actualTypeTag) {
-        super(ErrorCode.TYPE_UNSUPPORTED, funcName,
-                EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(actualTypeTag));
+        super(ErrorCode.TYPE_UNSUPPORTED, funcName, EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(actualTypeTag));
     }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index 5acbeb9..f3eb6c9 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -158,6 +158,7 @@
 import org.apache.asterix.runtime.evaluators.functions.FullTextContainsDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.FullTextContainsWithoutOptionDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.GetItemDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.GetJobParameterByNameDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.GramTokensDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.HashedGramTokensDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.HashedWordTokensDescriptor;
@@ -437,6 +438,9 @@
         // Inject failure function
         fc.add(InjectFailureDescriptor.FACTORY);
 
+        // Get Job Parameter function
+        fc.add(GetJobParameterByNameDescriptor.FACTORY);
+
         // Switch case
         fc.add(SwitchCaseDescriptor.FACTORY);
 
@@ -737,8 +741,8 @@
      */
     private static IFunctionDescriptorFactory getGeneratedFunctionDescriptorFactory(Class<?> cl) {
         try {
-            String className = CodeGenHelper.getGeneratedClassName(cl.getName(),
-                    CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS);
+            String className =
+                    CodeGenHelper.getGeneratedClassName(cl.getName(), CodeGenHelper.DEFAULT_SUFFIX_FOR_GENERATED_CLASS);
             Class<?> generatedCl = cl.getClassLoader().loadClass(className);
             Field factory = generatedCl.getDeclaredField(FACTORY);
             return (IFunctionDescriptorFactory) factory.get(null);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
index 00a5ec8..b8d9778 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionTypeInferers.java
@@ -19,6 +19,7 @@
 
 package org.apache.asterix.runtime.functions;
 
+import org.apache.asterix.common.config.CompilerProperties;
 import org.apache.asterix.om.base.AOrderedList;
 import org.apache.asterix.om.base.AString;
 import org.apache.asterix.om.constants.AsterixConstantValue;
@@ -53,16 +54,24 @@
 
     public static final IFunctionTypeInferer SET_EXPRESSION_TYPE = new IFunctionTypeInferer() {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             fd.setImmutableStates(context.getType(expr));
         }
     };
 
+    public static final IFunctionTypeInferer SET_STRING_OFFSET = new IFunctionTypeInferer() {
+        @Override
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) {
+            fd.setImmutableStates(compilerProps.getStringOffset());
+        }
+    };
+
     public static final class CastTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression funcExpr = (AbstractFunctionCallExpression) expr;
             IAType rt = TypeCastUtils.getRequiredType(funcExpr);
             IAType it = (IAType) context.getType(funcExpr.getArguments().get(0).getValue());
@@ -72,8 +81,8 @@
 
     public static final class DeepEqualityTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
             IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
             IAType type1 = (IAType) context.getType(f.getArguments().get(1).getValue());
@@ -83,8 +92,8 @@
 
     public static final class FieldAccessByIndexTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
             IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
             switch (t.getTypeTag()) {
@@ -112,8 +121,8 @@
 
     public static final class FieldAccessNestedTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
             IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
             AOrderedList fieldPath =
@@ -141,8 +150,8 @@
 
     public static final class GetRecordFieldsTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
             IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
             ATypeTag typeTag = t.getTypeTag();
@@ -158,8 +167,8 @@
 
     public static final class GetRecordFieldValueTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
             IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
             ATypeTag typeTag = t.getTypeTag();
@@ -175,8 +184,8 @@
 
     public static final class OpenRecordConstructorTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             ARecordType rt = (ARecordType) context.getType(expr);
             fd.setImmutableStates(rt, computeOpenFields((AbstractFunctionCallExpression) expr, rt));
         }
@@ -204,8 +213,8 @@
 
     public static final class RecordAddFieldsTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
             IAType outType = (IAType) context.getType(expr);
             IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
@@ -223,8 +232,8 @@
 
     public static final class RecordMergeTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
             IAType outType = (IAType) context.getType(expr);
             IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
@@ -235,8 +244,8 @@
 
     public static final class RecordPairsTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expr;
             IAType t = (IAType) context.getType(fce.getArguments().get(0).getValue());
             ATypeTag typeTag = t.getTypeTag();
@@ -252,8 +261,8 @@
 
     public static final class RecordRemoveFieldsTypeInferer implements IFunctionTypeInferer {
         @Override
-        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context)
-                throws AlgebricksException {
+        public void infer(ILogicalExpression expr, IFunctionDescriptor fd, IVariableTypeEnvironment context,
+                CompilerProperties compilerProps) throws AlgebricksException {
             AbstractFunctionCallExpression f = (AbstractFunctionCallExpression) expr;
             IAType outType = (IAType) context.getType(expr);
             IAType type0 = (IAType) context.getType(f.getArguments().get(0).getValue());
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/JobEventListenerFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/JobEventListenerFactory.java
index 2749b5a..6faffc7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/JobEventListenerFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/JobEventListenerFactory.java
@@ -18,30 +18,52 @@
  */
 package org.apache.asterix.runtime.job.listener;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionManager;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.hyracks.api.context.IHyracksJobletContext;
 import org.apache.hyracks.api.job.IJobletEventListener;
 import org.apache.hyracks.api.job.IJobletEventListenerFactory;
+import org.apache.hyracks.api.job.JobParameterByteStore;
 import org.apache.hyracks.api.job.JobStatus;
 
-public class JobEventListenerFactory implements IJobletEventListenerFactory {
+public class JobEventListenerFactory implements IJobEventListenerFactory {
 
     private static final long serialVersionUID = 1L;
-    private final JobId jobId;
+
+    private TxnId txnId;
     private final boolean transactionalWrite;
 
-    public JobEventListenerFactory(JobId jobId, boolean transactionalWrite) {
-        this.jobId = jobId;
+    //To enable new Asterix TxnId for separate deployed job spec invocations
+    private static final byte[] TRANSACTION_ID_PARAMETER_NAME = "TxnIdParameter".getBytes();
+
+    public JobEventListenerFactory(TxnId txnId, boolean transactionalWrite) {
+        this.txnId = txnId;
         this.transactionalWrite = transactionalWrite;
     }
 
-    public JobId getJobId() {
-        return jobId;
+    @Override
+    public TxnId getTxnId(int datasetId) {
+        return txnId;
+    }
+
+    @Override
+    public IJobletEventListenerFactory copyFactory() {
+        return new JobEventListenerFactory(txnId, transactionalWrite);
+    }
+
+    @Override
+    public void updateListenerJobParameters(JobParameterByteStore jobParameterByteStore) {
+        String AsterixTransactionIdString = new String(jobParameterByteStore
+                .getParameterValue(TRANSACTION_ID_PARAMETER_NAME, 0, TRANSACTION_ID_PARAMETER_NAME.length));
+        if (AsterixTransactionIdString.length() > 0) {
+            this.txnId = new TxnId(Integer.parseInt(AsterixTransactionIdString));
+        }
     }
 
     @Override
@@ -51,12 +73,16 @@
             @Override
             public void jobletFinish(JobStatus jobStatus) {
                 try {
-                    ITransactionManager txnManager = ((INcApplicationContext) jobletContext.getServiceContext()
-                            .getApplicationContext()).getTransactionSubsystem().getTransactionManager();
-                    ITransactionContext txnContext = txnManager.getTransactionContext(jobId, false);
+                    ITransactionManager txnManager =
+                            ((INcApplicationContext) jobletContext.getServiceContext().getApplicationContext())
+                                    .getTransactionSubsystem().getTransactionManager();
+                    ITransactionContext txnContext = txnManager.getTransactionContext(txnId);
                     txnContext.setWriteTxn(transactionalWrite);
-                    txnManager.completedTransaction(txnContext, DatasetId.NULL, -1,
-                            !(jobStatus == JobStatus.FAILURE));
+                    if (jobStatus != JobStatus.FAILURE) {
+                        txnManager.commitTransaction(txnId);
+                    } else {
+                        txnManager.abortTransaction(txnId);
+                    }
                 } catch (ACIDException e) {
                     throw new Error(e);
                 }
@@ -65,8 +91,9 @@
             @Override
             public void jobletStart() {
                 try {
+                    TransactionOptions options = new TransactionOptions(AtomicityLevel.ENTITY_LEVEL);
                     ((INcApplicationContext) jobletContext.getServiceContext().getApplicationContext())
-                            .getTransactionSubsystem().getTransactionManager().getTransactionContext(jobId, true);
+                            .getTransactionSubsystem().getTransactionManager().beginTransaction(txnId, options);
                 } catch (ACIDException e) {
                     throw new Error(e);
                 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/MultiTransactionJobletEventListenerFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/MultiTransactionJobletEventListenerFactory.java
index f41f326..9b9206c 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/MultiTransactionJobletEventListenerFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/MultiTransactionJobletEventListenerFactory.java
@@ -18,35 +18,52 @@
  */
 package org.apache.asterix.runtime.job.listener;
 
-import java.util.List;
+import java.util.Map;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionManager;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.hyracks.api.context.IHyracksJobletContext;
 import org.apache.hyracks.api.job.IJobletEventListener;
 import org.apache.hyracks.api.job.IJobletEventListenerFactory;
+import org.apache.hyracks.api.job.JobParameterByteStore;
 import org.apache.hyracks.api.job.JobStatus;
 
 /**
  * This Joblet enable transactions on multiple datasets to take place in the same Hyracks Job
  * It takes a list of Transaction job ids instead of a single job Id
  */
-public class MultiTransactionJobletEventListenerFactory implements IJobletEventListenerFactory {
+public class MultiTransactionJobletEventListenerFactory implements IJobEventListenerFactory {
 
     private static final long serialVersionUID = 1L;
-    private final List<JobId> jobIds;
+    private final Map<Integer, TxnId> txnIdMap;
     private final boolean transactionalWrite;
 
-    public MultiTransactionJobletEventListenerFactory(List<JobId> jobIds, boolean transactionalWrite) {
-        this.jobIds = jobIds;
+    public MultiTransactionJobletEventListenerFactory(Map<Integer, TxnId> txnIdMap, boolean transactionalWrite) {
+        this.txnIdMap = txnIdMap;
         this.transactionalWrite = transactionalWrite;
     }
 
     @Override
+    public TxnId getTxnId(int datasetId) {
+        return txnIdMap.get(datasetId);
+    }
+
+    @Override
+    public IJobletEventListenerFactory copyFactory() {
+        return new MultiTransactionJobletEventListenerFactory(txnIdMap, transactionalWrite);
+    }
+
+    @Override
+    public void updateListenerJobParameters(JobParameterByteStore jobParameterByteStore) {
+        //no op
+    }
+
+    @Override
     public IJobletEventListener createListener(final IHyracksJobletContext jobletContext) {
 
         return new IJobletEventListener() {
@@ -56,11 +73,14 @@
                     ITransactionManager txnManager =
                             ((INcApplicationContext) jobletContext.getServiceContext().getApplicationContext())
                                     .getTransactionSubsystem().getTransactionManager();
-                    for (JobId jobId : jobIds) {
-                        ITransactionContext txnContext = txnManager.getTransactionContext(jobId, false);
+                    for (TxnId subTxnId : txnIdMap.values()) {
+                        ITransactionContext txnContext = txnManager.getTransactionContext(subTxnId);
                         txnContext.setWriteTxn(transactionalWrite);
-                        txnManager.completedTransaction(txnContext, DatasetId.NULL, -1,
-                                !(jobStatus == JobStatus.FAILURE));
+                        if (jobStatus != JobStatus.FAILURE) {
+                            txnManager.commitTransaction(subTxnId);
+                        } else {
+                            txnManager.abortTransaction(subTxnId);
+                        }
                     }
                 } catch (ACIDException e) {
                     throw new Error(e);
@@ -70,9 +90,11 @@
             @Override
             public void jobletStart() {
                 try {
-                    for (JobId jobId : jobIds) {
+                    TransactionOptions options =
+                            new TransactionOptions(ITransactionManager.AtomicityLevel.ENTITY_LEVEL);
+                    for (TxnId subTxnId : txnIdMap.values()) {
                         ((INcApplicationContext) jobletContext.getServiceContext().getApplicationContext())
-                                .getTransactionSubsystem().getTransactionManager().getTransactionContext(jobId, true);
+                                .getTransactionSubsystem().getTransactionManager().beginTransaction(subTxnId, options);
                     }
                 } catch (ACIDException e) {
                     throw new Error(e);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/NodeJobTracker.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/NodeJobTracker.java
new file mode 100644
index 0000000..9a42420
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/job/listener/NodeJobTracker.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.job.listener;
+
+import static org.apache.hyracks.api.constraints.expressions.ConstraintExpression.ExpressionTag;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.asterix.common.api.INodeJobTracker;
+import org.apache.hyracks.api.config.IOption;
+import org.apache.hyracks.api.constraints.Constraint;
+import org.apache.hyracks.api.constraints.expressions.ConstantExpression;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.api.job.JobStatus;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+
+@ThreadSafe
+public class NodeJobTracker implements INodeJobTracker {
+
+    private final Map<String, Set<JobId>> nodeJobs = new HashMap<>();
+
+    @Override
+    public synchronized void notifyJobCreation(JobId jobId, JobSpecification spec) {
+        getJobParticipatingNodes(spec).stream().map(nodeJobs::get).forEach(jobsSet -> jobsSet.add(jobId));
+    }
+
+    @Override
+    public synchronized void notifyJobStart(JobId jobId) {
+        // nothing to do
+    }
+
+    @Override
+    public synchronized void notifyJobFinish(JobId jobId, JobStatus jobStatus, List<Exception> exceptions) {
+        nodeJobs.values().forEach(jobsSet -> jobsSet.remove(jobId));
+    }
+
+    @Override
+    public synchronized void notifyNodeJoin(String nodeId, Map<IOption, Object> ncConfiguration) {
+        nodeJobs.computeIfAbsent(nodeId, key -> new HashSet<>());
+    }
+
+    @Override
+    public synchronized void notifyNodeFailure(Collection<String> deadNodeIds) {
+        deadNodeIds.forEach(nodeJobs::remove);
+    }
+
+    @Override
+    public synchronized Set<JobId> getPendingJobs(String nodeId) {
+        return nodeJobs.containsKey(nodeId) ? Collections.unmodifiableSet(nodeJobs.get(nodeId))
+                : Collections.emptySet();
+    }
+
+    @Override
+    public Set<String> getJobParticipatingNodes(JobSpecification spec) {
+        return spec.getUserConstraints().stream().map(Constraint::getRValue)
+                .filter(ce -> ce.getTag() == ExpressionTag.CONSTANT).map(ConstantExpression.class::cast)
+                .map(ConstantExpression::getValue).map(Object::toString).filter(nodeJobs::containsKey)
+                .collect(Collectors.toSet());
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReplicaEventMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReplicaEventMessage.java
deleted file mode 100644
index fe230b4..0000000
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReplicaEventMessage.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.message;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.asterix.common.replication.Replica;
-import org.apache.asterix.common.replication.ReplicaEvent;
-import org.apache.asterix.event.schema.cluster.Node;
-import org.apache.hyracks.api.application.IClusterLifecycleListener.ClusterEventType;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-public class ReplicaEventMessage implements INcAddressedMessage {
-
-    private static final long serialVersionUID = 1L;
-    private final String nodeId;
-    private final ClusterEventType event;
-    private final String nodeIPAddress;
-
-    public ReplicaEventMessage(String nodeId, String nodeIPAddress, ClusterEventType event) {
-        this.nodeId = nodeId;
-        this.nodeIPAddress = nodeIPAddress;
-        this.event = event;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public ClusterEventType getEvent() {
-        return event;
-    }
-
-    public String getNodeIPAddress() {
-        return nodeIPAddress;
-    }
-
-    @Override
-    public void handle(INcApplicationContext appContext) throws HyracksDataException, InterruptedException {
-        Node node = new Node();
-        node.setId(nodeId);
-        node.setClusterIp(nodeIPAddress);
-        Replica replica = new Replica(node);
-        appContext.getReplicationManager().reportReplicaEvent(new ReplicaEvent(replica, event));
-    }
-
-    @Override
-    public String toString() {
-        return ReplicaEventMessage.class.getSimpleName();
-    }
-}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersMessage.java
new file mode 100644
index 0000000..fe9a5b8
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersMessage.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.message;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
+import org.apache.asterix.common.messaging.api.INCMessageBroker;
+import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
+import org.apache.asterix.common.transactions.IResourceIdManager;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ReportLocalCountersMessage implements ICcAddressedMessage {
+    private static final long serialVersionUID = 1L;
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final long maxResourceId;
+    private final long maxTxnId;
+    private final long maxJobId;
+    private final String src;
+
+    public ReportLocalCountersMessage(String src, long maxResourceId, long maxTxnId, long maxJobId) {
+        this.src = src;
+        this.maxResourceId = maxResourceId;
+        this.maxTxnId = maxTxnId;
+        this.maxJobId = maxJobId;
+    }
+
+    @Override
+    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        IResourceIdManager resourceIdManager = appCtx.getResourceIdManager();
+        try {
+            appCtx.getTxnIdFactory().ensureMinimumId(maxTxnId);
+        } catch (AlgebricksException e) {
+            throw HyracksDataException.create(e);
+        }
+        resourceIdManager.report(src, maxResourceId);
+        ((ClusterControllerService) appCtx.getServiceContext().getControllerService()).getJobIdFactory()
+                .setMaxJobId(maxJobId);
+    }
+
+    public static void send(CcId ccId, NodeControllerService ncs) throws HyracksDataException {
+        INcApplicationContext appContext = (INcApplicationContext) ncs.getApplicationContext();
+        long maxResourceId = Math.max(appContext.getLocalResourceRepository().maxId(),
+                MetadataIndexImmutableProperties.FIRST_AVAILABLE_USER_DATASET_ID);
+        long maxTxnId = appContext.getMaxTxnId();
+        long maxJobId = ncs.getMaxJobId(ccId);
+        ReportLocalCountersMessage countersMessage =
+                new ReportLocalCountersMessage(ncs.getId(), maxResourceId, maxTxnId, maxJobId);
+        try {
+            ((INCMessageBroker) ncs.getContext().getMessageBroker()).sendMessageToCC(ccId, countersMessage);
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Unable to report local counters", e);
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return ReportLocalCountersMessage.class.getSimpleName();
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersRequestMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersRequestMessage.java
new file mode 100644
index 0000000..51f53e7
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportLocalCountersRequestMessage.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.message;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.messaging.CcIdentifiedMessage;
+import org.apache.asterix.common.messaging.api.INcAddressedMessage;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.control.nc.NodeControllerService;
+
+public class ReportLocalCountersRequestMessage extends CcIdentifiedMessage implements INcAddressedMessage {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public void handle(INcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        ReportLocalCountersMessage.send(getCcId(),
+                (NodeControllerService) appCtx.getServiceContext().getControllerService());
+    }
+
+    @Override
+    public String toString() {
+        return ReportLocalCountersRequestMessage.class.getSimpleName();
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdMessage.java
deleted file mode 100644
index 277c0ba..0000000
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdMessage.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.message;
-
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
-import org.apache.asterix.common.messaging.api.INCMessageBroker;
-import org.apache.asterix.common.metadata.MetadataIndexImmutableProperties;
-import org.apache.asterix.common.transactions.IResourceIdManager;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-public class ReportMaxResourceIdMessage implements ICcAddressedMessage {
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(ReportMaxResourceIdMessage.class.getName());
-    private final long maxResourceId;
-    private final String src;
-
-    public ReportMaxResourceIdMessage(String src, long maxResourceId) {
-        this.src = src;
-        this.maxResourceId = maxResourceId;
-    }
-
-    public long getMaxResourceId() {
-        return maxResourceId;
-    }
-
-    @Override
-    public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        IResourceIdManager resourceIdManager = appCtx.getResourceIdManager();
-        resourceIdManager.report(src, maxResourceId);
-    }
-
-    public static void send(NodeControllerService cs) throws HyracksDataException {
-        NodeControllerService ncs = cs;
-        INcApplicationContext appContext = (INcApplicationContext) ncs.getApplicationContext();
-        long maxResourceId = Math.max(appContext.getLocalResourceRepository().maxId(),
-                MetadataIndexImmutableProperties.FIRST_AVAILABLE_USER_DATASET_ID);
-        ReportMaxResourceIdMessage maxResourceIdMsg = new ReportMaxResourceIdMessage(ncs.getId(), maxResourceId);
-        try {
-            ((INCMessageBroker) ncs.getContext().getMessageBroker()).sendMessageToCC(maxResourceIdMsg);
-        } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Unable to report max local resource id", e);
-            throw HyracksDataException.create(e);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return ReportMaxResourceIdMessage.class.getSimpleName();
-    }
-}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdRequestMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdRequestMessage.java
deleted file mode 100644
index a43376d..0000000
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ReportMaxResourceIdRequestMessage.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.runtime.message;
-
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.messaging.api.INcAddressedMessage;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-public class ReportMaxResourceIdRequestMessage implements INcAddressedMessage {
-    private static final long serialVersionUID = 1L;
-
-    @Override
-    public void handle(INcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
-        ReportMaxResourceIdMessage.send((NodeControllerService) appCtx.getServiceContext().getControllerService());
-    }
-
-    @Override
-    public String toString() {
-        return ReportMaxResourceIdRequestMessage.class.getSimpleName();
-    }
-}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ResourceIdRequestMessage.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ResourceIdRequestMessage.java
index decc1a9..3e172c7 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ResourceIdRequestMessage.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/ResourceIdRequestMessage.java
@@ -39,20 +39,20 @@
     public void handle(ICcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
         try {
             ICCMessageBroker broker = (ICCMessageBroker) appCtx.getServiceContext().getMessageBroker();
-            ResourceIdRequestResponseMessage reponse = new ResourceIdRequestResponseMessage();
+            ResourceIdRequestResponseMessage response = new ResourceIdRequestResponseMessage();
             IClusterStateManager clusterStateManager = appCtx.getClusterStateManager();
             if (!clusterStateManager.isClusterActive()) {
-                reponse.setResourceId(-1);
-                reponse.setException(new Exception("Cannot generate global resource id when cluster is not active."));
+                response.setResourceId(-1);
+                response.setException(new Exception("Cannot generate global resource id when cluster is not active."));
             } else {
                 IResourceIdManager resourceIdManager = appCtx.getResourceIdManager();
-                reponse.setResourceId(resourceIdManager.createResourceId());
-                if (reponse.getResourceId() < 0) {
-                    reponse.setException(new Exception("One or more nodes has not reported max resource id."));
+                response.setResourceId(resourceIdManager.createResourceId());
+                if (response.getResourceId() < 0) {
+                    response.setException(new Exception("One or more nodes has not reported max resource id."));
                 }
                 requestMaxResourceID(clusterStateManager, resourceIdManager, broker);
             }
-            broker.sendApplicationMessageToNC(reponse, src);
+            broker.sendApplicationMessageToNC(response, src);
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
@@ -61,7 +61,7 @@
     private void requestMaxResourceID(IClusterStateManager clusterStateManager, IResourceIdManager resourceIdManager,
             ICCMessageBroker broker) throws Exception {
         Set<String> getParticipantNodes = clusterStateManager.getParticipantNodes();
-        ReportMaxResourceIdRequestMessage msg = new ReportMaxResourceIdRequestMessage();
+        ReportLocalCountersRequestMessage msg = new ReportLocalCountersRequestMessage();
         for (String nodeId : getParticipantNodes) {
             if (!resourceIdManager.reported(nodeId)) {
                 broker.sendApplicationMessageToNC(msg, nodeId);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockRequest.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockRequest.java
new file mode 100644
index 0000000..b8578ec
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockRequest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.message;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.dataflow.ICcApplicationContext;
+import org.apache.asterix.common.messaging.api.ICCMessageBroker;
+import org.apache.asterix.common.messaging.api.ICcAddressedMessage;
+import org.apache.asterix.common.messaging.api.INCMessageBroker;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class TxnIdBlockRequest implements ICcAddressedMessage {
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final int BLOCK_SIZE = 100;
+    private static final long serialVersionUID = 1L;
+
+    private static BlockingQueue<TxnIdBlockResponse> blockQueue = new LinkedBlockingQueue<>();
+    private final String nodeId;
+    private final int blockSizeRequested;
+
+    public TxnIdBlockRequest(String nodeId, int blockSizeRequested) {
+        this.nodeId = nodeId;
+        this.blockSizeRequested = blockSizeRequested;
+    }
+
+    @Override
+    public void handle(ICcApplicationContext appCtx) throws HyracksDataException {
+        try {
+            ICCMessageBroker broker = (ICCMessageBroker) appCtx.getServiceContext().getMessageBroker();
+            long startingId = appCtx.getTxnIdFactory().getIdBlock(blockSizeRequested);
+            TxnIdBlockResponse response = new TxnIdBlockResponse(startingId, blockSizeRequested);
+            broker.sendApplicationMessageToNC(response, nodeId);
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    public static Block send(INcApplicationContext ncs) throws HyracksDataException {
+        TxnIdBlockRequest blockRequestMessage = new TxnIdBlockRequest(ncs.getServiceContext().getNodeId(), BLOCK_SIZE);
+        try {
+            ((INCMessageBroker) ncs.getServiceContext().getMessageBroker()).sendMessageToPrimaryCC(blockRequestMessage);
+            TxnIdBlockResponse response = blockQueue.take();
+            return new Block(response.getStartingId(), response.getBlockSize());
+        } catch (Exception e) {
+            LOGGER.log(Level.ERROR, "Unable to request transaction id block", e);
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    static void addResponse(TxnIdBlockResponse response) {
+        blockQueue.offer(response);
+    }
+
+    @Override
+    public String toString() {
+        return TxnIdBlockRequest.class.getSimpleName();
+    }
+
+    public static class Block {
+
+        private final long startingId;
+        private final int blockSize;
+
+        public Block(long startingId, int blockSize) {
+            this.startingId = startingId;
+            this.blockSize = blockSize;
+        }
+
+        public long getStartingId() {
+            return startingId;
+        }
+
+        public int getBlockSize() {
+            return blockSize;
+        }
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockResponse.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockResponse.java
new file mode 100644
index 0000000..46d742a
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/message/TxnIdBlockResponse.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.message;
+
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.messaging.api.INcAddressedMessage;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class TxnIdBlockResponse implements INcAddressedMessage {
+    private static final long serialVersionUID = 1L;
+    private final long startingId;
+    private final int blockSize;
+
+    public TxnIdBlockResponse(long startingId, int blockSize) {
+        this.startingId = startingId;
+        this.blockSize = blockSize;
+    }
+
+    public long getStartingId() {
+        return startingId;
+    }
+
+    public int getBlockSize() {
+        return blockSize;
+    }
+
+    @Override
+    public void handle(INcApplicationContext appCtx) throws HyracksDataException, InterruptedException {
+        TxnIdBlockRequest.addResponse(this);
+    }
+
+    @Override
+    public String toString() {
+        return TxnIdBlockResponse.class.getSimpleName();
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorDescriptor.java
new file mode 100644
index 0000000..74590c7
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorDescriptor.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.operators;
+
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
+import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
+import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.dataflow.TreeIndexBulkLoadOperatorDescriptor;
+
+public class LSMIndexBulkLoadOperatorDescriptor extends TreeIndexBulkLoadOperatorDescriptor {
+
+    private static final long serialVersionUID = 1L;
+
+    public enum BulkLoadUsage {
+        LOAD,
+        CREATE_INDEX
+    }
+
+    protected final IIndexDataflowHelperFactory primaryIndexHelperFactory;
+
+    protected final BulkLoadUsage usage;
+
+    protected final int datasetId;
+
+    public LSMIndexBulkLoadOperatorDescriptor(IOperatorDescriptorRegistry spec, RecordDescriptor outRecDesc,
+            int[] fieldPermutation, float fillFactor, boolean verifyInput, long numElementsHint,
+            boolean checkIfEmptyIndex, IIndexDataflowHelperFactory indexHelperFactory,
+            IIndexDataflowHelperFactory primaryIndexHelperFactory, BulkLoadUsage usage, int datasetId) {
+        super(spec, outRecDesc, fieldPermutation, fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex,
+                indexHelperFactory);
+        this.primaryIndexHelperFactory = primaryIndexHelperFactory;
+        this.usage = usage;
+        this.datasetId = datasetId;
+    }
+
+    @Override
+    public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
+            IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) throws HyracksDataException {
+        return new LSMIndexBulkLoadOperatorNodePushable(indexHelperFactory, primaryIndexHelperFactory, ctx, partition,
+                fieldPermutation, fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex,
+                recordDescProvider.getInputRecordDescriptor(this.getActivityId(), 0), usage, datasetId);
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java
new file mode 100644
index 0000000..2415556
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMIndexBulkLoadOperatorNodePushable.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.operators;
+
+import java.util.List;
+
+import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.runtime.operators.LSMIndexBulkLoadOperatorDescriptor.BulkLoadUsage;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.dataflow.IndexBulkLoadOperatorNodePushable;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexDiskComponentBulkLoader;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
+
+public class LSMIndexBulkLoadOperatorNodePushable extends IndexBulkLoadOperatorNodePushable {
+    protected final BulkLoadUsage usage;
+
+    protected final IIndexDataflowHelper primaryIndexHelper;
+    protected final IDatasetLifecycleManager datasetManager;
+    protected final int datasetId;
+    protected final int partition;
+
+    protected ILSMIndex primaryIndex;
+
+    public LSMIndexBulkLoadOperatorNodePushable(IIndexDataflowHelperFactory indexDataflowHelperFactory,
+            IIndexDataflowHelperFactory priamryIndexDataflowHelperFactory, IHyracksTaskContext ctx, int partition,
+            int[] fieldPermutation, float fillFactor, boolean verifyInput, long numElementsHint,
+            boolean checkIfEmptyIndex, RecordDescriptor recDesc, BulkLoadUsage usage, int datasetId)
+            throws HyracksDataException {
+        super(indexDataflowHelperFactory, ctx, partition, fieldPermutation, fillFactor, verifyInput, numElementsHint,
+                checkIfEmptyIndex, recDesc);
+
+        if (priamryIndexDataflowHelperFactory != null) {
+            this.primaryIndexHelper =
+                    priamryIndexDataflowHelperFactory.create(ctx.getJobletContext().getServiceContext(), partition);
+        } else {
+            this.primaryIndexHelper = null;
+        }
+        this.usage = usage;
+        this.datasetId = datasetId;
+        this.partition = partition;
+        INcApplicationContext ncCtx =
+                (INcApplicationContext) ctx.getJobletContext().getServiceContext().getApplicationContext();
+        datasetManager = ncCtx.getDatasetLifecycleManager();
+    }
+
+    @Override
+    protected void initializeBulkLoader() throws HyracksDataException {
+        ILSMIndex targetIndex = (ILSMIndex) index;
+        if (usage.equals(BulkLoadUsage.LOAD)) {
+            // for a loaded dataset, we use the default Id 0 which is guaranteed to be smaller
+            // than Ids of all memory components
+
+            // TODO handle component Id for datasets loaded multiple times
+            // TODO move this piece of code to io operation callback
+            bulkLoader = targetIndex.createBulkLoader(fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex);
+            ILSMDiskComponent diskComponent = ((LSMIndexDiskComponentBulkLoader) bulkLoader).getComponent();
+            LSMComponentIdUtils.persist(LSMComponentId.DEFAULT_COMPONENT_ID, diskComponent.getMetadata());
+        } else {
+            primaryIndexHelper.open();
+            primaryIndex = (ILSMIndex) primaryIndexHelper.getIndexInstance();
+            List<ILSMDiskComponent> primaryComponents = primaryIndex.getDiskComponents();
+            bulkLoader = targetIndex.createBulkLoader(fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex);
+            if (!primaryComponents.isEmpty()) {
+                // TODO move this piece of code to io operation callback
+                // Ideally, this should be done in io operation callback when a bulk load operation is finished
+                // However, currently we don't have an extensible callback mechanism to support this
+                ILSMComponentId bulkloadId = LSMComponentIdUtils.union(primaryComponents.get(0).getId(),
+                        primaryComponents.get(primaryComponents.size() - 1).getId());
+                ILSMDiskComponent diskComponent = ((LSMIndexDiskComponentBulkLoader) bulkLoader).getComponent();
+                LSMComponentIdUtils.persist(bulkloadId, diskComponent.getMetadata());
+            }
+        }
+    }
+
+    @Override
+    public void close() throws HyracksDataException {
+        try {
+            super.close();
+        } finally {
+            if (primaryIndex != null) {
+                primaryIndexHelper.close();
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
index 1f41c82..21259cc 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMPrimaryUpsertOperatorNodePushable.java
@@ -25,7 +25,6 @@
 import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.dataflow.LSMIndexUtil;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.transactions.ILogMarkerCallback;
 import org.apache.asterix.common.transactions.PrimaryIndexLogMarkerCallback;
 import org.apache.asterix.om.pointables.nonvisitor.ARecordPointable;
@@ -55,6 +54,7 @@
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.common.tuples.PermutingFrameTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameOperationCallback;
@@ -64,6 +64,7 @@
 import org.apache.hyracks.storage.am.lsm.common.dataflow.LSMIndexInsertUpdateDeleteOperatorNodePushable;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
 
@@ -96,6 +97,7 @@
     private final ISearchOperationCallbackFactory searchCallbackFactory;
     private final IFrameTupleProcessor processor;
     private LSMTreeIndexAccessor lsmAccessor;
+    private IIndexAccessParameters iap;
 
     public LSMPrimaryUpsertOperatorNodePushable(IHyracksTaskContext ctx, int partition,
             IIndexDataflowHelperFactory indexHelperFactory, int[] fieldPermutation, RecordDescriptor inputRecDesc,
@@ -134,13 +136,14 @@
                     tb.reset();
                     boolean recordWasInserted = false;
                     boolean recordWasDeleted = false;
+                    boolean isDelete = isDeleteOperation(tuple, numOfPrimaryKeys);
                     resetSearchPredicate(index);
-                    if (isFiltered || hasSecondaries) {
+                    if (isFiltered || isDelete || hasSecondaries) {
                         lsmAccessor.search(cursor, searchPred);
                         if (cursor.hasNext()) {
                             cursor.next();
                             prevTuple = cursor.getTuple();
-                            cursor.reset(); // end the search
+                            cursor.close(); // end the search
                             appendFilterToPrevTuple();
                             appendPrevRecord();
                             appendPreviousMeta();
@@ -152,12 +155,13 @@
                         searchCallback.before(key); // lock
                         appendPreviousTupleAsMissing();
                     }
-                    if (isDeleteOperation(tuple, numOfPrimaryKeys)) {
+                    if (isDelete && prevTuple != null) {
                         // Only delete if it is a delete and not upsert
+                        // And previous tuple with the same key was found
                         abstractModCallback.setOp(Operation.DELETE);
                         lsmAccessor.forceDelete(tuple);
                         recordWasDeleted = true;
-                    } else {
+                    } else if (!isDelete) {
                         abstractModCallback.setOp(Operation.UPSERT);
                         lsmAccessor.forceUpsert(tuple);
                         recordWasInserted = true;
@@ -218,7 +222,8 @@
             abstractModCallback = (AbstractIndexModificationOperationCallback) modCallback;
             searchCallback = (LockThenSearchOperationCallback) searchCallbackFactory
                     .createSearchOperationCallback(indexHelper.getResource().getId(), ctx, this);
-            indexAccessor = index.createAccessor(abstractModCallback, searchCallback);
+            iap = new IndexAccessParameters(abstractModCallback, searchCallback);
+            indexAccessor = index.createAccessor(iap);
             lsmAccessor = (LSMTreeIndexAccessor) indexAccessor;
             cursor = indexAccessor.createSearchCursor(false);
             frameTuple = new FrameTupleReference();
@@ -314,7 +319,7 @@
         if (isFiltered) {
             writeMissingField();
         }
-        cursor.reset();
+        cursor.close();
     }
 
     /**
@@ -326,7 +331,7 @@
         appender.write(writer, true);
     }
 
-    private void appendFilterToPrevTuple() throws IOException, AsterixException {
+    private void appendFilterToPrevTuple() throws IOException {
         if (isFiltered) {
             prevRecWithPKWithFilterValue.reset();
             for (int i = 0; i < prevTuple.getFieldCount(); i++) {
@@ -357,7 +362,7 @@
     public void close() throws HyracksDataException {
         try {
             try {
-                cursor.close();
+                cursor.destroy();
             } finally {
                 writer.close();
             }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
index cb81b64..6d9ec47 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/LSMSecondaryIndexBulkLoadNodePushable.java
@@ -19,24 +19,20 @@
 package org.apache.asterix.runtime.operators;
 
 import java.nio.ByteBuffer;
-import java.util.List;
 
 import org.apache.asterix.runtime.operators.LSMSecondaryIndexCreationTupleProcessorNodePushable.DeletedTupleCounter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.primitive.LongPointable;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
 import org.apache.hyracks.storage.am.common.tuples.PermutingFrameTupleReference;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexDiskComponentBulkLoader;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
 
 /**
  * This operator node is used to bulk load incoming tuples (scanned from the primary index)
@@ -56,12 +52,9 @@
     private ILSMIndex primaryIndex;
     private ILSMIndex secondaryIndex;
 
-    private ILSMDiskComponent component;
-    private ILSMDiskComponentBulkLoader componentBulkLoader;
+    private LSMIndexDiskComponentBulkLoader componentBulkLoader;
     private int currentComponentPos = -1;
 
-    private ILSMDiskComponent[] diskComponents;
-
     public LSMSecondaryIndexBulkLoadNodePushable(IHyracksTaskContext ctx, int partition, RecordDescriptor inputRecDesc,
             IIndexDataflowHelperFactory primaryIndexHelperFactory,
             IIndexDataflowHelperFactory secondaryIndexHelperFactory, int[] fieldPermutation, int numTagFields,
@@ -92,7 +85,6 @@
         super.open();
         primaryIndexHelper.open();
         primaryIndex = (ILSMIndex) primaryIndexHelper.getIndexInstance();
-        diskComponents = new ILSMDiskComponent[primaryIndex.getDiskComponents().size()];
         secondaryIndexHelper.open();
         secondaryIndex = (ILSMIndex) secondaryIndexHelper.getIndexInstance();
 
@@ -107,8 +99,6 @@
             closeException = e;
         }
 
-        activateComponents();
-
         try {
             if (primaryIndexHelper != null) {
                 primaryIndexHelper.close();
@@ -184,24 +174,22 @@
     }
 
     private void endCurrentComponent() throws HyracksDataException {
-        if (component != null) {
-            // set disk component id
-
+        if (componentBulkLoader != null) {
             componentBulkLoader.end();
-            diskComponents[currentComponentPos] = component;
-
             componentBulkLoader = null;
-            component = null;
         }
     }
 
     private void loadNewComponent(int componentPos) throws HyracksDataException {
         endCurrentComponent();
 
-        component = secondaryIndex.createBulkLoadTarget();
         int numTuples = getNumDeletedTuples(componentPos);
-        componentBulkLoader = component.createBulkLoader(1.0f, false, numTuples, false, true, true);
-
+        ILSMDiskComponent primaryComponent = primaryIndex.getDiskComponents().get(componentPos);
+        componentBulkLoader =
+                (LSMIndexDiskComponentBulkLoader) secondaryIndex.createBulkLoader(1.0f, false, numTuples, false);
+        ILSMDiskComponent diskComponent = componentBulkLoader.getComponent();
+        // TODO move this piece of code to io operation callback
+        LSMComponentIdUtils.persist(primaryComponent.getId(), diskComponent.getMetadata());
     }
 
     private void addAntiMatterTuple(ITupleReference tuple) throws HyracksDataException {
@@ -220,29 +208,6 @@
 
     }
 
-    private void activateComponents() throws HyracksDataException {
-        List<ILSMDiskComponent> primaryComponents = primaryIndex.getDiskComponents();
-        for (int i = diskComponents.length - 1; i >= 0; i--) {
-            // start from the oldest component to the newest component
-            if (diskComponents[i] != null && diskComponents[i].getComponentSize() > 0) {
-                secondaryIndex.getIOOperationCallback().afterOperation(LSMOperationType.FLUSH, null, diskComponents[i]);
-
-                // setting component id has to be place between afterOperation and addBulkLoadedComponent,
-                // since afterOperation would set a flush component id (but it's not invalid)
-                // and addBulkLoadedComponent would finalize the component
-                ILSMDiskComponentId primaryComponentId = primaryComponents.get(i).getComponentId();
-                //set component id
-                diskComponents[i].getMetadata().put(ILSMDiskComponentId.COMPONENT_ID_MIN_KEY,
-                        LongPointable.FACTORY.createPointable(primaryComponentId.getMinId()));
-                diskComponents[i].getMetadata().put(ILSMDiskComponentId.COMPONENT_ID_MAX_KEY,
-                        LongPointable.FACTORY.createPointable(primaryComponentId.getMaxId()));
-
-                ((AbstractLSMIndex) secondaryIndex).getLsmHarness().addBulkLoadedComponent(diskComponents[i]);
-
-            }
-        }
-    }
-
     private int getNumDeletedTuples(int componentPos) {
         DeletedTupleCounter counter = (DeletedTupleCounter) ctx.getStateObject(partition);
         return counter.get(componentPos);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/std/FlushDatasetOperatorDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/std/FlushDatasetOperatorDescriptor.java
index f2deb74..d61e9a0 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/std/FlushDatasetOperatorDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/operators/std/FlushDatasetOperatorDescriptor.java
@@ -28,7 +28,7 @@
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ImmutableDatasetId;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
@@ -40,12 +40,12 @@
 
 public class FlushDatasetOperatorDescriptor extends AbstractSingleActivityOperatorDescriptor {
     private static final long serialVersionUID = 1L;
-    private final JobId jobId;
+    private final TxnId txnId;
     private final DatasetId datasetId;
 
-    public FlushDatasetOperatorDescriptor(IOperatorDescriptorRegistry spec, JobId jobId, int datasetId) {
+    public FlushDatasetOperatorDescriptor(IOperatorDescriptorRegistry spec, TxnId txnId, int datasetId) {
         super(spec, 1, 0);
-        this.jobId = jobId;
+        this.txnId = txnId;
         this.datasetId = new ImmutableDatasetId(datasetId);
     }
 
@@ -78,7 +78,7 @@
                     ILockManager lockManager = appCtx.getTransactionSubsystem().getLockManager();
                     ITransactionManager txnManager = appCtx.getTransactionSubsystem().getTransactionManager();
                     // get the local transaction
-                    ITransactionContext txnCtx = txnManager.getTransactionContext(jobId, false);
+                    ITransactionContext txnCtx = txnManager.getTransactionContext(txnId);
                     // lock the dataset granule
                     lockManager.lock(datasetId, -1, LockMode.S, txnCtx);
                     // flush the dataset synchronously
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/runningaggregates/std/TidRunningAggregateDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/runningaggregates/std/TidRunningAggregateDescriptor.java
index 207ce85..0a959d6 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/runningaggregates/std/TidRunningAggregateDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/runningaggregates/std/TidRunningAggregateDescriptor.java
@@ -60,8 +60,8 @@
                 return new IRunningAggregateEvaluator() {
 
                     private final ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
-                    private final ISerializerDeserializer<AInt64> serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private final ISerializerDeserializer<AInt64> serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private final AMutableInt64 m = new AMutableInt64(0);
                     private int cnt;
 
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/GlobalResourceIdFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/GlobalResourceIdFactory.java
index b7a4c14..78b1f17 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/GlobalResourceIdFactory.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/transaction/GlobalResourceIdFactory.java
@@ -62,7 +62,7 @@
             //if no response available or it has an exception, request a new one
             if (reponse == null || reponse.getException() != null) {
                 ResourceIdRequestMessage msg = new ResourceIdRequestMessage(nodeId);
-                ((INCMessageBroker) serviceCtx.getMessageBroker()).sendMessageToCC(msg);
+                ((INCMessageBroker) serviceCtx.getMessageBroker()).sendMessageToPrimaryCC(msg);
                 reponse = resourceIdResponseQ.take();
                 if (reponse.getException() != null) {
                     throw HyracksDataException.create(reponse.getException());
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/unnestingfunctions/std/RangeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/unnestingfunctions/std/RangeDescriptor.java
index d102d7c..5ad8d3f 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/unnestingfunctions/std/RangeDescriptor.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/unnestingfunctions/std/RangeDescriptor.java
@@ -67,8 +67,8 @@
                 return new IUnnestingEvaluator() {
                     private ArrayBackedValueStorage resultStorage = new ArrayBackedValueStorage();
                     @SuppressWarnings("rawtypes")
-                    private ISerializerDeserializer serde = SerializerDeserializerProvider.INSTANCE
-                            .getSerializerDeserializer(BuiltinType.AINT64);
+                    private ISerializerDeserializer serde =
+                            SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.AINT64);
                     private IPointable inputVal = new VoidPointable();
                     private IScalarEvaluator eval0 = args[0].createScalarEvaluator(ctx);
                     private IScalarEvaluator eval1 = args[1].createScalarEvaluator(ctx);
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/BulkTxnIdFactory.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/BulkTxnIdFactory.java
new file mode 100644
index 0000000..542bc17
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/BulkTxnIdFactory.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.asterix.runtime.utils;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.asterix.common.transactions.ITxnIdFactory;
+import org.apache.asterix.common.transactions.TxnId;
+
+class BulkTxnIdFactory implements ITxnIdFactory {
+
+    private final AtomicLong maxId = new AtomicLong();
+
+    @Override
+    public TxnId create() {
+        return new TxnId(maxId.incrementAndGet());
+    }
+
+    @Override
+    public long getIdBlock(int blockSize) {
+        if (blockSize < 1) {
+            throw new IllegalArgumentException("block size cannot be smaller than 1, but was " + blockSize);
+        }
+        return maxId.getAndAdd(blockSize) + 1;
+    }
+
+    @Override
+    public void ensureMinimumId(long id) {
+        this.maxId.getAndUpdate(next -> Math.max(next, id));
+    }
+
+    @Override
+    public long getMaxTxnId() {
+        return maxId.get();
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java
index 855031e..4157e16 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/CcApplicationContext.java
@@ -21,7 +21,10 @@
 import java.io.IOException;
 import java.util.function.Supplier;
 
+import org.apache.asterix.common.api.ICoordinationService;
 import org.apache.asterix.common.api.IMetadataLockManager;
+import org.apache.asterix.common.api.INodeJobTracker;
+import org.apache.asterix.common.transactions.ITxnIdFactory;
 import org.apache.asterix.common.cluster.IClusterStateManager;
 import org.apache.asterix.common.cluster.IGlobalRecoveryManager;
 import org.apache.asterix.common.config.ActiveProperties;
@@ -38,12 +41,13 @@
 import org.apache.asterix.common.config.TransactionProperties;
 import org.apache.asterix.common.context.IStorageComponentProvider;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
-import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.library.ILibraryManager;
 import org.apache.asterix.common.metadata.IMetadataBootstrap;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
+import org.apache.asterix.common.replication.INcLifecycleCoordinator;
 import org.apache.asterix.common.transactions.IResourceIdManager;
+import org.apache.asterix.runtime.job.listener.NodeJobTracker;
 import org.apache.asterix.runtime.transaction.ResourceIdManager;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.application.ICCServiceContext;
 import org.apache.hyracks.api.client.HyracksConnection;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
@@ -77,16 +81,18 @@
     private Supplier<IMetadataBootstrap> metadataBootstrapSupplier;
     private IHyracksClientConnection hcc;
     private Object extensionManager;
-    private IFaultToleranceStrategy ftStrategy;
+    private INcLifecycleCoordinator ftStrategy;
     private IJobLifecycleListener activeLifeCycleListener;
     private IMetadataLockManager mdLockManager;
     private IClusterStateManager clusterStateManager;
+    private final INodeJobTracker nodeJobTracker;
+    private final ITxnIdFactory txnIdFactory;
 
     public CcApplicationContext(ICCServiceContext ccServiceCtx, IHyracksClientConnection hcc,
             ILibraryManager libraryManager, Supplier<IMetadataBootstrap> metadataBootstrapSupplier,
-            IGlobalRecoveryManager globalRecoveryManager, IFaultToleranceStrategy ftStrategy,
+            IGlobalRecoveryManager globalRecoveryManager, INcLifecycleCoordinator ftStrategy,
             IJobLifecycleListener activeLifeCycleListener, IStorageComponentProvider storageComponentProvider,
-            IMetadataLockManager mdLockManager) throws AsterixException, IOException {
+            IMetadataLockManager mdLockManager) throws AlgebricksException, IOException {
         this.ccServiceCtx = ccServiceCtx;
         this.hcc = hcc;
         this.libraryManager = libraryManager;
@@ -103,7 +109,6 @@
         extensionProperties = new ExtensionProperties(propertiesAccessor);
         replicationProperties = new ReplicationProperties(propertiesAccessor);
         this.ftStrategy = ftStrategy;
-        this.hcc = hcc;
         this.buildProperties = new BuildProperties(propertiesAccessor);
         this.messagingProperties = new MessagingProperties(propertiesAccessor);
         this.nodeProperties = new NodeProperties(propertiesAccessor);
@@ -114,6 +119,9 @@
         clusterStateManager = new ClusterStateManager();
         clusterStateManager.setCcAppCtx(this);
         this.resourceIdManager = new ResourceIdManager(clusterStateManager);
+        nodeJobTracker = new NodeJobTracker();
+        txnIdFactory = new BulkTxnIdFactory();
+
     }
 
     @Override
@@ -197,10 +205,12 @@
         return extensionManager;
     }
 
+    @Override
     public void setExtensionManager(Object extensionManager) {
         this.extensionManager = extensionManager;
     }
 
+    @Override
     public ExtensionProperties getExtensionProperties() {
         return extensionProperties;
     }
@@ -226,7 +236,7 @@
     }
 
     @Override
-    public IFaultToleranceStrategy getFaultToleranceStrategy() {
+    public INcLifecycleCoordinator getNcLifecycleCoordinator() {
         return ftStrategy;
     }
 
@@ -249,4 +259,18 @@
     public IClusterStateManager getClusterStateManager() {
         return clusterStateManager;
     }
+
+    @Override
+    public INodeJobTracker getNodeJobTracker() {
+        return nodeJobTracker;
+    }
+
+    @Override
+    public ICoordinationService getCoordinationService() {
+        return NoOpCoordinationService.INSTANCE;
+    }
+
+    public ITxnIdFactory getTxnIdFactory() {
+        return txnIdFactory;
+    }
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
index ac83b71..76668d2 100644
--- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/ClusterStateManager.java
@@ -23,27 +23,22 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeSet;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.api.IClusterManagementWork.ClusterState;
 import org.apache.asterix.common.cluster.ClusterPartition;
 import org.apache.asterix.common.cluster.IClusterStateManager;
-import org.apache.asterix.common.config.ClusterProperties;
 import org.apache.asterix.common.dataflow.ICcApplicationContext;
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.common.replication.IFaultToleranceStrategy;
+import org.apache.asterix.common.replication.INcLifecycleCoordinator;
 import org.apache.asterix.common.transactions.IResourceIdManager;
-import org.apache.asterix.event.schema.cluster.Cluster;
-import org.apache.asterix.event.schema.cluster.Node;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -51,6 +46,9 @@
 import org.apache.hyracks.control.common.application.ConfigManagerApplicationConfig;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -61,16 +59,10 @@
  */
 
 public class ClusterStateManager implements IClusterStateManager {
-    /*
-     * TODO: currently after instance restarts we require all nodes to join again,
-     * otherwise the cluster wont be ACTIVE. we may overcome this by storing the cluster state before the instance
-     * shutdown and using it on startup to identify the nodes that are expected the join.
-     */
 
-    private static final Logger LOGGER = Logger.getLogger(ClusterStateManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final Map<String, Map<IOption, Object>> ncConfigMap = new HashMap<>();
     private Set<String> pendingRemoval = new HashSet<>();
-    private final Cluster cluster;
     private ClusterState state = ClusterState.UNUSABLE;
     private AlgebricksAbsolutePartitionConstraint clusterPartitionConstraint;
     private Map<String, ClusterPartition[]> node2PartitionsMap;
@@ -79,12 +71,9 @@
     private boolean metadataNodeActive = false;
     private Set<String> failedNodes = new HashSet<>();
     private Set<String> participantNodes = new HashSet<>();
-    private IFaultToleranceStrategy ftStrategy;
+    private INcLifecycleCoordinator lifecycleCoordinator;
     private ICcApplicationContext appCtx;
-
-    public ClusterStateManager() {
-        cluster = ClusterProperties.INSTANCE.getCluster();
-    }
+    private ClusterPartition metadataPartition;
 
     @Override
     public void setCcAppCtx(ICcApplicationContext appCtx) {
@@ -92,30 +81,31 @@
         node2PartitionsMap = appCtx.getMetadataProperties().getNodePartitions();
         clusterPartitions = appCtx.getMetadataProperties().getClusterPartitions();
         currentMetadataNode = appCtx.getMetadataProperties().getMetadataNodeName();
-        ftStrategy = appCtx.getFaultToleranceStrategy();
-        ftStrategy.bindTo(this);
+        metadataPartition = node2PartitionsMap.get(currentMetadataNode)[0];
+        lifecycleCoordinator = appCtx.getNcLifecycleCoordinator();
+        lifecycleCoordinator.bindTo(this);
     }
 
     @Override
     public synchronized void notifyNodeFailure(String nodeId) throws HyracksException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Removing configuration parameters for node id " + nodeId);
         }
         failedNodes.add(nodeId);
         ncConfigMap.remove(nodeId);
         pendingRemoval.remove(nodeId);
-        ftStrategy.notifyNodeFailure(nodeId);
+        lifecycleCoordinator.notifyNodeFailure(nodeId);
     }
 
     @Override
     public synchronized void notifyNodeJoin(String nodeId, Map<IOption, Object> configuration) throws HyracksException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Registering configuration parameters for node id " + nodeId);
         }
         failedNodes.remove(nodeId);
         ncConfigMap.put(nodeId, configuration);
         updateNodeConfig(nodeId, configuration);
-        ftStrategy.notifyNodeJoin(nodeId);
+        lifecycleCoordinator.notifyNodeJoin(nodeId);
     }
 
     @Override
@@ -133,16 +123,18 @@
     }
 
     @Override
-    public void updateMetadataNode(String nodeId, boolean active) {
+    public synchronized void updateMetadataNode(String nodeId, boolean active) {
         currentMetadataNode = nodeId;
         metadataNodeActive = active;
         if (active) {
+            metadataPartition.setActiveNodeId(currentMetadataNode);
             LOGGER.info(String.format("Metadata node %s is now active", currentMetadataNode));
         }
+        notifyAll();
     }
 
     @Override
-    public synchronized void updateNodePartitions(String nodeId, boolean active) throws HyracksDataException {
+    public synchronized void updateNodePartitions(String nodeId, boolean active) {
         if (active) {
             participantNodes.add(nodeId);
         } else {
@@ -178,8 +170,8 @@
         }
         resetClusterPartitionConstraint();
         // if the cluster has no registered partitions or all partitions are pending activation -> UNUSABLE
-        if (clusterPartitions.isEmpty() || clusterPartitions.values().stream()
-                .allMatch(ClusterPartition::isPendingActivation)) {
+        if (clusterPartitions.isEmpty()
+                || clusterPartitions.values().stream().allMatch(ClusterPartition::isPendingActivation)) {
             LOGGER.info("Cluster does not have any registered partitions");
             setState(ClusterState.UNUSABLE);
             return;
@@ -246,8 +238,8 @@
     public synchronized String[] getIODevices(String nodeId) {
         Map<IOption, Object> ncConfig = ncConfigMap.get(nodeId);
         if (ncConfig == null) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Configuration parameters for nodeId " + nodeId
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Configuration parameters for nodeId " + nodeId
                         + " not found. The node has not joined yet or has left.");
             }
             return new String[0];
@@ -261,12 +253,6 @@
     }
 
     @Override
-    public synchronized Node getAvailableSubstitutionNode() {
-        List<Node> subNodes = cluster.getSubstituteNodes() == null ? null : cluster.getSubstituteNodes().getNode();
-        return subNodes == null || subNodes.isEmpty() ? null : subNodes.get(0);
-    }
-
-    @Override
     public synchronized Set<String> getParticipantNodes() {
         return new HashSet<>(participantNodes);
     }
@@ -295,16 +281,12 @@
                 clusterActiveLocations.add(p.getActiveNodeId());
             }
         }
-        clusterPartitionConstraint = new AlgebricksAbsolutePartitionConstraint(
-                clusterActiveLocations.toArray(new String[] {}));
+        clusterPartitionConstraint =
+                new AlgebricksAbsolutePartitionConstraint(clusterActiveLocations.toArray(new String[] {}));
     }
 
     @Override
     public synchronized boolean isClusterActive() {
-        if (cluster == null) {
-            // this is a virtual cluster
-            return true;
-        }
         return state == ClusterState.ACTIVE;
     }
 
@@ -328,11 +310,7 @@
 
     @Override
     public synchronized ClusterPartition[] getClusterPartitons() {
-        ArrayList<ClusterPartition> partitons = new ArrayList<>();
-        for (ClusterPartition partition : clusterPartitions.values()) {
-            partitons.add(partition);
-        }
-        return partitons.toArray(new ClusterPartition[] {});
+        return clusterPartitions.values().toArray(new ClusterPartition[] {});
     }
 
     @Override
@@ -396,8 +374,8 @@
 
     @Override
     public synchronized void registerNodePartitions(String nodeId, ClusterPartition[] nodePartitions)
-            throws AsterixException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+            throws AlgebricksException {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Registering node partitions for node " + nodeId + ": " + Arrays.toString(nodePartitions));
         }
         // We want to make sure there are no conflicts; make two passes for simplicity...
@@ -420,7 +398,7 @@
         if (nodePartitions == null) {
             LOGGER.info("deregisterNodePartitions unknown node " + nodeId + " (already removed?)");
         } else {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("deregisterNodePartitions for node " + nodeId + ": " + Arrays.toString(nodePartitions));
             }
             for (ClusterPartition nodePartition : nodePartitions) {
@@ -432,36 +410,51 @@
 
     @Override
     public synchronized void removePending(String nodeId) {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Registering intention to remove node id " + nodeId);
         }
         if (participantNodes.contains(nodeId)) {
             pendingRemoval.add(nodeId);
         } else {
-            LOGGER.warning("Cannot register unknown node " + nodeId + " for pending removal");
+            LOGGER.warn("Cannot register unknown node " + nodeId + " for pending removal");
         }
     }
 
     @Override
     public synchronized boolean cancelRemovePending(String nodeId) {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Deregistering intention to remove node id " + nodeId);
         }
         if (!pendingRemoval.remove(nodeId)) {
-            LOGGER.warning("Cannot deregister intention to remove node id " + nodeId + " that was not registered");
+            LOGGER.warn("Cannot deregister intention to remove node id " + nodeId + " that was not registered");
             return false;
         } else {
             return true;
         }
     }
 
+    @Override
+    public Map<String, Map<IOption, Object>> getActiveNcConfiguration() {
+        return ncConfigMap;
+    }
+
     public synchronized Set<String> getNodesPendingRemoval() {
         return new HashSet<>(pendingRemoval);
     }
 
+    @Override
+    public synchronized void setMetadataPartitionId(ClusterPartition partition) {
+        metadataPartition = partition;
+    }
+
+    @Override
+    public synchronized ClusterPartition getMetadataPartition() {
+        return metadataPartition;
+    }
+
     private void updateNodeConfig(String nodeId, Map<IOption, Object> configuration) {
-        ConfigManager configManager = ((ConfigManagerApplicationConfig) appCtx.getServiceContext().getAppConfig())
-                .getConfigManager();
+        ConfigManager configManager =
+                ((ConfigManagerApplicationConfig) appCtx.getServiceContext().getAppConfig()).getConfigManager();
         configuration.forEach((key, value) -> {
             if (key.section() == Section.NC) {
                 configManager.set(nodeId, key, value);
@@ -469,4 +462,8 @@
         });
     }
 
+    public String getStoragePathPrefix() {
+        return appCtx.getNodeProperties().getStorageSubdir();
+    }
+
 }
diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/NoOpCoordinationService.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/NoOpCoordinationService.java
new file mode 100644
index 0000000..6f9a8d2
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/utils/NoOpCoordinationService.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.utils;
+
+import java.util.Optional;
+
+import org.apache.asterix.common.api.ICoordinationService;
+
+public class NoOpCoordinationService implements ICoordinationService {
+
+    public static final NoOpCoordinationService INSTANCE = new NoOpCoordinationService();
+
+    private NoOpCoordinationService() {
+    }
+
+    @Override
+    public void put(String key, byte[] value) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Optional<byte[]> get(String key) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void delete(String key) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/asterixdb/asterix-runtime/src/test/java/org/apache/asterix/runtime/job/listener/NodeJobTrackerTest.java b/asterixdb/asterix-runtime/src/test/java/org/apache/asterix/runtime/job/listener/NodeJobTrackerTest.java
new file mode 100644
index 0000000..186dba8
--- /dev/null
+++ b/asterixdb/asterix-runtime/src/test/java/org/apache/asterix/runtime/job/listener/NodeJobTrackerTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.runtime.job.listener;
+
+import java.util.Collections;
+
+import org.apache.hyracks.api.constraints.Constraint;
+import org.apache.hyracks.api.constraints.expressions.ConstantExpression;
+import org.apache.hyracks.api.constraints.expressions.LValueConstraintExpression;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.api.job.JobStatus;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class NodeJobTrackerTest {
+
+    @Test
+    public void hasPendingJobsTest() {
+        final String nc1 = "nc1";
+        final String nc2 = "nc2";
+        final String unknown = "unknown";
+        final NodeJobTracker nodeJobTracker = new NodeJobTracker();
+        nodeJobTracker.notifyNodeJoin(nc1, null);
+        nodeJobTracker.notifyNodeJoin(nc2, null);
+
+        JobSpecification jobSpec = new JobSpecification();
+        // add nc1 and some other unknown location
+        final ConstantExpression nc1Location = new ConstantExpression(nc1);
+        final ConstantExpression unknownLocation = new ConstantExpression(unknown);
+        final LValueConstraintExpression lValueMock = Mockito.mock(LValueConstraintExpression.class);
+        jobSpec.getUserConstraints().add(new Constraint(lValueMock, nc1Location));
+        jobSpec.getUserConstraints().add(new Constraint(lValueMock, unknownLocation));
+
+        JobId jobId = new JobId(1);
+        nodeJobTracker.notifyJobCreation(jobId, jobSpec);
+        // make sure nc1 has a pending job
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(nc1).size() == 1);
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(unknown).isEmpty());
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(nc2).isEmpty());
+        nodeJobTracker.notifyJobFinish(jobId, JobStatus.TERMINATED, null);
+        // make sure nc1 doesn't have pending jobs anymore
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(nc1).isEmpty());
+
+        // make sure node doesn't have pending jobs after failure
+        jobId = new JobId(2);
+        nodeJobTracker.notifyJobCreation(jobId, jobSpec);
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(nc1).size() == 1);
+        nodeJobTracker.notifyNodeFailure(Collections.singleton(nc1));
+        Assert.assertTrue(nodeJobTracker.getPendingJobs(nc1).isEmpty());
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-server/pom.xml b/asterixdb/asterix-server/pom.xml
index bcd4199..109c407 100644
--- a/asterixdb/asterix-server/pom.xml
+++ b/asterixdb/asterix-server/pom.xml
@@ -20,6 +20,7 @@
   <modelVersion>4.0.0</modelVersion>
   <artifactId>asterix-server</artifactId>
   <name>asterix-server</name>
+
   <parent>
     <groupId>org.apache.asterix</groupId>
     <artifactId>apache-asterixdb</artifactId>
@@ -36,7 +37,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <build>
@@ -513,6 +514,7 @@
     <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-server</artifactId>
+      <type>test-jar</type>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -552,6 +554,16 @@
       <classifier>assembly</classifier>
     </dependency>
     <dependency>
+      <groupId>org.apache.asterix</groupId>
+      <artifactId>asterix-external-data</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>3.0.24</version>
+    </dependency>
+    <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
@@ -573,5 +585,9 @@
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-util</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-server/src/main/opt/local/conf/cc.conf b/asterixdb/asterix-server/src/main/opt/local/conf/cc.conf
index 184728d..cc2d9bd 100644
--- a/asterixdb/asterix-server/src/main/opt/local/conf/cc.conf
+++ b/asterixdb/asterix-server/src/main/opt/local/conf/cc.conf
@@ -15,16 +15,18 @@
 ; specific language governing permissions and limitations
 ; under the License.
 
-[nc/red]
+[nc/asterix_nc1]
 txn.log.dir=data/red/txnlog
 core.dump.dir=data/red/coredump
 iodevices=data/red
+nc.api.port=19004
 
-[nc/blue]
+[nc/asterix_nc2]
 ncservice.port=9091
 txn.log.dir=data/blue/txnlog
 core.dump.dir=data/blue/coredump
 iodevices=data/blue
+nc.api.port=19005
 ${NC_BLUE_EXTRA}
 
 [nc]
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java
deleted file mode 100644
index 3ea5b23..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/LicensingIT.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.server.test;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.util.file.FileUtil;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runners.MethodSorters;
-
-@FixMethodOrder(MethodSorters.JVM)
-public class LicensingIT {
-
-    // The "target" subdirectory of asterix-server. All outputs go here.
-    private static final String TARGET_DIR = FileUtil.joinPath("target");
-
-    protected String installerDir;
-
-    @Before
-    public void setup() {
-        final String pattern = getInstallerDirPattern();
-        final String[] list = new File(TARGET_DIR).list((dir, name) -> name.matches(pattern));
-        Assert.assertNotNull("installerDir", list);
-        Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(list), list.length > 1);
-        Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, list.length);
-        installerDir = FileUtil.joinPath(TARGET_DIR, list[0]);
-    }
-
-    protected String getInstallerDirPattern() {
-        return "asterix-server.*-binary-assembly";
-    }
-
-    protected String pathToLicensingFiles() {
-        return "";
-    }
-
-    @Test
-    public void testLicenseNoticeFilesPresent() throws IOException {
-        for (String name : getRequiredArtifactNames()) {
-            final String fileName = FileUtil.joinPath(installerDir, pathToLicensingFiles(), name);
-            Assert.assertTrue(fileName + " missing", new File(fileName).exists());
-        }
-    }
-
-    protected String[] getRequiredArtifactNames() {
-        return org.apache.commons.lang3.ArrayUtils.add(getLicenseArtifactNames(), "NOTICE");
-    }
-
-    @Test
-    public void ensureNoMissingLicenses() throws IOException {
-        for (String licenseArtifactName : getLicenseArtifactNames()) {
-            final File licenseFile = new File(
-                    FileUtil.joinPath(installerDir, pathToLicensingFiles(), licenseArtifactName));
-            List<String> badLines = new ArrayList<>();
-            for (String line : FileUtils.readLines(licenseFile, StandardCharsets.UTF_8)) {
-                if (line.matches("^\\s*MISSING:.*")) {
-                    badLines.add(line.trim());
-                }
-            }
-            Assert.assertEquals("Missing licenses in " + licenseFile + ": " + badLines, 0, badLines.size());
-        }
-    }
-
-    protected String[] getLicenseArtifactNames() {
-        return new String[] { "LICENSE" };
-    }
-}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java
deleted file mode 100644
index 7b926a6..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/NCServiceExecutionIT.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.server.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.runtime.HDFSCluster;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.asterix.testframework.xml.TestGroup;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.hyracks.server.process.HyracksCCProcess;
-import org.apache.hyracks.server.process.HyracksNCServiceProcess;
-import org.apache.hyracks.server.process.HyracksVirtualCluster;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.MethodSorters;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@RunWith(Parameterized.class)
-public class NCServiceExecutionIT {
-
-    // Important paths and files for this test.
-
-    // The "target" subdirectory of asterix-server. All outputs go here.
-    private static final String TARGET_DIR = StringUtils
-            .join(new String[] { "target" }, File.separator);
-
-    // Directory where the NCs create and store all data, as configured by
-    // src/test/resources/NCServiceExecutionIT/cc.conf.
-    private static final String INSTANCE_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "tmp" }, File.separator);
-
-    // The log directory, where all CC, NCService, and NC logs are written. CC and
-    // NCService logs are configured on the HyracksVirtualCluster below. NC logs
-    // are configured in src/test/resources/NCServiceExecutionIT/ncservice*.conf.
-    private static final String LOG_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "failsafe-reports" }, File.separator);
-
-    // Directory where *.conf files are located.
-    private static final String CONF_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "test-classes", "NCServiceExecutionIT" },
-                    File.separator);
-
-    // The app.home specified for HyracksVirtualCluster. The NCService expects
-    // to find the NC startup script in ${app.home}/bin.
-    private static final String APP_HOME = StringUtils
-            .join(new String[] { TARGET_DIR, "appassembler" }, File.separator);
-
-    // Path to the asterix-app directory. This is used as the current working
-    // directory for the CC and NCService processes, which allows relative file
-    // paths in "load" statements in test queries to find the right data. It is
-    // also used for HDFSCluster.
-    private static final String ASTERIX_APP_DIR = StringUtils
-            .join(new String[] { "..", "asterix-app" },
-                    File.separator);
-
-    // Path to the actual AQL test files, which we borrow from asterix-app. This is
-    // passed to TestExecutor.
-    protected static final String TESTS_DIR = StringUtils
-            .join(new String[] { ASTERIX_APP_DIR, "src", "test", "resources", "runtimets" },
-                    File.separator);
-
-    // Path that actual results are written to. We create and clean this directory
-    // here, and also pass it to TestExecutor which writes the test output there.
-    private static final String ACTUAL_RESULTS_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "ittest" }, File.separator);
-
-    private static final Logger LOGGER = Logger.getLogger(NCServiceExecutionIT.class.getName());
-
-    enum KillCommand {
-        CC,
-        NC1,
-        NC2;
-
-        @Override
-        public String toString() {
-            return "<kill " + name().toLowerCase() + ">";
-        }
-    }
-
-    private static HyracksCCProcess cc;
-    private static HyracksNCServiceProcess nc1;
-    private static HyracksNCServiceProcess nc2;
-
-    private final TestCaseContext tcCtx;
-    private static final TestExecutor testExecutor = new TestExecutor();
-
-    private static final List<String> badTestCases = new ArrayList<>();
-    private static HyracksVirtualCluster cluster;
-    private final KillCommand killType;
-    private static boolean clusterActive = false;
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        // Create actual-results output directory.
-        File outDir = new File(ACTUAL_RESULTS_DIR);
-        outDir.mkdirs();
-
-        // Remove any instance data from previous runs.
-        File instanceDir = new File(INSTANCE_DIR);
-        if (instanceDir.isDirectory()) {
-            FileUtils.deleteDirectory(instanceDir);
-        }
-
-        // HDFSCluster requires the input directory to end with a file separator.
-        HDFSCluster.getInstance().setup(ASTERIX_APP_DIR + File.separator);
-
-        cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
-        nc1 = cluster.addNCService(
-                new File(CONF_DIR, "ncservice1.conf"),
-                new File(LOG_DIR, "ncservice1.log"));
-
-        nc2 = cluster.addNCService(
-                new File(CONF_DIR, "ncservice2.conf"),
-                new File(LOG_DIR, "ncservice2.log"));
-
-        // Start CC
-        cc = cluster.start(
-                new File(CONF_DIR, "cc.conf"),
-                new File(LOG_DIR, "cc.log"));
-
-        testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
-        clusterActive = true;
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        File outdir = new File(ACTUAL_RESULTS_DIR);
-        File[] files = outdir.listFiles();
-        if (files == null || files.length == 0) {
-            outdir.delete();
-        }
-        cluster.stop();
-        HDFSCluster.getInstance().cleanup();
-        if (!badTestCases.isEmpty()) {
-            System.out.println("The following test cases left some data");
-            for (String testCase : badTestCases) {
-                System.out.println(testCase);
-            }
-        }
-    }
-
-    @Parameters(name = "NCServiceExecutionTest {index}: {0}")
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<>();
-        Random random = getRandom();
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        for (TestCaseContext ctx : b.build(new File(TESTS_DIR))) {
-            if (!skip(ctx)) {
-                testArgs.add(new Object[] { ctx, ctx, null });
-            }
-            // let's kill something every 50 tests
-            if (testArgs.size() % 50 == 0) {
-                final KillCommand killCommand = KillCommand.values()[random.nextInt(KillCommand.values().length)];
-                testArgs.add(new Object[] { killCommand, null, killCommand});
-            }
-        }
-        return testArgs;
-    }
-
-    private static Random getRandom() {
-        Random random;
-        if (System.getProperty("random.seed") == null) {
-            random = new Random() {
-                @Override
-                public synchronized void setSeed(long seed) {
-                    super.setSeed(seed);
-                    System.err.println("using generated seed: " + seed + "; use -Drandom.seed to use specific seed");
-                }
-            };
-        } else {
-            final long seed = Long.getLong("random.seed");
-            System.err.println("using provided seed (-Drandom.seed): " + seed);
-            random = new Random(seed);
-        }
-        return random;
-    }
-
-    private static boolean skip(TestCaseContext tcCtx) {
-        // For now we skip feeds tests, external-library, and api tests.
-        for (TestGroup group : tcCtx.getTestGroups()) {
-            if (group.getName().startsWith("external-")
-                    || group.getName().equals("feeds")
-                    || group.getName().equals("api")) {
-                LOGGER.info("Skipping test: " + tcCtx.toString());
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public NCServiceExecutionIT(Object description, TestCaseContext tcCtx, KillCommand killType) {
-        this.tcCtx = tcCtx;
-        this.killType = killType;
-    }
-
-    @Before
-    public void before() {
-        if (!clusterActive) {
-            Assert.fail("Skipping test since cluster is not ACTIVE");
-        }
-    }
-
-    @Test
-    public void test() throws Exception {
-        if (tcCtx != null) {
-            testExecutor.executeTest(ACTUAL_RESULTS_DIR, tcCtx, null, false);
-            testExecutor.cleanup(tcCtx.toString(), badTestCases);
-        } else {
-            switch (killType) {
-                case CC:
-                    LOGGER.info("Killing CC...");
-                    cc.stop(true);
-                    cc.start();
-                    break;
-
-                case NC1:
-                    LOGGER.info("Killing NC1...");
-                    nc1.stop(); // we can't kill due to ASTERIXDB-1941
-                    testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
-                    nc1.start(); // this restarts the NC service
-                    break;
-
-                case NC2:
-                    LOGGER.info("Killing NC2...");
-                    nc2.stop(); // we can't kill due to ASTERIXDB-1941
-                    testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
-                    nc2.start(); // this restarts the NC service
-                    break;
-
-                default:
-                    Assert.fail("killType: " + killType);
-            }
-            try {
-                testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
-            } catch (Exception e) {
-                // stop executing the rest of the tests since the cluster is not ACTIVE
-                LOGGER.log(Level.SEVERE, "Cannot continue since cluster is not ACTIVE", e);
-                clusterActive = false;
-                Assert.fail("Cluster is not ACTIVE");
-            }
-        }
-    }
-}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
deleted file mode 100644
index 0beb38d..0000000
--- a/asterixdb/asterix-server/src/test/java/org/apache/asterix/server/test/SampleLocalClusterIT.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.server.test;
-
-import static org.apache.hyracks.util.file.FileUtil.joinPath;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.asterix.common.utils.Servlets;
-import org.apache.asterix.test.base.TestMethodTracer;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.test.common.TestHelper;
-import org.apache.asterix.testframework.context.TestCaseContext.OutputFormat;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runners.MethodSorters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-public class SampleLocalClusterIT {
-
-    // Important paths and files for this test.
-
-    // The "target" subdirectory of asterix-server. All outputs go here.
-    private static final String TARGET_DIR = joinPath("target");
-
-    // Directory where the NCs create and store all data, as configured by
-    // src/test/resources/NCServiceExecutionIT/cc.conf.
-    private static final String OUTPUT_DIR = joinPath(TARGET_DIR, "sample local cluster");
-
-    private static final String LOCAL_SAMPLES_DIR = joinPath(OUTPUT_DIR, "opt", "local");
-
-    @Rule
-    public TestRule watcher = new TestMethodTracer();
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        // Create actual-results output directory.
-        File outDir = new File(OUTPUT_DIR);
-
-        // Remove any instance data from previous runs.
-        if (outDir.isDirectory()) {
-            FileUtils.deleteDirectory(outDir);
-        }
-        outDir.mkdirs();
-
-        String[] pathElements = new String[] { TARGET_DIR,
-                new File(TARGET_DIR).list((dir, name) -> name.matches("asterix-server.*-binary-assembly.zip"))[0] };
-        String installerZip = joinPath(pathElements);
-
-        TestHelper.unzip(installerZip, OUTPUT_DIR);
-    }
-
-    private static List<File> findLogFiles(File directory, List<File> fileList) {
-        File [] match = directory.listFiles(pathname -> pathname.isDirectory() || pathname.toString().endsWith(".log"));
-        if (match != null) {
-            for (File file : match) {
-                if (file.isDirectory()) {
-                    findLogFiles(file, fileList);
-                } else {
-                    fileList.add(file);
-                }
-            }
-        }
-        return fileList;
-    }
-
-    @AfterClass
-    public static void teardown() throws Exception {
-
-        File destDir = new File(TARGET_DIR, joinPath("failsafe-reports", SampleLocalClusterIT.class.getSimpleName()));
-
-        for (File f : findLogFiles(new File(OUTPUT_DIR), new ArrayList<>())) {
-            FileUtils.copyFileToDirectory(f, destDir);
-        }
-    }
-
-    @Test
-    public void test0_startCluster() throws Exception {
-        Process process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh"), "-f")
-                .inheritIO().start();
-        Assert.assertEquals(0, process.waitFor());
-        process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/start-sample-cluster.sh")).inheritIO().start();
-        Assert.assertEquals(0, process.waitFor());
-    }
-
-    @Test
-    public void test1_sanityQuery() throws Exception {
-        TestExecutor testExecutor = new TestExecutor();
-        InputStream resultStream = testExecutor.executeQuery("1+1", OutputFormat.ADM,
-                new URI("http", null, "127.0.0.1", 19002, Servlets.AQL_QUERY, null, null),
-                Collections.emptyList());
-        StringWriter sw = new StringWriter();
-        IOUtils.copy(resultStream, sw);
-        Assert.assertEquals("2", sw.toString().trim());
-    }
-
-    @Test
-    public void test2_stopCluster() throws Exception {
-        Process process =
-                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh")).inheritIO().start();
-        Assert.assertEquals(0, process.waitFor());
-        try {
-            new URL("http://127.0.0.1:19002").openConnection().connect();
-            Assert.assertTrue("Expected connection to be refused.", false);
-        } catch (IOException e) {
-            // expected
-        }
-    }
-}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java
new file mode 100644
index 0000000..1a2f9ba
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/AbstractExecutionIT.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2009-2013 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.asterix.test.server;
+
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.asterix.external.util.ExternalDataConstants;
+import org.apache.asterix.external.util.IdentitiyResolverFactory;
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.asterix.testframework.context.TestFileContext;
+import org.apache.asterix.testframework.xml.TestCase.CompilationUnit;
+import org.apache.asterix.testframework.xml.TestGroup;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.codehaus.plexus.util.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
+ */
+@RunWith(Parameterized.class)
+public abstract class AbstractExecutionIT {
+
+    protected static final Logger LOGGER = LogManager.getLogger();
+
+    protected static final String PATH_ACTUAL = joinPath("target", "ittest");
+    protected static final String PATH_BASE = joinPath("..", "asterix-app", "src", "test", "resources", "runtimets");
+
+    protected static final String HDFS_BASE = "../asterix-app/";
+
+    protected static final TestExecutor testExecutor = new TestExecutor();
+
+    private static final String EXTERNAL_LIBRARY_TEST_GROUP = "lib";
+
+    private static final List<String> badTestCases = new ArrayList<>();
+
+    private static String reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
+
+    @Rule
+    public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.LOG_DIR, reportPath, this);
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        System.out.println("Starting setup");
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Starting setup");
+        }
+        File outdir = new File(PATH_ACTUAL);
+        outdir.mkdirs();
+
+        File externalTestsJar =
+                new File(StringUtils.join(new String[] { "..", "asterix-external-data", "target" }, File.separator))
+                        .listFiles((dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
+
+        FileUtils.copyFile(externalTestsJar,
+                new File(NCServiceExecutionIT.APP_HOME + "/repo", externalTestsJar.getName()));
+
+        NCServiceExecutionIT.setUp();
+
+        FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "data")),
+                new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/data"));
+
+        FileUtils.copyDirectoryStructure(new File(joinPath("..", "asterix-app", "target", "data")),
+                new File(NCServiceExecutionIT.ASTERIX_APP_DIR + "/clusters/local/working_dir/target/data"));
+
+        // Set the node resolver to be the identity resolver that expects node names
+        // to be node controller ids; a valid assumption in test environment.
+        System.setProperty(ExternalDataConstants.NODE_RESOLVER_FACTORY_PROPERTY,
+                IdentitiyResolverFactory.class.getName());
+
+        reportPath = new File(joinPath("target", "failsafe-reports")).getAbsolutePath();
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        File outdir = new File(PATH_ACTUAL);
+        File[] files = outdir.listFiles();
+        if ((files == null) || (files.length == 0)) {
+            outdir.delete();
+        }
+        //AsterixLifecycleIT.tearDown();
+        NCServiceExecutionIT.tearDown();
+        if (!badTestCases.isEmpty()) {
+            System.out.println("The following test cases left some data");
+            for (String testCase : badTestCases) {
+                System.out.println(testCase);
+            }
+        }
+    }
+
+    @Parameters
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<Object[]>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+    }
+
+    private TestCaseContext tcCtx;
+
+    public AbstractExecutionIT(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Test
+    public void test() throws Exception {
+        if (skip()) {
+            return;
+        }
+        testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
+        testExecutor.cleanup(tcCtx.toString(), badTestCases);
+    }
+
+    protected boolean skip() {
+        // If the test case contains library commands, we skip them
+        List<CompilationUnit> cUnits = tcCtx.getTestCase().getCompilationUnit();
+        for (CompilationUnit cUnit : cUnits) {
+            List<TestFileContext> testFileCtxs = tcCtx.getTestFiles(cUnit);
+            for (TestFileContext ctx : testFileCtxs) {
+                if (ctx.getType().equals(EXTERNAL_LIBRARY_TEST_GROUP)) {
+                    return true;
+                }
+            }
+        }
+        // For now we skip api tests.
+        for (TestGroup group : tcCtx.getTestGroups()) {
+            if (group != null && "api".equals(group.getName())) {
+                LOGGER.info("Skipping test: " + tcCtx.toString());
+                return true;
+            }
+        }
+        return false;
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
new file mode 100644
index 0000000..4ac3abb
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/LicensingIT.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hyracks.util.file.FileUtil;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.JVM)
+public class LicensingIT {
+
+    protected String installerDir;
+
+    @Before
+    public void setup() {
+        final String pattern = getInstallerDirPattern();
+        final String targetDir = getTargetDir();
+        final String[] list = new File(targetDir).list((dir, name) -> name.matches(pattern));
+        Assert.assertNotNull("installerDir", list);
+        Assert.assertFalse("Ambiguous install dir (" + pattern + "): " + Arrays.toString(list), list.length > 1);
+        Assert.assertEquals("Can't find install dir (" + pattern + ")", 1, list.length);
+        installerDir = FileUtil.joinPath(targetDir, list[0]);
+    }
+
+    protected String getTargetDir() {
+        return FileUtil.joinPath("target");
+    }
+
+    protected String getInstallerDirPattern() {
+        return "asterix-server.*-binary-assembly";
+    }
+
+    protected String pathToLicensingFiles() {
+        return "";
+    }
+
+    @Test
+    public void testLicenseNoticeFilesPresent() throws IOException {
+        for (String name : getRequiredArtifactNames()) {
+            final String fileName = FileUtil.joinPath(installerDir, pathToLicensingFiles(), name);
+            Assert.assertTrue(fileName + " missing", new File(fileName).exists());
+        }
+    }
+
+    protected String[] getRequiredArtifactNames() {
+        return org.apache.commons.lang3.ArrayUtils.add(getLicenseArtifactNames(), "NOTICE");
+    }
+
+    @Test
+    public void ensureNoMissingLicenses() throws IOException {
+        for (String licenseArtifactName : getLicenseArtifactNames()) {
+            final File licenseFile =
+                    new File(FileUtil.joinPath(installerDir, pathToLicensingFiles(), licenseArtifactName));
+            List<String> badLines = new ArrayList<>();
+            for (String line : FileUtils.readLines(licenseFile, StandardCharsets.UTF_8)) {
+                if (line.matches("^\\s*MISSING:.*")) {
+                    badLines.add(line.trim());
+                }
+            }
+            Assert.assertEquals("Missing licenses in " + licenseFile + ": " + badLines, 0, badLines.size());
+        }
+    }
+
+    protected String[] getLicenseArtifactNames() {
+        return new String[] { "LICENSE" };
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java
new file mode 100644
index 0000000..3c46be6
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NCServiceExecutionIT.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.test.runtime.HDFSCluster;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.asterix.testframework.xml.TestGroup;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.test.server.process.HyracksCCProcess;
+import org.apache.hyracks.test.server.process.HyracksNCServiceProcess;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+@RunWith(Parameterized.class)
+public class NCServiceExecutionIT {
+
+    // Important paths and files for this test.
+
+    // The "target" subdirectory of asterix-server. All outputs go here.
+    public static final String TARGET_DIR =
+            StringUtils.join(new String[] { "../asterix-server/target" }, File.separator);
+
+    // Directory where the NCs create and store all data, as configured by
+    // src/test/resources/NCServiceExecutionIT/cc.conf.
+    public static final String INSTANCE_DIR = StringUtils.join(new String[] { TARGET_DIR, "tmp" }, File.separator);
+
+    // The log directory, where all CC, NCService, and NC logs are written. CC and
+    // NCService logs are configured on the HyracksVirtualCluster below. NC logs
+    // are configured in src/test/resources/NCServiceExecutionIT/ncservice*.conf.
+    public static final String LOG_DIR =
+            StringUtils.join(new String[] { TARGET_DIR, "failsafe-reports" }, File.separator);
+
+    // Directory where *.conf files are located.
+    public static final String CONF_DIR =
+            StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NCServiceExecutionIT" }, File.separator);
+
+    // The app.home specified for HyracksVirtualCluster. The NCService expects
+    // to find the NC startup script in ${app.home}/bin.
+    public static final String APP_HOME = StringUtils.join(new String[] { TARGET_DIR, "appassembler" }, File.separator);
+
+    // Path to the asterix-app directory. This is used as the current working
+    // directory for the CC and NCService processes, which allows relative file
+    // paths in "load" statements in test queries to find the right data. It is
+    // also used for HDFSCluster.
+    public static final String ASTERIX_APP_DIR = StringUtils.join(new String[] { "..", "asterix-app" }, File.separator);
+
+    // Path to the actual AQL test files, which we borrow from asterix-app. This is
+    // passed to TestExecutor.
+    protected static final String TESTS_DIR =
+            StringUtils.join(new String[] { ASTERIX_APP_DIR, "src", "test", "resources", "runtimets" }, File.separator);
+
+    // Path that actual results are written to. We create and clean this directory
+    // here, and also pass it to TestExecutor which writes the test output there.
+    public static final String ACTUAL_RESULTS_DIR =
+            StringUtils.join(new String[] { TARGET_DIR, "ittest" }, File.separator);
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    enum KillCommand {
+        CC,
+        NC1,
+        NC2;
+
+        @Override
+        public String toString() {
+            return "<kill " + name().toLowerCase() + ">";
+        }
+    }
+
+    private static HyracksCCProcess cc;
+    private static HyracksNCServiceProcess nc1;
+    private static HyracksNCServiceProcess nc2;
+
+    private final TestCaseContext tcCtx;
+    private static final TestExecutor testExecutor = new TestExecutor();
+
+    private static final List<String> badTestCases = new ArrayList<>();
+    private static HyracksVirtualCluster cluster;
+    private final KillCommand killType;
+    private static boolean clusterActive = false;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        // Create actual-results output directory.
+        File outDir = new File(ACTUAL_RESULTS_DIR);
+        outDir.mkdirs();
+
+        // Remove any instance data from previous runs.
+        File instanceDir = new File(INSTANCE_DIR);
+        if (instanceDir.isDirectory()) {
+            FileUtils.deleteDirectory(instanceDir);
+        }
+
+        // HDFSCluster requires the input directory to end with a file separator.
+        HDFSCluster.getInstance().setup(ASTERIX_APP_DIR + File.separator);
+
+        cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
+        nc1 = cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
+
+        nc2 = cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
+
+        // Start CC
+        cc = cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+
+        testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+        clusterActive = true;
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        File outdir = new File(ACTUAL_RESULTS_DIR);
+        File[] files = outdir.listFiles();
+        if (files == null || files.length == 0) {
+            outdir.delete();
+        }
+        cluster.stop();
+        HDFSCluster.getInstance().cleanup();
+        if (!badTestCases.isEmpty()) {
+            System.out.println("The following test cases left some data");
+            for (String testCase : badTestCases) {
+                System.out.println(testCase);
+            }
+        }
+    }
+
+    @Parameters(name = "NCServiceExecutionTest {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<>();
+        Random random = getRandom();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(TESTS_DIR))) {
+            if (!skip(ctx)) {
+                testArgs.add(new Object[] { ctx, ctx, null });
+            }
+            // let's kill something every 50 tests
+            if (testArgs.size() % 50 == 0) {
+                final KillCommand killCommand = KillCommand.values()[random.nextInt(KillCommand.values().length)];
+                testArgs.add(new Object[] { killCommand, null, killCommand });
+            }
+        }
+        return testArgs;
+    }
+
+    private static Random getRandom() {
+        Random random;
+        if (System.getProperty("random.seed") == null) {
+            random = new Random() {
+                @Override
+                public synchronized void setSeed(long seed) {
+                    super.setSeed(seed);
+                    System.err.println("using generated seed: " + seed + "; use -Drandom.seed to use specific seed");
+                }
+            };
+        } else {
+            final long seed = Long.getLong("random.seed");
+            System.err.println("using provided seed (-Drandom.seed): " + seed);
+            random = new Random(seed);
+        }
+        return random;
+    }
+
+    private static boolean skip(TestCaseContext tcCtx) {
+        // For now we skip feeds tests, external-library, and api tests.
+        for (TestGroup group : tcCtx.getTestGroups()) {
+            if (group.getName().startsWith("external-") || group.getName().equals("feeds")
+                    || group.getName().equals("api")) {
+                LOGGER.info("Skipping test: " + tcCtx.toString());
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public NCServiceExecutionIT(Object description, TestCaseContext tcCtx, KillCommand killType) {
+        this.tcCtx = tcCtx;
+        this.killType = killType;
+    }
+
+    @Before
+    public void before() {
+        if (!clusterActive) {
+            Assert.fail("Skipping test since cluster is not ACTIVE");
+        }
+    }
+
+    @Test
+    public void test() throws Exception {
+        if (tcCtx != null) {
+            testExecutor.executeTest(ACTUAL_RESULTS_DIR, tcCtx, null, false);
+            testExecutor.cleanup(tcCtx.toString(), badTestCases);
+        } else {
+            switch (killType) {
+                case CC:
+                    LOGGER.info("Killing CC...");
+                    cc.stop(true);
+                    cc.start();
+                    break;
+
+                case NC1:
+                    LOGGER.info("Killing NC1...");
+                    nc1.stop(); // we can't kill due to ASTERIXDB-1941
+                    testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
+                    nc1.start(); // this restarts the NC service
+                    testExecutor.startNC("asterix_nc1");
+                    break;
+
+                case NC2:
+                    LOGGER.info("Killing NC2...");
+                    nc2.stop(); // we can't kill due to ASTERIXDB-1941
+                    testExecutor.waitForClusterState("UNUSABLE", 60, TimeUnit.SECONDS); // wait for missed heartbeats...
+                    nc2.start(); // this restarts the NC service
+                    testExecutor.startNC("asterix_nc2");
+                    break;
+
+                default:
+                    Assert.fail("killType: " + killType);
+            }
+            try {
+                testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+            } catch (Exception e) {
+                // stop executing the rest of the tests since the cluster is not ACTIVE
+                LOGGER.log(Level.ERROR, "Cannot continue since cluster is not ACTIVE", e);
+                clusterActive = false;
+                Assert.fail("Cluster is not ACTIVE");
+            }
+        }
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java
new file mode 100644
index 0000000..4ae9d96
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/NcLifecycleIT.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import static org.apache.asterix.test.server.NCServiceExecutionIT.APP_HOME;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.ASTERIX_APP_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.INSTANCE_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.LOG_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.TARGET_DIR;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class NcLifecycleIT {
+
+    private static final String PATH_BASE =
+            FileUtil.joinPath("src", "test", "resources", "integrationts", "NcLifecycle");
+    private static final String CONF_DIR =
+            StringUtils.join(new String[] { TARGET_DIR, "test-classes", "NcLifecycleIT" }, File.separator);
+    private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
+    private static final TestExecutor testExecutor = new TestExecutor();
+    private static HyracksVirtualCluster cluster;
+
+    private TestCaseContext tcCtx;
+
+    public NcLifecycleIT(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Rule
+    public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.ASTERIX_APP_DIR, reportPath, this);
+
+    @Before
+    public void before() throws Exception {
+        LOGGER.info("Creating new instance...");
+        File instanceDir = new File(INSTANCE_DIR);
+        if (instanceDir.isDirectory()) {
+            FileUtils.deleteDirectory(instanceDir);
+        }
+
+        cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
+        cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
+        cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
+
+        // Start CC
+        cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+        LOGGER.info("Instance created.");
+        testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+        LOGGER.info("Instance is in ACTIVE state.");
+    }
+
+    @After
+    public void after() {
+        LOGGER.info("Destroying instance...");
+        cluster.stop();
+        LOGGER.info("Instance destroyed.");
+    }
+
+    @Test
+    public void test() throws Exception {
+        testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
+    }
+
+    @Parameterized.Parameters(name = "NcLifecycleIT {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+        if (testArgs.size() == 0) {
+            testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+        }
+        return testArgs;
+    }
+
+    private static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java
new file mode 100644
index 0000000..ba367a7
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/RecoveryIT.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.test.runtime.HDFSCluster;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class RecoveryIT {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final String PATH_ACTUAL = "target" + File.separator + "rttest" + File.separator;
+    private static final String PATH_BASE = "src/test/resources/transactionts/";
+    private static final String HDFS_BASE = "../asterix-app/";
+    private TestCaseContext tcCtx;
+    private static File asterixInstallerPath;
+    private static File installerTargetPath;
+    private static String ncServiceHomeDirName;
+    private static String ncServiceHomePath;
+    private static String scriptHomePath;
+    private static String reportPath;
+    private static ProcessBuilder pb;
+    private static Map<String, String> env;
+    private final TestExecutor testExecutor = new TestExecutor();
+
+    @Rule
+    public TestRule retainLogs = new RetainLogsRule(ncServiceHomePath, reportPath, this);
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        File outdir = new File(PATH_ACTUAL);
+        outdir.mkdirs();
+
+        File externalTestsJar =
+                new File(StringUtils.join(new String[] { "..", "asterix-external-data", "target" }, File.separator))
+                        .listFiles((dir, name) -> name.matches("asterix-external-data-.*-tests.jar"))[0];
+
+        asterixInstallerPath = new File(System.getProperty("user.dir"));
+        installerTargetPath = new File(new File(asterixInstallerPath.getParentFile(), "asterix-server"), "target");
+        reportPath = new File(installerTargetPath, "failsafe-reports").getAbsolutePath();
+        ncServiceHomeDirName = installerTargetPath.list(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return new File(dir, name).isDirectory() && name.startsWith("asterix-server")
+                        && name.endsWith("binary-assembly");
+            }
+        })[0];
+        ncServiceHomePath = new File(installerTargetPath, ncServiceHomeDirName).getAbsolutePath();
+
+        LOGGER.info("NCSERVICE_HOME=" + ncServiceHomePath);
+
+        FileUtils.copyFile(externalTestsJar, new File(ncServiceHomePath + "/repo", externalTestsJar.getName()));
+
+        pb = new ProcessBuilder();
+        env = pb.environment();
+        env.put("NCSERVICE_HOME", ncServiceHomePath);
+        env.put("JAVA_HOME", System.getProperty("java.home"));
+        scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator
+                + "resources" + File.separator + "transactionts" + File.separator + "scripts";
+        env.put("SCRIPT_HOME", scriptHomePath);
+
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "configure_and_validate.sh");
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
+        HDFSCluster.getInstance().setup(HDFS_BASE);
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+        File outdir = new File(PATH_ACTUAL);
+        FileUtils.deleteDirectory(outdir);
+        File dataCopyDir =
+                new File(ncServiceHomePath + File.separator + ".." + File.separator + ".." + File.separator + "data");
+        FileUtils.deleteDirectory(dataCopyDir);
+        TestExecutor.executeScript(pb,
+                scriptHomePath + File.separator + "setup_teardown" + File.separator + "stop_and_delete.sh");
+        HDFSCluster.getInstance().cleanup();
+    }
+
+    @Parameters(name = "RecoveryIT {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<Object[]>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE))) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+    }
+
+    public RecoveryIT(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Test
+    public void test() throws Exception {
+        testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false);
+    }
+
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/ReplicationIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/ReplicationIT.java
new file mode 100644
index 0000000..0f058bc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/ReplicationIT.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import static org.apache.asterix.test.server.NCServiceExecutionIT.APP_HOME;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.ASTERIX_APP_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.INSTANCE_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.LOG_DIR;
+import static org.apache.asterix.test.server.NCServiceExecutionIT.TARGET_DIR;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.asterix.test.base.RetainLogsRule;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class ReplicationIT {
+
+    private static final String PATH_BASE =
+            FileUtil.joinPath("src", "test", "resources", "integrationts", "replication");
+    private static final String CONF_DIR =
+            StringUtils.join(new String[] { TARGET_DIR, "test-classes", "ReplicationIT" }, File.separator);
+    private static final String PATH_ACTUAL = FileUtil.joinPath("target", "ittest");
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static String reportPath = new File(FileUtil.joinPath("target", "failsafe-reports")).getAbsolutePath();
+    private static final TestExecutor testExecutor = new TestExecutor();
+    private static HyracksVirtualCluster cluster;
+
+    static {
+        final Map<String, InetSocketAddress> ncEndPoints = new HashMap<>();
+        final Map<String, InetSocketAddress> replicationAddress = new HashMap<>();
+        final String ip = InetAddress.getLoopbackAddress().getHostAddress();
+        ncEndPoints.put("asterix_nc1", InetSocketAddress.createUnresolved(ip, 19004));
+        ncEndPoints.put("asterix_nc2", InetSocketAddress.createUnresolved(ip, 19005));
+        replicationAddress.put("asterix_nc1", InetSocketAddress.createUnresolved(ip, 2001));
+        replicationAddress.put("asterix_nc2", InetSocketAddress.createUnresolved(ip, 2002));
+        testExecutor.setNcEndPoints(ncEndPoints);
+        testExecutor.setNcReplicationAddress(replicationAddress);
+    }
+
+    private TestCaseContext tcCtx;
+
+    public ReplicationIT(TestCaseContext tcCtx) {
+        this.tcCtx = tcCtx;
+    }
+
+    @Rule
+    public TestRule retainLogs = new RetainLogsRule(NCServiceExecutionIT.ASTERIX_APP_DIR, reportPath, this);
+
+    @Before
+    public void before() throws Exception {
+        LOGGER.info("Creating new instance...");
+        File instanceDir = new File(INSTANCE_DIR);
+        if (instanceDir.isDirectory()) {
+            FileUtils.deleteDirectory(instanceDir);
+        }
+
+        cluster = new HyracksVirtualCluster(new File(APP_HOME), new File(ASTERIX_APP_DIR));
+        cluster.addNCService(new File(CONF_DIR, "ncservice1.conf"), new File(LOG_DIR, "ncservice1.log"));
+        cluster.addNCService(new File(CONF_DIR, "ncservice2.conf"), new File(LOG_DIR, "ncservice2.log"));
+
+        // Start CC
+        cluster.start(new File(CONF_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+        LOGGER.info("Instance created.");
+        testExecutor.waitForClusterActive(30, TimeUnit.SECONDS);
+        LOGGER.info("Instance is in ACTIVE state.");
+    }
+
+    @After
+    public void after() {
+        LOGGER.info("Destroying instance...");
+        cluster.stop();
+        LOGGER.info("Instance destroyed.");
+    }
+
+    @Test
+    public void test() throws Exception {
+        testExecutor.executeTest(PATH_ACTUAL, tcCtx, null, false);
+    }
+
+    @Parameterized.Parameters(name = "ReplicationIT {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+        if (testArgs.size() == 0) {
+            testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME);
+        }
+        return testArgs;
+    }
+
+    private static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
new file mode 100644
index 0000000..766402c
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SampleLocalClusterIT.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.test.server;
+
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.asterix.common.utils.Servlets;
+import org.apache.asterix.test.base.TestMethodTracer;
+import org.apache.asterix.test.common.TestExecutor;
+import org.apache.asterix.test.common.TestHelper;
+import org.apache.asterix.testframework.context.TestCaseContext.OutputFormat;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class SampleLocalClusterIT {
+
+    // Important paths and files for this test.
+
+    // The "target" subdirectory of asterix-server. All outputs go here.
+    private static final String TARGET_DIR = joinPath("target");
+
+    // Directory where the NCs create and store all data, as configured by
+    // src/test/resources/NCServiceExecutionIT/cc.conf.
+    private static final String OUTPUT_DIR = joinPath(TARGET_DIR, "sample local cluster");
+
+    private static final String LOCAL_SAMPLES_DIR = joinPath(OUTPUT_DIR, "opt", "local");
+
+    @Rule
+    public TestRule watcher = new TestMethodTracer();
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        // Create actual-results output directory.
+        File outDir = new File(OUTPUT_DIR);
+
+        // Remove any instance data from previous runs.
+        if (outDir.isDirectory()) {
+            FileUtils.deleteDirectory(outDir);
+        }
+        outDir.mkdirs();
+
+        String[] pathElements = new String[] { TARGET_DIR,
+                new File(TARGET_DIR).list((dir, name) -> name.matches("asterix-server.*-binary-assembly.zip"))[0] };
+        String installerZip = joinPath(pathElements);
+
+        TestHelper.unzip(installerZip, OUTPUT_DIR);
+
+    }
+
+    private static List<File> findLogFiles(File directory, List<File> fileList) {
+        File[] match = directory.listFiles(pathname -> pathname.isDirectory() || pathname.toString().endsWith(".log"));
+        if (match != null) {
+            for (File file : match) {
+                if (file.isDirectory()) {
+                    findLogFiles(file, fileList);
+                } else {
+                    fileList.add(file);
+                }
+            }
+        }
+        return fileList;
+    }
+
+    @AfterClass
+    public static void teardown() throws Exception {
+
+        File destDir = new File(TARGET_DIR, joinPath("failsafe-reports", SampleLocalClusterIT.class.getSimpleName()));
+
+        for (File f : findLogFiles(new File(OUTPUT_DIR), new ArrayList<>())) {
+            FileUtils.copyFileToDirectory(f, destDir);
+        }
+    }
+
+    @Test
+    public void test0_startCluster() throws Exception {
+        Process process =
+                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh"), "-f").inheritIO().start();
+        Assert.assertEquals(0, process.waitFor());
+        process = new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/start-sample-cluster.sh")).inheritIO().start();
+        Assert.assertEquals(0, process.waitFor());
+    }
+
+    @Test
+    public void test1_sanityQuery() throws Exception {
+        TestExecutor testExecutor = new TestExecutor();
+        InputStream resultStream = testExecutor.executeQuery("1+1", OutputFormat.ADM,
+                new URI("http", null, "127.0.0.1", 19002, Servlets.AQL_QUERY, null, null), Collections.emptyList());
+        StringWriter sw = new StringWriter();
+        IOUtils.copy(resultStream, sw);
+        Assert.assertEquals("2", sw.toString().trim());
+    }
+
+    @Test
+    public void test2_stopCluster() throws Exception {
+        Process process =
+                new ProcessBuilder(joinPath(LOCAL_SAMPLES_DIR, "bin/stop-sample-cluster.sh")).inheritIO().start();
+        Assert.assertEquals(0, process.waitFor());
+        try {
+            new URL("http://127.0.0.1:19002").openConnection().connect();
+            Assert.assertTrue("Expected connection to be refused.", false);
+        } catch (IOException e) {
+            // expected
+        }
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SqlppExecutionIT.java b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SqlppExecutionIT.java
new file mode 100644
index 0000000..f1738fe
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/java/org/apache/asterix/test/server/SqlppExecutionIT.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009-2013 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.asterix.test.server;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.asterix.testframework.context.TestCaseContext;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Runs the runtime test cases under 'asterix-app/src/test/resources/runtimets'.
+ */
+@RunWith(Parameterized.class)
+public class SqlppExecutionIT extends AbstractExecutionIT {
+
+    @Parameters(name = "SqlppExecutionIT {index}: {0}")
+    public static Collection<Object[]> tests() throws Exception {
+        Collection<Object[]> testArgs = buildTestsInXml("only_sqlpp.xml");
+        if (testArgs.size() == 0) {
+            testArgs = buildTestsInXml("testsuite_sqlpp.xml");
+        }
+        return testArgs;
+    }
+
+    protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception {
+        Collection<Object[]> testArgs = new ArrayList<Object[]>();
+        TestCaseContext.Builder b = new TestCaseContext.Builder();
+        for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) {
+            testArgs.add(new Object[] { ctx });
+        }
+        return testArgs;
+
+    }
+
+    public SqlppExecutionIT(TestCaseContext tcCtx) {
+        super(tcCtx);
+    }
+}
diff --git a/asterixdb/asterix-server/src/test/resources/NCServiceExecutionIT/cc.conf b/asterixdb/asterix-server/src/test/resources/NCServiceExecutionIT/cc.conf
index 2a1c652..4020ca1 100644
--- a/asterixdb/asterix-server/src/test/resources/NCServiceExecutionIT/cc.conf
+++ b/asterixdb/asterix-server/src/test/resources/NCServiceExecutionIT/cc.conf
@@ -19,6 +19,8 @@
 txn.log.dir=../asterix-server/target/tmp/asterix_nc1/txnlog
 core.dump.dir=../asterix-server/target/tmp/asterix_nc1/coredump
 iodevices=../asterix-server/target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+nc.api.port=19004
+jvm.args=-Xloggc:/tmp/asterix-server-failsafe/asterix_nc1-%p-gc.log -XX:+PrintGC -XX:+PrintGCDateStamps -XX:GCLogFileSize=10M
 #jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
 
 [nc/asterix_nc2]
@@ -26,13 +28,15 @@
 txn.log.dir=../asterix-server/target/tmp/asterix_nc2/txnlog
 core.dump.dir=../asterix-server/target/tmp/asterix_nc2/coredump
 iodevices=../asterix-server/target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+nc.api.port=19005
+jvm.args=-Xloggc:/tmp/asterix-server-failsafe/asterix_nc2-%p-gc.log -XX:+PrintGC -XX:+PrintGCDateStamps -XX:GCLogFileSize=10M
 #jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5007
 
 [nc]
 address=127.0.0.1
 command=asterixnc
 app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
-jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+jvm.args=-Xmx4g -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
 storage.subdir=test_storage
 storage.memorycomponent.globalbudget = 1073741824
 
@@ -40,6 +44,7 @@
 address = 127.0.0.1
 app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
 heartbeat.period=2000
+heartbeat.max.misses=25
 
 [common]
 log.level = INFO
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/cc.conf b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/cc.conf
new file mode 100644
index 0000000..e34cf9e
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/cc.conf
@@ -0,0 +1,49 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=../asterix-server/target/tmp/asterix_nc1/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc1/coredump
+iodevices=../asterix-server/target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006
+nc.api.port=19004
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=../asterix-server/target/tmp/asterix_nc2/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc2/coredump
+iodevices=../asterix-server/target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007
+nc.api.port=19005
+data.listen.port=12345
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.subdir=test_storage
+storage.memorycomponent.globalbudget = 1073741824
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
diff --git a/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice1.conf b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice1.conf
new file mode 100644
index 0000000..ba10142
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice1.conf
@@ -0,0 +1,20 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[ncservice]
+logdir=../asterix-server/target/failsafe-reports
+
diff --git a/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice2.conf b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice2.conf
new file mode 100644
index 0000000..2036584
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/NcLifecycleIT/ncservice2.conf
@@ -0,0 +1,21 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[ncservice]
+logdir=../asterix-server/target/failsafe-reports
+port=9091
+
diff --git a/asterixdb/asterix-server/src/test/resources/ReplicationIT/cc.conf b/asterixdb/asterix-server/src/test/resources/ReplicationIT/cc.conf
new file mode 100644
index 0000000..b36d41c
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/ReplicationIT/cc.conf
@@ -0,0 +1,53 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[nc/asterix_nc1]
+txn.log.dir=../asterix-server/target/tmp/asterix_nc1/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc1/coredump
+iodevices=../asterix-server/target/tmp/asterix_nc1/iodevice1,../asterix-server/target/tmp/asterix_nc1/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006
+replication.listen.port=2001
+nc.api.port=19004
+
+[nc/asterix_nc2]
+ncservice.port=9091
+txn.log.dir=../asterix-server/target/tmp/asterix_nc2/txnlog
+core.dump.dir=../asterix-server/target/tmp/asterix_nc2/coredump
+iodevices=../asterix-server/target/tmp/asterix_nc2/iodevice1,../asterix-server/target/tmp/asterix_nc2/iodevice2
+#jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007
+replication.listen.port=2002
+nc.api.port=19005
+
+[nc]
+address=127.0.0.1
+command=asterixnc
+app.class=org.apache.asterix.hyracks.bootstrap.NCApplication
+jvm.args=-Xmx4096m -Dnode.Resolver="org.apache.asterix.external.util.IdentitiyResolverFactory"
+storage.subdir=test_storage
+storage.memorycomponent.globalbudget = 1073741824
+
+[cc]
+address = 127.0.0.1
+app.class=org.apache.asterix.hyracks.bootstrap.CCApplication
+heartbeat.period=2000
+heartbeat.max.misses=25
+
+[common]
+log.level = INFO
+replication.enabled=true
+replication.strategy=all
+replication.factor=2
diff --git a/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice1.conf b/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice1.conf
new file mode 100644
index 0000000..ba10142
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice1.conf
@@ -0,0 +1,20 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[ncservice]
+logdir=../asterix-server/target/failsafe-reports
+
diff --git a/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice2.conf b/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice2.conf
new file mode 100644
index 0000000..2036584
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/ReplicationIT/ncservice2.conf
@@ -0,0 +1,21 @@
+; Licensed to the Apache Software Foundation (ASF) under one
+; or more contributor license agreements.  See the NOTICE file
+; distributed with this work for additional information
+; regarding copyright ownership.  The ASF licenses this file
+; to you under the Apache License, Version 2.0 (the
+; "License"); you may not use this file except in compliance
+; with the License.  You may obtain a copy of the License at
+;
+;   http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing,
+; software distributed under the License is distributed on an
+; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+; KIND, either express or implied.  See the License for the
+; specific language governing permissions and limitations
+; under the License.
+
+[ncservice]
+logdir=../asterix-server/target/failsafe-reports
+port=9091
+
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.1.ddl.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.1.ddl.sqlpp
new file mode 100644
index 0000000..15bc3c5
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.1.ddl.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE TYPE MyType AS {
+  id : int
+};
+
+CREATE DATASET ds_1(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.2.query.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.2.query.sqlpp
new file mode 100644
index 0000000..ef836f4
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.2.query.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+select value count(*) from ds_1;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.3.node.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.3.node.cmd
new file mode 100644
index 0000000..a04c093
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.3.node.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+kill asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.4.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.4.pollget.http
new file mode 100644
index 0000000..777e3dd
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.4.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=60
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.5.port.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.5.port.cmd
new file mode 100644
index 0000000..60acc69
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.5.port.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+localhost 12345 30
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.6.node.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.6.node.cmd
new file mode 100644
index 0000000..26a6503
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.6.node.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+start asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.7.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.7.pollget.http
new file mode 100644
index 0000000..777e3dd
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.7.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=60
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.8.ddl.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.8.ddl.sqlpp
new file mode 100644
index 0000000..f96d5a8
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.8.ddl.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE DATASET ds_2(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.9.query.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.9.query.sqlpp
new file mode 100644
index 0000000..4deaacf
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/queries/networking/reuse_data_port/reuse_data_port.9.query.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+select value count(*) from ds_2;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.3.adm b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.3.adm
new file mode 100644
index 0000000..c227083
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.3.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.5.adm b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.5.adm
new file mode 100644
index 0000000..8d5d123
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.5.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc1",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : false,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : false,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "UNUSABLE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.7.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/metadata_only_replication/results/metadata_recovery/metadata_node_recovery/metadata_node_recovery.cluster_state.7.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.7.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.8.adm b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.8.adm
new file mode 100644
index 0000000..c227083
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/results/networking/reuse_data_port/reuse_data_port.8.adm
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/testsuite.xml b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/testsuite.xml
new file mode 100644
index 0000000..c1e5f14
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/NcLifecycle/testsuite.xml
@@ -0,0 +1,27 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".sql">
+  <test-group name="networking">
+    <test-case FilePath="networking">
+      <compilation-unit name="reuse_data_port">
+        <output-dir compare="Text">reuse_data_port</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/asterix-configuration.xml b/asterixdb/asterix-server/src/test/resources/integrationts/asterix-configuration.xml
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/asterix-configuration.xml
rename to asterixdb/asterix-server/src/test/resources/integrationts/asterix-configuration.xml
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
new file mode 100644
index 0000000..a24966b
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Create a feed dataset that uses the feed simulator adapter.
+                  The feed simulator simulates feed from a file in the local fs.
+                  Associate with the feed an external user-defined function. The UDF 
+                  finds topics in each tweet. A topic is identified by a #. 
+                  Begin ingestion and apply external user defined function
+ * Expected Res : Success
+ * Date         : 23rd Apr 2013
+ */
+use dataverse externallibtest;
+
+create type TestTypedAdapterOutputType as closed {
+  tweetid: int64,
+  message-text: string
+}
+
+create dataset TweetsTestAdapter(TestTypedAdapterOutputType)
+primary key tweetid;
+
+create feed TestTypedAdapterFeed
+with {
+ "adapter-name" : "testlib#test_typed_adapter",
+ "num_output_records" : "5",
+ "type-name" : "TestTypedAdapterOutputType"
+};
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
new file mode 100644
index 0000000..8772ea8
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Create a feed dataset that uses the feed simulator adapter.
+                  The feed simulator simulates feed from a file in the local fs.
+                  Associate with the feed an external user-defined function. The UDF
+                  finds topics in each tweet. A topic is identified by a #.
+                  Begin ingestion and apply external user defined function
+ * Expected Res : Success
+ * Date         : 23rd Apr 2013
+ */
+use dataverse externallibtest;
+
+create type TweetInputType as closed {
+  id: string,
+  username : string,
+  location : string,
+  text : string,
+  timestamp : string
+}
+
+create type TweetOutputType as closed {
+  id: string,
+  username : string,
+  location : string,
+  text : string,
+  timestamp : string,
+  topics : {{string}}
+}
+
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+ "type-name" : "TweetInputType",
+ "path" : "asterix_nc1://../../../../../../asterix-app/data/twitter/obamatweets.adm",
+ "format" : "adm"
+};
+
+create dataset TweetsFeedIngest(TweetOutputType)
+primary key id;
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.3.sleep.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.3.sleep.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.3.sleep.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.3.sleep.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.4.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.4.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.4.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-feeds/feed_ingest/feed_ingest.4.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.2.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.2.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.2.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/getCapital/getCapital.2.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/mysum/mysum.1.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/mysum/mysum.1.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/mysum/mysum.1.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/mysum/mysum.1.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.2.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.2.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.2.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-functions/toUpper/toUpper.2.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.2.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.2.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.2.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/queries/library-parsers/record-parser/record-parser.2.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-adapters/typed_adapter/typed_adapter.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-adapters/typed_adapter/typed_adapter.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-adapters/typed_adapter/typed_adapter.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-adapters/typed_adapter/typed_adapter.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-feeds/feed_ingest/feed_ingest.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-feeds/feed_ingest/feed_ingest.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-feeds/feed_ingest/feed_ingest.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-feeds/feed_ingest/feed_ingest.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/getCapital/getCapital.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/getCapital/getCapital.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/getCapital/getCapital.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/getCapital/getCapital.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/insert-from-select/insert-from-select.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/insert-from-select/insert-from-select.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/insert-from-select/insert-from-select.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/insert-from-select/insert-from-select.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/mysum/mysum.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/mysum/mysum.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/mysum/mysum.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/mysum/mysum.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/toUpper/toUpper.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/toUpper/toUpper.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-functions/toUpper/toUpper.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-functions/toUpper/toUpper.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/functionDataset/functionDataset.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/functionDataset/functionDataset.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/functionDataset/functionDataset.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/functionDataset/functionDataset.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/libraryDataset/libraryDataset.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/libraryDataset/libraryDataset.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-metadata/libraryDataset/libraryDataset.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-metadata/libraryDataset/libraryDataset.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-parsers/record-parser/record-parser.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-parsers/record-parser/record-parser.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/results/library-parsers/record-parser/record-parser.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/results/library-parsers/record-parser/record-parser.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/library/testsuite.xml b/asterixdb/asterix-server/src/test/resources/integrationts/library/testsuite.xml
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/library/testsuite.xml
rename to asterixdb/asterix-server/src/test/resources/integrationts/library/testsuite.xml
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.2.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.2.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.2.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.2.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.3.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.3.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.3.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.3.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.4.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.4.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.4.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.4.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.6.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.6.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.6.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.6.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.7.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.7.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.7.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.7.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.8.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.8.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.8.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.8.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.9.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.9.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.9.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/backupRestore/backupRestore.9.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.1.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.1.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.1.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.1.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.2.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.2.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.2.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.2.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.3.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.3.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.3.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.3.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.4.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.4.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.4.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/installLibrary/installLibrary.4.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.2.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.2.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.2.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.2.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.3.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.3.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.3.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.3.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.4.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.4.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.4.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/queries/asterix-lifecycle/uninstallLibrary/uninstallLibrary.4.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/backupRestore/backupRestore.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/backupRestore/backupRestore.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/backupRestore/backupRestore.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/backupRestore/backupRestore.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/installLibrary/installLibrary.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/installLibrary/installLibrary.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/installLibrary/installLibrary.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/installLibrary/installLibrary.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/results/asterix-lifecycle/uninstallLibrary/uninstallLibrary.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/testsuite.xml b/asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/testsuite.xml
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/lifecycle/testsuite.xml
rename to asterixdb/asterix-server/src/test/resources/integrationts/lifecycle/testsuite.xml
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/data/fbu.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/replication/data/fbu.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.1.sto.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.1.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.1.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.10.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.10.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.10.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.11.post.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.11.post.http
new file mode 100644
index 0000000..2e8fc63
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.11.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/partition/master?partition=0&node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.12.post.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.12.post.http
new file mode 100644
index 0000000..e8dca0b
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.12.post.http
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/admin/cluster/metadataNode?node=asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.13.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.13.pollget.http
new file mode 100644
index 0000000..32e2f78
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.13.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.14.query.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.14.query.sqlpp
new file mode 100644
index 0000000..a612cbb
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.14.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+SELECT value count(*)
+FROM Metadata.`Dataset`
+WHERE DatasetName = 'ds_1';
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.15.ddl.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.15.ddl.sqlpp
new file mode 100644
index 0000000..f96d5a8
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.15.ddl.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE DATASET ds_2(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.16.query.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.16.query.sqlpp
new file mode 100644
index 0000000..555954d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.16.query.sqlpp
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+SELECT value count(*)
+FROM Metadata.`Dataset`
+WHERE DatasetName = 'ds_2';
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.17.sto.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.17.sto.cmd
new file mode 100644
index 0000000..71621ac
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.17.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /removeReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.2.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.2.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.2.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.3.ddl.sqlpp b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.3.ddl.sqlpp
new file mode 100644
index 0000000..15bc3c5
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.3.ddl.sqlpp
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+CREATE TYPE MyType AS {
+  id : int
+};
+
+CREATE DATASET ds_1(MyType) PRIMARY KEY id;
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.4.node.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.4.node.cmd
new file mode 100644
index 0000000..a04c093
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.4.node.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+kill asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.5.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.5.pollget.http
new file mode 100644
index 0000000..777e3dd
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.5.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=60
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.6.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.6.pollget.http
new file mode 100644
index 0000000..6867a5d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.6.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=30
+
+nc:asterix_nc1 /admin/storage/partition/0
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.7.node.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.7.node.cmd
new file mode 100644
index 0000000..26a6503
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.7.node.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+start asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.8.pollget.http b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.8.pollget.http
new file mode 100644
index 0000000..777e3dd
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.8.pollget.http
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+//polltimeoutsecs=60
+
+/admin/cluster/summary
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.9.sto.cmd b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.9.sto.cmd
new file mode 100644
index 0000000..7ddaa20
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/queries/failover/resync_failed_replica/resync_failed_replica.9.sto.cmd
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+nc:asterix_nc1 /addReplica 0 asterix_nc2
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.10.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.10.adm
new file mode 100644
index 0000000..7e92c87
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.10.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.11.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.11.adm
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.12.adm
similarity index 100%
copy from asterixdb/asterix-app/src/test/resources/runtimets/results/temp-dataset/drop-empty-secondary-indexes/drop-empty-secondary-indexes.1.adm
copy to asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.12.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.13.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.13.adm
new file mode 100644
index 0000000..fa5cfb4
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.13.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc2",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "ACTIVE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.14.adm
similarity index 100%
copy from asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.adm
copy to asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.14.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.16.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.16.adm
new file mode 100644
index 0000000..d0138cb
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.16.adm
@@ -0,0 +1,3 @@
+1
+
+
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.2.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.2.adm
new file mode 100644
index 0000000..7e92c87
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.2.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "IN_SYNC"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.5.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.5.adm
new file mode 100644
index 0000000..8d5d123
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.5.adm
@@ -0,0 +1,38 @@
+{
+  "metadata_node" : "asterix_nc1",
+  "partitions" : {
+    "0" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 0,
+      "pendingActivation" : false
+    },
+    "1" : {
+      "active" : true,
+      "activeNodeId" : "asterix_nc1",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc1",
+      "partitionId" : 1,
+      "pendingActivation" : false
+    },
+    "2" : {
+      "active" : false,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 0,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 2,
+      "pendingActivation" : false
+    },
+    "3" : {
+      "active" : false,
+      "activeNodeId" : "asterix_nc2",
+      "iodeviceNum" : 1,
+      "nodeId" : "asterix_nc2",
+      "partitionId" : 3,
+      "pendingActivation" : false
+    }
+  },
+  "state" : "UNUSABLE"
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.6.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.6.adm
new file mode 100644
index 0000000..4da3d42
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.6.adm
@@ -0,0 +1,7 @@
+[ {
+  "partition" : 0,
+  "replicas" : [ {
+    "location" : "127.0.0.1:2002",
+    "status" : "DISCONNECTED"
+  } ]
+} ]
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm b/asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.8.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/replication/results/failover/resync_failed_replica/resync_failed_replica.8.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/replication/testsuite.xml b/asterixdb/asterix-server/src/test/resources/integrationts/replication/testsuite.xml
new file mode 100644
index 0000000..df5dbac
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/replication/testsuite.xml
@@ -0,0 +1,27 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
+  <test-group name="failover">
+    <test-case FilePath="failover">
+      <compilation-unit name="resync_failed_replica">
+        <output-dir compare="Text">resync_failed_replica</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+</test-suite>
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/828.h1w.adm b/asterixdb/asterix-server/src/test/resources/integrationts/restart/828.h1w.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/828.h1w.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/828.h1w.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/hugeobject.adm b/asterixdb/asterix-server/src/test/resources/integrationts/restart/hugeobject.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/hugeobject.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/hugeobject.adm
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql
new file mode 100644
index 0000000..e3273bc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.01.ddl.aql
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ /*
+ * Description  : Reproduction scenario for ASTERIXDB-1636
+ * Expected Res : Success
+ * Date         : Oct 5th 2016
+ */
+
+drop dataverse twitter if exists;
+create dataverse twitter if not exists;
+use dataverse twitter
+create type typeUser if not exists as open {
+    id: int64,
+    name: string,
+    screen_name : string,
+    lang : string,
+    location: string,
+    create_at: date,
+    description: string,
+    followers_count: int32,
+    friends_count: int32,
+    statues_count: int64
+}
+create type typePlace if not exists as open{
+    country : string,
+    country_code : string,
+    full_name : string,
+    id : string,
+    name : string,
+    place_type : string,
+    bounding_box : rectangle
+}
+create type typeGeoTag if not exists as open {
+    stateID: int32,
+    stateName: string,
+    countyID: int32,
+    countyName: string,
+    cityID: int32?,
+    cityName: string?
+}
+create type typeTweet if not exists as open{
+    create_at : datetime,
+    id: int64,
+    "text": string,
+    in_reply_to_status : int64,
+    in_reply_to_user : int64,
+    favorite_count : int64,
+    coordinate: point?,
+    retweet_count : int64,
+    lang : string,
+    is_retweet: boolean,
+    hashtags : {{ string }} ?,
+    user_mentions : {{ int64 }} ? ,
+    user : typeUser,
+    place : typePlace?,
+    geo_tag: typeGeoTag
+}
+
+create dataset ds_tweet(typeTweet) if not exists primary key id with filter on create_at;
+create index text_idx if not exists on ds_tweet("text") type keyword;
+
+create feed MessageFeed with {
+  "adapter-name" : "localfs",
+  "path" : "localhost://../../../../../src/test/resources/integrationts/restart/828.h1w.adm",
+  "format" : "adm",
+  "type-name" : "typeTweet"
+};
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.02.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.02.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.02.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.02.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.03.script.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.03.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.03.script.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.03.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql
new file mode 100644
index 0000000..67fead1
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.04.ddl.aql
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ /*
+ * Description  : Reproduction scenario for ASTERIXDB-1636
+ * Expected Res : Success
+ * Date         : Oct 5th 2016
+ */
+
+use dataverse twitter;
+drop feed TweetFeed if exists;
+create feed TweetFeed with {
+ "adapter-name" : "localfs",
+ "path" : "localhost://../../../../../target/tweets.json",
+ "format" : "adm",
+ "type-name" : "typeTweet"
+};
+
+set wait-for-completion-feed "true";
+connect feed TweetFeed to dataset ds_tweet;
+start feed TweetFeed;
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.05.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.05.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.05.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.05.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.06.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.06.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.06.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.06.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.07.script.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.07.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.07.script.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.07.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.08.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.08.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.08.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.08.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.09.sleep.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.09.sleep.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.09.sleep.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.09.sleep.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.10.script.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.10.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.11.script.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.11.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.11.script.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/feed-restart/issue-1636/issue-1636.11.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.1.ddl.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.1.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.1.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.1.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.2.update.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.2.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.2.update.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.2.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.3.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.3.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.3.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.3.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.4.mgx.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.4.mgx.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.4.mgx.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.4.mgx.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.5.query.aql b/asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.5.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.5.query.aql
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/queries/storage-restart/issue-1725/issue-1725.5.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/results/storage-restart/issue-1725/issue-1725.5.adm b/asterixdb/asterix-server/src/test/resources/integrationts/restart/results/storage-restart/issue-1725/issue-1725.5.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/results/storage-restart/issue-1725/issue-1725.5.adm
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/results/storage-restart/issue-1725/issue-1725.5.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/cat.sh b/asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/cat.sh
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/cat.sh
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/cat.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/grep_log.sh b/asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/grep_log.sh
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/grep_log.sh
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/grep_log.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/kill_cc_and_nc.sh
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/kill_cc_and_nc.sh
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/kill_cc_and_nc.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/touch.sh b/asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/touch.sh
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/touch.sh
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/scripts/feed-restart/issue-1636/touch.sh
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/testsuite.xml b/asterixdb/asterix-server/src/test/resources/integrationts/restart/testsuite.xml
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/testsuite.xml
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/testsuite.xml
diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/restart/tweets.json b/asterixdb/asterix-server/src/test/resources/integrationts/restart/tweets.json
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/integrationts/restart/tweets.json
rename to asterixdb/asterix-server/src/test/resources/integrationts/restart/tweets.json
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.4.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.4.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.4.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.4.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.5.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.5.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.5.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/dml_after_restart/multiple_secondary_indices/multiple_secondary_indices.5.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
new file mode 100644
index 0000000..9b2960d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.3.update.aql
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/**
+ *
+ * Big object (20 MB) loading test
+ * Expected result: success
+ *
+ */
+
+use dataverse testdv2;
+
+set hash_merge "true"
+
+load dataset testds
+using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/target/data/big-object/big_object_20M.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.5.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.5.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.5.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.5.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/big_object_20M/big_object_20M.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.1.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql
new file mode 100644
index 0000000..98b9845
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.2.ddl.aql
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Description  : Create a change feed with meta-data and test ingestion of records
+ * Expected Res : Success
+ * Date         : 24th Feb 2016
+ */
+
+drop dataverse KeyVerse if exists;
+create dataverse KeyVerse;
+use dataverse KeyVerse;
+
+create type DocumentType as open{
+};
+
+create type KVMetaType as open{
+"key":string,
+vbucket:int32,
+seq:int64,
+cas:int64,
+expiration:int32,
+flags:int32,
+revSeq:int64,
+lockTime:int32
+};
+
+create dataset KVStore(DocumentType) with meta(KVMetaType)primary key meta()."key";
+
+create feed KVChangeStream with {
+ "adapter-name" : "adapter",
+ "type-name" : "DocumentType",
+ "meta-type-name" : "KVMetaType",
+ "reader" : "org.apache.asterix.external.input.record.reader.kv.KVTestReaderFactory",
+ "parser" : "record-with-metadata",
+ "format" : "dcp",
+ "record-format" : "json",
+ "change-feed" : "true",
+ "key-indexes" : "0",
+ "key-indicators" : "1",
+ "num-of-records" : "1000"
+};
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.3.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.3.update.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.3.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.4.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.4.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.4.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.4.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.5.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.5.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.5.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/query_after_restart/external_index/external_index.5.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
new file mode 100644
index 0000000..31fd5e3
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_index_only.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : September 25 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only/primary_index_only.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
new file mode 100644
index 0000000..a44f3f1
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_index_only.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : September 25 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_index_only_filtered/primary_index_only_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.10.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.10.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql
new file mode 100644
index 0000000..bdce483
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.2.ddl.aql
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_correlated_ngram_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 21 2017
+ */
+
+drop dataverse recovery if exists;
+create dataverse recovery;
+use dataverse recovery;
+
+/* For raw Fragile data */
+create type FragileTypeRaw as closed {
+  row_id: int32,
+  sid: int32,
+  date: string,
+  day: int32,
+  time: string,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* For cleaned Fragile data */
+create type FragileType as closed {
+  row_id: int32,
+  sid: int32,
+  date: date,
+  day: int32,
+  time: time,
+  bpm: int32,
+  RR: float,
+
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* Create dataset for loading raw Fragile data */
+create dataset Fragile_raw (FragileTypeRaw)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
+/* Create dataset for cleaned Fragile data */
+create dataset Fragile (FragileType)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
new file mode 100644
index 0000000..f55701e
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.3.update.aql
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.6.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.6.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.6.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.6.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.9.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.9.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.9.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_ngram_index/primary_plus_correlated_ngram_index.9.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.10.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.10.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql
new file mode 100644
index 0000000..0fa78f2
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.2.ddl.aql
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_keyword_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 20 2017
+ */
+
+drop dataverse recovery if exists;
+create dataverse recovery;
+use dataverse recovery;
+
+/* For raw Fragile data */
+create type FragileTypeRaw as closed {
+  row_id: int32,
+  sid: int32,
+  date: string,
+  day: int32,
+  time: string,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+
+};
+
+/* For cleaned Fragile data */
+create type FragileType as closed {
+  row_id: int32,
+  sid: int32,
+  date: date,
+  day: int32,
+  time: time,
+  bpm: int32,
+  RR: float,
+
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* Create dataset for loading raw Fragile data */
+create dataset Fragile_raw (FragileTypeRaw)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
+
+/* Create dataset for cleaned Fragile data */
+create dataset Fragile (FragileType)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
new file mode 100644
index 0000000..9b0e47d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.3.update.aql
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.6.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.6.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.6.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.6.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.9.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.9.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.9.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_correlated_rtree_index/primary_plus_correlated_rtree_index.9.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.10.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.10.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql
new file mode 100644
index 0000000..b27ec90
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.2.ddl.aql
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_correlated_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 8 2017
+ */
+
+drop dataverse recovery if exists;
+create dataverse recovery;
+use dataverse recovery;
+
+/* For raw Fragile data */
+create type FragileTypeRaw as closed {
+  row_id: int32,
+  sid: int32,
+  date: string,
+  day: int32,
+  time: string,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* For cleaned Fragile data */
+create type FragileType as closed {
+  row_id: int32,
+  sid: int32,
+  date: date,
+  day: int32,
+  time: time,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* Create dataset for loading raw Fragile data */
+create dataset Fragile_raw (FragileTypeRaw)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
+/* Create dataset for cleaned Fragile data */
+create dataset Fragile (FragileType)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
new file mode 100644
index 0000000..7c99165
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_correlated_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 8 2017
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.6.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.6.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.6.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.6.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.9.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.9.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.9.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_correlated_secondary_index/primary_plus_default_correlated_secondary_index.9.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
new file mode 100644
index 0000000..e286a80
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index/primary_plus_default_secondary_index.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
new file mode 100644
index 0000000..e286a80
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_default_secondary_index_filtered/primary_plus_default_secondary_index_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.10.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.10.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql
new file mode 100644
index 0000000..c79a54c
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.2.ddl.aql
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_keyword_correlated_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 21 2017
+ */
+
+drop dataverse recovery if exists;
+create dataverse recovery;
+use dataverse recovery;
+
+/* For raw Fragile data */
+create type FragileTypeRaw as closed {
+  row_id: int32,
+  sid: int32,
+  date: string,
+  day: int32,
+  time: string,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+
+};
+
+/* For cleaned Fragile data */
+create type FragileType as closed {
+  row_id: int32,
+  sid: int32,
+  date: date,
+  day: int32,
+  time: time,
+  bpm: int32,
+  RR: float,
+
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* Create dataset for loading raw Fragile data */
+create dataset Fragile_raw (FragileTypeRaw)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
+/* Create dataset for cleaned Fragile data */
+create dataset Fragile (FragileType)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
new file mode 100644
index 0000000..9b0e47d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.3.update.aql
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.6.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.6.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.6.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.6.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.9.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.9.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.9.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_correlated_secondary_index/primary_plus_keyword_correlated_secondary_index.9.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
new file mode 100644
index 0000000..e286a80
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index/primary_plus_keyword_secondary_index.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
new file mode 100644
index 0000000..d52fe3e
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.3.update.aql
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_keyword_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_keyword_secondary_index_filtered/primary_plus_keyword_secondary_index_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.10.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.10.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.10.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.10.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql
new file mode 100644
index 0000000..e473591
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.2.ddl.aql
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_multiple_correlated_secondary_indices.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : June 21 2017
+ */
+
+drop dataverse recovery if exists;
+create dataverse recovery;
+use dataverse recovery;
+
+/* For raw Fragile data */
+create type FragileTypeRaw as closed {
+  row_id: int32,
+  sid: int32,
+  date: string,
+  day: int32,
+  time: string,
+  bpm: int32,
+  RR: float,
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+
+};
+
+/* For cleaned Fragile data */
+create type FragileType as closed {
+  row_id: int32,
+  sid: int32,
+  date: date,
+  day: int32,
+  time: time,
+  bpm: int32,
+  RR: float,
+
+  /* new string field and location field*/
+  text: string,
+  location: point,
+  text2: string
+};
+
+/* Create dataset for loading raw Fragile data */
+create dataset Fragile_raw (FragileTypeRaw)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
+/* Create dataset for cleaned Fragile data */
+create dataset Fragile (FragileType)
+primary key row_id
+with {
+  "merge-policy": {
+    "name": "correlated-prefix",
+    "parameters": { "max-mergable-component-size": 16384, "max-tolerance-component-count": 3 }
+  }
+};
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
new file mode 100644
index 0000000..9b0e47d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.3.update.aql
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.6.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.6.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.6.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.6.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.9.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.9.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.9.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/primary_plus_multiple_correlated_secondary_indices.9.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
new file mode 100644
index 0000000..cc626b5
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.3.update.aql
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_plus_keyword_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices/primary_plus_multiple_secondary_indices.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
new file mode 100644
index 0000000..d52fe3e
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.3.update.aql
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_keyword_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/primary_plus_multiple_secondary_indices_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
new file mode 100644
index 0000000..eef562a
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index/primary_plus_ngram_index.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
new file mode 100644
index 0000000..e286a80
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_ngram_index_filtered/primary_plus_ngram_index_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
new file mode 100644
index 0000000..e286a80
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_default_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index/primary_plus_rtree_index.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
new file mode 100644
index 0000000..d52fe3e
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.3.update.aql
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_keyword_secondary_index.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ * Date            : Oct 15 2013
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_filtered/primary_plus_rtree_index_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
new file mode 100644
index 0000000..ef59319
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_rtree_index_insert_and_delete.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete/primary_plus_rtree_index_insert_and_delete.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
new file mode 100644
index 0000000..ef59319
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+ * Test case Name  : primary_plus_rtree_index_insert_and_delete.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.
+ * Expected Result : Success
+ */
+
+use dataverse recovery;
+
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_02.adm"),("format"="adm")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.4.txneu.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.4.txneu.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.4.txneu.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.4.txneu.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.5.txnqbc.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.5.txnqbc.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.5.txnqbc.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.5.txnqbc.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.6.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.6.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.6.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.6.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.8.txnqar.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.8.txnqar.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.8.txnqar.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.8.txnqar.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.9.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.9.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.9.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/primary_plus_rtree_index_insert_and_delete_filtered.9.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.6.errddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.6.errddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.6.errddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.6.errddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataset_recovery/dataset_recovery.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.6.errddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.6.errddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.6.errddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.6.errddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/datatype_recovery/datatype_recovery.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.6.errddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.6.errddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.6.errddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.6.errddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/dataverse_recovery/dataverse_recovery.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
new file mode 100644
index 0000000..31fd5e3
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_index_only.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : September 25 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.5.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.5.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.5.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.5.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.6.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.6.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.6.update.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.6.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.7.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.7.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.7.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.7.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/delete_after_recovery/delete_after_recovery.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.5.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.5.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.5.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.5.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.6.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.6.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.6.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.6.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.7.errddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.7.errddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.7.errddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.7.errddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/function_recovery/function_recovery.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
new file mode 100644
index 0000000..31fd5e3
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.3.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_index_only.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : September 25 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.5.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.5.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.5.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.5.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.6.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.6.update.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.6.update.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.6.update.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.7.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.7.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.7.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.7.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.8.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.8.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.8.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/insert_after_recovery/insert_after_recovery.8.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.4.script.aql
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
new file mode 100644
index 0000000..31fd5e3
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.5.update.aql
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/* 
+ * Test case Name  : primary_index_only.aql
+ * Description     : Check that abort from duplicate key exception works and crash recovery works after the abort.   
+ * Expected Result : Success
+ * Date            : September 25 2013
+ */
+
+use dataverse recovery;
+
+load dataset Fragile_raw using localfs
+(("path"="asterix_nc1://../../../../../asterix-app/data/csv/fragile_01.csv"),("format"="delimited-text"),("delimiter"=",")) pre-sorted;
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.6.query.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.6.query.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.6.query.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.6.query.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/load_after_recovery/load_after_recovery.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.1.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.1.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.1.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.1.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.2.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.2.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.2.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.2.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.3.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.3.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.3.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.3.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.4.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.4.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.4.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.4.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.5.ddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.5.ddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.5.ddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.5.ddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.6.errddl.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.6.errddl.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.6.errddl.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.6.errddl.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.7.script.aql b/asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.7.script.aql
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.7.script.aql
rename to asterixdb/asterix-server/src/test/resources/transactionts/queries/recovery_ddl/secondary_index_recovery/secondary_index_recovery.7.script.aql
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/big_object_20M/big_object_20M.1.adm.template b/asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/big_object_20M/big_object_20M.1.adm.template
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/big_object_20M/big_object_20M.1.adm.template
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/big_object_20M/big_object_20M.1.adm.template
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm
new file mode 100644
index 0000000..a58cdef
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/dataset-with-meta-record/dataset-with-meta-record.5.adm
@@ -0,0 +1 @@
+802
\ No newline at end of file
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/external_index/external_index.1.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/external_index/external_index.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/query_after_restart/external_index/external_index.1.adm
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/query_after_restart/external_index/external_index.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/delete_after_recovery/delete_after_recovery.1.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/delete_after_recovery/delete_after_recovery.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/delete_after_recovery/delete_after_recovery.1.adm
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/delete_after_recovery/delete_after_recovery.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/function_recovery/function_recovery.1.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/function_recovery/function_recovery.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/function_recovery/function_recovery.1.adm
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/function_recovery/function_recovery.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/insert_after_recovery/insert_after_recovery.1.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/insert_after_recovery/insert_after_recovery.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/insert_after_recovery/insert_after_recovery.1.adm
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/insert_after_recovery/insert_after_recovery.1.adm
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/load_after_recovery/load_after_recovery.1.adm b/asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/load_after_recovery/load_after_recovery.1.adm
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/results/recovery_ddl/load_after_recovery/load_after_recovery.1.adm
rename to asterixdb/asterix-server/src/test/resources/transactionts/results/recovery_ddl/load_after_recovery/load_after_recovery.1.adm
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_after_restart/multiple_secondary_indices/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh
new file mode 100755
index 0000000..ab09dd2
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/configure_and_validate.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/dml_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/big_object_20M/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh
new file mode 100755
index 0000000..8a7c9fe
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh ;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/dataset-with-meta-record/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/query_after_restart/external_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_index_only_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_ngram_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_correlated_rtree_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_correlated_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_default_secondary_index_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_correlated_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_keyword_secondary_index_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_correlated_secondary_indices/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_multiple_secondary_indices_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_ngram_index_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/primary_plus_rtree_index_insert_and_delete_filtered/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_index_only/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_default_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_keyword_secondary_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_multiple_secondary_indices/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_ngram_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recover_after_abort/temp_primary_plus_rtree_index/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataset_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/datatype_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/dataverse_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/delete_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/function_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/insert_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/load_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/secondary_index_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_dataset_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_delete_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_insert_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_load_after_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh
new file mode 100755
index 0000000..e358618
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/create_and_start.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh 1>/dev/null 2>&1;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh
new file mode 100755
index 0000000..9a0c506
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/recovery_ddl/temp_secondary_index_recovery/stop_and_start.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh
new file mode 100755
index 0000000..ab09dd2
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/configure_and_validate.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/start-sample-cluster.sh;
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh
new file mode 100755
index 0000000..b6326cc
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/kill_cc_and_nc.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.[cn]c\.[CN]CDriver/ {print $2}' | xargs -n 1 kill -9
+ps -ef | awk '/java.*org\.apache\.hyracks\.control\.nc\.service\.NCService/ {print $2}' | xargs -n 1 kill -9
diff --git a/asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/shutdown.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/shutdown.sh
similarity index 100%
rename from asterixdb/asterix-installer/src/test/resources/transactionts/scripts/setup_teardown/shutdown.sh
rename to asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/shutdown.sh
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh
new file mode 100755
index 0000000..818d17d
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/scripts/setup_teardown/stop_and_delete.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+$NCSERVICE_HOME/opt/local/bin/stop-sample-cluster.sh;
+rm -rf $NCSERVICE_HOME/opt/local/data;
+
diff --git a/asterixdb/asterix-server/src/test/resources/transactionts/testsuite.xml b/asterixdb/asterix-server/src/test/resources/transactionts/testsuite.xml
new file mode 100644
index 0000000..38179b2
--- /dev/null
+++ b/asterixdb/asterix-server/src/test/resources/transactionts/testsuite.xml
@@ -0,0 +1,219 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
+  <test-group name="query_after_restart">
+    <test-case FilePath="query_after_restart">
+      <compilation-unit name="dataset-with-meta-record">
+        <output-dir compare="Text">dataset-with-meta-record</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="query_after_restart">
+      <compilation-unit name="external_index">
+        <output-dir compare="Text">external_index</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="query_after_restart">
+      <compilation-unit name="big_object_20M">
+        <output-dir compare="Text">big_object_20M</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+  <test-group name="dml_after_restart">
+    <test-case FilePath="dml_after_restart">
+      <compilation-unit name="multiple_secondary_indices">
+        <output-dir compare="Text">multiple_secondary_indices</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+  <test-group name="recover_after_abort">
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_index_only">
+        <output-dir compare="Text">primary_index_only</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_default_secondary_index">
+        <output-dir compare="Text">primary_plus_default_secondary_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_default_correlated_secondary_index">
+        <output-dir compare="Text">primary_plus_default_secondary_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_rtree_index">
+        <output-dir compare="Text">primary_plus_rtree_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_correlated_rtree_index">
+        <output-dir compare="Text">primary_plus_rtree_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_rtree_index_insert_and_delete">
+        <output-dir compare="Text">primary_plus_rtree_index_insert_and_delete</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_keyword_secondary_index">
+        <output-dir compare="Text">primary_plus_keyword_secondary_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_keyword_correlated_secondary_index">
+        <output-dir compare="Text">primary_plus_keyword_secondary_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_ngram_index">
+        <output-dir compare="Text">primary_plus_ngram_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_correlated_ngram_index">
+        <output-dir compare="Text">primary_plus_ngram_index</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_multiple_secondary_indices">
+        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_multiple_correlated_secondary_indices">
+        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_index_only_filtered">
+        <output-dir compare="Text">primary_index_only_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_default_secondary_index_filtered">
+        <output-dir compare="Text">primary_plus_default_secondary_index_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_rtree_index_filtered">
+        <output-dir compare="Text">primary_plus_rtree_index_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_rtree_index_insert_and_delete_filtered">
+        <output-dir compare="Text">primary_plus_rtree_index_insert_and_delete_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_keyword_secondary_index_filtered">
+        <output-dir compare="Text">primary_plus_keyword_secondary_index_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_ngram_index">
+        <output-dir compare="Text">primary_plus_ngram_index_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_multiple_secondary_indices">
+        <output-dir compare="Text">primary_plus_multiple_secondary_indices_filtered</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recover_after_abort">
+      <compilation-unit name="primary_plus_multiple_secondary_indices"><!-- The only exception here is during the kill command which is in a different JVM, hence not caught -->
+        <output-dir compare="Text">primary_plus_multiple_secondary_indices</output-dir>
+        <!-- <expected-error>org.apache.hyracks.algebricks.common.exceptions.AlgebricksException</expected-error> -->
+      </compilation-unit>
+    </test-case>
+  </test-group>
+
+  <test-group name="recovery_ddl">
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="dataverse_recovery">
+        <output-dir compare="Text">dataverse_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="datatype_recovery">
+        <output-dir compare="Text">datatype_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="dataset_recovery">
+        <output-dir compare="Text">dataset_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="secondary_index_recovery">
+        <output-dir compare="Text">secondary_index_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="load_after_recovery">
+        <output-dir compare="Text">load_after_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="insert_after_recovery">
+        <output-dir compare="Text">insert_after_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="delete_after_recovery">
+        <output-dir compare="Text">delete_after_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+
+    <test-case FilePath="recovery_ddl">
+      <compilation-unit name="function_recovery">
+        <output-dir compare="Text">function_recovery</output-dir>
+      </compilation-unit>
+    </test-case>
+  </test-group>
+
+</test-suite>
diff --git a/asterixdb/asterix-test-framework/pom.xml b/asterixdb/asterix-test-framework/pom.xml
index f105646..9822b20 100644
--- a/asterixdb/asterix-test-framework/pom.xml
+++ b/asterixdb/asterix-test-framework/pom.xml
@@ -35,7 +35,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <build>
diff --git a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/template/TemplateHelper.java b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/template/TemplateHelper.java
index d2f52dc..bd5400d 100644
--- a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/template/TemplateHelper.java
+++ b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/template/TemplateHelper.java
@@ -59,8 +59,8 @@
     }
 
     public File resolveTemplateFile(File inputFile) throws IOException {
-        File outputFile = File.createTempFile("template.", "." +
-                inputFile.getName().substring(0, inputFile.getName().lastIndexOf(".template")));
+        File outputFile = File.createTempFile("template.",
+                "." + inputFile.getName().substring(0, inputFile.getName().lastIndexOf(".template")));
         outputFile.deleteOnExit();
         processFile(inputFile, outputFile);
         return outputFile;
@@ -71,7 +71,7 @@
             outputFile.getParentFile().mkdirs();
         }
         try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));
-             BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
+                BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
             String line;
             while ((line = reader.readLine()) != null) {
                 Matcher m = replacementPattern.matcher(line);
diff --git a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/xml/TestSuiteParser.java b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/xml/TestSuiteParser.java
index ebd945e..201945c 100644
--- a/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/xml/TestSuiteParser.java
+++ b/asterixdb/asterix-test-framework/src/main/java/org/apache/asterix/testframework/xml/TestSuiteParser.java
@@ -22,27 +22,28 @@
 
 import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.transform.sax.SAXSource;
 
 import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
 
 public class TestSuiteParser {
-    public TestSuiteParser() {
-    }
 
-    public org.apache.asterix.testframework.xml.TestSuite parse(File testSuiteCatalog) throws Exception {
+    public TestSuite parse(File testSuiteCatalog) throws SAXException, JAXBException, ParserConfigurationException {
         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
         saxParserFactory.setNamespaceAware(true);
         saxParserFactory.setXIncludeAware(true);
         SAXParser saxParser = saxParserFactory.newSAXParser();
         saxParser.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "file");
 
-        JAXBContext ctx = JAXBContext.newInstance(org.apache.asterix.testframework.xml.TestSuite.class);
+        JAXBContext ctx = JAXBContext.newInstance(TestSuite.class);
         Unmarshaller um = ctx.createUnmarshaller();
-        return (org.apache.asterix.testframework.xml.TestSuite) um.unmarshal(new SAXSource(saxParser.getXMLReader(),
-                new InputSource(testSuiteCatalog.toURI().toString())));
+        return (TestSuite) um.unmarshal(
+                new SAXSource(saxParser.getXMLReader(), new InputSource(testSuiteCatalog.toURI().toString())));
     }
 }
diff --git a/asterixdb/asterix-tools/pom.xml b/asterixdb/asterix-tools/pom.xml
index 431ac7e..b6841ce 100644
--- a/asterixdb/asterix-tools/pom.xml
+++ b/asterixdb/asterix-tools/pom.xml
@@ -35,7 +35,7 @@
   </licenses>
 
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
 
   <build>
@@ -153,5 +153,9 @@
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
index 3b2d0ce..09a898a 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/AdmDataGen.java
@@ -46,9 +46,7 @@
 import org.apache.asterix.common.annotations.TypeDataGen;
 import org.apache.asterix.common.annotations.UndeclaredFieldsDataGen;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.MetadataException;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.lang.aql.parser.AQLParserFactory;
 import org.apache.asterix.lang.aql.parser.ParseException;
 import org.apache.asterix.lang.common.base.IParser;
@@ -727,8 +725,8 @@
                                         "list-val-file annotation cannot be used for field of type " + ti.getTypeTag());
                             }
                             AbstractCollectionType act = (AbstractCollectionType) ti;
-                            declaredFieldsGenerators[i] = new ListFromArrayGenerator(act, a, lvf.getMin(),
-                                    lvf.getMax());
+                            declaredFieldsGenerators[i] =
+                                    new ListFromArrayGenerator(act, a, lvf.getMin(), lvf.getMax());
                             break;
                         }
                         case VALFILESAMEINDEX: {
@@ -774,9 +772,9 @@
                             }
                             switch (fi.getValueType()) {
                                 case INT: {
-                                    declaredFieldsGenerators[i] = new IntIntervalGenerator(
-                                            Integer.parseInt(fi.getMin()), Integer.parseInt(fi.getMax()), prefix,
-                                            suffix);
+                                    declaredFieldsGenerators[i] =
+                                            new IntIntervalGenerator(Integer.parseInt(fi.getMin()),
+                                                    Integer.parseInt(fi.getMax()), prefix, suffix);
                                     break;
                                 }
                                 case LONG: {
@@ -785,9 +783,9 @@
                                     break;
                                 }
                                 case DOUBLE: {
-                                    declaredFieldsGenerators[i] = new DoubleIntervalGenerator(
-                                            Double.parseDouble(fi.getMin()), Double.parseDouble(fi.getMax()), prefix,
-                                            suffix);
+                                    declaredFieldsGenerators[i] =
+                                            new DoubleIntervalGenerator(Double.parseDouble(fi.getMin()),
+                                                    Double.parseDouble(fi.getMax()), prefix, suffix);
                                     break;
                                 }
                                 default: {
@@ -813,14 +811,14 @@
                         }
                         case DATEBETWEENYEARS: {
                             DateBetweenYearsDataGen dby = (DateBetweenYearsDataGen) rfdg;
-                            declaredFieldsGenerators[i] = new DateBetweenYearsGenerator(dby.getMinYear(),
-                                    dby.getMaxYear());
+                            declaredFieldsGenerators[i] =
+                                    new DateBetweenYearsGenerator(dby.getMinYear(), dby.getMaxYear());
                             break;
                         }
                         case DATETIMEBETWEENYEARS: {
                             DatetimeBetweenYearsDataGen dtby = (DatetimeBetweenYearsDataGen) rfdg;
-                            declaredFieldsGenerators[i] = new DatetimeBetweenYearsGenerator(dtby.getMinYear(),
-                                    dtby.getMaxYear());
+                            declaredFieldsGenerators[i] =
+                                    new DatetimeBetweenYearsGenerator(dtby.getMinYear(), dtby.getMaxYear());
                             break;
                         }
                         case DATETIMEADDRANDHOURS: {
@@ -842,21 +840,21 @@
                                 throw new Exception("Couldn't find field " + dtarh.getAddToField() + " before field "
                                         + recType.getFieldNames()[i]);
                             }
-                            declaredFieldsGenerators[i] = new DatetimeAddRandHoursGenerator(dtarh.getMinHour(),
-                                    dtarh.getMaxHour(), adtg);
+                            declaredFieldsGenerators[i] =
+                                    new DatetimeAddRandHoursGenerator(dtarh.getMinHour(), dtarh.getMaxHour(), adtg);
                             break;
                         }
                         case AUTO: {
                             AutoDataGen auto = (AutoDataGen) rfdg;
                             switch (ti.getTypeTag()) {
                                 case INTEGER: {
-                                    declaredFieldsGenerators[i] = new IntAutoGenerator(
-                                            Integer.parseInt(auto.getInitValueStr()));
+                                    declaredFieldsGenerators[i] =
+                                            new IntAutoGenerator(Integer.parseInt(auto.getInitValueStr()));
                                     break;
                                 }
                                 case BIGINT: {
-                                    declaredFieldsGenerators[i] = new LongAutoGenerator(
-                                            Long.parseLong(auto.getInitValueStr()));
+                                    declaredFieldsGenerators[i] =
+                                            new LongAutoGenerator(Long.parseLong(auto.getInitValueStr()));
                                     break;
                                 }
                                 default: {
@@ -881,9 +879,9 @@
                     if (!recType.isOpen()) {
                         throw new Exception("Cannot generate undeclared fields for closed type " + recType);
                     }
-                    undeclaredFieldsGenerator = new GenFieldsIntGenerator(declaredFieldsGenerators.length,
-                            ufdg.getMinUndeclaredFields(), ufdg.getMaxUndeclaredFields(),
-                            ufdg.getUndeclaredFieldsPrefix());
+                    undeclaredFieldsGenerator =
+                            new GenFieldsIntGenerator(declaredFieldsGenerators.length, ufdg.getMinUndeclaredFields(),
+                                    ufdg.getMaxUndeclaredFields(), ufdg.getUndeclaredFieldsPrefix());
                 }
             }
             if (undeclaredFieldsGenerator != null) {
@@ -937,14 +935,13 @@
         this.outputDir = outputDir;
     }
 
-    public void init() throws IOException, ParseException, AsterixException, ACIDException, MetadataException,
-            AlgebricksException {
+    public void init() throws IOException, ParseException, ACIDException, AlgebricksException {
         FileReader aql = new FileReader(schemaFile);
         IParser parser = parserFactory.createParser(aql);
         List<Statement> statements = parser.parse();
         aql.close();
         // TODO: Need to fix how to use transactions here.
-        MetadataTransactionContext mdTxnCtx = new MetadataTransactionContext(new JobId(-1));
+        MetadataTransactionContext mdTxnCtx = new MetadataTransactionContext(new TxnId(-1));
         ADGenDmlTranslator dmlt = new ADGenDmlTranslator(mdTxnCtx, statements);
         dmlt.translate();
         typeMap = dmlt.getTypeMap();
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/CustOrdDataGen.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/CustOrdDataGen.java
index b605f73..5127d7b 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/CustOrdDataGen.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/CustOrdDataGen.java
@@ -44,8 +44,8 @@
             "Lake St.", "Hill St.", "Park St.", "View St." };
     private static final int MIN_STREET_NUM = 1;
     private static final int MAX_STREET_NUM = 10000;
-    private static final String[] CITIES = { "Seattle", "San Jose", "Mountain View", "Los Angeles", "Sunnyvale",
-            "Portland" };
+    private static final String[] CITIES =
+            { "Seattle", "San Jose", "Mountain View", "Los Angeles", "Sunnyvale", "Portland" };
 
     private static final int MIN_INTERESTS = 0;
     private static final int MAX_INTERESTS = 5;
@@ -67,13 +67,13 @@
     private String[] ORDER_PRIORITIES = { "LOW", "MEDIUM", "HIGH", "PREMIUM" };
     private String[] ORDER_STATUSES = { "ORDER_PLACED", "PAYMENT_RECEIVED", "ORDER_SHIPPED", "ORDER_DELIVERED" };
 
-    private String[] firstNames = { "Joe", "John", "Jill", "Gill", "Bill", "William", "Kathy", "Cathey", "Jane",
-            "Albert" };
-    private String[] lastNames = { "Doe", "Smith", "Li", "Singh", "Williams", "Davis", "Brown", "Wilson", "Moore",
-            "Thomas" };
+    private String[] firstNames =
+            { "Joe", "John", "Jill", "Gill", "Bill", "William", "Kathy", "Cathey", "Jane", "Albert" };
+    private String[] lastNames =
+            { "Doe", "Smith", "Li", "Singh", "Williams", "Davis", "Brown", "Wilson", "Moore", "Thomas" };
 
-    private static final String[] UNDECLARED_FIELD_NAMES = { "param1", "param2", "param3", "param4", "param5",
-            "param6", "param7", "param8", "param9", "param10" };
+    private static final String[] UNDECLARED_FIELD_NAMES =
+            { "param1", "param2", "param3", "param4", "param5", "param6", "param7", "param8", "param9", "param10" };
 
     private int currentCID = 0;
     private int currentOID = 0;
@@ -414,8 +414,8 @@
             customersFile.write(customerList.get(ix).getJSON() + "\n");
 
             // generate orders
-            int numOrders = Math.abs(rndValue.nextInt()) % (MAX_ORDERS_PER_CUST - MIN_ORDERS_PER_CUST)
-                    + MIN_ORDERS_PER_CUST;
+            int numOrders =
+                    Math.abs(rndValue.nextInt()) % (MAX_ORDERS_PER_CUST - MIN_ORDERS_PER_CUST) + MIN_ORDERS_PER_CUST;
             for (int i = 0; i < numOrders; i++) {
                 ordersBatch[i].generateFieldValues(customerList.get(ix));
                 ordersList.add(ordersBatch[i]);
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/EventDataGen.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/EventDataGen.java
index b175b42..9737c93 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/EventDataGen.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/datagen/EventDataGen.java
@@ -49,12 +49,12 @@
             "Lake St.", "Hill St.", "Park St.", "View St." };
     private static final int MIN_STREET_NUM = 1;
     private static final int MAX_STREET_NUM = 10000;
-    private static final String[] CITIES = { "Seattle", "Irvine", "Laguna Beach", "Los Angeles", "San Clemente",
-            "Huntington Beach", "Portland" };
+    private static final String[] CITIES =
+            { "Seattle", "Irvine", "Laguna Beach", "Los Angeles", "San Clemente", "Huntington Beach", "Portland" };
     private static final int MIN_ZIP = 100000;
     private static final int MAX_ZIP = 999999;
-    private static final String[] LAT_LONGS = { "47,-122", "33,-117", "33,-117", "34,-118", "33,-117", "33,-117",
-            "45,-122" };
+    private static final String[] LAT_LONGS =
+            { "47,-122", "33,-117", "33,-117", "34,-118", "33,-117", "33,-117", "45,-122" };
 
     private static final int MIN_MEMBERSHIPS = 1;
     private static final int MAX_MEMBERSHIPS = 10;
@@ -87,8 +87,8 @@
             firstNameIdx = Math.abs(rndValue.nextInt()) % firstNames.length;
             lastNameIdx = Math.abs(rndValue.nextInt()) % lastNames.length;
             // name = firstNames[firstNameIx] + " " + lastNames[lastNameIx];
-            numInterests = Math.abs((rndValue.nextInt()) % (MAX_USER_INTERESTS - MIN_USER_INTERESTS))
-                    + MIN_USER_INTERESTS;
+            numInterests =
+                    Math.abs((rndValue.nextInt()) % (MAX_USER_INTERESTS - MIN_USER_INTERESTS)) + MIN_USER_INTERESTS;
             for (int i = 0; i < numInterests; i++) {
                 interests[i] = Math.abs(rndValue.nextInt()) % INTERESTS.length;
             }
@@ -107,8 +107,8 @@
                         + MEMBER_SINCE_MIN_YEAR;
                 int msMo = Math.abs(rndValue.nextInt()) % 12 + 1;
                 int msDay = Math.abs(rndValue.nextInt()) % 28 + 1;
-                member_since_date[i] = msYear + "-" + (msMo < 10 ? "0" : "") + msMo + "-" + (msDay < 10 ? "0" : "")
-                        + msDay;
+                member_since_date[i] =
+                        msYear + "-" + (msMo < 10 ? "0" : "") + msMo + "-" + (msDay < 10 ? "0" : "") + msDay;
             }
         }
 
@@ -218,14 +218,14 @@
 
     public static void main(String[] args) throws IOException {
         if (args.length != 2) {
-            System.err
-                    .println("MUST PROVIDE 2 PARAMETERS, 1. output directory path and 2. number of records to generate.");
+            System.err.println(
+                    "MUST PROVIDE 2 PARAMETERS, 1. output directory path and 2. number of records to generate.");
             System.exit(1);
         }
         String outputFile = args[0];
         int numRecords = Integer.parseInt(args[1]);
-        Writer userFile = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile + File.separator
-                + "user.adm")));
+        Writer userFile = new BufferedWriter(
+                new OutputStreamWriter(new FileOutputStream(outputFile + File.separator + "user.adm")));
         EventDataGen dgen = new EventDataGen();
         dgen.init();
         for (int i = 0; i < numRecords; i++) {
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/DataGeneratorForSpatialIndexEvaluation.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/DataGeneratorForSpatialIndexEvaluation.java
index 60bca549..4f1f3d7 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/DataGeneratorForSpatialIndexEvaluation.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/DataGeneratorForSpatialIndexEvaluation.java
@@ -34,7 +34,8 @@
 
 public class DataGeneratorForSpatialIndexEvaluation {
 
-    private static final String DUMMY_SIZE_ADJUSTER = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+    private static final String DUMMY_SIZE_ADJUSTER =
+            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
 
     private RandomDateGenerator randDateGen;
 
@@ -209,12 +210,11 @@
                             : (date.getMonth() + random.nextInt(endDate.getMonth() - date.getMonth()))
                     : random.nextInt(12) + 1;
 
-            int day = (year == endDate.getYear())
-                    ? month == endDate.getMonth()
+            int day =
+                    (year == endDate.getYear()) ? month == endDate.getMonth()
                             ? date.getDay() == endDate.getDay() ? endDate.getDay()
                                     : date.getDay() + random.nextInt(endDate.getDay() - date.getDay())
-                            : random.nextInt(28) + 1
-                    : random.nextInt(28) + 1;
+                            : random.nextInt(28) + 1 : random.nextInt(28) + 1;
             recentDate.reset(month, day, year);
             return recentDate;
         }
@@ -887,8 +887,8 @@
     }
 
     public static void main(String[] args) throws Exception {
-        DataGeneratorForSpatialIndexEvaluation dg = new DataGeneratorForSpatialIndexEvaluation(
-                new InitializationInfo());
+        DataGeneratorForSpatialIndexEvaluation dg =
+                new DataGeneratorForSpatialIndexEvaluation(new InitializationInfo());
         TweetMessageIterator tmi = dg.new TweetMessageIterator(1, new GULongIDGenerator(0, (byte) 0));
         int len = 0;
         int count = 0;
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/TweetGeneratorForSpatialIndexEvaluation.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/TweetGeneratorForSpatialIndexEvaluation.java
index fcaa2a4..0b7121f 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/TweetGeneratorForSpatialIndexEvaluation.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/external/data/TweetGeneratorForSpatialIndexEvaluation.java
@@ -23,16 +23,16 @@
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation.InitializationInfo;
 import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation.TweetMessage;
 import org.apache.asterix.tools.external.data.DataGeneratorForSpatialIndexEvaluation.TweetMessageIterator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TweetGeneratorForSpatialIndexEvaluation {
 
-    private static Logger LOGGER = Logger.getLogger(TweetGeneratorForSpatialIndexEvaluation.class.getName());
+    private static Logger LOGGER = LogManager.getLogger();
 
     public static final String KEY_DURATION = "duration";
     public static final String KEY_TPS = "tps";
@@ -116,7 +116,7 @@
                 numFlushedTweets += frameTweetCount;
                 frameTweetCount = 0;
             }
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Reached end of batch. Tweet Count: [" + partition + "]" + tweetCount);
             }
             return false;
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/tbltoadm/TblToAdm.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/tbltoadm/TblToAdm.java
index 26656f6..b1bf335 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/tbltoadm/TblToAdm.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/tbltoadm/TblToAdm.java
@@ -29,7 +29,8 @@
     private static final String SEPARATOR_STRING = "\\|\\s*";
     private static final char SEPARATOR_CHAR = '|';
 
-    private static void convertFile(String inputFileName, String outputFileName, String scmFileName) throws IOException {
+    private static void convertFile(String inputFileName, String outputFileName, String scmFileName)
+            throws IOException {
         File scmFile = new File(scmFileName);
         File inFile = new File(inputFileName);
         File outFile = new File(outputFileName);
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/test/AdmDataGenTest.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/test/AdmDataGenTest.java
index 1eef3c3..de77870 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/test/AdmDataGenTest.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/test/AdmDataGenTest.java
@@ -24,8 +24,9 @@
 import java.io.FileReader;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.logging.Logger;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.Assume;
 import org.junit.BeforeClass;
@@ -40,14 +41,14 @@
 @RunWith(Parameterized.class)
 public class AdmDataGenTest {
 
-    private static final Logger LOGGER = Logger.getLogger(AdmDataGenTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String SEPARATOR = File.separator;
     private static final String EXTENSION_QUERY = "adg";
     private static final String FILENAME_IGNORE = "ignore.txt";
     private static final String FILENAME_ONLY = "only.txt";
-    private static final String PATH_BASE = "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "adgts"
-            + SEPARATOR;
+    private static final String PATH_BASE =
+            "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "adgts" + SEPARATOR;
     private static final String PATH_QUERIES = PATH_BASE + "dgscripts" + SEPARATOR;
     private static final String PATH_EXPECTED = PATH_BASE + "results" + SEPARATOR;
     private static final String PATH_ACTUAL = "adgtest" + SEPARATOR;
@@ -108,12 +109,12 @@
 
     @Test
     public void test() throws Exception {
-        String scriptFileShort = scriptFile.getPath().substring(PATH_QUERIES.length())
-                .replace(SEPARATOR.charAt(0), '/');
+        String scriptFileShort =
+                scriptFile.getPath().substring(PATH_QUERIES.length()).replace(SEPARATOR.charAt(0), '/');
         if (!only.isEmpty()) {
             if (!only.contains(scriptFileShort)) {
-                LOGGER.info("SKIP TEST: \"" + scriptFile.getPath()
-                        + "\" \"only.txt\" not empty and not in \"only.txt\".");
+                LOGGER.info(
+                        "SKIP TEST: \"" + scriptFile.getPath() + "\" \"only.txt\" not empty and not in \"only.txt\".");
             }
             Assume.assumeTrue(only.contains(scriptFileShort));
         }
@@ -185,8 +186,8 @@
                 lineActual = readerActual.readLine();
                 // Assert.assertEquals(null, lineActual);
                 if (lineActual != null) {
-                    throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< \n> "
-                            + lineActual);
+                    throw new Exception(
+                            "Result for " + scriptFile + " changed at line " + num + ":\n< \n> " + lineActual);
                 }
             } finally {
                 readerExpected.close();
diff --git a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
index 94389b2..c6095bd 100644
--- a/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
+++ b/asterixdb/asterix-tools/src/test/java/org/apache/asterix/tools/translator/ADGenDmlTranslator.java
@@ -23,8 +23,6 @@
 import java.util.Map;
 
 import org.apache.asterix.common.annotations.TypeDataGen;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.MetadataException;
 import org.apache.asterix.lang.common.base.Statement;
 import org.apache.asterix.lang.common.statement.DataverseDecl;
 import org.apache.asterix.lang.common.statement.TypeDecl;
@@ -47,10 +45,10 @@
         this.aqlStatements = aqlStatements;
     }
 
-    public void translate() throws AsterixException, MetadataException, AlgebricksException {
+    public void translate() throws AlgebricksException {
         String defaultDataverse = getDefaultDataverse();
-        types = new HashMap<TypeSignature, IAType>();
-        typeDataGenMap = new HashMap<TypeSignature, TypeDataGen>();
+        types = new HashMap<>();
+        typeDataGenMap = new HashMap<>();
 
         for (Statement stmt : aqlStatements) {
             if (stmt.getKind() == Statement.Kind.TYPE_DECL) {
diff --git a/asterixdb/asterix-transactions/pom.xml b/asterixdb/asterix-transactions/pom.xml
index 2070a37..ad044cb 100644
--- a/asterixdb/asterix-transactions/pom.xml
+++ b/asterixdb/asterix-transactions/pom.xml
@@ -33,7 +33,7 @@
     </license>
   </licenses>
   <properties>
-    <appendedResourcesDirectory>${basedir}/../src/main/appended-resources</appendedResourcesDirectory>
+    <root.dir>${basedir}/..</root.dir>
   </properties>
   <build>
     <plugins>
@@ -145,7 +145,19 @@
     </dependency>
     <dependency>
       <groupId>org.apache.hyracks</groupId>
+      <artifactId>algebricks-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
       <artifactId>algebricks-runtime</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-util</artifactId>
+    </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/AbstractIndexModificationOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/AbstractIndexModificationOperationCallback.java
index 1acc235..3da9e83 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/AbstractIndexModificationOperationCallback.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/AbstractIndexModificationOperationCallback.java
@@ -68,7 +68,6 @@
         }
     }
 
-    protected final long resourceId;
     protected final byte resourceType;
     protected final Operation indexOp;
     protected final ITransactionSubsystem txnSubsystem;
@@ -77,15 +76,14 @@
     protected AbstractIndexModificationOperationCallback(DatasetId datasetId, int[] primaryKeyFields,
             ITransactionContext txnCtx, ILockManager lockManager, ITransactionSubsystem txnSubsystem, long resourceId,
             int resourcePartition, byte resourceType, Operation indexOp) {
-        super(datasetId, primaryKeyFields, txnCtx, lockManager);
-        this.resourceId = resourceId;
+        super(datasetId, resourceId, primaryKeyFields, txnCtx, lockManager);
         this.resourceType = resourceType;
         this.indexOp = indexOp;
         this.txnSubsystem = txnSubsystem;
         logRecord = new LogRecord();
         logRecord.setTxnCtx(txnCtx);
         logRecord.setLogType(LogType.UPDATE);
-        logRecord.setJobId(txnCtx.getJobId().getId());
+        logRecord.setTxnId(txnCtx.getTxnId().getId());
         logRecord.setDatasetId(datasetId.getId());
         logRecord.setResourceId(resourceId);
         logRecord.setResourcePartition(resourcePartition);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
index f76cb89..fe17b39 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallback.java
@@ -45,17 +45,17 @@
     private final ILogRecord logRecord;
     private int pkHash;
 
-    public LockThenSearchOperationCallback(DatasetId datasetId, int[] entityIdFields,
+    public LockThenSearchOperationCallback(DatasetId datasetId, long resourceId, int[] entityIdFields,
             ITransactionSubsystem txnSubsystem, ITransactionContext txnCtx,
             IOperatorNodePushable operatorNodePushable) {
-        super(datasetId, entityIdFields, txnCtx, txnSubsystem.getLockManager());
+        super(datasetId, resourceId, entityIdFields, txnCtx, txnSubsystem.getLockManager());
         this.operatorNodePushable = (LSMIndexInsertUpdateDeleteOperatorNodePushable) operatorNodePushable;
         this.logManager = txnSubsystem.getLogManager();
         this.logRecord = new LogRecord();
         logRecord.setTxnCtx(txnCtx);
         logRecord.setLogSource(LogSource.LOCAL);
         logRecord.setLogType(LogType.WAIT);
-        logRecord.setJobId(txnCtx.getJobId().getId());
+        logRecord.setTxnId(txnCtx.getTxnId().getId());
         logRecord.computeAndSetLogSize();
     }
 
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallbackFactory.java
index b3d4f03..1346b76 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/LockThenSearchOperationCallbackFactory.java
@@ -18,16 +18,17 @@
  */
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 
 public class LockThenSearchOperationCallbackFactory extends AbstractOperationCallbackFactory
@@ -35,9 +36,9 @@
 
     private static final long serialVersionUID = 1L;
 
-    public LockThenSearchOperationCallbackFactory(JobId jobId, int datasetId, int[] entityIdFields,
+    public LockThenSearchOperationCallbackFactory(int datasetId, int[] entityIdFields,
             ITransactionSubsystemProvider txnSubsystemProvider, byte resourceType) {
-        super(jobId, datasetId, entityIdFields, txnSubsystemProvider, resourceType);
+        super(datasetId, entityIdFields, txnSubsystemProvider, resourceType);
     }
 
     @Override
@@ -45,9 +46,11 @@
             IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            return new LockThenSearchOperationCallback(new DatasetId(datasetId), primaryKeyFields, txnSubsystem, txnCtx,
-                    operatorNodePushable);
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
+            return new LockThenSearchOperationCallback(new DatasetId(datasetId), resourceId, primaryKeyFields,
+                    txnSubsystem, txnCtx, operatorNodePushable);
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
         }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
index b13a08e..ec776a5 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallback.java
@@ -35,9 +35,9 @@
 public class PrimaryIndexInstantSearchOperationCallback extends AbstractOperationCallback
         implements ISearchOperationCallback {
 
-    public PrimaryIndexInstantSearchOperationCallback(DatasetId datasetId, int[] entityIdFields,
+    public PrimaryIndexInstantSearchOperationCallback(DatasetId datasetId, long resourceId, int[] entityIdFields,
             ILockManager lockManager, ITransactionContext txnCtx) {
-        super(datasetId, entityIdFields, txnCtx, lockManager);
+        super(datasetId, resourceId, entityIdFields, txnCtx, lockManager);
     }
 
     @Override
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallbackFactory.java
index 0d447a9..d4242bf 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexInstantSearchOperationCallbackFactory.java
@@ -19,37 +19,40 @@
 
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
-public class PrimaryIndexInstantSearchOperationCallbackFactory extends AbstractOperationCallbackFactory implements
-        ISearchOperationCallbackFactory {
+public class PrimaryIndexInstantSearchOperationCallbackFactory extends AbstractOperationCallbackFactory
+        implements ISearchOperationCallbackFactory {
 
     private static final long serialVersionUID = 1L;
 
-    public PrimaryIndexInstantSearchOperationCallbackFactory(JobId jobId, int datasetId, int[] entityIdFields,
+    public PrimaryIndexInstantSearchOperationCallbackFactory(int datasetId, int[] entityIdFields,
             ITransactionSubsystemProvider txnSubsystemProvider, byte resourceType) {
-        super(jobId, datasetId, entityIdFields, txnSubsystemProvider, resourceType);
+        super(datasetId, entityIdFields, txnSubsystemProvider, resourceType);
     }
 
     @Override
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
-            throws HyracksDataException {
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx,
+            IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            return new PrimaryIndexInstantSearchOperationCallback(new DatasetId(datasetId), primaryKeyFields,
-                    txnSubsystem.getLockManager(), txnCtx);
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
+            return new PrimaryIndexInstantSearchOperationCallback(new DatasetId(datasetId), resourceId,
+                    primaryKeyFields, txnSubsystem.getLockManager(), txnCtx);
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
         }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexModificationOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexModificationOperationCallbackFactory.java
index 932c925..10c6b8f 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexModificationOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexModificationOperationCallbackFactory.java
@@ -19,19 +19,19 @@
 
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.common.IIndex;
@@ -48,9 +48,9 @@
     private static final long serialVersionUID = 1L;
     private final Operation indexOp;
 
-    public PrimaryIndexModificationOperationCallbackFactory(JobId jobId, int datasetId, int[] primaryKeyFields,
+    public PrimaryIndexModificationOperationCallbackFactory(int datasetId, int[] primaryKeyFields,
             ITransactionSubsystemProvider txnSubsystemProvider, Operation indexOp, byte resourceType) {
-        super(jobId, datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
+        super(datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
         this.indexOp = indexOp;
     }
 
@@ -59,19 +59,21 @@
             IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         IResourceLifecycleManager<IIndex> indexLifeCycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
+                txnSubsystem.getApplicationContext().getDatasetLifecycleManager();
         ILSMIndex index = (ILSMIndex) indexLifeCycleManager.get(resource.getPath());
         if (index == null) {
             throw new HyracksDataException("Index(id:" + resource.getId() + ") is not registered.");
         }
 
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
             DatasetLocalResource aResource = (DatasetLocalResource) resource.getResource();
             IModificationOperationCallback modCallback = new PrimaryIndexModificationOperationCallback(
                     new DatasetId(datasetId), primaryKeyFields, txnCtx, txnSubsystem.getLockManager(), txnSubsystem,
                     resource.getId(), aResource.getPartition(), resourceType, indexOp, operatorNodePushable);
-            txnCtx.registerIndexAndCallback(resource.getId(), index, (AbstractOperationCallback) modCallback, true);
+            txnCtx.register(resource.getId(), aResource.getPartition(), index, modCallback, true);
             return modCallback;
         } catch (ACIDException e) {
             throw HyracksDataException.create(e);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexOperationTrackerFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexOperationTrackerFactory.java
index f40140a..eef1cb0 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexOperationTrackerFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexOperationTrackerFactory.java
@@ -21,9 +21,12 @@
 
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.api.INcApplicationContext;
+import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
+import org.apache.hyracks.storage.common.IResource;
 
 public class PrimaryIndexOperationTrackerFactory implements ILSMOperationTrackerFactory {
 
@@ -36,10 +39,12 @@
     }
 
     @Override
-    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx) {
+    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource)
+            throws HyracksDataException {
         IDatasetLifecycleManager dslcManager =
                 ((INcApplicationContext) ctx.getApplicationContext()).getDatasetLifecycleManager();
-        return dslcManager.getOperationTracker(datasetId);
+        int partition = StoragePathUtil.getPartitionNumFromRelativePath(resource.getPath());
+        return dslcManager.getOperationTracker(datasetId, partition);
     }
 
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
index a9075d0..961f799 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallback.java
@@ -34,9 +34,9 @@
  */
 public class PrimaryIndexSearchOperationCallback extends AbstractOperationCallback implements ISearchOperationCallback {
 
-    public PrimaryIndexSearchOperationCallback(DatasetId datasetId, int[] entityIdFields, ILockManager lockManager,
-            ITransactionContext txnCtx) {
-        super(datasetId, entityIdFields, txnCtx, lockManager);
+    public PrimaryIndexSearchOperationCallback(DatasetId datasetId, long resourceId, int[] entityIdFields,
+            ILockManager lockManager, ITransactionContext txnCtx) {
+        super(datasetId, resourceId, entityIdFields, txnCtx, lockManager);
     }
 
     @Override
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallbackFactory.java
index 8bdbb9e..72e48bf 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/PrimaryIndexSearchOperationCallbackFactory.java
@@ -19,16 +19,17 @@
 
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
@@ -37,9 +38,9 @@
 
     private static final long serialVersionUID = 1L;
 
-    public PrimaryIndexSearchOperationCallbackFactory(JobId jobId, int datasetId, int[] entityIdFields,
+    public PrimaryIndexSearchOperationCallbackFactory(int datasetId, int[] entityIdFields,
             ITransactionSubsystemProvider txnSubsystemProvider, byte resourceType) {
-        super(jobId, datasetId, entityIdFields, txnSubsystemProvider, resourceType);
+        super(datasetId, entityIdFields, txnSubsystemProvider, resourceType);
     }
 
     @Override
@@ -47,8 +48,10 @@
             IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            return new PrimaryIndexSearchOperationCallback(new DatasetId(datasetId), primaryKeyFields,
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
+            return new PrimaryIndexSearchOperationCallback(new DatasetId(datasetId), resourceId, primaryKeyFields,
                     txnSubsystem.getLockManager(), txnCtx);
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexModificationOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexModificationOperationCallbackFactory.java
index b339d27..a927da0 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexModificationOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexModificationOperationCallbackFactory.java
@@ -19,19 +19,19 @@
 
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -44,9 +44,9 @@
     private static final long serialVersionUID = 1L;
     private final Operation indexOp;
 
-    public SecondaryIndexModificationOperationCallbackFactory(JobId jobId, int datasetId, int[] primaryKeyFields,
+    public SecondaryIndexModificationOperationCallbackFactory(int datasetId, int[] primaryKeyFields,
             ITransactionSubsystemProvider txnSubsystemProvider, Operation indexOp, byte resourceType) {
-        super(jobId, datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
+        super(datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
         this.indexOp = indexOp;
     }
 
@@ -55,19 +55,21 @@
             IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         IResourceLifecycleManager indexLifeCycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
+                txnSubsystem.getApplicationContext().getDatasetLifecycleManager();
         ILSMIndex index = (ILSMIndex) indexLifeCycleManager.get(resource.getPath());
         if (index == null) {
             throw new HyracksDataException("Index(id:" + resource.getId() + ") is not registered.");
         }
 
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
             DatasetLocalResource aResource = (DatasetLocalResource) resource.getResource();
             IModificationOperationCallback modCallback = new SecondaryIndexModificationOperationCallback(
                     new DatasetId(datasetId), primaryKeyFields, txnCtx, txnSubsystem.getLockManager(), txnSubsystem,
                     resource.getId(), aResource.getPartition(), resourceType, indexOp);
-            txnCtx.registerIndexAndCallback(resource.getId(), index, (AbstractOperationCallback) modCallback, false);
+            txnCtx.register(resource.getId(), aResource.getPartition(), index, modCallback, false);
             return modCallback;
         } catch (ACIDException e) {
             throw HyracksDataException.create(e);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexOperationTrackerFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexOperationTrackerFactory.java
index febcac2..7586980 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexOperationTrackerFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexOperationTrackerFactory.java
@@ -18,12 +18,13 @@
  */
 package org.apache.asterix.transaction.management.opcallbacks;
 
-import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
+import org.apache.asterix.common.api.INcApplicationContext;
 import org.apache.asterix.common.context.BaseOperationTracker;
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
+import org.apache.hyracks.storage.common.IResource;
 
 public class SecondaryIndexOperationTrackerFactory implements ILSMOperationTrackerFactory {
 
@@ -36,7 +37,7 @@
     }
 
     @Override
-    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx) {
+    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource) {
         IDatasetLifecycleManager dslcManager =
                 ((INcApplicationContext) ctx.getApplicationContext()).getDatasetLifecycleManager();
         return new BaseOperationTracker(datasetID, dslcManager.getDatasetInfo(datasetID));
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
index 108a77e..1b87376 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallback.java
@@ -31,8 +31,8 @@
 public class SecondaryIndexSearchOperationCallback extends AbstractOperationCallback
         implements ISearchOperationCallback {
 
-    public SecondaryIndexSearchOperationCallback() {
-        super(DatasetId.NULL, null, null, null);
+    public SecondaryIndexSearchOperationCallback(long resourceId) {
+        super(DatasetId.NULL, resourceId, null, null, null);
     }
 
     @Override
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallbackFactory.java
index 0b96164..d9088e1 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/SecondaryIndexSearchOperationCallbackFactory.java
@@ -30,8 +30,8 @@
     private static final long serialVersionUID = 1L;
 
     @Override
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
-            throws HyracksDataException {
-        return new SecondaryIndexSearchOperationCallback();
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx,
+            IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
+        return new SecondaryIndexSearchOperationCallback(resourceId);
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetIndexModificationOperationCallback.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetIndexModificationOperationCallback.java
deleted file mode 100644
index c609fc6..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetIndexModificationOperationCallback.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.transaction.management.opcallbacks;
-
-import org.apache.asterix.common.transactions.DatasetId;
-import org.apache.asterix.common.transactions.ILockManager;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-
-/**
- * This class is the operation callback for temporary datasets.
- * A temporary dataset does not require any lock and does not generate any write-ahead update and commit log
- * but generates flush log and job commit log.
- * The "before" and "found" method in this callback is empty so that no locking is requested for accessing a temporary
- * dataset and no write-ahead log is written for update operations.
- */
-public class TempDatasetIndexModificationOperationCallback extends AbstractIndexModificationOperationCallback {
-
-    public TempDatasetIndexModificationOperationCallback(DatasetId datasetId, int[] primaryKeyFields,
-            ITransactionContext txnCtx, ILockManager lockManager, ITransactionSubsystem txnSubsystem, long resourceId,
-            int resourcePartition, byte resourceType, Operation indexOp) {
-        super(datasetId, primaryKeyFields, txnCtx, lockManager, txnSubsystem, resourceId, resourcePartition,
-                resourceType, indexOp);
-    }
-
-    @Override
-    public void before(ITupleReference tuple) throws HyracksDataException {
-
-    }
-
-    @Override
-    public void found(ITupleReference before, ITupleReference after) throws HyracksDataException {
-
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetPrimaryIndexModificationOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetPrimaryIndexModificationOperationCallbackFactory.java
deleted file mode 100644
index 7b7eff6..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetPrimaryIndexModificationOperationCallbackFactory.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.transaction.management.opcallbacks;
-
-import org.apache.asterix.common.context.ITransactionSubsystemProvider;
-import org.apache.asterix.common.dataflow.DatasetLocalResource;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
-import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
-import org.apache.asterix.common.transactions.DatasetId;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
-import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
-import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.IResourceLifecycleManager;
-import org.apache.hyracks.storage.common.LocalResource;
-
-public class TempDatasetPrimaryIndexModificationOperationCallbackFactory extends AbstractOperationCallbackFactory
-        implements IModificationOperationCallbackFactory {
-
-    private static final long serialVersionUID = 1L;
-    private final Operation indexOp;
-
-    public TempDatasetPrimaryIndexModificationOperationCallbackFactory(JobId jobId, int datasetId,
-            int[] primaryKeyFields, ITransactionSubsystemProvider txnSubsystemProvider, Operation indexOp,
-            byte resourceType) {
-        super(jobId, datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
-        this.indexOp = indexOp;
-    }
-
-    @Override
-    public IModificationOperationCallback createModificationOperationCallback(LocalResource resource,
-            IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
-        ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
-        IResourceLifecycleManager indexLifeCycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
-        ILSMIndex index = (ILSMIndex) indexLifeCycleManager.get(resource.getPath());
-        if (index == null) {
-            throw new HyracksDataException("Index(id:" + resource.getId() + ") is not registered.");
-        }
-
-        try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            DatasetLocalResource aResource = (DatasetLocalResource) resource.getResource();
-            IModificationOperationCallback modCallback = new TempDatasetIndexModificationOperationCallback(
-                    new DatasetId(datasetId), primaryKeyFields, txnCtx, txnSubsystem.getLockManager(), txnSubsystem,
-                    resource.getId(), aResource.getPartition(), resourceType, indexOp);
-            txnCtx.registerIndexAndCallback(resource.getId(), index, (AbstractOperationCallback) modCallback, true);
-            return modCallback;
-        } catch (ACIDException e) {
-            throw new HyracksDataException(e);
-        }
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetSecondaryIndexModificationOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetSecondaryIndexModificationOperationCallbackFactory.java
deleted file mode 100644
index 1dc1c4e..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/TempDatasetSecondaryIndexModificationOperationCallbackFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.transaction.management.opcallbacks;
-
-import org.apache.asterix.common.context.ITransactionSubsystemProvider;
-import org.apache.asterix.common.dataflow.DatasetLocalResource;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
-import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
-import org.apache.asterix.common.transactions.DatasetId;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
-import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
-import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.common.IIndex;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.IResourceLifecycleManager;
-import org.apache.hyracks.storage.common.LocalResource;
-
-public class TempDatasetSecondaryIndexModificationOperationCallbackFactory extends AbstractOperationCallbackFactory
-        implements IModificationOperationCallbackFactory {
-
-    private static final long serialVersionUID = 1L;
-    private final Operation indexOp;
-
-    public TempDatasetSecondaryIndexModificationOperationCallbackFactory(JobId jobId, int datasetId,
-            int[] primaryKeyFields, ITransactionSubsystemProvider txnSubsystemProvider, Operation indexOp,
-            byte resourceType) {
-        super(jobId, datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
-        this.indexOp = indexOp;
-    }
-
-    @Override
-    public IModificationOperationCallback createModificationOperationCallback(LocalResource resource,
-            IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) throws HyracksDataException {
-        DatasetLocalResource aResource = (DatasetLocalResource) resource.getResource();
-        ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
-        IResourceLifecycleManager<IIndex> indexLifeCycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
-        ILSMIndex index = (ILSMIndex) indexLifeCycleManager.get(resource.getPath());
-        if (index == null) {
-            throw new HyracksDataException("Index(id:" + resource.getId() + ") is not registered.");
-        }
-
-        try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
-            IModificationOperationCallback modCallback = new TempDatasetIndexModificationOperationCallback(
-                    new DatasetId(datasetId), primaryKeyFields, txnCtx, txnSubsystem.getLockManager(), txnSubsystem,
-                    resource.getId(), aResource.getPartition(), resourceType, indexOp);
-            txnCtx.registerIndexAndCallback(resource.getId(), index, (AbstractOperationCallback) modCallback, false);
-            return modCallback;
-        } catch (ACIDException e) {
-            throw new HyracksDataException(e);
-        }
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/UpsertOperationCallbackFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/UpsertOperationCallbackFactory.java
index 15b4344..8f7d445 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/UpsertOperationCallbackFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/opcallbacks/UpsertOperationCallbackFactory.java
@@ -18,19 +18,19 @@
  */
 package org.apache.asterix.transaction.management.opcallbacks;
 
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.asterix.common.context.ITransactionSubsystemProvider;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
 import org.apache.asterix.common.transactions.AbstractOperationCallbackFactory;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.transaction.management.opcallbacks.AbstractIndexModificationOperationCallback.Operation;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -43,9 +43,9 @@
     private static final long serialVersionUID = 1L;
     protected final Operation indexOp;
 
-    public UpsertOperationCallbackFactory(JobId jobId, int datasetId, int[] primaryKeyFields,
+    public UpsertOperationCallbackFactory(int datasetId, int[] primaryKeyFields,
             ITransactionSubsystemProvider txnSubsystemProvider, Operation indexOp, byte resourceType) {
-        super(jobId, datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
+        super(datasetId, primaryKeyFields, txnSubsystemProvider, resourceType);
         this.indexOp = indexOp;
     }
 
@@ -55,18 +55,20 @@
         DatasetLocalResource aResource = (DatasetLocalResource) resource.getResource();
         ITransactionSubsystem txnSubsystem = txnSubsystemProvider.getTransactionSubsystem(ctx);
         IResourceLifecycleManager indexLifeCycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
+                txnSubsystem.getApplicationContext().getDatasetLifecycleManager();
         ILSMIndex index = (ILSMIndex) indexLifeCycleManager.get(resource.getPath());
         if (index == null) {
             throw new HyracksDataException("Index(id:" + resource.getId() + ") is not registered.");
         }
 
         try {
-            ITransactionContext txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(jobId, false);
+            IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+            ITransactionContext txnCtx = txnSubsystem.getTransactionManager()
+                    .getTransactionContext(((IJobEventListenerFactory) fact).getTxnId(datasetId));
             IModificationOperationCallback modCallback = new UpsertOperationCallback(new DatasetId(datasetId),
                     primaryKeyFields, txnCtx, txnSubsystem.getLockManager(), txnSubsystem, resource.getId(),
                     aResource.getPartition(), resourceType, indexOp);
-            txnCtx.registerIndexAndCallback(resource.getId(), index, (AbstractOperationCallback) modCallback, true);
+            txnCtx.register(resource.getId(), aResource.getPartition(), index, modCallback, true);
             return modCallback;
         } catch (ACIDException e) {
             throw new HyracksDataException(e);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/DatasetLocalResourceFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/DatasetLocalResourceFactory.java
index 8724128..9ce5843 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/DatasetLocalResourceFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/DatasetLocalResourceFactory.java
@@ -37,9 +37,8 @@
 
     @Override
     public IResource createResource(FileReference fileRef) {
-        IResource resource = resourceFactory.createResource(fileRef);
-        // Currently, we get the partition number from the relative path
         int partition = StoragePathUtil.getPartitionNumFromRelativePath(fileRef.getRelativePath());
+        IResource resource = resourceFactory.createResource(fileRef);
         return new DatasetLocalResource(datasetId, partition, resource);
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
index 5666b48..ca22a84 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java
@@ -18,7 +18,10 @@
  */
 package org.apache.asterix.transaction.management.resource;
 
+import static org.apache.asterix.common.utils.StorageConstants.INDEX_CHECKPOINT_FILE_PREFIX;
 import static org.apache.hyracks.api.exceptions.ErrorCode.CANNOT_CREATE_FILE;
+import static org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager.COMPONENT_FILES_FILTER;
+import static org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager.COMPONENT_TIMESTAMP_FORMAT;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,30 +30,37 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.util.Collections;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.Format;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import java.util.SortedMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.MetadataProperties;
 import org.apache.asterix.common.dataflow.DatasetLocalResource;
 import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.replication.IReplicationManager;
 import org.apache.asterix.common.replication.ReplicationJob;
-import org.apache.asterix.common.storage.IndexFileProperties;
+import org.apache.asterix.common.storage.DatasetResourceReference;
+import org.apache.asterix.common.storage.IIndexCheckpointManager;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
+import org.apache.asterix.common.storage.ResourceReference;
 import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.asterix.common.utils.StoragePathUtil;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.filefilter.IOFileFilter;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IIOManager;
@@ -60,65 +70,72 @@
 import org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation;
 import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrame;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexFileManager;
 import org.apache.hyracks.storage.common.ILocalResourceRepository;
 import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 
 public class PersistentLocalResourceRepository implements ILocalResourceRepository {
 
-    // Public constants
-    public static final String METADATA_FILE_NAME = ".metadata";
-    // Private constants
-    private static final Logger LOGGER = Logger.getLogger(PersistentLocalResourceRepository.class.getName());
-    private static final String STORAGE_METADATA_DIRECTORY = StorageConstants.METADATA_ROOT;
-    private static final String STORAGE_METADATA_FILE_NAME_PREFIX = "." + StorageConstants.METADATA_ROOT;
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final FilenameFilter LSM_INDEX_FILES_FILTER =
+            (dir, name) -> !name.startsWith(INDEX_CHECKPOINT_FILE_PREFIX);
+    private static final FilenameFilter MASK_FILES_FILTER =
+            (dir, name) -> name.startsWith(StorageConstants.MASK_FILE_PREFIX);
     private static final int MAX_CACHED_RESOURCES = 1000;
-    private static final FilenameFilter METADATA_FILES_FILTER =
-            (File dir, String name) -> name.equalsIgnoreCase(METADATA_FILE_NAME);
+    private static final IOFileFilter METADATA_FILES_FILTER = new IOFileFilter() {
+        @Override
+        public boolean accept(File file) {
+            return file.getName().equals(StorageConstants.METADATA_FILE_NAME);
+        }
+
+        @Override
+        public boolean accept(File dir, String name) {
+            return false;
+        }
+    };
+
+    private static final IOFileFilter ALL_DIR_FILTER = new IOFileFilter() {
+        @Override
+        public boolean accept(File file) {
+            return true;
+        }
+
+        @Override
+        public boolean accept(File dir, String name) {
+            return true;
+        }
+    };
+
+    private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL_FORMATTER =
+            ThreadLocal.withInitial(() -> new SimpleDateFormat(COMPONENT_TIMESTAMP_FORMAT));
+
     // Finals
     private final IIOManager ioManager;
-    private final String[] mountPoints;
-    private final String nodeId;
     private final Cache<String, LocalResource> resourceCache;
-    private final SortedMap<Integer, ClusterPartition> clusterPartitions;
-    private final Set<Integer> nodeOriginalPartitions;
-    private final Set<Integer> nodeActivePartitions;
     // Mutables
     private boolean isReplicationEnabled = false;
     private Set<String> filesToBeReplicated;
     private IReplicationManager replicationManager;
-    private Set<Integer> nodeInactivePartitions;
+    private final Path[] storageRoots;
+    private final IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
 
-    public PersistentLocalResourceRepository(IIOManager ioManager, List<IODeviceHandle> devices, String nodeId,
-            MetadataProperties metadataProperties) throws HyracksDataException {
+    public PersistentLocalResourceRepository(IIOManager ioManager,
+            IIndexCheckpointManagerProvider indexCheckpointManagerProvider) {
         this.ioManager = ioManager;
-        mountPoints = new String[devices.size()];
-        this.nodeId = nodeId;
-        this.clusterPartitions = metadataProperties.getClusterPartitions();
-        for (int i = 0; i < mountPoints.length; i++) {
-            String mountPoint = devices.get(i).getMount().getPath();
-            File mountPointDir = new File(mountPoint);
-            if (!mountPointDir.exists()) {
-                throw new HyracksDataException(mountPointDir.getAbsolutePath() + " doesn't exist.");
-            }
-            if (!mountPoint.endsWith(File.separator)) {
-                mountPoints[i] = mountPoint + File.separator;
-            } else {
-                mountPoints[i] = mountPoint;
-            }
+        this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
+        storageRoots = new Path[ioManager.getIODevices().size()];
+        final List<IODeviceHandle> ioDevices = ioManager.getIODevices();
+        for (int i = 0; i < ioDevices.size(); i++) {
+            storageRoots[i] =
+                    Paths.get(ioDevices.get(i).getMount().getAbsolutePath(), StorageConstants.STORAGE_ROOT_DIR_NAME);
         }
+        createStorageRoots();
         resourceCache = CacheBuilder.newBuilder().maximumSize(MAX_CACHED_RESOURCES).build();
-
-        ClusterPartition[] nodePartitions = metadataProperties.getNodePartitions().get(nodeId);
-        //initially the node active partitions are the same as the original partitions
-        nodeOriginalPartitions = new HashSet<>(nodePartitions.length);
-        nodeActivePartitions = new HashSet<>(nodePartitions.length);
-        for (ClusterPartition partition : nodePartitions) {
-            nodeOriginalPartitions.add(partition.getPartitionId());
-            nodeActivePartitions.add(partition.getPartitionId());
-        }
     }
 
     @Override
@@ -132,48 +149,8 @@
         return aString.toString();
     }
 
-    public void initializeNewUniverse(String storageRoot) throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Initializing local resource repository ... ");
-        }
-        /*
-         * create storage metadata file
-         * (This file is used to locate the root storage directory after instance restarts).
-         * TODO with the existing cluster configuration file being static and distributed on all NCs
-         * we can find out the storage root directory without looking at this file.
-         * This file could potentially store more information, otherwise no need to keep it.
-         */
-        String storageRootDirName = storageRoot;
-        while (storageRootDirName.startsWith(File.separator)) {
-            storageRootDirName = storageRootDirName.substring(File.separator.length());
-        }
-        for (int i = 0; i < mountPoints.length; i++) {
-            FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, i);
-            File storageMetadataDir = storageMetadataFile.getFile().getParentFile();
-            if (storageMetadataDir.exists()) {
-                throw HyracksDataException.create(ErrorCode.ROOT_LOCAL_RESOURCE_EXISTS, getClass().getSimpleName(),
-                        storageMetadataDir.getAbsolutePath());
-            }
-            //make dirs for the storage metadata file
-            boolean success = storageMetadataDir.mkdirs();
-            if (!success) {
-                throw HyracksDataException.create(ErrorCode.ROOT_LOCAL_RESOURCE_COULD_NOT_BE_CREATED,
-                        getClass().getSimpleName(), storageMetadataDir.getAbsolutePath());
-            }
-            LOGGER.log(Level.INFO,
-                    "created the root-metadata-file's directory: " + storageMetadataDir.getAbsolutePath());
-            try (FileOutputStream fos = new FileOutputStream(storageMetadataFile.getFile())) {
-                fos.write(storageRootDirName.getBytes(StandardCharsets.UTF_8));
-            } catch (IOException e) {
-                throw HyracksDataException.create(e);
-            }
-            LOGGER.log(Level.INFO, "created the root-metadata-file: " + storageMetadataFile.getAbsolutePath());
-        }
-        LOGGER.log(Level.INFO, "Completed the initialization of the local resource repository");
-    }
-
     @Override
-    public LocalResource get(String relativePath) throws HyracksDataException {
+    public synchronized LocalResource get(String relativePath) throws HyracksDataException {
         LocalResource resource = resourceCache.getIfPresent(relativePath);
         if (resource == null) {
             FileReference resourceFile = getLocalResourceFileByName(ioManager, relativePath);
@@ -203,11 +180,11 @@
             oosToFos.writeObject(resource);
             oosToFos.flush();
         } catch (IOException e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
 
         resourceCache.put(resource.getPath(), resource);
-
+        indexCheckpointManagerProvider.get(DatasetResourceReference.of(resource)).init(0);
         //if replication enabled, send resource metadata info to remote nodes
         if (isReplicationEnabled) {
             createReplicationJob(ReplicationOperation.REPLICATE, resourceFile);
@@ -218,19 +195,16 @@
     public synchronized void delete(String relativePath) throws HyracksDataException {
         FileReference resourceFile = getLocalResourceFileByName(ioManager, relativePath);
         if (resourceFile.getFile().exists()) {
-            try {
-                // Invalidate before deleting the file just in case file deletion throws some exception.
-                // Since it's just a cache invalidation, it should not affect correctness.
-                resourceCache.invalidate(relativePath);
-                IoUtil.delete(resourceFile);
-            } finally {
-                // Regardless of successfully deleted or not, the operation should be replicated.
-                //if replication enabled, delete resource from remote replicas
-                if (isReplicationEnabled
-                        && !resourceFile.getFile().getName().startsWith(STORAGE_METADATA_FILE_NAME_PREFIX)) {
-                    createReplicationJob(ReplicationOperation.DELETE, resourceFile);
-                }
+            if (isReplicationEnabled) {
+                createReplicationJob(ReplicationOperation.DELETE, resourceFile);
             }
+            // delete all checkpoints
+            final LocalResource localResource = readLocalResource(resourceFile.getFile());
+            indexCheckpointManagerProvider.get(DatasetResourceReference.of(localResource)).delete();
+            // Invalidate before deleting the file just in case file deletion throws some exception.
+            // Since it's just a cache invalidation, it should not affect correctness.
+            resourceCache.invalidate(relativePath);
+            IoUtil.delete(resourceFile);
         } else {
             throw HyracksDataException.create(org.apache.hyracks.api.exceptions.ErrorCode.RESOURCE_DOES_NOT_EXIST,
                     relativePath);
@@ -239,119 +213,43 @@
 
     private static FileReference getLocalResourceFileByName(IIOManager ioManager, String resourcePath)
             throws HyracksDataException {
-        String fileName = resourcePath + File.separator + METADATA_FILE_NAME;
+        String fileName = resourcePath + File.separator + StorageConstants.METADATA_FILE_NAME;
         return ioManager.resolve(fileName);
     }
 
-    public Map<Long, LocalResource> loadAndGetAllResources() throws IOException {
-        //TODO During recovery, the memory usage currently is proportional to the number of resources available.
-        //This could be fixed by traversing all resources on disk until the required resource is found.
-        LOGGER.log(Level.INFO, "Loading all resources");
+    public synchronized Map<Long, LocalResource> getResources(Predicate<LocalResource> filter)
+            throws HyracksDataException {
         Map<Long, LocalResource> resourcesMap = new HashMap<>();
-        for (int i = 0; i < mountPoints.length; i++) {
-            File storageRootDir = getStorageRootDirectoryIfExists(ioManager, nodeId, i);
-            if (storageRootDir == null) {
-                LOGGER.log(Level.INFO, "Getting storage root dir returned null. Returning");
-                continue;
-            }
-            LOGGER.log(Level.INFO, "Getting storage root dir returned " + storageRootDir.getAbsolutePath());
-            //load all local resources.
-            File[] partitions = storageRootDir.listFiles();
-            LOGGER.log(Level.INFO, "Number of partitions found = " + partitions.length);
-            for (File partition : partitions) {
-                File[] dataverseFileList = partition.listFiles();
-                LOGGER.log(Level.INFO, "Reading partition = " + partition.getName() + ". Number of dataverses found: "
-                        + dataverseFileList.length);
-                if (dataverseFileList != null) {
-                    for (File dataverseFile : dataverseFileList) {
-                        loadDataverse(dataverseFile, resourcesMap);
+        for (Path root : storageRoots) {
+            final Collection<File> files = FileUtils.listFiles(root.toFile(), METADATA_FILES_FILTER, ALL_DIR_FILTER);
+            try {
+                for (File file : files) {
+                    final LocalResource localResource = PersistentLocalResourceRepository.readLocalResource(file);
+                    if (filter.test(localResource)) {
+                        resourcesMap.put(localResource.getId(), localResource);
                     }
                 }
+            } catch (IOException e) {
+                throw HyracksDataException.create(e);
             }
         }
         return resourcesMap;
     }
 
-    private void loadDataverse(File dataverseFile, Map<Long, LocalResource> resourcesMap) throws HyracksDataException {
-        LOGGER.log(Level.INFO, "Loading dataverse:" + dataverseFile.getName());
-        if (dataverseFile.isDirectory()) {
-            File[] indexFileList = dataverseFile.listFiles();
-            if (indexFileList != null) {
-                for (File indexFile : indexFileList) {
-                    loadIndex(indexFile, resourcesMap);
-                }
-            }
-        }
-    }
-
-    private void loadIndex(File indexFile, Map<Long, LocalResource> resourcesMap) throws HyracksDataException {
-        LOGGER.log(Level.INFO, "Loading index:" + indexFile.getName());
-        if (indexFile.isDirectory()) {
-            File[] metadataFiles = indexFile.listFiles(METADATA_FILES_FILTER);
-            if (metadataFiles != null) {
-                for (File metadataFile : metadataFiles) {
-                    LocalResource localResource = readLocalResource(metadataFile);
-                    LOGGER.log(Level.INFO, "Resource loaded " + localResource.getId() + ":" + localResource.getPath());
-                    resourcesMap.put(localResource.getId(), localResource);
-                }
-            }
-        }
+    public Map<Long, LocalResource> loadAndGetAllResources() throws HyracksDataException {
+        return getResources(p -> true);
     }
 
     @Override
     public long maxId() throws HyracksDataException {
-        long maxResourceId = 0;
-        for (int i = 0; i < mountPoints.length; i++) {
-            File storageRootDir = getStorageRootDirectoryIfExists(ioManager, nodeId, i);
-            if (storageRootDir == null) {
-                continue;
-            }
-
-            //load all local resources.
-            File[] partitions = storageRootDir.listFiles();
-            for (File partition : partitions) {
-                //traverse all local resources.
-                File[] dataverseFileList = partition.listFiles();
-                if (dataverseFileList != null) {
-                    for (File dataverseFile : dataverseFileList) {
-                        maxResourceId = getMaxResourceIdForDataverse(dataverseFile, maxResourceId);
-                    }
-                }
-            }
-        }
-        return maxResourceId;
-    }
-
-    private long getMaxResourceIdForDataverse(File dataverseFile, long maxSoFar) throws HyracksDataException {
-        long maxResourceId = maxSoFar;
-        if (dataverseFile.isDirectory()) {
-            File[] indexFileList = dataverseFile.listFiles();
-            if (indexFileList != null) {
-                for (File indexFile : indexFileList) {
-                    maxResourceId = getMaxResourceIdForIndex(indexFile, maxResourceId);
-                }
-            }
-        }
-        return maxResourceId;
-    }
-
-    private long getMaxResourceIdForIndex(File indexFile, long maxSoFar) throws HyracksDataException {
-        long maxResourceId = maxSoFar;
-        if (indexFile.isDirectory()) {
-            File[] metadataFiles = indexFile.listFiles(METADATA_FILES_FILTER);
-            if (metadataFiles != null) {
-                for (File metadataFile : metadataFiles) {
-                    LocalResource localResource = readLocalResource(metadataFile);
-                    maxResourceId = Math.max(maxResourceId, localResource.getId());
-                }
-            }
-        }
-        return maxResourceId;
+        final Map<Long, LocalResource> allResources = loadAndGetAllResources();
+        final Optional<Long> max = allResources.keySet().stream().max(Long::compare);
+        return max.isPresent() ? max.get() : 0;
     }
 
     private static String getFileName(String path) {
-        return path.endsWith(File.separator) ? (path + METADATA_FILE_NAME)
-                : (path + File.separator + METADATA_FILE_NAME);
+        return path.endsWith(File.separator) ? (path + StorageConstants.METADATA_FILE_NAME)
+                : (path + File.separator + StorageConstants.METADATA_FILE_NAME);
     }
 
     public static LocalResource readLocalResource(File file) throws HyracksDataException {
@@ -364,7 +262,7 @@
                 throw new AsterixException("Storage version mismatch.");
             }
         } catch (Exception e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 
@@ -374,161 +272,196 @@
 
         if (isReplicationEnabled) {
             filesToBeReplicated = new HashSet<>();
-            nodeInactivePartitions = ConcurrentHashMap.newKeySet();
         }
     }
 
     private void createReplicationJob(ReplicationOperation operation, FileReference fileRef)
             throws HyracksDataException {
-        /**
-         * Durable resources path format:
-         * /partition/dataverse/idx/fileName
-         * Temporary resources path format:
-         * /partition/TEMP_DATASETS_STORAGE_FOLDER/dataverse/idx/fileName
-         */
-        String[] fileNameTokens = fileRef.getAbsolutePath().split(File.separator);
-        String partitionDir = fileNameTokens[fileNameTokens.length - 4];
-        //exclude temporary datasets resources
-        if (!partitionDir.equals(StoragePathUtil.TEMP_DATASETS_STORAGE_FOLDER)) {
-            filesToBeReplicated.clear();
-            filesToBeReplicated.add(fileRef.getAbsolutePath());
-            ReplicationJob job = new ReplicationJob(ReplicationJobType.METADATA, operation,
-                    ReplicationExecutionType.SYNC, filesToBeReplicated);
-            try {
-                replicationManager.submitJob(job);
-            } catch (IOException e) {
-                throw new HyracksDataException(e);
-            }
+        filesToBeReplicated.clear();
+        filesToBeReplicated.add(fileRef.getAbsolutePath());
+        ReplicationJob job = new ReplicationJob(ReplicationJobType.METADATA, operation, ReplicationExecutionType.SYNC,
+                filesToBeReplicated);
+        try {
+            replicationManager.submitJob(job);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
         }
     }
 
-    public String[] getStorageMountingPoints() {
-        return mountPoints;
-    }
-
     /**
      * Deletes physical files of all data verses.
      *
-     * @param deleteStorageMetadata
      * @throws IOException
      */
-    public void deleteStorageData(boolean deleteStorageMetadata) throws IOException {
-        for (int i = 0; i < mountPoints.length; i++) {
-            File storageDir = getStorageRootDirectoryIfExists(ioManager, nodeId, i);
-            if (storageDir != null && storageDir.isDirectory()) {
-                FileUtils.deleteDirectory(storageDir);
-            }
-            if (deleteStorageMetadata) {
-                //delete the metadata root directory
-                FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, i);
-                File storageMetadataDir = storageMetadataFile.getFile().getParentFile().getParentFile();
-                if (storageMetadataDir.exists() && storageMetadataDir.isDirectory()) {
-                    FileUtils.deleteDirectory(storageMetadataDir);
-                }
+    public void deleteStorageData() throws IOException {
+        for (Path root : storageRoots) {
+            final File rootFile = root.toFile();
+            if (rootFile.exists()) {
+                FileUtils.deleteDirectory(rootFile);
             }
         }
+        createStorageRoots();
+    }
+
+    public Set<Integer> getAllPartitions() throws HyracksDataException {
+        return loadAndGetAllResources().values().stream().map(LocalResource::getResource)
+                .map(DatasetLocalResource.class::cast).map(DatasetLocalResource::getPartition)
+                .collect(Collectors.toSet());
+    }
+
+    public DatasetResourceReference getLocalResourceReference(String absoluteFilePath) throws HyracksDataException {
+        final String localResourcePath = StoragePathUtil.getIndexFileRelativePath(absoluteFilePath);
+        final LocalResource lr = get(localResourcePath);
+        return DatasetResourceReference.of(lr);
     }
 
     /**
-     * @param mountPoint
-     * @param nodeId
-     * @param ioDeviceId
-     * @return A file reference to the storage metadata file.
-     */
-    private static FileReference getStorageMetadataFile(IIOManager ioManager, String nodeId, int ioDeviceId) {
-        String storageMetadataFileName = STORAGE_METADATA_DIRECTORY + File.separator + nodeId + "_" + "iodevice"
-                + ioDeviceId + File.separator + STORAGE_METADATA_FILE_NAME_PREFIX;
-        return new FileReference(ioManager.getIODevices().get(ioDeviceId), storageMetadataFileName);
-    }
-
-    /**
-     * @param mountPoint
-     * @param nodeId
-     * @param ioDeviceId
-     * @return A file reference to the storage root directory if exists, otherwise null.
+     * Gets a set of files for the indexes in partition {@code partition}. Each file points
+     * to where the index's files are stored.
+     *
+     * @param partition
+     * @return The set of indexes files
      * @throws HyracksDataException
      */
-    public static File getStorageRootDirectoryIfExists(IIOManager ioManager, String nodeId, int ioDeviceId)
-            throws HyracksDataException {
-        try {
-            FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, ioDeviceId);
-            LOGGER.log(Level.INFO, "Storage metadata file is " + storageMetadataFile.getAbsolutePath());
-            if (storageMetadataFile.getFile().exists()) {
-                String storageRootDirPath =
-                        new String(Files.readAllBytes(storageMetadataFile.getFile().toPath()), StandardCharsets.UTF_8);
-                LOGGER.log(Level.INFO, "Storage metadata file found and root dir is " + storageRootDirPath);
-                FileReference storageRootFileRef =
-                        new FileReference(ioManager.getIODevices().get(ioDeviceId), storageRootDirPath);
-                if (storageRootFileRef.getFile().exists()) {
-                    return storageRootFileRef.getFile();
-                } else {
-                    LOGGER.log(Level.INFO, "Storage root doesn't exist");
+    public Set<File> getPartitionIndexes(int partition) throws HyracksDataException {
+        final Map<Long, LocalResource> partitionResourcesMap = getResources(resource -> {
+            DatasetLocalResource dsResource = (DatasetLocalResource) resource.getResource();
+            return dsResource.getPartition() == partition;
+        });
+        Set<File> indexes = new HashSet<>();
+        for (LocalResource localResource : partitionResourcesMap.values()) {
+            indexes.add(ioManager.resolve(localResource.getPath()).getFile());
+        }
+        return indexes;
+    }
+
+    public Map<Long, LocalResource> getPartitionResources(int partition) throws HyracksDataException {
+        return getResources(resource -> {
+            DatasetLocalResource dsResource = (DatasetLocalResource) resource.getResource();
+            return dsResource.getPartition() == partition;
+        });
+    }
+
+    public List<String> getPartitionIndexesFiles(int partition) throws HyracksDataException {
+        List<String> partitionFiles = new ArrayList<>();
+        Set<File> partitionIndexes = getPartitionIndexes(partition);
+        for (File indexDir : partitionIndexes) {
+            if (indexDir.isDirectory()) {
+                File[] indexFiles = indexDir.listFiles(LSM_INDEX_FILES_FILTER);
+                if (indexFiles != null) {
+                    Stream.of(indexFiles).map(File::getAbsolutePath).forEach(partitionFiles::add);
                 }
-            } else {
-                LOGGER.log(Level.INFO, "Storage metadata file doesn't exist");
             }
-            return null;
-        } catch (IOException ioe) {
-            throw HyracksDataException.create(ioe);
+        }
+        return partitionFiles;
+    }
+
+    private void createStorageRoots() {
+        for (Path root : storageRoots) {
+            try {
+                Files.createDirectories(root);
+            } catch (IOException e) {
+                throw new IllegalStateException("Failed to create storage root directory at " + root, e);
+            }
+        }
+    }
+
+    public void cleanup(int partition) throws HyracksDataException {
+        final Set<File> partitionIndexes = getPartitionIndexes(partition);
+        try {
+            for (File index : partitionIndexes) {
+                deleteIndexMaskedFiles(index);
+                if (isValidIndex(index)) {
+                    deleteIndexInvalidComponents(index);
+                }
+            }
+        } catch (IOException | ParseException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    private void deleteIndexMaskedFiles(File index) throws IOException {
+        File[] masks = index.listFiles(MASK_FILES_FILTER);
+        if (masks != null) {
+            for (File mask : masks) {
+                deleteIndexMaskedFiles(index, mask);
+                // delete the mask itself
+                Files.delete(mask.toPath());
+            }
+        }
+    }
+
+    private boolean isValidIndex(File index) throws IOException {
+        // any index without any checkpoint files is invalid
+        // this can happen if a crash happens when the index metadata file is created
+        // but before the initial checkpoint is persisted. The index metadata file will
+        // be deleted and recreated when the index is created again
+        return getIndexCheckpointManager(index).getCheckpointCount() != 0;
+    }
+
+    private void deleteIndexInvalidComponents(File index) throws IOException, ParseException {
+        final Optional<String> validComponentTimestamp = getIndexCheckpointManager(index).getValidComponentTimestamp();
+        if (!validComponentTimestamp.isPresent()) {
+            // index doesn't have any components
+            return;
+        }
+        final Format formatter = THREAD_LOCAL_FORMATTER.get();
+        final Date validTimestamp = (Date) formatter.parseObject(validComponentTimestamp.get());
+        final File[] indexComponentFiles = index.listFiles(COMPONENT_FILES_FILTER);
+        if (indexComponentFiles != null) {
+            for (File componentFile : indexComponentFiles) {
+                // delete any file with startTime > validTimestamp
+                final String fileStartTimeStr =
+                        AbstractLSMIndexFileManager.getComponentStartTime(componentFile.getName());
+                final Date fileStartTime = (Date) formatter.parseObject(fileStartTimeStr);
+                if (fileStartTime.after(validTimestamp)) {
+                    LOGGER.info(() -> "Deleting invalid component file: " + componentFile.getAbsolutePath());
+                    Files.delete(componentFile.toPath());
+                }
+            }
+        }
+    }
+
+    private IIndexCheckpointManager getIndexCheckpointManager(File index) throws HyracksDataException {
+        final String indexFile = Paths.get(index.getAbsolutePath(), StorageConstants.METADATA_FILE_NAME).toString();
+        final ResourceReference indexRef = ResourceReference.of(indexFile);
+        return indexCheckpointManagerProvider.get(indexRef);
+    }
+
+    private void deleteIndexMaskedFiles(File index, File mask) throws IOException {
+        if (!mask.getName().startsWith(StorageConstants.MASK_FILE_PREFIX)) {
+            throw new IllegalArgumentException("Unrecognized mask file: " + mask);
+        }
+        File[] maskedFiles;
+        if (isComponentMask(mask)) {
+            final String componentId = mask.getName().substring(StorageConstants.COMPONENT_MASK_FILE_PREFIX.length());
+            maskedFiles = index.listFiles((dir, name) -> name.startsWith(componentId));
+        } else {
+            final String maskedFileName = mask.getName().substring(StorageConstants.MASK_FILE_PREFIX.length());
+            maskedFiles = index.listFiles((dir, name) -> name.equals(maskedFileName));
+        }
+        if (maskedFiles != null) {
+            for (File maskedFile : maskedFiles) {
+                LOGGER.info(() -> "deleting masked file: " + maskedFile.getAbsolutePath());
+                Files.delete(maskedFile.toPath());
+            }
         }
     }
 
     /**
-     * @param partition
-     * @return The partition local path on this NC.
+     * Gets a component id based on its unique timestamp.
+     * e.g. a component file 2018-01-08-01-08-50-439_2018-01-08-01-08-50-439_b
+     * will return a component id 2018-01-08-01-08-50-439_2018-01-08-01-08-50-439
+     *
+     * @param componentFile any component file
+     * @return The component id
      */
-    public String getPartitionPath(int partition) {
-        //currently each partition is replicated on the same IO device number on all NCs.
-        return mountPoints[getIODeviceNum(partition)];
+    public static String getComponentId(String componentFile) {
+        final ResourceReference ref = ResourceReference.of(componentFile);
+        return ref.getName().substring(0, ref.getName().lastIndexOf(AbstractLSMIndexFileManager.DELIMITER));
     }
 
-    public int getIODeviceNum(int partition) {
-        return clusterPartitions.get(partition).getIODeviceNum();
-    }
-
-    public Set<Integer> getActivePartitions() {
-        return Collections.unmodifiableSet(nodeActivePartitions);
-    }
-
-    public Set<Integer> getInactivePartitions() {
-        return Collections.unmodifiableSet(nodeInactivePartitions);
-    }
-
-    public Set<Integer> getNodeOrignalPartitions() {
-        return Collections.unmodifiableSet(nodeOriginalPartitions);
-    }
-
-    public synchronized void addActivePartition(int partitonId) {
-        nodeActivePartitions.add(partitonId);
-        nodeInactivePartitions.remove(partitonId);
-    }
-
-    public synchronized void addInactivePartition(int partitonId) {
-        nodeInactivePartitions.add(partitonId);
-        nodeActivePartitions.remove(partitonId);
-    }
-
-    private static String getLocalResourceRelativePath(String absolutePath) {
-        final String[] tokens = absolutePath.split(File.separator);
-        // Format: storage_dir/partition/dataverse/idx
-        return tokens[tokens.length - 5] + File.separator + tokens[tokens.length - 4] + File.separator
-                + tokens[tokens.length - 3] + File.separator + tokens[tokens.length - 2];
-    }
-
-    public IndexFileProperties getIndexFileRef(String absoluteFilePath) throws HyracksDataException {
-        //TODO pass relative path
-        final String[] tokens = absoluteFilePath.split(File.separator);
-        if (tokens.length < 5) {
-            throw new HyracksDataException("Invalid file format");
-        }
-        String fileName = tokens[tokens.length - 1];
-        String index = tokens[tokens.length - 2];
-        String dataverse = tokens[tokens.length - 3];
-        String partition = tokens[tokens.length - 4];
-        int partitionId = StoragePathUtil.getPartitionNumFromName(partition);
-        String relativePath = getLocalResourceRelativePath(absoluteFilePath);
-        final LocalResource lr = get(relativePath);
-        int datasetId = lr == null ? -1 : ((DatasetLocalResource) lr.getResource()).getDatasetId();
-        return new IndexFileProperties(partitionId, dataverse, index, fileName, datasetId);
+    private static boolean isComponentMask(File mask) {
+        return mask.getName().startsWith(StorageConstants.COMPONENT_MASK_FILE_PREFIX);
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
index 93a7d83..d15e6ff 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepositoryFactory.java
@@ -18,26 +18,23 @@
  */
 package org.apache.asterix.transaction.management.resource;
 
-import org.apache.asterix.common.config.MetadataProperties;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.asterix.common.storage.IIndexCheckpointManagerProvider;
 import org.apache.hyracks.api.io.IIOManager;
 import org.apache.hyracks.storage.common.ILocalResourceRepository;
 import org.apache.hyracks.storage.common.file.ILocalResourceRepositoryFactory;
 
 public class PersistentLocalResourceRepositoryFactory implements ILocalResourceRepositoryFactory {
     private final IIOManager ioManager;
-    private final String nodeId;
-    private final MetadataProperties metadataProperties;
+    private final IIndexCheckpointManagerProvider indexCheckpointManagerProvider;
 
-    public PersistentLocalResourceRepositoryFactory(IIOManager ioManager, String nodeId,
-            MetadataProperties metadataProperties) {
+    public PersistentLocalResourceRepositoryFactory(IIOManager ioManager,
+            IIndexCheckpointManagerProvider indexCheckpointManagerProvider) {
         this.ioManager = ioManager;
-        this.nodeId = nodeId;
-        this.metadataProperties = metadataProperties;
+        this.indexCheckpointManagerProvider = indexCheckpointManagerProvider;
     }
 
     @Override
-    public ILocalResourceRepository createRepository() throws HyracksDataException {
-        return new PersistentLocalResourceRepository(ioManager, ioManager.getIODevices(), nodeId, metadataProperties);
+    public ILocalResourceRepository createRepository() {
+        return new PersistentLocalResourceRepository(ioManager, indexCheckpointManagerProvider);
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntime.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntime.java
index 1e22458..d298bef 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntime.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntime.java
@@ -27,9 +27,9 @@
 import org.apache.asterix.common.transactions.ILogMarkerCallback;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionManager;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.common.transactions.LogRecord;
 import org.apache.asterix.common.transactions.LogType;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.TransactionUtil;
 import org.apache.hyracks.algebricks.runtime.operators.base.AbstractOneInputOneOutputOneFramePushRuntime;
 import org.apache.hyracks.api.comm.IFrame;
@@ -50,10 +50,9 @@
 
     protected final ITransactionManager transactionManager;
     protected final ILogManager logMgr;
-    protected final JobId jobId;
+    protected final TxnId txnId;
     protected final int datasetId;
     protected final int[] primaryKeyFields;
-    protected final boolean isTemporaryDatasetWriteJob;
     protected final boolean isWriteTransaction;
     protected final long[] longHashes;
     protected final IHyracksTaskContext ctx;
@@ -62,18 +61,17 @@
     protected LogRecord logRecord;
     protected final boolean isSink;
 
-    public CommitRuntime(IHyracksTaskContext ctx, JobId jobId, int datasetId, int[] primaryKeyFields,
-            boolean isTemporaryDatasetWriteJob, boolean isWriteTransaction, int resourcePartition, boolean isSink) {
+    public CommitRuntime(IHyracksTaskContext ctx, TxnId txnId, int datasetId, int[] primaryKeyFields,
+            boolean isWriteTransaction, int resourcePartition, boolean isSink) {
         this.ctx = ctx;
         INcApplicationContext appCtx =
                 (INcApplicationContext) ctx.getJobletContext().getServiceContext().getApplicationContext();
         this.transactionManager = appCtx.getTransactionSubsystem().getTransactionManager();
         this.logMgr = appCtx.getTransactionSubsystem().getLogManager();
-        this.jobId = jobId;
+        this.txnId = txnId;
         this.datasetId = datasetId;
         this.primaryKeyFields = primaryKeyFields;
         this.tRef = new FrameTupleReference();
-        this.isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob;
         this.isWriteTransaction = isWriteTransaction;
         this.resourcePartition = resourcePartition;
         this.isSink = isSink;
@@ -83,7 +81,7 @@
     @Override
     public void open() throws HyracksDataException {
         try {
-            transactionContext = transactionManager.getTransactionContext(jobId, false);
+            transactionContext = transactionManager.getTransactionContext(txnId);
             transactionContext.setWriteTxn(isWriteTransaction);
             ILogMarkerCallback callback = TaskUtil.get(ILogMarkerCallback.KEY_MARKER_CALLBACK, ctx);
             logRecord = new LogRecord(callback);
@@ -102,29 +100,15 @@
         tAccess.reset(buffer);
         int nTuple = tAccess.getTupleCount();
         for (int t = 0; t < nTuple; t++) {
-            if (isTemporaryDatasetWriteJob) {
-                /**
-                 * This "if branch" is for writes over temporary datasets. A temporary dataset does not require any lock
-                 * and does not generate any write-ahead update and commit log but generates flush log and job commit
-                 * log. However, a temporary dataset still MUST guarantee no-steal policy so that this notification call
-                 * should be delivered to PrimaryIndexOptracker and used correctly in order to decrement number of
-                 * active operation count of PrimaryIndexOptracker. By maintaining the count correctly and only allowing
-                 * flushing when the count is 0, it can guarantee the no-steal policy for temporary datasets, too.
-                 */
-                // TODO: Fix this for upserts. an upsert tuple right now expect to notify the opTracker twice (one for
-                // delete and one for insert)
-                transactionContext.notifyOptracker(false);
-            } else {
-                tRef.reset(tAccess, t);
-                try {
-                    formLogRecord(buffer, t);
-                    logMgr.log(logRecord);
-                    if (!isSink) {
-                        appendTupleToFrame(t);
-                    }
-                } catch (ACIDException e) {
-                    throw new HyracksDataException(e);
+            tRef.reset(tAccess, t);
+            try {
+                formLogRecord(buffer, t);
+                logMgr.log(logRecord);
+                if (!isSink) {
+                    appendTupleToFrame(t);
                 }
+            } catch (ACIDException e) {
+                throw new HyracksDataException(e);
             }
         }
         IFrame message = TaskUtil.get(HyracksConstants.KEY_MESSAGE, ctx);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntimeFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntimeFactory.java
index 1b32d89..bbfde38 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntimeFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/runtime/CommitRuntimeFactory.java
@@ -19,30 +19,27 @@
 
 package org.apache.asterix.transaction.management.runtime;
 
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.api.IJobEventListenerFactory;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 
 public class CommitRuntimeFactory implements IPushRuntimeFactory {
 
     private static final long serialVersionUID = 1L;
 
-    protected final JobId jobId;
     protected final int datasetId;
     protected final int[] primaryKeyFields;
-    protected final boolean isTemporaryDatasetWriteJob;
     protected final boolean isWriteTransaction;
     protected int[] datasetPartitions;
     protected final boolean isSink;
 
-    public CommitRuntimeFactory(JobId jobId, int datasetId, int[] primaryKeyFields, boolean isTemporaryDatasetWriteJob,
-            boolean isWriteTransaction, int[] datasetPartitions, boolean isSink) {
-        this.jobId = jobId;
+    public CommitRuntimeFactory(int datasetId, int[] primaryKeyFields, boolean isWriteTransaction,
+            int[] datasetPartitions, boolean isSink) {
         this.datasetId = datasetId;
         this.primaryKeyFields = primaryKeyFields;
-        this.isTemporaryDatasetWriteJob = isTemporaryDatasetWriteJob;
         this.isWriteTransaction = isWriteTransaction;
         this.datasetPartitions = datasetPartitions;
         this.isSink = isSink;
@@ -54,8 +51,10 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
-            return new CommitRuntime(ctx, jobId, datasetId, primaryKeyFields, isTemporaryDatasetWriteJob,
-                    isWriteTransaction, datasetPartitions[ctx.getTaskAttemptId().getTaskId().getPartition()], isSink);
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+        IJobletEventListenerFactory fact = ctx.getJobletContext().getJobletEventListenerFactory();
+        return new IPushRuntime[] { new CommitRuntime(ctx, ((IJobEventListenerFactory) fact).getTxnId(datasetId),
+                datasetId, primaryKeyFields, isWriteTransaction,
+                datasetPartitions[ctx.getTaskAttemptId().getTaskId().getPartition()], isSink) };
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ConcurrentLockManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ConcurrentLockManager.java
index f386b39..726f95c 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ConcurrentLockManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ConcurrentLockManager.java
@@ -24,8 +24,6 @@
 import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.DatasetId;
@@ -34,6 +32,9 @@
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A concurrent implementation of the ILockManager interface.
@@ -43,8 +44,8 @@
  */
 public class ConcurrentLockManager implements ILockManager, ILifeCycleComponent {
 
-    static final Logger LOGGER = Logger.getLogger(ConcurrentLockManager.class.getName());
-    static final Level LVL = Level.FINER;
+    static final Logger LOGGER = LogManager.getLogger();
+    static final Level LVL = Level.TRACE;
     public static final boolean ENABLED_DEADLOCK_FREE_LOCKING_PROTOCOL = true;
 
     public static final int NIL = -1;
@@ -57,7 +58,7 @@
     private ResourceArenaManager resArenaMgr;
     private RequestArenaManager reqArenaMgr;
     private JobArenaManager jobArenaMgr;
-    private ConcurrentHashMap<Integer, Long> jobId2JobSlotMap;
+    private ConcurrentHashMap<Long, Long> txnId2TxnSlotMap;
     private LockManagerStats stats = new LockManagerStats(10000);
 
     enum LockAction {
@@ -96,7 +97,7 @@
         resArenaMgr = new ResourceArenaManager(noArenas, lockManagerShrinkTimer);
         reqArenaMgr = new RequestArenaManager(noArenas, lockManagerShrinkTimer);
         jobArenaMgr = new JobArenaManager(noArenas, lockManagerShrinkTimer);
-        jobId2JobSlotMap = new ConcurrentHashMap<>();
+        txnId2TxnSlotMap = new ConcurrentHashMap<>();
     }
 
     @Override
@@ -105,8 +106,8 @@
         log("lock", datasetId.getId(), entityHashValue, lockMode, txnContext);
         stats.lock();
 
-        final int jobId = txnContext.getJobId().getId();
-        final long jobSlot = findOrAllocJobSlot(jobId);
+        final long txnId = txnContext.getTxnId().getId();
+        final long jobSlot = findOrAllocJobSlot(txnId);
         final ResourceGroup group = table.get(datasetId.getId(), entityHashValue);
         group.getLatch();
         try {
@@ -328,7 +329,7 @@
         log("instantLock", datasetId.getId(), entityHashValue, lockMode, txnContext);
         stats.instantLock();
 
-        final int jobId = txnContext.getJobId().getId();
+        final long txnId = txnContext.getTxnId().getId();
         final ResourceGroup group = table.get(datasetId.getId(), entityHashValue);
         if (group.firstResourceIndex.get() == NILL) {
             validateJob(txnContext);
@@ -349,7 +350,7 @@
                 return;
             }
 
-            final long jobSlot = findOrAllocJobSlot(jobId);
+            final long jobSlot = findOrAllocJobSlot(txnId);
 
             while (true) {
                 final LockAction act = determineLockAction(resSlot, jobSlot, lockMode);
@@ -375,7 +376,7 @@
             if (reqSlot != NILL) {
                 // deallocate request, if we allocated one earlier
                 if (DEBUG_MODE) {
-                    LOGGER.finer("del req slot " + TypeUtil.Global.toString(reqSlot));
+                    LOGGER.trace("del req slot " + TypeUtil.Global.toString(reqSlot));
                 }
                 reqArenaMgr.deallocate(reqSlot);
             }
@@ -389,8 +390,8 @@
         log("tryLock", datasetId.getId(), entityHashValue, lockMode, txnContext);
         stats.tryLock();
 
-        final int jobId = txnContext.getJobId().getId();
-        final long jobSlot = findOrAllocJobSlot(jobId);
+        final long txnId = txnContext.getTxnId().getId();
+        final long jobSlot = findOrAllocJobSlot(txnId);
         final ResourceGroup group = table.get(datasetId.getId(), entityHashValue);
         group.getLatch();
 
@@ -425,7 +426,7 @@
         log("instantTryLock", datasetId.getId(), entityHashValue, lockMode, txnContext);
         stats.instantTryLock();
 
-        final int jobId = txnContext.getJobId().getId();
+        final long txnId = txnContext.getTxnId().getId();
         final ResourceGroup group = table.get(datasetId.getId(), entityHashValue);
         if (group.firstResourceIndex.get() == NILL) {
             validateJob(txnContext);
@@ -444,7 +445,7 @@
                 return true;
             }
 
-            final long jobSlot = findOrAllocJobSlot(jobId);
+            final long jobSlot = findOrAllocJobSlot(txnId);
 
             LockAction act = determineLockAction(resSlot, jobSlot, lockMode);
             switch (act) {
@@ -467,8 +468,8 @@
     public void unlock(DatasetId datasetId, int entityHashValue, byte lockMode, ITransactionContext txnContext)
             throws ACIDException {
         log("unlock", datasetId.getId(), entityHashValue, lockMode, txnContext);
-        final int jobId = txnContext.getJobId().getId();
-        final long jobSlot = jobId2JobSlotMap.get(jobId);
+        final long txnId = txnContext.getTxnId().getId();
+        final long jobSlot = txnId2TxnSlotMap.get(txnId);
 
         unlock(datasetId.getId(), entityHashValue, lockMode, jobSlot);
     }
@@ -494,7 +495,7 @@
 
             // deallocate request
             if (DEBUG_MODE) {
-                LOGGER.finer("del req slot " + TypeUtil.Global.toString(holder));
+                LOGGER.trace("del req slot " + TypeUtil.Global.toString(holder));
             }
             reqArenaMgr.deallocate(holder);
             // deallocate resource or fix max lock mode
@@ -509,7 +510,7 @@
                     resArenaMgr.setNext(prev, resArenaMgr.getNext(resource));
                 }
                 if (DEBUG_MODE) {
-                    LOGGER.finer("del res slot " + TypeUtil.Global.toString(resource));
+                    LOGGER.trace("del res slot " + TypeUtil.Global.toString(resource));
                 }
                 resArenaMgr.deallocate(resource);
             } else {
@@ -528,14 +529,14 @@
         log("releaseLocks", NIL, NIL, LockMode.ANY, txnContext);
         stats.releaseLocks();
 
-        int jobId = txnContext.getJobId().getId();
-        Long jobSlot = jobId2JobSlotMap.get(jobId);
+        long txnId = txnContext.getTxnId().getId();
+        Long jobSlot = txnId2TxnSlotMap.get(txnId);
         if (jobSlot == null) {
             // we don't know the job, so there are no locks for it - we're done
             return;
         }
         //System.err.println(table.append(new StringBuilder(), true).toString());
-        if (LOGGER.isLoggable(LVL)) {
+        if (LOGGER.isEnabled(LVL)) {
             LOGGER.log(LVL, "jobArenaMgr " + jobArenaMgr.addTo(new RecordManagerStats()).toString());
             LOGGER.log(LVL, "resArenaMgr " + resArenaMgr.addTo(new RecordManagerStats()).toString());
             LOGGER.log(LVL, "reqArenaMgr " + reqArenaMgr.addTo(new RecordManagerStats()).toString());
@@ -554,28 +555,28 @@
             }
         }
         if (DEBUG_MODE) {
-            LOGGER.finer("del job slot " + TypeUtil.Global.toString(jobSlot));
+            LOGGER.trace("del job slot " + TypeUtil.Global.toString(jobSlot));
         }
         jobArenaMgr.deallocate(jobSlot);
-        jobId2JobSlotMap.remove(jobId);
-        stats.logCounters(LOGGER, Level.FINE, true);
+        txnId2TxnSlotMap.remove(txnId);
+        stats.logCounters(LOGGER, Level.DEBUG, true);
     }
 
-    private long findOrAllocJobSlot(int jobId) {
-        Long jobSlot = jobId2JobSlotMap.get(jobId);
+    private long findOrAllocJobSlot(long txnId) {
+        Long jobSlot = txnId2TxnSlotMap.get(txnId);
         if (jobSlot == null) {
             jobSlot = new Long(jobArenaMgr.allocate());
             if (DEBUG_MODE) {
-                LOGGER.finer("new job slot " + TypeUtil.Global.toString(jobSlot) + " (" + jobId + ")");
+                LOGGER.trace("new job slot " + TypeUtil.Global.toString(jobSlot) + " (" + txnId + ")");
             }
-            jobArenaMgr.setJobId(jobSlot, jobId);
-            Long oldSlot = jobId2JobSlotMap.putIfAbsent(jobId, jobSlot);
+            jobArenaMgr.setTxnId(jobSlot, txnId);
+            Long oldSlot = txnId2TxnSlotMap.putIfAbsent(txnId, jobSlot);
             if (oldSlot != null) {
                 // if another thread allocated a slot for this jobThreadId between
                 // get(..) and putIfAbsent(..), we'll use that slot and
                 // deallocate the one we allocated
                 if (DEBUG_MODE) {
-                    LOGGER.finer("del job slot " + TypeUtil.Global.toString(jobSlot) + " due to conflict");
+                    LOGGER.trace("del job slot " + TypeUtil.Global.toString(jobSlot) + " due to conflict");
                 }
                 jobArenaMgr.deallocate(jobSlot);
                 jobSlot = oldSlot;
@@ -596,12 +597,12 @@
             resArenaMgr.setNext(resSlot, group.firstResourceIndex.get());
             group.firstResourceIndex.set(resSlot);
             if (DEBUG_MODE) {
-                LOGGER.finer("new res slot " + TypeUtil.Global.toString(resSlot) + " (" + dsId + ", " + entityHashValue
+                LOGGER.trace("new res slot " + TypeUtil.Global.toString(resSlot) + " (" + dsId + ", " + entityHashValue
                         + ")");
             }
         } else {
             if (DEBUG_MODE) {
-                LOGGER.finer("fnd res slot " + TypeUtil.Global.toString(resSlot) + " (" + dsId + ", " + entityHashValue
+                LOGGER.trace("fnd res slot " + TypeUtil.Global.toString(resSlot) + " (" + dsId + ", " + entityHashValue
                         + ")");
             }
         }
@@ -614,7 +615,7 @@
         reqArenaMgr.setLockMode(reqSlot, lockMode); // lock mode is a byte!!
         reqArenaMgr.setJobSlot(reqSlot, jobSlot);
         if (DEBUG_MODE) {
-            LOGGER.finer("new req slot " + TypeUtil.Global.toString(reqSlot) + " (" + TypeUtil.Global.toString(resSlot)
+            LOGGER.trace("new req slot " + TypeUtil.Global.toString(reqSlot) + " (" + TypeUtil.Global.toString(resSlot)
                     + ", " + TypeUtil.Global.toString(jobSlot) + ", " + LockMode.toString(lockMode) + ")");
         }
         return reqSlot;
@@ -667,7 +668,7 @@
     }
 
     private long findResourceInGroup(ResourceGroup group, int dsId, int entityHashValue) {
-        stats.logCounters(LOGGER, Level.FINE, false);
+        stats.logCounters(LOGGER, Level.DEBUG, false);
         long resSlot = group.firstResourceIndex.get();
         while (resSlot != NILL) {
             // either we already have a lock on this resource or we have a
@@ -917,7 +918,7 @@
 
     private void validateJob(ITransactionContext txnContext) throws ACIDException {
         if (txnContext.getTxnState() == ITransactionManager.ABORTED) {
-            throw new ACIDException("" + txnContext.getJobId() + " is in ABORTED state.");
+            throw new ACIDException("" + txnContext.getTxnId() + " is in ABORTED state.");
         } else if (txnContext.isTimeout()) {
             requestAbort(txnContext, "timeout");
         }
@@ -926,7 +927,7 @@
     private void requestAbort(ITransactionContext txnContext, String msg) throws ACIDException {
         txnContext.setTimeout(true);
         throw new ACIDException(
-                "Transaction " + txnContext.getJobId() + " should abort (requested by the Lock Manager)" + ":\n" + msg);
+                "Transaction " + txnContext.getTxnId() + " should abort (requested by the Lock Manager)" + ":\n" + msg);
     }
 
     /*
@@ -934,7 +935,7 @@
      */
 
     private void log(String string, int id, int entityHashValue, byte lockMode, ITransactionContext txnContext) {
-        if (!LOGGER.isLoggable(LVL)) {
+        if (!LOGGER.isEnabled(LVL)) {
             return;
         }
         StringBuilder sb = new StringBuilder();
@@ -949,7 +950,7 @@
             sb.append(" , mode : ").append(LockMode.toString(lockMode));
         }
         if (txnContext != null) {
-            sb.append(" , jobId : ").append(txnContext.getJobId());
+            sb.append(" , txnId : ").append(txnContext.getTxnId());
         }
         sb.append(" , thread : ").append(Thread.currentThread().getName());
         sb.append(" }");
@@ -970,8 +971,8 @@
                             while (reqSlot != NILL) {
                                 byte lockMode = (byte) reqArenaMgr.getLockMode(reqSlot);
                                 long jobSlot = reqArenaMgr.getJobSlot(reqSlot);
-                                int jobId = jobArenaMgr.getJobId(jobSlot);
-                                assertLockCanBeFoundInJobQueue(dsId, entityHashValue, lockMode, jobId);
+                                long txnId = jobArenaMgr.getTxnId(jobSlot);
+                                assertLockCanBeFoundInJobQueue(dsId, entityHashValue, lockMode, txnId);
                                 reqSlot = reqArenaMgr.getNextRequest(reqSlot);
                             }
                             resSlot = resArenaMgr.getNext(resSlot);
@@ -980,7 +981,7 @@
                         group.releaseLatch();
                     }
                 } else {
-                    LOGGER.warning("Could not check locks for " + group);
+                    LOGGER.warn("Could not check locks for " + group);
                 }
             }
         } catch (InterruptedException e) {
@@ -988,12 +989,12 @@
         }
     }
 
-    private void assertLockCanBeFoundInJobQueue(int dsId, int entityHashValue, byte lockMode, int jobId) {
-        if (findLockInJobQueue(dsId, entityHashValue, jobId, lockMode) == NILL) {
+    private void assertLockCanBeFoundInJobQueue(int dsId, int entityHashValue, byte lockMode, long txnId) {
+        if (findLockInJobQueue(dsId, entityHashValue, txnId, lockMode) == NILL) {
             String msg = "request for " + LockMode.toString(lockMode) + " lock on dataset " + dsId + " entity "
-                    + entityHashValue + " not found for job " + jobId + " in thread "
+                    + entityHashValue + " not found for txn " + txnId + " in thread "
                     + Thread.currentThread().getName();
-            LOGGER.severe(msg);
+            LOGGER.error(msg);
             throw new IllegalStateException(msg);
         }
     }
@@ -1005,14 +1006,14 @@
      *            dataset id
      * @param entityHashValue
      *            primary key hash value
-     * @param jobId
+     * @param txnId
      *            job id
      * @param lockMode
      *            lock mode
      * @return the slot of the request, if the lock request is found, NILL otherwise
      */
-    private long findLockInJobQueue(final int dsId, final int entityHashValue, final int jobId, byte lockMode) {
-        Long jobSlot = jobId2JobSlotMap.get(jobId);
+    private long findLockInJobQueue(final int dsId, final int entityHashValue, final long txnId, byte lockMode) {
+        Long jobSlot = txnId2TxnSlotMap.get(txnId);
         if (jobSlot == null) {
             return NILL;
         }
@@ -1040,7 +1041,7 @@
     }
 
     private TablePrinter getDumpTablePrinter() {
-        return new DumpTablePrinter(table, resArenaMgr, reqArenaMgr, jobArenaMgr, jobId2JobSlotMap);
+        return new DumpTablePrinter(table, resArenaMgr, reqArenaMgr, jobArenaMgr, txnId2TxnSlotMap);
     }
 
     public String printByResource() {
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/DumpTablePrinter.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/DumpTablePrinter.java
index a75f756..26261c2 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/DumpTablePrinter.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/DumpTablePrinter.java
@@ -26,15 +26,15 @@
     private ResourceArenaManager resArenaMgr;
     private RequestArenaManager reqArenaMgr;
     private JobArenaManager jobArenaMgr;
-    private ConcurrentHashMap<Integer, Long> jobId2JobSlotMap;
+    private ConcurrentHashMap<Long, Long> txnIdToJobSlotMap;
 
     DumpTablePrinter(ResourceGroupTable table, ResourceArenaManager resArenaMgr, RequestArenaManager reqArenaMgr,
-            JobArenaManager jobArenaMgr, ConcurrentHashMap<Integer, Long> jobId2JobSlotMap) {
+            JobArenaManager jobArenaMgr, ConcurrentHashMap<Long, Long> txnIdToJobSlotMap) {
         this.table = table;
         this.resArenaMgr = resArenaMgr;
         this.reqArenaMgr = reqArenaMgr;
         this.jobArenaMgr = jobArenaMgr;
-        this.jobId2JobSlotMap = jobId2JobSlotMap;
+        this.txnIdToJobSlotMap = txnIdToJobSlotMap;
     }
 
     public StringBuilder append(StringBuilder sb) {
@@ -52,10 +52,10 @@
             reqArenaMgr.append(sb);
             sb.append(">>dump_end\t>>----- [reqArenaMgr] -----\n");
 
-            sb.append(">>dump_begin\t>>----- [jobIdSlotMap] -----\n");
-            for (Integer i : jobId2JobSlotMap.keySet()) {
+            sb.append(">>dump_begin\t>>----- [txnIdSlotMap] -----\n");
+            for (Long i : txnIdToJobSlotMap.keySet()) {
                 sb.append(i).append(" : ");
-                TypeUtil.Global.append(sb, jobId2JobSlotMap.get(i));
+                TypeUtil.Global.append(sb, txnIdToJobSlotMap.get(i));
                 sb.append("\n");
             }
             sb.append(">>dump_end\t>>----- [jobIdSlotMap] -----\n");
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/Job.json b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/Job.json
index a649b7c..5e0f588 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/Job.json
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/Job.json
@@ -17,8 +17,8 @@
             "initial" : "-1"
         },
         {
-            "name" : "job id",
-            "type" : "INT"
+            "name" : "txn id",
+            "type" : "GLOBAL"
         }
     ]
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/LockManagerStats.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/LockManagerStats.java
index 1050d54..1acc0ac 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/LockManagerStats.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/LockManagerStats.java
@@ -20,8 +20,9 @@
 package org.apache.asterix.transaction.management.service.locking;
 
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 
 final class LockManagerStats {
     private final int loggingPeriod;
@@ -37,27 +38,39 @@
         this.loggingPeriod = loggingPeriod;
     }
 
-    final void lock()           { lCnt.incrementAndGet(); }
-    final void instantLock()    { ilCnt.incrementAndGet(); }
-    final void tryLock()        { tlCnt.incrementAndGet(); }
-    final void instantTryLock() { itlCnt.incrementAndGet(); }
-    final void unlock()         { ulCnt.incrementAndGet(); }
-    final void releaseLocks()   { rlCnt.incrementAndGet(); }
+    final void lock() {
+        lCnt.incrementAndGet();
+    }
+
+    final void instantLock() {
+        ilCnt.incrementAndGet();
+    }
+
+    final void tryLock() {
+        tlCnt.incrementAndGet();
+    }
+
+    final void instantTryLock() {
+        itlCnt.incrementAndGet();
+    }
+
+    final void unlock() {
+        ulCnt.incrementAndGet();
+    }
+
+    final void releaseLocks() {
+        rlCnt.incrementAndGet();
+    }
 
     final int requestSum() {
-        return lCnt.intValue() + ilCnt.intValue() + tlCnt.intValue()
-                + itlCnt.intValue() + ulCnt.intValue() + rlCnt.intValue();
+        return lCnt.intValue() + ilCnt.intValue() + tlCnt.intValue() + itlCnt.intValue() + ulCnt.intValue()
+                + rlCnt.intValue();
     }
 
     final StringBuilder append(StringBuilder sb) {
-        sb.append("{")
-        .append(" lock : ").append(lCnt)
-        .append(", instantLock : ").append(ilCnt)
-        .append(", tryLock : ").append(tlCnt)
-        .append(", instantTryLock : ").append(itlCnt)
-        .append(", unlock : ").append(ulCnt)
-        .append(", releaseLocks : ").append(rlCnt)
-        .append(" }");
+        sb.append("{").append(" lock : ").append(lCnt).append(", instantLock : ").append(ilCnt).append(", tryLock : ")
+                .append(tlCnt).append(", instantTryLock : ").append(itlCnt).append(", unlock : ").append(ulCnt)
+                .append(", releaseLocks : ").append(rlCnt).append(" }");
         return sb;
     }
 
@@ -67,8 +80,7 @@
     }
 
     final void logCounters(final Logger logger, final Level lvl, boolean always) {
-        if (logger.isLoggable(lvl)
-            && (always || requestSum()  % loggingPeriod == 0)) {
+        if (logger.isEnabled(lvl) && (always || requestSum() % loggingPeriod == 0)) {
             logger.log(lvl, toString());
         }
     }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroup.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroup.java
index bec4e53..6e59217 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroup.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroup.java
@@ -53,7 +53,7 @@
         try {
             return latch.writeLock().tryLock(timeout, unit);
         } catch (InterruptedException e) {
-            ConcurrentLockManager.LOGGER.finer("interrupted while wating on ResourceGroup");
+            ConcurrentLockManager.LOGGER.trace("interrupted while wating on ResourceGroup");
             throw e;
         }
     }
@@ -72,7 +72,7 @@
         try {
             condition.await();
         } catch (InterruptedException e) {
-            ConcurrentLockManager.LOGGER.finer("interrupted while waiting on ResourceGroup");
+            ConcurrentLockManager.LOGGER.trace("interrupted while waiting on ResourceGroup");
             throw e;
         }
     }
@@ -83,13 +83,13 @@
     }
 
     void log(String s) {
-        if (ConcurrentLockManager.LOGGER.isLoggable(ConcurrentLockManager.LVL)) {
+        if (ConcurrentLockManager.LOGGER.isEnabled(ConcurrentLockManager.LVL)) {
             ConcurrentLockManager.LOGGER.log(ConcurrentLockManager.LVL, s + " " + toString());
         }
     }
 
     public String toString() {
-        return "{ id : " + hashCode() + ", first : " + TypeUtil.Global.toString(firstResourceIndex.get()) + ", " +
-                "waiters : " + (hasWaiters() ? "true" : "false") + " }";
+        return "{ id : " + hashCode() + ", first : " + TypeUtil.Global.toString(firstResourceIndex.get()) + ", "
+                + "waiters : " + (hasWaiters() ? "true" : "false") + " }";
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroupTable.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroupTable.java
index 213ccd9..3759f96 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroupTable.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceGroupTable.java
@@ -43,7 +43,8 @@
     ResourceGroup get(int dId, int entityHashValue) {
         // TODO ensure good properties of hash function
         int h = Math.abs(dId ^ entityHashValue);
-        if (h < 0) h = 0;
+        if (h < 0)
+            h = 0;
         return table[h % size];
     }
 
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceTablePrinter.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceTablePrinter.java
index eff9e21..e8ef2c8 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceTablePrinter.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/locking/ResourceTablePrinter.java
@@ -99,7 +99,7 @@
 
     StringBuilder appendRequest(StringBuilder sb, long req) {
         long job = reqArenaMgr.getJobSlot(req);
-        sb.append("{ \"job\": ").append(jobArenaMgr.getJobId(job));
+        sb.append("{ \"job\": ").append(jobArenaMgr.getTxnId(job));
         sb.append(", \"mode\": \"").append(string(reqArenaMgr.getLockMode(req)));
         return sb.append("\" }");
     }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogBuffer.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogBuffer.java
index 668eab1..a630caa 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogBuffer.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogBuffer.java
@@ -18,33 +18,33 @@
  */
 package org.apache.asterix.transaction.management.service.logging;
 
-import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.replication.IReplicationThread;
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ILogBuffer;
 import org.apache.asterix.common.transactions.ILogRecord;
+import org.apache.asterix.common.transactions.ILogRequester;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.common.transactions.LogRecord;
 import org.apache.asterix.common.transactions.LogSource;
 import org.apache.asterix.common.transactions.LogType;
 import org.apache.asterix.common.transactions.MutableLong;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LogBuffer implements ILogBuffer {
 
     public static final boolean IS_DEBUG_MODE = false;//true
-    private static final Logger LOGGER = Logger.getLogger(LogBuffer.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ITransactionSubsystem txnSubsystem;
     private final LogBufferTailReader logBufferTailReader;
     private final int logPageSize;
@@ -55,13 +55,12 @@
     protected final ByteBuffer appendBuffer;
     private final ByteBuffer flushBuffer;
     private final ByteBuffer unlockBuffer;
-    private boolean isLastPage;
     protected final LinkedBlockingQueue<ILogRecord> syncCommitQ;
     protected final LinkedBlockingQueue<ILogRecord> flushQ;
     protected final LinkedBlockingQueue<ILogRecord> remoteJobsQ;
     private FileChannel fileChannel;
     private boolean stop;
-    private final JobId reusableJobId;
+    private final MutableTxnId reusableTxnId;
     private final DatasetId reusableDatasetId;
 
     public LogBuffer(ITransactionSubsystem txnSubsystem, int logPageSize, MutableLong flushLSN) {
@@ -75,11 +74,10 @@
         full = new AtomicBoolean(false);
         appendOffset = 0;
         flushOffset = 0;
-        isLastPage = false;
         syncCommitQ = new LinkedBlockingQueue<>(logPageSize / ILogRecord.JOB_TERMINATE_LOG_SIZE);
         flushQ = new LinkedBlockingQueue<>();
         remoteJobsQ = new LinkedBlockingQueue<>();
-        reusableJobId = new JobId(-1);
+        reusableTxnId = new MutableTxnId(-1);
         reusableDatasetId = new DatasetId(-1);
     }
 
@@ -111,8 +109,8 @@
                     logRecord.isFlushed(false);
                     flushQ.add(logRecord);
                 }
-            } else if (logRecord.getLogSource() == LogSource.REMOTE
-                    && (logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT)) {
+            } else if (logRecord.getLogSource() == LogSource.REMOTE && (logRecord.getLogType() == LogType.JOB_COMMIT
+                    || logRecord.getLogType() == LogType.ABORT || logRecord.getLogType() == LogType.FLUSH)) {
                 remoteJobsQ.add(logRecord);
             }
             this.notify();
@@ -124,14 +122,6 @@
         this.fileChannel = fileChannel;
     }
 
-    public void setInitialFlushOffset(long offset) {
-        try {
-            fileChannel.position(offset);
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
     @Override
     public synchronized void setFull() {
         this.full.set(true);
@@ -139,13 +129,8 @@
     }
 
     @Override
-    public void setLastPage() {
-        this.isLastPage = true;
-    }
-
-    @Override
     public boolean hasSpace(int logSize) {
-        return appendOffset + logSize <= logPageSize;
+        return appendOffset + logSize <= logPageSize && !full.get();
     }
 
     @Override
@@ -159,7 +144,6 @@
         full.set(false);
         appendOffset = 0;
         flushOffset = 0;
-        isLastPage = false;
         stop = false;
     }
 
@@ -181,24 +165,18 @@
                                         + ", full: " + full.get());
                             }
                             if (stopping || stop) {
-                                fileChannel.close();
                                 return;
                             }
                             wait();
                         }
                         endOffset = appendOffset;
                     }
-                internalFlush(flushOffset, endOffset);
+                    internalFlush(flushOffset, endOffset);
                 } catch (InterruptedException e) {
                     interrupted = true;
                 }
             }
             internalFlush(flushOffset, appendOffset);
-            if (isLastPage) {
-                fileChannel.close();
-            }
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
         } finally {
             if (interrupted) {
                 Thread.currentThread().interrupt();
@@ -234,39 +212,36 @@
     private void batchUnlock(int beginOffset, int endOffset) throws ACIDException {
         if (endOffset > beginOffset) {
             logBufferTailReader.initializeScan(beginOffset, endOffset);
-
             ITransactionContext txnCtx;
-
             LogRecord logRecord = logBufferTailReader.next();
             while (logRecord != null) {
                 if (logRecord.getLogSource() == LogSource.LOCAL) {
                     if (logRecord.getLogType() == LogType.ENTITY_COMMIT) {
-                        reusableJobId.setId(logRecord.getJobId());
+                        reusableTxnId.setId(logRecord.getTxnId());
                         reusableDatasetId.setId(logRecord.getDatasetId());
-                        txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(reusableJobId, false);
+                        txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(reusableTxnId);
                         txnSubsystem.getLockManager().unlock(reusableDatasetId, logRecord.getPKHashValue(),
                                 LockMode.ANY, txnCtx);
-                        txnCtx.notifyOptracker(false);
+                        txnCtx.notifyEntityCommitted(logRecord.getResourcePartition());
                         if (txnSubsystem.getTransactionProperties().isCommitProfilerEnabled()) {
                             txnSubsystem.incrementEntityCommitCount();
                         }
+                    } else if (logRecord.getLogType() == LogType.UPDATE) {
+                        reusableTxnId.setId(logRecord.getTxnId());
+                        txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(reusableTxnId);
+                        txnCtx.notifyUpdateCommitted(logRecord.getResourceId());
                     } else if (logRecord.getLogType() == LogType.JOB_COMMIT
                             || logRecord.getLogType() == LogType.ABORT) {
-                        reusableJobId.setId(logRecord.getJobId());
-                        txnCtx = txnSubsystem.getTransactionManager().getTransactionContext(reusableJobId, false);
-                        txnCtx.notifyOptracker(true);
                         notifyJobTermination();
                     } else if (logRecord.getLogType() == LogType.FLUSH) {
                         notifyFlushTermination();
                     } else if (logRecord.getLogType() == LogType.WAIT) {
                         notifyWaitTermination();
                     }
-                } else if (logRecord.getLogSource() == LogSource.REMOTE) {
-                    if (logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT) {
-                        notifyReplicationTermination();
-                    }
+                } else if (logRecord.getLogSource() == LogSource.REMOTE && (logRecord.getLogType() == LogType.JOB_COMMIT
+                        || logRecord.getLogType() == LogType.ABORT || logRecord.getLogType() == LogType.FLUSH)) {
+                    notifyReplicationTermination();
                 }
-
                 logRecord = logBufferTailReader.next();
             }
         }
@@ -297,10 +272,12 @@
 
     public void notifyFlushTermination() throws ACIDException {
         LogRecord logRecord = null;
-        try {
-            logRecord = (LogRecord) flushQ.take();
-        } catch (InterruptedException e) {
-            //ignore
+        while (logRecord == null) {
+            try {
+                logRecord = (LogRecord) flushQ.take();
+            } catch (InterruptedException e) { //NOSONAR LogFlusher should survive interrupts
+                //ignore
+            }
         }
         synchronized (logRecord) {
             logRecord.isFlushed(true);
@@ -318,16 +295,17 @@
 
     public void notifyReplicationTermination() {
         LogRecord logRecord = null;
-        try {
-            logRecord = (LogRecord) remoteJobsQ.take();
-        } catch (InterruptedException e) {
-            //ignore
+        while (logRecord == null) {
+            try {
+                logRecord = (LogRecord) remoteJobsQ.take();
+            } catch (InterruptedException e) { //NOSONAR LogFlusher should survive interrupts
+                //ignore
+            }
         }
         logRecord.isFlushed(true);
-        IReplicationThread replicationThread = logRecord.getReplicationThread();
-
-        if (replicationThread != null) {
-            replicationThread.notifyLogReplicationRequester(logRecord);
+        final ILogRequester logRequester = logRecord.getRequester();
+        if (logRequester != null) {
+            logRequester.notifyFlushed(logRecord);
         }
     }
 
@@ -341,4 +319,15 @@
     public int getLogPageSize() {
         return logPageSize;
     }
+
+    private class MutableTxnId extends TxnId {
+
+        public MutableTxnId(long id) {
+            super(id);
+        }
+
+        public void setId(long id) {
+            this.id = id;
+        }
+    }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
index 5f9369d..e08bebe 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManager.java
@@ -24,6 +24,9 @@
 import java.io.OutputStream;
 import java.io.RandomAccessFile;
 import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -31,12 +34,11 @@
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.replication.IReplicationManager;
@@ -48,24 +50,22 @@
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
 import org.apache.asterix.common.transactions.LogManagerProperties;
+import org.apache.asterix.common.transactions.LogSource;
 import org.apache.asterix.common.transactions.LogType;
 import org.apache.asterix.common.transactions.MutableLong;
 import org.apache.asterix.common.transactions.TxnLogFile;
-import org.apache.asterix.common.utils.InterruptUtil;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
+import org.apache.hyracks.util.InvokeUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
 
 public class LogManager implements ILogManager, ILifeCycleComponent {
 
-    /*
-     * Constants
-     */
-    private static final Logger LOGGER = Logger.getLogger(LogManager.class.getName());
+    private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
     private static final long SMALLEST_LOG_FILE_ID = 0;
     private static final int INITIAL_LOG_SIZE = 0;
-    public static final boolean IS_DEBUG_MODE = false;// true
-    /*
-     * Finals
-     */
+    private static final boolean IS_DEBUG_MODE = false;
+
     private final ITransactionSubsystem txnSubsystem;
     private final LogManagerProperties logManagerProperties;
     private final int numLogPages;
@@ -73,28 +73,28 @@
     private final String logFilePrefix;
     private final MutableLong flushLSN;
     private final String nodeId;
-    private final FlushLogsLogger flushLogsLogger;
     private final HashMap<Long, Integer> txnLogFileId2ReaderCount = new HashMap<>();
-    protected final long logFileSize;
-    protected final int logPageSize;
-    protected final AtomicLong appendLSN;
-    /*
-     * Mutables
-     */
+    private final long logFileSize;
+    private final int logPageSize;
+    private final AtomicLong appendLSN;
+    private final long maxLogRecordSize;
+
     private LinkedBlockingQueue<ILogBuffer> emptyQ;
     private LinkedBlockingQueue<ILogBuffer> flushQ;
     private LinkedBlockingQueue<ILogBuffer> stashQ;
     private FileChannel appendChannel;
-    protected ILogBuffer appendPage;
+    private ILogBuffer appendPage;
     private LogFlusher logFlusher;
     private Future<? extends Object> futureLogFlusher;
     protected LinkedBlockingQueue<ILogRecord> flushLogsQ;
+    private long currentLogFileId;
 
     public LogManager(ITransactionSubsystem txnSubsystem) {
         this.txnSubsystem = txnSubsystem;
         logManagerProperties =
                 new LogManagerProperties(this.txnSubsystem.getTransactionProperties(), this.txnSubsystem.getId());
         logFileSize = logManagerProperties.getLogPartitionSize();
+        maxLogRecordSize = logFileSize - 1;
         logPageSize = logManagerProperties.getLogPageSize();
         numLogPages = logManagerProperties.getNumLogPages();
         logDir = logManagerProperties.getLogDir();
@@ -103,7 +103,7 @@
         appendLSN = new AtomicLong();
         nodeId = txnSubsystem.getId();
         flushLogsQ = new LinkedBlockingQueue<>();
-        flushLogsLogger = new FlushLogsLogger();
+        txnSubsystem.getApplicationContext().getThreadExecutor().execute(new FlushLogsLogger());
         initializeLogManager(SMALLEST_LOG_FILE_ID);
     }
 
@@ -112,72 +112,62 @@
         flushQ = new LinkedBlockingQueue<>(numLogPages);
         stashQ = new LinkedBlockingQueue<>(numLogPages);
         for (int i = 0; i < numLogPages; i++) {
-            emptyQ.offer(new LogBuffer(txnSubsystem, logPageSize, flushLSN));
+            emptyQ.add(new LogBuffer(txnSubsystem, logPageSize, flushLSN));
         }
         appendLSN.set(initializeLogAnchor(nextLogFileId));
         flushLSN.set(appendLSN.get());
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("LogManager starts logging in LSN: " + appendLSN);
         }
-        appendChannel = getFileChannel(appendLSN.get(), false);
-        getAndInitNewPage(INITIAL_LOG_SIZE);
-        logFlusher = new LogFlusher(this, emptyQ, flushQ, stashQ);
-        futureLogFlusher = txnSubsystem.getAsterixAppRuntimeContextProvider().getThreadExecutor().submit(logFlusher);
-        if (!flushLogsLogger.isAlive()) {
-            txnSubsystem.getAsterixAppRuntimeContextProvider().getThreadExecutor().execute(flushLogsLogger);
+        try {
+            setLogPosition(appendLSN.get());
+        } catch (IOException e) {
+            throw new ACIDException(e);
         }
+        initNewPage(INITIAL_LOG_SIZE);
+        logFlusher = new LogFlusher(this, emptyQ, flushQ, stashQ);
+        futureLogFlusher =
+                ((ExecutorService) txnSubsystem.getApplicationContext().getThreadExecutor()).submit(logFlusher);
     }
 
     @Override
-    public void log(ILogRecord logRecord) throws ACIDException {
+    public void log(ILogRecord logRecord) {
         if (logRecord.getLogType() == LogType.FLUSH) {
-            flushLogsQ.offer(logRecord);
+            flushLogsQ.add(logRecord);
             return;
         }
         appendToLogTail(logRecord);
     }
 
-    protected void appendToLogTail(ILogRecord logRecord) throws ACIDException {
+    protected void appendToLogTail(ILogRecord logRecord) {
         syncAppendToLogTail(logRecord);
-
-        if ((logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT
-                || logRecord.getLogType() == LogType.WAIT) && !logRecord.isFlushed()) {
-            synchronized (logRecord) {
-                while (!logRecord.isFlushed()) {
-                    try {
+        if (waitForFlush(logRecord) && !logRecord.isFlushed()) {
+            InvokeUtil.doUninterruptibly(() -> {
+                synchronized (logRecord) {
+                    while (!logRecord.isFlushed()) {
                         logRecord.wait();
-                    } catch (InterruptedException e) {
-                        //ignore
                     }
                 }
-            }
+            });
         }
     }
 
-    protected synchronized void syncAppendToLogTail(ILogRecord logRecord) throws ACIDException {
-        if (logRecord.getLogType() != LogType.FLUSH) {
+    protected static boolean waitForFlush(ILogRecord logRecord) {
+        final byte logType = logRecord.getLogType();
+        return logType == LogType.JOB_COMMIT || logType == LogType.ABORT || logType == LogType.WAIT;
+    }
+
+    synchronized void syncAppendToLogTail(ILogRecord logRecord) {
+        if (logRecord.getLogSource() == LogSource.LOCAL && logRecord.getLogType() != LogType.FLUSH) {
             ITransactionContext txnCtx = logRecord.getTxnCtx();
             if (txnCtx.getTxnState() == ITransactionManager.ABORTED && logRecord.getLogType() != LogType.ABORT) {
                 throw new ACIDException(
-                        "Aborted job(" + txnCtx.getJobId() + ") tried to write non-abort type log record.");
+                        "Aborted txn(" + txnCtx.getTxnId() + ") tried to write non-abort type log record.");
             }
         }
-
-        /*
-         * To eliminate the case where the modulo of the next appendLSN = 0 (the next
-         * appendLSN = the first LSN of the next log file), we do not allow a log to be
-         * written at the last offset of the current file.
-         */
         final int logSize = logRecord.getLogSize();
-        // Make sure the log will not exceed the log file size
-        if (getLogFileOffset(appendLSN.get()) + logSize >= logFileSize) {
-            prepareNextLogFile();
-            prepareNextPage(logSize);
-        } else if (!appendPage.hasSpace(logSize)) {
-            prepareNextPage(logSize);
-        }
+        ensureSpace(logSize);
         appendPage.append(logRecord, appendLSN.get());
-
         if (logRecord.getLogType() == LogType.FLUSH) {
             logRecord.setLSN(appendLSN.get());
         }
@@ -187,70 +177,100 @@
         appendLSN.addAndGet(logSize);
     }
 
-    protected void prepareNextPage(int logSize) {
-        appendPage.setFull();
-        getAndInitNewPage(logSize);
+    private void ensureSpace(int logSize) {
+        if (!fileHasSpace(logSize)) {
+            ensureLastPageFlushed();
+            prepareNextLogFile();
+        }
+        if (!appendPage.hasSpace(logSize)) {
+            prepareNextPage(logSize);
+        }
     }
 
-    protected void getAndInitNewPage(int logSize) {
-        if (logSize > logPageSize) {
-            // before creating a new page, we need to stash a normal sized page since our queues have fixed capacity
-            appendPage = null;
-            while (appendPage == null) {
-                try {
-                    appendPage = emptyQ.take();
-                    stashQ.add(appendPage);
-                } catch (InterruptedException e) {
-                    //ignore
-                }
-            }
+    private boolean fileHasSpace(int logSize) {
+        if (logSize > maxLogRecordSize) {
+            throw new ACIDException("Maximum log record size of (" + maxLogRecordSize + ") exceeded");
+        }
+        /*
+         * To eliminate the case where the modulo of the next appendLSN = 0 (the next
+         * appendLSN = the first LSN of the next log file), we do not allow a log to be
+         * written at the last offset of the current file.
+         */
+        return getLogFileOffset(appendLSN.get()) + logSize < logFileSize;
+    }
+
+    private void prepareNextPage(int logSize) {
+        appendPage.setFull();
+        initNewPage(logSize);
+    }
+
+    private void initNewPage(int logSize) {
+        boolean largePage = logSize > logPageSize;
+        // if a new large page will be allocated, we need to stash a normal sized page
+        // since our queues have fixed capacity
+        ensureAvailablePage(largePage);
+        if (largePage) {
             // for now, alloc a new buffer for each large page
             // TODO: pool large pages??
             appendPage = new LogBuffer(txnSubsystem, logSize, flushLSN);
-            appendPage.setFileChannel(appendChannel);
-            flushQ.offer(appendPage);
         } else {
-            appendPage = null;
-            while (appendPage == null) {
-                try {
-                    appendPage = emptyQ.take();
-                } catch (InterruptedException e) {
-                    //ignore
-                }
-            }
             appendPage.reset();
-            appendPage.setFileChannel(appendChannel);
-            flushQ.offer(appendPage);
+        }
+        appendPage.setFileChannel(appendChannel);
+        flushQ.add(appendPage);
+    }
+
+    private void ensureAvailablePage(boolean stash) {
+        final ILogBuffer currentPage = appendPage;
+        appendPage = null;
+        try {
+            appendPage = emptyQ.take();
+            if (stash) {
+                stashQ.add(appendPage);
+            }
+        } catch (InterruptedException e) {
+            appendPage = currentPage;
+            Thread.currentThread().interrupt();
+            throw new ACIDException(e);
         }
     }
 
-    protected void prepareNextLogFile() {
-        // Mark the page as the last page so that it will close the output file channel.
-        appendPage.setLastPage();
+    private void prepareNextLogFile() {
+        final long nextFileBeginLsn = getNextFileFirstLsn();
+        try {
+            closeCurrentLogFile();
+            createNextLogFile();
+            InvokeUtil.doIoUninterruptibly(() -> setLogPosition(nextFileBeginLsn));
+            // move appendLSN and flushLSN to the first LSN of the next log file
+            // only after the file was created and the channel was positioned successfully
+            appendLSN.set(nextFileBeginLsn);
+            flushLSN.set(nextFileBeginLsn);
+            LOGGER.info("Created new txn log file with id({}) starting with LSN = {}", currentLogFileId,
+                    nextFileBeginLsn);
+        } catch (IOException e) {
+            throw new ACIDException(e);
+        }
+    }
+
+    private long getNextFileFirstLsn() {
+        // add the remaining space in the current file
+        return appendLSN.get() + (logFileSize - getLogFileOffset(appendLSN.get()));
+    }
+
+    private void ensureLastPageFlushed() {
         // Make sure to flush whatever left in the log tail.
         appendPage.setFull();
-        //wait until all log records have been flushed in the current file
         synchronized (flushLSN) {
-            try {
-                while (flushLSN.get() != appendLSN.get()) {
-                    //notification will come from LogBuffer.internalFlush(.)
+            while (flushLSN.get() != appendLSN.get()) {
+                // notification will come from LogBuffer.internalFlush(.)
+                try {
                     flushLSN.wait();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    throw new ACIDException(e);
                 }
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
             }
         }
-        //move appendLSN and flushLSN to the first LSN of the next log file
-        appendLSN.addAndGet(logFileSize - getLogFileOffset(appendLSN.get()));
-        flushLSN.set(appendLSN.get());
-        appendChannel = getFileChannel(appendLSN.get(), true);
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Created new txn log file with id(" + getLogFileId(appendLSN.get()) + ") starting with LSN = "
-                    + appendLSN.get());
-        }
-        //[Notice]
-        //the current log file channel is closed if
-        //LogBuffer.flush() completely flush the last page of the file.
     }
 
     @Override
@@ -279,6 +299,7 @@
     @Override
     public void stop(boolean dumpState, OutputStream os) {
         terminateLogFlusher();
+        closeCurrentLogFile();
         if (dumpState) {
             dumpState(os);
         }
@@ -334,7 +355,7 @@
                 if (logFileIds == null) {
                     fileId = nextLogFileId;
                     createFileIfNotExists(getLogFilePath(fileId));
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("created a log file: " + getLogFilePath(fileId));
                     }
                 } else {
@@ -345,18 +366,18 @@
             } else {
                 fileId = nextLogFileId;
                 createNewDirectory(logDir);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("created the log directory: " + logManagerProperties.getLogDir());
                 }
                 createFileIfNotExists(getLogFilePath(fileId));
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("created a log file: " + getLogFilePath(fileId));
                 }
             }
         } catch (IOException ioe) {
             throw new IllegalStateException("Failed to initialize the log anchor", ioe);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("log file Id: " + fileId + ", offset: " + offset);
         }
         return logFileSize * fileId + offset;
@@ -365,6 +386,7 @@
     @Override
     public void renewLogFiles() {
         terminateLogFlusher();
+        closeCurrentLogFile();
         long lastMaxLogFileId = deleteAllLogFiles();
         initializeLogManager(lastMaxLogFileId + 1);
     }
@@ -395,7 +417,7 @@
                     File file = new File(getLogFilePath(id));
                     file.delete();
                     txnLogFileId2ReaderCount.remove(id);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("Deleted log file " + file.getAbsolutePath());
                     }
                 }
@@ -404,32 +426,25 @@
     }
 
     private void terminateLogFlusher() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Terminating LogFlusher thread ...");
         }
         logFlusher.terminate();
         try {
             futureLogFlusher.get();
         } catch (ExecutionException | InterruptedException e) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("---------- warning(begin): LogFlusher thread is terminated abnormally --------");
                 e.printStackTrace();
                 LOGGER.info("---------- warning(end)  : LogFlusher thread is terminated abnormally --------");
             }
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("LogFlusher thread is terminated.");
         }
     }
 
     private long deleteAllLogFiles() {
-        if (appendChannel != null) {
-            try {
-                appendChannel.close();
-            } catch (IOException e) {
-                throw new IllegalStateException("Failed to close a fileChannel of a log file");
-            }
-        }
         txnLogFileId2ReaderCount.clear();
         List<Long> logFileIds = getLogFileIds();
         if (logFileIds != null) {
@@ -475,11 +490,11 @@
         return logFileIds;
     }
 
-    public String getLogFilePath(long fileId) {
+    private String getLogFilePath(long fileId) {
         return logDir + File.separator + logFilePrefix + "_" + fileId;
     }
 
-    public long getLogFileOffset(long lsn) {
+    private long getLogFileOffset(long lsn) {
         return lsn % logFileSize;
     }
 
@@ -500,28 +515,37 @@
         return (new File(path)).mkdir();
     }
 
-    private FileChannel getFileChannel(long lsn, boolean create) {
-        FileChannel newFileChannel = null;
-        try {
-            long fileId = getLogFileId(lsn);
-            String logFilePath = getLogFilePath(fileId);
-            File file = new File(logFilePath);
-            if (create) {
-                if (!file.createNewFile()) {
-                    throw new IllegalStateException();
-                }
-            } else {
-                if (!file.exists()) {
-                    throw new IllegalStateException();
-                }
-            }
-            RandomAccessFile raf = new RandomAccessFile(new File(logFilePath), "rw");
-            newFileChannel = raf.getChannel();
-            newFileChannel.position(getLogFileOffset(lsn));
-        } catch (IOException e) {
-            throw new IllegalStateException(e);
+    private void createNextLogFile() throws IOException {
+        final long nextFileBeginLsn = getNextFileFirstLsn();
+        final long fileId = getLogFileId(nextFileBeginLsn);
+        final Path nextFilePath = Paths.get(getLogFilePath(fileId));
+        if (nextFilePath.toFile().exists()) {
+            LOGGER.warn("Ignored create log file {} since file already exists", nextFilePath.toString());
+            return;
         }
-        return newFileChannel;
+        Files.createFile(nextFilePath);
+    }
+
+    private void setLogPosition(long lsn) throws IOException {
+        final long fileId = getLogFileId(lsn);
+        final Path targetFilePath = Paths.get(getLogFilePath(fileId));
+        final long targetPosition = getLogFileOffset(lsn);
+        final RandomAccessFile raf = new RandomAccessFile(targetFilePath.toFile(), "rw"); // NOSONAR closed when full
+        appendChannel = raf.getChannel();
+        appendChannel.position(targetPosition);
+        currentLogFileId = fileId;
+    }
+
+    private void closeCurrentLogFile() {
+        if (appendChannel != null && appendChannel.isOpen()) {
+            try {
+                LOGGER.info("closing current log file with id({})", currentLogFileId);
+                appendChannel.close();
+            } catch (IOException e) {
+                LOGGER.error(() -> "failed to close log file with id(" + currentLogFileId + ")", e);
+                throw new ACIDException(e);
+            }
+        }
     }
 
     @Override
@@ -545,14 +569,6 @@
     }
 
     @Override
-    public void renewLogFilesAndStartFromLSN(long LSNtoStartFrom) throws IOException {
-        terminateLogFlusher();
-        deleteAllLogFiles();
-        long newLogFile = getLogFileId(LSNtoStartFrom);
-        initializeLogManager(newLogFile + 1);
-    }
-
-    @Override
     public void setReplicationManager(IReplicationManager replicationManager) {
         throw new IllegalStateException("This log manager does not support replication");
     }
@@ -580,7 +596,7 @@
     @Override
     public void closeLogFile(TxnLogFile logFileRef, FileChannel fileChannel) throws IOException {
         if (!fileChannel.isOpen()) {
-            throw new IllegalStateException("File channel is not open");
+            LOGGER.warn(() -> "Closing log file with id(" + logFileRef.getLogFileId() + ") with a closed channel.");
         }
         fileChannel.close();
         untouchLogFile(logFileRef.getLogFileId());
@@ -613,20 +629,20 @@
 
     /**
      * This class is used to log FLUSH logs.
-     * FLUSH logs are flushed on a different thread to avoid a possible deadlock in LogBuffer batchUnlock which calls PrimaryIndexOpeartionTracker.completeOperation
-     * The deadlock happens when PrimaryIndexOpeartionTracker.completeOperation results in generating a FLUSH log and there are no empty log buffers available to log it.
+     * FLUSH logs are flushed on a different thread to avoid a possible deadlock in {@link LogBuffer} batchUnlock
+     * which calls {@link org.apache.asterix.common.context.PrimaryIndexOperationTracker} completeOperation. The
+     * deadlock happens when completeOperation generates a FLUSH log and there are no empty log buffers available
+     * to log it.
      */
-    private class FlushLogsLogger extends Thread {
+    private class FlushLogsLogger implements Runnable {
         @Override
         public void run() {
-            while (true) {
+            while (!Thread.currentThread().isInterrupted()) {
                 try {
-                    ILogRecord logRecord = flushLogsQ.take();
+                    final ILogRecord logRecord = flushLogsQ.take();
                     appendToLogTail(logRecord);
-                } catch (ACIDException e) {
-                    e.printStackTrace();
                 } catch (InterruptedException e) {
-                    //ignore
+                    Thread.currentThread().interrupt();
                 }
             }
         }
@@ -634,7 +650,7 @@
 }
 
 class LogFlusher implements Callable<Boolean> {
-    private static final Logger LOGGER = Logger.getLogger(LogFlusher.class.getName());
+    private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
     private static final ILogBuffer POISON_PILL = new LogBuffer(null, ILogRecord.JOB_TERMINATE_LOG_SIZE, null);
     private final LogManager logMgr;//for debugging
     private final LinkedBlockingQueue<ILogBuffer> emptyQ;
@@ -655,7 +671,7 @@
 
     public void terminate() {
         // make sure the LogFlusher thread started before terminating it.
-        InterruptUtil.doUninterruptibly(started::acquire);
+        InvokeUtil.doUninterruptibly(started::acquire);
 
         stopping = true;
 
@@ -665,17 +681,17 @@
             currentFlushPage.stop();
         }
         // finally we put a POISON_PILL onto the flushQ to indicate to the flusher it is time to exit
-        InterruptUtil.doUninterruptibly(() -> flushQ.put(POISON_PILL));
+        InvokeUtil.doUninterruptibly(() -> flushQ.put(POISON_PILL));
     }
 
     @Override
-    public Boolean call() throws InterruptedException {
+    public Boolean call() {
         started.release();
         boolean interrupted = false;
         try {
             while (true) {
                 flushPage = null;
-                interrupted = InterruptUtil.doUninterruptiblyGet(() -> flushPage = flushQ.take()) || interrupted;
+                interrupted = InvokeUtil.doUninterruptiblyGet(() -> flushPage = flushQ.take()) || interrupted;
                 if (flushPage == POISON_PILL) {
                     return true;
                 }
@@ -685,7 +701,7 @@
                 emptyQ.add(flushPage.getLogPageSize() == logMgr.getLogPageSize() ? flushPage : stashQ.remove());
             }
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "LogFlusher is terminating abnormally. System is in unusable state.", e);
+            LOGGER.log(Level.ERROR, "LogFlusher is terminating abnormally. System is in unusable state.", e);
             throw e;
         } finally {
             if (interrupted) {
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManagerWithReplication.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManagerWithReplication.java
index dd8fb6e..0bb8293 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManagerWithReplication.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogManagerWithReplication.java
@@ -25,25 +25,23 @@
 import org.apache.asterix.common.replication.IReplicationManager;
 import org.apache.asterix.common.replication.IReplicationStrategy;
 import org.apache.asterix.common.transactions.ILogRecord;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
 import org.apache.asterix.common.transactions.LogSource;
 import org.apache.asterix.common.transactions.LogType;
+import org.apache.hyracks.util.InvokeUtil;
 
 public class LogManagerWithReplication extends LogManager {
 
     private IReplicationManager replicationManager;
-    private final IReplicationStrategy replicationStrategy;
-    private final Set<Integer> replicatedJob = ConcurrentHashMap.newKeySet();
+    private IReplicationStrategy replicationStrategy;
+    private final Set<Long> replicatedTxn = ConcurrentHashMap.newKeySet();
 
-    public LogManagerWithReplication(ITransactionSubsystem txnSubsystem, IReplicationStrategy replicationStrategy) {
+    public LogManagerWithReplication(ITransactionSubsystem txnSubsystem) {
         super(txnSubsystem);
-        this.replicationStrategy = replicationStrategy;
     }
 
     @Override
-    public void log(ILogRecord logRecord) throws ACIDException {
+    public void log(ILogRecord logRecord) {
         boolean shouldReplicate = logRecord.getLogSource() == LogSource.LOCAL && logRecord.getLogType() != LogType.WAIT;
         if (shouldReplicate) {
             switch (logRecord.getLogType()) {
@@ -51,23 +49,23 @@
                 case LogType.UPDATE:
                 case LogType.FLUSH:
                     shouldReplicate = replicationStrategy.isMatch(logRecord.getDatasetId());
-                    if (shouldReplicate && !replicatedJob.contains(logRecord.getJobId())) {
-                        replicatedJob.add(logRecord.getJobId());
+                    if (shouldReplicate && !replicatedTxn.contains(logRecord.getTxnId())) {
+                        replicatedTxn.add(logRecord.getTxnId());
                     }
                     break;
                 case LogType.JOB_COMMIT:
                 case LogType.ABORT:
-                    shouldReplicate = replicatedJob.remove(logRecord.getJobId());
+                    shouldReplicate = replicatedTxn.remove(logRecord.getTxnId());
                     break;
                 default:
                     shouldReplicate = false;
             }
         }
-        logRecord.setReplicated(shouldReplicate);
+        logRecord.setReplicate(shouldReplicate);
 
         //Remote flush logs do not need to be flushed separately since they may not trigger local flush
         if (logRecord.getLogType() == LogType.FLUSH && logRecord.getLogSource() == LogSource.LOCAL) {
-            flushLogsQ.offer(logRecord);
+            flushLogsQ.add(logRecord);
             return;
         }
 
@@ -75,75 +73,39 @@
     }
 
     @Override
-    protected void appendToLogTail(ILogRecord logRecord) throws ACIDException {
+    protected void appendToLogTail(ILogRecord logRecord) {
         syncAppendToLogTail(logRecord);
 
-        if (logRecord.isReplicated()) {
+        if (logRecord.isReplicate()) {
             try {
-                replicationManager.replicateLog(logRecord);
+                replicationManager.replicate(logRecord);
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
+                throw new ACIDException(e);
             }
         }
 
-        if (logRecord.getLogSource() == LogSource.LOCAL) {
-            if ((logRecord.getLogType() == LogType.JOB_COMMIT || logRecord.getLogType() == LogType.ABORT
-                    || logRecord.getLogType() == LogType.WAIT) && !logRecord.isFlushed()) {
+        if (logRecord.getLogSource() == LogSource.LOCAL && waitForFlush(logRecord) && !logRecord.isFlushed()) {
+            InvokeUtil.doUninterruptibly(() -> {
                 synchronized (logRecord) {
                     while (!logRecord.isFlushed()) {
-                        try {
-                            logRecord.wait();
-                        } catch (InterruptedException e) {
-                            Thread.currentThread().interrupt();
-                        }
+                        logRecord.wait();
                     }
-
                     //wait for job Commit/Abort ACK from replicas
-                    if (logRecord.isReplicated() && (logRecord.getLogType() == LogType.JOB_COMMIT
+                    if (logRecord.isReplicate() && (logRecord.getLogType() == LogType.JOB_COMMIT
                             || logRecord.getLogType() == LogType.ABORT)) {
-                        while (!replicationManager.hasBeenReplicated(logRecord)) {
-                            try {
-                                logRecord.wait();
-                            } catch (InterruptedException e) {
-                                Thread.currentThread().interrupt();
-                            }
+                        while (!logRecord.isReplicated()) {
+                            logRecord.wait();
                         }
                     }
                 }
-            }
+            });
         }
     }
 
     @Override
-    protected synchronized void syncAppendToLogTail(ILogRecord logRecord) throws ACIDException {
-        if (logRecord.getLogSource() == LogSource.LOCAL && logRecord.getLogType() != LogType.FLUSH) {
-            ITransactionContext txnCtx = logRecord.getTxnCtx();
-            if (txnCtx.getTxnState() == ITransactionManager.ABORTED && logRecord.getLogType() != LogType.ABORT) {
-                throw new ACIDException(
-                        "Aborted job(" + txnCtx.getJobId() + ") tried to write non-abort type log record.");
-            }
-        }
-
-        final int logRecordSize = logRecord.getLogSize();
-        // Make sure the log will not exceed the log file size
-        if (getLogFileOffset(appendLSN.get()) + logRecordSize >= logFileSize) {
-            prepareNextLogFile();
-            prepareNextPage(logRecordSize);
-        } else if (!appendPage.hasSpace(logRecordSize)) {
-            prepareNextPage(logRecordSize);
-        }
-        appendPage.append(logRecord, appendLSN.get());
-
-        if (logRecord.getLogType() == LogType.FLUSH) {
-            logRecord.setLSN(appendLSN.get());
-        }
-
-        appendLSN.addAndGet(logRecordSize);
-    }
-
-    @Override
     public void setReplicationManager(IReplicationManager replicationManager) {
         this.replicationManager = replicationManager;
+        this.replicationStrategy = replicationManager.getReplicationStrategy();
     }
-
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
index 148aa7e..8290e94 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/logging/LogReader.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.ILogManager;
@@ -30,15 +29,14 @@
 import org.apache.asterix.common.transactions.LogRecord;
 import org.apache.asterix.common.transactions.MutableLong;
 import org.apache.asterix.common.transactions.TxnLogFile;
+import org.apache.hyracks.util.annotations.NotThreadSafe;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
-/**
- * NOTE: Many method calls of this class are not thread safe.
- * Be very cautious using it in a multithreaded context.
- */
+@NotThreadSafe
 public class LogReader implements ILogReader {
 
-    public static final boolean IS_DEBUG_MODE = false;//true
-    private static final Logger LOGGER = Logger.getLogger(LogReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ILogManager logMgr;
     private final long logFileSize;
     private final int logPageSize;
@@ -54,7 +52,7 @@
     private enum ReturnState {
         FLUSH,
         EOF
-    };
+    }
 
     public LogReader(ILogManager logMgr, long logFileSize, int logPageSize, MutableLong flushLSN,
             boolean isRecoveryMode) {
@@ -68,8 +66,8 @@
     }
 
     @Override
-    public void initializeScan(long beginLSN) throws ACIDException {
-        readLSN = beginLSN;
+    public void setPosition(long lsn) {
+        readLSN = lsn;
         if (waitForFlushOrReturnIfEOF() == ReturnState.EOF) {
             return;
         }
@@ -84,14 +82,14 @@
      * @throws ACIDException
      */
     @Override
-    public ILogRecord next() throws ACIDException {
+    public ILogRecord next() {
         if (waitForFlushOrReturnIfEOF() == ReturnState.EOF) {
             return null;
         }
         if (readBuffer.position() == readBuffer.limit()) {
             boolean hasRemaining = refillLogReadBuffer();
             if (!hasRemaining && isRecoveryMode && readLSN < flushLSN.get()) {
-                LOGGER.severe("Transaction log ends before expected. Log files may be missing.");
+                LOGGER.error("Transaction log ends before expected. Log files may be missing.");
                 return null;
             }
         }
@@ -122,7 +120,7 @@
                     continue;
                 }
                 case BAD_CHKSUM: {
-                    LOGGER.severe(
+                    LOGGER.error(
                             "Transaction log contains corrupt log records (perhaps due to medium error). Stopping recovery early.");
                     return null;
                 }
@@ -147,13 +145,10 @@
                     return ReturnState.EOF;
                 }
                 try {
-                    if (IS_DEBUG_MODE) {
-                        LOGGER.info(
-                                "waitForFlushOrReturnIfEOF()| flushLSN: " + flushLSN.get() + ", readLSN: " + readLSN);
-                    }
                     flushLSN.wait();
                 } catch (InterruptedException e) {
-                    //ignore
+                    Thread.currentThread().interrupt();
+                    throw new ACIDException(e);
                 }
             }
             return ReturnState.FLUSH;
@@ -166,10 +161,9 @@
      * @return true if log continues, false if EOF
      * @throws ACIDException
      */
-    private boolean refillLogReadBuffer() throws ACIDException {
+    private boolean refillLogReadBuffer() {
         try {
             if (readLSN % logFileSize == logFile.size()) {
-                logFile.close();
                 readLSN += logFileSize - (readLSN % logFileSize);
                 getLogFile();
             }
@@ -183,14 +177,12 @@
      * Fills the log buffer with data from the log file at the current position
      *
      * @return false if EOF, true otherwise
-     * @throws ACIDException
      */
-
-    private boolean fillLogReadBuffer() throws ACIDException {
+    private boolean fillLogReadBuffer() {
         return fillLogReadBuffer(logPageSize, readBuffer);
     }
 
-    private boolean fillLogReadBuffer(int readSize, ByteBuffer readBuffer) throws ACIDException {
+    private boolean fillLogReadBuffer(int readSize, ByteBuffer readBuffer) {
         int size = 0;
         int read = 0;
         readBuffer.position(0);
@@ -217,10 +209,9 @@
         return true;
     }
 
-    //for random reading
     @Override
-    public ILogRecord read(long LSN) throws ACIDException {
-        readLSN = LSN;
+    public ILogRecord read(long lsn) {
+        readLSN = lsn;
         //wait for the log to be flushed if needed before trying to read it.
         synchronized (flushLSN) {
             while (readLSN >= flushLSN.get()) {
@@ -232,15 +223,10 @@
             }
         }
         try {
-            if (logFile == null) {
+            if (logFile == null || readLSN < fileBeginLSN || readLSN >= fileBeginLSN + logFile.size()) {
                 //get the log file which contains readLSN
                 getLogFile();
                 fillLogReadBuffer();
-            } else if (readLSN < fileBeginLSN || readLSN >= fileBeginLSN + logFile.size()) {
-                //log is not in the current log file
-                logFile.close();
-                getLogFile();
-                fillLogReadBuffer();
             } else if (readLSN < bufferBeginLSN || readLSN >= bufferBeginLSN + readBuffer.limit()) {
                 //log is not in the current read buffer
                 fillLogReadBuffer();
@@ -265,7 +251,7 @@
                 case TRUNCATED: {
                     if (!fillLogReadBuffer()) {
                         throw new IllegalStateException(
-                                "Could not read LSN(" + LSN + ") from log file id " + logFile.getLogFileId());
+                                "Could not read LSN(" + lsn + ") from log file id " + logFile.getLogFileId());
                     }
                     //now read the complete log record
                     continue;
@@ -285,8 +271,10 @@
         return logRecord;
     }
 
-    private void getLogFile() throws ACIDException {
+    private void getLogFile() {
         try {
+            // close existing file (if any) before opening another one
+            close();
             logFile = logMgr.getLogFile(readLSN);
             fileBeginLSN = logFile.getFileBeginLSN();
         } catch (IOException e) {
@@ -295,10 +283,11 @@
     }
 
     @Override
-    public void close() throws ACIDException {
+    public void close() {
         try {
             if (logFile != null) {
                 logFile.close();
+                logFile = null;
             }
         } catch (IOException e) {
             throw new ACIDException(e);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
index 36a91dc..f8ab952 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/AbstractCheckpointManager.java
@@ -31,8 +31,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.exceptions.ACIDException;
 import org.apache.asterix.common.transactions.Checkpoint;
@@ -43,6 +41,9 @@
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
 import org.apache.asterix.common.utils.StorageConstants;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * An abstract implementation of {@link ICheckpointManager}.
@@ -51,7 +52,7 @@
  */
 public abstract class AbstractCheckpointManager implements ICheckpointManager {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractCheckpointManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final String CHECKPOINT_FILENAME_PREFIX = "checkpoint_";
     public static final long SHARP_CHECKPOINT_LSN = -1;
     private static final FilenameFilter filter = (File dir, String name) -> name.startsWith(CHECKPOINT_FILENAME_PREFIX);
@@ -65,7 +66,7 @@
     public AbstractCheckpointManager(ITransactionSubsystem txnSubsystem, CheckpointProperties checkpointProperties) {
         this.txnSubsystem = txnSubsystem;
         String checkpointDirPath = checkpointProperties.getCheckpointDirPath();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO, "Checkpoint directory = " + checkpointDirPath);
         }
         if (!checkpointDirPath.endsWith(File.separator)) {
@@ -74,7 +75,7 @@
         checkpointDir = new File(checkpointDirPath);
         // Create the checkpoint directory if missing
         if (!checkpointDir.exists()) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.log(Level.INFO, "Checkpoint directory " + checkpointDirPath + " didn't exist. Creating one");
             }
             checkpointDir.mkdirs();
@@ -91,38 +92,37 @@
         LOGGER.log(Level.INFO, "Getting latest checkpoint");
         File[] checkpoints = checkpointDir.listFiles(filter);
         if (checkpoints == null || checkpoints.length == 0) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.log(Level.INFO,
                         "Listing of files in the checkpoint dir returned " + (checkpoints == null ? "null" : "empty"));
             }
             return null;
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO, "Listing of files in the checkpoint dir returned " + Arrays.toString(checkpoints));
         }
         List<Checkpoint> checkpointObjectList = new ArrayList<>();
         for (File file : checkpoints) {
             try {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Reading checkpoint file: " + file.getAbsolutePath());
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, "Reading checkpoint file: " + file.getAbsolutePath());
                 }
                 String jsonString = new String(Files.readAllBytes(Paths.get(file.getAbsolutePath())));
                 checkpointObjectList.add(Checkpoint.fromJson(jsonString));
             } catch (ClosedByInterruptException e) {
                 Thread.currentThread().interrupt();
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Interrupted while reading checkpoint file: " + file.getAbsolutePath(),
-                            e);
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, "Interrupted while reading checkpoint file: " + file.getAbsolutePath(), e);
                 }
                 throw new ACIDException(e);
             } catch (IOException e) {
                 // ignore corrupted checkpoint file
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Failed to read checkpoint file: " + file.getAbsolutePath(), e);
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, "Failed to read checkpoint file: " + file.getAbsolutePath(), e);
                 }
                 file.delete();
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.log(Level.WARNING, "Deleted corrupted checkpoint file: " + file.getAbsolutePath());
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.log(Level.WARN, "Deleted corrupted checkpoint file: " + file.getAbsolutePath());
                 }
             }
         }
@@ -132,7 +132,7 @@
          * This shouldn't happen unless a hardware corruption happens.
          */
         if (checkpointObjectList.isEmpty()) {
-            LOGGER.severe("All checkpoint files are corrupted. Forcing recovery from the beginning of the log");
+            LOGGER.error("All checkpoint files are corrupted. Forcing recovery from the beginning of the log");
             checkpointObjectList.add(forgeForceRecoveryCheckpoint());
         }
 
@@ -174,7 +174,7 @@
     protected void capture(long minMCTFirstLSN, boolean sharp) throws HyracksDataException {
         ILogManager logMgr = txnSubsystem.getLogManager();
         ITransactionManager txnMgr = txnSubsystem.getTransactionManager();
-        Checkpoint checkpointObject = new Checkpoint(logMgr.getAppendLSN(), minMCTFirstLSN, txnMgr.getMaxJobId(),
+        Checkpoint checkpointObject = new Checkpoint(logMgr.getAppendLSN(), minMCTFirstLSN, txnMgr.getMaxTxnId(),
                 System.currentTimeMillis(), sharp, StorageConstants.VERSION);
         persist(checkpointObject);
         cleanup();
@@ -195,7 +195,7 @@
         // Get checkpoint file path
         Path path = getCheckpointPath(checkpoint.getTimeStamp());
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             File file = path.toFile();
             LOGGER.log(Level.INFO, "Persisting checkpoint file to " + file + " which "
                     + (file.exists() ? "already exists" : "doesn't exist yet"));
@@ -205,10 +205,10 @@
             writer.write(checkpoint.asJson());
             writer.flush();
         } catch (IOException e) {
-            LOGGER.log(Level.SEVERE, "Failed to write checkpoint to disk", e);
+            LOGGER.log(Level.ERROR, "Failed to write checkpoint to disk", e);
             throw HyracksDataException.create(e);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             File file = path.toFile();
             LOGGER.log(Level.INFO, "Completed persisting checkpoint file to " + file + " which now "
                     + (file.exists() ? "exists" : " still doesn't exist"));
@@ -220,13 +220,11 @@
         // Sort the filenames lexicographically to keep the latest checkpoint history files.
         Arrays.sort(checkpointFiles);
         for (int i = 0; i < checkpointFiles.length - historyToKeep; i++) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Deleting checkpoint file at: " + checkpointFiles[i].getAbsolutePath());
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Deleting checkpoint file at: " + checkpointFiles[i].getAbsolutePath());
             }
-            if (!checkpointFiles[i].delete()) {
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Could not delete checkpoint file at: " + checkpointFiles[i].getAbsolutePath());
-                }
+            if (!checkpointFiles[i].delete() && LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Could not delete checkpoint file at: " + checkpointFiles[i].getAbsolutePath());
             }
         }
     }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManager.java
index ea711a5..a541bd9 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManager.java
@@ -18,13 +18,13 @@
  */
 package org.apache.asterix.transaction.management.service.recovery;
 
-import java.util.logging.Logger;
-
 import org.apache.asterix.common.api.IDatasetLifecycleManager;
 import org.apache.asterix.common.transactions.CheckpointProperties;
 import org.apache.asterix.common.transactions.ICheckpointManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * An implementation of {@link ICheckpointManager} that defines the logic
@@ -32,7 +32,7 @@
  */
 public class CheckpointManager extends AbstractCheckpointManager {
 
-    private static final Logger LOGGER = Logger.getLogger(CheckpointManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public CheckpointManager(ITransactionSubsystem txnSubsystem, CheckpointProperties checkpointProperties) {
         super(txnSubsystem, checkpointProperties);
@@ -45,8 +45,8 @@
     @Override
     public synchronized void doSharpCheckpoint() throws HyracksDataException {
         LOGGER.info("Starting sharp checkpoint...");
-        final IDatasetLifecycleManager datasetLifecycleManager = txnSubsystem.getAsterixAppRuntimeContextProvider()
-                .getDatasetLifecycleManager();
+        final IDatasetLifecycleManager datasetLifecycleManager =
+                txnSubsystem.getApplicationContext().getDatasetLifecycleManager();
         datasetLifecycleManager.flushAllDatasets();
         capture(SHARP_CHECKPOINT_LSN, true);
         txnSubsystem.getLogManager().renewLogFiles();
@@ -66,8 +66,8 @@
         boolean checkpointSucceeded = minFirstLSN >= checkpointTargetLSN;
         if (!checkpointSucceeded) {
             // Flush datasets with indexes behind target checkpoint LSN
-            IDatasetLifecycleManager datasetLifecycleManager = txnSubsystem.getAsterixAppRuntimeContextProvider()
-                    .getDatasetLifecycleManager();
+            IDatasetLifecycleManager datasetLifecycleManager =
+                    txnSubsystem.getApplicationContext().getDatasetLifecycleManager();
             datasetLifecycleManager.scheduleAsyncFlushForLaggingDatasets(checkpointTargetLSN);
         }
         capture(minFirstLSN, false);
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManagerFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManagerFactory.java
index 68c5ce1..ca7d37a 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManagerFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointManagerFactory.java
@@ -29,11 +29,7 @@
     }
 
     public static ICheckpointManager create(ITransactionSubsystem txnSubsystem,
-            CheckpointProperties checkpointProperties, boolean replicationEnabled) {
-        if (!replicationEnabled) {
-            return new CheckpointManager(txnSubsystem, checkpointProperties);
-        } else {
-            return new ReplicationCheckpointManager(txnSubsystem, checkpointProperties);
-        }
+            CheckpointProperties checkpointProperties) {
+        return new CheckpointManager(txnSubsystem, checkpointProperties);
     }
 }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointThread.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointThread.java
index 5de76d3..1992057 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointThread.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/CheckpointThread.java
@@ -18,12 +18,12 @@
  */
 package org.apache.asterix.transaction.management.service.recovery;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.asterix.common.transactions.ICheckpointManager;
 import org.apache.asterix.common.transactions.ILogManager;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A daemon thread that periodically attempts to perform checkpoints.
@@ -32,7 +32,7 @@
  */
 public class CheckpointThread extends Thread {
 
-    private static final Logger LOGGER = Logger.getLogger(CheckpointThread.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private long lsnThreshold;
     private long checkpointTermInSecs;
 
@@ -71,7 +71,7 @@
                     //last checkpoint LSN is considered as the min LSN of the current log partition
                     lastCheckpointLSN = logManager.getReadableSmallestLSN();
                 } catch (Exception e) {
-                    LOGGER.log(Level.WARNING, "Error getting smallest readable LSN", e);
+                    LOGGER.log(Level.WARN, "Error getting smallest readable LSN", e);
                     lastCheckpointLSN = 0;
                 }
             }
@@ -95,7 +95,7 @@
                         lastCheckpointLSN = currentCheckpointAttemptMinLSN;
                     }
                 } catch (HyracksDataException e) {
-                    LOGGER.log(Level.SEVERE, "Error during checkpoint", e);
+                    LOGGER.log(Level.ERROR, "Error during checkpoint", e);
                 }
             }
         }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/ReplicationCheckpointManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/ReplicationCheckpointManager.java
deleted file mode 100644
index 6ce543b..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/ReplicationCheckpointManager.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.recovery;
-
-import java.io.IOException;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.logging.Logger;
-
-import org.apache.asterix.common.api.IApplicationContext;
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.cluster.ClusterPartition;
-import org.apache.asterix.common.config.MetadataProperties;
-import org.apache.asterix.common.replication.IReplicaResourcesManager;
-import org.apache.asterix.common.replication.IReplicationManager;
-import org.apache.asterix.common.transactions.CheckpointProperties;
-import org.apache.asterix.common.transactions.ICheckpointManager;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.transaction.management.resource.PersistentLocalResourceRepository;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-
-/**
- * An implementation of {@link ICheckpointManager} that defines the logic
- * of checkpoints when replication is enabled..
- */
-public class ReplicationCheckpointManager extends AbstractCheckpointManager {
-
-    private static final Logger LOGGER = Logger.getLogger(ReplicationCheckpointManager.class.getName());
-
-    public ReplicationCheckpointManager(ITransactionSubsystem txnSubsystem, CheckpointProperties checkpointProperties) {
-        super(txnSubsystem, checkpointProperties);
-    }
-
-    /**
-     * Performs a sharp checkpoint. All datasets are flushed and all transaction
-     * log files are deleted except the files that are needed for dead replicas.
-     */
-    @Override
-    public synchronized void doSharpCheckpoint() throws HyracksDataException {
-        LOGGER.info("Starting sharp checkpoint...");
-        final IDatasetLifecycleManager datasetLifecycleManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
-        datasetLifecycleManager.flushAllDatasets();
-        long minFirstLSN;
-        // If shutting down, need to check if we need to keep any remote logs for dead replicas
-        if (txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext().isShuttingdown()) {
-            final Set<String> deadReplicaIds = txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext()
-                    .getReplicationManager().getDeadReplicasIds();
-            if (deadReplicaIds.isEmpty()) {
-                // No dead replicas => no need to keep any log
-                minFirstLSN = SHARP_CHECKPOINT_LSN;
-            } else {
-                // Get min LSN of dead replicas remote resources
-                minFirstLSN = getDeadReplicasMinFirstLSN(deadReplicaIds);
-            }
-        } else {
-            // Start up complete checkpoint. Avoid deleting remote recovery logs.
-            minFirstLSN = txnSubsystem.getRecoveryManager().getMinFirstLSN();
-        }
-        capture(minFirstLSN, true);
-        if (minFirstLSN == SHARP_CHECKPOINT_LSN) {
-            // No need to keep any logs
-            txnSubsystem.getLogManager().renewLogFiles();
-        } else {
-            // Delete only log files with LSNs < any dead replica partition minimum LSN
-            txnSubsystem.getLogManager().deleteOldLogFiles(minFirstLSN);
-        }
-        LOGGER.info("Completed sharp checkpoint.");
-    }
-
-    /***
-     * Attempts to perform a soft checkpoint at the specified {@code checkpointTargetLSN}.
-     * If a checkpoint cannot be captured due to datasets having LSN < {@code checkpointTargetLSN},
-     * an asynchronous flush is triggered on them. If the checkpoint fails due to a replica index,
-     * a request is sent to the primary replica of the index to flush it.
-     * When a checkpoint is successful, all transaction log files that end with
-     * LSN < {@code checkpointTargetLSN} are deleted.
-     */
-    @Override
-    public synchronized long tryCheckpoint(long checkpointTargetLSN) throws HyracksDataException {
-        LOGGER.info("Attemping soft checkpoint...");
-        final long minFirstLSN = txnSubsystem.getRecoveryManager().getMinFirstLSN();
-        boolean checkpointSucceeded = minFirstLSN >= checkpointTargetLSN;
-        if (!checkpointSucceeded) {
-            // Flush datasets with indexes behind target checkpoint LSN
-            final IDatasetLifecycleManager datasetLifecycleManager =
-                    txnSubsystem.getAsterixAppRuntimeContextProvider().getDatasetLifecycleManager();
-            datasetLifecycleManager.scheduleAsyncFlushForLaggingDatasets(checkpointTargetLSN);
-            // Request remote replicas to flush lagging indexes
-            final IReplicationManager replicationManager =
-                    txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext().getReplicationManager();
-            try {
-                replicationManager.requestFlushLaggingReplicaIndexes(checkpointTargetLSN);
-            } catch (IOException e) {
-                throw new HyracksDataException(e);
-            }
-        }
-        capture(minFirstLSN, false);
-        if (checkpointSucceeded) {
-            txnSubsystem.getLogManager().deleteOldLogFiles(minFirstLSN);
-            LOGGER.info(String.format("soft checkpoint succeeded with at LSN(%s)", minFirstLSN));
-        }
-        return minFirstLSN;
-    }
-
-    private long getDeadReplicasMinFirstLSN(Set<String> deadReplicaIds) {
-        final IReplicaResourcesManager remoteResourcesManager =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext().getReplicaResourcesManager();
-        final IApplicationContext propertiesProvider =
-                txnSubsystem.getAsterixAppRuntimeContextProvider().getAppContext();
-        final MetadataProperties metadataProperties = propertiesProvider.getMetadataProperties();
-        final PersistentLocalResourceRepository localResourceRepository =
-                (PersistentLocalResourceRepository) txnSubsystem.getAsterixAppRuntimeContextProvider()
-                        .getLocalResourceRepository();
-        // Get partitions of the dead replicas that are not active on this node
-        final Set<Integer> deadReplicasPartitions = new HashSet<>();
-        for (String deadReplicaId : deadReplicaIds) {
-            final ClusterPartition[] nodePartitons = metadataProperties.getNodePartitions().get(deadReplicaId);
-            for (ClusterPartition partition : nodePartitons) {
-                if (!localResourceRepository.getActivePartitions().contains(partition.getPartitionId())) {
-                    deadReplicasPartitions.add(partition.getPartitionId());
-                }
-            }
-        }
-        return remoteResourcesManager.getPartitionsMinLSN(deadReplicasPartitions);
-    }
-}
\ No newline at end of file
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnEntityId.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnEntityId.java
new file mode 100644
index 0000000..af74b13
--- /dev/null
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnEntityId.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.transaction.management.service.recovery;
+
+import java.nio.ByteBuffer;
+
+import org.apache.asterix.common.transactions.ILogRecord;
+import org.apache.asterix.common.transactions.LogRecord;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+
+public class TxnEntityId {
+    public boolean isByteArrayPKValue;
+    public long txnId;
+    public int datasetId;
+    public int pkHashValue;
+    public int pkSize;
+    public byte[] byteArrayPKValue;
+    public ITupleReference tupleReferencePKValue;
+
+    public TxnEntityId(long txnId, int datasetId, int pkHashValue, ITupleReference pkValue, int pkSize,
+            boolean isByteArrayPKValue) {
+        this.txnId = txnId;
+        this.datasetId = datasetId;
+        this.pkHashValue = pkHashValue;
+        this.pkSize = pkSize;
+        this.isByteArrayPKValue = isByteArrayPKValue;
+        if (isByteArrayPKValue) {
+            this.byteArrayPKValue = new byte[pkSize];
+            readPKValueIntoByteArray(pkValue, pkSize, byteArrayPKValue);
+        } else {
+            this.tupleReferencePKValue = pkValue;
+        }
+    }
+
+    public TxnEntityId() {
+    }
+
+    private static void readPKValueIntoByteArray(ITupleReference pkValue, int pkSize, byte[] byteArrayPKValue) {
+        int readOffset = pkValue.getFieldStart(0);
+        byte[] readBuffer = pkValue.getFieldData(0);
+        for (int i = 0; i < pkSize; i++) {
+            byteArrayPKValue[i] = readBuffer[readOffset + i];
+        }
+    }
+
+    public void setTxnId(long txnId, int datasetId, int pkHashValue, ITupleReference pkValue, int pkSize) {
+        this.txnId = txnId;
+        this.datasetId = datasetId;
+        this.pkHashValue = pkHashValue;
+        this.tupleReferencePKValue = pkValue;
+        this.pkSize = pkSize;
+        this.isByteArrayPKValue = false;
+    }
+
+    @Override
+    public String toString() {
+        return "[" + txnId + "," + datasetId + "," + pkHashValue + "," + pkSize + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        return pkHashValue;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (!(o instanceof TxnEntityId)) {
+            return false;
+        }
+        TxnEntityId txnEntityId = (TxnEntityId) o;
+        return (txnEntityId.pkHashValue == pkHashValue && txnEntityId.datasetId == datasetId
+                && txnEntityId.txnId == txnId && pkSize == txnEntityId.pkSize && isEqualTo(txnEntityId));
+    }
+
+    private boolean isEqualTo(TxnEntityId txnEntityId) {
+        if (isByteArrayPKValue && txnEntityId.isByteArrayPKValue) {
+            return isEqual(byteArrayPKValue, txnEntityId.byteArrayPKValue, pkSize);
+        } else if (isByteArrayPKValue && (!txnEntityId.isByteArrayPKValue)) {
+            return isEqual(byteArrayPKValue, txnEntityId.tupleReferencePKValue, pkSize);
+        } else if ((!isByteArrayPKValue) && txnEntityId.isByteArrayPKValue) {
+            return isEqual(txnEntityId.byteArrayPKValue, tupleReferencePKValue, pkSize);
+        } else {
+            return isEqual(tupleReferencePKValue, txnEntityId.tupleReferencePKValue, pkSize);
+        }
+    }
+
+    private static boolean isEqual(byte[] a, byte[] b, int size) {
+        for (int i = 0; i < size; i++) {
+            if (a[i] != b[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean isEqual(byte[] a, ITupleReference b, int size) {
+        int readOffset = b.getFieldStart(0);
+        byte[] readBuffer = b.getFieldData(0);
+        for (int i = 0; i < size; i++) {
+            if (a[i] != readBuffer[readOffset + i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static boolean isEqual(ITupleReference a, ITupleReference b, int size) {
+        int aOffset = a.getFieldStart(0);
+        byte[] aBuffer = a.getFieldData(0);
+        int bOffset = b.getFieldStart(0);
+        byte[] bBuffer = b.getFieldData(0);
+        for (int i = 0; i < size; i++) {
+            if (aBuffer[aOffset + i] != bBuffer[bOffset + i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public void serialize(ByteBuffer buffer) {
+        buffer.putLong(txnId);
+        buffer.putInt(datasetId);
+        buffer.putInt(pkHashValue);
+        buffer.putInt(pkSize);
+        buffer.put((byte) (isByteArrayPKValue ? 1 : 0));
+        if (isByteArrayPKValue) {
+            buffer.put(byteArrayPKValue);
+        }
+    }
+
+    public static TxnEntityId deserialize(ByteBuffer buffer) {
+        TxnEntityId txnEntityId = new TxnEntityId();
+        txnEntityId.txnId = buffer.getLong();
+        txnEntityId.datasetId = buffer.getInt();
+        txnEntityId.pkHashValue = buffer.getInt();
+        txnEntityId.pkSize = buffer.getInt();
+        txnEntityId.isByteArrayPKValue = (buffer.get() == 1);
+        if (txnEntityId.isByteArrayPKValue) {
+            byte[] byteArrayPKValue = new byte[txnEntityId.pkSize];
+            buffer.get(byteArrayPKValue);
+            txnEntityId.byteArrayPKValue = byteArrayPKValue;
+        }
+        return txnEntityId;
+    }
+
+    public int getCurrentSize() {
+        //txn id, dataset id, pkHashValue, arraySize, isByteArrayPKValue
+        int size = TxnId.BYTES + ILogRecord.DS_LEN + LogRecord.PKHASH_LEN + LogRecord.PKSZ_LEN + Byte.BYTES;
+        //byte arraySize
+        if (isByteArrayPKValue && byteArrayPKValue != null) {
+            size += byteArrayPKValue.length;
+        }
+        return size;
+    }
+}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnId.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnId.java
deleted file mode 100644
index 9cb54af..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/recovery/TxnId.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.recovery;
-
-import java.nio.ByteBuffer;
-
-import org.apache.asterix.common.transactions.ILogRecord;
-import org.apache.asterix.common.transactions.JobId;
-import org.apache.asterix.common.transactions.LogRecord;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-
-public class TxnId {
-    public boolean isByteArrayPKValue;
-    public int jobId;
-    public int datasetId;
-    public int pkHashValue;
-    public int pkSize;
-    public byte[] byteArrayPKValue;
-    public ITupleReference tupleReferencePKValue;
-
-    public TxnId(int jobId, int datasetId, int pkHashValue, ITupleReference pkValue, int pkSize,
-            boolean isByteArrayPKValue) {
-        this.jobId = jobId;
-        this.datasetId = datasetId;
-        this.pkHashValue = pkHashValue;
-        this.pkSize = pkSize;
-        this.isByteArrayPKValue = isByteArrayPKValue;
-        if (isByteArrayPKValue) {
-            this.byteArrayPKValue = new byte[pkSize];
-            readPKValueIntoByteArray(pkValue, pkSize, byteArrayPKValue);
-        } else {
-            this.tupleReferencePKValue = pkValue;
-        }
-    }
-
-    public TxnId() {
-    }
-
-    private static void readPKValueIntoByteArray(ITupleReference pkValue, int pkSize, byte[] byteArrayPKValue) {
-        int readOffset = pkValue.getFieldStart(0);
-        byte[] readBuffer = pkValue.getFieldData(0);
-        for (int i = 0; i < pkSize; i++) {
-            byteArrayPKValue[i] = readBuffer[readOffset + i];
-        }
-    }
-
-    public void setTxnId(int jobId, int datasetId, int pkHashValue, ITupleReference pkValue, int pkSize) {
-        this.jobId = jobId;
-        this.datasetId = datasetId;
-        this.pkHashValue = pkHashValue;
-        this.tupleReferencePKValue = pkValue;
-        this.pkSize = pkSize;
-        this.isByteArrayPKValue = false;
-    }
-
-    @Override
-    public String toString() {
-        return "[" + jobId + "," + datasetId + "," + pkHashValue + "," + pkSize + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        return pkHashValue;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof TxnId)) {
-            return false;
-        }
-        TxnId txnId = (TxnId) o;
-        return (txnId.pkHashValue == pkHashValue && txnId.datasetId == datasetId && txnId.jobId == jobId
-                && pkSize == txnId.pkSize && isEqualTo(txnId));
-    }
-
-    private boolean isEqualTo(TxnId txnId) {
-        if (isByteArrayPKValue && txnId.isByteArrayPKValue) {
-            return isEqual(byteArrayPKValue, txnId.byteArrayPKValue, pkSize);
-        } else if (isByteArrayPKValue && (!txnId.isByteArrayPKValue)) {
-            return isEqual(byteArrayPKValue, txnId.tupleReferencePKValue, pkSize);
-        } else if ((!isByteArrayPKValue) && txnId.isByteArrayPKValue) {
-            return isEqual(txnId.byteArrayPKValue, tupleReferencePKValue, pkSize);
-        } else {
-            return isEqual(tupleReferencePKValue, txnId.tupleReferencePKValue, pkSize);
-        }
-    }
-
-    private static boolean isEqual(byte[] a, byte[] b, int size) {
-        for (int i = 0; i < size; i++) {
-            if (a[i] != b[i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private static boolean isEqual(byte[] a, ITupleReference b, int size) {
-        int readOffset = b.getFieldStart(0);
-        byte[] readBuffer = b.getFieldData(0);
-        for (int i = 0; i < size; i++) {
-            if (a[i] != readBuffer[readOffset + i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private static boolean isEqual(ITupleReference a, ITupleReference b, int size) {
-        int aOffset = a.getFieldStart(0);
-        byte[] aBuffer = a.getFieldData(0);
-        int bOffset = b.getFieldStart(0);
-        byte[] bBuffer = b.getFieldData(0);
-        for (int i = 0; i < size; i++) {
-            if (aBuffer[aOffset + i] != bBuffer[bOffset + i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public void serialize(ByteBuffer buffer) {
-        buffer.putInt(jobId);
-        buffer.putInt(datasetId);
-        buffer.putInt(pkHashValue);
-        buffer.putInt(pkSize);
-        buffer.put((byte) (isByteArrayPKValue ? 1 : 0));
-        if (isByteArrayPKValue) {
-            buffer.put(byteArrayPKValue);
-        }
-    }
-
-    public static TxnId deserialize(ByteBuffer buffer) {
-        TxnId txnId = new TxnId();
-        txnId.jobId = buffer.getInt();
-        txnId.datasetId = buffer.getInt();
-        txnId.pkHashValue = buffer.getInt();
-        txnId.pkSize = buffer.getInt();
-        txnId.isByteArrayPKValue = (buffer.get() == 1);
-        if (txnId.isByteArrayPKValue) {
-            byte[] byteArrayPKValue = new byte[txnId.pkSize];
-            buffer.get(byteArrayPKValue);
-            txnId.byteArrayPKValue = byteArrayPKValue;
-        }
-        return txnId;
-    }
-
-    public int getCurrentSize() {
-        //job id, dataset id, pkHashValue, arraySize, isByteArrayPKValue
-        int size = JobId.BYTES + ILogRecord.DS_LEN + LogRecord.PKHASH_LEN + LogRecord.PKSZ_LEN + Byte.BYTES;
-        //byte arraySize
-        if (isByteArrayPKValue && byteArrayPKValue != null) {
-            size += byteArrayPKValue.length;
-        }
-        return size;
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
new file mode 100644
index 0000000..b3d5e49
--- /dev/null
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AbstractTransactionContext.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.transaction.management.service.transaction;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.asterix.common.context.ITransactionOperationTracker;
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.ITransactionManager;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+
+@ThreadSafe
+public abstract class AbstractTransactionContext implements ITransactionContext {
+
+    protected final TxnId txnId;
+    protected final Map<Long, ITransactionOperationTracker> txnOpTrackers;
+    private final AtomicLong firstLSN;
+    private final AtomicLong lastLSN;
+    private final AtomicInteger txnState;
+    private final AtomicBoolean isWriteTxn;
+    private boolean isTimeout = false;
+
+    protected AbstractTransactionContext(TxnId txnId) {
+        this.txnId = txnId;
+        firstLSN = new AtomicLong(-1);
+        lastLSN = new AtomicLong(-1);
+        txnState = new AtomicInteger(ITransactionManager.ACTIVE);
+        isTimeout = false;
+        isWriteTxn = new AtomicBoolean();
+        txnOpTrackers = new HashMap<>();
+    }
+
+    @Override
+    public long getFirstLSN() {
+        return firstLSN.get();
+    }
+
+    @Override
+    public void setLastLSN(long newValue) {
+        firstLSN.compareAndSet(-1, newValue);
+        lastLSN.set(Math.max(lastLSN.get(), newValue));
+    }
+
+    @Override
+    public void setTxnState(int txnState) {
+        this.txnState.set(txnState);
+    }
+
+    @Override
+    public int getTxnState() {
+        return txnState.get();
+    }
+
+    @Override
+    public TxnId getTxnId() {
+        return txnId;
+    }
+
+    @Override
+    public synchronized void setTimeout(boolean isTimeout) {
+        this.isTimeout = isTimeout;
+    }
+
+    @Override
+    public synchronized boolean isTimeout() {
+        return isTimeout;
+    }
+
+    @Override
+    public void setWriteTxn(boolean isWriteTxn) {
+        this.isWriteTxn.set(isWriteTxn);
+    }
+
+    @Override
+    public boolean isWriteTxn() {
+        return isWriteTxn.get();
+    }
+
+    @Override
+    public long getLastLSN() {
+        return lastLSN.get();
+    }
+
+    @Override
+    public void complete() {
+        try {
+            if (txnState.get() == ITransactionManager.ABORTED) {
+                cleanupForAbort();
+            }
+        } finally {
+            synchronized (txnOpTrackers) {
+                txnOpTrackers.forEach((resource, opTracker) -> opTracker.afterTransaction(resource));
+            }
+        }
+    }
+
+    @Override
+    public void register(long resourceId, int partition, ILSMIndex index, IModificationOperationCallback callback,
+            boolean primaryIndex) {
+        synchronized (txnOpTrackers) {
+            if (!txnOpTrackers.containsKey(resourceId)) {
+                final ITransactionOperationTracker txnOpTracker =
+                        (ITransactionOperationTracker) index.getOperationTracker();
+                txnOpTrackers.put(resourceId, txnOpTracker);
+                txnOpTracker.beforeTransaction(resourceId);
+            }
+        }
+    }
+
+    public String prettyPrint() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("\n" + txnId + "\n");
+        sb.append("isWriteTxn: " + isWriteTxn + "\n");
+        sb.append("firstLSN: " + firstLSN.get() + "\n");
+        sb.append("lastLSN: " + lastLSN.get() + "\n");
+        sb.append("TransactionState: " + txnState + "\n");
+        sb.append("isTimeout: " + isTimeout + "\n");
+        return sb.toString();
+    }
+
+    protected abstract void cleanupForAbort();
+}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AtomicTransactionContext.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AtomicTransactionContext.java
new file mode 100644
index 0000000..219cf07
--- /dev/null
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/AtomicTransactionContext.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.transaction.management.service.transaction;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
+import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+
+@ThreadSafe
+public class AtomicTransactionContext extends AbstractTransactionContext {
+
+    private final Map<Long, ILSMOperationTracker> opTrackers = new HashMap<>();
+    private final Map<Long, AtomicInteger> indexPendingOps = new HashMap<>();
+    private final Map<Long, IModificationOperationCallback> callbacks = new HashMap<>();
+
+    public AtomicTransactionContext(TxnId txnId) {
+        super(txnId);
+    }
+
+    @Override
+    public void register(long resourceId, int partition, ILSMIndex index, IModificationOperationCallback callback,
+            boolean primaryIndex) {
+        super.register(resourceId, partition, index, callback, primaryIndex);
+        synchronized (txnOpTrackers) {
+            if (primaryIndex && !opTrackers.containsKey(resourceId)) {
+                opTrackers.put(resourceId, index.getOperationTracker());
+                callbacks.put(resourceId, callback);
+                indexPendingOps.put(resourceId, new AtomicInteger(0));
+            }
+        }
+    }
+
+    @Override
+    public void notifyUpdateCommitted(long resourceId) {
+        try {
+            opTrackers.get(resourceId).completeOperation(null, LSMOperationType.MODIFICATION, null,
+                    callbacks.get(resourceId));
+        } catch (HyracksDataException e) {
+            throw new ACIDException(e);
+        }
+    }
+
+    @Override
+    public void notifyEntityCommitted(int partition) {
+        throw new IllegalStateException("Unexpected entity commit in atomic transaction");
+    }
+
+    @Override
+    public void beforeOperation(long resourceId) {
+        indexPendingOps.get(resourceId).incrementAndGet();
+    }
+
+    @Override
+    public void afterOperation(long resourceId) {
+        indexPendingOps.get(resourceId).decrementAndGet();
+    }
+
+    @Override
+    public void cleanupForAbort() {
+        // each opTracker should be cleaned
+        opTrackers.forEach((resId, opTracker) -> ((PrimaryIndexOperationTracker) opTracker)
+                .cleanupNumActiveOperationsForAbortedJob(indexPendingOps.get(resId).get()));
+    }
+
+    @Override
+    public int hashCode() {
+        return Long.hashCode(txnId.getId());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        AtomicTransactionContext that = (AtomicTransactionContext) o;
+        return this.txnId.equals(that.txnId);
+    }
+}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/DatasetIdFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/DatasetIdFactory.java
index 7acefe9..ffc0268 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/DatasetIdFactory.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/DatasetIdFactory.java
@@ -20,6 +20,7 @@
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 
 public class DatasetIdFactory {
     private static int id = 0;
@@ -34,7 +35,7 @@
         isInitialized = true;
     }
 
-    public static synchronized int generateDatasetId() throws AsterixException {
+    public static synchronized int generateDatasetId() throws AlgebricksException {
         if (id == Integer.MAX_VALUE) {
             throw new AsterixException(ErrorCode.DATASET_ID_EXHAUSTED);
         }
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/EntityLevelTransactionContext.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/EntityLevelTransactionContext.java
new file mode 100644
index 0000000..9d2f54b
--- /dev/null
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/EntityLevelTransactionContext.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.transaction.management.service.transaction;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
+import org.apache.asterix.common.exceptions.ACIDException;
+import org.apache.asterix.common.transactions.TxnId;
+import org.apache.hyracks.algebricks.common.utils.Pair;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+
+@ThreadSafe
+public class EntityLevelTransactionContext extends AbstractTransactionContext {
+
+    private final Map<Integer, Pair<PrimaryIndexOperationTracker, IModificationOperationCallback>> primaryIndexTrackers;
+    private final Map<Long, AtomicInteger> resourcePendingOps;
+    private final Map<Integer, AtomicInteger> partitionPendingOps;
+
+    public EntityLevelTransactionContext(TxnId txnId) {
+        super(txnId);
+        this.primaryIndexTrackers = new HashMap<>();
+        this.resourcePendingOps = new HashMap<>();
+        this.partitionPendingOps = new HashMap<>();
+    }
+
+    @Override
+    public void register(long resourceId, int partition, ILSMIndex index, IModificationOperationCallback callback,
+            boolean primaryIndex) {
+        super.register(resourceId, partition, index, callback, primaryIndex);
+        synchronized (txnOpTrackers) {
+            AtomicInteger pendingOps = partitionPendingOps.computeIfAbsent(partition, p -> new AtomicInteger(0));
+            resourcePendingOps.put(resourceId, pendingOps);
+            if (primaryIndex) {
+                Pair<PrimaryIndexOperationTracker, IModificationOperationCallback> pair =
+                        new Pair<PrimaryIndexOperationTracker, IModificationOperationCallback>(
+                                (PrimaryIndexOperationTracker) index.getOperationTracker(), callback);
+                primaryIndexTrackers.put(partition, pair);
+            }
+        }
+    }
+
+    @Override
+    public void beforeOperation(long resourceId) {
+        resourcePendingOps.get(resourceId).incrementAndGet();
+    }
+
+    @Override
+    public void notifyUpdateCommitted(long resourceId) {
+        // no op
+    }
+
+    @Override
+    public void notifyEntityCommitted(int partition) {
+        try {
+            Pair<PrimaryIndexOperationTracker, IModificationOperationCallback> pair =
+                    primaryIndexTrackers.get(partition);
+            pair.first.completeOperation(null, LSMOperationType.MODIFICATION, null, pair.second);
+        } catch (HyracksDataException e) {
+            throw new ACIDException(e);
+        }
+    }
+
+    @Override
+    public void afterOperation(long resourceId) {
+        resourcePendingOps.get(resourceId).decrementAndGet();
+    }
+
+    @Override
+    protected void cleanupForAbort() {
+        for (Entry<Integer, Pair<PrimaryIndexOperationTracker, IModificationOperationCallback>> e : primaryIndexTrackers
+                .entrySet()) {
+            AtomicInteger pendingOps = partitionPendingOps.get(e.getKey());
+            e.getValue().first.cleanupNumActiveOperationsForAbortedJob(pendingOps.get());
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return Long.hashCode(txnId.getId());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        EntityLevelTransactionContext that = (EntityLevelTransactionContext) o;
+        return this.txnId.equals(that.txnId);
+    }
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/FieldsHashValueGenerator.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/FieldsHashValueGenerator.java
deleted file mode 100644
index c408f1d..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/FieldsHashValueGenerator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.transaction.management.service.transaction;
-
-import org.apache.hyracks.api.dataflow.value.IBinaryHashFunction;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-
-public class FieldsHashValueGenerator {
-    public static int computeFieldsHashValue(ITupleReference tuple, int[] fieldIndexes,
-            IBinaryHashFunction[] fieldHashFunctions) throws HyracksDataException {
-        int h = 0;
-        for (int i = 0; i < fieldIndexes.length; i++) {
-            int primaryKeyFieldIdx = fieldIndexes[i];
-            int fh = fieldHashFunctions[i].hash(tuple.getFieldData(primaryKeyFieldIdx),
-                    tuple.getFieldStart(primaryKeyFieldIdx), tuple.getFieldLength(primaryKeyFieldIdx));
-            h = h * 31 + fh;
-            if (h < 0) {
-                h = h * (-1);
-            }
-        }
-        return h;
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/JobIdFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/JobIdFactory.java
deleted file mode 100644
index 6e0af1c..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/JobIdFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.transaction;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.asterix.common.transactions.JobId;
-
-/**
- * Represents a factory to generate unique transaction IDs.
- */
-public class JobIdFactory {
-    private static final AtomicInteger Id = new AtomicInteger();
-
-    public static JobId generateJobId() {
-        return new JobId(Id.incrementAndGet());
-    }
-
-    public static void initJobId(int id) {
-        Id.set(id);
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/MutableResourceId.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/MutableResourceId.java
deleted file mode 100644
index c8e134c..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/MutableResourceId.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.transaction;
-
-public class MutableResourceId {
-    long id;
-
-    public MutableResourceId(long id) {
-        this.id = id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public long getId() {
-        return id;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) id;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if ((o == null) || !(o instanceof MutableResourceId)) {
-            return false;
-        }
-        return ((MutableResourceId) o).id == this.id;
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
deleted file mode 100644
index eb37f22..0000000
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContext.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.transaction;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-import org.apache.asterix.common.context.PrimaryIndexOperationTracker;
-import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.ioopcallbacks.AbstractLSMIOOperationCallback;
-import org.apache.asterix.common.transactions.AbstractOperationCallback;
-import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.ITransactionManager;
-import org.apache.asterix.common.transactions.JobId;
-import org.apache.asterix.common.transactions.LogRecord;
-import org.apache.asterix.common.transactions.MutableLong;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-
-/*
- * An object of TransactionContext is created and accessed(read/written) by multiple threads which work for
- * a single job identified by a jobId. Thus, the member variables in the object can be read/written
- * concurrently. Please see each variable declaration to know which one is accessed concurrently and
- * which one is not.
- */
-public class TransactionContext implements ITransactionContext, Serializable {
-
-    private static final long serialVersionUID = -6105616785783310111L;
-
-    // jobId is set once and read concurrently.
-    private final JobId jobId;
-
-    // There are no concurrent writers on both firstLSN and lastLSN
-    // since both values are updated by serialized log appenders.
-    // But readers and writers can be different threads,
-    // so both LSNs are atomic variables in order to be read and written
-    // atomically.
-    private final AtomicLong firstLSN;
-    private final AtomicLong lastLSN;
-
-    // txnState is read and written concurrently.
-    private final AtomicInteger txnState;
-
-    // isTimeout is read and written under the lockMgr's tableLatch
-    // Thus, no other synchronization is required separately.
-    private boolean isTimeout;
-
-    // isWriteTxn can be set concurrently by multiple threads.
-    private final AtomicBoolean isWriteTxn;
-
-    // isMetadataTxn is accessed by a single thread since the metadata is not
-    // partitioned
-    private boolean isMetadataTxn;
-
-    // indexMap is concurrently accessed by multiple threads,
-    // so those threads are synchronized on indexMap object itself
-    private final Map<MutableLong, AbstractLSMIOOperationCallback> indexMap;
-
-    // TODO: fix ComponentLSNs' issues.
-    // primaryIndex, primaryIndexCallback, and primaryIndexOptracker will be
-    // modified accordingly
-    // when the issues of componentLSNs are fixed.
-    private ILSMIndex primaryIndex;
-    private AbstractOperationCallback primaryIndexCallback;
-    private PrimaryIndexOperationTracker primaryIndexOpTracker;
-
-    // The following three variables are used as temporary variables in order to
-    // avoid object creations.
-    // Those are used in synchronized methods.
-    private final MutableLong tempResourceIdForRegister;
-    private final LogRecord logRecord;
-
-    private final AtomicInteger transactorNumActiveOperations;
-
-    // TODO: implement transactionContext pool in order to avoid object
-    // creations.
-    // also, the pool can throttle the number of concurrent active jobs at every
-    // moment.
-    public TransactionContext(JobId jobId) throws ACIDException {
-        this.jobId = jobId;
-        firstLSN = new AtomicLong(-1);
-        lastLSN = new AtomicLong(-1);
-        txnState = new AtomicInteger(ITransactionManager.ACTIVE);
-        isTimeout = false;
-        isWriteTxn = new AtomicBoolean(false);
-        isMetadataTxn = false;
-        indexMap = new HashMap<>();
-        primaryIndex = null;
-        tempResourceIdForRegister = new MutableLong();
-        logRecord = new LogRecord();
-        transactorNumActiveOperations = new AtomicInteger(0);
-    }
-
-    @Override
-    public void registerIndexAndCallback(long resourceId, ILSMIndex index, AbstractOperationCallback callback,
-            boolean isPrimaryIndex) {
-        synchronized (indexMap) {
-            if (isPrimaryIndex && primaryIndex == null) {
-                primaryIndex = index;
-                primaryIndexCallback = callback;
-                primaryIndexOpTracker = (PrimaryIndexOperationTracker) index.getOperationTracker();
-            }
-            tempResourceIdForRegister.set(resourceId);
-            if (!indexMap.containsKey(tempResourceIdForRegister)) {
-                indexMap.put(new MutableLong(resourceId),
-                        ((AbstractLSMIOOperationCallback) index.getIOOperationCallback()));
-            }
-        }
-    }
-
-    public PrimaryIndexOperationTracker getPrimaryIndexOpTracker() {
-        synchronized (indexMap) {
-            return primaryIndexOpTracker;
-        }
-    }
-
-    // [Notice]
-    // This method is called sequentially by the LogAppender threads.
-    @Override
-    public void setLastLSN(long LSN) {
-        firstLSN.compareAndSet(-1, LSN);
-        lastLSN.set(Math.max(lastLSN.get(), LSN));
-    }
-
-    @Override
-    public void notifyOptracker(boolean isJobLevelCommit) {
-        try {
-            /**
-             * in case of transaction abort {@link TransactionContext#cleanupForAbort()} will
-             * clean the primaryIndexOpTracker state.
-             */
-            if (isJobLevelCommit && isMetadataTxn && txnState.get() != ITransactionManager.ABORTED) {
-                primaryIndexOpTracker.exclusiveJobCommitted();
-            } else if (!isJobLevelCommit) {
-                primaryIndexOpTracker.completeOperation(null, LSMOperationType.MODIFICATION, null,
-                        (IModificationOperationCallback) primaryIndexCallback);
-            }
-        } catch (HyracksDataException e) {
-            throw new IllegalStateException(e);
-        }
-    }
-
-    @Override
-    public void setWriteTxn(boolean isWriteTxn) {
-        this.isWriteTxn.set(isWriteTxn);
-    }
-
-    @Override
-    public boolean isWriteTxn() {
-        return isWriteTxn.get();
-    }
-
-    @Override
-    public long getFirstLSN() {
-        return firstLSN.get();
-    }
-
-    @Override
-    public long getLastLSN() {
-        return lastLSN.get();
-    }
-
-    @Override
-    public JobId getJobId() {
-        return jobId;
-    }
-
-    @Override
-    public void setTimeout(boolean isTimeout) {
-        this.isTimeout = isTimeout;
-    }
-
-    @Override
-    public boolean isTimeout() {
-        return isTimeout;
-    }
-
-    @Override
-    public void setTxnState(int txnState) {
-        this.txnState.set(txnState);
-    }
-
-    @Override
-    public int getTxnState() {
-        return txnState.get();
-    }
-
-    @Override
-    public int hashCode() {
-        return jobId.getId();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        return (o == this);
-    }
-
-    @Override
-    public void setMetadataTransaction(boolean isMetadataTxn) {
-        this.isMetadataTxn = isMetadataTxn;
-    }
-
-    @Override
-    public boolean isMetadataTransaction() {
-        return isMetadataTxn;
-    }
-
-    @Override
-    public String prettyPrint() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("\n" + jobId + "\n");
-        sb.append("isWriteTxn: " + isWriteTxn + "\n");
-        sb.append("firstLSN: " + firstLSN.get() + "\n");
-        sb.append("lastLSN: " + lastLSN.get() + "\n");
-        sb.append("TransactionState: " + txnState + "\n");
-        sb.append("isTimeout: " + isTimeout + "\n");
-        return sb.toString();
-    }
-
-    public LogRecord getLogRecord() {
-        return logRecord;
-    }
-
-    public void cleanupForAbort() {
-        if (primaryIndexOpTracker != null) {
-            primaryIndexOpTracker.cleanupNumActiveOperationsForAbortedJob(transactorNumActiveOperations.get());
-        }
-    }
-
-    @Override
-    public void incrementNumActiveOperations() {
-        transactorNumActiveOperations.incrementAndGet();
-    }
-
-    @Override
-    public void decrementNumActiveOperations() {
-        transactorNumActiveOperations.decrementAndGet();
-    }
-}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContextFactory.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContextFactory.java
new file mode 100644
index 0000000..4a465a4
--- /dev/null
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionContextFactory.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.asterix.transaction.management.service.transaction;
+
+import static org.apache.asterix.common.transactions.ITransactionManager.AtomicityLevel;
+
+import org.apache.asterix.common.transactions.ITransactionContext;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
+
+public class TransactionContextFactory {
+
+    private TransactionContextFactory() {
+    }
+
+    public static ITransactionContext create(TxnId txnId, TransactionOptions options) {
+        final AtomicityLevel atomicityLevel = options.getAtomicityLevel();
+        switch (atomicityLevel) {
+            case ATOMIC:
+                return new AtomicTransactionContext(txnId);
+            case ENTITY_LEVEL:
+                return new EntityLevelTransactionContext(txnId);
+            default:
+                throw new IllegalStateException("Unknown transaction context type: " + atomicityLevel);
+        }
+    }
+}
diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
index 3e79e1d..76ecc63 100644
--- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
+++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/service/transaction/TransactionManager.java
@@ -18,138 +18,110 @@
  */
 package org.apache.asterix.transaction.management.service.transaction;
 
+import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.asterix.common.exceptions.ACIDException;
-import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ITransactionContext;
 import org.apache.asterix.common.transactions.ITransactionManager;
 import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.asterix.common.transactions.JobId;
 import org.apache.asterix.common.transactions.LogRecord;
+import org.apache.asterix.common.transactions.TransactionOptions;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.common.utils.TransactionUtil;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponent;
+import org.apache.hyracks.util.annotations.ThreadSafe;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
-/**
- * An implementation of the @see ITransactionManager interface that provides
- * implementation of APIs for governing the lifecycle of a transaction.
- */
+@ThreadSafe
 public class TransactionManager implements ITransactionManager, ILifeCycleComponent {
 
-    public static final boolean IS_DEBUG_MODE = false;//true
-    private static final Logger LOGGER = Logger.getLogger(TransactionManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ITransactionSubsystem txnSubsystem;
-    private Map<JobId, ITransactionContext> transactionContextRepository = new ConcurrentHashMap<>();
-    private AtomicInteger maxJobId = new AtomicInteger(0);
+    private final Map<TxnId, ITransactionContext> txnCtxRepository = new ConcurrentHashMap<>();
+    private final AtomicLong maxTxnId = new AtomicLong(0);
 
     public TransactionManager(ITransactionSubsystem provider) {
         this.txnSubsystem = provider;
     }
 
     @Override
-    public void abortTransaction(ITransactionContext txnCtx, DatasetId datasetId, int PKHashVal) throws ACIDException {
-        if (txnCtx.getTxnState() != ITransactionManager.ABORTED) {
-            txnCtx.setTxnState(ITransactionManager.ABORTED);
+    public synchronized ITransactionContext beginTransaction(TxnId txnId, TransactionOptions options)
+            throws ACIDException {
+        ITransactionContext txnCtx = txnCtxRepository.get(txnId);
+        if (txnCtx != null) {
+            throw new ACIDException("Transaction with the same (" + txnId + ") already exists");
         }
-        try {
-            if (txnCtx.isWriteTxn()) {
-                LogRecord logRecord = ((TransactionContext) txnCtx).getLogRecord();
-                TransactionUtil.formJobTerminateLogRecord(txnCtx, logRecord, false);
-                txnSubsystem.getLogManager().log(logRecord);
-                txnSubsystem.getRecoveryManager().rollbackTransaction(txnCtx);
-            }
-        } catch (Exception ae) {
-            String msg = "Could not complete rollback! System is in an inconsistent state";
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.severe(msg);
-            }
-            ae.printStackTrace();
-            throw new ACIDException(msg, ae);
-        } finally {
-            ((TransactionContext) txnCtx).cleanupForAbort();
-            txnSubsystem.getLockManager().releaseLocks(txnCtx);
-            transactionContextRepository.remove(txnCtx.getJobId());
-        }
+        txnCtx = TransactionContextFactory.create(txnId, options);
+        txnCtxRepository.put(txnId, txnCtx);
+        ensureMaxTxnId(txnId.getId());
+        return txnCtx;
     }
 
     @Override
-    public ITransactionContext beginTransaction(JobId jobId) throws ACIDException {
-        return getTransactionContext(jobId, true);
-    }
-
-    @Override
-    public ITransactionContext getTransactionContext(JobId jobId, boolean createIfNotExist) throws ACIDException {
-        setMaxJobId(jobId.getId());
-        ITransactionContext txnCtx = transactionContextRepository.get(jobId);
+    public ITransactionContext getTransactionContext(TxnId txnId) throws ACIDException {
+        ITransactionContext txnCtx = txnCtxRepository.get(txnId);
         if (txnCtx == null) {
-            if (createIfNotExist) {
-                synchronized (this) {
-                    txnCtx = transactionContextRepository.get(jobId);
-                    if (txnCtx == null) {
-                        txnCtx = new TransactionContext(jobId);
-                        transactionContextRepository.put(jobId, txnCtx);
-                    }
-                }
-            } else {
-                throw new ACIDException("TransactionContext of " + jobId + " doesn't exist.");
-            }
+            throw new ACIDException("Transaction " + txnId + " doesn't exist.");
         }
         return txnCtx;
     }
 
     @Override
-    public void commitTransaction(ITransactionContext txnCtx, DatasetId datasetId, int PKHashVal)
-            throws ACIDException {
-        //Only job-level commits call this method.
+    public void commitTransaction(TxnId txnId) throws ACIDException {
+        final ITransactionContext txnCtx = getTransactionContext(txnId);
         try {
             if (txnCtx.isWriteTxn()) {
-                LogRecord logRecord = ((TransactionContext) txnCtx).getLogRecord();
+                LogRecord logRecord = new LogRecord();
                 TransactionUtil.formJobTerminateLogRecord(txnCtx, logRecord, true);
                 txnSubsystem.getLogManager().log(logRecord);
+                txnCtx.setTxnState(ITransactionManager.COMMITTED);
             }
-        } catch (Exception ae) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.severe(" caused exception in commit !" + txnCtx.getJobId());
+        } catch (Exception e) {
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.error(" caused exception in commit !" + txnCtx.getTxnId());
             }
-            throw ae;
+            throw e;
         } finally {
+            txnCtx.complete();
             txnSubsystem.getLockManager().releaseLocks(txnCtx);
-            transactionContextRepository.remove(txnCtx.getJobId());
-            txnCtx.setTxnState(ITransactionManager.COMMITTED);
+            txnCtxRepository.remove(txnCtx.getTxnId());
         }
     }
 
     @Override
-    public void completedTransaction(ITransactionContext txnContext, DatasetId datasetId, int PKHashVal,
-            boolean success) throws ACIDException {
-        if (!success) {
-            abortTransaction(txnContext, datasetId, PKHashVal);
-        } else {
-            commitTransaction(txnContext, datasetId, PKHashVal);
+    public void abortTransaction(TxnId txnId) throws ACIDException {
+        final ITransactionContext txnCtx = getTransactionContext(txnId);
+        try {
+            if (txnCtx.isWriteTxn()) {
+                LogRecord logRecord = new LogRecord();
+                TransactionUtil.formJobTerminateLogRecord(txnCtx, logRecord, false);
+                txnSubsystem.getLogManager().log(logRecord);
+                txnSubsystem.getRecoveryManager().rollbackTransaction(txnCtx);
+                txnCtx.setTxnState(ITransactionManager.ABORTED);
+            }
+        } catch (ACIDException e) {
+            String msg = "Could not complete rollback! System is in an inconsistent state";
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.log(Level.ERROR, msg, e);
+            }
+            throw new ACIDException(msg, e);
+        } finally {
+            txnCtx.complete();
+            txnSubsystem.getLockManager().releaseLocks(txnCtx);
+            txnCtxRepository.remove(txnCtx.getTxnId());
         }
     }
 
     @Override
-    public ITransactionSubsystem getTransactionSubsystem() {
-        return txnSubsystem;
-    }
-
-    public void setMaxJobId(int jobId) {
-        int maxId = maxJobId.get();
-        if (jobId > maxId) {
-            maxJobId.compareAndSet(maxId, jobId);
-        }
-    }
-
-    @Override
-    public int getMaxJobId() {
-        return maxJobId.get();
+    public long getMaxTxnId() {
+        return maxTxnId.get();
     }
 
     @Override
@@ -166,45 +138,42 @@
 
     @Override
     public void dumpState(OutputStream os) {
-        //#. dump TxnContext
         dumpTxnContext(os);
     }
 
+    @Override
+    public void ensureMaxTxnId(long txnId) {
+        maxTxnId.updateAndGet(current -> Math.max(current, txnId));
+    }
+
     private void dumpTxnContext(OutputStream os) {
-        JobId jobId;
+        TxnId txnId;
         ITransactionContext txnCtx;
         StringBuilder sb = new StringBuilder();
-
         try {
             sb.append("\n>>dump_begin\t>>----- [ConfVars] -----");
-            Set<Map.Entry<JobId, ITransactionContext>> entrySet = transactionContextRepository.entrySet();
-            if (entrySet != null) {
-                for (Map.Entry<JobId, ITransactionContext> entry : entrySet) {
-                    if (entry != null) {
-                        jobId = entry.getKey();
-                        if (jobId != null) {
-                            sb.append("\n" + jobId);
-                        } else {
-                            sb.append("\nJID:null");
-                        }
+            Set<Map.Entry<TxnId, ITransactionContext>> entrySet = txnCtxRepository.entrySet();
+            for (Map.Entry<TxnId, ITransactionContext> entry : entrySet) {
+                if (entry != null) {
+                    txnId = entry.getKey();
+                    if (txnId != null) {
+                        sb.append("\n" + txnId);
+                    } else {
+                        sb.append("\nJID:null");
+                    }
 
-                        txnCtx = entry.getValue();
-                        if (txnCtx != null) {
-                            sb.append(txnCtx.prettyPrint());
-                        } else {
-                            sb.append("\nTxnCtx:null");
-                        }
+                    txnCtx = entry.getValue();
+                    if (txnCtx != null) {
+                        sb.append(((AbstractTransactionContext) txnCtx).prettyPrint());
+                    } else {
+                        sb.append("\nTxnCtx:null");
                     }
                 }
             }
-
             sb.append("\n>>dump_end\t>>----- [ConfVars] -----\n");
             os.write(sb.toString().getBytes());
-        } catch (Exception e) {
-            //ignore exception and continue dumping as much as possible.
-            if (IS_DEBUG_MODE) {
-                e.printStackTrace();
-            }
+        } catch (IOException e) {
+            LOGGER.log(Level.WARN, "exception while dumping state", e);
         }
     }
 }
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
index 14e4020..817e0f0 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/LockManagerUnitTest.java
@@ -30,13 +30,11 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Logger;
 
 import org.apache.asterix.common.transactions.DatasetId;
 import org.apache.asterix.common.transactions.ILockManager;
 import org.apache.asterix.common.transactions.ITransactionContext;
-import org.apache.asterix.common.transactions.JobId;
+import org.apache.asterix.common.transactions.TxnId;
 import org.apache.asterix.transaction.management.service.locking.Request.Kind;
 import org.apache.asterix.transaction.management.service.transaction.TransactionManagementConstants.LockManagerConstants.LockMode;
 import org.junit.After;
@@ -53,10 +51,6 @@
     static long COORDINATOR_SLEEP = 20;
     static int TIMEOUT_MS = 100;
 
-    static {
-        Logger.getLogger(ConcurrentLockManager.class.getName()).addHandler(new ConsoleHandler());
-    }
-
     Map<Integer, ITransactionContext> jobId2TxnCtxMap;
     ILockManager lockMgr;
 
@@ -300,7 +294,7 @@
      * @return throwable for said error
      */
     private static Throwable getError(Map<String, Throwable> errors, ITransactionContext txnCtx) {
-        return errors.get(txnCtx.getJobId().toString());
+        return errors.get(txnCtx.getTxnId().toString());
     }
 
     /**
@@ -318,7 +312,7 @@
         Throwable error = getError(errors, txnCtx);
         if (error == null) {
             throw new AssertionError(
-                    "expected " + clazz.getSimpleName() + " for " + txnCtx.getJobId() + ", got no " + "exception");
+                    "expected " + clazz.getSimpleName() + " for " + txnCtx.getTxnId() + ", got no " + "exception");
         }
         if (!clazz.isInstance(error)) {
             throw new AssertionError(error);
@@ -354,7 +348,7 @@
     private ITransactionContext j(int jId) {
         if (!jobId2TxnCtxMap.containsKey(jId)) {
             ITransactionContext mockTxnContext = mock(ITransactionContext.class);
-            when(mockTxnContext.getJobId()).thenReturn(new JobId(jId));
+            when(mockTxnContext.getTxnId()).thenReturn(new TxnId(jId));
             jobId2TxnCtxMap.put(jId, mockTxnContext);
         }
         return jobId2TxnCtxMap.get(jId);
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
index 97b4f8a..ef7d40e 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Locker.java
@@ -71,7 +71,7 @@
      */
     Locker(ILockManager lockMgr, ITransactionContext txnCtx, List<Request> allRequests, AtomicInteger time,
             PrintStream err) {
-        this.name = txnCtx == null ? "admin" : txnCtx.getJobId().toString();
+        this.name = txnCtx == null ? "admin" : txnCtx.getTxnId().toString();
         this.lockMgr = lockMgr;
 
         this.requests = new LinkedList<>();
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
index fd4dae5..112dc5f 100644
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
+++ b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/Request.java
@@ -58,7 +58,7 @@
 
     String asString(final Kind kind, final ITransactionContext txnCtx, final DatasetId dsId, final int hashValue,
             final byte lockMode) {
-        return txnCtx.getJobId() + ":" + kind.name() + ":" + dsId.getId() + ":" + hashValue + ":"
+        return txnCtx.getTxnId() + ":" + kind.name() + ":" + dsId.getId() + ":" + hashValue + ":"
                 + TransactionManagementConstants.LockManagerConstants.LockMode.toString(lockMode);
     }
 
@@ -147,7 +147,7 @@
 
                 @Override
                 public String toString() {
-                    return txnCtx.getJobId().toString() + ":" + kind.name();
+                    return txnCtx.getTxnId().toString() + ":" + kind.name();
                 }
             };
         }
diff --git a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/TestRuntimeContextProvider.java b/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/TestRuntimeContextProvider.java
deleted file mode 100644
index f897aca..0000000
--- a/asterixdb/asterix-transactions/src/test/java/org/apache/asterix/transaction/management/service/locking/TestRuntimeContextProvider.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.transaction.management.service.locking;
-
-import static org.mockito.Mockito.mock;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.apache.asterix.common.api.IDatasetLifecycleManager;
-import org.apache.asterix.common.api.INcApplicationContext;
-import org.apache.asterix.common.transactions.IAppRuntimeContextProvider;
-import org.apache.asterix.common.transactions.ITransactionSubsystem;
-import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
-import org.apache.hyracks.storage.common.ILocalResourceRepository;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
-
-class TestRuntimeContextProvider implements IAppRuntimeContextProvider {
-
-    ExecutorService ate = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
-    IDatasetLifecycleManager dlcm = mock(IDatasetLifecycleManager.class);
-
-    @Override
-    public ExecutorService getThreadExecutor() {
-        return ate;
-    }
-
-    @Override
-    public IBufferCache getBufferCache() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ITransactionSubsystem getTransactionSubsystem() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public IDatasetLifecycleManager getDatasetLifecycleManager() {
-        return dlcm;
-    }
-
-    @Override
-    public double getBloomFilterFalsePositiveRate() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ILSMOperationTracker getLSMBTreeOperationTracker(int datasetID) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ILSMIOOperationScheduler getLSMIOScheduler() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ILocalResourceRepository getLocalResourceRepository() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public IIOManager getIOManager() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public INcApplicationContext getAppContext() {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/asterixdb/asterix-yarn/pom.xml b/asterixdb/asterix-yarn/pom.xml
deleted file mode 100644
index 2cdc6ac..0000000
--- a/asterixdb/asterix-yarn/pom.xml
+++ /dev/null
@@ -1,470 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.You may obtain a copy of the License at
- !
- !http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>apache-asterixdb</artifactId>
-    <groupId>org.apache.asterix</groupId>
-    <version>0.9.4-SNAPSHOT</version>
-  </parent>
-  <artifactId>asterix-yarn</artifactId>
-
-  <properties>
-    <appendedResourcesDirectory>${basedir}/src/main/appended-resources</appendedResourcesDirectory>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>aoya</id>
-            <goals>
-              <goal>jar</goal>
-            </goals>
-            <phase>package</phase>
-            <configuration>
-              <classifier>aoya</classifier>
-              <archive>
-                <manifest>
-                  <MainClass>org.apache.asterix.aoya.Client</MainClass>
-                </manifest>
-              </archive>
-              <includes>
-                <include>**/org/apache/asterix/aoya/*</include>
-                <include>**/README*</include>
-                <include>**/LICENSE*</include>
-                <include>**/NOTICE*</include>
-                <include>**/DEPENDENCIES*</include>
-              </includes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <artifactId>maven-assembly-plugin</artifactId>
-        <executions>
-          <execution>
-            <configuration>
-              <descriptors>
-                <descriptor>src/main/assembly/binary-assembly.xml</descriptor>
-              </descriptors>
-            </configuration>
-            <phase>package</phase>
-            <goals>
-              <goal>single</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.hyracks</groupId>
-        <artifactId>license-automation-plugin</artifactId>
-        <executions>
-          <execution>
-            <phase>generate-resources</phase>
-            <goals>
-              <goal>generate</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <templateRootDir>${basedir}/../src/main/licenses/templates</templateRootDir>
-          <generatedFiles>
-            <generatedFile>
-              <template>asterix-license.ftl</template>
-              <outputFile>LICENSE</outputFile>
-            </generatedFile>
-            <generatedFile>
-              <template>asterix-notice.ftl</template>
-              <outputFile>NOTICE</outputFile>
-            </generatedFile>
-          </generatedFiles>
-          <location>repo/</location>
-          <timeoutSecs>10</timeoutSecs>
-          <extraLicenseMaps>
-            <extraLicenseMap>
-              <file>${basedir}/../asterix-server/target/generated-resources/license_map.json</file>
-              <location>asterix/asterix-server-${project.version}-binary-assembly.zip::repo/</location>
-            </extraLicenseMap>
-          </extraLicenseMaps>
-          <downloadDir>${project.build.directory}/generated-resources/license</downloadDir>
-          <excludedScopes>
-            <excludedScope>test</excludedScope>
-          </excludedScopes>
-          <excludes>
-            <exclude>org.apache.asterix:*</exclude>
-            <exclude>org.apache.algebricks:*</exclude>
-            <exclude>org.apache.hyracks:*</exclude>
-          </excludes>
-          <licenseDirectory>${basedir}/../src/main/licenses/content</licenseDirectory>
-          <dependencySets>
-            <dependencySet>
-              <includes>
-                <!-- NOTE! Any changes here must be mirrored in src/main/assembly/binary-assembly.xml -->
-                <include>org.apache.asterix:asterix-yarn</include>
-                <include>org.apache.asterix:asterix-common</include>
-                <include>log4j:log4j</include>
-                <include>org.slf4j:slf4j-api</include>
-                <include>org.slf4j:slf4j-simple</include>
-                <include>commons-io:commons-io</include>
-                <include>commons-cli:commons-cli</include>
-                <include>commons-configuration:commons-configuration</include>
-                <include>commons-collections:commons-collections</include>
-                <include>commons-logging:commons-logging</include>
-                <include>commons-codec:commons-codec</include>
-                <include>commons-lang:commons-lang</include>
-                <include>org.apache.hadoop:hadoop-common</include>
-                <include>org.apache.hadoop:hadoop-hdfs</include>
-                <include>org.apache.hadoop:hadoop-auth</include>
-                <include>org.apache.hadoop:hadoop-yarn-common</include>
-                <include>org.apache.hadoop:hadoop-yarn-api</include>
-                <include>org.apache.httpcomponents:httpcore</include>
-                <include>org.apache.httpcomponents:httpclient</include>
-                <include>commons-httpclient:commons-httpclient</include>
-                <include>com.google.protobuf:protobuf-java</include>
-                <include>com.google.guava:guava</include>
-              </includes>
-              <location>lib</location>
-            </dependencySet>
-          </dependencySets>
-          <models>
-            <model>${basedir}/../src/main/appended-resources/supplemental-models.xml</model>
-          </models>
-          <overrides>
-            <override>
-              <gav>commons-configuration:commons-configuration:1.6</gav>
-              <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            </override>
-            <override>
-              <gav>com.google.protobuf:protobuf-java:2.5.0</gav>
-              <url>https://github.com/google/protobuf/blob/v2.5.0/COPYING.txt</url>
-            </override>
-          </overrides>
-          <licenses>
-            <license>
-              <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-              <aliasUrls>http://www.apache.org/licenses/LICENSE-2.0</aliasUrls>
-            </license>
-          </licenses>
-          <templateProperties>
-            <packageName>Apache AsterixDB YARN Install</packageName>
-            <asterixAppLocation>repo/asterix-app-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</asterixAppLocation>
-            <hyracksControlCcLocation>repo/hyracks-control-cc-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</hyracksControlCcLocation>
-            <hivecompatLocation>repo/asterix-hivecompat-${project.version}.jar, within asterix/asterix-server-${project.version}-binary-assembly.zip</hivecompatLocation>
-          </templateProperties>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-external-testlib</id>
-            <phase>pre-integration-test</phase>
-            <goals>
-              <goal>copy-dependencies</goal>
-            </goals>
-            <configuration>
-              <includeClassifiers>testlib</includeClassifiers>
-              <outputDirectory>target/resources/externallib</outputDirectory>
-              <stripVersion>true</stripVersion>
-              <overWriteIfNewer>true</overWriteIfNewer>
-            </configuration>
-          </execution>
-        </executions>
-        <configuration>
-          <ignoredDependencies>
-            <ignoredDependency>org.apache.hive:hive-exec:*</ignoredDependency>
-          </ignoredDependencies>
-          <usedDependencies>
-            <usedDependency>commons-codec:commons-codec</usedDependency>
-            <usedDependency>commons-collections:commons-collections</usedDependency>
-            <usedDependency>commons-configuration:commons-configuration</usedDependency>
-            <usedDependency>commons-lang:commons-lang</usedDependency>
-            <usedDependency>commons-logging:commons-logging-api</usedDependency>
-            <usedDependency>commons-net:commons-net</usedDependency>
-            <usedDependency>org.apache.asterix:asterix-events</usedDependency>
-            <usedDependency>org.apache.asterix:asterix-runtime</usedDependency>
-            <usedDependency>org.apache.asterix:asterix-server</usedDependency>
-            <usedDependency>org.apache.commons:commons-math</usedDependency>
-            <usedDependency>org.apache.hadoop:hadoop-minicluster</usedDependency>
-            <usedDependency>org.apache.httpcomponents:httpclient</usedDependency>
-            <usedDependency>org.apache.httpcomponents:httpcore</usedDependency>
-            <usedDependency>org.slf4j:slf4j-simple</usedDependency>
-          </usedDependencies>
-          <ignoredUnusedDeclaredDependencies>
-            <ignoredUnusedDeclaredDependency>org.apache.asterix:asterix-external-data:zip:*</ignoredUnusedDeclaredDependency>
-          </ignoredUnusedDeclaredDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>org.apache.hyracks</groupId>
-                    <artifactId>license-automation-plugin</artifactId>
-                    <versionRange>[0.0,)</versionRange>
-                    <goals>
-                      <goal>generate</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore />
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-
-  <repositories>
-    <repository>
-      <id>central</id>
-      <url>http://repo1.maven.org/maven2</url>
-      <releases>
-        <enabled>true</enabled>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-      </snapshots>
-    </repository>
-    <repository>
-      <releases>
-        <enabled>true</enabled>
-        <updatePolicy>always</updatePolicy>
-        <checksumPolicy>warn</checksumPolicy>
-      </releases>
-      <snapshots>
-        <enabled>false</enabled>
-        <updatePolicy>never</updatePolicy>
-        <checksumPolicy>fail</checksumPolicy>
-      </snapshots>
-      <id>HDPReleases</id>
-      <name>HDP Releases</name>
-      <url>http://repo.hortonworks.com/content/repositories/releases</url>
-      <layout>default</layout>
-    </repository>
-  </repositories>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-events</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-app</artifactId>
-      <version>${project.version}</version>
-      <type>test-jar</type>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-test-framework</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-yarn-common</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-yarn-client</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-common</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-net</groupId>
-      <artifactId>commons-net</artifactId>
-      <version>3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-collections</groupId>
-      <artifactId>commons-collections</artifactId>
-      <version>3.2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-configuration</groupId>
-      <artifactId>commons-configuration</artifactId>
-      <version>1.6</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-      <version>1.2</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-math</artifactId>
-      <version>2.1</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpcore</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-server</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-      <classifier>binary-assembly</classifier>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-runtime</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-app</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-minicluster</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-annotations</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-hdfs</artifactId>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-yarn-api</artifactId>
-      <version>${hadoop.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.xml.bind</groupId>
-      <artifactId>jaxb-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-yarn-server-tests</artifactId>
-      <version>${hadoop.version}</version>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-yarn-server-resourcemanager</artifactId>
-      <version>${hadoop.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>commons-httpclient</groupId>
-      <artifactId>commons-httpclient</artifactId>
-      <version>3.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.asterix</groupId>
-      <artifactId>asterix-external-data</artifactId>
-      <version>${project.version}</version>
-      <type>zip</type>
-      <classifier>testlib</classifier>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-control-cc</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-hdfs</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-control-nc</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/asterixdb/asterix-yarn/src/main/assembly/binary-assembly.xml b/asterixdb/asterix-yarn/src/main/assembly/binary-assembly.xml
deleted file mode 100644
index 1ca8c0e..0000000
--- a/asterixdb/asterix-yarn/src/main/assembly/binary-assembly.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<assembly>
-  <id>binary-assembly</id>
-  <formats>
-    <format>dir</format>
-    <format>zip</format>
-  </formats>
-  <includeBaseDirectory>false</includeBaseDirectory>
-  <fileSets>
-    <fileSet>
-      <directory>target/generated-sources</directory>
-      <outputDirectory>.</outputDirectory>
-      <includes>
-        <include>LICENSE*</include>
-        <include>NOTICE*</include>
-      </includes>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/scripts</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>asterix</include>
-      </includes>
-      <outputDirectory>bin</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/configs</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>local.xml</include>
-      </includes>
-      <outputDirectory>configs</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>base-asterix-configuration.xml</include>
-      </includes>
-      <outputDirectory>conf</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/configs</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>my_awesome_cluster_desc.xml</include>
-      </includes>
-      <outputDirectory>configs</outputDirectory>
-    </fileSet>
-    <fileSet>
-      <directory>src/main/resources/configs</directory>
-      <fileMode>0755</fileMode>
-      <includes>
-        <include>asterix-client-log4j.properties</include>
-      </includes>
-      <outputDirectory>conf</outputDirectory>
-    </fileSet>
-  </fileSets>
-  <dependencySets>
-    <dependencySet>
-      <includes>
-        <!-- NOTE! Any changes here must be mirrored in src/main/assembly/binary-assembly.xml -->
-        <include>org.apache.asterix:asterix-yarn</include>
-        <include>org.apache.asterix:asterix-common</include>
-        <include>log4j:log4j</include>
-        <include>org.slf4j:slf4j-api</include>
-        <include>org.slf4j:slf4j-simple</include>
-        <include>commons-io:commons-io</include>
-        <include>commons-cli:commons-cli</include>
-        <include>commons-configuration:commons-configuration</include>
-        <include>commons-collections:commons-collections</include>
-        <include>commons-logging:commons-logging</include>
-        <include>commons-codec:commons-codec</include>
-        <include>commons-lang:commons-lang</include>
-        <include>org.apache.hadoop:hadoop-common</include>
-        <include>org.apache.hadoop:hadoop-hdfs</include>
-        <include>org.apache.hadoop:hadoop-auth</include>
-        <include>org.apache.hadoop:hadoop-yarn-client</include>
-        <include>org.apache.hadoop:hadoop-yarn-common</include>
-        <include>org.apache.hadoop:hadoop-yarn-api</include>
-        <include>org.apache.httpcomponents:httpcore</include>
-        <include>org.apache.httpcomponents:httpclient</include>
-        <include>org.htrace:htrace-core</include>
-        <include>commons-httpclient:commons-httpclient</include>
-        <include>com.google.guava:guava</include>
-        <include>com.google.protobuf:protobuf-java</include>
-      </includes>
-      <outputDirectory>lib</outputDirectory>
-    </dependencySet>
-    <dependencySet>
-      <outputDirectory>asterix</outputDirectory>
-      <includes>
-        <include>org.apache.asterix:asterix-server*</include>
-      </includes>
-      <unpack>false</unpack>
-      <useTransitiveDependencies>false</useTransitiveDependencies>
-    </dependencySet>
-  </dependencySets>
-</assembly>
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AConstants.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AConstants.java
deleted file mode 100644
index ccbca9e..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AConstants.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya;
-
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.classification.InterfaceStability;
-
-/**
- * Constants used in both Client and Application Master
- */
-@InterfaceAudience.LimitedPrivate(value = { "For simplicity between Client and AM." })
-@InterfaceStability.Unstable
-public class AConstants {
-    /**
-     * Environment key name pointing to the the app master jar location
-     */
-    public static final String APPLICATIONMASTERJARLOCATION = "APPLICATIONMASTERJARLOCATION";
-
-    /**
-     * Environment key name denoting the file timestamp for the the app master jar.
-     * Used to validate the local resource.
-     */
-    public static final String APPLICATIONMASTERJARTIMESTAMP = "APPLICATIONMASTERJARTIMESTAMP";
-
-    /**
-     * Environment key name denoting the file content length for the app master jar.
-     * Used to validate the local resource.
-     */
-    public static final String APPLICATIONMASTERJARLEN = "APPLICATIONMASTERJARLEN";
-    /**
-     * Environment key name pointing to the Asterix distributable tar
-     */
-    public static final String TARLOCATION = "TARLOCATION";
-
-    /**
-     * Environment key name denoting the file timestamp for the Asterix tar.
-     * Used to validate the local resource.
-     */
-    public static final String TARTIMESTAMP = "TARTIMESTAMP";
-
-    /**
-     * Environment key name denoting the file content length for the Asterix tar.
-     * Used to validate the local resource.
-     */
-    public static final String TARLEN = "TARLEN";
-
-    /**
-     * Environment key name pointing to the Asterix cluster configuration file
-     */
-    public static final String CONFLOCATION = "CONFLOCATION";
-
-    /**
-     * Environment key name denoting the file timestamp for the Asterix config.
-     * Used to validate the local resource.
-     */
-
-    public static final String CONFTIMESTAMP = "CONFTIMESTAMP";
-
-    /**
-     * Environment key name denoting the file content length for the Asterix config.
-     * Used to validate the local resource.
-     */
-
-    public static final String CONFLEN = "CONFLEN";
-
-    /**
-     * Environment key name pointing to the Asterix parameters file
-     */
-
-    public static final String PARAMLOCATION = "PARAMLOCATION";
-
-    /**
-     * Environment key name denoting the file timestamp for the Asterix parameters.
-     * Used to validate the local resource.
-     */
-
-    public static final String PARAMTIMESTAMP = "PARAMTIMESTAMP";
-
-    /**
-     * Environment key name denoting the file content length for the Asterix parameters.
-     * Used to validate the local resource.
-     */
-
-    public static final String PARAMLEN = "PARAMLEN";
-
-    public static final String PATHSUFFIX = "PATHSUFFIX";
-
-    public static final String INSTANCESTORE = "INSTANCESTORE";
-
-    public static final String RMADDRESS = "RMADDRESS";
-
-    public static final String RMSCHEDULERADDRESS = "RMSCHEDULERADDRESS";
-
-    public static final String DFS_BASE = "DFSBASE";
-
-    public static final String NC_JAVA_OPTS = "NCJAVAOPTS";
-
-    public static final String CC_JAVA_OPTS = "CCJAVAOPTS";
-
-    public static final String NC_CONTAINER_MEM = "NC_CONTAINER_MEM";
-
-    public static final String CC_CONTAINER_MEM = "CC_CONTAINER_MEM";
-
-}
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixApplicationMaster.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixApplicationMaster.java
deleted file mode 100644
index 4a900e1..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixApplicationMaster.java
+++ /dev/null
@@ -1,1334 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.asterix.aoya;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.InetAddress;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Random;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.asterix.common.config.GlobalConfig;
-import org.apache.asterix.common.exceptions.AsterixException;
-import org.apache.asterix.common.utils.StorageConstants;
-import org.apache.asterix.event.schema.yarnCluster.Cluster;
-import org.apache.asterix.event.schema.yarnCluster.MasterNode;
-import org.apache.asterix.event.schema.yarnCluster.Node;
-import org.apache.asterix.hyracks.bootstrap.CCApplication;
-import org.apache.asterix.hyracks.bootstrap.NCApplication;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.yarn.api.ApplicationConstants;
-import org.apache.hadoop.yarn.api.ApplicationConstants.Environment;
-import org.apache.hadoop.yarn.api.ContainerManagementProtocol;
-import org.apache.hadoop.yarn.api.protocolrecords.RegisterApplicationMasterResponse;
-import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
-import org.apache.hadoop.yarn.api.records.Container;
-import org.apache.hadoop.yarn.api.records.ContainerId;
-import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
-import org.apache.hadoop.yarn.api.records.ContainerState;
-import org.apache.hadoop.yarn.api.records.ContainerStatus;
-import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
-import org.apache.hadoop.yarn.api.records.LocalResource;
-import org.apache.hadoop.yarn.api.records.LocalResourceType;
-import org.apache.hadoop.yarn.api.records.LocalResourceVisibility;
-import org.apache.hadoop.yarn.api.records.NodeReport;
-import org.apache.hadoop.yarn.api.records.Priority;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.hadoop.yarn.client.api.AMRMClient.ContainerRequest;
-import org.apache.hadoop.yarn.client.api.async.AMRMClientAsync;
-import org.apache.hadoop.yarn.client.api.async.NMClientAsync;
-import org.apache.hadoop.yarn.client.api.async.impl.NMClientAsyncImpl;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.hadoop.yarn.exceptions.YarnException;
-import org.apache.hadoop.yarn.util.ConverterUtils;
-import org.apache.hadoop.yarn.util.Records;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-import org.apache.log4j.PatternLayout;
-
-public class AsterixApplicationMaster {
-
-    static {
-        Logger rootLogger = Logger.getRootLogger();
-        rootLogger.setLevel(Level.INFO);
-        rootLogger.addAppender(new ConsoleAppender(new PatternLayout("%-6r [%p] %c - %m%n")));
-    }
-
-    private static final Log LOG = LogFactory.getLog(AsterixApplicationMaster.class);
-    private static final String CLUSTER_DESC_PATH = "cluster-config.xml";
-    private static final String ASTERIX_CONF_NAME = "asterix-configuration.xml";
-    private static final String ASTERIX_ZIP_NAME = "asterix-server.zip";
-
-    private static final int CC_MEMORY_MBS_DEFAULT = 1024;
-    private static final int NC_MEMORY_MBS_DEFAULT = 1536;
-    private static final String EXTERNAL_CC_JAVA_OPTS_DEFAULT = "-Xmx" + CC_MEMORY_MBS_DEFAULT + "m";
-    private static final String EXTERNAL_NC_JAVA_OPTS_DEFAULT = "-Xmx" + NC_MEMORY_MBS_DEFAULT + "m";
-    private static final String OBLITERATOR_CLASSNAME = "org.apache.asterix.aoya.Deleter";
-    private static final String HDFS_BACKUP_CLASSNAME = "org.apache.asterix.aoya.HDFSBackup";
-    private static final String NC_CLASSNAME = "org.apache.hyracks.control.nc.NCDriver";
-    private static final String CC_CLASSNAME = "org.apache.hyracks.control.cc.CCDriver";
-    private static final String JAVA_HOME = System.getProperty("java.home");
-    private boolean doneAllocating = false;
-
-    // Configuration
-    private Configuration conf;
-
-    // Handle to communicate with the Resource Manager
-    private AMRMClientAsync<ContainerRequest> resourceManager;
-
-    // Handle to communicate with the Node Manager
-    private NMClientAsync nmClientAsync;
-    // Listen to process the response from the Node Manager
-    private NMCallbackHandler containerListener;
-    // Application Attempt Id ( combination of attemptId and fail count )
-    private ApplicationAttemptId appAttemptID;
-
-    // TODO
-    // For status update for clients - yet to be implemented
-    // Hostname of the container
-    private String appMasterHostname = "";
-    // Port on which the app master listens for status updates from clients
-    private int appMasterRpcPort = new Random().nextInt(65535 - 49152);
-    // Tracking url to which app master publishes info for clients to monitor
-    private String appMasterTrackingUrl = "";
-
-    // Counter for completed containers ( complete denotes successful or failed )
-    private AtomicInteger numCompletedContainers = new AtomicInteger();
-    // Allocated container count so that we know how many containers has the RM
-    // allocated to us
-    private AtomicInteger numAllocatedContainers = new AtomicInteger();
-    // Count of failed containers
-    private AtomicInteger numFailedContainers = new AtomicInteger();
-    // Count of containers already requested from the RM
-    // Needed as once requested, we should not request for containers again.
-    // Only request for more if the original requirement changes.
-    private AtomicInteger numRequestedContainers = new AtomicInteger();
-    //Tells us whether the Cluster Controller is up so we can safely start some Node Controllers
-    private AtomicBoolean ccUp = new AtomicBoolean();
-    private AtomicBoolean ccStarted = new AtomicBoolean();
-    private Queue<Node> pendingNCs = new ArrayDeque<>();
-
-    //HDFS path to AsterixDB distributable zip
-    private String asterixZipPath = "";
-    // Timestamp needed for creating a local resource
-    private long asterixZipTimestamp = 0;
-    // File length needed for local resource
-    private long asterixZipLen = 0;
-
-    //HDFS path to AsterixDB cluster description
-    private String asterixConfPath = "";
-    // Timestamp needed for creating a local resource
-    private long asterixConfTimestamp = 0;
-    // File length needed for local resource
-    private long asterixConfLen = 0;
-
-    private String instanceConfPath = "";
-
-    //base dir under which all configs and binaries lie
-    private String dfsBasePath;
-
-    private int numTotalContainers = 0;
-
-    // Set the local resources
-    private Map<String, LocalResource> localResources = new HashMap<>();
-
-    private Cluster clusterDesc = null;
-    private MasterNode cC = null;
-    private String ccJavaOpts = null;
-    private int ccMem = 0;
-    private String ncJavaOpts = null;
-    private int ncMem = 0;
-    private volatile boolean done;
-    private volatile boolean success;
-
-    private boolean obliterate = false;
-    private Path appMasterJar = null;
-    private boolean backup = false;
-    long backupTimestamp;
-    String snapName;
-    private boolean restore = false;
-    private boolean initial = false;
-
-    // Launch threads
-    private List<Thread> launchThreads = new CopyOnWriteArrayList<>();
-
-    public static void main(String[] args) {
-
-        boolean result = false;
-        try {
-
-            AsterixApplicationMaster appMaster = new AsterixApplicationMaster();
-            LOG.info("Initializing ApplicationMaster");
-            appMaster.setEnvs(appMaster.setArgs(args));
-            boolean doRun = appMaster.init();
-            if (!doRun) {
-                System.exit(0);
-            }
-            result = appMaster.run();
-        } catch (Exception e) {
-            LOG.fatal("Error running ApplicationMaster", e);
-            System.exit(1);
-        }
-        if (result) {
-            LOG.info("Application Master completed successfully. exiting");
-            System.exit(0);
-        } else {
-            LOG.info("Application Master failed. exiting");
-            System.exit(2);
-        }
-    }
-
-    private void dumpOutDebugInfo() {
-
-        LOG.info("Dump debug output");
-        Map<String, String> envs = System.getenv();
-        envs.forEach((key, value) -> {
-            LOG.info("System env: key=" + key + ", val=" + value);
-            System.out.println("System env: key=" + key + ", val=" + value);
-        });
-
-        String cmd = "ls -alhLR";
-        Runtime run = Runtime.getRuntime();
-        Process pr = null;
-        try {
-            pr = run.exec(cmd);
-            pr.waitFor();
-
-            BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
-            String line = "";
-            while ((line = buf.readLine()) != null) {
-                LOG.info("System CWD content: " + line);
-                System.out.println("System CWD content: " + line);
-            }
-            buf.close();
-        } catch (IOException e) {
-            LOG.info(e);
-        } catch (InterruptedException e) {
-            LOG.info(e);
-        }
-    }
-
-    public AsterixApplicationMaster() {
-        // Set up the configuration and RPC
-        conf = new YarnConfiguration();
-
-    }
-
-    public CommandLine setArgs(String[] args) throws ParseException {
-        Options opts = new Options();
-        opts.addOption("app_attempt_id", true, "App Attempt ID. Not to be used unless for testing purposes");
-        opts.addOption("priority", true, "Application Priority. Default 0");
-        opts.addOption("debug", false, "Dump out debug information");
-        opts.addOption("help", false, "Print usage");
-        opts.addOption("initial", false, "Initialize existing Asterix instance.");
-        opts.addOption("obliterate", false, "Delete asterix instance completely.");
-        opts.addOption("backup", false, "Back up AsterixDB instance");
-        opts.addOption("restore", true, "Restore an AsterixDB instance");
-
-        CommandLine cliParser = new GnuParser().parse(opts, args);
-
-        if (cliParser.hasOption("help")) {
-            printUsage(opts);
-        }
-
-        if (cliParser.hasOption("debug")) {
-            dumpOutDebugInfo();
-        }
-
-        if (cliParser.hasOption("obliterate")) {
-            obliterate = true;
-        }
-        if (cliParser.hasOption("initial")) {
-            initial = true;
-        }
-
-        if (cliParser.hasOption("backup")) {
-            backup = true;
-            backupTimestamp = System.currentTimeMillis();
-        }
-        if (cliParser.hasOption("restore")) {
-            restore = true;
-            snapName = cliParser.getOptionValue("restore");
-            LOG.info(snapName);
-        }
-        return cliParser;
-    }
-
-    public void setEnvs(CommandLine cliParser) {
-        Map<String, String> envs = System.getenv();
-        if (envs.containsKey("HADOOP_CONF_DIR")) {
-            File hadoopConfDir = new File(envs.get("HADOOP_CONF_DIR"));
-            if (hadoopConfDir.isDirectory()) {
-                for (File config : hadoopConfDir.listFiles()) {
-                    if (config.getName().matches("^.*(xml)$")) {
-                        conf.addResource(new Path(config.getAbsolutePath()));
-                    }
-                }
-            }
-        }
-        //the containerID might be in the arguments or the environment
-        if (!envs.containsKey(Environment.CONTAINER_ID.name())) {
-            if (cliParser.hasOption("app_attempt_id")) {
-                String appIdStr = cliParser.getOptionValue("app_attempt_id", "");
-                appAttemptID = ConverterUtils.toApplicationAttemptId(appIdStr);
-            } else {
-
-                throw new IllegalArgumentException(
-                        "Environment is not set correctly- please check client submission settings");
-            }
-        } else {
-            ContainerId containerId = ConverterUtils.toContainerId(envs.get(Environment.CONTAINER_ID.name()));
-            appAttemptID = containerId.getApplicationAttemptId();
-        }
-
-        if (!envs.containsKey(ApplicationConstants.APP_SUBMIT_TIME_ENV) || !envs.containsKey(Environment.NM_HOST.name())
-                || !envs.containsKey(Environment.NM_HTTP_PORT.name())
-                || !envs.containsKey(Environment.NM_PORT.name())) {
-            throw new IllegalArgumentException(
-                    "Environment is not set correctly- please check client submission settings");
-        }
-        System.setProperty(GlobalConfig.CONFIG_FILE_PROPERTY,
-                envs.get("PWD") + File.separator + "bin" + File.separator + ASTERIX_CONF_NAME);
-
-        LOG.info("Application master for app" + ", appId=" + appAttemptID.getApplicationId().getId()
-                + ", clustertimestamp=" + appAttemptID.getApplicationId().getClusterTimestamp() + ", attemptId="
-                + appAttemptID.getAttemptId());
-
-        asterixZipPath = envs.get(AConstants.TARLOCATION);
-        asterixZipTimestamp = Long.parseLong(envs.get(AConstants.TARTIMESTAMP));
-        asterixZipLen = Long.parseLong(envs.get(AConstants.TARLEN));
-
-        asterixConfPath = envs.get(AConstants.CONFLOCATION);
-        asterixConfTimestamp = Long.parseLong(envs.get(AConstants.CONFTIMESTAMP));
-        asterixConfLen = Long.parseLong(envs.get(AConstants.CONFLEN));
-
-        instanceConfPath = envs.get(AConstants.INSTANCESTORE);
-        //the only time this is null is during testing, when asterix-yarn isn't packaged in a JAR yet.
-        if (envs.get(AConstants.APPLICATIONMASTERJARLOCATION) != null
-                && !envs.get(AConstants.APPLICATIONMASTERJARLOCATION).endsWith(File.separator)) {
-            appMasterJar = new Path(envs.get(AConstants.APPLICATIONMASTERJARLOCATION));
-        } else {
-            appMasterJar = null;
-        }
-
-        dfsBasePath = envs.get(AConstants.DFS_BASE);
-        //If the NM has an odd environment where the proper hadoop XML configs dont get imported, we can end up not being able to talk to the RM
-        // this solves that!
-        //in a testing environment these can be null however.
-        if (envs.get(AConstants.RMADDRESS) != null) {
-            conf.set("yarn.resourcemanager.address", envs.get(AConstants.RMADDRESS));
-            LOG.info("RM Address: " + envs.get(AConstants.RMADDRESS));
-        }
-        if (envs.get(AConstants.RMADDRESS) != null) {
-            conf.set("yarn.resourcemanager.scheduler.address", envs.get(AConstants.RMSCHEDULERADDRESS));
-        }
-        ccJavaOpts = envs.get(AConstants.CC_JAVA_OPTS);
-        //set defaults if no special given options
-        if (ccJavaOpts == null) {
-            ccJavaOpts = EXTERNAL_CC_JAVA_OPTS_DEFAULT;
-        }
-        ncJavaOpts = envs.get(AConstants.NC_JAVA_OPTS);
-        if (ncJavaOpts == null) {
-            ncJavaOpts = EXTERNAL_NC_JAVA_OPTS_DEFAULT;
-        }
-
-        LOG.info("Path suffix: " + instanceConfPath);
-    }
-
-    public boolean init() throws ParseException, IOException, AsterixException, YarnException {
-        try {
-            localizeDFSResources();
-            clusterDesc = Utils.parseYarnClusterConfig(CLUSTER_DESC_PATH);
-            cC = clusterDesc.getMasterNode();
-            appMasterTrackingUrl = "http://" + cC.getClientIp() + ":" + cC.getClientPort() + Path.SEPARATOR;
-            distributeAsterixConfig();
-            //now let's read what's in there so we can set the JVM opts right
-            LOG.debug("config file loc: " + System.getProperty(GlobalConfig.CONFIG_FILE_PROPERTY));
-        } catch (FileNotFoundException | IllegalStateException e) {
-            LOG.error("Could not deserialize Cluster Config from disk- aborting!");
-            LOG.error(e);
-            throw e;
-        }
-
-        return true;
-    }
-
-    /**
-     * Sets up the parameters for the Asterix config.
-     *
-     * @throws IOException
-     */
-    private void distributeAsterixConfig() throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        String pathSuffix = instanceConfPath + File.separator + ASTERIX_CONF_NAME;
-        Path dst = new Path(dfsBasePath, pathSuffix);
-        URI paramLocation = dst.toUri();
-        FileStatus paramFileStatus = fs.getFileStatus(dst);
-        Long paramLen = paramFileStatus.getLen();
-        Long paramTimestamp = paramFileStatus.getModificationTime();
-        LocalResource asterixParamLoc = Records.newRecord(LocalResource.class);
-        asterixParamLoc.setType(LocalResourceType.FILE);
-        asterixParamLoc.setVisibility(LocalResourceVisibility.PRIVATE);
-        asterixParamLoc.setResource(ConverterUtils.getYarnUrlFromURI(paramLocation));
-        asterixParamLoc.setTimestamp(paramTimestamp);
-        asterixParamLoc.setSize(paramLen);
-        localResources.put(ASTERIX_CONF_NAME, asterixParamLoc);
-
-    }
-
-    /**
-     * @param c
-     *            The cluster exception to attempt to alocate with the RM
-     * @throws YarnException
-     */
-    private void requestResources(Cluster c) throws YarnException, UnknownHostException {
-        //set memory
-        if (c.getCcContainerMem() != null) {
-            ccMem = Integer.parseInt(c.getCcContainerMem());
-        } else {
-            ccMem = CC_MEMORY_MBS_DEFAULT;
-        }
-        if (c.getNcContainerMem() != null) {
-            ncMem = Integer.parseInt(c.getNcContainerMem());
-        } else {
-            ncMem = CC_MEMORY_MBS_DEFAULT;
-        }
-        //request CC
-        int numNodes = 0;
-        ContainerRequest ccAsk = hostToRequest(cC.getClusterIp(), true);
-        resourceManager.addContainerRequest(ccAsk);
-        LOG.info("Asked for CC: " + Arrays.toString(ccAsk.getNodes().toArray()));
-        numNodes++;
-        //now we wait to be given the CC before starting the NCs...
-        //we will wait a minute.
-        int deathClock = 60;
-        while (ccUp.get() == false && deathClock > 0) {
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException ex) {
-                LOG.debug(ex);
-            }
-            --deathClock;
-        }
-        if (deathClock == 0 && ccUp.get() == false) {
-            throw new YarnException("Couldn't allocate container for CC. Abort!");
-        }
-        LOG.info("Waiting for CC process to start");
-        //TODO: inspect for actual liveness instead of waiting.
-        // is there a good way to do this? maybe try opening a socket to it...
-        try {
-            Thread.sleep(10000);
-        } catch (InterruptedException ex) {
-            LOG.debug(ex);
-        }
-        //request NCs
-        for (Node n : c.getNode()) {
-            resourceManager.addContainerRequest(hostToRequest(n.getClusterIp(), false));
-            LOG.info("Asked for NC: " + n.getClusterIp());
-            numNodes++;
-            synchronized (pendingNCs) {
-                pendingNCs.add(n);
-            }
-        }
-        LOG.info("Requested all NCs and CCs. Wait for things to settle!");
-        numRequestedContainers.set(numNodes);
-        numTotalContainers = numNodes;
-        doneAllocating = true;
-
-    }
-
-    /**
-     * Asks the RM for a particular host, nicely.
-     *
-     * @param host
-     *            The host to request
-     * @param cc
-     *            Whether or not the host is the CC
-     * @return A container request that is (hopefully) for the host we asked for.
-     */
-    private ContainerRequest hostToRequest(String host, boolean cc) throws UnknownHostException {
-        InetAddress hostIp = InetAddress.getByName(host);
-        Priority pri = Records.newRecord(Priority.class);
-        pri.setPriority(0);
-        Resource capability = Records.newRecord(Resource.class);
-        if (cc) {
-            capability.setMemory(ccMem);
-        } else {
-            capability.setMemory(ncMem);
-        }
-        //we dont set anything else because we don't care about that and yarn doesn't honor it yet
-        String[] hosts = new String[1];
-        //TODO this is silly
-        hosts[0] = hostIp.getHostName();
-        LOG.info("IP addr: " + host + " resolved to " + hostIp.getHostName());
-        ContainerRequest request = new ContainerRequest(capability, hosts, null, pri, false);
-        LOG.info("Requested host ask: " + request.getNodes());
-        return request;
-    }
-
-    /**
-     * Determines whether or not a container is the one on which the CC should reside
-     *
-     * @param c
-     *            The container in question
-     * @return True if the container should have the CC process on it, false otherwise.
-     */
-    boolean containerIsCC(Container c) {
-        String containerHost = c.getNodeId().getHost();
-        try {
-            InetAddress containerIp = InetAddress.getByName(containerHost);
-            LOG.info(containerIp.getCanonicalHostName());
-            InetAddress ccIp = InetAddress.getByName(cC.getClusterIp());
-            LOG.info(ccIp.getCanonicalHostName());
-            return containerIp.getCanonicalHostName().equals(ccIp.getCanonicalHostName());
-        } catch (UnknownHostException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Attempts to find the Node in the Cluster Description that matches this container
-     *
-     * @param c
-     *            The container to resolve
-     * @return The node this container corresponds to
-     * @throws java.net.UnknownHostException
-     *             if the container isn't present in the description
-     */
-    Node containerToNode(Container c, Cluster cl) throws UnknownHostException {
-        String containerHost = c.getNodeId().getHost();
-        InetAddress containerIp = InetAddress.getByName(containerHost);
-        LOG.info("Resolved Container IP: " + containerIp);
-        for (Node node : cl.getNode()) {
-            InetAddress nodeIp = InetAddress.getByName(node.getClusterIp());
-            LOG.info(nodeIp + "?=" + containerIp);
-            if (nodeIp.equals(containerIp)) {
-                return node;
-            }
-        }
-        //if we find nothing, this is bad...
-        throw new java.net.UnknownHostException("Could not resolve container" + containerHost + " to node");
-    }
-
-    /**
-     * Here I am just pointing the Containers to the exisiting HDFS resources given by the Client
-     * filesystem of the nodes.
-     *
-     * @throws IOException
-     */
-    private void localizeDFSResources() throws IOException {
-        //if performing an 'offline' task, skip a lot of resource distribution
-        if (obliterate || backup || restore) {
-            if (appMasterJar == null || ("").equals(appMasterJar)) {
-                //this can happen in a jUnit testing environment. we don't need to set it there.
-                if (!conf.getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, false)) {
-                    throw new IllegalStateException("AM jar not provided in environment.");
-                } else {
-                    return;
-                }
-            }
-            FileSystem fs = FileSystem.get(conf);
-            FileStatus appMasterJarStatus = fs.getFileStatus(appMasterJar);
-            LocalResource obliteratorJar = Records.newRecord(LocalResource.class);
-            obliteratorJar.setType(LocalResourceType.FILE);
-            obliteratorJar.setVisibility(LocalResourceVisibility.PRIVATE);
-            obliteratorJar.setResource(ConverterUtils.getYarnUrlFromPath(appMasterJar));
-            obliteratorJar.setTimestamp(appMasterJarStatus.getModificationTime());
-            obliteratorJar.setSize(appMasterJarStatus.getLen());
-            localResources.put("asterix-yarn.jar", obliteratorJar);
-            LOG.info(localResources.values());
-            return;
-        }
-        //otherwise, distribute evertything to start up asterix
-
-        LocalResource asterixZip = Records.newRecord(LocalResource.class);
-
-        //this un-tar's the asterix distribution
-        asterixZip.setType(LocalResourceType.ARCHIVE);
-
-        asterixZip.setVisibility(LocalResourceVisibility.PRIVATE);
-        try {
-            asterixZip.setResource(ConverterUtils.getYarnUrlFromURI(new URI(asterixZipPath)));
-
-        } catch (URISyntaxException e) {
-            LOG.error("Error locating Asterix zip" + " in env, path=" + asterixZipPath);
-            throw new IOException(e);
-        }
-
-        asterixZip.setTimestamp(asterixZipTimestamp);
-        asterixZip.setSize(asterixZipLen);
-        localResources.put(ASTERIX_ZIP_NAME, asterixZip);
-
-        //now let's do the same for the cluster description XML
-        LocalResource asterixConf = Records.newRecord(LocalResource.class);
-        asterixConf.setType(LocalResourceType.FILE);
-
-        asterixConf.setVisibility(LocalResourceVisibility.PRIVATE);
-        try {
-            asterixConf.setResource(ConverterUtils.getYarnUrlFromURI(new URI(asterixConfPath)));
-        } catch (URISyntaxException e) {
-            LOG.error("Error locating Asterix config" + " in env, path=" + asterixConfPath);
-            throw new IOException(e);
-        }
-        //TODO: I could avoid localizing this everywhere by only calling this block on the metadata node.
-        asterixConf.setTimestamp(asterixConfTimestamp);
-        asterixConf.setSize(asterixConfLen);
-        localResources.put("cluster-config.xml", asterixConf);
-        //now add the libraries if there are any
-        try {
-            FileSystem fs = FileSystem.get(conf);
-            Path p = new Path(dfsBasePath, instanceConfPath + File.separator + "library" + Path.SEPARATOR);
-            if (fs.exists(p)) {
-                FileStatus[] dataverses = fs.listStatus(p);
-                for (FileStatus d : dataverses) {
-                    if (!d.isDirectory()) {
-                        throw new IOException("Library configuration directory structure is incorrect");
-                    }
-                    FileStatus[] libraries = fs.listStatus(d.getPath());
-                    for (FileStatus l : libraries) {
-                        if (l.isDirectory()) {
-                            throw new IOException("Library configuration directory structure is incorrect");
-                        }
-                        LocalResource lr = Records.newRecord(LocalResource.class);
-                        lr.setResource(ConverterUtils.getYarnUrlFromURI(l.getPath().toUri()));
-                        lr.setSize(l.getLen());
-                        lr.setTimestamp(l.getModificationTime());
-                        lr.setType(LocalResourceType.ARCHIVE);
-                        lr.setVisibility(LocalResourceVisibility.PRIVATE);
-                        localResources.put("library" + Path.SEPARATOR + d.getPath().getName() + Path.SEPARATOR
-                                + l.getPath().getName().split("\\.")[0], lr);
-                        LOG.info("Found library: " + l.getPath().toString());
-                        LOG.info(l.getPath().getName());
-                    }
-                }
-            }
-        } catch (FileNotFoundException e) {
-            LOG.info("No external libraries present");
-            //do nothing, it just means there aren't libraries. that is possible and ok
-            // it should be handled by the fs.exists(p) check though.
-        }
-        LOG.info(localResources.values());
-
-    }
-
-    private void printUsage(Options opts) {
-        new HelpFormatter().printHelp("ApplicationMaster", opts);
-    }
-
-    /**
-     * Start the AM and request all necessary resources.
-     *
-     * @return True if the run fully succeeded, false otherwise.
-     * @throws YarnException
-     * @throws IOException
-     */
-    public boolean run() throws YarnException, IOException {
-        LOG.info("Starting ApplicationMaster");
-
-        AMRMClientAsync.CallbackHandler allocListener = new RMCallbackHandler();
-        resourceManager = AMRMClientAsync.createAMRMClientAsync(1000, allocListener);
-        resourceManager.init(conf);
-        resourceManager.start();
-
-        containerListener = new NMCallbackHandler();
-        nmClientAsync = new NMClientAsyncImpl(containerListener);
-        nmClientAsync.init(conf);
-        nmClientAsync.start();
-
-        // Register self with ResourceManager
-        // This will start heartbeating to the RM
-        try {
-            appMasterHostname = InetAddress.getLocalHost().toString();
-        } catch (java.net.UnknownHostException uhe) {
-            appMasterHostname = uhe.toString();
-        }
-        RegisterApplicationMasterResponse response = resourceManager.registerApplicationMaster(appMasterHostname,
-                appMasterRpcPort, appMasterTrackingUrl);
-
-        // Dump out information about cluster capability as seen by the
-        // resource manager
-        int maxMem = response.getMaximumResourceCapability().getMemory();
-        LOG.info("Max mem capabililty of resources in this cluster " + maxMem);
-
-        try {
-            requestResources(clusterDesc);
-        } catch (YarnException e) {
-            LOG.error("Could not allocate resources properly:" + e.getMessage());
-            done = true;
-            throw e;
-        }
-        //now we just sit and listen for messages from the RM
-
-        while (!done) {
-            try {
-                Thread.sleep(200);
-            } catch (InterruptedException ex) {
-            }
-        }
-        finish();
-        return success;
-    }
-
-    /**
-     * Clean up, whether or not we were successful.
-     */
-    private void finish() {
-        // Join all launched threads
-        // needed for when we time out
-        // and we need to release containers
-        for (Thread launchThread : launchThreads) {
-            try {
-                launchThread.join(10000);
-            } catch (InterruptedException e) {
-                LOG.info("Exception thrown in thread join: " + e.getMessage());
-                //from https://stackoverflow.com/questions/4812570/how-to-store-printstacktrace-into-a-string
-                StringWriter errors = new StringWriter();
-                e.printStackTrace(new PrintWriter(errors));
-                LOG.error(errors.toString());
-            }
-        }
-
-        // When the application completes, it should stop all running containers
-        LOG.info("Application completed. Stopping running containers");
-        nmClientAsync.stop();
-
-        // When the application completes, it should send a finish application
-        // signal to the RM
-        LOG.info("Application completed. Signalling finish to RM");
-
-        FinalApplicationStatus appStatus;
-        String appMessage = null;
-        success = true;
-        if (numFailedContainers.get() == 0 && numCompletedContainers.get() == numTotalContainers) {
-            appStatus = FinalApplicationStatus.SUCCEEDED;
-        } else {
-            appStatus = FinalApplicationStatus.FAILED;
-            appMessage = "Diagnostics." + ", total=" + numTotalContainers + ", completed="
-                    + numCompletedContainers.get() + ", allocated=" + numAllocatedContainers.get() + ", failed="
-                    + numFailedContainers.get();
-            success = false;
-        }
-        try {
-            resourceManager.unregisterApplicationMaster(appStatus, appMessage, null);
-        } catch (YarnException ex) {
-            LOG.error("Failed to unregister application", ex);
-        } catch (IOException e) {
-            LOG.error("Failed to unregister application", e);
-        }
-        done = true;
-        resourceManager.stop();
-    }
-
-    /**
-     * This handles the information that comes in from the RM while the AM
-     * is running.
-     */
-    private class RMCallbackHandler implements AMRMClientAsync.CallbackHandler {
-        @Override
-        public void onContainersCompleted(List<ContainerStatus> completedContainers) {
-            LOG.info("Got response from RM for container ask, completedCnt=" + completedContainers.size());
-            for (ContainerStatus containerStatus : completedContainers) {
-                LOG.info("Got container status for containerID=" + containerStatus.getContainerId() + ", state="
-                        + containerStatus.getState() + ", exitStatus=" + containerStatus.getExitStatus()
-                        + ", diagnostics=" + containerStatus.getDiagnostics());
-
-                // non complete containers should not be here
-                if (containerStatus.getState() != ContainerState.COMPLETE) {
-                    throw new IllegalStateException("Non-completed container given as completed by RM.");
-                }
-
-                // increment counters for completed/failed containers
-                int exitStatus = containerStatus.getExitStatus();
-                if (0 != exitStatus) {
-                    // container failed
-                    numCompletedContainers.incrementAndGet();
-                    numFailedContainers.incrementAndGet();
-                } else {
-                    // nothing to do
-                    // container completed successfully
-                    numCompletedContainers.incrementAndGet();
-                    LOG.info("Container completed successfully." + ", containerId=" + containerStatus.getContainerId());
-                }
-            }
-            //stop infinite looping of run()
-            if (numCompletedContainers.get() + numFailedContainers.get() == numAllocatedContainers.get()
-                    && doneAllocating) {
-                done = true;
-            }
-        }
-
-        @Override
-        public void onContainersAllocated(List<Container> allocatedContainers) {
-            LOG.info("Got response from RM for container ask, allocatedCnt=" + allocatedContainers.size());
-            numAllocatedContainers.addAndGet(allocatedContainers.size());
-            for (Container allocatedContainer : allocatedContainers) {
-                synchronized (pendingNCs) {
-                    try {
-                        if (!pendingNCs.contains(containerToNode(allocatedContainer, clusterDesc)) && ccUp.get()) {
-                            nmClientAsync.stopContainerAsync(allocatedContainer.getId(),
-                                    allocatedContainer.getNodeId());
-                            continue;
-                        }
-                    } catch (UnknownHostException ex) {
-                        LOG.error("Unknown host allocated for us by RM- this shouldn't happen.", ex);
-                    }
-                }
-                LOG.info("Launching shell command on a new container." + ", containerId=" + allocatedContainer.getId()
-                        + ", containerNode=" + allocatedContainer.getNodeId().getHost() + ":"
-                        + allocatedContainer.getNodeId().getPort() + ", containerNodeURI="
-                        + allocatedContainer.getNodeHttpAddress() + ", containerResourceMemory"
-                        + allocatedContainer.getResource().getMemory());
-
-                LaunchAsterixContainer runnableLaunchContainer = new LaunchAsterixContainer(allocatedContainer,
-                        containerListener);
-                Thread launchThread = new Thread(runnableLaunchContainer, "Asterix CC/NC");
-
-                // I want to know if this node is the CC, because it must start before the NCs.
-                LOG.info("Allocated: " + allocatedContainer.getNodeId().getHost());
-                LOG.info("CC : " + cC.getId());
-                synchronized (pendingNCs) {
-                    try {
-                        if (ccUp.get()) {
-                            pendingNCs.remove(containerToNode(allocatedContainer, clusterDesc));
-                        }
-                    } catch (UnknownHostException ex) {
-                        LOG.error("Unknown host allocated for us by RM- this shouldn't happen.", ex);
-                    }
-                }
-
-                if (containerIsCC(allocatedContainer)) {
-                    ccUp.set(true);
-                }
-                // launch and start the container on a separate thread to keep
-                // the main thread unblocked
-                // as all containers may not be allocated at one go.
-                launchThreads.add(launchThread);
-                launchThread.start();
-            }
-        }
-
-        /**
-         * Ask the processes on the container to gracefully exit.
-         */
-        @Override
-        public void onShutdownRequest() {
-            LOG.info("AM shutting down per request");
-            done = true;
-        }
-
-        @Override
-        public void onNodesUpdated(List<NodeReport> updatedNodes) {
-            //TODO: This will become important when we deal with what happens if an NC dies
-        }
-
-        @Override
-        public float getProgress() {
-            //return half way because progress is basically meaningless for us
-            if (!doneAllocating) {
-                return 0.0f;
-            }
-            return (float) 0.5;
-        }
-
-        @Override
-        public void onError(Throwable arg0) {
-            LOG.error("Fatal Error recieved by AM: " + arg0);
-            done = true;
-        }
-    }
-
-    private class NMCallbackHandler implements NMClientAsync.CallbackHandler {
-
-        private ConcurrentMap<ContainerId, Container> containers = new ConcurrentHashMap<>();
-
-        public void addContainer(ContainerId containerId, Container container) {
-            containers.putIfAbsent(containerId, container);
-        }
-
-        @Override
-        public void onContainerStopped(ContainerId containerId) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Succeeded to stop Container " + containerId);
-            }
-            containers.remove(containerId);
-        }
-
-        @Override
-        public void onContainerStatusReceived(ContainerId containerId, ContainerStatus containerStatus) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Container Status: id=" + containerId + ", status=" + containerStatus);
-            }
-        }
-
-        @Override
-        public void onContainerStarted(ContainerId containerId, Map<String, ByteBuffer> allServiceResponse) {
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Succeeded to start Container " + containerId);
-            }
-            Container container = containers.get(containerId);
-            if (container != null) {
-                nmClientAsync.getContainerStatusAsync(containerId, container.getNodeId());
-            }
-        }
-
-        @Override
-        public void onStartContainerError(ContainerId containerId, Throwable t) {
-            LOG.error("Failed to start Container " + containerId);
-            containers.remove(containerId);
-        }
-
-        @Override
-        public void onGetContainerStatusError(ContainerId containerId, Throwable t) {
-            LOG.error("Failed to query the status of Container " + containerId);
-        }
-
-        @Override
-        public void onStopContainerError(ContainerId containerId, Throwable t) {
-            LOG.error("Failed to stop Container " + containerId);
-            containers.remove(containerId);
-        }
-    }
-
-    /**
-     * Thread to connect to the {@link ContainerManagementProtocol} and launch the container
-     * that will execute the shell command.
-     */
-    private class LaunchAsterixContainer implements Runnable {
-
-        // Allocated container
-        final Container container;
-
-        final NMCallbackHandler containerListener;
-
-        /**
-         * @param lcontainer
-         *            Allocated container
-         * @param containerListener
-         *            Callback handler of the container
-         */
-        public LaunchAsterixContainer(Container lcontainer, NMCallbackHandler containerListener) {
-            this.container = lcontainer;
-            this.containerListener = containerListener;
-        }
-
-        /**
-         * Connects to CM, sets up container launch context
-         * for shell command and eventually dispatches the container
-         * start request to the CM.
-         */
-        @Override
-        public void run() {
-            LOG.info("Setting up container launch container for containerid=" + container.getId());
-            ContainerLaunchContext ctx = Records.newRecord(ContainerLaunchContext.class);
-            // Set the local resources
-            ctx.setLocalResources(localResources);
-
-            //Set the env variables to be setup in the env where the application master will be run
-            LOG.info("Set the environment for the node");
-            Map<String, String> env = new HashMap<>();
-
-            // Add AppMaster.jar location to classpath
-            // At some point we should not be required to add
-            // the hadoop specific classpaths to the env.
-            // It should be provided out of the box.
-            // For now setting all required classpaths including
-            // the classpath to "." for the application jar
-            StringBuilder classPathEnv = new StringBuilder(Environment.CLASSPATH.$()).append(File.pathSeparatorChar)
-                    .append("." + File.pathSeparatorChar + "*");
-            for (String c : conf.getStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH,
-                    YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH)) {
-                classPathEnv.append(File.pathSeparatorChar);
-                classPathEnv.append(c.trim());
-            }
-            classPathEnv.append('.').append(File.pathSeparatorChar).append("log4j.properties");
-
-            // add the runtime classpath needed for tests to work
-            if (conf.getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, false)) {
-                classPathEnv.append(System.getProperty("path.separator"));
-                classPathEnv.append(System.getProperty("java.class.path"));
-                env.put("HADOOP_CONF_DIR", System.getProperty("user.dir") + File.separator + "target" + File.separator);
-            }
-
-            env.put("CLASSPATH", classPathEnv.toString());
-
-            ctx.setEnvironment(env);
-            LOG.info(ctx.getEnvironment().toString());
-            List<String> startCmd = null;
-            if (obliterate) {
-                LOG.debug("AM in obliterate mode");
-                startCmd = produceObliterateCommand(container);
-            } else if (backup) {
-                startCmd = produceBackupCommand(container);
-                LOG.debug("AM in backup mode");
-            } else if (restore) {
-                startCmd = produceRestoreCommand(container);
-                LOG.debug("AM in restore mode");
-            } else {
-                startCmd = produceStartCmd(container);
-            }
-
-            if (startCmd == null || startCmd.size() == 0) {
-                LOG.fatal("Could not map one or more NCs to NM container hosts- aborting!");
-                return;
-            }
-
-            for (String s : startCmd) {
-                LOG.info("Command to execute: " + s);
-            }
-            ctx.setCommands(startCmd);
-            containerListener.addContainer(container.getId(), container);
-            //finally start the container!?
-            nmClientAsync.startContainerAsync(container, ctx);
-        }
-
-        /**
-         * Determines for a given container what the necessary command line
-         * arguments are to start the Asterix processes on that instance
-         *
-         * @param container
-         *            The container to produce the commands for
-         * @return A list of the commands that should be executed
-         */
-        private List<String> produceStartCmd(Container container) {
-            List<String> commands = new ArrayList<>();
-            // Set the necessary command to execute on the allocated container
-            List<CharSequence> vargs = new ArrayList<>(5);
-
-            vargs.add(JAVA_HOME + File.separator + "bin" + File.separator + "java");
-            vargs.add("-classpath " + '\'' + ASTERIX_ZIP_NAME + File.separator + "repo" + File.separator + "*\'");
-            vargs.add("-Dapp.repo=" + ASTERIX_ZIP_NAME + File.separator + "repo" + File.separator);
-            //first see if this node is the CC
-            if (containerIsCC(container) && (ccStarted.get() == false)) {
-                LOG.info("CC found on container" + container.getNodeId().getHost());
-                //get our java opts
-                vargs.add(ccJavaOpts);
-                vargs.add(CC_CLASSNAME);
-                vargs.add("-app-class " + CCApplication.class.getName());
-                vargs.add("-address " + cC.getClusterIp());
-                vargs.add("-client-listen-address " + cC.getClientIp());
-                //pass CC optional parameters
-                if (clusterDesc.getHeartbeatPeriod() != null) {
-                    vargs.add("-heartbeat-period " + String.valueOf(clusterDesc.getHeartbeatPeriod().intValue()));
-                }
-                if (clusterDesc.getMaxHeartbeatLapsePeriods() != null) {
-                    vargs.add("-heartbeat-max-misses "
-                            + String.valueOf(clusterDesc.getMaxHeartbeatLapsePeriods().intValue()));
-                }
-                if (clusterDesc.getProfileDumpPeriod() != null) {
-                    vargs.add("-profile-dump-period " + String.valueOf(clusterDesc.getProfileDumpPeriod().intValue()));
-                }
-                if (clusterDesc.getJobHistorySize() != null) {
-                    vargs.add("-job-history-size " + String.valueOf(clusterDesc.getJobHistorySize().intValue()));
-                }
-                if (clusterDesc.getResultTimeToLive() != null) {
-                    vargs.add("-result-ttl " + String.valueOf(clusterDesc.getResultTimeToLive().intValue()));
-                }
-                if (clusterDesc.getResultSweepThreshold() != null) {
-                    vargs.add("-result-sweep-threshold "
-                            + String.valueOf(clusterDesc.getResultSweepThreshold().intValue()));
-                }
-                if (clusterDesc.getCcRoot() != null) {
-                    vargs.add("-root-dir " + clusterDesc.getCcRoot());
-                }
-                ccStarted.set(true);
-
-            } else {
-                //now we need to know what node we are on, so we can apply the correct properties
-
-                Node local;
-                try {
-                    local = containerToNode(container, clusterDesc);
-                    LOG.info("Attempting to start NC on host " + local.getId());
-                    String iodevice = local.getIodevices();
-                    if (iodevice == null) {
-                        iodevice = clusterDesc.getIodevices();
-                    }
-                    vargs.add(ncJavaOpts);
-                    vargs.add(NC_CLASSNAME);
-                    vargs.add("-app-class " + NCApplication.class.getName());
-                    vargs.add("-node-id " + local.getId());
-                    vargs.add("-cluster-address " + cC.getClusterIp());
-                    vargs.add("-iodevices " + iodevice);
-                    vargs.add("-address " + local.getClusterIp());
-                    vargs.add("-data-listen-address " + local.getClusterIp());
-                    vargs.add("-result-listen-address " + local.getClusterIp());
-                    if (initial) {
-                        vargs.add("-initial-run ");
-                    }
-                } catch (UnknownHostException e) {
-                    LOG.error("Unable to find NC or CC configured for host: " + container.getId() + " " + e);
-                }
-            }
-
-            // Add log redirect params
-            vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stdout");
-            vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stderr");
-
-            // Get final commmand
-            StringBuilder command = new StringBuilder();
-            for (CharSequence str : vargs) {
-                command.append(str).append(" ");
-            }
-            commands.add(command.toString());
-            LOG.error(Arrays.toString(commands.toArray()));
-            return commands;
-        }
-
-        private List<String> produceObliterateCommand(Container container) {
-            //if this container has no NCs on it, nothing will be there to delete.
-            Node local = null;
-            List<String> iodevices = null;
-            try {
-                local = containerToNode(container, clusterDesc);
-                if (local.getIodevices() == null) {
-                    iodevices = Arrays.asList(clusterDesc.getIodevices().split(",", -1));
-                } else {
-                    iodevices = Arrays.asList(local.getIodevices().split(",", -1));
-                }
-            } catch (UnknownHostException e) {
-                //we expect this may happen for the CC if it isn't colocated with an NC. otherwise it is not suppose to happen.
-                if (!containerIsCC(container)) {
-                    LOG.error("Unable to find NC configured for host: " + container.getId() + e);
-                    return null;
-                } else {
-                    return Arrays.asList("");
-                }
-            }
-            StringBuilder classPathEnv = new StringBuilder("").append("*");
-            classPathEnv.append(File.pathSeparatorChar).append("log4j.properties");
-
-            List<String> commands = new ArrayList<>();
-            Vector<CharSequence> vargs = new Vector<>(5);
-            vargs.add(JAVA_HOME + File.separator + "bin" + File.separator + "java");
-            vargs.add("-cp " + classPathEnv.toString());
-            vargs.add(OBLITERATOR_CLASSNAME);
-            for (String s : iodevices) {
-                vargs.add(s + File.separator + clusterDesc.getStore());
-                LOG.debug("Deleting from: " + s);
-                //logs only exist on 1st iodevice
-                if (iodevices.indexOf(s) == 0) {
-                    vargs.add(clusterDesc.getTxnLogDir() + "txnLogs" + File.separator);
-                    LOG.debug("Deleting logs from: " + clusterDesc.getTxnLogDir());
-                }
-            }
-            vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stdout");
-            vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stderr");
-            StringBuilder command = new StringBuilder();
-            for (CharSequence str : vargs) {
-                command.append(str).append(" ");
-            }
-            commands.add(command.toString());
-            return commands;
-        }
-
-        private List<String> produceBackupCommand(Container container) {
-            Node local = null;
-            List<String> iodevices = null;
-            try {
-                local = containerToNode(container, clusterDesc);
-                if (local.getIodevices() == null) {
-                    iodevices = Arrays.asList(clusterDesc.getIodevices().split(",", -1));
-                } else {
-                    iodevices = Arrays.asList(local.getIodevices().split(",", -1));
-                }
-            } catch (UnknownHostException e) {
-                //we expect this may happen for the CC if it isn't colocated with an NC. otherwise it is not suppose to happen.
-                if (!containerIsCC(container)) {
-                    LOG.error("Unable to find NC configured for host: " + container.getId() + e);
-                    return null;
-                } else {
-                    return Arrays.asList("");
-                }
-            }
-            StringBuilder classPathEnv = new StringBuilder("").append("." + File.separator + "*");
-            for (String c : conf.getStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH,
-                    YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH)) {
-                classPathEnv.append(File.pathSeparatorChar);
-                classPathEnv.append(c.trim());
-            }
-            classPathEnv.append(File.pathSeparatorChar).append("." + File.separator + "log4j.properties");
-
-            List<String> commands = new ArrayList<>();
-            Vector<CharSequence> vargs = new Vector<>(5);
-            vargs.add(JAVA_HOME + File.separator + "bin" + File.separator + "java");
-            vargs.add("-cp " + classPathEnv.toString());
-            vargs.add(HDFS_BACKUP_CLASSNAME);
-            vargs.add("-backup");
-
-            String dstBase = instanceConfPath + "backups" + Path.SEPARATOR + backupTimestamp + Path.SEPARATOR
-                    + local.getId();
-            try {
-                createBackupFolder(dstBase);
-            } catch (IOException e) {
-                //something very bad happened- return null to cause attempt to abort
-                return null;
-            }
-            for (String s : iodevices) {
-                List<String> ioComponents = Arrays.asList(s.split("\\/"));
-                StringBuilder dst = new StringBuilder().append(dstBase);
-                for (String io : ioComponents) {
-                    dst.append(io);
-                    if (ioComponents.indexOf(io) != ioComponents.size() - 1) {
-                        dst.append("_");
-                    }
-                }
-                dst.append(Path.SEPARATOR);
-                vargs.add(s + File.separator + clusterDesc.getStore() + "," + dst);
-                LOG.debug("Backing up from: " + s);
-                //logs only exist on 1st iodevice
-                if (iodevices.indexOf(s) == 0) {
-                    LOG.debug("Backing up logs from: " + clusterDesc.getTxnLogDir());
-                    vargs.add(clusterDesc.getTxnLogDir() + "txnLogs" + File.separator + "," + dst);
-                }
-            }
-            LOG.debug("Backing up to: " + instanceConfPath + "backups" + Path.SEPARATOR + local.getId());
-
-            vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stdout");
-            vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stderr");
-            StringBuilder command = new StringBuilder();
-            for (CharSequence str : vargs) {
-                command.append(str).append(" ");
-            }
-            commands.add(command.toString());
-            return commands;
-        }
-
-        private void createBackupFolder(String path) throws IOException {
-            FileSystem fs = FileSystem.get(conf);
-            Path backupFolder = new Path(path);
-            fs.mkdirs(backupFolder);
-        }
-
-        private List<String> produceRestoreCommand(Container container) {
-            if (containerIsCC(container)) {
-                List<String> blank = new ArrayList<>();
-                blank.add("");
-                return blank;
-            }
-            Node local = null;
-            List<String> iodevices = null;
-            try {
-                local = containerToNode(container, clusterDesc);
-                if (local.getIodevices() == null) {
-                    iodevices = Arrays.asList(clusterDesc.getIodevices().split(",", -1));
-                } else {
-                    iodevices = Arrays.asList(local.getIodevices().split(",", -1));
-                }
-            } catch (UnknownHostException e) {
-                //we expect this may happen for the CC if it isn't colocated with an NC. otherwise it is not suppose to happen.
-                if (!containerIsCC(container)) {
-                    LOG.error("Unable to find NC configured for host: " + container.getId() + e);
-                    return null;
-                } else {
-                    return Arrays.asList("");
-                }
-            }
-            StringBuilder classPathEnv = new StringBuilder("").append("." + File.separator + "*");
-            for (String c : conf.getStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH,
-                    YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH)) {
-                classPathEnv.append(File.pathSeparatorChar);
-                classPathEnv.append(c.trim());
-            }
-            classPathEnv.append(File.pathSeparatorChar).append("." + File.separator + "log4j.properties");
-
-            List<String> commands = new ArrayList<>();
-            Vector<CharSequence> vargs = new Vector<>(5);
-            vargs.add(JAVA_HOME + File.separator + "bin" + File.separator + "java");
-            vargs.add("-cp " + classPathEnv.toString());
-            vargs.add(HDFS_BACKUP_CLASSNAME);
-            vargs.add("-restore");
-            String srcBase = instanceConfPath + "backups" + Path.SEPARATOR + Long.parseLong(snapName) + Path.SEPARATOR
-                    + local.getId();
-            for (String s : iodevices) {
-                List<String> ioComponents = Arrays.asList(s.split("\\/"));
-                StringBuilder src = new StringBuilder().append(srcBase);
-                for (String io : ioComponents) {
-                    src.append(io);
-                    if (ioComponents.indexOf(io) != ioComponents.size() - 1) {
-                        src.append("_");
-                    }
-                }
-                src.append(Path.SEPARATOR);
-                try {
-                    FileSystem fs = FileSystem.get(conf);
-                    FileStatus[] backups = fs.listStatus(new Path(src.toString()));
-                    for (FileStatus b : backups) {
-                        if (!b.getPath().toString().contains("txnLogs")
-                                && !b.getPath().toString().contains(File.separator + StorageConstants.METADATA_ROOT)) {
-                            vargs.add(b.getPath() + "," + s + File.separator + clusterDesc.getStore());
-                        }
-                    }
-                } catch (IOException e) {
-                    LOG.error("Could not stat backup directory in DFS");
-                }
-                vargs.add(src + "," + s + clusterDesc.getStore());
-                LOG.debug("Restoring from: " + s);
-                //logs only exist on 1st iodevice
-                if (iodevices.indexOf(s) == 0) {
-                    vargs.add(src + "txnLogs" + File.separator + "," + clusterDesc.getTxnLogDir() + File.separator);
-
-                    LOG.debug("Restoring logs from: " + clusterDesc.getTxnLogDir());
-                }
-            }
-            LOG.debug("Restoring to: " + instanceConfPath + "backups" + Path.SEPARATOR + local.getId());
-
-            vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stdout");
-            vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "stderr");
-            StringBuilder command = new StringBuilder();
-            for (CharSequence str : vargs) {
-                command.append(str).append(" ");
-            }
-            commands.add(command.toString());
-            return commands;
-        }
-
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixYARNClient.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixYARNClient.java
deleted file mode 100644
index 0ccaf07..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/AsterixYARNClient.java
+++ /dev/null
@@ -1,1407 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.asterix.aoya;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.regex.Pattern;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.common.configuration.Coredump;
-import org.apache.asterix.common.configuration.Store;
-import org.apache.asterix.common.configuration.TransactionLogDir;
-import org.apache.asterix.event.schema.yarnCluster.Cluster;
-import org.apache.asterix.event.schema.yarnCluster.Node;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.io.filefilter.WildcardFileFilter;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.classification.InterfaceStability;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.service.Service.STATE;
-import org.apache.hadoop.yarn.api.ApplicationConstants;
-import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
-import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
-import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
-import org.apache.hadoop.yarn.api.records.LocalResource;
-import org.apache.hadoop.yarn.api.records.LocalResourceType;
-import org.apache.hadoop.yarn.api.records.LocalResourceVisibility;
-import org.apache.hadoop.yarn.api.records.Priority;
-import org.apache.hadoop.yarn.api.records.Resource;
-import org.apache.hadoop.yarn.api.records.YarnApplicationState;
-import org.apache.hadoop.yarn.client.api.YarnClient;
-import org.apache.hadoop.yarn.client.api.YarnClientApplication;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
-import org.apache.hadoop.yarn.exceptions.YarnException;
-import org.apache.hadoop.yarn.util.ConverterUtils;
-import org.apache.hadoop.yarn.util.Records;
-
-import com.google.common.collect.ImmutableMap;
-
-@InterfaceAudience.Public
-@InterfaceStability.Unstable
-public class AsterixYARNClient {
-
-    public static enum Mode {
-        INSTALL("install"),
-        START("start"),
-        STOP("stop"),
-        KILL("kill"),
-        DESTROY("destroy"),
-        ALTER("alter"),
-        LIBINSTALL("libinstall"),
-        DESCRIBE("describe"),
-        BACKUP("backup"),
-        LSBACKUP("lsbackups"),
-        RMBACKUP("rmbackup"),
-        RESTORE("restore"),
-        NOOP("");
-
-        public final String alias;
-
-        Mode(String alias) {
-            this.alias = alias;
-        }
-
-        public static Mode fromAlias(String a) {
-            return STRING_TO_MODE.get(a.toLowerCase());
-        }
-    }
-
-    public static final Map<String, AsterixYARNClient.Mode> STRING_TO_MODE = ImmutableMap.<String, AsterixYARNClient
-            .Mode> builder().put(Mode.INSTALL.alias, Mode.INSTALL).put(Mode.START.alias, Mode.START)
-            .put(Mode.STOP.alias, Mode.STOP).put(Mode.KILL.alias, Mode.KILL).put(Mode.DESTROY.alias, Mode.DESTROY)
-            .put(Mode.ALTER.alias, Mode.ALTER).put(Mode.LIBINSTALL.alias, Mode.LIBINSTALL)
-            .put(Mode.DESCRIBE.alias, Mode.DESCRIBE).put(Mode.BACKUP.alias, Mode.BACKUP)
-            .put(Mode.LSBACKUP.alias, Mode.LSBACKUP).put(Mode.RMBACKUP.alias, Mode.RMBACKUP)
-            .put(Mode.RESTORE.alias, Mode.RESTORE).build();
-    private static final Log LOG = LogFactory.getLog(AsterixYARNClient.class);
-    public static final String CONF_DIR_REL = ".asterix" + File.separator;
-    private static final String instanceLock = "instance";
-    public static final String CONFIG_DEFAULT_NAME = "cluster-config.xml";
-    public static final String PARAMS_DEFAULT_NAME = "asterix-configuration.xml";
-    private static String DEFAULT_PARAMETERS_PATH = "conf" + File.separator + "base-asterix-configuration.xml";
-    private static String MERGED_PARAMETERS_PATH = "conf" + File.separator + PARAMS_DEFAULT_NAME;
-    private static final String JAVA_HOME = System.getProperty("java.home");
-    public static final String NC_JAVA_OPTS_KEY = "nc.java.opts";
-    public static final String CC_JAVA_OPTS_KEY = "cc.java.opts";
-    public static final String CC_REST_PORT_KEY = "api.port";
-    private Mode mode = Mode.NOOP;
-
-    // Hadoop Configuration
-    private Configuration conf;
-    private YarnClient yarnClient;
-    // Application master specific info to register a new Application with
-    // RM/ASM
-    private String appName = "";
-    // App master priority
-    private int amPriority = 0;
-    // Queue for App master
-    private String amQueue = "";
-    // Amt. of memory resource to request for to run the App Master
-    private int amMemory = 1000;
-
-    // Main class to invoke application master
-    private final String appMasterMainClass = "org.apache.asterix.aoya.AsterixApplicationMaster";
-
-    //instance name
-    private String instanceName = "";
-    //location of distributable AsterixDB zip
-    private String asterixZip = "";
-    // Location of cluster configuration
-    private String asterixConf = "";
-    // Location of optional external libraries
-    private String extLibs = "";
-
-    private String instanceFolder = "";
-
-    // log4j.properties file
-    // if available, add to local resources and set into classpath
-    private String log4jPropFile = "";
-
-    // Debug flag
-    boolean debugFlag = false;
-    private boolean refresh = false;
-    private boolean force = false;
-
-    // Command line options
-    private Options opts;
-    private String libDataverse;
-    private String snapName = "";
-    private String baseConfig = ".";
-    private String ccJavaOpts = "";
-    private String ncJavaOpts = "";
-
-    //Ports
-    private int ccRestPort = 19002;
-
-    /**
-     * @param args
-     *            Command line arguments
-     */
-    public static void main(String[] args) {
-
-        try {
-            AsterixYARNClient client = new AsterixYARNClient();
-            try {
-                client.init(args);
-                AsterixYARNClient.execute(client);
-            } catch (ParseException | ApplicationNotFoundException e) {
-                LOG.fatal(e);
-                client.printUsage();
-                System.exit(-1);
-            }
-        } catch (Exception e) {
-            LOG.fatal("Error running client", e);
-            System.exit(1);
-        }
-        LOG.info("Command executed successfully.");
-        System.exit(0);
-    }
-
-    public static void execute(AsterixYARNClient client) throws IOException, YarnException {
-        YarnClientApplication app;
-        List<DFSResourceCoordinate> res;
-
-        System.out.println("JAVA HOME: " + JAVA_HOME);
-        switch (client.mode) {
-            case START:
-                startAction(client);
-                break;
-            case STOP:
-                try {
-                    client.stopInstance();
-                } catch (ApplicationNotFoundException e) {
-                    LOG.info(e);
-                    System.out.println("Asterix instance by that name already exited or was never started");
-                    client.deleteLockFile();
-                }
-                break;
-            case KILL:
-                if (client.isRunning() && Utils.confirmAction(
-                        "Are you sure you want to kill this instance? In-progress tasks will be aborted")) {
-                    try {
-                        AsterixYARNClient.killApplication(client.getLockFile(), client.yarnClient);
-                    } catch (ApplicationNotFoundException e) {
-                        LOG.info(e);
-                        System.out.println("Asterix instance by that name already exited or was never started");
-                        client.deleteLockFile();
-                    }
-                } else if (!client.isRunning()) {
-                    System.out.println("Asterix instance by that name already exited or was never started");
-                    client.deleteLockFile();
-                }
-                break;
-            case DESCRIBE:
-                Utils.listInstances(client.conf, CONF_DIR_REL);
-                break;
-            case INSTALL:
-                installAction(client);
-                break;
-            case LIBINSTALL:
-                client.installExtLibs();
-                break;
-            case ALTER:
-                client.writeAsterixConfig(Utils.parseYarnClusterConfig(client.asterixConf));
-                client.installAsterixConfig(true);
-                System.out.println("Configuration successfully modified");
-                break;
-            case DESTROY:
-                try {
-                    if (client.force || Utils.confirmAction(
-                            "Are you really sure you want to obliterate this instance? This action cannot be undone!")) {
-                        app = client.makeApplicationContext();
-                        res = client.deployConfig();
-                        res.addAll(client.distributeBinaries());
-                        client.removeInstance(app, res);
-                    }
-                } catch (YarnException | IOException e) {
-                    LOG.error("Asterix failed to deploy on to cluster");
-                    throw e;
-                }
-                break;
-            case BACKUP:
-                if (client.force || Utils.confirmAction("Performing a backup will stop a running instance.")) {
-                    app = client.makeApplicationContext();
-                    res = client.deployConfig();
-                    res.addAll(client.distributeBinaries());
-                    client.backupInstance(app, res);
-                }
-                break;
-            case LSBACKUP:
-                Utils.listBackups(client.conf, CONF_DIR_REL, client.instanceName);
-                break;
-            case RMBACKUP:
-                Utils.rmBackup(client.conf, CONF_DIR_REL, client.instanceName, Long.parseLong(client.snapName));
-                break;
-            case RESTORE:
-                if (client.force || Utils.confirmAction("Performing a restore will stop a running instance.")) {
-                    app = client.makeApplicationContext();
-                    res = client.deployConfig();
-                    res.addAll(client.distributeBinaries());
-                    client.restoreInstance(app, res);
-                }
-                break;
-            default:
-                LOG.fatal(
-                        "Unknown mode. Known client modes are: start, stop, install, describe, kill, destroy, describe, backup, restore, lsbackup, rmbackup");
-                client.printUsage();
-                System.exit(-1);
-        }
-    }
-
-    private static void startAction(AsterixYARNClient client) throws YarnException {
-        YarnClientApplication app;
-        List<DFSResourceCoordinate> res;
-        ApplicationId appId;
-        try {
-            app = client.makeApplicationContext();
-            res = client.deployConfig();
-            res.addAll(client.distributeBinaries());
-            appId = client.deployAM(app, res, client.mode);
-            LOG.info("Asterix started up with Application ID: " + appId.toString());
-            if (Utils.waitForLiveness(appId, "Waiting for AsterixDB instance to resume ", client.yarnClient,
-                    client.instanceName, client.conf, client.ccRestPort)) {
-                System.out.println("Asterix successfully deployed and is now running.");
-            } else {
-                LOG.fatal("AsterixDB appears to have failed to install and start");
-                throw new YarnException("AsterixDB appears to have failed to install and start");
-            }
-        } catch (IOException e) {
-            throw new YarnException(e);
-        }
-    }
-
-    private static void installAction(AsterixYARNClient client) throws YarnException {
-        YarnClientApplication app;
-        List<DFSResourceCoordinate> res;
-        ApplicationId appId;
-        try {
-            app = client.makeApplicationContext();
-            client.installConfig();
-            client.writeAsterixConfig(Utils.parseYarnClusterConfig(client.asterixConf));
-            client.installAsterixConfig(false);
-            res = client.deployConfig();
-            res.addAll(client.distributeBinaries());
-
-            appId = client.deployAM(app, res, client.mode);
-            LOG.info("Asterix started up with Application ID: " + appId.toString());
-            if (Utils.waitForLiveness(appId, "Waiting for new AsterixDB Instance to start ", client.yarnClient,
-                    client.instanceName, client.conf, client.ccRestPort)) {
-                System.out.println("Asterix successfully deployed and is now running.");
-            } else {
-                LOG.fatal("AsterixDB appears to have failed to install and start");
-                throw new YarnException("AsterixDB appears to have failed to install and start");
-            }
-        } catch (IOException e) {
-            LOG.fatal("Asterix failed to deploy on to cluster");
-            throw new YarnException(e);
-        }
-    }
-
-    public AsterixYARNClient(Configuration conf) throws Exception {
-
-        this.conf = conf;
-        yarnClient = YarnClient.createYarnClient();
-        //If the HDFS jars aren't on the classpath this won't be set
-        if (conf.get("fs.hdfs.impl", null) == conf.get("fs.file.impl", null)) { //only would happen if both are null
-            conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
-            conf.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem");
-        }
-        yarnClient.init(conf);
-        opts = parseConf(conf);
-    }
-
-    private static Options parseConf(Configuration conf) {
-        Options opts = new Options();
-        opts.addOption(new Option("appname", true, "Application Name. Default value - Asterix"));
-        opts.addOption(new Option("priority", true, "Application Priority. Default 0"));
-        opts.addOption(new Option("queue", true, "RM Queue in which this application is to be submitted"));
-        opts.addOption(new Option("master_memory", true,
-                "Amount of memory in MB to be requested to run the application master"));
-        opts.addOption(new Option("log_properties", true, "log4j.properties file"));
-        opts.addOption(new Option("n", "name", true, "Asterix instance name (required)"));
-        opts.addOption(
-                new Option("zip", "asterixZip", true, "zip file with AsterixDB inside- if in non-default location"));
-        opts.addOption(new Option("bc", "baseConfig", true,
-                "base Asterix parameters configuration file if not in default position"));
-        opts.addOption(new Option("c", "asterixConf", true, "Asterix cluster config (required on install)"));
-        opts.addOption(new Option("l", "externalLibs", true, "Libraries to deploy along with Asterix instance"));
-        opts.addOption(new Option("ld", "libDataverse", true, "Dataverse to deploy external libraries to"));
-        opts.addOption(new Option("r", "refresh", false,
-                "If starting an existing instance, this will replace them with the local copy on startup"));
-        opts.addOption(new Option("appId", true, "ApplicationID to monitor if running client in status monitor mode"));
-        opts.addOption(new Option("masterLibsDir", true, "Directory that contains the JARs needed to run the AM"));
-        opts.addOption(new Option("s", "snapshot", true,
-                "Backup timestamp for arguments requiring a specific backup (rm, restore)"));
-        opts.addOption(new Option("v", "debug", false, "Dump out debug information"));
-        opts.addOption(new Option("help", false, "Print usage"));
-        opts.addOption(
-                new Option("f", "force", false, "Execute this command as fully as possible, disregarding any caution"));
-        return opts;
-    }
-
-    /**
-    */
-    public AsterixYARNClient() throws Exception {
-        this(new YarnConfiguration());
-    }
-
-    /**
-     * Helper function to print out usage
-     */
-    private void printUsage() {
-        new HelpFormatter().printHelp("Asterix YARN client. Usage: asterix [options] [mode]", opts);
-    }
-
-    /**
-     * Initialize the client's arguments and parameters before execution.
-     *
-     * @param args
-     *            - Standard command-line arguments.
-     * @throws ParseException
-     */
-    public void init(String[] args) throws ParseException {
-
-        CommandLine cliParser = new GnuParser().parse(opts, args);
-        if (cliParser.hasOption("help")) {
-            printUsage();
-            return;
-        }
-        //initialize most things
-        debugFlag = cliParser.hasOption("debug");
-        force = cliParser.hasOption("force");
-        baseConfig = cliParser.getOptionValue("baseConfig");
-        extLibs = cliParser.getOptionValue("externalLibs");
-        libDataverse = cliParser.getOptionValue("libDataverse");
-
-        appName = cliParser.getOptionValue("appname", "AsterixDB");
-        amPriority = Integer.parseInt(cliParser.getOptionValue("priority", "0"));
-        amQueue = cliParser.getOptionValue("queue", "default");
-        amMemory = Integer.parseInt(cliParser.getOptionValue("master_memory", "10"));
-
-        instanceName = cliParser.getOptionValue("name");
-        instanceFolder = instanceName + '/';
-        appName = appName + ": " + instanceName;
-
-        asterixConf = cliParser.getOptionValue("asterixConf");
-
-        log4jPropFile = cliParser.getOptionValue("log_properties", "");
-
-        //see if the given argument values are sane in general
-        checkConfSanity(args, cliParser);
-
-        //intialize the mode, see if it is a valid one.
-        initMode(args, cliParser);
-
-        //now check the validity of the arguments given the mode
-        checkModeSanity(args, cliParser);
-
-        //if we are going to refresh the binaries, find that out
-        refresh = cliParser.hasOption("refresh");
-        //same goes for snapshot restoration/removal
-        snapName = cliParser.getOptionValue("snapshot");
-
-        if (!cliParser.hasOption("asterixZip")
-                && (mode == Mode.INSTALL || mode == Mode.ALTER || mode == Mode.DESTROY || mode == Mode.BACKUP)) {
-
-            asterixZip = cliParser.getOptionValue("asterixZip", getAsterixDistributableLocation().getAbsolutePath());
-        } else {
-            asterixZip = cliParser.getOptionValue("asterixZip");
-        }
-
-    }
-
-    /**
-     * Cursory sanity checks for argument sanity, without considering the mode of the client
-     *
-     * @param args
-     * @param cliParser
-     *            The parsed arguments.
-     * @throws ParseException
-     */
-    private void checkConfSanity(String[] args, CommandLine cliParser) throws ParseException {
-        String message = null;
-
-        //Sanity check for no args
-        if (args.length == 0) {
-            message = "No args specified for client to initialize";
-        }
-        //AM memory should be a sane value
-        else if (amMemory < 0) {
-            message = "Invalid memory specified for application master, exiting." + " Specified memory=" + amMemory;
-        }
-        //we're good!
-        else {
-            return;
-        }
-        //default:
-        throw new ParseException(message);
-
-    }
-
-    /**
-     * Initialize the mode of the client from the arguments.
-     *
-     * @param args
-     * @param cliParser
-     * @throws ParseException
-     */
-    private void initMode(String[] args, CommandLine cliParser) throws ParseException {
-        @SuppressWarnings("unchecked")
-        List<String> clientVerb = cliParser.getArgList();
-        String message = null;
-        //Now check if there is a mode
-        if (clientVerb == null || clientVerb.size() < 1) {
-            message = "You must specify an action.";
-        }
-        //But there can only be one mode...
-        else if (clientVerb.size() > 1) {
-            message = "Trailing arguments, or too many arguments. Only one action may be performed at a time.";
-        }
-        if (message != null) {
-            throw new ParseException(message);
-        }
-        //Now we can initialize the mode and check it against parameters
-        mode = Mode.fromAlias(clientVerb.get(0));
-        if (mode == null) {
-            mode = Mode.NOOP;
-        }
-    }
-
-    /**
-     * Determine if the command line arguments are sufficient for the requested client mode.
-     *
-     * @param args
-     *            The command line arguments.
-     * @param cliParser
-     *            Parsed command line arguments.
-     * @throws ParseException
-     */
-
-    private void checkModeSanity(String[] args, CommandLine cliParser) throws ParseException {
-
-        String message = null;
-        //The only time you can use the client without specifiying an instance, is to list all of the instances it sees.
-        if (!cliParser.hasOption("name") && mode != Mode.DESCRIBE) {
-            message = "You must give a name for the instance to be acted upon";
-        } else if (mode == Mode.INSTALL && !cliParser.hasOption("asterixConf")) {
-            message = "No Configuration XML given. Please specify a config for cluster installation";
-        } else if (mode != Mode.START && cliParser.hasOption("refresh")) {
-            message = "Cannot specify refresh in any mode besides start, mode is: " + mode;
-        } else if (cliParser.hasOption("snapshot") && !(mode == Mode.RESTORE || mode == Mode.RMBACKUP)) {
-            message = "Cannot specify a snapshot to restore in any mode besides restore or rmbackup, mode is: " + mode;
-        } else if ((mode == Mode.ALTER || mode == Mode.INSTALL) && baseConfig == null
-                && !(new File(DEFAULT_PARAMETERS_PATH).exists())) {
-            message = "Default asterix parameters file is not in the default location, and no custom location is specified";
-        }
-        //nothing is wrong, so exit
-        else {
-            return;
-        }
-        //otherwise, something is bad.
-        throw new ParseException(message);
-
-    }
-
-    /**
-     * Find the distributable asterix bundle, be it in the default location or in a user-specified location.
-     *
-     * @return
-     */
-    private File getAsterixDistributableLocation() {
-        //Look in the PWD for the "asterix" folder
-        File tarDir = new File("asterix");
-        if (!tarDir.exists()) {
-            throw new IllegalArgumentException(
-                    "Default directory structure not in use- please specify an asterix zip and base config file to distribute");
-        }
-        FileFilter tarFilter = new WildcardFileFilter("asterix-server*.zip");
-        File[] tarFiles = tarDir.listFiles(tarFilter);
-        if (tarFiles.length != 1) {
-            throw new IllegalArgumentException(
-                    "There is more than one canonically named asterix distributable in the default directory. Please leave only one there.");
-        }
-        return tarFiles[0];
-    }
-
-    /**
-     * Initialize and register the application attempt with the YARN ResourceManager.
-     *
-     * @return
-     * @throws IOException
-     * @throws YarnException
-     */
-    public YarnClientApplication makeApplicationContext() throws IOException, YarnException {
-
-        //first check to see if an instance already exists.
-        FileSystem fs = FileSystem.get(conf);
-        Path lock = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceFolder + instanceLock);
-        LOG.info("Running Deployment");
-        yarnClient.start();
-        if (fs.exists(lock)) {
-            ApplicationId lockAppId = getLockFile();
-            try {
-                ApplicationReport previousAppReport = yarnClient.getApplicationReport(lockAppId);
-                YarnApplicationState prevStatus = previousAppReport.getYarnApplicationState();
-                if (!(prevStatus == YarnApplicationState.FAILED || prevStatus == YarnApplicationState.KILLED
-                        || prevStatus == YarnApplicationState.FINISHED) && mode != Mode.DESTROY && mode != Mode.BACKUP
-                        && mode != Mode.RESTORE) {
-                    throw new IllegalStateException("Instance is already running in: " + lockAppId);
-                } else if (mode != Mode.DESTROY && mode != Mode.BACKUP && mode != Mode.RESTORE) {
-                    //stale lock file
-                    LOG.warn("Stale lockfile detected. Instance attempt " + lockAppId + " may have exited abnormally");
-                    deleteLockFile();
-                }
-            } catch (YarnException e) {
-                LOG.warn(
-                        "Stale lockfile detected, but the RM has no record of this application's last run. This is normal if the cluster was restarted.");
-                deleteLockFile();
-            }
-        }
-
-        // Get a new application id
-        YarnClientApplication app = yarnClient.createApplication();
-        GetNewApplicationResponse appResponse = app.getNewApplicationResponse();
-        int maxMem = appResponse.getMaximumResourceCapability().getMemory();
-        LOG.info("Max mem capabililty of resources in this cluster " + maxMem);
-
-        // A resource ask cannot exceed the max.
-        if (amMemory > maxMem) {
-            LOG.info("AM memory specified above max threshold of cluster. Using max value." + ", specified=" + amMemory
-                    + ", max=" + maxMem);
-            amMemory = maxMem;
-        }
-
-        // set the application name
-        ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();
-        appContext.setApplicationName(appName);
-
-        return app;
-    }
-
-    /**
-     * Upload the Asterix cluster description on to the DFS. This will persist the state of the instance.
-     *
-     * @return
-     * @throws YarnException
-     * @throws IOException
-     */
-    private List<DFSResourceCoordinate> deployConfig() throws YarnException, IOException {
-
-        FileSystem fs = FileSystem.get(conf);
-        List<DFSResourceCoordinate> resources = new ArrayList<DFSResourceCoordinate>(2);
-
-        String pathSuffix = CONF_DIR_REL + instanceFolder + CONFIG_DEFAULT_NAME;
-        Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-        FileStatus destStatus;
-        try {
-            destStatus = fs.getFileStatus(dstConf);
-        } catch (IOException e) {
-            throw new YarnException("Asterix instance by that name does not appear to exist in DFS");
-        }
-        LocalResource asterixConfLoc = Records.newRecord(LocalResource.class);
-        asterixConfLoc.setType(LocalResourceType.FILE);
-        asterixConfLoc.setVisibility(LocalResourceVisibility.PRIVATE);
-        asterixConfLoc.setResource(ConverterUtils.getYarnUrlFromPath(dstConf));
-        asterixConfLoc.setTimestamp(destStatus.getModificationTime());
-
-        DFSResourceCoordinate conf = new DFSResourceCoordinate();
-        conf.envs.put(dstConf.toUri().toString(), AConstants.CONFLOCATION);
-        conf.envs.put(Long.toString(asterixConfLoc.getSize()), AConstants.CONFLEN);
-        conf.envs.put(Long.toString(asterixConfLoc.getTimestamp()), AConstants.CONFTIMESTAMP);
-        conf.name = CONFIG_DEFAULT_NAME;
-        conf.res = asterixConfLoc;
-        resources.add(conf);
-
-        return resources;
-
-    }
-
-    /**
-     * Install the current Asterix parameters to the DFS. This can be modified via alter.
-     *
-     * @throws YarnException
-     * @throws IOException
-     */
-    private void installConfig() throws YarnException, IOException {
-        FileSystem fs = FileSystem.get(conf);
-        String pathSuffix = CONF_DIR_REL + instanceFolder + CONFIG_DEFAULT_NAME;
-        Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-        try {
-            fs.getFileStatus(dstConf);
-            if (mode == Mode.INSTALL) {
-                throw new IllegalStateException("Instance with this name already exists.");
-            }
-        } catch (FileNotFoundException e) {
-            if (mode == Mode.START) {
-                throw new IllegalStateException("Instance does not exist for this user", e);
-            }
-        }
-        if (mode == Mode.INSTALL) {
-            Path src = new Path(asterixConf);
-            fs.copyFromLocalFile(false, true, src, dstConf);
-        }
-
-    }
-
-    /**
-     * Upload External libraries and functions to HDFS for an instance to use when started
-     *
-     * @throws IllegalStateException
-     * @throws IOException
-     */
-
-    private void installExtLibs() throws IllegalStateException, IOException {
-        FileSystem fs = FileSystem.get(conf);
-        if (!instanceExists()) {
-            throw new IllegalStateException("No instance by name " + instanceName + " found.");
-        }
-        if (isRunning()) {
-            throw new IllegalStateException(
-                    "Instance " + instanceName + " is running. Please stop it before installing any libraries.");
-        }
-        String libPathSuffix = CONF_DIR_REL + instanceFolder + "library" + Path.SEPARATOR + libDataverse
-                + Path.SEPARATOR;
-        Path src = new Path(extLibs);
-        String fullLibPath = libPathSuffix + src.getName();
-        Path libFilePath = new Path(fs.getHomeDirectory(), fullLibPath);
-        LOG.info("Copying Asterix external library to DFS");
-        fs.copyFromLocalFile(false, true, src, libFilePath);
-    }
-
-    /**
-     * Finds the minimal classes and JARs needed to start the AM only.
-     *
-     * @return Resources the AM needs to start on the initial container.
-     * @throws IllegalStateException
-     * @throws IOException
-     */
-    private List<DFSResourceCoordinate> installAmLibs() throws IllegalStateException, IOException {
-        List<DFSResourceCoordinate> resources = new ArrayList<DFSResourceCoordinate>(2);
-        FileSystem fs = FileSystem.get(conf);
-        String fullLibPath = CONF_DIR_REL + instanceFolder + "am_jars" + Path.SEPARATOR;
-        String[] cp = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
-        String asterixJarPattern = "^(asterix).*(jar)$"; //starts with asterix,ends with jar
-        String commonsJarPattern = "^(commons).*(jar)$";
-        String surefireJarPattern = "^(surefire).*(jar)$"; //for maven tests
-        String jUnitTestPattern = "^(asterix-yarn" + File.separator + "target)$";
-
-        LOG.info(File.separator);
-        for (String j : cp) {
-            String[] pathComponents = j.split(Pattern.quote(File.separator));
-            LOG.info(j);
-            LOG.info(pathComponents[pathComponents.length - 1]);
-            if (pathComponents[pathComponents.length - 1].matches(asterixJarPattern)
-                    || pathComponents[pathComponents.length - 1].matches(commonsJarPattern)
-                    || pathComponents[pathComponents.length - 1].matches(surefireJarPattern)
-                    || pathComponents[pathComponents.length - 1].matches(jUnitTestPattern)) {
-                LOG.info("Loading JAR/classpath: " + j);
-                File f = new File(j);
-                Path dst = new Path(fs.getHomeDirectory(), fullLibPath + f.getName());
-                if (!fs.exists(dst) || refresh) {
-                    fs.copyFromLocalFile(false, true, new Path(f.getAbsolutePath()), dst);
-                }
-                FileStatus dstSt = fs.getFileStatus(dst);
-                LocalResource amLib = Records.newRecord(LocalResource.class);
-                amLib.setType(LocalResourceType.FILE);
-                amLib.setVisibility(LocalResourceVisibility.PRIVATE);
-                amLib.setResource(ConverterUtils.getYarnUrlFromPath(dst));
-                amLib.setTimestamp(dstSt.getModificationTime());
-                amLib.setSize(dstSt.getLen());
-                DFSResourceCoordinate amLibCoord = new DFSResourceCoordinate();
-                amLibCoord.res = amLib;
-                amLibCoord.name = f.getName();
-                if (f.getName().contains("asterix-yarn") || f.getName().contains("surefire")) {
-                    amLibCoord.envs.put(dst.toUri().toString(), AConstants.APPLICATIONMASTERJARLOCATION);
-                    amLibCoord.envs.put(Long.toString(dstSt.getLen()), AConstants.APPLICATIONMASTERJARLEN);
-                    amLibCoord.envs.put(Long.toString(dstSt.getModificationTime()),
-                            AConstants.APPLICATIONMASTERJARTIMESTAMP);
-                }
-                resources.add(amLibCoord);
-            }
-
-        }
-        if (resources.size() == 0) {
-            throw new IOException("Required JARs are missing. Please check your directory structure");
-        }
-        return resources;
-    }
-
-    /**
-     * Uploads a AsterixDB cluster configuration to HDFS for the AM to use.
-     *
-     * @param overwrite
-     *            Overwrite existing configurations by the same name.
-     * @throws IllegalStateException
-     * @throws IOException
-     */
-    private void installAsterixConfig(boolean overwrite) throws IllegalStateException, IOException {
-        FileSystem fs = FileSystem.get(conf);
-        File srcfile = new File(MERGED_PARAMETERS_PATH);
-        Path src = new Path(srcfile.getCanonicalPath());
-        String pathSuffix = CONF_DIR_REL + instanceFolder + File.separator + PARAMS_DEFAULT_NAME;
-        Path dst = new Path(fs.getHomeDirectory(), pathSuffix);
-        if (fs.exists(dst) && !overwrite) {
-
-            throw new IllegalStateException(
-                    "Instance exists. Please delete an existing instance before trying to overwrite");
-        }
-        fs.copyFromLocalFile(false, true, src, dst);
-    }
-
-    /**
-     * Uploads binary resources to HDFS for use by the AM
-     *
-     * @return
-     * @throws IOException
-     * @throws YarnException
-     */
-    public List<DFSResourceCoordinate> distributeBinaries() throws IOException, YarnException {
-
-        List<DFSResourceCoordinate> resources = new ArrayList<DFSResourceCoordinate>(2);
-        // Copy the application master jar to the filesystem
-        // Create a local resource to point to the destination jar path
-        FileSystem fs = FileSystem.get(conf);
-        Path src, dst;
-        FileStatus destStatus;
-        String pathSuffix;
-
-        // adding info so we can add the jar to the App master container path
-
-        // Add the asterix tarfile to HDFS for easy distribution
-        // Keep it all archived for now so add it as a file...
-
-        pathSuffix = CONF_DIR_REL + instanceFolder + "asterix-server.zip";
-        dst = new Path(fs.getHomeDirectory(), pathSuffix);
-        if (refresh) {
-            if (fs.exists(dst)) {
-                fs.delete(dst, false);
-            }
-        }
-        if (!fs.exists(dst)) {
-            src = new Path(asterixZip);
-            LOG.info("Copying Asterix distributable to DFS");
-            fs.copyFromLocalFile(false, true, src, dst);
-        }
-        destStatus = fs.getFileStatus(dst);
-        LocalResource asterixTarLoc = Records.newRecord(LocalResource.class);
-        asterixTarLoc.setType(LocalResourceType.ARCHIVE);
-        asterixTarLoc.setVisibility(LocalResourceVisibility.PRIVATE);
-        asterixTarLoc.setResource(ConverterUtils.getYarnUrlFromPath(dst));
-        asterixTarLoc.setTimestamp(destStatus.getModificationTime());
-
-        // adding info so we can add the tarball to the App master container path
-        DFSResourceCoordinate tar = new DFSResourceCoordinate();
-        tar.envs.put(dst.toUri().toString(), AConstants.TARLOCATION);
-        tar.envs.put(Long.toString(asterixTarLoc.getSize()), AConstants.TARLEN);
-        tar.envs.put(Long.toString(asterixTarLoc.getTimestamp()), AConstants.TARTIMESTAMP);
-        tar.res = asterixTarLoc;
-        tar.name = "asterix-server.zip";
-        resources.add(tar);
-
-        // Set the log4j properties if needed
-        if (!log4jPropFile.isEmpty()) {
-            Path log4jSrc = new Path(log4jPropFile);
-            Path log4jDst = new Path(fs.getHomeDirectory(), "log4j.props");
-            fs.copyFromLocalFile(false, true, log4jSrc, log4jDst);
-            FileStatus log4jFileStatus = fs.getFileStatus(log4jDst);
-            LocalResource log4jRsrc = Records.newRecord(LocalResource.class);
-            log4jRsrc.setType(LocalResourceType.FILE);
-            log4jRsrc.setVisibility(LocalResourceVisibility.PRIVATE);
-            log4jRsrc.setResource(ConverterUtils.getYarnUrlFromURI(log4jDst.toUri()));
-            log4jRsrc.setTimestamp(log4jFileStatus.getModificationTime());
-            log4jRsrc.setSize(log4jFileStatus.getLen());
-            DFSResourceCoordinate l4j = new DFSResourceCoordinate();
-            tar.res = log4jRsrc;
-            tar.name = "log4j.properties";
-            resources.add(l4j);
-        }
-
-        resources.addAll(installAmLibs());
-        return resources;
-    }
-
-    /**
-     * Submits the request to start the AsterixApplicationMaster to the YARN ResourceManager.
-     *
-     * @param app
-     *            The application attempt handle.
-     * @param resources
-     *            Resources to be distributed as part of the container launch
-     * @param mode
-     *            The mode of the ApplicationMaster
-     * @return The application ID of the new Asterix instance.
-     * @throws IOException
-     * @throws YarnException
-     */
-
-    public ApplicationId deployAM(YarnClientApplication app, List<DFSResourceCoordinate> resources, Mode mode)
-            throws IOException, YarnException {
-
-        // Set up the container launch context for the application master
-        ContainerLaunchContext amContainer = Records.newRecord(ContainerLaunchContext.class);
-
-        ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();
-
-        // Set local resource info into app master container launch context
-        Map<String, LocalResource> localResources = new HashMap<String, LocalResource>();
-        for (DFSResourceCoordinate res : resources) {
-            localResources.put(res.name, res.res);
-        }
-        amContainer.setLocalResources(localResources);
-        // Set the env variables to be setup in the env where the application
-        // master will be run
-        LOG.info("Set the environment for the application master");
-        Map<String, String> env = new HashMap<String, String>();
-
-        // using the env info, the application master will create the correct
-        // local resource for the
-        // eventual containers that will be launched to execute the shell
-        // scripts
-        for (DFSResourceCoordinate res : resources) {
-            if (res.envs == null) { //some entries may not have environment variables.
-                continue;
-            }
-            for (Map.Entry<String, String> e : res.envs.entrySet()) {
-                env.put(e.getValue(), e.getKey());
-            }
-        }
-        //this is needed for when the RM address isn't known from the environment of the AM
-        env.put(AConstants.RMADDRESS, conf.get("yarn.resourcemanager.address"));
-        env.put(AConstants.RMSCHEDULERADDRESS, conf.get("yarn.resourcemanager.scheduler.address"));
-        ///add miscellaneous environment variables.
-        env.put(AConstants.INSTANCESTORE, CONF_DIR_REL + instanceFolder);
-        env.put(AConstants.DFS_BASE, FileSystem.get(conf).getHomeDirectory().toUri().toString());
-        env.put(AConstants.CC_JAVA_OPTS, ccJavaOpts);
-        env.put(AConstants.NC_JAVA_OPTS, ncJavaOpts);
-
-        // Add AppMaster.jar location to classpath
-        // At some point we should not be required to add
-        // the hadoop specific classpaths to the env.
-        // It should be provided out of the box.
-        // For now setting all required classpaths including
-        // the classpath to "." for the application jar
-        StringBuilder classPathEnv = new StringBuilder("").append("./*");
-        for (String c : conf.getStrings(YarnConfiguration.YARN_APPLICATION_CLASSPATH,
-                YarnConfiguration.DEFAULT_YARN_APPLICATION_CLASSPATH)) {
-            classPathEnv.append(File.pathSeparatorChar);
-            classPathEnv.append(c.trim());
-        }
-        classPathEnv.append(File.pathSeparatorChar).append("." + File.separator + "log4j.properties");
-
-        // add the runtime classpath needed for tests to work
-        if (conf.getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER, false)) {
-            LOG.info("In YARN MiniCluster");
-            classPathEnv.append(System.getProperty("path.separator"));
-            classPathEnv.append(System.getProperty("java.class.path"));
-            env.put("HADOOP_CONF_DIR", System.getProperty("user.dir") + File.separator + "target" + File.separator);
-        }
-        LOG.info("AM Classpath:" + classPathEnv.toString());
-        env.put("CLASSPATH", classPathEnv.toString());
-
-        amContainer.setEnvironment(env);
-
-        // Set the necessary command to execute the application master
-        Vector<CharSequence> vargs = new Vector<CharSequence>(30);
-
-        // Set java executable command
-        LOG.info("Setting up app master command");
-        vargs.add(JAVA_HOME + File.separator + "bin" + File.separator + "java");
-        // Set class name
-        vargs.add(appMasterMainClass);
-        //Set params for Application Master
-        if (debugFlag) {
-            vargs.add("-debug");
-        }
-        if (mode == Mode.DESTROY) {
-            vargs.add("-obliterate");
-        } else if (mode == Mode.BACKUP) {
-            vargs.add("-backup");
-        } else if (mode == Mode.RESTORE) {
-            vargs.add("-restore " + snapName);
-        } else if (mode == Mode.INSTALL) {
-            vargs.add("-initial ");
-        }
-        if (refresh) {
-            vargs.add("-refresh");
-        }
-        //vargs.add("/bin/ls -alh asterix-server.zip/repo");
-        vargs.add("1>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "AppMaster.stdout");
-        vargs.add("2>" + ApplicationConstants.LOG_DIR_EXPANSION_VAR + File.separator + "AppMaster.stderr");
-        // Get final commmand
-        StringBuilder command = new StringBuilder();
-        for (CharSequence str : vargs) {
-            command.append(str).append(" ");
-        }
-
-        LOG.info("Completed setting up app master command " + command.toString());
-        List<String> commands = new ArrayList<String>();
-        commands.add(command.toString());
-        amContainer.setCommands(commands);
-
-        // Set up resource type requirements
-        // For now, only memory is supported so we set memory requirements
-        Resource capability = Records.newRecord(Resource.class);
-        capability.setMemory(amMemory);
-        appContext.setResource(capability);
-
-        // Service data is a binary blob that can be passed to the application
-        // Not needed in this scenario
-        // amContainer.setServiceData(serviceData);
-
-        // The following are not required for launching an application master
-        // amContainer.setContainerId(containerId);
-
-        appContext.setAMContainerSpec(amContainer);
-
-        // Set the priority for the application master
-        Priority pri = Records.newRecord(Priority.class);
-        // TODO - what is the range for priority? how to decide?
-        pri.setPriority(amPriority);
-        appContext.setPriority(pri);
-
-        // Set the queue to which this application is to be submitted in the RM
-        appContext.setQueue(amQueue);
-
-        // Submit the application to the applications manager
-        // SubmitApplicationResponse submitResp =
-        // applicationsManager.submitApplication(appRequest);
-        // Ignore the response as either a valid response object is returned on
-        // success
-        // or an exception thrown to denote some form of a failure
-        LOG.info("Submitting application to ASM");
-
-        yarnClient.submitApplication(appContext);
-
-        //now write the instance lock
-        if (mode == Mode.INSTALL || mode == Mode.START) {
-            FileSystem fs = FileSystem.get(conf);
-            Path lock = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceFolder + instanceLock);
-            if (fs.exists(lock)) {
-                throw new IllegalStateException("Somehow, this instance has been launched twice. ");
-            }
-            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fs.create(lock, true)));
-            try {
-                out.write(app.getApplicationSubmissionContext().getApplicationId().toString());
-                out.close();
-            } finally {
-                out.close();
-            }
-        }
-        return app.getApplicationSubmissionContext().getApplicationId();
-
-    }
-
-    /**
-     * Asks YARN to kill a given application by appId
-     *
-     * @param appId
-     *            The application to kill.
-     * @param yarnClient
-     *            The YARN client object that is connected to the RM.
-     * @throws YarnException
-     * @throws IOException
-     */
-
-    public static void killApplication(ApplicationId appId, YarnClient yarnClient) throws YarnException, IOException {
-        if (appId == null) {
-            throw new YarnException("No Application given to kill");
-        }
-        if (yarnClient.isInState(STATE.INITED)) {
-            yarnClient.start();
-        }
-        YarnApplicationState st;
-        ApplicationReport rep = yarnClient.getApplicationReport(appId);
-        st = rep.getYarnApplicationState();
-        if (st == YarnApplicationState.FINISHED || st == YarnApplicationState.KILLED
-                || st == YarnApplicationState.FAILED) {
-            LOG.info("Application " + appId + " already exited.");
-            return;
-        }
-        LOG.info("Killing applicaiton with ID: " + appId);
-        yarnClient.killApplication(appId);
-
-    }
-
-    /**
-     * Tries to stop a running AsterixDB instance gracefully.
-     *
-     * @throws IOException
-     * @throws YarnException
-     */
-    private void stopInstanceIfRunning() throws IOException, YarnException {
-        FileSystem fs = FileSystem.get(conf);
-        String pathSuffix = CONF_DIR_REL + instanceFolder + CONFIG_DEFAULT_NAME;
-        Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-        //if the instance is up, fix that
-        if (isRunning()) {
-            try {
-                this.stopInstance();
-            } catch (IOException e) {
-                throw new YarnException(e);
-            }
-        } else if (!fs.exists(dstConf)) {
-            throw new YarnException("No instance configured with that name exists");
-        }
-    }
-
-    /**
-     * Start a YARN job to delete local AsterixDB resources of an extant instance
-     *
-     * @param app
-     *            The Client connection
-     * @param resources
-     *            AM resources
-     * @throws IOException
-     * @throws YarnException
-     */
-
-    private void removeInstance(YarnClientApplication app, List<DFSResourceCoordinate> resources)
-            throws IOException, YarnException {
-        FileSystem fs = FileSystem.get(conf);
-        //if the instance is up, fix that
-        stopInstanceIfRunning();
-        //now try deleting all of the on-disk artifacts on the cluster
-        ApplicationId deleter = deployAM(app, resources, Mode.DESTROY);
-        boolean delete_start = Utils.waitForApplication(deleter, yarnClient, "Waiting for deletion to start",
-                ccRestPort);
-        if (!delete_start) {
-            if (force) {
-                fs.delete(new Path(CONF_DIR_REL + instanceFolder), true);
-                LOG.error("Forcing deletion of HDFS resources");
-            }
-            LOG.fatal(" of on-disk persistient resources on individual nodes failed.");
-            throw new YarnException();
-        }
-        boolean deleted = waitForCompletion(deleter, "Deletion in progress");
-        if (!(deleted || force)) {
-            LOG.fatal("Cleanup of on-disk persistent resources failed.");
-            return;
-        } else {
-            fs.delete(new Path(CONF_DIR_REL + instanceFolder), true);
-        }
-        System.out.println("Deletion of instance succeeded.");
-
-    }
-
-    /**
-     * Start a YARN job to copy all data-containing resources of an AsterixDB instance to HDFS
-     *
-     * @param app
-     * @param resources
-     * @throws IOException
-     * @throws YarnException
-     */
-
-    private void backupInstance(YarnClientApplication app, List<DFSResourceCoordinate> resources)
-            throws IOException, YarnException {
-        stopInstanceIfRunning();
-        ApplicationId backerUpper = deployAM(app, resources, Mode.BACKUP);
-        boolean backupStart;
-        backupStart = Utils.waitForApplication(backerUpper, yarnClient,
-                "Waiting for backup " + backerUpper.toString() + "to start", ccRestPort);
-        if (!backupStart) {
-            LOG.fatal("Backup failed to start");
-            throw new YarnException();
-        }
-        boolean complete;
-        complete = waitForCompletion(backerUpper, "Backup in progress");
-        if (!complete) {
-            LOG.fatal("Backup failed- timeout waiting for completion");
-            return;
-        }
-        System.out.println("Backup of instance succeeded.");
-    }
-
-    /**
-     * Start a YARN job to copy a set of resources from backupInstance to restore the state of an extant AsterixDB instance
-     *
-     * @param app
-     * @param resources
-     * @throws IOException
-     * @throws YarnException
-     */
-
-    private void restoreInstance(YarnClientApplication app, List<DFSResourceCoordinate> resources)
-            throws IOException, YarnException {
-        stopInstanceIfRunning();
-        ApplicationId restorer = deployAM(app, resources, Mode.RESTORE);
-        boolean restoreStart = Utils.waitForApplication(restorer, yarnClient, "Waiting for restore to start",
-                ccRestPort);
-        if (!restoreStart) {
-            LOG.fatal("Restore failed to start");
-            throw new YarnException();
-        }
-        boolean complete = waitForCompletion(restorer, "Restore in progress");
-        if (!complete) {
-            LOG.fatal("Restore failed- timeout waiting for completion");
-            return;
-        }
-        System.out.println("Restoration of instance succeeded.");
-    }
-
-    /**
-     * Stops the instance and remove the lockfile to allow a restart.
-     *
-     * @throws IOException
-     * @throws JAXBException
-     * @throws YarnException
-     */
-
-    private void stopInstance() throws IOException, YarnException {
-        ApplicationId appId = getLockFile();
-        //get CC rest API port if it is nonstandard
-        readConfigParams(locateConfig());
-        if (yarnClient.isInState(STATE.INITED)) {
-            yarnClient.start();
-        }
-        System.out.println("Stopping instance " + instanceName);
-        if (!isRunning()) {
-            LOG.fatal("AsterixDB instance by that name is stopped already");
-            return;
-        }
-        try {
-            String ccIp = Utils.getCCHostname(instanceName, conf);
-            Utils.sendShutdownCall(ccIp, ccRestPort);
-        } catch (IOException e) {
-            LOG.error("Error while trying to issue safe shutdown:", e);
-        }
-        //now make sure it is actually gone and not "stuck"
-        String message = "Waiting for AsterixDB to shut down";
-        boolean completed = waitForCompletion(appId, message);
-        if (!completed && force) {
-            LOG.warn("Instance failed to stop gracefully, now killing it");
-            try {
-                AsterixYARNClient.killApplication(appId, yarnClient);
-                completed = true;
-            } catch (YarnException e1) {
-                LOG.fatal("Could not stop nor kill instance gracefully.", e1);
-                return;
-            }
-        }
-        if (completed) {
-            deleteLockFile();
-        }
-    }
-
-    private void deleteLockFile() throws IOException {
-        if (instanceName == null || instanceName == "") {
-            return;
-        }
-        FileSystem fs = FileSystem.get(conf);
-        Path lockPath = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceName + '/' + instanceLock);
-        if (fs.exists(lockPath)) {
-            fs.delete(lockPath, false);
-        }
-    }
-
-    private boolean instanceExists() throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        String pathSuffix = CONF_DIR_REL + instanceFolder + CONFIG_DEFAULT_NAME;
-        Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-        return fs.exists(dstConf);
-    }
-
-    private boolean isRunning() throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        String pathSuffix = CONF_DIR_REL + instanceFolder + CONFIG_DEFAULT_NAME;
-        Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-        if (fs.exists(dstConf)) {
-            Path lock = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceFolder + instanceLock);
-            return fs.exists(lock);
-        } else {
-            return false;
-        }
-    }
-
-    private ApplicationId getLockFile() throws IOException, YarnException {
-        if (instanceFolder == "") {
-            throw new IllegalStateException("Instance name not given.");
-        }
-        FileSystem fs = FileSystem.get(conf);
-        Path lockPath = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceFolder + instanceLock);
-        if (!fs.exists(lockPath)) {
-            throw new YarnException("Instance appears to not be running. If you know it is, try using kill");
-        }
-        BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(lockPath)));
-        String lockAppId = br.readLine();
-        br.close();
-        return ConverterUtils.toApplicationId(lockAppId);
-    }
-
-    public static ApplicationId getLockFile(String instanceName, Configuration conf) throws IOException {
-        if (instanceName == "") {
-            throw new IllegalStateException("Instance name not given.");
-        }
-        FileSystem fs = FileSystem.get(conf);
-        Path lockPath = new Path(fs.getHomeDirectory(), CONF_DIR_REL + instanceName + '/' + instanceLock);
-        if (!fs.exists(lockPath)) {
-            return null;
-        }
-        BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(lockPath)));
-        String lockAppId = br.readLine();
-        br.close();
-        return ConverterUtils.toApplicationId(lockAppId);
-    }
-
-    /**
-     * Locate the Asterix parameters file.
-     *
-     * @return
-     * @throws FileNotFoundException
-     * @throws IOException
-     */
-    private AsterixConfiguration locateConfig() throws FileNotFoundException, IOException {
-        AsterixConfiguration configuration;
-        String configPathBase = MERGED_PARAMETERS_PATH;
-        if (baseConfig != null) {
-            configuration = Utils.loadAsterixConfig(baseConfig);
-            configPathBase = new File(baseConfig).getParentFile().getAbsolutePath() + File.separator
-                    + PARAMS_DEFAULT_NAME;
-            MERGED_PARAMETERS_PATH = configPathBase;
-        } else {
-            configuration = Utils.loadAsterixConfig(DEFAULT_PARAMETERS_PATH);
-        }
-        return configuration;
-    }
-
-    /**
-     *
-     */
-    private void readConfigParams(AsterixConfiguration configuration) {
-        //this is the "base" config that is inside the zip, we start here
-        for (org.apache.asterix.common.configuration.Property property : configuration.getProperty()) {
-            if (property.getName().equalsIgnoreCase(CC_JAVA_OPTS_KEY)) {
-                ccJavaOpts = property.getValue();
-            } else if (property.getName().equalsIgnoreCase(NC_JAVA_OPTS_KEY)) {
-                ncJavaOpts = property.getValue();
-            } else if (property.getName().equalsIgnoreCase(CC_REST_PORT_KEY)) {
-                ccRestPort = Integer.parseInt(property.getValue());
-            }
-
-        }
-    }
-
-    /**
-     * Retrieves necessary information from the cluster configuration and splices it into the Asterix configuration parameters
-     *
-     * @param cluster
-     * @throws FileNotFoundException
-     * @throws IOException
-     */
-
-    private void writeAsterixConfig(Cluster cluster) throws FileNotFoundException, IOException {
-        String metadataNodeId = Utils.getMetadataNode(cluster).getId();
-        String asterixInstanceName = instanceName;
-
-        AsterixConfiguration configuration = locateConfig();
-
-        readConfigParams(configuration);
-
-        String version = Utils.getAsterixVersionFromClasspath();
-        configuration.setVersion(version);
-
-        configuration.setInstanceName(asterixInstanceName);
-        List<Store> stores = new ArrayList<Store>();
-        String storeDir = cluster.getStore().trim();
-        for (Node node : cluster.getNode()) {
-            String iodevices = node.getIodevices() == null ? cluster.getIodevices() : node.getIodevices();
-            String[] nodeIdDevice = iodevices.split(",");
-            StringBuilder nodeStores = new StringBuilder();
-            for (int i = 0; i < nodeIdDevice.length; i++) {
-                nodeStores.append(nodeIdDevice[i] + File.separator + storeDir + ",");
-            }
-            //remove last comma
-            nodeStores.deleteCharAt(nodeStores.length() - 1);
-            stores.add(new Store(node.getId(), nodeStores.toString()));
-        }
-        configuration.setStore(stores);
-        List<Coredump> coredump = new ArrayList<Coredump>();
-        String coredumpdir = null;
-        List<TransactionLogDir> txnLogDirs = new ArrayList<TransactionLogDir>();
-        String txnLogDir = null;
-        for (Node node : cluster.getNode()) {
-            coredumpdir = node.getLogDir() == null ? cluster.getLogDir() : node.getLogDir();
-            coredump.add(new Coredump(node.getId(), coredumpdir + "coredump" + File.separator));
-            txnLogDir = node.getTxnLogDir() == null ? cluster.getTxnLogDir() : node.getTxnLogDir(); //node or cluster-wide
-            txnLogDirs.add(new TransactionLogDir(node.getId(), txnLogDir
-                    + (txnLogDir.charAt(txnLogDir.length() - 1) == File.separatorChar ? File.separator : "")
-                    + "txnLogs" //if the string doesn't have a trailing / add one
-                    + File.separator));
-        }
-        configuration.setMetadataNode(metadataNodeId);
-        configuration.setCoredump(coredump);
-        configuration.setTransactionLogDir(txnLogDirs);
-        FileOutputStream os = new FileOutputStream(MERGED_PARAMETERS_PATH);
-        try {
-            JAXBContext ctx = JAXBContext.newInstance(AsterixConfiguration.class);
-            Marshaller marshaller = ctx.createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-
-            marshaller.marshal(configuration, os);
-        } catch (JAXBException e) {
-            throw new IOException(e);
-        } finally {
-            os.close();
-        }
-    }
-
-    private boolean waitForCompletion(ApplicationId appId, String message) throws YarnException, IOException {
-        return Utils.waitForApplication(appId, yarnClient, message, ccRestPort);
-    }
-
-    private class DFSResourceCoordinate {
-        String name;
-        LocalResource res;
-        Map<String, String> envs;
-
-        public DFSResourceCoordinate() {
-            envs = new HashMap<String, String>(3);
-        }
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Deleter.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Deleter.java
deleted file mode 100644
index 05ba774..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Deleter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.log4j.Level;
-import org.apache.log4j.LogManager;
-
-public class Deleter {
-    private static final Log LOG = LogFactory.getLog(Deleter.class);
-
-    public static void main(String[] args) throws IOException {
-
-        LogManager.getRootLogger().setLevel(Level.DEBUG);
-
-        LOG.info("Obliterator args: " + Arrays.toString(args));
-        for (int i = 0; i < args.length; i++) {
-            File f = new File(args[i]);
-            if (f.exists()) {
-                LOG.info("Deleting: " + f.getPath());
-                FileUtils.deleteDirectory(f);
-            } else {
-                LOG.error("Could not find file to delete: " + f.getPath());
-            }
-        }
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/HDFSBackup.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/HDFSBackup.java
deleted file mode 100644
index 5dc812a..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/HDFSBackup.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.GnuParser;
-import org.apache.commons.cli.Options;
-import org.apache.commons.cli.ParseException;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-
-public class HDFSBackup {
-    Configuration conf = new YarnConfiguration();
-    private static final Log LOG = LogFactory.getLog(AsterixApplicationMaster.class);
-    boolean restore = false;
-    boolean backup = false;
-
-    public static void main(String[] args) throws ParseException, IllegalArgumentException, IOException {
-
-        HDFSBackup back = new HDFSBackup();
-        Map<String, String> envs = System.getenv();
-        if (envs.containsKey("HADOOP_CONF_DIR")) {
-            File hadoopConfDir = new File(envs.get("HADOOP_CONF_DIR"));
-            if (hadoopConfDir.isDirectory()) {
-                for (File config : hadoopConfDir.listFiles()) {
-                    if (config.getName().matches("^.*(xml)$")) {
-                        back.conf.addResource(new Path(config.getAbsolutePath()));
-                    }
-                }
-            }
-        }
-        Options opts = new Options();
-        opts.addOption("restore", false, "");
-        opts.addOption("backup", false, "");
-        CommandLine cliParser = new GnuParser().parse(opts, args);
-        if (cliParser.hasOption("restore")) {
-            back.restore = true;
-        }
-        if (cliParser.hasOption("backup")) {
-            back.backup = true;
-        }
-        @SuppressWarnings("unchecked")
-        List<String> pairs = cliParser.getArgList();
-
-        List<Path[]> sources = new ArrayList<Path[]>(10);
-        for (String p : pairs) {
-            String[] s = p.split(",");
-            sources.add(new Path[] { new Path(s[0]), new Path(s[1]) });
-        }
-
-        try {
-            if (back.backup) {
-                back.performBackup(sources);
-            }
-            if (back.restore) {
-                back.performRestore(sources);
-            }
-        } catch (IOException e) {
-            LOG.fatal("Backup/restoration unsuccessful: " + e.getMessage());
-            throw e;
-        }
-    }
-
-    private void performBackup(List<Path[]> paths) throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        for (Path[] p : paths) {
-            LOG.info("Backing up " + p[0] + " to " + p[1] + ".");
-            fs.copyFromLocalFile(p[0], p[1]);
-        }
-    }
-
-    private void performRestore(List<Path[]> paths) throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        for (Path[] p : paths) {
-            LOG.info("Restoring " + p[0] + " to " + p[1] + ".");
-            File f = new File(p[1].toString() + File.separator + p[0].getName());
-            LOG.info(f.getAbsolutePath());
-            if (f.exists()) {
-                FileUtils.deleteDirectory(f);
-            }
-            LOG.info(f.exists());
-            fs.copyToLocalFile(false, p[0], p[1], true);
-        }
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Utils.java b/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Utils.java
deleted file mode 100644
index de9ec90..0000000
--- a/asterixdb/asterix-yarn/src/main/java/org/apache/asterix/aoya/Utils.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.ConnectException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Scanner;
-import java.util.regex.Pattern;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import org.apache.commons.httpclient.*;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.params.HttpMethodParams;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.yarn.api.records.ApplicationId;
-import org.apache.hadoop.yarn.api.records.ApplicationReport;
-import org.apache.hadoop.yarn.api.records.YarnApplicationState;
-import org.apache.hadoop.yarn.client.api.YarnClient;
-import org.apache.hadoop.yarn.exceptions.YarnException;
-
-import org.apache.asterix.common.configuration.AsterixConfiguration;
-import org.apache.asterix.event.schema.yarnCluster.Cluster;
-import org.apache.asterix.event.schema.yarnCluster.Node;
-
-public class Utils {
-
-    private Utils() {
-
-    }
-
-    private static final String CONF_DIR_REL = AsterixYARNClient.CONF_DIR_REL;
-
-    public static String hostFromContainerID(String containerID) {
-        return containerID.split("_")[4];
-    }
-
-    /**
-     * Gets the metadata node from an AsterixDB cluster description file
-     *
-     * @param cluster
-     *            The cluster description in question.
-     * @return
-     */
-    public static Node getMetadataNode(Cluster cluster) {
-        Node metadataNode = null;
-        if (cluster.getMetadataNode() != null) {
-            for (Node node : cluster.getNode()) {
-                if (node.getId().equals(cluster.getMetadataNode())) {
-                    metadataNode = node;
-                    break;
-                }
-            }
-        } else {
-            //I will pick one for you.
-            metadataNode = cluster.getNode().get(1);
-        }
-        return metadataNode;
-    }
-
-    /**
-     * Sends a "poison pill" message to an AsterixDB instance for it to shut down safely.
-     *
-     * @param host
-     *            The host to shut down.
-     * @throws IOException
-     */
-
-    public static void sendShutdownCall(String host, int port) throws IOException {
-        final String url = "http://" + host + ":" + port + "/admin/shutdown";
-        PostMethod method = new PostMethod(url);
-        try {
-            executeHTTPCall(method);
-        } catch (NoHttpResponseException e) {
-            //do nothing... this is expected
-        }
-        //now let's test that the instance is really down, or throw an exception
-        try {
-            executeHTTPCall(method);
-        } catch (ConnectException e) {
-            return;
-        }
-        throw new IOException("Instance did not shut down cleanly.");
-    }
-
-    /**
-     * Simple test via the AsterixDB Javascript API to determine if an instance is truly live or not.
-     * Queries the Metadata dataset and returns true if the query completes successfully, false otherwise.
-     *
-     * @param host
-     *            The host to run the query against
-     * @return
-     *         True if the instance is OK, false otherwise.
-     * @throws IOException
-     */
-    public static boolean probeLiveness(String host, int port) throws IOException {
-        final String url = "http://" + host + ":" + port + "/query";
-        final String test = "for $x in dataset Metadata.Dataset return $x;";
-        GetMethod method = new GetMethod(url);
-        method.setQueryString(new NameValuePair[] { new NameValuePair("query", test) });
-        InputStream response;
-        try {
-            response = executeHTTPCall(method);
-        } catch (ConnectException e) {
-            return false;
-        }
-        if (response == null) {
-            return false;
-        }
-        BufferedReader br = new BufferedReader(new InputStreamReader(response));
-        String result = br.readLine();
-        if (result == null) {
-            return false;
-        }
-        if(method.getStatusCode() != HttpStatus.SC_OK){
-            return false;
-        }
-        return true;
-    }
-
-    private static InputStream executeHTTPCall(HttpMethod method) throws HttpException, IOException {
-        HttpClient client = new HttpClient();
-        HttpMethodRetryHandler noop = new HttpMethodRetryHandler() {
-            @Override
-            public boolean retryMethod(final HttpMethod method, final IOException exception, int executionCount) {
-                return false;
-            }
-        };
-        client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, noop);
-        client.executeMethod(method);
-        return method.getResponseBodyAsStream();
-    }
-
-    //**
-
-    public static String makeDots(int iter) {
-        int pos = iter % 3;
-        char[] dots = { ' ', ' ', ' ' };
-        dots[pos] = '.';
-        return new String(dots);
-    }
-
-    public static boolean confirmAction(String warning) {
-        System.out.println(warning);
-        System.out.print("Are you sure you want to do this? (yes/no): ");
-        Scanner in = new Scanner(System.in);
-        while (true) {
-            try {
-                String input = in.nextLine();
-                if ("yes".equals(input)) {
-                    return true;
-                } else if ("no".equals(input)) {
-                    return false;
-                } else {
-                    System.out.println("Please type yes or no");
-                }
-            } finally {
-                in.close();
-            }
-        }
-    }
-
-    /**
-     * Lists the deployed instances of AsterixDB on a YARN cluster
-     *
-     * @param conf
-     *            Hadoop configuration object
-     * @param confDirRel
-     *            Relative AsterixDB configuration path for DFS
-     * @throws IOException
-     */
-
-    public static void listInstances(Configuration conf, String confDirRel) throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        Path instanceFolder = new Path(fs.getHomeDirectory(), confDirRel);
-        if (!fs.exists(instanceFolder)) {
-            System.out.println("No running or stopped AsterixDB instances exist in this cluster.");
-            return;
-        }
-        FileStatus[] instances = fs.listStatus(instanceFolder);
-        if (instances.length != 0) {
-            System.out.println("Existing AsterixDB instances: ");
-            for (int i = 0; i < instances.length; i++) {
-                FileStatus st = instances[i];
-                String name = st.getPath().getName();
-                ApplicationId lockFile = AsterixYARNClient.getLockFile(name, conf);
-                if (lockFile != null) {
-                    System.out.println("Instance " + name + " is running with Application ID: " + lockFile.toString());
-                } else {
-                    System.out.println("Instance " + name + " is stopped");
-                }
-            }
-        } else {
-            System.out.println("No running or stopped AsterixDB instances exist in this cluster");
-        }
-    }
-
-    /**
-     * Lists the backups in the DFS.
-     *
-     * @param conf
-     *            YARN configuration
-     * @param confDirRel
-     *            Relative config path
-     * @param instance
-     *            Instance name
-     * @throws IOException
-     */
-    public static void listBackups(Configuration conf, String confDirRel, String instance) throws IOException {
-        List<String> backups = getBackups(conf,confDirRel,instance);
-        if (backups.size() != 0) {
-            System.out.println("Backups for instance " + instance + ": ");
-            for (String name : backups) {
-                System.out.println("Backup: " + name);
-            }
-        } else {
-            System.out.println("No backups found for instance " + instance + ".");
-        }
-    }
-   /**
-    * Return the available snapshot names
-    * @param conf
-    * @param confDirRel
-    * @param instance
-    * @return
-    * @throws IOException
-    */
-    public static List<String> getBackups(Configuration conf, String confDirRel, String instance) throws IOException{
-        FileSystem fs = FileSystem.get(conf);
-        Path backupFolder = new Path(fs.getHomeDirectory(), confDirRel + "/" + instance + "/" + "backups");
-        FileStatus[] backups = fs.listStatus(backupFolder);
-        List<String> backupNames = new ArrayList<String>();
-        for(FileStatus f: backups){
-            backupNames.add(f.getPath().getName());
-        }
-        return backupNames;
-    }
-
-    /**
-     * Removes backup snapshots from the DFS
-     *
-     * @param conf
-     *            DFS Configuration
-     * @param confDirRel
-     *            Configuration relative directory
-     * @param instance
-     *            The asterix instance name
-     * @param timestamp
-     *            The snapshot timestap (ID)
-     * @throws IOException
-     */
-    public static void rmBackup(Configuration conf, String confDirRel, String instance, long timestamp)
-            throws IOException {
-        FileSystem fs = FileSystem.get(conf);
-        Path backupFolder = new Path(fs.getHomeDirectory(), confDirRel + "/" + instance + "/" + "backups");
-        FileStatus[] backups = fs.listStatus(backupFolder);
-        if (backups.length != 0) {
-            System.out.println("Backups for instance " + instance + ": ");
-        } else {
-            System.out.println("No backups found for instance " + instance + ".");
-        }
-        for (FileStatus f : backups) {
-            String name = f.getPath().getName();
-            long file_ts = Long.parseLong(name);
-            if (file_ts == timestamp) {
-                System.out.println("Deleting backup " + timestamp);
-                if (!fs.delete(f.getPath(), true)) {
-                    System.out.println("Backup could not be deleted");
-                    return;
-                } else {
-                    return;
-                }
-            }
-        }
-        System.out.println("No backup found with specified timestamp");
-
-    }
-
-    /**
-     * Simply parses out the YARN cluster config and instantiates it into a nice object.
-     *
-     * @return The object representing the configuration
-     * @throws FileNotFoundException
-     * @throws JAXBException
-     */
-    public static Cluster parseYarnClusterConfig(String path) throws YarnException {
-        try {
-            File f = new File(path);
-            JAXBContext configCtx = JAXBContext.newInstance(Cluster.class);
-            Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-            Cluster cl = (Cluster) unmarshaller.unmarshal(f);
-            return cl;
-        } catch (JAXBException e) {
-            throw new YarnException(e);
-        }
-    }
-
-    public static void writeYarnClusterConfig(String path, Cluster cl) throws YarnException {
-        try {
-            File f = new File(path);
-            JAXBContext configCtx = JAXBContext.newInstance(Cluster.class);
-            Marshaller marhsaller = configCtx.createMarshaller();
-            marhsaller.marshal(cl, f);
-        } catch (JAXBException e) {
-            throw new YarnException(e);
-        }
-    }
-
-    /**
-     * Looks in the current class path for AsterixDB libraries and gets the version number from the name of the first match.
-     *
-     * @return The version found, as a string.
-     */
-
-    public static String getAsterixVersionFromClasspath() {
-        String[] cp = System.getProperty("java.class.path").split(System.getProperty("path.separator"));
-        String asterixJarPattern = "^(asterix).*(jar)$"; //starts with asterix,ends with jar
-
-        for (String j : cp) {
-            //escape backslashes for windows
-            String[] pathComponents = j.split(Pattern.quote(File.separator));
-            if (pathComponents[pathComponents.length - 1].matches(asterixJarPattern)) {
-                //get components of maven version
-                String[] byDash = pathComponents[pathComponents.length - 1].split("-");
-                //get the version number but remove the possible '.jar' tailing it
-                String version = (byDash[2].split("\\."))[0];
-                //SNAPSHOT suffix
-                if (byDash.length == 4) {
-                    //do the same if it's a snapshot suffix
-                    return version + '-' + (byDash[3].split("\\."))[0];
-                }
-                //stable version
-                return version;
-            }
-        }
-        return null;
-    }
-
-    public static boolean waitForLiveness(ApplicationId appId, boolean probe, boolean print, String message,
-            YarnClient yarnClient, String instanceName, Configuration conf, int port) throws YarnException {
-        ApplicationReport report;
-        try {
-            report = yarnClient.getApplicationReport(appId);
-        } catch (IOException e) {
-            throw new YarnException(e);
-        }
-        YarnApplicationState st = report.getYarnApplicationState();
-        for (int i = 0; i < 120; i++) {
-            if (st != YarnApplicationState.RUNNING) {
-                try {
-                    report = yarnClient.getApplicationReport(appId);
-                    st = report.getYarnApplicationState();
-                    if (print) {
-                        System.out.print(message + Utils.makeDots(i) + "\r");
-                    }
-                    Thread.sleep(1000);
-                } catch (InterruptedException e1) {
-                    Thread.currentThread().interrupt();
-                } catch (IOException e1) {
-                    throw new YarnException(e1);
-                }
-                if (st == YarnApplicationState.FAILED || st == YarnApplicationState.FINISHED
-                        || st == YarnApplicationState.KILLED) {
-                    return false;
-                }
-            }
-            if (probe) {
-                String host;
-                host = getCCHostname(instanceName, conf);
-                try {
-                    for (int j = 0; j < 60; j++) {
-                        if (!Utils.probeLiveness(host, port)) {
-                            try {
-                                if (print) {
-                                    System.out.print(message + Utils.makeDots(i) + "\r");
-                                }
-                                Thread.sleep(1000);
-                            } catch (InterruptedException e2) {
-                                Thread.currentThread().interrupt();
-                            }
-                        } else {
-                            if (print) {
-                                System.out.println("");
-                            }
-                            return true;
-                        }
-                    }
-                } catch (IOException e1) {
-                    throw new YarnException(e1);
-                }
-            } else {
-                if (print) {
-                    System.out.println("");
-                }
-                return true;
-            }
-        }
-        if (print) {
-            System.out.println("");
-        }
-        return false;
-    }
-
-    public static boolean waitForLiveness(ApplicationId appId, String message, YarnClient yarnClient,
-            String instanceName, Configuration conf, int port) throws YarnException, IOException {
-        return waitForLiveness(appId, true, true, message, yarnClient, instanceName, conf, port);
-    }
-
-    public static boolean waitForApplication(ApplicationId appId, YarnClient yarnClient, String message, int port)
-            throws YarnException, IOException {
-        return waitForLiveness(appId, false, true, message, yarnClient, "", null, port);
-    }
-
-    public static boolean waitForApplication(ApplicationId appId, YarnClient yarnClient, int port) throws YarnException,
-            IOException, JAXBException {
-        return waitForLiveness(appId, false, false, "", yarnClient, "", null, port);
-    }
-
-    public static String getCCHostname(String instanceName, Configuration conf) throws YarnException {
-        try {
-            FileSystem fs = FileSystem.get(conf);
-            String instanceFolder = instanceName + "/";
-            String pathSuffix = CONF_DIR_REL + instanceFolder + "cluster-config.xml";
-            Path dstConf = new Path(fs.getHomeDirectory(), pathSuffix);
-            File tmp = File.createTempFile("cluster-config", "xml");
-            tmp.deleteOnExit();
-            fs.copyToLocalFile(dstConf, new Path(tmp.getPath()));
-            JAXBContext clusterConf = JAXBContext.newInstance(Cluster.class);
-            Unmarshaller unm = clusterConf.createUnmarshaller();
-            Cluster cl = (Cluster) unm.unmarshal(tmp);
-            String ccIp = cl.getMasterNode().getClientIp();
-            return ccIp;
-        } catch (IOException | JAXBException e) {
-            throw new YarnException(e);
-        }
-    }
-
-    public static AsterixConfiguration loadAsterixConfig(String path) throws IOException {
-        File f = new File(path);
-        try {
-            JAXBContext configCtx = JAXBContext.newInstance(AsterixConfiguration.class);
-            Unmarshaller unmarshaller = configCtx.createUnmarshaller();
-            AsterixConfiguration conf = (AsterixConfiguration) unmarshaller.unmarshal(f);
-            return conf;
-        } catch (JAXBException e) {
-            throw new IOException(e);
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-yarn/src/main/resources/base-asterix-configuration.xml b/asterixdb/asterix-yarn/src/main/resources/base-asterix-configuration.xml
deleted file mode 100644
index 17d88ae..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/base-asterix-configuration.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-
-  <property>
-    <name>nc.java.opts</name>
-    <value>-Xmx1536m</value>
-    <description>JVM parameters for each Node Contoller (NC)</description>
-  </property>
-
-  <property>
-    <name>cc.java.opts</name>
-    <value>-Xmx1024m</value>
-    <description>JVM parameters for each Cluster Contoller (CC)
-    </description>
-  </property>
-
-  <property>
-    <name>max.wait.active.cluster</name>
-    <value>60</value>
-    <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all nodes are available)
-      before a submitted query/statement can be executed. (Default = 60 seconds)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages in the buffer cache.
-      (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.size</name>
-    <value>512MB</value>
-    <description>The size of memory allocated to the disk buffer cache.
-      The value should be a multiple of the buffer cache page size(Default
-      = "536870912" // 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.maxopenfiles</name>
-    <value>214748364</value>
-    <description>The maximum number of open files in the buffer cache.
-      (Default = "214748364")
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages allocated to memory
-      components. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numpages</name>
-    <value>256</value>
-    <description>The number of pages to allocate for a memory component.
-      This budget is shared by all the memory components of the primary
-      index and all its secondary indexes across all I/O devices on a node.
-      Note: in-memory components usually has fill factor of 75% since
-      the pages are 75% full and the remaining 25% is un-utilized. (Default = 256)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.metadata.memorycomponent.numpages</name>
-    <value>64</value>
-    <description>The number of pages to allocate for a memory component.
-      (Default = 64)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numcomponents</name>
-    <value>2</value>
-    <description>The number of memory components to be used per lsm index.
-      (Default = 2)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.globalbudget</name>
-    <value>512MB</value>
-    <description>The total size of memory in bytes that the sum of all open memory
-      components cannot exceed. Consider this as the buffer cache for all memory
-      components of all indexes in a node. When this budget is fully used, a victim
-      dataset will be chosen. The chosen dataset must be evicted and closed to make
-      a space for another dataset. (Default = 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.lsm.bloomfilter.falsepositiverate</name>
-    <value>0.01</value>
-    <description>The maximum acceptable false positive rate for bloom
-      filters associated with LSM indexes. (Default = "0.01" // 1%)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.numpages</name>
-    <value>8</value>
-    <description>The number of in-memory log buffer pages. (Default = "8")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.pagesize</name>
-    <value>512KB</value>
-    <description>The size of pages in the in-memory log buffer. (Default =
-      "524288" // 512KB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.partitionsize</name>
-    <value>2GB</value>
-    <description>The maximum size of a log file partition allowed before
-      rotating the log to the next partition. (Default = "2147483648" //
-      2GB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.lsnthreshold</name>
-    <value>67108864</value>
-    <description>The size of the window that the maximum LSN is allowed to
-      be ahead of the checkpoint LSN by. (Default = ""67108864" // 64M)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.pollfrequency</name>
-    <value>120</value>
-    <description>The time in seconds between that the checkpoint thread
-      waits between polls. (Default = "120" // 120s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.history</name>
-    <value>0</value>
-    <description>The number of old log partition files to keep before
-      discarding. (Default = "0")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.escalationthreshold</name>
-    <value>1000</value>
-    <description>The number of entity level locks that need to be acquired
-      before the locks are coalesced and escalated into a dataset level
-      lock. (Default = "1000")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.shrinktimer</name>
-    <value>5000</value>
-    <description>The time in milliseconds to wait before deallocating
-      unused lock manager memory. (Default = "5000" // 5s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.waitthreshold</name>
-    <value>60000</value>
-    <description>The time in milliseconds to wait before labeling a
-      transaction which has been waiting for a lock timed-out. (Default =
-      "60000" // 60s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.sweepthreshold</name>
-    <value>10000</value>
-    <description>The time in milliseconds the timeout thread waits between
-      sweeps to detect timed-out transactions. (Default = "10000" // 10s)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.sortmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to sort operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.joinmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to join operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.framesize</name>
-    <value>128KB</value>
-    <description>The Hyracks frame size that the compiler configures per
-      job. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.pregelix.home</name>
-    <value>~/pregelix</value>
-  </property>
-
-  <property>
-    <name>web.port</name>
-    <value>19001</value>
-    <description>The port for the ASTERIX web interface. (Default = 19001)
-    </description>
-  </property>
-
-  <property>
-    <name>api.port</name>
-    <value>19002</value>
-    <description>The port for the ASTERIX API server. (Default = 19002)
-    </description>
-  </property>
-
-  <property>
-    <name>log.level</name>
-    <value>INFO</value>
-    <description>The minimum log level to be displayed. (Default = INFO)
-    </description>
-  </property>
-
-</asterixConfiguration>
diff --git a/asterixdb/asterix-yarn/src/main/resources/configs/asterix-client-log4j.properties b/asterixdb/asterix-yarn/src/main/resources/configs/asterix-client-log4j.properties
deleted file mode 100644
index f7bae57..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/configs/asterix-client-log4j.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-log4j.rootLogger=info, A1
-
-log4j.appender.A1=org.apache.log4j.ConsoleAppender
-log4j.appender.A1.layout=org.apache.log4j.PatternLayout
-# Print the date in ISO 8601 format
-log4j.appender.A1.layout.ConversionPattern=%-p: %m%n
-
-log4j.logger.org.apache.asterix.event.management=info
-log4j.logger.org.apache.zookeeper=info
diff --git a/asterixdb/asterix-yarn/src/main/resources/configs/base-asterix-configuration.xml b/asterixdb/asterix-yarn/src/main/resources/configs/base-asterix-configuration.xml
deleted file mode 100644
index 17d88ae..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/configs/base-asterix-configuration.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<asterixConfiguration xmlns="asterixconf">
-
-  <property>
-    <name>nc.java.opts</name>
-    <value>-Xmx1536m</value>
-    <description>JVM parameters for each Node Contoller (NC)</description>
-  </property>
-
-  <property>
-    <name>cc.java.opts</name>
-    <value>-Xmx1024m</value>
-    <description>JVM parameters for each Cluster Contoller (CC)
-    </description>
-  </property>
-
-  <property>
-    <name>max.wait.active.cluster</name>
-    <value>60</value>
-    <description>Maximum wait (in seconds) for a cluster to be ACTIVE (all nodes are available)
-      before a submitted query/statement can be executed. (Default = 60 seconds)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages in the buffer cache.
-      (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.size</name>
-    <value>512MB</value>
-    <description>The size of memory allocated to the disk buffer cache.
-      The value should be a multiple of the buffer cache page size(Default
-      = "536870912" // 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.buffercache.maxopenfiles</name>
-    <value>214748364</value>
-    <description>The maximum number of open files in the buffer cache.
-      (Default = "214748364")
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.pagesize</name>
-    <value>128KB</value>
-    <description>The page size in bytes for pages allocated to memory
-      components. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numpages</name>
-    <value>256</value>
-    <description>The number of pages to allocate for a memory component.
-      This budget is shared by all the memory components of the primary
-      index and all its secondary indexes across all I/O devices on a node.
-      Note: in-memory components usually has fill factor of 75% since
-      the pages are 75% full and the remaining 25% is un-utilized. (Default = 256)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.metadata.memorycomponent.numpages</name>
-    <value>64</value>
-    <description>The number of pages to allocate for a memory component.
-      (Default = 64)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.numcomponents</name>
-    <value>2</value>
-    <description>The number of memory components to be used per lsm index.
-      (Default = 2)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.memorycomponent.globalbudget</name>
-    <value>512MB</value>
-    <description>The total size of memory in bytes that the sum of all open memory
-      components cannot exceed. Consider this as the buffer cache for all memory
-      components of all indexes in a node. When this budget is fully used, a victim
-      dataset will be chosen. The chosen dataset must be evicted and closed to make
-      a space for another dataset. (Default = 512MB)
-    </description>
-  </property>
-
-  <property>
-    <name>storage.lsm.bloomfilter.falsepositiverate</name>
-    <value>0.01</value>
-    <description>The maximum acceptable false positive rate for bloom
-      filters associated with LSM indexes. (Default = "0.01" // 1%)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.numpages</name>
-    <value>8</value>
-    <description>The number of in-memory log buffer pages. (Default = "8")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.buffer.pagesize</name>
-    <value>512KB</value>
-    <description>The size of pages in the in-memory log buffer. (Default =
-      "524288" // 512KB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.partitionsize</name>
-    <value>2GB</value>
-    <description>The maximum size of a log file partition allowed before
-      rotating the log to the next partition. (Default = "2147483648" //
-      2GB)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.lsnthreshold</name>
-    <value>67108864</value>
-    <description>The size of the window that the maximum LSN is allowed to
-      be ahead of the checkpoint LSN by. (Default = ""67108864" // 64M)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.pollfrequency</name>
-    <value>120</value>
-    <description>The time in seconds between that the checkpoint thread
-      waits between polls. (Default = "120" // 120s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.log.checkpoint.history</name>
-    <value>0</value>
-    <description>The number of old log partition files to keep before
-      discarding. (Default = "0")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.escalationthreshold</name>
-    <value>1000</value>
-    <description>The number of entity level locks that need to be acquired
-      before the locks are coalesced and escalated into a dataset level
-      lock. (Default = "1000")
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.shrinktimer</name>
-    <value>5000</value>
-    <description>The time in milliseconds to wait before deallocating
-      unused lock manager memory. (Default = "5000" // 5s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.waitthreshold</name>
-    <value>60000</value>
-    <description>The time in milliseconds to wait before labeling a
-      transaction which has been waiting for a lock timed-out. (Default =
-      "60000" // 60s)
-    </description>
-  </property>
-
-  <property>
-    <name>txn.lock.timeout.sweepthreshold</name>
-    <value>10000</value>
-    <description>The time in milliseconds the timeout thread waits between
-      sweeps to detect timed-out transactions. (Default = "10000" // 10s)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.sortmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to sort operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.joinmemory</name>
-    <value>32MB</value>
-    <description>The amount of memory in bytes given to join operations.
-      (Default = "33554432" // 32MB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.framesize</name>
-    <value>128KB</value>
-    <description>The Hyracks frame size that the compiler configures per
-      job. (Default = "131072" // 128KB)
-    </description>
-  </property>
-
-  <property>
-    <name>compiler.pregelix.home</name>
-    <value>~/pregelix</value>
-  </property>
-
-  <property>
-    <name>web.port</name>
-    <value>19001</value>
-    <description>The port for the ASTERIX web interface. (Default = 19001)
-    </description>
-  </property>
-
-  <property>
-    <name>api.port</name>
-    <value>19002</value>
-    <description>The port for the ASTERIX API server. (Default = 19002)
-    </description>
-  </property>
-
-  <property>
-    <name>log.level</name>
-    <value>INFO</value>
-    <description>The minimum log level to be displayed. (Default = INFO)
-    </description>
-  </property>
-
-</asterixConfiguration>
diff --git a/asterixdb/asterix-yarn/src/main/resources/configs/local.xml b/asterixdb/asterix-yarn/src/main/resources/configs/local.xml
deleted file mode 100644
index c026aef..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/configs/local.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="yarn_cluster">
-
-  <!-- Name of the cluster -->
-  <name>local</name>
-
-  <log_dir>/tmp/asterix-yarn/</log_dir>
-  <txn_log_dir>/tmp/asterix-yarn/</txn_log_dir>
-
-  <!-- Mount point of an iodevice. Use a comma separated list for a machine that
-                  has multiple iodevices (disks).
-                             This property can be overriden for a node by redefining at the node level. -->
-  <iodevices>/tmp/asterix-yarn</iodevices>
-
-  <!-- Path on each iodevice where Asterix will store its data -->
-  <store>storage</store>
-
-  <!-- IP addresses of the master machine A -->
-  <master_node>
-    <id>cc</id>
-    <client_ip>localhost</client_ip>
-    <cluster_ip>localhost</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>127.0.0.1</cluster_ip>
-  </node>
-  <metadata_node>nc1</metadata_node>
-</cluster>
diff --git a/asterixdb/asterix-yarn/src/main/resources/configs/my_awesome_cluster_desc.xml b/asterixdb/asterix-yarn/src/main/resources/configs/my_awesome_cluster_desc.xml
deleted file mode 100644
index 4e4ea1b..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/configs/my_awesome_cluster_desc.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<cluster xmlns="yarn_cluster">
-  <name>my_awesome_instance</name>
-  <txn_log_dir>/home/yarn/</txn_log_dir>
-  <iodevices>/home/yarn/</iodevices>
-  <store>asterix-data</store>
-  <master_node>
-    <id>cc</id>
-    <client_ip>10.10.0.2</client_ip>
-    <cluster_ip>10.10.0.2</cluster_ip>
-    <client_port>1098</client_port>
-    <cluster_port>1099</cluster_port>
-    <http_port>8888</http_port>
-  </master_node>
-  <node>
-    <id>nc1</id>
-    <cluster_ip>10.10.0.3</cluster_ip>
-  </node>
-  <node>
-    <id>nc2</id>
-    <cluster_ip>10.10.0.4</cluster_ip>
-  </node>
-  <metadata_node>nc1</metadata_node>
-</cluster>
diff --git a/asterixdb/asterix-yarn/src/main/resources/scripts/asterix b/asterixdb/asterix-yarn/src/main/resources/scripts/asterix
deleted file mode 100644
index c107843..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/scripts/asterix
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-if [ -z $ASTERIX_HOME ]
- then
-   pushd $(dirname $0) >/dev/null
-   cd ..
-   export ASTERIX_HOME=$(pwd)
-   popd >/dev/null
-fi
-
-for jar in `ls $ASTERIX_HOME/lib/*.jar`
-  do 
-  if [ -z $ASTERIX_CLASSPATH ] 
-  then 
-    ASTERIX_CLASSPATH=$jar 
-  else
-    ASTERIX_CLASSPATH=$ASTERIX_CLASSPATH:$jar 
-  fi
-done
-
-ASTERIX_CLASSPATH=$ASTERIX_CLASSPATH:
-ASTERIX_CLASSPATH=$ASTERIX_CLASSPATH:$YARN_CONF_DIR:$HADOOP_CONF_DIR:$HADOOP_CONF_PATH
-pushd $(dirname $0) > /dev/null
-cd $ASTERIX_HOME
-java $JAVA_OPTS -cp $ASTERIX_CLASSPATH -Dlog4j.configuration=file://$ASTERIX_HOME/conf/asterix-client-log4j.properties org.apache.asterix.aoya.AsterixYARNClient $@
-popd > /dev/null
diff --git a/asterixdb/asterix-yarn/src/main/resources/scripts/asterix.cmd b/asterixdb/asterix-yarn/src/main/resources/scripts/asterix.cmd
deleted file mode 100644
index e60e09c..0000000
--- a/asterixdb/asterix-yarn/src/main/resources/scripts/asterix.cmd
+++ /dev/null
@@ -1,103 +0,0 @@
-@echo off
-@rem Licensed to the Apache Software Foundation (ASF) under one or more
-@rem contributor license agreements.  See the NOTICE file distributed with
-@rem this work for additional information regarding copyright ownership.
-@rem The ASF licenses this file to You under the Apache License, Version 2.0
-@rem (the "License"); you may not use this file except in compliance with
-@rem the License.  You may obtain a copy of the License at
-@rem
-@rem     http://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-
-setlocal enabledelayedexpansion
-
-if not defined HADOOP_BIN_PATH ( 
-  set HADOOP_BIN_PATH=%~dp0
-)
-
-if "%HADOOP_BIN_PATH:~-1%" == "\" (
-  set HADOOP_BIN_PATH=%HADOOP_BIN_PATH:~0,-1%
-)
-
-set DEFAULT_LIBEXEC_DIR=%HADOOP_BIN_PATH%\..\libexec
-if not defined HADOOP_LIBEXEC_DIR (
-  set HADOOP_LIBEXEC_DIR=%DEFAULT_LIBEXEC_DIR%
-)
-
-:main
-
-  set CLASS=org.apache.asterix.aoya.AsterixYARNClient
-
-  @rem JAVA and JAVA_HEAP_MAX and set in hadoop-config.cmd
-
-  if defined YARN_HEAPSIZE (
-    @rem echo run with Java heapsize %YARN_HEAPSIZE%
-    set JAVA_HEAP_MAX=-Xmx%YARN_HEAPSIZE%m
-  )
-
-  @rem CLASSPATH initially contains HADOOP_CONF_DIR & YARN_CONF_DIR
-  if not defined HADOOP_CONF_DIR (
-    echo No HADOOP_CONF_DIR set. 
-    echo Please specify it either in yarn-env.cmd or in the environment.
-    goto :eof
-  )
-
-  set CLASSPATH=%HADOOP_CONF_DIR%;%YARN_CONF_DIR%;%CLASSPATH%;Z:\lib\*
-
-  @rem for developers, add Hadoop classes to CLASSPATH
-  if exist %HADOOP_YARN_HOME%\yarn-api\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-api\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-common\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-common\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-mapreduce\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-mapreduce\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-master-worker\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-master-worker\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-server\yarn-server-nodemanager\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-server\yarn-server-nodemanager\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-server\yarn-server-common\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-server\yarn-server-common\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\yarn-server\yarn-server-resourcemanager\target\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\yarn-server\yarn-server-resourcemanager\target\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\build\test\classes (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\build\test\classes
-  )
-
-  if exist %HADOOP_YARN_HOME%\build\tools (
-    set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\build\tools
-  )
-
-  set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\%YARN_DIR%\*
-  set CLASSPATH=%CLASSPATH%;%HADOOP_YARN_HOME%\%YARN_LIB_JARS_DIR%\*
-
-  
-
-  if defined JAVA_LIBRARY_PATH (
-    set YARN_OPTS=%YARN_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH%
-  )
-
-  set java_arguments=%JAVA_HEAP_MAX% %YARN_OPTS% -classpath %CLASSPATH% %CLASS%
-  call java %java_arguments% %*
-
-goto :eof
-
-endlocal
diff --git a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNInstanceUtil.java b/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNInstanceUtil.java
deleted file mode 100644
index 0a807b1..0000000
--- a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNInstanceUtil.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya.test;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FilenameFilter;
-
-import org.apache.asterix.aoya.AsterixYARNClient;
-import org.apache.asterix.aoya.Utils;
-import org.apache.asterix.event.schema.yarnCluster.Cluster;
-import org.apache.asterix.event.schema.yarnCluster.Node;
-import org.apache.commons.io.FileUtils;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.FileUtil;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.hadoop.yarn.server.MiniYARNCluster;
-import org.junit.Assert;
-
-public class AsterixYARNInstanceUtil {
-    private static final String PATH_ACTUAL = "ittest/";
-    private static final String INSTANCE_NAME = "asterix-integration-test";
-    private static final String TXN_LOG_PATH = "/tmp/asterix-yarn";
-    private MiniYARNCluster miniCluster;
-    private YarnConfiguration appConf;
-    public String aoyaHome;
-    public String configPath;
-    public String aoyaServerPath;
-    public String parameterPath;
-
-    public YarnConfiguration setUp() throws Exception {
-        File asterixProjectDir = new File(System.getProperty("user.dir"));
-
-        File installerTargetDir = new File(asterixProjectDir, "target");
-
-        String[] dirsInTarget = installerTargetDir.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return new File(dir, name).isDirectory() && name.startsWith("asterix-yarn")
-                        && name.endsWith("binary-assembly");
-            }
-
-        });
-        if (dirsInTarget.length != 1) {
-            throw new IllegalStateException("Could not find binary to run YARN integration test with");
-        }
-        aoyaHome = installerTargetDir.getAbsolutePath() + File.separator + dirsInTarget[0];
-        File asterixServerInstallerDir = new File(aoyaHome, "asterix");
-        String[] zipsInFolder = asterixServerInstallerDir.list(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String name) {
-                return name.startsWith("asterix-server") && name.endsWith("binary-assembly.zip");
-            }
-        });
-        if (zipsInFolder == null || zipsInFolder.length != 1) {
-            throw new IllegalStateException("Could not find server binary to run YARN integration test with");
-        }
-        aoyaServerPath = asterixServerInstallerDir.getAbsolutePath() + File.separator + zipsInFolder[0];
-        configPath = aoyaHome + File.separator + "configs" + File.separator + "local.xml";
-        parameterPath = aoyaHome + File.separator + "conf" + File.separator + "base-asterix-configuration.xml";
-        YARNCluster.getInstance().setup();
-        appConf = new YarnConfiguration();
-        File baseDir = new File("./target/hdfs/").getAbsoluteFile();
-        FileUtil.fullyDelete(baseDir);
-        appConf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, baseDir.getAbsolutePath());
-        MiniDFSCluster.Builder builder = new MiniDFSCluster.Builder(appConf);
-        MiniDFSCluster hdfsCluster = builder.build();
-        miniCluster = YARNCluster.getInstance().getCluster();
-        appConf.set("fs.defaultFS", "hdfs://localhost:" + hdfsCluster.getNameNodePort());
-        miniCluster.init(appConf);
-        Cluster defaultConfig = Utils.parseYarnClusterConfig(configPath);
-        for (Node n : defaultConfig.getNode()) {
-            n.setClusterIp(MiniYARNCluster.getHostname());
-        }
-        defaultConfig.getMasterNode().setClusterIp(MiniYARNCluster.getHostname());
-        configPath = "target" + File.separator + "localized-aoya-config.xml";
-        Utils.writeYarnClusterConfig(configPath, defaultConfig);
-        miniCluster.start();
-        appConf = new YarnConfiguration(miniCluster.getConfig());
-        appConf.set("fs.defaultFS", "hdfs://localhost:" + hdfsCluster.getNameNodePort());
-        //TODO:why must I do this!? what is not being passed properly via environment variables???
-        appConf.writeXml(new FileOutputStream("target" + File.separator + "yarn-site.xml"));
-
-        //once the cluster is created, you can get its configuration
-        //with the binding details to the cluster added from the minicluster
-        FileSystem fs = FileSystem.get(appConf);
-        Path instanceState = new Path(fs.getHomeDirectory(), AsterixYARNClient.CONF_DIR_REL + INSTANCE_NAME + "/");
-        fs.delete(instanceState, true);
-        Assert.assertFalse(fs.exists(instanceState));
-
-        File outdir = new File(PATH_ACTUAL);
-        outdir.mkdirs();
-        return appConf;
-    }
-
-    public void tearDown() throws Exception {
-        FileSystem fs = FileSystem.get(appConf);
-        Path instance = new Path(fs.getHomeDirectory(), AsterixYARNClient.CONF_DIR_REL + "/");
-        fs.delete(instance, true);
-        miniCluster.close();
-        File outdir = new File(PATH_ACTUAL);
-        File[] files = outdir.listFiles();
-        if (files == null || files.length == 0) {
-            outdir.delete();
-        }
-    }
-
-    public static void cleanUp() {
-        File txnLogFile = new File(TXN_LOG_PATH);
-        if (txnLogFile.exists()) {
-            FileUtils.deleteQuietly(txnLogFile);
-        }
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLibraryTestIT.java b/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLibraryTestIT.java
deleted file mode 100644
index 47ec022..0000000
--- a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLibraryTestIT.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya.test;
-
-import java.io.File;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.asterix.aoya.AsterixYARNClient;
-import org.apache.asterix.test.common.TestExecutor;
-import org.apache.asterix.testframework.context.TestCaseContext;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class AsterixYARNLibraryTestIT {
-    private static final String LIBRARY_DATAVERSE = "externallibtest";
-    private static final String INSTANCE_NAME = "asterix-lib-test";
-    private static final String PATH_BASE = "src/test/resources/library";
-    private static final String PATH_ACTUAL = "ittest/";
-    private static final Logger LOGGER = Logger.getLogger(AsterixYARNLifecycleIT.class.getName());
-    private static String configPath;
-    private static String aoyaServerPath;
-    private static String parameterPath;
-    private static AsterixYARNInstanceUtil instance;
-    private static YarnConfiguration appConf;
-    private static List<TestCaseContext> testCaseCollection;
-    private static final String LIBRARY_PATH = "target" + File.separator + "resources" + File.separator + "externallib"
-            + File.separator + "asterix-external-data-testlib.zip";
-    private static final TestExecutor testExecutor = new TestExecutor();
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        AsterixYARNInstanceUtil.cleanUp();
-        instance = new AsterixYARNInstanceUtil();
-        appConf = instance.setUp();
-        configPath = instance.configPath;
-        aoyaServerPath = instance.aoyaServerPath;
-        parameterPath = instance.parameterPath;
-
-        String command = "-n " + INSTANCE_NAME + " -c " + configPath + " -bc " + parameterPath + " -zip "
-                + aoyaServerPath + " install";
-        executeAoyaCommand(command);
-
-        command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " stop";
-        executeAoyaCommand(command);
-
-        String asterixExternalLibraryPath = new File(System.getProperty("user.dir")).getAbsolutePath()
-                + File.separator + LIBRARY_PATH;
-        command = "-n " + INSTANCE_NAME + " -l " + asterixExternalLibraryPath + " -ld " + LIBRARY_DATAVERSE + " -bc "
-                + parameterPath + " libinstall";
-        executeAoyaCommand(command);
-
-        command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " start";
-        executeAoyaCommand(command);
-
-        TestCaseContext.Builder b = new TestCaseContext.Builder();
-        testCaseCollection = b.build(new File(PATH_BASE));
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -zip " + aoyaServerPath + " -f" + " -bc " + parameterPath
-                + " destroy";
-        executeAoyaCommand(command);
-        instance.tearDown();
-    }
-
-    @Test
-    public void test() throws Exception {
-        for (TestCaseContext testCaseCtx : testCaseCollection) {
-            testExecutor.executeTest(PATH_ACTUAL, testCaseCtx, null, false);
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-            new AsterixYARNLibraryTestIT().test();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.info("TEST CASES FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-
-    static void executeAoyaCommand(String cmd) throws Exception {
-        AsterixYARNClient aoyaClient = new AsterixYARNClient(appConf);
-        aoyaClient.init(cmd.split(" "));
-        AsterixYARNClient.execute(aoyaClient);
-    }
-}
diff --git a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLifecycleIT.java b/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLifecycleIT.java
deleted file mode 100644
index 60afe91..0000000
--- a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/AsterixYARNLifecycleIT.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.asterix.aoya.test;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.logging.Logger;
-
-import org.apache.asterix.aoya.AsterixYARNClient;
-import org.apache.asterix.aoya.Utils;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.FixMethodOrder;
-import org.junit.Test;
-import org.junit.runners.MethodSorters;
-import org.junit.runners.Parameterized.Parameters;
-
-@FixMethodOrder(MethodSorters.NAME_ASCENDING)
-public class AsterixYARNLifecycleIT {
-
-    private static final Logger LOGGER = Logger.getLogger(AsterixYARNLifecycleIT.class.getName());
-    private static final String INSTANCE_NAME = "asterix-integration-test";
-    private static YarnConfiguration appConf;
-    private static String configPath;
-    private static String aoyaServerPath;
-    private static String parameterPath;
-    private static AsterixYARNInstanceUtil instance;
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        AsterixYARNInstanceUtil.cleanUp();
-        instance = new AsterixYARNInstanceUtil();
-        appConf = instance.setUp();
-        configPath = instance.configPath;
-        aoyaServerPath = instance.aoyaServerPath;
-        parameterPath = instance.parameterPath;
-    }
-
-    @AfterClass
-    public static void tearDown() throws Exception {
-        instance.tearDown();
-    }
-
-    @Parameters
-    public static Collection<Object[]> tests() throws Exception {
-        Collection<Object[]> testArgs = new ArrayList<Object[]>();
-        return testArgs;
-    }
-
-    @Test
-    public void test_1_InstallActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -c " + configPath + " -bc " + parameterPath + " -zip "
-                + aoyaServerPath + " install";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_2_StopActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " stop";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_3_BackupInActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -zip " + aoyaServerPath + " -f" + " backup";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_4_StartActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " start";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_5_KillActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " -f" + " stop";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_6_RestoreInActiveInstance() throws Exception {
-        List<String> backupNames = Utils.getBackups(appConf, ".asterix" + File.separator, INSTANCE_NAME);
-        if (backupNames.size() != 1) {
-            throw new IllegalStateException();
-        }
-        String command = "-n " + INSTANCE_NAME + " -zip " + aoyaServerPath + " -s" + backupNames.get(0) + " -f"
-                + " restore";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_7_StartRestoredInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -bc " + parameterPath + " start";
-        executeAoyaCommand(command);
-    }
-
-    @Test
-    public void test_8_DeleteActiveInstance() throws Exception {
-        String command = "-n " + INSTANCE_NAME + " -zip " + aoyaServerPath + " -f" + " -bc " + parameterPath
-                + " destroy";
-        executeAoyaCommand(command);
-    }
-
-    static void executeAoyaCommand(String cmd) throws Exception {
-        AsterixYARNClient aoyaClient = new AsterixYARNClient(appConf);
-        aoyaClient.init(cmd.split(" "));
-        AsterixYARNClient.execute(aoyaClient);
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-            new AsterixYARNLifecycleIT();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.info("TEST CASE(S) FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/YARNCluster.java b/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/YARNCluster.java
deleted file mode 100644
index b23b919..0000000
--- a/asterixdb/asterix-yarn/src/test/java/org/apache/asterix/aoya/test/YARNCluster.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.asterix.aoya.test;
-
-import java.io.IOException;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.hadoop.yarn.conf.YarnConfiguration;
-import org.apache.hadoop.yarn.server.MiniYARNCluster;
-import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
-import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler;
-
-/**
- * Manages a Mini (local VM) YARN cluster with a configured number of NodeManager(s).
- */
-public class YARNCluster {
-
-    private static final String PATH_TO_HADOOP_CONF = "src/test/resources/hadoop/conf";
-    private static final YARNCluster INSTANCE = new YARNCluster();
-
-    private MiniYARNCluster miniCluster;
-    private int numDataNodes = 2;
-    private Configuration conf = new YarnConfiguration();
-
-    public static YARNCluster getInstance() {
-        return INSTANCE;
-    }
-
-    private YARNCluster() {
-
-    }
-
-    /**
-     * Instantiates the (Mini) DFS Cluster with the configured number of datanodes.
-     * Post instantiation, data is laoded to HDFS.
-     * Called prior to running the Runtime test suite.
-     */
-    public void setup() throws Exception {
-        conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/core-site.xml"));
-        conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/mapred-site.xml"));
-        conf.addResource(new Path(PATH_TO_HADOOP_CONF + "/hdfs-site.xml"));
-        conf.setInt(YarnConfiguration.RM_SCHEDULER_MINIMUM_ALLOCATION_MB, 64);
-        conf.setClass(YarnConfiguration.RM_SCHEDULER, FifoScheduler.class, ResourceScheduler.class);
-        conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, "target/integrationts/data");
-        cleanupLocal();
-        //this constructor is deprecated in hadoop 2x
-        //dfsCluster = new MiniDFSCluster(nameNodePort, conf, numDataNodes, true, true, StartupOption.REGULAR, null);
-        miniCluster = new MiniYARNCluster("Asterix_testing", numDataNodes, 1, 1);
-        miniCluster.init(conf);
-    }
-
-    public MiniYARNCluster getCluster() {
-        return miniCluster;
-    }
-
-    private void cleanupLocal() throws IOException {
-        // cleanup artifacts created on the local file system
-        FileSystem lfs = FileSystem.getLocal(new Configuration());
-        lfs.delete(new Path("build"), true);
-        System.setProperty("hadoop.log.dir", "logs");
-    }
-
-    public void cleanup() throws Exception {
-        if (miniCluster != null) {
-            miniCluster.close();
-            cleanupLocal();
-        }
-    }
-
-}
diff --git a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/core-site.xml b/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/core-site.xml
deleted file mode 100644
index 7343ec0..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/core-site.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
-
-<!-- Put site-specific property overrides in this file. -->
-
-<configuration>
-
-  <property>
-    <name>hadoop.tmp.dir</name>
-    <value>/tmp/hadoop</value>
-  </property>
-
-</configuration>
diff --git a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/hdfs-site.xml b/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/hdfs-site.xml
deleted file mode 100644
index f161685..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/hdfs-site.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
-
-<!-- Put site-specific property overrides in this file. -->
-
-<configuration>
-
-  <property>
-    <name>dfs.replication</name>
-    <value>1</value>
-  </property>
-
-  <property>
-    <name>dfs.block.size</name>
-    <value>1048576</value>
-  </property>
-
-</configuration>
diff --git a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/log4j.properties b/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/log4j.properties
deleted file mode 100644
index 13923d7..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/log4j.properties
+++ /dev/null
@@ -1,111 +0,0 @@
-#/*
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# Define some default values that can be overridden by system properties
-hadoop.root.logger=FATAL,console
-hadoop.log.dir=.
-hadoop.log.file=hadoop.log
-
-# Define the root logger to the system property "hadoop.root.logger".
-log4j.rootLogger=${hadoop.root.logger}, EventCounter
-
-# Logging Threshold
-log4j.threshhold=FATAL
-
-#
-# Daily Rolling File Appender
-#
-
-log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file}
-
-# Rollver at midnight
-log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
-
-# 30-day backup
-#log4j.appender.DRFA.MaxBackupIndex=30
-log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
-
-# Pattern format: Date LogLevel LoggerName LogMessage
-log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
-# Debugging Pattern format
-#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
-
-
-#
-# console
-# Add "console" to rootlogger above if you want to use this 
-#
-
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.target=System.err
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
-
-#
-# TaskLog Appender
-#
-
-#Default values
-hadoop.tasklog.taskid=null
-hadoop.tasklog.noKeepSplits=4
-hadoop.tasklog.totalLogFileSize=100
-hadoop.tasklog.purgeLogSplits=true
-hadoop.tasklog.logsRetainHours=12
-
-log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender
-log4j.appender.TLA.taskId=${hadoop.tasklog.taskid}
-log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize}
-
-log4j.appender.TLA.layout=org.apache.log4j.PatternLayout
-log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
-
-#
-# Rolling File Appender
-#
-
-#log4j.appender.RFA=org.apache.log4j.RollingFileAppender
-#log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file}
-
-# Logfile size and and 30-day backups
-#log4j.appender.RFA.MaxFileSize=1MB
-#log4j.appender.RFA.MaxBackupIndex=30
-
-#log4j.appender.RFA.layout=org.apache.log4j.PatternLayout
-#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} - %m%n
-#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n
-
-#
-# FSNamesystem Audit logging
-# All audit events are logged at INFO level
-#
-log4j.logger.org.apache.hadoop.fs.FSNamesystem.audit=WARN
-
-# Custom Logging levels
-
-#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG
-#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG
-#log4j.logger.org.apache.hadoop.fs.FSNamesystem=DEBUG
-
-# Jets3t library
-log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR
-
-#
-# Event Counter Appender
-# Sends counts of logging messages at different severity levels to Hadoop Metrics.
-#
-log4j.appender.EventCounter=org.apache.hadoop.metrics.jvm.EventCounter
diff --git a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/mapred-site.xml b/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/mapred-site.xml
deleted file mode 100644
index fcbb184..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/hadoop/conf/mapred-site.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0"?>
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
-
-<!-- Put site-specific property overrides in this file. -->
-
-<configuration>
-
-  <property>
-    <name>mapred.job.tracker</name>
-    <value>localhost:29007</value>
-  </property>
-  <property>
-    <name>mapred.tasktracker.map.tasks.maximum</name>
-    <value>20</value>
-  </property>
-  <property>
-    <name>mapred.tasktracker.reduce.tasks.maximum</name>
-    <value>20</value>
-  </property>
-  <property>
-    <name>mapred.max.split.size</name>
-    <value>128</value>
-  </property>
-
-</configuration>
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
deleted file mode 100644
index ec2b527..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.1.ddl.aql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-create type TestTypedAdapterOutputType as closed {
-  tweetid: int64,
-  message-text: string
-}
-
-create dataset TweetsTestAdapter(TestTypedAdapterOutputType)
-primary key tweetid;
-
-create feed TestTypedAdapterFeed
-using "asterix-external-data-testlib#test_typed_adapter" (("num_output_records"="5"),("type-name"="TestTypedAdapterOutputType"));
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql
deleted file mode 100644
index 3be4db8..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.2.update.aql
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-set wait-for-completion-feed "true";
-
-connect feed TestTypedAdapterFeed to dataset TweetsTestAdapter;
-
-start feed TestTypedAdapterFeed;
\ No newline at end of file
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql
deleted file mode 100644
index 2860f17..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-adapters/typed_adapter/typed_adapter.3.query.aql
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-for $x in dataset TweetsTestAdapter
-order by $x.tweetid
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
deleted file mode 100644
index 6e84ea3..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.1.ddl.aql
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-create type TweetInputType as closed {
-  id: string,
-  username : string,
-  location : string,
-  text : string,
-  timestamp : string
-}
-
-create type TweetOutputType as closed {
-  id: string,
-  username : string,
-  location : string,
-  text : string,
-  timestamp : string,
-  topics : {{string}}
-}
-
-create feed TweetFeed
-using file_feed
-(("type-name"="TweetInputType"),("fs"="localfs"),
-("path"="127.0.0.1://../../../../../../asterix-app/data/twitter/obamatweets.adm"),("format"="adm"),("tuple-interval"="10"));
-
-
-create dataset TweetsFeedIngest(TweetOutputType)
-primary key id;
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql
deleted file mode 100644
index db68138..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.2.update.aql
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-set wait-for-completion-feed "true";
-
-connect feed TweetFeed to dataset TweetsFeedIngesta pply function testlib#parseTweet;
-start feed TweetFeed;
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.3.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.3.query.aql
deleted file mode 100644
index 22d1d27..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-feeds/feed_ingest/feed_ingest.3.query.aql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/*
- * Description  : Create a feed dataset that uses the feed simulator adapter.
-                  The feed simulator simulates feed from a file in the local fs.
-                  Associate with the feed an external user-defined function. The UDF
-                  finds topics in each tweet. A topic is identified by a #.
-                  Begin ingestion and apply external user defined function
- * Expected Res : Success
- * Date         : 23rd Apr 2013
- */
-use dataverse externallibtest;
-
-for $x in dataset TweetsFeedIngest
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.1.ddl.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.1.ddl.aql
deleted file mode 100644
index db88912..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.1.ddl.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-create type CountryCapitalType if not exists as closed {
-country: string,
-capital: string
-};
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.2.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.2.query.aql
deleted file mode 100644
index 70efd50..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/getCapital/getCapital.2.query.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-let $input:=["England","Italy","China","United States","India","Jupiter"]
-for $country in $input
-return asterix-external-data-testlib#getCapital($country)
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql
deleted file mode 100644
index ab247b4..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.1.ddl.aql
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-create type TextType if not exists as closed {
-id: int32,
-text: string
-};
-
-create dataset Check(TextType)
-primary key id;
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql
deleted file mode 100644
index eaf3f09..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.2.update.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-insert into dataset Check (
-{"id": 1, "text":"university of california, irvine"}
-);
-
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql
deleted file mode 100644
index d2269d9..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.3.update.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-insert into dataset Check (
-  for $x in dataset Check
-  let $y:=asterix-external-data-testlib#toUpper($x)
-  return $y
-);
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql
deleted file mode 100644
index a1ced1e..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/insert-from-select/insert-from-select.4.query.aql
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-for $x in  dataset Check 
-where $x.id < 0
-order by $x.id
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/mysum/mysum.1.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/mysum/mysum.1.query.aql
deleted file mode 100644
index c9cec0b..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/mysum/mysum.1.query.aql
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-let $x:=asterix-external-data-testlib#mysum(3,4)
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.1.ddl.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.1.ddl.aql
deleted file mode 100644
index c6ccb43..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.1.ddl.aql
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-create type TextType if not exists as closed {
-id: int32,
-text: string
-};
-
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.2.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.2.query.aql
deleted file mode 100644
index 51e7a03..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-functions/toUpper/toUpper.2.query.aql
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-use dataverse externallibtest;
-
-let $input:={"id": int32("1"), "text":"university of california, irvine"}
-let $x:=asterix-external-data-testlib#toUpper($input)
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql
deleted file mode 100644
index 341fbc2..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/dataverseDataset/dataverseDataset.1.query.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-for $x in dataset Metadata.Dataverse
-order by $x.DataverseName
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql
deleted file mode 100644
index ca06e3b..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/functionDataset/functionDataset.1.query.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-for $x in dataset Metadata.Function
-order by $x.Name
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql b/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql
deleted file mode 100644
index 70b6668..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/queries/library-metadata/libraryDataset/libraryDataset.1.query.aql
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-for $x in dataset Metadata.Library
-order by $x.Name
-return $x
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-adapters/typed_adapter/typed_adapter.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-adapters/typed_adapter/typed_adapter.1.adm
deleted file mode 100644
index 6a3fbcd..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-adapters/typed_adapter/typed_adapter.1.adm
+++ /dev/null
@@ -1,5 +0,0 @@
-{ "tweetid": 1, "message-text": "1" }
-{ "tweetid": 2, "message-text": "2" }
-{ "tweetid": 3, "message-text": "3" }
-{ "tweetid": 4, "message-text": "4" }
-{ "tweetid": 5, "message-text": "5" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-feeds/feed_ingest/feed_ingest.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-feeds/feed_ingest/feed_ingest.1.adm
deleted file mode 100644
index 1291213..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-feeds/feed_ingest/feed_ingest.1.adm
+++ /dev/null
@@ -1,12 +0,0 @@
-{ "id": "nc1:1", "username": "BronsonMike", "location": "", "text": "@GottaLaff @reutersus Christie and obama just foul weather friends", "timestamp": "Thu Dec 06 16:53:06 PST 2012", "topics": {{  }} }
-{ "id": "nc1:100", "username": "KidrauhlProuds", "location": "", "text": "RT @01Direclieber: A filha do Michael Jackson  uma Belieber,a filha do Eminem e uma Belieber,as filhas de Obama sao Beliebers, e a filha do meu pai e Belieber", "timestamp": "Thu Dec 06 16:53:16 PST 2012", "topics": {{  }} }
-{ "id": "nc1:102", "username": "jaysauce82", "location": "", "text": "Not voting for President Obama #BadDecision", "timestamp": "Thu Dec 06 16:53:16 PST 2012", "topics": {{ "#BadDecision" }} }
-{ "id": "nc1:104", "username": "princeofsupras", "location": "", "text": "RT @01Direclieber: A filha do Michael Jackson e uma Belieber,a filha do Eminem e uma Belieber,as filhas de Obama sao Beliebers, e a filha do meu pai e Belieber", "timestamp": "Thu Dec 06 16:53:15 PST 2012", "topics": {{  }} }
-{ "id": "nc1:106", "username": "GulfDogs", "location": "", "text": "Obama Admin Knew Libyan Terrorists Had US-Provided Weaponsteaparty #tcot #ccot #NewGuards #BreitbartArmy #patriotwttp://t.co/vJxzrQUE", "timestamp": "Thu Dec 06 16:53:14 PST 2012", "topics": {{ "#tcot", "#ccot", "#NewGuards", "#BreitbartArmy", "#patriotwttp://t.co/vJxzrQUE" }} }
-{ "id": "nc1:108", "username": "Laugzpz", "location": "", "text": "@AlfredoJalife Maestro Obama se hace de la vista gorda, es un acuerdo de siempre creo yo.", "timestamp": "Thu Dec 06 16:53:14 PST 2012", "topics": {{  }} }
-{ "id": "nc1:11", "username": "magarika", "location": "", "text": "RT @ken24xavier: Obama tells SOROS - our plan is ALMOST finished http://t.co/WvzK0GtU", "timestamp": "Thu Dec 06 16:53:05 PST 2012", "topics": {{  }} }
-{ "id": "nc1:111", "username": "ToucanMall", "location": "", "text": "RT @WorldWar3Watch: Michelle Obama Gets More Grammy Nominations Than Justin ...  #Obama #WW3 http://t.co/0Wv2GKij", "timestamp": "Thu Dec 06 16:53:13 PST 2012", "topics": {{ "#Obama", "#WW3" }} }
-{ "id": "nc1:113", "username": "ToucanMall", "location": "", "text": "RT @ObamaPalooza: Tiffany Shared What $2,000 Meant to Her ... and the President Stopped by to Talk About It http://t.co/sgT7lsNV #Obama", "timestamp": "Thu Dec 06 16:53:12 PST 2012", "topics": {{ "#Obama" }} }
-{ "id": "nc1:115", "username": "thewildpitch", "location": "", "text": "RT @RevkahJC: Dennis Miller: Obama Should Just Say He Wants To Tax Successful People http://t.co/Ihlemy9Y", "timestamp": "Thu Dec 06 16:53:11 PST 2012", "topics": {{  }} }
-{ "id": "nc1:117", "username": "Rnugent24", "location": "", "text": "RT @ConservativeQuo: unemployment is above 8% again. I wonder how long it will take for Obama to start blaming Bush? 3-2-1 #tcot #antiobama", "timestamp": "Thu Dec 06 16:53:10 PST 2012", "topics": {{ "#tcot", "#antiobama" }} }
-{ "id": "nc1:119", "username": "ToucanMall", "location": "", "text": "RT @Newitrsdotcom: I hope #Obama will win re-election... Other four years without meaningless #wars", "timestamp": "Thu Dec 06 16:53:09 PST 2012", "topics": {{ "#Obama", "#wars" }} }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/getCapital/getCapital.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/getCapital/getCapital.1.adm
deleted file mode 100644
index 16e9591..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/getCapital/getCapital.1.adm
+++ /dev/null
@@ -1,6 +0,0 @@
-{ "country": "England", "capital": "London" }
-{ "country": "Italy", "capital": "Rome" }
-{ "country": "China", "capital": "Beijing" }
-{ "country": "United States", "capital": "Washington D.C." }
-{ "country": "India", "capital": "New Delhi" }
-{ "country": "Jupiter", "capital": "NOT_FOUND" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/insert-from-select/insert-from-select.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/insert-from-select/insert-from-select.1.adm
deleted file mode 100644
index a839cbc..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/insert-from-select/insert-from-select.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "id": -1, "text": "UNIVERSITY OF CALIFORNIA, IRVINE" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/mysum/mysum.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/mysum/mysum.1.adm
deleted file mode 100644
index 7f8f011..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/mysum/mysum.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/toUpper/toUpper.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/toUpper/toUpper.1.adm
deleted file mode 100644
index a839cbc..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-functions/toUpper/toUpper.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "id": -1, "text": "UNIVERSITY OF CALIFORNIA, IRVINE" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm
deleted file mode 100644
index 99b23da..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/dataverseDataset/dataverseDataset.1.adm
+++ /dev/null
@@ -1,3 +0,0 @@
-{ "DataverseName": "Default", "DataFormat": "org.apache.asterix.runtime.formats.NonTaggedDataFormat", "Timestamp": "Thu Sep 15 03:11:25 UTC 2016", "PendingOp": 0 }
-{ "DataverseName": "Metadata", "DataFormat": "org.apache.asterix.runtime.formats.NonTaggedDataFormat", "Timestamp": "Thu Apr 25 11:17:56 PDT 2013", "PendingOp": 0 }
-{ "DataverseName": "externallibtest", "DataFormat": "org.apache.asterix.runtime.formats.NonTaggedDataFormat", "Timestamp": "Thu Apr 25 11:18:12 PDT 2013", "PendingOp": 0 }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/functionDataset/functionDataset.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/functionDataset/functionDataset.1.adm
deleted file mode 100644
index 0675316..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/functionDataset/functionDataset.1.adm
+++ /dev/null
@@ -1,8 +0,0 @@
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#addHashTags", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#addHashTagsInPlace", "Arity": "1", "Params": [ "Tweet" ], "ReturnType": "ProcessedTweet", "Definition": "org.apache.asterix.external.library.AddHashTagsInPlaceFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#allTypes", "Arity": "1", "Params": [ "AllType" ], "ReturnType": "AllType", "Definition": "org.apache.asterix.external.library.AllTypesFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#echoDelay", "Arity": "1", "Params": [ "TweetMessageType" ], "ReturnType": "TweetMessageType", "Definition": "org.apache.asterix.external.library.EchoDelayFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#getCapital", "Arity": "1", "Params": [ "ASTRING" ], "ReturnType": "CountryCapitalType", "Definition": "org.apache.asterix.external.library.CapitalFinderFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#mysum", "Arity": "2", "Params": [ "AINT32", "AINT32" ], "ReturnType": "AINT32", "Definition": "org.apache.asterix.external.library.SumFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#parseTweet", "Arity": "1", "Params": [ "TweetInputType" ], "ReturnType": "TweetOutputType", "Definition": "org.apache.asterix.external.library.ParseTweetFactory", "Language": "JAVA", "Kind": "SCALAR" }
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib#toUpper", "Arity": "1", "Params": [ "TextType" ], "ReturnType": "TextType", "Definition": "org.apache.asterix.external.library.UpperCaseFactory", "Language": "JAVA", "Kind": "SCALAR" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/libraryDataset/libraryDataset.1.adm b/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/libraryDataset/libraryDataset.1.adm
deleted file mode 100644
index 8246e6b..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/results/library-metadata/libraryDataset/libraryDataset.1.adm
+++ /dev/null
@@ -1 +0,0 @@
-{ "DataverseName": "externallibtest", "Name": "asterix-external-data-testlib", "Timestamp": "Mon Apr 22 23:36:55 PDT 2013" }
diff --git a/asterixdb/asterix-yarn/src/test/resources/library/testsuite.xml b/asterixdb/asterix-yarn/src/test/resources/library/testsuite.xml
deleted file mode 100644
index 2d57b3b..0000000
--- a/asterixdb/asterix-yarn/src/test/resources/library/testsuite.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-<test-suite xmlns="urn:xml.testframework.asterix.apache.org" ResultOffsetPath="results" QueryOffsetPath="queries" QueryFileExtension=".aql">
-  <test-group name="library-functions">
-    <test-case FilePath="library-functions">
-      <compilation-unit name="mysum">
-        <output-dir compare="Text">mysum</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="library-functions">
-      <compilation-unit name="toUpper">
-        <output-dir compare="Text">toUpper</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="library-functions">
-      <compilation-unit name="insert-from-select">
-        <output-dir compare="Text">insert-from-select</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="library-functions">
-      <compilation-unit name="getCapital">
-        <output-dir compare="Text">getCapital</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="library-metadata">
-    <test-case FilePath="library-metadata">
-      <compilation-unit name="functionDataset">
-        <output-dir compare="Text">functionDataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="library-metadata">
-      <compilation-unit name="libraryDataset">
-        <output-dir compare="Text">libraryDataset</output-dir>
-      </compilation-unit>
-    </test-case>
-    <test-case FilePath="library-metadata">
-      <compilation-unit name="dataverseDataset">
-        <output-dir compare="Text">dataverseDataset</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="library-feeds">
-    <test-case FilePath="library-feeds" category="slow">
-      <compilation-unit name="feed_ingest">
-        <output-dir compare="Text">feed_ingest</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-  <test-group name="library-adapters">
-    <test-case FilePath="library-adapters">
-      <compilation-unit name="typed_adapter">
-        <output-dir compare="Text">typed_adapter</output-dir>
-      </compilation-unit>
-    </test-case>
-  </test-group>
-</test-suite>
-
diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml
index a68b1c9..2ff67c6 100644
--- a/asterixdb/pom.xml
+++ b/asterixdb/pom.xml
@@ -42,21 +42,35 @@
   </licenses>
 
   <properties>
+    <root.dir>${basedir}</root.dir>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <file.encoding>UTF-8</file.encoding>
     <jvm.extraargs />
     <jdk.version>1.8</jdk.version>
+    <javac.xlint.value>all</javac.xlint.value>
+    <source-format.goal>format</source-format.goal>
+    <source-format.skip>false</source-format.skip>
     <runSlowAQLTests>false</runSlowAQLTests>
-    <appendedResourcesDirectory>${basedir}/src/main/appended-resources</appendedResourcesDirectory>
+    <appendedResourcesDirectory>${root.dir}/src/main/appended-resources</appendedResourcesDirectory>
     <sonar.jacoco.reportPath>${env.PWD}/target/jacoco-merged.exec</sonar.jacoco.reportPath>
     <debug.suspend.flag>n</debug.suspend.flag>
+    <skipTests>false</skipTests>
+    <maven.test.skip>false</maven.test.skip>
     <skip.surefire.tests>${skipTests}</skip.surefire.tests>
+    <skip.testResources>${maven.test.skip}</skip.testResources>
+    <testLog4jConfigFile>${root.dir}/asterix-app/src/test/resources/log4j2-asterixdb-test.xml</testLog4jConfigFile>
 
     <!-- Definition of tests in various categories which may be excluded -->
     <repeated.tests>**/RepeatedTest.java</repeated.tests>
     <invalid.tests>**/DmlTest.java</invalid.tests>
     <global.test.includes>**/*TestSuite.java,**/*Test.java</global.test.includes>
     <global.test.excludes>${invalid.tests},${repeated.tests}</global.test.excludes>
+    <test.includes>${global.test.includes}</test.includes>
+    <test.excludes>${global.test.excludes}</test.excludes>
+    <global.itest.includes>**/*IT.java,**/*IT.java,**/*ITCase.java</global.itest.includes>
+    <global.itest.excludes/>
+    <itest.includes>${global.itest.includes}</itest.includes>
+    <itest.excludes>${global.itest.excludes}</itest.excludes>
 
     <!-- Versions under dependencymanagement or used in many projects via properties -->
     <algebricks.version>0.3.4-SNAPSHOT</algebricks.version>
@@ -83,23 +97,23 @@
           <failIfNoTests>false</failIfNoTests>
           <systemPropertyVariables>
             <skipFredSlowTests>true</skipFredSlowTests>
+            <log4j.configurationFile>${testLog4jConfigFile}</log4j.configurationFile>
           </systemPropertyVariables>
           <forkCount>1</forkCount>
           <reuseForks>false</reuseForks>
           <argLine>
             -enableassertions -Xmx${test.heap.size}m
             -Dfile.encoding=UTF-8
-            -Djava.util.logging.config.file=${user.home}/logging.properties
             -DrunSlowAQLTests=${runSlowAQLTests}
             -Xdebug
             -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=${debug.suspend.flag}
             ${coverageArgLine}
           </argLine>
           <includes>
-            <include>${global.test.includes},${test.includes}</include>
+            <include>${test.includes}</include>
           </includes>
           <excludes>
-            <exclude>${global.test.excludes},${test.excludes}</exclude>
+            <exclude>${test.excludes}</exclude>
           </excludes>
           <skipTests>${skip.surefire.tests}</skipTests>
         </configuration>
@@ -112,6 +126,15 @@
           <forkCount>1</forkCount>
           <reuseForks>false</reuseForks>
           <argLine>${coverageArgLine}</argLine>
+          <systemProperties>
+            <log4j.configurationFile>${testLog4jConfigFile}</log4j.configurationFile>
+          </systemProperties>
+          <includes>
+            <include>${itest.includes}</include>
+          </includes>
+          <excludes>
+            <exclude>${itest.excludes}</exclude>
+          </excludes>
         </configuration>
         <executions>
           <execution>
@@ -146,10 +169,10 @@
           <excludes combine.children="append">
             <exclude>src/main/licenses/**</exclude>
             <exclude>**/*.iml</exclude>
+            <exclude>**/*.json</exclude>
             <exclude>**/*.adm</exclude>
-            <exclude>asterix-experiments/**</exclude> <!-- in case -DskipExperiments -->
+            <exclude>**/*.template</exclude>
             <exclude>asterix-installer/**</exclude> <!-- in case -DskipInstaller -->
-            <exclude>asterix-yarn/**</exclude> <!-- in case -DskipYarn -->
           </excludes>
         </configuration>
       </plugin>
@@ -159,7 +182,7 @@
         <configuration>
           <source>${jdk.version}</source>
           <target>${jdk.version}</target>
-          <compilerArgument>-Xlint:all</compilerArgument>
+          <compilerArgument>-Xlint:${javac.xlint.value}</compilerArgument>
         </configuration>
       </plugin>
       <plugin>
@@ -244,6 +267,36 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-testResources</id>
+            <goals>
+              <goal>testResources</goal>
+            </goals>
+            <configuration>
+              <skip>${skip.testResources}</skip>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>net.revelc.code.formatter</groupId>
+        <artifactId>formatter-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>${source-format.goal}</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <configFile>${root.dir}/AsterixCodeFormatProfile.xml</configFile>
+          <skipFormatting>${source-format.skip}</skipFormatting>
+        </configuration>
+      </plugin>
     </plugins>
     <pluginManagement>
       <plugins>
@@ -364,6 +417,19 @@
                     <ignore />
                   </action>
                 </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                   <groupId>net.revelc.code.formatter</groupId>
+                   <artifactId>formatter-maven-plugin</artifactId>
+                   <versionRange>[2.0.1,)</versionRange>
+                   <goals>
+                       <goal>format</goal>
+                   </goals>
+                   </pluginExecutionFilter>
+                   <action>
+                       <ignore></ignore>
+                   </action>
+                </pluginExecution>
               </pluginExecutions>
             </lifecycleMappingMetadata>
           </configuration>
@@ -402,6 +468,9 @@
           <groupId>org.apache.hyracks</groupId>
           <artifactId>license-automation-plugin</artifactId>
           <version>${hyracks.version}</version>
+          <configuration>
+            <argLine>-Xmx2048m</argLine>
+          </configuration>
         </plugin>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
@@ -463,6 +532,16 @@
           <artifactId>git-commit-id-plugin</artifactId>
           <version>2.2.3</version>
         </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>javacc-maven-plugin</artifactId>
+          <version>2.6</version>
+        </plugin>
+        <plugin>
+          <groupId>net.revelc.code.formatter</groupId>
+          <artifactId>formatter-maven-plugin</artifactId>
+          <version>2.0.1</version>
+        </plugin>
       </plugins>
     </pluginManagement>
   </build>
@@ -658,39 +737,6 @@
         </plugins>
       </build>
     </profile>
-    <profile>
-      <id>include-managix</id>
-      <activation>
-        <property>
-          <name>!skipManagix</name>
-        </property>
-      </activation>
-      <modules>
-        <module>asterix-installer</module>
-      </modules>
-    </profile>
-    <profile>
-      <id>include-yarn</id>
-      <activation>
-        <property>
-          <name>!skipYarn</name>
-        </property>
-      </activation>
-      <modules>
-        <module>asterix-yarn</module>
-      </modules>
-    </profile>
-    <profile>
-      <id>include-experiments</id>
-      <activation>
-        <property>
-          <name>!skipExperiments</name>
-        </property>
-      </activation>
-      <modules>
-        <module>asterix-experiments</module>
-      </modules>
-    </profile>
   </profiles>
 
   <modules>
@@ -700,6 +746,7 @@
     <module>asterix-lang-sqlpp</module>
     <module>asterix-algebra</module>
     <module>asterix-app</module>
+    <module>asterix-dashboard</module>
     <module>asterix-tools</module>
     <module>asterix-transactions</module>
     <module>asterix-runtime</module>
@@ -711,7 +758,6 @@
     <module>asterix-test-framework</module>
     <module>asterix-maven-plugins</module>
     <module>asterix-server</module>
-    <module>asterix-events</module>
     <module>asterix-doc</module>
     <module>asterix-fuzzyjoin</module>
     <module>asterix-replication</module>
@@ -725,21 +771,33 @@
   <dependencyManagement>
     <dependencies>
       <dependency>
+        <groupId>org.apache.hyracks</groupId>
+        <artifactId>apache-hyracks</artifactId>
+        <version>${hyracks.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-simple</artifactId>
         <version>1.7.5</version>
       </dependency>
       <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.12</version>
-      </dependency>
-      <dependency>
         <groupId>org.apache.maven</groupId>
         <artifactId>maven-plugin-api</artifactId>
         <version>3.3.9</version>
       </dependency>
       <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-model</artifactId>
+        <version>3.3.9</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-project</artifactId>
+        <version>2.2.1</version>
+      </dependency>
+      <dependency>
         <groupId>org.apache.hadoop</groupId>
         <artifactId>hadoop-yarn-common</artifactId>
         <version>${hadoop.version}</version>
@@ -815,14 +873,19 @@
         </exclusions>
       </dependency>
       <dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-compress</artifactId>
+        <version>1.15</version>
+      </dependency>
+      <dependency>
         <groupId>commons-logging</groupId>
         <artifactId>commons-logging-api</artifactId>
-        <version>1.0.4</version>
+        <version>1.1</version>
       </dependency>
       <dependency>
         <groupId>commons-logging</groupId>
         <artifactId>commons-logging</artifactId>
-        <version>1.1.1</version>
+        <version>1.2</version>
       </dependency>
       <dependency>
         <groupId>org.apache.hive.shims</groupId>
@@ -938,6 +1001,12 @@
       </dependency>
       <dependency>
         <groupId>org.apache.hyracks</groupId>
+        <artifactId>hyracks-server</artifactId>
+        <version>${hyracks.version}</version>
+        <type>test-jar</type>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.hyracks</groupId>
         <artifactId>hyracks-dataflow-common</artifactId>
         <version>${hyracks.version}</version>
       </dependency>
@@ -1025,66 +1094,6 @@
         <type>test-jar</type>
       </dependency>
       <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>2.5</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.5</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-lang3</artifactId>
-        <version>3.5</version>
-      </dependency>
-      <dependency>
-        <groupId>xerces</groupId>
-        <artifactId>xercesImpl</artifactId>
-        <version>2.11.0</version>
-      </dependency>
-      <dependency>
-        <groupId>args4j</groupId>
-        <artifactId>args4j</artifactId>
-        <version>2.33</version>
-      </dependency>
-      <dependency>
-        <groupId>io.netty</groupId>
-        <artifactId>netty-all</artifactId>
-        <version>4.1.6.Final</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpclient</artifactId>
-        <version>4.5.2</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpcore</artifactId>
-        <version>4.4.5</version>
-      </dependency>
-      <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-databind</artifactId>
-        <version>2.8.4</version>
-      </dependency>
-      <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-core</artifactId>
-        <version>2.8.4</version>
-      </dependency>
-      <dependency>
-        <groupId>com.fasterxml.jackson.core</groupId>
-        <artifactId>jackson-annotations</artifactId>
-        <version>2.8.4</version>
-      </dependency>
-      <dependency>
-        <groupId>com.google.guava</groupId>
-        <artifactId>guava</artifactId>
-        <version>18.0</version>
-      </dependency>
-      <dependency>
         <groupId>com.rometools</groupId>
         <artifactId>rome-fetcher</artifactId>
         <version>1.7.4</version>
diff --git a/asterixdb/src/main/assembly/source.xml b/asterixdb/src/main/assembly/source.xml
index 6552829..78f4382 100644
--- a/asterixdb/src/main/assembly/source.xml
+++ b/asterixdb/src/main/assembly/source.xml
@@ -29,7 +29,7 @@
       <outputDirectory>.</outputDirectory>
       <useDefaultExcludes>true</useDefaultExcludes>
       <excludes>
-        <exclude>**/${project.build.directory}/**</exclude>
+        <exclude>${project.build.directory}/**</exclude>
         <exclude>release.properties</exclude>
       </excludes>
     </fileSet>
diff --git a/asterixdb/src/main/licenses/templates/source_only_licenses.ftl b/asterixdb/src/main/licenses/templates/source_only_licenses.ftl
index 5ff03be..eb75200 100644
--- a/asterixdb/src/main/licenses/templates/source_only_licenses.ftl
+++ b/asterixdb/src/main/licenses/templates/source_only_licenses.ftl
@@ -214,47 +214,4 @@
 END OF TERMS AND CONDITIONS
 
 </@license>
-<@license files="asterix-experiments/src/main/resources/gantt/gantt.py"
-          component="AsterixDB Experimental Tests" licenseName="a Modified BSD License">
-Copyright (c) 2013, Los Alamos National Security, LLC
-All rights reserved.
 
-Copyright 2013. Los Alamos National Security, LLC. This software
-was produced under U.S. Government contract DE-AC52-06NA25396 for
-Los Alamos National Laboratory (LANL), which is operated by Los
-Alamos National Security, LLC for the U.S. Department of Energy.
-The U.S. Government has rights to use, reproduce, and distribute
-this software.  NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL
-SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES
-ANY LIABILITY FOR THE USE OF THIS SOFTWARE.  If software is modified
-to produce derivative works, such modified software should be clearly
-marked, so as not to confuse it with the version available from LANL.
-
-
-Additionally, redistribution and use in source and binary forms,
-with or without modification, are permitted provided that the
-following conditions are met:
-
- *  Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
- *  Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
- *  Neither the name of Los Alamos National Security, LLC, Los Alamos
-    National Laboratory, LANL, the U.S. Government, nor the names of
-    its contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS NATIONAL SECURITY, LLC OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-</@license>
diff --git a/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/exceptions/AlgebricksException.java b/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/exceptions/AlgebricksException.java
index 64e328a..d1feb08 100644
--- a/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/exceptions/AlgebricksException.java
+++ b/hyracks-fullstack/algebricks/algebricks-common/src/main/java/org/apache/hyracks/algebricks/common/exceptions/AlgebricksException.java
@@ -108,8 +108,8 @@
     @Override
     public String getMessage() {
         if (msgCache == null) {
-            msgCache = new CachedMessage(
-                    ErrorMessageUtil.formatMessage(component, errorCode, super.getMessage(), params));
+            msgCache =
+                    new CachedMessage(ErrorMessageUtil.formatMessage(component, errorCode, super.getMessage(), params));
         }
         return msgCache.message;
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-compiler/pom.xml b/hyracks-fullstack/algebricks/algebricks-compiler/pom.xml
index e4abdbd..08081ce 100644
--- a/hyracks-fullstack/algebricks/algebricks-compiler/pom.xml
+++ b/hyracks-fullstack/algebricks/algebricks-compiler/pom.xml
@@ -90,10 +90,14 @@
       <version>1.6.6</version>
       <scope>test</scope>
    </dependency>
-    <dependency>
+   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
-    </dependency>
+   </dependency>
+   <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+   </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/api/HeuristicCompilerFactoryBuilder.java b/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/api/HeuristicCompilerFactoryBuilder.java
index 311aa43..2d6123e 100644
--- a/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/api/HeuristicCompilerFactoryBuilder.java
+++ b/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/api/HeuristicCompilerFactoryBuilder.java
@@ -93,7 +93,7 @@
                     @Override
                     public JobSpecification createJob(Object appContext,
                             IJobletEventListenerFactory jobEventListenerFactory) throws AlgebricksException {
-                        AlgebricksConfig.ALGEBRICKS_LOGGER.fine("Starting Job Generation.\n");
+                        AlgebricksConfig.ALGEBRICKS_LOGGER.debug("Starting Job Generation.\n");
                         JobGenContext context = new JobGenContext(null, metadata, appContext,
                                 serializerDeserializerProvider, hashFunctionFactoryProvider, hashFunctionFamilyProvider,
                                 comparatorFactoryProvider, typeTraitProvider, binaryBooleanInspectorFactory,
@@ -104,7 +104,7 @@
                                 clusterLocations);
 
                         PlanCompiler pc = new PlanCompiler(context);
-                        return pc.compilePlan(plan, null, jobEventListenerFactory);
+                        return pc.compilePlan(plan, jobEventListenerFactory);
                     }
                 };
             }
diff --git a/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/rewriter/rulecontrollers/SequentialFirstRuleCheckFixpointRuleController.java b/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/rewriter/rulecontrollers/SequentialFirstRuleCheckFixpointRuleController.java
index 7328278..29c178a 100644
--- a/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/rewriter/rulecontrollers/SequentialFirstRuleCheckFixpointRuleController.java
+++ b/hyracks-fullstack/algebricks/algebricks-compiler/src/main/java/org/apache/hyracks/algebricks/compiler/rewriter/rulecontrollers/SequentialFirstRuleCheckFixpointRuleController.java
@@ -59,8 +59,7 @@
         if (ruleCollection instanceof List) {
             rules = (List<IAlgebraicRewriteRule>) ruleCollection;
         } else {
-            throw AlgebricksException.create(ErrorCode.RULECOLLECTION_NOT_INSTANCE_OF_LIST,
-                    this.getClass().getName());
+            throw AlgebricksException.create(ErrorCode.RULECOLLECTION_NOT_INSTANCE_OF_LIST, this.getClass().getName());
         }
 
         if (rules.isEmpty()) {
diff --git a/hyracks-fullstack/algebricks/algebricks-core/pom.xml b/hyracks-fullstack/algebricks/algebricks-core/pom.xml
index c325b19..9f7d2bd 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/pom.xml
+++ b/hyracks-fullstack/algebricks/algebricks-core/pom.xml
@@ -81,5 +81,9 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IHyracksJobBuilder.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IHyracksJobBuilder.java
index 1012fef..663661c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IHyracksJobBuilder.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IHyracksJobBuilder.java
@@ -46,7 +46,8 @@
     /**
      * inputs are numbered starting from 0
      */
-    public void contributeGraphEdge(ILogicalOperator src, int srcOutputIndex, ILogicalOperator dest, int destInputIndex);
+    public void contributeGraphEdge(ILogicalOperator src, int srcOutputIndex, ILogicalOperator dest,
+            int destInputIndex);
 
     public void contributeConnector(ILogicalOperator exchgOp, IConnectorDescriptor conn);
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/ILogicalOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/ILogicalOperator.java
index 707a7db..dd7e065 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/ILogicalOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/ILogicalOperator.java
@@ -65,7 +65,7 @@
 
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context,
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException;
+            throws AlgebricksException;
 
     // variables
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IPhysicalOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IPhysicalOperator.java
index 8c0ab2f..2a92aba 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IPhysicalOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/IPhysicalOperator.java
@@ -53,7 +53,7 @@
 
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException;
+            throws AlgebricksException;
 
     public void disableJobGenBelowMe();
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalExpressionTag.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalExpressionTag.java
index 58f4c60..45b7edc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalExpressionTag.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalExpressionTag.java
@@ -19,5 +19,7 @@
 package org.apache.hyracks.algebricks.core.algebra.base;
 
 public enum LogicalExpressionTag {
-    FUNCTION_CALL, VARIABLE, CONSTANT
+    FUNCTION_CALL,
+    VARIABLE,
+    CONSTANT
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
index 2023304..f3b9edc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/LogicalVariable.java
@@ -48,11 +48,10 @@
 
     @Override
     public boolean equals(Object obj) {
-        if (!(obj instanceof LogicalVariable)) {
-            return false;
-        } else {
+        if (obj instanceof LogicalVariable) {
             return id == ((LogicalVariable) obj).getId();
         }
+        return false;
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
index 75b63f1..db9728b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/base/PhysicalOperatorTag.java
@@ -44,6 +44,7 @@
     MATERIALIZE,
     MICRO_PRE_CLUSTERED_GROUP_BY,
     MICRO_PRE_SORTED_DISTINCT_BY,
+    MICRO_UNION_ALL,
     NESTED_LOOP,
     NESTED_TUPLE_SOURCE,
     ONE_TO_ONE_EXCHANGE,
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/ExpressionRuntimeProvider.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/ExpressionRuntimeProvider.java
index 31726d2..71f7b52 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/ExpressionRuntimeProvider.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/ExpressionRuntimeProvider.java
@@ -44,7 +44,7 @@
     @Override
     public IAggregateEvaluatorFactory createAggregateFunctionFactory(AggregateFunctionCallExpression expr,
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         return lejg.createAggregateFunctionFactory(expr, env, inputSchemas, context);
     }
 
@@ -58,14 +58,14 @@
     @Override
     public IRunningAggregateEvaluatorFactory createRunningAggregateFunctionFactory(StatefulFunctionCallExpression expr,
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         return lejg.createRunningAggregateFunctionFactory(expr, env, inputSchemas, context);
     }
 
     @Override
     public IUnnestingEvaluatorFactory createUnnestingFunctionFactory(UnnestingFunctionCallExpression expr,
             IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         return lejg.createUnnestingFunctionFactory(expr, env, inputSchemas, context);
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/IMergeAggregationExpressionFactory.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/IMergeAggregationExpressionFactory.java
index 2816477..d022bff 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/IMergeAggregationExpressionFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/IMergeAggregationExpressionFactory.java
@@ -24,6 +24,6 @@
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
 
 public interface IMergeAggregationExpressionFactory {
-    ILogicalExpression createMergeAggregation(LogicalVariable originalAggVariable, ILogicalExpression expr, IOptimizationContext env)
-            throws AlgebricksException;
+    ILogicalExpression createMergeAggregation(LogicalVariable originalAggVariable, ILogicalExpression expr,
+            IOptimizationContext env) throws AlgebricksException;
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
index 2ccf0c4..c1342cc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/expressions/VariableReferenceExpression.java
@@ -33,6 +33,9 @@
     private LogicalVariable variable;
 
     public VariableReferenceExpression(int tupleRef, LogicalVariable variable) {
+        if (variable == null) {
+            throw new NullPointerException();
+        }
         this.tupleRef = tupleRef;
         this.variable = variable;
     }
@@ -73,17 +76,16 @@
 
     @Override
     public boolean equals(Object obj) {
-        if (!(obj instanceof VariableReferenceExpression)) {
-            return false;
-        } else {
-            return tupleRef == ((VariableReferenceExpression) obj).tupleRef
-                    && variable.equals(((VariableReferenceExpression) obj).getVariableReference());
+        if (obj instanceof VariableReferenceExpression) {
+            final VariableReferenceExpression varRefExpr = (VariableReferenceExpression) obj;
+            return tupleRef == varRefExpr.tupleRef && variable.equals(varRefExpr.getVariableReference());
         }
+        return false;
     }
 
     @Override
     public int hashCode() {
-        return tupleRef + variable.getId();
+        return tupleRef + variable.hashCode();
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AlgebricksBuiltinFunctions.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AlgebricksBuiltinFunctions.java
index 07e4f98..2da7cf3 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AlgebricksBuiltinFunctions.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/functions/AlgebricksBuiltinFunctions.java
@@ -43,8 +43,8 @@
 
     // booleans
     public final static FunctionIdentifier NOT = new FunctionIdentifier(ALGEBRICKS_NS, "not", 1);
-    public final static FunctionIdentifier AND = new FunctionIdentifier(ALGEBRICKS_NS, "and",
-            FunctionIdentifier.VARARGS);
+    public final static FunctionIdentifier AND =
+            new FunctionIdentifier(ALGEBRICKS_NS, "and", FunctionIdentifier.VARARGS);
     public final static FunctionIdentifier OR = new FunctionIdentifier(ALGEBRICKS_NS, "or", FunctionIdentifier.VARARGS);
 
     // numerics
@@ -56,7 +56,8 @@
     // nulls
     public final static FunctionIdentifier IS_NULL = new FunctionIdentifier(ALGEBRICKS_NS, "is-null", 1);
 
-    private static final Map<FunctionIdentifier, ComparisonKind> comparisonFunctions = new HashMap<FunctionIdentifier, ComparisonKind>();
+    private static final Map<FunctionIdentifier, ComparisonKind> comparisonFunctions =
+            new HashMap<FunctionIdentifier, ComparisonKind>();
 
     static {
         comparisonFunctions.put(AlgebricksBuiltinFunctions.EQ, ComparisonKind.EQ);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java
index 8b38a2b..4686f32 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractLogicalOperator.java
@@ -19,7 +19,7 @@
 package org.apache.hyracks.algebricks.core.algebra.operators.logical;
 
 import java.util.ArrayList;
-import java.util.IdentityHashMap;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -63,7 +63,7 @@
 
     private AbstractLogicalOperator.ExecutionMode mode = AbstractLogicalOperator.ExecutionMode.UNPARTITIONED;
     protected IPhysicalOperator physicalOperator;
-    private final Map<String, Object> annotations = new IdentityHashMap<String, Object>();
+    private final Map<String, Object> annotations = new HashMap<>();
     private boolean bJobGenEnabled = true;
 
     protected final List<Mutable<ILogicalOperator>> inputs;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java
index 852c392..3bb0f47 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractReplicateOperator.java
@@ -109,4 +109,12 @@
         return false;
     }
 
+    public boolean isMaterialized(ILogicalOperator op) {
+        for (int i = 0; i < outputs.size(); i++) {
+            if (outputs.get(i).getValue() == op) {
+                return outputMaterializationFlags[i];
+            }
+        }
+        return false;
+    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractScanOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractScanOperator.java
index 5d6f40c..c163c9f 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractScanOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AbstractScanOperator.java
@@ -40,7 +40,6 @@
         return variables;
     }
 
-
     public void setVariables(List<LogicalVariable> variables) {
         this.variables = variables;
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AggregateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AggregateOperator.java
index c58dd67..b4a59a8 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AggregateOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AggregateOperator.java
@@ -98,13 +98,13 @@
 
     @Override
     public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException {
-        IVariableTypeEnvironment env = new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(),
-                ctx.getMetadataProvider());
+        IVariableTypeEnvironment env =
+                new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(), ctx.getMetadataProvider());
         IVariableTypeEnvironment env2 = ctx.getOutputTypeEnvironment(inputs.get(0).getValue());
         int n = variables.size();
         for (int i = 0; i < n; i++) {
-            Object t = ctx.getExpressionTypeComputer().getType(expressions.get(i).getValue(),
-                    ctx.getMetadataProvider(), env2);
+            Object t = ctx.getExpressionTypeComputer().getType(expressions.get(i).getValue(), ctx.getMetadataProvider(),
+                    env2);
             env.setVarType(variables.get(i), t);
         }
         return env;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AssignOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AssignOperator.java
index ef1760b..861d74c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AssignOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/AssignOperator.java
@@ -92,8 +92,8 @@
             env.setVarType(variables.get(i), ctx.getExpressionTypeComputer().getType(expressions.get(i).getValue(),
                     ctx.getMetadataProvider(), env));
             if (expressions.get(i).getValue().getExpressionTag() == LogicalExpressionTag.VARIABLE) {
-                LogicalVariable var = ((VariableReferenceExpression) expressions.get(i).getValue())
-                        .getVariableReference();
+                LogicalVariable var =
+                        ((VariableReferenceExpression) expressions.get(i).getValue()).getVariableReference();
                 for (List<LogicalVariable> list : env.getCorrelatedMissableVariableLists()) {
                     if (list.contains(var)) {
                         list.add(variables.get(i));
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/GroupByOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/GroupByOperator.java
index aa694b8..365d77e 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/GroupByOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/GroupByOperator.java
@@ -296,9 +296,8 @@
     // The groupAll flag can only be set if group by columns are empty.
     private void checkGroupAll(boolean groupAll) {
         if (groupAll && !gByList.isEmpty()) {
-            throw new IllegalStateException(
-                    "Conflicting parameters for GROUP BY: there should be no GROUP BY keys "
-                            + "when the GROUP ALL flag is set to true");
+            throw new IllegalStateException("Conflicting parameters for GROUP BY: there should be no GROUP BY keys "
+                    + "when the GROUP ALL flag is set to true");
         }
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IndexInsertDeleteUpsertOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IndexInsertDeleteUpsertOperator.java
index 02765f1..31a1294 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IndexInsertDeleteUpsertOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IndexInsertDeleteUpsertOperator.java
@@ -181,8 +181,8 @@
         return prevAdditionalFilteringExpression;
     }
 
-    public void
-            setBeforeOpAdditionalFilteringExpression(Mutable<ILogicalExpression> prevAdditionalFilteringExpression) {
+    public void setBeforeOpAdditionalFilteringExpression(
+            Mutable<ILogicalExpression> prevAdditionalFilteringExpression) {
         this.prevAdditionalFilteringExpression = prevAdditionalFilteringExpression;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
index 114fde0..8a06ec4 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/IntersectOperator.java
@@ -155,8 +155,8 @@
             Object expectedType = expected.getVarType(expectedVariables.get(i));
             Object actualType = actual.getVarType(actualVariables.get(i));
             if (!expectedType.equals(actualType)) {
-                AlgebricksConfig.ALGEBRICKS_LOGGER.warning(
-                        "Type of two variables are not equal." + expectedVariables.get(i) + " is of type: "
+                AlgebricksConfig.ALGEBRICKS_LOGGER
+                        .warn("Type of two variables are not equal." + expectedVariables.get(i) + " is of type: "
                                 + expectedType + actualVariables.get(i) + " is of type: " + actualType);
             }
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterJoinOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterJoinOperator.java
index 2ae27f1..797c5eb 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterJoinOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/LeftOuterJoinOperator.java
@@ -64,9 +64,9 @@
         for (int i = 0; i < n; i++) {
             envPointers[i] = new OpRefTypeEnvPointer(inputs.get(i), ctx);
         }
-        PropagatingTypeEnvironment env = new PropagatingTypeEnvironment(ctx.getExpressionTypeComputer(),
-                ctx.getMissableTypeComputer(), ctx.getMetadataProvider(), TypePropagationPolicy.LEFT_OUTER,
-                envPointers);
+        PropagatingTypeEnvironment env =
+                new PropagatingTypeEnvironment(ctx.getExpressionTypeComputer(), ctx.getMissableTypeComputer(),
+                        ctx.getMetadataProvider(), TypePropagationPolicy.LEFT_OUTER, envPointers);
         List<LogicalVariable> liveVars = new ArrayList<LogicalVariable>();
         VariableUtilities.getLiveVariables(inputs.get(1).getValue(), liveVars); // live variables from outer branch can be null together
         env.getCorrelatedMissableVariableLists().add(liveVars);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/MaterializeOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/MaterializeOperator.java
index 6c10d60..9e35885 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/MaterializeOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/MaterializeOperator.java
@@ -43,7 +43,8 @@
     }
 
     @Override
-    public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform) throws AlgebricksException {
+    public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/RunningAggregateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/RunningAggregateOperator.java
index c2e244b..ef16613 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/RunningAggregateOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/RunningAggregateOperator.java
@@ -72,10 +72,8 @@
         IVariableTypeEnvironment env = createPropagatingAllInputsTypeEnvironment(ctx);
         int n = variables.size();
         for (int i = 0; i < n; i++) {
-            env.setVarType(
-                    variables.get(i),
-                    ctx.getExpressionTypeComputer().getType(expressions.get(i).getValue(), ctx.getMetadataProvider(),
-                            env));
+            env.setVarType(variables.get(i), ctx.getExpressionTypeComputer().getType(expressions.get(i).getValue(),
+                    ctx.getMetadataProvider(), env));
         }
         return env;
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ScriptOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ScriptOperator.java
index b04b28c..6fb767c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ScriptOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/ScriptOperator.java
@@ -99,8 +99,8 @@
 
     @Override
     public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException {
-        IVariableTypeEnvironment env = new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(),
-                ctx.getMetadataProvider());
+        IVariableTypeEnvironment env =
+                new NonPropagatingTypeEnvironment(ctx.getExpressionTypeComputer(), ctx.getMetadataProvider());
         for (Pair<LogicalVariable, Object> p : scriptDesc.getVarTypePairs()) {
             env.setVarType(p.first, p.second);
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/TokenizeOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/TokenizeOperator.java
index c69ead7..d61ad07 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/TokenizeOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/TokenizeOperator.java
@@ -50,12 +50,9 @@
     private final List<Object> tokenizeVarTypes;
     private List<Mutable<ILogicalExpression>> additionalFilteringExpressions;
 
-    public TokenizeOperator(IDataSourceIndex<?, ?> dataSourceIndex,
-            List<Mutable<ILogicalExpression>> primaryKeyExprs,
-            List<Mutable<ILogicalExpression>> secondaryKeyExprs,
-            List<LogicalVariable> tokenizeVars,
-            Mutable<ILogicalExpression> filterExpr, Kind operation,
-            boolean bulkload, boolean isPartitioned,
+    public TokenizeOperator(IDataSourceIndex<?, ?> dataSourceIndex, List<Mutable<ILogicalExpression>> primaryKeyExprs,
+            List<Mutable<ILogicalExpression>> secondaryKeyExprs, List<LogicalVariable> tokenizeVars,
+            Mutable<ILogicalExpression> filterExpr, Kind operation, boolean bulkload, boolean isPartitioned,
             List<Object> tokenizeVarTypes) {
         this.dataSourceIndex = dataSourceIndex;
         this.primaryKeyExprs = primaryKeyExprs;
@@ -76,9 +73,7 @@
     }
 
     @Override
-    public boolean acceptExpressionTransform(
-            ILogicalExpressionReferenceTransform visitor)
-            throws AlgebricksException {
+    public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform visitor) throws AlgebricksException {
         boolean b = false;
         for (int i = 0; i < primaryKeyExprs.size(); i++) {
             if (visitor.transform(primaryKeyExprs.get(i))) {
@@ -94,8 +89,7 @@
     }
 
     @Override
-    public <R, T> R accept(ILogicalOperatorVisitor<R, T> visitor, T arg)
-            throws AlgebricksException {
+    public <R, T> R accept(ILogicalOperatorVisitor<R, T> visitor, T arg) throws AlgebricksException {
         return visitor.visitTokenizeOperator(this, arg);
     }
 
@@ -109,8 +103,8 @@
         return new VariablePropagationPolicy() {
 
             @Override
-            public void propagateVariables(IOperatorSchema target,
-                    IOperatorSchema... sources) throws AlgebricksException {
+            public void propagateVariables(IOperatorSchema target, IOperatorSchema... sources)
+                    throws AlgebricksException {
                 target.addAllVariables(sources[0]);
                 for (LogicalVariable v : tokenizeVars) {
                     target.addVariable(v);
@@ -126,8 +120,7 @@
     }
 
     @Override
-    public IVariableTypeEnvironment computeOutputTypeEnvironment(
-            ITypingContext ctx) throws AlgebricksException {
+    public IVariableTypeEnvironment computeOutputTypeEnvironment(ITypingContext ctx) throws AlgebricksException {
         IVariableTypeEnvironment env = createPropagatingAllInputsTypeEnvironment(ctx);
 
         // If the secondary index is not length-partitioned, create one new
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java
index b1ca744..3a0068d 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/UpdateOperator.java
@@ -35,7 +35,8 @@
     }
 
     @Override
-    public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform) throws AlgebricksException {
+    public boolean acceptExpressionTransform(ILogicalExpressionReferenceTransform transform)
+            throws AlgebricksException {
         // TODO Auto-generated method stub
         return false;
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java
index f800be8..39d522f 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/FDsAndEquivClassesVisitor.java
@@ -315,7 +315,7 @@
         }
         if (changed) {
             AlgebricksConfig.ALGEBRICKS_LOGGER
-                    .fine(">>>> Group-by list changed from " + GroupByOperator.veListToString(gByList) + " to "
+                    .debug(">>>> Group-by list changed from " + GroupByOperator.veListToString(gByList) + " to "
                             + GroupByOperator.veListToString(newGbyList) + ".\n");
         }
         gByList.clear();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
index 0c53685..fb1bcec 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/IsomorphismOperatorVisitor.java
@@ -77,7 +77,8 @@
 
 public class IsomorphismOperatorVisitor implements ILogicalOperatorVisitor<Boolean, ILogicalOperator> {
 
-    private final Map<LogicalVariable, LogicalVariable> variableMapping = new HashMap<LogicalVariable, LogicalVariable>();
+    private final Map<LogicalVariable, LogicalVariable> variableMapping =
+            new HashMap<LogicalVariable, LogicalVariable>();
 
     public IsomorphismOperatorVisitor() {
     }
@@ -89,9 +90,9 @@
             return Boolean.FALSE;
         }
         AggregateOperator aggOpArg = (AggregateOperator) copyAndSubstituteVar(op, arg);
-        boolean isomorphic = VariableUtilities.varListEqualUnordered(
-                getPairList(op.getVariables(), op.getExpressions()),
-                getPairList(aggOpArg.getVariables(), aggOpArg.getExpressions()));
+        boolean isomorphic =
+                VariableUtilities.varListEqualUnordered(getPairList(op.getVariables(), op.getExpressions()),
+                        getPairList(aggOpArg.getVariables(), aggOpArg.getExpressions()));
         return isomorphic;
     }
 
@@ -103,9 +104,9 @@
             return Boolean.FALSE;
         }
         RunningAggregateOperator aggOpArg = (RunningAggregateOperator) copyAndSubstituteVar(op, arg);
-        boolean isomorphic = VariableUtilities.varListEqualUnordered(
-                getPairList(op.getVariables(), op.getExpressions()),
-                getPairList(aggOpArg.getVariables(), aggOpArg.getExpressions()));
+        boolean isomorphic =
+                VariableUtilities.varListEqualUnordered(getPairList(op.getVariables(), op.getExpressions()),
+                        getPairList(aggOpArg.getVariables(), aggOpArg.getExpressions()));
         return isomorphic;
     }
 
@@ -142,8 +143,10 @@
         GroupByOperator gbyOpArg = (GroupByOperator) copyAndSubstituteVar(op, arg);
         List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> keyListsArg = gbyOpArg.getGroupByList();
 
-        List<Pair<LogicalVariable, ILogicalExpression>> listLeft = new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
-        List<Pair<LogicalVariable, ILogicalExpression>> listRight = new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
+        List<Pair<LogicalVariable, ILogicalExpression>> listLeft =
+                new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
+        List<Pair<LogicalVariable, ILogicalExpression>> listRight =
+                new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
 
         for (Pair<LogicalVariable, Mutable<ILogicalExpression>> pair : keyLists) {
             listLeft.add(new Pair<LogicalVariable, ILogicalExpression>(pair.first, pair.second.getValue()));
@@ -249,9 +252,9 @@
             return Boolean.FALSE;
         }
         AssignOperator assignOpArg = (AssignOperator) copyAndSubstituteVar(op, arg);
-        boolean isomorphic = VariableUtilities.varListEqualUnordered(
-                getPairList(op.getVariables(), op.getExpressions()),
-                getPairList(assignOpArg.getVariables(), assignOpArg.getExpressions()));
+        boolean isomorphic =
+                VariableUtilities.varListEqualUnordered(getPairList(op.getVariables(), op.getExpressions()),
+                        getPairList(assignOpArg.getVariables(), assignOpArg.getExpressions()));
         return isomorphic;
     }
 
@@ -659,7 +662,8 @@
 
     public List<Pair<LogicalVariable, ILogicalExpression>> getPairList(List<LogicalVariable> vars,
             List<Mutable<ILogicalExpression>> exprs) throws AlgebricksException {
-        List<Pair<LogicalVariable, ILogicalExpression>> list = new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
+        List<Pair<LogicalVariable, ILogicalExpression>> list =
+                new ArrayList<Pair<LogicalVariable, ILogicalExpression>>();
         if (vars.size() != exprs.size()) {
             throw new AlgebricksException("variable list size does not equal to expression list size ");
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java
index a75e7d6..74afdf5 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalOperatorDeepCopyWithNewVariablesVisitor.java
@@ -203,8 +203,8 @@
 
     private List<Pair<IOrder, Mutable<ILogicalExpression>>> deepCopyOrderExpressionReferencePairList(
             List<Pair<IOrder, Mutable<ILogicalExpression>>> list) throws AlgebricksException {
-        ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>> listCopy = new ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>>(
-                list.size());
+        ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>> listCopy =
+                new ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>>(list.size());
         for (Pair<IOrder, Mutable<ILogicalExpression>> pair : list) {
             listCopy.add(new Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>>(deepCopyOrder(pair.first),
                     exprDeepCopyVisitor.deepCopyExpressionReference(pair.second)));
@@ -248,8 +248,8 @@
 
     private List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> deepCopyVariableExpressionReferencePairList(
             List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> list) throws AlgebricksException {
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> listCopy = new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>(
-                list.size());
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> listCopy =
+                new ArrayList<Pair<LogicalVariable, Mutable<ILogicalExpression>>>(list.size());
         for (Pair<LogicalVariable, Mutable<ILogicalExpression>> pair : list) {
             listCopy.add(new Pair<LogicalVariable, Mutable<ILogicalExpression>>(deepCopyVariable(pair.first),
                     exprDeepCopyVisitor.deepCopyExpressionReference(pair.second)));
@@ -317,8 +317,8 @@
     @Override
     public ILogicalOperator visitDataScanOperator(DataSourceScanOperator op, ILogicalOperator arg)
             throws AlgebricksException {
-        DataSourceScanOperator opCopy = new DataSourceScanOperator(deepCopyVariableList(op.getVariables()),
-                op.getDataSource());
+        DataSourceScanOperator opCopy =
+                new DataSourceScanOperator(deepCopyVariableList(op.getVariables()), op.getDataSource());
         deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy);
         return opCopy;
     }
@@ -326,8 +326,8 @@
     @Override
     public ILogicalOperator visitDistinctOperator(DistinctOperator op, ILogicalOperator arg)
             throws AlgebricksException {
-        DistinctOperator opCopy = new DistinctOperator(
-                exprDeepCopyVisitor.deepCopyExpressionReferenceList(op.getExpressions()));
+        DistinctOperator opCopy =
+                new DistinctOperator(exprDeepCopyVisitor.deepCopyExpressionReferenceList(op.getExpressions()));
         deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy);
         return opCopy;
     }
@@ -349,10 +349,10 @@
 
     @Override
     public ILogicalOperator visitGroupByOperator(GroupByOperator op, ILogicalOperator arg) throws AlgebricksException {
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByListCopy = deepCopyVariableExpressionReferencePairList(
-                op.getGroupByList());
-        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorListCopy = deepCopyVariableExpressionReferencePairList(
-                op.getDecorList());
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByListCopy =
+                deepCopyVariableExpressionReferencePairList(op.getGroupByList());
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> decorListCopy =
+                deepCopyVariableExpressionReferencePairList(op.getDecorList());
         List<ILogicalPlan> nestedPlansCopy = new ArrayList<ILogicalPlan>();
 
         GroupByOperator opCopy = new GroupByOperator(groupByListCopy, decorListCopy, nestedPlansCopy, op.isGroupAll());
@@ -364,10 +364,10 @@
     @Override
     public ILogicalOperator visitInnerJoinOperator(InnerJoinOperator op, ILogicalOperator arg)
             throws AlgebricksException {
-        InnerJoinOperator opCopy = new InnerJoinOperator(
-                exprDeepCopyVisitor.deepCopyExpressionReference(op.getCondition()),
-                deepCopyOperatorReference(op.getInputs().get(0), arg),
-                deepCopyOperatorReference(op.getInputs().get(1), arg));
+        InnerJoinOperator opCopy =
+                new InnerJoinOperator(exprDeepCopyVisitor.deepCopyExpressionReference(op.getCondition()),
+                        deepCopyOperatorReference(op.getInputs().get(0), arg),
+                        deepCopyOperatorReference(op.getInputs().get(1), arg));
         copyAnnotations(op, opCopy);
         opCopy.setExecutionMode(op.getExecutionMode());
         return opCopy;
@@ -376,10 +376,10 @@
     @Override
     public ILogicalOperator visitLeftOuterJoinOperator(LeftOuterJoinOperator op, ILogicalOperator arg)
             throws AlgebricksException {
-        LeftOuterJoinOperator opCopy = new LeftOuterJoinOperator(
-                exprDeepCopyVisitor.deepCopyExpressionReference(op.getCondition()),
-                deepCopyOperatorReference(op.getInputs().get(0), arg),
-                deepCopyOperatorReference(op.getInputs().get(1), arg));
+        LeftOuterJoinOperator opCopy =
+                new LeftOuterJoinOperator(exprDeepCopyVisitor.deepCopyExpressionReference(op.getCondition()),
+                        deepCopyOperatorReference(op.getInputs().get(0), arg),
+                        deepCopyOperatorReference(op.getInputs().get(1), arg));
         copyAnnotations(op, opCopy);
         opCopy.setExecutionMode(op.getExecutionMode());
         return opCopy;
@@ -396,8 +396,8 @@
     @Override
     public ILogicalOperator visitNestedTupleSourceOperator(NestedTupleSourceOperator op, ILogicalOperator arg)
             throws AlgebricksException {
-        Mutable<ILogicalOperator> dataSourceReference = arg == null ? op.getDataSourceReference()
-                : new MutableObject<>(arg);
+        Mutable<ILogicalOperator> dataSourceReference =
+                arg == null ? op.getDataSourceReference() : new MutableObject<>(arg);
         NestedTupleSourceOperator opCopy = new NestedTupleSourceOperator(dataSourceReference);
         deepCopyInputsAnnotationsAndExecutionMode(op, arg, opCopy);
         return opCopy;
@@ -495,8 +495,8 @@
         int index = 0;
         for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> triple : op.getVariableMappings()) {
             LogicalVariable producedVar = deepCopyVariable(triple.third);
-            Triple<LogicalVariable, LogicalVariable, LogicalVariable> copiedTriple = new Triple<>(
-                    liveVarsInLeftInput.get(index), liveVarsInRightInput.get(index), producedVar);
+            Triple<LogicalVariable, LogicalVariable, LogicalVariable> copiedTriple =
+                    new Triple<>(liveVarsInLeftInput.get(index), liveVarsInRightInput.get(index), producedVar);
             copiedTriples.add(copiedTriple);
             ++index;
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java
index bdabbca..5d9e2dc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/LogicalPropertiesVisitor.java
@@ -81,7 +81,7 @@
         }
         op.accept(visitor, context);
         if (AlgebricksConfig.DEBUG) {
-            AlgebricksConfig.ALGEBRICKS_LOGGER.finest(
+            AlgebricksConfig.ALGEBRICKS_LOGGER.trace(
                     "Logical properties visitor for " + op + ": " + context.getLogicalPropertiesVector(op) + "\n");
         }
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
index 7543e5f..600714b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/OperatorDeepCopyVisitor.java
@@ -369,8 +369,8 @@
         return newObjs;
     }
 
-    private List<Pair<IOrder, Mutable<ILogicalExpression>>>
-            deepCopyOrderAndExpression(List<Pair<IOrder, Mutable<ILogicalExpression>>> ordersAndExprs) {
+    private List<Pair<IOrder, Mutable<ILogicalExpression>>> deepCopyOrderAndExpression(
+            List<Pair<IOrder, Mutable<ILogicalExpression>>> ordersAndExprs) {
         List<Pair<IOrder, Mutable<ILogicalExpression>>> newOrdersAndExprs = new ArrayList<>();
         for (Pair<IOrder, Mutable<ILogicalExpression>> pair : ordersAndExprs) {
             newOrdersAndExprs.add(new Pair<>(pair.first, deepCopyExpressionRef(pair.second)));
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java
index 7221e81..69fe746 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/logical/visitors/VariableUtilities.java
@@ -139,7 +139,7 @@
 
     public static void substituteVariables(ILogicalOperator op,
             List<Pair<LogicalVariable, LogicalVariable>> oldVarNewVarMapHistory, ITypingContext ctx)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         for (Pair<LogicalVariable, LogicalVariable> entry : oldVarNewVarMapHistory) {
             VariableUtilities.substituteVariables(op, entry.first, entry.second, ctx);
         }
@@ -165,8 +165,8 @@
 
     public static void substituteVariables(ILogicalOperator op, LogicalVariable v1, LogicalVariable v2,
             boolean goThroughNts, ITypingContext ctx) throws AlgebricksException {
-        ILogicalOperatorVisitor<Void, Pair<LogicalVariable, LogicalVariable>> visitor = new SubstituteVariableVisitor(
-                goThroughNts, ctx);
+        ILogicalOperatorVisitor<Void, Pair<LogicalVariable, LogicalVariable>> visitor =
+                new SubstituteVariableVisitor(goThroughNts, ctx);
         op.accept(visitor, new Pair<LogicalVariable, LogicalVariable>(v1, v2));
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractExchangePOperator.java
index 799a6af..6f8d5e9 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractExchangePOperator.java
@@ -33,8 +33,8 @@
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
-        Pair<IConnectorDescriptor, TargetConstraint> connPair = createConnectorDescriptor(builder.getJobSpec(), op,
-                opSchema, context);
+        Pair<IConnectorDescriptor, TargetConstraint> connPair =
+                createConnectorDescriptor(builder.getJobSpec(), op, opSchema, context);
         builder.contributeConnectorWithTargetConstraint(op, connPair.first, connPair.second);
         ILogicalOperator src = op.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
index f6a1bc4..6a81005 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractHashJoinPOperator.java
@@ -96,10 +96,10 @@
         switch (partitioningType) {
             case PAIRWISE:
                 pp1 = new UnorderedPartitionedProperty(new ListSet<>(keysLeftBranch),
-                            context.getComputationNodeDomain());
+                        context.getComputationNodeDomain());
                 pp2 = new UnorderedPartitionedProperty(new ListSet<>(keysRightBranch),
-                            context.getComputationNodeDomain());
-                    break;
+                        context.getComputationNodeDomain());
+                break;
             case BROADCAST:
                 pp1 = new RandomPartitioningProperty(context.getComputationNodeDomain());
                 pp2 = new BroadcastPartitioningProperty(context.getComputationNodeDomain());
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractJoinPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractJoinPOperator.java
index 4afcbc8..aea9b3e 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractJoinPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractJoinPOperator.java
@@ -25,7 +25,8 @@
 public abstract class AbstractJoinPOperator extends AbstractPhysicalOperator {
 
     public enum JoinPartitioningType {
-        PAIRWISE, BROADCAST
+        PAIRWISE,
+        BROADCAST
     }
 
     protected final JoinKind kind;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPhysicalOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPhysicalOperator.java
index 0fb667a..29d6037 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPhysicalOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPhysicalOperator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.hyracks.algebricks.core.algebra.operators.physical;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksCountPartitionConstraint;
@@ -72,8 +74,8 @@
     }
 
     protected PhysicalRequirements emptyUnaryRequirements() {
-        StructuralPropertiesVector[] req = new StructuralPropertiesVector[] {
-                StructuralPropertiesVector.EMPTY_PROPERTIES_VECTOR };
+        StructuralPropertiesVector[] req =
+                new StructuralPropertiesVector[] { StructuralPropertiesVector.EMPTY_PROPERTIES_VECTOR };
         return new PhysicalRequirements(req, IPartitioningRequirementsCoordinator.NO_COORDINATION);
     }
 
@@ -97,7 +99,7 @@
 
     /**
      * @return labels (0 or 1) for each input and output indicating the dependency between them.
-     *         The edges labeled as 1 must wait for the edges with label 0.
+     * The edges labeled as 1 must wait for the edges with label 0.
      */
     @Override
     public Pair<int[], int[]> getInputOutputDependencyLabels(ILogicalOperator op) {
@@ -117,48 +119,62 @@
 
     protected AlgebricksPipeline[] compileSubplans(IOperatorSchema outerPlanSchema,
             AbstractOperatorWithNestedPlans npOp, IOperatorSchema opSchema, JobGenContext context)
-                    throws AlgebricksException {
-        AlgebricksPipeline[] subplans = new AlgebricksPipeline[npOp.getNestedPlans().size()];
+            throws AlgebricksException {
+        List<List<AlgebricksPipeline>> subplans = compileSubplansImpl(outerPlanSchema, npOp, opSchema, context);
+        int n = subplans.size();
+        AlgebricksPipeline[] result = new AlgebricksPipeline[n];
+        for (int i = 0; i < n; i++) {
+            List<AlgebricksPipeline> subplanOps = subplans.get(i);
+            if (subplanOps.size() != 1) {
+                throw new AlgebricksException("Attempting to construct a nested plan with " + subplanOps.size()
+                        + " operator descriptors. Currently, nested plans can only consist in linear pipelines of "
+                        + "micro operators.");
+            }
+            result[i] = subplanOps.get(0);
+        }
+        return result;
+    }
+
+    protected List<List<AlgebricksPipeline>> compileSubplansImpl(IOperatorSchema outerPlanSchema,
+            AbstractOperatorWithNestedPlans npOp, IOperatorSchema opSchema, JobGenContext context)
+            throws AlgebricksException {
+        List<List<AlgebricksPipeline>> subplans = new ArrayList<>(npOp.getNestedPlans().size());
         PlanCompiler pc = new PlanCompiler(context);
-        int i = 0;
         for (ILogicalPlan p : npOp.getNestedPlans()) {
-            subplans[i++] = buildPipelineWithProjection(p, outerPlanSchema, npOp, opSchema, pc);
+            subplans.add(buildPipelineWithProjection(p, outerPlanSchema, npOp, opSchema, pc));
         }
         return subplans;
     }
 
-    private AlgebricksPipeline buildPipelineWithProjection(ILogicalPlan p, IOperatorSchema outerPlanSchema,
+    private List<AlgebricksPipeline> buildPipelineWithProjection(ILogicalPlan p, IOperatorSchema outerPlanSchema,
             AbstractOperatorWithNestedPlans npOp, IOperatorSchema opSchema, PlanCompiler pc)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         if (p.getRoots().size() > 1) {
             throw new NotImplementedException("Nested plans with several roots are not supported.");
         }
-        JobSpecification nestedJob = pc.compilePlan(p, outerPlanSchema, null);
+        JobSpecification nestedJob = pc.compileNestedPlan(p, outerPlanSchema);
         ILogicalOperator topOpInSubplan = p.getRoots().get(0).getValue();
         JobGenContext context = pc.getContext();
         IOperatorSchema topOpInSubplanScm = context.getSchema(topOpInSubplan);
         opSchema.addAllVariables(topOpInSubplanScm);
 
         Map<OperatorDescriptorId, IOperatorDescriptor> opMap = nestedJob.getOperatorMap();
-        if (opMap.size() != 1) {
-            throw new AlgebricksException("Attempting to construct a nested plan with " + opMap.size()
-                    + " operator descriptors. Currently, nested plans can only consist in linear pipelines of Asterix micro operators.");
-        }
-
-        for (Map.Entry<OperatorDescriptorId, IOperatorDescriptor> opEntry : opMap.entrySet()) {
-            IOperatorDescriptor opd = opEntry.getValue();
-            if (!(opd instanceof AlgebricksMetaOperatorDescriptor)) {
-                throw new AlgebricksException(
-                        "Can only generate Hyracks jobs for pipelinable Asterix nested plans, not for "
-                                + opd.getClass().getName());
+        List<? extends IOperatorDescriptor> metaOps = nestedJob.getMetaOps();
+        if (opMap.size() != metaOps.size()) {
+            for (IOperatorDescriptor opd : opMap.values()) {
+                if (!(opd instanceof AlgebricksMetaOperatorDescriptor)) {
+                    throw new AlgebricksException(
+                            "Can only generate jobs for pipelinable nested plans, not for " + opd.getClass().getName());
+                }
             }
-            AlgebricksMetaOperatorDescriptor amod = (AlgebricksMetaOperatorDescriptor) opd;
-
-            return amod.getPipeline();
-            // we suppose that the top operator in the subplan already does the
-            // projection for us
+            throw new IllegalStateException("Unexpected nested plan");
         }
 
-        throw new IllegalStateException();
+        List<AlgebricksPipeline> result = new ArrayList<>(metaOps.size());
+        for (IOperatorDescriptor opd : metaOps) {
+            AlgebricksMetaOperatorDescriptor amod = (AlgebricksMetaOperatorDescriptor) opd;
+            result.add(amod.getPipeline());
+        }
+        return result;
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreclusteredGroupByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreclusteredGroupByPOperator.java
index ab68b68..64e50ed 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreclusteredGroupByPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractPreclusteredGroupByPOperator.java
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang3.mutable.Mutable;
@@ -86,6 +87,10 @@
         ILogicalOperator op2 = gby.getInputs().get(0).getValue();
         IPhysicalPropertiesVector childProp = op2.getDeliveredPhysicalProperties();
         IPartitioningProperty pp = childProp.getPartitioningProperty();
+        Map<LogicalVariable, LogicalVariable> ppSubstMap = computePartitioningPropertySubstitutionMap(gby, pp);
+        if (ppSubstMap != null) {
+            pp.substituteColumnVars(ppSubstMap);
+        }
         List<ILocalStructuralProperty> childLocals = childProp.getLocalProperties();
         if (childLocals == null) {
             deliveredProperties = new StructuralPropertiesVector(pp, propsLocal);
@@ -100,6 +105,38 @@
         deliveredProperties = new StructuralPropertiesVector(pp, propsLocal);
     }
 
+    // If we have "gby var1 as var3, var2 as var4"
+    // and input is partitioned on (var1,var2) then output is partitioned on (var3,var4)
+    private Map<LogicalVariable, LogicalVariable> computePartitioningPropertySubstitutionMap(GroupByOperator gbyOp,
+            IPartitioningProperty childpp) {
+        Set<LogicalVariable> childPartitioningColumns = new HashSet<>();
+        childpp.getColumns(childPartitioningColumns);
+
+        List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> groupByList = gbyOp.getGroupByList();
+        if (groupByList.size() != childPartitioningColumns.size()) {
+            return null;
+        }
+
+        Map<LogicalVariable, LogicalVariable> substMap = null;
+        for (Pair<LogicalVariable, Mutable<ILogicalExpression>> ve : groupByList) {
+            ILogicalExpression expr = ve.second.getValue();
+            if (expr.getExpressionTag() != LogicalExpressionTag.VARIABLE) {
+                return null;
+            }
+            VariableReferenceExpression varRefExpr = (VariableReferenceExpression) expr;
+            LogicalVariable var = varRefExpr.getVariableReference();
+            if (!childPartitioningColumns.remove(var)) {
+                return null;
+            }
+            if (substMap == null) {
+                substMap = new HashMap<>();
+            }
+            substMap.put(var, ve.first);
+        }
+
+        return childPartitioningColumns.isEmpty() ? substMap : null;
+    }
+
     @Override
     public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op,
             IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
@@ -118,7 +155,6 @@
         Set<LogicalVariable> gbvars = new ListSet<>(columnList);
         LocalGroupingProperty groupProp = new LocalGroupingProperty(gbvars, new ArrayList<>(columnList));
 
-
         boolean goon = true;
         for (ILogicalPlan p : gby.getNestedPlans()) {
             // try to propagate secondary order requirements from nested
@@ -195,8 +231,7 @@
                     tl.add(((VariableReferenceExpression) decorPair.second.getValue()).getVariableReference());
                     fdList.add(new FunctionalDependency(hd, tl));
                 }
-                if (allOk && PropertiesUtil.matchLocalProperties(localProps, props,
-                        new HashMap<>(), fdList)) {
+                if (allOk && PropertiesUtil.matchLocalProperties(localProps, props, new HashMap<>(), fdList)) {
                     localProps = props;
                 }
             }
@@ -205,8 +240,7 @@
         IPartitioningProperty pp = null;
         AbstractLogicalOperator aop = (AbstractLogicalOperator) op;
         if (aop.getExecutionMode() == ExecutionMode.PARTITIONED) {
-            pp = new UnorderedPartitionedProperty(new ListSet<>(columnList),
-                    context.getComputationNodeDomain());
+            pp = new UnorderedPartitionedProperty(new ListSet<>(columnList), context.getComputationNodeDomain());
         }
         pv[0] = new StructuralPropertiesVector(pp, localProps);
         return new PhysicalRequirements(pv, IPartitioningRequirementsCoordinator.NO_COORDINATION);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractUnionAllPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractUnionAllPOperator.java
new file mode 100644
index 0000000..a4d9576
--- /dev/null
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AbstractUnionAllPOperator.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.algebricks.core.algebra.operators.physical;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.IHyracksJobBuilder;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningRequirementsCoordinator;
+import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector;
+import org.apache.hyracks.algebricks.core.algebra.properties.PhysicalRequirements;
+import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty;
+import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector;
+import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
+
+public abstract class AbstractUnionAllPOperator extends AbstractPhysicalOperator {
+
+    @Override
+    public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
+        AbstractLogicalOperator op2 = (AbstractLogicalOperator) op.getInputs().get(0).getValue();
+        IPartitioningProperty pp = op2.getDeliveredPhysicalProperties().getPartitioningProperty();
+        this.deliveredProperties = new StructuralPropertiesVector(pp, new ArrayList<>(0));
+    }
+
+    @Override
+    public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op,
+            IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
+        StructuralPropertiesVector pv0 =
+                OperatorPropertiesUtil.checkUnpartitionedAndGetPropertiesVector(op, new StructuralPropertiesVector(
+                        new RandomPartitioningProperty(context.getComputationNodeDomain()), null));
+        StructuralPropertiesVector pv1 =
+                OperatorPropertiesUtil.checkUnpartitionedAndGetPropertiesVector(op, new StructuralPropertiesVector(
+                        new RandomPartitioningProperty(context.getComputationNodeDomain()), null));
+        return new PhysicalRequirements(new StructuralPropertiesVector[] { pv0, pv1 },
+                IPartitioningRequirementsCoordinator.NO_COORDINATION);
+    }
+
+    @Override
+    public boolean expensiveThanMaterialization() {
+        return false;
+    }
+
+    @Override
+    public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
+            IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
+            throws AlgebricksException {
+        List<Mutable<ILogicalOperator>> inputs = op.getInputs();
+        for (int i = 0; i < inputs.size(); i++) {
+            ILogicalOperator src = inputs.get(i).getValue();
+            builder.contributeGraphEdge(src, 0, op, i);
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AggregatePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AggregatePOperator.java
index f16f49a..147d5cc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AggregatePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AggregatePOperator.java
@@ -60,11 +60,11 @@
         AggregateOperator aggOp = (AggregateOperator) op;
         ILogicalOperator op2 = op.getInputs().get(0).getValue();
         if (aggOp.getExecutionMode() != AbstractLogicalOperator.ExecutionMode.UNPARTITIONED) {
-            deliveredProperties = new StructuralPropertiesVector(op2.getDeliveredPhysicalProperties()
-                    .getPartitioningProperty(), new ArrayList<>());
+            deliveredProperties = new StructuralPropertiesVector(
+                    op2.getDeliveredPhysicalProperties().getPartitioningProperty(), new ArrayList<>());
         } else {
-            deliveredProperties = new StructuralPropertiesVector(IPartitioningProperty.UNPARTITIONED,
-                    new ArrayList<>());
+            deliveredProperties =
+                    new StructuralPropertiesVector(IPartitioningProperty.UNPARTITIONED, new ArrayList<>());
         }
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AssignPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AssignPOperator.java
index 5aed63e..995f6e0 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AssignPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/AssignPOperator.java
@@ -88,14 +88,14 @@
         // TODO push projections into the operator
         int[] projectionList = JobGenHelper.projectAllVariables(opSchema);
 
-        AssignRuntimeFactory runtime = new AssignRuntimeFactory(outColumns, evalFactories, projectionList,
-                flushFramesRapidly);
+        AssignRuntimeFactory runtime =
+                new AssignRuntimeFactory(outColumns, evalFactories, projectionList, flushFramesRapidly);
 
         // contribute one Asterix framewriter
         RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
         if (cardinalityConstraint > 0) {
-            AlgebricksCountPartitionConstraint countConstraint = new AlgebricksCountPartitionConstraint(
-                    cardinalityConstraint);
+            AlgebricksCountPartitionConstraint countConstraint =
+                    new AlgebricksCountPartitionConstraint(cardinalityConstraint);
             builder.contributeMicroOperator(assign, runtime, recDesc, countConstraint);
         } else {
             builder.contributeMicroOperator(assign, runtime, recDesc);
@@ -119,7 +119,6 @@
         this.cardinalityConstraint = cardinality;
     }
 
-
     @Override
     public boolean expensiveThanMaterialization() {
         return false;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/BulkloadPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/BulkloadPOperator.java
index dda5456..2204637 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/BulkloadPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/BulkloadPOperator.java
@@ -76,8 +76,8 @@
         List<LogicalVariable> scanVariables = new ArrayList<>();
         scanVariables.addAll(primaryKeys);
         scanVariables.add(new LogicalVariable(-1));
-        IPhysicalPropertiesVector physicalProps = dataSource.getPropertiesProvider()
-                .computePropertiesVector(scanVariables);
+        IPhysicalPropertiesVector physicalProps =
+                dataSource.getPropertiesProvider().computePropertiesVector(scanVariables);
         StructuralPropertiesVector spv = new StructuralPropertiesVector(physicalProps.getPartitioningProperty(),
                 physicalProps.getLocalProperties());
         return new PhysicalRequirements(new IPhysicalPropertiesVector[] { spv },
@@ -95,7 +95,7 @@
     @Override
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         InsertDeleteUpsertOperator insertDeleteOp = (InsertDeleteUpsertOperator) op;
         assert insertDeleteOp.getOperation() == Kind.INSERT;
         assert insertDeleteOp.isBulkload();
@@ -104,9 +104,9 @@
         JobSpecification spec = builder.getJobSpec();
         RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(
                 context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
-        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints = mp.getInsertRuntime(dataSource,
-                propagatedSchema, typeEnv, primaryKeys, payload, additionalFilteringKeys, additionalNonFilterVars,
-                inputDesc, context, spec, true);
+        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints =
+                mp.getInsertRuntime(dataSource, propagatedSchema, typeEnv, primaryKeys, payload,
+                        additionalFilteringKeys, additionalNonFilterVars, inputDesc, context, spec, true);
         builder.contributeHyracksOperator(insertDeleteOp, runtimeAndConstraints.first);
         builder.contributeAlgebricksPartitionConstraint(runtimeAndConstraints.first, runtimeAndConstraints.second);
         ILogicalOperator src = insertDeleteOp.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DataSourceScanPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DataSourceScanPOperator.java
index 4a5ac5a..1421cef 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DataSourceScanPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DataSourceScanPOperator.java
@@ -109,9 +109,9 @@
         List<LogicalVariable> vars = scan.getVariables();
         List<LogicalVariable> projectVars = scan.getProjectVariables();
 
-        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> p = mp.getScannerRuntime(dataSource, vars,
-                projectVars, scan.isProjectPushed(), scan.getMinFilterVars(), scan.getMaxFilterVars(), opSchema,
-                typeEnv, context, builder.getJobSpec(), implConfig);
+        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> p =
+                mp.getScannerRuntime(dataSource, vars, projectVars, scan.isProjectPushed(), scan.getMinFilterVars(),
+                        scan.getMaxFilterVars(), opSchema, typeEnv, context, builder.getJobSpec(), implConfig);
         builder.contributeHyracksOperator(scan, p.first);
         if (p.second != null) {
             builder.contributeAlgebricksPartitionConstraint(p.first, p.second);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DistributeResultPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DistributeResultPOperator.java
index b3e8385..178f2a1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DistributeResultPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/DistributeResultPOperator.java
@@ -100,11 +100,11 @@
         RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(
                 context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
 
-        IPrinterFactory[] pf = JobGenHelper.mkPrinterFactories(inputSchemas[0], context.getTypeEnvironment(op),
-                context, columns);
+        IPrinterFactory[] pf =
+                JobGenHelper.mkPrinterFactories(inputSchemas[0], context.getTypeEnvironment(op), context, columns);
 
-        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints = mp.getResultHandleRuntime(
-                resultOp.getDataSink(), columns, pf, inputDesc, true, spec);
+        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints =
+                mp.getResultHandleRuntime(resultOp.getDataSink(), columns, pf, inputDesc, true, spec);
 
         builder.contributeHyracksOperator(resultOp, runtimeAndConstraints.first);
         ILogicalOperator src = resultOp.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ExternalGroupByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ExternalGroupByPOperator.java
index 9e7daf0..5ee967d 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ExternalGroupByPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ExternalGroupByPOperator.java
@@ -148,7 +148,7 @@
     @Override
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         List<LogicalVariable> gbyCols = getGbyColumns();
         int keys[] = JobGenHelper.variablesToFieldIndexes(gbyCols, inputSchemas[0]);
         GroupByOperator gby = (GroupByOperator) op;
@@ -179,18 +179,23 @@
         Mutable<ILogicalOperator> r0 = p0.getRoots().get(0);
         AggregateOperator aggOp = (AggregateOperator) r0.getValue();
 
+        compileSubplans(inputSchemas[0], gby, opSchema, context);
+
         IPartialAggregationTypeComputer partialAggregationTypeComputer = context.getPartialAggregationTypeComputer();
         List<Object> intermediateTypes = new ArrayList<Object>();
         int n = aggOp.getExpressions().size();
         ISerializedAggregateEvaluatorFactory[] aff = new ISerializedAggregateEvaluatorFactory[n];
         int i = 0;
         IExpressionRuntimeProvider expressionRuntimeProvider = context.getExpressionRuntimeProvider();
-        IVariableTypeEnvironment aggOpInputEnv = context.getTypeEnvironment(aggOp.getInputs().get(0).getValue());
+        ILogicalOperator aggOpInput = aggOp.getInputs().get(0).getValue();
+        IOperatorSchema aggOpInputSchema = context.getSchema(aggOpInput);
+        IOperatorSchema[] aggOpInputSchemas = new IOperatorSchema[] { aggOpInputSchema };
+        IVariableTypeEnvironment aggOpInputEnv = context.getTypeEnvironment(aggOpInput);
         IVariableTypeEnvironment outputEnv = context.getTypeEnvironment(op);
         for (Mutable<ILogicalExpression> exprRef : aggOp.getExpressions()) {
             AggregateFunctionCallExpression aggFun = (AggregateFunctionCallExpression) exprRef.getValue();
             aff[i++] = expressionRuntimeProvider.createSerializableAggregateFunctionFactory(aggFun, aggOpInputEnv,
-                    inputSchemas, context);
+                    aggOpInputSchemas, context);
             intermediateTypes
                     .add(partialAggregationTypeComputer.getType(aggFun, aggOpInputEnv, context.getMetadataProvider()));
         }
@@ -215,22 +220,21 @@
             aggOpInputEnv.setVarType(var, outputEnv.getVarType(var));
         }
 
-        compileSubplans(inputSchemas[0], gby, opSchema, context);
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
-        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper.variablesToAscBinaryComparatorFactories(gbyCols,
-                aggOpInputEnv, context);
-        RecordDescriptor recordDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema,
-                context);
-        IBinaryHashFunctionFamily[] hashFunctionFactories = JobGenHelper.variablesToBinaryHashFunctionFamilies(gbyCols,
-                aggOpInputEnv, context);
+        IBinaryComparatorFactory[] comparatorFactories =
+                JobGenHelper.variablesToAscBinaryComparatorFactories(gbyCols, aggOpInputEnv, context);
+        RecordDescriptor recordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+        IBinaryHashFunctionFamily[] hashFunctionFactories =
+                JobGenHelper.variablesToBinaryHashFunctionFamilies(gbyCols, aggOpInputEnv, context);
 
         ISerializedAggregateEvaluatorFactory[] merges = new ISerializedAggregateEvaluatorFactory[n];
         List<LogicalVariable> usedVars = new ArrayList<LogicalVariable>();
         IOperatorSchema[] localInputSchemas = new IOperatorSchema[1];
         localInputSchemas[0] = new OperatorSchemaImpl();
         for (i = 0; i < n; i++) {
-            AggregateFunctionCallExpression aggFun = (AggregateFunctionCallExpression) aggOp.getMergeExpressions()
-                    .get(i).getValue();
+            AggregateFunctionCallExpression aggFun =
+                    (AggregateFunctionCallExpression) aggOp.getMergeExpressions().get(i).getValue();
             aggFun.getUsedVariables(usedVars);
         }
         i = 0;
@@ -244,16 +248,16 @@
             localInputSchemas[0].addVariable(usedVar);
         }
         for (i = 0; i < n; i++) {
-            AggregateFunctionCallExpression mergeFun = (AggregateFunctionCallExpression) aggOp.getMergeExpressions()
-                    .get(i).getValue();
+            AggregateFunctionCallExpression mergeFun =
+                    (AggregateFunctionCallExpression) aggOp.getMergeExpressions().get(i).getValue();
             merges[i] = expressionRuntimeProvider.createSerializableAggregateFunctionFactory(mergeFun, aggOpInputEnv,
                     localInputSchemas, context);
         }
         IAggregatorDescriptorFactory aggregatorFactory = new SerializableAggregatorDescriptorFactory(aff);
         IAggregatorDescriptorFactory mergeFactory = new SerializableAggregatorDescriptorFactory(merges);
 
-        INormalizedKeyComputerFactory normalizedKeyFactory = JobGenHelper
-                .variablesToAscNormalizedKeyComputerFactory(gbyCols, aggOpInputEnv, context);
+        INormalizedKeyComputerFactory normalizedKeyFactory =
+                JobGenHelper.variablesToAscNormalizedKeyComputerFactory(gbyCols, aggOpInputEnv, context);
 
         // Calculates the hash table size (# of unique hash values) based on the budget and a tuple size.
         int memoryBudgetInBytes = context.getFrameSize() * frameLimit;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HashPartitionMergeExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HashPartitionMergeExchangePOperator.java
index 17322b6..c5ce871 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HashPartitionMergeExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HashPartitionMergeExchangePOperator.java
@@ -82,8 +82,8 @@
 
     @Override
     public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
-        IPartitioningProperty p = new UnorderedPartitionedProperty(new ListSet<LogicalVariable>(partitionFields),
-                domain);
+        IPartitioningProperty p =
+                new UnorderedPartitionedProperty(new ListSet<LogicalVariable>(partitionFields), domain);
         AbstractLogicalOperator op2 = (AbstractLogicalOperator) op.getInputs().get(0).getValue();
         List<ILocalStructuralProperty> op2Locals = op2.getDeliveredPhysicalProperties().getLocalProperties();
         List<ILocalStructuralProperty> locals = new ArrayList<ILocalStructuralProperty>();
@@ -108,8 +108,8 @@
             columns.add(new OrderColumn(var, oc.getOrder()));
         }
         orderProps.add(new LocalOrderProperty(columns));
-        StructuralPropertiesVector[] r = new StructuralPropertiesVector[] { new StructuralPropertiesVector(null,
-                orderProps) };
+        StructuralPropertiesVector[] r =
+                new StructuralPropertiesVector[] { new StructuralPropertiesVector(null, orderProps) };
         return new PhysicalRequirements(r, IPartitioningRequirementsCoordinator.NO_COORDINATION);
     }
 
@@ -155,8 +155,8 @@
             j++;
         }
 
-        IConnectorDescriptor conn = new MToNPartitioningMergingConnectorDescriptor(spec, tpcf, sortFields,
-                comparatorFactories, nkcf);
+        IConnectorDescriptor conn =
+                new MToNPartitioningMergingConnectorDescriptor(spec, tpcf, sortFields, comparatorFactories, nkcf);
         return new Pair<IConnectorDescriptor, TargetConstraint>(conn, null);
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HybridHashJoinPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HybridHashJoinPOperator.java
index ee0bec7..301b8f1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HybridHashJoinPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/HybridHashJoinPOperator.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
@@ -58,6 +57,8 @@
 import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
 import org.apache.hyracks.dataflow.std.join.HybridHashJoinOperatorDescriptor;
 import org.apache.hyracks.dataflow.std.join.OptimizedHybridHashJoinOperatorDescriptor;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class HybridHashJoinPOperator extends AbstractHashJoinPOperator {
 
@@ -67,7 +68,7 @@
     private final int aveRecordsPerFrame;
     private final double fudgeFactor;
 
-    private static final Logger LOGGER = Logger.getLogger(HybridHashJoinPOperator.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public HybridHashJoinPOperator(JoinKind kind, JoinPartitioningType partitioningType,
             List<LogicalVariable> sideLeftOfEqualities, List<LogicalVariable> sideRightOfEqualities,
@@ -78,7 +79,7 @@
         this.aveRecordsPerFrame = aveRecordsPerFrame;
         this.fudgeFactor = fudgeFactor;
 
-        LOGGER.fine("HybridHashJoinPOperator constructed with: JoinKind=" + kind + ", JoinPartitioningType="
+        LOGGER.debug("HybridHashJoinPOperator constructed with: JoinKind=" + kind + ", JoinPartitioningType="
                 + partitioningType + ", List<LogicalVariable>=" + sideLeftOfEqualities + ", List<LogicalVariable>="
                 + sideRightOfEqualities + ", int memSizeInFrames=" + memSizeInFrames + ", int maxInputSize0InFrames="
                 + maxInputSizeInFrames + ", int aveRecordsPerFrame=" + aveRecordsPerFrame + ", double fudgeFactor="
@@ -115,10 +116,10 @@
         int[] keysLeft = JobGenHelper.variablesToFieldIndexes(keysLeftBranch, inputSchemas[0]);
         int[] keysRight = JobGenHelper.variablesToFieldIndexes(keysRightBranch, inputSchemas[1]);
         IVariableTypeEnvironment env = context.getTypeEnvironment(op);
-        IBinaryHashFunctionFactory[] hashFunFactories = JobGenHelper
-                .variablesToBinaryHashFunctionFactories(keysLeftBranch, env, context);
-        IBinaryHashFunctionFamily[] hashFunFamilies = JobGenHelper.variablesToBinaryHashFunctionFamilies(keysLeftBranch,
-                env, context);
+        IBinaryHashFunctionFactory[] hashFunFactories =
+                JobGenHelper.variablesToBinaryHashFunctionFactories(keysLeftBranch, env, context);
+        IBinaryHashFunctionFamily[] hashFunFamilies =
+                JobGenHelper.variablesToBinaryHashFunctionFamilies(keysLeftBranch, env, context);
         IBinaryComparatorFactory[] comparatorFactories = new IBinaryComparatorFactory[keysLeft.length];
         int i = 0;
         IBinaryComparatorFactoryProvider bcfp = context.getBinaryComparatorFactoryProvider();
@@ -127,13 +128,13 @@
             comparatorFactories[i++] = bcfp.getBinaryComparatorFactory(t, true);
         }
 
-        IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider = context
-                .getPredicateEvaluatorFactoryProvider();
+        IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider =
+                context.getPredicateEvaluatorFactoryProvider();
         IPredicateEvaluatorFactory predEvaluatorFactory = predEvaluatorFactoryProvider == null ? null
                 : predEvaluatorFactoryProvider.getPredicateEvaluatorFactory(keysLeft, keysRight);
 
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
         IOperatorDescriptor opDesc;
         boolean optimizedHashJoin = true;
@@ -172,8 +173,8 @@
                             comparatorFactories, recDescriptor, predEvaluatorFactory, false, null);
                     break;
                 case LEFT_OUTER:
-                    IMissingWriterFactory[] nonMatchWriterFactories = new IMissingWriterFactory[inputSchemas[1]
-                            .getSize()];
+                    IMissingWriterFactory[] nonMatchWriterFactories =
+                            new IMissingWriterFactory[inputSchemas[1].getSize()];
                     for (int j = 0; j < nonMatchWriterFactories.length; j++) {
                         nonMatchWriterFactories[j] = context.getMissingWriterFactory();
                     }
@@ -206,8 +207,8 @@
                             predEvaluatorFactory);
                     break;
                 case LEFT_OUTER:
-                    IMissingWriterFactory[] nonMatchWriterFactories = new IMissingWriterFactory[inputSchemas[1]
-                            .getSize()];
+                    IMissingWriterFactory[] nonMatchWriterFactories =
+                            new IMissingWriterFactory[inputSchemas[1].getSize()];
                     for (int j = 0; j < nonMatchWriterFactories.length; j++) {
                         nonMatchWriterFactories[j] = context.getMissingWriterFactory();
                     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryHashJoinPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryHashJoinPOperator.java
index a1d496d..9c29c53 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryHashJoinPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryHashJoinPOperator.java
@@ -87,8 +87,8 @@
         int[] keysLeft = JobGenHelper.variablesToFieldIndexes(keysLeftBranch, inputSchemas[0]);
         int[] keysRight = JobGenHelper.variablesToFieldIndexes(keysRightBranch, inputSchemas[1]);
         IVariableTypeEnvironment env = context.getTypeEnvironment(op);
-        IBinaryHashFunctionFactory[] hashFunFactories = JobGenHelper
-                .variablesToBinaryHashFunctionFactories(keysLeftBranch, env, context);
+        IBinaryHashFunctionFactory[] hashFunFactories =
+                JobGenHelper.variablesToBinaryHashFunctionFactories(keysLeftBranch, env, context);
         IBinaryComparatorFactory[] comparatorFactories = new IBinaryComparatorFactory[keysLeft.length];
         int i = 0;
         IBinaryComparatorFactoryProvider bcfp = context.getBinaryComparatorFactoryProvider();
@@ -97,13 +97,13 @@
             comparatorFactories[i++] = bcfp.getBinaryComparatorFactory(t, true);
         }
 
-        IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider = context
-                .getPredicateEvaluatorFactoryProvider();
+        IPredicateEvaluatorFactoryProvider predEvaluatorFactoryProvider =
+                context.getPredicateEvaluatorFactoryProvider();
         IPredicateEvaluatorFactory predEvaluatorFactory = (predEvaluatorFactoryProvider == null ? null
                 : predEvaluatorFactoryProvider.getPredicateEvaluatorFactory(keysLeft, keysRight));
 
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
         IOperatorDescriptor opDesc = null;
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryStableSortPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryStableSortPOperator.java
index 48461b1..d304421 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryStableSortPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/InMemoryStableSortPOperator.java
@@ -56,7 +56,8 @@
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
         int n = sortColumns.length;
         int[] sortFields = new int[n];
         IBinaryComparatorFactory[] comps = new IBinaryComparatorFactory[n];
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexBulkloadPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexBulkloadPOperator.java
index 14032a1..fa0fb1a 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexBulkloadPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexBulkloadPOperator.java
@@ -90,8 +90,8 @@
         List<LogicalVariable> scanVariables = new ArrayList<>();
         scanVariables.addAll(primaryKeys);
         scanVariables.add(new LogicalVariable(-1));
-        IPhysicalPropertiesVector physicalProps = dataSourceIndex.getDataSource().getPropertiesProvider()
-                .computePropertiesVector(scanVariables);
+        IPhysicalPropertiesVector physicalProps =
+                dataSourceIndex.getDataSource().getPropertiesProvider().computePropertiesVector(scanVariables);
         List<ILocalStructuralProperty> localProperties = new ArrayList<>();
         List<OrderColumn> orderColumns = new ArrayList<OrderColumn>();
         // Data needs to be sorted based on the [token, number of token, PK]
@@ -106,8 +106,8 @@
             orderColumns.add(new OrderColumn(pkVar, OrderKind.ASC));
         }
         localProperties.add(new LocalOrderProperty(orderColumns));
-        StructuralPropertiesVector spv = new StructuralPropertiesVector(physicalProps.getPartitioningProperty(),
-                localProperties);
+        StructuralPropertiesVector spv =
+                new StructuralPropertiesVector(physicalProps.getPartitioningProperty(), localProperties);
         return new PhysicalRequirements(new IPhysicalPropertiesVector[] { spv },
                 IPartitioningRequirementsCoordinator.NO_COORDINATION);
     }
@@ -132,9 +132,9 @@
         JobSpecification spec = builder.getJobSpec();
         RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(
                 context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
-        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints = mp.getIndexInsertRuntime(
-                dataSourceIndex, propagatedSchema, inputSchemas, typeEnv, primaryKeys, secondaryKeys,
-                additionalFilteringKeys, filterExpr, inputDesc, context, spec, true);
+        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints =
+                mp.getIndexInsertRuntime(dataSourceIndex, propagatedSchema, inputSchemas, typeEnv, primaryKeys,
+                        secondaryKeys, additionalFilteringKeys, filterExpr, inputDesc, context, spec, true);
         builder.contributeHyracksOperator(indexInsertDeleteOp, runtimeAndConstraints.first);
         builder.contributeAlgebricksPartitionConstraint(runtimeAndConstraints.first, runtimeAndConstraints.second);
         ILogicalOperator src = indexInsertDeleteOp.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexInsertDeleteUpsertPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexInsertDeleteUpsertPOperator.java
index ce86e58..a66db35 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexInsertDeleteUpsertPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IndexInsertDeleteUpsertPOperator.java
@@ -96,8 +96,8 @@
         for (int i = 0; i < numOfAdditionalNonFilteringFields; i++) {
             scanVariables.add(new LogicalVariable(-1));
         }
-        IPhysicalPropertiesVector r = dataSourceIndex.getDataSource().getPropertiesProvider()
-                .computePropertiesVector(scanVariables);
+        IPhysicalPropertiesVector r =
+                dataSourceIndex.getDataSource().getPropertiesProvider().computePropertiesVector(scanVariables);
         r.getLocalProperties().clear();
         IPhysicalPropertiesVector[] requirements = new IPhysicalPropertiesVector[1];
         requirements[0] = r;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
index 0baffc9..1d36cc0 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/IntersectPOperator.java
@@ -87,8 +87,8 @@
     public void computeDeliveredProperties(ILogicalOperator iop, IOptimizationContext context)
             throws AlgebricksException {
         IntersectOperator op = (IntersectOperator) iop;
-        IPartitioningProperty pp = op.getInputs().get(0).getValue().getDeliveredPhysicalProperties()
-                .getPartitioningProperty();
+        IPartitioningProperty pp =
+                op.getInputs().get(0).getValue().getDeliveredPhysicalProperties().getPartitioningProperty();
 
         HashMap<LogicalVariable, LogicalVariable> varMaps = new HashMap<>(op.getOutputVars().size());
         for (int i = 0; i < op.getOutputVars().size(); i++) {
@@ -114,9 +114,8 @@
         int nInput = logicalOp.getNumInput();
         int[][] compareFields = new int[nInput][];
 
-        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper
-                .variablesToAscBinaryComparatorFactories(logicalOp.getCompareVariables(0),
-                        context.getTypeEnvironment(op), context);
+        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper.variablesToAscBinaryComparatorFactories(
+                logicalOp.getCompareVariables(0), context.getTypeEnvironment(op), context);
 
         INormalizedKeyComputerFactoryProvider nkcfProvider = context.getNormalizedKeyComputerFactoryProvider();
         INormalizedKeyComputerFactory nkcf = null;
@@ -147,9 +146,8 @@
 
         IntersectOperatorDescriptor opDescriptor;
         try {
-            opDescriptor =
-                    new IntersectOperatorDescriptor(spec, nInput, compareFields, extraFields, nkcf, comparatorFactories,
-                            recordDescriptor);
+            opDescriptor = new IntersectOperatorDescriptor(spec, nInput, compareFields, extraFields, nkcf,
+                    comparatorFactories, recordDescriptor);
         } catch (HyracksException e) {
             throw new AlgebricksException(e);
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MaterializePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MaterializePOperator.java
index c55a4ae..a48e3c2 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MaterializePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MaterializePOperator.java
@@ -70,10 +70,10 @@
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
-        MaterializingOperatorDescriptor materializationOpDesc = new MaterializingOperatorDescriptor(
-                builder.getJobSpec(), recDescriptor, isSingleActivity);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
+        MaterializingOperatorDescriptor materializationOpDesc =
+                new MaterializingOperatorDescriptor(builder.getJobSpec(), recDescriptor, isSingleActivity);
         contributeOpDesc(builder, (AbstractLogicalOperator) op, materializationOpDesc);
         ILogicalOperator src = op.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreclusteredGroupByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreclusteredGroupByPOperator.java
index 2772ee7..629afa3 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreclusteredGroupByPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroPreclusteredGroupByPOperator.java
@@ -63,14 +63,15 @@
         int fdColumns[] = getFdColumns(gby, inputSchemas[0]);
         // compile subplans and set the gby op. schema accordingly
         AlgebricksPipeline[] subplans = compileSubplans(inputSchemas[0], gby, opSchema, context);
-        IAggregatorDescriptorFactory aggregatorFactory = new NestedPlansAccumulatingAggregatorFactory(subplans, keys,
-                fdColumns);
+        IAggregatorDescriptorFactory aggregatorFactory =
+                new NestedPlansAccumulatingAggregatorFactory(subplans, keys, fdColumns);
 
-        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper.variablesToAscBinaryComparatorFactories(
-                columnList, env, context);
-        RecordDescriptor recordDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
-        RecordDescriptor inputRecordDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op.getInputs().get(0).getValue()),
-                inputSchemas[0], context);
+        IBinaryComparatorFactory[] comparatorFactories =
+                JobGenHelper.variablesToAscBinaryComparatorFactories(columnList, env, context);
+        RecordDescriptor recordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+        RecordDescriptor inputRecordDesc = JobGenHelper.mkRecordDescriptor(
+                context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
         MicroPreClusteredGroupRuntimeFactory runtime = new MicroPreClusteredGroupRuntimeFactory(keys,
                 comparatorFactories, aggregatorFactory, inputRecordDesc, recordDescriptor, null);
         builder.contributeMicroOperator(gby, runtime, recordDescriptor);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroUnionAllPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroUnionAllPOperator.java
new file mode 100644
index 0000000..f5e992e
--- /dev/null
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/MicroUnionAllPOperator.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.algebricks.core.algebra.operators.physical;
+
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.IHyracksJobBuilder;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
+import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
+import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenHelper;
+import org.apache.hyracks.algebricks.runtime.operators.union.MicroUnionAllRuntimeFactory;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+
+public class MicroUnionAllPOperator extends AbstractUnionAllPOperator {
+
+    @Override
+    public PhysicalOperatorTag getOperatorTag() {
+        return PhysicalOperatorTag.MICRO_UNION_ALL;
+    }
+
+    @Override
+    public boolean isMicroOperator() {
+        return true;
+    }
+
+    @Override
+    public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
+            IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
+            throws AlgebricksException {
+        RecordDescriptor recordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+
+        MicroUnionAllRuntimeFactory runtime = new MicroUnionAllRuntimeFactory(op.getInputs().size());
+        builder.contributeMicroOperator(op, runtime, recordDescriptor);
+
+        super.contributeRuntimeOperator(builder, context, op, opSchema, inputSchemas, outerPlanSchema);
+    }
+}
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/NestedLoopJoinPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/NestedLoopJoinPOperator.java
index 80ed8fd..4d7bd7e1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/NestedLoopJoinPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/NestedLoopJoinPOperator.java
@@ -129,15 +129,15 @@
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
         AbstractBinaryJoinOperator join = (AbstractBinaryJoinOperator) op;
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         IOperatorSchema[] conditionInputSchemas = new IOperatorSchema[1];
         conditionInputSchemas[0] = propagatedSchema;
         IExpressionRuntimeProvider expressionRuntimeProvider = context.getExpressionRuntimeProvider();
         IScalarEvaluatorFactory cond = expressionRuntimeProvider.createEvaluatorFactory(join.getCondition().getValue(),
                 context.getTypeEnvironment(op), conditionInputSchemas, context);
-        ITuplePairComparatorFactory comparatorFactory = new TuplePairEvaluatorFactory(cond,
-                context.getBinaryBooleanInspectorFactory());
+        ITuplePairComparatorFactory comparatorFactory =
+                new TuplePairEvaluatorFactory(cond, context.getBinaryBooleanInspectorFactory());
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
         IOperatorDescriptor opDesc = null;
 
@@ -212,8 +212,8 @@
                 int innerIndex) throws HyracksDataException {
             compositeTupleRef.reset(outerAccessor, outerIndex, innerAccessor, innerIndex);
             condEvaluator.evaluate(compositeTupleRef, p);
-            boolean result = binaryBooleanInspector.getBooleanValue(p.getByteArray(), p.getStartOffset(),
-                    p.getLength());
+            boolean result =
+                    binaryBooleanInspector.getBooleanValue(p.getByteArray(), p.getStartOffset(), p.getLength());
             if (result) {
                 return 0;
             } else {
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/PreclusteredGroupByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/PreclusteredGroupByPOperator.java
index 78e4795..0e0953c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/PreclusteredGroupByPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/PreclusteredGroupByPOperator.java
@@ -82,10 +82,10 @@
         }
 
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
-        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper.variablesToAscBinaryComparatorFactories(
-                columnList, context.getTypeEnvironment(op), context);
-        RecordDescriptor recordDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema,
-                context);
+        IBinaryComparatorFactory[] comparatorFactories = JobGenHelper
+                .variablesToAscBinaryComparatorFactories(columnList, context.getTypeEnvironment(op), context);
+        RecordDescriptor recordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
 
         PreclusteredGroupOperatorDescriptor opDesc = new PreclusteredGroupOperatorDescriptor(spec, keys,
                 comparatorFactories, aggregatorFactory, recordDescriptor, groupAll, framesLimit);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RandomPartitionExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RandomPartitionExchangePOperator.java
index cba8f97..d17c0d9 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RandomPartitionExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RandomPartitionExchangePOperator.java
@@ -50,9 +50,9 @@
     @Override
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException {
-        Pair<IConnectorDescriptor, TargetConstraint> connPair = createConnectorDescriptor(builder.getJobSpec(), op,
-                opSchema, context);
+            throws AlgebricksException {
+        Pair<IConnectorDescriptor, TargetConstraint> connPair =
+                createConnectorDescriptor(builder.getJobSpec(), op, opSchema, context);
         builder.contributeConnectorWithTargetConstraint(op, connPair.first, connPair.second);
         ILogicalOperator src = op.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionExchangePOperator.java
index 225ffa0..6630d32 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionExchangePOperator.java
@@ -58,7 +58,8 @@
     private INodeDomain domain;
     private IRangeMap rangeMap;
 
-    public RangePartitionExchangePOperator(List<OrderColumn> partitioningFields, INodeDomain domain, IRangeMap rangeMap) {
+    public RangePartitionExchangePOperator(List<OrderColumn> partitioningFields, INodeDomain domain,
+            IRangeMap rangeMap) {
         this.partitioningFields = partitioningFields;
         this.domain = domain;
         this.rangeMap = rangeMap;
@@ -79,7 +80,8 @@
 
     @Override
     public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
-        IPartitioningProperty p = new OrderedPartitionedProperty(new ArrayList<OrderColumn>(partitioningFields), domain);
+        IPartitioningProperty p =
+                new OrderedPartitionedProperty(new ArrayList<OrderColumn>(partitioningFields), domain);
         this.deliveredProperties = new StructuralPropertiesVector(p, new LinkedList<ILocalStructuralProperty>());
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionMergeExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionMergeExchangePOperator.java
index f56a5dc..ec32a53 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionMergeExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RangePartitionMergeExchangePOperator.java
@@ -63,7 +63,8 @@
     private INodeDomain domain;
     private IRangeMap rangeMap;
 
-    public RangePartitionMergeExchangePOperator(List<OrderColumn> partitioningFields, INodeDomain domain, IRangeMap rangeMap) {
+    public RangePartitionMergeExchangePOperator(List<OrderColumn> partitioningFields, INodeDomain domain,
+            IRangeMap rangeMap) {
         this.partitioningFields = partitioningFields;
         this.domain = domain;
         this.rangeMap = rangeMap;
@@ -113,8 +114,8 @@
             columns.add(new OrderColumn(var, oc.getOrder()));
         }
         orderProps.add(new LocalOrderProperty(columns));
-        StructuralPropertiesVector[] r = new StructuralPropertiesVector[] { new StructuralPropertiesVector(null,
-                orderProps) };
+        StructuralPropertiesVector[] r =
+                new StructuralPropertiesVector[] { new StructuralPropertiesVector(null, orderProps) };
         return new PhysicalRequirements(r, IPartitioningRequirementsCoordinator.NO_COORDINATION);
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ReplicatePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ReplicatePOperator.java
index 74739da..25d31d2 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ReplicatePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/ReplicatePOperator.java
@@ -43,15 +43,15 @@
             IOperatorSchema propagatedSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
 
         ReplicateOperator rop = (ReplicateOperator) op;
         int outputArity = rop.getOutputArity();
         boolean[] outputMaterializationFlags = rop.getOutputMaterializationFlags();
 
-        ReplicateOperatorDescriptor splitOpDesc = new ReplicateOperatorDescriptor(spec, recDescriptor, outputArity,
-                outputMaterializationFlags);
+        ReplicateOperatorDescriptor splitOpDesc =
+                new ReplicateOperatorDescriptor(spec, recDescriptor, outputArity, outputMaterializationFlags);
         contributeOpDesc(builder, (AbstractLogicalOperator) op, splitOpDesc);
         ILogicalOperator src = op.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
index 8e4ca18..3a6ba74 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/RunningAggregatePOperator.java
@@ -89,8 +89,8 @@
         // TODO push projections into the operator
         int[] projectionList = JobGenHelper.projectAllVariables(opSchema);
 
-        RunningAggregateRuntimeFactory runtime = new RunningAggregateRuntimeFactory(outColumns, runningAggFuns,
-                projectionList);
+        RunningAggregateRuntimeFactory runtime =
+                new RunningAggregateRuntimeFactory(outColumns, runningAggFuns, projectionList);
 
         // contribute one Asterix framewriter
         RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkPOperator.java
index d0b7b47..5084c18 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkPOperator.java
@@ -68,7 +68,7 @@
     @Override
     public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op,
             IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
-      return emptyUnaryRequirements(op.getInputs().size());
+        return emptyUnaryRequirements(op.getInputs().size());
     }
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkWritePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkWritePOperator.java
index 35f9444..f76b69b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkWritePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SinkWritePOperator.java
@@ -91,17 +91,18 @@
             LogicalVariable v = varRef.getVariableReference();
             columns[i++] = inputSchemas[0].findVariable(v);
         }
-        RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
-        RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0],
-                context);
+        RecordDescriptor recDesc =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
+        RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(
+                context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
 
-        IPrinterFactory[] pf = JobGenHelper.mkPrinterFactories(inputSchemas[0], context.getTypeEnvironment(op),
-                context, columns);
+        IPrinterFactory[] pf =
+                JobGenHelper.mkPrinterFactories(inputSchemas[0], context.getTypeEnvironment(op), context, columns);
 
         IMetadataProvider<?, ?> mp = context.getMetadataProvider();
 
-        Pair<IPushRuntimeFactory, AlgebricksPartitionConstraint> runtime = mp.getWriteFileRuntime(write.getDataSink(),
-                columns, pf, inputDesc);
+        Pair<IPushRuntimeFactory, AlgebricksPartitionConstraint> runtime =
+                mp.getWriteFileRuntime(write.getDataSink(), columns, pf, inputDesc);
 
         builder.contributeMicroOperator(write, runtime.first, recDesc, runtime.second);
         ILogicalOperator src = write.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortGroupByPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortGroupByPOperator.java
index c08ff85..1aeeca9 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortGroupByPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortGroupByPOperator.java
@@ -188,8 +188,8 @@
             AggregateFunctionCallExpression aggFun = (AggregateFunctionCallExpression) exprRef.getValue();
             aff[i++] = expressionRuntimeProvider.createAggregateFunctionFactory(aggFun, aggOpInputEnv, inputSchemas,
                     context);
-            intermediateTypes.add(partialAggregationTypeComputer.getType(aggFun, aggOpInputEnv,
-                    context.getMetadataProvider()));
+            intermediateTypes
+                    .add(partialAggregationTypeComputer.getType(aggFun, aggOpInputEnv, context.getMetadataProvider()));
         }
 
         int[] keyAndDecFields = new int[keys.length + fdColumns.length];
@@ -227,16 +227,16 @@
             }
             i++;
         }
-        RecordDescriptor recordDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema,
-                context);
+        RecordDescriptor recordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
 
         IAggregateEvaluatorFactory[] merges = new IAggregateEvaluatorFactory[n];
         List<LogicalVariable> usedVars = new ArrayList<LogicalVariable>();
         IOperatorSchema[] localInputSchemas = new IOperatorSchema[1];
         localInputSchemas[0] = new OperatorSchemaImpl();
         for (i = 0; i < n; i++) {
-            AggregateFunctionCallExpression aggFun = (AggregateFunctionCallExpression) aggOp.getMergeExpressions()
-                    .get(i).getValue();
+            AggregateFunctionCallExpression aggFun =
+                    (AggregateFunctionCallExpression) aggOp.getMergeExpressions().get(i).getValue();
             aggFun.getUsedVariables(usedVars);
         }
         i = 0;
@@ -250,18 +250,18 @@
             localInputSchemas[0].addVariable(usedVar);
         }
         for (i = 0; i < n; i++) {
-            AggregateFunctionCallExpression mergeFun = (AggregateFunctionCallExpression) aggOp.getMergeExpressions()
-                    .get(i).getValue();
+            AggregateFunctionCallExpression mergeFun =
+                    (AggregateFunctionCallExpression) aggOp.getMergeExpressions().get(i).getValue();
             merges[i] = expressionRuntimeProvider.createAggregateFunctionFactory(mergeFun, aggOpInputEnv,
                     localInputSchemas, context);
         }
-        RecordDescriptor partialAggRecordDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                localInputSchemas[0], context);
+        RecordDescriptor partialAggRecordDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), localInputSchemas[0], context);
 
-        IAggregatorDescriptorFactory aggregatorFactory = new SimpleAlgebricksAccumulatingAggregatorFactory(aff,
-                keyAndDecFields);
-        IAggregatorDescriptorFactory mergeFactory = new SimpleAlgebricksAccumulatingAggregatorFactory(merges,
-                keyAndDecFields);
+        IAggregatorDescriptorFactory aggregatorFactory =
+                new SimpleAlgebricksAccumulatingAggregatorFactory(aff, keyAndDecFields);
+        IAggregatorDescriptorFactory mergeFactory =
+                new SimpleAlgebricksAccumulatingAggregatorFactory(merges, keyAndDecFields);
 
         INormalizedKeyComputerFactory normalizedKeyFactory = null;
         INormalizedKeyComputerFactoryProvider nkcfProvider = context.getNormalizedKeyComputerFactoryProvider();
@@ -269,9 +269,9 @@
             normalizedKeyFactory = null;
         }
         Object type = aggOpInputEnv.getVarType(gbyCols.get(0));
-        normalizedKeyFactory = orderColumns[0].getOrder() == OrderKind.ASC ? nkcfProvider
-                .getNormalizedKeyComputerFactory(type, true) : nkcfProvider
-                .getNormalizedKeyComputerFactory(type, false);
+        normalizedKeyFactory =
+                orderColumns[0].getOrder() == OrderKind.ASC ? nkcfProvider.getNormalizedKeyComputerFactory(type, true)
+                        : nkcfProvider.getNormalizedKeyComputerFactory(type, false);
         SortGroupByOperatorDescriptor gbyOpDesc = new SortGroupByOperatorDescriptor(spec, frameLimit, keys,
                 keyAndDecFields, normalizedKeyFactory, compFactories, aggregatorFactory, mergeFactory,
                 partialAggRecordDescriptor, recordDescriptor, false);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortMergeExchangePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortMergeExchangePOperator.java
index 81f6e6b..6c02dca 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortMergeExchangePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SortMergeExchangePOperator.java
@@ -124,8 +124,8 @@
             IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
         List<ILocalStructuralProperty> localProps = new ArrayList<ILocalStructuralProperty>(sortColumns.length);
         localProps.add(new LocalOrderProperty(Arrays.asList(sortColumns)));
-        StructuralPropertiesVector[] r = new StructuralPropertiesVector[] { new StructuralPropertiesVector(null,
-                localProps) };
+        StructuralPropertiesVector[] r =
+                new StructuralPropertiesVector[] { new StructuralPropertiesVector(null, localProps) };
         return new PhysicalRequirements(r, IPartitioningRequirementsCoordinator.NO_COORDINATION);
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SplitPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SplitPOperator.java
index 923e56a..c9fde4b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SplitPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SplitPOperator.java
@@ -51,8 +51,8 @@
         boolean propageToAllBranchAsDefault = sop.getPropageToAllBranchAsDefault();
 
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op),
-                propagatedSchema, context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
 
         IExpressionRuntimeProvider expressionRuntimeProvider = context.getExpressionRuntimeProvider();
         IScalarEvaluatorFactory brachingExprEvalFactory = expressionRuntimeProvider.createEvaluatorFactory(
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StableSortPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StableSortPOperator.java
index 120c1c4..3a4249b 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StableSortPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StableSortPOperator.java
@@ -72,10 +72,10 @@
     @Override
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         IOperatorDescriptorRegistry spec = builder.getJobSpec();
-        RecordDescriptor recDescriptor = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema,
-                context);
+        RecordDescriptor recDescriptor =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
         int n = sortColumns.length;
         int[] sortFields = new int[n];
         IBinaryComparatorFactory[] comps = new IBinaryComparatorFactory[n];
@@ -100,8 +100,8 @@
 
         // topK == -1 means that a topK value is not provided.
         if (topK == -1) {
-            ExternalSortOperatorDescriptor sortOpDesc = new ExternalSortOperatorDescriptor(spec, maxNumberOfFrames,
-                    sortFields, nkcf, comps, recDescriptor);
+            ExternalSortOperatorDescriptor sortOpDesc =
+                    new ExternalSortOperatorDescriptor(spec, maxNumberOfFrames, sortFields, nkcf, comps, recDescriptor);
             contributeOpDesc(builder, (AbstractLogicalOperator) op, sortOpDesc);
             ILogicalOperator src = op.getInputs().get(0).getValue();
             builder.contributeGraphEdge(src, 0, op, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamLimitPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamLimitPOperator.java
index 99be356..da75da8 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamLimitPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamLimitPOperator.java
@@ -62,8 +62,8 @@
         ILogicalOperator op2 = op.getInputs().get(0).getValue();
         if (limitOp.getExecutionMode() == AbstractLogicalOperator.ExecutionMode.UNPARTITIONED) {
             //partitioning property: unpartitioned;  local property: whatever from the child
-            deliveredProperties = new StructuralPropertiesVector(IPartitioningProperty.UNPARTITIONED, op2
-                    .getDeliveredPhysicalProperties().getLocalProperties());
+            deliveredProperties = new StructuralPropertiesVector(IPartitioningProperty.UNPARTITIONED,
+                    op2.getDeliveredPhysicalProperties().getLocalProperties());
         } else {
             deliveredProperties = op2.getDeliveredPhysicalProperties().clone();
         }
@@ -89,13 +89,13 @@
         LimitOperator limit = (LimitOperator) op;
         IExpressionRuntimeProvider expressionRuntimeProvider = context.getExpressionRuntimeProvider();
         IVariableTypeEnvironment env = context.getTypeEnvironment(op);
-        IScalarEvaluatorFactory maxObjectsFact = expressionRuntimeProvider.createEvaluatorFactory(limit.getMaxObjects()
-                .getValue(), env, inputSchemas, context);
+        IScalarEvaluatorFactory maxObjectsFact = expressionRuntimeProvider
+                .createEvaluatorFactory(limit.getMaxObjects().getValue(), env, inputSchemas, context);
         ILogicalExpression offsetExpr = limit.getOffset().getValue();
-        IScalarEvaluatorFactory offsetFact = (offsetExpr == null) ? null : expressionRuntimeProvider
-                .createEvaluatorFactory(offsetExpr, env, inputSchemas, context);
-        RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema,
-                context);
+        IScalarEvaluatorFactory offsetFact = (offsetExpr == null) ? null
+                : expressionRuntimeProvider.createEvaluatorFactory(offsetExpr, env, inputSchemas, context);
+        RecordDescriptor recDesc =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         StreamLimitRuntimeFactory runtime = new StreamLimitRuntimeFactory(maxObjectsFact, offsetFact, null,
                 context.getBinaryIntegerInspectorFactory());
         builder.contributeMicroOperator(limit, runtime, recDesc);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamProjectPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamProjectPOperator.java
index 184cbbc..3ff7dc1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamProjectPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamProjectPOperator.java
@@ -68,8 +68,8 @@
             projectionList[i++] = pos;
         }
         StreamProjectRuntimeFactory runtime = new StreamProjectRuntimeFactory(projectionList, flushFramesRapidly);
-        RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema,
-                context);
+        RecordDescriptor recDesc =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         builder.contributeMicroOperator(project, runtime, recDesc);
         ILogicalOperator src = project.getInputs().get(0).getValue();
         builder.contributeGraphEdge(src, 0, project, 0);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamSelectPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamSelectPOperator.java
index e87f3f6..ddde5f3 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamSelectPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StreamSelectPOperator.java
@@ -66,10 +66,10 @@
         IExpressionRuntimeProvider expressionRuntimeProvider = context.getExpressionRuntimeProvider();
         IScalarEvaluatorFactory cond = expressionRuntimeProvider.createEvaluatorFactory(
                 select.getCondition().getValue(), context.getTypeEnvironment(op), inputSchemas, context);
-        StreamSelectRuntimeFactory runtime = new StreamSelectRuntimeFactory(cond, null,
-                context.getBinaryBooleanInspectorFactory(), select.getRetainMissing(),
-                inputSchemas[0].findVariable(select.getMissingPlaceholderVariable()),
-                context.getMissingWriterFactory());
+        StreamSelectRuntimeFactory runtime =
+                new StreamSelectRuntimeFactory(cond, null, context.getBinaryBooleanInspectorFactory(),
+                        select.getRetainMissing(), inputSchemas[0].findVariable(select.getMissingPlaceholderVariable()),
+                        context.getMissingWriterFactory());
         // contribute one Asterix framewriter
         RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
         builder.contributeMicroOperator(select, runtime, recDesc);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StringStreamingScriptPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StringStreamingScriptPOperator.java
index 1f5159d..01e9a0c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StringStreamingScriptPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/StringStreamingScriptPOperator.java
@@ -65,8 +65,8 @@
         StringStreamingScriptDescription sssd = (StringStreamingScriptDescription) scriptDesc;
         StringStreamingRuntimeFactory runtime = new StringStreamingRuntimeFactory(sssd.getCommand(),
                 sssd.getPrinterFactories(), sssd.getFieldDelimiter(), sssd.getParserFactory());
-        RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema,
-                context);
+        RecordDescriptor recDesc =
+                JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), propagatedSchema, context);
         builder.contributeMicroOperator(scriptOp, runtime, recDesc);
         // and contribute one edge from its child
         ILogicalOperator src = scriptOp.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SubplanPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SubplanPOperator.java
index d43ddab..95efbac 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SubplanPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/SubplanPOperator.java
@@ -89,18 +89,18 @@
         if (subplan.getNestedPlans().size() != 1) {
             throw new NotImplementedException("Subplan currently works only for one nested plan with one root.");
         }
-        AlgebricksPipeline[] subplans = compileSubplans(inputSchemas[0], subplan, opSchema, context);
-        assert subplans.length == 1;
-        AlgebricksPipeline np = subplans[0];
+        List<List<AlgebricksPipeline>> subplans = compileSubplansImpl(inputSchemas[0], subplan, opSchema, context);
+        assert subplans.size() == 1;
+        List<AlgebricksPipeline> np = subplans.get(0);
         RecordDescriptor inputRecordDesc = JobGenHelper.mkRecordDescriptor(
                 context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
-        IMissingWriterFactory[] missingWriterFactories = new IMissingWriterFactory[np.getOutputWidth()];
+        IMissingWriterFactory[] missingWriterFactories = new IMissingWriterFactory[np.get(0).getOutputWidth()];
         for (int i = 0; i < missingWriterFactories.length; i++) {
             missingWriterFactories[i] = context.getMissingWriterFactory();
         }
-        SubplanRuntimeFactory runtime = new SubplanRuntimeFactory(np, missingWriterFactories, inputRecordDesc, null);
-
         RecordDescriptor recDesc = JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
+        SubplanRuntimeFactory runtime =
+                new SubplanRuntimeFactory(np, missingWriterFactories, inputRecordDesc, recDesc, null);
         builder.contributeMicroOperator(subplan, runtime, recDesc);
 
         ILogicalOperator src = op.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/TokenizePOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/TokenizePOperator.java
index 557a657..cd696bc 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/TokenizePOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/TokenizePOperator.java
@@ -91,9 +91,9 @@
         JobSpecification spec = builder.getJobSpec();
         RecordDescriptor inputDesc = JobGenHelper.mkRecordDescriptor(
                 context.getTypeEnvironment(op.getInputs().get(0).getValue()), inputSchemas[0], context);
-        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints = mp.getTokenizerRuntime(
-                dataSourceIndex, propagatedSchema, inputSchemas, typeEnv, primaryKeys, secondaryKeys, null, inputDesc,
-                context, spec, true);
+        Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> runtimeAndConstraints =
+                mp.getTokenizerRuntime(dataSourceIndex, propagatedSchema, inputSchemas, typeEnv, primaryKeys,
+                        secondaryKeys, null, inputDesc, context, spec, true);
         builder.contributeHyracksOperator(tokenizeOp, runtimeAndConstraints.first);
         builder.contributeAlgebricksPartitionConstraint(runtimeAndConstraints.first, runtimeAndConstraints.second);
         ILogicalOperator src = tokenizeOp.getInputs().get(0).getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/UnionAllPOperator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/UnionAllPOperator.java
index d184161..4ccce92 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/UnionAllPOperator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/operators/physical/UnionAllPOperator.java
@@ -18,29 +18,18 @@
  */
 package org.apache.hyracks.algebricks.core.algebra.operators.physical;
 
-import java.util.ArrayList;
-
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.IHyracksJobBuilder;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
-import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext;
 import org.apache.hyracks.algebricks.core.algebra.base.PhysicalOperatorTag;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningRequirementsCoordinator;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector;
-import org.apache.hyracks.algebricks.core.algebra.properties.PhysicalRequirements;
-import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty;
-import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector;
-import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil;
 import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
 import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenHelper;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
-import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
 import org.apache.hyracks.dataflow.std.union.UnionAllOperatorDescriptor;
 
-public class UnionAllPOperator extends AbstractPhysicalOperator {
+public class UnionAllPOperator extends AbstractUnionAllPOperator {
 
     @Override
     public PhysicalOperatorTag getOperatorTag() {
@@ -53,48 +42,16 @@
     }
 
     @Override
-    public void computeDeliveredProperties(ILogicalOperator op, IOptimizationContext context) {
-        AbstractLogicalOperator op2 = (AbstractLogicalOperator) op.getInputs().get(0).getValue();
-        IPartitioningProperty pp = op2.getDeliveredPhysicalProperties().getPartitioningProperty();
-        this.deliveredProperties = new StructuralPropertiesVector(pp, new ArrayList<>(0));
-    }
-
-    @Override
-    public PhysicalRequirements getRequiredPropertiesForChildren(ILogicalOperator op,
-            IPhysicalPropertiesVector reqdByParent, IOptimizationContext context) {
-        StructuralPropertiesVector pv0 = OperatorPropertiesUtil.checkUnpartitionedAndGetPropertiesVector(op,
-                new StructuralPropertiesVector(new RandomPartitioningProperty(context.getComputationNodeDomain()),
-                        null));
-        StructuralPropertiesVector pv1 = OperatorPropertiesUtil.checkUnpartitionedAndGetPropertiesVector(op,
-                new StructuralPropertiesVector(new RandomPartitioningProperty(context.getComputationNodeDomain()),
-                        null));
-        return new PhysicalRequirements(new StructuralPropertiesVector[] { pv0, pv1 },
-                IPartitioningRequirementsCoordinator.NO_COORDINATION);
-    }
-
-    @Override
     public void contributeRuntimeOperator(IHyracksJobBuilder builder, JobGenContext context, ILogicalOperator op,
             IOperatorSchema opSchema, IOperatorSchema[] inputSchemas, IOperatorSchema outerPlanSchema)
             throws AlgebricksException {
-
-        IOperatorDescriptorRegistry spec = builder.getJobSpec();
         RecordDescriptor recordDescriptor =
                 JobGenHelper.mkRecordDescriptor(context.getTypeEnvironment(op), opSchema, context);
 
-        // at algebricks level, union all only accepts two inputs, although at
-        // hyracks
-        // level, there is no restrictions
-        UnionAllOperatorDescriptor opDesc = new UnionAllOperatorDescriptor(spec, 2, recordDescriptor);
+        UnionAllOperatorDescriptor opDesc =
+                new UnionAllOperatorDescriptor(builder.getJobSpec(), op.getInputs().size(), recordDescriptor);
         contributeOpDesc(builder, (AbstractLogicalOperator) op, opDesc);
-        ILogicalOperator src1 = op.getInputs().get(0).getValue();
-        builder.contributeGraphEdge(src1, 0, op, 0);
-        ILogicalOperator src2 = op.getInputs().get(1).getValue();
-        builder.contributeGraphEdge(src2, 0, op, 1);
-    }
 
-    @Override
-    public boolean expensiveThanMaterialization() {
-        return false;
+        super.contributeRuntimeOperator(builder, context, op, opSchema, inputSchemas, outerPlanSchema);
     }
-
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
index 140ba80..460f4d0 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AbstractLogicalOperatorPrettyPrintVisitor.java
@@ -84,6 +84,21 @@
         }
     }
 
+    protected AlgebricksAppendable addIndent(int level) throws AlgebricksException {
+        for (int i = 0; i < level; ++i) {
+            buffer.append(' ');
+        }
+        return buffer;
+    }
+
+    public void printPlan(ILogicalPlan plan, int indent) throws AlgebricksException {
+        for (Mutable<ILogicalOperator> root : plan.getRoots()) {
+            printOperator((AbstractLogicalOperator) root.getValue(), indent);
+        }
+    }
+
+    public abstract void printOperator(AbstractLogicalOperator op, int indent) throws AlgebricksException;
+
     public static void printPhysicalOperator(AbstractLogicalOperator op, int indent, AlgebricksAppendable out)
             throws AlgebricksException {
         IPhysicalOperator pOp = op.getPhysicalOperator();
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AlgebricksAppendable.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AlgebricksAppendable.java
index 7002493..f8929e0 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AlgebricksAppendable.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/AlgebricksAppendable.java
@@ -37,7 +37,8 @@
         return app;
     }
 
-    @Override public String toString() {
+    @Override
+    public String toString() {
         return app.toString();
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalExpressionPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalExpressionPrettyPrintVisitor.java
index 8318176..72f891a 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalExpressionPrettyPrintVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalExpressionPrettyPrintVisitor.java
@@ -27,48 +27,40 @@
 import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
 import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor;
 
-
 public class LogicalExpressionPrettyPrintVisitor implements ILogicalExpressionVisitor<String, Integer> {
 
     @Override
-    public String visitConstantExpression(ConstantExpression expr, Integer indent)
+    public String visitConstantExpression(ConstantExpression expr, Integer indent) throws AlgebricksException {
+        return expr.toString();
+    }
+
+    @Override
+    public String visitVariableReferenceExpression(VariableReferenceExpression expr, Integer indent)
             throws AlgebricksException {
         return expr.toString();
     }
 
     @Override
-    public String visitVariableReferenceExpression(
-            VariableReferenceExpression expr, Integer indent)
+    public String visitAggregateFunctionCallExpression(AggregateFunctionCallExpression expr, Integer indent)
             throws AlgebricksException {
         return expr.toString();
     }
 
     @Override
-    public String visitAggregateFunctionCallExpression(
-            AggregateFunctionCallExpression expr, Integer indent)
+    public String visitScalarFunctionCallExpression(ScalarFunctionCallExpression expr, Integer indent)
             throws AlgebricksException {
         return expr.toString();
     }
 
     @Override
-    public String visitScalarFunctionCallExpression(
-            ScalarFunctionCallExpression expr, Integer indent)
+    public String visitStatefulFunctionCallExpression(StatefulFunctionCallExpression expr, Integer indent)
             throws AlgebricksException {
         return expr.toString();
     }
 
     @Override
-    public String visitStatefulFunctionCallExpression(
-            StatefulFunctionCallExpression expr, Integer indent)
-            throws AlgebricksException {
-        return expr.toString();
-    }
-
-    @Override
-    public String visitUnnestingFunctionCallExpression(
-            UnnestingFunctionCallExpression expr, Integer indent)
+    public String visitUnnestingFunctionCallExpression(UnnestingFunctionCallExpression expr, Integer indent)
             throws AlgebricksException {
         return expr.toString();
     }
 }
-
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
index fe63b89..0ad3fea 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitor.java
@@ -88,17 +88,10 @@
         super(app);
     }
 
-    public static void printPlan(ILogicalPlan plan, LogicalOperatorPrettyPrintVisitor pvisitor, int indent)
-            throws AlgebricksException {
-        for (Mutable<ILogicalOperator> root : plan.getRoots()) {
-            printOperator((AbstractLogicalOperator) root.getValue(), pvisitor, indent);
-        }
-    }
-
-    public static void printOperator(AbstractLogicalOperator op, LogicalOperatorPrettyPrintVisitor pvisitor, int indent)
-            throws AlgebricksException {
-        final AlgebricksAppendable out = pvisitor.get();
-        op.accept(pvisitor, indent);
+    @Override
+    public void printOperator(AbstractLogicalOperator op, int indent) throws AlgebricksException {
+        final AlgebricksAppendable out = this.get();
+        op.accept(this, indent);
         IPhysicalOperator pOp = op.getPhysicalOperator();
 
         if (pOp != null) {
@@ -110,7 +103,7 @@
         }
 
         for (Mutable<ILogicalOperator> i : op.getInputs()) {
-            printOperator((AbstractLogicalOperator) i.getValue(), pvisitor, indent + 2);
+            printOperator((AbstractLogicalOperator) i.getValue(), indent + 2);
         }
     }
 
@@ -155,8 +148,7 @@
 
     @Override
     public Void visitInnerJoinOperator(InnerJoinOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("join (").append(op.getCondition().getValue().accept(exprVisitor, indent)).
-        append(")");
+        addIndent(indent).append("join (").append(op.getCondition().getValue().accept(exprVisitor, indent)).append(")");
         return null;
     }
 
@@ -400,12 +392,10 @@
         buffer.append(" partitioned by ");
         pprintExprList(op.getPrimaryKeyExpressions(), indent);
         if (op.getOperation() == Kind.UPSERT) {
-            buffer.append(
-                    " out: ([record-before-upsert:" + op.getBeforeOpRecordVar()
-                            + ((op.getBeforeOpAdditionalNonFilteringVars() != null)
-                                    ? (", additional-before-upsert: " + op.getBeforeOpAdditionalNonFilteringVars())
-                                    : "")
-                            + "]) ");
+            buffer.append(" out: ([record-before-upsert:" + op.getBeforeOpRecordVar()
+                    + ((op.getBeforeOpAdditionalNonFilteringVars() != null)
+                            ? (", additional-before-upsert: " + op.getBeforeOpAdditionalNonFilteringVars()) : "")
+                    + "]) ");
         }
         if (op.isBulkload()) {
             buffer.append(" [bulkload]");
@@ -464,13 +454,6 @@
         return null;
     }
 
-    protected AlgebricksAppendable addIndent(int level) throws AlgebricksException {
-        for (int i = 0; i < level; ++i) {
-            buffer.append(' ');
-        }
-        return buffer;
-    }
-
     protected void printNestedPlans(AbstractOperatorWithNestedPlans op, Integer indent) throws AlgebricksException {
         boolean first = true;
         if (op.getNestedPlans().isEmpty()) {
@@ -485,7 +468,7 @@
                 } else {
                     addIndent(indent).append("       {\n");
                 }
-                printPlan(p, this, indent + 10);
+                printPlan(p, indent + 10);
                 addIndent(indent).append("       }");
             }
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
index fefb1e9..4283198 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/LogicalOperatorPrettyPrintVisitorJson.java
@@ -71,7 +71,6 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteResultOperator;
-import org.apache.hyracks.algebricks.core.algebra.visitors.ILogicalExpressionVisitor;
 
 public class LogicalOperatorPrettyPrintVisitorJson extends AbstractLogicalOperatorPrettyPrintVisitor {
     Map<AbstractLogicalOperator, String> operatorIdentity = new HashMap<>();
@@ -116,50 +115,44 @@
         }
     }
 
-    public static void printPlanJson(ILogicalPlan plan, LogicalOperatorPrettyPrintVisitorJson pvisitor, int indent)
-            throws AlgebricksException {
-        for (Mutable<ILogicalOperator> root : plan.getRoots()) {
-            printOperatorJson((AbstractLogicalOperator) root.getValue(), pvisitor, indent);
-        }
-    }
-
-    public static void printOperatorJson(AbstractLogicalOperator op, LogicalOperatorPrettyPrintVisitorJson pvisitor,
-            int indent) throws AlgebricksException {
+    @Override
+    public void printOperator(AbstractLogicalOperator op, int indent) throws AlgebricksException {
         int currentIndent = indent;
-        final AlgebricksAppendable out = pvisitor.get();
+        final AlgebricksAppendable out = get();
         pad(out, currentIndent);
         appendln(out, "{");
         currentIndent++;
-        op.accept(pvisitor, currentIndent);
+        op.accept(this, currentIndent);
         appendln(out, ",");
         pad(out, currentIndent);
-        append(out, "\"operatorId\" : \"" + pvisitor.idCounter.printOperatorId(op) + "\"");
+        append(out, "\"operatorId\": \"" + idCounter.printOperatorId(op) + "\"");
         IPhysicalOperator pOp = op.getPhysicalOperator();
         if (pOp != null) {
             appendln(out, ",");
             pad(out, currentIndent);
-            String pOperator = "\"physical-operator\":\"" + pOp.toString() + "\"";
+            String pOperator = "\"physical-operator\": \"" + pOp.toString() + "\"";
             append(out, pOperator);
         }
         appendln(out, ",");
         pad(out, currentIndent);
-        append(out, "\"execution-mode\":\"" + op.getExecutionMode() + '"');
+        append(out, "\"execution-mode\": \"" + op.getExecutionMode() + '"');
         if (!op.getInputs().isEmpty()) {
             appendln(out, ",");
             pad(out, currentIndent);
-            appendln(out, "\"inputs\":[");
+            appendln(out, "\"inputs\": [");
             boolean moreInputes = false;
             for (Mutable<ILogicalOperator> k : op.getInputs()) {
                 if (moreInputes) {
                     append(out, ",");
                 }
-                printOperatorJson((AbstractLogicalOperator) k.getValue(), pvisitor, currentIndent + 4);
+                printOperator((AbstractLogicalOperator) k.getValue(), currentIndent + 4);
                 moreInputes = true;
             }
             pad(out, currentIndent + 2);
             appendln(out, "]");
+        } else {
+            out.append("\n");
         }
-        out.append("\n");
         pad(out, currentIndent - 1);
         appendln(out, "}");
     }
@@ -167,30 +160,22 @@
     public void variablePrintHelper(List<LogicalVariable> variables, Integer indent) throws AlgebricksException {
         if (!variables.isEmpty()) {
             addIndent(0).append(",\n");
-            addIndent(indent).append("\"variables\" :[");
-            boolean first = true;
-            for (LogicalVariable v : variables) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"variables\": [");
+            appendVars(variables);
             buffer.append("]");
         }
     }
 
     @Override
     public Void visitAggregateOperator(AggregateOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"aggregate\"");
+        addIndent(indent).append("\"operator\": \"aggregate\"");
         variablePrintHelper(op.getVariables(), indent);
-
         return null;
     }
 
     @Override
     public Void visitRunningAggregateOperator(RunningAggregateOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"running-aggregate\"");
+        addIndent(indent).append("\"operator\": \"running-aggregate\"");
         variablePrintHelper(op.getVariables(), indent);
         if (!op.getExpressions().isEmpty()) {
             addIndent(0).append(",\n");
@@ -201,31 +186,31 @@
 
     @Override
     public Void visitEmptyTupleSourceOperator(EmptyTupleSourceOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"empty-tuple-source\"");
+        addIndent(indent).append("\"operator\": \"empty-tuple-source\"");
         return null;
     }
 
     @Override
     public Void visitGroupByOperator(GroupByOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"group-by\"");
+        addIndent(indent).append("\"operator\": \"group-by\"");
 
         if (op.isGroupAll()) {
             buffer.append(",\n");
-            addIndent(indent).append("\"option\":\"all\"");
+            addIndent(indent).append("\"option\": \"all\"");
         }
         if (!op.getGroupByList().isEmpty()) {
             buffer.append(",\n");
-            addIndent(indent).append("\"group-by-list\":");
+            addIndent(indent).append("\"group-by-list\": ");
             pprintVeList(op.getGroupByList(), indent);
         }
         if (!op.getDecorList().isEmpty()) {
             buffer.append(",\n");
-            addIndent(indent).append("\"decor-list\":");
+            addIndent(indent).append("\"decor-list\": ");
             pprintVeList(op.getDecorList(), indent);
         }
         if (!op.getNestedPlans().isEmpty()) {
             buffer.append(",\n");
-            addIndent(indent).append("\"subplan\":");
+            addIndent(indent).append("\"subplan\": ");
             printNestedPlans(op, indent);
         }
         return null;
@@ -233,7 +218,7 @@
 
     @Override
     public Void visitDistinctOperator(DistinctOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"distinct\"");
+        addIndent(indent).append("\"operator\": \"distinct\"");
         if (!op.getExpressions().isEmpty()) {
             addIndent(0).append(",\n");
             pprintExprList(op.getExpressions(), indent);
@@ -243,39 +228,37 @@
 
     @Override
     public Void visitInnerJoinOperator(InnerJoinOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"join\",\n");
-        addIndent(indent)
-                .append("\"condition\":" + "\"" + op.getCondition().getValue().accept(exprVisitor, indent) + "\"");
+        addIndent(indent).append("\"operator\": \"join\",\n");
+        addIndent(indent).append("\"condition\": \"" + op.getCondition().getValue().accept(exprVisitor, indent) + "\"");
         return null;
     }
 
     @Override
     public Void visitLeftOuterJoinOperator(LeftOuterJoinOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"left-outer-join\",\n");
-        addIndent(indent)
-                .append("\"condition\":" + "\"" + op.getCondition().getValue().accept(exprVisitor, indent) + "\"");
+        addIndent(indent).append("\"operator\": \"left-outer-join\",\n");
+        addIndent(indent).append("\"condition\": \"" + op.getCondition().getValue().accept(exprVisitor, indent) + "\"");
         return null;
     }
 
     @Override
     public Void visitNestedTupleSourceOperator(NestedTupleSourceOperator op, Integer indent)
             throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"nested-tuple-source\"");
+        addIndent(indent).append("\"operator\": \"nested-tuple-source\"");
         return null;
     }
 
     @Override
     public Void visitOrderOperator(OrderOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"order\"");
+        addIndent(indent).append("\"operator\": \"order\"");
         for (Pair<OrderOperator.IOrder, Mutable<ILogicalExpression>> p : op.getOrderExpressions()) {
             buffer.append(",\n");
             if (op.getTopK() != -1) {
-                addIndent(indent).append("\"topK\":\"" + op.getTopK() + "\",\n");
+                addIndent(indent).append("\"topK\": \"" + op.getTopK() + "\",\n");
             }
             String fst = getOrderString(p.first);
-            addIndent(indent).append("\"first\":" + fst + ",\n");
-            addIndent(indent)
-                    .append("\"second\":\"" + p.second.getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
+            addIndent(indent).append("\"first\": " + fst + ",\n");
+            addIndent(indent).append(
+                    "\"second\": \"" + p.second.getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
         }
         return null;
     }
@@ -293,7 +276,7 @@
 
     @Override
     public Void visitAssignOperator(AssignOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"assign\"");
+        addIndent(indent).append("\"operator\": \"assign\"");
         variablePrintHelper(op.getVariables(), indent);
         if (!op.getExpressions().isEmpty()) {
             addIndent(0).append(",\n");
@@ -304,7 +287,7 @@
 
     @Override
     public Void visitWriteOperator(WriteOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"write\"");
+        addIndent(indent).append("\"operator\": \"write\"");
         if (!op.getExpressions().isEmpty()) {
             addIndent(0).append(",\n");
             pprintExprList(op.getExpressions(), indent);
@@ -314,7 +297,7 @@
 
     @Override
     public Void visitDistributeResultOperator(DistributeResultOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"distribute-result\"");
+        addIndent(indent).append("\"operator\": \"distribute-result\"");
         if (!op.getExpressions().isEmpty()) {
             addIndent(0).append(",\n");
             pprintExprList(op.getExpressions(), indent);
@@ -324,10 +307,10 @@
 
     @Override
     public Void visitWriteResultOperator(WriteResultOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"load\",\n");
+        addIndent(indent).append("\"operator\": \"load\",\n");
         addIndent(indent).append(str(op.getDataSource())).append("\"from\":")
                 .append(op.getPayloadExpression().getValue().accept(exprVisitor, indent) + ",\n");
-        addIndent(indent).append("\"partitioned-by\":{");
+        addIndent(indent).append("\"partitioned-by\": {");
         pprintExprList(op.getKeyExpressions(), indent);
         addIndent(indent).append("}");
         return null;
@@ -335,15 +318,15 @@
 
     @Override
     public Void visitSelectOperator(SelectOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"select\",\n");
-        addIndent(indent).append("\"expressions\":\""
+        addIndent(indent).append("\"operator\": \"select\",\n");
+        addIndent(indent).append("\"expressions\": \""
                 + op.getCondition().getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
         return null;
     }
 
     @Override
     public Void visitProjectOperator(ProjectOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"project\"");
+        addIndent(indent).append("\"operator\": \"project\"");
         variablePrintHelper(op.getVariables(), indent);
         return null;
     }
@@ -351,7 +334,7 @@
     @Override
     public Void visitSubplanOperator(SubplanOperator op, Integer indent) throws AlgebricksException {
         if (!op.getNestedPlans().isEmpty()) {
-            addIndent(indent).append("\"subplan\":");
+            addIndent(indent).append("\"subplan\": ");
             printNestedPlans(op, indent);
         }
         return null;
@@ -359,40 +342,29 @@
 
     @Override
     public Void visitUnionOperator(UnionAllOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"union\"");
+        addIndent(indent).append("\"operator\": \"union\"");
         for (Triple<LogicalVariable, LogicalVariable, LogicalVariable> v : op.getVariableMappings()) {
             buffer.append(",\n");
-            addIndent(indent)
-                    .append("\"values\":[" + "\"" + v.first + "\"," + "\"" + v.second + "\"," + "\"" + v.third + "\"]");
+            addIndent(indent).append(
+                    "\"values\": [" + "\"" + v.first + "\"," + "\"" + v.second + "\"," + "\"" + v.third + "\"]");
         }
         return null;
     }
 
     @Override
     public Void visitIntersectOperator(IntersectOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"intersect\",\n");
+        addIndent(indent).append("\"operator\": \"intersect\",\n");
 
-        addIndent(indent).append("\"output-variables\":[");
-        for (int i = 0; i < op.getOutputVars().size(); i++) {
-            if (i > 0) {
-                buffer.append(", ");
-            }
-            buffer.append("\"" + str(op.getOutputVars().get(i)) + "\"");
-        }
+        addIndent(indent).append("\"output-variables\": [");
+        appendVars(op.getOutputVars());
         buffer.append("],");
-        addIndent(indent).append("\"input_variables\":[");
+        addIndent(indent).append("\"input_variables\": [");
+
         for (int i = 0; i < op.getNumInput(); i++) {
             if (i > 0) {
                 buffer.append(",\n");
             }
-            buffer.append("[");
-            for (int j = 0; j < op.getInputVariables(i).size(); j++) {
-                if (j > 0) {
-                    buffer.append(", ");
-                }
-                buffer.append("\"" + str(op.getInputVariables(i).get(j)) + "\"");
-            }
-            buffer.append(']');
+            appendVars(op.getInputVariables(i));
         }
         buffer.append("]");
         return null;
@@ -400,28 +372,28 @@
 
     @Override
     public Void visitUnnestOperator(UnnestOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"unnest\"");
+        addIndent(indent).append("\"operator\": \"unnest\"");
         variablePrintHelper(op.getVariables(), indent);
         if (op.getPositionalVariable() != null) {
             buffer.append(",\n");
-            addIndent(indent).append("\"position\":\"" + op.getPositionalVariable() + "\"");
+            addIndent(indent).append("\"position\": \"" + op.getPositionalVariable() + "\"");
         }
         buffer.append(",\n");
-        addIndent(indent).append("\"expressions\":\""
+        addIndent(indent).append("\"expressions\": \""
                 + op.getExpressionRef().getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
         return null;
     }
 
     @Override
     public Void visitLeftOuterUnnestOperator(LeftOuterUnnestOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"outer-unnest\",\n");
-        addIndent(indent).append("\"variables\":[\"" + op.getVariable() + "\"]");
+        addIndent(indent).append("\"operator\": \"outer-unnest\",\n");
+        addIndent(indent).append("\"variables\": [\"" + op.getVariable() + "\"]");
         if (op.getPositionalVariable() != null) {
             buffer.append(",\n");
-            addIndent(indent).append("\"position\":" + op.getPositionalVariable());
+            addIndent(indent).append("\"position\": " + op.getPositionalVariable());
         }
         buffer.append(",\n");
-        addIndent(indent).append("\"expressions\":\""
+        addIndent(indent).append("\"expressions\": \""
                 + op.getExpressionRef().getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
         return null;
     }
@@ -439,10 +411,10 @@
 
     private Void printAbstractUnnestMapOperator(AbstractUnnestMapOperator op, Integer indent, String opSignature)
             throws AlgebricksException {
-        AlgebricksAppendable plan = addIndent(indent).append("\"operator\":\"" + opSignature + "\"");
+        AlgebricksAppendable plan = addIndent(indent).append("\"operator\": \"" + opSignature + "\"");
         variablePrintHelper(op.getVariables(), indent);
         buffer.append(",\n");
-        addIndent(indent).append("\"expressions\":\""
+        addIndent(indent).append("\"expressions\": \""
                 + op.getExpressionRef().getValue().accept(exprVisitor, indent).replace('"', ' ') + "\"");
         appendFilterInformation(plan, op.getMinFilterVars(), op.getMaxFilterVars(), indent);
         return null;
@@ -450,24 +422,17 @@
 
     @Override
     public Void visitDataScanOperator(DataSourceScanOperator op, Integer indent) throws AlgebricksException {
-        AlgebricksAppendable plan = addIndent(indent).append("\"operator\":\"data-scan\"");
+        AlgebricksAppendable plan = addIndent(indent).append("\"operator\": \"data-scan\"");
         if (!op.getProjectVariables().isEmpty()) {
             addIndent(0).append(",\n");
-            addIndent(indent).append("\"project-variables\":[");
-            boolean first = true;
-            for (LogicalVariable v : op.getProjectVariables()) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"project-variables\": [");
+            appendVars(op.getProjectVariables());
             buffer.append("]");
         }
         variablePrintHelper(op.getVariables(), indent);
         if (op.getDataSource() != null) {
             addIndent(0).append(",\n");
-            addIndent(indent).append("\"data-source\":\"" + op.getDataSource() + "\"");
+            addIndent(indent).append("\"data-source\": \"" + op.getDataSource() + "\"");
         }
         appendFilterInformation(plan, op.getMinFilterVars(), op.getMaxFilterVars(), indent);
         return null;
@@ -478,19 +443,12 @@
         if (minFilterVars != null || maxFilterVars != null) {
             plan.append(",\n");
             addIndent(indent);
-            plan.append("\"with-filter-on\":{");
+            plan.append("\"with-filter-on\": {");
         }
         if (minFilterVars != null) {
             buffer.append("\n");
-            addIndent(indent).append("\"min\":[");
-            boolean first = true;
-            for (LogicalVariable v : minFilterVars) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"min\": [");
+            appendVars(minFilterVars);
             buffer.append("]");
         }
         if (minFilterVars != null && maxFilterVars != null) {
@@ -498,15 +456,8 @@
         }
         if (maxFilterVars != null) {
             buffer.append("\n");
-            addIndent(indent).append("\"max\":[");
-            boolean first = true;
-            for (LogicalVariable v : maxFilterVars) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"max\": [");
+            appendVars(maxFilterVars);
             buffer.append("]");
         }
         if (minFilterVars != null || maxFilterVars != null) {
@@ -516,51 +467,48 @@
         return null;
     }
 
+    private void appendVars(List<LogicalVariable> minFilterVars) throws AlgebricksException {
+        boolean first = true;
+        for (LogicalVariable v : minFilterVars) {
+            if (!first) {
+                buffer.append(",");
+            }
+            buffer.append("\"" + str(v) + "\"");
+            first = false;
+        }
+    }
+
     @Override
     public Void visitLimitOperator(LimitOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"limit\",\n");
-        addIndent(indent).append("\"value\":\"" + op.getMaxObjects().getValue().accept(exprVisitor, indent) + "\"");
+        addIndent(indent).append("\"operator\": \"limit\",\n");
+        addIndent(indent).append("\"value\": \"" + op.getMaxObjects().getValue().accept(exprVisitor, indent) + "\"");
         ILogicalExpression offset = op.getOffset().getValue();
         if (offset != null) {
             buffer.append(",\n");
-            addIndent(indent).append("\"offset\":\"" + offset.accept(exprVisitor, indent) + "\"");
+            addIndent(indent).append("\"offset\": \"" + offset.accept(exprVisitor, indent) + "\"");
         }
         return null;
     }
 
     @Override
     public Void visitExchangeOperator(ExchangeOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"exchange\"");
+        addIndent(indent).append("\"operator\": \"exchange\"");
         return null;
     }
 
     @Override
     public Void visitScriptOperator(ScriptOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"script\"");
+        addIndent(indent).append("\"operator\": \"script\"");
         if (!op.getInputVariables().isEmpty()) {
             addIndent(0).append(",\n");
-            addIndent(indent).append("\"in\":[");
-            boolean first = true;
-            for (LogicalVariable v : op.getInputVariables()) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"in\": [");
+            appendVars(op.getInputVariables());
             buffer.append("]");
         }
         if (!op.getOutputVariables().isEmpty()) {
             addIndent(0).append(",\n");
-            addIndent(indent).append("\"out\":[");
-            boolean first = true;
-            for (LogicalVariable v : op.getOutputVariables()) {
-                if (!first) {
-                    buffer.append(",");
-                }
-                buffer.append("\"" + str(v) + "\"");
-                first = false;
-            }
+            addIndent(indent).append("\"out\": [");
+            appendVars(op.getOutputVariables());
             buffer.append("]");
         }
         return null;
@@ -568,54 +516,54 @@
 
     @Override
     public Void visitReplicateOperator(ReplicateOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"replicate\"");
+        addIndent(indent).append("\"operator\": \"replicate\"");
         return null;
     }
 
     @Override
     public Void visitSplitOperator(SplitOperator op, Integer indent) throws AlgebricksException {
         Mutable<ILogicalExpression> branchingExpression = op.getBranchingExpression();
-        addIndent(indent).append("\"operator\":\"split\",\n");
+        addIndent(indent).append("\"operator\": \"split\",\n");
         addIndent(indent).append("\"" + branchingExpression.getValue().accept(exprVisitor, indent) + "\"");
         return null;
     }
 
     @Override
     public Void visitMaterializeOperator(MaterializeOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"materialize\"");
+        addIndent(indent).append("\"operator\": \"materialize\"");
         return null;
     }
 
     @Override
     public Void visitInsertDeleteUpsertOperator(InsertDeleteUpsertOperator op, Integer indent)
             throws AlgebricksException {
-        String header = "\"operator\":\"" + getIndexOpString(op.getOperation()) + "\",\n";
+        String header = "\"operator\": \"" + getIndexOpString(op.getOperation()) + "\",\n";
         addIndent(indent).append(header);
-        addIndent(indent).append(str("\"data-source\":\"" + op.getDataSource() + "\",\n"));
-        addIndent(indent).append("\"from-record\":\"")
+        addIndent(indent).append(str("\"data-source\": \"" + op.getDataSource() + "\",\n"));
+        addIndent(indent).append("\"from-record\": \"")
                 .append(op.getPayloadExpression().getValue().accept(exprVisitor, indent) + "\"");
         if (op.getAdditionalNonFilteringExpressions() != null) {
-            buffer.append(",\n\"meta\":\"");
+            buffer.append(",\n\"meta\": \"");
             pprintExprList(op.getAdditionalNonFilteringExpressions(), 0);
             buffer.append("\"");
         }
         buffer.append(",\n");
-        addIndent(indent).append("\"partitioned-by\":{");
+        addIndent(indent).append("\"partitioned-by\": {");
         pprintExprList(op.getPrimaryKeyExpressions(), 0);
         buffer.append("}");
         if (op.getOperation() == Kind.UPSERT) {
-            addIndent(indent).append(",\n\"out\":{\n");
-            addIndent(indent).append("\"record-before-upsert\":\"" + op.getBeforeOpRecordVar() + "\"");
+            addIndent(indent).append(",\n\"out\": {\n");
+            addIndent(indent).append("\"record-before-upsert\": \"" + op.getBeforeOpRecordVar() + "\"");
             if (op.getBeforeOpAdditionalNonFilteringVars() != null) {
                 buffer.append(",\n");
                 addIndent(indent)
-                        .append("\"additional-before-upsert\":\"" + op.getBeforeOpAdditionalNonFilteringVars() + "\"");
+                        .append("\"additional-before-upsert\": \"" + op.getBeforeOpAdditionalNonFilteringVars() + "\"");
             }
             addIndent(indent).append("}");
         }
         if (op.isBulkload()) {
             buffer.append(",\n");
-            addIndent(indent).append("\"bulkload\":\"true\"");
+            addIndent(indent).append("\"bulkload\": true");
         }
         return null;
     }
@@ -624,17 +572,17 @@
     public Void visitIndexInsertDeleteUpsertOperator(IndexInsertDeleteUpsertOperator op, Integer indent)
             throws AlgebricksException {
         String header = getIndexOpString(op.getOperation());
-        addIndent(indent).append("\"operator\":\"" + header + "\",\n");
-        addIndent(indent).append("\"index\":\"" + op.getIndexName() + "\",\n");
-        addIndent(indent).append("\"on\":\"").append(str(op.getDataSourceIndex().getDataSource()) + "\",\n");
-        addIndent(indent).append("\"from\":{");
+        addIndent(indent).append("\"operator\": \"" + header + "\",\n");
+        addIndent(indent).append("\"index\": \"" + op.getIndexName() + "\",\n");
+        addIndent(indent).append("\"on\": \"").append(str(op.getDataSourceIndex().getDataSource()) + "\",\n");
+        addIndent(indent).append("\"from\": {");
 
         if (op.getOperation() == Kind.UPSERT) {
 
-            addIndent(indent).append("[\"replace\":\"");
+            addIndent(indent).append("[\"replace\": \"");
             pprintExprList(op.getPrevSecondaryKeyExprs(), 0);
             buffer.append("\",\n");
-            addIndent(indent).append("\"with\":\"");
+            addIndent(indent).append("\"with\": \"");
             pprintExprList(op.getSecondaryKeyExpressions(), 0);
             buffer.append("\"}");
         } else {
@@ -644,7 +592,7 @@
         addIndent(indent).append("}");
         if (op.isBulkload()) {
             buffer.append(",\n");
-            buffer.append("\"bulkload\":\"true\"");
+            buffer.append("\"bulkload\": true");
         }
         return null;
     }
@@ -663,7 +611,7 @@
 
     @Override
     public Void visitTokenizeOperator(TokenizeOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"tokenize\"");
+        addIndent(indent).append("\"operator\": \"tokenize\"");
         variablePrintHelper(op.getTokenizeVars(), indent);
         if (!op.getSecondaryKeyExpressions().isEmpty()) {
             addIndent(0).append(",\n");
@@ -674,23 +622,16 @@
 
     @Override
     public Void visitSinkOperator(SinkOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"sink\"");
+        addIndent(indent).append("\"operator\": \"sink\"");
         return null;
     }
 
     @Override
     public Void visitDelegateOperator(DelegateOperator op, Integer indent) throws AlgebricksException {
-        addIndent(indent).append("\"operator\":\"" + op.toString() + "\"");
+        addIndent(indent).append("\"operator\": \"" + op.toString() + "\"");
         return null;
     }
 
-    protected AlgebricksAppendable addIndent(int level) throws AlgebricksException {
-        for (int i = 0; i < level; ++i) {
-            buffer.append(' ');
-        }
-        return buffer;
-    }
-
     protected void printNestedPlans(AbstractOperatorWithNestedPlans op, Integer indent) throws AlgebricksException {
         idCounter.nextPrefix();
         buffer.append("[\n");
@@ -699,19 +640,17 @@
             if (!first) {
                 buffer.append(",");
             }
-            printPlanJson(p, this, indent + 4);
+            printPlan(p, indent + 4);
             first = false;
-
         }
         addIndent(indent).append("]");
         idCounter.previousPrefix();
     }
 
-    //Done--Look for exprRef
     protected void pprintExprList(List<Mutable<ILogicalExpression>> expressions, Integer indent)
             throws AlgebricksException {
         addIndent(indent);
-        buffer.append("\"expressions\":\"");
+        buffer.append("\"expressions\": \"");
         boolean first = true;
         for (Mutable<ILogicalExpression> exprRef : expressions) {
             if (first) {
@@ -727,22 +666,21 @@
     protected void pprintVeList(List<Pair<LogicalVariable, Mutable<ILogicalExpression>>> vePairList, Integer indent)
             throws AlgebricksException {
         buffer.append("[");
-        boolean fst = true;
+        boolean first = true;
         for (Pair<LogicalVariable, Mutable<ILogicalExpression>> ve : vePairList) {
-            if (fst) {
-                fst = false;
+            if (first) {
+                first = false;
             } else {
                 buffer.append(",");
             }
             if (ve.first != null) {
-                buffer.append("{\"variable\":\"" + ve.first.toString().replace('"', ' ') + "\"," + "\"expression\":\""
+                buffer.append("{\"variable\": \"" + ve.first.toString().replace('"', ' ') + "\"," + "\"expression\": \""
                         + ve.second.toString().replace('"', ' ') + "\"}");
             } else {
-                buffer.append("{\"expression\":\"" + ve.second.getValue().accept(exprVisitor, indent).replace('"', ' ')
+                buffer.append("{\"expression\": \"" + ve.second.getValue().accept(exprVisitor, indent).replace('"', ' ')
                         + "\"}");
             }
         }
         buffer.append("]");
     }
-
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/PlanPrettyPrinter.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/PlanPrettyPrinter.java
index cf99d3b..67640c5 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/PlanPrettyPrinter.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/prettyprint/PlanPrettyPrinter.java
@@ -23,37 +23,18 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 
 public class PlanPrettyPrinter {
-    @FunctionalInterface
-    public interface print<T1, T2, T3> {
-        void apply(T1 arg1, T2 arg2, T3 arg3) throws AlgebricksException;
-    }
-
-    public static void printOperator(AbstractLogicalOperator op, LogicalOperatorPrettyPrintVisitor pvisitor,
+    public static void printOperator(AbstractLogicalOperator op, AbstractLogicalOperatorPrettyPrintVisitor pvisitor,
             int indent) throws AlgebricksException {
-        print<AbstractLogicalOperator, LogicalOperatorPrettyPrintVisitor, Integer> printOperator =
-                LogicalOperatorPrettyPrintVisitor::printOperator;
-        printOperator.apply(op, pvisitor, indent);
+        pvisitor.printOperator(op, indent);
     }
 
-    public static <T extends AbstractLogicalOperatorPrettyPrintVisitor> void printPlan(ILogicalPlan plan,
-            T pvisitor, int indent) throws AlgebricksException {
-        if (pvisitor.getClass().equals(LogicalOperatorPrettyPrintVisitor.class)) {
-            print<ILogicalPlan, LogicalOperatorPrettyPrintVisitor, Integer> printPlan =
-                    LogicalOperatorPrettyPrintVisitor::printPlan;
-            printPlan.apply(plan,(LogicalOperatorPrettyPrintVisitor) pvisitor, indent);
-        }
-        else if (pvisitor.getClass().equals(LogicalOperatorPrettyPrintVisitorJson.class)) {
-            print<ILogicalPlan, LogicalOperatorPrettyPrintVisitorJson, Integer> printPlan =
-                    LogicalOperatorPrettyPrintVisitorJson::printPlanJson;
-            printPlan.apply(plan, (LogicalOperatorPrettyPrintVisitorJson)pvisitor, indent);
-        }
-
+    public static void printPlan(ILogicalPlan plan, AbstractLogicalOperatorPrettyPrintVisitor pvisitor, int indent)
+            throws AlgebricksException {
+        pvisitor.printPlan(plan, indent);
     }
 
     public static void printPhysicalOps(ILogicalPlan plan, AlgebricksAppendable out, int indent)
             throws AlgebricksException {
-        print<ILogicalPlan, AlgebricksAppendable, Integer> printOperator =
-                AbstractLogicalOperatorPrettyPrintVisitor::printPhysicalOps;
-        printOperator.apply(plan, out, indent);
+        AbstractLogicalOperatorPrettyPrintVisitor.printPhysicalOps(plan, out, indent);
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/IPartitioningRequirementsCoordinator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/IPartitioningRequirementsCoordinator.java
index f4f5d7f..d515fcf 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/IPartitioningRequirementsCoordinator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/IPartitioningRequirementsCoordinator.java
@@ -46,55 +46,57 @@
         }
     };
 
-    public static IPartitioningRequirementsCoordinator EQCLASS_PARTITIONING_COORDINATOR = new IPartitioningRequirementsCoordinator() {
+    public static IPartitioningRequirementsCoordinator EQCLASS_PARTITIONING_COORDINATOR =
+            new IPartitioningRequirementsCoordinator() {
 
-        @Override
-        public Pair<Boolean, IPartitioningProperty> coordinateRequirements(IPartitioningProperty rqdpp,
-                IPartitioningProperty firstDeliveredPartitioning, ILogicalOperator op, IOptimizationContext context)
-                throws AlgebricksException {
-            if (firstDeliveredPartitioning != null && rqdpp != null
-                    && firstDeliveredPartitioning.getPartitioningType() == rqdpp.getPartitioningType()) {
-                switch (rqdpp.getPartitioningType()) {
-                    case UNORDERED_PARTITIONED: {
-                        UnorderedPartitionedProperty upp1 = (UnorderedPartitionedProperty) firstDeliveredPartitioning;
-                        Set<LogicalVariable> set1 = upp1.getColumnSet();
-                        UnorderedPartitionedProperty uppreq = (UnorderedPartitionedProperty) rqdpp;
-                        Set<LogicalVariable> modifuppreq = new ListSet<LogicalVariable>();
-                        Map<LogicalVariable, EquivalenceClass> eqmap = context.getEquivalenceClassMap(op);
-                        Set<LogicalVariable> covered = new ListSet<LogicalVariable>();
+                @Override
+                public Pair<Boolean, IPartitioningProperty> coordinateRequirements(IPartitioningProperty rqdpp,
+                        IPartitioningProperty firstDeliveredPartitioning, ILogicalOperator op,
+                        IOptimizationContext context) throws AlgebricksException {
+                    if (firstDeliveredPartitioning != null && rqdpp != null
+                            && firstDeliveredPartitioning.getPartitioningType() == rqdpp.getPartitioningType()) {
+                        switch (rqdpp.getPartitioningType()) {
+                            case UNORDERED_PARTITIONED: {
+                                UnorderedPartitionedProperty upp1 =
+                                        (UnorderedPartitionedProperty) firstDeliveredPartitioning;
+                                Set<LogicalVariable> set1 = upp1.getColumnSet();
+                                UnorderedPartitionedProperty uppreq = (UnorderedPartitionedProperty) rqdpp;
+                                Set<LogicalVariable> modifuppreq = new ListSet<LogicalVariable>();
+                                Map<LogicalVariable, EquivalenceClass> eqmap = context.getEquivalenceClassMap(op);
+                                Set<LogicalVariable> covered = new ListSet<LogicalVariable>();
 
-                        // coordinate from an existing partition property
-                        // (firstDeliveredPartitioning)
-                        for (LogicalVariable v : set1) {
-                            EquivalenceClass ecFirst = eqmap.get(v);
-                            for (LogicalVariable r : uppreq.getColumnSet()) {
-                                EquivalenceClass ec = eqmap.get(r);
-                                if (ecFirst == ec) {
-                                    covered.add(v);
-                                    modifuppreq.add(r);
-                                    break;
+                                // coordinate from an existing partition property
+                                // (firstDeliveredPartitioning)
+                                for (LogicalVariable v : set1) {
+                                    EquivalenceClass ecFirst = eqmap.get(v);
+                                    for (LogicalVariable r : uppreq.getColumnSet()) {
+                                        EquivalenceClass ec = eqmap.get(r);
+                                        if (ecFirst == ec) {
+                                            covered.add(v);
+                                            modifuppreq.add(r);
+                                            break;
+                                        }
+                                    }
                                 }
+
+                                if (!covered.equals(set1)) {
+                                    throw new AlgebricksException("Could not modify " + rqdpp
+                                            + " to agree with partitioning property " + firstDeliveredPartitioning
+                                            + " delivered by previous input operator.");
+                                }
+                                UnorderedPartitionedProperty upp2 =
+                                        new UnorderedPartitionedProperty(modifuppreq, rqdpp.getNodeDomain());
+                                return new Pair<Boolean, IPartitioningProperty>(false, upp2);
+                            }
+                            case ORDERED_PARTITIONED: {
+                                throw new NotImplementedException();
                             }
                         }
-
-                        if (!covered.equals(set1)) {
-                            throw new AlgebricksException("Could not modify " + rqdpp
-                                    + " to agree with partitioning property " + firstDeliveredPartitioning
-                                    + " delivered by previous input operator.");
-                        }
-                        UnorderedPartitionedProperty upp2 = new UnorderedPartitionedProperty(modifuppreq,
-                                rqdpp.getNodeDomain());
-                        return new Pair<Boolean, IPartitioningProperty>(false, upp2);
                     }
-                    case ORDERED_PARTITIONED: {
-                        throw new NotImplementedException();
-                    }
+                    return new Pair<Boolean, IPartitioningProperty>(true, rqdpp);
                 }
-            }
-            return new Pair<Boolean, IPartitioningProperty>(true, rqdpp);
-        }
 
-    };
+            };
 
     public Pair<Boolean, IPartitioningProperty> coordinateRequirements(IPartitioningProperty requirements,
             IPartitioningProperty firstDeliveredPartitioning, ILogicalOperator op, IOptimizationContext context)
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/LocalGroupingProperty.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/LocalGroupingProperty.java
index af91a3a..1cd7e64 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/LocalGroupingProperty.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/LocalGroupingProperty.java
@@ -114,8 +114,8 @@
             return null;
         }
         int numColumns = newColumns.size();
-        List<LogicalVariable> newOrderEnforcer = preferredOrderEnforcer.size() > numColumns ? preferredOrderEnforcer
-                .subList(0, numColumns) : preferredOrderEnforcer;
+        List<LogicalVariable> newOrderEnforcer = preferredOrderEnforcer.size() > numColumns
+                ? preferredOrderEnforcer.subList(0, numColumns) : preferredOrderEnforcer;
         return new LocalGroupingProperty(newColumns, newOrderEnforcer);
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/StructuralPropertiesVector.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/StructuralPropertiesVector.java
index c6b4618..aa6afdb 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/StructuralPropertiesVector.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/StructuralPropertiesVector.java
@@ -86,8 +86,8 @@
         if (reqdPart != null) {
             IPartitioningProperty normalizedReqPart =
                     reqdPart.normalize(equivalenceClasses, mayExpandProperties ? fds : null);
-            IPartitioningProperty normalizedPropPart = propPartitioning.normalize(equivalenceClasses,
-                    mayExpandProperties ? fds : null);
+            IPartitioningProperty normalizedPropPart =
+                    propPartitioning.normalize(equivalenceClasses, mayExpandProperties ? fds : null);
             if (!PropertiesUtil.matchPartitioningProps(normalizedReqPart, normalizedPropPart, mayExpandProperties)) {
                 diffPart = reqdPart;
             }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/TypePropagationPolicy.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/TypePropagationPolicy.java
index 566c13e..9d60370 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/TypePropagationPolicy.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/properties/TypePropagationPolicy.java
@@ -71,8 +71,8 @@
             // found in both inner and outer branches. Fix computeOutputTypeEnvironment() in ProjectOperator
             // and investigate why many test queries fail if only live variables' types are propagated.
             for (int i = n - 1; i >= 0; i--) {
-                Object t = typeEnvs[i].getTypeEnv().getVarType(var, nonNullVariableList,
-                        correlatedNullableVariableLists);
+                Object t =
+                        typeEnvs[i].getTypeEnv().getVarType(var, nonNullVariableList, correlatedNullableVariableLists);
                 if (t == null) {
                     continue;
                 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
index 8d00696..c574cd8 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorManipulationUtil.java
@@ -18,7 +18,10 @@
  */
 package org.apache.hyracks.algebricks.core.algebra.util;
 
+import java.util.ArrayDeque;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Deque;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -40,8 +43,7 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.LimitOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.
-        LogicalOperatorDeepCopyWithNewVariablesVisitor;
+import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.LogicalOperatorDeepCopyWithNewVariablesVisitor;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.OperatorDeepCopyVisitor;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities;
 import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl;
@@ -102,8 +104,8 @@
             }
             case NESTEDTUPLESOURCE: {
                 NestedTupleSourceOperator nts = (NestedTupleSourceOperator) op;
-                AbstractLogicalOperator prevOp = (AbstractLogicalOperator) nts.getDataSourceReference().getValue()
-                        .getInputs().get(0).getValue();
+                AbstractLogicalOperator prevOp =
+                        (AbstractLogicalOperator) nts.getDataSourceReference().getValue().getInputs().get(0).getValue();
                 if (prevOp.getExecutionMode() != AbstractLogicalOperator.ExecutionMode.UNPARTITIONED) {
                     nts.setExecutionMode(AbstractLogicalOperator.ExecutionMode.LOCAL);
                 }
@@ -169,8 +171,8 @@
         if (op.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE && goThroughNts) {
             NestedTupleSourceOperator nts = (NestedTupleSourceOperator) op;
             if (nts.getDataSourceReference() != null) {
-                AbstractLogicalOperator op2 = (AbstractLogicalOperator) nts.getDataSourceReference().getValue()
-                        .getInputs().get(0).getValue();
+                AbstractLogicalOperator op2 =
+                        (AbstractLogicalOperator) nts.getDataSourceReference().getValue().getInputs().get(0).getValue();
                 substituteVarRec(op2, v1, v2, goThroughNts, ctx);
             }
         }
@@ -202,8 +204,8 @@
 
     public static Pair<ILogicalOperator, Map<LogicalVariable, LogicalVariable>> deepCopyWithNewVars(
             ILogicalOperator root, IOptimizationContext ctx) throws AlgebricksException {
-        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor = new
-                LogicalOperatorDeepCopyWithNewVariablesVisitor(ctx, null, true);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor deepCopyVisitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(ctx, ctx, true);
         ILogicalOperator newRoot = deepCopyVisitor.deepCopy(root);
         return Pair.of(newRoot, deepCopyVisitor.getInputToOutputVariableMapping());
     }
@@ -328,4 +330,45 @@
         return false;
     }
 
+    /**
+     * Returns all descendants of an operator that are leaf operators
+     *
+     * @param opRef given operator
+     * @return list containing all leaf descendants
+     */
+    public static List<Mutable<ILogicalOperator>> findLeafDescendantsOrSelf(Mutable<ILogicalOperator> opRef) {
+        List<Mutable<ILogicalOperator>> result = Collections.emptyList();
+
+        Deque<Mutable<ILogicalOperator>> queue = new ArrayDeque<>();
+        queue.add(opRef);
+        Mutable<ILogicalOperator> currentOpRef;
+        while ((currentOpRef = queue.pollLast()) != null) {
+            List<Mutable<ILogicalOperator>> inputs = currentOpRef.getValue().getInputs();
+            if (inputs.isEmpty()) {
+                if (result.isEmpty()) {
+                    result = new ArrayList<>();
+                }
+                result.add(currentOpRef);
+            } else {
+                queue.addAll(inputs);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Find operator in a given list of operator references
+     *
+     * @param list list to search in
+     * @param op   operator to find
+     * @return operator position in the given list or {@code -1} if not found
+     */
+    public static int indexOf(List<Mutable<ILogicalOperator>> list, ILogicalOperator op) {
+        for (int i = 0, ln = list.size(); i < ln; i++) {
+            if (list.get(i).getValue() == op) {
+                return i;
+            }
+        }
+        return -1;
+    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java
index 463f214..e0d806d 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/util/OperatorPropertiesUtil.java
@@ -45,7 +45,7 @@
 
 public class OperatorPropertiesUtil {
 
-    private static final String MOVABLE = "isMovable";
+    public static final String MOVABLE = "isMovable";
 
     private OperatorPropertiesUtil() {
     }
@@ -345,9 +345,8 @@
             StructuralPropertiesVector partitionedPropertiesVector) {
         ILogicalOperator leftChild = op.getInputs().get(0).getValue();
         ILogicalOperator rightChild = op.getInputs().get(1).getValue();
-        boolean unPartitioned =
-                leftChild.getExecutionMode().equals(AbstractLogicalOperator.ExecutionMode.UNPARTITIONED) && rightChild
-                        .getExecutionMode().equals(AbstractLogicalOperator.ExecutionMode.UNPARTITIONED);
+        boolean unPartitioned = leftChild.getExecutionMode().equals(AbstractLogicalOperator.ExecutionMode.UNPARTITIONED)
+                && rightChild.getExecutionMode().equals(AbstractLogicalOperator.ExecutionMode.UNPARTITIONED);
         return unPartitioned ? StructuralPropertiesVector.EMPTY_PROPERTIES_VECTOR : partitionedPropertiesVector;
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/visitors/AbstractConstVarFunVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/visitors/AbstractConstVarFunVisitor.java
index 2fa4672..695630c 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/visitors/AbstractConstVarFunVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/algebra/visitors/AbstractConstVarFunVisitor.java
@@ -39,7 +39,8 @@
         return visitFunctionCallExpression(expr, arg);
     }
 
-    public R visitStatefulFunctionCallExpression(StatefulFunctionCallExpression expr, T arg) throws AlgebricksException {
+    public R visitStatefulFunctionCallExpression(StatefulFunctionCallExpression expr, T arg)
+            throws AlgebricksException {
         return visitFunctionCallExpression(expr, arg);
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
index 7df8cc4..c63e8a1 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/config/AlgebricksConfig.java
@@ -18,10 +18,11 @@
  */
 package org.apache.hyracks.algebricks.core.config;
 
-import java.util.logging.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class AlgebricksConfig {
     public static final boolean DEBUG = true;
     public static final String ALGEBRICKS_LOGGER_NAME = "org.apache.hyracks.algebricks";
-    public static final Logger ALGEBRICKS_LOGGER = Logger.getLogger(ALGEBRICKS_LOGGER_NAME);
+    public static final Logger ALGEBRICKS_LOGGER = LogManager.getLogger(ALGEBRICKS_LOGGER_NAME);
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobBuilder.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobBuilder.java
index 4c42db8..16992e7 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobBuilder.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobBuilder.java
@@ -23,6 +23,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksCountPartitionConstraint;
 import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
@@ -34,6 +35,8 @@
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.logical.AbstractLogicalOperator.ExecutionMode;
+import org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil;
+import org.apache.hyracks.algebricks.runtime.base.AlgebricksPipeline;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
 import org.apache.hyracks.algebricks.runtime.operators.meta.AlgebricksMetaOperatorDescriptor;
 import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
@@ -59,7 +62,8 @@
     private final Map<ILogicalOperator, AlgebricksPartitionConstraint> pcForMicroOps = new HashMap<>();
 
     private final Map<ILogicalOperator, Integer> algebraicOpBelongingToMetaAsterixOp = new HashMap<>();
-    private final Map<Integer, List<Pair<IPushRuntimeFactory, RecordDescriptor>>> metaAsterixOpSkeletons = new HashMap<>();
+    private final Map<Integer, List<Pair<IPushRuntimeFactory, RecordDescriptor>>> metaAsterixOpSkeletons =
+            new HashMap<>();
     private final Map<Integer, AlgebricksMetaOperatorDescriptor> metaAsterixOps = new HashMap<>();
     private final Map<IOperatorDescriptor, AlgebricksPartitionConstraint> partitionConstraintMap = new HashMap<>();
 
@@ -95,7 +99,7 @@
     @Override
     public void contributeMicroOperator(ILogicalOperator op, IPushRuntimeFactory runtime, RecordDescriptor recDesc,
             AlgebricksPartitionConstraint pc) {
-        microOps.put(op, new Pair<IPushRuntimeFactory, RecordDescriptor>(runtime, recDesc));
+        microOps.put(op, new Pair<>(runtime, recDesc));
         revMicroOpMap.put(runtime, op);
         if (pc != null) {
             pcForMicroOps.put(op, pc);
@@ -170,6 +174,17 @@
         setAllPartitionConstraints(tgtConstraints);
     }
 
+    public List<IOperatorDescriptor> getGeneratedMetaOps() {
+        List<IOperatorDescriptor> resultOps = new ArrayList<>();
+        for (IOperatorDescriptor opd : jobSpec.getOperatorMap().values()) {
+            if (opd instanceof AlgebricksMetaOperatorDescriptor) {
+                resultOps.add(opd);
+            }
+        }
+        resultOps.sort((op1, op2) -> sendsOutput(op1, op2) ? 1 : sendsOutput(op2, op1) ? -1 : 0);
+        return resultOps;
+    }
+
     private void setAllPartitionConstraints(Map<IConnectorDescriptor, TargetConstraint> tgtConstraints) {
         List<OperatorDescriptorId> roots = jobSpec.getRoots();
         setSpecifiedPartitionConstraints();
@@ -205,8 +220,8 @@
         if (opInputs != null) {
             for (IConnectorDescriptor conn : opInputs) {
                 ConnectorDescriptorId cid = conn.getConnectorId();
-                org.apache.commons.lang3.tuple.Pair<org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>, org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>> p = jobSpec
-                        .getConnectorOperatorMap().get(cid);
+                org.apache.commons.lang3.tuple.Pair<org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>, org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>> p =
+                        jobSpec.getConnectorOperatorMap().get(cid);
                 IOperatorDescriptor src = p.getLeft().getLeft();
                 TargetConstraint constraint = tgtConstraints.get(conn);
                 if (constraint != null) {
@@ -236,8 +251,8 @@
         if (opInputs != null) {
             for (IConnectorDescriptor conn : opInputs) {
                 ConnectorDescriptorId cid = conn.getConnectorId();
-                org.apache.commons.lang3.tuple.Pair<org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>, org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>> p = jobSpec
-                        .getConnectorOperatorMap().get(cid);
+                org.apache.commons.lang3.tuple.Pair<org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>, org.apache.commons.lang3.tuple.Pair<IOperatorDescriptor, Integer>> p =
+                        jobSpec.getConnectorOperatorMap().get(cid);
                 IOperatorDescriptor src = p.getLeft().getLeft();
                 // Pre-order DFS
                 setPartitionConstraintsBottomup(src.getOperatorId(), tgtConstraints, opDesc, finalPass);
@@ -316,20 +331,30 @@
         int n = opContents.size();
         IPushRuntimeFactory[] runtimeFactories = new IPushRuntimeFactory[n];
         RecordDescriptor[] internalRecordDescriptors = new RecordDescriptor[n];
-        int i = 0;
-        for (Pair<IPushRuntimeFactory, RecordDescriptor> p : opContents) {
+        for (int i = 0, ln = opContents.size(); i < ln; i++) {
+            Pair<IPushRuntimeFactory, RecordDescriptor> p = opContents.get(i);
             runtimeFactories[i] = p.first;
             internalRecordDescriptors[i] = p.second;
-            i++;
         }
         ILogicalOperator lastLogicalOp = revMicroOpMap.get(runtimeFactories[n - 1]);
         ArrayList<ILogicalOperator> outOps = outEdges.get(lastLogicalOp);
-        int outArity = (outOps == null) ? 0 : outOps.size();
+        int outArity = outOps == null ? 0 : outOps.size();
+        int[] outPositions = new int[outArity];
+        IPushRuntimeFactory[] outRuntimeFactories = new IPushRuntimeFactory[outArity];
+        if (outOps != null) {
+            for (int i = 0, ln = outOps.size(); i < ln; i++) {
+                ILogicalOperator outOp = outOps.get(i);
+                outPositions[i] = OperatorManipulationUtil.indexOf(outOp.getInputs(), lastLogicalOp);
+                Pair<IPushRuntimeFactory, RecordDescriptor> microOpPair = microOps.get(outOp);
+                outRuntimeFactories[i] = microOpPair != null ? microOpPair.first : null;
+            }
+        }
+
         ILogicalOperator firstLogicalOp = revMicroOpMap.get(runtimeFactories[0]);
         ArrayList<ILogicalOperator> inOps = inEdges.get(firstLogicalOp);
         int inArity = (inOps == null) ? 0 : inOps.size();
         return new AlgebricksMetaOperatorDescriptor(jobSpec, inArity, outArity, runtimeFactories,
-                internalRecordDescriptors);
+                internalRecordDescriptors, outRuntimeFactories, outPositions);
     }
 
     private void addMicroOpToMetaRuntimeOp(ILogicalOperator aop) {
@@ -343,7 +368,12 @@
             return;
         }
         ILogicalOperator dest = destList.get(0);
+        int destInputPos = OperatorManipulationUtil.indexOf(dest.getInputs(), aop);
         Integer j = algebraicOpBelongingToMetaAsterixOp.get(dest);
+        if (destInputPos != 0) {
+            return;
+        }
+
         if (j == null && microOps.get(dest) != null) {
             algebraicOpBelongingToMetaAsterixOp.put(dest, k);
             List<Pair<IPushRuntimeFactory, RecordDescriptor>> aodContent1 = metaAsterixOpSkeletons.get(k);
@@ -361,7 +391,6 @@
                 }
             }
         }
-
     }
 
     private int createNewMetaOpInfo(ILogicalOperator aop) {
@@ -386,4 +415,28 @@
         }
     }
 
+    private boolean sendsOutput(IOperatorDescriptor src, IOperatorDescriptor trg) {
+        AlgebricksPipeline srcPipeline = ((AlgebricksMetaOperatorDescriptor) src).getPipeline();
+        IPushRuntimeFactory[] srcOutRts = srcPipeline.getOutputRuntimeFactories();
+        if (srcOutRts == null) {
+            return false;
+        }
+        IPushRuntimeFactory[] trgRts = ((AlgebricksMetaOperatorDescriptor) trg).getPipeline().getRuntimeFactories();
+        for (IPushRuntimeFactory srcOutRt : srcOutRts) {
+            if (ArrayUtils.contains(trgRts, srcOutRt)) {
+                return true;
+            }
+            ILogicalOperator srcOutOp = revMicroOpMap.get(srcOutRt);
+            if (srcOutOp != null) {
+                Integer k = algebraicOpBelongingToMetaAsterixOp.get(srcOutOp);
+                if (k != null) {
+                    AlgebricksMetaOperatorDescriptor srcOutMetaOp = metaAsterixOps.get(k);
+                    if (srcOutMetaOp != null && sendsOutput(srcOutMetaOp, trg)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobGenHelper.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobGenHelper.java
index 2c2708b..b204bcb 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobGenHelper.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/JobGenHelper.java
@@ -20,7 +20,6 @@
 
 import java.util.Collection;
 import java.util.List;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
@@ -42,10 +41,12 @@
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public final class JobGenHelper {
 
-    private static final Logger LOGGER = Logger.getLogger(JobGenHelper.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     @SuppressWarnings("rawtypes")
     public static RecordDescriptor mkRecordDescriptor(IVariableTypeEnvironment env, IOperatorSchema opSchema,
@@ -58,7 +59,7 @@
         for (LogicalVariable var : opSchema) {
             Object t = env.getVarType(var);
             if (t == null) {
-                LOGGER.warning("No type for variable " + var);
+                LOGGER.warn("No type for variable " + var);
             }
             fields[i] = sdp.getSerializerDeserializer(t);
             typeTraits[i] = ttp.getTypeTrait(t);
@@ -95,7 +96,7 @@
 
     public static IBinaryHashFunctionFactory[] variablesToBinaryHashFunctionFactories(
             Collection<LogicalVariable> varLogical, IVariableTypeEnvironment env, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         IBinaryHashFunctionFactory[] funFactories = new IBinaryHashFunctionFactory[varLogical.size()];
         int i = 0;
         IBinaryHashFunctionFactoryProvider bhffProvider = context.getBinaryHashFunctionFactoryProvider();
@@ -108,7 +109,7 @@
 
     public static IBinaryHashFunctionFamily[] variablesToBinaryHashFunctionFamilies(
             Collection<LogicalVariable> varLogical, IVariableTypeEnvironment env, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         IBinaryHashFunctionFamily[] funFamilies = new IBinaryHashFunctionFamily[varLogical.size()];
         int i = 0;
         IBinaryHashFunctionFamilyProvider bhffProvider = context.getBinaryHashFunctionFamilyProvider();
@@ -121,7 +122,7 @@
 
     public static IBinaryComparatorFactory[] variablesToAscBinaryComparatorFactories(
             Collection<LogicalVariable> varLogical, IVariableTypeEnvironment env, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         IBinaryComparatorFactory[] compFactories = new IBinaryComparatorFactory[varLogical.size()];
         IBinaryComparatorFactoryProvider bcfProvider = context.getBinaryComparatorFactoryProvider();
         int i = 0;
@@ -145,7 +146,7 @@
 
     public static INormalizedKeyComputerFactory variablesToAscNormalizedKeyComputerFactory(
             Collection<LogicalVariable> varLogical, IVariableTypeEnvironment env, JobGenContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         INormalizedKeyComputerFactoryProvider nkcfProvider = context.getNormalizedKeyComputerFactoryProvider();
         if (nkcfProvider == null)
             return null;
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/PlanCompiler.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/PlanCompiler.java
index f817cd6..ddda258 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/PlanCompiler.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/jobgen/impl/PlanCompiler.java
@@ -37,7 +37,8 @@
 
 public class PlanCompiler {
     private JobGenContext context;
-    private Map<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>> operatorVisitedToParents = new HashMap<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>>();
+    private Map<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>> operatorVisitedToParents =
+            new HashMap<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>>();
 
     public PlanCompiler(JobGenContext context) {
         this.context = context;
@@ -47,14 +48,24 @@
         return context;
     }
 
-    public JobSpecification compilePlan(ILogicalPlan plan, IOperatorSchema outerPlanSchema,
+    public JobSpecification compilePlan(ILogicalPlan plan, IJobletEventListenerFactory jobEventListenerFactory)
+            throws AlgebricksException {
+        return compilePlanImpl(plan, false, null, jobEventListenerFactory);
+    }
+
+    public JobSpecification compileNestedPlan(ILogicalPlan plan, IOperatorSchema outerPlanSchema)
+            throws AlgebricksException {
+        return compilePlanImpl(plan, true, outerPlanSchema, null);
+    }
+
+    private JobSpecification compilePlanImpl(ILogicalPlan plan, boolean isNestedPlan, IOperatorSchema outerPlanSchema,
             IJobletEventListenerFactory jobEventListenerFactory) throws AlgebricksException {
         JobSpecification spec = new JobSpecification(context.getFrameSize());
         if (jobEventListenerFactory != null) {
             spec.setJobletEventListenerFactory(jobEventListenerFactory);
         }
-        List<ILogicalOperator> rootOps = new ArrayList<ILogicalOperator>();
-        IHyracksJobBuilder builder = new JobBuilder(spec, context.getClusterLocations());
+        List<ILogicalOperator> rootOps = new ArrayList<>();
+        JobBuilder builder = new JobBuilder(spec, context.getClusterLocations());
         for (Mutable<ILogicalOperator> opRef : plan.getRoots()) {
             compileOpRef(opRef, spec, builder, outerPlanSchema);
             rootOps.add(opRef.getValue());
@@ -65,6 +76,9 @@
         spec.setConnectorPolicyAssignmentPolicy(new ConnectorPolicyAssignmentPolicy());
         // Do not do activity cluster planning because it is slow on large clusters
         spec.setUseConnectorPolicyForScheduling(false);
+        if (isNestedPlan) {
+            spec.setMetaOps(builder.getGeneratedMetaOps());
+        }
         return spec;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
index cfb3db1..cad62c4 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/AbstractRuleController.java
@@ -66,7 +66,7 @@
     }
 
     private String getPlanString(Mutable<ILogicalOperator> opRef) throws AlgebricksException {
-        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isLoggable(Level.FINE) && context != null) {
+        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isDebugEnabled() && context != null) {
             LogicalOperatorPrettyPrintVisitor pvisitor = context.getPrettyPrintVisitor();
             pvisitor.reset(new AlgebricksAppendable());
             PlanPrettyPrinter.printOperator((AbstractLogicalOperator) opRef.getValue(), pvisitor, 0);
@@ -77,10 +77,10 @@
 
     private void printRuleApplication(IAlgebraicRewriteRule rule, String beforePlan, String afterPlan)
             throws AlgebricksException {
-        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isLoggable(Level.FINE)) {
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> Rule " + rule.getClass() + " fired.\n");
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> Before plan\n" + beforePlan + "\n");
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> After plan\n" + afterPlan + "\n");
+        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isDebugEnabled()) {
+            AlgebricksConfig.ALGEBRICKS_LOGGER.debug(">>>> Rule " + rule.getClass() + " fired.\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.debug(">>>> Before plan\n" + beforePlan + "\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.debug(">>>> After plan\n" + afterPlan + "\n");
         }
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
index f1fdec6..4388032 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/rewriter/base/HeuristicOptimizer.java
@@ -19,7 +19,6 @@
 package org.apache.hyracks.algebricks.core.rewriter.base;
 
 import java.util.List;
-import java.util.logging.Level;
 
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -34,16 +33,17 @@
 import org.apache.hyracks.algebricks.core.algebra.prettyprint.LogicalOperatorPrettyPrintVisitor;
 import org.apache.hyracks.algebricks.core.algebra.prettyprint.PlanPrettyPrinter;
 import org.apache.hyracks.algebricks.core.config.AlgebricksConfig;
+import org.apache.logging.log4j.Level;
 
 public class HeuristicOptimizer {
 
-    public static PhysicalOperatorTag[] hyracksOperators = new PhysicalOperatorTag[] {
-            PhysicalOperatorTag.DATASOURCE_SCAN, PhysicalOperatorTag.BTREE_SEARCH,
-            PhysicalOperatorTag.EXTERNAL_GROUP_BY, PhysicalOperatorTag.HASH_GROUP_BY, PhysicalOperatorTag.HDFS_READER,
-            PhysicalOperatorTag.HYBRID_HASH_JOIN, PhysicalOperatorTag.IN_MEMORY_HASH_JOIN,
-            PhysicalOperatorTag.NESTED_LOOP, PhysicalOperatorTag.PRE_SORTED_DISTINCT_BY,
-            PhysicalOperatorTag.PRE_CLUSTERED_GROUP_BY, PhysicalOperatorTag.REPLICATE, PhysicalOperatorTag.STABLE_SORT,
-            PhysicalOperatorTag.UNION_ALL };
+    public static PhysicalOperatorTag[] hyracksOperators =
+            new PhysicalOperatorTag[] { PhysicalOperatorTag.DATASOURCE_SCAN, PhysicalOperatorTag.BTREE_SEARCH,
+                    PhysicalOperatorTag.EXTERNAL_GROUP_BY, PhysicalOperatorTag.HASH_GROUP_BY,
+                    PhysicalOperatorTag.HDFS_READER, PhysicalOperatorTag.HYBRID_HASH_JOIN,
+                    PhysicalOperatorTag.IN_MEMORY_HASH_JOIN, PhysicalOperatorTag.NESTED_LOOP,
+                    PhysicalOperatorTag.PRE_SORTED_DISTINCT_BY, PhysicalOperatorTag.PRE_CLUSTERED_GROUP_BY,
+                    PhysicalOperatorTag.REPLICATE, PhysicalOperatorTag.STABLE_SORT, PhysicalOperatorTag.UNION_ALL };
     public static PhysicalOperatorTag[] hyraxOperatorsBelowWhichJobGenIsDisabled = new PhysicalOperatorTag[] {};
 
     public static boolean isHyracksOp(PhysicalOperatorTag opTag) {
@@ -75,18 +75,18 @@
             return;
         }
         if (AlgebricksConfig.DEBUG) {
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine("Starting logical optimizations.\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.debug("Starting logical optimizations.\n");
         }
 
-        logPlanAt("Logical Plan", Level.FINE);
+        logPlanAt("Logical Plan", Level.DEBUG);
         runOptimizationSets(plan, logicalRewrites);
         computeSchemaBottomUpForPlan(plan);
         runPhysicalOptimizations(plan, physicalRewrites);
-        logPlanAt("Optimized Plan", Level.FINE);
+        logPlanAt("Optimized Plan", Level.DEBUG);
     }
 
     private void logPlanAt(String name, Level lvl) throws AlgebricksException {
-        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isLoggable(lvl)) {
+        if (AlgebricksConfig.ALGEBRICKS_LOGGER.isEnabled(lvl)) {
             final LogicalOperatorPrettyPrintVisitor pvisitor = context.getPrettyPrintVisitor();
             pvisitor.reset(new AlgebricksAppendable());
             PlanPrettyPrinter.printPlan(plan, pvisitor, 0);
@@ -127,7 +127,7 @@
             List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> physicalRewrites)
             throws AlgebricksException {
         if (AlgebricksConfig.DEBUG) {
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine("Starting physical optimizations.\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.debug("Starting physical optimizations.\n");
         }
         // PhysicalOptimizationsUtil.computeFDsAndEquivalenceClasses(plan);
         runOptimizationSets(plan, physicalRewrites);
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java
index 9c452bf..e782e4f 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatBuilder.java
@@ -79,7 +79,7 @@
 
     public class Node {
         private final StringValue nodeId;
-        private HashMap<String,AttributeValue> attributes = new HashMap<>();
+        private HashMap<String, AttributeValue> attributes = new HashMap<>();
 
         // no instantiation
         private Node(StringValue nodeId, StringValue nodeLabel) {
@@ -142,7 +142,7 @@
     public class Edge {
         private final Node source;
         private final Node destination;
-        private final HashMap<String,AttributeValue> attributes = new HashMap<>();
+        private final HashMap<String, AttributeValue> attributes = new HashMap<>();
 
         // no instantiation
         private Edge(Node source, Node destination) {
@@ -214,7 +214,7 @@
 
     public static final class StringValue extends AttributeValue {
         // no instantiation
-        private StringValue (String value) {
+        private StringValue(String value) {
             super(value);
         }
 
@@ -223,7 +223,8 @@
             if (value == null) {
                 newValue = "";
             }
-            return new StringValue("\"" + newValue.replace("\"","\'").trim() + "\"");
+            newValue = newValue.replace("\n", "\\n");
+            return new StringValue("\"" + newValue.replace("\"", "\'").trim() + "\"");
         }
     }
 
@@ -232,7 +233,7 @@
         public static final Color SKYBLUE = new Color("skyblue");
 
         // no instantiation
-        private Color (String color) {
+        private Color(String color) {
             super(color);
         }
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
index 392bf44..8ada0ac 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/DotFormatGenerator.java
@@ -56,8 +56,7 @@
      * @return DOT format
      */
     public static String generate(final JobActivityGraph jobActivityGraph) {
-        final DotFormatBuilder graphBuilder =
-                new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobActivityGraph"));
+        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobActivityGraph"));
         List<IConnectorDescriptor> connectors;
         IActivity activity;
         ActivityId fromActivityId;
@@ -154,11 +153,10 @@
      * @return DOT format
      */
     public static String generate(final JobSpecification jobSpecification) {
-        final DotFormatBuilder graphBuilder =
-                new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobSpecification"));
+        final DotFormatBuilder graphBuilder = new DotFormatBuilder(DotFormatBuilder.StringValue.of("JobSpecification"));
         final Map<ConnectorDescriptorId, IConnectorDescriptor> connectorMap = jobSpecification.getConnectorMap();
-        final Map<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>>
-                cOp = jobSpecification.getConnectorOperatorMap();
+        final Map<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> cOp =
+                jobSpecification.getConnectorOperatorMap();
         ConnectorDescriptorId connectorId;
         IConnectorDescriptor connector;
         IOperatorDescriptor leftOperator;
@@ -168,22 +166,24 @@
         String source;
         String destination;
         String edgeLabel;
-        for (Map.Entry<ConnectorDescriptorId,
-                Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> entry : cOp.entrySet()) {
+        for (Map.Entry<ConnectorDescriptorId, Pair<Pair<IOperatorDescriptor, Integer>, Pair<IOperatorDescriptor, Integer>>> entry : cOp
+                .entrySet()) {
             connectorId = entry.getKey();
             connector = connectorMap.get(connectorId);
             edgeLabel = connector.getClass().getName().substring(connector.getClass().getName().lastIndexOf(".") + 1);
             edgeLabel += "-" + connectorId;
             leftOperator = entry.getValue().getLeft().getLeft();
             rightOperator = entry.getValue().getRight().getLeft();
-            source = leftOperator.getClass().getName().substring(
-                    leftOperator.getClass().getName().lastIndexOf(".") + 1);
-            sourceNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(leftOperator.toString()),
-                    DotFormatBuilder.StringValue.of(leftOperator.toString() + "-" + source));
-            destination = rightOperator.getClass().getName().substring(
-                    rightOperator.getClass().getName().lastIndexOf(".") + 1);
-            destinationNode = graphBuilder.createNode(DotFormatBuilder.StringValue.of(rightOperator.toString()),
-                    DotFormatBuilder.StringValue.of(rightOperator.toString() + "-" + destination));
+            source = leftOperator.getClass().getName()
+                    .substring(leftOperator.getClass().getName().lastIndexOf(".") + 1);
+            sourceNode =
+                    graphBuilder.createNode(DotFormatBuilder.StringValue.of(leftOperator.getOperatorId().toString()),
+                            DotFormatBuilder.StringValue.of(leftOperator.toString() + "-" + source));
+            destination = rightOperator.getClass().getName()
+                    .substring(rightOperator.getClass().getName().lastIndexOf(".") + 1);
+            destinationNode =
+                    graphBuilder.createNode(DotFormatBuilder.StringValue.of(rightOperator.getOperatorId().toString()),
+                            DotFormatBuilder.StringValue.of(rightOperator.toString() + "-" + destination));
             graphBuilder.createEdge(sourceNode, destinationNode).setLabel(DotFormatBuilder.StringValue.of(edgeLabel));
         }
 
@@ -207,17 +207,16 @@
     }
 
     public static void generateNode(DotFormatBuilder dotBuilder, ILogicalOperator op,
-            LogicalOperatorDotVisitor dotVisitor, Set<ILogicalOperator> operatorsVisited)
-            throws AlgebricksException {
+            LogicalOperatorDotVisitor dotVisitor, Set<ILogicalOperator> operatorsVisited) throws AlgebricksException {
         DotFormatBuilder.StringValue destinationNodeLabel = formatStringOf(op, dotVisitor);
-        DotFormatBuilder.Node destinationNode = dotBuilder.createNode(DotFormatBuilder.StringValue.of(
-                Integer.toString(op.hashCode())), destinationNodeLabel);
+        DotFormatBuilder.Node destinationNode = dotBuilder
+                .createNode(DotFormatBuilder.StringValue.of(Integer.toString(op.hashCode())), destinationNodeLabel);
         DotFormatBuilder.StringValue sourceNodeLabel;
         DotFormatBuilder.Node sourceNode;
         for (Mutable<ILogicalOperator> child : op.getInputs()) {
             sourceNodeLabel = formatStringOf(child.getValue(), dotVisitor);
-            sourceNode = dotBuilder.createNode(DotFormatBuilder.StringValue.of(
-                    Integer.toString(child.getValue().hashCode())), sourceNodeLabel);
+            sourceNode = dotBuilder.createNode(
+                    DotFormatBuilder.StringValue.of(Integer.toString(child.getValue().hashCode())), sourceNodeLabel);
             dotBuilder.createEdge(sourceNode, destinationNode);
             if (!operatorsVisited.contains(child.getValue())) {
                 generateNode(dotBuilder, child.getValue(), dotVisitor, operatorsVisited);
@@ -228,10 +227,9 @@
             for (ILogicalPlan nestedPlan : ((AbstractOperatorWithNestedPlans) op).getNestedPlans()) {
                 nestedOperator = nestedPlan.getRoots().get(0).getValue();
                 sourceNodeLabel = formatStringOf(nestedOperator, dotVisitor);
-                sourceNode = dotBuilder.createNode(DotFormatBuilder.StringValue.of(
-                        Integer.toString(nestedOperator.hashCode())), sourceNodeLabel);
-                dotBuilder.createEdge(sourceNode, destinationNode).
-                        setLabel(DotFormatBuilder.StringValue.of("subplan"));
+                sourceNode = dotBuilder.createNode(
+                        DotFormatBuilder.StringValue.of(Integer.toString(nestedOperator.hashCode())), sourceNodeLabel);
+                dotBuilder.createEdge(sourceNode, destinationNode).setLabel(DotFormatBuilder.StringValue.of("subplan"));
                 if (!operatorsVisited.contains(nestedOperator)) {
                     generateNode(dotBuilder, nestedOperator, dotVisitor, operatorsVisited);
                 }
@@ -249,8 +247,9 @@
             for (int i = 0; i < replicateOperator.getOutputs().size(); i++) {
                 replicateOutput = replicateOperator.getOutputs().get(i).getValue();
                 destinationNodeLabel = formatStringOf(replicateOutput, dotVisitor);
-                destinationNode = dotBuilder.createNode(DotFormatBuilder.StringValue.of(
-                        Integer.toString(replicateOutput.hashCode())), destinationNodeLabel);
+                destinationNode = dotBuilder.createNode(
+                        DotFormatBuilder.StringValue.of(Integer.toString(replicateOutput.hashCode())),
+                        destinationNodeLabel);
                 if (replicateOperator.getOutputMaterializationFlags()[i]) {
                     dotBuilder.createEdge(sourceNode, destinationNode).setColor(DotFormatBuilder.Color.RED);
                 } else {
@@ -265,7 +264,7 @@
     private static DotFormatBuilder.StringValue formatStringOf(ILogicalOperator operator,
             LogicalOperatorDotVisitor dotVisitor) throws AlgebricksException {
         String formattedString = operator.accept(dotVisitor, null).trim();
-        IPhysicalOperator physicalOperator = ((AbstractLogicalOperator)operator).getPhysicalOperator();
+        IPhysicalOperator physicalOperator = ((AbstractLogicalOperator) operator).getPhysicalOperator();
         if (physicalOperator != null) {
             formattedString += "\\n" + physicalOperator.toString().trim() + " |" + operator.getExecutionMode() + "|";
         } else {
diff --git a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
index a54ff63..4649d6d 100644
--- a/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-core/src/main/java/org/apache/hyracks/algebricks/core/utils/LogicalOperatorDotVisitor.java
@@ -350,7 +350,7 @@
     @Override
     public String visitScriptOperator(ScriptOperator op, Void noArgs) throws AlgebricksException {
         stringBuilder.setLength(0);
-        stringBuilder.append("script (in: ").append(op.getInputVariables()).append(") (out: " )
+        stringBuilder.append("script (in: ").append(op.getInputVariables()).append(") (out: ")
                 .append(op.getOutputVariables()).append(")");
         return stringBuilder.toString();
     }
diff --git a/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/IBinaryHashFunctionFamilyProvider.java b/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/IBinaryHashFunctionFamilyProvider.java
index 0992489..93dd3d5 100644
--- a/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/IBinaryHashFunctionFamilyProvider.java
+++ b/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/IBinaryHashFunctionFamilyProvider.java
@@ -24,6 +24,5 @@
 
 public interface IBinaryHashFunctionFamilyProvider {
 
-    public IBinaryHashFunctionFamily getBinaryHashFunctionFamily(Object type)
-            throws AlgebricksException;
+    public IBinaryHashFunctionFamily getBinaryHashFunctionFamily(Object type) throws AlgebricksException;
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/utils/WriteValueTools.java b/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/utils/WriteValueTools.java
index 97e7d95..ba27c4e 100644
--- a/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/utils/WriteValueTools.java
+++ b/hyracks-fullstack/algebricks/algebricks-data/src/main/java/org/apache/hyracks/algebricks/data/utils/WriteValueTools.java
@@ -26,10 +26,10 @@
 
 public final class WriteValueTools {
 
-    private final static int[] INT_INTERVALS = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999,
-            Integer.MAX_VALUE };
-    private final static int[] INT_DIVIDERS = { 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,
-            1000000000 };
+    private final static int[] INT_INTERVALS =
+            { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
+    private final static int[] INT_DIVIDERS =
+            { 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
     private final static int[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
 
     public static void writeInt(int i, OutputStream os) throws IOException {
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/pom.xml b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/pom.xml
deleted file mode 100644
index cd2810e..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/pom.xml
+++ /dev/null
@@ -1,169 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>piglet-example</artifactId>
-  <name>piglet-example</name>
-  <parent>
-    <groupId>org.apache.hyracks</groupId>
-    <artifactId>algebricks-examples</artifactId>
-    <version>0.3.4-SNAPSHOT</version>
-  </parent>
-
-  <properties>
-    <root.dir>${basedir}/../../..</root.dir>
-  </properties>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>javacc-maven-plugin</artifactId>
-        <version>2.6</version>
-        <executions>
-          <execution>
-            <id>javacc</id>
-            <goals>
-              <goal>javacc</goal>
-            </goals>
-            <configuration>
-              <isStatic>false</isStatic>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>add-source</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>add-source</goal>
-            </goals>
-            <configuration>
-              <sources>
-                <source>${project.build.directory}/generated-sources/javacc/</source>
-              </sources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-    <pluginManagement>
-      <plugins>
-        <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
-        <plugin>
-          <groupId>org.eclipse.m2e</groupId>
-          <artifactId>lifecycle-mapping</artifactId>
-          <version>1.0.0</version>
-          <configuration>
-            <lifecycleMappingMetadata>
-              <pluginExecutions>
-                <pluginExecution>
-                  <pluginExecutionFilter>
-                    <groupId>
-                      org.codehaus.mojo
-                    </groupId>
-                    <artifactId>
-                      javacc-maven-plugin
-                    </artifactId>
-                    <versionRange>
-                      [2.6,)
-                    </versionRange>
-                    <goals>
-                      <goal>javacc</goal>
-                    </goals>
-                  </pluginExecutionFilter>
-                  <action>
-                    <ignore />
-                  </action>
-                </pluginExecution>
-              </pluginExecutions>
-            </lifecycleMappingMetadata>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-  <dependencies>
-    <dependency>
-      <!-- Dependency management inherited from top-level hyracks -->
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-compiler</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-util</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-dataflow-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-rewriter</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-runtime</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-data</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-dataflow-std</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>hyracks-data-std</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ASTNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ASTNode.java
deleted file mode 100644
index c303e99..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ASTNode.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public abstract class ASTNode {
-    public enum Tag {
-        ASSIGNMENT,
-        DUMP,
-        LOAD,
-        FILTER,
-
-        SCALAR_FUNCTION,
-        LITERAL,
-        FIELD_ACCESS,
-    }
-
-    public abstract Tag getTag();
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/AssignmentNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/AssignmentNode.java
deleted file mode 100644
index 8a99cb8..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/AssignmentNode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public class AssignmentNode extends ASTNode {
-    private String alias;
-
-    private RelationNode relation;
-
-    public AssignmentNode(String alias, RelationNode relation) {
-        this.alias = alias;
-        this.relation = relation;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.ASSIGNMENT;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public RelationNode getRelation() {
-        return relation;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/DumpNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/DumpNode.java
deleted file mode 100644
index 66a229c..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/DumpNode.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public class DumpNode extends RelationNode {
-    private final String file;
-    private final String alias;
-
-    public DumpNode(String file, String alias) {
-        this.file = file;
-        this.alias = alias;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.DUMP;
-    }
-
-    public String getFile() {
-        return file;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ExpressionNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ExpressionNode.java
deleted file mode 100644
index 4470cd9..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ExpressionNode.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public abstract class ExpressionNode extends ASTNode {
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FieldAccessExpressionNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FieldAccessExpressionNode.java
deleted file mode 100644
index cfd9bdd..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FieldAccessExpressionNode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public class FieldAccessExpressionNode extends ExpressionNode {
-    private String relationName;
-
-    private String fieldName;
-
-    public FieldAccessExpressionNode(String relationName, String fieldName) {
-        this.relationName = relationName;
-        this.fieldName = fieldName;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.FIELD_ACCESS;
-    }
-
-    public String getRelationName() {
-        return relationName;
-    }
-
-    public String getFieldName() {
-        return fieldName;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FilterNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FilterNode.java
deleted file mode 100644
index b77a6a9..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FilterNode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public class FilterNode extends RelationNode {
-    private String alias;
-
-    private ExpressionNode expression;
-
-    public FilterNode(String alias, ExpressionNode expression) {
-        this.alias = alias;
-        this.expression = expression;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.FILTER;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public ExpressionNode getExpression() {
-        return expression;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FunctionTag.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FunctionTag.java
deleted file mode 100644
index b63af9c..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/FunctionTag.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public enum FunctionTag {
-    BOOLEAN_AND,
-    BOOLEAN_OR,
-    BOOLEAN_NOT,
-
-    EQ,
-    NEQ,
-    LT,
-    LTE,
-    GT,
-    GTE,
-
-    ADD,
-    SUBTRACT,
-    MULTIPLY,
-    DIVIDE,
-    MOD,
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LiteralExpressionNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LiteralExpressionNode.java
deleted file mode 100644
index d039145..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LiteralExpressionNode.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-
-public class LiteralExpressionNode extends ExpressionNode {
-    private String image;
-
-    private Type type;
-
-    public LiteralExpressionNode(String image, Type type) {
-        this.image = image;
-        this.type = type;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.LITERAL;
-    }
-
-    public String getImage() {
-        return image;
-    }
-
-    public Type getType() {
-        return type;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LoadNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LoadNode.java
deleted file mode 100644
index 6be1d9f..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/LoadNode.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-import org.apache.hyracks.algebricks.examples.piglet.types.Schema;
-
-public class LoadNode extends RelationNode {
-    private String dataFile;
-
-    private Schema schema;
-
-    public LoadNode(String dataFile, Schema schema) {
-        this.dataFile = dataFile;
-        this.schema = schema;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.LOAD;
-    }
-
-    public String getDataFile() {
-        return dataFile;
-    }
-
-    public Schema getSchema() {
-        return schema;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/RelationNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/RelationNode.java
deleted file mode 100644
index f36da51..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/RelationNode.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-public abstract class RelationNode extends ASTNode {
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ScalarFunctionExpressionNode.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ScalarFunctionExpressionNode.java
deleted file mode 100644
index e1dea89..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/ast/ScalarFunctionExpressionNode.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.ast;
-
-import java.util.List;
-
-public class ScalarFunctionExpressionNode extends ExpressionNode {
-    private FunctionTag fTag;
-
-    private String fName;
-
-    private List<ASTNode> arguments;
-
-    public ScalarFunctionExpressionNode(FunctionTag fTag, String fName, List<ASTNode> arguments) {
-        this.fTag = fTag;
-        this.fName = fName;
-        this.arguments = arguments;
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.SCALAR_FUNCTION;
-    }
-
-    public FunctionTag getFunctionTag() {
-        return fTag;
-    }
-
-    public String getFunctionName() {
-        return fName;
-    }
-
-    public List<ASTNode> getArguments() {
-        return arguments;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/ConstantValue.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/ConstantValue.java
deleted file mode 100644
index 90d5b83..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/ConstantValue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.compiler;
-
-import org.apache.hyracks.algebricks.core.algebra.expressions.IAlgebricksConstantValue;
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-
-public final class ConstantValue implements IAlgebricksConstantValue {
-    private final Type type;
-
-    private final String image;
-
-    public ConstantValue(Type type, String image) {
-        this.type = type;
-        this.image = image;
-    }
-
-    public Type getType() {
-        return type;
-    }
-
-    public String getImage() {
-        return image;
-    }
-
-    @Override
-    public boolean isFalse() {
-        return false;
-    }
-
-    @Override
-    public boolean isMissing() {
-        return false;
-    }
-
-    @Override
-    public boolean isNull() {
-        return false;
-    }
-
-    @Override
-    public boolean isTrue() {
-        return false;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletCompiler.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletCompiler.java
deleted file mode 100644
index c8b6e59..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletCompiler.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.compiler;
-
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.commons.lang3.mutable.Mutable;
-import org.apache.commons.lang3.mutable.MutableObject;
-import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.compiler.api.HeuristicCompilerFactoryBuilder;
-import org.apache.hyracks.algebricks.compiler.api.ICompiler;
-import org.apache.hyracks.algebricks.compiler.api.ICompilerFactory;
-import org.apache.hyracks.algebricks.compiler.rewriter.rulecontrollers.SequentialFixpointRuleController;
-import org.apache.hyracks.algebricks.compiler.rewriter.rulecontrollers.SequentialOnceRuleController;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalOperator;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalPlan;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IExpressionTypeComputer;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ExpressionRuntimeProvider;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
-import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
-import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.AssignOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.DataSourceScanOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.EmptyTupleSourceOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.WriteOperator;
-import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl;
-import org.apache.hyracks.algebricks.core.algebra.prettyprint.AlgebricksAppendable;
-import org.apache.hyracks.algebricks.core.algebra.prettyprint.LogicalOperatorPrettyPrintVisitor;
-import org.apache.hyracks.algebricks.core.algebra.prettyprint.PlanPrettyPrinter;
-import org.apache.hyracks.algebricks.core.rewriter.base.AbstractRuleController;
-import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
-import org.apache.hyracks.algebricks.data.ISerializerDeserializerProvider;
-import org.apache.hyracks.algebricks.data.ITypeTraitProvider;
-import org.apache.hyracks.algebricks.examples.piglet.ast.ASTNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.AssignmentNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.DumpNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.ExpressionNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.FieldAccessExpressionNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.FilterNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.FunctionTag;
-import org.apache.hyracks.algebricks.examples.piglet.ast.LiteralExpressionNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.LoadNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.RelationNode;
-import org.apache.hyracks.algebricks.examples.piglet.ast.ScalarFunctionExpressionNode;
-import org.apache.hyracks.algebricks.examples.piglet.exceptions.PigletException;
-import org.apache.hyracks.algebricks.examples.piglet.metadata.PigletFileDataSink;
-import org.apache.hyracks.algebricks.examples.piglet.metadata.PigletFileDataSource;
-import org.apache.hyracks.algebricks.examples.piglet.metadata.PigletMetadataProvider;
-import org.apache.hyracks.algebricks.examples.piglet.parser.ParseException;
-import org.apache.hyracks.algebricks.examples.piglet.parser.PigletParser;
-import org.apache.hyracks.algebricks.examples.piglet.rewriter.PigletRewriteRuleset;
-import org.apache.hyracks.algebricks.examples.piglet.runtime.PigletExpressionJobGen;
-import org.apache.hyracks.algebricks.examples.piglet.types.Schema;
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.dataflow.value.ITypeTraits;
-import org.apache.hyracks.api.job.JobSpecification;
-
-public class PigletCompiler {
-    private static final Logger LOGGER = Logger.getLogger(PigletCompiler.class.getName());
-
-    private static List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> buildDefaultLogicalRewrites() {
-        List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> defaultLogicalRewrites = new ArrayList<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>>();
-        SequentialFixpointRuleController seqCtrlNoDfs = new SequentialFixpointRuleController(false);
-        SequentialFixpointRuleController seqCtrlFullDfs = new SequentialFixpointRuleController(true);
-        SequentialOnceRuleController seqOnceCtrl = new SequentialOnceRuleController(true);
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqOnceCtrl,
-                PigletRewriteRuleset.buildTypeInferenceRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqCtrlFullDfs,
-                PigletRewriteRuleset.buildNormalizationRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqCtrlNoDfs,
-                PigletRewriteRuleset.buildCondPushDownRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqCtrlNoDfs,
-                PigletRewriteRuleset.buildJoinInferenceRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqCtrlNoDfs,
-                PigletRewriteRuleset.buildOpPushDownRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqOnceCtrl,
-                PigletRewriteRuleset.buildDataExchangeRuleCollection()));
-        defaultLogicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqCtrlNoDfs,
-                PigletRewriteRuleset.buildConsolidationRuleCollection()));
-        return defaultLogicalRewrites;
-    }
-
-    private static List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> buildDefaultPhysicalRewrites() {
-        List<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>> defaultPhysicalRewrites = new ArrayList<Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>>();
-        SequentialOnceRuleController seqOnceCtrlAllLevels = new SequentialOnceRuleController(true);
-        SequentialOnceRuleController seqOnceCtrlTopLevel = new SequentialOnceRuleController(false);
-        defaultPhysicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqOnceCtrlAllLevels,
-                PigletRewriteRuleset.buildPhysicalRewritesAllLevelsRuleCollection()));
-        defaultPhysicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqOnceCtrlTopLevel,
-                PigletRewriteRuleset.buildPhysicalRewritesTopLevelRuleCollection()));
-        defaultPhysicalRewrites.add(new Pair<AbstractRuleController, List<IAlgebraicRewriteRule>>(seqOnceCtrlAllLevels,
-                PigletRewriteRuleset.prepareForJobGenRuleCollection()));
-        return defaultPhysicalRewrites;
-    }
-
-    private final ICompilerFactory cFactory;
-
-    private final PigletMetadataProvider metadataProvider;
-
-    private int varCounter;
-
-    private ILogicalOperator previousOp;
-
-    public PigletCompiler() {
-        HeuristicCompilerFactoryBuilder builder = new HeuristicCompilerFactoryBuilder();
-        builder.setLogicalRewrites(buildDefaultLogicalRewrites());
-        builder.setPhysicalRewrites(buildDefaultPhysicalRewrites());
-        builder.setSerializerDeserializerProvider(new ISerializerDeserializerProvider() {
-            @SuppressWarnings("unchecked")
-            @Override
-            public ISerializerDeserializer getSerializerDeserializer(Object type) throws AlgebricksException {
-                return null;
-            }
-        });
-        builder.setTypeTraitProvider(new ITypeTraitProvider() {
-            @Override
-            public ITypeTraits getTypeTrait(Object type) {
-                return null;
-            }
-        });
-        builder.setPrinterProvider(PigletPrinterFactoryProvider.INSTANCE);
-        builder.setExpressionRuntimeProvider(
-                new ExpressionRuntimeProvider(new PigletExpressionJobGen()));
-        builder.setExpressionTypeComputer(new IExpressionTypeComputer() {
-            @Override
-            public Object getType(ILogicalExpression expr, IMetadataProvider<?, ?> metadataProvider,
-                    IVariableTypeEnvironment env) throws AlgebricksException {
-                return null;
-            }
-        });
-        builder.setClusterLocations(new AlgebricksAbsolutePartitionConstraint(new String[] { "nc1", "nc2" }));
-        cFactory = builder.create();
-        metadataProvider = new PigletMetadataProvider();
-    }
-
-    public List<ASTNode> parse(Reader in) throws ParseException {
-        PigletParser parser = new PigletParser(in);
-        List<ASTNode> statements = parser.Statements();
-        return statements;
-    }
-
-    public JobSpecification compile(List<ASTNode> ast) throws AlgebricksException, PigletException {
-        ILogicalPlan plan = translate(ast);
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Translated Plan:");
-            LOGGER.info(getPrettyPrintedPlan(plan));
-        }
-        ICompiler compiler = cFactory.createCompiler(plan, metadataProvider, varCounter);
-        compiler.optimize();
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Optimized Plan:");
-            LOGGER.info(getPrettyPrintedPlan(plan));
-        }
-        return compiler.createJob(null, null);
-    }
-
-    private ILogicalPlan translate(List<ASTNode> ast) throws PigletException {
-        Map<String, Relation> symMap = new HashMap<String, Relation>();
-        List<Mutable<ILogicalOperator>> roots = new ArrayList<Mutable<ILogicalOperator>>();
-        previousOp = null;
-        for (ASTNode an : ast) {
-            switch (an.getTag()) {
-                case DUMP: {
-                    DumpNode dn = (DumpNode) an;
-                    Relation input = symMap.get(dn.getAlias());
-                    List<Mutable<ILogicalExpression>> expressions = new ArrayList<Mutable<ILogicalExpression>>();
-                    for (LogicalVariable v : input.schema.values()) {
-                        expressions.add(new MutableObject<ILogicalExpression>(new VariableReferenceExpression(v)));
-                    }
-                    PigletFileDataSink dataSink = new PigletFileDataSink(dn.getFile());
-                    ILogicalOperator op = new WriteOperator(expressions, dataSink);
-                    op.getInputs().add(new MutableObject<ILogicalOperator>(input.op));
-                    roots.add(new MutableObject<ILogicalOperator>(op));
-                }
-                    break;
-
-                case ASSIGNMENT: {
-                    AssignmentNode asn = (AssignmentNode) an;
-                    String alias = asn.getAlias();
-                    RelationNode rn = asn.getRelation();
-                    Relation rel = translate(rn, symMap);
-                    previousOp = rel.op;
-                    rel.alias = alias;
-                    symMap.put(alias, rel);
-                }
-                    break;
-            }
-        }
-        return new ALogicalPlanImpl(roots);
-    }
-
-    private Relation translate(RelationNode rn, Map<String, Relation> symMap) throws PigletException {
-        switch (rn.getTag()) {
-            case LOAD: {
-                LoadNode ln = (LoadNode) rn;
-                String file = ln.getDataFile();
-                Schema schema = ln.getSchema();
-                List<Pair<String, Type>> fieldsSchema = schema.getSchema();
-                List<LogicalVariable> variables = new ArrayList<LogicalVariable>();
-                List<Object> types = new ArrayList<Object>();
-                Relation rel = new Relation();
-                for (Pair<String, Type> p : fieldsSchema) {
-                    LogicalVariable v = newVariable();
-                    rel.schema.put(p.first, v);
-                    variables.add(v);
-                    types.add(p.second);
-                }
-                PigletFileDataSource ds = new PigletFileDataSource(file, types.toArray());
-                rel.op = new DataSourceScanOperator(variables, ds);
-                rel.op.getInputs().add(new MutableObject<ILogicalOperator>(
-                        previousOp == null ? new EmptyTupleSourceOperator() : previousOp));
-                return rel;
-            }
-
-            case FILTER: {
-                FilterNode fn = (FilterNode) rn;
-                String alias = fn.getAlias();
-                ExpressionNode conditionNode = fn.getExpression();
-                Relation inputRel = findInputRelation(alias, symMap);
-                Pair<Relation, LogicalVariable> tempInput = translateScalarExpression(inputRel, conditionNode);
-                Relation rel = new Relation();
-                rel.op = new SelectOperator(
-                        new MutableObject<ILogicalExpression>(new VariableReferenceExpression(tempInput.second)), false,
-                        null);
-                rel.op.getInputs().add(new MutableObject<ILogicalOperator>(tempInput.first.op));
-                rel.schema.putAll(tempInput.first.schema);
-                return rel;
-            }
-        }
-        throw new IllegalArgumentException("Unknown node: " + rn.getTag() + " encountered");
-    }
-
-    private Pair<Relation, LogicalVariable> translateScalarExpression(Relation inputRel, ExpressionNode expressionNode)
-            throws PigletException {
-        switch (expressionNode.getTag()) {
-            case FIELD_ACCESS: {
-                FieldAccessExpressionNode faen = (FieldAccessExpressionNode) expressionNode;
-                String fieldName = faen.getFieldName();
-                LogicalVariable lVar = findField(fieldName, inputRel.schema);
-                return new Pair<Relation, LogicalVariable>(inputRel, lVar);
-            }
-
-            case LITERAL: {
-                LiteralExpressionNode len = (LiteralExpressionNode) expressionNode;
-                String image = len.getImage();
-                Type type = len.getType();
-                ConstantExpression ce = new ConstantExpression(new ConstantValue(type, image));
-                Relation rel = new Relation();
-                LogicalVariable var = newVariable();
-                List<LogicalVariable> vars = new ArrayList<LogicalVariable>();
-                vars.add(var);
-
-                List<Mutable<ILogicalExpression>> exprs = new ArrayList<Mutable<ILogicalExpression>>();
-                exprs.add(new MutableObject<ILogicalExpression>(ce));
-
-                rel.op = new AssignOperator(vars, exprs);
-                rel.op.getInputs().add(new MutableObject<ILogicalOperator>(inputRel.op));
-                rel.schema.putAll(inputRel.schema);
-
-                return new Pair<Relation, LogicalVariable>(rel, var);
-            }
-
-            case SCALAR_FUNCTION: {
-                ScalarFunctionExpressionNode sfen = (ScalarFunctionExpressionNode) expressionNode;
-                List<Mutable<ILogicalExpression>> argExprs = new ArrayList<Mutable<ILogicalExpression>>();
-                List<ASTNode> arguments = sfen.getArguments();
-                Relation rel = inputRel;
-                for (ASTNode a : arguments) {
-                    Pair<Relation, LogicalVariable> argPair = translateScalarExpression(rel, (ExpressionNode) a);
-                    rel = argPair.first;
-                    argExprs.add(
-                            new MutableObject<ILogicalExpression>(new VariableReferenceExpression(argPair.second)));
-                }
-                Relation outRel = new Relation();
-                outRel.schema.putAll(rel.schema);
-                LogicalVariable var = newVariable();
-                List<LogicalVariable> vars = new ArrayList<LogicalVariable>();
-                vars.add(var);
-
-                IFunctionInfo fInfo = lookupFunction(sfen.getFunctionTag(), sfen.getFunctionName());
-
-                List<Mutable<ILogicalExpression>> exprs = new ArrayList<Mutable<ILogicalExpression>>();
-                exprs.add(new MutableObject<ILogicalExpression>(new ScalarFunctionCallExpression(fInfo, argExprs)));
-                outRel.op = new AssignOperator(vars, exprs);
-                outRel.op.getInputs().add(new MutableObject<ILogicalOperator>(rel.op));
-                return new Pair<Relation, LogicalVariable>(outRel, var);
-            }
-        }
-        return null;
-    }
-
-    private IFunctionInfo lookupFunction(FunctionTag functionTag, String functionName) throws PigletException {
-        switch (functionTag) {
-            case EQ:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.EQ);
-
-            case NEQ:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.NEQ);
-
-            case LT:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.LT);
-
-            case LTE:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.LE);
-
-            case GT:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.GT);
-
-            case GTE:
-                return metadataProvider.lookupFunction(AlgebricksBuiltinFunctions.GE);
-        }
-        throw new PigletException("Unsupported function: " + functionTag);
-    }
-
-    private LogicalVariable newVariable() {
-        return new LogicalVariable(varCounter++);
-    }
-
-    private LogicalVariable findField(String fieldName, Map<String, LogicalVariable> schema) throws PigletException {
-        LogicalVariable var = schema.get(fieldName);
-        if (var == null) {
-            throw new PigletException("Unable to find field named: " + fieldName);
-        }
-        return var;
-    }
-
-    private Relation findInputRelation(String alias, Map<String, Relation> symMap) throws PigletException {
-        Relation rel = symMap.get(alias);
-        if (rel == null) {
-            throw new PigletException("Unknown alias " + alias + "referenced");
-        }
-        return rel;
-    }
-
-    private static class Relation {
-        String alias;
-        ILogicalOperator op;
-        final Map<String, LogicalVariable> schema;
-
-        public Relation() {
-            schema = new LinkedHashMap<String, LogicalVariable>();
-        }
-    }
-
-    private String getPrettyPrintedPlan(ILogicalPlan plan) throws AlgebricksException {
-        LogicalOperatorPrettyPrintVisitor v = new LogicalOperatorPrettyPrintVisitor();
-        PlanPrettyPrinter.printPlan(plan, v, 0);
-        return v.get().toString();
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletPrinterFactoryProvider.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletPrinterFactoryProvider.java
deleted file mode 100644
index 135a9a7..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/compiler/PigletPrinterFactoryProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.compiler;
-
-import java.io.IOException;
-import java.io.PrintStream;
-
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.data.IPrinter;
-import org.apache.hyracks.algebricks.data.IPrinterFactory;
-import org.apache.hyracks.algebricks.data.IPrinterFactoryProvider;
-import org.apache.hyracks.algebricks.data.impl.IntegerPrinterFactory;
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.primitive.FloatPointable;
-import org.apache.hyracks.util.string.UTF8StringUtil;
-
-public class PigletPrinterFactoryProvider implements IPrinterFactoryProvider {
-
-    public static final PigletPrinterFactoryProvider INSTANCE = new PigletPrinterFactoryProvider();
-
-    private PigletPrinterFactoryProvider() {
-    }
-
-    @Override
-    public IPrinterFactory getPrinterFactory(Object type) {
-        Type t = (Type) type;
-        switch (t.getTag()) {
-            case INTEGER:
-                return IntegerPrinterFactory.INSTANCE;
-            case CHAR_ARRAY:
-                return CharArrayPrinterFactory.INSTANCE;
-            case FLOAT:
-                return FloatPrinterFactory.INSTANCE;
-            default:
-                throw new UnsupportedOperationException();
-
-        }
-    }
-
-    public static class CharArrayPrinterFactory implements IPrinterFactory {
-
-        private static final long serialVersionUID = 1L;
-
-        public static final CharArrayPrinterFactory INSTANCE = new CharArrayPrinterFactory();
-
-        private CharArrayPrinterFactory() {
-        }
-
-        @Override
-        public IPrinter createPrinter() {
-            return new IPrinter() {
-                @Override
-                public void init() {
-                }
-
-                @Override
-                public void print(byte[] b, int s, int l, PrintStream ps) throws HyracksDataException {
-                    try {
-                        UTF8StringUtil.printUTF8StringWithQuotes(b, s, l, ps);
-                    } catch (IOException e) {
-                        throw new HyracksDataException(e);
-                    }
-                }
-            };
-        }
-    }
-
-    public static class FloatPrinterFactory implements IPrinterFactory {
-
-        private static final long serialVersionUID = 1L;
-
-        public static final FloatPrinterFactory INSTANCE = new FloatPrinterFactory();
-
-        private FloatPrinterFactory() {
-        }
-
-        @Override
-        public IPrinter createPrinter() {
-            return new IPrinter() {
-                @Override
-                public void init() throws HyracksDataException {
-                }
-
-                @Override
-                public void print(byte[] b, int s, int l, PrintStream ps) throws HyracksDataException {
-                    ps.print(FloatPointable.getFloat(b, s));
-                }
-            };
-        }
-    }
-
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/exceptions/PigletException.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/exceptions/PigletException.java
deleted file mode 100644
index 67f9d5b..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/exceptions/PigletException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.exceptions;
-
-public class PigletException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    public PigletException(String message) {
-        super(message);
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/FileSplitUtils.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/FileSplitUtils.java
deleted file mode 100644
index 5d9576f..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/FileSplitUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.metadata;
-
-import java.io.File;
-
-import org.apache.hyracks.api.io.FileSplit;
-import org.apache.hyracks.api.io.UnmanagedFileSplit;
-
-public class FileSplitUtils {
-    public static FileSplit[] parseFileSplits(String fileSplits) {
-        String[] splits = fileSplits.split(",");
-        FileSplit[] fSplits = new FileSplit[splits.length];
-        for (int i = 0; i < splits.length; ++i) {
-            String s = splits[i].trim();
-            int idx = s.indexOf(':');
-            if (idx < 0) {
-                throw new IllegalArgumentException("File split " + s + " not well formed");
-            }
-            fSplits[i] = new UnmanagedFileSplit(s.substring(0, idx), new File(s.substring(idx + 1)).getAbsolutePath());
-        }
-        return fSplits;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSink.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSink.java
deleted file mode 100644
index d0d94ac..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSink.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.metadata;
-
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSink;
-import org.apache.hyracks.algebricks.core.algebra.properties.FileSplitDomain;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty;
-import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty;
-import org.apache.hyracks.api.io.FileSplit;
-
-public class PigletFileDataSink implements IDataSink {
-    private String file;
-
-    private FileSplit[] fileSplits;
-
-    private IPartitioningProperty partProp;
-
-    public PigletFileDataSink(String file) {
-        this.file = file;
-        fileSplits = FileSplitUtils.parseFileSplits(file);
-        partProp = new RandomPartitioningProperty(new FileSplitDomain(fileSplits));
-    }
-
-    @Override
-    public Object getId() {
-        return file;
-    }
-
-    public FileSplit[] getFileSplits() {
-        return fileSplits;
-    }
-
-    @Override
-    public Object[] getSchemaTypes() {
-        return null;
-    }
-
-    @Override
-    public IPartitioningProperty getPartitioningProperty() {
-        return partProp;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSource.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSource.java
deleted file mode 100644
index 6a675fc..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFileDataSource.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.metadata;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSource;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSourcePropertiesProvider;
-import org.apache.hyracks.algebricks.core.algebra.properties.FileSplitDomain;
-import org.apache.hyracks.algebricks.core.algebra.properties.FunctionalDependency;
-import org.apache.hyracks.algebricks.core.algebra.properties.ILocalStructuralProperty;
-import org.apache.hyracks.algebricks.core.algebra.properties.INodeDomain;
-import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector;
-import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty;
-import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector;
-import org.apache.hyracks.api.io.FileSplit;
-
-public class PigletFileDataSource implements IDataSource<String> {
-    private final String file;
-
-    private final Object[] types;
-
-    private final FileSplit[] fileSplits;
-
-    private IDataSourcePropertiesProvider propProvider;
-
-    public PigletFileDataSource(String file, Object[] types) {
-        this.file = file;
-        this.types = types;
-        fileSplits = FileSplitUtils.parseFileSplits(file);
-        final IPhysicalPropertiesVector vec = new StructuralPropertiesVector(new RandomPartitioningProperty(
-                new FileSplitDomain(fileSplits)), new ArrayList<ILocalStructuralProperty>());
-        propProvider = new IDataSourcePropertiesProvider() {
-            @Override
-            public IPhysicalPropertiesVector computePropertiesVector(List<LogicalVariable> scanVariables) {
-                return vec;
-            }
-        };
-
-    }
-
-    @Override
-    public INodeDomain getDomain() {
-        return new FileSplitDomain(fileSplits);
-    }
-
-    @Override
-    public String getId() {
-        return file;
-    }
-
-    @Override
-    public Object[] getSchemaTypes() {
-        return types;
-    }
-
-    public FileSplit[] getFileSplits() {
-        return fileSplits;
-    }
-
-    @Override
-    public IDataSourcePropertiesProvider getPropertiesProvider() {
-        return propProvider;
-    }
-
-    @Override
-    public void computeFDs(List<LogicalVariable> scanVariables, List<FunctionalDependency> fdList) {
-    }
-
-    @Override
-    public boolean isScanAccessPathALeaf() {
-        return true;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java
deleted file mode 100644
index 06d9b25..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletFunction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.metadata;
-
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
-
-public class PigletFunction implements IFunctionInfo {
-    private final FunctionIdentifier fid;
-
-    public PigletFunction(FunctionIdentifier fid) {
-        this.fid = fid;
-    }
-
-    @Override
-    public FunctionIdentifier getFunctionIdentifier() {
-        return fid;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletMetadataProvider.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletMetadataProvider.java
deleted file mode 100644
index 3f7f56d..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/metadata/PigletMetadataProvider.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.metadata;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.hyracks.algebricks.common.constraints.AlgebricksAbsolutePartitionConstraint;
-import org.apache.hyracks.algebricks.common.constraints.AlgebricksPartitionConstraint;
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSink;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSource;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IDataSourceIndex;
-import org.apache.hyracks.algebricks.core.algebra.metadata.IMetadataProvider;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
-import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
-import org.apache.hyracks.algebricks.data.IPrinterFactory;
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
-import org.apache.hyracks.algebricks.runtime.operators.std.SinkWriterRuntimeFactory;
-import org.apache.hyracks.algebricks.runtime.writers.PrinterBasedWriterFactory;
-import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
-import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
-import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.io.FileSplit;
-import org.apache.hyracks.api.job.JobSpecification;
-import org.apache.hyracks.dataflow.common.data.marshalling.FloatSerializerDeserializer;
-import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
-import org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
-import org.apache.hyracks.dataflow.common.data.parsers.FloatParserFactory;
-import org.apache.hyracks.dataflow.common.data.parsers.IValueParserFactory;
-import org.apache.hyracks.dataflow.common.data.parsers.IntegerParserFactory;
-import org.apache.hyracks.dataflow.common.data.parsers.UTF8StringParserFactory;
-import org.apache.hyracks.dataflow.std.file.ConstantFileSplitProvider;
-import org.apache.hyracks.dataflow.std.file.DelimitedDataTupleParserFactory;
-import org.apache.hyracks.dataflow.std.file.FileScanOperatorDescriptor;
-import org.apache.hyracks.dataflow.std.file.IFileSplitProvider;
-import org.apache.hyracks.dataflow.std.file.ITupleParserFactory;
-
-public class PigletMetadataProvider implements IMetadataProvider<String, String> {
-    private static final Map<FunctionIdentifier, PigletFunction> FN_MAP;
-
-    static {
-        Map<FunctionIdentifier, PigletFunction> map = new HashMap<>();
-
-        map.put(AlgebricksBuiltinFunctions.EQ, new PigletFunction(AlgebricksBuiltinFunctions.EQ));
-
-        FN_MAP = Collections.unmodifiableMap(map);
-    }
-
-    @Override
-    public IDataSource<String> findDataSource(String id) throws AlgebricksException {
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getScannerRuntime(IDataSource<String> dataSource,
-            List<LogicalVariable> scanVariables, List<LogicalVariable> projectVariables, boolean projectPushed,
-            List<LogicalVariable> minFilterVars, List<LogicalVariable> maxFilterVars, IOperatorSchema opSchema,
-            IVariableTypeEnvironment typeEnv, JobGenContext context, JobSpecification jobSpec, Object implConfig)
-            throws AlgebricksException {
-        PigletFileDataSource ds = (PigletFileDataSource) dataSource;
-
-        FileSplit[] fileSplits = ds.getFileSplits();
-        String[] locations = new String[fileSplits.length];
-        for (int i = 0; i < fileSplits.length; ++i) {
-            locations[i] = fileSplits[i].getNodeName();
-        }
-        IFileSplitProvider fsp = new ConstantFileSplitProvider(fileSplits);
-
-        Object[] colTypes = ds.getSchemaTypes();
-        IValueParserFactory[] vpfs = new IValueParserFactory[colTypes.length];
-        ISerializerDeserializer[] serDesers = new ISerializerDeserializer[colTypes.length];
-
-        for (int i = 0; i < colTypes.length; ++i) {
-            Type colType = (Type) colTypes[i];
-            IValueParserFactory vpf;
-            ISerializerDeserializer serDeser;
-            switch (colType.getTag()) {
-                case INTEGER:
-                    vpf = IntegerParserFactory.INSTANCE;
-                    serDeser = IntegerSerializerDeserializer.INSTANCE;
-                    break;
-
-                case CHAR_ARRAY:
-                    vpf = UTF8StringParserFactory.INSTANCE;
-                    serDeser = new UTF8StringSerializerDeserializer();
-                    break;
-
-                case FLOAT:
-                    vpf = FloatParserFactory.INSTANCE;
-                    serDeser = FloatSerializerDeserializer.INSTANCE;
-                    break;
-
-                default:
-                    throw new UnsupportedOperationException();
-            }
-            vpfs[i] = vpf;
-            serDesers[i] = serDeser;
-        }
-
-        ITupleParserFactory tpf = new DelimitedDataTupleParserFactory(vpfs, ',');
-        RecordDescriptor rDesc = new RecordDescriptor(serDesers);
-
-        IOperatorDescriptor scanner = new FileScanOperatorDescriptor(jobSpec, fsp, tpf, rDesc);
-        AlgebricksAbsolutePartitionConstraint constraint = new AlgebricksAbsolutePartitionConstraint(locations);
-        return new Pair<>(scanner, constraint);
-    }
-
-    @Override
-    public Pair<IPushRuntimeFactory, AlgebricksPartitionConstraint> getWriteFileRuntime(IDataSink sink,
-            int[] printColumns, IPrinterFactory[] printerFactories, RecordDescriptor inputDesc)
-            throws AlgebricksException {
-        PigletFileDataSink ds = (PigletFileDataSink) sink;
-        FileSplit[] fileSplits = ds.getFileSplits();
-        String[] locations = new String[fileSplits.length];
-        for (int i = 0; i < fileSplits.length; ++i) {
-            locations[i] = fileSplits[i].getNodeName();
-        }
-        IPushRuntimeFactory prf;
-        try {
-            prf = new SinkWriterRuntimeFactory(printColumns, printerFactories,
-                    fileSplits[0].getFile(null), PrinterBasedWriterFactory.INSTANCE, inputDesc);
-            AlgebricksAbsolutePartitionConstraint constraint = new AlgebricksAbsolutePartitionConstraint(locations);
-            return new Pair<>(prf, constraint);
-        } catch (HyracksDataException e) {
-            throw new AlgebricksException(e);
-        }
-    }
-
-    @Override
-    public IDataSourceIndex<String, String> findDataSourceIndex(String indexId, String dataSourceId)
-            throws AlgebricksException {
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getResultHandleRuntime(IDataSink sink,
-            int[] printColumns, IPrinterFactory[] printerFactories, RecordDescriptor inputDesc, boolean ordered,
-            JobSpecification spec) throws AlgebricksException {
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getWriteResultRuntime(
-            IDataSource<String> dataSource, IOperatorSchema propagatedSchema, List<LogicalVariable> keys,
-            LogicalVariable payLoadVar, List<LogicalVariable> additionalNonKeyFields, JobGenContext context,
-            JobSpecification jobSpec) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getIndexInsertRuntime(
-            IDataSourceIndex<String, String> dataSource, IOperatorSchema propagatedSchema,
-            IOperatorSchema[] inputSchemas, IVariableTypeEnvironment typeEnv, List<LogicalVariable> primaryKeys,
-            List<LogicalVariable> secondaryKeys, List<LogicalVariable> additionalNonKeyFields,
-            ILogicalExpression filterExpr, RecordDescriptor recordDesc, JobGenContext context, JobSpecification spec,
-            boolean bulkload) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getIndexDeleteRuntime(
-            IDataSourceIndex<String, String> dataSource, IOperatorSchema propagatedSchema,
-            IOperatorSchema[] inputSchemas, IVariableTypeEnvironment typeEnv, List<LogicalVariable> primaryKeys,
-            List<LogicalVariable> secondaryKeys, List<LogicalVariable> additionalNonKeyFields,
-            ILogicalExpression filterExpr, RecordDescriptor recordDesc, JobGenContext context, JobSpecification spec)
-            throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getTokenizerRuntime(
-            IDataSourceIndex<String, String> dataSource, IOperatorSchema propagatedSchema,
-            IOperatorSchema[] inputSchemas, IVariableTypeEnvironment typeEnv, List<LogicalVariable> primaryKeys,
-            List<LogicalVariable> secondaryKeys, ILogicalExpression filterExpr, RecordDescriptor recordDesc,
-            JobGenContext context, JobSpecification spec, boolean bulkload) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public IFunctionInfo lookupFunction(FunctionIdentifier fid) {
-        return FN_MAP.get(fid);
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getInsertRuntime(IDataSource<String> dataSource,
-            IOperatorSchema propagatedSchema, IVariableTypeEnvironment typeEnv, List<LogicalVariable> keys,
-            LogicalVariable payLoadVar, List<LogicalVariable> additionalFilterKeyFields,
-            List<LogicalVariable> additionalNonFilteringFields, RecordDescriptor recordDesc, JobGenContext context,
-            JobSpecification jobSpec, boolean bulkload) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getDeleteRuntime(IDataSource<String> dataSource,
-            IOperatorSchema propagatedSchema, IVariableTypeEnvironment typeEnv, List<LogicalVariable> keys,
-            LogicalVariable payLoadVar, List<LogicalVariable> additionalNonKeyFields, RecordDescriptor recordDesc,
-            JobGenContext context, JobSpecification jobSpec) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getUpsertRuntime(IDataSource<String> dataSource,
-            IOperatorSchema propagatedSchema, IVariableTypeEnvironment typeEnv, List<LogicalVariable> keys,
-            LogicalVariable payLoadVar, List<LogicalVariable> additionalFilterFields,
-            List<LogicalVariable> additionalNonFilteringFields, RecordDescriptor recordDesc, JobGenContext context,
-            JobSpecification jobSpec) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Pair<IOperatorDescriptor, AlgebricksPartitionConstraint> getIndexUpsertRuntime(
-            IDataSourceIndex<String, String> dataSourceIndex, IOperatorSchema propagatedSchema,
-            IOperatorSchema[] inputSchemas, IVariableTypeEnvironment typeEnv, List<LogicalVariable> primaryKeys,
-            List<LogicalVariable> secondaryKeys, List<LogicalVariable> additionalFilteringKeys,
-            ILogicalExpression filterExpr, List<LogicalVariable> prevSecondaryKeys,
-            LogicalVariable prevAdditionalFilteringFields, RecordDescriptor inputDesc, JobGenContext context,
-            JobSpecification spec) throws AlgebricksException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Map<String, String> getConfig() {
-        return Collections.emptyMap();
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/rewriter/PigletRewriteRuleset.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/rewriter/PigletRewriteRuleset.java
deleted file mode 100644
index 407700f..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/rewriter/PigletRewriteRuleset.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.rewriter;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.hyracks.algebricks.core.rewriter.base.HeuristicOptimizer;
-import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule;
-import org.apache.hyracks.algebricks.rewriter.rules.BreakSelectIntoConjunctsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ComplexJoinInferenceRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ConsolidateAssignsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ConsolidateSelectsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.EnforceStructuralPropertiesRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ExtractCommonOperatorsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ExtractGbyExpressionsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.FactorRedundantGroupAndDecorVarsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.InferTypesRule;
-import org.apache.hyracks.algebricks.rewriter.rules.InlineVariablesRule;
-import org.apache.hyracks.algebricks.rewriter.rules.IsolateHyracksOperatorsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.PullSelectOutOfEqJoin;
-import org.apache.hyracks.algebricks.rewriter.rules.CopyLimitDownRule;
-import org.apache.hyracks.algebricks.rewriter.rules.PushProjectDownRule;
-import org.apache.hyracks.algebricks.rewriter.rules.PushProjectIntoDataSourceScanRule;
-import org.apache.hyracks.algebricks.rewriter.rules.PushSelectDownRule;
-import org.apache.hyracks.algebricks.rewriter.rules.PushSelectIntoJoinRule;
-import org.apache.hyracks.algebricks.rewriter.rules.ReinferAllTypesRule;
-import org.apache.hyracks.algebricks.rewriter.rules.RemoveUnusedAssignAndAggregateRule;
-import org.apache.hyracks.algebricks.rewriter.rules.SetAlgebricksPhysicalOperatorsRule;
-import org.apache.hyracks.algebricks.rewriter.rules.SetExecutionModeRule;
-import org.apache.hyracks.algebricks.rewriter.rules.subplan.EliminateSubplanRule;
-
-public class PigletRewriteRuleset {
-
-    public final static List<IAlgebraicRewriteRule> buildTypeInferenceRuleCollection() {
-        List<IAlgebraicRewriteRule> typeInfer = new LinkedList<IAlgebraicRewriteRule>();
-        typeInfer.add(new InferTypesRule());
-        return typeInfer;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildNormalizationRuleCollection() {
-        List<IAlgebraicRewriteRule> normalization = new LinkedList<IAlgebraicRewriteRule>();
-        normalization.add(new EliminateSubplanRule());
-        // TODO: This rule is incorrect and has been removed. Its replacement in
-        // Asterix (PushAggFuncIntoStandaloneAggregateRule)
-        // is language-specific.
-        // normalization.add(new IntroduceGroupByForStandaloneAggregRule());
-        normalization.add(new BreakSelectIntoConjunctsRule());
-        normalization.add(new PushSelectIntoJoinRule());
-        normalization.add(new ExtractGbyExpressionsRule());
-        return normalization;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildCondPushDownRuleCollection() {
-        List<IAlgebraicRewriteRule> condPushDown = new LinkedList<IAlgebraicRewriteRule>();
-        condPushDown.add(new PushSelectDownRule());
-        condPushDown.add(new InlineVariablesRule());
-        condPushDown.add(new FactorRedundantGroupAndDecorVarsRule());
-        condPushDown.add(new EliminateSubplanRule());
-        return condPushDown;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildJoinInferenceRuleCollection() {
-        List<IAlgebraicRewriteRule> joinInference = new LinkedList<IAlgebraicRewriteRule>();
-        joinInference.add(new InlineVariablesRule());
-        joinInference.add(new ComplexJoinInferenceRule());
-        return joinInference;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildOpPushDownRuleCollection() {
-        List<IAlgebraicRewriteRule> opPushDown = new LinkedList<IAlgebraicRewriteRule>();
-        opPushDown.add(new PushProjectDownRule());
-        opPushDown.add(new PushSelectDownRule());
-        return opPushDown;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildDataExchangeRuleCollection() {
-        List<IAlgebraicRewriteRule> dataExchange = new LinkedList<IAlgebraicRewriteRule>();
-        dataExchange.add(new SetExecutionModeRule());
-        return dataExchange;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildConsolidationRuleCollection() {
-        List<IAlgebraicRewriteRule> consolidation = new LinkedList<IAlgebraicRewriteRule>();
-        consolidation.add(new ConsolidateSelectsRule());
-        consolidation.add(new ConsolidateAssignsRule());
-        consolidation.add(new RemoveUnusedAssignAndAggregateRule());
-        return consolidation;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildPhysicalRewritesAllLevelsRuleCollection() {
-        List<IAlgebraicRewriteRule> physicalPlanRewrites = new LinkedList<IAlgebraicRewriteRule>();
-        physicalPlanRewrites.add(new PullSelectOutOfEqJoin());
-        physicalPlanRewrites.add(new SetAlgebricksPhysicalOperatorsRule());
-        physicalPlanRewrites.add(new EnforceStructuralPropertiesRule());
-        physicalPlanRewrites.add(new PushProjectDownRule());
-        physicalPlanRewrites.add(new CopyLimitDownRule());
-        return physicalPlanRewrites;
-    }
-
-    public final static List<IAlgebraicRewriteRule> buildPhysicalRewritesTopLevelRuleCollection() {
-        List<IAlgebraicRewriteRule> physicalPlanRewrites = new LinkedList<IAlgebraicRewriteRule>();
-        physicalPlanRewrites.add(new CopyLimitDownRule());
-        return physicalPlanRewrites;
-    }
-
-    public final static List<IAlgebraicRewriteRule> prepareForJobGenRuleCollection() {
-        List<IAlgebraicRewriteRule> prepareForJobGenRewrites = new LinkedList<IAlgebraicRewriteRule>();
-        prepareForJobGenRewrites.add(new IsolateHyracksOperatorsRule(
-                HeuristicOptimizer.hyraxOperatorsBelowWhichJobGenIsDisabled));
-        prepareForJobGenRewrites.add(new ExtractCommonOperatorsRule());
-        // Re-infer all types, so that, e.g., the effect of not-is-null is
-        // propagated.
-        prepareForJobGenRewrites.add(new PushProjectIntoDataSourceScanRule());
-        prepareForJobGenRewrites.add(new ReinferAllTypesRule());
-        return prepareForJobGenRewrites;
-    }
-
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/PigletExpressionJobGen.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/PigletExpressionJobGen.java
deleted file mode 100644
index a19247a..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/PigletExpressionJobGen.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.runtime;
-
-import java.io.DataOutput;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.mutable.Mutable;
-
-import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
-import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
-import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable;
-import org.apache.hyracks.algebricks.core.algebra.expressions.AggregateFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ConstantExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ILogicalExpressionJobGen;
-import org.apache.hyracks.algebricks.core.algebra.expressions.IVariableTypeEnvironment;
-import org.apache.hyracks.algebricks.core.algebra.expressions.ScalarFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.StatefulFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.UnnestingFunctionCallExpression;
-import org.apache.hyracks.algebricks.core.algebra.expressions.VariableReferenceExpression;
-import org.apache.hyracks.algebricks.core.algebra.operators.logical.IOperatorSchema;
-import org.apache.hyracks.algebricks.core.jobgen.impl.JobGenContext;
-import org.apache.hyracks.algebricks.examples.piglet.compiler.ConstantValue;
-import org.apache.hyracks.algebricks.examples.piglet.exceptions.PigletException;
-import org.apache.hyracks.algebricks.examples.piglet.runtime.functions.PigletFunctionRegistry;
-import org.apache.hyracks.algebricks.examples.piglet.types.Type;
-import org.apache.hyracks.algebricks.runtime.base.IAggregateEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.base.IRunningAggregateEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.base.ISerializedAggregateEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.base.IUnnestingEvaluatorFactory;
-import org.apache.hyracks.algebricks.runtime.evaluators.ColumnAccessEvalFactory;
-import org.apache.hyracks.algebricks.runtime.evaluators.ConstantEvalFactory;
-import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
-import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
-import org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
-
-public class PigletExpressionJobGen implements ILogicalExpressionJobGen {
-    private final UTF8StringSerializerDeserializer utf8SerDer = new UTF8StringSerializerDeserializer();
-
-    @Override
-    public IScalarEvaluatorFactory createEvaluatorFactory(ILogicalExpression expr, IVariableTypeEnvironment env,
-            IOperatorSchema[] inputSchemas, JobGenContext context) throws AlgebricksException {
-        switch (expr.getExpressionTag()) {
-            case CONSTANT: {
-                ConstantValue cv = (ConstantValue) ((ConstantExpression) expr).getValue();
-                Type type = cv.getType();
-                String image = cv.getImage();
-                ArrayBackedValueStorage abvs = new ArrayBackedValueStorage();
-                DataOutput dos = abvs.getDataOutput();
-                switch (type.getTag()) {
-                    case INTEGER:
-                        try {
-                            IntegerSerializerDeserializer.INSTANCE.serialize(Integer.valueOf(image), dos);
-                        } catch (Exception e) {
-                            throw new AlgebricksException(e);
-                        }
-                        break;
-
-                    case CHAR_ARRAY:
-                        try {
-                            utf8SerDer.serialize(image, dos);
-                        } catch (Exception e) {
-                            throw new AlgebricksException(e);
-                        }
-                        break;
-
-                    default:
-                        throw new UnsupportedOperationException("Unsupported constant type: " + type.getTag());
-                }
-                return new ConstantEvalFactory(Arrays.copyOf(abvs.getByteArray(), abvs.getLength()));
-            }
-
-            case FUNCTION_CALL: {
-                ScalarFunctionCallExpression sfce = (ScalarFunctionCallExpression) expr;
-
-                List<Mutable<ILogicalExpression>> argExprs = sfce.getArguments();
-                IScalarEvaluatorFactory argEvalFactories[] = new IScalarEvaluatorFactory[argExprs.size()];
-                for (int i = 0; i < argEvalFactories.length; ++i) {
-                    Mutable<ILogicalExpression> er = argExprs.get(i);
-                    argEvalFactories[i] = createEvaluatorFactory(er.getValue(), env, inputSchemas, context);
-                }
-                IScalarEvaluatorFactory funcEvalFactory;
-                try {
-                    funcEvalFactory = PigletFunctionRegistry.createFunctionEvaluatorFactory(
-                            sfce.getFunctionIdentifier(), argEvalFactories);
-                } catch (PigletException e) {
-                    throw new AlgebricksException(e);
-                }
-                return funcEvalFactory;
-            }
-
-            case VARIABLE: {
-                LogicalVariable var = ((VariableReferenceExpression) expr).getVariableReference();
-                int index = inputSchemas[0].findVariable(var);
-                return new ColumnAccessEvalFactory(index);
-            }
-        }
-        throw new IllegalArgumentException("Unknown expression type: " + expr.getExpressionTag());
-    }
-
-    @Override
-    public IAggregateEvaluatorFactory createAggregateFunctionFactory(AggregateFunctionCallExpression expr,
-            IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-            throws AlgebricksException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ISerializedAggregateEvaluatorFactory createSerializableAggregateFunctionFactory(
-            AggregateFunctionCallExpression expr, IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas,
-            JobGenContext context) throws AlgebricksException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public IRunningAggregateEvaluatorFactory createRunningAggregateFunctionFactory(StatefulFunctionCallExpression expr,
-            IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-            throws AlgebricksException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public IUnnestingEvaluatorFactory createUnnestingFunctionFactory(UnnestingFunctionCallExpression expr,
-            IVariableTypeEnvironment env, IOperatorSchema[] inputSchemas, JobGenContext context)
-            throws AlgebricksException {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IPigletFunctionEvaluatorFactoryBuilder.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IPigletFunctionEvaluatorFactoryBuilder.java
deleted file mode 100644
index 4c0328b..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IPigletFunctionEvaluatorFactoryBuilder.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.runtime.functions;
-
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-
-public interface IPigletFunctionEvaluatorFactoryBuilder {
-    public IScalarEvaluatorFactory buildEvaluatorFactory(FunctionIdentifier fid, IScalarEvaluatorFactory[] arguments);
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IntegerEqFunctionEvaluatorFactory.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IntegerEqFunctionEvaluatorFactory.java
deleted file mode 100644
index 7a83126..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/IntegerEqFunctionEvaluatorFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.runtime.functions;
-
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.data.std.api.IPointable;
-import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.data.std.primitive.VoidPointable;
-import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
-
-public class IntegerEqFunctionEvaluatorFactory implements IScalarEvaluatorFactory {
-    private static final long serialVersionUID = 1L;
-
-    private final IScalarEvaluatorFactory arg1Factory;
-
-    private final IScalarEvaluatorFactory arg2Factory;
-
-    public IntegerEqFunctionEvaluatorFactory(IScalarEvaluatorFactory arg1Factory, IScalarEvaluatorFactory arg2Factory) {
-        this.arg1Factory = arg1Factory;
-        this.arg2Factory = arg2Factory;
-    }
-
-    @Override
-    public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException {
-        return new IScalarEvaluator() {
-            private IPointable out1 = new VoidPointable();
-            private IPointable out2 = new VoidPointable();
-            private IScalarEvaluator eval1 = arg1Factory.createScalarEvaluator(ctx);
-            private IScalarEvaluator eval2 = arg2Factory.createScalarEvaluator(ctx);
-            private byte[] resultData = new byte[1];
-
-            @Override
-            public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException {
-                eval1.evaluate(tuple, out1);
-                eval2.evaluate(tuple, out2);
-                int v1 = IntegerPointable.getInteger(out1.getByteArray(), out1.getStartOffset());
-                int v2 = IntegerPointable.getInteger(out2.getByteArray(), out2.getStartOffset());
-                boolean r = v1 == v2;
-                resultData[0] = r ? (byte) 1 : (byte) 0;
-                result.set(resultData, 0, 1);
-            }
-        };
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/PigletFunctionRegistry.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/PigletFunctionRegistry.java
deleted file mode 100644
index 366f238..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/runtime/functions/PigletFunctionRegistry.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.runtime.functions;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
-import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
-import org.apache.hyracks.algebricks.examples.piglet.exceptions.PigletException;
-import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
-
-public class PigletFunctionRegistry {
-    private static final Map<FunctionIdentifier, IPigletFunctionEvaluatorFactoryBuilder> builderMap;
-
-    static {
-        Map<FunctionIdentifier, IPigletFunctionEvaluatorFactoryBuilder> temp = new HashMap<FunctionIdentifier, IPigletFunctionEvaluatorFactoryBuilder>();
-
-        temp.put(AlgebricksBuiltinFunctions.EQ, new IPigletFunctionEvaluatorFactoryBuilder() {
-            @Override
-            public IScalarEvaluatorFactory buildEvaluatorFactory(FunctionIdentifier fid, IScalarEvaluatorFactory[] arguments) {
-                return new IntegerEqFunctionEvaluatorFactory(arguments[0], arguments[1]);
-            }
-        });
-
-        builderMap = Collections.unmodifiableMap(temp);
-    }
-
-    public static IScalarEvaluatorFactory createFunctionEvaluatorFactory(FunctionIdentifier fid, IScalarEvaluatorFactory[] args)
-            throws PigletException {
-        IPigletFunctionEvaluatorFactoryBuilder builder = builderMap.get(fid);
-        if (builder == null) {
-            throw new PigletException("Unknown function: " + fid);
-        }
-        return builder.buildEvaluatorFactory(fid, args);
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/BagType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/BagType.java
deleted file mode 100644
index 551663b..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/BagType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class BagType extends Type {
-    @Override
-    public Tag getTag() {
-        return Tag.BAG;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/CharArrayType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/CharArrayType.java
deleted file mode 100644
index 03bb154..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/CharArrayType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class CharArrayType extends Type {
-    public static final Type INSTANCE = new CharArrayType();
-
-    private CharArrayType() {
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.CHAR_ARRAY;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/DoubleType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/DoubleType.java
deleted file mode 100644
index 2db0edd..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/DoubleType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class DoubleType extends Type {
-    public static final Type INSTANCE = new DoubleType();
-
-    private DoubleType() {
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.DOUBLE;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/FloatType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/FloatType.java
deleted file mode 100644
index 35fe797..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/FloatType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class FloatType extends Type {
-    public static final Type INSTANCE = new FloatType();
-
-    private FloatType() {
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.FLOAT;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/IntegerType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/IntegerType.java
deleted file mode 100644
index 57caa1b..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/IntegerType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class IntegerType extends Type {
-    public static final Type INSTANCE = new IntegerType();
-
-    private IntegerType() {
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.INTEGER;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/LongType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/LongType.java
deleted file mode 100644
index c8f0738..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/LongType.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class LongType extends Type {
-    public static final Type INSTANCE = new LongType();
-
-    private LongType() {
-    }
-
-    @Override
-    public Tag getTag() {
-        return Tag.LONG;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/MapType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/MapType.java
deleted file mode 100644
index ae57255..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/MapType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class MapType extends Type {
-    @Override
-    public Tag getTag() {
-        return Tag.MAP;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Schema.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Schema.java
deleted file mode 100644
index 4b7f767..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Schema.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-import java.util.List;
-
-import org.apache.hyracks.algebricks.common.utils.Pair;
-
-public class Schema {
-    private List<Pair<String, Type>> schema;
-
-    public Schema(List<Pair<String, Type>> schema) {
-        this.schema = schema;
-    }
-
-    public List<Pair<String, Type>> getSchema() {
-        return schema;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/TupleType.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/TupleType.java
deleted file mode 100644
index 713b846..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/TupleType.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public class TupleType extends Type {
-    @Override
-    public Tag getTag() {
-        return Tag.TUPLE;
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Type.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Type.java
deleted file mode 100644
index f8ffe93..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/java/org/apache/hyracks/algebricks/examples/piglet/types/Type.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.algebricks.examples.piglet.types;
-
-public abstract class Type {
-    public enum Tag {
-        INTEGER,
-        LONG,
-        FLOAT,
-        DOUBLE,
-        CHAR_ARRAY,
-        TUPLE,
-        BAG,
-        MAP
-    }
-
-    public abstract Tag getTag();
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/javacc/PigletParser.jj b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/javacc/PigletParser.jj
deleted file mode 100644
index 103003c..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/main/javacc/PigletParser.jj
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-options {
-    STATIC = false;
-    IGNORE_CASE = true;
-    LOOKAHEAD = 2;
-}
-
-PARSER_BEGIN(PigletParser)
-
-package org.apache.hyracks.algebricks.examples.piglet.parser;
-
-import java.util.*;
-import org.apache.hyracks.algebricks.common.utils.Pair;
-import org.apache.hyracks.algebricks.examples.piglet.ast.*;
-import org.apache.hyracks.algebricks.examples.piglet.types.*;
-
-public class PigletParser {
-    private ExpressionNode createFunction(FunctionTag fTag, String fName, ExpressionNode... arguments) {
-        List<ASTNode> args = new ArrayList<ASTNode>();
-        for(ExpressionNode e : arguments) {
-            args.add(e);
-        }
-        return new ScalarFunctionExpressionNode(fTag, fName, args);
-    }
-    
-    private String stripQuotes(String s) {
-        s = s.substring(1);
-        s = s.substring(0, s.length() - 1);
-        return s;
-    }
-}
-
-PARSER_END(PigletParser)
-
-List<ASTNode> Statements(): {
-    List<ASTNode> statememts = new ArrayList<ASTNode>();
-    ASTNode s;
-} {
-    (
-        (
-            s = AssignmentStatement() {
-                statememts.add(s);
-            }
-            | s = DumpStatement() {
-                statememts.add(s);
-            }
-        ) ";"
-    )* <EOF> {
-        return statememts;
-    }
-}
-
-ASTNode AssignmentStatement(): {
-    String a;
-    RelationNode r;
-} {
-    a = Alias() "=" r = RelationalStatement() {
-        return new AssignmentNode(a, r);
-    }
-}
-
-String Alias(): {
-    Token t;
-} {
-    t = <IDENTIFIER> {
-        return t.image;
-    }
-}
-
-String ColumnName(): {
-    Token t;
-} {
-    t = <IDENTIFIER> {
-        return t.image;
-    }
-}
-
-Type TypeName(): {
-    Token t;
-} {
-    "int" {
-        return IntegerType.INSTANCE;
-    }
-    | "long" {
-        return LongType.INSTANCE;
-    }
-    | "float" {
-        return FloatType.INSTANCE;
-    }
-    | "double" {
-        return DoubleType.INSTANCE;
-    }
-    | "chararray" {
-        return CharArrayType.INSTANCE;
-    }
-    | "tuple" {
-        return new TupleType();
-    }
-    | "bag" {
-        return new BagType();
-    }
-    | "map" {
-        return new MapType();
-    }
-}
-
-Pair<String, Type> ColumnSchema(): {
-    String c;
-    Type t;
-} {
-    c = ColumnName() ":" t = TypeName() {
-        return new Pair<String, Type>(c, t);
-    }
-}
-
-Schema Schema(): {
-    List<Pair<String, Type>> schema = new ArrayList<Pair<String, Type>>();
-    Pair<String, Type> cSchema;
-} {
-    "(" (
-        cSchema = ColumnSchema() {
-            schema.add(cSchema);
-        } (
-            "," cSchema = ColumnSchema() {
-                schema.add(cSchema);
-            }
-        )*
-    )? ")" {
-        return new Schema(schema);
-    }
-}
-
-RelationNode RelationalStatement(): {
-    RelationNode r;
-} {
-    r = LoadStatement() {
-        return r;
-    }
-    | r = FilterStatement() {
-        return r;
-    }
-}
-
-RelationNode LoadStatement(): {
-    Token t;
-    Schema s;
-} {
-    "load" t = <STRING_LITERAL> "as" s = Schema() {
-        return new LoadNode(t.image, s);
-    }
-}
-
-RelationNode FilterStatement(): {
-    String a;
-    ExpressionNode e;
-} {
-    "filter" a = Alias() "by" e = Expression() {
-        return new FilterNode(a, e);
-    }
-}
-
-ASTNode DumpStatement(): {
-    String a;
-    Token t;
-} {
-    "dump" a = Alias() "into" t = <STRING_LITERAL> {
-        return new DumpNode(t.image, a);
-    }
-}
-
-ExpressionNode Expression(): {
-    ExpressionNode e;
-} {
-    e = OrExpression() {
-        return e;
-    }
-}
-
-ExpressionNode OrExpression(): {
-    ExpressionNode e1;
-    ExpressionNode e2;
-} {
-    e1 = AndExpression() (
-        "or" e2 = AndExpression() {
-            e1 = createFunction(FunctionTag.BOOLEAN_OR, null, e1, e2);
-        }
-    )* {
-        return e1;
-    }
-}
-
-ExpressionNode AndExpression(): {
-    ExpressionNode e1;
-    ExpressionNode e2;
-} {
-    e1 = ComparisonExpression() (
-        "and" e2 = ComparisonExpression() {
-            e1 = createFunction(FunctionTag.BOOLEAN_AND, null, e1, e2);
-        }
-    )* {
-        return e1;
-    }
-}
-
-ExpressionNode ComparisonExpression(): {
-    ExpressionNode e1;
-    ExpressionNode e2;
-    FunctionTag fTag;
-} {
-    e1 = AdditiveExpression() (
-        fTag = ComparisonOperator() e2 = AdditiveExpression() {
-            e1 = createFunction(fTag, null, e1, e2);
-        }
-    )? {
-        return e1;
-    }
-}
-
-FunctionTag ComparisonOperator(): {
-} {
-    "==" {
-        return FunctionTag.EQ;
-    }
-    | "!=" {
-        return FunctionTag.NEQ;
-    }
-    | "<" {
-        return FunctionTag.LT;
-    }
-    | "<=" {
-        return FunctionTag.LTE;
-    }
-    | ">" {
-        return FunctionTag.GT;
-    }
-    | ">=" {
-        return FunctionTag.GTE;
-    }
-}
-
-ExpressionNode AdditiveExpression(): {
-    ExpressionNode e1;
-    ExpressionNode e2;
-    FunctionTag fTag;
-} {
-    e1 = MultiplicativeExpression() (
-        fTag = AdditiveOperator() e2 = MultiplicativeExpression() {
-            e1 = createFunction(fTag, null, e1, e2);
-        }
-    )* {
-        return e1;
-    }
-}
-
-FunctionTag AdditiveOperator(): {
-} {
-    "+" {
-        return FunctionTag.ADD;
-    }
-    | "-" {
-        return FunctionTag.SUBTRACT;
-    }
-}
-
-ExpressionNode MultiplicativeExpression(): {
-    ExpressionNode e1;
-    ExpressionNode e2;
-    FunctionTag fTag;
-} {
-    e1 = PrimaryExpression() (
-        fTag = MultiplicativeOperator() e2 = PrimaryExpression() {
-            e1 = createFunction(fTag, null, e1, e2);
-        }
-    )* {
-        return e1;
-    }
-}
-
-FunctionTag MultiplicativeOperator(): {
-} {
-    "*" {
-        return FunctionTag.MULTIPLY;
-    }
-    | "/" {
-        return FunctionTag.DIVIDE;
-    }
-    | "%" {
-        return FunctionTag.MOD;
-    }
-}
-
-ExpressionNode PrimaryExpression(): {
-    ExpressionNode e;
-} {
-    e = Literal() {
-        return e;
-    }
-    | e = FieldAccess() {
-        return e;
-    }
-}
-
-ExpressionNode Literal(): {
-    Token t;
-} {
-    t = <STRING_LITERAL> {
-        return new LiteralExpressionNode(stripQuotes(t.image), CharArrayType.INSTANCE);
-    }
-    | t = <INTEGER_LITERAL> {
-        return new LiteralExpressionNode(t.image, IntegerType.INSTANCE);
-    }
-    | t = <DOUBLE_LITERAL> {
-        return new LiteralExpressionNode(t.image, DoubleType.INSTANCE);
-    }
-}
-
-ExpressionNode FieldAccess(): {
-    String relName = null;
-    Token fieldName;
-} {
-    (relName = Alias() ".")? fieldName = <IDENTIFIER> {
-        return new FieldAccessExpressionNode(relName, fieldName.image);
-    }
-}
-
-<DEFAULT>
-TOKEN : {
-    <STRING_LITERAL: (("\"" (~["\"", "\n"])* "\"") | ("'" (~["'", "\n"])* "'"))>
-    | <IDENTIFIER: <Letter> (<Letter> | <Digit> | <Extender>)*>
-    | <INTEGER_LITERAL: (<Digit>)+>
-    | <DOUBLE_LITERAL: (((<Digit>)* "." (<Digit>)+ (<Exponent>)?) | (<INTEGER_LITERAL> <Exponent>))>
-    | <INDEXED_FIELD: ("$" <INTEGER_LITERAL>)>
-}
-
-TOKEN :
-{
- < #Exponent : ((["+", "-"])? ["E", "e"] <INTEGER_LITERAL>)>
-}
-
-SPECIAL_TOKEN :
-{
- < WhitespaceChar : ["\t", "\r", "\n", " "] >
-}
-
-TOKEN :
-{
- < #Letter : (<BaseChar> | <Ideographic>) >
-}
-
-TOKEN :
-{
- < #BaseChar : ["\u0041" - "\u005a", "\u0061" - "\u007a", "\u00c0" - "\u00d6", "\u00d8" - "\u00f6", "\u00f8" - "\u00ff", "\u0100" - "\u0131", "\u0134" - "\u013e", "\u0141" - "\u0148", "\u014a" - "\u017e", "\u0180" - "\u01c3", "\u01cd" - "\u01f0", "\u01f4" - "\u01f5", "\u01fa" - "\u0217", "\u0250" - "\u02a8", "\u02bb" - "\u02c1", "\u0386", "\u0388" - "\u038a", "\u038c", "\u038e" - "\u03a1", "\u03a3" - "\u03ce", "\u03d0" - "\u03d6", "\u03da", "\u03dc", "\u03de", "\u03e0", "\u03e2" - "\u03f3", "\u0401" - "\u040c", "\u040e" - "\u044f", "\u0451" - "\u045c", "\u045e" - "\u0481", "\u0490" - "\u04c4", "\u04c7" - "\u04c8", "\u04cb" - "\u04cc", "\u04d0" - "\u04eb", "\u04ee" - "\u04f5", "\u04f8" - "\u04f9", "\u0531" - "\u0556", "\u0559", "\u0561" - "\u0586", "\u05d0" - "\u05ea", "\u05f0" - "\u05f2", "\u0621" - "\u063a", "\u0641" - "\u064a", "\u0671" - "\u06b7", "\u06ba" - "\u06be", "\u06c0" - "\u06ce", "\u06d0" - "\u06d3", "\u06d5", "\u06e5" - "\u06e6", "\u0905" - "\u0939", "\u093d", "\u0958" - "\u0961", "\u0985" - "\u098c", "\u098f" - "\u0990", "\u0993" - "\u09a8", "\u09aa" - "\u09b0", "\u09b2", "\u09b6" - "\u09b9", "\u09dc" - "\u09dd", "\u09df" - "\u09e1", "\u09f0" - "\u09f1", "\u0a05" - "\u0a0a", "\u0a0f" - "\u0a10", "\u0a13" - "\u0a28", "\u0a2a" - "\u0a30", "\u0a32" - "\u0a33", "\u0a35" - "\u0a36", "\u0a38" - "\u0a39", "\u0a59" - "\u0a5c", "\u0a5e", "\u0a72" - "\u0a74", "\u0a85" - "\u0a8b", "\u0a8d", "\u0a8f" - "\u0a91", "\u0a93" - "\u0aa8", "\u0aaa" - "\u0ab0", "\u0ab2" - "\u0ab3", "\u0ab5" - "\u0ab9", "\u0abd", "\u0ae0", "\u0b05" - "\u0b0c", "\u0b0f" - "\u0b10", "\u0b13" - "\u0b28", "\u0b2a" - "\u0b30", "\u0b32" - "\u0b33", "\u0b36" - "\u0b39", "\u0b3d", "\u0b5c" - "\u0b5d", "\u0b5f" - "\u0b61", "\u0b85" - "\u0b8a", "\u0b8e" - "\u0b90", "\u0b92" - "\u0b95", "\u0b99" - "\u0b9a", "\u0b9c", "\u0b9e" - "\u0b9f", "\u0ba3" - "\u0ba4", "\u0ba8" - "\u0baa", "\u0bae" - "\u0bb5", "\u0bb7" - "\u0bb9", "\u0c05" - "\u0c0c", "\u0c0e" - "\u0c10", "\u0c12" - "\u0c28", "\u0c2a" - "\u0c33", "\u0c35" - "\u0c39", "\u0c60" - "\u0c61", "\u0c85" - "\u0c8c", "\u0c8e" - "\u0c90", "\u0c92" - "\u0ca8", "\u0caa" - "\u0cb3", "\u0cb5" - "\u0cb9", "\u0cde", "\u0ce0" - "\u0ce1", "\u0d05" - "\u0d0c", "\u0d0e" - "\u0d10", "\u0d12" - "\u0d28", "\u0d2a" - "\u0d39", "\u0d60" - "\u0d61", "\u0e01" - "\u0e2e", "\u0e30", "\u0e32" - "\u0e33", "\u0e40" - "\u0e45", "\u0e81" - "\u0e82", "\u0e84", "\u0e87" - "\u0e88", "\u0e8a", "\u0e8d", "\u0e94" - "\u0e97", "\u0e99" - "\u0e9f", "\u0ea1" - "\u0ea3", "\u0ea5", "\u0ea7", "\u0eaa" - "\u0eab", "\u0ead" - "\u0eae", "\u0eb0", "\u0eb2" - "\u0eb3", "\u0ebd", "\u0ec0" - "\u0ec4", "\u0f40" - "\u0f47", "\u0f49" - "\u0f69", "\u10a0" - "\u10c5", "\u10d0" - "\u10f6", "\u1100", "\u1102" - "\u1103", "\u1105" - "\u1107", "\u1109", "\u110b" - "\u110c", "\u110e" - "\u1112", "\u113c", "\u113e", "\u1140", "\u114c", "\u114e", "\u1150", "\u1154" - "\u1155", "\u1159", "\u115f" - "\u1161", "\u1163", "\u1165", "\u1167", "\u1169", "\u116d" - "\u116e", "\u1172" - "\u1173", "\u1175", "\u119e", "\u11a8", "\u11ab", "\u11ae" - "\u11af", "\u11b7" - "\u11b8", "\u11ba", "\u11bc" - "\u11c2", "\u11eb", "\u11f0", "\u11f9", "\u1e00" - "\u1e9b", "\u1ea0" - "\u1ef9", "\u1f00" - "\u1f15", "\u1f18" - "\u1f1d", "\u1f20" - "\u1f45", "\u1f48" - "\u1f4d", "\u1f50" - "\u1f57", "\u1f59", "\u1f5b", "\u1f5d", "\u1f5f" - "\u1f7d", "\u1f80" - "\u1fb4", "\u1fb6" - "\u1fbc", "\u1fbe", "\u1fc2" - "\u1fc4", "\u1fc6" - "\u1fcc", "\u1fd0" - "\u1fd3", "\u1fd6" - "\u1fdb", "\u1fe0" - "\u1fec", "\u1ff2" - "\u1ff4", "\u1ff6" - "\u1ffc", "\u2126", "\u212a" - "\u212b", "\u212e", "\u2180" - "\u2182", "\u3041" - "\u3094", "\u30a1" - "\u30fa", "\u3105" - "\u312c", "\uac00" - "\ud7a3"] >
-}
-
-TOKEN :
-{
- < #Ideographic : ["\u4e00" - "\u9fa5", "\u3007", "\u3021" - "\u3029"] >
-}
-
-TOKEN :
-{
- < #CombiningChar : ["\u0300" - "\u0345", "\u0360" - "\u0361", "\u0483" - "\u0486", "\u0591" - "\u05a1", "\u05a3" - "\u05b9", "\u05bb" - "\u05bd", "\u05bf", "\u05c1" - "\u05c2", "\u05c4", "\u064b" - "\u0652", "\u0670", "\u06d6" - "\u06dc", "\u06dd" - "\u06df", "\u06e0" - "\u06e4", "\u06e7" - "\u06e8", "\u06ea" - "\u06ed", "\u0901" - "\u0903", "\u093c", "\u093e" - "\u094c", "\u094d", "\u0951" - "\u0954", "\u0962" - "\u0963", "\u0981" - "\u0983", "\u09bc", "\u09be", "\u09bf", "\u09c0" - "\u09c4", "\u09c7" - "\u09c8", "\u09cb" - "\u09cd", "\u09d7", "\u09e2" - "\u09e3", "\u0a02", "\u0a3c", "\u0a3e", "\u0a3f", "\u0a40" - "\u0a42", "\u0a47" - "\u0a48", "\u0a4b" - "\u0a4d", "\u0a70" - "\u0a71", "\u0a81" - "\u0a83", "\u0abc", "\u0abe" - "\u0ac5", "\u0ac7" - "\u0ac9", "\u0acb" - "\u0acd", "\u0b01" - "\u0b03", "\u0b3c", "\u0b3e" - "\u0b43", "\u0b47" - "\u0b48", "\u0b4b" - "\u0b4d", "\u0b56" - "\u0b57", "\u0b82" - "\u0b83", "\u0bbe" - "\u0bc2", "\u0bc6" - "\u0bc8", "\u0bca" - "\u0bcd", "\u0bd7", "\u0c01" - "\u0c03", "\u0c3e" - "\u0c44", "\u0c46" - "\u0c48", "\u0c4a" - "\u0c4d", "\u0c55" - "\u0c56", "\u0c82" - "\u0c83", "\u0cbe" - "\u0cc4", "\u0cc6" - "\u0cc8", "\u0cca" - "\u0ccd", "\u0cd5" - "\u0cd6", "\u0d02" - "\u0d03", "\u0d3e" - "\u0d43", "\u0d46" - "\u0d48", "\u0d4a" - "\u0d4d", "\u0d57", "\u0e31", "\u0e34" - "\u0e3a", "\u0e47" - "\u0e4e", "\u0eb1", "\u0eb4" - "\u0eb9", "\u0ebb" - "\u0ebc", "\u0ec8" - "\u0ecd", "\u0f18" - "\u0f19", "\u0f35", "\u0f37", "\u0f39", "\u0f3e", "\u0f3f", "\u0f71" - "\u0f84", "\u0f86" - "\u0f8b", "\u0f90" - "\u0f95", "\u0f97", "\u0f99" - "\u0fad", "\u0fb1" - "\u0fb7", "\u0fb9", "\u20d0" - "\u20dc", "\u20e1", "\u302a" - "\u302f", "\u3099", "\u309a"] >
-}
-
-TOKEN :
-{
- < #Digit : ["\u0030" - "\u0039", "\u0660" - "\u0669", "\u06f0" - "\u06f9", "\u0966" - "\u096f", "\u09e6" - "\u09ef", "\u0a66" - "\u0a6f", "\u0ae6" - "\u0aef", "\u0b66" - "\u0b6f", "\u0be7" - "\u0bef", "\u0c66" - "\u0c6f", "\u0ce6" - "\u0cef", "\u0d66" - "\u0d6f", "\u0e50" - "\u0e59", "\u0ed0" - "\u0ed9", "\u0f20" - "\u0f29"] >
-}
-
-TOKEN :
-{
- < #Extender : ["\u00b7", "\u02d0", "\u02d1", "\u0387", "\u0640", "\u0e46", "\u0ec6", "\u3005", "\u3031" - "\u3035", "\u309d" - "\u309e", "\u30fc" - "\u30fe"] >
-}
-
-SKIP:
-{
- <"--" (~["\n","\r"])* ("\n"|"\r"|"\r\n")?>
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTest.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTest.java
deleted file mode 100644
index 4ea43a3..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.algebricks.examples.piglet.test;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class PigletTest {
-    public static Test suite() {
-        TestSuite suite = new TestSuite();
-        File dir = new File("testcases");
-        findAndAddTests(suite, dir);
-
-        return suite;
-    }
-
-    private static void findAndAddTests(TestSuite suite, File dir) {
-        for (final File f : dir.listFiles()) {
-            if (f.getName().startsWith(".")) {
-                continue;
-            }
-            if (f.isDirectory()) {
-                findAndAddTests(suite, f);
-            } else if (f.getName().endsWith(".piglet")) {
-                suite.addTest(new PigletTestCase(f));
-            }
-        }
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTestCase.java b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTestCase.java
deleted file mode 100644
index 3964edc..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/src/test/java/org/apache/algebricks/examples/piglet/test/PigletTestCase.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.algebricks.examples.piglet.test;
-
-import java.io.File;
-import java.io.FileReader;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.junit.Test;
-
-import org.apache.hyracks.algebricks.examples.piglet.ast.ASTNode;
-import org.apache.hyracks.algebricks.examples.piglet.compiler.PigletCompiler;
-import org.apache.hyracks.api.job.JobSpecification;
-
-public class PigletTestCase extends TestCase {
-
-    private final File file;
-
-    PigletTestCase(File file) {
-        super("testPiglet");
-        this.file = file;
-    }
-
-    @Test
-    public void testPiglet() {
-        try {
-            FileReader in = new FileReader(file);
-            try {
-                PigletCompiler c = new PigletCompiler();
-
-                List<ASTNode> ast = c.parse(in);
-                JobSpecification jobSpec = c.compile(ast);
-
-                System.err.println(jobSpec.toJSON());
-            } finally {
-                in.close();
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q1.piglet b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q1.piglet
deleted file mode 100644
index ff1806e..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q1.piglet
+++ /dev/null
@@ -1,19 +0,0 @@
--- Licensed to the Apache Software Foundation (ASF) under one
--- or more contributor license agreements.  See the NOTICE file
--- distributed with this work for additional information
--- regarding copyright ownership.  The ASF licenses this file
--- to you under the Apache License, Version 2.0 (the
--- "License"); you may not use this file except in compliance
--- with the License.  You may obtain a copy of the License at
---
---   http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing,
--- software distributed under the License is distributed on an
--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
--- KIND, either express or implied.  See the License for the
--- specific language governing permissions and limitations
--- under the License.
-
-R = load "nc1:data/file1.txt,nc2:data/file2.txt" as (id : int, name : chararray);
-dump R into "nc1:output";
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q2.piglet b/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q2.piglet
deleted file mode 100644
index 0335b7d..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/piglet-example/testcases/q2.piglet
+++ /dev/null
@@ -1,20 +0,0 @@
--- Licensed to the Apache Software Foundation (ASF) under one
--- or more contributor license agreements.  See the NOTICE file
--- distributed with this work for additional information
--- regarding copyright ownership.  The ASF licenses this file
--- to you under the Apache License, Version 2.0 (the
--- "License"); you may not use this file except in compliance
--- with the License.  You may obtain a copy of the License at
---
---   http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing,
--- software distributed under the License is distributed on an
--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
--- KIND, either express or implied.  See the License for the
--- specific language governing permissions and limitations
--- under the License.
-
-R = load "nc1:data/file1.txt,nc2:data/file2.txt" as (id : int, name : chararray);
-S = filter R by id == 5;
-dump S into "nc1:output";
diff --git a/hyracks-fullstack/algebricks/algebricks-examples/pom.xml b/hyracks-fullstack/algebricks/algebricks-examples/pom.xml
deleted file mode 100644
index 83eb312..0000000
--- a/hyracks-fullstack/algebricks/algebricks-examples/pom.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- ! Licensed to the Apache Software Foundation (ASF) under one
- ! or more contributor license agreements.  See the NOTICE file
- ! distributed with this work for additional information
- ! regarding copyright ownership.  The ASF licenses this file
- ! to you under the Apache License, Version 2.0 (the
- ! "License"); you may not use this file except in compliance
- ! with the License.  You may obtain a copy of the License at
- !
- !   http://www.apache.org/licenses/LICENSE-2.0
- !
- ! Unless required by applicable law or agreed to in writing,
- ! software distributed under the License is distributed on an
- ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- ! KIND, either express or implied.  See the License for the
- ! specific language governing permissions and limitations
- ! under the License.
- !-->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>algebricks-examples</artifactId>
-  <packaging>pom</packaging>
-  <name>algebricks-examples</name>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.hyracks</groupId>
-      <artifactId>algebricks-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
-
-  <parent>
-    <groupId>org.apache.hyracks</groupId>
-    <artifactId>algebricks</artifactId>
-    <version>0.3.4-SNAPSHOT</version>
-  </parent>
-
-  <licenses>
-    <license>
-      <name>Apache License, Version 2.0</name>
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-      <distribution>repo</distribution>
-      <comments>A business-friendly OSS license</comments>
-    </license>
-  </licenses>
-
-  <properties>
-    <root.dir>${basedir}/../..</root.dir>
-  </properties>
-
-  <modules>
-    <module>piglet-example</module>
-  </modules>
-</project>
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/pom.xml b/hyracks-fullstack/algebricks/algebricks-rewriter/pom.xml
index 78627a9..d9dccce 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/pom.xml
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/pom.xml
@@ -56,5 +56,9 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceCombinerRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceCombinerRule.java
index 2870074..3f61cc0 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceCombinerRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceCombinerRule.java
@@ -65,9 +65,8 @@
         }
     }
 
-    protected Pair<Boolean, Mutable<ILogicalOperator>> tryToPushAgg(AggregateOperator initAgg,
-            GroupByOperator newGbyOp, Set<SimilarAggregatesInfo> toReplaceSet, IOptimizationContext context)
-            throws AlgebricksException {
+    protected Pair<Boolean, Mutable<ILogicalOperator>> tryToPushAgg(AggregateOperator initAgg, GroupByOperator newGbyOp,
+            Set<SimilarAggregatesInfo> toReplaceSet, IOptimizationContext context) throws AlgebricksException {
 
         List<LogicalVariable> initVars = initAgg.getVariables();
         List<Mutable<ILogicalExpression>> initExprs = initAgg.getExpressions();
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
index ed4196b..a921301 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/AbstractIntroduceGroupByCombinerRule.java
@@ -212,7 +212,7 @@
 
     private Pair<Boolean, ILogicalPlan> tryToPushSubplan(ILogicalPlan nestedPlan, GroupByOperator oldGbyOp,
             GroupByOperator newGbyOp, BookkeepingInfo bi, List<LogicalVariable> gbyVars, IOptimizationContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         List<Mutable<ILogicalOperator>> pushedRoots = new ArrayList<Mutable<ILogicalOperator>>();
         Set<SimilarAggregatesInfo> toReplaceSet = new HashSet<SimilarAggregatesInfo>();
         for (Mutable<ILogicalOperator> r : nestedPlan.getRoots()) {
@@ -272,7 +272,7 @@
     private boolean tryToPushRoot(Mutable<ILogicalOperator> root, GroupByOperator oldGbyOp, GroupByOperator newGbyOp,
             BookkeepingInfo bi, List<LogicalVariable> gbyVars, IOptimizationContext context,
             List<Mutable<ILogicalOperator>> toPushAccumulate, Set<SimilarAggregatesInfo> toReplaceSet)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         AbstractLogicalOperator op1 = (AbstractLogicalOperator) root.getValue();
         if (op1.getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
             return false;
@@ -399,8 +399,7 @@
      * @return the bottom-most reference of a select operator
      */
     private Mutable<ILogicalOperator> findBottomOpRefStayInOldGby(GroupByOperator nestedGby,
-            Mutable<ILogicalOperator> currentOpRef)
-            throws AlgebricksException {
+            Mutable<ILogicalOperator> currentOpRef) throws AlgebricksException {
         Set<LogicalVariable> usedVarsInNestedGby = new HashSet<>();
         // Collects used variables in nested pipelines.
         for (ILogicalPlan nestedPlan : nestedGby.getNestedPlans()) {
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
index f5bec22..d975cce 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/BreakSelectIntoConjunctsRule.java
@@ -43,7 +43,8 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue();
         if (op.getOperatorTag() != LogicalOperatorTag.SELECT) {
             return false;
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ComplexUnnestToProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ComplexUnnestToProductRule.java
index 2ab8520..fa35a98 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ComplexUnnestToProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ComplexUnnestToProductRule.java
@@ -115,8 +115,8 @@
         outerRoot = buildOperatorChain(outerOps, null, context);
         context.computeAndSetTypeEnvironmentForOperator(outerRoot);
 
-        InnerJoinOperator product = new InnerJoinOperator(
-                new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
+        InnerJoinOperator product =
+                new InnerJoinOperator(new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
         // Outer branch.
         product.getInputs().add(new MutableObject<ILogicalOperator>(outerRoot));
         // Inner branch.
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
index 372af26..53548e4 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/CopyLimitDownRule.java
@@ -91,8 +91,8 @@
                 // Need to add an offset to the given limit value
                 // since the original topmost limit will use the offset value.
                 // We can't apply the offset multiple times.
-                IFunctionInfo finfoAdd = context.getMetadataProvider()
-                        .lookupFunction(AlgebricksBuiltinFunctions.NUMERIC_ADD);
+                IFunctionInfo finfoAdd =
+                        context.getMetadataProvider().lookupFunction(AlgebricksBuiltinFunctions.NUMERIC_ADD);
                 List<Mutable<ILogicalExpression>> addArgs = new ArrayList<>();
                 addArgs.add(
                         new MutableObject<ILogicalExpression>(limitOp.getMaxObjects().getValue().cloneExpression()));
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceOrderByAfterSubplan.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceOrderByAfterSubplan.java
index fcec50a..baad59b 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceOrderByAfterSubplan.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceOrderByAfterSubplan.java
@@ -64,7 +64,8 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -108,7 +109,7 @@
                     foundTarget = false;
                     break;
                 }
-                if(child.getOperatorTag() == LogicalOperatorTag.GROUP){
+                if (child.getOperatorTag() == LogicalOperatorTag.GROUP) {
                     foundTarget = false;
                     break;
                 }
@@ -137,8 +138,8 @@
                     return false;
                 }
             }
-            List<Pair<IOrder, Mutable<ILogicalExpression>>> orderExprs = deepCopyOrderAndExpression(sourceOrderOp
-                    .getOrderExpressions());
+            List<Pair<IOrder, Mutable<ILogicalExpression>>> orderExprs =
+                    deepCopyOrderAndExpression(sourceOrderOp.getOrderExpressions());
             OrderOperator newOrderOp = new OrderOperator(orderExprs);
             context.addToDontApplySet(this, newOrderOp);
             inputs.set(i, new MutableObject<ILogicalOperator>(newOrderOp));
@@ -155,15 +156,17 @@
     }
 
     private Mutable<ILogicalExpression> deepCopyExpressionRef(Mutable<ILogicalExpression> oldExpr) {
-        return new MutableObject<ILogicalExpression>(((AbstractLogicalExpression) oldExpr.getValue()).cloneExpression());
+        return new MutableObject<ILogicalExpression>(
+                ((AbstractLogicalExpression) oldExpr.getValue()).cloneExpression());
     }
 
     private List<Pair<IOrder, Mutable<ILogicalExpression>>> deepCopyOrderAndExpression(
             List<Pair<IOrder, Mutable<ILogicalExpression>>> ordersAndExprs) {
-        List<Pair<IOrder, Mutable<ILogicalExpression>>> newOrdersAndExprs = new ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>>();
+        List<Pair<IOrder, Mutable<ILogicalExpression>>> newOrdersAndExprs =
+                new ArrayList<Pair<IOrder, Mutable<ILogicalExpression>>>();
         for (Pair<IOrder, Mutable<ILogicalExpression>> pair : ordersAndExprs)
-            newOrdersAndExprs.add(new Pair<IOrder, Mutable<ILogicalExpression>>(pair.first,
-                    deepCopyExpressionRef(pair.second)));
+            newOrdersAndExprs
+                    .add(new Pair<IOrder, Mutable<ILogicalExpression>>(pair.first, deepCopyExpressionRef(pair.second)));
         return newOrdersAndExprs;
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java
index a1730ac7..da0466e 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java
@@ -123,7 +123,7 @@
         // somewhere else, too.
 
         physicalOptimizationConfig = context.getPhysicalOptimizationConfig();
-        AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> Optimizing operator " + op.getPhysicalOperator() + ".\n");
+        AlgebricksConfig.ALGEBRICKS_LOGGER.debug(">>>> Optimizing operator " + op.getPhysicalOperator() + ".\n");
 
         PhysicalOptimizationsUtil.computeFDsAndEquivalenceClasses(op, context);
 
@@ -132,7 +132,7 @@
                         new LinkedList<ILocalStructuralProperty>());
         boolean changed = physOptimizeOp(opRef, pvector, false, context);
         op.computeDeliveredPhysicalProperties(context);
-        AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> Structural properties for " + op.getPhysicalOperator() + ": "
+        AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> Structural properties for " + op.getPhysicalOperator() + ": "
                 + op.getDeliveredPhysicalProperties() + "\n");
 
         context.addToDontApplySet(this, opRef.getValue());
@@ -149,8 +149,8 @@
             }
             AbstractLogicalOperator op = (AbstractLogicalOperator) root.getValue();
             op.computeDeliveredPhysicalProperties(context);
-            AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> Structural properties for " + op.getPhysicalOperator()
-                    + ": " + op.getDeliveredPhysicalProperties() + "\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> Structural properties for " + op.getPhysicalOperator() + ": "
+                    + op.getDeliveredPhysicalProperties() + "\n");
         }
         return changed;
     }
@@ -250,7 +250,7 @@
             IPhysicalPropertiesVector delivered = child.getDeliveredPhysicalProperties();
 
             AlgebricksConfig.ALGEBRICKS_LOGGER
-                    .finest(">>>> Properties delivered by " + child.getPhysicalOperator() + ": " + delivered + "\n");
+                    .trace(">>>> Properties delivered by " + child.getPhysicalOperator() + ": " + delivered + "\n");
             IPartitioningRequirementsCoordinator prc = pr.getPartitioningCoordinator();
             // Coordinates requirements by looking at the firstDeliveredPartitioning.
             Pair<Boolean, IPartitioningProperty> pbpp = prc.coordinateRequirements(
@@ -260,7 +260,7 @@
                     new StructuralPropertiesVector(pbpp.second, requiredProperty.getLocalProperties());
 
             AlgebricksConfig.ALGEBRICKS_LOGGER
-                    .finest(">>>> Required properties for " + child.getPhysicalOperator() + ": " + rqd + "\n");
+                    .trace(">>>> Required properties for " + child.getPhysicalOperator() + ": " + rqd + "\n");
             // The partitioning property of reqdProperties[childIndex] could be updated here because
             // rqd.getPartitioningProperty() is the same object instance as requiredProperty.getPartitioningProperty().
             IPhysicalPropertiesVector diff = delivered.getUnsatisfiedPropertiesFrom(rqd,
@@ -280,7 +280,7 @@
                     delivered = newChild.getDeliveredPhysicalProperties();
                     IPhysicalPropertiesVector newDiff =
                             newPropertiesDiff(newChild, rqd, mayExpandPartitioningProperties, context);
-                    AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> New properties diff: " + newDiff + "\n");
+                    AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> New properties diff: " + newDiff + "\n");
 
                     if (isRedundantSort(opRef, delivered, newDiff, context)) {
                         opIsRedundantSort = true;
@@ -306,7 +306,7 @@
         if (opIsRedundantSort) {
             if (AlgebricksConfig.DEBUG) {
                 AlgebricksConfig.ALGEBRICKS_LOGGER
-                        .fine(">>>> Removing redundant SORT operator " + op.getPhysicalOperator() + "\n");
+                        .trace(">>>> Removing redundant SORT operator " + op.getPhysicalOperator() + "\n");
                 printOp(op);
             }
             changed = true;
@@ -340,7 +340,7 @@
             newChildEqClasses = context.getEquivalenceClassMap(newChild);
             newChildFDs = context.getFDList(newChild);
         }
-        AlgebricksConfig.ALGEBRICKS_LOGGER.finest(
+        AlgebricksConfig.ALGEBRICKS_LOGGER.trace(
                 ">>>> Required properties for new op. " + newChild.getPhysicalOperator() + ": " + required + "\n");
 
         return newDelivered.getUnsatisfiedPropertiesFrom(required, mayExpandPartitioningProperties, newChildEqClasses,
@@ -446,7 +446,7 @@
             }
             AbstractLogicalOperator newChild = (AbstractLogicalOperator) op.getInputs().get(childIndex).getValue();
             IPhysicalPropertiesVector newDiff = newPropertiesDiff(newChild, required, true, context);
-            AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> New properties diff: " + newDiff + "\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> New properties diff: " + newDiff + "\n");
             if (newDiff != null) {
                 addLocalEnforcers(op, childIndex, newDiff.getLocalProperties(), nestedPlan, context);
             }
@@ -457,7 +457,7 @@
             boolean nestedPlan, IOptimizationContext context) throws AlgebricksException {
         if (AlgebricksConfig.DEBUG) {
             AlgebricksConfig.ALGEBRICKS_LOGGER
-                    .fine(">>>> Adding local enforcers for local props = " + localProperties + "\n");
+                    .trace(">>>> Adding local enforcers for local props = " + localProperties + "\n");
         }
 
         if (localProperties == null || localProperties.isEmpty()) {
@@ -524,7 +524,7 @@
         oo.getInputs().add(topOp);
         context.computeAndSetTypeEnvironmentForOperator(oo);
         if (AlgebricksConfig.DEBUG) {
-            AlgebricksConfig.ALGEBRICKS_LOGGER.fine(">>>> Added sort enforcer " + oo.getPhysicalOperator() + ".\n");
+            AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> Added sort enforcer " + oo.getPhysicalOperator() + ".\n");
         }
         return new MutableObject<ILogicalOperator>(oo);
     }
@@ -608,7 +608,7 @@
             context.computeAndSetTypeEnvironmentForOperator(exchg);
             if (AlgebricksConfig.DEBUG) {
                 AlgebricksConfig.ALGEBRICKS_LOGGER
-                        .fine(">>>> Added partitioning enforcer " + exchg.getPhysicalOperator() + ".\n");
+                        .debug(">>>> Added partitioning enforcer " + exchg.getPhysicalOperator() + ".\n");
                 printOp((AbstractLogicalOperator) op);
             }
         }
@@ -626,7 +626,7 @@
     private void printOp(AbstractLogicalOperator op) throws AlgebricksException {
         LogicalOperatorPrettyPrintVisitor pvisitor = new LogicalOperatorPrettyPrintVisitor();
         PlanPrettyPrinter.printOperator(op, pvisitor, 0);
-        AlgebricksConfig.ALGEBRICKS_LOGGER.fine(pvisitor.get().toString());
+        AlgebricksConfig.ALGEBRICKS_LOGGER.debug(pvisitor.get().toString());
     }
 
     private List<OrderColumn> computeOrderColumns(IPhysicalPropertiesVector pv) {
@@ -655,7 +655,7 @@
         newOp.recomputeSchema();
         newOp.computeDeliveredPhysicalProperties(context);
         context.computeAndSetTypeEnvironmentForOperator(newOp);
-        AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> Structural properties for " + newOp.getPhysicalOperator() + ": "
+        AlgebricksConfig.ALGEBRICKS_LOGGER.trace(">>>> Structural properties for " + newOp.getPhysicalOperator() + ": "
                 + newOp.getDeliveredPhysicalProperties() + "\n");
 
         PhysicalOptimizationsUtil.computeFDsAndEquivalenceClasses(newOp, context);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonExpressionsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonExpressionsRule.java
index f51c9ea..b95d6e4 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonExpressionsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonExpressionsRule.java
@@ -89,7 +89,8 @@
     private final List<ILogicalExpression> originalAssignExprs = new ArrayList<ILogicalExpression>();
 
     private final CommonExpressionSubstitutionVisitor substVisitor = new CommonExpressionSubstitutionVisitor();
-    private final Map<ILogicalExpression, ExprEquivalenceClass> exprEqClassMap = new HashMap<ILogicalExpression, ExprEquivalenceClass>();
+    private final Map<ILogicalExpression, ExprEquivalenceClass> exprEqClassMap =
+            new HashMap<ILogicalExpression, ExprEquivalenceClass>();
 
     // Set of operators for which common subexpression elimination should not be performed.
     private static final Set<LogicalOperatorTag> ignoreOps = new HashSet<LogicalOperatorTag>(6);
@@ -310,8 +311,8 @@
                     return false;
                 }
                 // Place a Select operator beneath op that contains the enclosing expression.
-                SelectOperator selectOp = new SelectOperator(new MutableObject<ILogicalExpression>(enclosingExpr),
-                        false, null);
+                SelectOperator selectOp =
+                        new SelectOperator(new MutableObject<ILogicalExpression>(enclosingExpr), false, null);
                 selectOp.getInputs().add(new MutableObject<ILogicalOperator>(op.getInputs().get(0).getValue()));
                 op.getInputs().get(0).setValue(selectOp);
                 // Set firstOp to be the select below op, since we want to assign the common subexpr there.
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
index 5a4cacd..923ffb5 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractCommonOperatorsRule.java
@@ -52,8 +52,8 @@
 
 public class ExtractCommonOperatorsRule implements IAlgebraicRewriteRule {
 
-    private final HashMap<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>> childrenToParents
-            = new HashMap<>();
+    private final HashMap<Mutable<ILogicalOperator>, List<Mutable<ILogicalOperator>>> childrenToParents =
+            new HashMap<>();
     private final List<Mutable<ILogicalOperator>> roots = new ArrayList<>();
     private final List<List<Mutable<ILogicalOperator>>> equivalenceClasses = new ArrayList<>();
     private final HashMap<Mutable<ILogicalOperator>, BitSet> opToCandidateInputs = new HashMap<>();
@@ -210,7 +210,8 @@
                     continue;
                 }
                 ArrayList<LogicalVariable> liveVars = new ArrayList<LogicalVariable>();
-                Map<LogicalVariable, LogicalVariable> variableMappingBack = new HashMap<LogicalVariable, LogicalVariable>();
+                Map<LogicalVariable, LogicalVariable> variableMappingBack =
+                        new HashMap<LogicalVariable, LogicalVariable>();
                 IsomorphismUtilities.mapVariablesTopDown(ref.getValue(), candidate.getValue(), variableMappingBack);
                 for (int i = 0; i < liveVarsNew.size(); i++) {
                     liveVars.add(variableMappingBack.get(liveVarsNew.get(i)));
@@ -240,8 +241,8 @@
                 for (Mutable<ILogicalOperator> parentOpRef : parentOpList) {
                     AbstractLogicalOperator parentOp = (AbstractLogicalOperator) parentOpRef.getValue();
                     int index = parentOp.getInputs().indexOf(ref);
-                    ILogicalOperator childOp = parentOp.getOperatorTag() == LogicalOperatorTag.PROJECT ? assignOperator
-                            : projectOperator;
+                    ILogicalOperator childOp =
+                            parentOp.getOperatorTag() == LogicalOperatorTag.PROJECT ? assignOperator : projectOperator;
                     if (!HeuristicOptimizer.isHyracksOp(parentOp.getPhysicalOperator().getOperatorTag())) {
                         parentOp.getInputs().set(index, new MutableObject<ILogicalOperator>(childOp));
                     } else {
@@ -263,7 +264,8 @@
     }
 
     private void genCandidates(IOptimizationContext context) throws AlgebricksException {
-        List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses = new ArrayList<List<Mutable<ILogicalOperator>>>();
+        List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses =
+                new ArrayList<List<Mutable<ILogicalOperator>>>();
         while (equivalenceClasses.size() > 0) {
             previousEquivalenceClasses.clear();
             for (List<Mutable<ILogicalOperator>> candidates : equivalenceClasses) {
@@ -364,7 +366,8 @@
     }
 
     private void prune(IOptimizationContext context) throws AlgebricksException {
-        List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses = new ArrayList<List<Mutable<ILogicalOperator>>>();
+        List<List<Mutable<ILogicalOperator>>> previousEquivalenceClasses =
+                new ArrayList<List<Mutable<ILogicalOperator>>>();
         for (List<Mutable<ILogicalOperator>> candidates : equivalenceClasses) {
             List<Mutable<ILogicalOperator>> candidatesCopy = new ArrayList<Mutable<ILogicalOperator>>();
             candidatesCopy.addAll(candidates);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractFunctionsFromJoinConditionRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractFunctionsFromJoinConditionRule.java
index 71a00bf..198510a 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractFunctionsFromJoinConditionRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractFunctionsFromJoinConditionRule.java
@@ -63,7 +63,8 @@
 public class ExtractFunctionsFromJoinConditionRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -104,8 +105,8 @@
             for (Mutable<ILogicalExpression> exprRef : fexp.getArguments()) {
                 if (exprRef.getValue().getExpressionTag() == LogicalExpressionTag.FUNCTION_CALL) {
                     LogicalVariable newVar = context.newVar();
-                    AssignOperator newAssign = new AssignOperator(newVar, new MutableObject<ILogicalExpression>(exprRef
-                            .getValue().cloneExpression()));
+                    AssignOperator newAssign = new AssignOperator(newVar,
+                            new MutableObject<ILogicalExpression>(exprRef.getValue().cloneExpression()));
                     newAssign.setExecutionMode(joinOp.getExecutionMode());
 
                     // Place assign below joinOp.
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractGroupByDecorVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractGroupByDecorVariablesRule.java
index a2ad732..05cc7b6 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractGroupByDecorVariablesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ExtractGroupByDecorVariablesRule.java
@@ -66,7 +66,7 @@
         for (Pair<LogicalVariable, Mutable<ILogicalExpression>> decorVarExpr : decorList) {
             Mutable<ILogicalExpression> exprRef = decorVarExpr.second;
             ILogicalExpression expr = exprRef.getValue();
-            if (expr ==null || expr.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
+            if (expr == null || expr.getExpressionTag() == LogicalExpressionTag.VARIABLE) {
                 continue;
             }
             // Rewrites the decoration entry if the decoration expression is not a variable reference expression.
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/FactorRedundantGroupAndDecorVarsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/FactorRedundantGroupAndDecorVarsRule.java
index 38776c6..2f28a84 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/FactorRedundantGroupAndDecorVarsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/FactorRedundantGroupAndDecorVarsRule.java
@@ -43,7 +43,8 @@
 public class FactorRedundantGroupAndDecorVarsRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -77,8 +78,8 @@
             LogicalVariable lhs = varRhsToLhs.get(v);
             if (lhs != null) {
                 if (p.first != null) {
-                    AssignOperator assign = new AssignOperator(p.first, new MutableObject<ILogicalExpression>(
-                            new VariableReferenceExpression(lhs)));
+                    AssignOperator assign = new AssignOperator(p.first,
+                            new MutableObject<ILogicalExpression>(new VariableReferenceExpression(lhs)));
                     ILogicalOperator op = opRef.getValue();
                     assign.getInputs().add(new MutableObject<ILogicalOperator>(op));
                     opRef.setValue(assign);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InferTypesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InferTypesRule.java
index a61b1a2..8d54a67 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InferTypesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InferTypesRule.java
@@ -28,7 +28,8 @@
 public class InferTypesRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
index 71fde61..2c825b7 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/InlineSingleReferenceVariablesRule.java
@@ -51,7 +51,8 @@
 public class InlineSingleReferenceVariablesRule extends InlineVariablesRule {
 
     // Maps from variable to a list of operators using that variable.
-    protected Map<LogicalVariable, List<ILogicalOperator>> usedVarsMap = new HashMap<LogicalVariable, List<ILogicalOperator>>();
+    protected Map<LogicalVariable, List<ILogicalOperator>> usedVarsMap =
+            new HashMap<LogicalVariable, List<ILogicalOperator>>();
     protected List<LogicalVariable> usedVars = new ArrayList<LogicalVariable>();
 
     @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroJoinInsideSubplanRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroJoinInsideSubplanRule.java
index 641ccfe..081f199 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroJoinInsideSubplanRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/IntroJoinInsideSubplanRule.java
@@ -85,12 +85,12 @@
                         OperatorPropertiesUtil.getFreeVariablesInSelfOrDesc(op1, free1);
                         if (!free1.isEmpty()) {
                             OperatorManipulationUtil.ntsToEts(op2Ref, context);
-                            NestedTupleSourceOperator nts = new NestedTupleSourceOperator(
-                                    new MutableObject<ILogicalOperator>(subplan));
+                            NestedTupleSourceOperator nts =
+                                    new NestedTupleSourceOperator(new MutableObject<ILogicalOperator>(subplan));
                             Mutable<ILogicalOperator> ntsRef = new MutableObject<ILogicalOperator>(nts);
                             Mutable<ILogicalOperator> innerRef = new MutableObject<ILogicalOperator>(op2);
-                            InnerJoinOperator join = new InnerJoinOperator(new MutableObject<ILogicalExpression>(
-                                    ConstantExpression.TRUE), ntsRef, innerRef);
+                            InnerJoinOperator join = new InnerJoinOperator(
+                                    new MutableObject<ILogicalExpression>(ConstantExpression.TRUE), ntsRef, innerRef);
                             op2Ref.setValue(join);
                             context.computeAndSetTypeEnvironmentForOperator(nts);
                             context.computeAndSetTypeEnvironmentForOperator(join);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PullSelectOutOfEqJoin.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PullSelectOutOfEqJoin.java
index da85e0d..a5cc573 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PullSelectOutOfEqJoin.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PullSelectOutOfEqJoin.java
@@ -43,7 +43,8 @@
 public class PullSelectOutOfEqJoin implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
index bbb01dd..43c58e2 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignBelowUnionAllRule.java
@@ -110,8 +110,8 @@
             for (int j = 0; j < assignVars.size(); j++) {
                 LogicalVariable first = newAssignOps[0].getVariables().get(j);
                 LogicalVariable second = newAssignOps[1].getVariables().get(j);
-                Triple<LogicalVariable, LogicalVariable, LogicalVariable> varMapping = new Triple<LogicalVariable, LogicalVariable, LogicalVariable>(
-                        first, second, assignVars.get(j));
+                Triple<LogicalVariable, LogicalVariable, LogicalVariable> varMapping =
+                        new Triple<LogicalVariable, LogicalVariable, LogicalVariable>(first, second, assignVars.get(j));
                 unionOp.getVariableMappings().add(varMapping);
             }
             context.computeAndSetTypeEnvironmentForOperator(unionOp);
@@ -127,7 +127,7 @@
 
     private AssignOperator createAssignBelowUnionAllBranch(UnionAllOperator unionOp, int inputIndex,
             AssignOperator originalAssignOp, Set<LogicalVariable> assignUsedVars, IOptimizationContext context)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         AssignOperator newAssignOp = cloneAssignOperator(originalAssignOp, context);
         newAssignOp.getInputs()
                 .add(new MutableObject<ILogicalOperator>(unionOp.getInputs().get(inputIndex).getValue()));
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignDownThroughProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignDownThroughProductRule.java
index f3f0e02..edd7e23 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignDownThroughProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushAssignDownThroughProductRule.java
@@ -37,7 +37,8 @@
 public class PushAssignDownThroughProductRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushFunctionsBelowJoin.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushFunctionsBelowJoin.java
index c04a9d5..d7090d2 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushFunctionsBelowJoin.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushFunctionsBelowJoin.java
@@ -84,7 +84,8 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushGroupByIntoSortRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushGroupByIntoSortRule.java
index 7ea1327..192e318 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushGroupByIntoSortRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushGroupByIntoSortRule.java
@@ -46,7 +46,8 @@
 public class PushGroupByIntoSortRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
@@ -67,8 +68,8 @@
                     Mutable<ILogicalOperator> op2Ref = op.getInputs().get(0).getValue().getInputs().get(0);
                     AbstractLogicalOperator op2 = (AbstractLogicalOperator) op2Ref.getValue();
                     if (op2.getPhysicalOperator().getOperatorTag() == PhysicalOperatorTag.STABLE_SORT) {
-                        AbstractStableSortPOperator sortPhysicalOperator = (AbstractStableSortPOperator) op2
-                                .getPhysicalOperator();
+                        AbstractStableSortPOperator sortPhysicalOperator =
+                                (AbstractStableSortPOperator) op2.getPhysicalOperator();
                         if (groupByOperator.getNestedPlans().size() != 1) {
                             //Sort group-by currently works only for one nested plan with one root containing
                             //an aggregate and a nested-tuple-source.
@@ -88,13 +89,14 @@
                             continue;
                         }
                         AggregateOperator aggOp = (AggregateOperator) r0.getValue();
-                        AbstractLogicalOperator aggInputOp = (AbstractLogicalOperator) aggOp.getInputs().get(0)
-                                .getValue();
+                        AbstractLogicalOperator aggInputOp =
+                                (AbstractLogicalOperator) aggOp.getInputs().get(0).getValue();
                         if (aggInputOp.getOperatorTag() != LogicalOperatorTag.NESTEDTUPLESOURCE) {
                             continue;
                         }
 
-                        boolean hasIntermediateAggregate = generateMergeAggregationExpressions(groupByOperator, context);
+                        boolean hasIntermediateAggregate =
+                                generateMergeAggregationExpressions(groupByOperator, context);
                         if (!hasIntermediateAggregate) {
                             continue;
                         }
@@ -132,8 +134,8 @@
                     "External/sort group-by currently works only for one nested plan with one root containing"
                             + "an aggregate and a nested-tuple-source.");
         }
-        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory = context
-                .getMergeAggregationExpressionFactory();
+        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory =
+                context.getMergeAggregationExpressionFactory();
         Mutable<ILogicalOperator> r0 = p0.getRoots().get(0);
         AggregateOperator aggOp = (AggregateOperator) r0.getValue();
         List<Mutable<ILogicalExpression>> aggFuncRefs = aggOp.getExpressions();
@@ -141,8 +143,8 @@
         int n = aggOp.getExpressions().size();
         List<Mutable<ILogicalExpression>> mergeExpressionRefs = new ArrayList<Mutable<ILogicalExpression>>();
         for (int i = 0; i < n; i++) {
-            ILogicalExpression mergeExpr = mergeAggregationExpressionFactory.createMergeAggregation(
-                    originalAggVars.get(i), aggFuncRefs.get(i).getValue(), context);
+            ILogicalExpression mergeExpr = mergeAggregationExpressionFactory
+                    .createMergeAggregation(originalAggVars.get(i), aggFuncRefs.get(i).getValue(), context);
             if (mergeExpr == null) {
                 return false;
             }
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
index f71af5a..3181459 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushMapOperatorDownThroughProductRule.java
@@ -53,7 +53,7 @@
 
         if (!OperatorPropertiesUtil.isMovable(op1)) {
             return false;
-        };
+        } ;
 
         Mutable<ILogicalOperator> op2Ref = op1.getInputs().get(0);
         AbstractLogicalOperator op2 = (AbstractLogicalOperator) op2Ref.getValue();
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushNestedOrderByUnderPreSortedGroupByRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushNestedOrderByUnderPreSortedGroupByRule.java
index fc7b98e..aa58985 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushNestedOrderByUnderPreSortedGroupByRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushNestedOrderByUnderPreSortedGroupByRule.java
@@ -45,7 +45,8 @@
 public class PushNestedOrderByUnderPreSortedGroupByRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectIntoDataSourceScanRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectIntoDataSourceScanRule.java
index e05619f..281093a 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectIntoDataSourceScanRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushProjectIntoDataSourceScanRule.java
@@ -32,7 +32,8 @@
 public class PushProjectIntoDataSourceScanRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushSubplanWithAggregateDownThroughProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushSubplanWithAggregateDownThroughProductRule.java
index 54c5728..d135846 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushSubplanWithAggregateDownThroughProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushSubplanWithAggregateDownThroughProductRule.java
@@ -41,7 +41,8 @@
 public class PushSubplanWithAggregateDownThroughProductRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughProductRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughProductRule.java
index 2da1343..4c2c4da 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughProductRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughProductRule.java
@@ -37,7 +37,8 @@
 public class PushUnnestDownThroughProductRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughUnionRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughUnionRule.java
index b6556e9..3ef37cd 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughUnionRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/PushUnnestDownThroughUnionRule.java
@@ -79,11 +79,11 @@
         }
 
         LogicalVariable unnestVar1 = context.newVar();
-        UnnestOperator unnest1 = new UnnestOperator(unnestVar1, new MutableObject<ILogicalExpression>(unnestOpRef
-                .getExpressionRef().getValue().cloneExpression()));
+        UnnestOperator unnest1 = new UnnestOperator(unnestVar1,
+                new MutableObject<ILogicalExpression>(unnestOpRef.getExpressionRef().getValue().cloneExpression()));
         LogicalVariable unnestVar2 = context.newVar();
-        UnnestOperator unnest2 = new UnnestOperator(unnestVar2, new MutableObject<ILogicalExpression>(unnestOpRef
-                .getExpressionRef().getValue().cloneExpression()));
+        UnnestOperator unnest2 = new UnnestOperator(unnestVar2,
+                new MutableObject<ILogicalExpression>(unnestOpRef.getExpressionRef().getValue().cloneExpression()));
 
         //Getting the two topmost branched and adding them as an input to the unnests:
         Mutable<ILogicalOperator> branch1 = unionAbstractOp.getInputs().get(0);
@@ -110,10 +110,11 @@
         context.computeAndSetTypeEnvironmentForOperator(unnest2);
 
         //creating a new union operator with the updated logical variables
-        List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> varMap = new ArrayList<Triple<LogicalVariable, LogicalVariable, LogicalVariable>>(
-                1);
-        Triple<LogicalVariable, LogicalVariable, LogicalVariable> union_triple_vars = new Triple<LogicalVariable, LogicalVariable, LogicalVariable>(
-                unnestVar1, unnestVar2, unnestOpRef.getVariables().get(0));
+        List<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> varMap =
+                new ArrayList<Triple<LogicalVariable, LogicalVariable, LogicalVariable>>(1);
+        Triple<LogicalVariable, LogicalVariable, LogicalVariable> union_triple_vars =
+                new Triple<LogicalVariable, LogicalVariable, LogicalVariable>(unnestVar1, unnestVar2,
+                        unnestOpRef.getVariables().get(0));
         varMap.add(union_triple_vars);
         UnionAllOperator unionOpFinal = new UnionAllOperator(varMap);
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ReinferAllTypesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ReinferAllTypesRule.java
index b43363a..bf649ab 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ReinferAllTypesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/ReinferAllTypesRule.java
@@ -37,7 +37,8 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         if (context.checkIfInDontApplySet(this, opRef.getValue())) {
             return false;
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantProjectionRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantProjectionRule.java
index 38e97d7..fbaab78 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantProjectionRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantProjectionRule.java
@@ -53,7 +53,8 @@
     }
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         AbstractLogicalOperator op1 = (AbstractLogicalOperator) opRef.getValue();
         if (op1.getOperatorTag() == LogicalOperatorTag.PROJECT) {
             Mutable<ILogicalOperator> opRef2 = op1.getInputs().get(0);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantVariablesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantVariablesRule.java
index 2f0913b..5386193 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantVariablesRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveRedundantVariablesRule.java
@@ -69,7 +69,8 @@
 public class RemoveRedundantVariablesRule implements IAlgebraicRewriteRule {
 
     private final VariableSubstitutionVisitor substVisitor = new VariableSubstitutionVisitor();
-    private final Map<LogicalVariable, List<LogicalVariable>> equivalentVarsMap = new HashMap<LogicalVariable, List<LogicalVariable>>();
+    private final Map<LogicalVariable, List<LogicalVariable>> equivalentVarsMap =
+            new HashMap<LogicalVariable, List<LogicalVariable>>();
 
     @Override
     public boolean rewritePost(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
index 84d7c9d..e42c067 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnnecessarySortMergeExchange.java
@@ -110,8 +110,8 @@
             for (OrderColumn oc : sme.getSortColumns()) {
                 ocList.add(oc);
             }
-            HashPartitionMergeExchangePOperator hpme = new HashPartitionMergeExchangePOperator(ocList,
-                    hpe.getHashFields(), hpe.getDomain());
+            HashPartitionMergeExchangePOperator hpme =
+                    new HashPartitionMergeExchangePOperator(ocList, hpe.getHashFields(), hpe.getDomain());
             op1.setPhysicalOperator(hpme);
         }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java
index 5bf4e6881..e197814 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/RemoveUnusedAssignAndAggregateRule.java
@@ -126,8 +126,8 @@
         // since we are sure that the output of UNIONALL operator is used
         // afterwards.
         if (opRef.getValue().getOperatorTag() == LogicalOperatorTag.UNIONALL) {
-            Iterator<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> iter = ((UnionAllOperator) opRef
-                    .getValue()).getVariableMappings().iterator();
+            Iterator<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> iter =
+                    ((UnionAllOperator) opRef.getValue()).getVariableMappings().iterator();
             while (iter.hasNext()) {
                 Triple<LogicalVariable, LogicalVariable, LogicalVariable> varMapping = iter.next();
                 survivedUnionSourceVarSet.add(varMapping.first);
@@ -240,8 +240,8 @@
     }
 
     private boolean removeUnusedVarsFromUnionAll(UnionAllOperator unionOp, Set<LogicalVariable> toRemove) {
-        Iterator<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> iter = unionOp.getVariableMappings()
-                .iterator();
+        Iterator<Triple<LogicalVariable, LogicalVariable, LogicalVariable>> iter =
+                unionOp.getVariableMappings().iterator();
         boolean modified = false;
         if (toRemove != null && !toRemove.isEmpty()) {
             while (iter.hasNext()) {
@@ -361,8 +361,8 @@
                     } else {
                         // A decor var mapping can have a variable reference expression without a new variable
                         // definition, which is for rebinding the referred variable.
-                        VariableReferenceExpression varExpr = (VariableReferenceExpression) decorMapping.second
-                                .getValue();
+                        VariableReferenceExpression varExpr =
+                                (VariableReferenceExpression) decorMapping.second.getValue();
                         LogicalVariable reboundDecorVar = varExpr.getVariableReference();
                         assignVarsSetInThisOp.add(reboundDecorVar);
                     }
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
index 84961d6..d277043 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/SetAlgebricksPhysicalOperatorsRule.java
@@ -67,6 +67,7 @@
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.LeftOuterUnnestPOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.MicroPreSortedDistinctByPOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.MicroPreclusteredGroupByPOperator;
+import org.apache.hyracks.algebricks.core.algebra.operators.physical.MicroUnionAllPOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.NestedTupleSourcePOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.PreSortedDistinctByPOperator;
 import org.apache.hyracks.algebricks.core.algebra.operators.physical.PreclusteredGroupByPOperator;
@@ -172,8 +173,7 @@
                                 boolean hasIntermediateAgg = generateMergeAggregationExpressions(gby, context);
                                 if (hasIntermediateAgg) {
                                     ExternalGroupByPOperator externalGby = new ExternalGroupByPOperator(
-                                            gby.getGroupByList(),
-                                            physicalOptimizationConfig.getMaxFramesForGroupBy(),
+                                            gby.getGroupByList(), physicalOptimizationConfig.getMaxFramesForGroupBy(),
                                             (long) physicalOptimizationConfig.getMaxFramesForGroupBy()
                                                     * physicalOptimizationConfig.getFrameSize());
                                     op.setPhysicalOperator(externalGby);
@@ -201,11 +201,11 @@
                     break;
                 }
                 case INNERJOIN: {
-                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((InnerJoinOperator) op, context);
+                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((InnerJoinOperator) op, topLevelOp, context);
                     break;
                 }
                 case LEFTOUTERJOIN: {
-                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((LeftOuterJoinOperator) op, context);
+                    JoinUtils.setJoinAlgorithmAndExchangeAlgo((LeftOuterJoinOperator) op, topLevelOp, context);
                     break;
                 }
                 case LIMIT: {
@@ -260,11 +260,19 @@
                     break;
                 }
                 case UNIONALL: {
-                    op.setPhysicalOperator(new UnionAllPOperator());
+                    if (topLevelOp) {
+                        op.setPhysicalOperator(new UnionAllPOperator());
+                    } else {
+                        op.setPhysicalOperator(new MicroUnionAllPOperator());
+                    }
                     break;
                 }
                 case INTERSECT: {
-                    op.setPhysicalOperator(new IntersectPOperator());
+                    if (topLevelOp) {
+                        op.setPhysicalOperator(new IntersectPOperator());
+                    } else {
+                        throw new IllegalStateException("Micro operator not implemented for: " + op.getOperatorTag());
+                    }
                     break;
                 }
                 case UNNEST: {
@@ -354,8 +362,9 @@
                             prevSecondaryKeys = new ArrayList<LogicalVariable>();
                             getKeys(opInsDel.getPrevSecondaryKeyExprs(), prevSecondaryKeys);
                             if (opInsDel.getPrevAdditionalFilteringExpression() != null) {
-                                prevAdditionalFilteringKey = ((VariableReferenceExpression) (opInsDel
-                                        .getPrevAdditionalFilteringExpression()).getValue()).getVariableReference();
+                                prevAdditionalFilteringKey =
+                                        ((VariableReferenceExpression) (opInsDel.getPrevAdditionalFilteringExpression())
+                                                .getValue()).getVariableReference();
                             }
                         }
                         op.setPhysicalOperator(new IndexInsertDeleteUpsertPOperator(primaryKeys, secondaryKeys,
@@ -441,8 +450,8 @@
                     "External group-by currently works only for one nested plan with one root containing"
                             + "an aggregate and a nested-tuple-source.");
         }
-        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory = context
-                .getMergeAggregationExpressionFactory();
+        IMergeAggregationExpressionFactory mergeAggregationExpressionFactory =
+                context.getMergeAggregationExpressionFactory();
         Mutable<ILogicalOperator> r0 = p0.getRoots().get(0);
         AbstractLogicalOperator r0Logical = (AbstractLogicalOperator) r0.getValue();
         if (r0Logical.getOperatorTag() != LogicalOperatorTag.AGGREGATE) {
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanRule.java
index 32c7e03..4cd15a0 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanRule.java
@@ -74,8 +74,8 @@
 
     private boolean elimOneSubplanWithNoFreeVars(Mutable<ILogicalOperator> opRef) {
         SubplanOperator subplan = (SubplanOperator) opRef.getValue();
-        AbstractLogicalOperator rootOp = (AbstractLogicalOperator) subplan.getNestedPlans().get(0).getRoots().get(0)
-                .getValue();
+        AbstractLogicalOperator rootOp =
+                (AbstractLogicalOperator) subplan.getNestedPlans().get(0).getRoots().get(0).getValue();
         if (rootOp.getOperatorTag() == LogicalOperatorTag.EMPTYTUPLESOURCE
                 || rootOp.getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE) {
             opRef.setValue(subplan.getInputs().get(0).getValue());
@@ -115,8 +115,8 @@
                 if (topOp == null) {
                     topOp = r.getValue();
                 } else {
-                    InnerJoinOperator j = new InnerJoinOperator(
-                            new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
+                    InnerJoinOperator j =
+                            new InnerJoinOperator(new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
                     j.getInputs().add(new MutableObject<ILogicalOperator>(topOp));
                     j.getInputs().add(r);
                     ctx.setOutputTypeEnvironment(j, j.computeOutputTypeEnvironment(ctx));
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanWithInputCardinalityOneRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanWithInputCardinalityOneRule.java
index 607ea1f..e2576ba 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanWithInputCardinalityOneRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/EliminateSubplanWithInputCardinalityOneRule.java
@@ -122,8 +122,8 @@
 
             // Replaces all Nts' in the nested plan with the Subplan input operator or its deep copy.
             ILogicalOperator topOperator = rootRefs.get(0).getValue();
-            ReplaceNtsWithSubplanInputOperatorVisitor visitor = new ReplaceNtsWithSubplanInputOperatorVisitor(context,
-                    subplan);
+            ReplaceNtsWithSubplanInputOperatorVisitor visitor =
+                    new ReplaceNtsWithSubplanInputOperatorVisitor(context, subplan);
             ILogicalOperator newTopOperator = topOperator.accept(visitor, null);
             currentOpRef.setValue(newTopOperator);
             OperatorManipulationUtil.computeTypeEnvironmentBottomUp(newTopOperator, context);
@@ -168,7 +168,7 @@
      */
     private void isCardinalityOne(Mutable<ILogicalOperator> opRef, Set<LogicalVariable> freeVars,
             Set<LogicalVariable> varsWithCardinalityOne, Set<LogicalVariable> varsLiveAtUnnestAndJoin)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         AbstractLogicalOperator operator = (AbstractLogicalOperator) opRef.getValue();
         List<LogicalVariable> liveVars = new ArrayList<>();
         VariableUtilities.getLiveVariables(operator, liveVars);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
index 836f266..c4ea604 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/IntroduceGroupByForSubplanRule.java
@@ -201,7 +201,7 @@
             //retain the intersection
             pkVars.retainAll(producedVars);
         }
-        AlgebricksConfig.ALGEBRICKS_LOGGER.fine("Found FD for introducing group-by: " + pkVars);
+        AlgebricksConfig.ALGEBRICKS_LOGGER.debug("Found FD for introducing group-by: " + pkVars);
 
         Mutable<ILogicalOperator> rightRef = join.getInputs().get(1);
         LogicalVariable testForNull = null;
@@ -236,8 +236,8 @@
         }
         if (testForNull == null) {
             testForNull = context.newVar();
-            AssignOperator tmpAsgn = new AssignOperator(testForNull,
-                    new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
+            AssignOperator tmpAsgn =
+                    new AssignOperator(testForNull, new MutableObject<ILogicalExpression>(ConstantExpression.TRUE));
             tmpAsgn.getInputs().add(new MutableObject<ILogicalOperator>(rightRef.getValue()));
             rightRef.setValue(tmpAsgn);
             context.computeAndSetTypeEnvironmentForOperator(tmpAsgn);
@@ -247,10 +247,10 @@
         ILogicalExpression isNullTest = new ScalarFunctionCallExpression(finfoEq,
                 new MutableObject<ILogicalExpression>(new VariableReferenceExpression(testForNull)));
         IFunctionInfo finfoNot = context.getMetadataProvider().lookupFunction(AlgebricksBuiltinFunctions.NOT);
-        ScalarFunctionCallExpression nonNullTest = new ScalarFunctionCallExpression(finfoNot,
-                new MutableObject<ILogicalExpression>(isNullTest));
-        SelectOperator selectNonNull = new SelectOperator(new MutableObject<ILogicalExpression>(nonNullTest), false,
-                null);
+        ScalarFunctionCallExpression nonNullTest =
+                new ScalarFunctionCallExpression(finfoNot, new MutableObject<ILogicalExpression>(isNullTest));
+        SelectOperator selectNonNull =
+                new SelectOperator(new MutableObject<ILogicalExpression>(nonNullTest), false, null);
         GroupByOperator g = new GroupByOperator();
         Mutable<ILogicalOperator> newSubplanRef = new MutableObject<ILogicalOperator>(subplan);
         NestedTupleSourceOperator nts = new NestedTupleSourceOperator(new MutableObject<ILogicalOperator>(g));
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/MoveFreeVariableOperatorOutOfSubplanRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/MoveFreeVariableOperatorOutOfSubplanRule.java
index fa893d5..94cae74 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/MoveFreeVariableOperatorOutOfSubplanRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/MoveFreeVariableOperatorOutOfSubplanRule.java
@@ -125,7 +125,7 @@
             LogicalOperatorTag operatorTag = currentOperator.getOperatorTag();
             if (operatorTag == LogicalOperatorTag.AGGREGATE || operatorTag == LogicalOperatorTag.RUNNINGAGGREGATE
                     || operatorTag == LogicalOperatorTag.GROUP) {
-                        return false;
+                return false;
             }
             if (operatorTag == LogicalOperatorTag.PROJECT) {
                 Set<LogicalVariable> producedVars = new HashSet<>();
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/NestedSubplanToJoinRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/NestedSubplanToJoinRule.java
index 35c7e4e..d9acf53 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/NestedSubplanToJoinRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/NestedSubplanToJoinRule.java
@@ -109,8 +109,8 @@
              **/
             Mutable<ILogicalExpression> expr = new MutableObject<ILogicalExpression>(ConstantExpression.TRUE);
             Mutable<ILogicalOperator> nestedRootRef = nestedRoots.get(0);
-            ILogicalOperator join = new InnerJoinOperator(expr, new MutableObject<ILogicalOperator>(subplanInput),
-                    nestedRootRef);
+            ILogicalOperator join =
+                    new InnerJoinOperator(expr, new MutableObject<ILogicalOperator>(subplanInput), nestedRootRef);
 
             /** rewrite the nested tuple source to be empty tuple source */
             rewriteNestedTupleSource(nestedRootRef, context);
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/PushSubplanIntoGroupByRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/PushSubplanIntoGroupByRule.java
index af95ecd..3efa46b 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/PushSubplanIntoGroupByRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/PushSubplanIntoGroupByRule.java
@@ -139,6 +139,10 @@
                 while (upperSubplanRootRefIterator.hasNext()) {
                     Mutable<ILogicalOperator> rootOpRef = upperSubplanRootRefIterator.next();
 
+                    if (downToNts(rootOpRef) == null) {
+                        continue;
+                    }
+
                     // Collects free variables in the root operator of a nested plan and its descent.
                     Set<LogicalVariable> freeVars = new ListSet<>();
                     OperatorPropertiesUtil.getFreeVariablesInSelfOrDesc((AbstractLogicalOperator) rootOpRef.getValue(),
@@ -154,8 +158,11 @@
                             // Sets the nts for a original subplan.
                             Mutable<ILogicalOperator> originalGbyRootOpRef = gbyNestedPlan.getRoots().get(rootIndex);
                             Mutable<ILogicalOperator> originalGbyNtsRef = downToNts(originalGbyRootOpRef);
-                            NestedTupleSourceOperator originalNts = (NestedTupleSourceOperator) originalGbyNtsRef
-                                    .getValue();
+                            if (originalGbyNtsRef == null) {
+                                continue;
+                            }
+                            NestedTupleSourceOperator originalNts =
+                                    (NestedTupleSourceOperator) originalGbyNtsRef.getValue();
                             originalNts.setDataSourceReference(new MutableObject<>(gby));
 
                             // Pushes a new subplan if possible.
@@ -265,11 +272,13 @@
     }
 
     private Mutable<ILogicalOperator> downToNts(Mutable<ILogicalOperator> opRef) {
-        Mutable<ILogicalOperator> currentOpRef = opRef;
-        while (currentOpRef.getValue().getInputs().size() > 0) {
-            currentOpRef = currentOpRef.getValue().getInputs().get(0);
+        List<Mutable<ILogicalOperator>> leafOps = OperatorManipulationUtil.findLeafDescendantsOrSelf(opRef);
+        if (leafOps.size() == 1) {
+            Mutable<ILogicalOperator> leafOp = leafOps.get(0);
+            if (leafOp.getValue().getOperatorTag() == LogicalOperatorTag.NESTEDTUPLESOURCE) {
+                return leafOp;
+            }
         }
-        return currentOpRef;
+        return null;
     }
-
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/ReplaceNtsWithSubplanInputOperatorVisitor.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/ReplaceNtsWithSubplanInputOperatorVisitor.java
index 080828d..35aa984 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/ReplaceNtsWithSubplanInputOperatorVisitor.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/ReplaceNtsWithSubplanInputOperatorVisitor.java
@@ -141,8 +141,8 @@
             isOriginalCopyUsed = true;
             return subplanInputOperator;
         }
-        LogicalOperatorDeepCopyWithNewVariablesVisitor visitor = new LogicalOperatorDeepCopyWithNewVariablesVisitor(ctx,
-                ctx);
+        LogicalOperatorDeepCopyWithNewVariablesVisitor visitor =
+                new LogicalOperatorDeepCopyWithNewVariablesVisitor(ctx, ctx);
         ILogicalOperator copiedSubplanInputOperator = visitor.deepCopy(subplanInputOperator);
         varMap.putAll(visitor.getInputToOutputVariableMapping());
         return copiedSubplanInputOperator;
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/SubplanOutOfGroupRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/SubplanOutOfGroupRule.java
index 049e853..b9b2cee 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/SubplanOutOfGroupRule.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/subplan/SubplanOutOfGroupRule.java
@@ -51,7 +51,8 @@
 public class SubplanOutOfGroupRule implements IAlgebraicRewriteRule {
 
     @Override
-    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException {
+    public boolean rewritePre(Mutable<ILogicalOperator> opRef, IOptimizationContext context)
+            throws AlgebricksException {
         return false;
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java
index 652f062..0bc2a5e 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/JoinUtils.java
@@ -51,8 +51,11 @@
     private JoinUtils() {
     }
 
-    public static void setJoinAlgorithmAndExchangeAlgo(AbstractBinaryJoinOperator op, IOptimizationContext context)
-            throws AlgebricksException {
+    public static void setJoinAlgorithmAndExchangeAlgo(AbstractBinaryJoinOperator op, boolean topLevelOp,
+            IOptimizationContext context) throws AlgebricksException {
+        if (!topLevelOp) {
+            throw new IllegalStateException("Micro operator not implemented for: " + op.getOperatorTag());
+        }
         List<LogicalVariable> sideLeft = new LinkedList<>();
         List<LogicalVariable> sideRight = new LinkedList<>();
         List<LogicalVariable> varsLeft = op.getInputs().get(0).getValue().getSchema();
@@ -107,13 +110,13 @@
         LogicalPropertiesVisitor.computeLogicalPropertiesDFS(opBuild, context);
         ILogicalPropertiesVector v = context.getLogicalPropertiesVector(opBuild);
         AlgebricksConfig.ALGEBRICKS_LOGGER
-                .fine("// HybridHashJoin inner branch -- Logical properties for " + opBuild + ": " + v + "\n");
+                .debug("// HybridHashJoin inner branch -- Logical properties for " + opBuild + ": " + v + "\n");
         if (v != null) {
             int size2 = v.getMaxOutputFrames();
             HybridHashJoinPOperator hhj = (HybridHashJoinPOperator) op.getPhysicalOperator();
             if (size2 > 0 && size2 * hhj.getFudgeFactor() <= hhj.getMemSizeInFrames()) {
                 AlgebricksConfig.ALGEBRICKS_LOGGER
-                        .fine("// HybridHashJoin inner branch " + opBuild + " fits in memory\n");
+                        .debug("// HybridHashJoin inner branch " + opBuild + " fits in memory\n");
                 // maintains the local properties on the probe side
                 op.setPhysicalOperator(
                         new InMemoryHashJoinPOperator(hhj.getKind(), hhj.getPartitioningType(), hhj.getKeysLeftBranch(),
diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/PhysicalOptimizationsUtil.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/PhysicalOptimizationsUtil.java
index 99480bf..15ae32a 100644
--- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/PhysicalOptimizationsUtil.java
+++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/util/PhysicalOptimizationsUtil.java
@@ -41,15 +41,16 @@
         visitOperatorAndItsDescendants(op, visitor, ctx);
     }
 
-    public static <R> void visitOperatorAndItsDescendants(ILogicalOperator op, ILogicalOperatorVisitor<R, IOptimizationContext> visitor,
-            IOptimizationContext ctx) throws AlgebricksException {
+    public static <R> void visitOperatorAndItsDescendants(ILogicalOperator op,
+            ILogicalOperatorVisitor<R, IOptimizationContext> visitor, IOptimizationContext ctx)
+            throws AlgebricksException {
         Set<ILogicalOperator> visitSet = new HashSet<ILogicalOperator>();
         computeFDsAndEqClassesWithVisitorRec(op, ctx, visitor, visitSet);
     }
 
     private static <R> void computeFDsAndEqClassesWithVisitorRec(ILogicalOperator op, IOptimizationContext ctx,
             ILogicalOperatorVisitor<R, IOptimizationContext> visitor, Set<ILogicalOperator> visitSet)
-                    throws AlgebricksException {
+            throws AlgebricksException {
         visitSet.add(op);
         for (Mutable<ILogicalOperator> i : op.getInputs()) {
             computeFDsAndEqClassesWithVisitorRec((AbstractLogicalOperator) i.getValue(), ctx, visitor, visitSet);
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/pom.xml b/hyracks-fullstack/algebricks/algebricks-runtime/pom.xml
index 88ca1f5..6286408 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/pom.xml
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/pom.xml
@@ -73,6 +73,10 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/AlgebricksPipeline.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/AlgebricksPipeline.java
index 379944b..f24d38d 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/AlgebricksPipeline.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/AlgebricksPipeline.java
@@ -27,10 +27,15 @@
     private static final long serialVersionUID = 1L;
     private final IPushRuntimeFactory[] runtimeFactories;
     private final RecordDescriptor[] recordDescriptors;
+    private final IPushRuntimeFactory[] outputRuntimeFactories;
+    private final int[] outputPositions;
 
-    public AlgebricksPipeline(IPushRuntimeFactory[] runtimeFactories, RecordDescriptor[] recordDescriptors) {
+    public AlgebricksPipeline(IPushRuntimeFactory[] runtimeFactories, RecordDescriptor[] recordDescriptors,
+            IPushRuntimeFactory[] outputRuntimeFactories, int[] outputPositions) {
         this.runtimeFactories = runtimeFactories;
         this.recordDescriptors = recordDescriptors;
+        this.outputRuntimeFactories = outputRuntimeFactories;
+        this.outputPositions = outputPositions;
         // this.projectedColumns = projectedColumns;
     }
 
@@ -46,8 +51,15 @@
         return recordDescriptors[recordDescriptors.length - 1].getFieldCount();
     }
 
+    public IPushRuntimeFactory[] getOutputRuntimeFactories() {
+        return outputRuntimeFactories;
+    }
+
+    public int[] getOutputPositions() {
+        return outputPositions;
+    }
+
     // public int[] getProjectedColumns() {
     // return projectedColumns;
     // }
-
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/IPushRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/IPushRuntimeFactory.java
index de6cddd..f90de81 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/IPushRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/base/IPushRuntimeFactory.java
@@ -24,5 +24,5 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public interface IPushRuntimeFactory extends Serializable {
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException;
+    IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansAccumulatingAggregatorFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansAccumulatingAggregatorFactory.java
index 94af04f..0a578f6 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansAccumulatingAggregatorFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansAccumulatingAggregatorFactory.java
@@ -168,7 +168,7 @@
         // should enforce protocol
         boolean enforce = ctx.getJobFlags().contains(JobFlag.ENFORCE_CONTRACT);
         for (int i = runtimeFactories.length - 1; i >= 0; i--) {
-            IPushRuntime newRuntime = runtimeFactories[i].createPushRuntime(ctx);
+            IPushRuntime newRuntime = runtimeFactories[i].createPushRuntime(ctx)[0];
             newRuntime = enforce ? EnforcePushRuntime.enforce(newRuntime) : newRuntime;
             start = enforce ? EnforcePushRuntime.enforce(start) : start;
             newRuntime.setOutputFrameWriter(0, start, recordDescriptors[i]);
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansRunningAggregatorFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansRunningAggregatorFactory.java
index c261df8..75b2fb2 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansRunningAggregatorFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/NestedPlansRunningAggregatorFactory.java
@@ -149,7 +149,7 @@
         IPushRuntimeFactory[] runtimeFactories = subplan.getRuntimeFactories();
         RecordDescriptor[] recordDescriptors = subplan.getRecordDescriptors();
         for (int i = runtimeFactories.length - 1; i >= 0; i--) {
-            IPushRuntime newRuntime = runtimeFactories[i].createPushRuntime(ctx);
+            IPushRuntime newRuntime = runtimeFactories[i].createPushRuntime(ctx)[0];
             newRuntime = enforce ? EnforcePushRuntime.enforce(newRuntime) : newRuntime;
             start = enforce ? EnforceFrameWriter.enforce(start) : start;
             newRuntime.setOutputFrameWriter(0, start, recordDescriptors[i]);
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/SerializableAggregatorDescriptorFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/SerializableAggregatorDescriptorFactory.java
index 1e06c76..28590ec 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/SerializableAggregatorDescriptorFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/aggreg/SerializableAggregatorDescriptorFactory.java
@@ -93,8 +93,8 @@
                 int fieldSlotLength = stateAccessor.getFieldSlotsLength();
                 for (int i = 0; i < aggs.length; i++) {
                     byte[] data = stateAccessor.getBuffer().array();
-                    int start = stateAccessor.getFieldStartOffset(stateTupleIndex, i + keys.length)
-                            + stateTupleStart + fieldSlotLength;
+                    int start = stateAccessor.getFieldStartOffset(stateTupleIndex, i + keys.length) + stateTupleStart
+                            + fieldSlotLength;
                     aggs[i].step(ftr, data, start, stateFieldLength[i]);
                 }
             }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputOneFramePushRuntime.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputOneFramePushRuntime.java
index 2d8eaed..a7468a7 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputOneFramePushRuntime.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputOneFramePushRuntime.java
@@ -51,13 +51,25 @@
 
     @Override
     public void close() throws HyracksDataException {
+        HyracksDataException closeException = null;
         try {
             flushIfNotFailed();
         } catch (Exception e) {
+            closeException = HyracksDataException.create(e);
             writer.fail();
-            throw e;
         } finally {
-            writer.close();
+            try {
+                writer.close();
+            } catch (Exception e) {
+                if (closeException == null) {
+                    closeException = HyracksDataException.create(e);
+                } else {
+                    closeException.addSuppressed(e);
+                }
+            }
+        }
+        if (closeException != null) {
+            throw closeException;
         }
     }
 
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputRuntimeFactory.java
index 32eff3a..7b3fb46 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/AbstractOneInputOneOutputRuntimeFactory.java
@@ -34,8 +34,8 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
-        return createOneOutputPushRuntime(ctx);
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+        return new IPushRuntime[] { createOneOutputPushRuntime(ctx) };
     }
 
     public abstract AbstractOneInputOneOutputPushRuntime createOneOutputPushRuntime(IHyracksTaskContext ctx)
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/SinkRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/SinkRuntimeFactory.java
index a838557..f0e9406 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/SinkRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/base/SinkRuntimeFactory.java
@@ -38,8 +38,8 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
-        return new AbstractOneInputSinkPushRuntime() {
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+        return new IPushRuntime[] { new AbstractOneInputSinkPushRuntime() {
 
             @Override
             public void open() throws HyracksDataException {
@@ -61,7 +61,6 @@
             public void flush() throws HyracksDataException {
                 // flush() is meaningless for sink operators
             }
-        };
+        } };
     }
-
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
index f6ebf19..07365db 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/AlgebricksMetaOperatorDescriptor.java
@@ -45,11 +45,18 @@
 
     public AlgebricksMetaOperatorDescriptor(IOperatorDescriptorRegistry spec, int inputArity, int outputArity,
             IPushRuntimeFactory[] runtimeFactories, RecordDescriptor[] internalRecordDescriptors) {
+        this(spec, inputArity, outputArity, runtimeFactories, internalRecordDescriptors, null, null);
+    }
+
+    public AlgebricksMetaOperatorDescriptor(IOperatorDescriptorRegistry spec, int inputArity, int outputArity,
+            IPushRuntimeFactory[] runtimeFactories, RecordDescriptor[] internalRecordDescriptors,
+            IPushRuntimeFactory[] outputRuntimeFactories, int[] outputPositions) {
         super(spec, inputArity, outputArity);
         if (outputArity == 1) {
             this.outRecDescs[0] = internalRecordDescriptors[internalRecordDescriptors.length - 1];
         }
-        this.pipeline = new AlgebricksPipeline(runtimeFactories, internalRecordDescriptors);
+        this.pipeline = new AlgebricksPipeline(runtimeFactories, internalRecordDescriptors, outputRuntimeFactories,
+                outputPositions);
     }
 
     public AlgebricksPipeline getPipeline() {
@@ -65,46 +72,55 @@
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Asterix { \n");
-        for (IPushRuntimeFactory f : pipeline.getRuntimeFactories()) {
-            sb.append("  " + f.toString() + ";\n");
-        }
-        sb.append("}");
-        return sb.toString();
+        return "AlgebricksMeta " + Arrays.toString(pipeline.getRuntimeFactories());
     }
 
     @Override
     public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
             final IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) {
         if (inputArity == 0) {
-            return createSourceInputPushRuntime(ctx);
+            return new SourcePushRuntime(ctx);
         } else {
             return createOneInputOneOutputPushRuntime(ctx, recordDescProvider);
         }
     }
 
-    private IOperatorNodePushable createSourceInputPushRuntime(final IHyracksTaskContext ctx) {
-        return new AbstractUnaryOutputSourceOperatorNodePushable() {
+    private class SourcePushRuntime extends AbstractUnaryOutputSourceOperatorNodePushable {
+        private final IHyracksTaskContext ctx;
 
-            @Override
-            public void initialize() throws HyracksDataException {
-                IFrameWriter startOfPipeline;
-                RecordDescriptor pipelineOutputRecordDescriptor =
-                        outputArity > 0 ? AlgebricksMetaOperatorDescriptor.this.outRecDescs[0] : null;
-                PipelineAssembler pa =
-                        new PipelineAssembler(pipeline, inputArity, outputArity, null, pipelineOutputRecordDescriptor);
-                startOfPipeline = pa.assemblePipeline(writer, ctx);
+        SourcePushRuntime(IHyracksTaskContext ctx) {
+            this.ctx = ctx;
+        }
+
+        @Override
+        public void initialize() throws HyracksDataException {
+            IFrameWriter startOfPipeline;
+            RecordDescriptor pipelineOutputRecordDescriptor =
+                    outputArity > 0 ? AlgebricksMetaOperatorDescriptor.this.outRecDescs[0] : null;
+            PipelineAssembler pa =
+                    new PipelineAssembler(pipeline, inputArity, outputArity, null, pipelineOutputRecordDescriptor);
+            startOfPipeline = pa.assemblePipeline(writer, ctx);
+            HyracksDataException exception = null;
+            try {
+                startOfPipeline.open();
+            } catch (Exception e) {
+                startOfPipeline.fail();
+                exception = HyracksDataException.create(e);
+            } finally {
                 try {
-                    startOfPipeline.open();
-                } catch (Exception e) {
-                    startOfPipeline.fail();
-                    throw e;
-                } finally {
                     startOfPipeline.close();
+                } catch (Exception e) {
+                    if (exception == null) {
+                        exception = HyracksDataException.create(e);
+                    } else {
+                        exception.addSuppressed(e);
+                    }
                 }
             }
-        };
+            if (exception != null) {
+                throw exception;
+            }
+        }
     }
 
     private IOperatorNodePushable createOneInputOneOutputPushRuntime(final IHyracksTaskContext ctx,
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/PipelineAssembler.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/PipelineAssembler.java
index e1081e0..a717794 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/PipelineAssembler.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/PipelineAssembler.java
@@ -18,9 +18,13 @@
  */
 package org.apache.hyracks.algebricks.runtime.operators.meta;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.hyracks.algebricks.runtime.base.AlgebricksPipeline;
 import org.apache.hyracks.algebricks.runtime.base.EnforcePushRuntime;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.EnforceFrameWriter;
@@ -37,6 +41,7 @@
     private final int inputArity;
     private final int outputArity;
     private final AlgebricksPipeline pipeline;
+    private final Map<IPushRuntimeFactory, IPushRuntime[]> runtimeMap;
 
     public PipelineAssembler(AlgebricksPipeline pipeline, int inputArity, int outputArity,
             RecordDescriptor pipelineInputRecordDescriptor, RecordDescriptor pipelineOutputRecordDescriptor) {
@@ -45,6 +50,7 @@
         this.pipelineOutputRecordDescriptor = pipelineOutputRecordDescriptor;
         this.inputArity = inputArity;
         this.outputArity = outputArity;
+        this.runtimeMap = new HashMap<>();
     }
 
     public IFrameWriter assemblePipeline(IFrameWriter writer, IHyracksTaskContext ctx) throws HyracksDataException {
@@ -52,19 +58,30 @@
         boolean enforce = ctx.getJobFlags().contains(JobFlag.ENFORCE_CONTRACT);
         // plug the operators
         IFrameWriter start = writer;// this.writer;
-        for (int i = pipeline.getRuntimeFactories().length - 1; i >= 0; i--) {
-            IPushRuntime newRuntime = pipeline.getRuntimeFactories()[i].createPushRuntime(ctx);
-            newRuntime = enforce ? EnforcePushRuntime.enforce(newRuntime) : newRuntime;
+        IPushRuntimeFactory[] runtimeFactories = pipeline.getRuntimeFactories();
+        RecordDescriptor[] recordDescriptors = pipeline.getRecordDescriptors();
+        for (int i = runtimeFactories.length - 1; i >= 0; i--) {
             start = enforce ? EnforceFrameWriter.enforce(start) : start;
-            if (i == pipeline.getRuntimeFactories().length - 1) {
-                if (outputArity == 1) {
-                    newRuntime.setOutputFrameWriter(0, start, pipelineOutputRecordDescriptor);
+
+            IPushRuntimeFactory runtimeFactory = runtimeFactories[i];
+            IPushRuntime[] newRuntimes = runtimeFactory.createPushRuntime(ctx);
+            for (int j = 0; j < newRuntimes.length; j++) {
+                if (enforce) {
+                    newRuntimes[j] = EnforcePushRuntime.enforce(newRuntimes[j]);
                 }
-            } else {
-                newRuntime.setOutputFrameWriter(0, start, pipeline.getRecordDescriptors()[i]);
+                if (i == runtimeFactories.length - 1) {
+                    if (outputArity == 1) {
+                        newRuntimes[j].setOutputFrameWriter(0, start, pipelineOutputRecordDescriptor);
+                    }
+                } else {
+                    newRuntimes[j].setOutputFrameWriter(0, start, recordDescriptors[i]);
+                }
             }
+            runtimeMap.put(runtimeFactory, newRuntimes);
+
+            IPushRuntime newRuntime = newRuntimes[0];
             if (i > 0) {
-                newRuntime.setInputRecordDescriptor(0, pipeline.getRecordDescriptors()[i - 1]);
+                newRuntime.setInputRecordDescriptor(0, recordDescriptors[i - 1]);
             } else if (inputArity > 0) {
                 newRuntime.setInputRecordDescriptor(0, pipelineInputRecordDescriptor);
             }
@@ -72,4 +89,8 @@
         }
         return start;
     }
+
+    public IPushRuntime[] getPushRuntime(IPushRuntimeFactory runtimeFactory) {
+        return runtimeMap.get(runtimeFactory);
+    }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/SubplanRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/SubplanRuntimeFactory.java
index f6a349f..159fde7 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/SubplanRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/meta/SubplanRuntimeFactory.java
@@ -20,9 +20,11 @@
 
 import java.io.DataOutput;
 import java.nio.ByteBuffer;
+import java.util.List;
 
 import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
 import org.apache.hyracks.algebricks.runtime.base.AlgebricksPipeline;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
 import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
 import org.apache.hyracks.algebricks.runtime.operators.base.AbstractOneInputOneOutputOneFramePushRuntime;
 import org.apache.hyracks.algebricks.runtime.operators.base.AbstractOneInputOneOutputPushRuntime;
@@ -41,16 +43,21 @@
 
     private static final long serialVersionUID = 1L;
 
-    private final AlgebricksPipeline pipeline;
+    private final List<AlgebricksPipeline> pipelines;
+
     private final RecordDescriptor inputRecordDesc;
+
+    private final RecordDescriptor outputRecordDesc;
+
     private final IMissingWriterFactory[] missingWriterFactories;
 
-    public SubplanRuntimeFactory(AlgebricksPipeline pipeline, IMissingWriterFactory[] missingWriterFactories,
-            RecordDescriptor inputRecordDesc, int[] projectionList) {
+    public SubplanRuntimeFactory(List<AlgebricksPipeline> pipelines, IMissingWriterFactory[] missingWriterFactories,
+            RecordDescriptor inputRecordDesc, RecordDescriptor outputRecordDesc, int[] projectionList) {
         super(projectionList);
-        this.pipeline = pipeline;
+        this.pipelines = pipelines;
         this.missingWriterFactories = missingWriterFactories;
         this.inputRecordDesc = inputRecordDesc;
+        this.outputRecordDesc = outputRecordDesc;
         if (projectionList != null) {
             throw new NotImplementedException();
         }
@@ -60,8 +67,12 @@
     public String toString() {
         StringBuilder sb = new StringBuilder();
         sb.append("Subplan { \n");
-        for (IPushRuntimeFactory f : pipeline.getRuntimeFactories()) {
-            sb.append("  " + f.toString() + ";\n");
+        for (AlgebricksPipeline pipeline : pipelines) {
+            sb.append('{');
+            for (IPushRuntimeFactory f : pipeline.getRuntimeFactories()) {
+                sb.append("  ").append(f).append(";\n");
+            }
+            sb.append('}');
         }
         sb.append("}");
         return sb.toString();
@@ -70,110 +81,177 @@
     @Override
     public AbstractOneInputOneOutputPushRuntime createOneOutputPushRuntime(final IHyracksTaskContext ctx)
             throws HyracksDataException {
+        return new SubplanPushRuntime(ctx);
+    }
 
-        RecordDescriptor pipelineOutputRecordDescriptor = null;
+    private class SubplanPushRuntime extends AbstractOneInputOneOutputOneFramePushRuntime {
 
-        final PipelineAssembler pa = new PipelineAssembler(pipeline, 1, 1, inputRecordDesc,
-                pipelineOutputRecordDescriptor);
-        final IMissingWriter[] nullWriters = new IMissingWriter[missingWriterFactories.length];
-        for (int i = 0; i < missingWriterFactories.length; i++) {
-            nullWriters[i] = missingWriterFactories[i].createMissingWriter();
+        final IHyracksTaskContext ctx;
+
+        final NestedTupleSourceRuntime[] startOfPipelines;
+
+        boolean first;
+
+        SubplanPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+            this.ctx = ctx;
+            this.first = true;
+
+            IMissingWriter[] missingWriters = new IMissingWriter[missingWriterFactories.length];
+            for (int i = 0; i < missingWriterFactories.length; i++) {
+                missingWriters[i] = missingWriterFactories[i].createMissingWriter();
+            }
+
+            int pipelineCount = pipelines.size();
+            startOfPipelines = new NestedTupleSourceRuntime[pipelineCount];
+            PipelineAssembler[] pipelineAssemblers = new PipelineAssembler[pipelineCount];
+            for (int i = 0; i < pipelineCount; i++) {
+                AlgebricksPipeline pipeline = pipelines.get(i);
+                RecordDescriptor pipelineLastRecordDescriptor =
+                        pipeline.getRecordDescriptors()[pipeline.getRecordDescriptors().length - 1];
+
+                RecordDescriptor outputRecordDescriptor;
+                IFrameWriter outputWriter;
+                if (i == 0) {
+                    // primary pipeline
+                    outputWriter = new TupleOuterProduct(pipelineLastRecordDescriptor, missingWriters);
+                    outputRecordDescriptor = SubplanRuntimeFactory.this.outputRecordDesc;
+                } else {
+                    // secondary pipeline
+                    IPushRuntime outputPushRuntime = linkSecondaryPipeline(pipeline, pipelineAssemblers, i);
+                    if (outputPushRuntime == null) {
+                        throw new IllegalStateException("Invalid pipeline");
+                    }
+                    outputPushRuntime.setInputRecordDescriptor(0, pipelineLastRecordDescriptor);
+                    outputWriter = outputPushRuntime;
+                    outputRecordDescriptor = pipelineLastRecordDescriptor;
+                }
+
+                PipelineAssembler pa = new PipelineAssembler(pipeline, 1, 1, inputRecordDesc, outputRecordDescriptor);
+                startOfPipelines[i] = (NestedTupleSourceRuntime) pa.assemblePipeline(outputWriter, ctx);
+                pipelineAssemblers[i] = pa;
+            }
         }
 
-        return new AbstractOneInputOneOutputOneFramePushRuntime() {
+        IPushRuntime linkSecondaryPipeline(AlgebricksPipeline pipeline, PipelineAssembler[] pipelineAssemblers,
+                int pipelineAssemblersCount) {
+            IPushRuntimeFactory[] outputRuntimeFactories = pipeline.getOutputRuntimeFactories();
+            if (outputRuntimeFactories == null || outputRuntimeFactories.length != 1) {
+                throw new IllegalStateException();
+            }
+            IPushRuntimeFactory outRuntimeFactory = outputRuntimeFactories[0];
+            int outputPosition = pipeline.getOutputPositions()[0];
+            for (int i = 0; i < pipelineAssemblersCount; i++) {
+                IPushRuntime[] p = pipelineAssemblers[i].getPushRuntime(outRuntimeFactory);
+                if (p != null) {
+                    return p[outputPosition];
+                }
+            }
+            return null;
+        }
 
-            /**
-             * Computes the outer product between a given tuple and the frames
-             * passed.
-             */
-            class TupleOuterProduct implements IFrameWriter {
+        @Override
+        public void open() throws HyracksDataException {
+            writer.open();
+            if (first) {
+                first = false;
+                initAccessAppendRef(ctx);
+            }
+        }
 
-                private boolean smthWasWritten = false;
-                private FrameTupleAccessor ta = new FrameTupleAccessor(
-                        pipeline.getRecordDescriptors()[pipeline.getRecordDescriptors().length - 1]);
-                private ArrayTupleBuilder tb = new ArrayTupleBuilder(
-                        nullWriters.length + SubplanRuntimeFactory.this.inputRecordDesc.getFieldCount());
+        @Override
+        public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
+            tAccess.reset(buffer);
+            int nTuple = tAccess.getTupleCount();
+            for (int t = 0; t < nTuple; t++) {
+                tRef.reset(tAccess, t);
 
-                @Override
-                public void open() throws HyracksDataException {
-                    smthWasWritten = false;
+                for (NestedTupleSourceRuntime nts : startOfPipelines) {
+                    nts.writeTuple(buffer, t);
                 }
 
-                @Override
-                public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
-                    ta.reset(buffer);
-                    int nTuple = ta.getTupleCount();
-                    for (int t = 0; t < nTuple; t++) {
-                        appendConcat(tRef.getFrameTupleAccessor(), tRef.getTupleIndex(), ta, t);
+                int n = 0;
+                try {
+                    for (; n < startOfPipelines.length; n++) {
+                        NestedTupleSourceRuntime nts = startOfPipelines[n];
+                        try {
+                            nts.open();
+                        } catch (Exception e) {
+                            nts.fail();
+                            throw e;
+                        }
                     }
-                    smthWasWritten = true;
-                }
-
-                @Override
-                public void close() throws HyracksDataException {
-                    if (!smthWasWritten && !failed) {
-                        // the case when we need to write nulls
-                        appendNullsToTuple();
-                        appendToFrameFromTupleBuilder(tb);
-                    }
-                }
-
-                @Override
-                public void fail() throws HyracksDataException {
-                    // writer.fail() is called by the outer class' writer.fail().
-                }
-
-                private void appendNullsToTuple() throws HyracksDataException {
-                    tb.reset();
-                    int n0 = tRef.getFieldCount();
-                    for (int f = 0; f < n0; f++) {
-                        tb.addField(tRef.getFrameTupleAccessor(), tRef.getTupleIndex(), f);
-                    }
-                    DataOutput dos = tb.getDataOutput();
-                    for (int i = 0; i < nullWriters.length; i++) {
-                        nullWriters[i].writeMissing(dos);
-                        tb.addFieldEndOffset();
+                } finally {
+                    for (int i = n - 1; i >= 0; i--) {
+                        startOfPipelines[i].close();
                     }
                 }
             }
+        }
 
-            IFrameWriter endPipe = new TupleOuterProduct();
+        @Override
+        public void flush() throws HyracksDataException {
+            writer.flush();
+        }
 
-            NestedTupleSourceRuntime startOfPipeline = (NestedTupleSourceRuntime) pa.assemblePipeline(endPipe, ctx);
+        /**
+         * Computes the outer product between a given tuple and the frames
+         * passed.
+         */
+        class TupleOuterProduct implements IFrameWriter {
 
-            boolean first = true;
+            private boolean smthWasWritten;
+            private final FrameTupleAccessor ta;
+            private final ArrayTupleBuilder tb;
+            private final IMissingWriter[] missingWriters;
+
+            private TupleOuterProduct(RecordDescriptor recordDescriptor, IMissingWriter[] missingWriters) {
+                ta = new FrameTupleAccessor(recordDescriptor);
+                tb = new ArrayTupleBuilder(
+                        missingWriters.length + SubplanRuntimeFactory.this.inputRecordDesc.getFieldCount());
+                this.missingWriters = missingWriters;
+            }
 
             @Override
             public void open() throws HyracksDataException {
-                writer.open();
-                if (first) {
-                    first = false;
-                    initAccessAppendRef(ctx);
-                }
+                smthWasWritten = false;
             }
 
             @Override
             public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
-                tAccess.reset(buffer);
-                int nTuple = tAccess.getTupleCount();
+                ta.reset(buffer);
+                int nTuple = ta.getTupleCount();
                 for (int t = 0; t < nTuple; t++) {
-                    tRef.reset(tAccess, t);
-                    startOfPipeline.writeTuple(buffer, t);
-                    try {
-                        startOfPipeline.open();
-                    } catch (Exception e) {
-                        startOfPipeline.fail();
-                        throw e;
-                    } finally {
-                        startOfPipeline.close();
-                    }
+                    appendConcat(tRef.getFrameTupleAccessor(), tRef.getTupleIndex(), ta, t);
+                }
+                smthWasWritten = true;
+            }
+
+            @Override
+            public void close() throws HyracksDataException {
+                if (!smthWasWritten && !failed) {
+                    // the case when we need to write nulls
+                    appendNullsToTuple();
+                    appendToFrameFromTupleBuilder(tb);
                 }
             }
 
             @Override
-            public void flush() throws HyracksDataException {
-                writer.flush();
+            public void fail() throws HyracksDataException {
+                // writer.fail() is called by the outer class' writer.fail().
             }
-        };
+
+            private void appendNullsToTuple() throws HyracksDataException {
+                tb.reset();
+                int n0 = tRef.getFieldCount();
+                for (int f = 0; f < n0; f++) {
+                    tb.addField(tRef.getFrameTupleAccessor(), tRef.getTupleIndex(), f);
+                }
+                DataOutput dos = tb.getDataOutput();
+                for (IMissingWriter missingWriter : missingWriters) {
+                    missingWriter.writeMissing(dos);
+                    tb.addFieldEndOffset();
+                }
+            }
+        }
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/sort/InMemorySortRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/sort/InMemorySortRuntimeFactory.java
index 925ff93..f251bb7 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/sort/InMemorySortRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/sort/InMemorySortRuntimeFactory.java
@@ -39,18 +39,25 @@
     private static final long serialVersionUID = 1L;
 
     private final int[] sortFields;
-    private INormalizedKeyComputerFactory firstKeyNormalizerFactory;
-    private IBinaryComparatorFactory[] comparatorFactories;
+    private final INormalizedKeyComputerFactory[] keyNormalizerFactories;
+    private final IBinaryComparatorFactory[] comparatorFactories;
 
     public InMemorySortRuntimeFactory(int[] sortFields, INormalizedKeyComputerFactory firstKeyNormalizerFactory,
             IBinaryComparatorFactory[] comparatorFactories, int[] projectionList) {
+        this(sortFields, firstKeyNormalizerFactory != null
+                ? new INormalizedKeyComputerFactory[] { firstKeyNormalizerFactory } : null, comparatorFactories,
+                projectionList);
+    }
+
+    public InMemorySortRuntimeFactory(int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, int[] projectionList) {
         super(projectionList);
         // Obs: the projection list is currently ignored.
         if (projectionList != null) {
             throw new NotImplementedException("Cannot push projection into InMemorySortRuntime.");
         }
         this.sortFields = sortFields;
-        this.firstKeyNormalizerFactory = firstKeyNormalizerFactory;
+        this.keyNormalizerFactories = keyNormalizerFactories;
         this.comparatorFactories = comparatorFactories;
     }
 
@@ -67,8 +74,8 @@
                     IFrameBufferManager manager = new VariableFrameMemoryManager(
                             new VariableFramePool(ctx, VariableFramePool.UNLIMITED_MEMORY),
                             FrameFreeSlotPolicyFactory.createFreeSlotPolicy(EnumFreeSlotPolicy.LAST_FIT));
-                    frameSorter = new FrameSorterMergeSort(ctx, manager, sortFields, firstKeyNormalizerFactory,
-                            comparatorFactories, outputRecordDesc);
+                    frameSorter = new FrameSorterMergeSort(ctx, manager, VariableFramePool.UNLIMITED_MEMORY, sortFields,
+                            keyNormalizerFactories, comparatorFactories, outputRecordDesc);
                 }
                 frameSorter.reset();
             }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/EmptyTupleSourceRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/EmptyTupleSourceRuntimeFactory.java
index 3ccceed..67f4a77 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/EmptyTupleSourceRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/EmptyTupleSourceRuntimeFactory.java
@@ -40,8 +40,8 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(final IHyracksTaskContext ctx) throws HyracksDataException {
-        return new AbstractOneInputSourcePushRuntime() {
+    public IPushRuntime[] createPushRuntime(final IHyracksTaskContext ctx) throws HyracksDataException {
+        return new IPushRuntime[] { new AbstractOneInputSourcePushRuntime() {
 
             private final ArrayTupleBuilder tb = new ArrayTupleBuilder(0);
             private final FrameTupleAppender appender = new FrameTupleAppender(new VSizeFrame(ctx));
@@ -69,6 +69,6 @@
             public void flush() throws HyracksDataException {
                 appender.flush(writer);
             }
-        };
+        } };
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/NestedTupleSourceRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/NestedTupleSourceRuntimeFactory.java
index 496679f..8e64092 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/NestedTupleSourceRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/NestedTupleSourceRuntimeFactory.java
@@ -39,8 +39,8 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
-        return new NestedTupleSourceRuntime(ctx);
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+        return new IPushRuntime[] { new NestedTupleSourceRuntime(ctx) };
     }
 
     public static class NestedTupleSourceRuntime extends AbstractOneInputOneOutputOneFramePushRuntime {
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/PrinterRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/PrinterRuntimeFactory.java
index 021784a..8a06ecf 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/PrinterRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/PrinterRuntimeFactory.java
@@ -56,9 +56,9 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) {
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) {
         IAWriter w = PrinterBasedWriterFactory.INSTANCE.createWriter(printColumns, System.out, printerFactories,
                 inputRecordDesc);
-        return new SinkWriterRuntime(w, System.out, inputRecordDesc);
+        return new IPushRuntime[] { new SinkWriterRuntime(w, System.out, inputRecordDesc) };
     }
 }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/SinkWriterRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/SinkWriterRuntimeFactory.java
index d52ceee..536a769 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/SinkWriterRuntimeFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/std/SinkWriterRuntimeFactory.java
@@ -67,11 +67,11 @@
     }
 
     @Override
-    public IPushRuntime createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) throws HyracksDataException {
         try {
             PrintStream filePrintStream = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
             IAWriter w = writerFactory.createWriter(fields, filePrintStream, printerFactories, inputRecordDesc);
-            return new SinkWriterRuntime(w, filePrintStream, inputRecordDesc, true);
+            return new IPushRuntime[] { new SinkWriterRuntime(w, filePrintStream, inputRecordDesc, true) };
         } catch (IOException e) {
             throw new HyracksDataException(e);
         }
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/union/MicroUnionAllRuntimeFactory.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/union/MicroUnionAllRuntimeFactory.java
new file mode 100644
index 0000000..1706e59
--- /dev/null
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/operators/union/MicroUnionAllRuntimeFactory.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.algebricks.runtime.operators.union;
+
+import java.nio.ByteBuffer;
+
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.commons.lang3.mutable.MutableObject;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntime;
+import org.apache.hyracks.algebricks.runtime.base.IPushRuntimeFactory;
+import org.apache.hyracks.api.comm.IFrameWriter;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class MicroUnionAllRuntimeFactory implements IPushRuntimeFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int inputArity;
+
+    public MicroUnionAllRuntimeFactory(int inputArity) {
+        this.inputArity = inputArity;
+    }
+
+    @Override
+    public IPushRuntime[] createPushRuntime(IHyracksTaskContext ctx) {
+        Mutable<Boolean> failedShared = new MutableObject<>(Boolean.FALSE);
+        IPushRuntime[] result = new IPushRuntime[inputArity];
+        for (int i = 0; i < inputArity; i++) {
+            result[i] = new MicroUnionAllPushRuntime(i, failedShared);
+        }
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "union-all";
+    }
+
+    private final class MicroUnionAllPushRuntime implements IPushRuntime {
+
+        private final int idx;
+
+        private final Mutable<Boolean> failedShared;
+
+        private IFrameWriter writer;
+
+        MicroUnionAllPushRuntime(int idx, Mutable<Boolean> failedShared) {
+            this.idx = idx;
+            this.failedShared = failedShared;
+        }
+
+        @Override
+        public void setOutputFrameWriter(int index, IFrameWriter writer, RecordDescriptor recordDesc) {
+            if (index != 0) {
+                throw new IllegalArgumentException(String.valueOf(index));
+            }
+            this.writer = writer;
+        }
+
+        @Override
+        public void setInputRecordDescriptor(int index, RecordDescriptor recordDescriptor) {
+            // input is not accessed
+        }
+
+        @Override
+        public void open() throws HyracksDataException {
+            if (idx == 0) {
+                writer.open();
+            }
+        }
+
+        @Override
+        public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
+            writer.nextFrame(buffer);
+        }
+
+        @Override
+        public void fail() throws HyracksDataException {
+            boolean failed = failedShared.getValue();
+            failedShared.setValue(Boolean.TRUE);
+            if (!failed) {
+                writer.fail();
+            }
+        }
+
+        @Override
+        public void close() throws HyracksDataException {
+            if (idx == 0) {
+                writer.close();
+            }
+        }
+    }
+}
diff --git a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/serializer/ResultSerializerFactoryProvider.java b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/serializer/ResultSerializerFactoryProvider.java
index 0e49d22..763e6ff 100644
--- a/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/serializer/ResultSerializerFactoryProvider.java
+++ b/hyracks-fullstack/algebricks/algebricks-runtime/src/main/java/org/apache/hyracks/algebricks/runtime/serializer/ResultSerializerFactoryProvider.java
@@ -47,8 +47,8 @@
 
             @Override
             public IResultSerializer createResultSerializer(RecordDescriptor inputRecordDesc, PrintStream printStream) {
-                final IAWriter writer = writerFactory.createWriter(fields, printStream, printerFactories,
-                        inputRecordDesc);
+                final IAWriter writer =
+                        writerFactory.createWriter(fields, printStream, printerFactories, inputRecordDesc);
 
                 return new IResultSerializer() {
                     private static final long serialVersionUID = 1L;
diff --git a/hyracks-fullstack/algebricks/algebricks-tests/pom.xml b/hyracks-fullstack/algebricks/algebricks-tests/pom.xml
index d0a8a3e..72b1834 100644
--- a/hyracks-fullstack/algebricks/algebricks-tests/pom.xml
+++ b/hyracks-fullstack/algebricks/algebricks-tests/pom.xml
@@ -181,5 +181,9 @@
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/algebricks/algebricks-tests/src/main/java/org/apache/hyracks/algebricks/tests/pushruntime/IntegerConstantEvalFactory.java b/hyracks-fullstack/algebricks/algebricks-tests/src/main/java/org/apache/hyracks/algebricks/tests/pushruntime/IntegerConstantEvalFactory.java
index 26790c5..afbff40 100644
--- a/hyracks-fullstack/algebricks/algebricks-tests/src/main/java/org/apache/hyracks/algebricks/tests/pushruntime/IntegerConstantEvalFactory.java
+++ b/hyracks-fullstack/algebricks/algebricks-tests/src/main/java/org/apache/hyracks/algebricks/tests/pushruntime/IntegerConstantEvalFactory.java
@@ -48,7 +48,7 @@
             private ArrayBackedValueStorage buf = new ArrayBackedValueStorage();
 
             {
-                    IntegerSerializerDeserializer.INSTANCE.serialize(value, buf.getDataOutput());
+                IntegerSerializerDeserializer.INSTANCE.serialize(value, buf.getDataOutput());
             }
 
             @Override
diff --git a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/pushruntime/PushRuntimeTest.java b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/pushruntime/PushRuntimeTest.java
index 34ed142..a7621ec 100644
--- a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/pushruntime/PushRuntimeTest.java
+++ b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/pushruntime/PushRuntimeTest.java
@@ -22,6 +22,7 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.io.FileUtils;
@@ -64,6 +65,7 @@
 import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.IMissingWriterFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.io.FileReference;
@@ -140,9 +142,9 @@
         PrinterRuntimeFactory printer = new PrinterRuntimeFactory(new int[] { 0, 1 },
                 new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE, IntegerPrinterFactory.INSTANCE }, assignDesc);
 
-        AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
-                new IPushRuntimeFactory[] { ets, assign, printer },
-                new RecordDescriptor[] { etsDesc, assignDesc, null });
+        AlgebricksMetaOperatorDescriptor algebricksOp =
+                new AlgebricksMetaOperatorDescriptor(spec, 0, 0, new IPushRuntimeFactory[] { ets, assign, printer },
+                        new RecordDescriptor[] { etsDesc, assignDesc, null });
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, algebricksOp, DEFAULT_NODES);
         spec.addRoot(algebricksOp);
         AlgebricksHyracksIntegrationUtil.runJob(spec);
@@ -167,9 +169,9 @@
                 new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE, IntegerPrinterFactory.INSTANCE }, outFile,
                 PrinterBasedWriterFactory.INSTANCE, assignDesc);
 
-        AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
-                new IPushRuntimeFactory[] { ets, assign, writer },
-                new RecordDescriptor[] { etsDesc, assignDesc, null });
+        AlgebricksMetaOperatorDescriptor algebricksOp =
+                new AlgebricksMetaOperatorDescriptor(spec, 0, 0, new IPushRuntimeFactory[] { ets, assign, writer },
+                        new RecordDescriptor[] { etsDesc, assignDesc, null });
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, algebricksOp, DEFAULT_NODES);
         spec.addRoot(algebricksOp);
         AlgebricksHyracksIntegrationUtil.runJob(spec);
@@ -186,28 +188,28 @@
 
         // the scanner
         FileSplit[] intFileSplits = new FileSplit[1];
-        intFileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, "data" + File.separator
-                + "simple" + File.separator + "int-part1.tbl");
+        intFileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID,
+                "data" + File.separator + "simple" + File.separator + "int-part1.tbl");
         IFileSplitProvider intSplitProvider = new ConstantFileSplitProvider(intFileSplits);
-        RecordDescriptor intScannerDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor intScannerDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
         IValueParserFactory[] valueParsers = new IValueParserFactory[] { IntegerParserFactory.INSTANCE };
         FileScanOperatorDescriptor intScanner = new FileScanOperatorDescriptor(spec, intSplitProvider,
                 new DelimitedDataTupleParserFactory(valueParsers, '|'), intScannerDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, intScanner, DEFAULT_NODES);
 
         // the algebricks op.
-        IScalarEvaluatorFactory cond = new IntegerGreaterThanEvalFactory(new IntegerConstantEvalFactory(2),
-                new TupleFieldEvaluatorFactory(0));
+        IScalarEvaluatorFactory cond =
+                new IntegerGreaterThanEvalFactory(new IntegerConstantEvalFactory(2), new TupleFieldEvaluatorFactory(0));
         StreamSelectRuntimeFactory select = new StreamSelectRuntimeFactory(cond, new int[] { 0 },
                 BinaryBooleanInspectorImpl.FACTORY, false, -1, null);
         RecordDescriptor selectDesc = intScannerDesc;
 
         String filePath = PATH_ACTUAL + SEPARATOR + "scanSelectWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                selectDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, selectDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                 new IPushRuntimeFactory[] { select, writer }, new RecordDescriptor[] { selectDesc, null });
@@ -239,14 +241,14 @@
         RecordDescriptor assignDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
         StreamProjectRuntimeFactory project = new StreamProjectRuntimeFactory(new int[] { 1 });
-        RecordDescriptor projectDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor projectDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "etsAssignProjectWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                projectDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, projectDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
                 new IPushRuntimeFactory[] { ets, assign, project, writer },
@@ -269,8 +271,8 @@
 
         // the scanner
         FileSplit[] fileSplits = new FileSplit[1];
-        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl");
+        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl");
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(fileSplits);
 
         RecordDescriptor scannerDesc = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -289,14 +291,14 @@
         // the algebricks op.
         StreamLimitRuntimeFactory limit = new StreamLimitRuntimeFactory(new IntegerConstantEvalFactory(2), null,
                 new int[] { 0 }, BinaryIntegerInspectorImpl.FACTORY);
-        RecordDescriptor limitDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor limitDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "scanLimitWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                limitDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, limitDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                 new IPushRuntimeFactory[] { limit, writer }, new RecordDescriptor[] { limitDesc, null });
@@ -322,18 +324,18 @@
         RecordDescriptor etsDesc = new RecordDescriptor(new ISerializerDeserializer[] {});
         IUnnestingEvaluatorFactory aggregFactory = new IntArrayUnnester(new int[] { 100, 200, 300 });
         UnnestRuntimeFactory unnest = new UnnestRuntimeFactory(0, aggregFactory, new int[] { 0 }, false, null);
-        RecordDescriptor unnestDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor unnestDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "etsUnnestWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                unnestDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, unnestDesc);
 
-        AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
-                new IPushRuntimeFactory[] { ets, unnest, writer },
-                new RecordDescriptor[] { etsDesc, unnestDesc, null });
+        AlgebricksMetaOperatorDescriptor algebricksOp =
+                new AlgebricksMetaOperatorDescriptor(spec, 0, 0, new IPushRuntimeFactory[] { ets, unnest, writer },
+                        new RecordDescriptor[] { etsDesc, unnestDesc, null });
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, algebricksOp,
                 new String[] { AlgebricksHyracksIntegrationUtil.NC1_ID });
         spec.addRoot(algebricksOp);
@@ -372,14 +374,14 @@
         // the algebricks op.
         AggregateRuntimeFactory agg = new AggregateRuntimeFactory(
                 new IAggregateEvaluatorFactory[] { new TupleCountAggregateFunctionFactory() });
-        RecordDescriptor aggDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor aggDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "scanAggregateWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                aggDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, aggDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                 new IPushRuntimeFactory[] { agg, writer }, new RecordDescriptor[] { aggDesc, null });
@@ -403,8 +405,8 @@
 
         // the scanner
         FileSplit[] fileSplits = new FileSplit[1];
-        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl");
+        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl");
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(fileSplits);
         RecordDescriptor scannerDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer(),
@@ -435,10 +437,10 @@
         RecordDescriptor ntsDesc = sortDesc;
         AggregateRuntimeFactory agg = new AggregateRuntimeFactory(
                 new IAggregateEvaluatorFactory[] { new TupleCountAggregateFunctionFactory() });
-        RecordDescriptor aggDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor aggDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
         AlgebricksPipeline pipeline = new AlgebricksPipeline(new IPushRuntimeFactory[] { nts, agg },
-                new RecordDescriptor[] { ntsDesc, aggDesc });
+                new RecordDescriptor[] { ntsDesc, aggDesc }, null, null);
         NestedPlansAccumulatingAggregatorFactory npaaf = new NestedPlansAccumulatingAggregatorFactory(
                 new AlgebricksPipeline[] { pipeline }, new int[] { 3 }, new int[] {});
         RecordDescriptor gbyDesc = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -451,18 +453,18 @@
                 new String[] { AlgebricksHyracksIntegrationUtil.NC1_ID });
 
         // the algebricks op.
-        IScalarEvaluatorFactory cond = new IntegerEqualsEvalFactory(new IntegerConstantEvalFactory(3),
-                new TupleFieldEvaluatorFactory(0)); // Canadian customers
+        IScalarEvaluatorFactory cond =
+                new IntegerEqualsEvalFactory(new IntegerConstantEvalFactory(3), new TupleFieldEvaluatorFactory(0)); // Canadian customers
         StreamSelectRuntimeFactory select = new StreamSelectRuntimeFactory(cond, new int[] { 1 },
                 BinaryBooleanInspectorImpl.FACTORY, false, -1, null);
-        RecordDescriptor selectDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor selectDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "scanSortGbySelectWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                selectDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, selectDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                 new IPushRuntimeFactory[] { select, writer }, new RecordDescriptor[] { selectDesc, null });
@@ -490,8 +492,8 @@
         RecordDescriptor etsDesc = new RecordDescriptor(new ISerializerDeserializer[] {});
         IUnnestingEvaluatorFactory aggregFactory = new IntArrayUnnester(new int[] { 100, 200, 300 });
         UnnestRuntimeFactory unnest = new UnnestRuntimeFactory(0, aggregFactory, new int[] { 0 }, false, null);
-        RecordDescriptor unnestDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor unnestDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         RunningAggregateRuntimeFactory ragg = new RunningAggregateRuntimeFactory(new int[] { 1 },
                 new IRunningAggregateEvaluatorFactory[] { new TupleCountRunningAggregateFunctionFactory() },
@@ -501,9 +503,9 @@
 
         String filePath = PATH_ACTUAL + SEPARATOR + "etsUnnestRunningaggregateWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 1 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                raggDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 1 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, raggDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
                 new IPushRuntimeFactory[] { ets, unnest, ragg, writer },
@@ -583,13 +585,13 @@
 
         String inputFileName = "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl";
 
-        FileSplit[] inputSplits = new FileSplit[] {
-                new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, inputFileName) };
+        FileSplit[] inputSplits =
+                new FileSplit[] { new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, inputFileName) };
 
         DelimitedDataTupleParserFactory stringParser = new DelimitedDataTupleParserFactory(
                 new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, '\u0000');
-        RecordDescriptor stringRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(), });
+        RecordDescriptor stringRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(), });
 
         FileScanOperatorDescriptor scanOp = new FileScanOperatorDescriptor(spec,
                 new ConstantFileSplitProvider(inputSplits), stringParser, stringRec);
@@ -623,8 +625,8 @@
         AlgebricksHyracksIntegrationUtil.runJob(spec);
 
         for (int i = 0; i < outputArity; i++) {
-            compareFiles("data" + File.separator + "device0" + File.separator + inputFileName, outputFile[i]
-                    .getAbsolutePath());
+            compareFiles("data" + File.separator + "device0" + File.separator + inputFileName,
+                    outputFile[i].getAbsolutePath());
         }
     }
 
@@ -642,8 +644,8 @@
 
         JobSpecification spec = new JobSpecification(FRAME_SIZE);
 
-        String inputFileName[] = { "data" + File.separator + "simple" + File.separator + "int-string-part1.tbl", "data"
-                + File.separator + "simple" + File.separator + "int-string-part1-split-0.tbl",
+        String inputFileName[] = { "data" + File.separator + "simple" + File.separator + "int-string-part1.tbl",
+                "data" + File.separator + "simple" + File.separator + "int-string-part1-split-0.tbl",
                 "data" + File.separator + "simple" + File.separator + "int-string-part1-split-1.tbl" };
         File[] inputFiles = new File[inputFileName.length];
         for (int i = 0; i < inputFileName.length; i++) {
@@ -656,16 +658,15 @@
             outputFile[i] = outputFileSplit[i].getFile(AlgebricksHyracksIntegrationUtil.nc1.getIoManager());
         }
 
-        FileSplit[] inputSplits = new FileSplit[] {
-                new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, inputFileName[0]) };
+        FileSplit[] inputSplits =
+                new FileSplit[] { new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, inputFileName[0]) };
         IFileSplitProvider intSplitProvider = new ConstantFileSplitProvider(inputSplits);
 
-        RecordDescriptor scannerDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
-                        new UTF8StringSerializerDeserializer() });
+        RecordDescriptor scannerDesc = new RecordDescriptor(new ISerializerDeserializer[] {
+                IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer() });
 
-        IValueParserFactory[] valueParsers = new IValueParserFactory[] { IntegerParserFactory.INSTANCE,
-                UTF8StringParserFactory.INSTANCE };
+        IValueParserFactory[] valueParsers =
+                new IValueParserFactory[] { IntegerParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE };
 
         FileScanOperatorDescriptor intScanner = new FileScanOperatorDescriptor(spec, intSplitProvider,
                 new DelimitedDataTupleParserFactory(valueParsers, '|'), scannerDesc);
@@ -696,8 +697,8 @@
         AlgebricksHyracksIntegrationUtil.runJob(spec);
 
         for (int i = 0; i < outputArity; i++) {
-            compareFiles("data" + File.separator + "device0" + File.separator + inputFileName[i + 1], outputFile[i]
-                    .getAbsolutePath());
+            compareFiles("data" + File.separator + "device0" + File.separator + inputFileName[i + 1],
+                    outputFile[i].getAbsolutePath());
         }
     }
 
@@ -707,8 +708,8 @@
 
         // the scanner
         FileSplit[] fileSplits = new FileSplit[1];
-        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "nation.tbl");
+        fileSplits[0] = new ManagedFileSplit(AlgebricksHyracksIntegrationUtil.NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "nation.tbl");
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(fileSplits);
         RecordDescriptor scannerDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer(),
@@ -722,7 +723,8 @@
                 new String[] { AlgebricksHyracksIntegrationUtil.NC1_ID });
 
         // the algebricks op.
-        InMemorySortRuntimeFactory sort = new InMemorySortRuntimeFactory(new int[] { 1 }, null,
+        InMemorySortRuntimeFactory sort = new InMemorySortRuntimeFactory(new int[] { 1 },
+                (INormalizedKeyComputerFactory) null,
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 null);
         RecordDescriptor sortDesc = scannerDesc;
@@ -759,41 +761,43 @@
         EmptyTupleSourceRuntimeFactory ets = new EmptyTupleSourceRuntimeFactory();
         RecordDescriptor etsDesc = new RecordDescriptor(new ISerializerDeserializer[] {});
 
-        AssignRuntimeFactory assign1 = new AssignRuntimeFactory(new int[] { 0 },
-                new IScalarEvaluatorFactory[] { const1 }, new int[] { 0 });
-        RecordDescriptor assign1Desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        AssignRuntimeFactory assign1 =
+                new AssignRuntimeFactory(new int[] { 0 }, new IScalarEvaluatorFactory[] { const1 }, new int[] { 0 });
+        RecordDescriptor assign1Desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         NestedTupleSourceRuntimeFactory nts = new NestedTupleSourceRuntimeFactory();
 
-        AssignRuntimeFactory assign2 = new AssignRuntimeFactory(new int[] { 1 },
-                new IScalarEvaluatorFactory[] { new IntegerAddEvalFactory(new TupleFieldEvaluatorFactory(0), const2) },
-                new int[] { 0, 1 });
+        AssignRuntimeFactory assign2 =
+                new AssignRuntimeFactory(new int[] { 1 },
+                        new IScalarEvaluatorFactory[] {
+                                new IntegerAddEvalFactory(new TupleFieldEvaluatorFactory(0), const2) },
+                        new int[] { 0, 1 });
         RecordDescriptor assign2Desc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
 
         StreamProjectRuntimeFactory project1 = new StreamProjectRuntimeFactory(new int[] { 1 });
-        RecordDescriptor project1Desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor project1Desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         AlgebricksPipeline pipeline = new AlgebricksPipeline(new IPushRuntimeFactory[] { nts, assign2, project1 },
-                new RecordDescriptor[] { assign1Desc, assign2Desc, project1Desc });
+                new RecordDescriptor[] { assign1Desc, assign2Desc, project1Desc }, null, null);
 
-        SubplanRuntimeFactory subplan = new SubplanRuntimeFactory(pipeline,
-                new IMissingWriterFactory[] { NoopMissingWriterFactory.INSTANCE }, assign1Desc, null);
+        SubplanRuntimeFactory subplan = new SubplanRuntimeFactory(Collections.singletonList(pipeline),
+                new IMissingWriterFactory[] { NoopMissingWriterFactory.INSTANCE }, assign1Desc, null, null);
 
         RecordDescriptor subplanDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
 
         StreamProjectRuntimeFactory project2 = new StreamProjectRuntimeFactory(new int[] { 1 });
-        RecordDescriptor project2Desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor project2Desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "etsAssignSubplanProjectWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                project2Desc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, project2Desc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 0, 0,
                 new IPushRuntimeFactory[] { ets, assign1, subplan, project2, writer },
@@ -836,7 +840,8 @@
 
         // the sort (by nation id)
         RecordDescriptor sortDesc = scannerDesc;
-        InMemorySortRuntimeFactory sort = new InMemorySortRuntimeFactory(new int[] { 3 }, null,
+        InMemorySortRuntimeFactory sort = new InMemorySortRuntimeFactory(new int[] { 3 },
+                (INormalizedKeyComputerFactory) null,
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) }, null);
 
         // the group-by
@@ -844,31 +849,33 @@
         RecordDescriptor ntsDesc = sortDesc;
         AggregateRuntimeFactory agg = new AggregateRuntimeFactory(
                 new IAggregateEvaluatorFactory[] { new TupleCountAggregateFunctionFactory() });
-        RecordDescriptor aggDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor aggDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
         AlgebricksPipeline pipeline = new AlgebricksPipeline(new IPushRuntimeFactory[] { nts, agg },
-                new RecordDescriptor[] { ntsDesc, aggDesc });
+                new RecordDescriptor[] { ntsDesc, aggDesc }, null, null);
         NestedPlansAccumulatingAggregatorFactory npaaf = new NestedPlansAccumulatingAggregatorFactory(
                 new AlgebricksPipeline[] { pipeline }, new int[] { 3 }, new int[] {});
         RecordDescriptor gbyDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
-        MicroPreClusteredGroupRuntimeFactory gby = new MicroPreClusteredGroupRuntimeFactory(new int[] { 3 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) }, npaaf,
-                sortDesc, gbyDesc, null);
+        MicroPreClusteredGroupRuntimeFactory gby =
+                new MicroPreClusteredGroupRuntimeFactory(new int[] { 3 },
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
+                        npaaf, sortDesc, gbyDesc, null);
 
         // the algebricks op.
-        IScalarEvaluatorFactory cond = new IntegerEqualsEvalFactory(new IntegerConstantEvalFactory(3),
-                new TupleFieldEvaluatorFactory(0)); // Canadian customers
+        IScalarEvaluatorFactory cond =
+                new IntegerEqualsEvalFactory(new IntegerConstantEvalFactory(3), new TupleFieldEvaluatorFactory(0)); // Canadian customers
         StreamSelectRuntimeFactory select = new StreamSelectRuntimeFactory(cond, new int[] { 1 },
                 BinaryBooleanInspectorImpl.FACTORY, false, -1, null);
-        RecordDescriptor selectDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
+        RecordDescriptor selectDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE });
 
         String filePath = PATH_ACTUAL + SEPARATOR + "scanSortGbySelectWrite.out";
         File outFile = new File(filePath);
-        SinkWriterRuntimeFactory writer = new SinkWriterRuntimeFactory(new int[] { 0 },
-                new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE }, outFile, PrinterBasedWriterFactory.INSTANCE,
-                selectDesc);
+        SinkWriterRuntimeFactory writer =
+                new SinkWriterRuntimeFactory(new int[] { 0 }, new IPrinterFactory[] { IntegerPrinterFactory.INSTANCE },
+                        outFile, PrinterBasedWriterFactory.INSTANCE, selectDesc);
 
         AlgebricksMetaOperatorDescriptor algebricksOp = new AlgebricksMetaOperatorDescriptor(spec, 1, 0,
                 new IPushRuntimeFactory[] { sort, gby, select, writer },
diff --git a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/tools/WriteValueTest.java b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/tools/WriteValueTest.java
index 6770494..82be109 100644
--- a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/tools/WriteValueTest.java
+++ b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/tools/WriteValueTest.java
@@ -66,8 +66,8 @@
         WriteValueTools.writeInt(i, baaos);
         byte[] goal = Integer.toString(i).getBytes();
         if (baaos.size() != goal.length) {
-            throw new Exception("Expecting to write " + i + " in " + goal.length + " bytes, but found " + baaos.size()
-                    + " bytes.");
+            throw new Exception(
+                    "Expecting to write " + i + " in " + goal.length + " bytes, but found " + baaos.size() + " bytes.");
         }
         for (int k = 0; k < goal.length; k++) {
             if (goal[k] != baaos.getByteArray()[k]) {
@@ -82,8 +82,8 @@
         WriteValueTools.writeLong(x, baaos);
         byte[] goal = Long.toString(x).getBytes();
         if (baaos.size() != goal.length) {
-            throw new Exception("Expecting to write " + x + " in " + goal.length + " bytes, but found " + baaos.size()
-                    + " bytes.");
+            throw new Exception(
+                    "Expecting to write " + x + " in " + goal.length + " bytes, but found " + baaos.size() + " bytes.");
         }
         for (int k = 0; k < goal.length; k++) {
             if (goal[k] != baaos.getByteArray()[k]) {
@@ -100,8 +100,8 @@
         WriteValueTools.writeUTF8StringWithQuotes(str, baaos);
         byte[] b = str.getBytes("UTF-8");
         if (baaos.size() != b.length + 2) {
-            throw new Exception("Expecting to write " + b + " in " + b.length + " bytes, but found " + baaos.size()
-                    + " bytes.");
+            throw new Exception(
+                    "Expecting to write " + b + " in " + b.length + " bytes, but found " + baaos.size() + " bytes.");
         }
         if (baaos.getByteArray()[0] != '\"' || baaos.getByteArray()[baaos.size() - 1] != '\"') {
             throw new Exception("Missing quotes.");
diff --git a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/util/AlgebricksHyracksIntegrationUtil.java b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/util/AlgebricksHyracksIntegrationUtil.java
index 2971b72..1df9824 100644
--- a/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/util/AlgebricksHyracksIntegrationUtil.java
+++ b/hyracks-fullstack/algebricks/algebricks-tests/src/test/java/org/apache/hyracks/algebricks/tests/util/AlgebricksHyracksIntegrationUtil.java
@@ -65,8 +65,7 @@
         ncConfig1.setClusterListenAddress("127.0.0.1");
         ncConfig1.setDataListenAddress("127.0.0.1");
         ncConfig1.setResultListenAddress("127.0.0.1");
-        ncConfig1.setIODevices(new String [] { joinPath(System.getProperty("user.dir"), "target", "data",
-                "device0") });
+        ncConfig1.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device0") });
         FileUtils.forceMkdir(new File(ncConfig1.getIODevices()[0]));
         nc1 = new NodeControllerService(ncConfig1);
         nc1.start();
@@ -77,8 +76,7 @@
         ncConfig2.setClusterListenAddress("127.0.0.1");
         ncConfig2.setDataListenAddress("127.0.0.1");
         ncConfig2.setResultListenAddress("127.0.0.1");
-        ncConfig2.setIODevices(new String [] { joinPath(System.getProperty("user.dir"), "target", "data",
-                "device1") });
+        ncConfig2.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device1") });
         FileUtils.forceMkdir(new File(ncConfig1.getIODevices()[0]));
         nc2 = new NodeControllerService(ncConfig2);
         nc2.start();
diff --git a/hyracks-fullstack/algebricks/pom.xml b/hyracks-fullstack/algebricks/pom.xml
index e41c203..b8af179 100644
--- a/hyracks-fullstack/algebricks/pom.xml
+++ b/hyracks-fullstack/algebricks/pom.xml
@@ -50,6 +50,5 @@
     <module>algebricks-runtime</module>
     <module>algebricks-rewriter</module>
     <module>algebricks-tests</module>
-    <module>algebricks-examples</module>
   </modules>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-api/pom.xml b/hyracks-fullstack/hyracks/hyracks-api/pom.xml
index 848c3e2..3484e23 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-api/pom.xml
@@ -104,5 +104,9 @@
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/ICCApplication.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/ICCApplication.java
index d4269d5..6bcdd8a 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/ICCApplication.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/ICCApplication.java
@@ -18,10 +18,12 @@
  */
 package org.apache.hyracks.api.application;
 
+import org.apache.hyracks.api.config.IConfigManager;
 import org.apache.hyracks.api.job.resource.IJobCapacityController;
 
 public interface ICCApplication extends IApplication {
 
     IJobCapacityController getJobCapacityController();
 
+    IConfigManager getConfigManager();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/INCApplication.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/INCApplication.java
index 64f4e29..af6cb92 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/INCApplication.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/application/INCApplication.java
@@ -18,6 +18,7 @@
  */
 package org.apache.hyracks.api.application;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.io.IFileDeviceResolver;
 import org.apache.hyracks.api.job.resource.NodeCapacity;
 
@@ -33,5 +34,5 @@
      */
     IFileDeviceResolver getFileDeviceResolver();
 
-    void onRegisterNode() throws Exception;
+    void onRegisterNode(CcId ccId) throws Exception;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/ClusterControllerInfo.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/ClusterControllerInfo.java
index 3d69ddb..0e04dca 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/ClusterControllerInfo.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/ClusterControllerInfo.java
@@ -18,23 +18,32 @@
  */
 package org.apache.hyracks.api.client;
 
+import org.apache.hyracks.api.control.CcId;
+
 import java.io.Serializable;
 
 public class ClusterControllerInfo implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    private final CcId ccId;
+
     private final String clientNetAddress;
 
     private final int clientNetPort;
 
     private final int webPort;
 
-    public ClusterControllerInfo(String clientNetAddress, int clientNetPort, int webPort) {
+    public ClusterControllerInfo(CcId ccId, String clientNetAddress, int clientNetPort, int webPort) {
+        this.ccId = ccId;
         this.clientNetAddress = clientNetAddress;
         this.clientNetPort = clientNetPort;
         this.webPort = webPort;
     }
 
+    public CcId getCcId() {
+        return ccId;
+    }
+
     public int getWebPort() {
         return webPort;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceFunctions.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceFunctions.java
index 95479c1..23c41fe 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceFunctions.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceFunctions.java
@@ -22,10 +22,13 @@
 import java.net.URL;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.hyracks.api.dataset.DatasetDirectoryRecord;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 
@@ -104,12 +107,12 @@
         }
     }
 
-    public static class DistributeJobFunction extends Function {
+    public static class DeployJobSpecFunction extends Function {
         private static final long serialVersionUID = 1L;
 
         private final byte[] acggfBytes;
 
-        public DistributeJobFunction(byte[] acggfBytes) {
+        public DeployJobSpecFunction(byte[] acggfBytes) {
             this.acggfBytes = acggfBytes;
         }
 
@@ -145,13 +148,13 @@
         }
     }
 
-    public static class DestroyJobFunction extends Function {
+    public static class UndeployJobSpecFunction extends Function {
         private static final long serialVersionUID = 1L;
 
-        private final JobId jobId;
+        private final DeployedJobSpecId deployedJobSpecId;
 
-        public DestroyJobFunction(JobId jobId) {
-            this.jobId = jobId;
+        public UndeployJobSpecFunction(DeployedJobSpecId deployedJobSpecId) {
+            this.deployedJobSpecId = deployedJobSpecId;
         }
 
         @Override
@@ -159,8 +162,8 @@
             return FunctionId.DESTROY_JOB;
         }
 
-        public JobId getJobId() {
-            return jobId;
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
         }
     }
 
@@ -168,27 +171,30 @@
         private static final long serialVersionUID = 1L;
 
         private final byte[] acggfBytes;
-        private final EnumSet<JobFlag> jobFlags;
+        private final Set<JobFlag> jobFlags;
         private final DeploymentId deploymentId;
-        private final JobId jobId;
+        private final DeployedJobSpecId deployedJobSpecId;
+        private final Map<byte[], byte[]> jobParameters;
 
-        public StartJobFunction(DeploymentId deploymentId, byte[] acggfBytes, EnumSet<JobFlag> jobFlags, JobId jobId) {
+        public StartJobFunction(DeploymentId deploymentId, byte[] acggfBytes, Set<JobFlag> jobFlags,
+                DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) {
             this.acggfBytes = acggfBytes;
             this.jobFlags = jobFlags;
             this.deploymentId = deploymentId;
-            this.jobId = jobId;
+            this.deployedJobSpecId = deployedJobSpecId;
+            this.jobParameters = jobParameters;
         }
 
-        public StartJobFunction(JobId jobId) {
-            this(null, null, EnumSet.noneOf(JobFlag.class), jobId);
+        public StartJobFunction(DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) {
+            this(null, null, EnumSet.noneOf(JobFlag.class), deployedJobSpecId, jobParameters);
         }
 
-        public StartJobFunction(byte[] acggfBytes, EnumSet<JobFlag> jobFlags) {
-            this(null, acggfBytes, jobFlags, null);
+        public StartJobFunction(byte[] acggfBytes, Set<JobFlag> jobFlags) {
+            this(null, acggfBytes, jobFlags, null, null);
         }
 
-        public StartJobFunction(DeploymentId deploymentId, byte[] acggfBytes, EnumSet<JobFlag> jobFlags) {
-            this(deploymentId, acggfBytes, jobFlags, null);
+        public StartJobFunction(DeploymentId deploymentId, byte[] acggfBytes, Set<JobFlag> jobFlags) {
+            this(deploymentId, acggfBytes, jobFlags, null, null);
         }
 
         @Override
@@ -196,15 +202,19 @@
             return FunctionId.START_JOB;
         }
 
-        public JobId getJobId() {
-            return jobId;
+        public Map<byte[], byte[]> getJobParameters() {
+            return jobParameters;
+        }
+
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
         }
 
         public byte[] getACGGFBytes() {
             return acggfBytes;
         }
 
-        public EnumSet<JobFlag> getJobFlags() {
+        public Set<JobFlag> getJobFlags() {
             return jobFlags;
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceRemoteProxy.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceRemoteProxy.java
index 0ded84f..eddcaa5 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceRemoteProxy.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksClientInterfaceRemoteProxy.java
@@ -26,6 +26,7 @@
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobInfo;
@@ -76,9 +77,9 @@
     }
 
     @Override
-    public JobId startJob(JobId jobId) throws Exception {
+    public JobId startJob(DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) throws Exception {
         HyracksClientInterfaceFunctions.StartJobFunction sjf =
-                new HyracksClientInterfaceFunctions.StartJobFunction(jobId);
+                new HyracksClientInterfaceFunctions.StartJobFunction(deployedJobSpecId, jobParameters);
         return (JobId) rpci.call(ipcHandle, sjf);
     }
 
@@ -90,17 +91,17 @@
     }
 
     @Override
-    public JobId distributeJob(byte[] acggfBytes) throws Exception {
-        HyracksClientInterfaceFunctions.DistributeJobFunction sjf =
-                new HyracksClientInterfaceFunctions.DistributeJobFunction(acggfBytes);
-        return (JobId) rpci.call(ipcHandle, sjf);
+    public DeployedJobSpecId deployJobSpec(byte[] acggfBytes) throws Exception {
+        HyracksClientInterfaceFunctions.DeployJobSpecFunction sjf =
+                new HyracksClientInterfaceFunctions.DeployJobSpecFunction(acggfBytes);
+        return (DeployedJobSpecId) rpci.call(ipcHandle, sjf);
     }
 
     @Override
-    public JobId destroyJob(JobId jobId) throws Exception {
-        HyracksClientInterfaceFunctions.DestroyJobFunction sjf =
-                new HyracksClientInterfaceFunctions.DestroyJobFunction(jobId);
-        return (JobId) rpci.call(ipcHandle, sjf);
+    public DeployedJobSpecId undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception {
+        HyracksClientInterfaceFunctions.UndeployJobSpecFunction sjf =
+                new HyracksClientInterfaceFunctions.UndeployJobSpecFunction(deployedJobSpecId);
+        return (DeployedJobSpecId) rpci.call(ipcHandle, sjf);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksConnection.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksConnection.java
index e979da6..80b61f4 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksConnection.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/HyracksConnection.java
@@ -36,6 +36,7 @@
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
@@ -82,7 +83,8 @@
         RPCInterface rpci = new RPCInterface();
         ipc = new IPCSystem(new InetSocketAddress(0), rpci, new JavaSerializationBasedPayloadSerializerDeserializer());
         ipc.start();
-        hci = new HyracksClientInterfaceRemoteProxy(ipc.getHandle(new InetSocketAddress(ccHost, ccPort)), rpci);
+        hci = new HyracksClientInterfaceRemoteProxy(ipc.getReconnectingHandle(new InetSocketAddress(ccHost, ccPort)),
+                rpci);
         ccInfo = hci.getClusterControllerInfo();
     }
 
@@ -109,20 +111,20 @@
     }
 
     @Override
-    public JobId distributeJob(JobSpecification jobSpec) throws Exception {
-        IActivityClusterGraphGeneratorFactory jsacggf =
+    public DeployedJobSpecId deployJobSpec(JobSpecification jobSpec) throws Exception {
+        JobSpecificationActivityClusterGraphGeneratorFactory jsacggf =
                 new JobSpecificationActivityClusterGraphGeneratorFactory(jobSpec);
-        return distributeJob(jsacggf);
+        return deployJobSpec(jsacggf);
     }
 
     @Override
-    public JobId destroyJob(JobId jobId) throws Exception {
-        return hci.destroyJob(jobId);
+    public DeployedJobSpecId undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception {
+        return hci.undeployJobSpec(deployedJobSpecId);
     }
 
     @Override
-    public JobId startJob(JobId jobId) throws Exception {
-        return hci.startJob(jobId);
+    public JobId startJob(DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) throws Exception {
+        return hci.startJob(deployedJobSpecId, jobParameters);
     }
 
     @Override
@@ -130,8 +132,8 @@
         return hci.startJob(JavaSerializationUtils.serialize(acggf), jobFlags);
     }
 
-    public JobId distributeJob(IActivityClusterGraphGeneratorFactory acggf) throws Exception {
-        return hci.distributeJob(JavaSerializationUtils.serialize(acggf));
+    public DeployedJobSpecId deployJobSpec(IActivityClusterGraphGeneratorFactory acggf) throws Exception {
+        return hci.deployJobSpec(JavaSerializationUtils.serialize(acggf));
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientConnection.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientConnection.java
index a7c1d75..510a6b6 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientConnection.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientConnection.java
@@ -20,9 +20,11 @@
 
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
@@ -94,25 +96,27 @@
      *            Flags
      * @throws Exception
      */
-    JobId distributeJob(JobSpecification jobSpec) throws Exception;
+    DeployedJobSpecId deployJobSpec(JobSpecification jobSpec) throws Exception;
 
     /**
-     * Destroy the distributed graph for a pre-distributed job
+     * Remove the deployed Job Spec
      *
-     * @param jobId
-     *            The id of the predistributed job
+     * @param deployedJobSpecId
+     *            The id of the deployed job spec
      * @throws Exception
      */
-    JobId destroyJob(JobId jobId) throws Exception;
+    DeployedJobSpecId undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception;
 
     /**
-     * Used to run a pre-distributed job by id (the same JobId will be returned)
+     * Used to run a deployed Job Spec by id
      *
-     * @param jobId
-     *            The id of the predistributed job
+     * @param deployedJobSpecId
+     *            The id of the deployed job spec
+     * @param jobParameters
+     *            The serialized job parameters
      * @throws Exception
      */
-    JobId startJob(JobId jobId) throws Exception;
+    JobId startJob(DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) throws Exception;
 
     /**
      * Start the specified Job.
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientInterface.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientInterface.java
index 9cebd3e..f0c7872 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientInterface.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/IHyracksClientInterface.java
@@ -25,6 +25,7 @@
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobInfo;
@@ -38,13 +39,13 @@
 
     public JobId startJob(byte[] acggfBytes, EnumSet<JobFlag> jobFlags) throws Exception;
 
-    public JobId startJob(JobId jobId) throws Exception;
+    public JobId startJob(DeployedJobSpecId deployedJobSpecId, Map<byte[], byte[]> jobParameters) throws Exception;
 
     public void cancelJob(JobId jobId) throws Exception;
 
-    public JobId distributeJob(byte[] acggfBytes) throws Exception;
+    public DeployedJobSpecId deployJobSpec(byte[] acggfBytes) throws Exception;
 
-    public JobId destroyJob(JobId jobId) throws Exception;
+    public DeployedJobSpecId undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception;
 
     public NetworkAddress getDatasetDirectoryServiceInfo() throws Exception;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/NodeStatus.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/NodeStatus.java
index b84f1f2..10a9a3c 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/NodeStatus.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/NodeStatus.java
@@ -19,6 +19,7 @@
 package org.apache.hyracks.api.client;
 
 public enum NodeStatus {
-    ALIVE,
+    ACTIVE,
+    BOOTING,
     DEAD
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/ActivityClusterGraphBuilder.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/ActivityClusterGraphBuilder.java
index 7dd5fe9..e2cd923 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/ActivityClusterGraphBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/ActivityClusterGraphBuilder.java
@@ -24,11 +24,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
-
 import org.apache.hyracks.api.dataflow.ActivityId;
 import org.apache.hyracks.api.dataflow.IActivity;
 import org.apache.hyracks.api.dataflow.IConnectorDescriptor;
@@ -36,10 +33,11 @@
 import org.apache.hyracks.api.job.ActivityClusterGraph;
 import org.apache.hyracks.api.job.ActivityClusterId;
 import org.apache.hyracks.api.job.JobActivityGraph;
-import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ActivityClusterGraphBuilder {
-    private static final Logger LOGGER = Logger.getLogger(ActivityClusterGraphBuilder.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public ActivityClusterGraphBuilder() {
     }
@@ -70,7 +68,7 @@
         return null;
     }
 
-    public ActivityClusterGraph inferActivityClusters(JobId jobId, JobActivityGraph jag) {
+    public ActivityClusterGraph inferActivityClusters(JobActivityGraph jag) {
         /*
          * Build initial equivalence sets map. We create a map such that for each IOperatorTask, t -> { t }
          */
@@ -99,7 +97,7 @@
         Map<ActivityId, IActivity> activityNodeMap = jag.getActivityMap();
         List<ActivityCluster> acList = new ArrayList<ActivityCluster>();
         for (Set<ActivityId> stage : stages) {
-            ActivityCluster ac = new ActivityCluster(acg, new ActivityClusterId(jobId, acCounter++));
+            ActivityCluster ac = new ActivityCluster(acg, new ActivityClusterId(acCounter++));
             acList.add(ac);
             for (ActivityId aid : stage) {
                 IActivity activity = activityNodeMap.get(aid);
@@ -120,10 +118,10 @@
                     for (int i = 0; i < nActivityOutputs; ++i) {
                         IConnectorDescriptor conn = aOutputs.get(i);
                         ac.addConnector(conn);
-                        Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>> pcPair = jag.getConnectorActivityMap()
-                                .get(conn.getConnectorId());
-                        ac.connect(conn, activity, i, pcPair.getRight().getLeft(), pcPair.getRight().getRight(), jag
-                                .getConnectorRecordDescriptorMap().get(conn.getConnectorId()));
+                        Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>> pcPair =
+                                jag.getConnectorActivityMap().get(conn.getConnectorId());
+                        ac.connect(conn, activity, i, pcPair.getRight().getLeft(), pcPair.getRight().getRight(),
+                                jag.getConnectorRecordDescriptorMap().get(conn.getConnectorId()));
                     }
                 }
             }
@@ -148,8 +146,8 @@
         }
         acg.addActivityClusters(acList);
 
-        if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine(acg.toJSON().asText());
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug(acg.toJSON().asText());
         }
         return acg;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobActivityGraphBuilder.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobActivityGraphBuilder.java
index 084626e..b4d5ba4 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobActivityGraphBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobActivityGraphBuilder.java
@@ -24,8 +24,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.dataflow.ActivityId;
@@ -37,9 +35,11 @@
 import org.apache.hyracks.api.job.JobActivityGraph;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class JobActivityGraphBuilder implements IActivityGraphBuilder {
-    private static final Logger LOGGER = Logger.getLogger(JobActivityGraphBuilder.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final Map<ActivityId, IOperatorDescriptor> activityOperatorMap;
 
@@ -71,8 +71,8 @@
 
     @Override
     public void addSourceEdge(int operatorInputIndex, IActivity task, int taskInputIndex) {
-        if (LOGGER.isLoggable(Level.FINEST)) {
-            LOGGER.finest("Adding source edge: " + task.getActivityId() + ":" + operatorInputIndex + " -> "
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("Adding source edge: " + task.getActivityId() + ":" + operatorInputIndex + " -> "
                     + task.getActivityId() + ":" + taskInputIndex);
         }
         IOperatorDescriptor op = activityOperatorMap.get(task.getActivityId());
@@ -83,8 +83,8 @@
 
     @Override
     public void addTargetEdge(int operatorOutputIndex, IActivity task, int taskOutputIndex) {
-        if (LOGGER.isLoggable(Level.FINEST)) {
-            LOGGER.finest("Adding target edge: " + task.getActivityId() + ":" + operatorOutputIndex + " -> "
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("Adding target edge: " + task.getActivityId() + ":" + operatorOutputIndex + " -> "
                     + task.getActivityId() + ":" + taskOutputIndex);
         }
         IOperatorDescriptor op = activityOperatorMap.get(task.getActivityId());
@@ -101,8 +101,8 @@
     }
 
     public void finish() {
-        Map<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>> caMap = jag
-                .getConnectorActivityMap();
+        Map<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>> caMap =
+                jag.getConnectorActivityMap();
         connectorProducerMap
                 .forEach((cdId, producer) -> caMap.put(cdId, Pair.of(producer, connectorConsumerMap.get(cdId))));
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobSpecificationActivityClusterGraphGeneratorFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobSpecificationActivityClusterGraphGeneratorFactory.java
index c712b36..ddf0ce8 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobSpecificationActivityClusterGraphGeneratorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/client/impl/JobSpecificationActivityClusterGraphGeneratorFactory.java
@@ -32,7 +32,6 @@
 import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
 import org.apache.hyracks.api.job.JobActivityGraph;
 import org.apache.hyracks.api.job.JobFlag;
-import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.api.rewriter.ActivityClusterGraphRewriter;
 
@@ -51,8 +50,8 @@
     }
 
     @Override
-    public IActivityClusterGraphGenerator createActivityClusterGraphGenerator(JobId jobId,
-            final ICCServiceContext ccServiceCtx, Set<JobFlag> jobFlags) throws HyracksException {
+    public IActivityClusterGraphGenerator createActivityClusterGraphGenerator(final ICCServiceContext ccServiceCtx,
+            Set<JobFlag> jobFlags) throws HyracksException {
         final JobActivityGraphBuilder builder = new JobActivityGraphBuilder(spec, jobFlags);
         PlanUtils.visit(spec, new IConnectorDescriptorVisitor() {
             @Override
@@ -70,7 +69,7 @@
         final JobActivityGraph jag = builder.getActivityGraph();
         ActivityClusterGraphBuilder acgb = new ActivityClusterGraphBuilder();
 
-        final ActivityClusterGraph acg = acgb.inferActivityClusters(jobId, jag);
+        final ActivityClusterGraph acg = acgb.inferActivityClusters(jag);
         acg.setFrameSize(spec.getFrameSize());
         acg.setMaxReattempts(spec.getMaxReattempts());
         acg.setJobletEventListenerFactory(spec.getJobletEventListenerFactory());
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameConstants.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameConstants.java
index cd74659..04c27be 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameConstants.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameConstants.java
@@ -43,7 +43,7 @@
     /**
      * Indicate the total size of the meta data.
      */
-    int META_DATA_LEN = SIZE_LEN  + TUPLE_START_OFFSET;
+    int META_DATA_LEN = SIZE_LEN + TUPLE_START_OFFSET;
 
     boolean DEBUG_FRAME_IO = false;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameHelper.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameHelper.java
index 68533c6..1242ba0 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameHelper.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/FrameHelper.java
@@ -38,7 +38,8 @@
     }
 
     public static void serializeFrameSize(ByteBuffer outputFrame, int start, int numberOfMinFrame) {
-        IntSerDeUtils.putInt(outputFrame.array(), start + FrameConstants.META_DATA_FRAME_COUNT_OFFSET, numberOfMinFrame);
+        IntSerDeUtils.putInt(outputFrame.array(), start + FrameConstants.META_DATA_FRAME_COUNT_OFFSET,
+                numberOfMinFrame);
     }
 
     public static int deserializeNumOfMinFrame(ByteBuffer frame) {
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameTupleAppender.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameTupleAppender.java
index 64fa322..9a2db6f 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameTupleAppender.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/comm/IFrameTupleAppender.java
@@ -33,11 +33,11 @@
 
     boolean append(IFrameTupleAccessor tupleAccessor, int tStartOffset, int tEndOffset) throws HyracksDataException;
 
-    boolean appendConcat(IFrameTupleAccessor accessor0, int tIndex0, IFrameTupleAccessor accessor1,
-            int tIndex1) throws HyracksDataException;
+    boolean appendConcat(IFrameTupleAccessor accessor0, int tIndex0, IFrameTupleAccessor accessor1, int tIndex1)
+            throws HyracksDataException;
 
-    boolean appendConcat(IFrameTupleAccessor accessor0, int tIndex0, int[] fieldSlots1, byte[] bytes1,
-            int offset1, int dataLen1) throws HyracksDataException;
+    boolean appendConcat(IFrameTupleAccessor accessor0, int tIndex0, int[] fieldSlots1, byte[] bytes1, int offset1,
+            int dataLen1) throws HyracksDataException;
 
     boolean appendProjection(IFrameTupleAccessor accessor, int tIndex, int[] fields) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IApplicationConfig.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IApplicationConfig.java
index ddcaab3..402f02e 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IApplicationConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IApplicationConfig.java
@@ -22,7 +22,8 @@
 import java.util.List;
 import java.util.Set;
 import java.util.function.Predicate;
-import java.util.logging.Level;
+
+import org.apache.logging.log4j.Level;
 
 /**
  * Accessor for the data contained in the global application configuration file.
@@ -59,34 +60,38 @@
     }
 
     default long getLong(IOption option) {
-        return (long)get(option);
+        return (long) get(option);
     }
 
     default int getInt(IOption option) {
-        return (int)get(option);
+        return (int) get(option);
+    }
+
+    default short getShort(IOption option) {
+        return (short) get(option);
     }
 
     default String getString(IOption option) {
-        return (String)get(option);
+        return (String) get(option);
     }
 
     default boolean getBoolean(IOption option) {
-        return (boolean)get(option);
+        return (boolean) get(option);
     }
 
     default Level getLoggingLevel(IOption option) {
-        return (Level)get(option);
+        return (Level) get(option);
     }
 
     default double getDouble(IOption option) {
-        return (double)get(option);
+        return (double) get(option);
     }
 
-    default String [] getStringArray(IOption option) {
-        return (String [])get(option);
+    default String[] getStringArray(IOption option) {
+        return (String[]) get(option);
     }
 
     default URL getURL(IOption option) {
-        return (URL)get(option);
+        return (URL) get(option);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java
index ed6dcd0..5f11214 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOption.java
@@ -56,7 +56,9 @@
     /**
      * @return a true value indicates this option should not be advertised (e.g. command-line usage, documentation)
      */
-    default boolean hidden() { return false; }
+    default boolean hidden() {
+        return false;
+    }
 
     default String cmdline() {
         return "-" + name().toLowerCase().replace("_", "-");
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
index d2a254f..aee22c9 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/config/IOptionType.java
@@ -18,6 +18,7 @@
  */
 package org.apache.hyracks.api.config;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public interface IOptionType<T> {
@@ -26,6 +27,11 @@
      */
     T parse(String s);
 
+    /**
+     * @throws IllegalArgumentException when the supplied JSON node cannot be interpreted
+     */
+    T parse(JsonNode node);
+
     Class<T> targetType();
 
     /**
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/constraints/PartitionConstraintHelper.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/constraints/PartitionConstraintHelper.java
index 95f5e1a..762fdee 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/constraints/PartitionConstraintHelper.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/constraints/PartitionConstraintHelper.java
@@ -26,8 +26,8 @@
 
 public class PartitionConstraintHelper {
     public static void addPartitionCountConstraint(JobSpecification spec, IOperatorDescriptor op, int count) {
-        spec.addUserConstraint(new Constraint(new PartitionCountExpression(op.getOperatorId()), new ConstantExpression(
-                count)));
+        spec.addUserConstraint(
+                new Constraint(new PartitionCountExpression(op.getOperatorId()), new ConstantExpression(count)));
     }
 
     public static void addAbsoluteLocationConstraint(JobSpecification spec, IOperatorDescriptor op,
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksCommonContext.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksCommonContext.java
index 5afcf69..1206d8e 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksCommonContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksCommonContext.java
@@ -20,7 +20,7 @@
 
 import org.apache.hyracks.api.io.IIOManager;
 
-public interface IHyracksCommonContext extends IHyracksFrameMgrContext{
+public interface IHyracksCommonContext extends IHyracksFrameMgrContext {
 
     public IIOManager getIoManager();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksJobletContext.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksJobletContext.java
index 6eb0adb..1100335 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksJobletContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksJobletContext.java
@@ -21,6 +21,7 @@
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.io.IWorkspaceFileFactory;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.profiling.counters.ICounterContext;
 import org.apache.hyracks.api.resources.IDeallocatableRegistry;
@@ -34,6 +35,8 @@
 
     Object getGlobalJobData();
 
+    IJobletEventListenerFactory getJobletEventListenerFactory();
+
     Class<?> loadClass(String className) throws HyracksException;
 
     ClassLoader getClassLoader() throws HyracksException;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksTaskContext.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksTaskContext.java
index 10bb336..bf42d0c 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksTaskContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/context/IHyracksTaskContext.java
@@ -25,6 +25,7 @@
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.io.IWorkspaceFileFactory;
 import org.apache.hyracks.api.job.IOperatorEnvironment;
 import org.apache.hyracks.api.job.JobFlag;
@@ -52,6 +53,8 @@
 
     Object getSharedObject();
 
+    public byte[] getJobParameter(byte[] name, int start, int length) throws HyracksException;
+
     Set<JobFlag> getJobFlags();
 
     IStatsCollector getStatsCollector();
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcId.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcId.java
new file mode 100644
index 0000000..2a7be9d
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcId.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.control;
+
+import java.io.Serializable;
+
+public class CcId implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private short id;
+
+    private CcId(short id) {
+        this.id = id;
+    }
+
+    public static CcId valueOf(String ccIdString) {
+        return new CcId(Integer.decode(ccIdString).shortValue());
+    }
+
+    public static CcId valueOf(int ccId) {
+        if ((ccId & ~0xffff) != 0) {
+            throw new IllegalArgumentException("ccId cannot exceed 16-bits: " + Integer.toHexString(ccId));
+        }
+        return new CcId((short) ccId);
+    }
+
+    public short shortValue() {
+        return id;
+    }
+
+    public long toLongMask() {
+        return (long) id << CcIdPartitionedLongFactory.ID_BITS;
+    }
+
+    @Override
+    public int hashCode() {
+        return id;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof CcId && id == ((CcId) obj).id;
+    }
+
+    @Override
+    public String toString() {
+        return "CC:" + Integer.toHexString(((int) id) & 0xffff);
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcIdPartitionedLongFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcIdPartitionedLongFactory.java
new file mode 100644
index 0000000..0a26494
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/control/CcIdPartitionedLongFactory.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.control;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class CcIdPartitionedLongFactory {
+    private static final int CC_BITS = Short.SIZE;
+    public static final int ID_BITS = Long.SIZE - CC_BITS;
+    public static final long MAX_ID = (1L << ID_BITS) - 1;
+    private final CcId ccId;
+    private final AtomicLong id;
+
+    public CcIdPartitionedLongFactory(CcId ccId) {
+        this.ccId = ccId;
+        id = new AtomicLong(ccId.toLongMask());
+    }
+
+    protected long nextId() {
+        return id.getAndUpdate(prev -> {
+            if ((prev & MAX_ID) == MAX_ID) {
+                return prev ^ MAX_ID;
+            } else {
+                return prev + 1;
+            }
+        });
+    }
+
+    protected long maxId() {
+        long next = id.get();
+        if ((next & MAX_ID) == 0) {
+            return next | MAX_ID;
+        } else {
+            return next - 1;
+        }
+    }
+
+    protected void ensureMinimumId(long id) {
+        if ((id & ~MAX_ID) != ccId.toLongMask()) {
+            throw new IllegalArgumentException("cannot change ccId as part of ensureMinimumId() (was: "
+                    + Long.toHexString(this.id.get()) + ", given: " + Long.toHexString(id));
+        }
+        this.id.updateAndGet(current -> Math.max(current, id));
+    }
+
+    public CcId getCcId() {
+        return ccId;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/TaskAttemptId.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/TaskAttemptId.java
index 782561b..bb3b3c8 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/TaskAttemptId.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/TaskAttemptId.java
@@ -25,7 +25,7 @@
 
 import org.apache.hyracks.api.io.IWritable;
 
-public final class TaskAttemptId implements IWritable, Serializable {
+public class TaskAttemptId implements IWritable, Serializable {
     private static final long serialVersionUID = 1L;
 
     private TaskId taskId;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputer.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputer.java
index 2c79a4d..7364bea 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputer.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputer.java
@@ -19,5 +19,7 @@
 package org.apache.hyracks.api.dataflow.value;
 
 public interface INormalizedKeyComputer {
-    public int normalize(byte[] bytes, int start, int length);
+    void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart);
+
+    INormalizedKeyProperties getNormalizedKeyProperties();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputerFactory.java
index 2b7198b..a1339a9 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyComputerFactory.java
@@ -22,4 +22,6 @@
 
 public interface INormalizedKeyComputerFactory extends Serializable {
     public INormalizedKeyComputer createNormalizedKeyComputer();
+
+    public INormalizedKeyProperties getNormalizedKeyProperties();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyProperties.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyProperties.java
new file mode 100644
index 0000000..63e799a
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/INormalizedKeyProperties.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.dataflow.value;
+
+import java.io.Serializable;
+
+public interface INormalizedKeyProperties extends Serializable {
+    /**
+     *
+     * @return The length of the normalized key in terms of integers
+     */
+    public int getNormalizedKeyLength();
+
+    /**
+     *
+     * @return Whether we can solely rely on this normalized key to complete comparison,
+     *         even when two normalized keys are equal
+     */
+    public boolean isDecisive();
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/JSONSerializable.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/JSONSerializable.java
index 23ae97b..8b514f0 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/JSONSerializable.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataflow/value/JSONSerializable.java
@@ -18,7 +18,6 @@
  */
 package org.apache.hyracks.api.dataflow.value;
 
-
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public interface JSONSerializable {
@@ -27,5 +26,5 @@
      *
      * @return A om.createObjectNode instance representing this Java object.
      */
-    public ObjectNode toJSON() ;
+    public ObjectNode toJSON();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetDirectoryRecord.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetDirectoryRecord.java
index 3165840..e47b1e2 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetDirectoryRecord.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetDirectoryRecord.java
@@ -58,7 +58,7 @@
         this.empty = empty;
     }
 
-    public boolean getEmpty() {
+    public boolean isEmpty() {
         return empty;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetJobRecord.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetJobRecord.java
index 55f1d7c..4e7ddda 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetJobRecord.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/DatasetJobRecord.java
@@ -84,7 +84,7 @@
     private Map<ResultSetId, ResultSetMetaData> resultSetMetadataMap = new HashMap<>();
 
     public DatasetJobRecord() {
-        this.timestamp = System.currentTimeMillis();
+        this.timestamp = System.nanoTime();
         this.status = new Status();
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetInputChannelMonitor.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetInputChannelMonitor.java
deleted file mode 100644
index bce321f..0000000
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetInputChannelMonitor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.api.dataset;
-
-import org.apache.hyracks.api.channels.IInputChannelMonitor;
-
-public interface IDatasetInputChannelMonitor extends IInputChannelMonitor {
-    public boolean eosReached();
-
-    public boolean failed();
-
-    public int getNFramesAvailable();
-
-    public void notifyFrameRead();
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetManager.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetManager.java
index c8463d3..a0c1f78 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetManager.java
@@ -24,11 +24,15 @@
 
 public interface IDatasetManager {
 
-    public Set<JobId> getJobIds();
+    Set<JobId> getJobIds();
 
-    public IDatasetStateRecord getState(JobId jobId);
+    IDatasetStateRecord getState(JobId jobId);
 
-    public void deinitState(JobId jobId);
+    void sweep(JobId jobId);
 
-    public long getResultTimestamp(JobId jobId);
-}
+    /**
+     * Removes all references and deletes persisted files for
+     * all expired datasets.
+     */
+    void sweepExpiredDatasets();
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetPartitionManager.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetPartitionManager.java
index 008f0be..e6cf6d3 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetPartitionManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/dataset/IDatasetPartitionManager.java
@@ -25,7 +25,7 @@
 
 public interface IDatasetPartitionManager extends IDatasetManager {
     IFrameWriter createDatasetPartitionWriter(IHyracksTaskContext ctx, ResultSetId rsId, boolean orderedResult,
-            boolean asyncMode, int partition, int nPartitions) throws HyracksException;
+            boolean asyncMode, int partition, int nPartitions, long maxReads) throws HyracksException;
 
     void registerResultPartitionLocation(JobId jobId, ResultSetId rsId, int partition, int nPartitions,
             boolean orderedResult, boolean emptyResult) throws HyracksException;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
index 7926469..8b47171 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/ErrorCode.java
@@ -54,9 +54,9 @@
     public static final int INCONSISTENT_RESULT_METADATA = 18;
     public static final int CANNOT_DELETE_FILE = 19;
     public static final int NOT_A_JOBID = 20;
-    public static final int ERROR_FINDING_DISTRIBUTED_JOB = 21;
-    public static final int DUPLICATE_DISTRIBUTED_JOB = 22;
-    public static final int DISTRIBUTED_JOB_FAILURE = 23;
+    public static final int ERROR_FINDING_DEPLOYED_JOB = 21;
+    public static final int DUPLICATE_DEPLOYED_JOB = 22;
+    public static final int DEPLOYED_JOB_FAILURE = 23;
     public static final int NO_RESULT_SET = 24;
     public static final int JOB_CANCELED = 25;
     public static final int NODE_FAILED = 26;
@@ -126,7 +126,7 @@
     public static final int ILLEGAL_MEMORY_BUDGET = 90;
     public static final int TIMEOUT = 91;
     public static final int JOB_HAS_BEEN_CLEARED_FROM_HISTORY = 92;
-    public static final int JOB_HAS_NOT_BEEN_CREATED_YET = 93;
+    public static final int FAILED_TO_READ_RESULT = 93;
     public static final int CANNOT_READ_CLOSED_FILE = 94;
     public static final int TUPLE_CANNOT_FIT_INTO_EMPTY_FRAME = 95;
     public static final int ILLEGAL_ATTEMPT_TO_ENTER_EMPTY_COMPONENT = 96;
@@ -139,6 +139,7 @@
     public static final int VBC_ALREADY_CLOSED = 103;
     public static final int INDEX_DOES_NOT_EXIST = 104;
     public static final int CANNOT_DROP_IN_USE_INDEX = 105;
+    public static final int CANNOT_DEACTIVATE_PINNED_BLOOM_FILTER = 106;
 
     // Compilation error codes.
     public static final int RULECOLLECTION_NOT_INSTANCE_OF_LIST = 10000;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java
index 7ae7cbf..d0e4655 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/exceptions/HyracksDataException.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.api.exceptions;
 
 import java.io.Serializable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.util.ErrorMessageUtil;
 
@@ -31,7 +29,6 @@
 public class HyracksDataException extends HyracksException {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(HyracksDataException.class.getName());
 
     public static HyracksDataException create(Throwable cause) {
         if (cause instanceof HyracksDataException || cause == null) {
@@ -39,11 +36,8 @@
         } else if (cause instanceof Error) {
             // don't wrap errors, allow them to propagate
             throw (Error) cause;
-        } else if (cause instanceof InterruptedException && !Thread.currentThread().isInterrupted()) {
-            // TODO(mblow): why not force interrupt on current thread?
-            LOGGER.log(Level.WARNING,
-                    "Wrapping an InterruptedException in HyracksDataException and current thread is not interrupted",
-                    cause);
+        } else if (cause instanceof InterruptedException) {
+            Thread.currentThread().interrupt();
         }
         return new HyracksDataException(cause);
     }
@@ -64,10 +58,8 @@
             // don't suppress errors into a HyracksDataException, allow them to propagate
             th.addSuppressed(root);
             throw (Error) th;
-        } else if (th instanceof InterruptedException && !Thread.currentThread().isInterrupted()) {
-            // TODO(mblow): why not force interrupt on current thread?
-            LOGGER.log(Level.WARNING, "Suppressing an InterruptedException in a HyracksDataException and current "
-                    + "thread is not interrupted", th);
+        } else if (th instanceof InterruptedException) {
+            Thread.currentThread().interrupt();
         }
         root.addSuppressed(th);
         return root;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IODeviceHandle.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IODeviceHandle.java
index 34c58f8..a2d28e1 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IODeviceHandle.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/io/IODeviceHandle.java
@@ -48,8 +48,7 @@
     public IODeviceHandle(File mount, String workspace) {
         this.mount = mount;
         this.workspace = workspace == null ? null
-                : workspace.endsWith(File.separator) ? workspace.substring(0, workspace.length() - 1)
-                        : workspace;
+                : workspace.endsWith(File.separator) ? workspace.substring(0, workspace.length() - 1) : workspace;
     }
 
     public File getMount() {
@@ -78,7 +77,7 @@
      *            comma separated list of devices
      * @return
      */
-    public static List<IODeviceHandle> getDevices(String [] ioDevices) {
+    public static List<IODeviceHandle> getDevices(String[] ioDevices) {
         List<IODeviceHandle> devices = new ArrayList<>();
         for (String ioDevice : ioDevices) {
             String devPath = ioDevice.trim();
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityCluster.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityCluster.java
index e5fad32..94e9c74 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityCluster.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityCluster.java
@@ -74,7 +74,8 @@
         connectorRecordDescriptorMap = new HashMap<ConnectorDescriptorId, RecordDescriptor>();
         activityInputMap = new HashMap<ActivityId, List<IConnectorDescriptor>>();
         activityOutputMap = new HashMap<ActivityId, List<IConnectorDescriptor>>();
-        connectorActivityMap = new HashMap<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>>();
+        connectorActivityMap =
+                new HashMap<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>>();
         blocked2blockerMap = new HashMap<ActivityId, Set<ActivityId>>();
         dependencies = new ArrayList<ActivityCluster>();
     }
@@ -108,8 +109,7 @@
         }
         insertIntoIndexedMap(activityInputMap, consumerActivity.getActivityId(), consumerPort, connector);
         insertIntoIndexedMap(activityOutputMap, producerActivity.getActivityId(), producerPort, connector);
-        connectorActivityMap.put(
-                connector.getConnectorId(),
+        connectorActivityMap.put(connector.getConnectorId(),
                 Pair.<Pair<IActivity, Integer>, Pair<IActivity, Integer>> of(
                         Pair.<IActivity, Integer> of(producerActivity, producerPort),
                         Pair.<IActivity, Integer> of(consumerActivity, consumerPort)));
@@ -187,7 +187,7 @@
         vList.set(index, value);
     }
 
-    public JsonNode toJSON()  {
+    public JsonNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ArrayNode jans = om.createArrayNode();
         ObjectNode jac = om.createObjectNode();
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterGraph.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterGraph.java
index b64e2d5..5816c8f 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterGraph.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterGraph.java
@@ -161,7 +161,7 @@
         return ac.getProducerActivity(cid);
     }
 
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode acgj = om.createObjectNode();
         ArrayNode acl = om.createArrayNode();
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterId.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterId.java
index e0c5279..84a754a 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterId.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/ActivityClusterId.java
@@ -23,19 +23,12 @@
 public final class ActivityClusterId implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    private final JobId jobId;
-
     private final int id;
 
-    public ActivityClusterId(JobId jobId, int id) {
-        this.jobId = jobId;
+    public ActivityClusterId(int id) {
         this.id = id;
     }
 
-    public JobId getJobId() {
-        return jobId;
-    }
-
     public int getId() {
         return id;
     }
@@ -45,7 +38,6 @@
         final int prime = 31;
         int result = 1;
         result = prime * result + id;
-        result = prime * result + ((jobId == null) ? 0 : jobId.hashCode());
         return result;
     }
 
@@ -64,18 +56,11 @@
         if (id != other.id) {
             return false;
         }
-        if (jobId == null) {
-            if (other.jobId != null) {
-                return false;
-            }
-        } else if (!jobId.equals(other.jobId)) {
-            return false;
-        }
         return true;
     }
 
     @Override
     public String toString() {
-        return "ACID:" + jobId + ":" + id;
+        return "ACID:" + id;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecId.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecId.java
new file mode 100644
index 0000000..8cbfb1a
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecId.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.job;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.apache.hyracks.api.exceptions.ErrorCode;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.IWritable;
+
+public final class DeployedJobSpecId implements IWritable, Serializable {
+
+    public static final DeployedJobSpecId INVALID = new DeployedJobSpecId(-1l);
+
+    private static final long serialVersionUID = 1L;
+    private long id;
+
+    public static DeployedJobSpecId create(DataInput dis) throws IOException {
+        DeployedJobSpecId deployedJobSpecId = new DeployedJobSpecId();
+        deployedJobSpecId.readFields(dis);
+        return deployedJobSpecId;
+    }
+
+    private DeployedJobSpecId() {
+    }
+
+    public DeployedJobSpecId(long id) {
+        this.id = id;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) id;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == this) {
+            return true;
+        }
+        if (!(o instanceof DeployedJobSpecId)) {
+            return false;
+        }
+        return ((DeployedJobSpecId) o).id == id;
+    }
+
+    @Override
+    public String toString() {
+        return "PDJID:" + id;
+    }
+
+    public static DeployedJobSpecId parse(String str) throws HyracksDataException {
+        if (str.startsWith("PDJID:")) {
+            return new DeployedJobSpecId(Long.parseLong(str.substring(4)));
+        }
+        throw HyracksDataException.create(ErrorCode.NOT_A_JOBID, str);
+    }
+
+    @Override
+    public void writeFields(DataOutput output) throws IOException {
+        output.writeLong(id);
+    }
+
+    @Override
+    public void readFields(DataInput input) throws IOException {
+        id = input.readLong();
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecIdFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecIdFactory.java
new file mode 100644
index 0000000..24caa9b
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/DeployedJobSpecIdFactory.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.job;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class DeployedJobSpecIdFactory {
+    private final AtomicLong id = new AtomicLong(0);
+
+    public DeployedJobSpecId create() {
+        return new DeployedJobSpecId(id.getAndIncrement());
+    }
+
+    public long maxDeployedJobSpecId() {
+        return id.get();
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IActivityClusterGraphGeneratorFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IActivityClusterGraphGeneratorFactory.java
index 133e342..bfa126a 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IActivityClusterGraphGeneratorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IActivityClusterGraphGeneratorFactory.java
@@ -25,8 +25,8 @@
 import org.apache.hyracks.api.exceptions.HyracksException;
 
 public interface IActivityClusterGraphGeneratorFactory extends Serializable {
-    public IActivityClusterGraphGenerator createActivityClusterGraphGenerator(JobId jobId,
-            ICCServiceContext ccServiceCtx, Set<JobFlag> jobFlags) throws HyracksException;
+    public IActivityClusterGraphGenerator createActivityClusterGraphGenerator(ICCServiceContext ccServiceCtx,
+            Set<JobFlag> jobFlags) throws HyracksException;
 
     public JobSpecification getJobSpecification();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IJobletEventListenerFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IJobletEventListenerFactory.java
index d523cccc..bd2f189 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IJobletEventListenerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/IJobletEventListenerFactory.java
@@ -23,5 +23,10 @@
 import org.apache.hyracks.api.context.IHyracksJobletContext;
 
 public interface IJobletEventListenerFactory extends Serializable {
-    public IJobletEventListener createListener(IHyracksJobletContext ctx);
+    IJobletEventListener createListener(IHyracksJobletContext ctx);
+
+    IJobletEventListenerFactory copyFactory();
+
+    //Allows job parameters to change listener settings
+    void updateListenerJobParameters(JobParameterByteStore jobParameterByteStore);
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobActivityGraph.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobActivityGraph.java
index de2759c..19d8484 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobActivityGraph.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobActivityGraph.java
@@ -55,7 +55,8 @@
         connectorRecordDescriptorMap = new HashMap<ConnectorDescriptorId, RecordDescriptor>();
         activityInputMap = new HashMap<ActivityId, List<IConnectorDescriptor>>();
         activityOutputMap = new HashMap<ActivityId, List<IConnectorDescriptor>>();
-        connectorActivityMap = new HashMap<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>>();
+        connectorActivityMap =
+                new HashMap<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>>();
         blocked2blockerMap = new HashMap<ActivityId, Set<ActivityId>>();
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobId.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobId.java
index 47da24a..de6b5ff 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobId.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobId.java
@@ -22,17 +22,24 @@
 import java.io.DataOutput;
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.control.CcIdPartitionedLongFactory;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.IWritable;
 
-public final class JobId implements IWritable, Serializable {
+public final class JobId implements IWritable, Serializable, Comparable {
 
-    public static final JobId INVALID = new JobId(-1l);
+    private static final Pattern jobIdPattern = Pattern.compile("^JID:(\\d+)\\.(\\d+)$");
+
+    public static final JobId INVALID = null;
 
     private static final long serialVersionUID = 1L;
     private long id;
+    private transient volatile CcId ccId;
 
     public static JobId create(DataInput dis) throws IOException {
         JobId jobId = new JobId();
@@ -51,6 +58,17 @@
         return id;
     }
 
+    public CcId getCcId() {
+        if (ccId == null) {
+            ccId = CcId.valueOf((int) (id >>> CcIdPartitionedLongFactory.ID_BITS));
+        }
+        return ccId;
+    }
+
+    public long getIdOnly() {
+        return id & CcIdPartitionedLongFactory.MAX_ID;
+    }
+
     @Override
     public int hashCode() {
         return (int) id;
@@ -58,24 +76,22 @@
 
     @Override
     public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof JobId)) {
-            return false;
-        }
-        return ((JobId) o).id == id;
+        return o == this || o instanceof JobId && ((JobId) o).id == id;
     }
 
     @Override
     public String toString() {
-        return "JID:" + id;
+        return "JID:" + (id >>> CcIdPartitionedLongFactory.ID_BITS) + "." + getIdOnly();
     }
 
     public static JobId parse(String str) throws HyracksDataException {
-        if (str.startsWith("JID:")) {
-            str = str.substring(4);
-            return new JobId(Long.parseLong(str));
+        Matcher m = jobIdPattern.matcher(str);
+        if (m.matches()) {
+            int ccId = Integer.parseInt(m.group(1));
+            if (ccId <= 0xffff && ccId >= 0) {
+                long jobId = Long.parseLong(m.group(2)) | (long) ccId << CcIdPartitionedLongFactory.ID_BITS;
+                return new JobId(jobId);
+            }
         }
         throw HyracksDataException.create(ErrorCode.NOT_A_JOBID, str);
     }
@@ -89,4 +105,9 @@
     public void readFields(DataInput input) throws IOException {
         id = input.readLong();
     }
+
+    @Override
+    public int compareTo(Object other) {
+        return Long.compare(id, ((JobId) other).id);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobIdFactory.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobIdFactory.java
index eea6b52..528d35b 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobIdFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobIdFactory.java
@@ -18,20 +18,23 @@
  */
 package org.apache.hyracks.api.job;
 
-import java.util.concurrent.atomic.AtomicLong;
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.control.CcIdPartitionedLongFactory;
 
-public class JobIdFactory {
-    private final AtomicLong id = new AtomicLong(0);
+public class JobIdFactory extends CcIdPartitionedLongFactory {
+    public JobIdFactory(CcId ccId) {
+        super(ccId);
+    }
 
     public JobId create() {
-        return new JobId(id.getAndIncrement());
+        return new JobId(nextId());
     }
 
-    public long maxJobId() {
-        return id.get();
+    public JobId maxJobId() {
+        return new JobId(maxId());
     }
 
-    public void ensureMinimumId(long id) {
-        this.id.updateAndGet(current -> Math.max(current, id));
+    public void setMaxJobId(long maxJobId) {
+        ensureMinimumId(maxJobId + 1);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobInfo.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobInfo.java
index 713219e..2073728 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobInfo.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobInfo.java
@@ -33,7 +33,8 @@
 
     private final Map<OperatorDescriptorId, Map<Integer, String>> operatorLocations;
 
-    public JobInfo(JobId jobId, JobStatus jobStatus, Map<OperatorDescriptorId, Map<Integer, String>> operatorLocations) {
+    public JobInfo(JobId jobId, JobStatus jobStatus,
+            Map<OperatorDescriptorId, Map<Integer, String>> operatorLocations) {
         this.jobId = jobId;
         this.operatorLocations = operatorLocations;
         this.status = jobStatus;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobParameterByteStore.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobParameterByteStore.java
new file mode 100644
index 0000000..551b3d7
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobParameterByteStore.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.job;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+public class JobParameterByteStore implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Map<byte[], byte[]> runtimeValues;
+    private final byte[] empty = new byte[0];
+
+    public JobParameterByteStore() {
+        runtimeValues = new HashMap<>();
+    }
+
+    public Map<byte[], byte[]> getParameterMap() {
+        return runtimeValues;
+    }
+
+    public void setParameters(Map<byte[], byte[]> map) {
+        runtimeValues = map;
+    }
+
+    public byte[] getParameterValue(byte[] name, int start, int length) {
+        for (Entry<byte[], byte[]> entry : runtimeValues.entrySet()) {
+            byte[] key = entry.getKey();
+            if (key.length == length) {
+                boolean matched = true;
+                for (int j = 0; j < length; j++) {
+                    if (key[j] != name[j + start]) {
+                        matched = false;
+                        break;
+                    }
+                }
+                if (matched) {
+                    return entry.getValue();
+                }
+            }
+        }
+        return empty;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSerializerDeserializerContainer.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSerializerDeserializerContainer.java
index d8c9a9c..7f3194e 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSerializerDeserializerContainer.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSerializerDeserializerContainer.java
@@ -27,7 +27,8 @@
 public class JobSerializerDeserializerContainer implements IJobSerializerDeserializerContainer {
 
     private IJobSerializerDeserializer defaultJobSerDe = new JobSerializerDeserializer();
-    private Map<DeploymentId, IJobSerializerDeserializer> jobSerializerDeserializerMap = new ConcurrentHashMap<DeploymentId, IJobSerializerDeserializer>();
+    private Map<DeploymentId, IJobSerializerDeserializer> jobSerializerDeserializerMap =
+            new ConcurrentHashMap<DeploymentId, IJobSerializerDeserializer>();
 
     @Override
     public synchronized IJobSerializerDeserializer getJobSerializerDeserializer(DeploymentId deploymentId) {
@@ -39,7 +40,8 @@
     }
 
     @Override
-    public synchronized void addJobSerializerDeserializer(DeploymentId deploymentId, IJobSerializerDeserializer jobSerDe) {
+    public synchronized void addJobSerializerDeserializer(DeploymentId deploymentId,
+            IJobSerializerDeserializer jobSerDe) {
         jobSerializerDeserializerMap.put(deploymentId, jobSerDe);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSpecification.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSpecification.java
index 9f66080..c4c7320 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSpecification.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/JobSpecification.java
@@ -89,6 +89,8 @@
 
     private transient int connectorIdCounter;
 
+    private transient List<IOperatorDescriptor> metaOps;
+
     // This constructor uses the default frame size. It is for test purposes only.
     // For other use cases, use the one which sets the frame size.
     public JobSpecification() {
@@ -308,6 +310,14 @@
         return requiredClusterCapacity;
     }
 
+    public void setMetaOps(List<IOperatorDescriptor> metaOps) {
+        this.metaOps = metaOps;
+    }
+
+    public List<IOperatorDescriptor> getMetaOps() {
+        return metaOps;
+    }
+
     private <K, V> void insertIntoIndexedMap(Map<K, List<V>> map, K key, int index, V value) {
         List<V> vList = map.computeIfAbsent(key, k -> new ArrayList<>());
         extend(vList, index);
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/resource/ClusterCapacity.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/resource/ClusterCapacity.java
index 1435ca7..25e3255 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/resource/ClusterCapacity.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/job/resource/ClusterCapacity.java
@@ -21,8 +21,8 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
-import org.apache.commons.lang3.ObjectUtils;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksException;
 
@@ -102,8 +102,7 @@
 
     @Override
     public int hashCode() {
-        return ObjectUtils.hashCodeMulti(aggregatedMemoryByteSize, aggregatedCores, nodeMemoryMap,
-                nodeCoreMap);
+        return Objects.hash(aggregatedMemoryByteSize, aggregatedCores, nodeMemoryMap, nodeCoreMap);
     }
 
     @Override
@@ -113,9 +112,8 @@
         }
         ClusterCapacity capacity = (ClusterCapacity) o;
         return aggregatedMemoryByteSize == capacity.aggregatedMemoryByteSize
-                && aggregatedCores == capacity.aggregatedCores
-                && ObjectUtils.equals(nodeMemoryMap, capacity.nodeMemoryMap)
-                && ObjectUtils.equals(nodeCoreMap, capacity.nodeCoreMap);
+                && aggregatedCores == capacity.aggregatedCores && Objects.equals(nodeMemoryMap, capacity.nodeMemoryMap)
+                && Objects.equals(nodeCoreMap, capacity.nodeCoreMap);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/lifecycle/LifeCycleComponentManager.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/lifecycle/LifeCycleComponentManager.java
index f5b4417..6d5d246 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/lifecycle/LifeCycleComponentManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/lifecycle/LifeCycleComponentManager.java
@@ -25,10 +25,11 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LifeCycleComponentManager implements ILifeCycleComponentManager {
 
@@ -36,7 +37,7 @@
         public static final String DUMP_PATH_KEY = "DUMP_PATH";
     }
 
-    private static final Logger LOGGER = Logger.getLogger(LifeCycleComponentManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final List<ILifeCycleComponent> components;
     private boolean stopInitiated;
@@ -54,7 +55,7 @@
     @Override
     public void uncaughtException(Thread t, Throwable e) {
         try {
-            LOGGER.log(Level.SEVERE, "Uncaught Exception from thread " + t.getName() + ". Calling shutdown hook", e);
+            LOGGER.log(Level.ERROR, "Uncaught Exception from thread " + t.getName() + ". Calling shutdown hook", e);
         } finally {
             ExitUtil.exit(99);
         }
@@ -79,7 +80,7 @@
             return;
         }
         stopped = true;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Attempting to stop " + this);
         }
         if (stopInitiated) {
@@ -87,14 +88,14 @@
             return;
         }
         if (!configured) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.severe("Lifecycle management not configured " + this);
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.error("Lifecycle management not configured " + this);
             }
             return;
         }
 
         stopInitiated = true;
-        LOGGER.severe("Stopping instance");
+        LOGGER.error("Stopping instance");
 
         FileOutputStream componentDumpStream = null;
         String componentDumpPath = null;
@@ -110,13 +111,13 @@
                     }
                     componentDumpStream = new FileOutputStream(f);
                 }
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Stopping component instance " + component.getClass().getName() + "; dump state: "
                             + dumpState + ", dump path: " + componentDumpPath);
                 }
                 component.stop(dumpState, componentDumpStream);
             } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Exception in stopping component " + component.getClass().getName(), e);
+                LOGGER.log(Level.ERROR, "Exception in stopping component " + component.getClass().getName(), e);
             } finally {
                 if (componentDumpStream != null) {
                     componentDumpStream.close();
@@ -132,11 +133,11 @@
         dumpPath = configuration.get(Config.DUMP_PATH_KEY);
         if (dumpPath == null) {
             dumpPath = System.getProperty("user.dir");
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("dump path not configured. Using current directory " + dumpPath);
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("dump path not configured. Using current directory " + dumpPath);
             }
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("LifecycleComponentManager configured " + this);
         }
         configured = true;
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/replication/IReplicationJob.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/replication/IReplicationJob.java
index cbe6d1a..33c9c96 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/replication/IReplicationJob.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/replication/IReplicationJob.java
@@ -45,4 +45,8 @@
 
     public Set<String> getJobFiles();
 
+    default String getAnyFile() {
+        return getJobFiles().stream().findAny()
+                .orElseThrow(() -> new IllegalStateException("Replication job without any files"));
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/ActivityClusterGraphRewriter.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/ActivityClusterGraphRewriter.java
index 7cdb300..f3059c1 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/ActivityClusterGraphRewriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/ActivityClusterGraphRewriter.java
@@ -48,8 +48,8 @@
  * @author yingyib
  */
 public class ActivityClusterGraphRewriter {
-    private static final String ONE_TO_ONE_CONNECTOR = "org.apache.hyracks.dataflow.std.connectors."
-            + "OneToOneConnectorDescriptor";
+    private static final String ONE_TO_ONE_CONNECTOR =
+            "org.apache.hyracks.dataflow.std.connectors." + "OneToOneConnectorDescriptor";
 
     /**
      * rewrite an activity cluster graph to eliminate
@@ -90,8 +90,8 @@
                 replacedBlockers = new HashSet<>();
                 for (ActivityId blocker : blockers) {
                     replacedBlockers.add(invertedAid2SuperAidMap.get(blocker));
-                    ActivityCluster dependingAc = ac.getActivityClusterGraph().getActivityMap()
-                            .get(invertedAid2SuperAidMap.get(blocker));
+                    ActivityCluster dependingAc =
+                            ac.getActivityClusterGraph().getActivityMap().get(invertedAid2SuperAidMap.get(blocker));
                     if (!ac.getDependencies().contains(dependingAc)) {
                         ac.getDependencies().add(dependingAc);
                     }
@@ -122,8 +122,8 @@
         Map<ActivityId, IActivity> activities = ac.getActivityMap();
         Map<ActivityId, List<IConnectorDescriptor>> activityInputMap = ac.getActivityInputMap();
         Map<ActivityId, List<IConnectorDescriptor>> activityOutputMap = ac.getActivityOutputMap();
-        Map<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>> connectorActivityMap = ac
-                .getConnectorActivityMap();
+        Map<ConnectorDescriptorId, Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>>> connectorActivityMap =
+                ac.getConnectorActivityMap();
         ActivityClusterGraph acg = ac.getActivityClusterGraph();
         Map<ActivityId, IActivity> startActivities = new HashMap<>();
         Map<ActivityId, SuperActivity> superActivities = new HashMap<>();
@@ -177,8 +177,8 @@
                 List<IConnectorDescriptor> outputConnectors = activityOutputMap.get(expendingActivity.getActivityId());
                 if (outputConnectors != null) {
                     for (IConnectorDescriptor outputConn : outputConnectors) {
-                        Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>> endPoints = connectorActivityMap
-                                .get(outputConn.getConnectorId());
+                        Pair<Pair<IActivity, Integer>, Pair<IActivity, Integer>> endPoints =
+                                connectorActivityMap.get(outputConn.getConnectorId());
                         IActivity newActivity = endPoints.getRight().getLeft();
                         SuperActivity existingSuperActivity = invertedActivitySuperActivityMap.get(newActivity);
                         if (outputConn.getClass().getName().contains(ONE_TO_ONE_CONNECTOR)) {
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/OneToOneConnectedActivityCluster.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/OneToOneConnectedActivityCluster.java
index 68041bb..a93cb17 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/OneToOneConnectedActivityCluster.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/rewriter/OneToOneConnectedActivityCluster.java
@@ -38,10 +38,14 @@
 
     private static final long serialVersionUID = 1L;
 
-    protected final Map<Integer, Pair<ActivityId, Integer>> clusterInputIndexMap = new HashMap<Integer, Pair<ActivityId, Integer>>();
-    protected final Map<Integer, Pair<ActivityId, Integer>> clusterOutputIndexMap = new HashMap<Integer, Pair<ActivityId, Integer>>();
-    protected final Map<Pair<ActivityId, Integer>, Integer> invertedClusterOutputIndexMap = new HashMap<Pair<ActivityId, Integer>, Integer>();
-    protected final Map<Pair<ActivityId, Integer>, Integer> invertedClusterInputIndexMap = new HashMap<Pair<ActivityId, Integer>, Integer>();
+    protected final Map<Integer, Pair<ActivityId, Integer>> clusterInputIndexMap =
+            new HashMap<Integer, Pair<ActivityId, Integer>>();
+    protected final Map<Integer, Pair<ActivityId, Integer>> clusterOutputIndexMap =
+            new HashMap<Integer, Pair<ActivityId, Integer>>();
+    protected final Map<Pair<ActivityId, Integer>, Integer> invertedClusterOutputIndexMap =
+            new HashMap<Pair<ActivityId, Integer>, Integer>();
+    protected final Map<Pair<ActivityId, Integer>, Integer> invertedClusterInputIndexMap =
+            new HashMap<Pair<ActivityId, Integer>, Integer>();
 
     public OneToOneConnectedActivityCluster(ActivityClusterGraph acg, ActivityClusterId id) {
         super(acg, id);
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/topology/TopologyDefinitionParser.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/topology/TopologyDefinitionParser.java
index 57330af..0182e0c 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/topology/TopologyDefinitionParser.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/topology/TopologyDefinitionParser.java
@@ -74,9 +74,10 @@
         public void endElement(String uri, String localName, String qName) throws SAXException {
             if ("network-switch".equals(localName) || "terminal".equals(localName)) {
                 ElementStackEntry e = stack.pop();
-                NetworkEndpoint endpoint = e.type == EndpointType.NETWORK_SWITCH ? new NetworkSwitch(e.name,
-                        e.properties, e.ports.toArray(new NetworkSwitch.Port[e.ports.size()])) : new NetworkTerminal(
-                        e.name, e.properties);
+                NetworkEndpoint endpoint = e.type == EndpointType.NETWORK_SWITCH
+                        ? new NetworkSwitch(e.name, e.properties,
+                                e.ports.toArray(new NetworkSwitch.Port[e.ports.size()]))
+                        : new NetworkTerminal(e.name, e.properties);
                 stack.peek().ports.add(new NetworkSwitch.Port(endpoint));
             } else if ("property".equals(localName)) {
                 if (!inPropertyElement) {
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java
index e9491f3..26ce2c1 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ErrorMessageUtil.java
@@ -26,12 +26,14 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ErrorMessageUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(ErrorMessageUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final String NONE = "";
     private static final String COMMA = ",";
 
@@ -99,7 +101,7 @@
             return fmt.out().toString();
         } catch (Exception e) {
             // Do not throw further exceptions during exception processing.
-            LOGGER.log(Level.WARNING, e.getLocalizedMessage(), e);
+            LOGGER.log(Level.WARN, e.getLocalizedMessage(), e);
             return e.getMessage();
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExecutionTimeProfiler.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExecutionTimeProfiler.java
index e5eec11..f396be9 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExecutionTimeProfiler.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExecutionTimeProfiler.java
@@ -31,7 +31,6 @@
     private StringBuilder sb;
     private Object lock1 = new Object();
 
-
     // [Key: Job, Value: [Key: Operator, Value: Duration of each operators]]
     private HashMap<String, LinkedHashMap<String, String>> spentTimePerJobMap;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExperimentProfilerUtils.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExperimentProfilerUtils.java
index 2305573..abadde3 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExperimentProfilerUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/ExperimentProfilerUtils.java
@@ -25,8 +25,8 @@
 import java.io.OutputStream;
 
 public class ExperimentProfilerUtils {
-    public static void printToOutputFile(StringBuffer sb, FileOutputStream fos) throws IllegalStateException,
-            IOException {
+    public static void printToOutputFile(StringBuffer sb, FileOutputStream fos)
+            throws IllegalStateException, IOException {
         fos.write(sb.toString().getBytes());
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/HyracksConstants.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/HyracksConstants.java
index 8d55235..5609721 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/HyracksConstants.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/HyracksConstants.java
@@ -20,6 +20,7 @@
 
 public class HyracksConstants {
     public static final String KEY_MESSAGE = "HYX:MSG";
+    public static final String HYRACKS_LOGGER_NAME = "org.apache.hyracks";
 
     private HyracksConstants() {
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java
index 329b24d..396c026 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/IoUtil.java
@@ -23,13 +23,13 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * This util class takes care of creation and deletion of files and directories
@@ -38,7 +38,7 @@
 public class IoUtil {
 
     public static final String FILE_NOT_FOUND_MSG = "Deleting non-existing file!";
-    private static final Logger LOGGER = Logger.getLogger(IoUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private IoUtil() {
     }
@@ -71,7 +71,7 @@
                 Files.delete(file.toPath());
             }
         } catch (NoSuchFileException | FileNotFoundException e) {
-            LOGGER.log(Level.WARNING, FILE_NOT_FOUND_MSG + ": " + e.getMessage(), e);
+            LOGGER.warn(() -> FILE_NOT_FOUND_MSG + ": " + e.getMessage(), e);
         } catch (IOException e) {
             throw HyracksDataException.create(ErrorCode.CANNOT_DELETE_FILE, e, file.getAbsolutePath());
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/OperatorExecutionTimeProfiler.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/OperatorExecutionTimeProfiler.java
index 55c7915..02a1226 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/OperatorExecutionTimeProfiler.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/OperatorExecutionTimeProfiler.java
@@ -30,8 +30,8 @@
         if (ExecutionTimeProfiler.PROFILE_MODE) {
             //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
             try {
-                executionTimeProfiler = new ExecutionTimeProfiler(profileHomeDir + "executionTime-"
-                        + Inet4Address.getLocalHost().getHostAddress() + ".txt");
+                executionTimeProfiler = new ExecutionTimeProfiler(
+                        profileHomeDir + "executionTime-" + Inet4Address.getLocalHost().getHostAddress() + ".txt");
             } catch (UnknownHostException e) {
                 e.printStackTrace();
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java
index 21965c7..ccf0163 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java
@@ -19,16 +19,17 @@
 package org.apache.hyracks.api.util;
 
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class SingleThreadEventProcessor<T> implements Runnable {
 
-    private static final Logger LOGGER = Logger.getLogger(SingleThreadEventProcessor.class.getName());
-    private final String name;
+    private static final Logger LOGGER = LogManager.getLogger();
+    protected final String name;
     private final LinkedBlockingQueue<T> eventInbox;
     private volatile Thread executorThread;
     private volatile boolean stopped = false;
@@ -50,10 +51,10 @@
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
             } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Error handling an event", e);
+                LOGGER.log(Level.ERROR, "Error handling an event", e);
             }
         }
-        LOGGER.log(Level.WARNING, "Stopped " + Thread.currentThread().getName());
+        LOGGER.log(Level.WARN, "Stopped " + Thread.currentThread().getName());
     }
 
     protected abstract void handle(T event) throws Exception; //NOSONAR
@@ -71,7 +72,7 @@
         int attempt = 0;
         while (executorThread.isAlive()) {
             attempt++;
-            LOGGER.log(Level.WARNING,
+            LOGGER.log(Level.WARN,
                     "Failed to stop event processor after " + attempt + " attempts. Interrupted exception swallowed?");
             if (attempt == 10) {
                 throw HyracksDataException.create(ErrorCode.FAILED_TO_SHUTDOWN_EVENT_PROCESSOR, name);
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SpatialIndexProfiler.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SpatialIndexProfiler.java
index a1b40d0..899d3ee 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SpatialIndexProfiler.java
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SpatialIndexProfiler.java
@@ -41,8 +41,9 @@
             }
             falsePositivePerQuery.begin();
             try {
-                cacheMissPerQuery = new ExperimentProfiler(PROFILE_HOME_DIR + "cacheMissPerQuery-"
-                        + Inet4Address.getLocalHost().getHostAddress() + ".txt", 1);
+                cacheMissPerQuery = new ExperimentProfiler(
+                        PROFILE_HOME_DIR + "cacheMissPerQuery-" + Inet4Address.getLocalHost().getHostAddress() + ".txt",
+                        1);
             } catch (UnknownHostException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
index 330cf1f..a27a736 100644
--- a/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/resources/errormsg/en.properties
@@ -41,7 +41,7 @@
 22 = The distributed job %1$s already exists
 23 = The distributed work failed for %1$s at %2$s
 24 = No result set for job %1$s
-25 = Job %1$s has been cancelled by a user
+25 = Job %1$s has been cancelled
 26 = Node %1$s failed
 27 = File %1$s is not a directory
 28 = User doesn't have read permissions on the file %1$s
@@ -109,7 +109,7 @@
 90 = Memory budget for the %1$s operator (%2$s bytes) is lower than the minimum (%3$s bytes)
 91 = Operation timed out
 92 = Job %1$s has been cleared from job history
-93 = Job %1$s has not been created yet
+93 = Failed to read result for job %1$s
 94 = Cannot read closed file (%1$s)
 95 = Tuple of size %1$s cannot fit into an empty frame
 96 = Illegal attempt to enter empty component
@@ -122,5 +122,6 @@
 103 = Failed to close virtual buffer cache since it is already closed
 104 = Index does not exist
 105 = Cannot drop in-use index (%1$s)
+106 = Failed to deactivate the bloom filter since it is pinned by other users
 
 10000 = The given rule collection %1$s is not an instance of the List class.
diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/job/JobIdTest.java b/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/job/JobIdTest.java
new file mode 100644
index 0000000..d2c1d09
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-api/src/test/java/org/apache/hyracks/api/job/JobIdTest.java
@@ -0,0 +1,135 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.api.job;
+
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.control.CcIdPartitionedLongFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class JobIdTest {
+
+    private static Field idField;
+
+    @BeforeClass
+    public static void setup() throws NoSuchFieldException {
+        idField = CcIdPartitionedLongFactory.class.getDeclaredField("id");
+        idField.setAccessible(true);
+    }
+
+    @Test
+    public void testCcIds() {
+        JobIdFactory factory = new JobIdFactory(CcId.valueOf(0));
+        for (int i = 0; i < 1000; i++) {
+            final JobId jobId = factory.create();
+            Assert.assertEquals(0, jobId.getCcId().shortValue());
+            Assert.assertEquals(i, jobId.getIdOnly());
+        }
+    }
+
+    @Test
+    public void testNegativeCcId() {
+        JobIdFactory factory = new JobIdFactory(CcId.valueOf(0xFFFF));
+        for (int i = 0; i < 1000; i++) {
+            final JobId jobId = factory.create();
+            Assert.assertEquals((short) 0xFFFF, jobId.getCcId().shortValue());
+            Assert.assertEquals(i, jobId.getIdOnly());
+            Assert.assertTrue("JID not negative", jobId.getId() < 0);
+            Assert.assertEquals(0xFFFF000000000000L + i, jobId.getId());
+        }
+    }
+
+    @Test
+    public void testOverflow() throws IllegalAccessException {
+        testOverflow(0);
+        testOverflow(0xFFFF);
+        testOverflow(Short.MAX_VALUE);
+    }
+
+    private void testOverflow(int id) throws IllegalAccessException {
+        CcId ccId = CcId.valueOf(id);
+        long expected = (long) id << 48;
+        JobIdFactory factory = new JobIdFactory(ccId);
+        AtomicLong theId = (AtomicLong) idField.get(factory);
+        Assert.assertEquals(expected, theId.get());
+        theId.set((((long) 1 << 48) - 1) | expected);
+        JobId jobId = factory.create();
+        Assert.assertEquals(ccId, jobId.getCcId());
+        Assert.assertEquals(CcIdPartitionedLongFactory.MAX_ID, jobId.getIdOnly());
+        jobId = factory.create();
+        Assert.assertEquals(ccId, jobId.getCcId());
+        Assert.assertEquals(0, jobId.getIdOnly());
+    }
+
+    @Test
+    public void testComparability() throws IllegalAccessException {
+        JobIdFactory factory = new JobIdFactory(CcId.valueOf(0));
+        compareLoop(factory, false);
+        factory = new JobIdFactory(CcId.valueOf(0xFFFF));
+        compareLoop(factory, false);
+        AtomicLong theId = (AtomicLong) idField.get(factory);
+        theId.set(0xFFFFFFFFFFFFFFF0L);
+        compareLoop(factory, true);
+    }
+
+    private void compareLoop(JobIdFactory factory, boolean overflow) {
+        Set<Boolean> overflowed = new HashSet<>(Collections.singleton(false));
+        JobId prevMax = null;
+        for (int i = 0; i < 1000; i++) {
+            final JobId jobId = factory.create();
+            Assert.assertTrue("max == last", factory.maxJobId().compareTo(jobId) == 0);
+            if (i > 0) {
+                Assert.assertTrue("last > previous max", prevMax.compareTo(jobId) < 0 || overflowed.add(overflow));
+            }
+            prevMax = factory.maxJobId();
+        }
+    }
+
+    @Test
+    public void testTooLarge() {
+        try {
+            CcId.valueOf(0x10000);
+            Assert.assertTrue("expected exception", false);
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testParse() throws HyracksDataException {
+        for (int ccId : Arrays.asList(0xFFFF, 0, (int) Short.MAX_VALUE)) {
+            JobIdFactory factory = new JobIdFactory(CcId.valueOf(ccId));
+            for (int i = 0; i < 1000; i++) {
+                final JobId jobId = factory.create();
+                Assert.assertEquals(jobId.getId(), JobId.parse(jobId.toString()).getId());
+                Assert.assertEquals(jobId, JobId.parse(jobId.toString()));
+                Assert.assertFalse(jobId.toString(), jobId.toString().contains("-"));
+                System.err.println(jobId.toString());
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-client/pom.xml b/hyracks-fullstack/hyracks/hyracks-client/pom.xml
index 7f84520..6173de4 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-client/pom.xml
@@ -109,5 +109,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceConnection.java b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceConnection.java
index 075747d..63139d9 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceConnection.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceConnection.java
@@ -40,7 +40,7 @@
         RPCInterface rpci = new RPCInterface();
         ipc = new IPCSystem(new InetSocketAddress(0), rpci, new JavaSerializationBasedPayloadSerializerDeserializer());
         ipc.start();
-        IIPCHandle ddsIpchandle = ipc.getHandle(new InetSocketAddress(ddsHost, ddsPort));
+        IIPCHandle ddsIpchandle = ipc.getReconnectingHandle(new InetSocketAddress(ddsHost, ddsPort));
         this.ddsi = new HyracksDatasetDirectoryServiceInterfaceRemoteProxy(ddsIpchandle, rpci);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
index 4310cd0..7eeb913 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetDirectoryServiceInterfaceRemoteProxy.java
@@ -40,16 +40,16 @@
 
     @Override
     public Status getDatasetResultStatus(JobId jobId, ResultSetId rsId) throws Exception {
-        HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction gdrlf = new HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction(
-                jobId, rsId);
+        HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction gdrlf =
+                new HyracksClientInterfaceFunctions.GetDatasetResultStatusFunction(jobId, rsId);
         return (Status) rpci.call(ipcHandle, gdrlf);
     }
 
     @Override
     public DatasetDirectoryRecord[] getDatasetResultLocations(JobId jobId, ResultSetId rsId,
             DatasetDirectoryRecord[] knownRecords) throws Exception {
-        HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction gdrlf = new HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction(
-                jobId, rsId, knownRecords);
+        HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction gdrlf =
+                new HyracksClientInterfaceFunctions.GetDatasetResultLocationsFunction(jobId, rsId, knownRecords);
         return (DatasetDirectoryRecord[]) rpci.call(ipcHandle, gdrlf);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
index 31fd379..36c77ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/dataset/HyracksDatasetReader.java
@@ -23,186 +23,118 @@
 import java.net.SocketAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.channels.IInputChannel;
+import org.apache.hyracks.api.channels.IInputChannelMonitor;
 import org.apache.hyracks.api.comm.FrameHelper;
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.context.IHyracksCommonContext;
 import org.apache.hyracks.api.dataset.DatasetDirectoryRecord;
 import org.apache.hyracks.api.dataset.DatasetJobRecord.Status;
-import org.apache.hyracks.api.dataset.IDatasetInputChannelMonitor;
 import org.apache.hyracks.api.dataset.IHyracksDatasetDirectoryServiceConnection;
 import org.apache.hyracks.api.dataset.IHyracksDatasetReader;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.client.net.ClientNetworkManager;
 import org.apache.hyracks.comm.channels.DatasetNetworkInputChannel;
+import org.apache.hyracks.util.annotations.NotThreadSafe;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
-// TODO(madhusudancs): Should this implementation be moved to org.apache.hyracks.client?
+@NotThreadSafe
 public class HyracksDatasetReader implements IHyracksDatasetReader {
-    private static final Logger LOGGER = Logger.getLogger(HyracksDatasetReader.class.getName());
 
-    private final IHyracksDatasetDirectoryServiceConnection datasetDirectoryServiceConnection;
-
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final int NUM_READ_BUFFERS = 1;
+    private final IHyracksDatasetDirectoryServiceConnection datasetDirectory;
     private final ClientNetworkManager netManager;
-
     private final IHyracksCommonContext datasetClientCtx;
-
-    private JobId jobId;
-
-    private ResultSetId resultSetId;
-
+    private final JobId jobId;
+    private final ResultSetId resultSetId;
     private DatasetDirectoryRecord[] knownRecords;
+    private DatasetInputChannelMonitor[] monitors;
+    private DatasetInputChannelMonitor currentRecordMonitor;
+    private DatasetNetworkInputChannel currentRecordChannel;
+    private int currentRecord;
 
-    private IDatasetInputChannelMonitor[] monitors;
-
-    private int lastReadPartition;
-
-    private IDatasetInputChannelMonitor lastMonitor;
-
-    private DatasetNetworkInputChannel resultChannel;
-
-    private static int NUM_READ_BUFFERS = 1;
-
-    public HyracksDatasetReader(IHyracksDatasetDirectoryServiceConnection datasetDirectoryServiceConnection,
+    public HyracksDatasetReader(IHyracksDatasetDirectoryServiceConnection datasetDirectory,
             ClientNetworkManager netManager, IHyracksCommonContext datasetClientCtx, JobId jobId,
-            ResultSetId resultSetId)
-            throws Exception {
-        this.datasetDirectoryServiceConnection = datasetDirectoryServiceConnection;
+            ResultSetId resultSetId) {
+        this.datasetDirectory = datasetDirectory;
         this.netManager = netManager;
         this.datasetClientCtx = datasetClientCtx;
         this.jobId = jobId;
         this.resultSetId = resultSetId;
-        knownRecords = null;
-        monitors = null;
-        lastReadPartition = -1;
-        lastMonitor = null;
-        resultChannel = null;
+        currentRecord = -1;
     }
 
     @Override
     public Status getResultStatus() {
         try {
-            return datasetDirectoryServiceConnection.getDatasetResultStatus(jobId, resultSetId);
+            return datasetDirectory.getDatasetResultStatus(jobId, resultSetId);
         } catch (HyracksDataException e) {
             if (e.getErrorCode() != ErrorCode.NO_RESULT_SET) {
-                LOGGER.log(Level.WARNING, "Exception retrieving result set for job " + jobId, e);
+                LOGGER.log(Level.WARN, "Exception retrieving result set for job " + jobId, e);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception retrieving result set for job " + jobId, e);
+            LOGGER.log(Level.WARN, "Exception retrieving result set for job " + jobId, e);
         }
         return null;
     }
 
-    private DatasetDirectoryRecord getRecord(int partition) throws Exception {
-        while (knownRecords == null || knownRecords[partition] == null) {
-            knownRecords = datasetDirectoryServiceConnection
-                    .getDatasetResultLocations(jobId, resultSetId, knownRecords);
-        }
-        return knownRecords[partition];
-    }
-
-    private boolean nextPartition() throws HyracksDataException {
-        ++lastReadPartition;
-        try {
-            DatasetDirectoryRecord record = getRecord(lastReadPartition);
-            while (record.getEmpty() && (++lastReadPartition) < knownRecords.length) {
-                record = getRecord(lastReadPartition);
-            }
-            if (lastReadPartition == knownRecords.length) {
-                return false;
-            }
-            resultChannel = new DatasetNetworkInputChannel(netManager, getSocketAddress(record), jobId, resultSetId,
-                    lastReadPartition, NUM_READ_BUFFERS);
-            lastMonitor = getMonitor(lastReadPartition);
-            resultChannel.registerMonitor(lastMonitor);
-            resultChannel.open(datasetClientCtx);
-            return true;
-        } catch (Exception e) {
-            throw HyracksDataException.create(e);
-        }
-    }
-
     @Override
     public int read(IFrame frame) throws HyracksDataException {
         frame.reset();
-        ByteBuffer readBuffer;
         int readSize = 0;
-
-        if (lastReadPartition == -1) {
-            if (!nextPartition()) {
-                return readSize;
-            }
+        if (isFirstRead() && !hasNextRecord()) {
+            return readSize;
         }
-
-        while (readSize < frame.getFrameSize()
-                && !((lastReadPartition == knownRecords.length - 1) && isPartitionReadComplete(lastMonitor))) {
-            waitForNextFrame(lastMonitor);
-            if (isPartitionReadComplete(lastMonitor)) {
-                knownRecords[lastReadPartition].readEOS();
-                resultChannel.close();
-                if ((lastReadPartition == knownRecords.length - 1) || !nextPartition()) {
+        // read until frame is full or all dataset records have been read
+        while (readSize < frame.getFrameSize()) {
+            if (currentRecordMonitor.hasMoreFrames()) {
+                final ByteBuffer readBuffer = currentRecordChannel.getNextBuffer();
+                if (readBuffer == null) {
+                    throw new IllegalStateException("Unexpected empty frame");
+                }
+                currentRecordMonitor.notifyFrameRead();
+                if (readSize == 0) {
+                    final int nBlocks = FrameHelper.deserializeNumOfMinFrame(readBuffer);
+                    frame.ensureFrameSize(frame.getMinSize() * nBlocks);
+                    frame.getBuffer().clear();
+                }
+                frame.getBuffer().put(readBuffer);
+                currentRecordChannel.recycleBuffer(readBuffer);
+                readSize = frame.getBuffer().position();
+            } else {
+                currentRecordChannel.close();
+                if (currentRecordMonitor.failed()) {
+                    throw HyracksDataException.create(ErrorCode.FAILED_TO_READ_RESULT, jobId);
+                }
+                if (isLastRecord() || !hasNextRecord()) {
                     break;
                 }
-            } else {
-                readBuffer = resultChannel.getNextBuffer();
-                lastMonitor.notifyFrameRead();
-                if (readBuffer != null) {
-                    if (readSize <=0) {
-                        int nBlocks = FrameHelper.deserializeNumOfMinFrame(readBuffer);
-                        frame.ensureFrameSize(frame.getMinSize() * nBlocks);
-                        frame.getBuffer().clear();
-                        frame.getBuffer().put(readBuffer);
-                        resultChannel.recycleBuffer(readBuffer);
-                        readSize = frame.getBuffer().position();
-                    } else {
-                        frame.getBuffer().put(readBuffer);
-                        resultChannel.recycleBuffer(readBuffer);
-                        readSize = frame.getBuffer().position();
-                    }
-                }
             }
         }
-
         frame.getBuffer().flip();
         return readSize;
     }
 
-    private static void waitForNextFrame(IDatasetInputChannelMonitor monitor) throws HyracksDataException {
-        synchronized (monitor) {
-            while (monitor.getNFramesAvailable() <= 0 && !monitor.eosReached() && !monitor.failed()) {
-                try {
-                    monitor.wait();
-                } catch (InterruptedException e) {
-                    throw new HyracksDataException(e);
-                }
-            }
-        }
-        if (monitor.failed()) {
-            throw new HyracksDataException("Job Failed.");
+    private SocketAddress getSocketAddress(DatasetDirectoryRecord record) throws HyracksDataException {
+        try {
+            final NetworkAddress netAddr = record.getNetworkAddress();
+            return new InetSocketAddress(InetAddress.getByAddress(netAddr.lookupIpAddress()), netAddr.getPort());
+        } catch (UnknownHostException e) {
+            throw HyracksDataException.create(e);
         }
     }
 
-    private boolean isPartitionReadComplete(IDatasetInputChannelMonitor monitor) {
-        return (monitor.getNFramesAvailable() <= 0) && (monitor.eosReached());
-    }
-
-    private SocketAddress getSocketAddress(DatasetDirectoryRecord addr) throws UnknownHostException {
-        NetworkAddress netAddr = addr.getNetworkAddress();
-        return new InetSocketAddress(InetAddress.getByAddress(netAddr.lookupIpAddress()), netAddr.getPort());
-    }
-
-    private IDatasetInputChannelMonitor getMonitor(int partition) throws HyracksException {
+    private DatasetInputChannelMonitor getMonitor(int partition) {
         if (knownRecords == null || knownRecords[partition] == null) {
-            throw new HyracksException("Accessing monitors before the obtaining the corresponding addresses.");
+            throw new IllegalStateException("Accessing monitors before obtaining the corresponding addresses");
         }
         if (monitors == null) {
             monitors = new DatasetInputChannelMonitor[knownRecords.length];
@@ -213,56 +145,100 @@
         return monitors[partition];
     }
 
-    private class DatasetInputChannelMonitor implements IDatasetInputChannelMonitor {
-        private final AtomicInteger nAvailableFrames;
+    private boolean hasNextRecord() throws HyracksDataException {
+        currentRecord++;
+        DatasetDirectoryRecord record = getRecord(currentRecord);
+        // skip empty records
+        while (record.isEmpty() && ++currentRecord < knownRecords.length) {
+            record = getRecord(currentRecord);
+        }
+        if (currentRecord == knownRecords.length) {
+            // exhausted all known records
+            return false;
+        }
+        requestRecordData(record);
+        return true;
+    }
 
-        private final AtomicBoolean eos;
+    private DatasetDirectoryRecord getRecord(int recordNum) throws HyracksDataException {
+        try {
+            while (knownRecords == null || knownRecords[recordNum] == null) {
+                knownRecords = datasetDirectory.getDatasetResultLocations(jobId, resultSetId, knownRecords);
+            }
+            return knownRecords[recordNum];
+        } catch (Exception e) {
+            throw HyracksDataException.create(e);
+        }
+    }
 
-        private final AtomicBoolean failed;
+    private void requestRecordData(DatasetDirectoryRecord record) throws HyracksDataException {
+        currentRecordChannel = new DatasetNetworkInputChannel(netManager, getSocketAddress(record), jobId, resultSetId,
+                currentRecord, NUM_READ_BUFFERS);
+        currentRecordMonitor = getMonitor(currentRecord);
+        currentRecordChannel.registerMonitor(currentRecordMonitor);
+        currentRecordChannel.open(datasetClientCtx);
+    }
 
-        public DatasetInputChannelMonitor() {
-            nAvailableFrames = new AtomicInteger(0);
-            eos = new AtomicBoolean(false);
-            failed = new AtomicBoolean(false);
+    private boolean isFirstRead() {
+        return currentRecord == -1;
+    }
+
+    private boolean isLastRecord() {
+        return knownRecords != null && currentRecord == knownRecords.length - 1;
+    }
+
+    private static class DatasetInputChannelMonitor implements IInputChannelMonitor {
+
+        private int availableFrames;
+        private boolean eos;
+        private boolean failed;
+
+        DatasetInputChannelMonitor() {
+            eos = false;
+            failed = false;
         }
 
         @Override
         public synchronized void notifyFailure(IInputChannel channel) {
-            failed.set(true);
+            failed = true;
             notifyAll();
         }
 
         @Override
         public synchronized void notifyDataAvailability(IInputChannel channel, int nFrames) {
-            nAvailableFrames.addAndGet(nFrames);
+            availableFrames += nFrames;
             notifyAll();
         }
 
         @Override
         public synchronized void notifyEndOfStream(IInputChannel channel) {
-            eos.set(true);
+            eos = true;
             notifyAll();
         }
 
-        @Override
-        public synchronized boolean eosReached() {
-            return eos.get();
+        synchronized boolean failed() {
+            return failed;
         }
 
-        @Override
-        public synchronized boolean failed() {
-            return failed.get();
+        synchronized void notifyFrameRead() {
+            availableFrames--;
+            notifyAll();
         }
 
-        @Override
-        public synchronized int getNFramesAvailable() {
-            return nAvailableFrames.get();
+        synchronized boolean hasMoreFrames() throws HyracksDataException {
+            while (!failed && !eos && availableFrames == 0) {
+                try {
+                    wait();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    throw HyracksDataException.create(e);
+                }
+            }
+            return !failed && !isFullyConsumed();
         }
 
-        @Override
-        public synchronized void notifyFrameRead() {
-            nAvailableFrames.decrementAndGet();
+        private synchronized boolean isFullyConsumed() {
+            return availableFrames == 0 && eos;
         }
-
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/stats/impl/ClientCounterContext.java b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/stats/impl/ClientCounterContext.java
index 5d0865c..9e87f52 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/stats/impl/ClientCounterContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/main/java/org/apache/hyracks/client/stats/impl/ClientCounterContext.java
@@ -39,9 +39,9 @@
  * @author yingyib
  */
 public class ClientCounterContext implements IClusterCounterContext {
-    private static String[] RESET_COUNTERS = { Counters.NETWORK_IO_READ, Counters.NETWORK_IO_WRITE,
-            Counters.MEMORY_USAGE, Counters.MEMORY_MAX, Counters.DISK_READ, Counters.DISK_WRITE,
-            Counters.NUM_PROCESSOR };
+    private static String[] RESET_COUNTERS =
+            { Counters.NETWORK_IO_READ, Counters.NETWORK_IO_WRITE, Counters.MEMORY_USAGE, Counters.MEMORY_MAX,
+                    Counters.DISK_READ, Counters.DISK_WRITE, Counters.NUM_PROCESSOR };
     private static String[] AGG_COUNTERS = { Counters.SYSTEM_LOAD };
     private static int UPDATE_INTERVAL = 10000;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-client/src/test/java/org/apache/hyracks/client/stats/ClientCounterContextTest.java b/hyracks-fullstack/hyracks/hyracks-client/src/test/java/org/apache/hyracks/client/stats/ClientCounterContextTest.java
index ee33a6d..8bac8e7 100644
--- a/hyracks-fullstack/hyracks/hyracks-client/src/test/java/org/apache/hyracks/client/stats/ClientCounterContextTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-client/src/test/java/org/apache/hyracks/client/stats/ClientCounterContextTest.java
@@ -37,9 +37,9 @@
         synchronized (this) {
             wait(20000);
         }
-        String[] counters = { Counters.MEMORY_USAGE, Counters.MEMORY_MAX, Counters.NETWORK_IO_READ,
-                Counters.NETWORK_IO_WRITE, Counters.SYSTEM_LOAD, Counters.NUM_PROCESSOR, Counters.DISK_READ,
-                Counters.DISK_WRITE };
+        String[] counters =
+                { Counters.MEMORY_USAGE, Counters.MEMORY_MAX, Counters.NETWORK_IO_READ, Counters.NETWORK_IO_WRITE,
+                        Counters.SYSTEM_LOAD, Counters.NUM_PROCESSOR, Counters.DISK_READ, Counters.DISK_WRITE };
         for (String counterName : counters) {
             ICounter counter = ccContext.getCounter(counterName, false);
             System.out.println(counterName + ": " + counter.get());
diff --git a/hyracks-fullstack/hyracks/hyracks-comm/pom.xml b/hyracks-fullstack/hyracks/hyracks-comm/pom.xml
index df48bc0..45d6220 100644
--- a/hyracks-fullstack/hyracks/hyracks-comm/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-comm/pom.xml
@@ -51,5 +51,9 @@
       <artifactId>hyracks-net</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/DatasetNetworkInputChannel.java b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/DatasetNetworkInputChannel.java
index e3c6f4a..c334389 100644
--- a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/DatasetNetworkInputChannel.java
+++ b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/DatasetNetworkInputChannel.java
@@ -22,8 +22,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayDeque;
 import java.util.Queue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.channels.IInputChannel;
 import org.apache.hyracks.api.channels.IInputChannelMonitor;
@@ -34,9 +32,11 @@
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetNetworkInputChannel implements IInputChannel {
-    private static final Logger LOGGER = Logger.getLogger(DatasetNetworkInputChannel.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     static final int INITIAL_MESSAGE_SIZE = 20;
 
@@ -114,8 +114,8 @@
         writeBuffer.putLong(resultSetId.getId());
         writeBuffer.putInt(partition);
         writeBuffer.flip();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Sending partition request for JobId: " + jobId + " partition: " + partition + " on channel: "
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Sending partition request for JobId: " + jobId + " partition: " + partition + " on channel: "
                     + ccb);
         }
         ccb.getWriteInterface().getFullBufferAcceptor().accept(writeBuffer);
diff --git a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkInputChannel.java b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkInputChannel.java
index a846da3..0a9342a 100644
--- a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkInputChannel.java
+++ b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkInputChannel.java
@@ -22,8 +22,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayDeque;
 import java.util.Queue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.channels.IInputChannel;
 import org.apache.hyracks.api.channels.IInputChannelMonitor;
@@ -33,9 +31,11 @@
 import org.apache.hyracks.api.context.IHyracksCommonContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.partitions.PartitionId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NetworkInputChannel implements IInputChannel {
-    private static final Logger LOGGER = Logger.getLogger(NetworkInputChannel.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     static final int INITIAL_MESSAGE_SIZE = 20;
 
@@ -107,8 +107,8 @@
         writeBuffer.putInt(partitionId.getSenderIndex());
         writeBuffer.putInt(partitionId.getReceiverIndex());
         writeBuffer.flip();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Sending partition request: " + partitionId + " on channel: " + ccb);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Sending partition request: " + partitionId + " on channel: " + ccb);
         }
         ccb.getWriteInterface().getFullBufferAcceptor().accept(writeBuffer);
         ccb.getWriteInterface().getFullBufferAcceptor().close();
diff --git a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkOutputChannel.java b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkOutputChannel.java
index 60e2e35..56c4576 100644
--- a/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkOutputChannel.java
+++ b/hyracks-fullstack/hyracks/hyracks-comm/src/main/java/org/apache/hyracks/comm/channels/NetworkOutputChannel.java
@@ -52,7 +52,8 @@
     }
 
     @Override
-    public void open() throws HyracksDataException {
+    public void open() {
+        // no op
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml
index 59e2de9..6862582 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/pom.xml
@@ -93,5 +93,9 @@
       <version>2.0.2-beta</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
index 5ea51d1..dc63481 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/BaseCCApplication.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.control.cc;
 
 import java.util.Arrays;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.ICCApplication;
 import org.apache.hyracks.api.application.IServiceContext;
@@ -28,13 +26,17 @@
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.api.job.resource.DefaultJobCapacityController;
 import org.apache.hyracks.api.job.resource.IJobCapacityController;
+import org.apache.hyracks.api.util.HyracksConstants;
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.util.LoggingConfigUtil;
+import org.apache.logging.log4j.Level;
 
 public class BaseCCApplication implements ICCApplication {
-    private static final Logger LOGGER = Logger.getLogger(BaseCCApplication.class.getName());
+
     public static final ICCApplication INSTANCE = new BaseCCApplication();
+    private IConfigManager configManager;
 
     protected BaseCCApplication() {
     }
@@ -68,6 +70,7 @@
 
     @Override
     public void registerConfig(IConfigManager configManager) {
+        this.configManager = configManager;
         configManager.addIniParamOptions(ControllerConfig.Option.CONFIG_FILE, ControllerConfig.Option.CONFIG_FILE_URL);
         configManager.addCmdLineSections(Section.CC, Section.COMMON);
         configManager.setUsageFilter(getUsageFilter());
@@ -80,8 +83,12 @@
     }
 
     protected void configureLoggingLevel(Level level) {
-        LOGGER.info("Setting Hyracks log level to " + level);
-        Logger.getLogger("org.apache.hyracks").setLevel(level);
+        LoggingConfigUtil.defaultIfMissing(HyracksConstants.HYRACKS_LOGGER_NAME, level);
+    }
+
+    @Override
+    public IConfigManager getConfigManager() {
+        return configManager;
     }
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
index a78f6bb..a188594 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/CCDriver.java
@@ -22,17 +22,18 @@
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.ICCApplication;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.control.common.config.ConfigUtils;
 import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.kohsuke.args4j.CmdLineException;
 
 public class CCDriver {
-    private static final Logger LOGGER = Logger.getLogger(CCDriver.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private CCDriver() {
     }
@@ -49,10 +50,10 @@
                 Thread.sleep(100000);
             }
         } catch (CmdLineException e) {
-            LOGGER.log(Level.FINE, "Exception parsing command line: " + Arrays.toString(args), e);
+            LOGGER.log(Level.DEBUG, "Exception parsing command line: " + Arrays.toString(args), e);
             System.exit(2);
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Exiting CCDriver due to exception", e);
+            LOGGER.log(Level.ERROR, "Exiting CCDriver due to exception", e);
             System.exit(1);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClientInterfaceIPCI.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClientInterfaceIPCI.java
index 327c422..e46aa7f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClientInterfaceIPCI.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClientInterfaceIPCI.java
@@ -18,21 +18,18 @@
  */
 package org.apache.hyracks.control.cc;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.client.HyracksClientInterfaceFunctions;
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.dataset.DatasetJobRecord.Status;
-import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.DeployedJobSpecIdFactory;
 import org.apache.hyracks.api.job.JobIdFactory;
 import org.apache.hyracks.api.job.JobInfo;
 import org.apache.hyracks.control.cc.work.CancelJobWork;
 import org.apache.hyracks.control.cc.work.CliDeployBinaryWork;
 import org.apache.hyracks.control.cc.work.CliUnDeployBinaryWork;
 import org.apache.hyracks.control.cc.work.ClusterShutdownWork;
-import org.apache.hyracks.control.cc.work.DestroyJobWork;
-import org.apache.hyracks.control.cc.work.DistributeJobWork;
+import org.apache.hyracks.control.cc.work.DeployJobSpecWork;
 import org.apache.hyracks.control.cc.work.GetDatasetDirectoryServiceInfoWork;
 import org.apache.hyracks.control.cc.work.GetJobInfoWork;
 import org.apache.hyracks.control.cc.work.GetJobStatusWork;
@@ -42,21 +39,27 @@
 import org.apache.hyracks.control.cc.work.GetResultStatusWork;
 import org.apache.hyracks.control.cc.work.GetThreadDumpWork;
 import org.apache.hyracks.control.cc.work.JobStartWork;
+import org.apache.hyracks.control.cc.work.UndeployJobSpecWork;
 import org.apache.hyracks.control.cc.work.WaitForJobCompletionWork;
 import org.apache.hyracks.control.common.work.IPCResponder;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.api.IIPCI;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class ClientInterfaceIPCI implements IIPCI {
 
-    private static final Logger LOGGER = Logger.getLogger(ClientInterfaceIPCI.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ClusterControllerService ccs;
     private final JobIdFactory jobIdFactory;
+    private final DeployedJobSpecIdFactory deployedJobSpecIdFactory;
 
-    ClientInterfaceIPCI(ClusterControllerService ccs, JobIdFactory jobIdFactory) {
+    ClientInterfaceIPCI(final ClusterControllerService ccs, final JobIdFactory jobIdFactory) {
         this.ccs = ccs;
         this.jobIdFactory = jobIdFactory;
+        this.deployedJobSpecIdFactory = ccs.getDeployedJobSpecIdFactory();
     }
 
     @Override
@@ -67,7 +70,7 @@
                 try {
                     handle.send(mid, ccs.getClusterControllerInfo(), null);
                 } catch (IPCException e) {
-                    LOGGER.log(Level.WARNING, "Error sending response to GET_CLUSTER_CONTROLLER_INFO request", e);
+                    LOGGER.log(Level.WARN, "Error sending response to GET_CLUSTER_CONTROLLER_INFO request", e);
                 }
                 break;
             case GET_JOB_STATUS:
@@ -83,16 +86,16 @@
                         new IPCResponder<JobInfo>(handle, mid)));
                 break;
             case DISTRIBUTE_JOB:
-                HyracksClientInterfaceFunctions.DistributeJobFunction djf =
-                        (HyracksClientInterfaceFunctions.DistributeJobFunction) fn;
-                ccs.getWorkQueue().schedule(new DistributeJobWork(ccs, djf.getACGGFBytes(), jobIdFactory,
-                        new IPCResponder<JobId>(handle, mid)));
+                HyracksClientInterfaceFunctions.DeployJobSpecFunction djf =
+                        (HyracksClientInterfaceFunctions.DeployJobSpecFunction) fn;
+                ccs.getWorkQueue().schedule(new DeployJobSpecWork(ccs, djf.getACGGFBytes(),
+                        deployedJobSpecIdFactory.create(), new IPCResponder<>(handle, mid)));
                 break;
             case DESTROY_JOB:
-                HyracksClientInterfaceFunctions.DestroyJobFunction dsjf =
-                        (HyracksClientInterfaceFunctions.DestroyJobFunction) fn;
-                ccs.getWorkQueue()
-                        .schedule(new DestroyJobWork(ccs, dsjf.getJobId(), new IPCResponder<JobId>(handle, mid)));
+                HyracksClientInterfaceFunctions.UndeployJobSpecFunction dsjf =
+                        (HyracksClientInterfaceFunctions.UndeployJobSpecFunction) fn;
+                ccs.getWorkQueue().schedule(
+                        new UndeployJobSpecWork(ccs, dsjf.getDeployedJobSpecId(), new IPCResponder<>(handle, mid)));
                 break;
             case CANCEL_JOB:
                 HyracksClientInterfaceFunctions.CancelJobFunction cjf =
@@ -103,8 +106,14 @@
             case START_JOB:
                 HyracksClientInterfaceFunctions.StartJobFunction sjf =
                         (HyracksClientInterfaceFunctions.StartJobFunction) fn;
-                ccs.getWorkQueue().schedule(new JobStartWork(ccs, sjf.getDeploymentId(), sjf.getACGGFBytes(),
-                        sjf.getJobFlags(), sjf.getJobId(), new IPCResponder<JobId>(handle, mid), jobIdFactory));
+                DeployedJobSpecId id = sjf.getDeployedJobSpecId();
+                byte[] acggfBytes = null;
+                if (id == null) {
+                    //The job is new
+                    acggfBytes = sjf.getACGGFBytes();
+                }
+                ccs.getWorkQueue().schedule(new JobStartWork(ccs, sjf.getDeploymentId(), acggfBytes, sjf.getJobFlags(),
+                        jobIdFactory, sjf.getJobParameters(), new IPCResponder<>(handle, mid), id));
                 break;
             case GET_DATASET_DIRECTORY_SERIVICE_INFO:
                 ccs.getWorkQueue().schedule(
@@ -136,7 +145,7 @@
                 try {
                     handle.send(mid, ccs.getCCContext().getClusterTopology(), null);
                 } catch (IPCException e) {
-                    LOGGER.log(Level.WARNING, "Error sending response to GET_CLUSTER_TOPOLOGY request", e);
+                    LOGGER.log(Level.WARN, "Error sending response to GET_CLUSTER_TOPOLOGY request", e);
                 }
                 break;
             case CLI_DEPLOY_BINARY:
@@ -174,7 +183,7 @@
                 try {
                     handle.send(mid, null, new IllegalArgumentException("Unknown function " + fn.getFunctionId()));
                 } catch (IPCException e) {
-                    LOGGER.log(Level.WARNING, "Error sending Unknown function response", e);
+                    LOGGER.log(Level.WARN, "Error sending Unknown function response", e);
                 }
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerIPCI.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerIPCI.java
index af5c102..06c92dd 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerIPCI.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerIPCI.java
@@ -19,11 +19,10 @@
 package org.apache.hyracks.control.cc;
 
 import java.util.Map;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.control.cc.work.ApplicationMessageWork;
-import org.apache.hyracks.control.cc.work.DistributedJobFailureWork;
+import org.apache.hyracks.control.cc.work.DeployedJobFailureWork;
 import org.apache.hyracks.control.cc.work.GetNodeControllersInfoWork;
 import org.apache.hyracks.control.cc.work.JobletCleanupNotificationWork;
 import org.apache.hyracks.control.cc.work.NodeHeartbeatWork;
@@ -48,9 +47,11 @@
 import org.apache.hyracks.control.common.work.IResultCallback;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.api.IIPCI;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class ClusterControllerIPCI implements IIPCI {
-    private static final Logger LOGGER = Logger.getLogger(ClusterControllerIPCI.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ClusterControllerService ccs;
 
     ClusterControllerIPCI(ClusterControllerService ccs) {
@@ -76,13 +77,12 @@
                 break;
             case NOTIFY_JOBLET_CLEANUP:
                 CCNCFunctions.NotifyJobletCleanupFunction njcf = (CCNCFunctions.NotifyJobletCleanupFunction) fn;
-                ccs.getWorkQueue().schedule(new JobletCleanupNotificationWork(ccs, njcf.getJobId(),
-                        njcf.getNodeId()));
+                ccs.getWorkQueue().schedule(new JobletCleanupNotificationWork(ccs, njcf.getJobId(), njcf.getNodeId()));
                 break;
             case NOTIFY_DEPLOY_BINARY:
                 CCNCFunctions.NotifyDeployBinaryFunction ndbf = (CCNCFunctions.NotifyDeployBinaryFunction) fn;
-                ccs.getWorkQueue().schedule(new NotifyDeployBinaryWork(ccs, ndbf.getDeploymentId(),
-                        ndbf.getNodeId(), ndbf.getDeploymentStatus()));
+                ccs.getWorkQueue().schedule(new NotifyDeployBinaryWork(ccs, ndbf.getDeploymentId(), ndbf.getNodeId(),
+                        ndbf.getDeploymentStatus()));
                 break;
             case REPORT_PROFILE:
                 CCNCFunctions.ReportProfileFunction rpf = (CCNCFunctions.ReportProfileFunction) fn;
@@ -90,49 +90,47 @@
                 break;
             case NOTIFY_TASK_COMPLETE:
                 CCNCFunctions.NotifyTaskCompleteFunction ntcf = (CCNCFunctions.NotifyTaskCompleteFunction) fn;
-                ccs.getWorkQueue().schedule(new TaskCompleteWork(ccs, ntcf.getJobId(),
-                        ntcf.getTaskId(), ntcf.getNodeId(), ntcf.getStatistics()));
+                ccs.getWorkQueue().schedule(new TaskCompleteWork(ccs, ntcf.getJobId(), ntcf.getTaskId(),
+                        ntcf.getNodeId(), ntcf.getStatistics()));
                 break;
             case NOTIFY_TASK_FAILURE:
                 CCNCFunctions.NotifyTaskFailureFunction ntff = (CCNCFunctions.NotifyTaskFailureFunction) fn;
-                ccs.getWorkQueue().schedule(new TaskFailureWork(ccs, ntff.getJobId(),
-                        ntff.getTaskId(), ntff.getNodeId(), ntff.getExceptions()));
+                ccs.getWorkQueue().schedule(new TaskFailureWork(ccs, ntff.getJobId(), ntff.getTaskId(),
+                        ntff.getNodeId(), ntff.getExceptions()));
                 break;
-            case DISTRIBUTED_JOB_FAILURE:
-                CCNCFunctions.ReportDistributedJobFailureFunction rdjf =
-                        (CCNCFunctions.ReportDistributedJobFailureFunction) fn;
-                ccs.getWorkQueue().schedule(new DistributedJobFailureWork(rdjf.getJobId(), rdjf.getNodeId()));
+            case DEPLOYED_JOB_FAILURE:
+                CCNCFunctions.ReportDeployedJobSpecFailureFunction rdjf =
+                        (CCNCFunctions.ReportDeployedJobSpecFailureFunction) fn;
+                ccs.getWorkQueue().schedule(new DeployedJobFailureWork(rdjf.getDeployedJobSpecId(), rdjf.getNodeId()));
                 break;
             case REGISTER_PARTITION_PROVIDER:
                 CCNCFunctions.RegisterPartitionProviderFunction rppf =
                         (CCNCFunctions.RegisterPartitionProviderFunction) fn;
-                ccs.getWorkQueue().schedule(new RegisterPartitionAvailibilityWork(ccs,
-                        rppf.getPartitionDescriptor()));
+                ccs.getWorkQueue().schedule(new RegisterPartitionAvailibilityWork(ccs, rppf.getPartitionDescriptor()));
                 break;
             case REGISTER_PARTITION_REQUEST:
                 CCNCFunctions.RegisterPartitionRequestFunction rprf =
                         (CCNCFunctions.RegisterPartitionRequestFunction) fn;
-                ccs.getWorkQueue().schedule(new RegisterPartitionRequestWork(ccs,
-                        rprf.getPartitionRequest()));
+                ccs.getWorkQueue().schedule(new RegisterPartitionRequestWork(ccs, rprf.getPartitionRequest()));
                 break;
             case REGISTER_RESULT_PARTITION_LOCATION:
                 CCNCFunctions.RegisterResultPartitionLocationFunction rrplf =
                         (CCNCFunctions.RegisterResultPartitionLocationFunction) fn;
-                ccs.getWorkQueue().schedule(new RegisterResultPartitionLocationWork(ccs,
-                        rrplf.getJobId(), rrplf.getResultSetId(), rrplf.getOrderedResult(), rrplf.getEmptyResult(),
-                        rrplf.getPartition(), rrplf.getNPartitions(), rrplf.getNetworkAddress()));
+                ccs.getWorkQueue()
+                        .schedule(new RegisterResultPartitionLocationWork(ccs, rrplf.getJobId(), rrplf.getResultSetId(),
+                                rrplf.getOrderedResult(), rrplf.getEmptyResult(), rrplf.getPartition(),
+                                rrplf.getNPartitions(), rrplf.getNetworkAddress()));
                 break;
             case REPORT_RESULT_PARTITION_WRITE_COMPLETION:
                 CCNCFunctions.ReportResultPartitionWriteCompletionFunction rrpwc =
                         (CCNCFunctions.ReportResultPartitionWriteCompletionFunction) fn;
-                ccs.getWorkQueue().schedule(new ReportResultPartitionWriteCompletionWork(ccs,
-                        rrpwc.getJobId(), rrpwc.getResultSetId(), rrpwc.getPartition()));
+                ccs.getWorkQueue().schedule(new ReportResultPartitionWriteCompletionWork(ccs, rrpwc.getJobId(),
+                        rrpwc.getResultSetId(), rrpwc.getPartition()));
                 break;
             case SEND_APPLICATION_MESSAGE:
-                CCNCFunctions.SendApplicationMessageFunction rsf =
-                        (CCNCFunctions.SendApplicationMessageFunction) fn;
-                ccs.getWorkQueue().schedule(new ApplicationMessageWork(ccs, rsf.getMessage(),
-                        rsf.getDeploymentId(), rsf.getNodeId()));
+                CCNCFunctions.SendApplicationMessageFunction rsf = (CCNCFunctions.SendApplicationMessageFunction) fn;
+                ccs.getWorkQueue().schedule(
+                        new ApplicationMessageWork(ccs, rsf.getMessage(), rsf.getDeploymentId(), rsf.getNodeId()));
                 break;
             case GET_NODE_CONTROLLERS_INFO:
                 ccs.getWorkQueue().schedule(new GetNodeControllersInfoWork(ccs.getNodeManager(),
@@ -150,21 +148,20 @@
                 break;
             case STATE_DUMP_RESPONSE:
                 CCNCFunctions.StateDumpResponseFunction dsrf = (StateDumpResponseFunction) fn;
-                ccs.getWorkQueue().schedule(new NotifyStateDumpResponse(ccs, dsrf.getNodeId(),
-                        dsrf.getStateDumpId(), dsrf.getState()));
+                ccs.getWorkQueue().schedule(
+                        new NotifyStateDumpResponse(ccs, dsrf.getNodeId(), dsrf.getStateDumpId(), dsrf.getState()));
                 break;
             case SHUTDOWN_RESPONSE:
                 CCNCFunctions.ShutdownResponseFunction sdrf = (ShutdownResponseFunction) fn;
                 ccs.getWorkQueue().schedule(new NotifyShutdownWork(ccs, sdrf.getNodeId()));
                 break;
             case THREAD_DUMP_RESPONSE:
-                CCNCFunctions.ThreadDumpResponseFunction tdrf =
-                        (CCNCFunctions.ThreadDumpResponseFunction)fn;
-                ccs.getWorkQueue().schedule(new NotifyThreadDumpResponse(ccs,
-                        tdrf.getRequestId(), tdrf.getThreadDumpJSON()));
+                CCNCFunctions.ThreadDumpResponseFunction tdrf = (CCNCFunctions.ThreadDumpResponseFunction) fn;
+                ccs.getWorkQueue()
+                        .schedule(new NotifyThreadDumpResponse(ccs, tdrf.getRequestId(), tdrf.getThreadDumpJSON()));
                 break;
             default:
-                LOGGER.warning("Unknown function: " + fn.getFunctionId());
+                LOGGER.warn("Unknown function: " + fn.getFunctionId());
         }
     }
 }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
index 7b99df2..f8fe77f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/ClusterControllerService.java
@@ -25,7 +25,6 @@
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -36,21 +35,20 @@
 import java.util.TreeMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
-import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.application.ICCApplication;
-import org.apache.hyracks.api.application.IClusterLifecycleListener;
 import org.apache.hyracks.api.client.ClusterControllerInfo;
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.config.IApplicationConfig;
-import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.context.ICCContext;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.DeployedJobSpecIdFactory;
+import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobIdFactory;
+import org.apache.hyracks.api.job.JobParameterByteStore;
 import org.apache.hyracks.api.job.resource.IJobCapacityController;
 import org.apache.hyracks.api.service.IControllerService;
 import org.apache.hyracks.api.topology.ClusterTopology;
@@ -84,10 +82,13 @@
 import org.apache.hyracks.ipc.impl.IPCSystem;
 import org.apache.hyracks.ipc.impl.JavaSerializationBasedPayloadSerializerDeserializer;
 import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.xml.sax.InputSource;
 
 public class ClusterControllerService implements IControllerService {
-    private static final Logger LOGGER = Logger.getLogger(ClusterControllerService.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final CCConfig ccConfig;
 
@@ -107,7 +108,9 @@
 
     private CCServiceContext serviceCtx;
 
-    private final PreDistributedJobStore preDistributedJobStore = new PreDistributedJobStore();
+    private final DeployedJobSpecStore deployedJobSpecStore = new DeployedJobSpecStore();
+
+    private final Map<JobId, JobParameterByteStore> jobParameterByteStoreMap = new HashMap<>();
 
     private final WorkQueue workQueue;
 
@@ -135,10 +138,14 @@
 
     private final JobIdFactory jobIdFactory;
 
+    private final DeployedJobSpecIdFactory deployedJobSpecIdFactory;
+
     private IJobManager jobManager;
 
     private ShutdownRun shutdownCallback;
 
+    private final CcId ccId;
+
     static {
         ExitUtil.init();
     }
@@ -164,8 +171,8 @@
         final ClusterTopology topology = computeClusterTopology(ccConfig);
         ccContext = new ClusterControllerContext(topology);
         sweeper = new DeadNodeSweeper();
-        datasetDirectoryService = new DatasetDirectoryService(ccConfig.getResultTTL(),
-                ccConfig.getResultSweepThreshold(), preDistributedJobStore);
+        datasetDirectoryService =
+                new DatasetDirectoryService(ccConfig.getResultTTL(), ccConfig.getResultSweepThreshold());
 
         deploymentRunMap = new HashMap<>();
         stateDumpRunMap = new HashMap<>();
@@ -174,7 +181,10 @@
         // Node manager is in charge of cluster membership management.
         nodeManager = new NodeManager(this, ccConfig, resourceManager);
 
-        jobIdFactory = new JobIdFactory();
+        ccId = ccConfig.getCcId();
+        jobIdFactory = new JobIdFactory(ccId);
+
+        deployedJobSpecIdFactory = new DeployedJobSpecIdFactory();
     }
 
     private static ClusterTopology computeClusterTopology(CCConfig ccConfig) throws Exception {
@@ -198,14 +208,14 @@
         clusterIPC = new IPCSystem(new InetSocketAddress(ccConfig.getClusterListenPort()), ccIPCI,
                 new CCNCFunctions.SerializerDeserializer());
         IIPCI ciIPCI = new ClientInterfaceIPCI(this, jobIdFactory);
-        clientIPC = new IPCSystem(
-                new InetSocketAddress(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort()), ciIPCI,
-                new JavaSerializationBasedPayloadSerializerDeserializer());
+        clientIPC =
+                new IPCSystem(new InetSocketAddress(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort()),
+                        ciIPCI, new JavaSerializationBasedPayloadSerializerDeserializer());
         webServer = new WebServer(this, ccConfig.getConsoleListenPort());
         clusterIPC.start();
         clientIPC.start();
         webServer.start();
-        info = new ClusterControllerInfo(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort(),
+        info = new ClusterControllerInfo(ccId, ccConfig.getClientListenAddress(), ccConfig.getClientListenPort(),
                 webServer.getListeningPort());
         timer.schedule(sweeper, 0, ccConfig.getHeartbeatPeriodMillis());
         jobLog.open();
@@ -228,31 +238,32 @@
 
         // Job manager is in charge of job lifecycle management.
         try {
-            Constructor<?> jobManagerConstructor = this.getClass().getClassLoader()
-                    .loadClass(ccConfig.getJobManagerClass())
-                    .getConstructor(CCConfig.class, ClusterControllerService.class, IJobCapacityController.class);
+            Constructor<?> jobManagerConstructor =
+                    this.getClass().getClassLoader().loadClass(ccConfig.getJobManagerClass()).getConstructor(
+                            CCConfig.class, ClusterControllerService.class, IJobCapacityController.class);
             jobManager = (IJobManager) jobManagerConstructor.newInstance(ccConfig, this, jobCapacityController);
         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException
                 | InvocationTargetException e) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.log(Level.WARNING, "class " + ccConfig.getJobManagerClass() + " could not be used: ", e);
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.log(Level.WARN, "class " + ccConfig.getJobManagerClass() + " could not be used: ", e);
             }
             // Falls back to the default implementation if the user-provided class name is not valid.
             jobManager = new JobManager(ccConfig, this, jobCapacityController);
         }
     }
 
-    private Pair<String, Integer> getNCService(String nodeId) {
+    private InetSocketAddress getNCService(String nodeId) {
         IApplicationConfig ncConfig = configManager.getNodeEffectiveConfig(nodeId);
-        return Pair.of(ncConfig.getString(NCConfig.Option.NCSERVICE_ADDRESS),
-                ncConfig.getInt(NCConfig.Option.NCSERVICE_PORT));
+        final int port = ncConfig.getInt(NCConfig.Option.NCSERVICE_PORT);
+        return port == NCConfig.NCSERVICE_PORT_DISABLED ? null
+                : InetSocketAddress.createUnresolved(ncConfig.getString(NCConfig.Option.NCSERVICE_ADDRESS), port);
     }
 
-    private Map<String, Pair<String, Integer>> getNCServices() {
-        Map<String, Pair<String, Integer>> ncMap = new TreeMap<>();
+    private Map<String, InetSocketAddress> getNCServices() {
+        Map<String, InetSocketAddress> ncMap = new TreeMap<>();
         for (String ncId : configManager.getNodeNames()) {
-            Pair<String, Integer> ncService = getNCService(ncId);
-            if (ncService.getRight() != NCConfig.NCSERVICE_PORT_DISABLED) {
+            InetSocketAddress ncService = getNCService(ncId);
+            if (ncService != null) {
                 ncMap.put(ncId, ncService);
             }
         }
@@ -261,40 +272,30 @@
 
     private void connectNCs() {
         getNCServices().forEach((key, value) -> {
-            final TriggerNCWork triggerWork = new TriggerNCWork(ClusterControllerService.this,
-                    value.getLeft(), value.getRight(), key);
+            final TriggerNCWork triggerWork =
+                    new TriggerNCWork(ClusterControllerService.this, value.getHostString(), value.getPort(), key);
             executor.submit(triggerWork);
         });
-        serviceCtx.addClusterLifecycleListener(new IClusterLifecycleListener() {
-            @Override
-            public void notifyNodeJoin(String nodeId, Map<IOption, Object> ncConfiguration) throws HyracksException {
-                // no-op, we don't care
-                LOGGER.log(Level.WARNING, "Getting notified that node: " + nodeId + " has joined. and we don't care");
-            }
+    }
 
-            @Override
-            public void notifyNodeFailure(Collection<String> deadNodeIds) throws HyracksException {
-                LOGGER.log(Level.WARNING, "Getting notified that nodes: " + deadNodeIds + " has failed");
-                for (String nodeId : deadNodeIds) {
-                    Pair<String, Integer> ncService = getNCService(nodeId);
-                    if (ncService.getRight() != NCConfig.NCSERVICE_PORT_DISABLED) {
-                        final TriggerNCWork triggerWork = new TriggerNCWork(ClusterControllerService.this,
-                                ncService.getLeft(), ncService.getRight(), nodeId);
-                        executor.submit(triggerWork);
-                    }
-                }
-            }
-        });
+    public boolean startNC(String nodeId) {
+        InetSocketAddress ncServiceAddress = getNCService(nodeId);
+        if (ncServiceAddress == null) {
+            return false;
+        }
+        final TriggerNCWork startNc = new TriggerNCWork(ClusterControllerService.this, ncServiceAddress.getHostString(),
+                ncServiceAddress.getPort(), nodeId);
+        executor.submit(startNc);
+        return true;
+
     }
 
     private void terminateNCServices() throws Exception {
         List<ShutdownNCServiceWork> shutdownNCServiceWorks = new ArrayList<>();
         getNCServices().forEach((key, value) -> {
-            if (value.getRight() != NCConfig.NCSERVICE_PORT_DISABLED) {
-                ShutdownNCServiceWork shutdownWork = new ShutdownNCServiceWork(value.getLeft(), value.getRight(), key);
-                workQueue.schedule(shutdownWork);
-                shutdownNCServiceWorks.add(shutdownWork);
-            }
+            ShutdownNCServiceWork shutdownWork = new ShutdownNCServiceWork(value.getHostString(), value.getPort(), key);
+            workQueue.schedule(shutdownWork);
+            shutdownNCServiceWorks.add(shutdownWork);
         });
         for (ShutdownNCServiceWork shutdownWork : shutdownNCServiceWorks) {
             shutdownWork.sync();
@@ -347,8 +348,21 @@
         return nodeManager;
     }
 
-    public PreDistributedJobStore getPreDistributedJobStore() throws HyracksException {
-        return preDistributedJobStore;
+    public DeployedJobSpecStore getDeployedJobSpecStore() throws HyracksException {
+        return deployedJobSpecStore;
+    }
+
+    public void removeJobParameterByteStore(JobId jobId) throws HyracksException {
+        jobParameterByteStoreMap.remove(jobId);
+    }
+
+    public JobParameterByteStore createOrGetJobParameterByteStore(JobId jobId) throws HyracksException {
+        JobParameterByteStore jpbs = jobParameterByteStoreMap.get(jobId);
+        if (jpbs == null) {
+            jpbs = new JobParameterByteStore();
+            jobParameterByteStoreMap.put(jobId, jpbs);
+        }
+        return jpbs;
     }
 
     public IResourceManager getResourceManager() {
@@ -397,6 +411,14 @@
         return jobIdFactory;
     }
 
+    public DeployedJobSpecIdFactory getDeployedJobSpecIdFactory() {
+        return deployedJobSpecIdFactory;
+    }
+
+    public CcId getCcId() {
+        return ccId;
+    }
+
     private final class ClusterControllerContext implements ICCContext {
         private final ClusterTopology topology;
 
@@ -406,8 +428,8 @@
 
         @Override
         public void getIPAddressNodeMap(Map<InetAddress, Set<String>> map) throws HyracksDataException {
-            GetIpAddressNodeNameMapWork ginmw = new GetIpAddressNodeNameMapWork(
-                    ClusterControllerService.this.getNodeManager(), map);
+            GetIpAddressNodeNameMapWork ginmw =
+                    new GetIpAddressNodeNameMapWork(ClusterControllerService.this.getNodeManager(), map);
             try {
                 workQueue.scheduleAndSync(ginmw);
             } catch (Exception e) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/DeployedJobSpecStore.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/DeployedJobSpecStore.java
new file mode 100644
index 0000000..0e22c25
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/DeployedJobSpecStore.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.cc;
+
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.hyracks.api.constraints.Constraint;
+import org.apache.hyracks.api.exceptions.ErrorCode;
+import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.JobSpecification;
+
+public class DeployedJobSpecStore {
+
+    private final Map<DeployedJobSpecId, DeployedJobSpecDescriptor> deployedJobSpecDescriptorMap;
+
+    public DeployedJobSpecStore() {
+        deployedJobSpecDescriptorMap = new Hashtable<>();
+    }
+
+    public void addDeployedJobSpecDescriptor(DeployedJobSpecId deployedJobSpecId,
+            ActivityClusterGraph activityClusterGraph, JobSpecification jobSpecification,
+            Set<Constraint> activityClusterGraphConstraints) throws HyracksException {
+        if (deployedJobSpecDescriptorMap.get(deployedJobSpecId) != null) {
+            throw HyracksException.create(ErrorCode.DUPLICATE_DEPLOYED_JOB, deployedJobSpecId);
+        }
+        DeployedJobSpecDescriptor descriptor =
+                new DeployedJobSpecDescriptor(activityClusterGraph, jobSpecification, activityClusterGraphConstraints);
+        deployedJobSpecDescriptorMap.put(deployedJobSpecId, descriptor);
+    }
+
+    public void checkForExistingDeployedJobSpecDescriptor(DeployedJobSpecId deployedJobSpecId) throws HyracksException {
+        if (deployedJobSpecDescriptorMap.get(deployedJobSpecId) != null) {
+            throw HyracksException.create(ErrorCode.DUPLICATE_DEPLOYED_JOB, deployedJobSpecId);
+        }
+    }
+
+    public DeployedJobSpecDescriptor getDeployedJobSpecDescriptor(DeployedJobSpecId deployedJobSpecId)
+            throws HyracksException {
+        DeployedJobSpecDescriptor descriptor = deployedJobSpecDescriptorMap.get(deployedJobSpecId);
+        if (descriptor == null) {
+            throw HyracksException.create(ErrorCode.ERROR_FINDING_DEPLOYED_JOB, deployedJobSpecId);
+        }
+        return descriptor;
+    }
+
+    public void removeDeployedJobSpecDescriptor(DeployedJobSpecId deployedJobSpecId) throws HyracksException {
+        DeployedJobSpecDescriptor descriptor = deployedJobSpecDescriptorMap.get(deployedJobSpecId);
+        if (descriptor == null) {
+            throw HyracksException.create(ErrorCode.ERROR_FINDING_DEPLOYED_JOB, deployedJobSpecId);
+        }
+        deployedJobSpecDescriptorMap.remove(deployedJobSpecId);
+    }
+
+    public class DeployedJobSpecDescriptor {
+
+        private final ActivityClusterGraph activityClusterGraph;
+
+        private final JobSpecification jobSpecification;
+
+        private final Set<Constraint> activityClusterGraphConstraints;
+
+        private DeployedJobSpecDescriptor(ActivityClusterGraph activityClusterGraph, JobSpecification jobSpecification,
+                Set<Constraint> activityClusterGraphConstraints) {
+            this.activityClusterGraph = activityClusterGraph;
+            this.jobSpecification = jobSpecification;
+            this.activityClusterGraphConstraints = activityClusterGraphConstraints;
+        }
+
+        public ActivityClusterGraph getActivityClusterGraph() {
+            return activityClusterGraph;
+        }
+
+        public JobSpecification getJobSpecification() {
+            return jobSpecification;
+        }
+
+        public Set<Constraint> getActivityClusterGraphConstraints() {
+            return activityClusterGraphConstraints;
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/PreDistributedJobStore.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/PreDistributedJobStore.java
deleted file mode 100644
index 117621f..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/PreDistributedJobStore.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.cc;
-
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.hyracks.api.constraints.Constraint;
-import org.apache.hyracks.api.exceptions.ErrorCode;
-import org.apache.hyracks.api.exceptions.HyracksException;
-import org.apache.hyracks.api.job.ActivityClusterGraph;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.api.job.JobSpecification;
-
-public class PreDistributedJobStore {
-
-    private final Map<JobId, PreDistributedJobDescriptor> preDistributedJobDescriptorMap;
-
-    public PreDistributedJobStore() {
-        preDistributedJobDescriptorMap = new Hashtable<>();
-    }
-
-    public void addDistributedJobDescriptor(JobId jobId, ActivityClusterGraph activityClusterGraph,
-            JobSpecification jobSpecification, Set<Constraint> activityClusterGraphConstraints)
-                    throws HyracksException {
-        if (preDistributedJobDescriptorMap.get(jobId) != null) {
-            throw HyracksException.create(ErrorCode.DUPLICATE_DISTRIBUTED_JOB, jobId);
-        }
-        PreDistributedJobDescriptor descriptor =
-                new PreDistributedJobDescriptor(activityClusterGraph, jobSpecification, activityClusterGraphConstraints);
-        preDistributedJobDescriptorMap.put(jobId, descriptor);
-    }
-
-    public void checkForExistingDistributedJobDescriptor(JobId jobId) throws HyracksException {
-        if (preDistributedJobDescriptorMap.get(jobId) != null) {
-            throw HyracksException.create(ErrorCode.DUPLICATE_DISTRIBUTED_JOB, jobId);
-        }
-    }
-
-    public PreDistributedJobDescriptor getDistributedJobDescriptor(JobId jobId) throws HyracksException {
-        PreDistributedJobDescriptor descriptor = preDistributedJobDescriptorMap.get(jobId);
-        if (descriptor == null) {
-            throw HyracksException.create(ErrorCode.ERROR_FINDING_DISTRIBUTED_JOB, jobId);
-        }
-        return descriptor;
-    }
-
-    public boolean jobIsPredistributed(JobId jobId) {
-        return preDistributedJobDescriptorMap.get(jobId) != null;
-    }
-
-    public void removeDistributedJobDescriptor(JobId jobId) throws HyracksException {
-        PreDistributedJobDescriptor descriptor = preDistributedJobDescriptorMap.get(jobId);
-        if (descriptor == null) {
-            throw HyracksException.create(ErrorCode.ERROR_FINDING_DISTRIBUTED_JOB, jobId);
-        }
-        preDistributedJobDescriptorMap.remove(jobId);
-    }
-
-    public class PreDistributedJobDescriptor {
-
-        private final ActivityClusterGraph activityClusterGraph;
-
-        private final JobSpecification jobSpecification;
-
-        private final Set<Constraint> activityClusterGraphConstraints;
-
-        private PreDistributedJobDescriptor(ActivityClusterGraph activityClusterGraph,
-                JobSpecification jobSpecification, Set<Constraint> activityClusterGraphConstraints) {
-            this.activityClusterGraph = activityClusterGraph;
-            this.jobSpecification = jobSpecification;
-            this.activityClusterGraphConstraints = activityClusterGraphConstraints;
-        }
-
-        public ActivityClusterGraph getActivityClusterGraph() {
-            return activityClusterGraph;
-        }
-
-        public JobSpecification getJobSpecification() {
-            return jobSpecification;
-        }
-
-        public Set<Constraint> getActivityClusterGraphConstraints() {
-            return activityClusterGraphConstraints;
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/application/CCServiceContext.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/application/CCServiceContext.java
index 26245e1..de166dd 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/application/CCServiceContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/application/CCServiceContext.java
@@ -42,7 +42,6 @@
 import org.apache.hyracks.control.common.application.ServiceContext;
 import org.apache.hyracks.control.common.context.ServerContext;
 import org.apache.hyracks.control.common.utils.HyracksThreadFactory;
-import org.apache.hyracks.control.common.work.IResultCallback;
 
 public class CCServiceContext extends ServiceContext implements ICCServiceContext {
     private final ICCContext ccContext;
@@ -50,9 +49,6 @@
     protected final Set<String> initPendingNodeIds;
     protected final Set<String> deinitPendingNodeIds;
 
-    protected IResultCallback<Object> initializationCallback;
-    protected IResultCallback<Object> deinitializationCallback;
-
     private List<IJobLifecycleListener> jobLifecycleListeners;
     private List<IClusterLifecycleListener> clusterLifecycleListeners;
     private final ClusterControllerService ccs;
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/cluster/NodeManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/cluster/NodeManager.java
index 3cd6235..98cf67a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/cluster/NodeManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/cluster/NodeManager.java
@@ -30,7 +30,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.client.NodeControllerInfo;
@@ -49,15 +48,18 @@
 import org.apache.hyracks.control.common.ipc.CCNCFunctions.AbortCCJobsFunction;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NodeManager implements INodeManager {
-    private static final Logger LOGGER = Logger.getLogger(NodeManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
     private final CCConfig ccConfig;
     private final IResourceManager resourceManager;
     private final Map<String, NodeControllerState> nodeRegistry;
     private final Map<InetAddress, Set<String>> ipAddressNodeNameMap;
+    private final int nodeCoresMultiplier;
 
     public NodeManager(ClusterControllerService ccs, CCConfig ccConfig, IResourceManager resourceManager) {
         this.ccs = ccs;
@@ -65,6 +67,7 @@
         this.resourceManager = resourceManager;
         this.nodeRegistry = new LinkedHashMap<>();
         this.ipAddressNodeNameMap = new HashMap<>();
+        this.nodeCoresMultiplier = ccConfig.getCoresMultiplier();
     }
 
     @Override
@@ -89,24 +92,24 @@
 
     @Override
     public void addNode(String nodeId, NodeControllerState ncState) throws HyracksException {
-        LOGGER.warning("addNode(" + nodeId + ") called");
+        LOGGER.warn("addNode(" + nodeId + ") called");
         if (nodeId == null || ncState == null) {
             throw HyracksException.create(ErrorCode.INVALID_INPUT_PARAMETER);
         }
         // Updates the node registry.
         if (nodeRegistry.containsKey(nodeId)) {
-            LOGGER.warning(
-                    "Node with name " + nodeId + " has already registered; failing the node then re-registering.");
+            LOGGER.warn("Node with name " + nodeId + " has already registered; failing the node then re-registering.");
             removeDeadNode(nodeId);
         } else {
             try {
+                // TODO(mblow): it seems we should close IPC handles when we're done with them (like here)
                 IIPCHandle ncIPCHandle = ccs.getClusterIPC().getHandle(ncState.getNodeController().getAddress());
-                ncIPCHandle.send(-1, new AbortCCJobsFunction(), null);
+                ncIPCHandle.send(-1, new AbortCCJobsFunction(ccConfig.getCcId()), null);
             } catch (IPCException e) {
                 throw HyracksDataException.create(e);
             }
         }
-        LOGGER.warning("adding node to registry");
+        LOGGER.warn("adding node to registry");
         nodeRegistry.put(nodeId, ncState);
         // Updates the IP address to node names map.
         try {
@@ -119,8 +122,8 @@
             throw e;
         }
         // Updates the cluster capacity.
-        LOGGER.warning("updating cluster capacity");
-        resourceManager.update(nodeId, ncState.getCapacity());
+        LOGGER.warn("updating cluster capacity");
+        resourceManager.update(nodeId, getAdjustedNodeCapacity(ncState.getCapacity()));
     }
 
     @Override
@@ -136,7 +139,7 @@
     public Map<String, NodeControllerInfo> getNodeControllerInfoMap() {
         Map<String, NodeControllerInfo> result = new LinkedHashMap<>();
         nodeRegistry.forEach(
-                (key, ncState) -> result.put(key, new NodeControllerInfo(key, NodeStatus.ALIVE, ncState.getDataPort(),
+                (key, ncState) -> result.put(key, new NodeControllerInfo(key, NodeStatus.ACTIVE, ncState.getDataPort(),
                         ncState.getDatasetPort(), ncState.getMessagingPort(), ncState.getCapacity().getCores())));
         return result;
     }
@@ -146,8 +149,8 @@
         Set<String> deadNodes = new HashSet<>();
         Set<JobId> affectedJobIds = new HashSet<>();
         Iterator<Map.Entry<String, NodeControllerState>> nodeIterator = nodeRegistry.entrySet().iterator();
-        long deadNodeNanosThreshold = TimeUnit.MILLISECONDS
-                .toNanos(ccConfig.getHeartbeatMaxMisses() * ccConfig.getHeartbeatPeriodMillis());
+        long deadNodeNanosThreshold =
+                TimeUnit.MILLISECONDS.toNanos(ccConfig.getHeartbeatMaxMisses() * ccConfig.getHeartbeatPeriodMillis());
         while (nodeIterator.hasNext()) {
             Map.Entry<String, NodeControllerState> entry = nodeIterator.next();
             String nodeId = entry.getKey();
@@ -216,4 +219,7 @@
         }
     }
 
+    private NodeCapacity getAdjustedNodeCapacity(NodeCapacity nodeCapacity) {
+        return new NodeCapacity(nodeCapacity.getMemoryByteSize(), nodeCapacity.getCores() * nodeCoresMultiplier);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
index ca1c91b..04aaddd 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/dataset/DatasetDirectoryService.java
@@ -26,8 +26,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.dataset.DatasetDirectoryRecord;
@@ -42,9 +40,12 @@
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.api.job.JobStatus;
-import org.apache.hyracks.control.cc.PreDistributedJobStore;
+import org.apache.hyracks.control.common.dataset.AbstractDatasetManager;
 import org.apache.hyracks.control.common.dataset.ResultStateSweeper;
 import org.apache.hyracks.control.common.work.IResultCallback;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * TODO(madhusudancs): The potential perils of this global dataset directory service implementation is that, the jobs
@@ -53,34 +54,28 @@
  * the job (after it receives all the results) completely. Then we can just get rid of the location information for that
  * job.
  */
-public class DatasetDirectoryService implements IDatasetDirectoryService {
+public class DatasetDirectoryService extends AbstractDatasetManager implements IDatasetDirectoryService {
 
-    private static final Logger LOGGER = Logger.getLogger(DatasetDirectoryService.class.getName());
-
-    private final long resultTTL;
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final long resultSweepThreshold;
 
     private final Map<JobId, JobResultInfo> jobResultLocations;
 
-    private final PreDistributedJobStore preDistributedJobStore;
-
-    public DatasetDirectoryService(long resultTTL, long resultSweepThreshold,
-            PreDistributedJobStore preDistributedJobStore) {
-        this.resultTTL = resultTTL;
+    public DatasetDirectoryService(long resultTTL, long resultSweepThreshold) {
+        super(resultTTL);
         this.resultSweepThreshold = resultSweepThreshold;
-        this.preDistributedJobStore = preDistributedJobStore;
         jobResultLocations = new LinkedHashMap<>();
     }
 
     @Override
     public void init(ExecutorService executor) {
-        executor.execute(new ResultStateSweeper(this, resultTTL, resultSweepThreshold, LOGGER));
+        executor.execute(new ResultStateSweeper(this, resultSweepThreshold, LOGGER));
     }
 
     @Override
     public synchronized void notifyJobCreation(JobId jobId, JobSpecification spec) throws HyracksException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(getClass().getSimpleName() + " notified of new job " + jobId);
         }
         if (jobResultLocations.get(jobId) != null) {
@@ -185,15 +180,7 @@
     }
 
     @Override
-    public synchronized long getResultTimestamp(JobId jobId) {
-        if (preDistributedJobStore.jobIsPredistributed(jobId)) {
-            return -1;
-        }
-        return getState(jobId).getTimestamp();
-    }
-
-    @Override
-    public synchronized void deinitState(JobId jobId) {
+    public synchronized void sweep(JobId jobId) {
         jobResultLocations.remove(jobId);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/ActivityClusterPlanner.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/ActivityClusterPlanner.java
index 04166a4..3fe88bf 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/ActivityClusterPlanner.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/ActivityClusterPlanner.java
@@ -27,8 +27,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.constraints.expressions.LValueConstraintExpression;
@@ -51,9 +49,11 @@
 import org.apache.hyracks.control.cc.job.Task;
 import org.apache.hyracks.control.cc.job.TaskCluster;
 import org.apache.hyracks.control.cc.job.TaskClusterId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class ActivityClusterPlanner {
-    private static final Logger LOGGER = Logger.getLogger(ActivityClusterPlanner.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final JobExecutor executor;
 
@@ -74,7 +74,7 @@
 
         TaskCluster[] taskClusters = computeTaskClusters(ac, jobRun, activityPlanMap);
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Plan for " + ac);
             LOGGER.info("Built " + taskClusters.length + " Task Clusters");
             for (TaskCluster tc : taskClusters) {
@@ -102,12 +102,10 @@
                     ActivityCluster dAC = ac.getActivityClusterGraph().getActivityMap().get(danId);
                     ActivityClusterPlan dACP = jobRun.getActivityClusterPlanMap().get(dAC.getId());
                     assert dACP != null : "IllegalStateEncountered: Dependent AC is being planned without a plan for "
-                            + "dependency AC: Encountered no plan for ActivityID "
-                            + danId;
+                            + "dependency AC: Encountered no plan for ActivityID " + danId;
                     Task[] dATasks = dACP.getActivityPlanMap().get(danId).getTasks();
                     assert dATasks != null : "IllegalStateEncountered: Dependent AC is being planned without a plan for"
-                            + " dependency AC: Encountered no plan for ActivityID "
-                            + danId;
+                            + " dependency AC: Encountered no plan for ActivityID " + danId;
                     assert dATasks.length == tasks.length : "Dependency activity partitioned differently from "
                             + "dependent: " + dATasks.length + " != " + tasks.length;
                     Task dTask = dATasks[i];
@@ -125,8 +123,8 @@
     private TaskCluster[] computeTaskClusters(ActivityCluster ac, JobRun jobRun,
             Map<ActivityId, ActivityPlan> activityPlanMap) {
         Set<ActivityId> activities = ac.getActivityMap().keySet();
-        Map<TaskId, List<Pair<TaskId, ConnectorDescriptorId>>> taskConnectivity = computeTaskConnectivity(jobRun,
-                activityPlanMap, activities);
+        Map<TaskId, List<Pair<TaskId, ConnectorDescriptorId>>> taskConnectivity =
+                computeTaskConnectivity(jobRun, activityPlanMap, activities);
 
         TaskCluster[] taskClusters = ac.getActivityClusterGraph().isUseConnectorPolicyForScheduling()
                 ? buildConnectorPolicyAwareTaskClusters(ac, activityPlanMap, taskConnectivity)
@@ -139,13 +137,13 @@
                 List<Pair<TaskId, ConnectorDescriptorId>> cInfoList = taskConnectivity.get(tid);
                 if (cInfoList != null) {
                     for (Pair<TaskId, ConnectorDescriptorId> p : cInfoList) {
-                        Task targetTS = activityPlanMap.get(p.getLeft().getActivityId()).getTasks()[p.getLeft()
-                                .getPartition()];
+                        Task targetTS =
+                                activityPlanMap.get(p.getLeft().getActivityId()).getTasks()[p.getLeft().getPartition()];
                         TaskCluster targetTC = targetTS.getTaskCluster();
                         if (targetTC != tc) {
                             ConnectorDescriptorId cdId = p.getRight();
-                            PartitionId pid = new PartitionId(jobRun.getJobId(), cdId, tid.getPartition(), p.getLeft()
-                                    .getPartition());
+                            PartitionId pid = new PartitionId(jobRun.getJobId(), cdId, tid.getPartition(),
+                                    p.getLeft().getPartition());
                             tc.getProducedPartitions().add(pid);
                             targetTC.getRequiredPartitions().add(pid);
                             partitionProducingTaskClusterMap.put(pid, tc);
@@ -170,8 +168,8 @@
             Task[] tasks = ap.getTasks();
             taskStates.addAll(Arrays.asList(tasks));
         }
-        TaskCluster tc = new TaskCluster(new TaskClusterId(ac.getId(), 0), ac, taskStates.toArray(new Task[taskStates
-                .size()]));
+        TaskCluster tc =
+                new TaskCluster(new TaskClusterId(ac.getId(), 0), ac, taskStates.toArray(new Task[taskStates.size()]));
         for (Task t : tc.getTasks()) {
             t.setTaskCluster(tc);
         }
@@ -209,8 +207,8 @@
                 }
                 for (int i = 0; i < nProducers; ++i) {
                     c.indicateTargetPartitions(nProducers, nConsumers, i, targetBitmap);
-                    List<Pair<TaskId, ConnectorDescriptorId>> cInfoList = taskConnectivity
-                            .get(ac1TaskStates[i].getTaskId());
+                    List<Pair<TaskId, ConnectorDescriptorId>> cInfoList =
+                            taskConnectivity.get(ac1TaskStates[i].getTaskId());
                     if (cInfoList == null) {
                         cInfoList = new ArrayList<>();
                         taskConnectivity.put(ac1TaskStates[i].getTaskId(), cInfoList);
@@ -358,9 +356,9 @@
 
                 int[] fanouts = new int[nProducers];
                 if (c.allProducersToAllConsumers()) {
-                        for (int i = 0; i < nProducers; ++i) {
-                            fanouts[i] = nConsumers;
-                        }
+                    for (int i = 0; i < nProducers; ++i) {
+                        fanouts[i] = nConsumers;
+                    }
                 } else {
                     for (int i = 0; i < nProducers; ++i) {
                         c.indicateTargetPartitions(nProducers, nConsumers, i, targetBitmap);
@@ -402,8 +400,8 @@
                 throw new HyracksException("No value found for " + lv);
             }
             if (!(value instanceof Number)) {
-                throw new HyracksException("Unexpected type of value bound to " + lv + ": " + value.getClass() + "("
-                        + value + ")");
+                throw new HyracksException(
+                        "Unexpected type of value bound to " + lv + ": " + value.getClass() + "(" + value + ")");
             }
             int nParts = ((Number) value).intValue();
             if (nParts <= 0) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/JobExecutor.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/JobExecutor.java
index 8a69a6f..ac06344 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/JobExecutor.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/executor/JobExecutor.java
@@ -28,8 +28,6 @@
 import java.util.PriorityQueue;
 import java.util.Random;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.constraints.Constraint;
@@ -47,6 +45,7 @@
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.ActivityCluster;
 import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
 import org.apache.hyracks.api.partitions.PartitionId;
@@ -67,9 +66,12 @@
 import org.apache.hyracks.control.common.job.TaskAttemptDescriptor;
 import org.apache.hyracks.control.common.work.IResultCallback;
 import org.apache.hyracks.control.common.work.NoOpCallback;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class JobExecutor {
-    private static final Logger LOGGER = Logger.getLogger(JobExecutor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
 
@@ -77,7 +79,7 @@
 
     private final PartitionConstraintSolver solver;
 
-    private final boolean predistributed;
+    private final DeployedJobSpecId deployedJobSpecId;
 
     private final Map<PartitionId, TaskCluster> partitionProducingTaskClusterMap;
 
@@ -88,10 +90,10 @@
     private boolean cancelled = false;
 
     public JobExecutor(ClusterControllerService ccs, JobRun jobRun, Collection<Constraint> constraints,
-            boolean predistributed) {
+            DeployedJobSpecId deployedJobSpecId) {
         this.ccs = ccs;
         this.jobRun = jobRun;
-        this.predistributed = predistributed;
+        this.deployedJobSpecId = deployedJobSpecId;
         solver = new PartitionConstraintSolver();
         partitionProducingTaskClusterMap = new HashMap<>();
         inProgressTaskClusters = new HashSet<>();
@@ -99,8 +101,8 @@
         random = new Random();
     }
 
-    public boolean isPredistributed() {
-        return predistributed;
+    public boolean isDeployed() {
+        return deployedJobSpecId != null;
     }
 
     public JobRun getJobRun() {
@@ -195,7 +197,7 @@
         Set<TaskCluster> taskClusterRoots = new HashSet<>();
         findRunnableTaskClusterRoots(taskClusterRoots,
                 jobRun.getActivityClusterGraph().getActivityClusterMap().values());
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO,
                     "Runnable TC roots: " + taskClusterRoots + ", inProgressTaskClusters: " + inProgressTaskClusters);
         }
@@ -225,19 +227,19 @@
                 queue.add(new RankedRunnableTaskCluster(priority, tc));
             }
         }
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Ranked TCs: " + queue);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Ranked TCs: " + queue);
         }
 
         Map<String, List<TaskAttemptDescriptor>> taskAttemptMap = new HashMap<>();
         for (RankedRunnableTaskCluster rrtc : queue) {
             TaskCluster tc = rrtc.getTaskCluster();
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Found runnable TC: " + tc);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Found runnable TC: " + tc);
                 List<TaskClusterAttempt> attempts = tc.getAttempts();
-                LOGGER.fine("Attempts so far:" + attempts.size());
+                LOGGER.debug("Attempts so far:" + attempts.size());
                 for (TaskClusterAttempt tcAttempt : attempts) {
-                    LOGGER.fine("Status: " + tcAttempt.getStatus());
+                    LOGGER.debug("Status: " + tcAttempt.getStatus());
                 }
             }
             assignTaskLocations(tc, taskAttemptMap);
@@ -257,16 +259,16 @@
      * Runnability(Non-schedulable TaskCluster) = {NOT_RUNNABLE, _}
      */
     private Runnability assignRunnabilityRank(TaskCluster goal, Map<TaskCluster, Runnability> runnabilityMap) {
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Computing runnability: " + goal);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Computing runnability: " + goal);
         }
         if (runnabilityMap.containsKey(goal)) {
             return runnabilityMap.get(goal);
         }
         TaskClusterAttempt lastAttempt = findLastTaskClusterAttempt(goal);
         if (lastAttempt != null) {
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Last Attempt Status: " + lastAttempt.getStatus());
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Last Attempt Status: " + lastAttempt.getStatus());
             }
             if (lastAttempt.getStatus() == TaskClusterAttempt.TaskClusterStatus.COMPLETED) {
                 Runnability runnability = new Runnability(Runnability.Tag.COMPLETED, Integer.MIN_VALUE);
@@ -283,15 +285,15 @@
         PartitionMatchMaker pmm = jobRun.getPartitionMatchMaker();
         Runnability aggregateRunnability = new Runnability(Runnability.Tag.RUNNABLE, 0);
         for (PartitionId pid : goal.getRequiredPartitions()) {
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Inspecting required partition: " + pid);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Inspecting required partition: " + pid);
             }
             Runnability runnability;
             ConnectorDescriptorId cdId = pid.getConnectorDescriptorId();
             IConnectorPolicy cPolicy = connectorPolicyMap.get(cdId);
             PartitionState maxState = pmm.getMaximumAvailableState(pid);
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Policy: " + cPolicy + " maxState: " + maxState);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Policy: " + cPolicy + " maxState: " + maxState);
             }
             if (PartitionState.COMMITTED.equals(maxState)) {
                 runnability = new Runnability(Runnability.Tag.RUNNABLE, 0);
@@ -327,8 +329,8 @@
                 // already not runnable -- cannot get better. bail.
                 break;
             }
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("aggregateRunnability: " + aggregateRunnability);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("aggregateRunnability: " + aggregateRunnability);
             }
         }
         runnabilityMap.put(goal, aggregateRunnability);
@@ -446,7 +448,7 @@
             Object location = solver.getValue(pLocationExpr);
             if (location == null) {
                 // pick any
-                nodeId = liveNodes.toArray(new String[liveNodes.size()])[random.nextInt(1) % liveNodes.size()];
+                nodeId = liveNodes.toArray(new String[liveNodes.size()])[random.nextInt(liveNodes.size())];
             } else if (location instanceof String) {
                 nodeId = (String) location;
             } else if (location instanceof String[]) {
@@ -502,7 +504,7 @@
                 new HashMap<>(jobRun.getConnectorPolicyMap());
         INodeManager nodeManager = ccs.getNodeManager();
         try {
-            byte[] acgBytes = predistributed ? null : JavaSerializationUtils.serialize(acg);
+            byte[] acgBytes = isDeployed() ? null : JavaSerializationUtils.serialize(acg);
             for (Map.Entry<String, List<TaskAttemptDescriptor>> entry : taskAttemptMap.entrySet()) {
                 String nodeId = entry.getKey();
                 final List<TaskAttemptDescriptor> taskDescriptors = entry.getValue();
@@ -510,12 +512,13 @@
                 if (node != null) {
                     node.getActiveJobIds().add(jobRun.getJobId());
                     boolean changed = jobRun.getParticipatingNodeIds().add(nodeId);
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("Starting: " + taskDescriptors + " at " + entry.getKey());
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("Starting: " + taskDescriptors + " at " + entry.getKey());
                     }
                     byte[] jagBytes = changed ? acgBytes : null;
                     node.getNodeController().startTasks(deploymentId, jobId, jagBytes, taskDescriptors,
-                            connectorPolicies, jobRun.getFlags());
+                            connectorPolicies, jobRun.getFlags(),
+                            ccs.createOrGetJobParameterByteStore(jobId).getParameterMap(), deployedJobSpecId);
                 }
             }
         } catch (Exception e) {
@@ -535,14 +538,14 @@
 
     private void abortTaskCluster(TaskClusterAttempt tcAttempt,
             TaskClusterAttempt.TaskClusterStatus failedOrAbortedStatus) {
-        LOGGER.fine("Aborting task cluster: " + tcAttempt.getAttempt());
+        LOGGER.debug("Aborting task cluster: " + tcAttempt.getAttempt());
         Set<TaskAttemptId> abortTaskIds = new HashSet<>();
         Map<String, List<TaskAttemptId>> abortTaskAttemptMap = new HashMap<>();
         for (TaskAttempt ta : tcAttempt.getTaskAttempts().values()) {
             TaskAttemptId taId = ta.getTaskAttemptId();
             TaskAttempt.TaskStatus status = ta.getStatus();
             abortTaskIds.add(taId);
-            LOGGER.fine("Checking " + taId + ": " + ta.getStatus());
+            LOGGER.debug("Checking " + taId + ": " + ta.getStatus());
             if (status == TaskAttempt.TaskStatus.RUNNING || status == TaskAttempt.TaskStatus.COMPLETED) {
                 ta.setStatus(TaskAttempt.TaskStatus.ABORTED, null);
                 ta.setEndTime(System.currentTimeMillis());
@@ -562,13 +565,13 @@
         abortTaskAttemptMap.forEach((key, abortTaskAttempts) -> {
             final NodeControllerState node = nodeManager.getNodeControllerState(key);
             if (node != null) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Aborting: " + abortTaskAttempts + " at " + key);
                 }
                 try {
                     node.getNodeController().abortTasks(jobId, abortTaskAttempts);
                 } catch (Exception e) {
-                    LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    LOGGER.log(Level.ERROR, e.getMessage(), e);
                 }
             }
         });
@@ -640,27 +643,32 @@
         return doomed;
     }
 
-    public void notifyTaskComplete(TaskAttempt ta) throws HyracksException {
-        TaskAttemptId taId = ta.getTaskAttemptId();
-        TaskCluster tc = ta.getTask().getTaskCluster();
-        TaskClusterAttempt lastAttempt = findLastTaskClusterAttempt(tc);
-        if (lastAttempt == null || taId.getAttempt() != lastAttempt.getAttempt()) {
-            LOGGER.warning(
-                    "Ignoring task complete notification: " + taId + " -- Current last attempt = " + lastAttempt);
-            return;
-        }
-        TaskAttempt.TaskStatus taStatus = ta.getStatus();
-        if (taStatus != TaskAttempt.TaskStatus.RUNNING) {
-            LOGGER.warning("Spurious task complete notification: " + taId + " Current state = " + taStatus);
-            return;
-        }
-        ta.setStatus(TaskAttempt.TaskStatus.COMPLETED, null);
-        ta.setEndTime(System.currentTimeMillis());
-        if (lastAttempt.decrementPendingTasksCounter() == 0) {
-            lastAttempt.setStatus(TaskClusterAttempt.TaskClusterStatus.COMPLETED);
-            lastAttempt.setEndTime(System.currentTimeMillis());
-            inProgressTaskClusters.remove(tc);
-            startRunnableActivityClusters();
+    public void notifyTaskComplete(TaskAttempt ta) {
+        try {
+            TaskAttemptId taId = ta.getTaskAttemptId();
+            TaskCluster tc = ta.getTask().getTaskCluster();
+            TaskClusterAttempt lastAttempt = findLastTaskClusterAttempt(tc);
+            if (lastAttempt == null || taId.getAttempt() != lastAttempt.getAttempt()) {
+                LOGGER.warn(() -> "Ignoring task complete notification: " + taId + " -- Current last attempt = "
+                        + lastAttempt);
+                return;
+            }
+            TaskAttempt.TaskStatus taStatus = ta.getStatus();
+            if (taStatus != TaskAttempt.TaskStatus.RUNNING) {
+                LOGGER.warn(() -> "Spurious task complete notification: " + taId + " Current state = " + taStatus);
+                return;
+            }
+            ta.setStatus(TaskAttempt.TaskStatus.COMPLETED, null);
+            ta.setEndTime(System.currentTimeMillis());
+            if (lastAttempt.decrementPendingTasksCounter() == 0) {
+                lastAttempt.setStatus(TaskClusterAttempt.TaskClusterStatus.COMPLETED);
+                lastAttempt.setEndTime(System.currentTimeMillis());
+                inProgressTaskClusters.remove(tc);
+                startRunnableActivityClusters();
+            }
+        } catch (Exception e) {
+            LOGGER.error(() -> "Unexpected failure. Aborting job " + jobRun.getJobId(), e);
+            abortJob(Collections.singletonList(e), NoOpCallback.INSTANCE);
         }
     }
 
@@ -694,7 +702,7 @@
                 LOGGER.log(Level.INFO, "We will try to start runnable activity clusters of " + ta.getTaskAttemptId());
                 startRunnableActivityClusters();
             } else {
-                LOGGER.warning(
+                LOGGER.warn(
                         "Ignoring task failure notification: " + taId + " -- Current last attempt = " + lastAttempt);
             }
         } catch (Exception e) {
@@ -722,6 +730,7 @@
                     ta -> HyracksException.create(ErrorCode.NODE_FAILED, ta.getNodeId()));
             startRunnableActivityClusters();
         } catch (Exception e) {
+            LOGGER.error(() -> "Unexpected failure. Aborting job " + jobRun.getJobId(), e);
             abortJob(Collections.singletonList(e), NoOpCallback.INSTANCE);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/IJobManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/IJobManager.java
index cda3037..a9ddee3 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/IJobManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/IJobManager.java
@@ -125,9 +125,4 @@
      * @return the maximum number of jobs to queue before rejecting new jobs
      */
     int getJobQueueCapacity();
-
-    /**
-     * Clears all queued jobs
-     */
-    void clearJobQueue();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobManager.java
index fa22dd3..b728e73 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobManager.java
@@ -29,8 +29,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -48,6 +46,9 @@
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.control.common.work.IResultCallback;
 import org.apache.hyracks.control.common.work.NoOpCallback;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -55,7 +56,7 @@
 // Job manager manages all jobs that haven been submitted to the cluster.
 public class JobManager implements IJobManager {
 
-    private static final Logger LOGGER = Logger.getLogger(JobManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
     private final Map<JobId, JobRun> activeRunMap;
@@ -74,8 +75,8 @@
             jobQueue = (IJobQueue) jobQueueConstructor.newInstance(this, this.jobCapacityController);
         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException
                 | InvocationTargetException e) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.log(Level.WARNING, "class " + ccConfig.getJobQueueClass() + " could not be used: ", e);
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.log(Level.WARN, "class " + ccConfig.getJobQueueClass() + " could not be used: ", e);
             }
             // Falls back to the default implementation if the user-provided class name is not valid.
             jobQueue = new FIFOJobQueue(this, jobCapacityController);
@@ -106,6 +107,8 @@
         checkJob(jobRun);
         JobSpecification job = jobRun.getJobSpecification();
         IJobCapacityController.JobSubmissionStatus status = jobCapacityController.allocate(job);
+        CCServiceContext serviceCtx = ccs.getContext();
+        serviceCtx.notifyJobCreation(jobRun.getJobId(), job);
         switch (status) {
             case QUEUE:
                 queueJob(jobRun);
@@ -142,6 +145,7 @@
 
     @Override
     public void prepareComplete(JobRun run, JobStatus status, List<Exception> exceptions) throws HyracksException {
+        ccs.removeJobParameterByteStore(run.getJobId());
         checkJob(run);
         if (status == JobStatus.FAILURE_BEFORE_EXECUTION) {
             run.setPendingStatus(JobStatus.FAILURE, exceptions);
@@ -155,7 +159,7 @@
             return;
         }
         if (run.getPendingStatus() != null) {
-            LOGGER.warning("Ignoring duplicate cleanup for JobRun with id: " + jobId);
+            LOGGER.warn("Ignoring duplicate cleanup for JobRun with id: " + jobId);
             return;
         }
         Set<String> targetNodes = run.getParticipatingNodeIds();
@@ -176,7 +180,7 @@
                         ncs.getNodeController().cleanUpJoblet(jobId, status);
                     }
                 } catch (Exception e) {
-                    LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    LOGGER.log(Level.ERROR, e.getMessage(), e);
                     if (caughtException == null) {
                         caughtException = HyracksException.create(e);
                     } else {
@@ -209,7 +213,7 @@
             try {
                 serviceCtx.notifyJobFinish(jobId, run.getPendingStatus(), run.getPendingExceptions());
             } catch (HyracksException e) {
-                LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                LOGGER.log(Level.ERROR, e.getMessage(), e);
                 caughtException = e;
             }
         }
@@ -226,7 +230,7 @@
             try {
                 ccs.getJobLogFile().log(createJobLogObject(run));
             } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                LOGGER.log(Level.ERROR, e.getMessage(), e);
                 if (caughtException == null) {
                     caughtException = new HyracksException(e);
                 } else {
@@ -286,11 +290,6 @@
         return ccs.getCCConfig().getJobQueueCapacity();
     }
 
-    @Override
-    public void clearJobQueue() {
-        jobQueue.clear();
-    }
-
     private void pickJobsToRun() throws HyracksException {
         List<JobRun> selectedRuns = jobQueue.pull();
         for (JobRun run : selectedRuns) {
@@ -303,12 +302,6 @@
         run.setStartTime(System.currentTimeMillis());
         JobId jobId = run.getJobId();
         activeRunMap.put(jobId, run);
-
-        CCServiceContext serviceCtx = ccs.getContext();
-        JobSpecification spec = run.getJobSpecification();
-        if (!run.getExecutor().isPredistributed()) {
-            serviceCtx.notifyJobCreation(jobId, spec);
-        }
         run.setStatus(JobStatus.RUNNING, null);
         executeJobInternal(run);
     }
@@ -323,7 +316,7 @@
         try {
             run.getExecutor().startJob();
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Aborting " + run.getJobId() + " due to failure during job start", e);
+            LOGGER.log(Level.ERROR, "Aborting " + run.getJobId() + " due to failure during job start", e);
             final List<Exception> exceptions = Collections.singletonList(e);
             // fail the job then abort it
             run.setStatus(JobStatus.FAILURE, exceptions);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobRun.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobRun.java
index ef0bca2..fa08420 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobRun.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/job/JobRun.java
@@ -37,6 +37,7 @@
 import org.apache.hyracks.api.job.ActivityCluster;
 import org.apache.hyracks.api.job.ActivityClusterGraph;
 import org.apache.hyracks.api.job.ActivityClusterId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.IActivityClusterGraphGenerator;
 import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
 import org.apache.hyracks.api.job.JobFlag;
@@ -45,7 +46,7 @@
 import org.apache.hyracks.api.job.JobStatus;
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.hyracks.control.cc.PreDistributedJobStore.PreDistributedJobDescriptor;
+import org.apache.hyracks.control.cc.DeployedJobSpecStore.DeployedJobSpecDescriptor;
 import org.apache.hyracks.control.cc.executor.ActivityPartitionDetails;
 import org.apache.hyracks.control.cc.executor.JobExecutor;
 import org.apache.hyracks.control.cc.partitions.PartitionMatchMaker;
@@ -97,8 +98,8 @@
 
     private Map<OperatorDescriptorId, Map<Integer, String>> operatorLocations;
 
-    private JobRun(DeploymentId deploymentId, JobId jobId, Set<JobFlag> jobFlags,
-            JobSpecification spec, ActivityClusterGraph acg) {
+    private JobRun(DeploymentId deploymentId, JobId jobId, Set<JobFlag> jobFlags, JobSpecification spec,
+            ActivityClusterGraph acg) {
         this.deploymentId = deploymentId;
         this.jobId = jobId;
         this.jobFlags = jobFlags;
@@ -114,21 +115,22 @@
         createTime = System.currentTimeMillis();
     }
 
-    //Run a Pre-distributed job by passing the JobId
+    //Run a deployed job spec
     public JobRun(ClusterControllerService ccs, DeploymentId deploymentId, JobId jobId, Set<JobFlag> jobFlags,
-            PreDistributedJobDescriptor distributedJobDescriptor)
-            throws HyracksException {
-        this(deploymentId, jobId, jobFlags,
-                distributedJobDescriptor.getJobSpecification(), distributedJobDescriptor.getActivityClusterGraph());
-        Set<Constraint> constaints = distributedJobDescriptor.getActivityClusterGraphConstraints();
-        this.scheduler = new JobExecutor(ccs, this, constaints, true);
+            DeployedJobSpecDescriptor deployedJobSpecDescriptor, Map<byte[], byte[]> jobParameters,
+            DeployedJobSpecId deployedJobSpecId) throws HyracksException {
+        this(deploymentId, jobId, jobFlags, deployedJobSpecDescriptor.getJobSpecification(),
+                deployedJobSpecDescriptor.getActivityClusterGraph());
+        ccs.createOrGetJobParameterByteStore(jobId).setParameters(jobParameters);
+        Set<Constraint> constaints = deployedJobSpecDescriptor.getActivityClusterGraphConstraints();
+        this.scheduler = new JobExecutor(ccs, this, constaints, deployedJobSpecId);
     }
 
     //Run a new job by creating an ActivityClusterGraph
     public JobRun(ClusterControllerService ccs, DeploymentId deploymentId, JobId jobId,
             IActivityClusterGraphGeneratorFactory acggf, IActivityClusterGraphGenerator acgg, Set<JobFlag> jobFlags) {
         this(deploymentId, jobId, jobFlags, acggf.getJobSpecification(), acgg.initialize());
-        this.scheduler = new JobExecutor(ccs, this, acgg.getConstraints(), false);
+        this.scheduler = new JobExecutor(ccs, this, acgg.getConstraints(), null);
     }
 
     public DeploymentId getDeploymentId() {
@@ -249,7 +251,7 @@
         return connectorPolicyMap;
     }
 
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode result = om.createObjectNode();
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/partitions/PartitionMatchMaker.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/partitions/PartitionMatchMaker.java
index 3a5e3be..6f5c5ad 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/partitions/PartitionMatchMaker.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/partitions/PartitionMatchMaker.java
@@ -25,7 +25,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
@@ -33,9 +32,11 @@
 import org.apache.hyracks.control.common.job.PartitionDescriptor;
 import org.apache.hyracks.control.common.job.PartitionRequest;
 import org.apache.hyracks.control.common.job.PartitionState;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class PartitionMatchMaker {
-    private static final Logger LOGGER = Logger.getLogger(PartitionMatchMaker.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final Map<PartitionId, List<PartitionDescriptor>> partitionDescriptors;
 
@@ -48,7 +49,8 @@
 
     public List<Pair<PartitionDescriptor, PartitionRequest>> registerPartitionDescriptor(
             PartitionDescriptor partitionDescriptor) {
-        List<Pair<PartitionDescriptor, PartitionRequest>> matches = new ArrayList<Pair<PartitionDescriptor, PartitionRequest>>();
+        List<Pair<PartitionDescriptor, PartitionRequest>> matches =
+                new ArrayList<Pair<PartitionDescriptor, PartitionRequest>>();
         PartitionId pid = partitionDescriptor.getPartitionId();
         boolean matched = false;
         List<PartitionRequest> requests = partitionRequests.get(pid);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/scheduler/FIFOJobQueue.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/scheduler/FIFOJobQueue.java
index da13091..2a6bdae 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/scheduler/FIFOJobQueue.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/scheduler/FIFOJobQueue.java
@@ -26,8 +26,6 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -39,6 +37,9 @@
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.util.annotations.NotThreadSafe;
 import org.apache.hyracks.util.annotations.ThreadSafetyGuaranteedBy;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * An implementation of IJobQueue that gives more priority to jobs that are submitted earlier.
@@ -47,7 +48,7 @@
 @ThreadSafetyGuaranteedBy("JobManager")
 public class FIFOJobQueue implements IJobQueue {
 
-    private static final Logger LOGGER = Logger.getLogger(FIFOJobQueue.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final Map<JobId, JobRun> jobListMap = new LinkedHashMap<>();
     private final IJobManager jobManager;
@@ -104,7 +105,7 @@
                     // Fails the job.
                     jobManager.prepareComplete(run, JobStatus.FAILURE_BEFORE_EXECUTION, exceptions);
                 } catch (HyracksException e) {
-                    LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    LOGGER.log(Level.ERROR, e.getMessage(), e);
                 }
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/ApplicationInstallationHandler.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/ApplicationInstallationHandler.java
index 2b0382b..f400978 100755
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/ApplicationInstallationHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/ApplicationInstallationHandler.java
@@ -24,8 +24,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -35,6 +33,9 @@
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.handler.codec.http.HttpMethod;
@@ -42,7 +43,7 @@
 
 public class ApplicationInstallationHandler extends AbstractServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(ApplicationInstallationHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private ClusterControllerService ccs;
 
@@ -81,7 +82,7 @@
                 response.setStatus(HttpResponseStatus.METHOD_NOT_ALLOWED);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Unhandled exception ", e);
+            LOGGER.log(Level.WARN, "Unhandled exception ", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StartNodeApiServlet.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StartNodeApiServlet.java
new file mode 100644
index 0000000..4fd69ad
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/StartNodeApiServlet.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.cc.web;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.http.api.IServletRequest;
+import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.hyracks.http.server.AbstractServlet;
+
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.concurrent.ConcurrentMap;
+
+public class StartNodeApiServlet extends AbstractServlet {
+    private ClusterControllerService ccs;
+
+    public StartNodeApiServlet(ConcurrentMap<String, Object> ctx, String[] paths, ClusterControllerService ccs) {
+        super(ctx, paths);
+        this.ccs = ccs;
+    }
+
+    @Override
+    protected void post(IServletRequest request, IServletResponse response) {
+        String nodeId = request.getParameter("node");
+        response.setStatus(HttpResponseStatus.OK);
+        ObjectMapper om = new ObjectMapper();
+        ObjectNode jsonObject = om.createObjectNode();
+        jsonObject.put("date", new Date().toString());
+        jsonObject.put("status", ccs.startNC(nodeId));
+        final PrintWriter writer = response.writer();
+        writer.print(jsonObject.toString());
+        writer.close();
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/WebServer.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/WebServer.java
index f79a178..f413fe5 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/WebServer.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/WebServer.java
@@ -49,6 +49,7 @@
         addJSONHandler("/rest/jobs/*", new JobsRESTAPIFunction(ccs));
         addJSONHandler("/rest/nodes/*", new NodesRESTAPIFunction(ccs));
         addJSONHandler("/rest/statedump", new StateDumpRESTAPIFunction(ccs));
+        server.addServlet(new StartNodeApiServlet(ctx, new String[] { "/rest/startnode" }, ccs));
         server.addServlet(new StaticResourceServlet(ctx, new String[] { "/static/*" }));
         server.addServlet(new ApplicationInstallationHandler(ctx, new String[] { "/applications/*" }, ccs));
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
index b39915f..479004d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestHandler.java
@@ -20,13 +20,14 @@
 
 import java.io.IOException;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -35,7 +36,7 @@
 
 public class JSONOutputRequestHandler extends AbstractServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(JSONOutputRequestHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final IJSONOutputFunction fn;
 
     public JSONOutputRequestHandler(ConcurrentMap<String, Object> ctx, String[] paths, IJSONOutputFunction fn) {
@@ -63,7 +64,7 @@
         try {
             return fn.invoke(host, servletPath, parts);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception invoking " + fn.getClass().getName(), e);
+            LOGGER.log(Level.WARN, "Exception invoking " + fn.getClass().getName(), e);
             response.setStatus(HttpResponseStatus.BAD_REQUEST);
             response.writer().print(e.getMessage());
         }
@@ -77,7 +78,7 @@
             om.writer().writeValue(response.writer(), result);
             response.setStatus(HttpResponseStatus.OK);
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Exception delivering result in " + getClass().getName(), e);
+            LOGGER.log(Level.WARN, "Exception delivering result in " + getClass().getName(), e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
             response.writer().print(e.getMessage());
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
index 69f0571..9430c0d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/web/util/JSONOutputRequestUtil.java
@@ -23,7 +23,8 @@
 
 public class JSONOutputRequestUtil {
 
-    private JSONOutputRequestUtil() {}
+    private JSONOutputRequestUtil() {
+    }
 
     public static URI uri(String host, String prefix, String path) throws URISyntaxException {
         String name = host;
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/AbstractTaskLifecycleWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/AbstractTaskLifecycleWork.java
index 3babf00..d0c6567 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/AbstractTaskLifecycleWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/AbstractTaskLifecycleWork.java
@@ -58,8 +58,8 @@
             Map<ActivityId, ActivityCluster> activityClusterMap = run.getActivityClusterGraph().getActivityMap();
             ActivityCluster ac = activityClusterMap.get(tid.getActivityId());
             if (ac != null) {
-                Map<ActivityId, ActivityPlan> taskStateMap = run.getActivityClusterPlanMap().get(ac.getId())
-                        .getActivityPlanMap();
+                Map<ActivityId, ActivityPlan> taskStateMap =
+                        run.getActivityClusterPlanMap().get(ac.getId()).getActivityPlanMap();
                 Task[] taskStates = taskStateMap.get(tid.getActivityId()).getTasks();
                 if (taskStates != null && taskStates.length > tid.getPartition()) {
                     Task ts = taskStates[tid.getPartition()];
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ApplicationMessageWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ApplicationMessageWork.java
index 341834c..392046d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ApplicationMessageWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ApplicationMessageWork.java
@@ -18,21 +18,21 @@
  */
 package org.apache.hyracks.control.cc.work;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.application.ICCServiceContext;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.api.messages.IMessage;
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.deployment.DeploymentUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * @author rico
  */
 public class ApplicationMessageWork extends AbstractHeartbeatWork {
 
-    private static final Logger LOGGER = Logger.getLogger(ApplicationMessageWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private byte[] message;
     private DeploymentId deploymentId;
     private String nodeId;
@@ -63,7 +63,7 @@
                 }
             });
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Error in stats reporting", e);
+            LOGGER.log(Level.WARN, "Error in stats reporting", e);
             throw new RuntimeException(e);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/CliDeployBinaryWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/CliDeployBinaryWork.java
index c0ecffb..4962607 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/CliDeployBinaryWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/CliDeployBinaryWork.java
@@ -65,8 +65,8 @@
             /**
              * Deploy for the cluster controller
              */
-            DeploymentUtils.deploy(deploymentId, binaryURLs, ccs.getContext()
-                    .getJobSerializerDeserializerContainer(), ccs.getServerContext(), false);
+            DeploymentUtils.deploy(deploymentId, binaryURLs, ccs.getContext().getJobSerializerDeserializerContainer(),
+                    ccs.getServerContext(), false);
 
             /**
              * Deploy for the node controllers
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ClusterShutdownWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ClusterShutdownWork.java
index 613efad..a7c3c2f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ClusterShutdownWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ClusterShutdownWork.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.control.cc.work;
 
 import java.util.Collection;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.cc.NodeControllerState;
@@ -31,16 +29,19 @@
 import org.apache.hyracks.control.common.work.SynchronizableWork;
 import org.apache.hyracks.ipc.exceptions.IPCException;
 import org.apache.hyracks.util.ExitUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ClusterShutdownWork extends SynchronizableWork {
-    private static final Logger LOGGER = Logger.getLogger(ClusterShutdownWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
     private final boolean terminateNCService;
     private final IResultCallback<Boolean> callback;
 
     public ClusterShutdownWork(ClusterControllerService ncs, boolean terminateNCService,
-                               IResultCallback<Boolean> callback) {
+            IResultCallback<Boolean> callback) {
         this.ccs = ncs;
         this.terminateNCService = terminateNCService;
         this.callback = callback;
@@ -76,8 +77,8 @@
                         /*
                          * best effort - just exit, user will have to kill misbehaving NCs
                          */
-                        LOGGER.severe("Clean shutdown of NCs timed out- giving up; unresponsive nodes: " +
-                                shutdownStatus.getRemainingNodes());
+                        LOGGER.error("Clean shutdown of NCs timed out- giving up; unresponsive nodes: "
+                                + shutdownStatus.getRemainingNodes());
                     }
                     callback.setValue(cleanShutdown);
                     ccs.stop(terminateNCService);
@@ -96,8 +97,8 @@
             LOGGER.info("Notifying NC " + nodeId + " to shutdown...");
             ncState.getNodeController().shutdown(terminateNCService);
         } catch (Exception e) {
-            LOGGER.log(Level.INFO,
-                    "Exception shutting down NC " + nodeId + " (possibly dead?), continuing shutdown...", e);
+            LOGGER.log(Level.INFO, "Exception shutting down NC " + nodeId + " (possibly dead?), continuing shutdown...",
+                    e);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployJobSpecWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployJobSpecWork.java
new file mode 100644
index 0000000..c51f3c5
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployJobSpecWork.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.cc.work;
+
+import java.util.EnumSet;
+
+import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.IActivityClusterGraphGenerator;
+import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
+import org.apache.hyracks.api.job.JobFlag;
+import org.apache.hyracks.api.util.JavaSerializationUtils;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.control.cc.NodeControllerState;
+import org.apache.hyracks.control.cc.application.CCServiceContext;
+import org.apache.hyracks.control.cc.cluster.INodeManager;
+import org.apache.hyracks.control.common.deployment.DeploymentUtils;
+import org.apache.hyracks.control.common.work.IResultCallback;
+import org.apache.hyracks.control.common.work.SynchronizableWork;
+
+public class DeployJobSpecWork extends SynchronizableWork {
+    private final ClusterControllerService ccs;
+    private final byte[] acggfBytes;
+    private final DeployedJobSpecId deployedJobSpecId;
+    private final IResultCallback<DeployedJobSpecId> callback;
+
+    public DeployJobSpecWork(ClusterControllerService ccs, byte[] acggfBytes, DeployedJobSpecId deployedJobSpecId,
+            IResultCallback<DeployedJobSpecId> callback) {
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.ccs = ccs;
+        this.acggfBytes = acggfBytes;
+        this.callback = callback;
+    }
+
+    @Override
+    protected void doRun() throws Exception {
+        try {
+            final CCServiceContext ccServiceCtx = ccs.getContext();
+            ccs.getDeployedJobSpecStore().checkForExistingDeployedJobSpecDescriptor(deployedJobSpecId);
+            IActivityClusterGraphGeneratorFactory acggf =
+                    (IActivityClusterGraphGeneratorFactory) DeploymentUtils.deserialize(acggfBytes, null, ccServiceCtx);
+            IActivityClusterGraphGenerator acgg =
+                    acggf.createActivityClusterGraphGenerator(ccServiceCtx, EnumSet.noneOf(JobFlag.class));
+            ActivityClusterGraph acg = acgg.initialize();
+            ccs.getDeployedJobSpecStore().addDeployedJobSpecDescriptor(deployedJobSpecId, acg,
+                    acggf.getJobSpecification(), acgg.getConstraints());
+
+            byte[] acgBytes = JavaSerializationUtils.serialize(acg);
+
+            INodeManager nodeManager = ccs.getNodeManager();
+            for (NodeControllerState node : nodeManager.getAllNodeControllerStates()) {
+                node.getNodeController().deployJobSpec(deployedJobSpecId, acgBytes);
+            }
+            callback.setValue(deployedJobSpecId);
+        } catch (Exception e) {
+            callback.setException(e);
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployedJobFailureWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployedJobFailureWork.java
new file mode 100644
index 0000000..8afdf42
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DeployedJobFailureWork.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.cc.work;
+
+import org.apache.hyracks.api.exceptions.ErrorCode;
+import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.control.common.work.SynchronizableWork;
+
+public class DeployedJobFailureWork extends SynchronizableWork {
+    protected final DeployedJobSpecId deployedJobSpecId;
+    protected final String nodeId;
+
+    public DeployedJobFailureWork(DeployedJobSpecId deployedJobSpecId, String nodeId) {
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.nodeId = nodeId;
+    }
+
+    @Override
+    public void doRun() throws HyracksException {
+        throw HyracksException.create(ErrorCode.DEPLOYED_JOB_FAILURE, deployedJobSpecId, nodeId);
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DestroyJobWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DestroyJobWork.java
deleted file mode 100644
index df98252..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DestroyJobWork.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.cc.work;
-
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.hyracks.control.cc.NodeControllerState;
-import org.apache.hyracks.control.cc.cluster.INodeManager;
-import org.apache.hyracks.control.common.work.IResultCallback;
-import org.apache.hyracks.control.common.work.SynchronizableWork;
-
-public class DestroyJobWork extends SynchronizableWork {
-    private final ClusterControllerService ccs;
-    private final JobId jobId;
-    private final IResultCallback<JobId> callback;
-
-    public DestroyJobWork(ClusterControllerService ccs, JobId jobId, IResultCallback<JobId> callback) {
-        this.jobId = jobId;
-        this.ccs = ccs;
-        this.callback = callback;
-    }
-
-    @Override
-    protected void doRun() throws Exception {
-        try {
-            ccs.getPreDistributedJobStore().removeDistributedJobDescriptor(jobId);
-            INodeManager nodeManager = ccs.getNodeManager();
-            for (NodeControllerState node : nodeManager.getAllNodeControllerStates()) {
-                node.getNodeController().destroyJob(jobId);
-            }
-            callback.setValue(jobId);
-        } catch (Exception e) {
-            callback.setException(e);
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributeJobWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributeJobWork.java
deleted file mode 100644
index 5a57b1b..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributeJobWork.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.cc.work;
-
-import java.util.EnumSet;
-
-import org.apache.hyracks.api.job.ActivityClusterGraph;
-import org.apache.hyracks.api.job.IActivityClusterGraphGenerator;
-import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
-import org.apache.hyracks.api.job.JobFlag;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.api.job.JobIdFactory;
-import org.apache.hyracks.api.util.JavaSerializationUtils;
-import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.hyracks.control.cc.NodeControllerState;
-import org.apache.hyracks.control.cc.application.CCServiceContext;
-import org.apache.hyracks.control.cc.cluster.INodeManager;
-import org.apache.hyracks.control.common.deployment.DeploymentUtils;
-import org.apache.hyracks.control.common.work.IResultCallback;
-import org.apache.hyracks.control.common.work.SynchronizableWork;
-
-public class DistributeJobWork extends SynchronizableWork {
-    private final ClusterControllerService ccs;
-    private final byte[] acggfBytes;
-    private final JobIdFactory jobIdFactory;
-    private final IResultCallback<JobId> callback;
-
-    public DistributeJobWork(ClusterControllerService ccs, byte[] acggfBytes, JobIdFactory jobIdFactory,
-            IResultCallback<JobId> callback) {
-        this.jobIdFactory = jobIdFactory;
-        this.ccs = ccs;
-        this.acggfBytes = acggfBytes;
-        this.callback = callback;
-    }
-
-    @Override
-    protected void doRun() throws Exception {
-        try {
-            JobId jobId = jobIdFactory.create();
-            final CCServiceContext ccServiceCtx = ccs.getContext();
-            ccs.getPreDistributedJobStore().checkForExistingDistributedJobDescriptor(jobId);
-            IActivityClusterGraphGeneratorFactory acggf =
-                    (IActivityClusterGraphGeneratorFactory) DeploymentUtils.deserialize(acggfBytes, null, ccServiceCtx);
-            IActivityClusterGraphGenerator acgg =
-                    acggf.createActivityClusterGraphGenerator(jobId, ccServiceCtx, EnumSet.noneOf(JobFlag.class));
-            ActivityClusterGraph acg = acgg.initialize();
-            ccs.getPreDistributedJobStore().addDistributedJobDescriptor(jobId, acg, acggf.getJobSpecification(),
-                    acgg.getConstraints());
-
-            ccServiceCtx.notifyJobCreation(jobId, acggf.getJobSpecification());
-
-            byte[] acgBytes = JavaSerializationUtils.serialize(acg);
-
-            INodeManager nodeManager = ccs.getNodeManager();
-            for (NodeControllerState node : nodeManager.getAllNodeControllerStates()) {
-                node.getNodeController().distributeJob(jobId, acgBytes);
-            }
-
-            callback.setValue(jobId);
-        } catch (Exception e) {
-            callback.setException(e);
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributedJobFailureWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributedJobFailureWork.java
deleted file mode 100644
index f7fa2a4..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/DistributedJobFailureWork.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.cc.work;
-
-import org.apache.hyracks.api.exceptions.ErrorCode;
-import org.apache.hyracks.api.exceptions.HyracksException;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.control.common.work.SynchronizableWork;
-
-public class DistributedJobFailureWork extends SynchronizableWork {
-    protected final JobId jobId;
-    protected final String nodeId;
-
-    public DistributedJobFailureWork(JobId jobId, String nodeId) {
-        this.jobId = jobId;
-        this.nodeId = nodeId;
-    }
-
-    @Override
-    public void doRun() throws HyracksException {
-        throw HyracksException.create(ErrorCode.DISTRIBUTED_JOB_FAILURE, jobId, nodeId);
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobInfoWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobInfoWork.java
index 8fe6470..009e445 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobInfoWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobInfoWork.java
@@ -40,8 +40,8 @@
     protected void doRun() throws Exception {
         try {
             JobRun run = jobManager.get(jobId);
-            JobInfo info = (run != null) ? new JobInfo(run.getJobId(), run.getStatus(), run.getOperatorLocations())
-                    : null;
+            JobInfo info =
+                    (run != null) ? new JobInfo(run.getJobId(), run.getStatus(), run.getOperatorLocations()) : null;
             callback.setValue(info);
         } catch (Exception e) {
             callback.setException(e);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobSummariesJSONWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobSummariesJSONWork.java
index 9c680c3..ccd8286 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobSummariesJSONWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetJobSummariesJSONWork.java
@@ -46,7 +46,7 @@
         populateJSON(jobManager.getArchivedJobs());
     }
 
-    private void populateJSON(Collection<JobRun> jobRuns)  {
+    private void populateJSON(Collection<JobRun> jobRuns) {
         ObjectMapper om = new ObjectMapper();
         for (JobRun run : jobRuns) {
             ObjectNode jo = om.createObjectNode();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetNodeDetailsJSONWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetNodeDetailsJSONWork.java
index 6433223..517f56f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetNodeDetailsJSONWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetNodeDetailsJSONWork.java
@@ -44,8 +44,8 @@
 import org.apache.hyracks.control.common.work.SynchronizableWork;
 
 public class GetNodeDetailsJSONWork extends SynchronizableWork {
-    private static final Section [] CC_SECTIONS = { Section.CC, Section.COMMON };
-    private static final Section [] NC_SECTIONS = { Section.NC, Section.COMMON };
+    private static final Section[] CC_SECTIONS = { Section.CC, Section.COMMON };
+    private static final Section[] NC_SECTIONS = { Section.NC, Section.COMMON };
 
     private final INodeManager nodeManager;
     private final CCConfig ccConfig;
@@ -153,7 +153,6 @@
         return o;
     }
 
-
     public ObjectNode getDetail() {
         return detail;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
index 407f9cd..b064e52 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/GetThreadDumpWork.java
@@ -22,8 +22,6 @@
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.cc.NodeControllerState;
@@ -31,9 +29,12 @@
 import org.apache.hyracks.util.ThreadDumpUtil;
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.common.work.IResultCallback;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class GetThreadDumpWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(GetThreadDumpWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final int TIMEOUT_SECS = 60;
 
     private final ClusterControllerService ccs;
@@ -41,7 +42,6 @@
     private final IResultCallback<String> callback;
     private final ThreadDumpRun run;
 
-
     public GetThreadDumpWork(ClusterControllerService ccs, String nodeId, IResultCallback<String> callback) {
         this.ccs = ccs;
         this.nodeId = nodeId;
@@ -56,7 +56,7 @@
             try {
                 callback.setValue(ThreadDumpUtil.takeDumpJSONString());
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Exception taking CC thread dump", e);
+                LOGGER.log(Level.WARN, "Exception taking CC thread dump", e);
                 callback.setException(e);
             }
         } else {
@@ -82,8 +82,8 @@
                             Thread.sleep(sleepTime);
                         }
                         if (ccs.removeThreadDumpRun(run.getRequestId()) != null) {
-                            LOGGER.log(Level.WARNING, "Timed out thread dump request " + run.getRequestId()
-                                    + " for node " + nodeId);
+                            LOGGER.log(Level.WARN,
+                                    "Timed out thread dump request " + run.getRequestId() + " for node " + nodeId);
                             callback.setException(new TimeoutException("Thread dump request for node " + nodeId
                                     + " timed out after " + TIMEOUT_SECS + " seconds."));
                         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobCleanupWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobCleanupWork.java
index bb85c13..f847cdb 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobCleanupWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobCleanupWork.java
@@ -20,8 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.JobId;
@@ -30,9 +28,11 @@
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.common.work.IResultCallback;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class JobCleanupWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(JobCleanupWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private IJobManager jobManager;
     private JobId jobId;
@@ -51,7 +51,7 @@
 
     @Override
     public void run() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Cleanup for JobRun with id: " + jobId);
         }
         try {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobStartWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobStartWork.java
index ed82705..cfedfc9 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobStartWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobStartWork.java
@@ -18,9 +18,11 @@
  */
 package org.apache.hyracks.control.cc.work;
 
-import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.IActivityClusterGraphGenerator;
 import org.apache.hyracks.api.job.IActivityClusterGraphGeneratorFactory;
 import org.apache.hyracks.api.job.JobFlag;
@@ -37,20 +39,23 @@
 public class JobStartWork extends SynchronizableWork {
     private final ClusterControllerService ccs;
     private final byte[] acggfBytes;
-    private final EnumSet<JobFlag> jobFlags;
+    private final Set<JobFlag> jobFlags;
     private final DeploymentId deploymentId;
-    private final JobId preDistributedJobId;
     private final IResultCallback<JobId> callback;
     private final JobIdFactory jobIdFactory;
+    private final DeployedJobSpecId deployedJobSpecId;
+    private final Map<byte[], byte[]> jobParameters;
 
     public JobStartWork(ClusterControllerService ccs, DeploymentId deploymentId, byte[] acggfBytes,
-            EnumSet<JobFlag> jobFlags, JobId jobId, IResultCallback<JobId> callback, JobIdFactory jobIdFactory) {
+            Set<JobFlag> jobFlags, JobIdFactory jobIdFactory, Map<byte[], byte[]> jobParameters,
+            IResultCallback<JobId> callback, DeployedJobSpecId deployedJobSpecId) {
         this.deploymentId = deploymentId;
-        this.preDistributedJobId = jobId;
         this.ccs = ccs;
         this.acggfBytes = acggfBytes;
         this.jobFlags = jobFlags;
         this.callback = callback;
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.jobParameters = jobParameters;
         this.jobIdFactory = jobIdFactory;
     }
 
@@ -61,19 +66,18 @@
             final CCServiceContext ccServiceCtx = ccs.getContext();
             JobId jobId;
             JobRun run;
-            if (preDistributedJobId == null) {
-                jobId = jobIdFactory.create();
+            jobId = jobIdFactory.create();
+            if (deployedJobSpecId == null) {
                 //Need to create the ActivityClusterGraph
                 IActivityClusterGraphGeneratorFactory acggf = (IActivityClusterGraphGeneratorFactory) DeploymentUtils
                         .deserialize(acggfBytes, deploymentId, ccServiceCtx);
-                IActivityClusterGraphGenerator acgg =
-                        acggf.createActivityClusterGraphGenerator(jobId, ccServiceCtx, jobFlags);
+                IActivityClusterGraphGenerator acgg = acggf.createActivityClusterGraphGenerator(ccServiceCtx, jobFlags);
                 run = new JobRun(ccs, deploymentId, jobId, acggf, acgg, jobFlags);
             } else {
-                jobId = preDistributedJobId;
                 //ActivityClusterGraph has already been distributed
                 run = new JobRun(ccs, deploymentId, jobId, jobFlags,
-                        ccs.getPreDistributedJobStore().getDistributedJobDescriptor(jobId));
+                        ccs.getDeployedJobSpecStore().getDeployedJobSpecDescriptor(deployedJobSpecId), jobParameters,
+                        deployedJobSpecId);
             }
             jobManager.add(run);
             callback.setValue(jobId);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobletCleanupNotificationWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobletCleanupNotificationWork.java
index 337e88f..cc37f9c 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobletCleanupNotificationWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/JobletCleanupNotificationWork.java
@@ -21,8 +21,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.JobId;
@@ -32,9 +30,12 @@
 import org.apache.hyracks.control.cc.cluster.INodeManager;
 import org.apache.hyracks.control.cc.job.IJobManager;
 import org.apache.hyracks.control.cc.job.JobRun;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class JobletCleanupNotificationWork extends AbstractHeartbeatWork {
-    private static final Logger LOGGER = Logger.getLogger(JobletCleanupNotificationWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private ClusterControllerService ccs;
     private JobId jobId;
@@ -52,13 +53,13 @@
         IJobManager jobManager = ccs.getJobManager();
         final JobRun run = jobManager.get(jobId);
         if (run == null) {
-            LOGGER.log(Level.WARNING, () -> "ignoring unknown job " + jobId + " on notification from " + nodeId);
+            LOGGER.log(Level.WARN, () -> "ignoring unknown job " + jobId + " on notification from " + nodeId);
             return;
         }
         Set<String> cleanupPendingNodes = run.getCleanupPendingNodeIds();
         if (!cleanupPendingNodes.remove(nodeId)) {
-            LOGGER.log(Level.WARNING, () -> nodeId + " not in pending cleanup nodes set: " + cleanupPendingNodes +
-                    " for job " + jobId);
+            LOGGER.log(Level.WARN,
+                    () -> nodeId + " not in pending cleanup nodes set: " + cleanupPendingNodes + " for job " + jobId);
             return;
         }
         INodeManager nodeManager = ccs.getNodeManager();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
index 120f415..5c98035 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NodeHeartbeatWork.java
@@ -18,10 +18,9 @@
  */
 package org.apache.hyracks.control.cc.work;
 
-import java.util.logging.Level;
-
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.heartbeat.HeartbeatData;
+import org.apache.logging.log4j.Level;
 
 public class NodeHeartbeatWork extends AbstractHeartbeatWork {
 
@@ -36,6 +35,6 @@
 
     @Override
     public Level logLevel() {
-        return Level.FINEST;
+        return Level.TRACE;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyShutdownWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyShutdownWork.java
index 5119022..d9f37fa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyShutdownWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyShutdownWork.java
@@ -19,17 +19,17 @@
 
 package org.apache.hyracks.control.cc.work;
 
-import java.util.logging.Logger;
-
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.shutdown.ShutdownRun;
 import org.apache.hyracks.control.common.work.SynchronizableWork;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NotifyShutdownWork extends SynchronizableWork {
 
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ClusterControllerService ccs;
     private final String nodeId;
-    private static Logger LOGGER = Logger.getLogger(NotifyShutdownWork.class.getName());
 
     public NotifyShutdownWork(ClusterControllerService ccs, String nodeId) {
         this.ccs = ccs;
@@ -41,8 +41,12 @@
     public void doRun() {
         // Triggered remotely by a NC to notify that the NC is shutting down.
         ShutdownRun sRun = ccs.getShutdownRun();
-        LOGGER.info("Received shutdown acknowledgement from NC ID:" + nodeId);
-        sRun.notifyShutdown(nodeId);
+        if (sRun != null) {
+            LOGGER.info("Received shutdown acknowledgement from node " + nodeId);
+            sRun.notifyShutdown(nodeId);
+        } else {
+            LOGGER.info("Received unsolicted shutdown notification from node " + nodeId);
+        }
     }
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyThreadDumpResponse.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyThreadDumpResponse.java
index 2dae4b0..1cf443e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyThreadDumpResponse.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/NotifyThreadDumpResponse.java
@@ -18,13 +18,13 @@
  */
 package org.apache.hyracks.control.cc.work;
 
-import java.util.logging.Logger;
-
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NotifyThreadDumpResponse extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(NotifyThreadDumpResponse.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
 
@@ -39,10 +39,10 @@
 
     @Override
     public void run() {
-        LOGGER.fine("Delivering thread dump response: " + requestId);
+        LOGGER.debug("Delivering thread dump response: " + requestId);
         final GetThreadDumpWork.ThreadDumpRun threadDumpRun = ccs.removeThreadDumpRun(requestId);
         if (threadDumpRun == null) {
-            LOGGER.warning("Thread dump run " + requestId + " not found; discarding reply: " + threadDumpJSON);
+            LOGGER.warn("Thread dump run " + requestId + " not found; discarding reply: " + threadDumpJSON);
         } else {
             threadDumpRun.notifyThreadDumpReceived(threadDumpJSON);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterNodeWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterNodeWork.java
index d1d2208..96f5f1b 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterNodeWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterNodeWork.java
@@ -20,8 +20,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.config.IApplicationConfig;
 import org.apache.hyracks.api.config.IOption;
@@ -34,9 +32,12 @@
 import org.apache.hyracks.control.common.ipc.NodeControllerRemoteProxy;
 import org.apache.hyracks.control.common.work.SynchronizableWork;
 import org.apache.hyracks.ipc.api.IIPCHandle;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RegisterNodeWork extends SynchronizableWork {
-    private static final Logger LOGGER = Logger.getLogger(RegisterNodeWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
     private final NodeRegistration reg;
@@ -49,13 +50,14 @@
     @Override
     protected void doRun() throws Exception {
         String id = reg.getNodeId();
+        // TODO(mblow): it seems we should close IPC handles when we're done with them (like here)
         IIPCHandle ncIPCHandle = ccs.getClusterIPC().getHandle(reg.getNodeControllerAddress());
         CCNCFunctions.NodeRegistrationResult result;
         Map<IOption, Object> ncConfiguration = new HashMap<>();
         try {
-            LOGGER.log(Level.WARNING, "Registering INodeController: id = " + id);
-            NodeControllerRemoteProxy nc =
-                    new NodeControllerRemoteProxy(ccs.getClusterIPC(), reg.getNodeControllerAddress());
+            LOGGER.log(Level.WARN, "Registering INodeController: id = " + id);
+            NodeControllerRemoteProxy nc = new NodeControllerRemoteProxy(ccs.getCcId(),
+                    ccs.getClusterIPC().getReconnectingHandle(reg.getNodeControllerAddress()));
             NodeControllerState state = new NodeControllerState(nc, reg);
             INodeManager nodeManager = ccs.getNodeManager();
             nodeManager.addNode(id, state);
@@ -69,15 +71,15 @@
             params.setDistributedState(ccs.getContext().getDistributedState());
             params.setHeartbeatPeriod(ccs.getCCConfig().getHeartbeatPeriodMillis());
             params.setProfileDumpPeriod(ccs.getCCConfig().getProfileDumpPeriod());
+            params.setRegistrationId(reg.getRegistrationId());
             result = new CCNCFunctions.NodeRegistrationResult(params, null);
-            ccs.getJobIdFactory().ensureMinimumId(reg.getMaxJobId() + 1);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Node registration failed", e);
+            LOGGER.log(Level.WARN, "Node registration failed", e);
             result = new CCNCFunctions.NodeRegistrationResult(null, e);
         }
-        LOGGER.warning("sending registration response to node");
+        LOGGER.warn("sending registration response to node");
         ncIPCHandle.send(-1, result, null);
-        LOGGER.warning("notifying node join");
+        LOGGER.warn("notifying node join");
         ccs.getContext().notifyNodeJoin(id, ncConfiguration);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterPartitionAvailibilityWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterPartitionAvailibilityWork.java
index edc57fb..23a81af 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterPartitionAvailibilityWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterPartitionAvailibilityWork.java
@@ -49,8 +49,8 @@
             return;
         }
         PartitionMatchMaker pmm = run.getPartitionMatchMaker();
-        List<Pair<PartitionDescriptor, PartitionRequest>> matches = pmm
-                .registerPartitionDescriptor(partitionDescriptor);
+        List<Pair<PartitionDescriptor, PartitionRequest>> matches =
+                pmm.registerPartitionDescriptor(partitionDescriptor);
         for (Pair<PartitionDescriptor, PartitionRequest> match : matches) {
             try {
                 PartitionUtils.reportPartitionMatch(ccs, pid, match);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterResultPartitionLocationWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterResultPartitionLocationWork.java
index 7117b6f..ad36701 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterResultPartitionLocationWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RegisterResultPartitionLocationWork.java
@@ -20,8 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.dataset.ResultSetId;
@@ -31,10 +29,13 @@
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.common.work.NoOpCallback;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RegisterResultPartitionLocationWork extends AbstractWork {
 
-    private static final Logger LOGGER = Logger.getLogger(RegisterResultPartitionLocationWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
 
@@ -70,7 +71,7 @@
             ccs.getDatasetDirectoryService().registerResultPartitionLocation(jobId, rsId, orderedResult, emptyResult,
                     partition, nPartitions, networkAddress);
         } catch (HyracksDataException e) {
-            LOGGER.log(Level.WARNING, "Failed to register partition location", e);
+            LOGGER.log(Level.WARN, "Failed to register partition location", e);
             // Should fail the job if exists on cc, otherwise, do nothing
             JobRun jobRun = ccs.getJobManager().get(jobId);
             if (jobRun != null) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RemoveDeadNodesWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RemoveDeadNodesWork.java
index a162708..ee10669 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RemoveDeadNodesWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/RemoveDeadNodesWork.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.control.cc.work;
 
 import java.util.Collection;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -30,9 +28,12 @@
 import org.apache.hyracks.control.cc.job.IJobManager;
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RemoveDeadNodesWork extends AbstractWork {
-    private static Logger LOGGER = Logger.getLogger(RemoveDeadNodesWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
 
@@ -49,7 +50,7 @@
             Collection<JobId> affectedJobIds = result.getRight();
             int size = affectedJobIds.size();
             if (size > 0) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Number of affected jobs: " + size);
                 }
                 IJobManager jobManager = ccs.getJobManager();
@@ -64,12 +65,12 @@
                 ccs.getContext().notifyNodeFailure(deadNodes);
             }
         } catch (HyracksException e) {
-            LOGGER.log(Level.WARNING, "Uncaught exception on notifyNodeFailure", e);
+            LOGGER.log(Level.WARN, "Uncaught exception on notifyNodeFailure", e);
         }
     }
 
     @Override
     public Level logLevel() {
-        return Level.FINE;
+        return Level.DEBUG;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ReportProfilesWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ReportProfilesWork.java
index 02806a0..e5e6f43 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ReportProfilesWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ReportProfilesWork.java
@@ -20,12 +20,12 @@
 package org.apache.hyracks.control.cc.work;
 
 import java.util.List;
-import java.util.logging.Level;
 
 import org.apache.hyracks.control.cc.job.IJobManager;
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.control.common.job.profiling.om.JobProfile;
 import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.logging.log4j.Level;
 
 public class ReportProfilesWork extends AbstractWork {
     private final IJobManager jobManager;
@@ -49,6 +49,6 @@
 
     @Override
     public Level logLevel() {
-        return Level.FINEST;
+        return Level.TRACE;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ShutdownNCServiceWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ShutdownNCServiceWork.java
index dfc22b1..ad8882d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ShutdownNCServiceWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/ShutdownNCServiceWork.java
@@ -23,11 +23,12 @@
 import java.io.IOException;
 import java.io.ObjectOutputStream;
 import java.net.Socket;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.control.common.controllers.ServiceConstants.ServiceCommand;
 import org.apache.hyracks.control.common.work.SynchronizableWork;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A work which is run at CC shutdown for each NC specified in the configuration file.
@@ -35,7 +36,7 @@
  */
 public class ShutdownNCServiceWork extends SynchronizableWork {
 
-    private static final Logger LOGGER = Logger.getLogger(ShutdownNCServiceWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final String ncHost;
     private final int ncPort;
@@ -46,6 +47,7 @@
         this.ncPort = ncPort;
         this.ncId = ncId;
     }
+
     @Override
     public final void doRun() {
         LOGGER.info("Connecting to NC service '" + ncId + "' at " + ncHost + ":" + ncPort);
@@ -55,7 +57,7 @@
             oos.writeUTF(ServiceCommand.TERMINATE.name());
             oos.close();
         } catch (IOException e) {
-            LOGGER.log(Level.WARNING, "Failed to contact NC service '" + ncId + "' at " + ncHost + ":" + ncPort, e);
+            LOGGER.log(Level.WARN, "Failed to contact NC service '" + ncId + "' at " + ncHost + ":" + ncPort, e);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskCompleteWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskCompleteWork.java
index f4f2f52..e2f8b0d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskCompleteWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskCompleteWork.java
@@ -21,7 +21,6 @@
 import java.util.Map;
 
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
-import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.cc.job.IJobManager;
@@ -42,23 +41,19 @@
 
     @Override
     protected void performEvent(TaskAttempt ta) {
-        try {
-            IJobManager jobManager = ccs.getJobManager();
-            JobRun run = jobManager.get(jobId);
-            if (statistics != null) {
-                JobProfile jobProfile = run.getJobProfile();
-                Map<String, JobletProfile> jobletProfiles = jobProfile.getJobletProfiles();
-                JobletProfile jobletProfile = jobletProfiles.get(nodeId);
-                if (jobletProfile == null) {
-                    jobletProfile = new JobletProfile(nodeId);
-                    jobletProfiles.put(nodeId, jobletProfile);
-                }
-                jobletProfile.getTaskProfiles().put(taId, statistics);
+        IJobManager jobManager = ccs.getJobManager();
+        JobRun run = jobManager.get(jobId);
+        if (statistics != null) {
+            JobProfile jobProfile = run.getJobProfile();
+            Map<String, JobletProfile> jobletProfiles = jobProfile.getJobletProfiles();
+            JobletProfile jobletProfile = jobletProfiles.get(nodeId);
+            if (jobletProfile == null) {
+                jobletProfile = new JobletProfile(nodeId);
+                jobletProfiles.put(nodeId, jobletProfile);
             }
-            run.getExecutor().notifyTaskComplete(ta);
-        } catch (HyracksException e) {
-            e.printStackTrace();
+            jobletProfile.getTaskProfiles().put(taId, statistics);
         }
+        run.getExecutor().notifyTaskComplete(ta);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskFailureWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskFailureWork.java
index 8f50087..a2be15c 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskFailureWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TaskFailureWork.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.control.cc.work;
 
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.job.JobId;
@@ -28,9 +26,12 @@
 import org.apache.hyracks.control.cc.job.IJobManager;
 import org.apache.hyracks.control.cc.job.JobRun;
 import org.apache.hyracks.control.cc.job.TaskAttempt;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TaskFailureWork extends AbstractTaskLifecycleWork {
-    private static final Logger LOGGER = Logger.getLogger(TaskFailureWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final List<Exception> exceptions;
 
     public TaskFailureWork(ClusterControllerService ccs, JobId jobId, TaskAttemptId taId, String nodeId,
@@ -41,7 +42,7 @@
 
     @Override
     protected void performEvent(TaskAttempt ta) {
-        LOGGER.log(Level.WARNING, "Executing task failure work for " + this, exceptions.get(0));
+        LOGGER.log(Level.WARN, "Executing task failure work for " + this, exceptions.get(0));
         IJobManager jobManager = ccs.getJobManager();
         JobRun run = jobManager.get(jobId);
         ccs.getDatasetDirectoryService().reportJobFailure(jobId, exceptions);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TriggerNCWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TriggerNCWork.java
index ab526e8..aa7a4fe 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TriggerNCWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/TriggerNCWork.java
@@ -24,14 +24,15 @@
 import java.io.ObjectOutputStream;
 import java.io.StringWriter;
 import java.net.Socket;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.control.cc.ClusterControllerService;
 import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.control.common.controllers.ServiceConstants.ServiceCommand;
 import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.ini4j.Ini;
 
 /**
@@ -40,7 +41,7 @@
  */
 public class TriggerNCWork extends AbstractWork {
 
-    private static final Logger LOGGER = Logger.getLogger(TriggerNCWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ClusterControllerService ccs;
     private final String ncHost;
@@ -53,6 +54,7 @@
         this.ncPort = ncPort;
         this.ncId = ncId;
     }
+
     @Override
     public final void run() {
         ccs.getExecutor().execute(() -> {
@@ -67,8 +69,8 @@
                     return;
                     // QQQ Should probably have an ACK here
                 } catch (IOException e) {
-                    LOGGER.log(Level.WARNING, "Failed to contact NC service at " + ncHost + ":" + ncPort
-                            + "; will retry", e);
+                    LOGGER.log(Level.WARN, "Failed to contact NC service at " + ncHost + ":" + ncPort + "; will retry",
+                            e);
                 }
                 try {
                     Thread.sleep(5000);
@@ -93,8 +95,8 @@
         // entry point so that NCs can determine where all their config is.
         ccini.put(Section.LOCALNC.sectionName(), NCConfig.Option.NODE_ID.ini(), ncId);
         ccini.store(iniString);
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Returning Ini file:\n" + iniString.toString());
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Returning Ini file:\n" + iniString.toString());
         }
         return iniString.toString();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/UndeployJobSpecWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/UndeployJobSpecWork.java
new file mode 100644
index 0000000..143c8c1
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/UndeployJobSpecWork.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.cc.work;
+
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.control.cc.NodeControllerState;
+import org.apache.hyracks.control.cc.cluster.INodeManager;
+import org.apache.hyracks.control.common.work.IResultCallback;
+import org.apache.hyracks.control.common.work.SynchronizableWork;
+
+public class UndeployJobSpecWork extends SynchronizableWork {
+    private final ClusterControllerService ccs;
+    private final DeployedJobSpecId deployedJobSpecId;
+    private final IResultCallback<DeployedJobSpecId> callback;
+
+    public UndeployJobSpecWork(ClusterControllerService ccs, DeployedJobSpecId deployedJobSpecId,
+            IResultCallback<DeployedJobSpecId> callback) {
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.ccs = ccs;
+        this.callback = callback;
+    }
+
+    @Override
+    protected void doRun() throws Exception {
+        try {
+            ccs.getDeployedJobSpecStore().removeDeployedJobSpecDescriptor(deployedJobSpecId);
+            INodeManager nodeManager = ccs.getNodeManager();
+            for (NodeControllerState node : nodeManager.getAllNodeControllerStates()) {
+                node.getNodeController().undeployJobSpec(deployedJobSpecId);
+            }
+            callback.setValue(deployedJobSpecId);
+        } catch (Exception e) {
+            callback.setException(e);
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/WaitForJobCompletionWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/WaitForJobCompletionWork.java
index f1d9a4d..53998aa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/WaitForJobCompletionWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/main/java/org/apache/hyracks/control/cc/work/WaitForJobCompletionWork.java
@@ -63,17 +63,15 @@
             List<Exception> exceptions;
             if (exceptionHistory == null) {
                 // couldn't be found
-                long maxJobId = ccs.getJobIdFactory().maxJobId();
-                exceptions = Collections.singletonList(jobId.getId() <= maxJobId
-                        ? HyracksDataException.create(ErrorCode.JOB_HAS_BEEN_CLEARED_FROM_HISTORY, jobId)
-                        : HyracksDataException.create(ErrorCode.JOB_HAS_NOT_BEEN_CREATED_YET, jobId));
+                exceptions = Collections
+                        .singletonList(HyracksDataException.create(ErrorCode.JOB_HAS_BEEN_CLEARED_FROM_HISTORY, jobId));
 
             } else {
                 exceptions = exceptionHistory;
             }
             ccs.getExecutor().execute(() -> {
                 if (!exceptions.isEmpty()) {
-                    /**
+                    /*
                      * only report the first exception because IResultCallback will only throw one exception
                      * anyway
                      */
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/test/java/org/apache/hyracks/control/cc/cluster/NodeManagerTest.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/test/java/org/apache/hyracks/control/cc/cluster/NodeManagerTest.java
index 9b9a3b4..931e436 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/test/java/org/apache/hyracks/control/cc/cluster/NodeManagerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-cc/src/test/java/org/apache/hyracks/control/cc/cluster/NodeManagerTest.java
@@ -51,7 +51,10 @@
     @Test
     public void testNormal() throws HyracksException, IPCException {
         IResourceManager resourceManager = new ResourceManager();
-        INodeManager nodeManager = new NodeManager(mockCcs(), makeCCConfig(), resourceManager);
+        final CCConfig ccConfig = makeCCConfig();
+        final int coresMultiplier = 1;
+        ccConfig.setCoresMultiplier(coresMultiplier);
+        INodeManager nodeManager = new NodeManager(mockCcs(), ccConfig, resourceManager);
         NodeControllerState ncState1 = mockNodeControllerState(NODE1, false);
         NodeControllerState ncState2 = mockNodeControllerState(NODE2, false);
 
@@ -74,6 +77,38 @@
     }
 
     @Test
+    public void testAdjustedNodeCapacity() throws HyracksException, IPCException {
+        IResourceManager resourceManager = new ResourceManager();
+        final CCConfig ccConfig = makeCCConfig();
+        final int coresMultiplier = 3;
+        ccConfig.setCoresMultiplier(coresMultiplier);
+        INodeManager nodeManager = new NodeManager(mockCcs(), ccConfig, resourceManager);
+        NodeControllerState ncState1 = mockNodeControllerState(NODE1, false);
+        NodeControllerState ncState2 = mockNodeControllerState(NODE2, false);
+
+        // verify state after adding two nodes
+        nodeManager.addNode(NODE1, ncState1);
+        nodeManager.addNode(NODE2, ncState2);
+        int activeNodes = 2;
+        // verify adjusted cores
+        Assert.assertEquals(NODE_CORES * activeNodes * coresMultiplier,
+                resourceManager.getCurrentCapacity().getAggregatedCores());
+        // verify unadjusted memory size
+        Assert.assertEquals(NODE_MEMORY_SIZE * activeNodes,
+                resourceManager.getCurrentCapacity().getAggregatedMemoryByteSize());
+        // verify state after removing a node.
+        nodeManager.removeNode(NODE1);
+        activeNodes = 1;
+        Assert.assertEquals(NODE_CORES * activeNodes * coresMultiplier,
+                resourceManager.getCurrentCapacity().getAggregatedCores());
+        Assert.assertEquals(NODE_MEMORY_SIZE * activeNodes,
+                resourceManager.getCurrentCapacity().getAggregatedMemoryByteSize());
+        // verify state after removing last node
+        nodeManager.removeNode(NODE2);
+        verifyEmptyCluster(resourceManager, nodeManager);
+    }
+
+    @Test
     public void testException() throws HyracksException, IPCException {
         IResourceManager resourceManager = new ResourceManager();
         INodeManager nodeManager = new NodeManager(mockCcs(), makeCCConfig(), resourceManager);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/pom.xml
index 7fc3b15..cba5e19 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/pom.xml
@@ -79,5 +79,9 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
index 92e90e7..44f57fa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/application/ConfigManagerApplicationConfig.java
@@ -42,17 +42,17 @@
 
     @Override
     public String getString(String section, String key) {
-        return (String)get(section, key);
+        return (String) get(section, key);
     }
 
     @Override
     public int getInt(String section, String key) {
-        return (int)get(section, key);
+        return (int) get(section, key);
     }
 
     @Override
     public long getLong(String section, String key) {
-        return (long)get(section, key);
+        return (long) get(section, key);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/IClusterController.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/IClusterController.java
index ec8e045..5e3c3d4 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/IClusterController.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/IClusterController.java
@@ -24,6 +24,7 @@
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.common.controllers.NodeRegistration;
 import org.apache.hyracks.control.common.deployment.DeploymentStatus;
@@ -34,42 +35,41 @@
 import org.apache.hyracks.control.common.job.profiling.om.TaskProfile;
 
 public interface IClusterController {
-    public void registerNode(NodeRegistration reg) throws Exception;
+    void registerNode(NodeRegistration reg) throws Exception;
 
-    public void unregisterNode(String nodeId) throws Exception;
+    void unregisterNode(String nodeId) throws Exception;
 
-    public void notifyTaskComplete(JobId jobId, TaskAttemptId taskId, String nodeId, TaskProfile statistics)
+    void notifyTaskComplete(JobId jobId, TaskAttemptId taskId, String nodeId, TaskProfile statistics) throws Exception;
+
+    void notifyTaskFailure(JobId jobId, TaskAttemptId taskId, String nodeId, List<Exception> exceptions)
             throws Exception;
 
-    public void notifyTaskFailure(JobId jobId, TaskAttemptId taskId, String nodeId, List<Exception> exceptions)
-            throws Exception;
+    void notifyDeployedJobSpecFailure(DeployedJobSpecId deployedJobSpecId, String nodeId) throws Exception;
 
-    public void notifyDistributedJobFailure(JobId jobId, String nodeId) throws Exception;
+    void notifyJobletCleanup(JobId jobId, String nodeId) throws Exception;
 
-    public void notifyJobletCleanup(JobId jobId, String nodeId) throws Exception;
+    void notifyDeployBinary(DeploymentId deploymentId, String nodeId, DeploymentStatus status) throws Exception;
 
-    public void notifyDeployBinary(DeploymentId deploymentId, String nodeId, DeploymentStatus status) throws Exception;
+    void notifyStateDump(String nodeId, String stateDumpId, String state) throws Exception;
 
-    public void notifyStateDump(String nodeId, String stateDumpId, String state) throws Exception;
+    void notifyShutdown(String nodeId) throws Exception;
 
-    public void notifyShutdown(String nodeId) throws Exception;
+    void nodeHeartbeat(String id, HeartbeatData hbData) throws Exception;
 
-    public void nodeHeartbeat(String id, HeartbeatData hbData) throws Exception;
+    void reportProfile(String id, List<JobProfile> profiles) throws Exception;
 
-    public void reportProfile(String id, List<JobProfile> profiles) throws Exception;
+    void registerPartitionProvider(PartitionDescriptor partitionDescriptor) throws Exception;
 
-    public void registerPartitionProvider(PartitionDescriptor partitionDescriptor) throws Exception;
+    void registerPartitionRequest(PartitionRequest partitionRequest) throws Exception;
 
-    public void registerPartitionRequest(PartitionRequest partitionRequest) throws Exception;
+    void sendApplicationMessageToCC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception;
 
-    public void sendApplicationMessageToCC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception;
+    void registerResultPartitionLocation(JobId jobId, ResultSetId rsId, boolean orderedResult, boolean emptyResult,
+            int partition, int nPartitions, NetworkAddress networkAddress) throws Exception;
 
-    public void registerResultPartitionLocation(JobId jobId, ResultSetId rsId, boolean orderedResult,
-            boolean emptyResult, int partition, int nPartitions, NetworkAddress networkAddress) throws Exception;
+    void reportResultPartitionWriteCompletion(JobId jobId, ResultSetId rsId, int partition) throws Exception;
 
-    public void reportResultPartitionWriteCompletion(JobId jobId, ResultSetId rsId, int partition) throws Exception;
+    void getNodeControllerInfos() throws Exception;
 
-    public void getNodeControllerInfos() throws Exception;
-
-    public void notifyThreadDump(String nodeId, String requestId, String threadDumpJSON) throws Exception;
+    void notifyThreadDump(String nodeId, String requestId, String threadDumpJSON) throws Exception;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/INodeController.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/INodeController.java
index a10f8f0..9ec55f4 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/INodeController.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/base/INodeController.java
@@ -19,7 +19,6 @@
 package org.apache.hyracks.control.common.base;
 
 import java.net.URL;
-import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -29,6 +28,7 @@
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataflow.connectors.IConnectorPolicy;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
@@ -36,29 +36,30 @@
 import org.apache.hyracks.control.common.job.TaskAttemptDescriptor;
 
 public interface INodeController {
-    public void startTasks(DeploymentId deploymentId, JobId jobId, byte[] planBytes,
+    void startTasks(DeploymentId deploymentId, JobId jobId, byte[] planBytes,
             List<TaskAttemptDescriptor> taskDescriptors, Map<ConnectorDescriptorId, IConnectorPolicy> connectorPolicies,
-            Set<JobFlag> flags) throws Exception;
+            Set<JobFlag> flags, Map<byte[], byte[]> jobParameters, DeployedJobSpecId deployedJobSpecId)
+            throws Exception;
 
-    public void abortTasks(JobId jobId, List<TaskAttemptId> tasks) throws Exception;
+    void abortTasks(JobId jobId, List<TaskAttemptId> tasks) throws Exception;
 
-    public void cleanUpJoblet(JobId jobId, JobStatus status) throws Exception;
+    void cleanUpJoblet(JobId jobId, JobStatus status) throws Exception;
 
-    public void reportPartitionAvailability(PartitionId pid, NetworkAddress networkAddress) throws Exception;
+    void reportPartitionAvailability(PartitionId pid, NetworkAddress networkAddress) throws Exception;
 
-    public void deployBinary(DeploymentId deploymentId, List<URL> url) throws Exception;
+    void deployBinary(DeploymentId deploymentId, List<URL> url) throws Exception;
 
-    public void undeployBinary(DeploymentId deploymentId) throws Exception;
+    void undeployBinary(DeploymentId deploymentId) throws Exception;
 
-    public void distributeJob(JobId jobId, byte[] planBytes) throws Exception;
+    void deployJobSpec(DeployedJobSpecId deployedJobSpecId, byte[] planBytes) throws Exception;
 
-    public void destroyJob(JobId jobId) throws Exception;
+    void undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception;
 
-    public void dumpState(String stateDumpId) throws Exception;
+    void dumpState(String stateDumpId) throws Exception;
 
-    public void shutdown(boolean terminateNCService) throws Exception;
+    void shutdown(boolean terminateNCService) throws Exception;
 
-    public void sendApplicationMessageToNC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception;
+    void sendApplicationMessageToNC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception;
 
-    public void takeThreadDump(String requestId) throws Exception;
+    void takeThreadDump(String requestId) throws Exception;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
index 67738ba..baff800 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigManager.java
@@ -39,8 +39,6 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -53,6 +51,9 @@
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.control.common.application.ConfigManagerApplicationConfig;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.ini4j.Ini;
 import org.ini4j.Profile;
 import org.kohsuke.args4j.CmdLineException;
@@ -63,16 +64,18 @@
 public class ConfigManager implements IConfigManager, Serializable {
 
     private static final long serialVersionUID = 1L;
-    private static final Logger LOGGER = Logger.getLogger(ConfigManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private HashSet<IOption> registeredOptions = new HashSet<>();
     private HashMap<IOption, Object> definedMap = new HashMap<>();
     private HashMap<IOption, Object> defaultMap = new HashMap<>();
-    private CompositeMap<IOption, Object> configurationMap = new CompositeMap<>(definedMap, defaultMap,
-            new NoOpMapMutator());
+    private CompositeMap<IOption, Object> configurationMap =
+            new CompositeMap<>(definedMap, defaultMap, new NoOpMapMutator());
     private EnumMap<Section, Map<String, IOption>> sectionMap = new EnumMap<>(Section.class);
     @SuppressWarnings("squid:S1948") // TreeMap is serializable, and therefore so is its synchronized map
-    private Map<String, Map<IOption, Object>> nodeSpecificMap = Collections.synchronizedMap(new TreeMap<>());
+    private Map<String, Map<IOption, Object>> nodeSpecificDefinedMap = Collections.synchronizedMap(new TreeMap<>());
+    @SuppressWarnings("squid:S1948") // TreeMap is serializable, and therefore so is its synchronized map
+    private Map<String, Map<IOption, Object>> nodeSpecificDefaultMap = Collections.synchronizedMap(new TreeMap<>());
     private transient ArrayListValuedHashMap<IOption, IConfigSetter> optionSetters = new ArrayListValuedHashMap<>();
     private final String[] args;
     private ConfigManagerApplicationConfig appConfig = new ConfigManagerApplicationConfig(this);
@@ -84,6 +87,7 @@
     private transient SortedMap<Integer, List<IConfigurator>> configurators = new TreeMap<>();
     private boolean configured;
     private String versionString = "version undefined";
+    private transient Map<String, Set<Map.Entry<String, String>>> extensionOptions = new TreeMap();
 
     public ConfigManager() {
         this(null);
@@ -91,6 +95,7 @@
 
     public ConfigManager(String[] args) {
         this.args = args;
+        checkJavaVersion();
         for (Section section : Section.values()) {
             allSections.add(section.sectionName());
         }
@@ -100,6 +105,14 @@
         addConfigurator(ConfiguratorMetric.APPLY_DEFAULTS, this::applyDefaults);
     }
 
+    static void checkJavaVersion() {
+        final String javaVersion = System.getProperty("java.version");
+        LOGGER.info("Found JRE version " + javaVersion);
+        if (!javaVersion.startsWith("1.8")) {
+            throw new IllegalStateException("JRE version 1.8 is required");
+        }
+    }
+
     @Override
     public void addConfigurator(int metric, IConfigurator configurator) {
         configurators.computeIfAbsent(metric, metric1 -> new ArrayList<>()).add(configurator);
@@ -133,7 +146,7 @@
             if (configured) {
                 throw new IllegalStateException("configuration already processed");
             }
-            LOGGER.fine("registering option: " + option.toIniString());
+            LOGGER.debug("registering option: " + option.toIniString());
             Map<String, IOption> optionMap = sectionMap.computeIfAbsent(option.section(), section -> new HashMap<>());
             IOption prev = optionMap.put(option.ini(), option);
             if (prev != null) {
@@ -143,30 +156,32 @@
                 }
             } else {
                 registeredOptions.add(option);
-                optionSetters.put(option,
-                        (node, value,
-                                isDefault) -> correctedMap(option.section() == Section.NC ? node : null, isDefault)
-                                        .put(option, value));
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    optionSetters.put(option, (node, value, isDefault) -> LOGGER
-                            .fine((isDefault ? "defaulting" : "setting ") + option.toIniString() + " to " + value));
+                optionSetters.put(option, (node, value, isDefault) -> correctedMap(node, isDefault).put(option, value));
+                if (LOGGER.isDebugEnabled()) {
+                    optionSetters.put(option, (node, value, isDefault) -> LOGGER.debug("{} {} to {} for node {}",
+                            isDefault ? "defaulting" : "setting", option.toIniString(), value, node));
                 }
             }
         }
     }
 
     private Map<IOption, Object> correctedMap(String node, boolean isDefault) {
-        return node == null ? (isDefault ? defaultMap : definedMap)
-                : nodeSpecificMap.computeIfAbsent(node, this::createNodeSpecificMap);
+        if (node == null) {
+            return isDefault ? defaultMap : definedMap;
+        } else {
+            ensureNode(node);
+            return isDefault ? nodeSpecificDefaultMap.get(node) : nodeSpecificDefinedMap.get(node);
+        }
     }
 
     public void ensureNode(String nodeId) {
-        LOGGER.fine("ensureNode: " + nodeId);
-        nodeSpecificMap.computeIfAbsent(nodeId, this::createNodeSpecificMap);
+        LOGGER.debug("ensureNode: " + nodeId);
+        nodeSpecificDefinedMap.computeIfAbsent(nodeId, this::createNodeSpecificMap);
+        nodeSpecificDefaultMap.computeIfAbsent(nodeId, this::createNodeSpecificMap);
     }
 
     private Map<IOption, Object> createNodeSpecificMap(String nodeId) {
-        LOGGER.fine("createNodeSpecificMap: " + nodeId);
+        LOGGER.debug("createNodeSpecificMap: " + nodeId);
         return Collections.synchronizedMap(new HashMap<>());
     }
 
@@ -249,7 +264,7 @@
             cmdLineParser.addArgument(new Args4jSetter(o -> appArgs.add(String.valueOf(o)), true, String.class),
                     new Args4jArgument());
         }
-        LOGGER.fine("parsing cmdline: " + Arrays.toString(args));
+        LOGGER.debug("parsing cmdline: " + Arrays.toString(args));
         if (args == null || args.length == 0) {
             LOGGER.info("no command line args supplied");
             return appArgs;
@@ -261,7 +276,7 @@
                 ConfigUtils.printUsage(e, usageFilter, System.err);
                 throw e;
             } else {
-                LOGGER.log(Level.FINE, "Ignoring parse exception due to -help", e);
+                LOGGER.log(Level.DEBUG, "Ignoring parse exception due to -help", e);
             }
         }
         if (bean.help) {
@@ -298,7 +313,7 @@
                     .parseSectionName(section.getParent() == null ? section.getName() : section.getParent().getName());
             String node;
             if (rootSection == Section.EXTENSION) {
-                parseExtensionIniSection(section);
+                extensionOptions.put(section.getName(), section.entrySet());
                 continue;
             } else if (rootSection == Section.NC) {
                 node = section.getName().equals(section.getSimpleName()) ? null : section.getSimpleName();
@@ -316,17 +331,13 @@
                     return;
                 }
                 final String value = iniOption.getValue();
-                LOGGER.fine("setting " + option.toIniString() + " to " + value);
+                LOGGER.debug("setting " + option.toIniString() + " to " + value);
                 final Object parsed = option.type().parse(value);
                 invokeSetters(option, parsed, node);
             }
         }
     }
 
-    private void parseExtensionIniSection(Profile.Section section) {
-        // TODO(mblow): parse extensions
-    }
-
     private void handleUnknownOption(Profile.Section section, String name) throws HyracksException {
         Set<String> matches = new HashSet<>();
         for (IOption registeredOption : registeredOptions) {
@@ -343,19 +354,15 @@
     }
 
     private void applyDefaults() {
-        LOGGER.fine("applying defaults");
+        LOGGER.debug("applying defaults");
         sectionMap.forEach((key, value) -> {
-            if (key == Section.NC) {
-                value.values().forEach(option -> getNodeNames()
-                        .forEach(node -> getOrDefault(getNodeEffectiveMap(node), option, node)));
-                for (Map.Entry<String, Map<IOption, Object>> nodeMap : nodeSpecificMap.entrySet()) {
-                    value.values()
-                            .forEach(option -> getOrDefault(
-                                    new CompositeMap<>(nodeMap.getValue(), definedMap, new NoOpMapMutator()), option,
-                                    nodeMap.getKey()));
-                }
-            } else {
-                value.values().forEach(option -> getOrDefault(configurationMap, option, null));
+            value.values().forEach(
+                    option -> getNodeNames().forEach(node -> getOrDefault(getNodeEffectiveMap(node), option, node)));
+            for (Map.Entry<String, Map<IOption, Object>> nodeMap : nodeSpecificDefinedMap.entrySet()) {
+                value.values()
+                        .forEach(option -> getOrDefault(
+                                new CompositeMap<>(nodeMap.getValue(), definedMap, new NoOpMapMutator()), option,
+                                nodeMap.getKey()));
             }
         });
     }
@@ -426,17 +433,18 @@
     }
 
     public List<String> getNodeNames() {
-        return Collections.unmodifiableList(new ArrayList<>(nodeSpecificMap.keySet()));
+        return Collections.unmodifiableList(new ArrayList<>(nodeSpecificDefinedMap.keySet()));
     }
 
     public IApplicationConfig getNodeEffectiveConfig(String nodeId) {
-        final Map<IOption, Object> nodeMap = nodeSpecificMap.computeIfAbsent(nodeId, this::createNodeSpecificMap);
+        ensureNode(nodeId);
+        final Map<IOption, Object> nodeMap = nodeSpecificDefaultMap.get(nodeId);
         Map<IOption, Object> nodeEffectiveMap = getNodeEffectiveMap(nodeId);
         return new ConfigManagerApplicationConfig(this) {
             @Override
             public Object getStatic(IOption option) {
                 if (!nodeEffectiveMap.containsKey(option)) {
-                    // we need to calculate the default the the context of the node specific map...
+                    // we need to calculate the default within the context of the node specific map...
                     nodeMap.put(option, getOrDefault(nodeEffectiveMap, option, nodeId));
                 }
                 return nodeEffectiveMap.get(option);
@@ -444,8 +452,12 @@
         };
     }
 
-    private CompositeMap<IOption, Object> getNodeEffectiveMap(String nodeId) {
-        return new CompositeMap<>(nodeSpecificMap.get(nodeId), definedMap, new NoOpMapMutator());
+    private Map<IOption, Object> getNodeEffectiveMap(String nodeId) {
+        ensureNode(nodeId);
+        return new CompositeMap<>(
+                Stream.of(nodeSpecificDefinedMap.get(nodeId), nodeSpecificDefaultMap.get(nodeId), definedMap)
+                        .toArray(Map[]::new),
+                new NoOpMapMutator());
     }
 
     public Ini toIni(boolean includeDefaults) {
@@ -455,8 +467,11 @@
                 ini.add(option.section().sectionName(), option.ini(), option.type().serializeToIni(value));
             }
         });
-        nodeSpecificMap.forEach((key, nodeValueMap) -> {
+        for (String key : getNodeNames()) {
             String section = Section.NC.sectionName() + "/" + key;
+            ensureNode(key);
+            Map<IOption, Object> nodeValueMap =
+                    includeDefaults ? getNodeEffectiveMap(key) : nodeSpecificDefinedMap.get(key);
             synchronized (nodeValueMap) {
                 for (Map.Entry<IOption, Object> entry : nodeValueMap.entrySet()) {
                     if (entry.getValue() != null) {
@@ -465,7 +480,9 @@
                     }
                 }
             }
-        });
+        }
+        extensionOptions.forEach((extension, options) -> options
+                .forEach(option -> ini.add(extension, option.getKey(), option.getValue())));
         return ini;
     }
 
@@ -482,7 +499,7 @@
             throw new IllegalStateException("Option not registered with ConfigManager: " + option.toIniString() + "("
                     + option.getClass() + "." + option + ")");
         } else if (option.section() == Section.NC) {
-            LOGGER.warning("NC option " + option.toIniString() + " being accessed outside of NC-scoped configuration.");
+            LOGGER.warn("NC option " + option.toIniString() + " being accessed outside of NC-scoped configuration.");
         }
         return getOrDefault(configurationMap, option, null);
     }
@@ -506,7 +523,7 @@
         if (description != null && !"".equals(description)) {
             usage.append(description).append(" ");
         } else {
-            LOGGER.warning("missing description for option: "
+            LOGGER.warn("missing description for option: "
                     + option.getClass().getName().substring(option.getClass().getName().lastIndexOf(".") + 1) + "."
                     + option.name());
         }
@@ -551,8 +568,9 @@
         }
 
         @Override
-        public void resolveCollision(CompositeMap<IOption, Object> compositeMap, Map<IOption, Object> map,
-                Map<IOption, Object> map1, Collection<IOption> collection) {
+        public void resolveCollision(CompositeMap<IOption, Object> composite, Map<IOption, Object> existing,
+                Map<IOption, Object> added, Collection<IOption> intersect) {
+            LOGGER.debug("resolveCollision: {}, {}, {}, {}", composite, existing, added, intersect);
             // no-op
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigUtils.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigUtils.java
index adf1774..4fa9b56 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/ConfigUtils.java
@@ -150,25 +150,23 @@
         return value;
     }
 
-    public static String getString(Ini ini, org.apache.hyracks.api.config.Section section,
-                                   IOption option, String defaultValue) {
+    public static String getString(Ini ini, org.apache.hyracks.api.config.Section section, IOption option,
+            String defaultValue) {
         return getString(ini, section.sectionName(), option.ini(), defaultValue);
     }
 
     public static void addConfigToJSON(ObjectNode o, IApplicationConfig cfg,
-                                       org.apache.hyracks.api.config.Section... sections) {
+            org.apache.hyracks.api.config.Section... sections) {
         ArrayNode configArray = o.putArray("config");
         for (org.apache.hyracks.api.config.Section section : cfg.getSections(Arrays.asList(sections)::contains)) {
             ObjectNode sectionNode = configArray.addObject();
             Map<String, Object> sectionConfig = getSectionOptionsForJSON(cfg, section, option -> true);
-            sectionNode.put("section", section.sectionName())
-                    .putPOJO("properties", sectionConfig);
+            sectionNode.put("section", section.sectionName()).putPOJO("properties", sectionConfig);
         }
     }
 
     public static Map<String, Object> getSectionOptionsForJSON(IApplicationConfig cfg,
-                                                                org.apache.hyracks.api.config.Section section,
-                                                                Predicate<IOption> selector) {
+            org.apache.hyracks.api.config.Section section, Predicate<IOption> selector) {
         Map<String, Object> sectionConfig = new TreeMap<>();
         for (IOption option : cfg.getOptions(section)) {
             if (selector.test(option)) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
index 1e92a7a..b188548 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/config/OptionTypes.java
@@ -19,12 +19,16 @@
 package org.apache.hyracks.control.common.config;
 
 import java.net.MalformedURLException;
-import java.util.logging.Level;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.util.StorageUtil;
+import org.apache.logging.log4j.Level;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 public class OptionTypes {
@@ -37,25 +41,29 @@
             }
             long result1 = StorageUtil.getByteValue(s);
             if (result1 > Integer.MAX_VALUE || result1 < Integer.MIN_VALUE) {
-                throw new IllegalArgumentException(
-                        "The given value: " + result1 + " is not within the int range.");
+                throw new IllegalArgumentException("The given value: " + result1 + " is not within the int range.");
             }
             return (int) result1;
         }
 
         @Override
+        public Integer parse(JsonNode node) {
+            return node.isNull() ? null : parse(node.asText());
+        }
+
+        @Override
         public Class<Integer> targetType() {
             return Integer.class;
         }
 
         @Override
         public String serializeToHumanReadable(Object value) {
-            return value + " (" + StorageUtil.toHumanReadableSize((int)value) + ")";
+            return value + " (" + StorageUtil.toHumanReadableSize((int) value) + ")";
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (int)value);
+            node.put(fieldName, (int) value);
         }
     };
 
@@ -66,18 +74,53 @@
         }
 
         @Override
+        public Long parse(JsonNode node) {
+            return node.isNull() ? null : parse(node.asText());
+        }
+
+        @Override
         public Class<Long> targetType() {
             return Long.class;
         }
 
         @Override
         public String serializeToHumanReadable(Object value) {
-            return value + " (" + StorageUtil.toHumanReadableSize((long)value) + ")";
+            return value + " (" + StorageUtil.toHumanReadableSize((long) value) + ")";
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (long)value);
+            node.put(fieldName, (long) value);
+        }
+    };
+
+    public static final IOptionType<Short> SHORT = new IOptionType<Short>() {
+        @Override
+        public Short parse(String s) {
+            int value = Integer.decode(s);
+            return validateShort(value);
+        }
+
+        private Short validateShort(int value) {
+            if (value > Short.MAX_VALUE || value < Short.MIN_VALUE) {
+                throw new IllegalArgumentException("The given value " + value + " does not fit in a short");
+            }
+            return (short) value;
+        }
+
+        @Override
+        public Short parse(JsonNode node) {
+            return node.isNull() ? null : validateShort(node.asInt());
+        }
+
+        @Override
+        public Class<Short> targetType() {
+            return Short.class;
+        }
+
+        @Override
+        public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
+            node.put(fieldName, (short) value);
         }
     };
 
@@ -88,13 +131,18 @@
         }
 
         @Override
+        public Integer parse(JsonNode node) {
+            return node.isNull() ? null : node.asInt();
+        }
+
+        @Override
         public Class<Integer> targetType() {
             return Integer.class;
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (int)value);
+            node.put(fieldName, (int) value);
         }
     };
 
@@ -105,13 +153,18 @@
         }
 
         @Override
+        public Double parse(JsonNode node) {
+            return node.isNull() ? null : node.asDouble();
+        }
+
+        @Override
         public Class<Double> targetType() {
             return Double.class;
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (double)value);
+            node.put(fieldName, (double) value);
         }
     };
 
@@ -122,13 +175,18 @@
         }
 
         @Override
+        public String parse(JsonNode node) {
+            return node.isNull() ? null : node.asText();
+        }
+
+        @Override
         public Class<String> targetType() {
             return String.class;
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (String)value);
+            node.put(fieldName, (String) value);
         }
     };
 
@@ -139,13 +197,18 @@
         }
 
         @Override
+        public Long parse(JsonNode node) {
+            return node.isNull() ? null : node.asLong();
+        }
+
+        @Override
         public Class<Long> targetType() {
             return Long.class;
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (long)value);
+            node.put(fieldName, (long) value);
         }
     };
 
@@ -156,20 +219,37 @@
         }
 
         @Override
+        public Boolean parse(JsonNode node) {
+            return node.isNull() ? null : node.asBoolean();
+        }
+
+        @Override
         public Class<Boolean> targetType() {
             return Boolean.class;
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, (boolean)value);
+            node.put(fieldName, (boolean) value);
         }
     };
 
     public static final IOptionType<Level> LEVEL = new IOptionType<Level>() {
         @Override
         public Level parse(String s) {
-            return s == null ? null : Level.parse(s);
+            if (s == null) {
+                throw new IllegalArgumentException("Logging level cannot be null");
+            }
+            final Level level = Level.getLevel(s);
+            if (level == null) {
+                throw new IllegalArgumentException("Unrecognized logging level: " + s);
+            }
+            return level;
+        }
+
+        @Override
+        public Level parse(JsonNode node) {
+            return node.isNull() ? null : parse(node.asText());
         }
 
         @Override
@@ -179,12 +259,12 @@
 
         @Override
         public String serializeToJSON(Object value) {
-            return value == null ? null : ((Level)value).getName();
+            return value == null ? null : ((Level) value).name();
         }
 
         @Override
         public String serializeToIni(Object value) {
-            return ((Level)value).getName();
+            return ((Level) value).name();
         }
 
         @Override
@@ -193,25 +273,39 @@
         }
     };
 
-    public static final IOptionType<String []> STRING_ARRAY = new IOptionType<String []>() {
+    public static final IOptionType<String[]> STRING_ARRAY = new IOptionType<String[]>() {
         @Override
-        public String [] parse(String s) {
+        public String[] parse(String s) {
             return s == null ? null : s.split("\\s*,\\s*");
         }
 
         @Override
-        public Class<String []> targetType() {
-            return String [].class;
+        public String[] parse(JsonNode node) {
+            if (node.isNull()) {
+                return null;
+            }
+            List<String> strings = new ArrayList<>();
+            if (node instanceof ArrayNode) {
+                node.elements().forEachRemaining(n -> strings.add(n.asText()));
+                return strings.toArray(new String[strings.size()]);
+            } else {
+                return parse(node.asText());
+            }
+        }
+
+        @Override
+        public Class<String[]> targetType() {
+            return String[].class;
         }
 
         @Override
         public String serializeToIni(Object value) {
-            return String.join(",", (String [])value);
+            return String.join(",", (String[]) value);
         }
 
         @Override
         public void serializeJSONField(String fieldName, Object value, ObjectNode node) {
-            node.put(fieldName, value == null ? null : StringUtils.join((String [])value, ','));
+            node.put(fieldName, value == null ? null : StringUtils.join((String[]) value, ','));
         }
     };
 
@@ -226,6 +320,11 @@
         }
 
         @Override
+        public java.net.URL parse(JsonNode node) {
+            return node.isNull() ? null : parse(node.asText());
+        }
+
+        @Override
         public Class<java.net.URL> targetType() {
             return java.net.URL.class;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
index c04d5b4..13e4504 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/CCConfig.java
@@ -21,6 +21,7 @@
 import static org.apache.hyracks.control.common.config.OptionTypes.BOOLEAN;
 import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
 import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
+import static org.apache.hyracks.control.common.config.OptionTypes.SHORT;
 import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
 
 import java.io.File;
@@ -33,6 +34,7 @@
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.util.file.FileUtil;
 import org.ini4j.Ini;
@@ -58,15 +60,14 @@
         RESULT_TTL(LONG, 86400000L), // TODO(mblow): add time unit
         RESULT_SWEEP_THRESHOLD(LONG, 60000L), // TODO(mblow): add time unit
         @SuppressWarnings("RedundantCast") // not redundant- false positive from IDEA
-        ROOT_DIR(STRING, (Function<IApplicationConfig, String>) appConfig ->
-                FileUtil.joinPath(appConfig.getString(ControllerConfig.Option.DEFAULT_DIR),
-                        "ClusterControllerService"), "<value of " + ControllerConfig.Option.DEFAULT_DIR.cmdline() +
-                ">/ClusterControllerService"),
+        ROOT_DIR(STRING, (Function<IApplicationConfig, String>) appConfig -> FileUtil.joinPath(appConfig.getString(ControllerConfig.Option.DEFAULT_DIR), "ClusterControllerService"), "<value of " + ControllerConfig.Option.DEFAULT_DIR.cmdline() + ">/ClusterControllerService"),
         CLUSTER_TOPOLOGY(STRING),
         JOB_QUEUE_CLASS(STRING, "org.apache.hyracks.control.cc.scheduler.FIFOJobQueue"),
         JOB_QUEUE_CAPACITY(INTEGER, 4096),
         JOB_MANAGER_CLASS(STRING, "org.apache.hyracks.control.cc.job.JobManager"),
-        ENFORCE_FRAME_WRITER_PROTOCOL(BOOLEAN, false);
+        ENFORCE_FRAME_WRITER_PROTOCOL(BOOLEAN, false),
+        CORES_MULTIPLIER(INTEGER, 3),
+        CONTROLLER_ID(SHORT, (short) 0x0000);
 
         private final IOptionType parser;
         private Object defaultValue;
@@ -89,7 +90,7 @@
         }
 
         <T> Option(IOptionType<T> parser, Function<IApplicationConfig, T> defaultValue,
-                   String defaultValueDescription) {
+                String defaultValueDescription) {
             this.parser = parser;
             this.defaultValue = defaultValue;
             this.defaultValueDescription = defaultValueDescription;
@@ -161,6 +162,10 @@
                 case ENFORCE_FRAME_WRITER_PROTOCOL:
                     return "A flag indicating if runtime should enforce frame writer protocol and detect "
                             + "bad behaving operators";
+                case CORES_MULTIPLIER:
+                    return "Specifies the multiplier to use on the cluster available cores";
+                case CONTROLLER_ID:
+                    return "The 16-bit (0-65535) id of this Cluster Controller";
                 default:
                     throw new IllegalStateException("NYI: " + this);
             }
@@ -363,4 +368,16 @@
     public void setEnforceFrameWriterProtocol(boolean enforce) {
         configManager.set(Option.ENFORCE_FRAME_WRITER_PROTOCOL, enforce);
     }
+
+    public void setCoresMultiplier(int coresMultiplier) {
+        configManager.set(Option.CORES_MULTIPLIER, coresMultiplier);
+    }
+
+    public int getCoresMultiplier() {
+        return getAppConfig().getInt(Option.CORES_MULTIPLIER);
+    }
+
+    public CcId getCcId() {
+        return CcId.valueOf(getAppConfig().getShort(Option.CONTROLLER_ID));
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
index 19c89e0..8ecd312 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ControllerConfig.java
@@ -33,6 +33,7 @@
 public class ControllerConfig implements Serializable {
 
     private static final long serialVersionUID = 1L;
+
     public enum Option implements IOption {
         CONFIG_FILE(OptionTypes.STRING, "Specify path to master configuration file", null),
         CONFIG_FILE_URL(OptionTypes.URL, "Specify URL to master configuration file", null),
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
index e8c96d4..75c0827 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NCConfig.java
@@ -21,6 +21,7 @@
 import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER;
 import static org.apache.hyracks.control.common.config.OptionTypes.INTEGER_BYTE_UNIT;
 import static org.apache.hyracks.control.common.config.OptionTypes.LONG;
+import static org.apache.hyracks.control.common.config.OptionTypes.SHORT;
 import static org.apache.hyracks.control.common.config.OptionTypes.STRING;
 import static org.apache.hyracks.control.common.config.OptionTypes.STRING_ARRAY;
 
@@ -33,6 +34,7 @@
 import org.apache.hyracks.api.config.IOption;
 import org.apache.hyracks.api.config.IOptionType;
 import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.util.file.FileUtil;
 
@@ -63,6 +65,10 @@
         MESSAGING_LISTEN_PORT(INTEGER, 0),
         MESSAGING_PUBLIC_ADDRESS(STRING, PUBLIC_ADDRESS),
         MESSAGING_PUBLIC_PORT(INTEGER, MESSAGING_LISTEN_PORT),
+        REPLICATION_PUBLIC_ADDRESS(STRING, PUBLIC_ADDRESS),
+        REPLICATION_PUBLIC_PORT(INTEGER, 2000),
+        REPLICATION_LISTEN_ADDRESS(STRING, ADDRESS),
+        REPLICATION_LISTEN_PORT(INTEGER, 2000),
         CLUSTER_CONNECT_RETRIES(INTEGER, 5),
         IODEVICES(
                 STRING_ARRAY,
@@ -115,6 +121,7 @@
         }
 
         @Override
+        @SuppressWarnings("squid:MethodCyclomaticComplexity")
         public String description() {
             switch (this) {
                 case ADDRESS:
@@ -128,8 +135,8 @@
                 case NCSERVICE_ADDRESS:
                     return "Address the CC should use to contact the NCService associated with this NC";
                 case NCSERVICE_PORT:
-                    return "Port the CC should use to contact the NCService associated with this NC (-1 to not use " +
-                            "NCService to start this NC)";
+                    return "Port the CC should use to contact the NCService associated with this NC (-1 to not use "
+                            + "NCService to start this NC)";
                 case CLUSTER_ADDRESS:
                     return "Cluster Controller address (required unless specified in config file)";
                 case CLUSTER_PORT:
@@ -167,6 +174,14 @@
                     return "Public IP Address to announce messaging listener";
                 case MESSAGING_PUBLIC_PORT:
                     return "Public IP port to announce messaging listener";
+                case REPLICATION_PUBLIC_ADDRESS:
+                    return "Public address to advertise for replication service";
+                case REPLICATION_PUBLIC_PORT:
+                    return "Public port to advertise for replication service";
+                case REPLICATION_LISTEN_ADDRESS:
+                    return "Replication bind address";
+                case REPLICATION_LISTEN_PORT:
+                    return "Port to listen on for replication service";
                 case CLUSTER_CONNECT_RETRIES:
                     return "Number of attempts to retry contacting CC before giving up";
                 case IODEVICES:
@@ -219,6 +234,10 @@
 
     }
 
+    public String getReplicationPublicAddress() {
+        return appConfig.getString(Option.REPLICATION_LISTEN_ADDRESS);
+    }
+
     public static final int NCSERVICE_PORT_DISABLED = -1;
 
     private List<String> appArgs = new ArrayList<>();
@@ -427,6 +446,10 @@
         configManager.set(nodeId, Option.MESSAGING_PUBLIC_PORT, messagingPublicPort);
     }
 
+    public int getReplicationPublicPort() {
+        return appConfig.getInt(Option.REPLICATION_LISTEN_PORT);
+    }
+
     public int getClusterConnectRetries() {
         return appConfig.getInt(Option.CLUSTER_CONNECT_RETRIES);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeParameters.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeParameters.java
index bf233a8..e78a423 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeParameters.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeParameters.java
@@ -33,6 +33,8 @@
 
     private int profileDumpPeriod;
 
+    private int registrationId;
+
     public ClusterControllerInfo getClusterControllerInfo() {
         return ccInfo;
     }
@@ -64,4 +66,12 @@
     public void setProfileDumpPeriod(int profileDumpPeriod) {
         this.profileDumpPeriod = profileDumpPeriod;
     }
+
+    public int getRegistrationId() {
+        return registrationId;
+    }
+
+    public void setRegistrationId(int registrationId) {
+        this.registrationId = registrationId;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
index 89d6e78..a87c30a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/NodeRegistration.java
@@ -22,6 +22,7 @@
 import java.net.InetSocketAddress;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.job.resource.NodeCapacity;
@@ -72,14 +73,15 @@
 
     private final NodeCapacity capacity;
 
-    private final long maxJobId;
+    private final int registrationId;
+
+    private static final AtomicInteger nextRegistrationId = new AtomicInteger();
 
     public NodeRegistration(InetSocketAddress ncAddress, String nodeId, NCConfig ncConfig, NetworkAddress dataPort,
-                            NetworkAddress datasetPort, String osName, String arch, String osVersion, int nProcessors,
-                            String vmName, String vmVersion, String vmVendor, String classpath, String libraryPath,
-                            String bootClasspath, List<String> inputArguments, Map<String, String> systemProperties,
-                            HeartbeatSchema hbSchema, NetworkAddress messagingPort, NodeCapacity capacity, int pid,
-                            long maxJobId) {
+            NetworkAddress datasetPort, String osName, String arch, String osVersion, int nProcessors, String vmName,
+            String vmVersion, String vmVendor, String classpath, String libraryPath, String bootClasspath,
+            List<String> inputArguments, Map<String, String> systemProperties, HeartbeatSchema hbSchema,
+            NetworkAddress messagingPort, NodeCapacity capacity, int pid) {
         this.ncAddress = ncAddress;
         this.nodeId = nodeId;
         this.ncConfig = ncConfig;
@@ -101,7 +103,7 @@
         this.messagingPort = messagingPort;
         this.capacity = capacity;
         this.pid = pid;
-        this.maxJobId = maxJobId;
+        this.registrationId = nextRegistrationId.getAndIncrement();
     }
 
     public InetSocketAddress getNodeControllerAddress() {
@@ -184,9 +186,11 @@
         return messagingPort;
     }
 
-    public int getPid() { return pid; }
+    public int getPid() {
+        return pid;
+    }
 
-    public long getMaxJobId() {
-        return maxJobId;
+    public int getRegistrationId() {
+        return registrationId;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ServiceConstants.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ServiceConstants.java
index 1b790b7..4a44356 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ServiceConstants.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/controllers/ServiceConstants.java
@@ -23,5 +23,6 @@
         START_NC,
         TERMINATE
     }
+
     public static final String NC_SERVICE_MAGIC_COOKIE = "hyncmagic2";
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/AbstractDatasetManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/AbstractDatasetManager.java
new file mode 100644
index 0000000..f95229e
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/AbstractDatasetManager.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.common.dataset;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.hyracks.api.dataset.IDatasetManager;
+import org.apache.hyracks.api.dataset.IDatasetStateRecord;
+import org.apache.hyracks.api.job.JobId;
+
+public abstract class AbstractDatasetManager implements IDatasetManager {
+
+    private final long nanoResultTTL;
+
+    protected AbstractDatasetManager(long resultTTL) {
+        this.nanoResultTTL = TimeUnit.MILLISECONDS.toNanos(resultTTL);
+    }
+
+    @Override
+    public synchronized void sweepExpiredDatasets() {
+        final List<JobId> expiredDatasets = new ArrayList<>();
+        final long sweepTime = System.nanoTime();
+        for (JobId jobId : getJobIds()) {
+            final IDatasetStateRecord state = getState(jobId);
+            if (state != null && hasExpired(state, sweepTime, nanoResultTTL)) {
+                expiredDatasets.add(jobId);
+            }
+        }
+        for (JobId jobId : expiredDatasets) {
+            sweep(jobId);
+        }
+    }
+
+    private static boolean hasExpired(IDatasetStateRecord dataset, long currentTime, long ttl) {
+        return currentTime - dataset.getTimestamp() - ttl > 0;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/ResultStateSweeper.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/ResultStateSweeper.java
index da1714b..901ec67 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/ResultStateSweeper.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/dataset/ResultStateSweeper.java
@@ -19,13 +19,8 @@
 
 package org.apache.hyracks.control.common.dataset;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.dataset.IDatasetManager;
-import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Sweeper to clean up the stale result distribution files and result states.
@@ -33,53 +28,26 @@
 public class ResultStateSweeper implements Runnable {
 
     private final IDatasetManager datasetManager;
-
-    private final long resultTTL;
-
     private final long resultSweepThreshold;
-
     private final Logger logger;
 
-    private final List<JobId> toBeCollected;
-
-    public ResultStateSweeper(IDatasetManager datasetManager, long resultTTL, long resultSweepThreshold,
-            Logger logger) {
+    public ResultStateSweeper(IDatasetManager datasetManager, long resultSweepThreshold, Logger logger) {
         this.datasetManager = datasetManager;
-        this.resultTTL = resultTTL;
         this.resultSweepThreshold = resultSweepThreshold;
         this.logger = logger;
-        toBeCollected = new ArrayList<JobId>();
     }
 
     @Override
-    @SuppressWarnings("squid:S2142") // catch interrupted exception
     public void run() {
-        while (true) {
+        while (!Thread.currentThread().isInterrupted()) {
             try {
                 Thread.sleep(resultSweepThreshold);
-                sweep();
+                datasetManager.sweepExpiredDatasets();
+                logger.trace("Result state cleanup instance successfully completed.");
             } catch (InterruptedException e) {
-                logger.log(Level.WARNING, "Result cleaner thread interrupted, shutting down.");
-                break; // the interrupt was explicit from another thread. This thread should shut down...
+                logger.warn("Result cleaner thread interrupted, shutting down.");
+                Thread.currentThread().interrupt();
             }
         }
     }
-
-    private void sweep() {
-        synchronized (datasetManager) {
-            toBeCollected.clear();
-            for (JobId jobId : datasetManager.getJobIds()) {
-                final long timestamp = datasetManager.getResultTimestamp(jobId);
-                if (timestamp != -1 && System.currentTimeMillis() > timestamp + resultTTL) {
-                    toBeCollected.add(jobId);
-                }
-            }
-            for (JobId jobId : toBeCollected) {
-                datasetManager.deinitState(jobId);
-            }
-        }
-        if (logger.isLoggable(Level.FINER)) {
-            logger.finer("Result state cleanup instance successfully completed.");
-        }
-    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/deployment/DeploymentUtils.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/deployment/DeploymentUtils.java
index bb65f7f..4d8c137 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/deployment/DeploymentUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/deployment/DeploymentUtils.java
@@ -119,8 +119,8 @@
             throws HyracksException {
         try {
             IJobSerializerDeserializerContainer jobSerDeContainer = serviceCtx.getJobSerializerDeserializerContainer();
-            IJobSerializerDeserializer jobSerDe = deploymentId == null ? null
-                    : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
+            IJobSerializerDeserializer jobSerDe =
+                    deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
             return jobSerDe == null ? JavaSerializationUtils.deserialize(bytes) : jobSerDe.deserialize(bytes);
         } catch (Exception e) {
             throw new HyracksException(e);
@@ -140,8 +140,8 @@
             throws HyracksException {
         try {
             IJobSerializerDeserializerContainer jobSerDeContainer = serviceCtx.getJobSerializerDeserializerContainer();
-            IJobSerializerDeserializer jobSerDe = deploymentId == null ? null
-                    : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
+            IJobSerializerDeserializer jobSerDe =
+                    deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
             return jobSerDe == null ? JavaSerializationUtils.loadClass(className) : jobSerDe.loadClass(className);
         } catch (ClassNotFoundException | IOException e) {
             throw new HyracksException(e);
@@ -159,8 +159,8 @@
     public static ClassLoader getClassLoader(DeploymentId deploymentId, IServiceContext appCtx)
             throws HyracksException {
         IJobSerializerDeserializerContainer jobSerDeContainer = appCtx.getJobSerializerDeserializerContainer();
-        IJobSerializerDeserializer jobSerDe = deploymentId == null ? null
-                : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
+        IJobSerializerDeserializer jobSerDe =
+                deploymentId == null ? null : jobSerDeContainer.getJobSerializerDeserializer(deploymentId);
         return jobSerDe == null ? DeploymentUtils.class.getClassLoader() : jobSerDe.getClassLoader();
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/CCNCFunctions.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/CCNCFunctions.java
index 4797ed7..3d505f3 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/CCNCFunctions.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/CCNCFunctions.java
@@ -35,11 +35,10 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.api.comm.NetworkAddress;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.dataflow.ActivityId;
 import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
 import org.apache.hyracks.api.dataflow.OperatorDescriptorId;
@@ -49,6 +48,7 @@
 import org.apache.hyracks.api.dataflow.connectors.IConnectorPolicy;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
@@ -65,9 +65,12 @@
 import org.apache.hyracks.control.common.job.profiling.om.TaskProfile;
 import org.apache.hyracks.ipc.api.IPayloadSerializerDeserializer;
 import org.apache.hyracks.ipc.impl.JavaSerializationBasedPayloadSerializerDeserializer;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CCNCFunctions {
-    private static final Logger LOGGER = Logger.getLogger(CCNCFunctions.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final int FID_CODE_SIZE = 1;
 
@@ -102,7 +105,7 @@
 
         DISTRIBUTE_JOB,
         DESTROY_JOB,
-        DISTRIBUTED_JOB_FAILURE,
+        DEPLOYED_JOB_FAILURE,
 
         STATE_DUMP_REQUEST,
         STATE_DUMP_RESPONSE,
@@ -148,12 +151,25 @@
 
     }
 
-    public static abstract class Function implements Serializable {
+    public abstract static class Function implements Serializable {
         private static final long serialVersionUID = 1L;
 
         public abstract FunctionId getFunctionId();
     }
 
+    public abstract static class CCIdentifiedFunction extends Function {
+        private static final long serialVersionUID = 1L;
+        private final CcId ccId;
+
+        protected CCIdentifiedFunction(CcId ccId) {
+            this.ccId = ccId;
+        }
+
+        public CcId getCcId() {
+            return ccId;
+        }
+    }
+
     public static class RegisterNodeFunction extends Function {
         private static final long serialVersionUID = 1L;
 
@@ -286,24 +302,24 @@
         }
     }
 
-    public static class ReportDistributedJobFailureFunction extends Function {
+    public static class ReportDeployedJobSpecFailureFunction extends Function {
         private static final long serialVersionUID = 1L;
 
-        private final JobId jobId;
+        private final DeployedJobSpecId deployedJobSpecId;
         private final String nodeId;
 
-        public ReportDistributedJobFailureFunction(JobId jobId, String nodeId) {
-            this.jobId = jobId;
+        public ReportDeployedJobSpecFailureFunction(DeployedJobSpecId deployedJobSpecId, String nodeId) {
+            this.deployedJobSpecId = deployedJobSpecId;
             this.nodeId = nodeId;
         }
 
         @Override
         public FunctionId getFunctionId() {
-            return FunctionId.DISTRIBUTED_JOB_FAILURE;
+            return FunctionId.DEPLOYED_JOB_FAILURE;
         }
 
-        public JobId getJobId() {
-            return jobId;
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
         }
 
         public String getNodeId() {
@@ -666,25 +682,34 @@
         }
     }
 
-    //TODO: Add CC id to this job to only abort jobs by this CC: https://issues.apache.org/jira/browse/ASTERIXDB-2110
     public static class AbortCCJobsFunction extends Function {
         private static final long serialVersionUID = 1L;
+        private final CcId ccId;
+
+        public AbortCCJobsFunction(CcId ccId) {
+            this.ccId = ccId;
+        }
 
         @Override
         public FunctionId getFunctionId() {
             return FunctionId.ABORT_ALL_JOBS;
         }
+
+        public CcId getCcId() {
+            return ccId;
+        }
     }
 
-    public static class DistributeJobFunction extends Function {
+    public static class DeployJobSpecFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
-        private final JobId jobId;
+        private final DeployedJobSpecId deployedJobSpecId;
 
         private final byte[] acgBytes;
 
-        public DistributeJobFunction(JobId jobId, byte[] acgBytes) {
-            this.jobId = jobId;
+        public DeployJobSpecFunction(DeployedJobSpecId deployedJobSpecId, byte[] acgBytes, CcId ccId) {
+            super(ccId);
+            this.deployedJobSpecId = deployedJobSpecId;
             this.acgBytes = acgBytes;
         }
 
@@ -693,8 +718,8 @@
             return FunctionId.DISTRIBUTE_JOB;
         }
 
-        public JobId getJobId() {
-            return jobId;
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
         }
 
         public byte[] getacgBytes() {
@@ -702,13 +727,14 @@
         }
     }
 
-    public static class DestroyJobFunction extends Function {
+    public static class UndeployJobSpecFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
-        private final JobId jobId;
+        private final DeployedJobSpecId deployedJobSpecId;
 
-        public DestroyJobFunction(JobId jobId) {
-            this.jobId = jobId;
+        public UndeployJobSpecFunction(DeployedJobSpecId deployedJobSpecId, CcId ccId) {
+            super(ccId);
+            this.deployedJobSpecId = deployedJobSpecId;
         }
 
         @Override
@@ -716,13 +742,13 @@
             return FunctionId.DESTROY_JOB;
         }
 
-        public JobId getJobId() {
-            return jobId;
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
         }
     }
 
     public static class StartTasksFunction extends Function {
-        private static final long serialVersionUID = 1L;
+        private static final long serialVersionUID = 2L;
 
         private final DeploymentId deploymentId;
         private final JobId jobId;
@@ -730,16 +756,21 @@
         private final List<TaskAttemptDescriptor> taskDescriptors;
         private final Map<ConnectorDescriptorId, IConnectorPolicy> connectorPolicies;
         private final Set<JobFlag> flags;
+        private final Map<byte[], byte[]> jobParameters;
+        private final DeployedJobSpecId deployedJobSpecId;
 
         public StartTasksFunction(DeploymentId deploymentId, JobId jobId, byte[] planBytes,
                 List<TaskAttemptDescriptor> taskDescriptors,
-                Map<ConnectorDescriptorId, IConnectorPolicy> connectorPolicies, Set<JobFlag> flags) {
+                Map<ConnectorDescriptorId, IConnectorPolicy> connectorPolicies, Set<JobFlag> flags,
+                Map<byte[], byte[]> jobParameters, DeployedJobSpecId deployedJobSpecId) {
             this.deploymentId = deploymentId;
             this.jobId = jobId;
             this.planBytes = planBytes;
             this.taskDescriptors = taskDescriptors;
             this.connectorPolicies = connectorPolicies;
             this.flags = flags;
+            this.jobParameters = jobParameters;
+            this.deployedJobSpecId = deployedJobSpecId;
         }
 
         @Override
@@ -751,10 +782,18 @@
             return deploymentId;
         }
 
+        public DeployedJobSpecId getDeployedJobSpecId() {
+            return deployedJobSpecId;
+        }
+
         public JobId getJobId() {
             return jobId;
         }
 
+        public Map<byte[], byte[]> getJobParameters() {
+            return jobParameters;
+        }
+
         public byte[] getPlanBytes() {
             return planBytes;
         }
@@ -815,7 +854,33 @@
                 flags.add(JobFlag.values()[(dis.readInt())]);
             }
 
-            return new StartTasksFunction(deploymentId, jobId, planBytes, taskDescriptors, connectorPolicies, flags);
+            // read job parameters
+            int paramListSize = dis.readInt();
+            Map<byte[], byte[]> jobParameters = new HashMap<>();
+            for (int i = 0; i < paramListSize; i++) {
+                int nameLength = dis.readInt();
+                byte[] nameBytes = null;
+                if (nameLength >= 0) {
+                    nameBytes = new byte[nameLength];
+                    dis.read(nameBytes, 0, nameLength);
+                }
+                int valueLength = dis.readInt();
+                byte[] valueBytes = null;
+                if (valueLength >= 0) {
+                    valueBytes = new byte[valueLength];
+                    dis.read(valueBytes, 0, valueLength);
+                }
+                jobParameters.put(nameBytes, valueBytes);
+            }
+
+            //read DeployedJobSpecId
+            DeployedJobSpecId deployedJobSpecId = null;
+            if (dis.readBoolean()) {
+                deployedJobSpecId = DeployedJobSpecId.create(dis);
+            }
+
+            return new StartTasksFunction(deploymentId, jobId, planBytes, taskDescriptors, connectorPolicies, flags,
+                    jobParameters, deployedJobSpecId);
         }
 
         public static void serialize(OutputStream out, Object object) throws Exception {
@@ -853,6 +918,22 @@
             for (JobFlag flag : fn.flags) {
                 dos.writeInt(flag.ordinal());
             }
+
+            //write job parameters
+            dos.writeInt(fn.jobParameters.size());
+            for (Entry<byte[], byte[]> entry : fn.jobParameters.entrySet()) {
+                dos.writeInt(entry.getKey().length);
+                dos.write(entry.getKey(), 0, entry.getKey().length);
+                dos.writeInt(entry.getValue().length);
+                dos.write(entry.getValue(), 0, entry.getValue().length);
+            }
+
+            //write deployed job spec id
+            dos.writeBoolean(fn.getDeployedJobSpecId() == null ? false : true);
+            if (fn.getDeployedJobSpecId() != null) {
+                fn.getDeployedJobSpecId().writeFields(dos);
+            }
+
         }
     }
 
@@ -951,11 +1032,12 @@
         }
     }
 
-    public static class ThreadDumpRequestFunction extends Function {
+    public static class ThreadDumpRequestFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
         private final String requestId;
 
-        public ThreadDumpRequestFunction(String requestId) {
+        public ThreadDumpRequestFunction(String requestId, CcId ccId) {
+            super(ccId);
             this.requestId = requestId;
         }
 
@@ -1049,13 +1131,14 @@
         }
     }
 
-    public static class DeployBinaryFunction extends Function {
+    public static class DeployBinaryFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
         private final List<URL> binaryURLs;
         private final DeploymentId deploymentId;
 
-        public DeployBinaryFunction(DeploymentId deploymentId, List<URL> binaryURLs) {
+        public DeployBinaryFunction(DeploymentId deploymentId, List<URL> binaryURLs, CcId ccId) {
+            super(ccId);
             this.binaryURLs = binaryURLs;
             this.deploymentId = deploymentId;
         }
@@ -1074,12 +1157,13 @@
         }
     }
 
-    public static class UnDeployBinaryFunction extends Function {
+    public static class UnDeployBinaryFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
         private final DeploymentId deploymentId;
 
-        public UnDeployBinaryFunction(DeploymentId deploymentId) {
+        public UnDeployBinaryFunction(DeploymentId deploymentId, CcId ccId) {
+            super(ccId);
             this.deploymentId = deploymentId;
         }
 
@@ -1154,12 +1238,13 @@
         }
     }
 
-    public static class StateDumpRequestFunction extends Function {
+    public static class StateDumpRequestFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
         private final String stateDumpId;
 
-        public StateDumpRequestFunction(String stateDumpId) {
+        public StateDumpRequestFunction(String stateDumpId, CcId ccId) {
+            super(ccId);
             this.stateDumpId = stateDumpId;
         }
 
@@ -1208,12 +1293,13 @@
         }
     }
 
-    public static class ShutdownRequestFunction extends Function {
+    public static class ShutdownRequestFunction extends CCIdentifiedFunction {
         private static final long serialVersionUID = 1L;
 
         private final boolean terminateNCService;
 
-        public ShutdownRequestFunction(boolean terminateNCService) {
+        public ShutdownRequestFunction(boolean terminateNCService, CcId ccId) {
+            super(ccId);
             this.terminateNCService = terminateNCService;
         }
 
@@ -1228,6 +1314,7 @@
     }
 
     public static class ShutdownResponseFunction extends Function {
+        private static final long serialVersionUID = 1L;
 
         private final String nodeId;
 
@@ -1294,7 +1381,7 @@
             try {
                 serialize(baos, object, fid);
             } catch (Exception e) {
-                LOGGER.log(Level.SEVERE, "Error serializing " + object, e);
+                LOGGER.log(Level.ERROR, "Error serializing " + object, e);
                 throw e;
             }
             baos.close();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ClusterControllerRemoteProxy.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ClusterControllerRemoteProxy.java
index c09f317..027316e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ClusterControllerRemoteProxy.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ClusterControllerRemoteProxy.java
@@ -18,167 +18,164 @@
  */
 package org.apache.hyracks.control.common.ipc;
 
-import static org.apache.hyracks.control.common.ipc.CCNCFunctions.*;
-
-import java.net.InetSocketAddress;
 import java.util.List;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.common.base.IClusterController;
 import org.apache.hyracks.control.common.controllers.NodeRegistration;
 import org.apache.hyracks.control.common.deployment.DeploymentStatus;
 import org.apache.hyracks.control.common.heartbeat.HeartbeatData;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.GetNodeControllersInfoFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.NodeHeartbeatFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.NotifyDeployBinaryFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.NotifyJobletCleanupFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.NotifyTaskCompleteFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.NotifyTaskFailureFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.RegisterNodeFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.RegisterPartitionProviderFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.RegisterPartitionRequestFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.RegisterResultPartitionLocationFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ReportDeployedJobSpecFailureFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ReportProfileFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ReportResultPartitionWriteCompletionFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.SendApplicationMessageFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ShutdownResponseFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.StateDumpResponseFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ThreadDumpResponseFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.UnregisterNodeFunction;
 import org.apache.hyracks.control.common.job.PartitionDescriptor;
 import org.apache.hyracks.control.common.job.PartitionRequest;
 import org.apache.hyracks.control.common.job.profiling.om.JobProfile;
 import org.apache.hyracks.control.common.job.profiling.om.TaskProfile;
-import org.apache.hyracks.ipc.impl.IPCSystem;
+import org.apache.hyracks.ipc.api.IIPCHandle;
 
-public class ClusterControllerRemoteProxy extends ControllerRemoteProxy implements IClusterController {
-    private static final Logger LOGGER = Logger.getLogger(ClusterControllerRemoteProxy.class.getName());
+public class ClusterControllerRemoteProxy implements IClusterController {
 
-    private final int clusterConnectRetries;
+    private IIPCHandle ipcHandle;
 
-    public ClusterControllerRemoteProxy(IPCSystem ipc, InetSocketAddress inetSocketAddress, int clusterConnectRetries,
-                                        IControllerRemoteProxyIPCEventListener eventListener) {
-        super(ipc, inetSocketAddress, eventListener);
-        this.clusterConnectRetries = clusterConnectRetries;
-    }
-
-    @Override
-    protected int getMaxRetries(boolean first) {
-        // -1 == retry forever
-        return first ? clusterConnectRetries : 0;
-    }
-
-    @Override
-    protected Logger getLogger() {
-        return LOGGER;
+    public ClusterControllerRemoteProxy(IIPCHandle ipcHandle) {
+        this.ipcHandle = ipcHandle;
     }
 
     @Override
     public void registerNode(NodeRegistration reg) throws Exception {
         RegisterNodeFunction fn = new RegisterNodeFunction(reg);
-        ensureIpcHandle().send(-1, fn, null);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void unregisterNode(String nodeId) throws Exception {
         UnregisterNodeFunction fn = new UnregisterNodeFunction(nodeId);
-        ensureIpcHandle().send(-1, fn, null);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void notifyTaskComplete(JobId jobId, TaskAttemptId taskId, String nodeId, TaskProfile statistics)
             throws Exception {
-        NotifyTaskCompleteFunction fn = new NotifyTaskCompleteFunction(jobId, taskId,
-                nodeId, statistics);
-        ensureIpcHandle().send(-1, fn, null);
+        NotifyTaskCompleteFunction fn = new NotifyTaskCompleteFunction(jobId, taskId, nodeId, statistics);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void notifyTaskFailure(JobId jobId, TaskAttemptId taskId, String nodeId, List<Exception> exceptions)
             throws Exception {
-        NotifyTaskFailureFunction fn = new NotifyTaskFailureFunction(jobId, taskId, nodeId,
-                exceptions);
-        ensureIpcHandle().send(-1, fn, null);
+        NotifyTaskFailureFunction fn = new NotifyTaskFailureFunction(jobId, taskId, nodeId, exceptions);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void notifyJobletCleanup(JobId jobId, String nodeId) throws Exception {
         NotifyJobletCleanupFunction fn = new NotifyJobletCleanupFunction(jobId, nodeId);
-        ensureIpcHandle().send(-1, fn, null);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void notifyDeployBinary(DeploymentId deploymentId, String nodeId, DeploymentStatus status) throws Exception {
-        NotifyDeployBinaryFunction fn = new NotifyDeployBinaryFunction(deploymentId, nodeId,
-                status);
-        ensureIpcHandle().send(-1, fn, null);
+        NotifyDeployBinaryFunction fn = new NotifyDeployBinaryFunction(deploymentId, nodeId, status);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void nodeHeartbeat(String id, HeartbeatData hbData) throws Exception {
         NodeHeartbeatFunction fn = new NodeHeartbeatFunction(id, hbData);
-        ensureIpcHandle(0).send(-1, fn, null);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void reportProfile(String id, List<JobProfile> profiles) throws Exception {
         ReportProfileFunction fn = new ReportProfileFunction(id, profiles);
-        ensureIpcHandle().send(-1, fn, null);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void registerPartitionProvider(PartitionDescriptor partitionDescriptor) throws Exception {
-        RegisterPartitionProviderFunction fn = new RegisterPartitionProviderFunction(
-                partitionDescriptor);
-        ensureIpcHandle().send(-1, fn, null);
+        RegisterPartitionProviderFunction fn = new RegisterPartitionProviderFunction(partitionDescriptor);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void registerPartitionRequest(PartitionRequest partitionRequest) throws Exception {
-        RegisterPartitionRequestFunction fn = new RegisterPartitionRequestFunction(
-                partitionRequest);
-        ensureIpcHandle().send(-1, fn, null);
+        RegisterPartitionRequestFunction fn = new RegisterPartitionRequestFunction(partitionRequest);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void sendApplicationMessageToCC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception {
-        SendApplicationMessageFunction fn = new SendApplicationMessageFunction(data,
-                deploymentId, nodeId);
-        ensureIpcHandle().send(-1, fn, null);
+        SendApplicationMessageFunction fn = new SendApplicationMessageFunction(data, deploymentId, nodeId);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void registerResultPartitionLocation(JobId jobId, ResultSetId rsId, boolean orderedResult,
             boolean emptyResult, int partition, int nPartitions, NetworkAddress networkAddress) throws Exception {
-        RegisterResultPartitionLocationFunction fn = new RegisterResultPartitionLocationFunction(
-                jobId, rsId, orderedResult, emptyResult, partition, nPartitions, networkAddress);
-        ensureIpcHandle().send(-1, fn, null);
+        RegisterResultPartitionLocationFunction fn = new RegisterResultPartitionLocationFunction(jobId, rsId,
+                orderedResult, emptyResult, partition, nPartitions, networkAddress);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void reportResultPartitionWriteCompletion(JobId jobId, ResultSetId rsId, int partition) throws Exception {
-        ReportResultPartitionWriteCompletionFunction fn = new ReportResultPartitionWriteCompletionFunction(
-                jobId, rsId, partition);
-        ensureIpcHandle().send(-1, fn, null);
+        ReportResultPartitionWriteCompletionFunction fn =
+                new ReportResultPartitionWriteCompletionFunction(jobId, rsId, partition);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
-    public void notifyDistributedJobFailure(JobId jobId, String nodeId) throws Exception {
-        ReportDistributedJobFailureFunction fn = new ReportDistributedJobFailureFunction(
-                jobId, nodeId);
-        ensureIpcHandle().send(-1, fn, null);
+    public void notifyDeployedJobSpecFailure(DeployedJobSpecId deployedJobSpecId, String nodeId) throws Exception {
+        ReportDeployedJobSpecFailureFunction fn = new ReportDeployedJobSpecFailureFunction(deployedJobSpecId, nodeId);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void getNodeControllerInfos() throws Exception {
-        ensureIpcHandle().send(-1, new GetNodeControllersInfoFunction(), null);
+        ipcHandle.send(-1, new GetNodeControllersInfoFunction(), null);
     }
 
     @Override
     public void notifyStateDump(String nodeId, String stateDumpId, String state) throws Exception {
-        StateDumpResponseFunction fn = new StateDumpResponseFunction(nodeId, stateDumpId,
-                state);
-        ensureIpcHandle().send(-1, fn, null);
+        StateDumpResponseFunction fn = new StateDumpResponseFunction(nodeId, stateDumpId, state);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void notifyShutdown(String nodeId) throws Exception {
         ShutdownResponseFunction sdrf = new ShutdownResponseFunction(nodeId);
-        ensureIpcHandle().send(-1, sdrf, null);
+        ipcHandle.send(-1, sdrf, null);
     }
 
     @Override
     public void notifyThreadDump(String nodeId, String requestId, String threadDumpJSON) throws Exception {
-        ThreadDumpResponseFunction tdrf = new ThreadDumpResponseFunction(nodeId, requestId,
-                threadDumpJSON);
-        ensureIpcHandle().send(-1, tdrf, null);
+        ThreadDumpResponseFunction tdrf = new ThreadDumpResponseFunction(nodeId, requestId, threadDumpJSON);
+        ipcHandle.send(-1, tdrf, null);
+    }
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + " [" + ipcHandle.getRemoteAddress() + "]";
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ControllerRemoteProxy.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ControllerRemoteProxy.java
deleted file mode 100644
index 83972d5..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/ControllerRemoteProxy.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.common.ipc;
-
-import java.net.InetSocketAddress;
-import java.util.logging.Logger;
-
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.ipc.api.IIPCHandle;
-import org.apache.hyracks.ipc.exceptions.IPCException;
-import org.apache.hyracks.ipc.impl.IPCSystem;
-
-public abstract class ControllerRemoteProxy {
-    protected final IPCSystem ipc;
-    private final InetSocketAddress inetSocketAddress;
-    private final IControllerRemoteProxyIPCEventListener eventListener;
-    private IIPCHandle ipcHandle;
-
-    protected ControllerRemoteProxy(IPCSystem ipc, InetSocketAddress inetSocketAddress) {
-        this(ipc, inetSocketAddress, null);
-    }
-
-    protected ControllerRemoteProxy(IPCSystem ipc, InetSocketAddress inetSocketAddress,
-            IControllerRemoteProxyIPCEventListener eventListener) {
-        this.ipc = ipc;
-        this.inetSocketAddress = inetSocketAddress;
-        this.eventListener = eventListener == null ? new IControllerRemoteProxyIPCEventListener() {
-        } : eventListener;
-    }
-
-    protected IIPCHandle ensureIpcHandle() throws HyracksDataException {
-        return ensureIpcHandle(getMaxRetries(ipcHandle == null));
-    }
-
-    protected IIPCHandle ensureIpcHandle(int maxRetries) throws HyracksDataException {
-        if (ipcHandle != null && ipcHandle.isConnected()) {
-            return ipcHandle;
-        }
-        try {
-            final boolean first = ipcHandle == null;
-            if (!first) {
-                getLogger().warning("ipcHandle " + ipcHandle + " disconnected; retrying connection");
-                eventListener.ipcHandleDisconnected(ipcHandle);
-            }
-            ipcHandle = ipc.getHandle(inetSocketAddress, maxRetries);
-            if (first) {
-                eventListener.ipcHandleConnected(ipcHandle);
-            } else {
-                getLogger().warning("ipcHandle " + ipcHandle + " restored");
-                eventListener.ipcHandleRestored(ipcHandle);
-            }
-        } catch (IPCException e) {
-            throw HyracksDataException.create(e);
-        }
-        return ipcHandle;
-    }
-
-    /**
-     * Maximum number of times to retry a failed connection attempt
-     * @param first true if the initial connection attempt (i.e. server start)
-     * @return the maximum number of retries, if any.  <0 means retry forever
-     */
-    protected abstract int getMaxRetries(boolean first);
-
-    protected abstract Logger getLogger();
-
-    public InetSocketAddress getAddress() {
-        return inetSocketAddress;
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/IControllerRemoteProxyIPCEventListener.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/IControllerRemoteProxyIPCEventListener.java
deleted file mode 100644
index ec4f9e4..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/IControllerRemoteProxyIPCEventListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.control.common.ipc;
-
-import org.apache.hyracks.ipc.api.IIPCHandle;
-import org.apache.hyracks.ipc.exceptions.IPCException;
-
-public interface IControllerRemoteProxyIPCEventListener {
-
-    default void ipcHandleConnected(IIPCHandle handle) throws IPCException {
-        // no-op
-    }
-
-    default void ipcHandleDisconnected(IIPCHandle handle) throws IPCException {
-        // no-op
-    }
-
-    default void ipcHandleRestored(IIPCHandle handle) throws IPCException {
-        // no-op
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/NodeControllerRemoteProxy.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/NodeControllerRemoteProxy.java
index 3819ef8..429cb26 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/NodeControllerRemoteProxy.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/ipc/NodeControllerRemoteProxy.java
@@ -18,120 +18,125 @@
  */
 package org.apache.hyracks.control.common.ipc;
 
-import static org.apache.hyracks.control.common.ipc.CCNCFunctions.*;
-
 import java.net.InetSocketAddress;
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.NetworkAddress;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.dataflow.ConnectorDescriptorId;
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataflow.connectors.IConnectorPolicy;
 import org.apache.hyracks.api.deployment.DeploymentId;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.control.common.base.INodeController;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.AbortTasksFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.CleanupJobletFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.DeployBinaryFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.DeployJobSpecFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ReportPartitionAvailabilityFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.SendApplicationMessageFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ShutdownRequestFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.StartTasksFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.StateDumpRequestFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.ThreadDumpRequestFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.UnDeployBinaryFunction;
+import org.apache.hyracks.control.common.ipc.CCNCFunctions.UndeployJobSpecFunction;
 import org.apache.hyracks.control.common.job.TaskAttemptDescriptor;
-import org.apache.hyracks.ipc.impl.IPCSystem;
+import org.apache.hyracks.ipc.api.IIPCHandle;
 
-public class NodeControllerRemoteProxy extends ControllerRemoteProxy implements INodeController {
-    private static final Logger LOGGER = Logger.getLogger(NodeControllerRemoteProxy.class.getName());
+public class NodeControllerRemoteProxy implements INodeController {
+    private final CcId ccId;
+    private final IIPCHandle ipcHandle;
 
-    public NodeControllerRemoteProxy(IPCSystem ipc, InetSocketAddress inetSocketAddress) {
-        super(ipc, inetSocketAddress);
-    }
-
-    @Override
-    protected int getMaxRetries(boolean first) {
-        // -1 == retry forever
-        return 0;
-    }
-
-    @Override
-    protected Logger getLogger() {
-        return LOGGER;
+    public NodeControllerRemoteProxy(CcId ccId, IIPCHandle ipcHandle) {
+        this.ccId = ccId;
+        this.ipcHandle = ipcHandle;
     }
 
     @Override
     public void startTasks(DeploymentId deploymentId, JobId jobId, byte[] planBytes,
             List<TaskAttemptDescriptor> taskDescriptors, Map<ConnectorDescriptorId, IConnectorPolicy> connectorPolicies,
-            Set<JobFlag> flags) throws Exception {
-        StartTasksFunction stf = new StartTasksFunction(deploymentId, jobId, planBytes,
-                taskDescriptors, connectorPolicies, flags);
-        ensureIpcHandle().send(-1, stf, null);
+            Set<JobFlag> flags, Map<byte[], byte[]> jobParameters, DeployedJobSpecId deployedJobSpecId)
+            throws Exception {
+        StartTasksFunction stf = new StartTasksFunction(deploymentId, jobId, planBytes, taskDescriptors,
+                connectorPolicies, flags, jobParameters, deployedJobSpecId);
+        ipcHandle.send(-1, stf, null);
     }
 
     @Override
     public void abortTasks(JobId jobId, List<TaskAttemptId> tasks) throws Exception {
         AbortTasksFunction atf = new AbortTasksFunction(jobId, tasks);
-        ensureIpcHandle().send(-1, atf, null);
+        ipcHandle.send(-1, atf, null);
     }
 
     @Override
     public void cleanUpJoblet(JobId jobId, JobStatus status) throws Exception {
         CleanupJobletFunction cjf = new CleanupJobletFunction(jobId, status);
-        ensureIpcHandle().send(-1, cjf, null);
+        ipcHandle.send(-1, cjf, null);
     }
 
     @Override
     public void reportPartitionAvailability(PartitionId pid, NetworkAddress networkAddress) throws Exception {
-        ReportPartitionAvailabilityFunction rpaf = new ReportPartitionAvailabilityFunction(
-                pid, networkAddress);
-        ensureIpcHandle().send(-1, rpaf, null);
+        ReportPartitionAvailabilityFunction rpaf = new ReportPartitionAvailabilityFunction(pid, networkAddress);
+        ipcHandle.send(-1, rpaf, null);
     }
 
     @Override
     public void deployBinary(DeploymentId deploymentId, List<URL> binaryURLs) throws Exception {
-        DeployBinaryFunction rpaf = new DeployBinaryFunction(deploymentId, binaryURLs);
-        ensureIpcHandle().send(-1, rpaf, null);
+        DeployBinaryFunction rpaf = new DeployBinaryFunction(deploymentId, binaryURLs, ccId);
+        ipcHandle.send(-1, rpaf, null);
     }
 
     @Override
     public void undeployBinary(DeploymentId deploymentId) throws Exception {
-        UnDeployBinaryFunction rpaf = new UnDeployBinaryFunction(deploymentId);
-        ensureIpcHandle().send(-1, rpaf, null);
+        UnDeployBinaryFunction rpaf = new UnDeployBinaryFunction(deploymentId, ccId);
+        ipcHandle.send(-1, rpaf, null);
     }
 
     @Override
-    public void distributeJob(JobId jobId, byte[] planBytes) throws Exception {
-        DistributeJobFunction fn = new DistributeJobFunction(jobId, planBytes);
-        ensureIpcHandle().send(-1, fn, null);
+    public void deployJobSpec(DeployedJobSpecId deployedJobSpecId, byte[] planBytes) throws Exception {
+        DeployJobSpecFunction fn = new DeployJobSpecFunction(deployedJobSpecId, planBytes, ccId);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
-    public void destroyJob(JobId jobId) throws Exception {
-        DestroyJobFunction fn = new DestroyJobFunction(jobId);
-        ensureIpcHandle().send(-1, fn, null);
+    public void undeployJobSpec(DeployedJobSpecId deployedJobSpecId) throws Exception {
+        UndeployJobSpecFunction fn = new UndeployJobSpecFunction(deployedJobSpecId, ccId);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void dumpState(String stateDumpId) throws Exception {
-        StateDumpRequestFunction dsf = new StateDumpRequestFunction(stateDumpId);
-        ensureIpcHandle().send(-1, dsf, null);
+        StateDumpRequestFunction dsf = new StateDumpRequestFunction(stateDumpId, ccId);
+        ipcHandle.send(-1, dsf, null);
     }
 
     @Override
     public void shutdown(boolean terminateNCService) throws Exception {
-        ShutdownRequestFunction sdrf = new ShutdownRequestFunction(terminateNCService);
-        ensureIpcHandle().send(-1, sdrf, null);
+        ShutdownRequestFunction sdrf = new ShutdownRequestFunction(terminateNCService, ccId);
+        ipcHandle.send(-1, sdrf, null);
     }
 
     @Override
     public void sendApplicationMessageToNC(byte[] data, DeploymentId deploymentId, String nodeId) throws Exception {
-        SendApplicationMessageFunction fn = new SendApplicationMessageFunction(data,
-                deploymentId, nodeId);
-        ensureIpcHandle().send(-1, fn, null);
+        SendApplicationMessageFunction fn = new SendApplicationMessageFunction(data, deploymentId, nodeId);
+        ipcHandle.send(-1, fn, null);
     }
 
     @Override
     public void takeThreadDump(String requestId) throws Exception {
-        ThreadDumpRequestFunction fn = new ThreadDumpRequestFunction(requestId);
-        ensureIpcHandle().send(-1, fn, null);
+        ThreadDumpRequestFunction fn = new ThreadDumpRequestFunction(requestId, ccId);
+        ipcHandle.send(-1, fn, null);
+    }
+
+    public InetSocketAddress getAddress() {
+        return ipcHandle.getRemoteAddress();
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/AbstractProfile.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/AbstractProfile.java
index 90dfc8c..bd98200 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/AbstractProfile.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/AbstractProfile.java
@@ -45,7 +45,7 @@
         return counters;
     }
 
-    public abstract ObjectNode toJSON() ;
+    public abstract ObjectNode toJSON();
 
     protected void populateCounters(ObjectNode jo) {
         ObjectMapper om = new ObjectMapper();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobProfile.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobProfile.java
index 64d074b..c4eff85 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobProfile.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobProfile.java
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobletProfile.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobletProfile.java
index 5bdb1b5..687874c 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobletProfile.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/JobletProfile.java
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
 
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
index 3b54887..f977654 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/job/profiling/om/TaskProfile.java
@@ -70,7 +70,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
 
         ObjectMapper om = new ObjectMapper();
         ObjectNode json = om.createObjectNode();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/shutdown/ShutdownRun.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/shutdown/ShutdownRun.java
index eae2eb6..e210963 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/shutdown/ShutdownRun.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/shutdown/ShutdownRun.java
@@ -24,7 +24,7 @@
 import java.util.TreeSet;
 import java.util.concurrent.TimeUnit;
 
-public class ShutdownRun implements IShutdownStatusConditionVariable{
+public class ShutdownRun implements IShutdownStatusConditionVariable {
 
     private final Set<String> shutdownNodeIds = new TreeSet<>();
     private boolean shutdownSuccess = false;
@@ -60,7 +60,7 @@
         return shutdownSuccess;
     }
 
-    public synchronized Set<String> getRemainingNodes(){
+    public synchronized Set<String> getRemainingNodes() {
         return shutdownNodeIds;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/HyracksThreadFactory.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/HyracksThreadFactory.java
index c9ef4d08..6c50b09 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/HyracksThreadFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/utils/HyracksThreadFactory.java
@@ -21,14 +21,16 @@
 import java.lang.Thread.UncaughtExceptionHandler;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class HyracksThreadFactory implements ThreadFactory {
     private final String identifier;
     private final AtomicInteger threadId = new AtomicInteger();
 
-    private static final Logger LOGGER = Logger.getLogger(HyracksThreadFactory.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public HyracksThreadFactory(String identifier) {
         this.identifier = identifier;
@@ -41,7 +43,7 @@
         t.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
             @Override
             public void uncaughtException(Thread t, Throwable e) {
-                LOGGER.log(Level.SEVERE, "Uncaught exception by " + t.getName(), e);
+                LOGGER.log(Level.ERROR, "Uncaught exception by " + t.getName(), e);
             }
         });
         return t;
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/AbstractWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/AbstractWork.java
index 076dd66..b7f3332 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/AbstractWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/AbstractWork.java
@@ -18,9 +18,10 @@
  */
 package org.apache.hyracks.control.common.work;
 
-import java.util.logging.Level;
+import org.apache.logging.log4j.Level;
 
 public abstract class AbstractWork implements Runnable {
+
     public Level logLevel() {
         return Level.INFO;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/SynchronizableWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/SynchronizableWork.java
index f9952db..ad64fd2 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/SynchronizableWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/SynchronizableWork.java
@@ -18,10 +18,14 @@
  */
 package org.apache.hyracks.control.common.work;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class SynchronizableWork extends AbstractWork {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
     private boolean done;
 
     private Exception e;
@@ -38,7 +42,7 @@
         try {
             doRun();
         } catch (Exception ex) {
-            Logger.getLogger(getClass().getName()).log(Level.INFO, "Exception thrown from work", ex);
+            LOGGER.log(Level.INFO, "Exception thrown from work", ex);
             this.e = ex;
         } finally {
             synchronized (this) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/WorkQueue.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/WorkQueue.java
index f1b00ab..8ed7c9e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/WorkQueue.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-common/src/main/java/org/apache/hyracks/control/common/work/WorkQueue.java
@@ -23,13 +23,14 @@
 import java.lang.management.ThreadMXBean;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class WorkQueue {
-    private static final Logger LOGGER = Logger.getLogger(WorkQueue.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     //to be fixed when application vs. hyracks log level issues are sorted
     private static final boolean DEBUG = false;
 
@@ -80,10 +81,10 @@
 
     public void schedule(AbstractWork event) {
         if (DEBUG) {
-            LOGGER.log(Level.FINEST, "Enqueue (" + hashCode() + "): " + enqueueCount.incrementAndGet());
+            LOGGER.log(Level.DEBUG, "Enqueue (" + hashCode() + "): " + enqueueCount.incrementAndGet());
         }
-        if (LOGGER.isLoggable(Level.FINER)) {
-            LOGGER.finer("Scheduling: " + event);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Scheduling: " + event);
         }
         queue.offer(event);
     }
@@ -115,18 +116,17 @@
                     break;
                 }
                 if (DEBUG) {
-                    LOGGER.log(Level.FINEST,
-                            "Dequeue (" + WorkQueue.this.hashCode() + "): " + dequeueCount.incrementAndGet() + "/"
-                                    + enqueueCount);
+                    LOGGER.log(Level.TRACE, "Dequeue (" + WorkQueue.this.hashCode() + "): "
+                            + dequeueCount.incrementAndGet() + "/" + enqueueCount);
                 }
-                if (LOGGER.isLoggable(r.logLevel())) {
+                if (LOGGER.isEnabled(r.logLevel())) {
                     LOGGER.log(r.logLevel(), "Executing: " + r);
                 }
                 ThreadInfo before = threadMXBean.getThreadInfo(thread.getId());
                 try {
                     r.run();
                 } catch (Exception e) {
-                    LOGGER.log(Level.WARNING, "Exception while executing " + r, e);
+                    LOGGER.log(Level.WARN, "Exception while executing " + r, e);
                 } finally {
                     auditWaitsAndBlocks(r, before);
                 }
@@ -138,10 +138,9 @@
             final long waitedDelta = after.getWaitedCount() - before.getWaitedCount();
             final long blockedDelta = after.getBlockedCount() - before.getBlockedCount();
             if (waitedDelta > 0 || blockedDelta > 0) {
-                LOGGER.warning("Work " + r + " waited " + waitedDelta + " times (~"
+                LOGGER.warn("Work " + r + " waited " + waitedDelta + " times (~"
                         + (after.getWaitedTime() - before.getWaitedTime()) + "ms), blocked " + blockedDelta
-                        + " times (~" + (after.getBlockedTime() - before.getBlockedTime()) + "ms)"
-                );
+                        + " times (~" + (after.getBlockedTime() - before.getBlockedTime()) + "ms)");
             }
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/pom.xml
index 82ed6f6..d7ed47d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/pom.xml
@@ -83,5 +83,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/BaseNCApplication.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/BaseNCApplication.java
index 4d8cbbd..ea16032 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/BaseNCApplication.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/BaseNCApplication.java
@@ -20,19 +20,21 @@
 
 import java.lang.management.ManagementFactory;
 import java.util.Arrays;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.INCApplication;
 import org.apache.hyracks.api.application.IServiceContext;
 import org.apache.hyracks.api.config.IConfigManager;
 import org.apache.hyracks.api.config.Section;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.io.IFileDeviceResolver;
 import org.apache.hyracks.api.job.resource.NodeCapacity;
+import org.apache.hyracks.api.util.HyracksConstants;
 import org.apache.hyracks.control.common.controllers.CCConfig;
 import org.apache.hyracks.control.common.controllers.ControllerConfig;
 import org.apache.hyracks.control.common.controllers.NCConfig;
 import org.apache.hyracks.control.nc.io.DefaultDeviceResolver;
+import org.apache.hyracks.util.LoggingConfigUtil;
+import org.apache.logging.log4j.Level;
 
 public class BaseNCApplication implements INCApplication {
     public static final BaseNCApplication INSTANCE = new BaseNCApplication();
@@ -58,7 +60,7 @@
     }
 
     @Override
-    public void onRegisterNode() throws Exception {
+    public void onRegisterNode(CcId ccId) throws Exception {
         // no-op
     }
 
@@ -97,7 +99,7 @@
     }
 
     protected void configureLoggingLevel(Level level) {
-        Logger.getLogger("org.apache.hyracks").setLevel(level);
+        LoggingConfigUtil.defaultIfMissing(HyracksConstants.HYRACKS_LOGGER_NAME, level);
     }
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/CcConnection.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/CcConnection.java
new file mode 100644
index 0000000..63fffb4
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/CcConnection.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.control.nc;
+
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.control.common.base.IClusterController;
+import org.apache.hyracks.control.common.controllers.NodeParameters;
+import org.apache.hyracks.control.common.controllers.NodeRegistration;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class CcConnection {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private final IClusterController ccs;
+    private boolean registrationPending;
+    private Exception registrationException;
+    private NodeParameters nodeParameters;
+
+    CcConnection(IClusterController ccs) {
+        this.ccs = ccs;
+    }
+
+    @Override
+    public String toString() {
+        return ccs.toString();
+    }
+
+    public CcId getCcId() {
+        return getNodeParameters().getClusterControllerInfo().getCcId();
+    }
+
+    synchronized void setNodeRegistrationResult(NodeParameters parameters, Exception exception) {
+        nodeParameters = parameters;
+        registrationException = exception;
+        registrationPending = false;
+        notifyAll();
+    }
+
+    public synchronized CcId registerNode(NodeRegistration nodeRegistration) throws Exception {
+        registrationPending = true;
+        ccs.registerNode(nodeRegistration);
+        while (registrationPending) {
+            wait();
+        }
+        if (registrationException != null) {
+            LOGGER.log(Level.WARN, "Registering with {} failed with exception", this, registrationException);
+            throw registrationException;
+        }
+        return getCcId();
+    }
+
+    public IClusterController getClusterControllerService() {
+        return ccs;
+    }
+
+    public NodeParameters getNodeParameters() {
+        return nodeParameters;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
index 66a5e0f..8790434 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Joblet.java
@@ -25,7 +25,6 @@
 import java.util.Hashtable;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.comm.IPartitionCollector;
@@ -60,9 +59,11 @@
 import org.apache.hyracks.control.nc.io.WorkspaceFileFactory;
 import org.apache.hyracks.control.nc.resources.DefaultDeallocatableRegistry;
 import org.apache.hyracks.control.nc.resources.memory.FrameManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class Joblet implements IHyracksJobletContext, ICounterContext {
-    private static final Logger LOGGER = Logger.getLogger(Joblet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService nodeController;
 
@@ -100,8 +101,11 @@
 
     private boolean cleanupPending;
 
+    private final IJobletEventListenerFactory jobletEventListenerFactory;
+
     public Joblet(NodeControllerService nodeController, DeploymentId deploymentId, JobId jobId,
-            INCServiceContext serviceCtx, ActivityClusterGraph acg) {
+            INCServiceContext serviceCtx, ActivityClusterGraph acg,
+            IJobletEventListenerFactory jobletEventListenerFactory) {
         this.nodeController = nodeController;
         this.serviceCtx = serviceCtx;
         this.deploymentId = deploymentId;
@@ -117,9 +121,9 @@
         deallocatableRegistry = new DefaultDeallocatableRegistry();
         fileFactory = new WorkspaceFileFactory(this, serviceCtx.getIoManager());
         cleanupPending = false;
-        IJobletEventListenerFactory jelf = acg.getJobletEventListenerFactory();
-        if (jelf != null) {
-            IJobletEventListener listener = jelf.createListener(this);
+        this.jobletEventListenerFactory = jobletEventListenerFactory;
+        if (jobletEventListenerFactory != null) {
+            IJobletEventListener listener = jobletEventListenerFactory.createListener(this);
             this.jobletEventListener = listener;
             listener.jobletStart();
         } else {
@@ -134,6 +138,11 @@
         return jobId;
     }
 
+    @Override
+    public IJobletEventListenerFactory getJobletEventListenerFactory() {
+        return jobletEventListenerFactory;
+    }
+
     public ActivityClusterGraph getActivityClusterGraph() {
         return acg;
     }
@@ -213,15 +222,10 @@
     public void close() {
         long stillAllocated = memoryAllocation.get();
         if (stillAllocated > 0) {
-            LOGGER.warning("Freeing leaked " + stillAllocated + " bytes");
+            LOGGER.info(() -> "Freeing leaked " + stillAllocated + " bytes");
             serviceCtx.getMemoryManager().deallocate(stillAllocated);
         }
-        nodeController.getExecutor().execute(new Runnable() {
-            @Override
-            public void run() {
-                deallocatableRegistry.close();
-            }
-        });
+        nodeController.getExecutor().execute(() -> deallocatableRegistry.close());
     }
 
     ByteBuffer allocateFrame() throws HyracksDataException {
@@ -289,7 +293,7 @@
         for (PartitionId pid : pids) {
             partitionRequestMap.put(pid, collector);
             PartitionRequest req = new PartitionRequest(pid, nodeController.getId(), taId, minState);
-            nodeController.getClusterController().registerPartitionRequest(req);
+            nodeController.getClusterController(jobId.getCcId()).registerPartitionRequest(req);
         }
     }
 
@@ -317,7 +321,7 @@
         close();
         cleanupPending = false;
         try {
-            nodeController.getClusterController().notifyJobletCleanup(jobId, nodeController.getId());
+            nodeController.getClusterController(jobId.getCcId()).notifyJobletCleanup(jobId, nodeController.getId());
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -332,4 +336,5 @@
     public ClassLoader getClassLoader() throws HyracksException {
         return DeploymentUtils.getClassLoader(deploymentId, serviceCtx);
     }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCDriver.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCDriver.java
index 11df079..a03e0ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCDriver.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCDriver.java
@@ -20,18 +20,19 @@
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.INCApplication;
 import org.apache.hyracks.control.common.config.ConfigManager;
 import org.apache.hyracks.control.common.config.ConfigUtils;
 import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.kohsuke.args4j.CmdLineException;
 
 @SuppressWarnings("InfiniteLoopStatement")
 public class NCDriver {
-    private static final Logger LOGGER = Logger.getLogger(NCDriver.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private NCDriver() {
     }
@@ -49,10 +50,10 @@
                 Thread.sleep(10000);
             }
         } catch (CmdLineException e) {
-            LOGGER.log(Level.FINE, "Exception parsing command line: " + Arrays.toString(args), e);
+            LOGGER.log(Level.DEBUG, "Exception parsing command line: " + Arrays.toString(args), e);
             System.exit(2);
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Exiting NCDriver due to exception", e);
+            LOGGER.error("Exiting NCDriver due to exception", e);
             System.exit(1);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
index 6308373..020e564 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NCShutdownHook.java
@@ -18,10 +18,10 @@
  */
 package org.apache.hyracks.control.nc;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.util.ThreadDumpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Shutdown hook that invokes {@link NodeControllerService#stop() stop} method.
@@ -32,7 +32,7 @@
 
     public static final int FAILED_TO_STARTUP_EXIT_CODE = 2;
     public static final int FAILED_TO_RECOVER_EXIT_CODE = 3;
-    private static final Logger LOGGER = Logger.getLogger(NCShutdownHook.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final long SHUTDOWN_WAIT_TIME = 10 * 60 * 1000L;
     private final Thread watchDog;
     private final NodeControllerService nodeControllerService;
@@ -73,7 +73,7 @@
             LOGGER.log(Level.INFO, () -> "Thread dump at shutdown: " + ThreadDumpUtil.takeDumpString());
             nodeControllerService.stop();
         } catch (Throwable th) { // NOSONAR... This is fine since this is shutdown hook
-            LOGGER.log(Level.WARNING, "Exception in executing shutdown hook", th);
+            LOGGER.log(Level.WARN, "Exception in executing shutdown hook", th);
         }
     }
 }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerIPCI.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerIPCI.java
index 1eb1393..f55e250 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerIPCI.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerIPCI.java
@@ -27,12 +27,12 @@
 import org.apache.hyracks.control.nc.work.ApplicationMessageWork;
 import org.apache.hyracks.control.nc.work.CleanupJobletWork;
 import org.apache.hyracks.control.nc.work.DeployBinaryWork;
-import org.apache.hyracks.control.nc.work.DestroyJobWork;
-import org.apache.hyracks.control.nc.work.DistributeJobWork;
+import org.apache.hyracks.control.nc.work.DeployJobSpecWork;
 import org.apache.hyracks.control.nc.work.ReportPartitionAvailabilityWork;
 import org.apache.hyracks.control.nc.work.StartTasksWork;
 import org.apache.hyracks.control.nc.work.StateDumpWork;
 import org.apache.hyracks.control.nc.work.UnDeployBinaryWork;
+import org.apache.hyracks.control.nc.work.UndeployJobSpecWork;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.api.IIPCI;
 
@@ -62,15 +62,18 @@
                 return;
             case START_TASKS:
                 CCNCFunctions.StartTasksFunction stf = (CCNCFunctions.StartTasksFunction) fn;
-                ncs.getWorkQueue().schedule(new StartTasksWork(ncs, stf.getDeploymentId(), stf.getJobId(),
-                        stf.getPlanBytes(), stf.getTaskDescriptors(), stf.getConnectorPolicies(), stf.getFlags()));
+                ncs.getWorkQueue()
+                        .schedule(new StartTasksWork(ncs, stf.getDeploymentId(), stf.getJobId(), stf.getPlanBytes(),
+                                stf.getTaskDescriptors(), stf.getConnectorPolicies(), stf.getFlags(),
+                                stf.getJobParameters(), stf.getDeployedJobSpecId()));
                 return;
             case ABORT_TASKS:
                 CCNCFunctions.AbortTasksFunction atf = (CCNCFunctions.AbortTasksFunction) fn;
                 ncs.getWorkQueue().schedule(new AbortTasksWork(ncs, atf.getJobId(), atf.getTasks()));
                 return;
             case ABORT_ALL_JOBS:
-                ncs.getWorkQueue().schedule(new AbortAllJobsWork(ncs));
+                CCNCFunctions.AbortCCJobsFunction aajf = (CCNCFunctions.AbortCCJobsFunction) fn;
+                ncs.getWorkQueue().schedule(new AbortAllJobsWork(ncs, aajf.getCcId()));
                 return;
             case CLEANUP_JOBLET:
                 CCNCFunctions.CleanupJobletFunction cjf = (CCNCFunctions.CleanupJobletFunction) fn;
@@ -95,37 +98,39 @@
 
             case DEPLOY_BINARY:
                 CCNCFunctions.DeployBinaryFunction dbf = (CCNCFunctions.DeployBinaryFunction) fn;
-                ncs.getWorkQueue().schedule(new DeployBinaryWork(ncs, dbf.getDeploymentId(), dbf.getBinaryURLs()));
+                ncs.getWorkQueue()
+                        .schedule(new DeployBinaryWork(ncs, dbf.getDeploymentId(), dbf.getBinaryURLs(), dbf.getCcId()));
                 return;
 
             case UNDEPLOY_BINARY:
                 CCNCFunctions.UnDeployBinaryFunction ndbf = (CCNCFunctions.UnDeployBinaryFunction) fn;
-                ncs.getWorkQueue().schedule(new UnDeployBinaryWork(ncs, ndbf.getDeploymentId()));
+                ncs.getWorkQueue().schedule(new UnDeployBinaryWork(ncs, ndbf.getDeploymentId(), ndbf.getCcId()));
                 return;
 
             case DISTRIBUTE_JOB:
-                CCNCFunctions.DistributeJobFunction djf = (CCNCFunctions.DistributeJobFunction) fn;
-                ncs.getWorkQueue().schedule(new DistributeJobWork(ncs, djf.getJobId(), djf.getacgBytes()));
+                CCNCFunctions.DeployJobSpecFunction djf = (CCNCFunctions.DeployJobSpecFunction) fn;
+                ncs.getWorkQueue().schedule(
+                        new DeployJobSpecWork(ncs, djf.getDeployedJobSpecId(), djf.getacgBytes(), djf.getCcId()));
                 return;
 
             case DESTROY_JOB:
-                CCNCFunctions.DestroyJobFunction dsjf = (CCNCFunctions.DestroyJobFunction) fn;
-                ncs.getWorkQueue().schedule(new DestroyJobWork(ncs, dsjf.getJobId()));
+                CCNCFunctions.UndeployJobSpecFunction dsjf = (CCNCFunctions.UndeployJobSpecFunction) fn;
+                ncs.getWorkQueue().schedule(new UndeployJobSpecWork(ncs, dsjf.getDeployedJobSpecId(), dsjf.getCcId()));
                 return;
 
             case STATE_DUMP_REQUEST:
                 final CCNCFunctions.StateDumpRequestFunction dsrf = (StateDumpRequestFunction) fn;
-                ncs.getWorkQueue().schedule(new StateDumpWork(ncs, dsrf.getStateDumpId()));
+                ncs.getWorkQueue().schedule(new StateDumpWork(ncs, dsrf.getStateDumpId(), dsrf.getCcId()));
                 return;
 
             case SHUTDOWN_REQUEST:
                 final CCNCFunctions.ShutdownRequestFunction sdrf = (CCNCFunctions.ShutdownRequestFunction) fn;
-                ncs.getExecutor().submit(new ShutdownTask(ncs, sdrf.isTerminateNCService()));
+                ncs.getExecutor().submit(new ShutdownTask(sdrf.isTerminateNCService()));
                 return;
 
             case THREAD_DUMP_REQUEST:
                 final CCNCFunctions.ThreadDumpRequestFunction tdrf = (CCNCFunctions.ThreadDumpRequestFunction) fn;
-                ncs.getExecutor().submit(new ThreadDumpTask(ncs, tdrf.getRequestId()));
+                ncs.getExecutor().submit(new ThreadDumpTask(ncs, tdrf.getRequestId(), tdrf.getCcId()));
                 return;
 
             default:
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
index 7a01b87..b1909dd 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/NodeControllerService.java
@@ -20,6 +20,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Serializable;
 import java.lang.management.GarbageCollectorMXBean;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryMXBean;
@@ -29,31 +30,35 @@
 import java.lang.management.ThreadMXBean;
 import java.net.InetSocketAddress;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.mutable.Mutable;
 import org.apache.commons.lang3.mutable.MutableObject;
 import org.apache.hyracks.api.application.INCApplication;
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.api.comm.NetworkAddress;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.io.IODeviceHandle;
 import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
 import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.JobParameterByteStore;
 import org.apache.hyracks.api.lifecycle.ILifeCycleComponentManager;
 import org.apache.hyracks.api.lifecycle.LifeCycleComponentManager;
 import org.apache.hyracks.api.service.IControllerService;
@@ -67,7 +72,6 @@
 import org.apache.hyracks.control.common.heartbeat.HeartbeatSchema;
 import org.apache.hyracks.control.common.ipc.CCNCFunctions;
 import org.apache.hyracks.control.common.ipc.ClusterControllerRemoteProxy;
-import org.apache.hyracks.control.common.ipc.IControllerRemoteProxyIPCEventListener;
 import org.apache.hyracks.control.common.job.profiling.om.JobProfile;
 import org.apache.hyracks.control.common.work.FutureValue;
 import org.apache.hyracks.control.common.work.WorkQueue;
@@ -81,7 +85,9 @@
 import org.apache.hyracks.control.nc.net.NetworkManager;
 import org.apache.hyracks.control.nc.partitions.PartitionManager;
 import org.apache.hyracks.control.nc.resources.memory.MemoryManager;
+import org.apache.hyracks.control.nc.work.AbortAllJobsWork;
 import org.apache.hyracks.control.nc.work.BuildJobProfilesWork;
+import org.apache.hyracks.ipc.api.IIPCEventListener;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.api.IPCPerformanceCounters;
 import org.apache.hyracks.ipc.exceptions.IPCException;
@@ -89,18 +95,22 @@
 import org.apache.hyracks.net.protocols.muxdemux.FullFrameChannelInterfaceFactory;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemuxPerformanceCounters;
 import org.apache.hyracks.util.ExitUtil;
+import org.apache.hyracks.util.InvokeUtil;
 import org.apache.hyracks.util.PidHelper;
 import org.apache.hyracks.util.trace.ITracer;
 import org.apache.hyracks.util.trace.Tracer;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.kohsuke.args4j.CmdLineException;
 
 public class NodeControllerService implements IControllerService {
-    private static final Logger LOGGER = Logger.getLogger(NodeControllerService.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final double MEMORY_FUDGE_FACTOR = 0.8;
     private static final long ONE_SECOND_NANOS = TimeUnit.SECONDS.toNanos(1);
 
-    private NCConfig ncConfig;
+    private final NCConfig ncConfig;
 
     private final String id;
 
@@ -120,21 +130,27 @@
 
     private final Timer timer;
 
-    private boolean registrationPending;
+    private CcId primaryCcId;
 
-    private Exception registrationException;
+    private final Object ccLock = new Object();
 
-    private IClusterController ccs;
+    private final Map<CcId, CcConnection> ccMap = Collections.synchronizedMap(new HashMap<>());
+
+    private final Map<InetSocketAddress, CcId> ccAddressMap = Collections.synchronizedMap(new HashMap<>());
+
+    private final Map<Integer, CcConnection> pendingRegistrations = Collections.synchronizedMap(new HashMap<>());
 
     private final Map<JobId, Joblet> jobletMap;
 
-    private final Map<JobId, ActivityClusterGraph> preDistributedJobs;
+    private final Map<Long, ActivityClusterGraph> deployedJobSpecActivityClusterGraphMap;
+
+    private final Map<JobId, JobParameterByteStore> jobParameterByteStoreMap = new HashMap<>();
 
     private ExecutorService executor;
 
-    private NodeParameters nodeParameters;
+    private Map<CcId, Thread> heartbeatThreads = new ConcurrentHashMap<>();
 
-    private Thread heartbeatThread;
+    private Map<CcId, Timer> ccTimers = new ConcurrentHashMap<>();
 
     private final ServerContext serverCtx;
 
@@ -166,14 +182,14 @@
 
     private final ConfigManager configManager;
 
-    private NodeRegistration nodeRegistration;
-
-    private final AtomicLong maxJobId = new AtomicLong(-1);
+    private final Map<CcId, AtomicLong> maxJobIds = new ConcurrentHashMap<>();
 
     static {
         ExitUtil.init();
     }
 
+    private NCShutdownHook ncShutdownHook;
+
     public NodeControllerService(NCConfig config) throws Exception {
         this(config, getApplication(config));
     }
@@ -191,18 +207,19 @@
             throw new HyracksException("id not set");
         }
         lccm = new LifeCycleComponentManager();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Setting uncaught exception handler " + getLifeCycleComponentManager());
         }
         // Set shutdown hook before so it doesn't have the same uncaught exception handler
-        Runtime.getRuntime().addShutdownHook(new NCShutdownHook(this));
+        ncShutdownHook = new NCShutdownHook(this);
+        Runtime.getRuntime().addShutdownHook(ncShutdownHook);
         Thread.currentThread().setUncaughtExceptionHandler(getLifeCycleComponentManager());
         ioManager =
                 new IOManager(IODeviceHandle.getDevices(ncConfig.getIODevices()), application.getFileDeviceResolver());
 
         workQueue = new WorkQueue(id, Thread.NORM_PRIORITY); // Reserves MAX_PRIORITY of the heartbeat thread.
-        jobletMap = new Hashtable<>();
-        preDistributedJobs = new Hashtable<>();
+        jobletMap = new ConcurrentHashMap<>();
+        deployedJobSpecActivityClusterGraphMap = new Hashtable<>();
         timer = new Timer(true);
         serverCtx = new ServerContext(ServerContext.ServerType.NODE_CONTROLLER,
                 new File(new File(NodeControllerService.class.getName()), id));
@@ -229,13 +246,6 @@
         return lccm;
     }
 
-    synchronized void setNodeRegistrationResult(NodeParameters parameters, Exception exception) {
-        this.nodeParameters = parameters;
-        this.registrationException = exception;
-        this.registrationPending = false;
-        notifyAll();
-    }
-
     public Map<String, NodeControllerInfo> getNodeControllersInfo() throws Exception {
         FutureValue<Map<String, NodeControllerInfo>> fv = new FutureValue<>();
         synchronized (getNodeControllerInfosAcceptor) {
@@ -244,7 +254,7 @@
             }
             getNodeControllerInfosAcceptor.setValue(fv);
         }
-        ccs.getNodeControllerInfos();
+        getPrimaryClusterController().getNodeControllerInfos();
         return fv.get();
     }
 
@@ -291,78 +301,173 @@
         if (messagingNetManager != null) {
             messagingNetManager.start();
         }
-        this.ccs = new ClusterControllerRemoteProxy(ipc,
-                new InetSocketAddress(ncConfig.getClusterAddress(), ncConfig.getClusterPort()),
-                ncConfig.getClusterConnectRetries(), new IControllerRemoteProxyIPCEventListener() {
-                    @Override
-                    public void ipcHandleRestored(IIPCHandle handle) throws IPCException {
-                        // we need to re-register in case of NC -> CC connection reset
-                        try {
-                            registerNode();
-                        } catch (Exception e) {
-                            LOGGER.log(Level.WARNING, "Failed Registering with cc", e);
-                            throw new IPCException(e);
-                        }
-                    }
-                });
-        registerNode();
+
+        this.primaryCcId = addCc(new InetSocketAddress(ncConfig.getClusterAddress(), ncConfig.getClusterPort()));
 
         workQueue.start();
 
         // Schedule tracing a human-readable datetime
         timer.schedule(new TraceCurrentTimeTask(serviceCtx.getTracer()), 0, 60000);
 
-        if (nodeParameters.getProfileDumpPeriod() > 0) {
-            // Schedule profile dump generator.
-            timer.schedule(new ProfileDumpTask(ccs), 0, nodeParameters.getProfileDumpPeriod());
-        }
-
-        // Start heartbeat generator.
-        heartbeatThread = new Thread(new HeartbeatTask(ccs, nodeParameters.getHeartbeatPeriod()), id + "-Heartbeat");
-        heartbeatThread.setPriority(Thread.MAX_PRIORITY);
-        heartbeatThread.setDaemon(true);
-        heartbeatThread.start();
-
         LOGGER.log(Level.INFO, "Started NodeControllerService");
         application.startupCompleted();
     }
 
-    public void registerNode() throws Exception {
-        LOGGER.info("Registering with Cluster Controller");
-        registrationPending = true;
+    public CcId addCc(InetSocketAddress ccAddress) throws Exception {
+        synchronized (ccLock) {
+            LOGGER.info("addCc: {}", ccAddress);
+            if (ccAddress.isUnresolved()) {
+                throw new IllegalArgumentException("must use resolved InetSocketAddress");
+            }
+            if (ccAddressMap.containsKey(ccAddress)) {
+                throw new IllegalStateException("cc already registered: " + ccAddress);
+            }
+            final IIPCEventListener ipcEventListener = new IIPCEventListener() {
+                @Override
+                public void ipcHandleRestored(IIPCHandle handle) throws IPCException {
+                    // we need to re-register in case of NC -> CC connection reset
+                    try {
+                        registerNode(getCcConnection(ccAddressMap.get(ccAddress)), ccAddress);
+                    } catch (Exception e) {
+                        LOGGER.log(Level.WARN, "Failed Registering with cc", e);
+                        throw new IPCException(e);
+                    }
+                }
+            };
+            ClusterControllerRemoteProxy ccProxy = new ClusterControllerRemoteProxy(
+                    ipc.getHandle(ccAddress, ncConfig.getClusterConnectRetries(), 1, ipcEventListener));
+            CcConnection ccc = new CcConnection(ccProxy);
+            return registerNode(ccc, ccAddress);
+        }
+    }
+
+    public void makePrimaryCc(InetSocketAddress ccAddress) throws Exception {
+        LOGGER.info("makePrimaryCc: {}", ccAddress);
+        if (ccAddress.isUnresolved()) {
+            throw new IllegalArgumentException("must use resolved InetSocketAddress");
+        }
+        CcId newPrimaryCc = ccAddressMap.get(ccAddress);
+        if (newPrimaryCc == null) {
+            throw new IllegalArgumentException("unknown cc: " + ccAddress);
+        }
+        this.primaryCcId = newPrimaryCc;
+    }
+
+    public void removeCc(InetSocketAddress ccAddress) throws Exception {
+        synchronized (ccLock) {
+            LOGGER.info("removeCc: {}", ccAddress);
+            if (ccAddress.isUnresolved()) {
+                throw new IllegalArgumentException("must use resolved InetSocketAddress");
+            }
+            CcId ccId = ccAddressMap.get(ccAddress);
+            if (ccId == null) {
+                LOGGER.warn("ignoring request to remove unknown cc: {}", ccAddress);
+                return;
+            }
+            if (primaryCcId.equals(ccId)) {
+                throw new IllegalStateException("cannot remove primary cc: " + ccAddress);
+            }
+            try {
+                final CcConnection ccc = getCcConnection(ccId);
+                ccc.getClusterControllerService().unregisterNode(id);
+            } catch (Exception e) {
+                LOGGER.warn("ignoring exception trying to gracefully unregister cc {}: ", () -> ccId,
+                        () -> String.valueOf(e));
+            }
+            getWorkQueue().scheduleAndSync(new AbortAllJobsWork(this, ccId));
+            Thread hbThread = heartbeatThreads.remove(ccId);
+            hbThread.interrupt();
+            Timer ccTimer = ccTimers.remove(ccId);
+            if (ccTimer != null) {
+                ccTimer.cancel();
+            }
+            ccMap.remove(ccId);
+            ccAddressMap.remove(ccAddress);
+        }
+    }
+
+    protected CcId registerNode(CcConnection ccc, InetSocketAddress ccAddress) throws Exception {
+        LOGGER.info("Registering with Cluster Controller {}", ccc);
         HeartbeatSchema.GarbageCollectorInfo[] gcInfos = new HeartbeatSchema.GarbageCollectorInfo[gcMXBeans.size()];
         for (int i = 0; i < gcInfos.length; ++i) {
             gcInfos[i] = new HeartbeatSchema.GarbageCollectorInfo(gcMXBeans.get(i).getName());
         }
         HeartbeatSchema hbSchema = new HeartbeatSchema(gcInfos);
-        // Use "public" versions of network addresses and ports
+        // Use "public" versions of network addresses and ports, if defined
+        InetSocketAddress ncAddress;
+        if (ncConfig.getClusterPublicPort() == 0) {
+            ncAddress = ipc.getSocketAddress();
+        } else {
+            ncAddress = new InetSocketAddress(ncConfig.getClusterPublicAddress(), ncConfig.getClusterPublicPort());
+        }
         NetworkAddress datasetAddress = datasetNetworkManager.getPublicNetworkAddress();
         NetworkAddress netAddress = netManager.getPublicNetworkAddress();
-        NetworkAddress meesagingPort =
+        NetworkAddress messagingAddress =
                 messagingNetManager != null ? messagingNetManager.getPublicNetworkAddress() : null;
-        int allCores = osMXBean.getAvailableProcessors();
-        nodeRegistration = new NodeRegistration(ipc.getSocketAddress(), id, ncConfig, netAddress, datasetAddress,
-                osMXBean.getName(), osMXBean.getArch(), osMXBean.getVersion(), allCores, runtimeMXBean.getVmName(),
-                runtimeMXBean.getVmVersion(), runtimeMXBean.getVmVendor(), runtimeMXBean.getClassPath(),
-                runtimeMXBean.getLibraryPath(), runtimeMXBean.getBootClassPath(), runtimeMXBean.getInputArguments(),
-                runtimeMXBean.getSystemProperties(), hbSchema, meesagingPort, application.getCapacity(),
-                PidHelper.getPid(), maxJobId.get());
+        NodeRegistration nodeRegistration = new NodeRegistration(ncAddress, id, ncConfig, netAddress, datasetAddress,
+                osMXBean.getName(), osMXBean.getArch(), osMXBean.getVersion(), osMXBean.getAvailableProcessors(),
+                runtimeMXBean.getVmName(), runtimeMXBean.getVmVersion(), runtimeMXBean.getVmVendor(),
+                runtimeMXBean.getClassPath(), runtimeMXBean.getLibraryPath(), runtimeMXBean.getBootClassPath(),
+                runtimeMXBean.getInputArguments(), runtimeMXBean.getSystemProperties(), hbSchema, messagingAddress,
+                application.getCapacity(), PidHelper.getPid());
 
-        ccs.registerNode(nodeRegistration);
+        pendingRegistrations.put(nodeRegistration.getRegistrationId(), ccc);
+        CcId ccId = ccc.registerNode(nodeRegistration);
+        ccMap.put(ccId, ccc);
+        ccAddressMap.put(ccAddress, ccId);
+        Serializable distributedState = ccc.getNodeParameters().getDistributedState();
+        if (distributedState != null) {
+            getDistributedState().put(ccId, distributedState);
+        }
+        application.onRegisterNode(ccId);
+        IClusterController ccs = ccc.getClusterControllerService();
+        NodeParameters nodeParameters = ccc.getNodeParameters();
 
-        synchronized (this) {
-            while (registrationPending) {
-                wait();
-            }
+        // Start heartbeat generator.
+        if (!heartbeatThreads.containsKey(ccId)) {
+            Thread heartbeatThread =
+                    new Thread(new HeartbeatTask(ccs, nodeParameters.getHeartbeatPeriod()), id + "-Heartbeat");
+            heartbeatThread.setPriority(Thread.MAX_PRIORITY);
+            heartbeatThread.setDaemon(true);
+            heartbeatThread.start();
+            heartbeatThreads.put(ccId, heartbeatThread);
         }
-        if (registrationException != null) {
-            LOGGER.log(Level.WARNING, "Registering with Cluster Controller failed with exception",
-                    registrationException);
-            throw registrationException;
+        if (!ccTimers.containsKey(ccId) && nodeParameters.getProfileDumpPeriod() > 0) {
+            Timer ccTimer = new Timer("Timer-" + ccId, true);
+            // Schedule profile dump generator.
+            ccTimer.schedule(new ProfileDumpTask(ccs, ccId), 0, nodeParameters.getProfileDumpPeriod());
+            ccTimers.put(ccId, ccTimer);
         }
-        serviceCtx.setDistributedState(nodeParameters.getDistributedState());
-        application.onRegisterNode();
-        LOGGER.info("Registering with Cluster Controller complete");
+
+        LOGGER.info("Registering with Cluster Controller {} complete", ccc);
+        return ccId;
+    }
+
+    void setNodeRegistrationResult(NodeParameters parameters, Exception exception) {
+        CcConnection ccc = getPendingNodeRegistration(parameters);
+        ccc.setNodeRegistrationResult(parameters, exception);
+    }
+
+    private CcConnection getCcConnection(CcId ccId) {
+        CcConnection ccConnection = ccMap.get(ccId);
+        if (ccConnection == null) {
+            throw new IllegalArgumentException("unknown ccId: " + ccId);
+        }
+        return ccConnection;
+    }
+
+    private CcConnection getPendingNodeRegistration(NodeParameters nodeParameters) {
+        CcConnection ccConnection = pendingRegistrations.remove(nodeParameters.getRegistrationId());
+        if (ccConnection == null) {
+            throw new IllegalStateException("Unknown pending node registration " + nodeParameters.getRegistrationId()
+                    + " for " + nodeParameters.getClusterControllerInfo().getCcId());
+        }
+        return ccConnection;
+    }
+
+    private ConcurrentHashMap<CcId, Serializable> getDistributedState() {
+        //noinspection unchecked
+        return (ConcurrentHashMap<CcId, Serializable>) serviceCtx.getDistributedState();
     }
 
     private void startApplication() throws Exception {
@@ -374,7 +479,12 @@
     }
 
     public void updateMaxJobId(JobId jobId) {
-        maxJobId.getAndUpdate(currentMaxId -> Math.max(currentMaxId, jobId.getId()));
+        maxJobIds.computeIfAbsent(jobId.getCcId(), key -> new AtomicLong())
+                .getAndUpdate(currentMaxId -> Math.max(currentMaxId, jobId.getId()));
+    }
+
+    public long getMaxJobId(CcId ccId) {
+        return maxJobIds.computeIfAbsent(ccId, key -> new AtomicLong(ccId.toLongMask())).get();
     }
 
     @Override
@@ -385,7 +495,7 @@
             application.preStop();
             executor.shutdownNow();
             if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
-                LOGGER.log(Level.SEVERE, "Some jobs failed to exit, continuing with abnormal shutdown");
+                LOGGER.log(Level.ERROR, "Some jobs failed to exit, continuing with abnormal shutdown");
             }
             partitionManager.close();
             datasetPartitionManager.close();
@@ -397,18 +507,37 @@
             workQueue.stop();
             application.stop();
             /*
-             * Stop heartbeat after NC has stopped to avoid false node failure detection
+             * Stop heartbeats only after NC has stopped to avoid false node failure detection
              * on CC if an NC takes a long time to stop.
              */
-            if (heartbeatThread != null) {
-                heartbeatThread.interrupt();
-                heartbeatThread.join(1000); // give it 1s to stop gracefully
+            heartbeatThreads.values().parallelStream().forEach(t -> {
+                t.interrupt();
+                InvokeUtil.doUninterruptibly(() -> t.join(1000));
+            });
+            synchronized (ccLock) {
+                ccMap.values().parallelStream().forEach(cc -> {
+                    try {
+                        cc.getClusterControllerService().notifyShutdown(id);
+                    } catch (Exception e) {
+                        LOGGER.log(Level.WARN, "Exception notifying CC of shutdown", e);
+                    }
+                });
             }
+            ipc.stop();
+
             LOGGER.log(Level.INFO, "Stopped NodeControllerService");
         } else {
-            LOGGER.log(Level.SEVERE, "Duplicate shutdown call; original: " + Arrays.toString(shutdownCallStack),
+            LOGGER.log(Level.ERROR, "Duplicate shutdown call; original: " + Arrays.toString(shutdownCallStack),
                     new Exception("Duplicate shutdown call"));
         }
+        if (ncShutdownHook != null) {
+            try {
+                Runtime.getRuntime().removeShutdownHook(ncShutdownHook);
+                LOGGER.info("removed shutdown hook for {}", id);
+            } catch (IllegalStateException e) {
+                LOGGER.log(Level.DEBUG, "ignoring exception while attempting to remove shutdown hook", e);
+            }
+        }
     }
 
     public String getId() {
@@ -423,28 +552,37 @@
         return jobletMap;
     }
 
-    public void storeActivityClusterGraph(JobId jobId, ActivityClusterGraph acg) throws HyracksException {
-        if (preDistributedJobs.get(jobId) != null) {
-            throw HyracksException.create(ErrorCode.DUPLICATE_DISTRIBUTED_JOB, jobId);
-        }
-        preDistributedJobs.put(jobId, acg);
+    public void removeJobParameterByteStore(JobId jobId) {
+        jobParameterByteStoreMap.remove(jobId);
     }
 
-    public void removeActivityClusterGraph(JobId jobId) throws HyracksException {
-        if (preDistributedJobs.get(jobId) == null) {
-            throw HyracksException.create(ErrorCode.ERROR_FINDING_DISTRIBUTED_JOB, jobId);
-        }
-        preDistributedJobs.remove(jobId);
+    public JobParameterByteStore createOrGetJobParameterByteStore(JobId jobId) {
+        return jobParameterByteStoreMap.computeIfAbsent(jobId, jid -> new JobParameterByteStore());
     }
 
-    public void checkForDuplicateDistributedJob(JobId jobId) throws HyracksException {
-        if (preDistributedJobs.get(jobId) != null) {
-            throw HyracksException.create(ErrorCode.DUPLICATE_DISTRIBUTED_JOB, jobId);
+    public void storeActivityClusterGraph(DeployedJobSpecId deployedJobSpecId, ActivityClusterGraph acg)
+            throws HyracksException {
+        if (deployedJobSpecActivityClusterGraphMap.get(deployedJobSpecId.getId()) != null) {
+            throw HyracksException.create(ErrorCode.DUPLICATE_DEPLOYED_JOB, deployedJobSpecId);
+        }
+        deployedJobSpecActivityClusterGraphMap.put(deployedJobSpecId.getId(), acg);
+    }
+
+    public void removeActivityClusterGraph(DeployedJobSpecId deployedJobSpecId) throws HyracksException {
+        if (deployedJobSpecActivityClusterGraphMap.get(deployedJobSpecId.getId()) == null) {
+            throw HyracksException.create(ErrorCode.ERROR_FINDING_DEPLOYED_JOB, deployedJobSpecId);
+        }
+        deployedJobSpecActivityClusterGraphMap.remove(deployedJobSpecId.getId());
+    }
+
+    public void checkForDuplicateDeployedJobSpec(DeployedJobSpecId deployedJobSpecId) throws HyracksException {
+        if (deployedJobSpecActivityClusterGraphMap.get(deployedJobSpecId.getId()) != null) {
+            throw HyracksException.create(ErrorCode.DUPLICATE_DEPLOYED_JOB, deployedJobSpecId);
         }
     }
 
-    public ActivityClusterGraph getActivityClusterGraph(JobId jobId) throws HyracksException {
-        return preDistributedJobs.get(jobId);
+    public ActivityClusterGraph getActivityClusterGraph(DeployedJobSpecId deployedJobSpecId) {
+        return deployedJobSpecActivityClusterGraphMap.get(deployedJobSpecId.getId());
     }
 
     public NetworkManager getNetworkManager() {
@@ -459,12 +597,21 @@
         return partitionManager;
     }
 
-    public IClusterController getClusterController() {
-        return ccs;
+    public CcId getPrimaryCcId() {
+        // TODO(mblow): this can change at any time, need notification framework
+        return primaryCcId;
     }
 
-    public NodeParameters getNodeParameters() {
-        return nodeParameters;
+    public IClusterController getPrimaryClusterController() {
+        return getClusterController(primaryCcId);
+    }
+
+    public IClusterController getClusterController(CcId ccId) {
+        return getCcConnection(ccId).getClusterControllerService();
+    }
+
+    public NodeParameters getNodeParameters(CcId ccId) {
+        return getCcConnection(ccId).getNodeParameters();
     }
 
     @Override
@@ -513,7 +660,7 @@
             if (delayNanos > 0) {
                 delayBlock.tryAcquire(delayNanos, TimeUnit.NANOSECONDS); //NOSONAR - ignore result of tryAcquire
             } else {
-                LOGGER.warning("After sending heartbeat, next one is already late by "
+                LOGGER.warn("After sending heartbeat, next one is already late by "
                         + TimeUnit.NANOSECONDS.toMillis(-delayNanos) + "ms; sending without delay");
             }
         }
@@ -564,15 +711,15 @@
 
             try {
                 cc.nodeHeartbeat(id, hbData);
-                LOGGER.log(Level.FINE, "Successfully sent heartbeat");
+                LOGGER.log(Level.DEBUG, "Successfully sent heartbeat");
                 return true;
             } catch (InterruptedException e) {
                 throw e;
             } catch (Exception e) {
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    LOGGER.log(Level.FINE, "Exception sending heartbeat; will retry after 1s", e);
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.log(Level.DEBUG, "Exception sending heartbeat; will retry after 1s", e);
                 } else {
-                    LOGGER.log(Level.SEVERE, "Exception sending heartbeat; will retry after 1s: " + e.toString());
+                    LOGGER.log(Level.ERROR, "Exception sending heartbeat; will retry after 1s: " + e.toString());
                 }
                 return false;
             }
@@ -580,24 +727,26 @@
     }
 
     private class ProfileDumpTask extends TimerTask {
-        private IClusterController cc;
+        private final IClusterController cc;
+        private final CcId ccId;
 
-        public ProfileDumpTask(IClusterController cc) {
+        public ProfileDumpTask(IClusterController cc, CcId ccId) {
             this.cc = cc;
+            this.ccId = ccId;
         }
 
         @Override
         public void run() {
             try {
                 FutureValue<List<JobProfile>> fv = new FutureValue<>();
-                BuildJobProfilesWork bjpw = new BuildJobProfilesWork(NodeControllerService.this, fv);
+                BuildJobProfilesWork bjpw = new BuildJobProfilesWork(NodeControllerService.this, ccId, fv);
                 workQueue.scheduleAndSync(bjpw);
                 List<JobProfile> profiles = fv.get();
                 if (!profiles.isEmpty()) {
                     cc.reportProfile(id, profiles);
                 }
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Exception reporting profile", e);
+                LOGGER.log(Level.WARN, "Exception reporting profile", e);
             }
         }
     }
@@ -617,13 +766,13 @@
             try {
                 tracer.instant("CurrentTime", traceCategory, Tracer.Scope.p, Tracer.dateTimeStamp());
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, "Exception tracing current time", e);
+                LOGGER.log(Level.WARN, "Exception tracing current time", e);
             }
         }
     }
 
-    public void sendApplicationMessageToCC(byte[] data, DeploymentId deploymentId) throws Exception {
-        ccs.sendApplicationMessageToCC(data, deploymentId, id);
+    public void sendApplicationMessageToCC(CcId ccId, byte[] data, DeploymentId deploymentId) throws Exception {
+        getClusterController(ccId).sendApplicationMessageToCC(data, deploymentId, id);
     }
 
     public IDatasetPartitionManager getDatasetPartitionManager() {
@@ -648,4 +797,5 @@
     public Object getApplicationContext() {
         return application.getApplicationContext();
     }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
index fcd4bde..6e5a58e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/Task.java
@@ -31,8 +31,6 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Semaphore;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameReader;
 import org.apache.hyracks.api.comm.IFrameWriter;
@@ -69,9 +67,12 @@
 import org.apache.hyracks.control.nc.resources.DefaultDeallocatableRegistry;
 import org.apache.hyracks.control.nc.work.NotifyTaskCompleteWork;
 import org.apache.hyracks.control.nc.work.NotifyTaskFailureWork;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class Task implements IHyracksTaskContext, ICounterContext, Runnable {
-    private static final Logger LOGGER = Logger.getLogger(Task.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final Joblet joblet;
 
@@ -355,9 +356,9 @@
             removePendingThread(ct);
         }
         if (!exceptions.isEmpty()) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
+            if (LOGGER.isWarnEnabled()) {
                 for (int i = 0; i < exceptions.size(); i++) {
-                    LOGGER.log(Level.WARNING,
+                    LOGGER.log(Level.WARN,
                             "Task " + taskAttemptId + " failed with exception"
                                     + (exceptions.size() > 1 ? "s (" + (i + 1) + "/" + exceptions.size() + ")" : ""),
                             exceptions.get(i));
@@ -436,12 +437,13 @@
 
     @Override
     public void sendApplicationMessageToCC(byte[] message, DeploymentId deploymentId) throws Exception {
-        this.ncs.sendApplicationMessageToCC(message, deploymentId);
+        this.ncs.sendApplicationMessageToCC(getJobletContext().getJobId().getCcId(), message, deploymentId);
     }
 
     @Override
     public void sendApplicationMessageToCC(Serializable message, DeploymentId deploymentId) throws Exception {
-        this.ncs.sendApplicationMessageToCC(JavaSerializationUtils.serialize(message), deploymentId);
+        this.ncs.sendApplicationMessageToCC(getJobletContext().getJobId().getCcId(),
+                JavaSerializationUtils.serialize(message), deploymentId);
     }
 
     @Override
@@ -455,6 +457,10 @@
     }
 
     @Override
+    public byte[] getJobParameter(byte[] name, int start, int length) throws HyracksException {
+        return ncs.createOrGetJobParameterByteStore(joblet.getJobId()).getParameterValue(name, start, length);
+    }
+
     public Set<JobFlag> getJobFlags() {
         return jobFlags;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/application/NCServiceContext.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/application/NCServiceContext.java
index 6a75471..87330226 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/application/NCServiceContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/application/NCServiceContext.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.application.IStateDumpHandler;
@@ -50,7 +51,7 @@
 
     public NCServiceContext(NodeControllerService ncs, ServerContext serverCtx, IOManager ioManager, String nodeId,
             MemoryManager memoryManager, ILifeCycleComponentManager lifeCyclecomponentManager,
-            IApplicationConfig appConfig) throws IOException {
+            IApplicationConfig appConfig) {
         super(serverCtx, appConfig, new HyracksThreadFactory(nodeId));
         this.lccm = lifeCyclecomponentManager;
         this.nodeId = nodeId;
@@ -59,6 +60,7 @@
         this.ncs = ncs;
         this.sdh = lccm::dumpState;
         this.tracer = new Tracer(nodeId, ncs.getConfiguration().getTraceCategories(), new TraceCategoryRegistry());
+        this.distributedState = new ConcurrentHashMap<>();
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionManager.java
index 962d541..fb7308e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionManager.java
@@ -22,23 +22,24 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Executor;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
-import org.apache.hyracks.api.dataset.IDatasetStateRecord;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.io.IWorkspaceFileFactory;
 import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.control.common.dataset.AbstractDatasetManager;
 import org.apache.hyracks.control.common.dataset.ResultStateSweeper;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.io.WorkspaceFileFactory;
 import org.apache.hyracks.control.nc.resources.DefaultDeallocatableRegistry;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
-public class DatasetPartitionManager implements IDatasetPartitionManager {
-    private static final Logger LOGGER = Logger.getLogger(DatasetPartitionManager.class.getName());
+public class DatasetPartitionManager extends AbstractDatasetManager implements IDatasetPartitionManager {
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService ncs;
 
@@ -54,6 +55,7 @@
 
     public DatasetPartitionManager(NodeControllerService ncs, Executor executor, int availableMemory, long resultTTL,
             long resultSweepThreshold) {
+        super(resultTTL);
         this.ncs = ncs;
         this.executor = executor;
         deallocatableRegistry = new DefaultDeallocatableRegistry();
@@ -64,17 +66,17 @@
             datasetMemoryManager = null;
         }
         partitionResultStateMap = new LinkedHashMap<>();
-        executor.execute(new ResultStateSweeper(this, resultTTL, resultSweepThreshold, LOGGER));
+        executor.execute(new ResultStateSweeper(this, resultSweepThreshold, LOGGER));
     }
 
     @Override
     public IFrameWriter createDatasetPartitionWriter(IHyracksTaskContext ctx, ResultSetId rsId, boolean orderedResult,
-            boolean asyncMode, int partition, int nPartitions) throws HyracksException {
+            boolean asyncMode, int partition, int nPartitions, long maxReads) {
         DatasetPartitionWriter dpw;
         JobId jobId = ctx.getJobletContext().getJobId();
         synchronized (this) {
             dpw = new DatasetPartitionWriter(ctx, this, jobId, rsId, asyncMode, orderedResult, partition, nPartitions,
-                    datasetMemoryManager, fileFactory);
+                    datasetMemoryManager, fileFactory, maxReads);
 
             ResultSetMap rsIdMap = partitionResultStateMap.computeIfAbsent(jobId, k -> new ResultSetMap());
 
@@ -82,7 +84,7 @@
             resultStates[partition] = dpw.getResultState();
         }
 
-        LOGGER.fine("Initialized partition writer: JobId: " + jobId + ":partition: " + partition);
+        LOGGER.debug("Initialized partition writer: JobId: " + jobId + ":partition: " + partition);
         return dpw;
     }
 
@@ -91,21 +93,21 @@
             boolean orderedResult, boolean emptyResult) throws HyracksException {
         try {
             // Be sure to send the *public* network address to the CC
-            ncs.getClusterController().registerResultPartitionLocation(jobId, rsId, orderedResult, emptyResult,
-                    partition, nPartitions, ncs.getDatasetNetworkManager().getPublicNetworkAddress());
+            ncs.getClusterController(jobId.getCcId()).registerResultPartitionLocation(jobId, rsId, orderedResult,
+                    emptyResult, partition, nPartitions, ncs.getDatasetNetworkManager().getPublicNetworkAddress());
         } catch (Exception e) {
-            throw new HyracksException(e);
+            throw HyracksException.create(e);
         }
     }
 
     @Override
     public void reportPartitionWriteCompletion(JobId jobId, ResultSetId rsId, int partition) throws HyracksException {
         try {
-            LOGGER.fine("Reporting partition write completion: JobId: " + jobId + ": ResultSetId: " + rsId
+            LOGGER.debug("Reporting partition write completion: JobId: " + jobId + ": ResultSetId: " + rsId
                     + ":partition: " + partition);
-            ncs.getClusterController().reportResultPartitionWriteCompletion(jobId, rsId, partition);
+            ncs.getClusterController(jobId.getCcId()).reportResultPartitionWriteCompletion(jobId, rsId, partition);
         } catch (Exception e) {
-            throw new HyracksException(e);
+            throw HyracksException.create(e);
         }
     }
 
@@ -115,7 +117,7 @@
         ResultState resultState = getResultState(jobId, resultSetId, partition);
         DatasetPartitionReader dpr = new DatasetPartitionReader(this, datasetMemoryManager, executor, resultState);
         dpr.writeTo(writer);
-        LOGGER.fine("Initialized partition reader: JobId: " + jobId + ":ResultSetId: " + resultSetId + ":partition: "
+        LOGGER.debug("Initialized partition reader: JobId: " + jobId + ":ResultSetId: " + resultSetId + ":partition: "
                 + partition);
     }
 
@@ -178,16 +180,7 @@
     }
 
     @Override
-    public synchronized long getResultTimestamp(JobId jobId) {
-        IDatasetStateRecord r = getState(jobId);
-        if (r == null) {
-            return -1;
-        }
-        return r.getTimestamp();
-    }
-
-    @Override
-    public synchronized void deinitState(JobId jobId) {
+    public synchronized void sweep(JobId jobId) {
         deinit(jobId);
         partitionResultStateMap.remove(jobId);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionReader.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionReader.java
index 732ee68..8c4fcb0 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionReader.java
@@ -20,22 +20,20 @@
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.partitions.ResultSetPartitionId;
 import org.apache.hyracks.comm.channels.NetworkOutputChannel;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetPartitionReader {
-    private static final Logger LOGGER = Logger.getLogger(DatasetPartitionReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final DatasetPartitionManager datasetPartitionManager;
-
     private final DatasetMemoryManager datasetMemoryManager;
-
     private final Executor executor;
-
     private final ResultState resultState;
 
     public DatasetPartitionReader(DatasetPartitionManager datasetPartitionManager,
@@ -47,56 +45,66 @@
     }
 
     public void writeTo(final IFrameWriter writer) {
-        executor.execute(new Runnable() {
-            @Override
-            public void run() {
-                NetworkOutputChannel channel = (NetworkOutputChannel) writer;
-                channel.setFrameSize(resultState.getFrameSize());
-                try {
-                    resultState.readOpen();
-                    channel.open();
-                    try {
-                        long offset = 0;
-                        ByteBuffer buffer = ByteBuffer.allocate(resultState.getFrameSize());
-                        while (true) {
-                            buffer.clear();
-                            long size = read(offset, buffer);
-                            if (size <= 0) {
-                                break;
-                            } else if (size < buffer.limit()) {
-                                throw new HyracksDataException("Premature end of file - readSize: " + size
-                                        + " buffer limit: " + buffer.limit());
-                            }
-                            offset += size;
-                            buffer.flip();
-                            channel.nextFrame(buffer);
-                        }
-                        LOGGER.info("Result Reader read + " + offset + " bytes");
-                    } finally {
-                        channel.close();
-                        resultState.readClose();
-                        // If the query is a synchronous query, remove its partition as soon as it is read.
-                        if (!resultState.getAsyncMode()) {
-                            datasetPartitionManager.removePartition(resultState.getResultSetPartitionId().getJobId(),
-                                    resultState.getResultSetPartitionId().getResultSetId(), resultState
-                                            .getResultSetPartitionId().getPartition());
-                        }
-                    }
-                } catch (HyracksDataException e) {
-                    throw new RuntimeException(e);
-                }
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.info("result reading successful(" + resultState.getResultSetPartitionId() + ")");
-                }
-            }
+        executor.execute(new ResultPartitionSender((NetworkOutputChannel) writer));
+    }
 
-            private long read(long offset, ByteBuffer buffer) throws HyracksDataException {
-                if (datasetMemoryManager == null) {
-                    return resultState.read(offset, buffer);
-                } else {
-                    return resultState.read(datasetMemoryManager, offset, buffer);
+    private class ResultPartitionSender implements Runnable {
+
+        private final NetworkOutputChannel channel;
+
+        ResultPartitionSender(final NetworkOutputChannel channel) {
+            this.channel = channel;
+        }
+
+        @Override
+        public void run() {
+            channel.setFrameSize(resultState.getFrameSize());
+            channel.open();
+            try {
+                resultState.readOpen();
+                long offset = 0;
+                final ByteBuffer buffer = ByteBuffer.allocate(resultState.getFrameSize());
+                while (true) {
+                    buffer.clear();
+                    final long size = read(offset, buffer);
+                    if (size <= 0) {
+                        break;
+                    } else if (size < buffer.limit()) {
+                        throw new IllegalStateException(
+                                "Premature end of file - readSize: " + size + " buffer limit: " + buffer.limit());
+                    }
+                    offset += size;
+                    buffer.flip();
+                    channel.nextFrame(buffer);
                 }
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("result reading successful(" + resultState.getResultSetPartitionId() + ")");
+                }
+            } catch (Exception e) {
+                LOGGER.error(() -> "failed to send result partition " + resultState.getResultSetPartitionId(), e);
+                channel.abort();
+            } finally {
+                close();
             }
-        });
+        }
+
+        private long read(long offset, ByteBuffer buffer) throws HyracksDataException {
+            return datasetMemoryManager != null ? resultState.read(datasetMemoryManager, offset, buffer)
+                    : resultState.read(offset, buffer);
+        }
+
+        private void close() {
+            try {
+                channel.close();
+                resultState.readClose();
+                if (resultState.isExhausted()) {
+                    final ResultSetPartitionId partitionId = resultState.getResultSetPartitionId();
+                    datasetPartitionManager.removePartition(partitionId.getJobId(), partitionId.getResultSetId(),
+                            partitionId.getPartition());
+                }
+            } catch (HyracksDataException e) {
+                LOGGER.error("unexpected failure in partition reader clean up", e);
+            }
+        }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionWriter.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionWriter.java
index b654d44..d49a1a65 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/DatasetPartitionWriter.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.control.nc.dataset;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -31,9 +29,11 @@
 import org.apache.hyracks.api.io.IWorkspaceFileFactory;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.partitions.ResultSetPartitionId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetPartitionWriter implements IFrameWriter {
-    private static final Logger LOGGER = Logger.getLogger(DatasetPartitionWriter.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final IDatasetPartitionManager manager;
 
@@ -59,7 +59,7 @@
 
     public DatasetPartitionWriter(IHyracksTaskContext ctx, IDatasetPartitionManager manager, JobId jobId,
             ResultSetId rsId, boolean asyncMode, boolean orderedResult, int partition, int nPartitions,
-            DatasetMemoryManager datasetMemoryManager, IWorkspaceFileFactory fileFactory) {
+            DatasetMemoryManager datasetMemoryManager, IWorkspaceFileFactory fileFactory, long maxReads) {
         this.manager = manager;
         this.jobId = jobId;
         this.resultSetId = rsId;
@@ -70,7 +70,7 @@
 
         resultSetPartitionId = new ResultSetPartitionId(jobId, rsId, partition);
         resultState = new ResultState(resultSetPartitionId, asyncMode, ctx.getIoManager(), fileFactory,
-                ctx.getInitialFrameSize());
+                ctx.getInitialFrameSize(), maxReads);
     }
 
     public ResultState getResultState() {
@@ -79,7 +79,7 @@
 
     @Override
     public void open() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("open(" + partition + ")");
         }
         partitionRegistered = false;
@@ -105,7 +105,7 @@
 
     @Override
     public void close() throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("close(" + partition + ")");
         }
         try {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultSetMap.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultSetMap.java
index 579f68b..1a64a5a 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultSetMap.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultSetMap.java
@@ -21,22 +21,23 @@
 import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataset.IDatasetStateRecord;
 import org.apache.hyracks.api.dataset.ResultSetId;
 import org.apache.hyracks.api.job.JobId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class ResultSetMap implements IDatasetStateRecord, Serializable {
     private static final long serialVersionUID = 1L;
 
-    private static final Logger LOGGER = Logger.getLogger(DatasetPartitionManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final long timestamp;
     private final HashMap<ResultSetId, ResultState[]> resultStateMap;
 
     ResultSetMap() {
-        timestamp = System.currentTimeMillis();
+        timestamp = System.nanoTime();
         resultStateMap = new HashMap<>();
     }
 
@@ -70,7 +71,7 @@
             final ResultState state = resultStates[partition];
             if (state != null) {
                 state.closeAndDelete();
-                LOGGER.fine("Removing partition: " + partition + " for JobId: " + jobId);
+                LOGGER.debug("Removing partition: " + partition + " for JobId: " + jobId);
             }
             resultStates[partition] = null;
             boolean stateEmpty = true;
@@ -95,7 +96,7 @@
     void closeAndDeleteAll() {
         applyToAllStates((rsId, state, i) -> {
             state.closeAndDelete();
-            LOGGER.fine("Removing partition: " + i + " for result set " + rsId);
+            LOGGER.debug("Removing partition: " + i + " for result set " + rsId);
         });
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultState.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultState.java
index 43b1e9b..43e3409 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultState.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/dataset/ResultState.java
@@ -68,17 +68,22 @@
     private long size;
 
     private long persistentSize;
+    private long remainingReads;
 
     ResultState(ResultSetPartitionId resultSetPartitionId, boolean asyncMode, IIOManager ioManager,
-            IWorkspaceFileFactory fileFactory, int frameSize) {
+            IWorkspaceFileFactory fileFactory, int frameSize, long maxReads) {
+        if (maxReads <= 0) {
+            throw new IllegalArgumentException("maxReads must be > 0");
+        }
         this.resultSetPartitionId = resultSetPartitionId;
         this.asyncMode = asyncMode;
         this.ioManager = ioManager;
         this.fileFactory = fileFactory;
         this.frameSize = frameSize;
+        remainingReads = maxReads;
         eos = new AtomicBoolean(false);
         failed = new AtomicBoolean(false);
-        localPageList = new ArrayList<Page>();
+        localPageList = new ArrayList<>();
 
         fileRef = null;
         writeFileHandle = null;
@@ -102,6 +107,7 @@
         closeWriteFileHandle();
         if (fileRef != null) {
             fileRef.delete();
+            fileRef = null;
         }
     }
 
@@ -121,7 +127,7 @@
             String fName = FILE_PREFIX + String.valueOf(resultSetPartitionId.getPartition());
             fileRef = fileFactory.createUnmanagedWorkspaceFile(fName);
             writeFileHandle = ioManager.open(fileRef, IIOManager.FileReadWriteMode.READ_WRITE,
-                    IIOManager.FileSyncMode.METADATA_ASYNC_DATA_ASYNC);
+                    IIOManager.FileSyncMode.METADATA_ASYNC_DATA_SYNC);
         }
 
         size += ioManager.syncWrite(writeFileHandle, size, buffer);
@@ -152,7 +158,10 @@
     }
 
     public synchronized void readOpen() {
-        // It is a noOp for now, leaving here to keep the API stable for future usage.
+        if (isExhausted()) {
+            throw new IllegalStateException("Result reads exhausted");
+        }
+        remainingReads--;
     }
 
     public synchronized void readClose() throws HyracksDataException {
@@ -205,7 +214,7 @@
                     initReadFileHandle();
                 }
                 readSize = ioManager.syncRead(readFileHandle, offset, buffer);
-                if (readSize < 0){
+                if (readSize < 0) {
                     throw new HyracksDataException("Premature end of file");
                 }
             }
@@ -339,6 +348,7 @@
             ObjectNode on = om.createObjectNode();
             on.put("rspid", resultSetPartitionId.toString());
             on.put("async", asyncMode);
+            on.put("remainingReads", remainingReads);
             on.put("eos", eos.get());
             on.put("failed", failed.get());
             on.put("fileRef", String.valueOf(fileRef));
@@ -347,4 +357,8 @@
             return e.getMessage();
         }
     }
+
+    public synchronized boolean isExhausted() {
+        return remainingReads == 0;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
index 54a171d..2742aaa 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/IOManager.java
@@ -41,6 +41,7 @@
 import org.apache.hyracks.api.io.IIOManager;
 import org.apache.hyracks.api.io.IODeviceHandle;
 import org.apache.hyracks.api.util.IoUtil;
+import org.apache.hyracks.util.file.FileUtil;
 
 public class IOManager implements IIOManager {
     /*
@@ -72,7 +73,11 @@
         workspaces = new ArrayList<>();
         for (IODeviceHandle d : ioDevices) {
             if (d.getWorkspace() != null) {
-                new File(d.getMount(), d.getWorkspace()).mkdirs();
+                try {
+                    FileUtil.forceMkdirs(new File(d.getMount(), d.getWorkspace()));
+                } catch (IOException e) {
+                    throw HyracksDataException.create(e);
+                }
                 workspaces.add(d);
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/profiling/IOCounterDefault.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/profiling/IOCounterDefault.java
index 5380911..1f8669d 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/profiling/IOCounterDefault.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/io/profiling/IOCounterDefault.java
@@ -19,7 +19,7 @@
 
 package org.apache.hyracks.control.nc.io.profiling;
 
-public class IOCounterDefault implements IIOCounter{
+public class IOCounterDefault implements IIOCounter {
 
     @Override
     public long getReads() {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/DatasetNetworkManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/DatasetNetworkManager.java
index 0b74806..5eba281 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/DatasetNetworkManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/DatasetNetworkManager.java
@@ -22,8 +22,6 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IChannelInterfaceFactory;
 import org.apache.hyracks.api.comm.ICloseableBufferAcceptor;
@@ -40,9 +38,11 @@
 import org.apache.hyracks.net.protocols.muxdemux.MultiplexedConnection;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemux;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemuxPerformanceCounters;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DatasetNetworkManager implements IChannelConnectionFactory {
-    private static final Logger LOGGER = Logger.getLogger(DatasetNetworkManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final int MAX_CONNECTION_ATTEMPTS = 5;
 
@@ -137,8 +137,8 @@
             JobId jobId = new JobId(buffer.getLong());
             ResultSetId rsId = new ResultSetId(buffer.getLong());
             int partition = buffer.getInt();
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Received initial dataset partition read request for JobId: " + jobId + " partition: "
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Received initial dataset partition read request for JobId: " + jobId + " partition: "
                         + partition + " on channel: " + ccb);
             }
             noc = new NetworkOutputChannel(ccb, nBuffers);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/MessagingNetworkManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/MessagingNetworkManager.java
index 7983b93..a37d131 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/MessagingNetworkManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/MessagingNetworkManager.java
@@ -25,8 +25,6 @@
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.client.NodeControllerInfo;
 import org.apache.hyracks.api.comm.IChannelControlBlock;
@@ -40,10 +38,12 @@
 import org.apache.hyracks.net.protocols.muxdemux.MultiplexedConnection;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemux;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemuxPerformanceCounters;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MessagingNetworkManager {
 
-    private static final Logger LOGGER = Logger.getLogger(MessagingNetworkManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int MAX_CONNECTION_ATTEMPTS = 5;
     private final MuxDemux md;
     private NetworkAddress localNetworkAddress;
@@ -193,8 +193,8 @@
         @Override
         public void accept(ByteBuffer buffer) {
             String nodeId = readMessagingInitialMessage(buffer);
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Opened messaging channel with node: " + nodeId);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Opened messaging channel with node: " + nodeId);
             }
             // Return the channel's original acceptor
             ICloseableBufferAcceptor originalAcceptor;
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/NetworkManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/NetworkManager.java
index 325966a..f3276a4 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/NetworkManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/net/NetworkManager.java
@@ -22,8 +22,6 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IChannelInterfaceFactory;
 import org.apache.hyracks.api.comm.ICloseableBufferAcceptor;
@@ -41,9 +39,11 @@
 import org.apache.hyracks.net.protocols.muxdemux.MultiplexedConnection;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemux;
 import org.apache.hyracks.net.protocols.muxdemux.MuxDemuxPerformanceCounters;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NetworkManager implements IChannelConnectionFactory {
-    private static final Logger LOGGER = Logger.getLogger(NetworkManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final int MAX_CONNECTION_ATTEMPTS = 5;
 
@@ -125,8 +125,8 @@
         @Override
         public void accept(ByteBuffer buffer) {
             PartitionId pid = readInitialMessage(buffer);
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Received initial partition request: " + pid + " on channel: " + ccb);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Received initial partition request: " + pid + " on channel: " + ccb);
             }
             noc = new NetworkOutputChannel(ccb, nBuffers);
             try {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializedPartitionWriter.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializedPartitionWriter.java
index 3b52dc9..54ac5e5 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializedPartitionWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializedPartitionWriter.java
@@ -20,8 +20,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -32,9 +30,11 @@
 import org.apache.hyracks.api.io.IIOManager;
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.control.common.job.PartitionState;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MaterializedPartitionWriter implements IFrameWriter {
-    private static final Logger LOGGER = Logger.getLogger(MaterializedPartitionWriter.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final IHyracksTaskContext ctx;
 
@@ -65,7 +65,7 @@
 
     @Override
     public void open() throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("open(" + pid + " by " + taId);
         }
         failed = false;
@@ -89,16 +89,16 @@
 
     @Override
     public void close() throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("close(" + pid + " by " + taId);
         }
         if (handle != null) {
             ctx.getIoManager().close(handle);
         }
         if (!failed) {
-            manager.registerPartition(pid, taId,
-                    new MaterializedPartition(ctx, fRef, executor, ctx.getIoManager()),
-                    PartitionState.COMMITTED, taId.getAttempt() == 0 ? false : true);
+            manager.registerPartition(pid, ctx.getJobletContext().getJobId().getCcId(), taId,
+                    new MaterializedPartition(ctx, fRef, executor, ctx.getIoManager()), PartitionState.COMMITTED,
+                    taId.getAttempt() == 0 ? false : true);
 
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializingPipelinedPartition.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializingPipelinedPartition.java
index 5506a94..a782bca 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializingPipelinedPartition.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/MaterializingPipelinedPartition.java
@@ -20,8 +20,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.Executor;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -33,36 +31,27 @@
 import org.apache.hyracks.api.partitions.IPartition;
 import org.apache.hyracks.api.partitions.PartitionId;
 import org.apache.hyracks.control.common.job.PartitionState;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MaterializingPipelinedPartition implements IFrameWriter, IPartition {
-    private static final Logger LOGGER = Logger.getLogger(MaterializingPipelinedPartition.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final IHyracksTaskContext ctx;
-
     private final Executor executor;
-
     private final IIOManager ioManager;
-
     private final PartitionManager manager;
-
     private final PartitionId pid;
-
     private final TaskAttemptId taId;
-
     private FileReference fRef;
-
     private IFileHandle writeHandle;
-
     private long size;
-
     private boolean eos;
-
     private boolean failed;
-
     protected boolean flushRequest;
-
-    private Level openCloseLevel = Level.FINE;
-
+    private boolean deallocated;
+    private Level openCloseLevel = Level.DEBUG;
     private Thread dataConsumerThread;
 
     public MaterializingPipelinedPartition(IHyracksTaskContext ctx, PartitionManager manager, PartitionId pid,
@@ -89,6 +78,7 @@
         if (dataConsumerThread != null) {
             dataConsumerThread.interrupt();
         }
+        deallocated = true;
     }
 
     @Override
@@ -111,12 +101,17 @@
                     writer.open();
                     IFileHandle readHandle = fRefCopy == null ? null
                             : ioManager.open(fRefCopy, IIOManager.FileReadWriteMode.READ_ONLY,
-                                IIOManager.FileSyncMode.METADATA_ASYNC_DATA_ASYNC);
+                                    IIOManager.FileSyncMode.METADATA_ASYNC_DATA_ASYNC);
                     try {
                         if (readHandle == null) {
                             // Either fail() is called or close() is called with 0 tuples coming in.
                             return;
                         }
+                        synchronized (MaterializingPipelinedPartition.this) {
+                            if (deallocated) {
+                                return;
+                            }
+                        }
                         long offset = 0;
                         ByteBuffer buffer = ctx.allocateFrame();
                         boolean done = false;
@@ -170,7 +165,7 @@
                         }
                     }
                 } catch (Exception e) {
-                    LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    LOGGER.log(Level.ERROR, e.getMessage(), e);
                 } finally {
                     thread.setName(oldName);
                     setDataConsumerThread(null); // Sets back the data consumer thread to null.
@@ -186,13 +181,15 @@
 
     @Override
     public void open() throws HyracksDataException {
-        if (LOGGER.isLoggable(openCloseLevel)) {
+        if (LOGGER.isEnabled(openCloseLevel)) {
             LOGGER.log(openCloseLevel, "open(" + pid + " by " + taId);
         }
         size = 0;
         eos = false;
         failed = false;
-        manager.registerPartition(pid, taId, this, PartitionState.STARTED, false);
+        deallocated = false;
+        manager.registerPartition(pid, ctx.getJobletContext().getJobId().getCcId(), taId, this, PartitionState.STARTED,
+                false);
     }
 
     private void checkOrCreateFile() throws HyracksDataException {
@@ -218,7 +215,7 @@
 
     @Override
     public void close() throws HyracksDataException {
-        if (LOGGER.isLoggable(openCloseLevel)) {
+        if (LOGGER.isEnabled(openCloseLevel)) {
             LOGGER.log(openCloseLevel, "close(" + pid + " by " + taId);
         }
         if (writeHandle != null) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PartitionManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PartitionManager.java
index 667cfa3..9ee4a9e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PartitionManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PartitionManager.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -58,10 +59,10 @@
         this.fileFactory = new WorkspaceFileFactory(deallocatableRegistry, ncs.getIoManager());
     }
 
-    public synchronized void registerPartition(PartitionId pid, TaskAttemptId taId, IPartition partition,
+    public synchronized void registerPartition(PartitionId pid, CcId ccId, TaskAttemptId taId, IPartition partition,
             PartitionState state, boolean updateToCC) throws HyracksDataException {
         try {
-            /**
+            /*
              * process pending requests
              */
             NetworkOutputChannel writer = partitionRequests.remove(pid);
@@ -73,24 +74,20 @@
                 }
             }
 
-            /**
+            /*
              * put a coming available partition into the available partition map
              */
-            List<IPartition> pList = availablePartitionMap.get(pid);
-            if (pList == null) {
-                pList = new ArrayList<>();
-                availablePartitionMap.put(pid, pList);
-            }
+            List<IPartition> pList = availablePartitionMap.computeIfAbsent(pid, k -> new ArrayList<>());
             pList.add(partition);
 
-            /**
+            /*
              * update to CC only when necessary
              */
             if (updateToCC) {
-                updatePartitionState(pid, taId, partition, state);
+                updatePartitionState(ccId, pid, taId, partition, state);
             }
         } catch (Exception e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 
@@ -128,7 +125,7 @@
                 partitionRequests.put(partitionId, writer);
             }
         } catch (Exception e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 
@@ -140,14 +137,14 @@
         deallocatableRegistry.close();
     }
 
-    public void updatePartitionState(PartitionId pid, TaskAttemptId taId, IPartition partition, PartitionState state)
-            throws HyracksDataException {
+    public void updatePartitionState(CcId ccId, PartitionId pid, TaskAttemptId taId, IPartition partition,
+            PartitionState state) throws HyracksDataException {
         PartitionDescriptor desc = new PartitionDescriptor(pid, ncs.getId(), taId, partition.isReusable());
         desc.setState(state);
         try {
-            ncs.getClusterController().registerPartitionProvider(desc);
+            ncs.getClusterController(ccId).registerPartitionProvider(desc);
         } catch (Exception e) {
-            throw new HyracksDataException(e);
+            throw HyracksDataException.create(e);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PipelinedPartition.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PipelinedPartition.java
index 16e5027..fc2f8e7 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PipelinedPartition.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/partitions/PipelinedPartition.java
@@ -71,7 +71,8 @@
 
     @Override
     public void open() throws HyracksDataException {
-        manager.registerPartition(pid, taId, this, PartitionState.STARTED, false);
+        manager.registerPartition(pid, ctx.getJobletContext().getJobId().getCcId(), taId, this, PartitionState.STARTED,
+                false);
         pendingConnection = true;
         ensureConnected();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/profiling/ConnectorReceiverProfilingFrameReader.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/profiling/ConnectorReceiverProfilingFrameReader.java
index 45e1236..0dc1fb6 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/profiling/ConnectorReceiverProfilingFrameReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/profiling/ConnectorReceiverProfilingFrameReader.java
@@ -36,8 +36,8 @@
         this.reader = reader;
         this.openCounter = ctx.getCounterContext().getCounter(cdId + ".receiver." + receiverIndex + ".open", true);
         this.closeCounter = ctx.getCounterContext().getCounter(cdId + ".receiver." + receiverIndex + ".close", true);
-        this.frameCounter = ctx.getCounterContext()
-                .getCounter(cdId + ".receiver." + receiverIndex + ".nextFrame", true);
+        this.frameCounter =
+                ctx.getCounterContext().getCounter(cdId + ".receiver." + receiverIndex + ".nextFrame", true);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/resources/memory/FrameManager.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/resources/memory/FrameManager.java
index 4dc6bc9..38ae95b 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/resources/memory/FrameManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/resources/memory/FrameManager.java
@@ -51,8 +51,7 @@
         }
         if (bytes > FrameConstants.MAX_FRAMESIZE) {
             throw new HyracksDataException(
-                    "Unable to allocate frame larger than:" + FrameConstants.MAX_FRAMESIZE
-                            + " bytes");
+                    "Unable to allocate frame larger than:" + FrameConstants.MAX_FRAMESIZE + " bytes");
         }
         ByteBuffer buffer = ByteBuffer.allocate(bytes);
         FrameHelper.serializeFrameSize(buffer, bytes / minFrameSize);
@@ -67,8 +66,8 @@
             return allocateFrame(newSizeInBytes);
         } else {
             if (newSizeInBytes > FrameConstants.MAX_FRAMESIZE) {
-                throw new HyracksDataException("Unable to allocate frame of size bigger than: "
-                        + FrameConstants.MAX_FRAMESIZE + " bytes");
+                throw new HyracksDataException(
+                        "Unable to allocate frame of size bigger than: " + FrameConstants.MAX_FRAMESIZE + " bytes");
             }
             ByteBuffer buffer = allocateFrame(newSizeInBytes);
             int limit = Math.min(newSizeInBytes, tobeDeallocate.capacity());
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ShutdownTask.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ShutdownTask.java
index e9cf3cb..4dd57f2 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ShutdownTask.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ShutdownTask.java
@@ -19,34 +19,17 @@
 
 package org.apache.hyracks.control.nc.task;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.hyracks.control.common.base.IClusterController;
-import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.util.ExitUtil;
 
 public class ShutdownTask implements Runnable {
-    private static final Logger LOGGER = Logger.getLogger(ShutdownTask.class.getName());
-    private final NodeControllerService ncs;
     private final boolean terminateNCService;
 
-    public ShutdownTask(NodeControllerService ncs, boolean terminateNCService) {
-        this.ncs = ncs;
+    public ShutdownTask(boolean terminateNCService) {
         this.terminateNCService = terminateNCService;
     }
 
     @Override
-    @SuppressWarnings("squid:S1147") // Runtime.exit()
     public void run() {
-        IClusterController ccs = ncs.getClusterController();
-        try {
-            ccs.notifyShutdown(ncs.getId());
-        } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception notifying CC of shutdown acknowledgment", e);
-            // proceed with shutdown
-        }
-
         ExitUtil.exit(terminateNCService ? 99 : 0);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ThreadDumpTask.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ThreadDumpTask.java
index e23aaaa..4969a85 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ThreadDumpTask.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/task/ThreadDumpTask.java
@@ -18,20 +18,23 @@
  */
 package org.apache.hyracks.control.nc.task;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.hyracks.util.ThreadDumpUtil;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.hyracks.util.ThreadDumpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ThreadDumpTask implements Runnable {
-    private static final Logger LOGGER = Logger.getLogger(ThreadDumpTask.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final NodeControllerService ncs;
     private final String requestId;
+    private final CcId ccId;
 
-    public ThreadDumpTask(NodeControllerService ncs, String requestId) {
+    public ThreadDumpTask(NodeControllerService ncs, String requestId, CcId ccId) {
         this.ncs = ncs;
         this.requestId = requestId;
+        this.ccId = ccId;
     }
 
     @Override
@@ -40,14 +43,13 @@
         try {
             result = ThreadDumpUtil.takeDumpJSONString();
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception taking thread dump", e);
+            LOGGER.log(Level.WARN, "Exception taking thread dump", e);
             result = null;
         }
         try {
-            ncs.getClusterController().notifyThreadDump(
-                    ncs.getContext().getNodeId(), requestId, result);
+            ncs.getClusterController(ccId).notifyThreadDump(ncs.getContext().getNodeId(), requestId, result);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Exception sending thread dump to CC", e);
+            LOGGER.log(Level.WARN, "Exception sending thread dump to CC", e);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortAllJobsWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortAllJobsWork.java
index 56100da..68d677f4 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortAllJobsWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortAllJobsWork.java
@@ -19,38 +19,45 @@
 package org.apache.hyracks.control.nc.work;
 
 import java.util.Collection;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
 import org.apache.hyracks.api.job.JobStatus;
 import org.apache.hyracks.control.common.work.SynchronizableWork;
 import org.apache.hyracks.control.nc.Joblet;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.Task;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class AbortAllJobsWork extends SynchronizableWork {
 
-    private static final Logger LOGGER = Logger.getLogger(AbortAllJobsWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final NodeControllerService ncs;
+    private final CcId ccId;
 
-    public AbortAllJobsWork(NodeControllerService ncs) {
+    public AbortAllJobsWork(NodeControllerService ncs, CcId ccId) {
         this.ncs = ncs;
+        this.ccId = ccId;
     }
 
     @Override
     protected void doRun() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Aborting all tasks");
-        }
+        LOGGER.info("Aborting all tasks for controller {}", ccId);
         IDatasetPartitionManager dpm = ncs.getDatasetPartitionManager();
-        if (dpm != null) {
-            ncs.getDatasetPartitionManager().abortAllReaders();
-        } else {
-            LOGGER.log(Level.WARNING, "DatasetPartitionManager is null on " + ncs.getId());
+        if (dpm == null) {
+            LOGGER.log(Level.WARN, "DatasetPartitionManager is null on " + ncs.getId());
         }
         Collection<Joblet> joblets = ncs.getJobletMap().values();
         for (Joblet ji : joblets) {
+            // TODO(mblow): should we have one jobletmap per cc?
+            if (!ji.getJobId().getCcId().equals(ccId)) {
+                continue;
+            }
+            if (dpm != null) {
+                dpm.abortReader(ji.getJobId());
+            }
             Collection<Task> tasks = ji.getTaskMap().values();
             for (Task task : tasks) {
                 task.abort();
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortTasksWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortTasksWork.java
index 5870e76..80f3e98 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortTasksWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/AbortTasksWork.java
@@ -20,8 +20,6 @@
 
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
@@ -30,9 +28,12 @@
 import org.apache.hyracks.control.nc.Joblet;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.Task;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class AbortTasksWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(AbortTasksWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService ncs;
 
@@ -48,7 +49,7 @@
 
     @Override
     public void run() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Aborting Tasks: " + jobId + ":" + tasks);
         }
         IDatasetPartitionManager dpm = ncs.getDatasetPartitionManager();
@@ -65,7 +66,7 @@
                 }
             }
         } else {
-            LOGGER.log(Level.WARNING,
+            LOGGER.log(Level.WARN,
                     "Joblet couldn't be found. Tasks of job " + jobId + " have all either completed or failed");
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ApplicationMessageWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ApplicationMessageWork.java
index 4f5b556..33d1d60 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ApplicationMessageWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ApplicationMessageWork.java
@@ -18,18 +18,18 @@
  */
 package org.apache.hyracks.control.nc.work;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.api.messages.IMessage;
 import org.apache.hyracks.control.common.deployment.DeploymentUtils;
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.application.NCServiceContext;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ApplicationMessageWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(ApplicationMessageWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private byte[] message;
     private DeploymentId deploymentId;
     private String nodeId;
@@ -50,10 +50,10 @@
             if (ctx.getMessageBroker() != null) {
                 ctx.getMessageBroker().receivedMessage(data, nodeId);
             } else {
-                LOGGER.log(Level.WARNING, "Message was sent, but no Message Broker set!");
+                LOGGER.log(Level.WARN, "Message was sent, but no Message Broker set!");
             }
         } catch (Exception e) {
-            Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Error in application message delivery!", e);
+            LOGGER.warn("Error in application message delivery!", e);
             throw new RuntimeException(e);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/BuildJobProfilesWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/BuildJobProfilesWork.java
index 582f058..0dd5d4e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/BuildJobProfilesWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/BuildJobProfilesWork.java
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.common.job.profiling.om.JobProfile;
 import org.apache.hyracks.control.common.job.profiling.om.JobletProfile;
@@ -33,20 +34,21 @@
 public class BuildJobProfilesWork extends SynchronizableWork {
     private final NodeControllerService ncs;
 
+    private final CcId ccId;
     private final FutureValue<List<JobProfile>> fv;
 
-    public BuildJobProfilesWork(NodeControllerService ncs, FutureValue<List<JobProfile>> fv) {
+    public BuildJobProfilesWork(NodeControllerService ncs, CcId ccId, FutureValue<List<JobProfile>> fv) {
         this.ncs = ncs;
+        this.ccId = ccId;
         this.fv = fv;
     }
 
     @Override
     protected void doRun() throws Exception {
-        List<JobProfile> profiles = new ArrayList<JobProfile>();
+        List<JobProfile> profiles = new ArrayList<>();
         Map<JobId, Joblet> jobletMap = ncs.getJobletMap();
-        for (Joblet ji : jobletMap.values()) {
-            profiles.add(new JobProfile(ji.getJobId()));
-        }
+        jobletMap.values().stream().filter(ji -> ji.getJobId().getCcId().equals(ccId))
+                .forEach(ji -> profiles.add(new JobProfile(ji.getJobId())));
         for (JobProfile jProfile : profiles) {
             Joblet ji;
             JobletProfile jobletProfile = new JobletProfile(ncs.getId());
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/CleanupJobletWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/CleanupJobletWork.java
index 670ce06..d38cd5e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/CleanupJobletWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/CleanupJobletWork.java
@@ -21,8 +21,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobStatus;
@@ -30,9 +28,12 @@
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.nc.Joblet;
 import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class CleanupJobletWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(CleanupJobletWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService ncs;
 
@@ -48,9 +49,10 @@
 
     @Override
     public void run() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Cleaning up after job: " + jobId);
         }
+        ncs.removeJobParameterByteStore(jobId);
         final List<IPartition> unregisteredPartitions = new ArrayList<IPartition>();
         ncs.getPartitionManager().unregisterPartitions(jobId, unregisteredPartitions);
         ncs.getExecutor().execute(new Runnable() {
@@ -61,8 +63,8 @@
                         // Put deallocate in a try block to make sure that every IPartition is de-allocated.
                         p.deallocate();
                     } catch (Exception e) {
-                        if (LOGGER.isLoggable(Level.WARNING)) {
-                            LOGGER.log(Level.WARNING, e.getMessage(), e);
+                        if (LOGGER.isWarnEnabled()) {
+                            LOGGER.log(Level.WARN, e.getMessage(), e);
                         }
                     }
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployBinaryWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployBinaryWork.java
index 0fe55e6..dfda463 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployBinaryWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployBinaryWork.java
@@ -22,6 +22,7 @@
 import java.net.URL;
 import java.util.List;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.control.common.base.IClusterController;
 import org.apache.hyracks.control.common.deployment.DeploymentStatus;
@@ -40,26 +41,28 @@
     private DeploymentId deploymentId;
     private NodeControllerService ncs;
     private List<URL> binaryURLs;
+    private final CcId ccId;
 
-    public DeployBinaryWork(NodeControllerService ncs, DeploymentId deploymentId, List<URL> binaryURLs) {
+    public DeployBinaryWork(NodeControllerService ncs, DeploymentId deploymentId, List<URL> binaryURLs, CcId ccId) {
         this.deploymentId = deploymentId;
         this.ncs = ncs;
         this.binaryURLs = binaryURLs;
+        this.ccId = ccId;
     }
 
     @Override
     public void run() {
         DeploymentStatus status;
         try {
-            DeploymentUtils.deploy(deploymentId, binaryURLs, ncs.getContext()
-                    .getJobSerializerDeserializerContainer(), ncs.getServerContext(), true);
+            DeploymentUtils.deploy(deploymentId, binaryURLs, ncs.getContext().getJobSerializerDeserializerContainer(),
+                    ncs.getServerContext(), true);
             status = DeploymentStatus.SUCCEED;
         } catch (Exception e) {
             status = DeploymentStatus.FAIL;
             e.printStackTrace();
         }
         try {
-            IClusterController ccs = ncs.getClusterController();
+            IClusterController ccs = ncs.getClusterController(ccId);
             ccs.notifyDeployBinary(deploymentId, ncs.getId(), status);
         } catch (Exception e) {
             throw new RuntimeException(e);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployJobSpecWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployJobSpecWork.java
new file mode 100644
index 0000000..92612dd
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DeployJobSpecWork.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.control.nc.work;
+
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.control.common.deployment.DeploymentUtils;
+import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.hyracks.control.nc.NodeControllerService;
+
+/**
+ * pre-distribute a job that can be executed later
+ *
+ */
+public class DeployJobSpecWork extends AbstractWork {
+
+    private final NodeControllerService ncs;
+    private final byte[] acgBytes;
+    private final CcId ccId;
+    private final DeployedJobSpecId deployedJobSpecId;
+
+    public DeployJobSpecWork(NodeControllerService ncs, DeployedJobSpecId deployedJobSpecId, byte[] acgBytes,
+            CcId ccId) {
+        this.ncs = ncs;
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.acgBytes = acgBytes;
+        this.ccId = ccId;
+    }
+
+    @Override
+    public void run() {
+        try {
+            ncs.checkForDuplicateDeployedJobSpec(deployedJobSpecId);
+            ActivityClusterGraph acg =
+                    (ActivityClusterGraph) DeploymentUtils.deserialize(acgBytes, null, ncs.getContext());
+            ncs.storeActivityClusterGraph(deployedJobSpecId, acg);
+        } catch (HyracksException e) {
+            try {
+                ncs.getClusterController(ccId).notifyDeployedJobSpecFailure(deployedJobSpecId, ncs.getId());
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DestroyJobWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DestroyJobWork.java
deleted file mode 100644
index 55dd01e..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DestroyJobWork.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.control.nc.work;
-
-import org.apache.hyracks.api.exceptions.HyracksException;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.control.common.work.AbstractWork;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-/**
- * destroy a pre-distributed job
- *
- */
-public class DestroyJobWork extends AbstractWork {
-
-    private final NodeControllerService ncs;
-    private final JobId jobId;
-
-    public DestroyJobWork(NodeControllerService ncs, JobId jobId) {
-        this.ncs = ncs;
-        this.jobId = jobId;
-    }
-
-    @Override
-    public void run() {
-        try {
-            ncs.removeActivityClusterGraph(jobId);
-        } catch (HyracksException e) {
-            try {
-                ncs.getClusterController().notifyDistributedJobFailure(jobId, ncs.getId());
-            } catch (Exception e1) {
-                e1.printStackTrace();
-            }
-        }
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DistributeJobWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DistributeJobWork.java
deleted file mode 100644
index 486a420..0000000
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/DistributeJobWork.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.control.nc.work;
-
-import org.apache.hyracks.api.exceptions.HyracksException;
-import org.apache.hyracks.api.job.ActivityClusterGraph;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.control.common.deployment.DeploymentUtils;
-import org.apache.hyracks.control.common.work.AbstractWork;
-import org.apache.hyracks.control.nc.NodeControllerService;
-
-/**
- * pre-distribute a job that can be executed later
- *
- */
-public class DistributeJobWork extends AbstractWork {
-
-    private final NodeControllerService ncs;
-    private final byte[] acgBytes;
-    private final JobId jobId;
-
-    public DistributeJobWork(NodeControllerService ncs, JobId jobId, byte[] acgBytes) {
-        this.ncs = ncs;
-        this.jobId = jobId;
-        this.acgBytes = acgBytes;
-    }
-
-    @Override
-    public void run() {
-        try {
-            ncs.checkForDuplicateDistributedJob(jobId);
-            ncs.updateMaxJobId(jobId);
-            ActivityClusterGraph acg =
-                    (ActivityClusterGraph) DeploymentUtils.deserialize(acgBytes, null, ncs.getContext());
-            ncs.storeActivityClusterGraph(jobId, acg);
-        } catch (HyracksException e) {
-            try {
-                ncs.getClusterController().notifyDistributedJobFailure(jobId, ncs.getId());
-            } catch (Exception e1) {
-                e1.printStackTrace();
-            }
-        }
-
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskCompleteWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskCompleteWork.java
index 675926e..614a9e0 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskCompleteWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskCompleteWork.java
@@ -18,16 +18,16 @@
  */
 package org.apache.hyracks.control.nc.work;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.control.common.job.profiling.om.TaskProfile;
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.Task;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NotifyTaskCompleteWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(NotifyTaskCompleteWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final NodeControllerService ncs;
     private final Task task;
 
@@ -41,10 +41,10 @@
         TaskProfile taskProfile =
                 new TaskProfile(task.getTaskAttemptId(), task.getPartitionSendProfile(), task.getStatsCollector());
         try {
-            ncs.getClusterController().notifyTaskComplete(task.getJobletContext().getJobId(), task.getTaskAttemptId(),
-                    ncs.getId(), taskProfile);
+            ncs.getClusterController(task.getJobletContext().getJobId().getCcId()).notifyTaskComplete(
+                    task.getJobletContext().getJobId(), task.getTaskAttemptId(), ncs.getId(), taskProfile);
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failed notifying task complete for " + task.getTaskAttemptId(), e);
+            LOGGER.log(Level.ERROR, "Failed notifying task complete for " + task.getTaskAttemptId(), e);
         }
         task.getJoblet().removeTask(task);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskFailureWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskFailureWork.java
index 7ed2c09..f0b68a0 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskFailureWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/NotifyTaskFailureWork.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.control.nc.work;
 
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.TaskAttemptId;
 import org.apache.hyracks.api.dataset.IDatasetPartitionManager;
@@ -28,9 +26,12 @@
 import org.apache.hyracks.control.common.work.AbstractWork;
 import org.apache.hyracks.control.nc.NodeControllerService;
 import org.apache.hyracks.control.nc.Task;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NotifyTaskFailureWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(NotifyTaskFailureWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final NodeControllerService ncs;
     private final Task task;
     private final JobId jobId;
@@ -48,16 +49,16 @@
 
     @Override
     public void run() {
-        LOGGER.log(Level.WARNING, ncs.getId() + " is sending a notification to cc that task " + taskId + " has failed",
+        LOGGER.log(Level.WARN, ncs.getId() + " is sending a notification to cc that task " + taskId + " has failed",
                 exceptions.get(0));
         try {
             IDatasetPartitionManager dpm = ncs.getDatasetPartitionManager();
             if (dpm != null) {
                 dpm.abortReader(jobId);
             }
-            ncs.getClusterController().notifyTaskFailure(jobId, taskId, ncs.getId(), exceptions);
+            ncs.getClusterController(jobId.getCcId()).notifyTaskFailure(jobId, taskId, ncs.getId(), exceptions);
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failure reporting task failure to cluster controller", e);
+            LOGGER.log(Level.ERROR, "Failure reporting task failure to cluster controller", e);
         }
         if (task != null) {
             task.getJoblet().removeTask(task);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ReportPartitionAvailabilityWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ReportPartitionAvailabilityWork.java
index 3871302..cfd69ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ReportPartitionAvailabilityWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/ReportPartitionAvailabilityWork.java
@@ -50,9 +50,13 @@
             Map<JobId, Joblet> jobletMap = ncs.getJobletMap();
             Joblet ji = jobletMap.get(pid.getJobId());
             if (ji != null) {
-                PartitionChannel channel = new PartitionChannel(pid, new NetworkInputChannel(ncs.getNetworkManager(),
-                        new InetSocketAddress(InetAddress.getByAddress(networkAddress.lookupIpAddress()),
-                                networkAddress.getPort()), pid, 5));
+                PartitionChannel channel =
+                        new PartitionChannel(pid,
+                                new NetworkInputChannel(ncs.getNetworkManager(),
+                                        new InetSocketAddress(
+                                                InetAddress.getByAddress(networkAddress.lookupIpAddress()),
+                                                networkAddress.getPort()),
+                                        pid, 5));
                 ji.reportPartitionAvailability(channel);
             }
         } catch (Exception e) {
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
index c369781..46b176e 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StartTasksWork.java
@@ -25,8 +25,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.comm.IFrameWriter;
@@ -47,11 +45,12 @@
 import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.deployment.DeploymentId;
-import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.ActivityCluster;
 import org.apache.hyracks.api.job.ActivityClusterGraph;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.partitions.PartitionId;
@@ -69,9 +68,12 @@
 import org.apache.hyracks.control.nc.partitions.PipelinedPartition;
 import org.apache.hyracks.control.nc.partitions.ReceiveSideMaterializingCollector;
 import org.apache.hyracks.control.nc.profiling.ProfilingPartitionWriterFactory;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class StartTasksWork extends AbstractWork {
-    private static final Logger LOGGER = Logger.getLogger(StartTasksWork.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final NodeControllerService ncs;
 
@@ -79,6 +81,8 @@
 
     private final JobId jobId;
 
+    private final DeployedJobSpecId deployedJobSpecId;
+
     private final byte[] acgBytes;
 
     private final List<TaskAttemptDescriptor> taskDescriptors;
@@ -87,16 +91,21 @@
 
     private final Set<JobFlag> flags;
 
+    private final Map<byte[], byte[]> jobParameters;
+
     public StartTasksWork(NodeControllerService ncs, DeploymentId deploymentId, JobId jobId, byte[] acgBytes,
             List<TaskAttemptDescriptor> taskDescriptors,
-            Map<ConnectorDescriptorId, IConnectorPolicy> connectorPoliciesMap, Set<JobFlag> flags) {
+            Map<ConnectorDescriptorId, IConnectorPolicy> connectorPoliciesMap, Set<JobFlag> flags,
+            Map<byte[], byte[]> jobParameters, DeployedJobSpecId deployedJobSpecId) {
         this.ncs = ncs;
         this.deploymentId = deploymentId;
         this.jobId = jobId;
+        this.deployedJobSpecId = deployedJobSpecId;
         this.acgBytes = acgBytes;
         this.taskDescriptors = taskDescriptors;
         this.connectorPoliciesMap = connectorPoliciesMap;
         this.flags = flags;
+        this.jobParameters = jobParameters;
     }
 
     @Override
@@ -106,7 +115,7 @@
         try {
             ncs.updateMaxJobId(jobId);
             NCServiceContext serviceCtx = ncs.getContext();
-            Joblet joblet = getOrCreateLocalJoblet(deploymentId, jobId, serviceCtx, acgBytes);
+            Joblet joblet = getOrCreateLocalJoblet(deploymentId, serviceCtx, acgBytes);
             final ActivityClusterGraph acg = joblet.getActivityClusterGraph();
             IRecordDescriptorProvider rdp = new IRecordDescriptorProvider() {
                 @Override
@@ -130,9 +139,7 @@
                 ActivityId aid = tid.getActivityId();
                 ActivityCluster ac = acg.getActivityMap().get(aid);
                 IActivity han = ac.getActivityMap().get(aid);
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.info("Initializing " + taId + " -> " + han);
-                }
+                LOGGER.info("Initializing {} -> {} for {}", taId, han, jobId);
                 final int partition = tid.getPartition();
                 List<IConnectorDescriptor> inputs = ac.getActivityInputMap().get(aid);
                 task = null;
@@ -144,9 +151,7 @@
                     for (int i = 0; i < inputs.size(); ++i) {
                         IConnectorDescriptor conn = inputs.get(i);
                         IConnectorPolicy cPolicy = connectorPoliciesMap.get(conn.getConnectorId());
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("input: " + i + ": " + conn.getConnectorId());
-                        }
+                        LOGGER.info("input: {}: {}", i, conn.getConnectorId());
                         RecordDescriptor recordDesc = ac.getConnectorRecordDescriptorMap().get(conn.getConnectorId());
                         IPartitionCollector collector =
                                 createPartitionCollector(td, partition, task, i, conn, recordDesc, cPolicy);
@@ -163,10 +168,7 @@
 
                         IPartitionWriterFactory pwFactory =
                                 createPartitionWriterFactory(task, cPolicy, jobId, conn, partition, taId, flags);
-
-                        if (LOGGER.isLoggable(Level.INFO)) {
-                            LOGGER.info("output: " + i + ": " + conn.getConnectorId());
-                        }
+                        LOGGER.info("input: {}: {}", i, conn.getConnectorId());
                         IFrameWriter writer = conn.createPartitioner(task, recordDesc, pwFactory, partition,
                                 td.getPartitionCount(), td.getOutputPartitionCounts()[i]);
                         writer = enforce ? EnforceFrameWriter.enforce(writer) : writer;
@@ -180,7 +182,7 @@
                 taskIndex++;
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failure starting a task", e);
+            LOGGER.log(Level.WARN, "Failure starting a task", e);
             // notify cc of start task failure
             List<Exception> exceptions = new ArrayList<>();
             exceptions.add(e);
@@ -190,19 +192,22 @@
         }
     }
 
-    private Joblet getOrCreateLocalJoblet(DeploymentId deploymentId, JobId jobId, INCServiceContext appCtx,
-            byte[] acgBytes) throws HyracksException {
+    private Joblet getOrCreateLocalJoblet(DeploymentId deploymentId, INCServiceContext appCtx, byte[] acgBytes)
+            throws HyracksException {
         Map<JobId, Joblet> jobletMap = ncs.getJobletMap();
         Joblet ji = jobletMap.get(jobId);
         if (ji == null) {
-            ActivityClusterGraph acg = ncs.getActivityClusterGraph(jobId);
-            if (acg == null) {
-                if (acgBytes == null) {
-                    throw HyracksException.create(ErrorCode.ERROR_FINDING_DISTRIBUTED_JOB, jobId);
+            ActivityClusterGraph acg = (deployedJobSpecId != null) ? ncs.getActivityClusterGraph(deployedJobSpecId)
+                    : (ActivityClusterGraph) DeploymentUtils.deserialize(acgBytes, deploymentId, appCtx);
+            ncs.createOrGetJobParameterByteStore(jobId).setParameters(jobParameters);
+            IJobletEventListenerFactory listenerFactory = acg.getJobletEventListenerFactory();
+            if (listenerFactory != null) {
+                if (deployedJobSpecId != null) {
+                    listenerFactory = acg.getJobletEventListenerFactory().copyFactory();
                 }
-                acg = (ActivityClusterGraph) DeploymentUtils.deserialize(acgBytes, deploymentId, appCtx);
+                listenerFactory.updateListenerJobParameters(ncs.createOrGetJobParameterByteStore(jobId));
             }
-            ji = new Joblet(ncs, deploymentId, jobId, appCtx, acg);
+            ji = new Joblet(ncs, deploymentId, jobId, appCtx, acg, listenerFactory);
             jobletMap.put(jobId, ji);
         }
         return ji;
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StateDumpWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StateDumpWork.java
index 9dbc901..0b3895f 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StateDumpWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/StateDumpWork.java
@@ -20,6 +20,7 @@
 
 import java.io.ByteArrayOutputStream;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.control.common.work.SynchronizableWork;
 import org.apache.hyracks.control.nc.NodeControllerService;
 
@@ -27,16 +28,19 @@
     private final NodeControllerService ncs;
 
     private final String stateDumpId;
+    private final CcId ccId;
 
-    public StateDumpWork(NodeControllerService ncs, String stateDumpId) {
+    public StateDumpWork(NodeControllerService ncs, String stateDumpId, CcId ccId) {
         this.ncs = ncs;
         this.stateDumpId = stateDumpId;
+        this.ccId = ccId;
     }
 
     @Override
     protected void doRun() throws Exception {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ncs.getContext().getStateDumpHandler().dumpState(baos);
-        ncs.getClusterController().notifyStateDump(ncs.getContext().getNodeId(), stateDumpId, baos.toString("UTF-8"));
+        ncs.getClusterController(ccId).notifyStateDump(ncs.getContext().getNodeId(), stateDumpId,
+                baos.toString("UTF-8"));
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UnDeployBinaryWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UnDeployBinaryWork.java
index 1c10589..9b862b2 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UnDeployBinaryWork.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UnDeployBinaryWork.java
@@ -19,6 +19,7 @@
 
 package org.apache.hyracks.control.nc.work;
 
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.deployment.DeploymentId;
 import org.apache.hyracks.control.common.base.IClusterController;
 import org.apache.hyracks.control.common.deployment.DeploymentStatus;
@@ -35,10 +36,12 @@
 
     private DeploymentId deploymentId;
     private NodeControllerService ncs;
+    private final CcId ccId;
 
-    public UnDeployBinaryWork(NodeControllerService ncs, DeploymentId deploymentId) {
+    public UnDeployBinaryWork(NodeControllerService ncs, DeploymentId deploymentId, CcId ccId) {
         this.deploymentId = deploymentId;
         this.ncs = ncs;
+        this.ccId = ccId;
     }
 
     @Override
@@ -52,7 +55,7 @@
             status = DeploymentStatus.FAIL;
         }
         try {
-            IClusterController ccs = ncs.getClusterController();
+            IClusterController ccs = ncs.getClusterController(ccId);
             ccs.notifyDeployBinary(deploymentId, ncs.getId(), status);
         } catch (Exception e) {
             throw new RuntimeException(e);
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UndeployJobSpecWork.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UndeployJobSpecWork.java
new file mode 100644
index 0000000..afc4206
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-control-nc/src/main/java/org/apache/hyracks/control/nc/work/UndeployJobSpecWork.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.control.nc.work;
+
+import org.apache.hyracks.api.control.CcId;
+import org.apache.hyracks.api.exceptions.HyracksException;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.control.common.work.AbstractWork;
+import org.apache.hyracks.control.nc.NodeControllerService;
+
+/**
+ * remove the deployed job
+ *
+ */
+public class UndeployJobSpecWork extends AbstractWork {
+
+    private final NodeControllerService ncs;
+    private final DeployedJobSpecId deployedJobSpecId;
+    private final CcId ccId;
+
+    public UndeployJobSpecWork(NodeControllerService ncs, DeployedJobSpecId deployedJobSpecId, CcId ccId) {
+        this.ncs = ncs;
+        this.deployedJobSpecId = deployedJobSpecId;
+        this.ccId = ccId;
+    }
+
+    @Override
+    public void run() {
+        try {
+            ncs.removeActivityClusterGraph(deployedJobSpecId);
+        } catch (HyracksException e) {
+            try {
+                ncs.getClusterController(ccId).notifyDeployedJobSpecFailure(deployedJobSpecId, ncs.getId());
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
index bc62a62..59bf0b9 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/pom.xml
@@ -66,6 +66,10 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCService.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCService.java
index 9da3502..b6d0b70 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCService.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCService.java
@@ -34,8 +34,6 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.hyracks.control.common.config.ConfigUtils;
@@ -43,6 +41,9 @@
 import org.apache.hyracks.api.config.Section;
 import org.apache.hyracks.control.common.controllers.ServiceConstants;
 import org.apache.hyracks.control.common.controllers.ServiceConstants.ServiceCommand;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.ini4j.Ini;
 import org.kohsuke.args4j.CmdLineParser;
 
@@ -52,7 +53,7 @@
  */
 public class NCService {
 
-    private static final Logger LOGGER = Logger.getLogger(NCService.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /**
      * The .ini read from the CC (*not* the ncservice.ini file)
@@ -131,15 +132,15 @@
         }
 
         // Sets up memory parameter if it is not specified.
-        if (!jvmargs.contains(" -Xmx")) {
+        if (!jvmargs.contains("-Xmx")) {
             long ramSize = ((com.sun.management.OperatingSystemMXBean) osMXBean).getTotalPhysicalMemorySize();
             int proportionalRamSize = (int) Math.ceil(0.6 * ramSize / (1024 * 1024));
             //if under 32bit JVM, use less than 1GB heap by default. otherwise use proportional ramsize.
             int heapSize = "32".equals(System.getProperty("sun.arch.data.model"))
                     ? (proportionalRamSize <= 1024 ? proportionalRamSize : 1024) : proportionalRamSize;
             jvmargs = jvmargs + " -Xmx" + heapSize + "m";
-            env.put("JAVA_OPTS", jvmargs.trim());
         }
+        env.put("JAVA_OPTS", jvmargs.trim());
         LOGGER.info("Setting JAVA_OPTS to " + jvmargs);
     }
 
@@ -159,7 +160,7 @@
             // QQQ inheriting probably isn't right
             pb.inheritIO();
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Launching NCDriver process");
             }
 
@@ -178,7 +179,7 @@
                     writer.write("---------------------\n");
                 }
                 pb.redirectOutput(ProcessBuilder.Redirect.appendTo(logfile));
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("Logging to " + logfile.getCanonicalPath());
                 }
             }
@@ -200,13 +201,13 @@
             }
             return retval == 0;
         } catch (Exception e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
+            if (LOGGER.isErrorEnabled()) {
                 StringWriter sw = new StringWriter();
                 try {
                     ini.store(sw);
-                    LOGGER.log(Level.SEVERE, "Configuration from CC broken: \n" + sw.toString(), e);
+                    LOGGER.log(Level.ERROR, "Configuration from CC broken: \n" + sw.toString(), e);
                 } catch (IOException e1) {
-                    LOGGER.log(Level.SEVERE, "Configuration from CC broken, failed to serialize", e1);
+                    LOGGER.log(Level.ERROR, "Configuration from CC broken, failed to serialize", e1);
                 }
             }
             return false;
@@ -225,7 +226,7 @@
             ObjectInputStream ois = new ObjectInputStream(is);
             String magic = ois.readUTF();
             if (!ServiceConstants.NC_SERVICE_MAGIC_COOKIE.equals(magic)) {
-                LOGGER.severe("Connection used incorrect magic cookie");
+                LOGGER.error("Connection used incorrect magic cookie");
                 return false;
             }
             switch (ServiceCommand.valueOf(ois.readUTF())) {
@@ -241,7 +242,7 @@
                     break;
             }
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Error decoding connection from server", e);
+            LOGGER.log(Level.ERROR, "Error decoding connection from server", e);
         }
         return false;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCServiceConfig.java b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCServiceConfig.java
index 10fa679..32f6bf3 100644
--- a/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCServiceConfig.java
+++ b/hyracks-fullstack/hyracks/hyracks-control/hyracks-nc-service/src/main/java/org/apache/hyracks/control/nc/service/NCServiceConfig.java
@@ -35,20 +35,16 @@
      * If an option is specified both in the config file and on the command line, the config file
      * version will take precedence.
      */
-    @Option(name = "-config-file", required = false,
-            usage = "Local NC configuration file (default: none)")
+    @Option(name = "-config-file", required = false, usage = "Local NC configuration file (default: none)")
     public String configFile = null;
 
-    @Option(name = "-address", required = false,
-            usage = "Address to listen on for connections from CC (default: all addresses)")
+    @Option(name = "-address", required = false, usage = "Address to listen on for connections from CC (default: all addresses)")
     public String address = null;
 
-    @Option(name = "-port", required = false,
-            usage = "Port to listen on for connections from CC (default: 9090)")
+    @Option(name = "-port", required = false, usage = "Port to listen on for connections from CC (default: 9090)")
     public int port = 9090;
 
-    @Option(name = "-logdir", required = false,
-            usage = "Directory to log NC output ('-' for stdout of NC service; default: $app.home/logs)")
+    @Option(name = "-logdir", required = false, usage = "Directory to log NC output ('-' for stdout of NC service; default: $app.home/logs)")
     public String logdir = null;
 
     private Ini ini = null;
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ByteArrayPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ByteArrayPointable.java
index 2ce5291..98700a3 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ByteArrayPointable.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/ByteArrayPointable.java
@@ -88,8 +88,8 @@
         int thisArrayStart = this.getContentStartOffset();
         int thatArrayStart = thatStart + getNumberBytesToStoreMeta(thatArrayLen);
 
-        for (int thisIndex = 0, thatIndex = 0;
-             thisIndex < thisArrayLen && thatIndex < thatArrayLen; ++thisIndex, ++thatIndex) {
+        for (int thisIndex = 0, thatIndex = 0; thisIndex < thisArrayLen
+                && thatIndex < thatArrayLen; ++thisIndex, ++thatIndex) {
             if (this.bytes[thisArrayStart + thisIndex] != thatBytes[thatArrayStart + thatIndex]) {
                 return (0xff & this.bytes[thisArrayStart + thisIndex]) - (0xff & thatBytes[thatArrayStart + thatIndex]);
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
index 0850b04..86a6f9c 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
@@ -512,8 +512,8 @@
             boolean isLetter = Character.isLetter(originalChar);
 
             // Make the first character into upper case while the later ones into lower case.
-            char resultChar = toUpperCase && isLetter ? Character.toUpperCase(originalChar) : (isLetter ? Character
-                    .toLowerCase(originalChar) : originalChar);
+            char resultChar = toUpperCase && isLetter ? Character.toUpperCase(originalChar)
+                    : (isLetter ? Character.toLowerCase(originalChar) : originalChar);
             builder.appendChar(resultChar);
             byteIndex += src.charSize(srcStart + byteIndex);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/BinaryHashSet.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/BinaryHashSet.java
index 1996b4e..c5b8e8a 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/BinaryHashSet.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/BinaryHashSet.java
@@ -119,7 +119,6 @@
         return putFindInternal(key, false, keyArray, increaseFoundCount);
     }
 
-
     // Put an entry or find an entry
     private int putFindInternal(BinaryEntry key, boolean isInsert, byte[] keyArray, boolean increaseFoundCount)
             throws HyracksDataException {
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/UTF8StringBuilder.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/UTF8StringBuilder.java
index fe04146..2300c06 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/UTF8StringBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/util/UTF8StringBuilder.java
@@ -33,7 +33,8 @@
         }
     }
 
-    public void appendUtf8StringPointable(UTF8StringPointable src, int byteStartOffset, int byteLength) throws IOException {
+    public void appendUtf8StringPointable(UTF8StringPointable src, int byteStartOffset, int byteLength)
+            throws IOException {
         out.write(src.getByteArray(), byteStartOffset, byteLength);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/ByteArrayPointableTest.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/ByteArrayPointableTest.java
index fbc7aea..f7146df 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/ByteArrayPointableTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/ByteArrayPointableTest.java
@@ -27,8 +27,8 @@
 
     @Test
     public void testCompareTo() throws Exception {
-        ByteArrayPointable byteArrayPointable = ByteArrayPointable
-                .generatePointableFromPureBytes(new byte[] { 1, 2, 3, 4 });
+        ByteArrayPointable byteArrayPointable =
+                ByteArrayPointable.generatePointableFromPureBytes(new byte[] { 1, 2, 3, 4 });
 
         testEqual(byteArrayPointable, ByteArrayPointable.generatePointableFromPureBytes(new byte[] { 1, 2, 3, 4 }));
 
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/UTF8StringPointableTest.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/UTF8StringPointableTest.java
index 93b2290..302e7a0 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/UTF8StringPointableTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/primitive/UTF8StringPointableTest.java
@@ -34,8 +34,8 @@
 public class UTF8StringPointableTest {
     public static UTF8StringPointable STRING_EMPTY = generateUTF8Pointable(UTF8StringSample.EMPTY_STRING);
     public static UTF8StringPointable STRING_UTF8_MIX = generateUTF8Pointable(UTF8StringSample.STRING_UTF8_MIX);
-    public static UTF8StringPointable STRING_UTF8_MIX_LOWERCASE = generateUTF8Pointable(
-            UTF8StringSample.STRING_UTF8_MIX_LOWERCASE);
+    public static UTF8StringPointable STRING_UTF8_MIX_LOWERCASE =
+            generateUTF8Pointable(UTF8StringSample.STRING_UTF8_MIX_LOWERCASE);
 
     public static UTF8StringPointable STRING_LEN_127 = generateUTF8Pointable(UTF8StringSample.STRING_LEN_127);
     public static UTF8StringPointable STRING_LEN_128 = generateUTF8Pointable(UTF8StringSample.STRING_LEN_128);
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/util/UTF8StringCharacterIteratorTest.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/util/UTF8StringCharacterIteratorTest.java
index fc8a6ab..c001ab3 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/util/UTF8StringCharacterIteratorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/test/java/org/apache/hyracks/data/std/util/UTF8StringCharacterIteratorTest.java
@@ -49,7 +49,7 @@
     }
 
     @Test
-    public void testIterator(){
+    public void testIterator() {
         testEachIterator(UTF8StringSample.EMPTY_STRING);
         testEachIterator(UTF8StringSample.STRING_UTF8_MIX);
         testEachIterator(UTF8StringSample.STRING_LEN_128);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/pom.xml b/hyracks-fullstack/hyracks/hyracks-dataflow-common/pom.xml
index 26bb89a..61235ca 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/pom.xml
@@ -79,6 +79,10 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameDeserializer.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameDeserializer.java
index 819d751..5a39523 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameDeserializer.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameDeserializer.java
@@ -21,16 +21,16 @@
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.FrameConstants;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.util.ByteBufferInputStream;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FrameDeserializer {
-    private static final Logger LOGGER = Logger.getLogger(FrameDeserializer.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ByteBufferInputStream bbis;
 
@@ -70,8 +70,8 @@
         Object[] record = new Object[recordDescriptor.getFieldCount()];
         for (int i = 0; i < record.length; ++i) {
             Object instance = recordDescriptor.getFields()[i].deserialize(di);
-            if (LOGGER.isLoggable(Level.FINEST)) {
-                LOGGER.finest(i + " " + instance);
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(i + " " + instance);
             }
             record[i] = instance;
             if (FrameConstants.DEBUG_FRAME_IO) {
@@ -84,8 +84,8 @@
                 }
             }
         }
-        if (LOGGER.isLoggable(Level.FINEST)) {
-            LOGGER.finest("Read Record tIndex = " + tIndex + ", tupleCount = " + tupleCount);
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("Read Record tIndex = " + tIndex + ", tupleCount = " + tupleCount);
         }
         ++tIndex;
         return record;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameFixedFieldAppender.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameFixedFieldAppender.java
index 8765bf1..5dc1fa3 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameFixedFieldAppender.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameFixedFieldAppender.java
@@ -76,9 +76,9 @@
             IntSerDeUtils.putInt(array, tupleDataEndOffset + currentField * 4, lastFieldEndOffset);
             if (++currentField == fieldCount) {
                 tupleDataEndOffset += fieldCount * 4 + lastFieldEndOffset;
-                IntSerDeUtils
-                        .putInt(array, FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
-                                tupleDataEndOffset);
+                IntSerDeUtils.putInt(array,
+                        FrameHelper.getTupleCountOffset(frame.getFrameSize()) - 4 * (tupleCount + 1),
+                        tupleDataEndOffset);
                 ++tupleCount;
                 IntSerDeUtils.putInt(array, FrameHelper.getTupleCountOffset(frame.getFrameSize()), tupleCount);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameOutputStream.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameOutputStream.java
index e8f826f..d3af00d 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameOutputStream.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameOutputStream.java
@@ -18,16 +18,15 @@
  */
 package org.apache.hyracks.dataflow.common.comm.io;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FrameOutputStream extends ByteArrayAccessibleOutputStream {
-    private static final Logger LOGGER = Logger.getLogger(FrameOutputStream.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final FrameTupleAppender frameTupleAppender;
 
@@ -42,15 +41,15 @@
 
     public int getTupleCount() {
         int tupleCount = frameTupleAppender.getTupleCount();
-        if (LOGGER.isLoggable(Level.FINEST)) {
-            LOGGER.finest("appendTuple(): tuple count: " + tupleCount);
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("appendTuple(): tuple count: " + tupleCount);
         }
         return tupleCount;
     }
 
     public boolean appendTuple() throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.FINEST)) {
-            LOGGER.finest("appendTuple(): tuple size: " + count);
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("appendTuple(): tuple size: " + count);
         }
         boolean appended = frameTupleAppender.append(buf, 0, count);
         count = 0;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppenderAccessor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppenderAccessor.java
index b464f8e..4a324ff 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppenderAccessor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/FrameTupleAppenderAccessor.java
@@ -47,9 +47,8 @@
 
     @Override
     public int getTupleStartOffset(int tupleIndex) {
-        int offset = tupleIndex == 0 ?
-                FrameConstants.TUPLE_START_OFFSET :
-                IntSerDeUtils.getInt(getBuffer().array(), tupleCountOffset - 4 * tupleIndex);
+        int offset = tupleIndex == 0 ? FrameConstants.TUPLE_START_OFFSET
+                : IntSerDeUtils.getInt(getBuffer().array(), tupleCountOffset - 4 * tupleIndex);
         return offset;
     }
 
@@ -65,8 +64,8 @@
 
     @Override
     public int getFieldStartOffset(int tupleIndex, int fIdx) {
-        return fIdx == 0 ? 0 : IntSerDeUtils.getInt(getBuffer().array(),
-                getTupleStartOffset(tupleIndex) + (fIdx - 1) * 4);
+        return fIdx == 0 ? 0
+                : IntSerDeUtils.getInt(getBuffer().array(), getTupleStartOffset(tupleIndex) + (fIdx - 1) * 4);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/SerializingDataWriter.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/SerializingDataWriter.java
index d9a4c7c..f7b5e3b 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/SerializingDataWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/comm/io/SerializingDataWriter.java
@@ -18,9 +18,6 @@
  */
 package org.apache.hyracks.dataflow.common.comm.io;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.comm.VSizeFrame;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -28,9 +25,11 @@
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.util.FrameUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class SerializingDataWriter implements IOpenableDataWriter<Object[]> {
-    private static final Logger LOGGER = Logger.getLogger(SerializingDataWriter.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final ArrayTupleBuilder tb;
 
@@ -82,8 +81,8 @@
         tb.reset();
         for (int i = 0; i < data.length; ++i) {
             Object instance = data[i];
-            if (LOGGER.isLoggable(Level.FINEST)) {
-                LOGGER.finest(i + " " + instance);
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(i + " " + instance);
             }
             tb.addField(recordDescriptor.getFields()[i], instance);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactory.java
index 3d081af..9557245 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactory.java
@@ -21,18 +21,45 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 import org.apache.hyracks.data.std.primitive.ByteArrayPointable;
 
 public class ByteArrayNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
+    private static final long serialVersionUID = 1L;
+
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 1;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return false;
+        }
+    };
+
     public static ByteArrayNormalizedKeyComputerFactory INSTANCE = new ByteArrayNormalizedKeyComputerFactory();
 
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                return ByteArrayPointable.normalize(bytes, start);
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                normalizedKeys[keyStart] = ByteArrayPointable.normalize(bytes, start);
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
             }
         };
     }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactory.java
index 353793b..4d5d57c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactory.java
@@ -20,28 +20,53 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
-import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
+import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 
 public class DoubleNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
 
     private static final long serialVersionUID = 1L;
 
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 2;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return true;
+        }
+    };
+
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
 
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                int prefix = IntegerPointable.getInteger(bytes, start);
-                if (prefix >= 0) {
-                    return prefix ^ Integer.MIN_VALUE;
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                long value = LongPointable.getLong(bytes, start);
+                if (value >= 0) {
+                    value = value ^ Long.MIN_VALUE;
                 } else {
-                    return (int) ((long) 0xffffffff - (long) prefix);
+                    value = ~value;
                 }
+                NormalizedKeyUtils.putLongIntoNormalizedKeys(normalizedKeys, keyStart, value);
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
             }
 
         };
     }
 
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactory.java
index eb571a5..3b0d9d7 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactory.java
@@ -20,28 +20,51 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 
 public class FloatNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
 
     private static final long serialVersionUID = 1L;
 
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 1;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return true;
+        }
+    };
+
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
-
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                int prefix = IntegerPointable.getInteger(bytes, start);
-                if (prefix >= 0) {
-                    return prefix ^ Integer.MIN_VALUE;
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                int value = IntegerPointable.getInteger(bytes, start);
+                if (value >= 0) {
+                    normalizedKeys[keyStart] = value ^ Integer.MIN_VALUE;
                 } else {
-                    return (int) ((long) 0xffffffff - (long) prefix);
+                    // invert the key
+                    normalizedKeys[keyStart] = ~value;
                 }
             }
 
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
+            }
         };
     }
 
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactory.java
index fa74665..853499f 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactory.java
@@ -20,55 +20,47 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 import org.apache.hyracks.data.std.primitive.LongPointable;
-import org.apache.hyracks.dataflow.common.data.marshalling.Integer64SerializerDeserializer;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 
 public class Integer64NormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
 
-    private static final long serialVersionUID = 8735044913496854551L;
+    private static final long serialVersionUID = 1L;
+
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 2;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return true;
+        }
+    };
 
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
-            private static final int POSTIVE_LONG_MASK = (3 << 30);
-            private static final int NON_NEGATIVE_INT_MASK = (2 << 30);
-            private static final int NEGATIVE_LONG_MASK = (0 << 30);
+            @Override
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                long value = LongPointable.getLong(bytes, start);
+                value = value ^ Long.MIN_VALUE;
+                NormalizedKeyUtils.putLongIntoNormalizedKeys(normalizedKeys, keyStart, value);
+            }
 
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                long value = LongPointable.getLong(bytes, start);
-                int highValue = (int) (value >> 32);
-                if (value > Integer.MAX_VALUE) {
-                    /**
-                     * larger than Integer.MAX
-                     */
-                    int highNmk = getKey(highValue);
-                    highNmk >>= 2;
-                    highNmk |= POSTIVE_LONG_MASK;
-                    return highNmk;
-                } else if (value >=0 && value <= Integer.MAX_VALUE) {
-                    /**
-                     * smaller than Integer.MAX but >=0
-                     */
-                    int lowNmk = (int) value;
-                    lowNmk >>= 2;
-                    lowNmk |= NON_NEGATIVE_INT_MASK;
-                    return lowNmk;
-                } else {
-                    /**
-                     * less than 0: have not optimized for that
-                     */
-                    int highNmk = getKey(highValue);
-                    highNmk >>= 2;
-                    highNmk |= NEGATIVE_LONG_MASK;
-                    return highNmk;
-                }
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
             }
-
-            private int getKey(int value) {
-                return value ^ Integer.MIN_VALUE;
-            }
-
         };
     }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactory.java
index 5cfef28..60b8d7d 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactory.java
@@ -20,20 +20,44 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 import org.apache.hyracks.data.std.primitive.IntegerPointable;
-import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 
 public class IntegerNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
     private static final long serialVersionUID = 1L;
 
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            return 1;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return true;
+        }
+    };
+
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
                 int value = IntegerPointable.getInteger(bytes, start);
-                return value ^Integer.MIN_VALUE;
+                normalizedKeys[keyStart] = value ^ Integer.MIN_VALUE;
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
             }
         };
     }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/UTF8StringNormalizedKeyComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/UTF8StringNormalizedKeyComputerFactory.java
index 589ae68..fefcebd 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/UTF8StringNormalizedKeyComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/normalizers/UTF8StringNormalizedKeyComputerFactory.java
@@ -20,18 +20,44 @@
 
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyProperties;
 import org.apache.hyracks.util.string.UTF8StringUtil;
 
 public class UTF8StringNormalizedKeyComputerFactory implements INormalizedKeyComputerFactory {
     private static final long serialVersionUID = 1L;
 
+    public static final INormalizedKeyProperties PROPERTIES = new INormalizedKeyProperties() {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public int getNormalizedKeyLength() {
+            // TODO optimize normalize key for UTF8 to use multiple integers
+            return 1;
+        }
+
+        @Override
+        public boolean isDecisive() {
+            return false;
+        }
+    };
+
     @Override
     public INormalizedKeyComputer createNormalizedKeyComputer() {
         return new INormalizedKeyComputer() {
             @Override
-            public int normalize(byte[] bytes, int start, int length) {
-                return UTF8StringUtil.normalize(bytes, start);
+            public void normalize(byte[] bytes, int start, int length, int[] normalizedKeys, int keyStart) {
+                normalizedKeys[keyStart] = UTF8StringUtil.normalize(bytes, start);
+            }
+
+            @Override
+            public INormalizedKeyProperties getNormalizedKeyProperties() {
+                return PROPERTIES;
             }
         };
     }
+
+    @Override
+    public INormalizedKeyProperties getNormalizedKeyProperties() {
+        return PROPERTIES;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFactory.java
index ee5a041..dc66d19 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFactory.java
@@ -55,8 +55,8 @@
                     IBinaryHashFunction hashFn = hashFunctions[j];
                     int fStart = accessor.getFieldStartOffset(tIndex, fIdx);
                     int fEnd = accessor.getFieldEndOffset(tIndex, fIdx);
-                    int fh = hashFn
-                            .hash(accessor.getBuffer().array(), startOffset + slotLength + fStart, fEnd - fStart);
+                    int fh = hashFn.hash(accessor.getBuffer().array(), startOffset + slotLength + fStart,
+                            fEnd - fStart);
                     h = h * 31 + fh;
                 }
                 if (h < 0) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFamily.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFamily.java
index 458171c..4385bd5 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFamily.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/FieldHashPartitionComputerFamily.java
@@ -30,7 +30,8 @@
     private final int[] hashFields;
     private final IBinaryHashFunctionFamily[] hashFunctionGeneratorFactories;
 
-    public FieldHashPartitionComputerFamily(int[] hashFields, IBinaryHashFunctionFamily[] hashFunctionGeneratorFactories) {
+    public FieldHashPartitionComputerFamily(int[] hashFields,
+            IBinaryHashFunctionFamily[] hashFunctionGeneratorFactories) {
         this.hashFields = hashFields;
         this.hashFunctionGeneratorFactories = hashFunctionGeneratorFactories;
     }
@@ -52,8 +53,8 @@
                     IBinaryHashFunction hashFn = hashFunctions[j];
                     int fStart = accessor.getFieldStartOffset(tIndex, fIdx);
                     int fEnd = accessor.getFieldEndOffset(tIndex, fIdx);
-                    int fh = hashFn
-                            .hash(accessor.getBuffer().array(), startOffset + slotLength + fStart, fEnd - fStart);
+                    int fh = hashFn.hash(accessor.getBuffer().array(), startOffset + slotLength + fStart,
+                            fEnd - fStart);
                     h += fh;
                 }
                 if (h < 0) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/range/FieldRangePartitionComputerFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/range/FieldRangePartitionComputerFactory.java
index f4da9bf..d58a248 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/range/FieldRangePartitionComputerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/data/partition/range/FieldRangePartitionComputerFactory.java
@@ -86,8 +86,8 @@
                     int fIdx = rangeFields[f];
                     int fStart = accessor.getFieldStartOffset(tIndex, fIdx);
                     int fEnd = accessor.getFieldEndOffset(tIndex, fIdx);
-                    c = comparators[f].compare(accessor.getBuffer().array(), startOffset + slotLength + fStart, fEnd
-                            - fStart, rangeMap.getByteArray(fieldIndex, f), rangeMap.getStartOffset(fieldIndex, f),
+                    c = comparators[f].compare(accessor.getBuffer().array(), startOffset + slotLength + fStart,
+                            fEnd - fStart, rangeMap.getByteArray(fieldIndex, f), rangeMap.getStartOffset(fieldIndex, f),
                             rangeMap.getLength(fieldIndex, f));
                     if (c != 0) {
                         return c;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/NormalizedKeyUtils.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/NormalizedKeyUtils.java
new file mode 100644
index 0000000..175b04a
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/NormalizedKeyUtils.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.dataflow.common.utils;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+
+public class NormalizedKeyUtils {
+
+    private NormalizedKeyUtils() {
+    }
+
+    public static int compareNormalizeKeys(int[] keys1, int start1, int[] keys2, int start2, int length) {
+        for (int i = 0; i < length; i++) {
+            int key1 = keys1[start1 + i];
+            int key2 = keys2[start2 + i];
+            if (key1 != key2) {
+                return (((key1) & 0xffffffffL) < ((key2) & 0xffffffffL)) ? -1 : 1;
+            }
+        }
+        return 0;
+    }
+
+    public static int getDecisivePrefixLength(INormalizedKeyComputerFactory[] keyNormalizerFactories) {
+        if (keyNormalizerFactories == null) {
+            return 0;
+        }
+        for (int i = 0; i < keyNormalizerFactories.length; i++) {
+            if (!keyNormalizerFactories[i].getNormalizedKeyProperties().isDecisive()) {
+                return i;
+            }
+        }
+        return keyNormalizerFactories.length;
+    }
+
+    public static void putLongIntoNormalizedKeys(int[] normalizedKeys, int keyStart, long key) {
+        int high = (int) (key >> 32);
+        normalizedKeys[keyStart] = high;
+        int low = (int) key;
+        normalizedKeys[keyStart + 1] = low;
+    }
+
+    public static int[] createNormalizedKeyArray(INormalizedKeyComputer normalizer) {
+        if (normalizer == null) {
+            return null; //NOSONAR
+        }
+        return new int[normalizer.getNormalizedKeyProperties().getNormalizedKeyLength()];
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
index 81f06da..e99a2ff 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/SerdeUtils.java
@@ -112,7 +112,8 @@
         return f.createBinaryComparator();
     }
 
-    public static IBinaryComparatorFactory[] serdesToComparatorFactories(ISerializerDeserializer[] serdes, int numSerdes) {
+    public static IBinaryComparatorFactory[] serdesToComparatorFactories(ISerializerDeserializer[] serdes,
+            int numSerdes) {
         IBinaryComparatorFactory[] comparatorsFactories = new IBinaryComparatorFactory[numSerdes];
         for (int i = 0; i < numSerdes; i++) {
             comparatorsFactories[i] = serdeToComparatorFactory(serdes[i]);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/TupleUtils.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/TupleUtils.java
index 52bf893..08ed922 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/TupleUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/main/java/org/apache/hyracks/dataflow/common/utils/TupleUtils.java
@@ -67,7 +67,7 @@
     }
 
     public static void createIntegerTuple(ArrayTupleBuilder tupleBuilder, ArrayTupleReference tuple, boolean filtered,
-                                          final int... fields) throws HyracksDataException {
+            final int... fields) throws HyracksDataException {
         DataOutput dos = tupleBuilder.getDataOutput();
         tupleBuilder.reset();
         for (final int i : fields) {
@@ -88,8 +88,8 @@
 
     public static ITupleReference createIntegerTuple(boolean filtered, final int... fields)
             throws HyracksDataException {
-        ArrayTupleBuilder tupleBuilder = filtered ? new ArrayTupleBuilder(fields.length + 1)
-                : new ArrayTupleBuilder(fields.length);
+        ArrayTupleBuilder tupleBuilder =
+                filtered ? new ArrayTupleBuilder(fields.length + 1) : new ArrayTupleBuilder(fields.length);
         ArrayTupleReference tuple = new ArrayTupleReference();
         createIntegerTuple(tupleBuilder, tuple, fields);
         return tuple;
@@ -122,8 +122,8 @@
         StringBuilder strBuilder = new StringBuilder();
         int numPrintFields = Math.min(tuple.getFieldCount(), fields.length);
         for (int i = 0; i < numPrintFields; i++) {
-            ByteArrayInputStream inStream = new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i),
-                    tuple.getFieldLength(i));
+            ByteArrayInputStream inStream =
+                    new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i));
             DataInput dataIn = new DataInputStream(inStream);
             Object o = fields[i].deserialize(dataIn);
             strBuilder.append(o.toString());
@@ -139,8 +139,8 @@
         int numFields = Math.min(tuple.getFieldCount(), fields.length);
         Object[] objs = new Object[numFields];
         for (int i = 0; i < numFields; i++) {
-            ByteArrayInputStream inStream = new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i),
-                    tuple.getFieldLength(i));
+            ByteArrayInputStream inStream =
+                    new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i));
             DataInput dataIn = new DataInputStream(inStream);
             objs[i] = fields[i].deserialize(dataIn);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/comm/io/largeobject/FrameFixedFieldTupleAppenderTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/comm/io/largeobject/FrameFixedFieldTupleAppenderTest.java
index 766c77a..c39648c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/comm/io/largeobject/FrameFixedFieldTupleAppenderTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/comm/io/largeobject/FrameFixedFieldTupleAppenderTest.java
@@ -155,8 +155,8 @@
 
     private IFrameTupleAccessor prepareData(DATA_TYPE type) throws HyracksDataException {
         IFrameTupleAccessor accessor = new FrameTupleAccessor(recordDescriptor);
-        IFrameTupleAppender appender = new FrameTupleAppender(new VSizeFrame(new FrameManager(INPUT_BUFFER_SIZE)),
-                true);
+        IFrameTupleAppender appender =
+                new FrameTupleAppender(new VSizeFrame(new FrameManager(INPUT_BUFFER_SIZE)), true);
         int i = 0;
         do {
             switch (type) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/AbstractNormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/AbstractNormalizedKeyComputerFactoryTest.java
new file mode 100644
index 0000000..2107574
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/AbstractNormalizedKeyComputerFactoryTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.dataflow.common.data.normalizers;
+
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+public abstract class AbstractNormalizedKeyComputerFactoryTest {
+
+    @Test
+    public void testPositive() {
+        IPointable large = getLargePositive();
+        IPointable small = getSmallPositive();
+
+        normalizeAndCompare(large, small, 1);
+        normalizeAndCompare(small, large, -1);
+        normalizeAndCompare(large, large, 0);
+    }
+
+    @Test
+    public void testNegative() {
+        IPointable small = getSmallNegative();
+        IPointable large = getLargeNegative();
+
+        normalizeAndCompare(large, small, 1);
+        normalizeAndCompare(small, large, -1);
+        normalizeAndCompare(large, large, 0);
+    }
+
+    @Test
+    public void testPositiveAndNegative() {
+        IPointable smallNegative = getSmallNegative();
+        IPointable largeNegative = getLargeNegative();
+        IPointable smallPositive = getSmallPositive();
+        IPointable largePositive = getLargePositive();
+
+        normalizeAndCompare(smallNegative, smallPositive, -1);
+        normalizeAndCompare(smallNegative, largePositive, -1);
+        normalizeAndCompare(largeNegative, smallPositive, -1);
+        normalizeAndCompare(largeNegative, largePositive, -1);
+    }
+
+    protected void normalizeAndCompare(IPointable p1, IPointable p2, int result) {
+        int[] key1 = normalize(p1);
+        int[] key2 = normalize(p2);
+        int comp = NormalizedKeyUtils.compareNormalizeKeys(key1, 0, key2, 0, key1.length);
+        if (result > 0) {
+            Assert.assertTrue(comp > 0);
+        } else if (result == 0) {
+            Assert.assertTrue(comp == 0);
+        } else {
+            Assert.assertTrue(comp < 0);
+        }
+    }
+
+    protected abstract IPointable getLargePositive();
+
+    protected abstract IPointable getSmallPositive();
+
+    protected abstract IPointable getLargeNegative();
+
+    protected abstract IPointable getSmallNegative();
+
+    protected abstract int[] normalize(IPointable value);
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactoryTest.java
index a362e60..675bf36 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactoryTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/ByteArrayNormalizedKeyComputerFactoryTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.hyracks.dataflow.common.data.normalizers;
 
-import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.*;
 
 import java.util.Random;
 
@@ -36,10 +36,10 @@
     @Test
     public void testRandomNormalizedKey() {
         for (int i = 0; i < 10; ++i) {
-            ByteArrayPointable pointable1 = generateRandomByteArrayPointableWithFixLength(
-                    Math.abs(random.nextInt((i + 1) * 10)), random);
-            ByteArrayPointable pointable2 = generateRandomByteArrayPointableWithFixLength(
-                    Math.abs(random.nextInt((i + 1) * 10)), random);
+            ByteArrayPointable pointable1 =
+                    generateRandomByteArrayPointableWithFixLength(Math.abs(random.nextInt((i + 1) * 10)), random);
+            ByteArrayPointable pointable2 =
+                    generateRandomByteArrayPointableWithFixLength(Math.abs(random.nextInt((i + 1) * 10)), random);
             assertNormalizeValue(pointable1, pointable2, computer);
         }
     }
@@ -52,11 +52,13 @@
 
     public static void assertNormalizeValue(ByteArrayPointable pointable1, ByteArrayPointable pointable2,
             INormalizedKeyComputer computer) {
-        int n1 = computer.normalize(pointable1.getByteArray(), pointable1.getStartOffset(), pointable1.getLength());
-        int n2 = computer.normalize(pointable2.getByteArray(), pointable2.getStartOffset(), pointable2.getLength());
-        if (n1 < n2) {
+        int[] key1 = new int[ByteArrayNormalizedKeyComputerFactory.PROPERTIES.getNormalizedKeyLength()];
+        int[] key2 = new int[ByteArrayNormalizedKeyComputerFactory.PROPERTIES.getNormalizedKeyLength()];
+        computer.normalize(pointable1.getByteArray(), pointable1.getStartOffset(), pointable1.getLength(), key1, 0);
+        computer.normalize(pointable2.getByteArray(), pointable2.getStartOffset(), pointable2.getLength(), key2, 0);
+        if (key1[0] < key2[0]) {
             assertTrue(pointable1.compareTo(pointable2) < 0);
-        } else if (n1 > n2) {
+        } else if (key1[0] > key2[0]) {
             assertTrue(pointable1.compareTo(pointable2) > 0);
         }
     }
@@ -70,12 +72,15 @@
         }
 
         ByteArrayPointable ptr1 = ByteArrayPointable.generatePointableFromPureBytes(new byte[] { 0, 25, 34, 42 });
-        ByteArrayPointable ptr2 = ByteArrayPointable.generatePointableFromPureBytes(
-                new byte[] { (byte) 130, 25, 34, 42 });
+        ByteArrayPointable ptr2 =
+                ByteArrayPointable.generatePointableFromPureBytes(new byte[] { (byte) 130, 25, 34, 42 });
 
-        int n1 = computer.normalize(ptr1.getByteArray(), ptr1.getStartOffset(), ptr1.getLength());
-        int n2 = computer.normalize(ptr2.getByteArray(), ptr2.getStartOffset(), ptr2.getLength());
-        assertTrue(n1 < n2);
+        int[] key1 = new int[ByteArrayNormalizedKeyComputerFactory.PROPERTIES.getNormalizedKeyLength()];
+        int[] key2 = new int[ByteArrayNormalizedKeyComputerFactory.PROPERTIES.getNormalizedKeyLength()];
+        computer.normalize(ptr1.getByteArray(), ptr1.getStartOffset(), ptr1.getLength(), key1, 0);
+        computer.normalize(ptr2.getByteArray(), ptr2.getStartOffset(), ptr2.getLength(), key2, 0);
+
+        assertTrue(key1[0] < key2[0]);
 
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactoryTest.java
new file mode 100644
index 0000000..012ef07
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/DoubleNormalizedKeyComputerFactoryTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.dataflow.common.data.normalizers;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.DoublePointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
+
+public class DoubleNormalizedKeyComputerFactoryTest extends AbstractNormalizedKeyComputerFactoryTest {
+
+    private final INormalizedKeyComputer normalizer =
+            new DoubleNormalizedKeyComputerFactory().createNormalizedKeyComputer();
+
+    @Override
+    protected IPointable getLargePositive() {
+        return getDoublePointable(Double.MAX_VALUE - 1);
+    }
+
+    @Override
+    protected IPointable getSmallPositive() {
+        return getDoublePointable(Double.MIN_VALUE);
+    }
+
+    @Override
+    protected IPointable getLargeNegative() {
+        return getDoublePointable(Double.MIN_VALUE * -1);
+
+    }
+
+    @Override
+    protected IPointable getSmallNegative() {
+        return getDoublePointable(Double.MAX_VALUE * -1);
+    }
+
+    private IPointable getDoublePointable(double value) {
+        DoublePointable pointable = (DoublePointable) DoublePointable.FACTORY.createPointable();
+        pointable.set(new byte[Double.BYTES], 0, Double.BYTES);
+        pointable.setDouble(value);
+        return pointable;
+    }
+
+    @Override
+    protected int[] normalize(IPointable value) {
+        int[] keys = NormalizedKeyUtils.createNormalizedKeyArray(normalizer);
+        normalizer.normalize(value.getByteArray(), value.getStartOffset(), value.getLength(), keys, 0);
+        return keys;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactoryTest.java
new file mode 100644
index 0000000..cd6f4c4
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/FloatNormalizedKeyComputerFactoryTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.dataflow.common.data.normalizers;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.FloatPointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
+
+public class FloatNormalizedKeyComputerFactoryTest extends AbstractNormalizedKeyComputerFactoryTest {
+
+    private final INormalizedKeyComputer normalizer =
+            new FloatNormalizedKeyComputerFactory().createNormalizedKeyComputer();
+
+    @Override
+    protected IPointable getLargePositive() {
+        return getFloatPointable(Float.MAX_VALUE - 1);
+    }
+
+    @Override
+    protected IPointable getSmallPositive() {
+        return getFloatPointable(Float.MIN_VALUE);
+    }
+
+    @Override
+    protected IPointable getLargeNegative() {
+        return getFloatPointable(Float.MIN_VALUE * -1);
+
+    }
+
+    @Override
+    protected IPointable getSmallNegative() {
+        return getFloatPointable(Float.MAX_VALUE * -1);
+    }
+
+    private IPointable getFloatPointable(float value) {
+        FloatPointable pointable = (FloatPointable) FloatPointable.FACTORY.createPointable();
+        pointable.set(new byte[Float.BYTES], 0, Float.BYTES);
+        pointable.setFloat(value);
+        return pointable;
+    }
+
+    @Override
+    protected int[] normalize(IPointable value) {
+        int[] keys = NormalizedKeyUtils.createNormalizedKeyArray(normalizer);
+        normalizer.normalize(value.getByteArray(), value.getStartOffset(), value.getLength(), keys, 0);
+        return keys;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactoryTest.java
new file mode 100644
index 0000000..6ca623d
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/Integer64NormalizedKeyComputerFactoryTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.dataflow.common.data.normalizers;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
+
+public class Integer64NormalizedKeyComputerFactoryTest extends AbstractNormalizedKeyComputerFactoryTest {
+
+    private final INormalizedKeyComputer normalizer =
+            new Integer64NormalizedKeyComputerFactory().createNormalizedKeyComputer();
+
+    @Override
+    protected IPointable getLargePositive() {
+        return getLongPointable(Long.MAX_VALUE - 1);
+    }
+
+    @Override
+    protected IPointable getSmallPositive() {
+        return getLongPointable(1);
+    }
+
+    @Override
+    protected IPointable getLargeNegative() {
+        return getLongPointable(-1);
+    }
+
+    @Override
+    protected IPointable getSmallNegative() {
+        return getLongPointable(Long.MIN_VALUE + 1);
+    }
+
+    private IPointable getLongPointable(long value) {
+        LongPointable pointable = LongPointable.FACTORY.createPointable();
+        pointable.set(new byte[Long.BYTES], 0, Long.BYTES);
+        pointable.setLong(value);
+        return pointable;
+    }
+
+    @Override
+    protected int[] normalize(IPointable value) {
+        int[] keys = NormalizedKeyUtils.createNormalizedKeyArray(normalizer);
+        normalizer.normalize(value.getByteArray(), value.getStartOffset(), value.getLength(), keys, 0);
+        return keys;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactoryTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactoryTest.java
new file mode 100644
index 0000000..9122721
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-common/src/test/java/org/apache/hyracks/dataflow/common/data/normalizers/IntegerNormalizedKeyComputerFactoryTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.dataflow.common.data.normalizers;
+
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputer;
+import org.apache.hyracks.data.std.api.IPointable;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
+
+public class IntegerNormalizedKeyComputerFactoryTest extends AbstractNormalizedKeyComputerFactoryTest {
+
+    private final INormalizedKeyComputer normalizer =
+            new IntegerNormalizedKeyComputerFactory().createNormalizedKeyComputer();
+
+    @Override
+    protected IPointable getLargePositive() {
+        return getIntPointable(Integer.MAX_VALUE - 1);
+    }
+
+    @Override
+    protected IPointable getSmallPositive() {
+        return getIntPointable(1);
+    }
+
+    @Override
+    protected IPointable getLargeNegative() {
+        return getIntPointable(-1);
+
+    }
+
+    @Override
+    protected IPointable getSmallNegative() {
+        return getIntPointable(Integer.MIN_VALUE + 1);
+    }
+
+    private IPointable getIntPointable(int value) {
+        IntegerPointable pointable = (IntegerPointable) IntegerPointable.FACTORY.createPointable();
+        pointable.set(new byte[Integer.BYTES], 0, Integer.BYTES);
+        pointable.setInteger(value);
+        return pointable;
+    }
+
+    @Override
+    protected int[] normalize(IPointable value) {
+        int[] keys = NormalizedKeyUtils.createNormalizedKeyArray(normalizer);
+        normalizer.normalize(value.getByteArray(), value.getStartOffset(), value.getLength(), keys, 0);
+        return keys;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml b/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
index ea76586..c78c98c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/pom.xml
@@ -90,5 +90,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractOperatorDescriptor.java
index e338961..c6512929 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractOperatorDescriptor.java
@@ -92,7 +92,7 @@
     }
 
     @Override
-    public ObjectNode toJSON()  {
+    public ObjectNode toJSON() {
         ObjectMapper om = new ObjectMapper();
         ObjectNode jop = om.createObjectNode();
         jop.put("id", String.valueOf(getOperatorId()));
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractUnaryInputOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractUnaryInputOperatorNodePushable.java
index 93a8120..6ae5b28 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractUnaryInputOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/base/AbstractUnaryInputOperatorNodePushable.java
@@ -22,8 +22,8 @@
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public abstract class AbstractUnaryInputOperatorNodePushable extends AbstractOperatorNodePushable implements
-        IFrameWriter {
+public abstract class AbstractUnaryInputOperatorNodePushable extends AbstractOperatorNodePushable
+        implements IFrameWriter {
     protected IFrameWriter writer;
     protected RecordDescriptor recordDesc;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/DeallocatableFramePool.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/DeallocatableFramePool.java
index 4499e32c..47b11ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/DeallocatableFramePool.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/DeallocatableFramePool.java
@@ -64,7 +64,7 @@
 
     private ByteBuffer mergeExistingFrames(int frameSize) throws HyracksDataException {
         int mergedSize = memBudget - allocated;
-        for (Iterator<ByteBuffer> iter = buffers.iterator(); iter.hasNext(); ) {
+        for (Iterator<ByteBuffer> iter = buffers.iterator(); iter.hasNext();) {
             ByteBuffer buffer = iter.next();
             iter.remove();
             mergedSize += buffer.capacity();
@@ -88,7 +88,7 @@
     }
 
     private ByteBuffer findExistingFrame(int frameSize) {
-        for (Iterator<ByteBuffer> iter = buffers.iterator(); iter.hasNext(); ) {
+        for (Iterator<ByteBuffer> iter = buffers.iterator(); iter.hasNext();) {
             ByteBuffer next = iter.next();
             if (next.capacity() >= frameSize) {
                 iter.remove();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/FrameBufferManager.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/FrameBufferManager.java
index 700500b..6a60813 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/FrameBufferManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/FrameBufferManager.java
@@ -59,4 +59,3 @@
     }
 
 }
-
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/VariableDeletableTupleMemoryManager.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/VariableDeletableTupleMemoryManager.java
index 4ed11e6..6c67ecc 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/VariableDeletableTupleMemoryManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/buffermanager/VariableDeletableTupleMemoryManager.java
@@ -21,8 +21,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
@@ -30,13 +28,15 @@
 import org.apache.hyracks.dataflow.std.sort.util.DeletableFrameTupleAppender;
 import org.apache.hyracks.dataflow.std.sort.util.IAppendDeletableFrameTupleAccessor;
 import org.apache.hyracks.dataflow.std.structures.TuplePointer;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * Enable the delete record operation in the memory management. This is only used in the {@link org.apache.hyracks.dataflow.std.sort.HeapSortRunGenerator}
  */
 public class VariableDeletableTupleMemoryManager implements IDeletableTupleBufferManager {
 
-    private static final Logger LOG = Logger.getLogger(VariableDeletableTupleMemoryManager.class.getName());
+    private static final Logger LOG = LogManager.getLogger();
 
     private final int minFreeSpace;
     private final IFramePool pool;
@@ -161,8 +161,8 @@
         policy.reset();
         frames.clear();
         numTuples = 0;
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("VariableTupleMemoryManager has reorganized " + statsReOrg + " times");
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("VariableTupleMemoryManager has reorganized " + statsReOrg + " times");
         }
         statsReOrg = 0;
     }
@@ -170,8 +170,8 @@
     @Override
     public ITuplePointerAccessor createTuplePointerAccessor() {
         return new AbstractTuplePointerAccessor() {
-            private IAppendDeletableFrameTupleAccessor bufferAccessor = new DeletableFrameTupleAppender(
-                    recordDescriptor);
+            private final IAppendDeletableFrameTupleAccessor bufferAccessor =
+                    new DeletableFrameTupleAppender(recordDescriptor);
 
             @Override
             IFrameTupleAccessor getInnerAccessor() {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/NonDeterministicChannelReader.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/NonDeterministicChannelReader.java
index d7d5c27..9676c9c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/NonDeterministicChannelReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/NonDeterministicChannelReader.java
@@ -20,16 +20,16 @@
 
 import java.nio.ByteBuffer;
 import java.util.BitSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.channels.IInputChannel;
 import org.apache.hyracks.api.channels.IInputChannelMonitor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.partitions.PartitionId;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class NonDeterministicChannelReader implements IInputChannelMonitor, IPartitionAcceptor {
-    private static final Logger LOGGER = Logger.getLogger(NonDeterministicChannelReader.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final int nSenderPartitions;
 
@@ -143,8 +143,8 @@
     public synchronized void notifyFailure(IInputChannel channel) {
         PartitionId pid = (PartitionId) channel.getAttachment();
         int senderIndex = pid.getSenderIndex();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Failure: " + pid.getConnectorDescriptorId() + " sender: " + senderIndex + " receiver: "
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Failure: " + pid.getConnectorDescriptorId() + " sender: " + senderIndex + " receiver: "
                     + pid.getReceiverIndex());
         }
         failSenders.set(senderIndex);
@@ -156,8 +156,8 @@
     public synchronized void notifyDataAvailability(IInputChannel channel, int nFrames) {
         PartitionId pid = (PartitionId) channel.getAttachment();
         int senderIndex = pid.getSenderIndex();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Data available: " + pid.getConnectorDescriptorId() + " sender: " + senderIndex + " receiver: "
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Data available: " + pid.getConnectorDescriptorId() + " sender: " + senderIndex + " receiver: "
                     + pid.getReceiverIndex());
         }
         availableFrameCounts[senderIndex] += nFrames;
@@ -169,8 +169,8 @@
     public synchronized void notifyEndOfStream(IInputChannel channel) {
         PartitionId pid = (PartitionId) channel.getAttachment();
         int senderIndex = pid.getSenderIndex();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("EOS: " + pid);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("EOS: " + pid);
         }
         eosSenders.set(senderIndex);
         notifyAll();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/SortMergeFrameReader.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/SortMergeFrameReader.java
index 4359b54..27e2671 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/SortMergeFrameReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/collectors/SortMergeFrameReader.java
@@ -65,8 +65,8 @@
             }
             List<IFrameReader> batch = new ArrayList<IFrameReader>(nSenders);
             pbm.getNextBatch(batch, nSenders);
-            merger = new RunMergingFrameReader(ctx, batch, inFrames, sortFields,
-                    comparators, nmkComputer, recordDescriptor);
+            merger = new RunMergingFrameReader(ctx, batch, inFrames, sortFields, comparators, nmkComputer,
+                    recordDescriptor);
         } else {
             // multi level merge.
             throw new HyracksDataException("Not yet supported");
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/LocalityAwareMToNPartitioningConnectorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/LocalityAwareMToNPartitioningConnectorDescriptor.java
index b1cd83e..920fdb8 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/LocalityAwareMToNPartitioningConnectorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/LocalityAwareMToNPartitioningConnectorDescriptor.java
@@ -82,8 +82,8 @@
                 expectedPartitions.set(i);
             }
         }
-        NonDeterministicChannelReader channelReader = new NonDeterministicChannelReader(nProducerPartitions,
-                expectedPartitions);
+        NonDeterministicChannelReader channelReader =
+                new NonDeterministicChannelReader(nProducerPartitions, expectedPartitions);
         NonDeterministicFrameReader frameReader = new NonDeterministicFrameReader(channelReader);
         return new PartitionCollector(ctx, getConnectorId(), receiverIndex, expectedPartitions, frameReader,
                 channelReader);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningConnectorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningConnectorDescriptor.java
index d26b9ef..02fbedb 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningConnectorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningConnectorDescriptor.java
@@ -54,8 +54,8 @@
             int nProducerPartitions, int nConsumerPartitions) throws HyracksDataException {
         BitSet expectedPartitions = new BitSet(nProducerPartitions);
         expectedPartitions.set(0, nProducerPartitions);
-        NonDeterministicChannelReader channelReader = new NonDeterministicChannelReader(nProducerPartitions,
-                expectedPartitions);
+        NonDeterministicChannelReader channelReader =
+                new NonDeterministicChannelReader(nProducerPartitions, expectedPartitions);
         NonDeterministicFrameReader frameReader = new NonDeterministicFrameReader(channelReader);
         return new PartitionCollector(ctx, getConnectorId(), index, expectedPartitions, frameReader, channelReader);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningMergingConnectorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningMergingConnectorDescriptor.java
index edcad42..026ca5e 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningMergingConnectorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/MToNPartitioningMergingConnectorDescriptor.java
@@ -69,8 +69,8 @@
     public IFrameWriter createPartitioner(IHyracksTaskContext ctx, RecordDescriptor recordDesc,
             IPartitionWriterFactory edwFactory, int index, int nProducerPartitions, int nConsumerPartitions)
             throws HyracksDataException {
-        final PartitionDataWriter hashWriter = new PartitionDataWriter(ctx, nConsumerPartitions, edwFactory, recordDesc,
-                tpcf.createPartitioner());
+        final PartitionDataWriter hashWriter =
+                new PartitionDataWriter(ctx, nConsumerPartitions, edwFactory, recordDesc, tpcf.createPartitioner());
         return hashWriter;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/OneToOneConnectorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/OneToOneConnectorDescriptor.java
index eda353b..78428a3 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/OneToOneConnectorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/OneToOneConnectorDescriptor.java
@@ -57,8 +57,8 @@
             int nProducerPartitions, int nConsumerPartitions) throws HyracksDataException {
         BitSet expectedPartitions = new BitSet(nProducerPartitions);
         expectedPartitions.set(index);
-        NonDeterministicChannelReader channelReader = new NonDeterministicChannelReader(nProducerPartitions,
-                expectedPartitions);
+        NonDeterministicChannelReader channelReader =
+                new NonDeterministicChannelReader(nProducerPartitions, expectedPartitions);
         NonDeterministicFrameReader frameReader = new NonDeterministicFrameReader(channelReader);
         return new PartitionCollector(ctx, getConnectorId(), index, expectedPartitions, frameReader, channelReader);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/PartitionWithMessageDataWriter.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/PartitionWithMessageDataWriter.java
index 97d5f2b..e1df709 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/PartitionWithMessageDataWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/connectors/PartitionWithMessageDataWriter.java
@@ -30,7 +30,7 @@
 
     public PartitionWithMessageDataWriter(IHyracksTaskContext ctx, int consumerPartitionCount,
             IPartitionWriterFactory pwFactory, RecordDescriptor recordDescriptor, ITuplePartitionComputer tpc)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         super(ctx, consumerPartitionCount, pwFactory, recordDescriptor, tpc);
         // since the message partition writer sends broadcast messages, we allocate frames when we create the writer
         for (int i = 0; i < consumerPartitionCount; ++i) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/AbstractFileWriteOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/AbstractFileWriteOperatorDescriptor.java
index 543ad40..18dc9c9 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/AbstractFileWriteOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/AbstractFileWriteOperatorDescriptor.java
@@ -95,7 +95,7 @@
     @Override
     public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
             IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) {
-        return new DeserializedOperatorNodePushable(ctx, new FileWriteOperator(ctx.getIoManager(),
-                partition), recordDescProvider.getInputRecordDescriptor(getActivityId(), 0));
+        return new DeserializedOperatorNodePushable(ctx, new FileWriteOperator(ctx.getIoManager(), partition),
+                recordDescProvider.getInputRecordDescriptor(getActivityId(), 0));
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/DelimitedDataTupleParserFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/DelimitedDataTupleParserFactory.java
index d121ec4..175bdae 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/DelimitedDataTupleParserFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/file/DelimitedDataTupleParserFactory.java
@@ -67,8 +67,8 @@
                     ArrayTupleBuilder tb = new ArrayTupleBuilder(valueParsers.length);
                     DataOutput dos = tb.getDataOutput();
 
-                    FieldCursorForDelimitedDataParser cursor = new FieldCursorForDelimitedDataParser(
-                            new InputStreamReader(in), fieldDelimiter, quote);
+                    FieldCursorForDelimitedDataParser cursor =
+                            new FieldCursorForDelimitedDataParser(new InputStreamReader(in), fieldDelimiter, quote);
                     while (cursor.nextRecord()) {
                         tb.reset();
                         for (int i = 0; i < valueParsers.length; ++i) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/HashSpillableTableFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/HashSpillableTableFactory.java
index 43b9685..3232527 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/HashSpillableTableFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/HashSpillableTableFactory.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.dataflow.std.group;
 
 import java.util.BitSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
 import org.apache.hyracks.api.comm.IFrameWriter;
@@ -48,10 +46,12 @@
 import org.apache.hyracks.dataflow.std.structures.SerializableHashTable;
 import org.apache.hyracks.dataflow.std.structures.TuplePointer;
 import org.apache.hyracks.dataflow.std.util.FrameTuplePairComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class HashSpillableTableFactory implements ISpillableTableFactory {
 
-    private static Logger LOGGER = Logger.getLogger(HashSpillableTableFactory.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final double FUDGE_FACTOR = 1.1;
     private static final long serialVersionUID = 1L;
     private final IBinaryHashFunctionFamily[] hashFunctionFamilies;
@@ -84,17 +84,18 @@
             intermediateResultKeys[i] = i;
         }
 
-        final FrameTuplePairComparator ftpcInputCompareToAggregate = new FrameTuplePairComparator(keyFields,
-                intermediateResultKeys, comparators);
+        final FrameTuplePairComparator ftpcInputCompareToAggregate =
+                new FrameTuplePairComparator(keyFields, intermediateResultKeys, comparators);
 
-        final ITuplePartitionComputer tpc = new FieldHashPartitionComputerFamily(keyFields, hashFunctionFamilies)
-                .createPartitioner(seed);
+        final ITuplePartitionComputer tpc =
+                new FieldHashPartitionComputerFamily(keyFields, hashFunctionFamilies).createPartitioner(seed);
 
         // For calculating hash value for the already aggregated tuples (not incoming tuples)
         // This computer is required to calculate the hash value of a aggregated tuple
         // while doing the garbage collection work on Hash Table.
-        final ITuplePartitionComputer tpcIntermediate = new FieldHashPartitionComputerFamily(intermediateResultKeys,
-                hashFunctionFamilies).createPartitioner(seed);
+        final ITuplePartitionComputer tpcIntermediate =
+                new FieldHashPartitionComputerFamily(intermediateResultKeys, hashFunctionFamilies)
+                        .createPartitioner(seed);
 
         final IAggregatorDescriptor aggregator = aggregateFactory.createAggregator(ctx, inRecordDescriptor,
                 outRecordDescriptor, keyFields, intermediateResultKeys, null, -1);
@@ -109,10 +110,9 @@
 
         final int numPartitions = getNumOfPartitions(inputDataBytesSize / ctx.getInitialFrameSize(), memoryBudget);
         final int entriesPerPartition = (int) Math.ceil(1.0 * tableSize / numPartitions);
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine(
-                    "created hashtable, table size:" + tableSize + " file size:" + inputDataBytesSize + "  #partitions:"
-                    + numPartitions);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("created hashtable, table size:" + tableSize + " file size:" + inputDataBytesSize
+                    + "  #partitions:" + numPartitions);
         }
 
         final ArrayTupleBuilder outputTupleBuilder = new ArrayTupleBuilder(outRecordDescriptor.getFields().length);
@@ -122,14 +122,14 @@
             private final TuplePointer pointer = new TuplePointer();
             private final BitSet spilledSet = new BitSet(numPartitions);
             // This frame pool will be shared by both data table and hash table.
-            private final IDeallocatableFramePool framePool = new DeallocatableFramePool(ctx,
-                    framesLimit * ctx.getInitialFrameSize());
+            private final IDeallocatableFramePool framePool =
+                    new DeallocatableFramePool(ctx, framesLimit * ctx.getInitialFrameSize());
             // buffer manager for hash table
-            private final ISimpleFrameBufferManager bufferManagerForHashTable = new FramePoolBackedFrameBufferManager(
-                    framePool);
+            private final ISimpleFrameBufferManager bufferManagerForHashTable =
+                    new FramePoolBackedFrameBufferManager(framePool);
 
-            private final ISerializableTable hashTableForTuplePointer = new SerializableHashTable(tableSize, ctx,
-                    bufferManagerForHashTable);
+            private final ISerializableTable hashTableForTuplePointer =
+                    new SerializableHashTable(tableSize, ctx, bufferManagerForHashTable);
 
             // buffer manager for data table
             final IPartitionedTupleBufferManager bufferManager = new VPartitionTupleBufferManager(
@@ -138,8 +138,8 @@
 
             final ITuplePointerAccessor bufferAccessor = bufferManager.getTuplePointerAccessor(outRecordDescriptor);
 
-            private final PreferToSpillFullyOccupiedFramePolicy spillPolicy = new PreferToSpillFullyOccupiedFramePolicy(
-                    bufferManager, spilledSet);
+            private final PreferToSpillFullyOccupiedFramePolicy spillPolicy =
+                    new PreferToSpillFullyOccupiedFramePolicy(bufferManager, spilledSet);
 
             private final FrameTupleAppender outputAppender = new FrameTupleAppender(new VSizeFrame(ctx));
 
@@ -157,10 +157,10 @@
 
                 // Checks whether the garbage collection is required and conducts a garbage collection if so.
                 if (hashTableForTuplePointer.isGarbageCollectionNeeded()) {
-                    int numberOfFramesReclaimed = hashTableForTuplePointer.collectGarbage(bufferAccessor,
-                            tpcIntermediate);
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("Garbage Collection on Hash table is done. Deallocated frames:"
+                    int numberOfFramesReclaimed =
+                            hashTableForTuplePointer.collectGarbage(bufferAccessor, tpcIntermediate);
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("Garbage Collection on Hash table is done. Deallocated frames:"
                                 + numberOfFramesReclaimed);
                     }
                 }
@@ -310,8 +310,8 @@
             // partition again and again.
             return 2;
         }
-        long numberOfPartitions = (long) (Math
-                .ceil((nubmerOfInputFrames * FUDGE_FACTOR - frameLimit) / (frameLimit - 1)));
+        long numberOfPartitions =
+                (long) (Math.ceil((nubmerOfInputFrames * FUDGE_FACTOR - frameLimit) / (frameLimit - 1)));
         numberOfPartitions = Math.max(2, numberOfPartitions);
         if (numberOfPartitions > frameLimit) {
             numberOfPartitions = (long) Math.ceil(Math.sqrt(nubmerOfInputFrames * FUDGE_FACTOR));
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldGroupAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldGroupAggregatorFactory.java
index 7acd687..cb32c4a 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldGroupAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldGroupAggregatorFactory.java
@@ -113,7 +113,8 @@
                 int count = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
                 count += 1;
                 if (!useObjectState) {
                     try {
@@ -139,7 +140,8 @@
                 int sum = 0, count = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
                 count += 1;
                 if (!useObjectState) {
                     ByteBuffer buf = ByteBuffer.wrap(data);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldMergeAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldMergeAggregatorFactory.java
index b77c91c..290cc58 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldMergeAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/AvgFieldMergeAggregatorFactory.java
@@ -118,7 +118,8 @@
                 int sum = 0, count = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
                 count += 1;
                 if (!useObjectState) {
                     ByteBuffer buf = ByteBuffer.wrap(data);
@@ -156,8 +157,10 @@
                 int count = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
-                count += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart + 4);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                count += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart + 4);
                 if (!useObjectState) {
                     try {
                         fieldOutput.writeInt(sum);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/FloatSumFieldAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/FloatSumFieldAggregatorFactory.java
index 771303f..fc8d956 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/FloatSumFieldAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/FloatSumFieldAggregatorFactory.java
@@ -35,8 +35,7 @@
 /**
  *
  */
-public class FloatSumFieldAggregatorFactory implements
-        IFieldAggregateDescriptorFactory {
+public class FloatSumFieldAggregatorFactory implements IFieldAggregateDescriptorFactory {
 
     private static final long serialVersionUID = 1L;
 
@@ -44,7 +43,7 @@
 
     private final boolean useObjectState;
 
-    public FloatSumFieldAggregatorFactory(int aggField, boolean useObjState){
+    public FloatSumFieldAggregatorFactory(int aggField, boolean useObjState) {
         this.aggField = aggField;
         this.useObjectState = useObjState;
     }
@@ -53,8 +52,7 @@
      * @see org.apache.hyracks.dataflow.std.group.IFieldAggregateDescriptorFactory#createAggregator(org.apache.hyracks.api.context.IHyracksTaskContext, org.apache.hyracks.api.dataflow.value.RecordDescriptor, org.apache.hyracks.api.dataflow.value.RecordDescriptor)
      */
     @Override
-    public IFieldAggregateDescriptor createAggregator(IHyracksTaskContext ctx,
-            RecordDescriptor inRecordDescriptor,
+    public IFieldAggregateDescriptor createAggregator(IHyracksTaskContext ctx, RecordDescriptor inRecordDescriptor,
             RecordDescriptor outRecordDescriptor) throws HyracksDataException {
         return new IFieldAggregateDescriptor() {
 
@@ -64,8 +62,8 @@
             }
 
             @Override
-            public void outputPartialResult(DataOutput fieldOutput, byte[] data,
-                    int offset, AggregateState state) throws HyracksDataException {
+            public void outputPartialResult(DataOutput fieldOutput, byte[] data, int offset, AggregateState state)
+                    throws HyracksDataException {
                 float sum;
                 if (!useObjectState) {
                     sum = FloatPointable.getFloat(data, offset);
@@ -80,8 +78,8 @@
             }
 
             @Override
-            public void outputFinalResult(DataOutput fieldOutput, byte[] data,
-                    int offset, AggregateState state) throws HyracksDataException {
+            public void outputFinalResult(DataOutput fieldOutput, byte[] data, int offset, AggregateState state)
+                    throws HyracksDataException {
                 float sum;
                 if (!useObjectState) {
                     sum = FloatPointable.getFloat(data, offset);
@@ -106,14 +104,14 @@
             }
 
             @Override
-            public void init(IFrameTupleAccessor accessor, int tIndex,
-                    DataOutput fieldOutput, AggregateState state)
+            public void init(IFrameTupleAccessor accessor, int tIndex, DataOutput fieldOutput, AggregateState state)
                     throws HyracksDataException {
                 float sum = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
 
-                sum += FloatPointable.getFloat(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += FloatPointable.getFloat(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
 
                 if (!useObjectState) {
                     try {
@@ -138,13 +136,13 @@
             }
 
             @Override
-            public void aggregate(IFrameTupleAccessor accessor, int tIndex,
-                    byte[] data, int offset, AggregateState state)
-                    throws HyracksDataException {
+            public void aggregate(IFrameTupleAccessor accessor, int tIndex, byte[] data, int offset,
+                    AggregateState state) throws HyracksDataException {
                 float sum = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += FloatPointable.getFloat(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += FloatPointable.getFloat(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
 
                 if (!useObjectState) {
                     ByteBuffer buf = ByteBuffer.wrap(data);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/IntSumFieldAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/IntSumFieldAggregatorFactory.java
index 511b651..90e1474 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/IntSumFieldAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/IntSumFieldAggregatorFactory.java
@@ -107,7 +107,8 @@
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
 
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
 
                 if (!useObjectState) {
                     try {
@@ -143,7 +144,8 @@
                 int sum = 0;
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
-                sum += IntegerPointable.getInteger(accessor.getBuffer().array(), tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
+                sum += IntegerPointable.getInteger(accessor.getBuffer().array(),
+                        tupleOffset + accessor.getFieldSlotsLength() + fieldStart);
 
                 if (!useObjectState) {
                     ByteBuffer buf = ByteBuffer.wrap(data);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MinMaxStringFieldAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MinMaxStringFieldAggregatorFactory.java
index 6900918..d43d4fd 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MinMaxStringFieldAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MinMaxStringFieldAggregatorFactory.java
@@ -113,9 +113,9 @@
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
                 int fieldLength = accessor.getFieldLength(tIndex, aggField);
-                String strField = utf8SerializerDeserializer.deserialize(new DataInputStream(
-                        new ByteArrayInputStream(accessor.getBuffer().array(), tupleOffset
-                                + accessor.getFieldSlotsLength() + fieldStart, fieldLength)));
+                String strField = utf8SerializerDeserializer
+                        .deserialize(new DataInputStream(new ByteArrayInputStream(accessor.getBuffer().array(),
+                                tupleOffset + accessor.getFieldSlotsLength() + fieldStart, fieldLength)));
                 if (hasBinaryState) {
                     // Object-binary-state
                     Object[] storedState;
@@ -158,9 +158,9 @@
                 int tupleOffset = accessor.getTupleStartOffset(tIndex);
                 int fieldStart = accessor.getFieldStartOffset(tIndex, aggField);
                 int fieldLength = accessor.getFieldLength(tIndex, aggField);
-                String strField = utf8SerializerDeserializer.deserialize(new DataInputStream(
-                        new ByteArrayInputStream(accessor.getBuffer().array(), tupleOffset
-                                + accessor.getFieldSlotsLength() + fieldStart, fieldLength)));
+                String strField = utf8SerializerDeserializer
+                        .deserialize(new DataInputStream(new ByteArrayInputStream(accessor.getBuffer().array(),
+                                tupleOffset + accessor.getFieldSlotsLength() + fieldStart, fieldLength)));
                 if (hasBinaryState) {
                     int stateIdx = IntegerPointable.getInteger(data, offset);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MultiFieldsAggregatorFactory.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MultiFieldsAggregatorFactory.java
index 595e2c4..d2aa35f 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MultiFieldsAggregatorFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/aggregators/MultiFieldsAggregatorFactory.java
@@ -95,8 +95,8 @@
             }
 
             @Override
-            public boolean outputFinalResult(ArrayTupleBuilder tupleBuilder, IFrameTupleAccessor stateAccessor, int tIndex,
-                    AggregateState state) throws HyracksDataException {
+            public boolean outputFinalResult(ArrayTupleBuilder tupleBuilder, IFrameTupleAccessor stateAccessor,
+                    int tIndex, AggregateState state) throws HyracksDataException {
                 DataOutput dos = tupleBuilder.getDataOutput();
 
                 int tupleOffset = stateAccessor.getTupleStartOffset(tIndex);
@@ -151,8 +151,8 @@
                     int fieldIndex = 0;
                     for (int i = 0; i < aggregators.length; i++) {
                         if (aggregators[i].needsBinaryState()) {
-                            int stateFieldOffset = stateAccessor.getFieldStartOffset(stateTupleIndex, keys.length
-                                    + fieldIndex);
+                            int stateFieldOffset =
+                                    stateAccessor.getFieldStartOffset(stateTupleIndex, keys.length + fieldIndex);
                             aggregators[i].aggregate(accessor, tIndex, stateAccessor.getBuffer().array(),
                                     stateTupleOffset + stateAccessor.getFieldSlotsLength() + stateFieldOffset,
                                     ((AggregateState[]) state.state)[i]);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupBuildOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupBuildOperatorNodePushable.java
index d7b76ce..43f57af 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupBuildOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupBuildOperatorNodePushable.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.dataflow.std.group.external;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
@@ -35,11 +33,13 @@
 import org.apache.hyracks.dataflow.std.group.IAggregatorDescriptorFactory;
 import org.apache.hyracks.dataflow.std.group.ISpillableTable;
 import org.apache.hyracks.dataflow.std.group.ISpillableTableFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalGroupBuildOperatorNodePushable extends AbstractUnaryInputSinkOperatorNodePushable
         implements IRunFileWriterGenerator {
 
-    private static Logger LOGGER = Logger.getLogger("ExternalGroupBuildPhase");
+    private static final Logger LOGGER = LogManager.getLogger();
     private final IHyracksTaskContext ctx;
     private final Object stateId;
     private final int[] keyFields;
@@ -71,8 +71,8 @@
         for (int i = 0; i < comparatorFactories.length; ++i) {
             comparators[i] = comparatorFactories[i].createBinaryComparator();
         }
-        this.firstNormalizerComputer = firstNormalizerFactory == null ? null
-                : firstNormalizerFactory.createNormalizedKeyComputer();
+        this.firstNormalizerComputer =
+                firstNormalizerFactory == null ? null : firstNormalizerFactory.createNormalizedKeyComputer();
         this.spillableTableFactory = spillableTableFactory;
         this.inRecordDescriptor = inRecordDescriptor;
         this.outRecordDescriptor = outRecordDescriptor;
@@ -115,7 +115,7 @@
         } else {
             externalGroupBy.flushSpilledPartitions();
             ctx.setStateObject(state);
-            if (LOGGER.isLoggable(Level.FINE)) {
+            if (LOGGER.isDebugEnabled()) {
                 int numOfPartition = state.getSpillableTable().getNumPartitions();
                 int numOfSpilledPart = 0;
                 for (int i = 0; i < numOfPartition; i++) {
@@ -123,7 +123,7 @@
                         numOfSpilledPart++;
                     }
                 }
-                LOGGER.fine("level 0:" + "build with " + numOfPartition + " partitions" + ", spilled "
+                LOGGER.debug("level 0:" + "build with " + numOfPartition + " partitions" + ", spilled "
                         + numOfSpilledPart + " partitions");
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupOperatorDescriptor.java
index 23dee02..6dea186 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupOperatorDescriptor.java
@@ -124,7 +124,7 @@
         @Override
         public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
                 final IRecordDescriptorProvider recordDescProvider, final int partition, int nPartitions)
-                        throws HyracksDataException {
+                throws HyracksDataException {
             return new ExternalGroupBuildOperatorNodePushable(ctx, new TaskId(getActivityId(), partition), tableSize,
                     fileSize, keyFields, framesLimit, comparatorFactories, firstNormalizerFactory,
                     partialAggregatorFactory, recordDescProvider.getInputRecordDescriptor(getActivityId(), 0),
@@ -142,7 +142,7 @@
         @Override
         public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
                 IRecordDescriptorProvider recordDescProvider, final int partition, int nPartitions)
-                        throws HyracksDataException {
+                throws HyracksDataException {
             return new ExternalGroupWriteOperatorNodePushable(ctx,
                     new TaskId(new ActivityId(getOperatorId(), AGGREGATE_ACTIVITY_ID), partition),
                     spillableTableFactory, partialRecDesc, outRecDesc, framesLimit, keyFields, firstNormalizerFactory,
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupWriteOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupWriteOperatorNodePushable.java
index 4d368bd..95994f3 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupWriteOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalGroupWriteOperatorNodePushable.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.dataflow.std.group.external;
 
 import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.comm.VSizeFrame;
@@ -39,10 +37,12 @@
 import org.apache.hyracks.dataflow.std.group.IAggregatorDescriptorFactory;
 import org.apache.hyracks.dataflow.std.group.ISpillableTable;
 import org.apache.hyracks.dataflow.std.group.ISpillableTableFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalGroupWriteOperatorNodePushable extends AbstractUnaryOutputSourceOperatorNodePushable
         implements IRunFileWriterGenerator {
-    private static Logger LOGGER = Logger.getLogger("ExternalGroupbyWrite");
+    private static final Logger LOGGER = LogManager.getLogger();
     private final IHyracksTaskContext ctx;
     private final Object stateId;
     private final ISpillableTableFactory spillableTableFactory;
@@ -130,22 +130,22 @@
                         runs[i].getFileSize(), mergeGroupFields, groupByComparators, nmkComputer,
                         mergeAggregatorFactory, partialAggRecordDesc, outRecordDesc, frameLimit, level);
                 RunFileWriter[] runFileWriters = new RunFileWriter[partitionTable.getNumPartitions()];
-                int[] sizeInTuplesNextLevel = buildGroup(runs[i].createDeleteOnCloseReader(), partitionTable,
-                        runFileWriters);
+                int[] sizeInTuplesNextLevel =
+                        buildGroup(runs[i].createDeleteOnCloseReader(), partitionTable, runFileWriters);
                 for (int idFile = 0; idFile < runFileWriters.length; idFile++) {
                     if (runFileWriters[idFile] != null) {
                         generatedRuns.add(runFileWriters[idFile]);
                     }
                 }
 
-                if (LOGGER.isLoggable(Level.FINE)) {
+                if (LOGGER.isDebugEnabled()) {
                     int numOfSpilledPart = 0;
                     for (int x = 0; x < numOfTuples.length; x++) {
                         if (numOfTuples[x] > 0) {
                             numOfSpilledPart++;
                         }
                     }
-                    LOGGER.fine("level " + level + ":" + "build with " + numOfTuples.length + " partitions"
+                    LOGGER.debug("level " + level + ":" + "build with " + numOfTuples.length + " partitions"
                             + ", spilled " + numOfSpilledPart + " partitions");
                 }
                 doPass(partitionTable, runFileWriters, sizeInTuplesNextLevel, writer, level + 1);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalHashGroupBy.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalHashGroupBy.java
index d29e9ab..8e7777f 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalHashGroupBy.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/external/ExternalHashGroupBy.java
@@ -63,8 +63,7 @@
         }
     }
 
-    private void flushPartitionToRun(int partition, RunFileWriter writer)
-            throws HyracksDataException {
+    private void flushPartitionToRun(int partition, RunFileWriter writer) throws HyracksDataException {
         try {
             spilledNumTuples[partition] += table.flushFrames(partition, writer, AggregateType.PARTIAL);
             table.clear(partition);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/preclustered/PreclusteredGroupWriter.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/preclustered/PreclusteredGroupWriter.java
index db6102e..ca78046 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/preclustered/PreclusteredGroupWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/preclustered/PreclusteredGroupWriter.java
@@ -82,9 +82,8 @@
 
         // Deducts input/output frames.
         this.memoryLimit = framesLimit <= 0 ? -1 : ((long) (framesLimit - 2)) * ctx.getInitialFrameSize();
-        this.aggregator =
-                aggregatorFactory.createAggregator(ctx, inRecordDesc, outRecordDesc, groupFields, groupFields, writer,
-                        this.memoryLimit);
+        this.aggregator = aggregatorFactory.createAggregator(ctx, inRecordDesc, outRecordDesc, groupFields, groupFields,
+                writer, this.memoryLimit);
         this.aggregateState = aggregator.createAggregateStates();
         copyFrame = new VSizeFrame(ctx);
         inFrameAccessor = new FrameTupleAccessor(inRecordDesc);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/ExternalSortGroupByRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/ExternalSortGroupByRunGenerator.java
index 3f10f50..0b915dc 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/ExternalSortGroupByRunGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/ExternalSortGroupByRunGenerator.java
@@ -50,16 +50,25 @@
             int framesLimit, int[] groupFields, INormalizedKeyComputerFactory firstKeyNormalizerFactory,
             IBinaryComparatorFactory[] comparatorFactories, IAggregatorDescriptorFactory aggregatorFactory,
             RecordDescriptor outRecordDesc, Algorithm alg) throws HyracksDataException {
-        this(ctx, sortFields, inputRecordDesc, framesLimit, groupFields, firstKeyNormalizerFactory, comparatorFactories,
+        this(ctx, sortFields, inputRecordDesc, framesLimit, groupFields,
+                firstKeyNormalizerFactory != null ? new INormalizedKeyComputerFactory[] { firstKeyNormalizerFactory }
+                        : null,
+                comparatorFactories, aggregatorFactory, outRecordDesc, alg, EnumFreeSlotPolicy.LAST_FIT);
+    }
+
+    public ExternalSortGroupByRunGenerator(IHyracksTaskContext ctx, int[] sortFields, RecordDescriptor inputRecordDesc,
+            int framesLimit, int[] groupFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, IAggregatorDescriptorFactory aggregatorFactory,
+            RecordDescriptor outRecordDesc, Algorithm alg) throws HyracksDataException {
+        this(ctx, sortFields, inputRecordDesc, framesLimit, groupFields, keyNormalizerFactories, comparatorFactories,
                 aggregatorFactory, outRecordDesc, alg, EnumFreeSlotPolicy.LAST_FIT);
     }
 
     public ExternalSortGroupByRunGenerator(IHyracksTaskContext ctx, int[] sortFields, RecordDescriptor inputRecordDesc,
-            int framesLimit, int[] groupFields, INormalizedKeyComputerFactory firstKeyNormalizerFactory,
+            int framesLimit, int[] groupFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
             IBinaryComparatorFactory[] comparatorFactories, IAggregatorDescriptorFactory aggregatorFactory,
             RecordDescriptor outRecordDesc, Algorithm alg, EnumFreeSlotPolicy policy) throws HyracksDataException {
-        super(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, inputRecordDesc, alg, policy,
-                framesLimit);
+        super(ctx, sortFields, keyNormalizerFactories, comparatorFactories, inputRecordDesc, alg, policy, framesLimit);
 
         this.groupFields = groupFields;
         this.comparatorFactories = comparatorFactories;
@@ -70,20 +79,20 @@
 
     @Override
     protected RunFileWriter getRunFileWriter() throws HyracksDataException {
-        FileReference file = ctx.getJobletContext().createManagedWorkspaceFile(
-                ExternalSortGroupByRunGenerator.class.getSimpleName());
+        FileReference file = ctx.getJobletContext()
+                .createManagedWorkspaceFile(ExternalSortGroupByRunGenerator.class.getSimpleName());
         return new RunFileWriter(file, ctx.getIoManager());
     }
 
     @Override
     protected IFrameWriter getFlushableFrameWriter(RunFileWriter writer) throws HyracksDataException {
         //create group-by comparators
-        IBinaryComparator[] comparators = new IBinaryComparator[Math
-                .min(groupFields.length, comparatorFactories.length)];
+        IBinaryComparator[] comparators =
+                new IBinaryComparator[Math.min(groupFields.length, comparatorFactories.length)];
         for (int i = 0; i < comparators.length; i++) {
             comparators[i] = comparatorFactories[i].createBinaryComparator();
         }
-        return new PreclusteredGroupWriter(ctx, groupFields, comparators, aggregatorFactory,
-                this.inRecordDesc, this.outRecordDesc, writer, true);
+        return new PreclusteredGroupWriter(ctx, groupFields, comparators, aggregatorFactory, this.inRecordDesc,
+                this.outRecordDesc, writer, true);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/SortGroupByOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/SortGroupByOperatorDescriptor.java
index da5b4a8..23e47f0 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/SortGroupByOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/group/sort/SortGroupByOperatorDescriptor.java
@@ -55,39 +55,74 @@
     private final RecordDescriptor partialAggRecordDesc;
     private final RecordDescriptor outputRecordDesc;
     private final boolean finalStage;
-    private Algorithm alg = Algorithm.MERGE_SORT;
+    private static final Algorithm ALG = Algorithm.MERGE_SORT;
 
     /**
      * @param spec
-     *            , the Hyracks job specification
+     *            the Hyracks job specification
      * @param framesLimit
-     *            , the frame limit for this operator
+     *            the frame limit for this operator
      * @param sortFields
-     *            , the fields to sort
+     *            the fields to sort
      * @param groupFields
-     *            , the fields to group, which can be a prefix subset of sortFields
+     *            the fields to group, which can be a prefix subset of sortFields
      * @param firstKeyNormalizerFactory
-     *            , the normalized key computer factory of the first key
+     *            the normalized key computer factory of the first key
      * @param comparatorFactories
-     *            , the comparator factories of sort keys
+     *            the comparator factories of sort keys
      * @param partialAggregatorFactory
-     *            , for aggregating the input of this operator
+     *            for aggregating the input of this operator
      * @param mergeAggregatorFactory
-     *            , for aggregating the intermediate data of this operator
+     *            for aggregating the intermediate data of this operator
      * @param partialAggRecordDesc
-     *            , the record descriptor of intermediate data
+     *            the record descriptor of intermediate data
      * @param outRecordDesc
-     *            , the record descriptor of output data
+     *            the record descriptor of output data
      * @param finalStage
-     *            , whether the operator is used for final stage aggregation
+     *            whether the operator is used for final stage aggregation
      */
     public SortGroupByOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
             int[] groupFields, INormalizedKeyComputerFactory firstKeyNormalizerFactory,
             IBinaryComparatorFactory[] comparatorFactories, IAggregatorDescriptorFactory partialAggregatorFactory,
             IAggregatorDescriptorFactory mergeAggregatorFactory, RecordDescriptor partialAggRecordDesc,
             RecordDescriptor outRecordDesc, boolean finalStage) {
+        this(spec, framesLimit, sortFields, groupFields,
+                firstKeyNormalizerFactory != null ? new INormalizedKeyComputerFactory[] { firstKeyNormalizerFactory }
+                        : null,
+                comparatorFactories, partialAggregatorFactory, mergeAggregatorFactory, partialAggRecordDesc,
+                outRecordDesc, finalStage);
+    }
 
-        super(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, outRecordDesc);
+    /**
+     * @param spec
+     *            the Hyracks job specification
+     * @param framesLimit
+     *            the frame limit for this operator
+     * @param sortFields
+     *            the fields to sort
+     * @param groupFields
+     *            the fields to group, which can be a prefix subset of sortFields
+     * @param keyNormalizerFactories
+     *            the normalized key computer factories for the prefix the sortFields
+     * @param comparatorFactories
+     *            the comparator factories of sort keys
+     * @param partialAggregatorFactory
+     *            for aggregating the input of this operator
+     * @param mergeAggregatorFactory
+     *            for aggregating the intermediate data of this operator
+     * @param partialAggRecordDesc
+     *            the record descriptor of intermediate data
+     * @param outRecordDesc
+     *            the record descriptor of output data
+     * @param finalStage
+     *            whether the operator is used for final stage aggregation
+     */
+    public SortGroupByOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
+            int[] groupFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, IAggregatorDescriptorFactory partialAggregatorFactory,
+            IAggregatorDescriptorFactory mergeAggregatorFactory, RecordDescriptor partialAggRecordDesc,
+            RecordDescriptor outRecordDesc, boolean finalStage) {
+        super(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, outRecordDesc);
         if (framesLimit <= 1) {
             throw new IllegalStateException();// minimum of 2 fames (1 in,1 out)
         }
@@ -110,8 +145,8 @@
                     IRecordDescriptorProvider recordDescriptorProvider) throws HyracksDataException {
                 return new ExternalSortGroupByRunGenerator(ctx, sortFields,
                         recordDescriptorProvider.getInputRecordDescriptor(this.getActivityId(), 0), framesLimit,
-                        groupFields, firstKeyNormalizerFactory, comparatorFactories, partialAggregatorFactory,
-                        partialAggRecordDesc, alg);
+                        groupFields, keyNormalizerFactories, comparatorFactories, partialAggregatorFactory,
+                        partialAggRecordDesc, ALG);
             }
         };
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/intersect/IntersectOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/intersect/IntersectOperatorDescriptor.java
index 5cc854c..ec652eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/intersect/IntersectOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/intersect/IntersectOperatorDescriptor.java
@@ -42,6 +42,7 @@
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.comm.util.FrameUtils;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 import org.apache.hyracks.dataflow.std.base.AbstractActivityNode;
 import org.apache.hyracks.dataflow.std.base.AbstractOperatorDescriptor;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryOutputOperatorNodePushable;
@@ -61,12 +62,17 @@
 
     /**
      * @param spec
-     * @param nInputs                   Number of inputs
-     * @param compareFields             The compare field list of each input.
-     *                                  All the fields order should be the same with the comparatorFactories
-     * @param extraFields               Extra field that
-     * @param firstKeyNormalizerFactory Normalizer for the first comparison key.
-     * @param comparatorFactories       A list of comparators for each field
+     * @param nInputs
+     *            Number of inputs
+     * @param compareFields
+     *            The compare field list of each input.
+     *            All the fields order should be the same with the comparatorFactories
+     * @param extraFields
+     *            Extra field that
+     * @param firstKeyNormalizerFactory
+     *            Normalizer for the first comparison key.
+     * @param comparatorFactories
+     *            A list of comparators for each field
      * @param recordDescriptor
      * @throws HyracksException
      */
@@ -147,7 +153,10 @@
 
     public static class IntersectOperatorNodePushable extends AbstractUnaryOutputOperatorNodePushable {
 
-        private enum ACTION {FAILED, CLOSE}
+        private enum ACTION {
+            FAILED,
+            CLOSE
+        }
 
         private final int inputArity;
         private final int[][] compareFields;
@@ -158,6 +167,7 @@
         private final FrameTupleAppender appender;
 
         private final INormalizedKeyComputer firstKeyNormalizerComputer;
+        private final boolean normalizedKeyDecisive;
         private final IBinaryComparator[] comparators;
 
         private boolean done = false;
@@ -186,8 +196,11 @@
             }
             this.allProjectFields = projectedFields;
             this.firstKeyNormalizerComputer =
-                    firstKeyNormalizerFactory == null ? null : firstKeyNormalizerFactory.createNormalizedKeyComputer();
-
+                    firstKeyNormalizerFactory != null ? firstKeyNormalizerFactory.createNormalizedKeyComputer() : null;
+            this.normalizedKeyDecisive = firstKeyNormalizerFactory != null
+                    ? firstKeyNormalizerFactory.getNormalizedKeyProperties().isDecisive()
+                            && compareFields[0].length == 1
+                    : false;
             comparators = new IBinaryComparator[compareFields[0].length];
             for (int i = 0; i < comparators.length; i++) {
                 comparators[i] = comparatorFactory[i].createBinaryComparator();
@@ -213,6 +226,11 @@
         @Override
         public IFrameWriter getInputFrameWriter(final int index) {
             return new IFrameWriter() {
+                private final int[] normalizedKey1 =
+                        NormalizedKeyUtils.createNormalizedKeyArray(firstKeyNormalizerComputer);
+                private final int[] normalizedKey2 =
+                        NormalizedKeyUtils.createNormalizedKeyArray(firstKeyNormalizerComputer);
+
                 @Override
                 public void open() throws HyracksDataException {
                     if (index == 0) {
@@ -273,9 +291,8 @@
                                 continue;
                             }
                             while (tupleIndexMarker[i] < refAccessor[i].getTupleCount()) {
-                                int cmp =
-                                        compare(i, refAccessor[i], tupleIndexMarker[i], maxInput, refAccessor[maxInput],
-                                                tupleIndexMarker[maxInput]);
+                                int cmp = compare(i, refAccessor[i], tupleIndexMarker[i], maxInput,
+                                        refAccessor[maxInput], tupleIndexMarker[maxInput]);
                                 if (cmp == 0) {
                                     match++;
                                     break;
@@ -313,13 +330,14 @@
 
                 private int compare(int input1, FrameTupleAccessor frameTupleAccessor1, int tid1, int input2,
                         FrameTupleAccessor frameTupleAccessor2, int tid2) throws HyracksDataException {
-                    int firstNorm1 = getFirstNorm(input1, frameTupleAccessor1, tid1);
-                    int firstNorm2 = getFirstNorm(input2, frameTupleAccessor2, tid2);
-
-                    if (firstNorm1 < firstNorm2) {
-                        return -1;
-                    } else if (firstNorm1 > firstNorm2) {
-                        return 1;
+                    if (firstKeyNormalizerComputer != null) {
+                        getFirstNorm(input1, frameTupleAccessor1, tid1, normalizedKey1);
+                        getFirstNorm(input2, frameTupleAccessor2, tid2, normalizedKey2);
+                        int cmp = NormalizedKeyUtils.compareNormalizeKeys(normalizedKey1, 0, normalizedKey2, 0,
+                                normalizedKey1.length);
+                        if (cmp != 0 || normalizedKeyDecisive) {
+                            return cmp;
+                        }
                     }
 
                     for (int i = 0; i < comparators.length; i++) {
@@ -337,12 +355,12 @@
                     return 0;
                 }
 
-                private int getFirstNorm(int inputId1, FrameTupleAccessor frameTupleAccessor1, int tid1) {
-                    return firstKeyNormalizerComputer == null ?
-                            0 :
-                            firstKeyNormalizerComputer.normalize(frameTupleAccessor1.getBuffer().array(),
-                                    frameTupleAccessor1.getAbsoluteFieldStartOffset(tid1, compareFields[inputId1][0]),
-                                    frameTupleAccessor1.getFieldLength(tid1, compareFields[inputId1][0]));
+                private void getFirstNorm(int inputId1, FrameTupleAccessor frameTupleAccessor1, int tid1, int[] keys) {
+                    if (firstKeyNormalizerComputer != null) {
+                        firstKeyNormalizerComputer.normalize(frameTupleAccessor1.getBuffer().array(),
+                                frameTupleAccessor1.getAbsoluteFieldStartOffset(tid1, compareFields[inputId1][0]),
+                                frameTupleAccessor1.getFieldLength(tid1, compareFields[inputId1][0]), keys, 0);
+                    }
                 }
 
                 private int findMaxInput() throws HyracksDataException {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/HybridHashJoinOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/HybridHashJoinOperatorDescriptor.java
index 665bb2b..bee0590 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/HybridHashJoinOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/HybridHashJoinOperatorDescriptor.java
@@ -176,22 +176,22 @@
             for (int i = 0; i < comparatorFactories.length; ++i) {
                 comparators[i] = comparatorFactories[i].createBinaryComparator();
             }
-            final IMissingWriter[] nullWriters1 = isLeftOuter ? new IMissingWriter[nonMatchWriterFactories1.length]
-                    : null;
+            final IMissingWriter[] nullWriters1 =
+                    isLeftOuter ? new IMissingWriter[nonMatchWriterFactories1.length] : null;
             if (isLeftOuter) {
                 for (int i = 0; i < nonMatchWriterFactories1.length; i++) {
                     nullWriters1[i] = nonMatchWriterFactories1[i].createMissingWriter();
                 }
             }
-            final IPredicateEvaluator predEvaluator = (predEvaluatorFactory == null ? null
-                    : predEvaluatorFactory.createPredicateEvaluator());
+            final IPredicateEvaluator predEvaluator =
+                    (predEvaluatorFactory == null ? null : predEvaluatorFactory.createPredicateEvaluator());
 
             IOperatorNodePushable op = new AbstractUnaryInputSinkOperatorNodePushable() {
                 private BuildAndPartitionTaskState state = new BuildAndPartitionTaskState(
                         ctx.getJobletContext().getJobId(), new TaskId(getActivityId(), partition));
                 private final FrameTupleAccessor accessorBuild = new FrameTupleAccessor(rd1);
-                private final ITuplePartitionComputer hpcBuild = new FieldHashPartitionComputerFactory(keys1,
-                        hashFunctionFactories).createPartitioner();
+                private final ITuplePartitionComputer hpcBuild =
+                        new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories).createPartitioner();
                 private final FrameTupleAppender appender = new FrameTupleAppender();
                 private final FrameTupleAppender ftappender = new FrameTupleAppender();
                 private IFrame[] bufferForPartitions;
@@ -285,8 +285,8 @@
                         if (memsize > inputsize0) {
                             state.nPartitions = 0;
                         } else {
-                            state.nPartitions = (int) (Math
-                                    .ceil((inputsize0 * factor / nPartitions - memsize) / (memsize - 1)));
+                            state.nPartitions =
+                                    (int) (Math.ceil((inputsize0 * factor / nPartitions - memsize) / (memsize - 1)));
                         }
                         if (state.nPartitions <= 0) {
                             // becomes in-memory HJ
@@ -303,10 +303,10 @@
                         throw new HyracksDataException("not enough memory");
                     }
 
-                    ITuplePartitionComputer hpc0 = new FieldHashPartitionComputerFactory(keys0, hashFunctionFactories)
-                            .createPartitioner();
-                    ITuplePartitionComputer hpc1 = new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories)
-                            .createPartitioner();
+                    ITuplePartitionComputer hpc0 =
+                            new FieldHashPartitionComputerFactory(keys0, hashFunctionFactories).createPartitioner();
+                    ITuplePartitionComputer hpc1 =
+                            new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories).createPartitioner();
                     int tableSize = (int) (state.memoryForHashtable * recordsPerFrame * factor);
                     ISerializableTable table = new SimpleSerializableHashTable(tableSize, ctx);
                     state.joiner =
@@ -369,23 +369,23 @@
             for (int i = 0; i < comparatorFactories.length; ++i) {
                 comparators[i] = comparatorFactories[i].createBinaryComparator();
             }
-            final IMissingWriter[] nullWriters1 = isLeftOuter ? new IMissingWriter[nonMatchWriterFactories1.length]
-                    : null;
+            final IMissingWriter[] nullWriters1 =
+                    isLeftOuter ? new IMissingWriter[nonMatchWriterFactories1.length] : null;
             if (isLeftOuter) {
                 for (int i = 0; i < nonMatchWriterFactories1.length; i++) {
                     nullWriters1[i] = nonMatchWriterFactories1[i].createMissingWriter();
                 }
             }
-            final IPredicateEvaluator predEvaluator = (predEvaluatorFactory == null ? null
-                    : predEvaluatorFactory.createPredicateEvaluator());
+            final IPredicateEvaluator predEvaluator =
+                    (predEvaluatorFactory == null ? null : predEvaluatorFactory.createPredicateEvaluator());
 
             IOperatorNodePushable op = new AbstractUnaryInputUnaryOutputOperatorNodePushable() {
                 private BuildAndPartitionTaskState state;
                 private final FrameTupleAccessor accessorProbe = new FrameTupleAccessor(rd0);
-                private final ITuplePartitionComputerFactory hpcf0 = new FieldHashPartitionComputerFactory(keys0,
-                        hashFunctionFactories);
-                private final ITuplePartitionComputerFactory hpcf1 = new FieldHashPartitionComputerFactory(keys1,
-                        hashFunctionFactories);
+                private final ITuplePartitionComputerFactory hpcf0 =
+                        new FieldHashPartitionComputerFactory(keys0, hashFunctionFactories);
+                private final ITuplePartitionComputerFactory hpcf1 =
+                        new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories);
                 private final ITuplePartitionComputer hpcProbe = hpcf0.createPartitioner();
 
                 private final FrameTupleAppender appender = new FrameTupleAppender();
@@ -476,10 +476,10 @@
                         } finally {
                             state.joiner.releaseMemory();
                         }
-                        ITuplePartitionComputer hpcRep0 = new RepartitionComputerFactory(state.nPartitions, hpcf0)
-                                .createPartitioner();
-                        ITuplePartitionComputer hpcRep1 = new RepartitionComputerFactory(state.nPartitions, hpcf1)
-                                .createPartitioner();
+                        ITuplePartitionComputer hpcRep0 =
+                                new RepartitionComputerFactory(state.nPartitions, hpcf0).createPartitioner();
+                        ITuplePartitionComputer hpcRep1 =
+                                new RepartitionComputerFactory(state.nPartitions, hpcf1).createPartitioner();
                         if (state.memoryForHashtable != memsize - 2) {
                             for (int i = 0; i < state.nPartitions; i++) {
                                 ByteBuffer buf = bufferForPartitions[i].getBuffer();
@@ -505,11 +505,10 @@
                                     continue;
                                 }
                                 table.reset();
-                                InMemoryHashJoin joiner =
-                                        new InMemoryHashJoin(ctx, new FrameTupleAccessor(rd0), hpcRep0,
-                                                new FrameTupleAccessor(rd1), rd1, hpcRep1,
-                                                new FrameTuplePairComparator(keys0, keys1, comparators), isLeftOuter,
-                                                nullWriters1, table, predEvaluator, null);
+                                InMemoryHashJoin joiner = new InMemoryHashJoin(ctx, new FrameTupleAccessor(rd0),
+                                        hpcRep0, new FrameTupleAccessor(rd1), rd1, hpcRep1,
+                                        new FrameTuplePairComparator(keys0, keys1, comparators), isLeftOuter,
+                                        nullWriters1, table, predEvaluator, null);
 
                                 if (buildWriter != null) {
                                     RunFileReader buildReader = buildWriter.createDeleteOnCloseReader();
@@ -559,8 +558,8 @@
                 private void write(int i, ByteBuffer head) throws HyracksDataException {
                     RunFileWriter writer = probeWriters[i];
                     if (writer == null) {
-                        FileReference file = ctx
-                                .createManagedWorkspaceFile(PartitionAndJoinActivityNode.class.getSimpleName());
+                        FileReference file =
+                                ctx.createManagedWorkspaceFile(PartitionAndJoinActivityNode.class.getSimpleName());
                         writer = new RunFileWriter(file, ctx.getIoManager());
                         writer.open();
                         probeWriters[i] = writer;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoin.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoin.java
index 7f34d13..10c6227 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoin.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoin.java
@@ -22,8 +22,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
 import org.apache.hyracks.api.comm.IFrameWriter;
@@ -43,6 +41,8 @@
 import org.apache.hyracks.dataflow.std.structures.ISerializableTable;
 import org.apache.hyracks.dataflow.std.structures.TuplePointer;
 import org.apache.hyracks.dataflow.std.util.FrameTuplePairComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class InMemoryHashJoin {
 
@@ -64,24 +64,22 @@
     ISimpleFrameBufferManager bufferManager;
     private final boolean isTableCapacityNotZero;
 
-    private static final Logger LOGGER = Logger.getLogger(InMemoryHashJoin.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
-    public InMemoryHashJoin(IHyracksTaskContext ctx, FrameTupleAccessor accessorProbe,
-            ITuplePartitionComputer tpcProbe, FrameTupleAccessor accessorBuild, RecordDescriptor rDBuild,
-            ITuplePartitionComputer tpcBuild, FrameTuplePairComparator comparator, boolean isLeftOuter,
-            IMissingWriter[] missingWritersBuild, ISerializableTable table, IPredicateEvaluator predEval,
-            ISimpleFrameBufferManager bufferManager)
+    public InMemoryHashJoin(IHyracksTaskContext ctx, FrameTupleAccessor accessorProbe, ITuplePartitionComputer tpcProbe,
+            FrameTupleAccessor accessorBuild, RecordDescriptor rDBuild, ITuplePartitionComputer tpcBuild,
+            FrameTuplePairComparator comparator, boolean isLeftOuter, IMissingWriter[] missingWritersBuild,
+            ISerializableTable table, IPredicateEvaluator predEval, ISimpleFrameBufferManager bufferManager)
             throws HyracksDataException {
         this(ctx, accessorProbe, tpcProbe, accessorBuild, rDBuild, tpcBuild, comparator, isLeftOuter,
                 missingWritersBuild, table, predEval, false, bufferManager);
     }
 
-    public InMemoryHashJoin(IHyracksTaskContext ctx, FrameTupleAccessor accessorProbe,
-            ITuplePartitionComputer tpcProbe, FrameTupleAccessor accessorBuild,
-            RecordDescriptor rDBuild, ITuplePartitionComputer tpcBuild, FrameTuplePairComparator comparator,
-            boolean isLeftOuter, IMissingWriter[] missingWritersBuild, ISerializableTable table,
-            IPredicateEvaluator predEval, boolean reverse, ISimpleFrameBufferManager bufferManager)
-            throws HyracksDataException {
+    public InMemoryHashJoin(IHyracksTaskContext ctx, FrameTupleAccessor accessorProbe, ITuplePartitionComputer tpcProbe,
+            FrameTupleAccessor accessorBuild, RecordDescriptor rDBuild, ITuplePartitionComputer tpcBuild,
+            FrameTuplePairComparator comparator, boolean isLeftOuter, IMissingWriter[] missingWritersBuild,
+            ISerializableTable table, IPredicateEvaluator predEval, boolean reverse,
+            ISimpleFrameBufferManager bufferManager) throws HyracksDataException {
         this.table = table;
         storedTuplePointer = new TuplePointer();
         buffers = new ArrayList<>();
@@ -112,7 +110,7 @@
         } else {
             isTableCapacityNotZero = false;
         }
-        LOGGER.fine("InMemoryHashJoin has been created for a table size of " + table.getTableSize() + " for Thread ID "
+        LOGGER.debug("InMemoryHashJoin has been created for a table size of " + table.getTableSize() + " for Thread ID "
                 + Thread.currentThread().getId() + ".");
     }
 
@@ -207,8 +205,8 @@
             }
         }
         buffers.clear();
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("InMemoryHashJoin has finished using " + nFrames + " frames for Thread ID "
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("InMemoryHashJoin has finished using " + nFrames + " frames for Thread ID "
                     + Thread.currentThread().getId() + ".");
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoinOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoinOperatorDescriptor.java
index d81d955..3873bae 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoinOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/InMemoryHashJoinOperatorDescriptor.java
@@ -162,15 +162,15 @@
             for (int i = 0; i < comparatorFactories.length; ++i) {
                 comparators[i] = comparatorFactories[i].createBinaryComparator();
             }
-            final IMissingWriter[] nullWriters1 = isLeftOuter ? new IMissingWriter[nonMatchWriterFactories.length]
-                    : null;
+            final IMissingWriter[] nullWriters1 =
+                    isLeftOuter ? new IMissingWriter[nonMatchWriterFactories.length] : null;
             if (isLeftOuter) {
                 for (int i = 0; i < nonMatchWriterFactories.length; i++) {
                     nullWriters1[i] = nonMatchWriterFactories[i].createMissingWriter();
                 }
             }
-            final IPredicateEvaluator predEvaluator = (predEvaluatorFactory == null ? null
-                    : predEvaluatorFactory.createPredicateEvaluator());
+            final IPredicateEvaluator predEvaluator =
+                    (predEvaluatorFactory == null ? null : predEvaluatorFactory.createPredicateEvaluator());
 
             final int memSizeInBytes = memSizeInFrames * ctx.getInitialFrameSize();
             final IDeallocatableFramePool framePool = new DeallocatableFramePool(ctx, memSizeInBytes);
@@ -181,10 +181,10 @@
 
                 @Override
                 public void open() throws HyracksDataException {
-                    ITuplePartitionComputer hpc0 = new FieldHashPartitionComputerFactory(keys0, hashFunctionFactories)
-                            .createPartitioner();
-                    ITuplePartitionComputer hpc1 = new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories)
-                            .createPartitioner();
+                    ITuplePartitionComputer hpc0 =
+                            new FieldHashPartitionComputerFactory(keys0, hashFunctionFactories).createPartitioner();
+                    ITuplePartitionComputer hpc1 =
+                            new FieldHashPartitionComputerFactory(keys1, hashFunctionFactories).createPartitioner();
                     state = new HashBuildTaskState(ctx.getJobletContext().getJobId(),
                             new TaskId(getActivityId(), partition));
                     ISerializableTable table = new SerializableHashTable(tableSize, ctx, bufferManager);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/JoinComparator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/JoinComparator.java
index 5306ae5..9c5dc60 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/JoinComparator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/JoinComparator.java
@@ -51,8 +51,8 @@
         int fEnd1 = accessor1.getFieldEndOffset(tIndex1, field1);
         int fLen1 = fEnd1 - fStart1;
 
-        int c = bComparator.compare(accessor0.getBuffer().array(), fStart0 + fStartOffset0, fLen0, accessor1
-                .getBuffer().array(), fStart1 + fStartOffset1, fLen1);
+        int c = bComparator.compare(accessor0.getBuffer().array(), fStart0 + fStartOffset0, fLen0,
+                accessor1.getBuffer().array(), fStart1 + fStartOffset1, fLen1);
         if (c != 0) {
             return c;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoin.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoin.java
index d9c0bcd..d0f5a73 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoin.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoin.java
@@ -70,9 +70,9 @@
         if (memSize < 3) {
             throw new HyracksDataException("Not enough memory is available for Nested Loop Join");
         }
-        this.outerBufferMngr = new VariableFrameMemoryManager(
-                new VariableFramePool(ctx, ctx.getInitialFrameSize() * (memSize - 2)),
-                FrameFreeSlotPolicyFactory.createFreeSlotPolicy(EnumFreeSlotPolicy.LAST_FIT, memSize - 2));
+        this.outerBufferMngr =
+                new VariableFrameMemoryManager(new VariableFramePool(ctx, ctx.getInitialFrameSize() * (memSize - 2)),
+                        FrameFreeSlotPolicyFactory.createFreeSlotPolicy(EnumFreeSlotPolicy.LAST_FIT, memSize - 2));
 
         this.predEvaluator = predEval;
         this.isReversed = false;
@@ -90,8 +90,8 @@
             missingTupleBuilder = null;
         }
 
-        FileReference file = ctx.getJobletContext()
-                .createManagedWorkspaceFile(this.getClass().getSimpleName() + this.toString());
+        FileReference file =
+                ctx.getJobletContext().createManagedWorkspaceFile(this.getClass().getSimpleName() + this.toString());
         runFileWriter = new RunFileWriter(file, ctx.getIoManager());
         runFileWriter.open();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoinOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoinOperatorDescriptor.java
index 99dbfad..2236056 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoinOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/NestedLoopJoinOperatorDescriptor.java
@@ -117,8 +117,8 @@
             final RecordDescriptor rd0 = recordDescProvider.getInputRecordDescriptor(nljAid, 0);
             final RecordDescriptor rd1 = recordDescProvider.getInputRecordDescriptor(getActivityId(), 0);
             final ITuplePairComparator comparator = comparatorFactory.createTuplePairComparator(ctx);
-            final IPredicateEvaluator predEvaluator = (predEvaluatorFactory != null)
-                    ? predEvaluatorFactory.createPredicateEvaluator() : null;
+            final IPredicateEvaluator predEvaluator =
+                    (predEvaluatorFactory != null) ? predEvaluatorFactory.createPredicateEvaluator() : null;
 
             final IMissingWriter[] nullWriters1 = isLeftOuter ? new IMissingWriter[nullWriterFactories1.length] : null;
             if (isLeftOuter) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
index d49a6dd..ddf1741 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoin.java
@@ -110,8 +110,7 @@
     private int[] probePSizeInTups;
 
     public OptimizedHybridHashJoin(IHyracksTaskContext ctx, int memSizeInFrames, int numOfPartitions,
-            String probeRelName,
-            String buildRelName, int[] probeKeys, int[] buildKeys, IBinaryComparator[] comparators,
+            String probeRelName, String buildRelName, int[] probeKeys, int[] buildKeys, IBinaryComparator[] comparators,
             RecordDescriptor probeRd, RecordDescriptor buildRd, ITuplePartitionComputer probeHpc,
             ITuplePartitionComputer buildHpc, IPredicateEvaluator predEval, boolean isLeftOuter,
             IMissingWriterFactory[] nullWriterFactories1) {
@@ -259,8 +258,8 @@
                 break;
         }
         try {
-            for (int pid = spilledStatus.nextSetBit(0); pid >= 0
-                    && pid < numOfPartitions; pid = spilledStatus.nextSetBit(pid + 1)) {
+            for (int pid = spilledStatus.nextSetBit(0); pid >= 0 && pid < numOfPartitions; pid =
+                    spilledStatus.nextSetBit(pid + 1)) {
                 if (bufferManager.getNumTuples(pid) > 0) {
                     bufferManager.flushPartition(pid, getSpillWriterOrCreateNewOneIfNotExist(pid, whichSide));
                     bufferManager.clearPartition(pid);
@@ -293,16 +292,15 @@
 
         // For partitions in main memory, we deduct their size from the free space.
         int inMemTupCount = 0;
-        for (int p = spilledStatus.nextClearBit(0); p >= 0
-                && p < numOfPartitions; p = spilledStatus.nextClearBit(p + 1)) {
+        for (int p = spilledStatus.nextClearBit(0); p >= 0 && p < numOfPartitions; p =
+                spilledStatus.nextClearBit(p + 1)) {
             freeSpace -= bufferManager.getPhysicalSize(p);
             inMemTupCount += buildPSizeInTups[p];
         }
 
         // Calculates the expected hash table size for the given number of tuples in main memory
         // and deducts it from the free space.
-        long hashTableByteSizeForInMemTuples = SerializableHashTable.getExpectedTableByteSize(inMemTupCount,
-                frameSize);
+        long hashTableByteSizeForInMemTuples = SerializableHashTable.getExpectedTableByteSize(inMemTupCount, frameSize);
         freeSpace -= hashTableByteSizeForInMemTuples;
 
         // In the case where free space is less than zero after considering the hash table size,
@@ -317,8 +315,9 @@
             int pidToSpill = selectSinglePartitionToSpill(freeSpace, inMemTupCount, frameSize);
             if (pidToSpill >= 0) {
                 // There is a suitable one. We spill that partition to the disk.
-                long hashTableSizeDecrease = -SerializableHashTable.calculateByteSizeDeltaForTableSizeChange(
-                        inMemTupCount, -buildPSizeInTups[pidToSpill], frameSize);
+                long hashTableSizeDecrease =
+                        -SerializableHashTable.calculateByteSizeDeltaForTableSizeChange(inMemTupCount,
+                                -buildPSizeInTups[pidToSpill], frameSize);
                 freeSpace = freeSpace + bufferManager.getPhysicalSize(pidToSpill) + hashTableSizeDecrease;
                 inMemTupCount -= buildPSizeInTups[pidToSpill];
                 spillPartition(pidToSpill);
@@ -327,8 +326,8 @@
             } else {
                 // There is no single suitable partition. So, we need to spill multiple partitions to the disk
                 // in order to accommodate the hash table.
-                for (int p = spilledStatus.nextClearBit(0); p >= 0
-                        && p < numOfPartitions; p = spilledStatus.nextClearBit(p + 1)) {
+                for (int p = spilledStatus.nextClearBit(0); p >= 0 && p < numOfPartitions; p =
+                        spilledStatus.nextClearBit(p + 1)) {
                     int spaceToBeReturned = bufferManager.getPhysicalSize(p);
                     int numberOfTuplesToBeSpilled = buildPSizeInTups[p];
                     if (spaceToBeReturned == 0 || numberOfTuplesToBeSpilled == 0) {
@@ -340,9 +339,9 @@
                     // Since the number of tuples in memory has been decreased,
                     // the hash table size will be decreased, too.
                     // We put minus since the method returns a negative value to represent a newly reclaimed space.
-                    long expectedHashTableSizeDecrease = -SerializableHashTable
-                            .calculateByteSizeDeltaForTableSizeChange(inMemTupCount, -numberOfTuplesToBeSpilled,
-                                    frameSize);
+                    long expectedHashTableSizeDecrease =
+                            -SerializableHashTable.calculateByteSizeDeltaForTableSizeChange(inMemTupCount,
+                                    -numberOfTuplesToBeSpilled, frameSize);
                     freeSpace = freeSpace + spaceToBeReturned + expectedHashTableSizeDecrease;
                     // Adjusts the hash table size
                     inMemTupCount -= numberOfTuplesToBeSpilled;
@@ -356,8 +355,7 @@
         // If more partitions have been spilled to the disk, calculate the expected hash table size again
         // before bringing some partitions to main memory.
         if (moreSpilled) {
-            hashTableByteSizeForInMemTuples = SerializableHashTable.getExpectedTableByteSize(inMemTupCount,
-                    frameSize);
+            hashTableByteSizeForInMemTuples = SerializableHashTable.getExpectedTableByteSize(inMemTupCount, frameSize);
         }
 
         // Brings back some partitions if there is enough free space.
@@ -387,8 +385,8 @@
         long minSpaceAfterSpill = (long) memSizeInFrames * frameSize;
         int minSpaceAfterSpillPartID = -1;
 
-        for (int p = spilledStatus.nextClearBit(0); p >= 0
-                && p < numOfPartitions; p = spilledStatus.nextClearBit(p + 1)) {
+        for (int p = spilledStatus.nextClearBit(0); p >= 0 && p < numOfPartitions; p =
+                spilledStatus.nextClearBit(p + 1)) {
             if (buildPSizeInTups[p] == 0 || bufferManager.getPhysicalSize(p) == 0) {
                 continue;
             }
@@ -408,8 +406,8 @@
     }
 
     private int selectPartitionsToReload(long freeSpace, int pid, int inMemTupCount) {
-        for (int i = spilledStatus.nextSetBit(pid); i >= 0
-                && i < numOfPartitions; i = spilledStatus.nextSetBit(i + 1)) {
+        for (int i = spilledStatus.nextSetBit(pid); i >= 0 && i < numOfPartitions; i =
+                spilledStatus.nextSetBit(i + 1)) {
             int spilledTupleCount = buildPSizeInTups[i];
             // Expected hash table size increase after reloading this partition
             long expectedHashTableByteSizeIncrease = SerializableHashTable.calculateByteSizeDeltaForTableSizeChange(
@@ -452,10 +450,10 @@
 
     private void createInMemoryJoiner(int inMemTupCount) throws HyracksDataException {
         ISerializableTable table = new SerializableHashTable(inMemTupCount, ctx, bufferManagerForHashTable);
-        this.inMemJoiner = new InMemoryHashJoin(ctx, new FrameTupleAccessor(probeRd), probeHpc,
-                new FrameTupleAccessor(buildRd), buildRd, buildHpc,
-                new FrameTuplePairComparator(probeKeys, buildKeys, comparators), isLeftOuter, nonMatchWriters, table,
-                predEvaluator, isReversed, bufferManagerForHashTable);
+        this.inMemJoiner =
+                new InMemoryHashJoin(ctx, new FrameTupleAccessor(probeRd), probeHpc, new FrameTupleAccessor(buildRd),
+                        buildRd, buildHpc, new FrameTuplePairComparator(probeKeys, buildKeys, comparators), isLeftOuter,
+                        nonMatchWriters, table, predEvaluator, isReversed, bufferManagerForHashTable);
     }
 
     private void loadDataInMemJoin() throws HyracksDataException {
@@ -632,8 +630,8 @@
         buf.append("(A) Spilled partitions" + "\n");
         int spilledTupleCount = 0;
         int spilledPartByteSize = 0;
-        for (int pid = spilledStatus.nextSetBit(0); pid >= 0
-                && pid < numOfPartitions; pid = spilledStatus.nextSetBit(pid + 1)) {
+        for (int pid = spilledStatus.nextSetBit(0); pid >= 0 && pid < numOfPartitions; pid =
+                spilledStatus.nextSetBit(pid + 1)) {
             if (whichSide == SIDE.BUILD) {
                 spilledTupleCount += buildPSizeInTups[pid];
                 spilledPartByteSize += buildRFWriters[pid].getFileSize();
@@ -653,8 +651,8 @@
         buf.append("(B) In-memory partitions" + "\n");
         int inMemoryTupleCount = 0;
         int inMemoryPartByteSize = 0;
-        for (int pid = spilledStatus.nextClearBit(0); pid >= 0
-                && pid < numOfPartitions; pid = spilledStatus.nextClearBit(pid + 1)) {
+        for (int pid = spilledStatus.nextClearBit(0); pid >= 0 && pid < numOfPartitions; pid =
+                spilledStatus.nextClearBit(pid + 1)) {
             if (whichSide == SIDE.BUILD) {
                 inMemoryTupleCount += buildPSizeInTups[pid];
                 inMemoryPartByteSize += bufferManager.getPhysicalSize(pid);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
index c795144..9eeb363 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/join/OptimizedHybridHashJoinOperatorDescriptor.java
@@ -23,8 +23,6 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.BitSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.VSizeFrame;
@@ -66,6 +64,8 @@
 import org.apache.hyracks.dataflow.std.structures.ISerializableTable;
 import org.apache.hyracks.dataflow.std.structures.SerializableHashTable;
 import org.apache.hyracks.dataflow.std.util.FrameTuplePairComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * @author pouria
@@ -137,7 +137,7 @@
     private boolean forceNLJ = false;
     private boolean forceRoleReversal = false;
 
-    private static final Logger LOGGER = Logger.getLogger(OptimizedHybridHashJoinOperatorDescriptor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public OptimizedHybridHashJoinOperatorDescriptor(IOperatorDescriptorRegistry spec, int memSizeInFrames,
             int inputsize0, double factor, int[] keys0, int[] keys1,
@@ -268,17 +268,19 @@
                 comparators[i] = comparatorFactories[i].createBinaryComparator();
             }
 
-            final IPredicateEvaluator predEvaluator = (predEvaluatorFactory == null ? null
-                    : predEvaluatorFactory.createPredicateEvaluator());
+            final IPredicateEvaluator predEvaluator =
+                    (predEvaluatorFactory == null ? null : predEvaluatorFactory.createPredicateEvaluator());
 
             IOperatorNodePushable op = new AbstractUnaryInputSinkOperatorNodePushable() {
                 private BuildAndPartitionTaskState state = new BuildAndPartitionTaskState(
                         ctx.getJobletContext().getJobId(), new TaskId(getActivityId(), partition));
 
-                ITuplePartitionComputer probeHpc = new FieldHashPartitionComputerFamily(probeKeys,
-                        hashFunctionGeneratorFactories).createPartitioner(0);
-                ITuplePartitionComputer buildHpc = new FieldHashPartitionComputerFamily(buildKeys,
-                        hashFunctionGeneratorFactories).createPartitioner(0);
+                ITuplePartitionComputer probeHpc =
+                        new FieldHashPartitionComputerFamily(probeKeys, hashFunctionGeneratorFactories)
+                                .createPartitioner(0);
+                ITuplePartitionComputer buildHpc =
+                        new FieldHashPartitionComputerFamily(buildKeys, hashFunctionGeneratorFactories)
+                                .createPartitioner(0);
                 boolean isFailed = false;
 
                 @Override
@@ -287,15 +289,15 @@
                         throw new HyracksDataException("Not enough memory is assigend for Hybrid Hash Join.");
                     }
                     state.memForJoin = memSizeInFrames - 2;
-                    state.numOfPartitions = getNumberOfPartitions(state.memForJoin, inputsize0, fudgeFactor,
-                            nPartitions);
+                    state.numOfPartitions =
+                            getNumberOfPartitions(state.memForJoin, inputsize0, fudgeFactor, nPartitions);
                     state.hybridHJ = new OptimizedHybridHashJoin(ctx, state.memForJoin, state.numOfPartitions,
                             PROBE_REL, BUILD_REL, probeKeys, buildKeys, comparators, probeRd, buildRd, probeHpc,
                             buildHpc, predEvaluator, isLeftOuter, nonMatchWriterFactories);
 
                     state.hybridHJ.initBuild();
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("OptimizedHybridHashJoin is starting the build phase with " + state.numOfPartitions
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("OptimizedHybridHashJoin is starting the build phase with " + state.numOfPartitions
                                 + " partitions using " + state.memForJoin + " frames for memory.");
                     }
                 }
@@ -312,8 +314,8 @@
                         state.hybridHJ.clearBuildTempFiles();
                     } else {
                         ctx.setStateObject(state);
-                        if (LOGGER.isLoggable(Level.FINE)) {
-                            LOGGER.fine("OptimizedHybridHashJoin closed its build phase");
+                        if (LOGGER.isDebugEnabled()) {
+                            LOGGER.debug("OptimizedHybridHashJoin closed its build phase");
                         }
                     }
                 }
@@ -355,21 +357,21 @@
             final RecordDescriptor buildRd = recordDescProvider.getInputRecordDescriptor(buildAid, 0);
             final RecordDescriptor probeRd = recordDescProvider.getInputRecordDescriptor(getActivityId(), 0);
             final IBinaryComparator[] comparators = new IBinaryComparator[comparatorFactories.length];
-            final ITuplePairComparator nljComparatorProbe2Build = tuplePairComparatorFactoryProbe2Build
-                    .createTuplePairComparator(ctx);
-            final ITuplePairComparator nljComparatorBuild2Probe = tuplePairComparatorFactoryBuild2Probe
-                    .createTuplePairComparator(ctx);
-            final IPredicateEvaluator predEvaluator = predEvaluatorFactory == null ? null
-                    : predEvaluatorFactory.createPredicateEvaluator();
+            final ITuplePairComparator nljComparatorProbe2Build =
+                    tuplePairComparatorFactoryProbe2Build.createTuplePairComparator(ctx);
+            final ITuplePairComparator nljComparatorBuild2Probe =
+                    tuplePairComparatorFactoryBuild2Probe.createTuplePairComparator(ctx);
+            final IPredicateEvaluator predEvaluator =
+                    predEvaluatorFactory == null ? null : predEvaluatorFactory.createPredicateEvaluator();
 
             for (int i = 0; i < comparatorFactories.length; i++) {
                 comparators[i] = comparatorFactories[i].createBinaryComparator();
             }
 
-            final IMissingWriter[] nonMatchWriter = isLeftOuter ? new IMissingWriter[nonMatchWriterFactories.length]
-                    : null;
-            final ArrayTupleBuilder nullTupleBuild = isLeftOuter ? new ArrayTupleBuilder(buildRd.getFieldCount())
-                    : null;
+            final IMissingWriter[] nonMatchWriter =
+                    isLeftOuter ? new IMissingWriter[nonMatchWriterFactories.length] : null;
+            final ArrayTupleBuilder nullTupleBuild =
+                    isLeftOuter ? new ArrayTupleBuilder(buildRd.getFieldCount()) : null;
             if (isLeftOuter) {
                 DataOutput out = nullTupleBuild.getDataOutput();
                 for (int i = 0; i < nonMatchWriterFactories.length; i++) {
@@ -395,8 +397,8 @@
                     writer.open();
                     state.hybridHJ.initProbe();
 
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("OptimizedHybridHashJoin is starting the probe phase.");
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("OptimizedHybridHashJoin is starting the probe phase.");
                     }
                 }
 
@@ -432,8 +434,8 @@
                         }
                         BitSet partitionStatus = state.hybridHJ.getPartitionStatus();
                         rPartbuff.reset();
-                        for (int pid = partitionStatus.nextSetBit(0); pid >= 0; pid = partitionStatus
-                                .nextSetBit(pid + 1)) {
+                        for (int pid = partitionStatus.nextSetBit(0); pid >= 0; pid =
+                                partitionStatus.nextSetBit(pid + 1)) {
                             RunFileReader bReader = state.hybridHJ.getBuildRFReader(pid);
                             RunFileReader pReader = state.hybridHJ.getProbeRFReader(pid);
 
@@ -466,36 +468,38 @@
                 }
 
                 private void logProbeComplete() {
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("OptimizedHybridHashJoin closed its probe phase");
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("OptimizedHybridHashJoin closed its probe phase");
                     }
                 }
 
                 //The buildSideReader should be always the original buildSideReader, so should the probeSideReader
                 private void joinPartitionPair(RunFileReader buildSideReader, RunFileReader probeSideReader,
                         int buildSizeInTuple, int probeSizeInTuple, int level) throws HyracksDataException {
-                    ITuplePartitionComputer probeHpc = new FieldHashPartitionComputerFamily(probeKeys,
-                            hashFunctionGeneratorFactories).createPartitioner(level);
-                    ITuplePartitionComputer buildHpc = new FieldHashPartitionComputerFamily(buildKeys,
-                            hashFunctionGeneratorFactories).createPartitioner(level);
+                    ITuplePartitionComputer probeHpc =
+                            new FieldHashPartitionComputerFamily(probeKeys, hashFunctionGeneratorFactories)
+                                    .createPartitioner(level);
+                    ITuplePartitionComputer buildHpc =
+                            new FieldHashPartitionComputerFamily(buildKeys, hashFunctionGeneratorFactories)
+                                    .createPartitioner(level);
 
                     int frameSize = ctx.getInitialFrameSize();
                     long buildPartSize = (long) Math.ceil((double) buildSideReader.getFileSize() / (double) frameSize);
                     long probePartSize = (long) Math.ceil((double) probeSideReader.getFileSize() / (double) frameSize);
                     int beforeMax = Math.max(buildSizeInTuple, probeSizeInTuple);
 
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("\n>>>Joining Partition Pairs (thread_id " + Thread.currentThread().getId()
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("\n>>>Joining Partition Pairs (thread_id " + Thread.currentThread().getId()
                                 + ") (pid " + ") - (level " + level + ")" + " - BuildSize:\t" + buildPartSize
                                 + "\tProbeSize:\t" + probePartSize + " - MemForJoin " + (state.memForJoin)
                                 + "  - LeftOuter is " + isLeftOuter);
                     }
 
                     // Calculate the expected hash table size for the both side.
-                    long expectedHashTableSizeForBuildInFrame = SerializableHashTable
-                            .getExpectedTableFrameCount(buildSizeInTuple, frameSize);
-                    long expectedHashTableSizeForProbeInFrame = SerializableHashTable
-                            .getExpectedTableFrameCount(probeSizeInTuple, frameSize);
+                    long expectedHashTableSizeForBuildInFrame =
+                            SerializableHashTable.getExpectedTableFrameCount(buildSizeInTuple, frameSize);
+                    long expectedHashTableSizeForProbeInFrame =
+                            SerializableHashTable.getExpectedTableFrameCount(probeSizeInTuple, frameSize);
 
                     //Apply in-Mem HJ if possible
                     if (!skipInMemoryHJ && ((buildPartSize + expectedHashTableSizeForBuildInFrame < state.memForJoin)
@@ -505,8 +509,8 @@
                         int tabSize = -1;
                         if (!forceRoleReversal && (isLeftOuter || (buildPartSize < probePartSize))) {
                             //Case 1.1 - InMemHJ (without Role-Reversal)
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("\t>>>Case 1.1 (IsLeftOuter || buildSize<probe) AND ApplyInMemHJ - [Level "
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug("\t>>>Case 1.1 (IsLeftOuter || buildSize<probe) AND ApplyInMemHJ - [Level "
                                         + level + "]");
                             }
                             tabSize = buildSizeInTuple;
@@ -518,8 +522,8 @@
                             applyInMemHashJoin(buildKeys, probeKeys, tabSize, buildRd, probeRd, buildHpc, probeHpc,
                                     buildSideReader, probeSideReader); // checked-confirmed
                         } else { //Case 1.2 - InMemHJ with Role Reversal
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("\t>>>Case 1.2. (NoIsLeftOuter || probe<build) AND ApplyInMemHJ"
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug("\t>>>Case 1.2. (NoIsLeftOuter || probe<build) AND ApplyInMemHJ"
                                         + "WITH RoleReversal - [Level " + level + "]");
                             }
                             tabSize = probeSizeInTuple;
@@ -534,22 +538,23 @@
                     }
                     //Apply (Recursive) HHJ
                     else {
-                        if (LOGGER.isLoggable(Level.FINE)) {
-                            LOGGER.fine("\t>>>Case 2. ApplyRecursiveHHJ - [Level " + level + "]");
+                        if (LOGGER.isDebugEnabled()) {
+                            LOGGER.debug("\t>>>Case 2. ApplyRecursiveHHJ - [Level " + level + "]");
                         }
                         if (!forceRoleReversal && (isLeftOuter || buildPartSize < probePartSize)) {
                             //Case 2.1 - Recursive HHJ (without Role-Reversal)
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("\t\t>>>Case 2.1 - RecursiveHHJ WITH (isLeftOuter || build<probe) - [Level "
-                                        + level + "]");
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug(
+                                        "\t\t>>>Case 2.1 - RecursiveHHJ WITH (isLeftOuter || build<probe) - [Level "
+                                                + level + "]");
                             }
                             applyHybridHashJoin((int) buildPartSize, PROBE_REL, BUILD_REL, probeKeys, buildKeys,
                                     probeRd, buildRd, probeHpc, buildHpc, probeSideReader, buildSideReader, level,
                                     beforeMax);
 
                         } else { //Case 2.2 - Recursive HHJ (with Role-Reversal)
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine(
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug(
                                         "\t\t>>>Case 2.2. - RecursiveHHJ WITH RoleReversal - [Level " + level + "]");
                             }
 
@@ -618,8 +623,8 @@
                         BitSet rPStatus = rHHj.getPartitionStatus();
                         if (!forceNLJ && (afterMax < (NLJ_SWITCH_THRESHOLD * beforeMax))) {
                             //Case 2.1.1 - Keep applying HHJ
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("\t\t>>>Case 2.1.1 - KEEP APPLYING RecursiveHHJ WITH "
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug("\t\t>>>Case 2.1.1 - KEEP APPLYING RecursiveHHJ WITH "
                                         + "(isLeftOuter || build<probe) - [Level " + level + "]");
                             }
                             for (int rPid = rPStatus.nextSetBit(0); rPid >= 0; rPid = rPStatus.nextSetBit(rPid + 1)) {
@@ -644,10 +649,9 @@
                             }
 
                         } else { //Case 2.1.2 - Switch to NLJ
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine(
-                                        "\t\t>>>Case 2.1.2 - SWITCHED to NLJ RecursiveHHJ WITH "
-                                                + "(isLeftOuter || build<probe) - [Level " + level + "]");
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug("\t\t>>>Case 2.1.2 - SWITCHED to NLJ RecursiveHHJ WITH "
+                                        + "(isLeftOuter || build<probe) - [Level " + level + "]");
                             }
                             for (int rPid = rPStatus.nextSetBit(0); rPid >= 0; rPid = rPStatus.nextSetBit(rPid + 1)) {
                                 RunFileReader rbrfw = rHHj.getBuildRFReader(rPid);
@@ -695,8 +699,8 @@
                             probeTupleAccessor.reset(rPartbuff.getBuffer());
                             for (int tid = 0; tid < probeTupleAccessor.getTupleCount(); tid++) {
                                 FrameUtils.appendConcatToWriter(writer, nullResultAppender, probeTupleAccessor, tid,
-                                    nullTupleBuild.getFieldEndOffsets(), nullTupleBuild.getByteArray(), 0,
-                                    nullTupleBuild.getSize());
+                                        nullTupleBuild.getFieldEndOffsets(), nullTupleBuild.getByteArray(), 0,
+                                        nullTupleBuild.getSize());
                             }
                         }
                         nullResultAppender.write(writer, true);
@@ -712,13 +716,13 @@
                     boolean isReversed = pKeys == OptimizedHybridHashJoinOperatorDescriptor.this.buildKeys
                             && bKeys == OptimizedHybridHashJoinOperatorDescriptor.this.probeKeys;
                     assert isLeftOuter ? !isReversed : true : "LeftOut Join can not reverse roles";
-                    IDeallocatableFramePool framePool = new DeallocatableFramePool(ctx,
-                            state.memForJoin * ctx.getInitialFrameSize());
+                    IDeallocatableFramePool framePool =
+                            new DeallocatableFramePool(ctx, state.memForJoin * ctx.getInitialFrameSize());
                     ISimpleFrameBufferManager bufferManager = new FramePoolBackedFrameBufferManager(framePool);
 
                     ISerializableTable table = new SerializableHashTable(tabSize, ctx, bufferManager);
-                    InMemoryHashJoin joiner = new InMemoryHashJoin(ctx, new FrameTupleAccessor(probeRDesc),
-                            hpcRepProbe, new FrameTupleAccessor(buildRDesc), buildRDesc, hpcRepBuild,
+                    InMemoryHashJoin joiner = new InMemoryHashJoin(ctx, new FrameTupleAccessor(probeRDesc), hpcRepProbe,
+                            new FrameTupleAccessor(buildRDesc), buildRDesc, hpcRepBuild,
                             new FrameTuplePairComparator(pKeys, bKeys, comparators), isLeftOuter, nonMatchWriter, table,
                             predEvaluator, isReversed, bufferManager);
 
@@ -776,11 +780,11 @@
                     // Hence the reverse relation is different.
                     boolean isReversed = outerRd == buildRd && innerRd == probeRd;
                     assert isLeftOuter ? !isReversed : true : "LeftOut Join can not reverse roles";
-                    ITuplePairComparator nljComptorOuterInner = isReversed ? nljComparatorBuild2Probe
-                            : nljComparatorProbe2Build;
-                    NestedLoopJoin nlj = new NestedLoopJoin(ctx, new FrameTupleAccessor(outerRd),
-                            new FrameTupleAccessor(innerRd), nljComptorOuterInner, memorySize, predEvaluator,
-                            isLeftOuter, nonMatchWriter);
+                    ITuplePairComparator nljComptorOuterInner =
+                            isReversed ? nljComparatorBuild2Probe : nljComparatorProbe2Build;
+                    NestedLoopJoin nlj =
+                            new NestedLoopJoin(ctx, new FrameTupleAccessor(outerRd), new FrameTupleAccessor(innerRd),
+                                    nljComptorOuterInner, memorySize, predEvaluator, isLeftOuter, nonMatchWriter);
                     nlj.setIsReversed(isReversed);
 
                     IFrame cacheBuff = new VSizeFrame(ctx);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorDescriptor.java
index 0629168..7b687c4 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/ConstantTupleSourceOperatorDescriptor.java
@@ -34,8 +34,8 @@
     private byte[] tupleData;
     private int tupleSize;
 
-    public ConstantTupleSourceOperatorDescriptor(IOperatorDescriptorRegistry spec, RecordDescriptor recDesc, int[] fieldSlots,
-            byte[] tupleData, int tupleSize) {
+    public ConstantTupleSourceOperatorDescriptor(IOperatorDescriptorRegistry spec, RecordDescriptor recDesc,
+            int[] fieldSlots, byte[] tupleData, int tupleSize) {
         super(spec, 0, 1);
         this.tupleData = tupleData;
         this.fieldSlots = fieldSlots;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/IdentityOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/IdentityOperatorDescriptor.java
index 156198a..29c8fed 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/IdentityOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/IdentityOperatorDescriptor.java
@@ -40,7 +40,7 @@
     @Override
     public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
             final IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         return new AbstractUnaryInputUnaryOutputOperatorNodePushable() {
             @Override
             public void open() throws HyracksDataException {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/LimitOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/LimitOperatorDescriptor.java
index 4fc1ad2..a190686 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/LimitOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/LimitOperatorDescriptor.java
@@ -46,7 +46,7 @@
     @Override
     public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
             final IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions)
-                    throws HyracksDataException {
+            throws HyracksDataException {
 
         return new AbstractUnaryInputUnaryOutputOperatorNodePushable() {
             private FrameTupleAccessor fta;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializerTaskState.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializerTaskState.java
index 31cbaad..6ba11ca 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializerTaskState.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializerTaskState.java
@@ -59,8 +59,8 @@
     }
 
     public void open(IHyracksTaskContext ctx) throws HyracksDataException {
-        FileReference file = ctx.getJobletContext()
-                .createManagedWorkspaceFile(MaterializerTaskState.class.getSimpleName());
+        FileReference file =
+                ctx.getJobletContext().createManagedWorkspaceFile(MaterializerTaskState.class.getSimpleName());
         out = new RunFileWriter(file, ctx.getIoManager());
         out.open();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializingOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializingOperatorDescriptor.java
index d3e87d4..3f97752 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializingOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/misc/MaterializingOperatorDescriptor.java
@@ -59,8 +59,8 @@
     @Override
     public void contributeActivities(IActivityGraphBuilder builder) {
         if (isSingleActivity) {
-            MaterializerReaderActivityNode mra = new MaterializerReaderActivityNode(
-                    new ActivityId(odId, MATERIALIZER_READER_ACTIVITY_ID));
+            MaterializerReaderActivityNode mra =
+                    new MaterializerReaderActivityNode(new ActivityId(odId, MATERIALIZER_READER_ACTIVITY_ID));
 
             builder.addActivity(this, mra);
             builder.addSourceEdge(0, mra, 0);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/result/ResultWriterOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/result/ResultWriterOperatorDescriptor.java
index 58eee79..b0cc40c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/result/ResultWriterOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/result/ResultWriterOperatorDescriptor.java
@@ -51,14 +51,16 @@
     private final boolean asyncMode;
 
     private final IResultSerializerFactory resultSerializerFactory;
+    private final long maxReads;
 
     public ResultWriterOperatorDescriptor(IOperatorDescriptorRegistry spec, ResultSetId rsId, boolean ordered,
-            boolean asyncMode, IResultSerializerFactory resultSerializerFactory) throws IOException {
+            boolean asyncMode, IResultSerializerFactory resultSerializerFactory, long maxReads) throws IOException {
         super(spec, 1, 0);
         this.rsId = rsId;
         this.ordered = ordered;
         this.asyncMode = asyncMode;
         this.resultSerializerFactory = resultSerializerFactory;
+        this.maxReads = maxReads;
     }
 
     @Override
@@ -74,8 +76,8 @@
         PrintStream printStream = new PrintStream(frameOutputStream);
 
         final RecordDescriptor outRecordDesc = recordDescProvider.getInputRecordDescriptor(getActivityId(), 0);
-        final IResultSerializer resultSerializer = resultSerializerFactory.createResultSerializer(outRecordDesc,
-                printStream);
+        final IResultSerializer resultSerializer =
+                resultSerializerFactory.createResultSerializer(outRecordDesc, printStream);
 
         final FrameTupleAccessor frameTupleAccessor = new FrameTupleAccessor(outRecordDesc);
 
@@ -87,7 +89,7 @@
             public void open() throws HyracksDataException {
                 try {
                     datasetPartitionWriter = dpm.createDatasetPartitionWriter(ctx, rsId, ordered, asyncMode, partition,
-                            nPartitions);
+                            nPartitions, maxReads);
                     datasetPartitionWriter.open();
                     resultSerializer.init();
                 } catch (HyracksException e) {
@@ -139,7 +141,8 @@
                 sb.append("{ ");
                 sb.append("\"rsId\": \"").append(rsId).append("\", ");
                 sb.append("\"ordered\": ").append(ordered).append(", ");
-                sb.append("\"asyncMode\": ").append(asyncMode).append(" }");
+                sb.append("\"asyncMode\": ").append(asyncMode).append(", ");
+                sb.append("\"maxReads\": ").append(maxReads).append(" }");
                 return sb.toString();
             }
         };
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunGenerator.java
index 7c7bfec..a8cc93b 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunGenerator.java
@@ -39,24 +39,24 @@
     protected final int maxSortFrames;
 
     public AbstractExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, int framesLimit) throws HyracksDataException {
-        this(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDesc, alg,
-                EnumFreeSlotPolicy.LAST_FIT, framesLimit);
+        this(ctx, sortFields, keyNormalizerFactories, comparatorFactories, recordDesc, alg, EnumFreeSlotPolicy.LAST_FIT,
+                framesLimit);
     }
 
     public AbstractExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, EnumFreeSlotPolicy policy, int framesLimit)
-                    throws HyracksDataException {
-        this(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDesc, alg, policy, framesLimit,
+            throws HyracksDataException {
+        this(ctx, sortFields, keyNormalizerFactories, comparatorFactories, recordDesc, alg, policy, framesLimit,
                 Integer.MAX_VALUE);
     }
 
     public AbstractExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, EnumFreeSlotPolicy policy, int framesLimit, int outputLimit)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         super();
         this.ctx = ctx;
         maxSortFrames = framesLimit - 1;
@@ -65,11 +65,11 @@
         IFrameBufferManager bufferManager = new VariableFrameMemoryManager(
                 new VariableFramePool(ctx, maxSortFrames * ctx.getInitialFrameSize()), freeSlotPolicy);
         if (alg == Algorithm.MERGE_SORT) {
-            frameSorter = new FrameSorterMergeSort(ctx, bufferManager, sortFields, firstKeyNormalizerFactory,
-                    comparatorFactories, recordDesc, outputLimit);
+            frameSorter = new FrameSorterMergeSort(ctx, bufferManager, maxSortFrames, sortFields,
+                    keyNormalizerFactories, comparatorFactories, recordDesc, outputLimit);
         } else {
-            frameSorter = new FrameSorterQuickSort(ctx, bufferManager, sortFields, firstKeyNormalizerFactory,
-                    comparatorFactories, recordDesc, outputLimit);
+            frameSorter = new FrameSorterQuickSort(ctx, bufferManager, maxSortFrames, sortFields,
+                    keyNormalizerFactories, comparatorFactories, recordDesc, outputLimit);
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunMerger.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunMerger.java
index c8f9268..4a77b3c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunMerger.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractExternalSortRunMerger.java
@@ -22,8 +22,6 @@
 import java.util.BitSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.FrameConstants;
 import org.apache.hyracks.api.comm.IFrameWriter;
@@ -38,6 +36,9 @@
 import org.apache.hyracks.dataflow.common.io.RunFileReader;
 import org.apache.hyracks.dataflow.common.io.RunFileWriter;
 import org.apache.hyracks.dataflow.std.sort.util.GroupVSizeFrame;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractExternalSortRunMerger {
 
@@ -55,7 +56,7 @@
     private VSizeFrame outputFrame;
     private ISorter sorter;
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractExternalSortRunMerger.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public AbstractExternalSortRunMerger(IHyracksTaskContext ctx, ISorter sorter, List<GeneratedRunFileReader> runs,
             IBinaryComparator[] comparators, INormalizedKeyComputer nmkComputer, RecordDescriptor recordDesc,
@@ -147,8 +148,8 @@
 
                         if (currentGenerationRunAvailable.isEmpty()) {
 
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("generated runs:" + stop);
+                            if (LOGGER.isDebugEnabled()) {
+                                LOGGER.debug("generated runs:" + stop);
                             }
                             runs.subList(0, stop).clear();
                             currentGenerationRunAvailable.clear();
@@ -156,9 +157,7 @@
                             stop = runs.size();
                         }
                     } else {
-                        if (LOGGER.isLoggable(Level.FINE)) {
-                            LOGGER.fine("final runs:" + stop);
-                        }
+                        LOGGER.debug("final runs: {}", stop);
                         merge(finalWriter, partialRuns);
                         break;
                     }
@@ -179,8 +178,8 @@
                     try {
                         reader.close(); // close is idempotent.
                     } catch (Exception e) {
-                        if (LOGGER.isLoggable(Level.WARNING)) {
-                            LOGGER.log(Level.WARNING, e.getMessage(), e);
+                        if (LOGGER.isWarnEnabled()) {
+                            LOGGER.log(Level.WARN, e.getMessage(), e);
                         }
                     }
                 }
@@ -259,8 +258,8 @@
             }
         } finally {
             merger.close();
-            if (LOGGER.isLoggable(Level.FINE)) {
-                LOGGER.fine("Output " + io + " frames");
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Output " + io + " frames");
             }
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractFrameSorter.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractFrameSorter.java
index 77d5d49..f51271e 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractFrameSorter.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractFrameSorter.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.dataflow.std.sort;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameTupleAppender;
@@ -37,48 +35,96 @@
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.comm.util.FrameUtils;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 import org.apache.hyracks.dataflow.std.buffermanager.BufferInfo;
 import org.apache.hyracks.dataflow.std.buffermanager.IFrameBufferManager;
+import org.apache.hyracks.dataflow.std.buffermanager.VariableFramePool;
 import org.apache.hyracks.util.IntSerDeUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractFrameSorter implements IFrameSorter {
 
-    protected Logger LOGGER = Logger.getLogger(AbstractFrameSorter.class.getName());
-    static final int PTR_SIZE = 4;
-    static final int ID_FRAMEID = 0;
-    static final int ID_TUPLE_START = 1;
-    static final int ID_TUPLE_END = 2;
-    static final int ID_NORMAL_KEY = 3;
+    protected Logger LOGGER = LogManager.getLogger();
+    protected static final int ID_FRAME_ID = 0;
+    protected static final int ID_TUPLE_START = 1;
+    protected static final int ID_TUPLE_END = 2;
+    protected static final int ID_NORMALIZED_KEY = 3;
+
+    // the length of each normalized key (in terms of integers)
+    protected final int[] normalizedKeyLength;
+    // the total length of the normalized key (in term of integers)
+    protected final int normalizedKeyTotalLength;
+    // whether the normalized keys can be used to decide orders, even when normalized keys are the same
+    protected final boolean normalizedKeysDecisive;
+
+    protected final int ptrSize;
 
     protected final int[] sortFields;
     protected final IBinaryComparator[] comparators;
-    protected final INormalizedKeyComputer nkc;
+    protected final INormalizedKeyComputer[] nkcs;
     protected final IFrameBufferManager bufferManager;
     protected final FrameTupleAccessor inputTupleAccessor;
     protected final IFrameTupleAppender outputAppender;
     protected final IFrame outputFrame;
     protected final int outputLimit;
 
+    protected final long maxSortMemory;
+    protected long totalMemoryUsed;
     protected int[] tPointers;
+    protected final int[] tmpPointer;
     protected int tupleCount;
 
-    private FrameTupleAccessor fta2;
-    private BufferInfo info = new BufferInfo(null, -1, -1);
+    private final FrameTupleAccessor fta2;
+    private final BufferInfo info = new BufferInfo(null, -1, -1);
 
-    public AbstractFrameSorter(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor) throws HyracksDataException {
-        this(ctx, bufferManager, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
-                Integer.MAX_VALUE);
+    public AbstractFrameSorter(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor)
+            throws HyracksDataException {
+        this(ctx, bufferManager, maxSortFrames, sortFields, keyNormalizerFactories, comparatorFactories,
+                recordDescriptor, Integer.MAX_VALUE);
     }
 
-    public AbstractFrameSorter(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor, int outputLimit)
+    public AbstractFrameSorter(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] normalizedKeyComputerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor, int outputLimit)
             throws HyracksDataException {
         this.bufferManager = bufferManager;
+        if (maxSortFrames == VariableFramePool.UNLIMITED_MEMORY) {
+            this.maxSortMemory = Long.MAX_VALUE;
+        } else {
+            this.maxSortMemory = (long) ctx.getInitialFrameSize() * maxSortFrames;
+        }
         this.sortFields = sortFields;
-        this.nkc = firstKeyNormalizerFactory == null ? null : firstKeyNormalizerFactory.createNormalizedKeyComputer();
+
+        int runningNormalizedKeyTotalLength = 0;
+
+        if (normalizedKeyComputerFactories != null) {
+            int decisivePrefixLength = NormalizedKeyUtils.getDecisivePrefixLength(normalizedKeyComputerFactories);
+
+            // we only take a prefix of the decisive normalized keys, plus at most indecisive normalized keys
+            // ideally, the caller should prepare normalizers in this way, but we just guard here to avoid
+            // computing unncessary normalized keys
+            int normalizedKeys = decisivePrefixLength < normalizedKeyComputerFactories.length ? decisivePrefixLength + 1
+                    : decisivePrefixLength;
+            this.nkcs = new INormalizedKeyComputer[normalizedKeys];
+            this.normalizedKeyLength = new int[normalizedKeys];
+
+            for (int i = 0; i < normalizedKeys; i++) {
+                this.nkcs[i] = normalizedKeyComputerFactories[i].createNormalizedKeyComputer();
+                this.normalizedKeyLength[i] =
+                        normalizedKeyComputerFactories[i].getNormalizedKeyProperties().getNormalizedKeyLength();
+                runningNormalizedKeyTotalLength += this.normalizedKeyLength[i];
+            }
+            this.normalizedKeysDecisive = decisivePrefixLength == comparatorFactories.length;
+        } else {
+            this.nkcs = null;
+            this.normalizedKeyLength = null;
+            this.normalizedKeysDecisive = false;
+        }
+        this.normalizedKeyTotalLength = runningNormalizedKeyTotalLength;
+        this.ptrSize = ID_NORMALIZED_KEY + normalizedKeyTotalLength;
         this.comparators = new IBinaryComparator[comparatorFactories.length];
         for (int i = 0; i < comparatorFactories.length; ++i) {
             comparators[i] = comparatorFactories[i].createBinaryComparator();
@@ -88,17 +134,24 @@
         this.outputFrame = new VSizeFrame(ctx);
         this.outputLimit = outputLimit;
         this.fta2 = new FrameTupleAccessor(recordDescriptor);
+        this.tmpPointer = new int[ptrSize];
     }
 
     @Override
     public void reset() throws HyracksDataException {
         this.tupleCount = 0;
+        this.totalMemoryUsed = 0;
         this.bufferManager.reset();
     }
 
     @Override
     public boolean insertFrame(ByteBuffer inputBuffer) throws HyracksDataException {
-        if (bufferManager.insertFrame(inputBuffer) >= 0) {
+        inputTupleAccessor.reset(inputBuffer);
+        long requiredMemory = getRequiredMemory(inputTupleAccessor);
+        if (totalMemoryUsed + requiredMemory <= maxSortMemory && bufferManager.insertFrame(inputBuffer) >= 0) {
+            // we have enough memory
+            totalMemoryUsed += requiredMemory;
+            tupleCount += inputTupleAccessor.getTupleCount();
             return true;
         }
         if (getFrameCount() == 0) {
@@ -108,36 +161,41 @@
         return false;
     }
 
+    protected long getRequiredMemory(FrameTupleAccessor frameAccessor) {
+        return (long) frameAccessor.getBuffer().capacity() + ptrSize * frameAccessor.getTupleCount() * Integer.BYTES;
+    }
+
     @Override
     public void sort() throws HyracksDataException {
-        tupleCount = 0;
-        for (int i = 0; i < bufferManager.getNumFrames(); ++i) {
-            bufferManager.getFrame(i, info);
-            inputTupleAccessor.reset(info.getBuffer(), info.getStartOffset(), info.getLength());
-            tupleCount += inputTupleAccessor.getTupleCount();
-        }
-        if (tPointers == null || tPointers.length < tupleCount * PTR_SIZE) {
-            tPointers = new int[tupleCount * PTR_SIZE];
+        if (tPointers == null || tPointers.length < tupleCount * ptrSize) {
+            tPointers = new int[tupleCount * ptrSize];
         }
         int ptr = 0;
-        int sfIdx = sortFields[0];
         for (int i = 0; i < bufferManager.getNumFrames(); ++i) {
             bufferManager.getFrame(i, info);
             inputTupleAccessor.reset(info.getBuffer(), info.getStartOffset(), info.getLength());
             int tCount = inputTupleAccessor.getTupleCount();
             byte[] array = inputTupleAccessor.getBuffer().array();
-            for (int j = 0; j < tCount; ++j) {
+            int fieldSlotsLength = inputTupleAccessor.getFieldSlotsLength();
+            for (int j = 0; j < tCount; ++j, ++ptr) {
                 int tStart = inputTupleAccessor.getTupleStartOffset(j);
                 int tEnd = inputTupleAccessor.getTupleEndOffset(j);
-                tPointers[ptr * PTR_SIZE + ID_FRAMEID] = i;
-                tPointers[ptr * PTR_SIZE + ID_TUPLE_START] = tStart;
-                tPointers[ptr * PTR_SIZE + ID_TUPLE_END] = tEnd;
-                int f0StartRel = inputTupleAccessor.getFieldStartOffset(j, sfIdx);
-                int f0EndRel = inputTupleAccessor.getFieldEndOffset(j, sfIdx);
-                int f0Start = f0StartRel + tStart + inputTupleAccessor.getFieldSlotsLength();
-                tPointers[ptr * PTR_SIZE + ID_NORMAL_KEY] =
-                        nkc == null ? 0 : nkc.normalize(array, f0Start, f0EndRel - f0StartRel);
-                ++ptr;
+                tPointers[ptr * ptrSize + ID_FRAME_ID] = i;
+                tPointers[ptr * ptrSize + ID_TUPLE_START] = tStart;
+                tPointers[ptr * ptrSize + ID_TUPLE_END] = tEnd;
+                if (nkcs == null) {
+                    continue;
+                }
+                int keyPos = ptr * ptrSize + ID_NORMALIZED_KEY;
+                for (int k = 0; k < nkcs.length; k++) {
+                    int sortField = sortFields[k];
+                    int fieldStartOffsetRel = inputTupleAccessor.getFieldStartOffset(j, sortField);
+                    int fieldEndOffsetRel = inputTupleAccessor.getFieldEndOffset(j, sortField);
+                    int fieldStartOffset = fieldStartOffsetRel + tStart + fieldSlotsLength;
+                    nkcs[k].normalize(array, fieldStartOffset, fieldEndOffsetRel - fieldStartOffsetRel, tPointers,
+                            keyPos);
+                    keyPos += normalizedKeyLength[k];
+                }
             }
         }
         if (tupleCount > 0) {
@@ -164,9 +222,9 @@
         int limit = Math.min(tupleCount, outputLimit);
         int io = 0;
         for (int ptr = 0; ptr < limit; ++ptr) {
-            int i = tPointers[ptr * PTR_SIZE + ID_FRAMEID];
-            int tStart = tPointers[ptr * PTR_SIZE + ID_TUPLE_START];
-            int tEnd = tPointers[ptr * PTR_SIZE + ID_TUPLE_END];
+            int i = tPointers[ptr * ptrSize + ID_FRAME_ID];
+            int tStart = tPointers[ptr * ptrSize + ID_TUPLE_START];
+            int tEnd = tPointers[ptr * ptrSize + ID_TUPLE_END];
             bufferManager.getFrame(i, info);
             inputTupleAccessor.reset(info.getBuffer(), info.getStartOffset(), info.getLength());
             int flushed = FrameUtils.appendToWriter(writer, outputAppender, inputTupleAccessor, tStart, tEnd);
@@ -177,27 +235,32 @@
         }
         maxFrameSize = Math.max(maxFrameSize, outputFrame.getFrameSize());
         outputAppender.write(writer, true);
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine(
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug(
                     "Flushed records:" + limit + " out of " + tupleCount + "; Flushed through " + (io + 1) + " frames");
         }
         return maxFrameSize;
     }
 
     protected final int compare(int tp1, int tp2) throws HyracksDataException {
-        int i1 = tPointers[tp1 * 4 + ID_FRAMEID];
-        int j1 = tPointers[tp1 * 4 + ID_TUPLE_START];
-        int v1 = tPointers[tp1 * 4 + ID_NORMAL_KEY];
+        return compare(tPointers, tp1, tPointers, tp2);
+    }
 
-        int tp2i = tPointers[tp2 * 4 + ID_FRAMEID];
-        int tp2j = tPointers[tp2 * 4 + ID_TUPLE_START];
-        int tp2v = tPointers[tp2 * 4 + ID_NORMAL_KEY];
-
-        if (v1 != tp2v) {
-            return ((((long) v1) & 0xffffffffL) < (((long) tp2v) & 0xffffffffL)) ? -1 : 1;
+    protected final int compare(int[] tPointers1, int tp1, int[] tPointers2, int tp2) throws HyracksDataException {
+        if (nkcs != null) {
+            int cmpNormalizedKey =
+                    NormalizedKeyUtils.compareNormalizeKeys(tPointers1, tp1 * ptrSize + ID_NORMALIZED_KEY, tPointers2,
+                            tp2 * ptrSize + ID_NORMALIZED_KEY, normalizedKeyTotalLength);
+            if (cmpNormalizedKey != 0 || normalizedKeysDecisive) {
+                return cmpNormalizedKey;
+            }
         }
-        int i2 = tp2i;
-        int j2 = tp2j;
+
+        int i1 = tPointers1[tp1 * ptrSize + ID_FRAME_ID];
+        int j1 = tPointers1[tp1 * ptrSize + ID_TUPLE_START];
+        int i2 = tPointers2[tp2 * ptrSize + ID_FRAME_ID];
+        int j2 = tPointers2[tp2 * ptrSize + ID_TUPLE_START];
+
         bufferManager.getFrame(i1, info);
         byte[] b1 = info.getBuffer().array();
         inputTupleAccessor.reset(info.getBuffer(), info.getStartOffset(), info.getLength());
@@ -223,6 +286,20 @@
         return 0;
     }
 
+    protected void swap(int pointers1[], int pos1, int pointers2[], int pos2) {
+        System.arraycopy(pointers1, pos1 * ptrSize, tmpPointer, 0, ptrSize);
+        System.arraycopy(pointers2, pos2 * ptrSize, pointers1, pos1 * ptrSize, ptrSize);
+        System.arraycopy(tmpPointer, 0, pointers2, pos2 * ptrSize, ptrSize);
+    }
+
+    protected void copy(int src[], int srcPos, int dest[], int destPos) {
+        System.arraycopy(src, srcPos * ptrSize, dest, destPos * ptrSize, ptrSize);
+    }
+
+    protected void copy(int src[], int srcPos, int dest[], int destPos, int n) {
+        System.arraycopy(src, srcPos * ptrSize, dest, destPos * ptrSize, n * ptrSize);
+    }
+
     @Override
     public void close() {
         tupleCount = 0;
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractSorterOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractSorterOperatorDescriptor.java
index 1cd5fc3..f274ca1 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractSorterOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/AbstractSorterOperatorDescriptor.java
@@ -21,8 +21,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -45,10 +43,12 @@
 import org.apache.hyracks.dataflow.std.base.AbstractStateObject;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryInputSinkOperatorNodePushable;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryOutputSourceOperatorNodePushable;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractSorterOperatorDescriptor extends AbstractOperatorDescriptor {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractSorterOperatorDescriptor.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final long serialVersionUID = 1L;
 
@@ -56,17 +56,17 @@
     protected static final int MERGE_ACTIVITY_ID = 1;
 
     protected final int[] sortFields;
-    protected final INormalizedKeyComputerFactory firstKeyNormalizerFactory;
+    protected final INormalizedKeyComputerFactory[] keyNormalizerFactories;
     protected final IBinaryComparatorFactory[] comparatorFactories;
     protected final int framesLimit;
 
     public AbstractSorterOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
         super(spec, 1, 1);
         this.framesLimit = framesLimit;
         this.sortFields = sortFields;
-        this.firstKeyNormalizerFactory = firstKeyNormalizerFactory;
+        this.keyNormalizerFactories = keyNormalizerFactories;
         this.comparatorFactories = comparatorFactories;
         outRecDescs[0] = recordDescriptor;
     }
@@ -132,7 +132,7 @@
                     runGen.close();
                     state.generatedRunFileReaders = runGen.getRuns();
                     state.sorter = runGen.getSorter();
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("InitialNumberOfRuns:" + runGen.getRuns().size());
                     }
                     ctx.setStateObject(state);
@@ -174,8 +174,8 @@
                     for (int i = 0; i < comparatorFactories.length; ++i) {
                         comparators[i] = comparatorFactories[i].createBinaryComparator();
                     }
-                    INormalizedKeyComputer nmkComputer = firstKeyNormalizerFactory == null ? null
-                            : firstKeyNormalizerFactory.createNormalizedKeyComputer();
+                    INormalizedKeyComputer nmkComputer = keyNormalizerFactories == null ? null
+                            : keyNormalizerFactories[0].createNormalizedKeyComputer();
                     AbstractExternalSortRunMerger merger = getSortRunMerger(ctx, recordDescProvider, writer, sorter,
                             runs, comparators, nmkComputer, framesLimit);
                     merger.process();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortOperatorDescriptor.java
index 1b66ccf..b58d4c7 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortOperatorDescriptor.java
@@ -43,21 +43,31 @@
     private final int outputLimit;
 
     public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor, Algorithm alg) {
-        this(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor, alg,
+        this(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor, alg,
                 EnumFreeSlotPolicy.LAST_FIT);
     }
 
     public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
             IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor) {
-        this(spec, framesLimit, sortFields, null, comparatorFactories, recordDescriptor);
+        this(spec, framesLimit, sortFields, (INormalizedKeyComputerFactory[]) null, comparatorFactories,
+                recordDescriptor);
     }
 
     public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
             INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
-        this(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
+        this(spec, framesLimit, sortFields,
+                firstKeyNormalizerFactory != null ? new INormalizedKeyComputerFactory[] { firstKeyNormalizerFactory }
+                        : null,
+                comparatorFactories, recordDescriptor, Algorithm.MERGE_SORT, EnumFreeSlotPolicy.LAST_FIT);
+    }
+
+    public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
+            RecordDescriptor recordDescriptor) {
+        this(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor,
                 Algorithm.MERGE_SORT, EnumFreeSlotPolicy.LAST_FIT);
     }
 
@@ -69,7 +79,7 @@
             @Override
             protected AbstractSortRunGenerator getRunGenerator(IHyracksTaskContext ctx,
                     IRecordDescriptorProvider recordDescProvider) throws HyracksDataException {
-                return new ExternalSortRunGenerator(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories,
+                return new ExternalSortRunGenerator(ctx, sortFields, keyNormalizerFactories, comparatorFactories,
                         outRecDescs[0], alg, policy, framesLimit, outputLimit);
             }
         };
@@ -92,16 +102,16 @@
     }
 
     public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor, Algorithm alg, EnumFreeSlotPolicy policy) {
-        this(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor, alg,
-                policy, Integer.MAX_VALUE);
+        this(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor, alg, policy,
+                Integer.MAX_VALUE);
     }
 
     public ExternalSortOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor, Algorithm alg, EnumFreeSlotPolicy policy, int outputLimit) {
-        super(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor);
+        super(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor);
         if (framesLimit <= 1) {
             throw new IllegalStateException();// minimum of 2 fames (1 in,1 out)
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortRunGenerator.java
index b451b1c..785b94e 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortRunGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/ExternalSortRunGenerator.java
@@ -31,32 +31,32 @@
 public class ExternalSortRunGenerator extends AbstractExternalSortRunGenerator {
 
     public ExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, int framesLimit) throws HyracksDataException {
-        this(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDesc, alg,
-                EnumFreeSlotPolicy.LAST_FIT, framesLimit);
+        this(ctx, sortFields, keyNormalizerFactories, comparatorFactories, recordDesc, alg, EnumFreeSlotPolicy.LAST_FIT,
+                framesLimit);
     }
 
     public ExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, EnumFreeSlotPolicy policy, int framesLimit)
-                    throws HyracksDataException {
-        this(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDesc, alg, policy, framesLimit,
+            throws HyracksDataException {
+        this(ctx, sortFields, keyNormalizerFactories, comparatorFactories, recordDesc, alg, policy, framesLimit,
                 Integer.MAX_VALUE);
     }
 
     public ExternalSortRunGenerator(IHyracksTaskContext ctx, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDesc, Algorithm alg, EnumFreeSlotPolicy policy, int framesLimit, int outputLimit)
-                    throws HyracksDataException {
-        super(ctx, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDesc, alg, policy, framesLimit,
+            throws HyracksDataException {
+        super(ctx, sortFields, keyNormalizerFactories, comparatorFactories, recordDesc, alg, policy, framesLimit,
                 outputLimit);
     }
 
     @Override
     protected RunFileWriter getRunFileWriter() throws HyracksDataException {
-        FileReference file = ctx.getJobletContext()
-                .createManagedWorkspaceFile(ExternalSortRunGenerator.class.getSimpleName());
+        FileReference file =
+                ctx.getJobletContext().createManagedWorkspaceFile(ExternalSortRunGenerator.class.getSimpleName());
         return new RunFileWriter(file, ctx.getIoManager());
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterMergeSort.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterMergeSort.java
index ed28560..260b665 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterMergeSort.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterMergeSort.java
@@ -23,24 +23,27 @@
 import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.std.buffermanager.IFrameBufferManager;
 
 public class FrameSorterMergeSort extends AbstractFrameSorter {
 
     private int[] tPointersTemp;
 
-    public FrameSorterMergeSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor) throws HyracksDataException {
-        this(ctx, bufferManager, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
-                Integer.MAX_VALUE);
+    public FrameSorterMergeSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor)
+            throws HyracksDataException {
+        this(ctx, bufferManager, maxSortFrames, sortFields, keyNormalizerFactories, comparatorFactories,
+                recordDescriptor, Integer.MAX_VALUE);
     }
 
-    public FrameSorterMergeSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor, int outputLimit) throws HyracksDataException {
-        super(ctx, bufferManager, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
-                outputLimit);
+    public FrameSorterMergeSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor, int outputLimit)
+            throws HyracksDataException {
+        super(ctx, bufferManager, maxSortFrames, sortFields, keyNormalizerFactories, comparatorFactories,
+                recordDescriptor, outputLimit);
     }
 
     @Override
@@ -52,6 +55,11 @@
     }
 
     @Override
+    protected long getRequiredMemory(FrameTupleAccessor frameAccessor) {
+        return super.getRequiredMemory(frameAccessor) + ptrSize * frameAccessor.getTupleCount() * Integer.BYTES;
+    }
+
+    @Override
     public void close() {
         super.close();
         tPointersTemp = null;
@@ -68,7 +76,7 @@
                 if (next < end) {
                     merge(i, next, step, Math.min(step, end - next));
                 } else {
-                    System.arraycopy(tPointers, i * 4, tPointersTemp, i * 4, (end - i) * 4);
+                    copy(tPointers, i, tPointersTemp, i, end - i);
                 }
             }
             /** prepare next phase merge */
@@ -91,29 +99,21 @@
         while (pos1 <= end1 && pos2 <= end2) {
             int cmp = compare(pos1, pos2);
             if (cmp <= 0) {
-                copy(pos1, targetPos);
+                copy(tPointers, pos1, tPointersTemp, targetPos);
                 pos1++;
             } else {
-                copy(pos2, targetPos);
+                copy(tPointers, pos2, tPointersTemp, targetPos);
                 pos2++;
             }
             targetPos++;
         }
         if (pos1 <= end1) {
             int rest = end1 - pos1 + 1;
-            System.arraycopy(tPointers, pos1 * 4, tPointersTemp, targetPos * 4, rest * 4);
+            copy(tPointers, pos1, tPointersTemp, targetPos, rest);
         }
         if (pos2 <= end2) {
             int rest = end2 - pos2 + 1;
-            System.arraycopy(tPointers, pos2 * 4, tPointersTemp, targetPos * 4, rest * 4);
+            copy(tPointers, pos2, tPointersTemp, targetPos, rest);
         }
     }
-
-    private void copy(int src, int dest) {
-        tPointersTemp[dest * 4 + ID_FRAMEID] = tPointers[src * 4 + ID_FRAMEID];
-        tPointersTemp[dest * 4 + ID_TUPLE_START] = tPointers[src * 4 + ID_TUPLE_START];
-        tPointersTemp[dest * 4 + ID_TUPLE_END] = tPointers[src * 4 + ID_TUPLE_END];
-        tPointersTemp[dest * 4 + ID_NORMAL_KEY] = tPointers[src * 4 + ID_NORMAL_KEY];
-    }
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterQuickSort.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterQuickSort.java
index cf864f6..486bc7c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterQuickSort.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/FrameSorterQuickSort.java
@@ -27,18 +27,20 @@
 
 public class FrameSorterQuickSort extends AbstractFrameSorter {
 
-    public FrameSorterQuickSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor) throws HyracksDataException {
-        this(ctx, bufferManager, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
-                Integer.MAX_VALUE);
+    public FrameSorterQuickSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor)
+            throws HyracksDataException {
+        this(ctx, bufferManager, maxSortFrames, sortFields, keyNormalizerFactories, comparatorFactories,
+                recordDescriptor, Integer.MAX_VALUE);
     }
 
-    public FrameSorterQuickSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
-            RecordDescriptor recordDescriptor, int outputLimit) throws HyracksDataException {
-        super(ctx, bufferManager, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor,
-                outputLimit);
+    public FrameSorterQuickSort(IHyracksTaskContext ctx, IFrameBufferManager bufferManager, int maxSortFrames,
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor, int outputLimit)
+            throws HyracksDataException {
+        super(ctx, bufferManager, maxSortFrames, sortFields, keyNormalizerFactories, comparatorFactories,
+                recordDescriptor, outputLimit);
     }
 
     @Override
@@ -60,7 +62,7 @@
                     break;
                 }
                 if (cmp == 0) {
-                    swap(tPointers, a++, b);
+                    swap(tPointers, a++, tPointers, b);
                 }
                 ++b;
             }
@@ -70,13 +72,13 @@
                     break;
                 }
                 if (cmp == 0) {
-                    swap(tPointers, c, d--);
+                    swap(tPointers, c, tPointers, d--);
                 }
                 --c;
             }
             if (b > c)
                 break;
-            swap(tPointers, b++, c--);
+            swap(tPointers, b++, tPointers, c--);
         }
 
         int s;
@@ -94,17 +96,9 @@
         }
     }
 
-    private void swap(int x[], int a, int b) {
-        for (int i = 0; i < 4; ++i) {
-            int t = x[a * 4 + i];
-            x[a * 4 + i] = x[b * 4 + i];
-            x[b * 4 + i] = t;
-        }
-    }
-
     private void vecswap(int x[], int a, int b, int n) {
         for (int i = 0; i < n; i++, a++, b++) {
-            swap(x, a, b);
+            swap(x, a, x, b);
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HeapSortRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HeapSortRunGenerator.java
index a058624..1578975 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HeapSortRunGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HeapSortRunGenerator.java
@@ -31,31 +31,31 @@
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.io.RunFileWriter;
-import org.apache.hyracks.dataflow.std.buffermanager.IFramePool;
 import org.apache.hyracks.dataflow.std.buffermanager.IDeletableTupleBufferManager;
-import org.apache.hyracks.dataflow.std.buffermanager.VariableFramePool;
+import org.apache.hyracks.dataflow.std.buffermanager.IFramePool;
 import org.apache.hyracks.dataflow.std.buffermanager.VariableDeletableTupleMemoryManager;
+import org.apache.hyracks.dataflow.std.buffermanager.VariableFramePool;
 
 public class HeapSortRunGenerator extends AbstractSortRunGenerator {
     protected final IHyracksTaskContext ctx;
     protected final int frameLimit;
     protected final int topK;
     protected final int[] sortFields;
-    protected final INormalizedKeyComputerFactory nmkFactory;
+    protected final INormalizedKeyComputerFactory[] nmkFactories;
     protected final IBinaryComparatorFactory[] comparatorFactories;
     protected final RecordDescriptor recordDescriptor;
     protected ITupleSorter tupleSorter;
     protected IFrameTupleAccessor inAccessor;
 
     public HeapSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int topK, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
         super();
         this.ctx = ctx;
         this.frameLimit = frameLimit;
         this.topK = topK;
         this.sortFields = sortFields;
-        this.nmkFactory = firstKeyNormalizerFactory;
+        this.nmkFactories = keyNormalizerFactories;
         this.comparatorFactories = comparatorFactories;
         this.inAccessor = new FrameTupleAccessor(recordDescriptor);
         this.recordDescriptor = recordDescriptor;
@@ -64,8 +64,9 @@
     @Override
     public void open() throws HyracksDataException {
         IFramePool framePool = new VariableFramePool(ctx, (frameLimit - 1) * ctx.getInitialFrameSize());
-        IDeletableTupleBufferManager bufferManager = new VariableDeletableTupleMemoryManager(framePool, recordDescriptor);
-        tupleSorter = new TupleSorterHeapSort(ctx, bufferManager, topK, sortFields, nmkFactory, comparatorFactories);
+        IDeletableTupleBufferManager bufferManager =
+                new VariableDeletableTupleMemoryManager(framePool, recordDescriptor);
+        tupleSorter = new TupleSorterHeapSort(ctx, bufferManager, topK, sortFields, nmkFactories, comparatorFactories);
         super.open();
     }
 
@@ -76,8 +77,8 @@
 
     @Override
     protected RunFileWriter getRunFileWriter() throws HyracksDataException {
-        FileReference file = ctx.getJobletContext()
-                .createManagedWorkspaceFile(HeapSortRunGenerator.class.getSimpleName());
+        FileReference file =
+                ctx.getJobletContext().createManagedWorkspaceFile(HeapSortRunGenerator.class.getSimpleName());
         return new RunFileWriter(file, ctx.getIoManager());
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HybridTopKSortRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HybridTopKSortRunGenerator.java
index 4311128..180ecbc 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HybridTopKSortRunGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/HybridTopKSortRunGenerator.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.dataflow.std.sort;
 
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
@@ -34,18 +32,20 @@
 import org.apache.hyracks.dataflow.std.buffermanager.FrameFreeSlotPolicyFactory;
 import org.apache.hyracks.dataflow.std.buffermanager.VariableFrameMemoryManager;
 import org.apache.hyracks.dataflow.std.buffermanager.VariableFramePool;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class HybridTopKSortRunGenerator extends HeapSortRunGenerator {
-    private static final Logger LOG = Logger.getLogger(HybridTopKSortRunGenerator.class.getName());
+    private static final Logger LOG = LogManager.getLogger();
 
     private static final int SWITCH_TO_FRAME_SORTER_THRESHOLD = 2;
     private IFrameSorter frameSorter = null;
     private int tupleSorterFlushedTimes = 0;
 
     public HybridTopKSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int topK, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
-        super(ctx, frameLimit, topK, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor);
+        super(ctx, frameLimit, topK, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor);
     }
 
     @Override
@@ -60,8 +60,8 @@
 
     @Override
     protected RunFileWriter getRunFileWriter() throws HyracksDataException {
-        FileReference file = ctx.getJobletContext()
-                .createManagedWorkspaceFile(HybridTopKSortRunGenerator.class.getSimpleName());
+        FileReference file =
+                ctx.getJobletContext().createManagedWorkspaceFile(HybridTopKSortRunGenerator.class.getSimpleName());
         return new RunFileWriter(file, ctx.getIoManager());
     }
 
@@ -90,8 +90,8 @@
                     }
                     tupleSorter.close();
                     tupleSorter = null;
-                    if (LOG.isLoggable(Level.FINE)) {
-                        LOG.fine("clear tupleSorter");
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("clear tupleSorter");
                     }
                 }
             }
@@ -101,10 +101,10 @@
                         new VariableFramePool(ctx, (frameLimit - 1) * ctx.getInitialFrameSize()),
                         FrameFreeSlotPolicyFactory.createFreeSlotPolicy(EnumFreeSlotPolicy.BIGGEST_FIT,
                                 frameLimit - 1));
-                frameSorter = new FrameSorterMergeSort(ctx, bufferManager, sortFields, nmkFactory, comparatorFactories,
-                        recordDescriptor, topK);
-                if (LOG.isLoggable(Level.FINE)) {
-                    LOG.fine("create frameSorter");
+                frameSorter = new FrameSorterMergeSort(ctx, bufferManager, frameLimit - 1, sortFields, nmkFactories,
+                        comparatorFactories, recordDescriptor, topK);
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("create frameSorter");
                 }
             }
             if (!frameSorter.insertFrame(buffer)) {
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/InMemorySortOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/InMemorySortOperatorDescriptor.java
index 996101b..adc0d5c 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/InMemorySortOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/InMemorySortOperatorDescriptor.java
@@ -53,8 +53,8 @@
     private static final int MERGE_ACTIVITY_ID = 1;
 
     private final int[] sortFields;
-    private INormalizedKeyComputerFactory firstKeyNormalizerFactory;
-    private IBinaryComparatorFactory[] comparatorFactories;
+    private final INormalizedKeyComputerFactory[] keyNormalizerFactories;
+    private final IBinaryComparatorFactory[] comparatorFactories;
 
     public InMemorySortOperatorDescriptor(IOperatorDescriptorRegistry spec, int[] sortFields,
             IBinaryComparatorFactory[] comparatorFactories, RecordDescriptor recordDescriptor) {
@@ -62,11 +62,11 @@
     }
 
     public InMemorySortOperatorDescriptor(IOperatorDescriptorRegistry spec, int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
         super(spec, 1, 1);
         this.sortFields = sortFields;
-        this.firstKeyNormalizerFactory = firstKeyNormalizerFactory;
+        this.keyNormalizerFactories = keyNormalizerFactories;
         this.comparatorFactories = comparatorFactories;
         outRecDescs[0] = recordDescriptor;
     }
@@ -123,8 +123,9 @@
                             new VariableFramePool(ctx, VariableFramePool.UNLIMITED_MEMORY),
                             FrameFreeSlotPolicyFactory.createFreeSlotPolicy(EnumFreeSlotPolicy.LAST_FIT));
 
-                    state.frameSorter = new FrameSorterMergeSort(ctx, frameBufferManager, sortFields,
-                            firstKeyNormalizerFactory, comparatorFactories, outRecDescs[0]);
+                    state.frameSorter =
+                            new FrameSorterMergeSort(ctx, frameBufferManager, VariableFramePool.UNLIMITED_MEMORY,
+                                    sortFields, keyNormalizerFactories, comparatorFactories, outRecDescs[0]);
                     state.frameSorter.reset();
                 }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/RunMergingFrameReader.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/RunMergingFrameReader.java
index f001bed..4d9e813 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/RunMergingFrameReader.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/RunMergingFrameReader.java
@@ -30,6 +30,7 @@
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 import org.apache.hyracks.dataflow.std.sort.util.GroupFrameAccessor;
 import org.apache.hyracks.dataflow.std.util.ReferenceEntry;
 import org.apache.hyracks.dataflow.std.util.ReferencedPriorityQueue;
@@ -41,6 +42,8 @@
     private final int[] sortFields;
     private final IBinaryComparator[] comparators;
     private final INormalizedKeyComputer nmkComputer;
+    private final int normalizedKeyLength;
+    private final boolean normalizedKeyDecisive;
     private final RecordDescriptor recordDesc;
     private final int topK;
     private int tupleCount;
@@ -64,6 +67,13 @@
         this.sortFields = sortFields;
         this.comparators = comparators;
         this.nmkComputer = nmkComputer;
+        this.normalizedKeyLength =
+                nmkComputer != null ? nmkComputer.getNormalizedKeyProperties().getNormalizedKeyLength() : 0;
+        // right now we didn't take multiple key normalizers for frame merger, since during this step it won't be
+        // too many cache misses (merging multiple runs sequentially).
+        // but still, we can apply a special optimization if there is only 1 sort field
+        this.normalizedKeyDecisive = nmkComputer != null
+                ? nmkComputer.getNormalizedKeyProperties().isDecisive() && comparators.length == 1 : false;
         this.recordDesc = recordDesc;
         this.topK = topK;
     }
@@ -153,8 +163,7 @@
     }
 
     private static void closeRun(int index, List<? extends IFrameReader> runCursors,
-            IFrameTupleAccessor[] tupleAccessors)
-            throws HyracksDataException {
+            IFrameTupleAccessor[] tupleAccessors) throws HyracksDataException {
         if (runCursors.get(index) != null) {
             runCursors.get(index).close();
             runCursors.set(index, null);
@@ -164,32 +173,39 @@
 
     private Comparator<ReferenceEntry> createEntryComparator(final IBinaryComparator[] comparators) {
         return new Comparator<ReferenceEntry>() {
+            @Override
             public int compare(ReferenceEntry tp1, ReferenceEntry tp2) {
-                int nmk1 = tp1.getNormalizedKey();
-                int nmk2 = tp2.getNormalizedKey();
-                if (nmk1 != nmk2) {
-                    return ((((long) nmk1) & 0xffffffffL) < (((long) nmk2) & 0xffffffffL)) ? -1 : 1;
+                int[] tPointers1 = tp1.getTPointers();
+                int[] tPointers2 = tp2.getTPointers();
+                int cmp = NormalizedKeyUtils.compareNormalizeKeys(tPointers1, 0, tPointers2, 0, normalizedKeyLength);
+                if (cmp != 0) {
+                    return cmp;
+                } else if (normalizedKeyDecisive) {
+                    // we further compare the run id
+                    return compareRun(tp1, tp2);
                 }
                 IFrameTupleAccessor fta1 = tp1.getAccessor();
                 IFrameTupleAccessor fta2 = tp2.getAccessor();
                 byte[] b1 = fta1.getBuffer().array();
                 byte[] b2 = fta2.getBuffer().array();
-                int[] tPointers1 = tp1.getTPointers();
-                int[] tPointers2 = tp2.getTPointers();
 
                 for (int f = 0; f < sortFields.length; ++f) {
                     int c;
                     try {
-                        c = comparators[f].compare(b1, tPointers1[2 * f + 1], tPointers1[2 * f + 2], b2,
-                                tPointers2[2 * f + 1], tPointers2[2 * f + 2]);
+                        c = comparators[f].compare(b1, tPointers1[2 * f + normalizedKeyLength],
+                                tPointers1[2 * f + normalizedKeyLength + 1], b2,
+                                tPointers2[2 * f + normalizedKeyLength], tPointers2[2 * f + normalizedKeyLength + 1]);
                         if (c != 0) {
                             return c;
                         }
                     } catch (HyracksDataException e) {
                         throw new IllegalArgumentException(e);
                     }
-
                 }
+                return compareRun(tp1, tp2);
+            }
+
+            private int compareRun(ReferenceEntry tp1, ReferenceEntry tp2) {
                 int runid1 = tp1.getRunid();
                 int runid2 = tp2.getRunid();
                 return runid1 < runid2 ? -1 : (runid1 == runid2 ? 0 : 1);
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TopKSorterOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TopKSorterOperatorDescriptor.java
index 988eea3..dea770a 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TopKSorterOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TopKSorterOperatorDescriptor.java
@@ -41,7 +41,16 @@
     public TopKSorterOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int topK, int[] sortFields,
             INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories,
             RecordDescriptor recordDescriptor) {
-        super(spec, framesLimit, sortFields, firstKeyNormalizerFactory, comparatorFactories, recordDescriptor);
+        this(spec, framesLimit, topK,
+                sortFields, firstKeyNormalizerFactory != null
+                        ? new INormalizedKeyComputerFactory[] { firstKeyNormalizerFactory } : null,
+                comparatorFactories, recordDescriptor);
+    }
+
+    public TopKSorterOperatorDescriptor(IOperatorDescriptorRegistry spec, int framesLimit, int topK, int[] sortFields,
+            INormalizedKeyComputerFactory[] keyNormalizerFactories, IBinaryComparatorFactory[] comparatorFactories,
+            RecordDescriptor recordDescriptor) {
+        super(spec, framesLimit, sortFields, keyNormalizerFactories, comparatorFactories, recordDescriptor);
         this.topK = topK;
     }
 
@@ -53,7 +62,7 @@
             @Override
             protected AbstractSortRunGenerator getRunGenerator(IHyracksTaskContext ctx,
                     IRecordDescriptorProvider recordDescProvider) {
-                return new HybridTopKSortRunGenerator(ctx, framesLimit, topK, sortFields, firstKeyNormalizerFactory,
+                return new HybridTopKSortRunGenerator(ctx, framesLimit, topK, sortFields, keyNormalizerFactories,
                         comparatorFactories, outRecDescs[0]);
 
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TupleSorterHeapSort.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TupleSorterHeapSort.java
index c473819..46d62a7 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TupleSorterHeapSort.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/TupleSorterHeapSort.java
@@ -21,8 +21,6 @@
 
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
@@ -36,16 +34,19 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
 import org.apache.hyracks.dataflow.common.comm.util.FrameUtils;
+import org.apache.hyracks.dataflow.common.utils.NormalizedKeyUtils;
 import org.apache.hyracks.dataflow.std.buffermanager.IDeletableTupleBufferManager;
 import org.apache.hyracks.dataflow.std.buffermanager.ITuplePointerAccessor;
 import org.apache.hyracks.dataflow.std.structures.IResetableComparable;
 import org.apache.hyracks.dataflow.std.structures.IResetableComparableFactory;
 import org.apache.hyracks.dataflow.std.structures.MaxHeap;
 import org.apache.hyracks.dataflow.std.structures.TuplePointer;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TupleSorterHeapSort implements ITupleSorter {
 
-    private static final Logger LOGGER = Logger.getLogger(TupleSorterHeapSort.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     class HeapEntryFactory implements IResetableComparableFactory<HeapEntry> {
         @Override
@@ -55,18 +56,19 @@
     }
 
     class HeapEntry implements IResetableComparable<HeapEntry> {
-        int nmk;
+        int[] nmk;
         TuplePointer tuplePointer;
 
         public HeapEntry() {
             tuplePointer = new TuplePointer();
-            nmk = 0;
+            nmk = new int[normalizedKeyTotalLength];
         }
 
         @Override
         public int compareTo(HeapEntry o) {
-            if (nmk != o.nmk) {
-                return ((((long) nmk) & 0xffffffffL) < (((long) o.nmk) & 0xffffffffL)) ? -1 : 1;
+            int cmpNormalizedKey = NormalizedKeyUtils.compareNormalizeKeys(nmk, 0, o.nmk, 0, normalizedKeyTotalLength);
+            if (cmpNormalizedKey != 0 || normalizedKeyDecisive) {
+                return cmpNormalizedKey;
             }
             bufferAccessor1.reset(tuplePointer);
             bufferAccessor2.reset(o.tuplePointer);
@@ -93,13 +95,15 @@
             return 0;
         }
 
-        public void reset(int nmkey) {
-            nmk = nmkey;
+        public void reset(int[] nmkey) {
+            if (normalizedKeyTotalLength > 0) {
+                System.arraycopy(nmkey, 0, nmk, 0, normalizedKeyTotalLength);
+            }
         }
 
         @Override
         public void reset(HeapEntry other) {
-            nmk = other.nmk;
+            reset(other.nmk);
             tuplePointer.reset(other.tuplePointer);
         }
     }
@@ -111,19 +115,23 @@
     private final FrameTupleAppender outputAppender;
     private final IFrame outputFrame;
     private final int[] sortFields;
-    private final INormalizedKeyComputer nkc;
+    private final INormalizedKeyComputer[] nkcs;
+    private final boolean normalizedKeyDecisive;
+    private final int[] normalizedKeyLength;
+    private final int normalizedKeyTotalLength;
     private final IBinaryComparator[] comparators;
 
-    private HeapEntry maxEntry;
-    private HeapEntry newEntry;
+    private final HeapEntry maxEntry;
+    private final HeapEntry newEntry;
 
     private MaxHeap heap;
     private boolean isSorted;
 
+    private final int[] nmk;
+
     public TupleSorterHeapSort(IHyracksTaskContext ctx, IDeletableTupleBufferManager bufferManager, int topK,
-            int[] sortFields,
-            INormalizedKeyComputerFactory firstKeyNormalizerFactory, IBinaryComparatorFactory[] comparatorFactories)
-            throws HyracksDataException {
+            int[] sortFields, INormalizedKeyComputerFactory[] keyNormalizerFactories,
+            IBinaryComparatorFactory[] comparatorFactories) throws HyracksDataException {
         this.bufferManager = bufferManager;
         this.bufferAccessor1 = bufferManager.createTuplePointerAccessor();
         this.bufferAccessor2 = bufferManager.createTuplePointerAccessor();
@@ -131,7 +139,32 @@
         this.outputFrame = new VSizeFrame(ctx);
         this.outputAppender = new FrameTupleAppender();
         this.sortFields = sortFields;
-        this.nkc = firstKeyNormalizerFactory == null ? null : firstKeyNormalizerFactory.createNormalizedKeyComputer();
+
+        int runningNormalizedKeyTotalLength = 0;
+        if (keyNormalizerFactories != null) {
+            int decisivePrefixLength = NormalizedKeyUtils.getDecisivePrefixLength(keyNormalizerFactories);
+
+            // we only take a prefix of the decisive normalized keys, plus at most indecisive normalized keys
+            // ideally, the caller should prepare normalizers in this way, but we just guard here to avoid
+            // computing unncessary normalized keys
+            int normalizedKeys = decisivePrefixLength < keyNormalizerFactories.length ? decisivePrefixLength + 1
+                    : decisivePrefixLength;
+            this.nkcs = new INormalizedKeyComputer[normalizedKeys];
+            this.normalizedKeyLength = new int[normalizedKeys];
+
+            for (int i = 0; i < normalizedKeys; i++) {
+                this.nkcs[i] = keyNormalizerFactories[i].createNormalizedKeyComputer();
+                this.normalizedKeyLength[i] =
+                        keyNormalizerFactories[i].getNormalizedKeyProperties().getNormalizedKeyLength();
+                runningNormalizedKeyTotalLength += this.normalizedKeyLength[i];
+            }
+            this.normalizedKeyDecisive = decisivePrefixLength == comparatorFactories.length;
+        } else {
+            this.nkcs = null;
+            this.normalizedKeyLength = null;
+            this.normalizedKeyDecisive = false;
+        }
+        this.normalizedKeyTotalLength = runningNormalizedKeyTotalLength;
         this.comparators = new IBinaryComparator[comparatorFactories.length];
         for (int i = 0; i < comparatorFactories.length; ++i) {
             comparators[i] = comparatorFactories[i].createBinaryComparator();
@@ -141,6 +174,7 @@
         this.maxEntry = new HeapEntry();
         this.newEntry = new HeapEntry();
         this.isSorted = false;
+        this.nmk = new int[runningNormalizedKeyTotalLength];
     }
 
     @Override
@@ -154,7 +188,7 @@
             throw new HyracksDataException(
                     "The Heap haven't be reset after sorting, the order of using this class is not correct.");
         }
-        int nmkey = getPNK(frameTupleAccessor, index);
+        int[] nmkey = getPNK(frameTupleAccessor, index);
         if (heap.getNumEntries() >= topK) {
             heap.peekMax(maxEntry);
             if (compareTuple(frameTupleAccessor, index, nmkey, maxEntry) >= 0) {
@@ -175,20 +209,29 @@
         return true;
     }
 
-    private int getPNK(IFrameTupleAccessor fta, int tIx) {
-        if (nkc == null) {
-            return 0;
+    private int[] getPNK(IFrameTupleAccessor fta, int tIx) {
+        if (nkcs == null) {
+            return nmk;
         }
-        int sfIdx = sortFields[0];
-        return nkc.normalize(fta.getBuffer().array(), fta.getAbsoluteFieldStartOffset(tIx, sfIdx),
-                fta.getFieldLength(tIx, sfIdx));
+        int keyPos = 0;
+        byte[] buffer = fta.getBuffer().array();
+        for (int i = 0; i < nkcs.length; i++) {
+            int sfIdx = sortFields[i];
+            nkcs[i].normalize(buffer, fta.getAbsoluteFieldStartOffset(tIx, sfIdx), fta.getFieldLength(tIx, sfIdx), nmk,
+                    keyPos);
+            keyPos += normalizedKeyLength[i];
+        }
+        return nmk;
     }
 
-    private int compareTuple(IFrameTupleAccessor frameTupleAccessor, int tid, int nmkey, HeapEntry maxEntry)
+    private int compareTuple(IFrameTupleAccessor frameTupleAccessor, int tid, int[] nmkey, HeapEntry maxEntry)
             throws HyracksDataException {
-        if (nmkey != maxEntry.nmk) {
-            return ((((long) nmkey) & 0xffffffffL) < (((long) maxEntry.nmk) & 0xffffffffL)) ? -1 : 1;
+        int cmpNormalizedKey =
+                NormalizedKeyUtils.compareNormalizeKeys(nmkey, 0, maxEntry.nmk, 0, normalizedKeyTotalLength);
+        if (cmpNormalizedKey != 0 || normalizedKeyDecisive) {
+            return cmpNormalizedKey;
         }
+
         bufferAccessor2.reset(maxEntry.tuplePointer);
         byte[] b1 = frameTupleAccessor.getBuffer().array();
         byte[] b2 = bufferAccessor2.getBuffer().array();
@@ -254,9 +297,8 @@
         for (int i = 0; i < numEntries; i++) {
             HeapEntry minEntry = (HeapEntry) entries[i];
             bufferAccessor1.reset(minEntry.tuplePointer);
-            int flushed = FrameUtils
-                    .appendToWriter(writer, outputAppender, bufferAccessor1.getBuffer().array(),
-                            bufferAccessor1.getTupleStartOffset(), bufferAccessor1.getTupleLength());
+            int flushed = FrameUtils.appendToWriter(writer, outputAppender, bufferAccessor1.getBuffer().array(),
+                    bufferAccessor1.getTupleStartOffset(), bufferAccessor1.getTupleLength());
             if (flushed > 0) {
                 maxFrameSize = Math.max(maxFrameSize, flushed);
                 io++;
@@ -264,9 +306,8 @@
         }
         maxFrameSize = Math.max(maxFrameSize, outputFrame.getFrameSize());
         outputAppender.write(writer, true);
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info(
-                    "Flushed records:" + numEntries + "; Flushed through " + (io + 1) + " frames");
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Flushed records:" + numEntries + "; Flushed through " + (io + 1) + " frames");
         }
         return maxFrameSize;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppender.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppender.java
index 7d4db64..8ff77ca 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppender.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppender.java
@@ -42,7 +42,7 @@
     private int tupleCount;
     private int freeDataEndOffset;
     private int deletedSpace;
-    private byte[] array;   // to speed up the array visit a little
+    private byte[] array; // to speed up the array visit a little
 
     public DeletableFrameTupleAppender(RecordDescriptor recordDescriptor) {
         this.recordDescriptor = recordDescriptor;
@@ -146,7 +146,7 @@
             endOffset = getTupleEndOffset(i);
             if (endOffset >= 0) {
                 int length = endOffset - startOffset;
-                assert ( length >= 0);
+                assert (length >= 0);
                 if (freeDataEndOffset != startOffset) {
                     System.arraycopy(array, startOffset, array, freeDataEndOffset, length);
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/GroupVSizeFrame.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/GroupVSizeFrame.java
index d9460aa..1f45032 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/GroupVSizeFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/sort/util/GroupVSizeFrame.java
@@ -26,8 +26,7 @@
 
 public class GroupVSizeFrame extends VSizeFrame {
 
-    public GroupVSizeFrame(IHyracksCommonContext ctx, int frameSize)
-            throws HyracksDataException {
+    public GroupVSizeFrame(IHyracksCommonContext ctx, int frameSize) throws HyracksDataException {
         super(ctx, frameSize);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/IResetableComparable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/IResetableComparable.java
index 1b202e5..7cb6356 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/IResetableComparable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/IResetableComparable.java
@@ -19,5 +19,5 @@
 
 package org.apache.hyracks.dataflow.std.structures;
 
-public interface IResetableComparable<T> extends IResetable<T>, Comparable<T>{
+public interface IResetableComparable<T> extends IResetable<T>, Comparable<T> {
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/ISerializableTable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/ISerializableTable.java
index 015ddb3..51f9984 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/ISerializableTable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/ISerializableTable.java
@@ -57,8 +57,7 @@
      * @return the number of frames that are reclaimed.
      * @throws HyracksDataException
      */
-    int collectGarbage(ITuplePointerAccessor bufferAccessor, ITuplePartitionComputer tpc)
-            throws HyracksDataException;
+    int collectGarbage(ITuplePointerAccessor bufferAccessor, ITuplePartitionComputer tpc) throws HyracksDataException;
 
     /**
      * Prints out the internal information of this table.
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/MaxHeap.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/MaxHeap.java
index 4c9d05d..87d17da 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/MaxHeap.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/MaxHeap.java
@@ -64,4 +64,3 @@
         trickleDown(0);
     }
 }
-
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SerializableHashTable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SerializableHashTable.java
index ca97be3..e6da7c9 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SerializableHashTable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SerializableHashTable.java
@@ -45,8 +45,7 @@
     }
 
     public SerializableHashTable(int tableSize, final IHyracksFrameMgrContext ctx,
-            ISimpleFrameBufferManager bufferManager, double garbageCollectionThreshold)
-            throws HyracksDataException {
+            ISimpleFrameBufferManager bufferManager, double garbageCollectionThreshold) throws HyracksDataException {
         super(tableSize, ctx, false);
         this.bufferManager = bufferManager;
 
@@ -142,8 +141,8 @@
 
             // Step #2. Advances the reader until it hits the end of the given frame.
             while (gcInfo.currentReadIntOffsetInPageForGC < frameCapacity) {
-                nextSlotIntPosInPageForGC = findNextSlotInPage(currentReadContentFrameForGC,
-                        gcInfo.currentReadIntOffsetInPageForGC);
+                nextSlotIntPosInPageForGC =
+                        findNextSlotInPage(currentReadContentFrameForGC, gcInfo.currentReadIntOffsetInPageForGC);
 
                 if (nextSlotIntPosInPageForGC == INVALID_VALUE) {
                     // There isn't a valid slot in the page. Exits the loop #2 and reads the next frame.
@@ -174,8 +173,8 @@
                     }
 
                     // Migrates this slot to the current offset in Writer's Frame if possible.
-                    currentPageChanged = MigrateSlot(gcInfo, bufferAccessor, tpc, capacityInIntCount,
-                            nextSlotIntPosInPageForGC);
+                    currentPageChanged =
+                            MigrateSlot(gcInfo, bufferAccessor, tpc, capacityInIntCount, nextSlotIntPosInPageForGC);
 
                     if (currentPageChanged) {
                         currentReadContentFrameForGC = contents.get(gcInfo.currentReadPageForGC);
@@ -385,8 +384,8 @@
      * given tuple pointer.
      */
     private void updateHeaderToContentPointerInHeaderFrame(ITuplePointerAccessor bufferAccessor,
-            ITuplePartitionComputer tpc, TuplePointer hashedTuple, int newContentFrame,
-            int newOffsetInContentFrame) throws HyracksDataException {
+            ITuplePartitionComputer tpc, TuplePointer hashedTuple, int newContentFrame, int newOffsetInContentFrame)
+            throws HyracksDataException {
         // Finds the original hash value. We assume that bufferAccessor and tpc is already assigned.
         bufferAccessor.reset(hashedTuple);
         int entry = tpc.partition(bufferAccessor, hashedTuple.getTupleIndex(), tableSize);
@@ -401,7 +400,6 @@
         headerFrame.writeInt(offsetInHeaderFrame + 1, newOffsetInContentFrame);
     }
 
-
     /**
      * Tries to find the next valid slot position in the given content frame from the current position.
      */
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SimpleSerializableHashTable.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SimpleSerializableHashTable.java
index 6497a53..cfc58ce 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SimpleSerializableHashTable.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/structures/SimpleSerializableHashTable.java
@@ -309,16 +309,16 @@
         lastContentFrame.writeInt(lastOffsetInCurrentFrame + 2, pointer.getFrameIndex());
         lastContentFrame.writeInt(lastOffsetInCurrentFrame + 3, pointer.getTupleIndex());
         int newLastOffsetInContentFrame = lastOffsetInCurrentFrame + entryCapacity * 2;
-        newLastOffsetInContentFrame = newLastOffsetInContentFrame < frameCapacity ? newLastOffsetInContentFrame
-                    : frameCapacity - 1;
+        newLastOffsetInContentFrame =
+                newLastOffsetInContentFrame < frameCapacity ? newLastOffsetInContentFrame : frameCapacity - 1;
         currentOffsetInEachFrameList.set(currentFrameNumber, newLastOffsetInContentFrame);
 
         requiredIntCapacity = entryCapacity * 2 - (frameCapacity - lastOffsetInCurrentFrame);
         while (requiredIntCapacity > 0) {
             currentFrameNumber++;
             requiredIntCapacity -= frameCapacity;
-            newLastOffsetInContentFrame = requiredIntCapacity < 0 ? requiredIntCapacity + frameCapacity
-                    : frameCapacity - 1;
+            newLastOffsetInContentFrame =
+                    requiredIntCapacity < 0 ? requiredIntCapacity + frameCapacity : frameCapacity - 1;
             currentOffsetInEachFrameList.set(currentFrameNumber, newLastOffsetInContentFrame);
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/union/UnionAllOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/union/UnionAllOperatorDescriptor.java
index 967977e..a03d8d7 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/union/UnionAllOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/union/UnionAllOperatorDescriptor.java
@@ -62,7 +62,7 @@
         @Override
         public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
                 IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions)
-                        throws HyracksDataException {
+                throws HyracksDataException {
             return new UnionOperator();
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferenceEntry.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferenceEntry.java
index 8eb5c2e..4fa4fab 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferenceEntry.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferenceEntry.java
@@ -26,14 +26,17 @@
     private final int runid;
     private IFrameTupleAccessor acccessor;
     private int tupleIndex;
-    private int[] tPointers;
+    private final int[] tPointers;
+    private final int normalizedKeyLength;
 
     public ReferenceEntry(int runid, FrameTupleAccessor fta, int tupleIndex, int[] keyFields,
             INormalizedKeyComputer nmkComputer) {
         super();
         this.runid = runid;
         this.acccessor = fta;
-        this.tPointers = new int[1 + 2 * keyFields.length];
+        this.normalizedKeyLength =
+                nmkComputer != null ? nmkComputer.getNormalizedKeyProperties().getNormalizedKeyLength() : 0;
+        this.tPointers = new int[normalizedKeyLength + 2 * keyFields.length];
         if (fta != null) {
             initTPointer(fta, tupleIndex, keyFields, nmkComputer);
         }
@@ -59,10 +62,6 @@
         return tupleIndex;
     }
 
-    public int getNormalizedKey() {
-        return tPointers[0];
-    }
-
     public void setTupleIndex(int tupleIndex, int[] keyFields, INormalizedKeyComputer nmkComputer) {
         initTPointer(acccessor, tupleIndex, keyFields, nmkComputer);
     }
@@ -73,14 +72,11 @@
         byte[] b1 = fta.getBuffer().array();
         for (int f = 0; f < keyFields.length; ++f) {
             int fIdx = keyFields[f];
-            tPointers[2 * f + 1] = fta.getAbsoluteFieldStartOffset(tupleIndex, fIdx);
-            tPointers[2 * f + 2] = fta.getFieldLength(tupleIndex, fIdx);
-            if (f == 0) {
-                if (nmkComputer != null) {
-                    tPointers[0] = nmkComputer.normalize(b1, tPointers[1], tPointers[2]);
-                } else {
-                    tPointers[0] = 0;
-                }
+            tPointers[2 * f + normalizedKeyLength] = fta.getAbsoluteFieldStartOffset(tupleIndex, fIdx);
+            tPointers[2 * f + normalizedKeyLength + 1] = fta.getFieldLength(tupleIndex, fIdx);
+            if (f == 0 && nmkComputer != null) {
+                nmkComputer.normalize(b1, tPointers[normalizedKeyLength], tPointers[normalizedKeyLength + 1], tPointers,
+                        0);
             }
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferencedPriorityQueue.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferencedPriorityQueue.java
index cc6c2d9..2681fe6 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferencedPriorityQueue.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/main/java/org/apache/hyracks/dataflow/std/util/ReferencedPriorityQueue.java
@@ -113,7 +113,7 @@
                 ReferenceEntry tmp = entries[slot];
                 entries[slot] = curr;
                 curr = tmp;// winner to pass up
-            }// else curr wins
+            } // else curr wins
             slot >>= 1;
         }
         // set new entries[0]
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/AbstractTupleMemoryManagerTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/AbstractTupleMemoryManagerTest.java
index 11148a2..0e42397 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/AbstractTupleMemoryManagerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/AbstractTupleMemoryManagerTest.java
@@ -40,8 +40,8 @@
 import org.apache.hyracks.util.IntSerDeUtils;
 
 public abstract class AbstractTupleMemoryManagerTest {
-    ISerializerDeserializer[] fieldsSerDer = new ISerializerDeserializer[] {
-            IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer() };
+    ISerializerDeserializer[] fieldsSerDer = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+            new UTF8StringSerializerDeserializer() };
     RecordDescriptor recordDescriptor = new RecordDescriptor(fieldsSerDer);
     ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(recordDescriptor.getFieldCount());
     FrameTupleAccessor inFTA = new FrameTupleAccessor(recordDescriptor);
@@ -61,9 +61,7 @@
         assertEquals(map.size(), mapInserted.size());
     }
 
-    protected Map<Integer, Integer> prepareFixedSizeTuples(
-            int tuplePerFrame,
-            int extraMetaBytePerFrame,
+    protected Map<Integer, Integer> prepareFixedSizeTuples(int tuplePerFrame, int extraMetaBytePerFrame,
             int extraMetaBytePerRecord) throws HyracksDataException {
         Map<Integer, Integer> dataSet = new HashMap<>();
         ByteBuffer buffer = ByteBuffer.allocate(Common.BUDGET);
@@ -72,8 +70,7 @@
         appender.reset(frame, true);
 
         int sizePerTuple = (Common.MIN_FRAME_SIZE - 1 - tuplePerFrame * 4 - 4 - extraMetaBytePerFrame) / tuplePerFrame;
-        int sizeChar =
-                sizePerTuple - extraMetaBytePerRecord - fieldsSerDer.length * 4 - 4 - 2; //2byte to write str length
+        int sizeChar = sizePerTuple - extraMetaBytePerRecord - fieldsSerDer.length * 4 - 4 - 2; //2byte to write str length
         assert (sizeChar > 0);
         for (int i = 0; i < Common.NUM_MIN_FRAME * tuplePerFrame; i++) {
             tupleBuilder.reset();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/FrameFreeSlotBestFitUsingTreeMapTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/FrameFreeSlotBestFitUsingTreeMapTest.java
index 992c7f6..e5a4091 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/FrameFreeSlotBestFitUsingTreeMapTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/FrameFreeSlotBestFitUsingTreeMapTest.java
@@ -54,11 +54,10 @@
     }
 
     @Test
-    public void testReset(){
+    public void testReset() {
         testAll();
         policy.reset();
         testAll();
     }
 
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableFramesMemoryManagerTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableFramesMemoryManagerTest.java
index 9d4a9a1..21680eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableFramesMemoryManagerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableFramesMemoryManagerTest.java
@@ -157,12 +157,12 @@
             framesMemoryManager.getFrame(i, info);
             fta.reset(info.getBuffer(), info.getStartOffset(), info.getLength());
             for (int t = 0; t < fta.getTupleCount(); t++) {
-                int id = parseTuple(fta.getBuffer(), fta.getTupleStartOffset(t) + fta.getFieldSlotsLength() + fta
-                        .getFieldStartOffset(t, 0));
+                int id = parseTuple(fta.getBuffer(),
+                        fta.getTupleStartOffset(t) + fta.getFieldSlotsLength() + fta.getFieldStartOffset(t, 0));
                 //                System.out.println("frameid:" + i + ",tuple:" + t + ",has id:" + id + ",length:" +
                 //                        (fta.getTupleEndOffset(t) - fta.getTupleStartOffset(t) - fta.getFieldSlotsLength()));
-                assertTrue(tupleSet.remove(id) == fta.getTupleEndOffset(t) - fta.getTupleStartOffset(t) - fta
-                        .getFieldSlotsLength());
+                assertTrue(tupleSet.remove(id) == fta.getTupleEndOffset(t) - fta.getTupleStartOffset(t)
+                        - fta.getFieldSlotsLength());
             }
         }
         assertTrue(tupleSet.isEmpty());
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableTupleMemoryManagerTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableTupleMemoryManagerTest.java
index e2a231f..8cc6df3 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableTupleMemoryManagerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/buffermanager/VariableTupleMemoryManagerTest.java
@@ -155,8 +155,7 @@
     }
 
     private ByteBuffer deleteRandomSelectedTuples(Map<Integer, Integer> map, Map<TuplePointer, Integer> mapInserted,
-            int minNumOfRecordTobeDeleted)
-            throws HyracksDataException {
+            int minNumOfRecordTobeDeleted) throws HyracksDataException {
         ByteBuffer buffer = ByteBuffer.allocate(Common.BUDGET);
         FixedSizeFrame frame = new FixedSizeFrame(buffer);
         FrameTupleAppender appender = new FrameTupleAppender();
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppenderTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppenderTest.java
index 7686540..468f879 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppenderTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/sort/util/DeletableFrameTupleAppenderTest.java
@@ -39,10 +39,8 @@
 
 public class DeletableFrameTupleAppenderTest {
     DeletableFrameTupleAppender appender;
-    ISerializerDeserializer[] fields = new ISerializerDeserializer[] {
-            IntegerSerializerDeserializer.INSTANCE,
-            new UTF8StringSerializerDeserializer(),
-    };
+    ISerializerDeserializer[] fields = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+            new UTF8StringSerializerDeserializer(), };
     RecordDescriptor recordDescriptor = new RecordDescriptor(fields);
     ArrayTupleBuilder builder = new ArrayTupleBuilder(recordDescriptor.getFieldCount());
     static final char TEST_CH = 'x';
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MaxHeapTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MaxHeapTest.java
index 16b24c4..7e31956 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MaxHeapTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MaxHeapTest.java
@@ -97,7 +97,7 @@
             maxHeap.peekMax(peekI);
             maxHeap.getMax(maxI);
             assertTrue(peekI.compareTo(maxI) == 0);
-            assertEquals(  i++, capacity - 1 - maxI.i);
+            assertEquals(i++, capacity - 1 - maxI.i);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MinHeapTest.java b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MinHeapTest.java
index 1a5fba3..be10095 100644
--- a/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MinHeapTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-dataflow-std/src/test/java/org/apache/hyracks/dataflow/std/structures/MinHeapTest.java
@@ -25,7 +25,7 @@
 
 import org.junit.Test;
 
-public class MinHeapTest extends AbstracHeapTest{
+public class MinHeapTest extends AbstracHeapTest {
 
     @Test
     public void testInitialMinHeap() {
@@ -102,5 +102,4 @@
         }
     }
 
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-dist/pom.xml b/hyracks-fullstack/hyracks/hyracks-dist/pom.xml
index fc69f59..c5d8109 100644
--- a/hyracks-fullstack/hyracks/hyracks-dist/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-dist/pom.xml
@@ -38,7 +38,6 @@
   <name>hyracks-dist</name>
 
   <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <root.dir>${basedir}/../..</root.dir>
   </properties>
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/InsertPipelineExample.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/InsertPipelineExample.java
index 48377e3..8ac34d8 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/InsertPipelineExample.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/InsertPipelineExample.java
@@ -144,7 +144,8 @@
                                                         // B-Tree tuple, etc.
         IFileSplitProvider primarySplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.primaryBTreeName);
 
-        IIndexDataflowHelperFactory primaryHelperFactory = new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
+        IIndexDataflowHelperFactory primaryHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
 
         // create operator descriptor
         TreeIndexInsertUpdateDeleteOperatorDescriptor primaryInsert =
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexBulkLoadExample.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexBulkLoadExample.java
index 203d22c..2fb1cee 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexBulkLoadExample.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexBulkLoadExample.java
@@ -145,7 +145,8 @@
                                                  // to field 0 of B-Tree tuple,
                                                  // etc.
         IFileSplitProvider btreeSplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.btreeName);
-        IIndexDataflowHelperFactory dataflowHelperFactory = new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
+        IIndexDataflowHelperFactory dataflowHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
         TreeIndexBulkLoadOperatorDescriptor btreeBulkLoad = new TreeIndexBulkLoadOperatorDescriptor(spec, recDesc,
                 fieldPermutation, 0.7f, false, 1000L, true, dataflowHelperFactory);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexSearchExample.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexSearchExample.java
index 603dc6b..c32b72c 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexSearchExample.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/PrimaryIndexSearchExample.java
@@ -139,7 +139,8 @@
                                      // into search op
 
         IFileSplitProvider btreeSplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.btreeName);
-        IIndexDataflowHelperFactory dataflowHelperFactory = new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
+        IIndexDataflowHelperFactory dataflowHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
         BTreeSearchOperatorDescriptor btreeSearchOp = new BTreeSearchOperatorDescriptor(spec, recDesc, lowKeyFields,
                 highKeyFields, true, true, dataflowHelperFactory, false, false, null,
                 NoOpOperationCallbackFactory.INSTANCE, null, null, false);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexBulkLoadExample.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexBulkLoadExample.java
index 7507f10..a8bea08 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexBulkLoadExample.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexBulkLoadExample.java
@@ -117,7 +117,8 @@
 
         // use a disk-order scan to read primary index
         IFileSplitProvider primarySplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.primaryBTreeName);
-        IIndexDataflowHelperFactory primaryHelperFactory = new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
+        IIndexDataflowHelperFactory primaryHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
         TreeIndexDiskOrderScanOperatorDescriptor btreeScanOp = new TreeIndexDiskOrderScanOperatorDescriptor(spec,
                 recDesc, primaryHelperFactory, NoOpOperationCallbackFactory.INSTANCE);
         JobHelper.createPartitionConstraint(spec, btreeScanOp, splitNCs);
@@ -139,7 +140,8 @@
         // tuple
         int[] fieldPermutation = { 1, 0 };
         IFileSplitProvider btreeSplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.secondaryBTreeName);
-        IIndexDataflowHelperFactory secondaryHelperFactory = new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
+        IIndexDataflowHelperFactory secondaryHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, btreeSplitProvider);
         TreeIndexBulkLoadOperatorDescriptor btreeBulkLoad = new TreeIndexBulkLoadOperatorDescriptor(spec, null,
                 fieldPermutation, 0.7f, false, 1000L, true, secondaryHelperFactory);
         JobHelper.createPartitionConstraint(spec, btreeBulkLoad, splitNCs);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexSearchExample.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexSearchExample.java
index 1e909ef..ccf20fe 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexSearchExample.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreeclient/src/main/java/org/apache/hyracks/examples/btree/client/SecondaryIndexSearchExample.java
@@ -183,7 +183,8 @@
                                             // op
 
         IFileSplitProvider primarySplitProvider = JobHelper.createFileSplitProvider(splitNCs, options.primaryBTreeName);
-        IIndexDataflowHelperFactory primaryHelperFactory = new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
+        IIndexDataflowHelperFactory primaryHelperFactory =
+                new IndexDataflowHelperFactory(storageManager, primarySplitProvider);
         BTreeSearchOperatorDescriptor primarySearchOp = new BTreeSearchOperatorDescriptor(spec, primaryRecDesc,
                 primaryLowKeyFields, primaryHighKeyFields, true, true, primaryHelperFactory, false, false, null,
                 NoOpOperationCallbackFactory.INSTANCE, null, null, false);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/org/apache/hyracks/examples/btree/helper/TestNCApplication.java b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/org/apache/hyracks/examples/btree/helper/TestNCApplication.java
index 780a65c..15248e7 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/org/apache/hyracks/examples/btree/helper/TestNCApplication.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/org/apache/hyracks/examples/btree/helper/TestNCApplication.java
@@ -22,6 +22,7 @@
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.application.IServiceContext;
 import org.apache.hyracks.api.config.IConfigManager;
+import org.apache.hyracks.api.control.CcId;
 import org.apache.hyracks.api.io.IFileDeviceResolver;
 import org.apache.hyracks.api.job.resource.NodeCapacity;
 
@@ -45,7 +46,7 @@
     }
 
     @Override
-    public void onRegisterNode() throws Exception {
+    public void onRegisterNode(CcId ccs) throws Exception {
         // No-op
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
index d0f3d48..840c6dd 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/pom.xml
@@ -179,5 +179,9 @@
       <artifactId>hyracks-util</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/DataSetConstants.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/DataSetConstants.java
index d6775cc..db51ed2 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/DataSetConstants.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/btree/DataSetConstants.java
@@ -31,19 +31,17 @@
 
 public class DataSetConstants {
 
-    public static final RecordDescriptor inputRecordDesc = new RecordDescriptor(
-            new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+    public static final RecordDescriptor inputRecordDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    public static final IValueParserFactory[] inputParserFactories =
-            new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                    UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                    UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                    UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                    UTF8StringParserFactory.INSTANCE };
+    public static final IValueParserFactory[] inputParserFactories = new IValueParserFactory[] {
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE };
 
     // field, type and key declarations for primary index
     public static int[] primaryFieldPermutation = { 0, 1, 2, 4, 5, 7 };
@@ -54,10 +52,9 @@
     public static final IBinaryComparatorFactory[] filterCmpFactories =
             new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
 
-    public static final ITypeTraits[] primaryTypeTraits =
-            new ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS,
-                    UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS,
-                    UTF8StringPointable.TYPE_TRAITS };
+    public static final ITypeTraits[] primaryTypeTraits = new ITypeTraits[] { UTF8StringPointable.TYPE_TRAITS,
+            UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS,
+            UTF8StringPointable.TYPE_TRAITS, UTF8StringPointable.TYPE_TRAITS };
 
     public static final IBinaryComparatorFactory[] primaryComparatorFactories =
             new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
@@ -65,18 +62,16 @@
 
     public static final int[] primaryBloomFilterKeyFields = new int[] { 0 };
 
-    public static final RecordDescriptor primaryRecDesc = new RecordDescriptor(
-            new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer() });
+    public static final RecordDescriptor primaryRecDesc = new RecordDescriptor(new ISerializerDeserializer[] {
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    public static final RecordDescriptor primaryAndFilterRecDesc = new RecordDescriptor(
-            new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer() });
+    public static final RecordDescriptor primaryAndFilterRecDesc = new RecordDescriptor(new ISerializerDeserializer[] {
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
     // field, type and key declarations for secondary indexes
 
@@ -94,11 +89,10 @@
             new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
                     PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
 
-    public static final RecordDescriptor secondaryRecDesc = new RecordDescriptor(
-            new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
-                    new UTF8StringSerializerDeserializer() });
-    public static final RecordDescriptor secondaryWithFilterRecDesc = new RecordDescriptor(
-            new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+    public static final RecordDescriptor secondaryRecDesc = new RecordDescriptor(new ISerializerDeserializer[] {
+            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
+    public static final RecordDescriptor secondaryWithFilterRecDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                     new UTF8StringSerializerDeserializer() });
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesOperatorTestHelper.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesOperatorTestHelper.java
index d230f38..5b091a2 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesOperatorTestHelper.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesOperatorTestHelper.java
@@ -39,7 +39,6 @@
     public static final boolean IS_POINT_MBR = false;
     public static final boolean DURABLE = true;
 
-
     public LSMRTreeWithAntiMatterTuplesOperatorTestHelper(IOManager ioManager) {
         super(ioManager);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/comm/SerializationDeserializationTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/comm/SerializationDeserializationTest.java
index 8696f8b..1bb58b8 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/comm/SerializationDeserializationTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/comm/SerializationDeserializationTest.java
@@ -24,8 +24,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameReader;
@@ -44,12 +42,14 @@
 import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
 import org.apache.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
 import org.apache.hyracks.test.support.TestUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 public class SerializationDeserializationTest {
-    private static final Logger LOGGER = Logger.getLogger(SerializationDeserializationTest.class.getName());
-    private static final String DBLP_FILE = "data" + File.separator + "device1" + File.separator + "data"
-            + File.separator + "dblp.txt";
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final String DBLP_FILE =
+            "data" + File.separator + "device1" + File.separator + "data" + File.separator + "dblp.txt";
 
     private static class SerDeserRunner {
         private final IHyracksTaskContext ctx;
@@ -139,7 +139,7 @@
         reader.open();
         Object[] arr;
         while ((arr = reader.readData()) != null) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(arr[0] + " " + arr[1]);
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractIntegrationTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractIntegrationTest.java
index 82fd737..0931501 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractIntegrationTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractIntegrationTest.java
@@ -30,8 +30,6 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.hyracks.api.client.HyracksConnection;
@@ -55,12 +53,14 @@
 import org.apache.hyracks.control.nc.resources.memory.FrameManager;
 import org.apache.hyracks.dataflow.common.comm.io.ResultFrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.util.ByteBufferInputStream;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 
 public abstract class AbstractIntegrationTest {
-    private static final Logger LOGGER = Logger.getLogger(AbstractIntegrationTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public static final String NC1_ID = "nc1";
     public static final String NC2_ID = "nc2";
@@ -106,7 +106,7 @@
         ncConfig1.setClusterListenAddress("127.0.0.1");
         ncConfig1.setDataListenAddress("127.0.0.1");
         ncConfig1.setResultListenAddress("127.0.0.1");
-        ncConfig1.setIODevices(new String [] { joinPath(System.getProperty("user.dir"), "target", "data", "device0") });
+        ncConfig1.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device0") });
         nc1 = new NodeControllerService(ncConfig1);
         nc1.start();
 
@@ -116,12 +116,12 @@
         ncConfig2.setClusterListenAddress("127.0.0.1");
         ncConfig2.setDataListenAddress("127.0.0.1");
         ncConfig2.setResultListenAddress("127.0.0.1");
-        ncConfig2.setIODevices(new String [] { joinPath(System.getProperty("user.dir"), "target", "data", "device1") });
+        ncConfig2.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device1") });
         nc2 = new NodeControllerService(ncConfig2);
         nc2.start();
 
         hcc = new HyracksConnection(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort());
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Starting CC in " + ccRoot.getAbsolutePath());
         }
     }
@@ -134,11 +134,11 @@
     }
 
     protected JobId executeTest(JobSpecification spec) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(spec.toJSON().asText());
         }
         JobId jobId = hcc.startJob(spec, EnumSet.of(JobFlag.PROFILE_RUNTIME));
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(jobId.toString());
         }
         return jobId;
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractMultiNCIntegrationTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractMultiNCIntegrationTest.java
index cc46a7d..58da8a2 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractMultiNCIntegrationTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AbstractMultiNCIntegrationTest.java
@@ -23,8 +23,6 @@
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.hyracks.api.client.HyracksConnection;
@@ -50,6 +48,8 @@
 import org.apache.hyracks.control.nc.resources.memory.FrameManager;
 import org.apache.hyracks.dataflow.common.comm.io.ResultFrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.util.ByteBufferInputStream;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
@@ -58,7 +58,7 @@
 
 public abstract class AbstractMultiNCIntegrationTest {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractMultiNCIntegrationTest.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final TestJobLifecycleListener jobLifecycleListener = new TestJobLifecycleListener();
 
     public static final String[] ASTERIX_IDS =
@@ -113,7 +113,7 @@
         }
 
         hcc = new HyracksConnection(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort());
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Starting CC in " + ccRoot.getAbsolutePath());
         }
     }
@@ -143,12 +143,12 @@
         hcc.cancelJob(jobId);
     }
 
-    protected void runTest(JobSpecification spec, String expectedErrorMessage) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+    protected JobId runTest(JobSpecification spec, String expectedErrorMessage) throws Exception {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(spec.toJSON().asText());
         }
         JobId jobId = hcc.startJob(spec, EnumSet.of(JobFlag.PROFILE_RUNTIME));
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(jobId.toString());
         }
 
@@ -195,6 +195,7 @@
         // Waiting a second time should lead to the same behavior
         waitForCompletion(jobId, expectedErrorMessage);
         dumpOutputFiles();
+        return jobId;
     }
 
     protected void waitForCompletion(JobId jobId, String expectedErrorMessage) throws Exception {
@@ -218,7 +219,7 @@
     }
 
     private void dumpOutputFiles() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             for (File f : outputFiles) {
                 if (f.exists() && f.isFile()) {
                     try {
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AggregationTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AggregationTest.java
index f169054..752c643 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AggregationTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/AggregationTest.java
@@ -73,9 +73,8 @@
  */
 public class AggregationTest extends AbstractIntegrationTest {
 
-    final IFileSplitProvider splitProvider = new ConstantFileSplitProvider(
-            new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.002" + File.separator
-                    + "lineitem.tbl") });
+    final IFileSplitProvider splitProvider = new ConstantFileSplitProvider(new FileSplit[] {
+            new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.002" + File.separator + "lineitem.tbl") });
 
     final RecordDescriptor desc = new RecordDescriptor(new ISerializerDeserializer[] {
             new UTF8StringSerializerDeserializer(), IntegerSerializerDeserializer.INSTANCE,
@@ -100,7 +99,7 @@
 
         ResultSetId rsId = new ResultSetId(1);
         AbstractSingleActivityOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         return printer;
@@ -110,8 +109,8 @@
     public void singleKeySumPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -150,8 +149,8 @@
     public void singleKeySumExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -164,18 +163,19 @@
         int tableSize = 8;
         long fileSize = frameLimits * spec.getFrameSize();
 
-        ExternalGroupOperatorDescriptor grouper = new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize,
-                keyFields, frameLimits,
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                new UTF8StringNormalizedKeyComputerFactory(),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
-                        new FloatSumFieldAggregatorFactory(5, false) }),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
-                        new FloatSumFieldAggregatorFactory(3, false) }),
-                outputRec, outputRec, new HashSpillableTableFactory(
-                        new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
+        ExternalGroupOperatorDescriptor grouper =
+                new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize, keyFields, frameLimits,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        new UTF8StringNormalizedKeyComputerFactory(),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
+                                new FloatSumFieldAggregatorFactory(5, false) }),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
+                                new FloatSumFieldAggregatorFactory(3, false) }),
+                        outputRec, outputRec, new HashSpillableTableFactory(
+                                new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, grouper, NC2_ID, NC1_ID);
 
@@ -199,8 +199,8 @@
     public void singleKeyAvgPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -239,8 +239,8 @@
     public void singleKeyAvgExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -253,18 +253,19 @@
         int tableSize = 8;
         long fileSize = frameLimits * spec.getFrameSize();
 
-        ExternalGroupOperatorDescriptor grouper = new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize,
-                keyFields, frameLimits,
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                new UTF8StringNormalizedKeyComputerFactory(),
-                new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
-                                new CountFieldAggregatorFactory(false), new AvgFieldGroupAggregatorFactory(1, false) }),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
-                        new AvgFieldMergeAggregatorFactory(3, false) }),
-                outputRec, outputRec, new HashSpillableTableFactory(
-                        new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
+        ExternalGroupOperatorDescriptor grouper =
+                new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize, keyFields, frameLimits,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        new UTF8StringNormalizedKeyComputerFactory(),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new CountFieldAggregatorFactory(false),
+                                new AvgFieldGroupAggregatorFactory(1, false) }),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
+                                new AvgFieldMergeAggregatorFactory(3, false) }),
+                        outputRec, outputRec, new HashSpillableTableFactory(
+                                new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, grouper, NC2_ID, NC1_ID);
 
@@ -288,13 +289,13 @@
     public void singleKeyMinMaxStringPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
-        RecordDescriptor outputRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor outputRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer() });
 
         int[] keyFields = new int[] { 0 };
@@ -328,13 +329,13 @@
     public void singleKeyMinMaxStringExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
-        RecordDescriptor outputRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor outputRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer() });
 
         int[] keyFields = new int[] { 0 };
@@ -342,18 +343,19 @@
         int tableSize = 8;
         long fileSize = frameLimits * spec.getFrameSize();
 
-        ExternalGroupOperatorDescriptor grouper = new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize,
-                keyFields, frameLimits,
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                new UTF8StringNormalizedKeyComputerFactory(),
-                new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
-                                new MinMaxStringFieldAggregatorFactory(15, true, true) }),
-                new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
-                                new MinMaxStringFieldAggregatorFactory(2, true, true) }),
-                outputRec, outputRec, new HashSpillableTableFactory(
-                        new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
+        ExternalGroupOperatorDescriptor grouper =
+                new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize, keyFields, frameLimits,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        new UTF8StringNormalizedKeyComputerFactory(),
+                        new MultiFieldsAggregatorFactory(
+                                new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
+                                        new MinMaxStringFieldAggregatorFactory(15, true, true) }),
+                        new MultiFieldsAggregatorFactory(
+                                new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
+                                        new MinMaxStringFieldAggregatorFactory(2, true, true) }),
+                        outputRec, outputRec, new HashSpillableTableFactory(
+                                new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, grouper, NC2_ID, NC1_ID);
 
@@ -377,8 +379,8 @@
     public void multiKeySumPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -419,8 +421,8 @@
     public void multiKeySumExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -469,13 +471,13 @@
     public void multiKeyAvgPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
-        RecordDescriptor outputRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor outputRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), IntegerSerializerDeserializer.INSTANCE,
                         IntegerSerializerDeserializer.INSTANCE, FloatSerializerDeserializer.INSTANCE });
 
@@ -513,13 +515,13 @@
     public void multiKeyAvgExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
-        RecordDescriptor outputRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor outputRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), IntegerSerializerDeserializer.INSTANCE,
                         IntegerSerializerDeserializer.INSTANCE, FloatSerializerDeserializer.INSTANCE });
 
@@ -566,8 +568,8 @@
     public void multiKeyMinMaxStringPreClusterGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
@@ -609,8 +611,8 @@
     public void multiKeyMinMaxStringExtGroupTest() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory,
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, tupleParserFactory, desc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CancelJobTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CancelJobTest.java
index 7eba9e7..ec3b8f1 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CancelJobTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CancelJobTest.java
@@ -230,8 +230,8 @@
         FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(ASTERIX_IDS[0],
                 "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor recordDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor recordDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CountOfCountsTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CountOfCountsTest.java
index b5c6238..c28a5aa 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CountOfCountsTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/CountOfCountsTest.java
@@ -64,14 +64,12 @@
 
         FileSplit[] splits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt") };
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(splits);
-        RecordDescriptor desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter = new InMemorySortOperatorDescriptor(spec, new int[] { 0 },
@@ -84,11 +82,13 @@
         PreclusteredGroupOperatorDescriptor group = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 0 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc2);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter2 = new InMemorySortOperatorDescriptor(spec, new int[] { 1 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) }, desc2);
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter2, NC2_ID);
 
         RecordDescriptor desc3 = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -96,28 +96,27 @@
         PreclusteredGroupOperatorDescriptor group2 = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 1 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc3);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc3);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group2, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC2_ID);
 
         IConnectorDescriptor conn1 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn1, csvScanner, 0, sorter, 0);
 
         IConnectorDescriptor conn2 = new OneToOneConnectorDescriptor(spec);
         spec.connect(conn2, sorter, 0, group, 0);
 
         IConnectorDescriptor conn3 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 1 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 1 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn3, group, 0, sorter2, 0);
 
         IConnectorDescriptor conn4 = new OneToOneConnectorDescriptor(spec);
@@ -136,14 +135,12 @@
 
         FileSplit[] splits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt") };
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(splits);
-        RecordDescriptor desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter = new InMemorySortOperatorDescriptor(spec, new int[] { 0 },
@@ -156,11 +153,13 @@
         PreclusteredGroupOperatorDescriptor group = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 0 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc2);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group, NC1_ID, NC2_ID, NC1_ID, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter2 = new InMemorySortOperatorDescriptor(spec, new int[] { 1 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) }, desc2);
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter2, NC1_ID, NC2_ID);
 
         RecordDescriptor desc3 = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -168,29 +167,28 @@
         PreclusteredGroupOperatorDescriptor group2 = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 1 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc3);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc3);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group2, NC1_ID, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor conn1 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn1, csvScanner, 0, sorter, 0);
 
         IConnectorDescriptor conn2 = new OneToOneConnectorDescriptor(spec);
         spec.connect(conn2, sorter, 0, group, 0);
 
         IConnectorDescriptor conn3 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 1 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 1 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn3, group, 0, sorter2, 0);
 
         IConnectorDescriptor conn4 = new OneToOneConnectorDescriptor(spec);
@@ -209,14 +207,12 @@
 
         FileSplit[] splits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt") };
         IFileSplitProvider splitProvider = new ConstantFileSplitProvider(splits);
-        RecordDescriptor desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID);
 
         ExternalSortOperatorDescriptor sorter = new ExternalSortOperatorDescriptor(spec, 3, new int[] { 0 },
@@ -229,11 +225,13 @@
         PreclusteredGroupOperatorDescriptor group = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 0 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc2);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group, NC1_ID, NC2_ID, NC1_ID, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter2 = new InMemorySortOperatorDescriptor(spec, new int[] { 1 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) }, desc2);
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
+                desc2);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter2, NC1_ID, NC2_ID);
 
         RecordDescriptor desc3 = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -241,29 +239,28 @@
         PreclusteredGroupOperatorDescriptor group2 = new PreclusteredGroupOperatorDescriptor(spec, new int[] { 1 },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) },
                 new MultiFieldsAggregatorFactory(
-                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }), desc3);
+                        new IFieldAggregateDescriptorFactory[] { new CountFieldAggregatorFactory(true) }),
+                desc3);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, group2, NC1_ID, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor conn1 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn1, csvScanner, 0, sorter, 0);
 
         IConnectorDescriptor conn2 = new OneToOneConnectorDescriptor(spec);
         spec.connect(conn2, sorter, 0, group, 0);
 
         IConnectorDescriptor conn3 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 1 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 1 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn3, group, 0, sorter2, 0);
 
         IConnectorDescriptor conn4 = new OneToOneConnectorDescriptor(spec);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/DeployedJobSpecsTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/DeployedJobSpecsTest.java
new file mode 100644
index 0000000..40b6b27
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/DeployedJobSpecsTest.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.tests.integration;
+
+import static org.apache.hyracks.util.file.FileUtil.joinPath;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.verify;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.hyracks.api.client.HyracksConnection;
+import org.apache.hyracks.api.client.IHyracksClientConnection;
+import org.apache.hyracks.api.job.DeployedJobSpecId;
+import org.apache.hyracks.api.job.JobId;
+import org.apache.hyracks.api.job.JobSpecification;
+import org.apache.hyracks.control.cc.ClusterControllerService;
+import org.apache.hyracks.control.cc.cluster.INodeManager;
+import org.apache.hyracks.control.cc.cluster.NodeManager;
+import org.apache.hyracks.control.common.controllers.CCConfig;
+import org.apache.hyracks.control.common.controllers.NCConfig;
+import org.apache.hyracks.control.nc.NodeControllerService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class DeployedJobSpecsTest {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private static final String NC1_ID = "nc1";
+    private static final String NC2_ID = "nc2";
+    private static final int TIME_THRESHOLD = 5000;
+
+    private static ClusterControllerService cc;
+    private static NodeControllerService nc1;
+    private static NodeControllerService nc2;
+    private static IHyracksClientConnection hcc;
+
+    @BeforeClass
+    public static void init() throws Exception {
+        CCConfig ccConfig = new CCConfig();
+        ccConfig.setClientListenAddress("127.0.0.1");
+        ccConfig.setClientListenPort(39000);
+        ccConfig.setClusterListenAddress("127.0.0.1");
+        ccConfig.setClusterListenPort(39001);
+        ccConfig.setProfileDumpPeriod(10000);
+        FileUtils.deleteQuietly(new File(joinPath("target", "data")));
+        FileUtils.copyDirectory(new File("data"), new File(joinPath("target", "data")));
+        File outDir = new File("target" + File.separator + "ClusterController");
+        outDir.mkdirs();
+        File ccRoot = File.createTempFile(AbstractIntegrationTest.class.getName(), ".data", outDir);
+        ccRoot.delete();
+        ccRoot.mkdir();
+        ccConfig.setRootDir(ccRoot.getAbsolutePath());
+        ClusterControllerService ccBase = new ClusterControllerService(ccConfig);
+        // The spying below is dangerous since it replaces the ClusterControllerService already referenced by many
+        // objects created in the constructor above
+        cc = Mockito.spy(ccBase);
+        cc.start();
+
+        // The following code partially fixes the problem created by the spying
+        INodeManager nodeManager = cc.getNodeManager();
+        Field ccsInNodeManager = NodeManager.class.getDeclaredField("ccs");
+        ccsInNodeManager.setAccessible(true);
+        ccsInNodeManager.set(nodeManager, cc);
+
+        NCConfig ncConfig1 = new NCConfig(NC1_ID);
+        ncConfig1.setClusterAddress("localhost");
+        ncConfig1.setClusterPort(39001);
+        ncConfig1.setClusterListenAddress("127.0.0.1");
+        ncConfig1.setDataListenAddress("127.0.0.1");
+        ncConfig1.setResultListenAddress("127.0.0.1");
+        ncConfig1.setResultSweepThreshold(TIME_THRESHOLD);
+        ncConfig1.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device0") });
+        NodeControllerService nc1Base = new NodeControllerService(ncConfig1);
+        nc1 = Mockito.spy(nc1Base);
+        nc1.start();
+
+        NCConfig ncConfig2 = new NCConfig(NC2_ID);
+        ncConfig2.setClusterAddress("localhost");
+        ncConfig2.setClusterPort(39001);
+        ncConfig2.setClusterListenAddress("127.0.0.1");
+        ncConfig2.setDataListenAddress("127.0.0.1");
+        ncConfig2.setResultListenAddress("127.0.0.1");
+        ncConfig2.setResultSweepThreshold(TIME_THRESHOLD);
+        ncConfig2.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device1") });
+        NodeControllerService nc2Base = new NodeControllerService(ncConfig2);
+        nc2 = Mockito.spy(nc2Base);
+        nc2.start();
+
+        hcc = new HyracksConnection(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort());
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Starting CC in " + ccRoot.getAbsolutePath());
+        }
+    }
+
+    @Test
+    public void DistributedTest() throws Exception {
+        JobSpecification spec1 = UnionTest.createUnionJobSpec();
+        JobSpecification spec2 = HeapSortMergeTest.createSortMergeJobSpec();
+
+        //distribute both jobs
+        DeployedJobSpecId distributedId1 = hcc.deployJobSpec(spec1);
+        DeployedJobSpecId distributedId2 = hcc.deployJobSpec(spec2);
+
+        //make sure it finished
+        //cc will get the store once to check for duplicate insertion and once to insert per job
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(4)).getDeployedJobSpecStore();
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(2)).storeActivityClusterGraph(any(), any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(2)).storeActivityClusterGraph(any(), any());
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(2)).checkForDuplicateDeployedJobSpec(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(2)).checkForDuplicateDeployedJobSpec(any());
+
+        //confirm that both jobs are distributed
+        Assert.assertTrue(nc1.getActivityClusterGraph(distributedId1) != null
+                && nc2.getActivityClusterGraph(distributedId1) != null);
+        Assert.assertTrue(nc1.getActivityClusterGraph(distributedId2) != null
+                && nc2.getActivityClusterGraph(distributedId2) != null);
+        Assert.assertTrue(cc.getDeployedJobSpecStore().getDeployedJobSpecDescriptor(distributedId1) != null);
+        Assert.assertTrue(cc.getDeployedJobSpecStore().getDeployedJobSpecDescriptor(distributedId2) != null);
+
+        //run the first job
+        JobId jobRunId1 = hcc.startJob(distributedId1, new HashMap<>());
+        hcc.waitForCompletion(jobRunId1);
+
+        //Make sure the job parameter map was removed
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(1)).removeJobParameterByteStore(any());
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(1)).removeJobParameterByteStore(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(1)).removeJobParameterByteStore(any());
+
+        //destroy the first job
+        hcc.undeployJobSpec(distributedId1);
+
+        //make sure it finished
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(8)).getDeployedJobSpecStore();
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(1)).removeActivityClusterGraph(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(1)).removeActivityClusterGraph(any());
+
+        //confirm the first job is destroyed
+        Assert.assertTrue(nc1.getActivityClusterGraph(distributedId1) == null
+                && nc2.getActivityClusterGraph(distributedId1) == null);
+        cc.getDeployedJobSpecStore().checkForExistingDeployedJobSpecDescriptor(distributedId1);
+
+        //run the second job
+        JobId jobRunId2 = hcc.startJob(distributedId2, new HashMap<>());
+        hcc.waitForCompletion(jobRunId2);
+
+        //Make sure the job parameter map was removed
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(2)).removeJobParameterByteStore(any());
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(2)).removeJobParameterByteStore(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(2)).removeJobParameterByteStore(any());
+
+        //run the second job again
+        JobId jobRunId3 = hcc.startJob(distributedId2, new HashMap<>());
+        hcc.waitForCompletion(jobRunId3);
+
+        //Make sure the job parameter map was removed
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(3)).removeJobParameterByteStore(any());
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(3)).removeJobParameterByteStore(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(3)).removeJobParameterByteStore(any());
+
+        //destroy the second job
+        hcc.undeployJobSpec(distributedId2);
+
+        //make sure it finished
+        verify(cc, Mockito.timeout(TIME_THRESHOLD).times(12)).getDeployedJobSpecStore();
+        verify(nc1, Mockito.timeout(TIME_THRESHOLD).times(2)).removeActivityClusterGraph(any());
+        verify(nc2, Mockito.timeout(TIME_THRESHOLD).times(2)).removeActivityClusterGraph(any());
+
+        //confirm the second job is destroyed
+        Assert.assertTrue(nc1.getActivityClusterGraph(distributedId2) == null
+                && nc2.getActivityClusterGraph(distributedId2) == null);
+        cc.getDeployedJobSpecStore().checkForExistingDeployedJobSpecDescriptor(distributedId2);
+
+        //run the second job 100 times in parallel
+        distributedId2 = hcc.deployJobSpec(spec2);
+        for (int i = 0; i < 100; i++) {
+            hcc.startJob(distributedId2, new HashMap<>());
+        }
+    }
+
+    @AfterClass
+    public static void deinit() throws Exception {
+        nc2.stop();
+        nc1.stop();
+        cc.stop();
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/HeapSortMergeTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/HeapSortMergeTest.java
index 160336a..9e795bf 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/HeapSortMergeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/HeapSortMergeTest.java
@@ -24,6 +24,7 @@
 import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.IBinaryHashFunctionFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.dataset.ResultSetId;
@@ -58,31 +59,35 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
         int outputLimit = 5; // larger than the total record numbers.
-        TopKSorterOperatorDescriptor sorter = new TopKSorterOperatorDescriptor(spec, 4,
-                outputLimit, new int[] { 1, 0 }, null, new IBinaryComparatorFactory[] {
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) }, ordersDesc);
+        TopKSorterOperatorDescriptor sorter =
+                new TopKSorterOperatorDescriptor(spec, 4, outputLimit, new int[] { 1, 0 },
+                        (INormalizedKeyComputerFactory) null,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        ordersDesc);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, NC1_ID, NC2_ID);
 
@@ -90,23 +95,21 @@
         spec.addResultSetId(rsId);
 
         FileSplit fs = createFile(nc1);
-        IFileSplitProvider outputSplitProvider = new ConstantFileSplitProvider(
-                new FileSplit[] { fs });
+        IFileSplitProvider outputSplitProvider = new ConstantFileSplitProvider(new FileSplit[] { fs });
         IOperatorDescriptor printer = new PlainFileWriterOperatorDescriptor(spec, outputSplitProvider, "|");
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), ordScanner, 0, sorter, 0);
 
-        spec.connect(
-                new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(new int[] {
-                        1, 0 }, new IBinaryHashFunctionFactory[] {
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }), new int[] { 1, 0 },
-                        new IBinaryComparatorFactory[] {
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                        new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
+        spec.connect(new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(
+                new int[] { 1, 0 },
+                new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }),
+                new int[] { 1, 0 },
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
 
         runTest(spec);
         System.out.println("Result write into :" + fs.getPath() + " in node: " + fs.getNodeName());
@@ -122,31 +125,35 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
         int outputLimit = 20;
-        TopKSorterOperatorDescriptor sorter = new TopKSorterOperatorDescriptor(spec, 4,
-                outputLimit, new int[] { 1, 0 }, null, new IBinaryComparatorFactory[] {
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) }, ordersDesc);
+        TopKSorterOperatorDescriptor sorter =
+                new TopKSorterOperatorDescriptor(spec, 4, outputLimit, new int[] { 1, 0 },
+                        (INormalizedKeyComputerFactory) null,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, NC1_ID, NC2_ID);
 
         LimitOperatorDescriptor filter = new LimitOperatorDescriptor(spec, ordersDesc, outputLimit);
@@ -156,7 +163,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), ordScanner, 0, sorter, 0);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobFailureTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobFailureTest.java
index 34b1480..2aeab81 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobFailureTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/JobFailureTest.java
@@ -26,6 +26,7 @@
 import org.apache.hyracks.dataflow.std.connectors.OneToOneConnectorDescriptor;
 import org.apache.hyracks.dataflow.std.misc.SinkOperatorDescriptor;
 import org.apache.hyracks.tests.util.ExceptionOnCreatePushRuntimeOperatorDescriptor;
+import org.apache.hyracks.tests.util.FailOnInitializeDeInitializeOperatorDescriptor;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -33,10 +34,13 @@
 
     @Test
     public void failureOnCreatePushRuntime() throws Exception {
-        JobId jobId = new JobId(0); // First job
+        JobId jobId = null;
         for (int i = 0; i < 20; i++) {
-            execTest();
+            JobSpecification spec = new JobSpecification();
+            JobId runJobId = runTest(spec,
+                    new ExceptionOnCreatePushRuntimeOperatorDescriptor(spec, 0, 1, new int[] { 4 }, true));
             if (i == 0) {
+                jobId = runJobId;
                 // passes. read from job archive
                 waitForCompletion(jobId, ExceptionOnCreatePushRuntimeOperatorDescriptor.ERROR_MESSAGE);
             }
@@ -44,22 +48,59 @@
         // passes. read from job history
         waitForCompletion(jobId, ExceptionOnCreatePushRuntimeOperatorDescriptor.ERROR_MESSAGE);
         for (int i = 0; i < 300; i++) {
-            execTest();
+            JobSpecification spec = new JobSpecification();
+            runTest(spec, new ExceptionOnCreatePushRuntimeOperatorDescriptor(spec, 0, 1, new int[] { 4 }, true));
         }
         // passes. history has been cleared
         waitForCompletion(jobId, "has been cleared from job history");
     }
 
     @Test
-    public void waitForNonExistingJob() throws Exception {
-        JobId jobId = new JobId(Long.MAX_VALUE);
-        waitForCompletion(jobId, "has not been created yet");
+    public void failureOnInit() throws Exception {
+        JobSpecification spec = new JobSpecification();
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, true, false),
+                FailOnInitializeDeInitializeOperatorDescriptor.INIT_ERROR_MESSAGE);
+        // Ensure you can run the next job
+        spec = new JobSpecification();
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, false, false), null);
     }
 
-    private void execTest() throws Exception {
+    @Test
+    public void failureOnDeinit() throws Exception {
         JobSpecification spec = new JobSpecification();
-        AbstractSingleActivityOperatorDescriptor sourceOpDesc =
-                new ExceptionOnCreatePushRuntimeOperatorDescriptor(spec, 0, 1, new int[] { 4 }, true);
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, false, true),
+                FailOnInitializeDeInitializeOperatorDescriptor.DEINIT_ERROR_MESSAGE);
+        // Ensure you can run the next job
+        spec = new JobSpecification();
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, false, false), null);
+    }
+
+    @Test
+    public void failureOnInitDeinit() throws Exception {
+        JobSpecification spec = new JobSpecification();
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, true, true),
+                FailOnInitializeDeInitializeOperatorDescriptor.INIT_ERROR_MESSAGE);
+        // Ensure you can run the next job
+        spec = new JobSpecification();
+        connectToSinkAndRun(spec, new FailOnInitializeDeInitializeOperatorDescriptor(spec, false, false), null);
+    }
+
+    private JobId runTest(JobSpecification spec, AbstractSingleActivityOperatorDescriptor sourceOpDesc)
+            throws Exception {
+        try {
+            return connectToSinkAndRun(spec, sourceOpDesc,
+                    ExceptionOnCreatePushRuntimeOperatorDescriptor.ERROR_MESSAGE);
+        } finally {
+            Assert.assertTrue(
+                    ExceptionOnCreatePushRuntimeOperatorDescriptor.stats()
+                            + ExceptionOnCreatePushRuntimeOperatorDescriptor.succeed(),
+                    ExceptionOnCreatePushRuntimeOperatorDescriptor.succeed());
+            // should also check the content of the different ncs
+        }
+    }
+
+    private JobId connectToSinkAndRun(JobSpecification spec, AbstractSingleActivityOperatorDescriptor sourceOpDesc,
+            String expectedError) throws Exception {
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sourceOpDesc, ASTERIX_IDS);
         SinkOperatorDescriptor sinkOpDesc = new SinkOperatorDescriptor(spec, 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sinkOpDesc, ASTERIX_IDS);
@@ -67,15 +108,10 @@
         spec.connect(conn, sourceOpDesc, 0, sinkOpDesc, 0);
         spec.addRoot(sinkOpDesc);
         try {
-            runTest(spec, ExceptionOnCreatePushRuntimeOperatorDescriptor.ERROR_MESSAGE);
+            return runTest(spec, expectedError);
         } catch (Exception e) {
             e.printStackTrace();
             throw e;
         }
-        Assert.assertTrue(
-                ExceptionOnCreatePushRuntimeOperatorDescriptor.stats()
-                        + ExceptionOnCreatePushRuntimeOperatorDescriptor.succeed(),
-                ExceptionOnCreatePushRuntimeOperatorDescriptor.succeed());
-        // should also check the content of the different ncs
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/LocalityAwareConnectorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/LocalityAwareConnectorTest.java
index 67642f4..49dee84 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/LocalityAwareConnectorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/LocalityAwareConnectorTest.java
@@ -125,18 +125,20 @@
         int[] keyFields = new int[] { 0 };
         int tableSize = 8;
 
-        ExternalGroupOperatorDescriptor grouper = new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize,
-                keyFields, fileSize / spec.getFrameSize() + 1,
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                new UTF8StringNormalizedKeyComputerFactory(),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
-                        new FloatSumFieldAggregatorFactory(5, false) }),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
-                        new FloatSumFieldAggregatorFactory(3, false) }),
-                outputRec, outputRec, new HashSpillableTableFactory(
-                        new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
+        ExternalGroupOperatorDescriptor grouper =
+                new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize, keyFields,
+                        fileSize / spec.getFrameSize() + 1,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        new UTF8StringNormalizedKeyComputerFactory(),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
+                                new FloatSumFieldAggregatorFactory(5, false) }),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
+                                new FloatSumFieldAggregatorFactory(3, false) }),
+                        outputRec, outputRec, new HashSpillableTableFactory(
+                                new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, grouper, "asterix-005", "asterix-006");
 
@@ -190,18 +192,20 @@
         int[] keyFields = new int[] { 0 };
         int tableSize = 8;
 
-        ExternalGroupOperatorDescriptor grouper = new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize,
-                keyFields, fileSize / spec.getFrameSize() + 1,
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                new UTF8StringNormalizedKeyComputerFactory(),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
-                        new FloatSumFieldAggregatorFactory(5, false) }),
-                new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
-                        new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
-                        new FloatSumFieldAggregatorFactory(3, false) }),
-                outputRec, outputRec, new HashSpillableTableFactory(
-                        new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
+        ExternalGroupOperatorDescriptor grouper =
+                new ExternalGroupOperatorDescriptor(spec, tableSize, fileSize, keyFields,
+                        fileSize / spec.getFrameSize() + 1,
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        new UTF8StringNormalizedKeyComputerFactory(),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(3, false),
+                                new FloatSumFieldAggregatorFactory(5, false) }),
+                        new MultiFieldsAggregatorFactory(new IFieldAggregateDescriptorFactory[] {
+                                new IntSumFieldAggregatorFactory(1, false), new IntSumFieldAggregatorFactory(2, false),
+                                new FloatSumFieldAggregatorFactory(3, false) }),
+                        outputRec, outputRec, new HashSpillableTableFactory(
+                                new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE }));
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, grouper, "asterix-005", "asterix-006");
 
@@ -229,7 +233,7 @@
 
         ResultSetId rsId = new ResultSetId(1);
         AbstractSingleActivityOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         return printer;
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/PredistributedJobsTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/PredistributedJobsTest.java
deleted file mode 100644
index caba5f6..0000000
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/PredistributedJobsTest.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.tests.integration;
-
-import static org.apache.hyracks.util.file.FileUtil.joinPath;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.verify;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.hyracks.api.client.HyracksConnection;
-import org.apache.hyracks.api.client.IHyracksClientConnection;
-import org.apache.hyracks.api.job.JobId;
-import org.apache.hyracks.api.job.JobSpecification;
-import org.apache.hyracks.control.cc.ClusterControllerService;
-import org.apache.hyracks.control.cc.cluster.INodeManager;
-import org.apache.hyracks.control.cc.cluster.NodeManager;
-import org.apache.hyracks.control.common.controllers.CCConfig;
-import org.apache.hyracks.control.common.controllers.NCConfig;
-import org.apache.hyracks.control.nc.NodeControllerService;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-public class PredistributedJobsTest {
-    private static final Logger LOGGER = Logger.getLogger(PredistributedJobsTest.class.getName());
-
-    private static final String NC1_ID = "nc1";
-    private static final String NC2_ID = "nc2";
-
-    private static ClusterControllerService cc;
-    private static NodeControllerService nc1;
-    private static NodeControllerService nc2;
-    private static IHyracksClientConnection hcc;
-
-    @BeforeClass
-    public static void init() throws Exception {
-        CCConfig ccConfig = new CCConfig();
-        ccConfig.setClientListenAddress("127.0.0.1");
-        ccConfig.setClientListenPort(39000);
-        ccConfig.setClusterListenAddress("127.0.0.1");
-        ccConfig.setClusterListenPort(39001);
-        ccConfig.setProfileDumpPeriod(10000);
-        FileUtils.deleteQuietly(new File(joinPath("target", "data")));
-        FileUtils.copyDirectory(new File("data"), new File(joinPath("target", "data")));
-        File outDir = new File("target" + File.separator + "ClusterController");
-        outDir.mkdirs();
-        File ccRoot = File.createTempFile(AbstractIntegrationTest.class.getName(), ".data", outDir);
-        ccRoot.delete();
-        ccRoot.mkdir();
-        ccConfig.setRootDir(ccRoot.getAbsolutePath());
-        ClusterControllerService ccBase = new ClusterControllerService(ccConfig);
-        // The spying below is dangerous since it replaces the ClusterControllerService already referenced by many
-        // objects created in the constructor above
-        cc = Mockito.spy(ccBase);
-        cc.start();
-
-        // The following code partially fixes the problem created by the spying
-        INodeManager nodeManager = cc.getNodeManager();
-        Field ccsInNodeManager = NodeManager.class.getDeclaredField("ccs");
-        ccsInNodeManager.setAccessible(true);
-        ccsInNodeManager.set(nodeManager, cc);
-
-        NCConfig ncConfig1 = new NCConfig(NC1_ID);
-        ncConfig1.setClusterAddress("localhost");
-        ncConfig1.setClusterPort(39001);
-        ncConfig1.setClusterListenAddress("127.0.0.1");
-        ncConfig1.setDataListenAddress("127.0.0.1");
-        ncConfig1.setResultListenAddress("127.0.0.1");
-        ncConfig1.setResultSweepThreshold(5000);
-        ncConfig1.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device0") });
-        NodeControllerService nc1Base = new NodeControllerService(ncConfig1);
-        nc1 = Mockito.spy(nc1Base);
-        nc1.start();
-
-        NCConfig ncConfig2 = new NCConfig(NC2_ID);
-        ncConfig2.setClusterAddress("localhost");
-        ncConfig2.setClusterPort(39001);
-        ncConfig2.setClusterListenAddress("127.0.0.1");
-        ncConfig2.setDataListenAddress("127.0.0.1");
-        ncConfig2.setResultListenAddress("127.0.0.1");
-        ncConfig2.setResultSweepThreshold(5000);
-        ncConfig2.setIODevices(new String[] { joinPath(System.getProperty("user.dir"), "target", "data", "device1") });
-        NodeControllerService nc2Base = new NodeControllerService(ncConfig2);
-        nc2 = Mockito.spy(nc2Base);
-        nc2.start();
-
-        hcc = new HyracksConnection(ccConfig.getClientListenAddress(), ccConfig.getClientListenPort());
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting CC in " + ccRoot.getAbsolutePath());
-        }
-    }
-
-    @Test
-    public void DistributedTest() throws Exception {
-        JobSpecification spec1 = UnionTest.createUnionJobSpec();
-        JobSpecification spec2 = HeapSortMergeTest.createSortMergeJobSpec();
-
-        //distribute both jobs
-        JobId jobId1 = hcc.distributeJob(spec1);
-        JobId jobId2 = hcc.distributeJob(spec2);
-
-        //make sure it finished
-        //cc will get the store once to check for duplicate insertion and once to insert per job
-        verify(cc, Mockito.timeout(5000).times(4)).getPreDistributedJobStore();
-        verify(nc1, Mockito.timeout(5000).times(2)).storeActivityClusterGraph(any(), any());
-        verify(nc2, Mockito.timeout(5000).times(2)).storeActivityClusterGraph(any(), any());
-        verify(nc1, Mockito.timeout(5000).times(2)).checkForDuplicateDistributedJob(any());
-        verify(nc2, Mockito.timeout(5000).times(2)).checkForDuplicateDistributedJob(any());
-
-        //confirm that both jobs are distributed
-        Assert.assertTrue(nc1.getActivityClusterGraph(jobId1) != null && nc2.getActivityClusterGraph(jobId1) != null);
-        Assert.assertTrue(nc1.getActivityClusterGraph(jobId2) != null && nc2.getActivityClusterGraph(jobId2) != null);
-        Assert.assertTrue(cc.getPreDistributedJobStore().getDistributedJobDescriptor(jobId1) != null);
-        Assert.assertTrue(cc.getPreDistributedJobStore().getDistributedJobDescriptor(jobId2) != null);
-
-        //run the first job
-        hcc.startJob(jobId1);
-        hcc.waitForCompletion(jobId1);
-
-        //destroy the first job
-        hcc.destroyJob(jobId1);
-
-        //make sure it finished
-        verify(cc, Mockito.timeout(5000).times(8)).getPreDistributedJobStore();
-        verify(nc1, Mockito.timeout(5000).times(1)).removeActivityClusterGraph(any());
-        verify(nc2, Mockito.timeout(5000).times(1)).removeActivityClusterGraph(any());
-
-        //confirm the first job is destroyed
-        Assert.assertTrue(nc1.getActivityClusterGraph(jobId1) == null && nc2.getActivityClusterGraph(jobId1) == null);
-        cc.getPreDistributedJobStore().checkForExistingDistributedJobDescriptor(jobId1);
-
-        //run the second job
-        hcc.startJob(jobId2);
-        hcc.waitForCompletion(jobId2);
-
-        //wait ten seconds to ensure the result sweeper does not break the job
-        //The result sweeper runs every 5 seconds during the tests
-        Thread.sleep(10000);
-
-        //run the second job again
-        hcc.startJob(jobId2);
-        hcc.waitForCompletion(jobId2);
-
-        //destroy the second job
-        hcc.destroyJob(jobId2);
-
-        //make sure it finished
-        verify(cc, Mockito.timeout(5000).times(12)).getPreDistributedJobStore();
-        verify(nc1, Mockito.timeout(5000).times(2)).removeActivityClusterGraph(any());
-        verify(nc2, Mockito.timeout(5000).times(2)).removeActivityClusterGraph(any());
-
-        //confirm the second job is destroyed
-        Assert.assertTrue(nc1.getActivityClusterGraph(jobId2) == null && nc2.getActivityClusterGraph(jobId2) == null);
-        cc.getPreDistributedJobStore().checkForExistingDistributedJobDescriptor(jobId2);
-    }
-
-    @AfterClass
-    public static void deinit() throws Exception {
-        nc2.stop();
-        nc1.stop();
-        cc.stop();
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ReplicateOperatorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ReplicateOperatorTest.java
index b62c011..09629b2 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ReplicateOperatorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ReplicateOperatorTest.java
@@ -79,11 +79,11 @@
 
         DelimitedDataTupleParserFactory stringParser = new DelimitedDataTupleParserFactory(
                 new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, '\u0000');
-        RecordDescriptor stringRec = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(), });
+        RecordDescriptor stringRec =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(), });
 
-        FileScanOperatorDescriptor scanOp = new FileScanOperatorDescriptor(spec, new ConstantFileSplitProvider(
-                inputSplits), stringParser, stringRec);
+        FileScanOperatorDescriptor scanOp = new FileScanOperatorDescriptor(spec,
+                new ConstantFileSplitProvider(inputSplits), stringParser, stringRec);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, scanOp, locations);
 
         ReplicateOperatorDescriptor replicateOp = new ReplicateOperatorDescriptor(spec, stringRec, outputArity);
@@ -95,7 +95,7 @@
             spec.addResultSetId(rsId);
 
             outputOp[i] = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                    ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                    ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
             PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, outputOp[i], locations);
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ScanPrintTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ScanPrintTest.java
index dc91dd2..75ba33f 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ScanPrintTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/ScanPrintTest.java
@@ -54,24 +54,21 @@
     public void scanPrint01() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        IFileSplitProvider splitProvider = new ConstantFileSplitProvider(new FileSplit[] {
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt"),
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "nc1" + File.separator + "words.txt") });
+        IFileSplitProvider splitProvider = new ConstantFileSplitProvider(
+                new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt"),
+                        new ManagedFileSplit(NC1_ID, "data" + File.separator + "nc1" + File.separator + "words.txt") });
 
-        RecordDescriptor desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor csvScanner = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE },
-                        ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner, NC2_ID, NC1_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC2_ID, NC1_ID);
@@ -87,35 +84,35 @@
     public void scanPrint02() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC2_ID);
 
         IConnectorDescriptor conn1 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(conn1, ordScanner, 0, printer, 0);
 
         spec.addRoot(printer);
@@ -126,35 +123,35 @@
     public void scanPrint03() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+                        IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { IntegerParserFactory.INSTANCE,
                         IntegerParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         spec.addResultSetId(rsId);
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC2_ID);
 
         IConnectorDescriptor conn1 = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(IntegerPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(IntegerPointable.FACTORY) }));
         spec.connect(conn1, ordScanner, 0, printer, 0);
 
         spec.addRoot(printer);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/SortMergeTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/SortMergeTest.java
index 3043cba..315b74c 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/SortMergeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/SortMergeTest.java
@@ -56,24 +56,25 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
         InMemorySortOperatorDescriptor sorter = new InMemorySortOperatorDescriptor(spec, new int[] { 1 },
@@ -85,18 +86,18 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, true, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), ordScanner, 0, sorter, 0);
 
-        spec.connect(
-                new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(
-                        new int[] { 1 }, new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }), new int[] { 1 },
-                        new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory
-                                .of(UTF8StringPointable.FACTORY) }, new UTF8StringNormalizedKeyComputerFactory()),
-                sorter, 0, printer, 0);
+        spec.connect(new MToNPartitioningMergingConnectorDescriptor(spec,
+                new FieldHashPartitionComputerFactory(new int[] { 1 },
+                        new IBinaryHashFunctionFactory[] {
+                                PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }),
+                new int[] { 1 },
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
 
         runTest(spec);
     }
@@ -106,49 +107,52 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        ExternalSortOperatorDescriptor sorter = new ExternalSortOperatorDescriptor(spec, 4, new int[] { 1, 0 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                        PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) }, ordersDesc);
+        ExternalSortOperatorDescriptor sorter =
+                new ExternalSortOperatorDescriptor(spec, 4, new int[] { 1, 0 },
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, NC1_ID, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), ordScanner, 0, sorter, 0);
 
-        spec.connect(
-                new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(new int[] {
-                        1, 0 }, new IBinaryHashFunctionFactory[] {
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }), new int[] { 1, 0 },
-                        new IBinaryComparatorFactory[] {
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                        new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
+        spec.connect(new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(
+                new int[] { 1, 0 },
+                new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }),
+                new int[] { 1, 0 },
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
 
         runTest(spec);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOptimizedHybridHashJoinTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOptimizedHybridHashJoinTest.java
index d6f39ad..289f8ae 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOptimizedHybridHashJoinTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOptimizedHybridHashJoinTest.java
@@ -59,23 +59,23 @@
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    static RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer() });
+    static RecordDescriptor ordersDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    static RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer() });
+    static RecordDescriptor custOrderJoinDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
     static IValueParserFactory[] custValueParserFactories = new IValueParserFactory[custDesc.getFieldCount()];
     static IValueParserFactory[] orderValueParserFactories = new IValueParserFactory[ordersDesc.getFieldCount()];
@@ -86,9 +86,8 @@
     }
 
     private IOperatorDescriptor getPrinter(JobSpecification spec, String path) {
-        IFileSplitProvider outputSplitProvider = new ConstantFileSplitProvider(
-                new FileSplit[] {
-                        new ManagedFileSplit(NC1_ID, path) });
+        IFileSplitProvider outputSplitProvider =
+                new ConstantFileSplitProvider(new FileSplit[] { new ManagedFileSplit(NC1_ID, path) });
 
         return DEBUG ? new PlainFileWriterOperatorDescriptor(spec, outputSplitProvider, "|")
                 : new NullSinkOperatorDescriptor(spec);
@@ -97,12 +96,12 @@
     @Test
     public void customerOrderCIDHybridHashJoin_Case1() throws Exception {
         JobSpecification spec = new JobSpecification();
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer4.tbl") };
+        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "customer4.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders4.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders4.tbl") };
 
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
@@ -117,8 +116,8 @@
                 1.2, new int[] { 0 }, new int[] { 1 },
                 new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                custOrderJoinDesc, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
+                custOrderJoinDesc,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
                 new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
                 null);
 
@@ -146,12 +145,12 @@
     public void customerOrderCIDHybridHashJoin_Case2() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer3.tbl") };
+        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "customer3.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders4.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders4.tbl") };
 
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
 
@@ -167,8 +166,8 @@
                 1.2, new int[] { 0 }, new int[] { 1 },
                 new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                custOrderJoinDesc, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
+                custOrderJoinDesc,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
                 new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
                 null);
 
@@ -197,12 +196,12 @@
 
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer3.tbl") };
+        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID,
+                "data" + File.separator + "tpch0.001" + File.separator + "customer3.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders1.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders1.tbl") };
 
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
 
@@ -218,8 +217,8 @@
                 1.2, new int[] { 0 }, new int[] { 1 },
                 new IBinaryHashFunctionFamily[] { UTF8StringBinaryHashFunctionFamily.INSTANCE },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                custOrderJoinDesc, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
+                custOrderJoinDesc,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 0, 1),
                 new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
                 null);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderHashJoinTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderHashJoinTest.java
index 7075fe9..816f3fa 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderHashJoinTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderHashJoinTest.java
@@ -72,8 +72,8 @@
     public void customerOrderCIDJoin() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl") };
+        FileSplit[] custSplits = new FileSplit[] {
+                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -81,18 +81,18 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -111,14 +111,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID);
 
         InMemoryHashJoinOperatorDescriptor join = new InMemoryHashJoinOperatorDescriptor(spec, new int[] { 1 },
@@ -132,7 +132,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -152,8 +152,8 @@
     public void customerOrderCIDHybridHashJoin() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl") };
+        FileSplit[] custSplits = new FileSplit[] {
+                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -161,51 +161,48 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE }, '|'), custDesc);
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID);
 
-        HybridHashJoinOperatorDescriptor join = new HybridHashJoinOperatorDescriptor(
-                spec,
-                32,
-                20,
-                200,
-                1.2,
-                new int[] { 1 },
-                new int[] { 0 },
+        HybridHashJoinOperatorDescriptor join = new HybridHashJoinOperatorDescriptor(spec, 32, 20, 200, 1.2,
+                new int[] { 1 }, new int[] { 0 },
                 new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 custOrderJoinDesc, null, false, null);
@@ -215,7 +212,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -235,8 +232,8 @@
     public void customerOrderCIDInMemoryHashLeftOuterJoin() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl") };
+        FileSplit[] custSplits = new FileSplit[] {
+                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -244,18 +241,18 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -274,14 +271,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID);
 
         IMissingWriterFactory[] nonMatchWriterFactories = new IMissingWriterFactory[ordersDesc.getFieldCount()];
@@ -300,7 +297,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -320,8 +317,8 @@
     public void customerOrderCIDHybridHashLeftOuterJoin() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl") };
+        FileSplit[] custSplits = new FileSplit[] {
+                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -329,18 +326,18 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -359,14 +356,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID);
 
         IMissingWriterFactory[] nonMatchWriterFactories = new IMissingWriterFactory[ordersDesc.getFieldCount()];
@@ -385,7 +382,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -406,10 +403,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -418,20 +415,20 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -450,14 +447,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
         InMemoryHashJoinOperatorDescriptor join = new InMemoryHashJoinOperatorDescriptor(spec, new int[] { 1 },
@@ -471,19 +468,17 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 1 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 1 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(ordJoinConn, ordScanner, 0, join, 0);
 
         IConnectorDescriptor custJoinConn = new MToNPartitioningConnectorDescriptor(spec,
-                new FieldHashPartitionComputerFactory(new int[] { 0 },
-                        new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                                .of(UTF8StringPointable.FACTORY) }));
+                new FieldHashPartitionComputerFactory(new int[] { 0 }, new IBinaryHashFunctionFactory[] {
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
         spec.connect(custJoinConn, custScanner, 0, join, 1);
 
         IConnectorDescriptor joinPrinterConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -498,10 +493,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -510,20 +505,20 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -542,14 +537,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
         HybridHashJoinOperatorDescriptor join = new HybridHashJoinOperatorDescriptor(spec, 5, 20, 100, 1.2,
@@ -563,7 +558,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNPartitioningConnectorDescriptor(spec,
@@ -588,10 +583,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -600,20 +595,20 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -632,20 +627,19 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
         InMemoryHashJoinOperatorDescriptor join = new InMemoryHashJoinOperatorDescriptor(spec, new int[] { 1 },
                 new int[] { 0 },
-                new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory
-                        .of(UTF8StringPointable.FACTORY) },
+                new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) },
                 new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
                 custOrderJoinDesc, 128, null, 128);
         PartitionConstraintHelper.addPartitionCountConstraint(spec, join, 2);
@@ -654,7 +648,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNPartitioningConnectorDescriptor(spec,
@@ -679,10 +673,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -691,20 +685,20 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                         new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -723,14 +717,14 @@
                 ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(
-                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                                 UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE },
-                        '|'),
-                custDesc);
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
         MaterializingOperatorDescriptor ordMat = new MaterializingOperatorDescriptor(spec, ordersDesc);
@@ -750,7 +744,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordPartConn = new MToNPartitioningConnectorDescriptor(spec,
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderNestedLoopJoinTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderNestedLoopJoinTest.java
index 03cd5d4..c2b3263 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderNestedLoopJoinTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TPCHCustomerOrderNestedLoopJoinTest.java
@@ -103,8 +103,8 @@
             int fEnd1 = accessor1.getFieldEndOffset(tIndex1, field1);
             int fLen1 = fEnd1 - fStart1;
 
-            int c = bComparator.compare(accessor0.getBuffer().array(), fStart0 + fStartOffset0, fLen0, accessor1
-                    .getBuffer().array(), fStart1 + fStartOffset1, fLen1);
+            int c = bComparator.compare(accessor0.getBuffer().array(), fStart0 + fStartOffset0, fLen0,
+                    accessor1.getBuffer().array(), fStart1 + fStartOffset1, fLen1);
             if (c != 0) {
                 return c;
             }
@@ -127,8 +127,8 @@
     public void customerOrderCIDJoin() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        FileSplit[] custSplits = new FileSplit[] { new ManagedFileSplit(NC1_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "customer.tbl") };
+        FileSplit[] custSplits = new FileSplit[] {
+                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "customer.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -136,53 +136,56 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        FileSplit[] ordersSplits = new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator
-                + "tpch0.001" + File.separator + "orders.tbl") };
+        FileSplit[] ordersSplits = new FileSplit[] {
+                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE }, '|'), custDesc);
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID);
 
-        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0), custOrderJoinDesc, 4, false,
-                null);
+        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
+                custOrderJoinDesc, 4, false, null);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, join, NC1_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new MToNBroadcastConnectorDescriptor(spec);
@@ -203,10 +206,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -215,55 +218,58 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE }, '|'), custDesc);
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
-        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0), custOrderJoinDesc, 5, false,
-                null);
+        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
+                custOrderJoinDesc, 5, false, null);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, join, NC1_ID, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new OneToOneConnectorDescriptor(spec);
@@ -284,10 +290,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -296,55 +302,58 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE }, '|'), custDesc);
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
-        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0), custOrderJoinDesc, 6, false,
-                null);
+        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
+                custOrderJoinDesc, 6, false, null);
         PartitionConstraintHelper.addPartitionCountConstraint(spec, join, 2);
 
         ResultSetId rsId = new ResultSetId(1);
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new OneToOneConnectorDescriptor(spec);
@@ -365,10 +374,10 @@
         JobSpecification spec = new JobSpecification();
 
         FileSplit[] custSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "customer-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "customer-part2.tbl") };
         IFileSplitProvider custSplitsProvider = new ConstantFileSplitProvider(custSplits);
         RecordDescriptor custDesc = new RecordDescriptor(new ISerializerDeserializer[] {
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
@@ -377,43 +386,46 @@
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileSplit[] ordersSplits = new FileSplit[] {
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part1.tbl"),
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator
-                        + "orders-part2.tbl") };
+                new ManagedFileSplit(NC1_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
+                new ManagedFileSplit(NC2_ID,
+                        "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
         IFileSplitProvider ordersSplitsProvider = new ConstantFileSplitProvider(ordersSplits);
-        RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor ordersDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-        RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() });
+        RecordDescriptor custOrderJoinDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
         FileScanOperatorDescriptor ordScanner = new FileScanOperatorDescriptor(spec, ordersSplitsProvider,
                 new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
-        FileScanOperatorDescriptor custScanner = new FileScanOperatorDescriptor(spec, custSplitsProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE }, '|'), custDesc);
+        FileScanOperatorDescriptor custScanner =
+                new FileScanOperatorDescriptor(spec, custSplitsProvider,
+                        new DelimitedDataTupleParserFactory(new IValueParserFactory[] {
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+                                UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                        custDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, custScanner, NC1_ID, NC2_ID);
 
         IMissingWriterFactory[] nonMatchWriterFactories = new IMissingWriterFactory[ordersDesc.getFieldCount()];
@@ -421,16 +433,16 @@
             nonMatchWriterFactories[j] = NoopMissingWriterFactory.INSTANCE;
         }
 
-        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec, new JoinComparatorFactory(
-                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0), custOrderJoinDesc, 5, true,
-                nonMatchWriterFactories);
+        NestedLoopJoinOperatorDescriptor join = new NestedLoopJoinOperatorDescriptor(spec,
+                new JoinComparatorFactory(PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY), 1, 0),
+                custOrderJoinDesc, 5, true, nonMatchWriterFactories);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, join, NC1_ID, NC2_ID);
 
         ResultSetId rsId = new ResultSetId(1);
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         IConnectorDescriptor ordJoinConn = new OneToOneConnectorDescriptor(spec);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestJobLifecycleListener.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestJobLifecycleListener.java
index c8d0b9c..008be29 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestJobLifecycleListener.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/TestJobLifecycleListener.java
@@ -24,18 +24,19 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.job.IJobLifecycleListener;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.JobSpecification;
 import org.apache.hyracks.api.job.JobStatus;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class TestJobLifecycleListener implements IJobLifecycleListener {
 
-    private static final Logger LOGGER = Logger.getLogger(TestJobLifecycleListener.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final Map<JobId, JobSpecification> created = new HashMap<>();
     private final Set<JobId> started = new HashSet<>();
     private final Set<JobId> finished = new HashSet<>();
@@ -48,7 +49,7 @@
     @Override
     public void notifyJobCreation(JobId jobId, JobSpecification spec) throws HyracksException {
         if (created.containsKey(jobId)) {
-            LOGGER.log(Level.WARNING, "Job " + jobId + "has been created before");
+            LOGGER.log(Level.WARN, "Job " + jobId + "has been created before");
             increment(doubleCreated, jobId);
         }
         created.put(jobId, spec);
@@ -63,11 +64,11 @@
     @Override
     public void notifyJobStart(JobId jobId) throws HyracksException {
         if (!created.containsKey(jobId)) {
-            LOGGER.log(Level.WARNING, "Job " + jobId + "has not been created");
+            LOGGER.log(Level.WARN, "Job " + jobId + "has not been created");
             startWithoutCreate.add(jobId);
         }
         if (started.contains(jobId)) {
-            LOGGER.log(Level.WARNING, "Job " + jobId + "has been started before");
+            LOGGER.log(Level.WARN, "Job " + jobId + "has been started before");
             increment(doubleStarted, jobId);
         }
         started.add(jobId);
@@ -76,43 +77,43 @@
     @Override
     public void notifyJobFinish(JobId jobId, JobStatus jobStatus, List<Exception> exceptions) throws HyracksException {
         if (!started.contains(jobId)) {
-            LOGGER.log(Level.WARNING, "Job " + jobId + "has not been started");
+            LOGGER.log(Level.WARN, "Job " + jobId + "has not been started");
             finishWithoutStart.add(jobId);
         }
         if (finished.contains(jobId)) {
             // TODO: job finish should be called once only when it has really completed
             // throw new HyracksDataException("Job " + jobId + "has been finished before");
-            LOGGER.log(Level.WARNING, "Dangerous: Duplicate Job: " + jobId + " has finished with status: " + jobStatus);
+            LOGGER.log(Level.WARN, "Dangerous: Duplicate Job: " + jobId + " has finished with status: " + jobStatus);
             increment(doubleFinished, jobId);
         }
         finished.add(jobId);
     }
 
     public void check() throws Exception {
-        LOGGER.log(Level.WARNING, "Checking all created jobs have started");
+        LOGGER.log(Level.WARN, "Checking all created jobs have started");
         for (JobId jobId : created.keySet()) {
             if (!started.contains(jobId)) {
-                LOGGER.log(Level.WARNING, "JobId " + jobId + " has been created but never started");
+                LOGGER.log(Level.WARN, "JobId " + jobId + " has been created but never started");
             }
         }
-        LOGGER.log(Level.WARNING, "Checking all started jobs have terminated");
+        LOGGER.log(Level.WARN, "Checking all started jobs have terminated");
         for (JobId jobId : started) {
             if (!finished.contains(jobId)) {
-                LOGGER.log(Level.WARNING, "JobId " + jobId + " has started but not finished");
+                LOGGER.log(Level.WARN, "JobId " + jobId + " has started but not finished");
             }
         }
-        LOGGER.log(Level.WARNING, "Checking multiple creates");
+        LOGGER.log(Level.WARN, "Checking multiple creates");
         for (Entry<JobId, Integer> entry : doubleCreated.entrySet()) {
-            LOGGER.log(Level.WARNING, "job " + entry.getKey() + " has been created " + entry.getValue() + " times");
+            LOGGER.log(Level.WARN, "job " + entry.getKey() + " has been created " + entry.getValue() + " times");
         }
-        LOGGER.log(Level.WARNING, "Checking multiple starts");
+        LOGGER.log(Level.WARN, "Checking multiple starts");
         for (Entry<JobId, Integer> entry : doubleStarted.entrySet()) {
-            LOGGER.log(Level.WARNING, "job " + entry.getKey() + " has been started " + entry.getValue() + " times");
+            LOGGER.log(Level.WARN, "job " + entry.getKey() + " has been started " + entry.getValue() + " times");
         }
-        LOGGER.log(Level.WARNING, "Checking multiple finishes");
+        LOGGER.log(Level.WARN, "Checking multiple finishes");
         for (Entry<JobId, Integer> entry : doubleFinished.entrySet()) {
-            LOGGER.log(Level.WARNING, "job " + entry.getKey() + " has been finished " + entry.getValue() + " times");
+            LOGGER.log(Level.WARN, "job " + entry.getKey() + " has been finished " + entry.getValue() + " times");
         }
-        LOGGER.log(Level.WARNING, "Done checking!");
+        LOGGER.log(Level.WARN, "Done checking!");
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/UnionTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/UnionTest.java
index 542f037..81a71eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/UnionTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/UnionTest.java
@@ -51,25 +51,21 @@
     public static JobSpecification createUnionJobSpec() throws Exception {
         JobSpecification spec = new JobSpecification();
 
-        IFileSplitProvider splitProvider = new ConstantFileSplitProvider(new FileSplit[] {
-                new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt"),
-                new ManagedFileSplit(NC1_ID, "data" + File.separator + "nc1" + File.separator + "words.txt") });
+        IFileSplitProvider splitProvider = new ConstantFileSplitProvider(
+                new FileSplit[] { new ManagedFileSplit(NC2_ID, "data" + File.separator + "words.txt"),
+                        new ManagedFileSplit(NC1_ID, "data" + File.separator + "nc1" + File.separator + "words.txt") });
 
-        RecordDescriptor desc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor desc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor csvScanner01 = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner01 =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner01, NC2_ID, NC1_ID);
 
-        FileScanOperatorDescriptor csvScanner02 = new FileScanOperatorDescriptor(
-                spec,
-                splitProvider,
-                new DelimitedDataTupleParserFactory(new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','),
-                desc);
+        FileScanOperatorDescriptor csvScanner02 =
+                new FileScanOperatorDescriptor(spec, splitProvider, new DelimitedDataTupleParserFactory(
+                        new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE }, ','), desc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, csvScanner02, NC2_ID, NC1_ID);
 
         UnionAllOperatorDescriptor unionAll = new UnionAllOperatorDescriptor(spec, 2, desc);
@@ -79,7 +75,7 @@
         spec.addResultSetId(rsId);
 
         IOperatorDescriptor printer = new ResultWriterOperatorDescriptor(spec, rsId, false, false,
-                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider());
+                ResultSerializerFactoryProvider.INSTANCE.getResultSerializerFactoryProvider(), 1);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC2_ID, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), csvScanner01, 0, unionAll, 0);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/VSizeFrameSortMergeTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/VSizeFrameSortMergeTest.java
index 29e1d6e..9761f4d 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/VSizeFrameSortMergeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/VSizeFrameSortMergeTest.java
@@ -56,12 +56,12 @@
             new ManagedFileSplit(NC1_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders-part1.tbl"),
             new ManagedFileSplit(NC2_ID, "data" + File.separator + "tpch0.001" + File.separator + "orders-part2.tbl") };
     IFileSplitProvider ordersSplitProvider = new ConstantFileSplitProvider(ordersSplits);
-    RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer() });
+    RecordDescriptor ordersDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
     @Test
     public void sortNormalMergeTest() throws Exception {
@@ -84,34 +84,37 @@
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
                         UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'), ordersDesc);
+                        UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE }, '|'),
+                ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, ordScanner, NC1_ID, NC2_ID);
 
         spec.setFrameSize(frameSize);
-        ExternalSortOperatorDescriptor sorter = new ExternalSortOperatorDescriptor(spec, frameLimit, new int[] { 1, 0 },
-                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                        PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) }, ordersDesc);
+        ExternalSortOperatorDescriptor sorter =
+                new ExternalSortOperatorDescriptor(spec, frameLimit, new int[] { 1, 0 },
+                        new IBinaryComparatorFactory[] {
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                        ordersDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, sorter, NC1_ID, NC2_ID);
 
         String path = getClass().getSimpleName() + aInteger.getAndIncrement() + ".tmp";
 
-        IFileSplitProvider outputSplitProvider = new ConstantFileSplitProvider(
-                new FileSplit[] { new ManagedFileSplit(NC1_ID, path) });
+        IFileSplitProvider outputSplitProvider =
+                new ConstantFileSplitProvider(new FileSplit[] { new ManagedFileSplit(NC1_ID, path) });
         IOperatorDescriptor printer = new PlainFileWriterOperatorDescriptor(spec, outputSplitProvider, "|");
 
         PartitionConstraintHelper.addAbsoluteLocationConstraint(spec, printer, NC1_ID);
 
         spec.connect(new OneToOneConnectorDescriptor(spec), ordScanner, 0, sorter, 0);
 
-        spec.connect(
-                new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(new int[] {
-                        1, 0 }, new IBinaryHashFunctionFactory[] {
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
-                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }), new int[] { 1, 0 },
-                        new IBinaryComparatorFactory[] {
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-                                PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
-                        new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
+        spec.connect(new MToNPartitioningMergingConnectorDescriptor(spec, new FieldHashPartitionComputerFactory(
+                new int[] { 1, 0 },
+                new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }),
+                new int[] { 1, 0 },
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                        PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) },
+                new UTF8StringNormalizedKeyComputerFactory()), sorter, 0, printer, 0);
 
         spec.addRoot(printer);
         runTest(spec);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/WaitingOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/WaitingOperatorDescriptor.java
index 6503b7b..799520c 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/WaitingOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/integration/WaitingOperatorDescriptor.java
@@ -18,8 +18,6 @@
  */
 package org.apache.hyracks.tests.integration;
 
-import java.util.logging.Logger;
-
 import org.apache.commons.lang3.mutable.MutableBoolean;
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -35,7 +33,6 @@
     public static final MutableBoolean CONTINUE_RUNNING = new MutableBoolean(false);
 
     private static final long serialVersionUID = 1L;
-    private static Logger LOGGER = Logger.getLogger(WaitingOperatorDescriptor.class.getName());
 
     public WaitingOperatorDescriptor(IOperatorDescriptorRegistry spec, int inputArity, int outputArity) {
         super(spec, inputArity, outputArity);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/ErrorReportingTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/ErrorReportingTest.java
index ef9e4b6..4d3215d 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/ErrorReportingTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/ErrorReportingTest.java
@@ -139,7 +139,7 @@
         @Override
         public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
                 IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions)
-                        throws HyracksDataException {
+                throws HyracksDataException {
             return new IOperatorNodePushable() {
 
                 @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/SuperActivityRewritingTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/SuperActivityRewritingTest.java
index 8b0b8a0..25c9d5c 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/SuperActivityRewritingTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/rewriting/SuperActivityRewritingTest.java
@@ -123,7 +123,7 @@
         @Override
         public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
                 IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions)
-                        throws HyracksDataException {
+                throws HyracksDataException {
             return new IOperatorNodePushable() {
                 private CountDownLatch allOpenedSignal = new CountDownLatch(3);
                 private Set<Long> threads = new HashSet<>();
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractExternalGroupbyTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractExternalGroupbyTest.java
index b0c210f..b55b64e 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractExternalGroupbyTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractExternalGroupbyTest.java
@@ -58,50 +58,39 @@
 
 public abstract class AbstractExternalGroupbyTest {
 
-    ISerializerDeserializer[] inFields = new ISerializerDeserializer[] {
-            IntegerSerializerDeserializer.INSTANCE,
-            new UTF8StringSerializerDeserializer(),
-    };
+    ISerializerDeserializer[] inFields = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+            new UTF8StringSerializerDeserializer(), };
 
-    ISerializerDeserializer[] aggrFields = new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(),  // key
-            IntegerSerializerDeserializer.INSTANCE,     // sum
-            IntegerSerializerDeserializer.INSTANCE,     // count
-            FloatSerializerDeserializer.INSTANCE,       // avg
+    ISerializerDeserializer[] aggrFields = new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(), // key
+            IntegerSerializerDeserializer.INSTANCE, // sum
+            IntegerSerializerDeserializer.INSTANCE, // count
+            FloatSerializerDeserializer.INSTANCE, // avg
     };
 
     RecordDescriptor inRecordDesc = new RecordDescriptor(inFields);
 
     RecordDescriptor outputRec = new RecordDescriptor(aggrFields);
 
-    IBinaryComparatorFactory[] comparatorFactories = new IBinaryComparatorFactory[] {
-            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+    IBinaryComparatorFactory[] comparatorFactories =
+            new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
 
     INormalizedKeyComputerFactory normalizedKeyComputerFactory = new UTF8StringNormalizedKeyComputerFactory();
 
     IAggregatorDescriptorFactory partialAggrInPlace = new MultiFieldsAggregatorFactory(
-            new IFieldAggregateDescriptorFactory[] {
-                    new IntSumFieldAggregatorFactory(0, false),
-                    new CountFieldAggregatorFactory(false),
-                    new AvgFieldGroupAggregatorFactory(0, false) });
+            new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(0, false),
+                    new CountFieldAggregatorFactory(false), new AvgFieldGroupAggregatorFactory(0, false) });
 
     IAggregatorDescriptorFactory finalAggrInPlace = new MultiFieldsAggregatorFactory(
-            new IFieldAggregateDescriptorFactory[] {
-                    new IntSumFieldAggregatorFactory(1, false),
-                    new IntSumFieldAggregatorFactory(2, false),
-                    new AvgFieldMergeAggregatorFactory(3, false) });
+            new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, false),
+                    new IntSumFieldAggregatorFactory(2, false), new AvgFieldMergeAggregatorFactory(3, false) });
 
     IAggregatorDescriptorFactory partialAggrInState = new MultiFieldsAggregatorFactory(
-            new IFieldAggregateDescriptorFactory[] {
-                    new IntSumFieldAggregatorFactory(0, true),
-                    new CountFieldAggregatorFactory(true),
-                    new AvgFieldGroupAggregatorFactory(0, true) });
+            new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(0, true),
+                    new CountFieldAggregatorFactory(true), new AvgFieldGroupAggregatorFactory(0, true) });
 
     IAggregatorDescriptorFactory finalAggrInState = new MultiFieldsAggregatorFactory(
-            new IFieldAggregateDescriptorFactory[] {
-                    new IntSumFieldAggregatorFactory(1, true),
-                    new IntSumFieldAggregatorFactory(2, true),
-                    new AvgFieldMergeAggregatorFactory(3, true) });
+            new IFieldAggregateDescriptorFactory[] { new IntSumFieldAggregatorFactory(1, true),
+                    new IntSumFieldAggregatorFactory(2, true), new AvgFieldMergeAggregatorFactory(3, true) });
 
     int[] keyFields = new int[] { 1 };
     int[] keyFieldsAfterPartial = new int[] { 0 };
@@ -213,17 +202,15 @@
 
     protected abstract IOperatorNodePushable getMerger();
 
-    private void testBuildAndMerge(int tableSize, int numFrames, int frameSize, int minDataSize,
-            int minRecordSize, int maxRecordSize,
-            Map<Integer, String> specialData)
-            throws HyracksDataException {
+    private void testBuildAndMerge(int tableSize, int numFrames, int frameSize, int minDataSize, int minRecordSize,
+            int maxRecordSize, Map<Integer, String> specialData) throws HyracksDataException {
 
         IHyracksTaskContext ctx = TestUtils.create(frameSize);
         initial(ctx, tableSize, numFrames);
         ArrayList<IFrame> input = new ArrayList<>();
         Map<Integer, String> keyValueMap = new HashMap<>();
-        AbstractRunGeneratorTest
-                .prepareData(ctx, input, minDataSize, minRecordSize, maxRecordSize, specialData, keyValueMap);
+        AbstractRunGeneratorTest.prepareData(ctx, input, minDataSize, minRecordSize, maxRecordSize, specialData,
+                keyValueMap);
 
         ResultValidateWriter writer = new ResultValidateWriter(keyValueMap);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractRunGeneratorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractRunGeneratorTest.java
index cfd4f30..d3b6b5c 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractRunGeneratorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/AbstractRunGeneratorTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.hyracks.tests.unit;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.io.DataInputStream;
 import java.util.ArrayList;
@@ -57,11 +57,11 @@
     static ISerializerDeserializer[] SerDers = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
             new UTF8StringSerializerDeserializer() };
     static RecordDescriptor RecordDesc = new RecordDescriptor(SerDers);
-    static Random GRandom = new Random(System.currentTimeMillis());
+    static Random GRandom = new Random(0);
     static int[] SortFields = new int[] { 0, 1 };
-    static IBinaryComparatorFactory[] ComparatorFactories = new IBinaryComparatorFactory[] {
-            PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY),
-            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+    static IBinaryComparatorFactory[] ComparatorFactories =
+            new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY),
+                    PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
 
     static void assertMaxFrameSizesAreAllEqualsTo(List<GeneratedRunFileReader> maxSize, int pageSize) {
         for (int i = 0; i < maxSize.size(); i++) {
@@ -69,25 +69,30 @@
         }
     }
 
-    abstract AbstractSortRunGenerator getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
-            throws HyracksDataException;
+    abstract AbstractSortRunGenerator[] getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit,
+            int numOfInputRecord) throws HyracksDataException;
 
-    protected List<GeneratedRunFileReader> testSortRecords(int pageSize, int frameLimit, int numRuns, int minRecordSize,
-            int maxRecordSize, HashMap<Integer, String> specialData) throws HyracksDataException {
+    protected List<List<GeneratedRunFileReader>> testSortRecords(int pageSize, int frameLimit, int numRuns,
+            int minRecordSize, int maxRecordSize, HashMap<Integer, String> specialData) throws HyracksDataException {
         IHyracksTaskContext ctx = testUtils.create(pageSize);
 
         HashMap<Integer, String> keyValuePair = new HashMap<>();
         List<IFrame> frameList = new ArrayList<>();
         prepareData(ctx, frameList, pageSize * frameLimit * numRuns, minRecordSize, maxRecordSize, specialData,
                 keyValuePair);
-        AbstractSortRunGenerator runGenerator = getSortRunGenerator(ctx, frameLimit, keyValuePair.size());
-        runGenerator.open();
-        for (IFrame frame : frameList) {
-            runGenerator.nextFrame(frame.getBuffer());
+
+        List<List<GeneratedRunFileReader>> results = new ArrayList<>();
+        AbstractSortRunGenerator[] runGenerators = getSortRunGenerator(ctx, frameLimit, keyValuePair.size());
+        for (AbstractSortRunGenerator runGenerator : runGenerators) {
+            runGenerator.open();
+            for (IFrame frame : frameList) {
+                runGenerator.nextFrame(frame.getBuffer());
+            }
+            runGenerator.close();
+            matchResult(ctx, runGenerator.getRuns(), keyValuePair);
+            results.add(runGenerator.getRuns());
         }
-        runGenerator.close();
-        matchResult(ctx, runGenerator.getRuns(), keyValuePair);
-        return runGenerator.getRuns();
+        return results;
     }
 
     static void matchResult(IHyracksTaskContext ctx, List<GeneratedRunFileReader> runs,
@@ -114,7 +119,9 @@
             bbis.setByteBuffer(fta.getBuffer(),
                     fta.getTupleStartOffset(i) + fta.getFieldStartOffset(i, 1) + fta.getFieldSlotsLength());
             String value = (String) RecordDesc.getFields()[1].deserialize(di);
-
+            if (!keyValuePair.containsKey(key)) {
+                assertTrue(false);
+            }
             if (!keyValuePair.get(key).equals(value)) {
                 assertTrue(false);
             }
@@ -146,7 +153,7 @@
 
     static void prepareData(IHyracksTaskContext ctx, List<IFrame> frameList, int minDataSize, int minRecordSize,
             int maxRecordSize, Map<Integer, String> specialData, Map<Integer, String> keyValuePair)
-                    throws HyracksDataException {
+            throws HyracksDataException {
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(RecordDesc.getFieldCount());
         FrameTupleAppender appender = new FrameTupleAppender();
@@ -158,8 +165,9 @@
                 tb.addField(IntegerSerializerDeserializer.INSTANCE, entry.getKey());
                 tb.addField(new UTF8StringSerializerDeserializer(), entry.getValue());
 
-                VSizeFrame frame = new VSizeFrame(ctx, FrameHelper.calcAlignedFrameSizeToStore(
-                        tb.getFieldEndOffsets().length, tb.getSize(), ctx.getInitialFrameSize()));
+                VSizeFrame frame =
+                        new VSizeFrame(ctx, FrameHelper.calcAlignedFrameSizeToStore(tb.getFieldEndOffsets().length,
+                                tb.getSize(), ctx.getInitialFrameSize()));
                 appender.reset(frame, true);
                 assertTrue(appender.append(tb.getFieldEndOffsets(), tb.getByteArray(), 0, tb.getSize()));
                 frameList.add(frame);
@@ -226,9 +234,25 @@
         int numRuns = 2;
         int minRecordSize = pageSize / 8;
         int maxRecordSize = pageSize / 8;
-        List<GeneratedRunFileReader> maxSize = testSortRecords(pageSize, frameLimit, numRuns, minRecordSize,
-                maxRecordSize, null);
-        assertMaxFrameSizesAreAllEqualsTo(maxSize, pageSize);
+        List<List<GeneratedRunFileReader>> maxSizes =
+                testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize, null);
+        for (List<GeneratedRunFileReader> maxSize : maxSizes) {
+            assertMaxFrameSizesAreAllEqualsTo(maxSize, pageSize);
+        }
+    }
+
+    @Test
+    public void testAllManySmallRecords() throws HyracksDataException {
+        int pageSize = 10240;
+        int frameLimit = 4;
+        int numRuns = 2;
+        int minRecordSize = pageSize / 8;
+        int maxRecordSize = pageSize / 8;
+        List<List<GeneratedRunFileReader>> maxSizes =
+                testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize, null);
+        for (List<GeneratedRunFileReader> maxSize : maxSizes) {
+            assertMaxFrameSizesAreAllEqualsTo(maxSize, pageSize);
+        }
     }
 
     @Test
@@ -238,9 +262,11 @@
         int numRuns = 2;
         int minRecordSize = pageSize;
         int maxRecordSize = (int) (pageSize * 1.8);
-        List<GeneratedRunFileReader> size = testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize,
-                null);
-        assertMaxFrameSizesAreAllEqualsTo(size, pageSize * 2);
+        List<List<GeneratedRunFileReader>> maxSizes =
+                testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize, null);
+        for (List<GeneratedRunFileReader> maxSize : maxSizes) {
+            assertMaxFrameSizesAreAllEqualsTo(maxSize, pageSize * 2);
+        }
     }
 
     @Test
@@ -250,15 +276,16 @@
         int numRuns = 4;
         int minRecordSize = 20;
         int maxRecordSize = pageSize / 2;
-        HashMap<Integer, String> specialPair = generateBigObject(pageSize, frameLimit - 1);
-        List<GeneratedRunFileReader> size = testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize,
-                specialPair);
-
-        int max = 0;
-        for (GeneratedRunFileReader run : size) {
-            max = Math.max(max, run.getMaxFrameSize());
+        HashMap<Integer, String> specialPair = generateBigObject(pageSize / 2, frameLimit - 1);
+        List<List<GeneratedRunFileReader>> sizes =
+                testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize, specialPair);
+        for (List<GeneratedRunFileReader> size : sizes) {
+            int max = 0;
+            for (GeneratedRunFileReader run : size) {
+                max = Math.max(max, run.getMaxFrameSize());
+            }
+            assertTrue(max <= pageSize * (frameLimit - 1) && max >= pageSize * 2);
         }
-        assertTrue(max == pageSize * (frameLimit - 1));
     }
 
     @Test(expected = HyracksDataException.class)
@@ -269,8 +296,6 @@
         HashMap<Integer, String> specialPair = generateBigObject(pageSize, frameLimit);
         int minRecordSize = 10;
         int maxRecordSize = pageSize / 2;
-        List<GeneratedRunFileReader> size = testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize,
-                specialPair);
-
+        testSortRecords(pageSize, frameLimit, numRuns, minRecordSize, maxRecordSize, specialPair);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/EnforcedIndexCursorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/EnforcedIndexCursorTest.java
new file mode 100644
index 0000000..8fe689e
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/EnforcedIndexCursorTest.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.tests.unit;
+
+import org.apache.hyracks.storage.common.EnforcedIndexCursor;
+import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
+import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EnforcedIndexCursorTest extends IIndexCursorTest {
+    @Override
+    protected List<ISearchPredicate> createSearchPredicates() {
+        List<ISearchPredicate> predicates = new ArrayList<>();
+        for (int i = 0; i < 10; i++) {
+            predicates.add(Mockito.mock(ISearchPredicate.class));
+        }
+        return predicates;
+    }
+
+    @Override
+    protected ICursorInitialState createCursorInitialState() {
+        return Mockito.mock(ICursorInitialState.class);
+    }
+
+    @Override
+    protected IIndexCursor createCursor() {
+        return new EnforcedIndexCursor();
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/ExternalSortRunGeneratorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/ExternalSortRunGeneratorTest.java
index fd57f1e..6765d1e 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/ExternalSortRunGeneratorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/ExternalSortRunGeneratorTest.java
@@ -20,7 +20,11 @@
 package org.apache.hyracks.tests.unit;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.normalizers.IntegerNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.common.data.normalizers.UTF8StringNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.std.buffermanager.EnumFreeSlotPolicy;
 import org.apache.hyracks.dataflow.std.sort.AbstractSortRunGenerator;
 import org.apache.hyracks.dataflow.std.sort.Algorithm;
 import org.apache.hyracks.dataflow.std.sort.ExternalSortRunGenerator;
@@ -28,9 +32,20 @@
 public class ExternalSortRunGeneratorTest extends AbstractRunGeneratorTest {
 
     @Override
-    AbstractSortRunGenerator getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
+    AbstractSortRunGenerator[] getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
             throws HyracksDataException {
-        return new ExternalSortRunGenerator(ctx, SortFields, null, ComparatorFactories, RecordDesc,
-                Algorithm.MERGE_SORT, frameLimit);
+        ExternalSortRunGenerator runGenerator = new ExternalSortRunGenerator(ctx, SortFields, null, ComparatorFactories,
+                RecordDesc, Algorithm.MERGE_SORT, EnumFreeSlotPolicy.LAST_FIT, frameLimit, Integer.MAX_VALUE);
+        ExternalSortRunGenerator runGeneratorWithOneNormalizeKey = new ExternalSortRunGenerator(ctx, SortFields,
+                new INormalizedKeyComputerFactory[] { new IntegerNormalizedKeyComputerFactory() }, ComparatorFactories,
+                RecordDesc, Algorithm.MERGE_SORT, EnumFreeSlotPolicy.LAST_FIT, frameLimit, Integer.MAX_VALUE);
+        ExternalSortRunGenerator runGeneratorWithNormalizeKeys = new ExternalSortRunGenerator(ctx, SortFields,
+                new INormalizedKeyComputerFactory[] { new IntegerNormalizedKeyComputerFactory(),
+                        new UTF8StringNormalizedKeyComputerFactory() },
+                ComparatorFactories, RecordDesc, Algorithm.MERGE_SORT, EnumFreeSlotPolicy.LAST_FIT, frameLimit,
+                Integer.MAX_VALUE);
+
+        return new AbstractSortRunGenerator[] { runGenerator, runGeneratorWithOneNormalizeKey,
+                runGeneratorWithNormalizeKeys };
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HeapSortRunGeneratorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HeapSortRunGeneratorTest.java
index d219a56..5d9e771 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HeapSortRunGeneratorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HeapSortRunGeneratorTest.java
@@ -19,23 +19,37 @@
 
 package org.apache.hyracks.tests.unit;
 
-import org.junit.Test;
-
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.normalizers.IntegerNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.common.data.normalizers.UTF8StringNormalizedKeyComputerFactory;
 import org.apache.hyracks.dataflow.std.sort.AbstractSortRunGenerator;
 import org.apache.hyracks.dataflow.std.sort.HeapSortRunGenerator;
+import org.junit.Test;
 
 public class HeapSortRunGeneratorTest extends AbstractRunGeneratorTest {
     @Override
-    AbstractSortRunGenerator getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
+    AbstractSortRunGenerator[] getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
             throws HyracksDataException {
-        return new HeapSortRunGenerator(ctx, frameLimit, numOfInputRecord, SortFields, null, ComparatorFactories,
-                RecordDesc);
+        HeapSortRunGenerator runGenerator = new HeapSortRunGenerator(ctx, frameLimit, numOfInputRecord, SortFields,
+                null, ComparatorFactories, RecordDesc);
+        HeapSortRunGenerator runGeneratorWithOneNormalizedKey =
+                new HeapSortRunGenerator(ctx, frameLimit, numOfInputRecord, SortFields,
+                        new INormalizedKeyComputerFactory[] { new IntegerNormalizedKeyComputerFactory() },
+                        ComparatorFactories, RecordDesc);
+        HeapSortRunGenerator runGeneratorWithNormalizedKeys = new HeapSortRunGenerator(ctx, frameLimit,
+                numOfInputRecord, SortFields, new INormalizedKeyComputerFactory[] {
+                        new IntegerNormalizedKeyComputerFactory(), new UTF8StringNormalizedKeyComputerFactory() },
+                ComparatorFactories, RecordDesc);
+
+        return new AbstractSortRunGenerator[] { runGenerator, runGeneratorWithOneNormalizedKey,
+                runGeneratorWithNormalizedKeys };
+
     }
 
     @Test
-    public void testTopK(){
+    public void testTopK() {
 
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGenerator.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGenerator.java
deleted file mode 100644
index d1080f8..0000000
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGenerator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.tests.unit;
-
-import org.apache.hyracks.api.context.IHyracksTaskContext;
-import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.dataflow.std.sort.AbstractSortRunGenerator;
-import org.apache.hyracks.dataflow.std.sort.HybridTopKSortRunGenerator;
-
-public class HybridSortRunGenerator extends AbstractRunGeneratorTest {
-    @Override
-    AbstractSortRunGenerator getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
-            throws HyracksDataException {
-        return new HybridTopKSortRunGenerator(ctx, frameLimit, numOfInputRecord, SortFields, null, ComparatorFactories,
-                RecordDesc);
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGeneratorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGeneratorTest.java
new file mode 100644
index 0000000..d91f1e1
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/HybridSortRunGeneratorTest.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.tests.unit;
+
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.normalizers.IntegerNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.common.data.normalizers.UTF8StringNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.std.sort.AbstractSortRunGenerator;
+import org.apache.hyracks.dataflow.std.sort.HybridTopKSortRunGenerator;
+
+public class HybridSortRunGeneratorTest extends AbstractRunGeneratorTest {
+    @Override
+    AbstractSortRunGenerator[] getSortRunGenerator(IHyracksTaskContext ctx, int frameLimit, int numOfInputRecord)
+            throws HyracksDataException {
+        HybridTopKSortRunGenerator runGenerator = new HybridTopKSortRunGenerator(ctx, frameLimit, numOfInputRecord,
+                SortFields, null, ComparatorFactories, RecordDesc);
+        HybridTopKSortRunGenerator runGeneratorWithOneNormalizedKey =
+                new HybridTopKSortRunGenerator(ctx, frameLimit, numOfInputRecord, SortFields,
+                        new INormalizedKeyComputerFactory[] { new IntegerNormalizedKeyComputerFactory() },
+                        ComparatorFactories, RecordDesc);
+        HybridTopKSortRunGenerator runGeneratorWithNormalizedKeys = new HybridTopKSortRunGenerator(ctx, frameLimit,
+                numOfInputRecord, SortFields, new INormalizedKeyComputerFactory[] {
+                        new IntegerNormalizedKeyComputerFactory(), new UTF8StringNormalizedKeyComputerFactory() },
+                ComparatorFactories, RecordDesc);
+
+        return new AbstractSortRunGenerator[] { runGenerator, runGeneratorWithOneNormalizedKey,
+                runGeneratorWithNormalizedKeys };
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IIndexCursorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IIndexCursorTest.java
new file mode 100644
index 0000000..4d0f287
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IIndexCursorTest.java
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.tests.unit;
+
+import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
+import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * This is a test class that forms the basis for unit tests of different implementations of the IIndexCursor interface
+ */
+public abstract class IIndexCursorTest {
+    @Test
+    public void testNormalLifeCycle() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        for (ISearchPredicate predicate : predicates) {
+            cursor.open(initialState, predicate);
+            while (cursor.hasNext()) {
+                cursor.next();
+            }
+            cursor.close();
+        }
+        cursor.destroy();
+    }
+
+    @Test
+    public void testCreateDestroySucceed() throws Exception {
+        IIndexCursor cursor = createCursor();
+        cursor.destroy();
+    }
+
+    @Test
+    public void testDoubleOpenFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.open(initialState, predicates.get(0));
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.close();
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testCloseWithoutOpenFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.close();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testDoubleCloseFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.close();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testHasNextBeforeOpenFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.hasNext();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testHasNextAfterCloseFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.hasNext();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testNextBeforeOpenFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.next();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testNextAfterCloseFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.next();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testDestroyWhileOpenFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.destroy();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        cursor.close();
+        cursor.destroy();
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testOpenAfterDestroyFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        cursor.destroy();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.open(initialState, predicates.get(0));
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testCloseAfterDestroyFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        cursor.destroy();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.close();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testNextAfterDestroyFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        cursor.destroy();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.next();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testHasNextAfterDestroyFails() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        cursor.destroy();
+        boolean expectedExceptionThrown = false;
+        try {
+            cursor.hasNext();
+        } catch (Exception e) {
+            expectedExceptionThrown = true;
+        }
+        Assert.assertTrue(expectedExceptionThrown);
+    }
+
+    @Test
+    public void testGetTupleReturnsNullAfterDestroy() throws Exception {
+        IIndexCursor cursor = createCursor();
+        ICursorInitialState initialState = createCursorInitialState();
+        List<ISearchPredicate> predicates = createSearchPredicates();
+        cursor.open(initialState, predicates.get(0));
+        cursor.close();
+        cursor.destroy();
+        Assert.assertNull(cursor.getTuple());
+    }
+
+    protected abstract List<ISearchPredicate> createSearchPredicates();
+
+    protected abstract ICursorInitialState createCursorInitialState();
+
+    protected abstract IIndexCursor createCursor();
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IntersectOperatorDescriptorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IntersectOperatorDescriptorTest.java
index 6729713..bd51619 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IntersectOperatorDescriptorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/IntersectOperatorDescriptorTest.java
@@ -51,9 +51,9 @@
 
 public class IntersectOperatorDescriptorTest {
 
-    IOperatorDescriptorRegistry mockRegistry = when(
-            mock(IOperatorDescriptorRegistry.class).createOperatorDescriptorId(any()))
-            .thenReturn(new OperatorDescriptorId(1)).getMock();
+    IOperatorDescriptorRegistry mockRegistry =
+            when(mock(IOperatorDescriptorRegistry.class).createOperatorDescriptorId(any()))
+                    .thenReturn(new OperatorDescriptorId(1)).getMock();
     MultiThreadTaskEmulator multiThreadTaskEmulator = new MultiThreadTaskEmulator();
     InputFrameGenerator frameGenerator = new InputFrameGenerator(256);
     IHyracksTaskContext ctx = TestUtils.create(256);
@@ -72,10 +72,9 @@
         inputRecordDescriptor = new RecordDescriptor[nInputs];
 
         normalizedKeyFactory = null;
-        comparatorFactory = new IBinaryComparatorFactory[] {
-                PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY),
-                PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY)
-        };
+        comparatorFactory =
+                new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY),
+                        PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY) };
 
         for (int i = 0; i < nInputs; i++) {
             compareFields[i] = new int[nProjectFields];
@@ -84,17 +83,13 @@
             }
         }
         for (int i = 0; i < nInputs; i++) {
-            inputRecordDescriptor[i] = new RecordDescriptor(new ISerializerDeserializer[] {
-                    IntegerSerializerDeserializer.INSTANCE,
-                    IntegerSerializerDeserializer.INSTANCE,
-                    IntegerSerializerDeserializer.INSTANCE
-            });
+            inputRecordDescriptor[i] =
+                    new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+                            IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
         }
 
         outRecordDescriptor = new RecordDescriptor(new ISerializerDeserializer[] {
-                IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE
-        });
+                IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE });
     }
 
     @Before
@@ -208,8 +203,8 @@
         generateRecordStream(answer, outRecordDescriptor, 0, 100, 1);
     }
 
-    private void generateRecordStream(List<Object[]> inputs, RecordDescriptor recordDesc,
-            int start, int end, int step) {
+    private void generateRecordStream(List<Object[]> inputs, RecordDescriptor recordDesc, int start, int end,
+            int step) {
         for (int i = start; i < end; i += step) {
             Object[] obj = new Object[recordDesc.getFieldCount()];
             for (int f = 0; f < recordDesc.getFieldCount(); f++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/RunMergingFrameReaderTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/RunMergingFrameReaderTest.java
index c68d59d..a219518 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/RunMergingFrameReaderTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/RunMergingFrameReaderTest.java
@@ -19,16 +19,8 @@
 
 package org.apache.hyracks.tests.unit;
 
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.ComparatorFactories;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.GRandom;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.RecordDesc;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.SortFields;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.generateRandomRecord;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.matchResult;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.prepareData;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.testUtils;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.*;
+import static org.junit.Assert.*;
 
 import java.io.DataInputStream;
 import java.util.ArrayList;
@@ -71,7 +63,7 @@
         private final int numFrames;
         private final int minRecordSize;
         private final int maxRecordSize;
-        private TreeMap<Integer, String> result = new TreeMap<>();
+        private final TreeMap<Integer, String> result = new TreeMap<>();
         int maxFrameSize;
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(RecordDesc.getFieldCount());
@@ -186,8 +178,8 @@
         prepareRandomInputRunList(ctx, pageSize, numRuns, numFramesPerRun, minRecordSize, maxRecordSize, readerList,
                 frameList, keyValueMapList);
 
-        RunMergingFrameReader reader = new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators,
-                null, RecordDesc);
+        RunMergingFrameReader reader =
+                new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators, null, RecordDesc);
         testMergeSucceed(ctx, reader, keyValueMapList);
     }
 
@@ -207,8 +199,8 @@
         prepareRandomInputRunList(ctx, pageSize, numRuns, numFramesPerRun, minRecordSize, maxRecordSize, readerList,
                 frameList, keyValueMapList);
 
-        RunMergingFrameReader reader = new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators,
-                null, RecordDesc);
+        RunMergingFrameReader reader =
+                new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators, null, RecordDesc);
         testMergeSucceed(ctx, reader, keyValueMapList);
     }
 
@@ -291,8 +283,8 @@
         prepareRandomInputRunList(ctx, pageSize, numRuns, numFramesPerRun, minRecordSize, maxRecordSize, readerList,
                 frameList, keyValueMap);
 
-        RunMergingFrameReader reader = new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators,
-                null, RecordDesc);
+        RunMergingFrameReader reader =
+                new RunMergingFrameReader(ctx, readerList, frameList, SortFields, Comparators, null, RecordDesc);
         testMergeSucceed(ctx, reader, keyValueMap);
     }
 
@@ -342,8 +334,8 @@
         for (GeneratedRunFileReader run : runGenerator.getRuns()) {
             runs.add(run);
         }
-        RunMergingFrameReader reader = new RunMergingFrameReader(ctx, runs, inFrame, SortFields, Comparators, null,
-                RecordDesc);
+        RunMergingFrameReader reader =
+                new RunMergingFrameReader(ctx, runs, inFrame, SortFields, Comparators, null, RecordDesc);
 
         IFrame outFrame = new VSizeFrame(ctx);
         reader.open();
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/TopKRunGeneratorTest.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/TopKRunGeneratorTest.java
index f621bf9..016fe0b 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/TopKRunGeneratorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/unit/TopKRunGeneratorTest.java
@@ -19,13 +19,8 @@
 
 package org.apache.hyracks.tests.unit;
 
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.ComparatorFactories;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.RecordDesc;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.SerDers;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.SortFields;
-import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.assertFTADataIsSorted;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.apache.hyracks.tests.unit.AbstractRunGeneratorTest.*;
+import static org.junit.Assert.*;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -38,10 +33,13 @@
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAppender;
+import org.apache.hyracks.dataflow.common.data.normalizers.IntegerNormalizedKeyComputerFactory;
+import org.apache.hyracks.dataflow.common.data.normalizers.UTF8StringNormalizedKeyComputerFactory;
 import org.apache.hyracks.dataflow.std.sort.AbstractSortRunGenerator;
 import org.apache.hyracks.dataflow.std.sort.HeapSortRunGenerator;
 import org.apache.hyracks.dataflow.std.sort.HybridTopKSortRunGenerator;
@@ -126,12 +124,24 @@
     }
 
     @Test
-    public void testHybridTopKShouldSwitchToFrameSorterWhenFlushed() {
-        int topK = 1;
+    public void testHybridTopKWithOneNormalizedKey() throws HyracksDataException {
+        int topK = SORT_FRAME_LIMIT;
         IHyracksTaskContext ctx = AbstractRunGeneratorTest.testUtils.create(PAGE_SIZE);
-        AbstractSortRunGenerator sorter = new HybridTopKSortRunGenerator(ctx, SORT_FRAME_LIMIT, topK, SortFields, null,
-                ComparatorFactories, RecordDesc);
+        AbstractSortRunGenerator sorter = new HybridTopKSortRunGenerator(ctx, SORT_FRAME_LIMIT, topK, SortFields,
+                new INormalizedKeyComputerFactory[] { new IntegerNormalizedKeyComputerFactory() }, ComparatorFactories,
+                RecordDesc);
+        testInMemoryOnly(ctx, topK, ORDER.REVERSE, sorter);
+    }
 
+    @Test
+    public void testHybridTopKWithTwoNormalizedKeys() throws HyracksDataException {
+        int topK = SORT_FRAME_LIMIT;
+        IHyracksTaskContext ctx = AbstractRunGeneratorTest.testUtils.create(PAGE_SIZE);
+        AbstractSortRunGenerator sorter = new HybridTopKSortRunGenerator(ctx,
+                SORT_FRAME_LIMIT, topK, SortFields, new INormalizedKeyComputerFactory[] {
+                        new IntegerNormalizedKeyComputerFactory(), new UTF8StringNormalizedKeyComputerFactory() },
+                ComparatorFactories, RecordDesc);
+        testInMemoryOnly(ctx, topK, ORDER.REVERSE, sorter);
     }
 
     private void testInMemoryOnly(IHyracksTaskContext ctx, int topK, ORDER order, AbstractSortRunGenerator sorter)
@@ -148,7 +158,7 @@
 
         List<IFrame> frameList = new ArrayList<>();
         int minDataSize = PAGE_SIZE * NUM_PAGES * 4 / 5;
-        int minRecordSize = 16;
+        int minRecordSize = 64;
         int maxRecordSize = 64;
 
         AbstractRunGeneratorTest.prepareData(ctx, frameList, minDataSize, minRecordSize, maxRecordSize, null,
@@ -162,7 +172,6 @@
 
         doSort(sorter, buffer);
 
-        assertEquals(0, sorter.getRuns().size());
         validateResult(sorter, topKAnswer);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/ExceptionOnCreatePushRuntimeOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/ExceptionOnCreatePushRuntimeOperatorDescriptor.java
index d704671..10d6947 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/ExceptionOnCreatePushRuntimeOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/ExceptionOnCreatePushRuntimeOperatorDescriptor.java
@@ -20,8 +20,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -31,10 +29,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
 import org.apache.hyracks.dataflow.std.base.AbstractSingleActivityOperatorDescriptor;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExceptionOnCreatePushRuntimeOperatorDescriptor extends AbstractSingleActivityOperatorDescriptor {
     private static final long serialVersionUID = 1L;
-    private static Logger LOGGER = Logger.getLogger(ExceptionOnCreatePushRuntimeOperatorDescriptor.class.getName());
+    private static Logger LOGGER = LogManager.getLogger();
     private static AtomicInteger createPushRuntime = new AtomicInteger();
     private static AtomicInteger initializeCounter = new AtomicInteger();
     private static AtomicInteger openCloseCounter = new AtomicInteger();
@@ -130,10 +131,10 @@
     public static boolean succeed() {
         boolean success = openCloseCounter.get() == 0 && createPushRuntime.get() == 0 && initializeCounter.get() == 0;
         if (!success) {
-            LOGGER.log(Level.SEVERE, "Failure:");
-            LOGGER.log(Level.SEVERE, "CreatePushRuntime:" + createPushRuntime.get());
-            LOGGER.log(Level.SEVERE, "InitializeCounter:" + initializeCounter.get());
-            LOGGER.log(Level.SEVERE, "OpenCloseCounter:" + openCloseCounter.get());
+            LOGGER.log(Level.ERROR, "Failure:");
+            LOGGER.log(Level.ERROR, "CreatePushRuntime:" + createPushRuntime.get());
+            LOGGER.log(Level.ERROR, "InitializeCounter:" + initializeCounter.get());
+            LOGGER.log(Level.ERROR, "OpenCloseCounter:" + openCloseCounter.get());
         }
         return success;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/FailOnInitializeDeInitializeOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/FailOnInitializeDeInitializeOperatorDescriptor.java
new file mode 100644
index 0000000..56d59ab
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/FailOnInitializeDeInitializeOperatorDescriptor.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.tests.util;
+
+import org.apache.hyracks.api.comm.IFrameWriter;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.dataflow.IOperatorNodePushable;
+import org.apache.hyracks.api.dataflow.value.IRecordDescriptorProvider;
+import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.job.IOperatorDescriptorRegistry;
+import org.apache.hyracks.dataflow.std.base.AbstractSingleActivityOperatorDescriptor;
+
+public class FailOnInitializeDeInitializeOperatorDescriptor extends AbstractSingleActivityOperatorDescriptor {
+    public static final String INIT_ERROR_MESSAGE = "Failure on initialize()";
+    public static final String DEINIT_ERROR_MESSAGE = "Failure on deinitialize()";
+    private final boolean failOnInit;
+    private final boolean failOnDeinit;
+
+    public FailOnInitializeDeInitializeOperatorDescriptor(IOperatorDescriptorRegistry spec, boolean failOnInit,
+            boolean failOnDeInit) {
+        super(spec, 0, 1);
+        this.failOnInit = failOnInit;
+        this.failOnDeinit = failOnDeInit;
+    }
+
+    @Override
+    public IOperatorNodePushable createPushRuntime(IHyracksTaskContext ctx,
+            IRecordDescriptorProvider recordDescProvider, int partition, int nPartitions) throws HyracksDataException {
+        return new IOperatorNodePushable() {
+            @Override
+            public void initialize() throws HyracksDataException {
+                if (failOnInit) {
+                    throw new RuntimeException(INIT_ERROR_MESSAGE);
+                }
+            }
+
+            @Override
+            public void deinitialize() throws HyracksDataException {
+                if (failOnDeinit) {
+                    throw new RuntimeException(DEINIT_ERROR_MESSAGE);
+                }
+            }
+
+            @Override
+            public int getInputArity() {
+                return 0;
+            }
+
+            @Override
+            public void setOutputFrameWriter(int index, IFrameWriter writer, RecordDescriptor recordDesc)
+                    throws HyracksDataException {
+                // ignore
+            }
+
+            @Override
+            public IFrameWriter getInputFrameWriter(int index) {
+                return null;
+            }
+
+            @Override
+            public String getDisplayName() {
+                return FailOnInitializeDeInitializeOperatorDescriptor.class.getSimpleName();
+            }
+        };
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/OutputFrameVerifier.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/OutputFrameVerifier.java
index 77b6913..13ed058 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/OutputFrameVerifier.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-integration-tests/src/test/java/org/apache/hyracks/tests/util/OutputFrameVerifier.java
@@ -56,8 +56,7 @@
             Object[] objects = new Object[inputRecordDescriptor.getFieldCount()];
             for (int fid = 0; fid < inputRecordDescriptor.getFieldCount(); fid++) {
                 ByteArrayInputStream bais = new ByteArrayInputStream(frameAccessor.getBuffer().array(),
-                        frameAccessor.getAbsoluteFieldStartOffset(tid, fid),
-                        frameAccessor.getFieldLength(tid, fid));
+                        frameAccessor.getAbsoluteFieldStartOffset(tid, fid), frameAccessor.getFieldLength(tid, fid));
                 DataInputStream dis = new DataInputStream(bais);
                 objects[fid] = inputRecordDescriptor.getFields()[fid].deserialize(dis);
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/pom.xml
index 89336b3..a6925ea 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/pom.xml
@@ -209,5 +209,9 @@
       <artifactId>hyracks-control-cc</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/src/test/java/org/apache/hyracks/examples/shutdown/test/ClusterShutdownIT.java b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/src/test/java/org/apache/hyracks/examples/shutdown/test/ClusterShutdownIT.java
index c1083c9f..7c85d5a 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/src/test/java/org/apache/hyracks/examples/shutdown/test/ClusterShutdownIT.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/hyracks-shutdown-test/src/test/java/org/apache/hyracks/examples/shutdown/test/ClusterShutdownIT.java
@@ -19,41 +19,44 @@
 package org.apache.hyracks.examples.shutdown.test;
 
 import java.net.ServerSocket;
-import java.util.logging.Logger;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
 
 import org.apache.hyracks.api.client.HyracksConnection;
 import org.apache.hyracks.api.client.IHyracksClientConnection;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class ClusterShutdownIT {
-    private static Logger LOGGER = Logger.getLogger(ClusterShutdownIT.class.getName());
+    private static Logger LOGGER = LogManager.getLogger();
     @Rule
     public ExpectedException closeTwice = ExpectedException.none();
+
     @Test
     public void runShutdown() throws Exception {
         IHyracksClientConnection hcc = new HyracksConnection("localhost", 1098);
         hcc.stopCluster(false);
         //what happens here...
         closeTwice.expect(IPCException.class);
-        closeTwice.expectMessage("Cannot send on a closed handle");
+        closeTwice.expectMessage("Connection failed to localhost/127.0.0.1:1098");
         hcc.stopCluster(false);
         ServerSocket c = null;
         ServerSocket s = null;
         try {
-            c = new ServerSocket(1098);
-            //we should be able to bind to this
-            s = new ServerSocket(1099);
-            //and we should be able to bind to this too
+            c = new ServerSocket(1098); // we should be able to bind to this
+            s = new ServerSocket(1099); // and we should be able to bind to this too
         } catch (Exception e) {
-            LOGGER.severe(e.getMessage());
+            LOGGER.error("Unexpected error", e);
             throw e;
         } finally {
-            s.close();
-            c.close();
+            if (s != null) {
+                s.close();
+            }
+            if (c != null) {
+                c.close();
+            }
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/text-example/textclient/src/main/java/org/apache/hyracks/examples/text/client/WordCountMain.java b/hyracks-fullstack/hyracks/hyracks-examples/text-example/textclient/src/main/java/org/apache/hyracks/examples/text/client/WordCountMain.java
index 650c60d..23a6be0 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/text-example/textclient/src/main/java/org/apache/hyracks/examples/text/client/WordCountMain.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/text-example/textclient/src/main/java/org/apache/hyracks/examples/text/client/WordCountMain.java
@@ -29,6 +29,7 @@
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.IBinaryHashFunctionFactory;
 import org.apache.hyracks.api.dataflow.value.IBinaryHashFunctionFamily;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.dataflow.value.RecordDescriptor;
 import org.apache.hyracks.api.io.FileSplit;
@@ -139,11 +140,11 @@
         JobSpecification spec = new JobSpecification(frameSize);
 
         IFileSplitProvider splitsProvider = new ConstantFileSplitProvider(inSplits);
-        RecordDescriptor wordDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor wordDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        FileScanOperatorDescriptor wordScanner = new FileScanOperatorDescriptor(spec, splitsProvider,
-                new WordTupleParserFactory(), wordDesc);
+        FileScanOperatorDescriptor wordScanner =
+                new FileScanOperatorDescriptor(spec, splitsProvider, new WordTupleParserFactory(), wordDesc);
         createPartitionConstraint(spec, wordScanner, inSplits);
 
         RecordDescriptor groupResultDesc = new RecordDescriptor(new ISerializerDeserializer[] {
@@ -170,13 +171,16 @@
                             PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) }));
             spec.connect(scanGroupConn, wordScanner, 0, gBy, 0);
         } else {
-            IBinaryComparatorFactory[] cfs = new IBinaryComparatorFactory[] {
-                    PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
-            IOperatorDescriptor sorter = "memsort".equalsIgnoreCase(algo)
-                    ? new InMemorySortOperatorDescriptor(spec, keys, new UTF8StringNormalizedKeyComputerFactory(), cfs,
-                            wordDesc)
-                    : new ExternalSortOperatorDescriptor(spec, frameLimit, keys,
-                            new UTF8StringNormalizedKeyComputerFactory(), cfs, wordDesc);
+            IBinaryComparatorFactory[] cfs =
+                    new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+            IOperatorDescriptor sorter =
+                    "memsort".equalsIgnoreCase(algo)
+                            ? new InMemorySortOperatorDescriptor(spec, keys,
+                                    new INormalizedKeyComputerFactory[] {
+                                            new UTF8StringNormalizedKeyComputerFactory() },
+                                    cfs, wordDesc)
+                            : new ExternalSortOperatorDescriptor(spec, frameLimit, keys,
+                                    new UTF8StringNormalizedKeyComputerFactory(), cfs, wordDesc);
             createPartitionConstraint(spec, sorter, outSplits);
 
             IConnectorDescriptor scanSortConn = new MToNPartitioningConnectorDescriptor(spec,
@@ -195,9 +199,9 @@
         }
 
         IFileSplitProvider outSplitProvider = new ConstantFileSplitProvider(outSplits);
-        IOperatorDescriptor writer = "text".equalsIgnoreCase(format)
-                ? new PlainFileWriterOperatorDescriptor(spec, outSplitProvider, ",")
-                : new FrameFileWriterOperatorDescriptor(spec, outSplitProvider);
+        IOperatorDescriptor writer =
+                "text".equalsIgnoreCase(format) ? new PlainFileWriterOperatorDescriptor(spec, outSplitProvider, ",")
+                        : new FrameFileWriterOperatorDescriptor(spec, outSplitProvider);
         createPartitionConstraint(spec, writer, outSplits);
 
         IConnectorDescriptor gbyPrinterConn = new OneToOneConnectorDescriptor(spec);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Common.java b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Common.java
index 3c0ecfd..2844d02 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Common.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Common.java
@@ -43,22 +43,22 @@
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    static RecordDescriptor ordersDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer() });
-    static RecordDescriptor custOrderJoinDesc = new RecordDescriptor(new ISerializerDeserializer[] {
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-            new UTF8StringSerializerDeserializer() });
+    static RecordDescriptor ordersDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
+    static RecordDescriptor custOrderJoinDesc =
+            new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                    new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
     static RecordDescriptor lineitemDesc = new RecordDescriptor(new ISerializerDeserializer[] {
             IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
@@ -70,25 +70,20 @@
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
             new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() });
 
-    static IValueParserFactory[] lineitemParserFactories = new IValueParserFactory[] {
-            IntegerParserFactory.INSTANCE, IntegerParserFactory.INSTANCE,
-            IntegerParserFactory.INSTANCE, IntegerParserFactory.INSTANCE,
-            IntegerParserFactory.INSTANCE, FloatParserFactory.INSTANCE,
-            FloatParserFactory.INSTANCE, FloatParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, };
+    static IValueParserFactory[] lineitemParserFactories = new IValueParserFactory[] { IntegerParserFactory.INSTANCE,
+            IntegerParserFactory.INSTANCE, IntegerParserFactory.INSTANCE, IntegerParserFactory.INSTANCE,
+            IntegerParserFactory.INSTANCE, FloatParserFactory.INSTANCE, FloatParserFactory.INSTANCE,
+            FloatParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, };
 
     static IValueParserFactory[] custParserFactories = new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
             UTF8StringParserFactory.INSTANCE };
     static IValueParserFactory[] orderParserFactories = new IValueParserFactory[] { UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
-            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
+            UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE,
             UTF8StringParserFactory.INSTANCE, UTF8StringParserFactory.INSTANCE };
 
     static FileSplit[] parseFileSplits(String fileSplits) {
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Groupby.java b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Groupby.java
index 42fe8c9..80c4f88 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Groupby.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Groupby.java
@@ -134,8 +134,8 @@
         createPartitionConstraint(spec, fileScanner, inSplits);
 
         // Output: each unique string with an integer count
-        RecordDescriptor outDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+        RecordDescriptor outDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
                         // IntegerSerializerDeserializer.INSTANCE,
                         IntegerSerializerDeserializer.INSTANCE });
 
@@ -187,9 +187,9 @@
         spec.connect(scanGroupConnDef2, fileScanner, 0, grouper, 0);
 
         IFileSplitProvider outSplitProvider = new ConstantFileSplitProvider(outSplits);
-        AbstractSingleActivityOperatorDescriptor writer = outPlain ? new PlainFileWriterOperatorDescriptor(spec,
-                outSplitProvider, "|")
-                : new FrameFileWriterOperatorDescriptor(spec, outSplitProvider);
+        AbstractSingleActivityOperatorDescriptor writer =
+                outPlain ? new PlainFileWriterOperatorDescriptor(spec, outSplitProvider, "|")
+                        : new FrameFileWriterOperatorDescriptor(spec, outSplitProvider);
         createPartitionConstraint(spec, writer, outSplits);
         IConnectorDescriptor groupOutConn = new OneToOneConnectorDescriptor(spec);
         spec.connect(groupOutConn, grouper, 0, writer, 0);
diff --git a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Sort.java b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Sort.java
index 8ab0708..5043974 100644
--- a/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Sort.java
+++ b/hyracks-fullstack/hyracks/hyracks-examples/tpch-example/tpchclient/src/main/java/org/apache/hyracks/examples/tpch/client/Sort.java
@@ -19,10 +19,7 @@
 
 package org.apache.hyracks.examples.tpch.client;
 
-import static org.apache.hyracks.examples.tpch.client.Common.createPartitionConstraint;
-import static org.apache.hyracks.examples.tpch.client.Common.orderParserFactories;
-import static org.apache.hyracks.examples.tpch.client.Common.ordersDesc;
-import static org.apache.hyracks.examples.tpch.client.Common.parseFileSplits;
+import static org.apache.hyracks.examples.tpch.client.Common.*;
 
 import java.util.EnumSet;
 
@@ -31,6 +28,7 @@
 import org.apache.hyracks.api.dataflow.IOperatorDescriptor;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.IBinaryHashFunctionFactory;
+import org.apache.hyracks.api.dataflow.value.INormalizedKeyComputerFactory;
 import org.apache.hyracks.api.io.FileSplit;
 import org.apache.hyracks.api.job.JobFlag;
 import org.apache.hyracks.api.job.JobId;
@@ -89,13 +87,13 @@
     }
 
     static int[] SortFields = new int[] { 1, 0 };
-    static IBinaryComparatorFactory[] SortFieldsComparatorFactories = new IBinaryComparatorFactory[] {
-            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
-            PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
+    static IBinaryComparatorFactory[] SortFieldsComparatorFactories =
+            new IBinaryComparatorFactory[] { PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY),
+                    PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY) };
 
-    static IBinaryHashFunctionFactory[] orderBinaryHashFunctionFactories = new IBinaryHashFunctionFactory[] {
-            PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
-            PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) };
+    static IBinaryHashFunctionFactory[] orderBinaryHashFunctionFactories =
+            new IBinaryHashFunctionFactory[] { PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY),
+                    PointableBinaryHashFunctionFactory.of(UTF8StringPointable.FACTORY) };
 
     public static void main(String[] args) throws Exception {
         Options options = new Options();
@@ -109,8 +107,8 @@
         IHyracksClientConnection hcc = new HyracksConnection(options.host, options.port);
 
         JobSpecification job = createJob(parseFileSplits(options.inFileOrderSplits),
-                parseFileSplits(options.outFileSplits),
-                options.memBufferAlg, options.frameLimit, options.frameSize, options.topK, options.usingHeapSorter);
+                parseFileSplits(options.outFileSplits), options.memBufferAlg, options.frameLimit, options.frameSize,
+                options.topK, options.usingHeapSorter);
 
         long start = System.currentTimeMillis();
         JobId jobId = hcc.startJob(job,
@@ -131,12 +129,12 @@
         createPartitionConstraint(spec, ordScanner, ordersSplits);
         AbstractSorterOperatorDescriptor sorter;
         if (usingHeapSorter && limit < Integer.MAX_VALUE) {
-            sorter = new TopKSorterOperatorDescriptor(spec, frameLimit, limit, SortFields, null,
-                    SortFieldsComparatorFactories, ordersDesc);
+            sorter = new TopKSorterOperatorDescriptor(spec, frameLimit, limit, SortFields,
+                    (INormalizedKeyComputerFactory) null, SortFieldsComparatorFactories, ordersDesc);
         } else {
             if (memBufferAlg.equalsIgnoreCase("bestfit")) {
-                sorter = new ExternalSortOperatorDescriptor(spec, frameLimit, SortFields,
-                        null, SortFieldsComparatorFactories, ordersDesc, Algorithm.MERGE_SORT,
+                sorter = new ExternalSortOperatorDescriptor(spec, frameLimit, SortFields, null,
+                        SortFieldsComparatorFactories, ordersDesc, Algorithm.MERGE_SORT,
                         EnumFreeSlotPolicy.SMALLEST_FIT, limit);
             } else if (memBufferAlg.equalsIgnoreCase("biggestfit")) {
                 sorter = new ExternalSortOperatorDescriptor(spec, frameLimit, SortFields, null,
@@ -158,8 +156,8 @@
 
         spec.connect(
                 new MToNPartitioningMergingConnectorDescriptor(spec,
-                        new FieldHashPartitionComputerFactory(SortFields, orderBinaryHashFunctionFactories),
-                        SortFields, SortFieldsComparatorFactories, new UTF8StringNormalizedKeyComputerFactory()),
+                        new FieldHashPartitionComputerFactory(SortFields, orderBinaryHashFunctionFactories), SortFields,
+                        SortFieldsComparatorFactories, new UTF8StringNormalizedKeyComputerFactory()),
                 sorter, 0, printer, 0);
 
         spec.addRoot(printer);
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/pom.xml b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/pom.xml
index 460b5c3..6f4726e 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/pom.xml
@@ -410,5 +410,9 @@
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/INcCollectionBuilder.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/INcCollectionBuilder.java
index 9010378..02c5fb3 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/INcCollectionBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/INcCollectionBuilder.java
@@ -30,7 +30,6 @@
  */
 public interface INcCollectionBuilder {
 
-    public INcCollection build(Map<String, NodeControllerInfo> ncNameToNcInfos,
-            Map<String, List<String>> ipToNcMapping, Map<String, Integer> ncNameToIndex, String[] NCs, int[] workloads,
-            int slotLimit);
+    public INcCollection build(Map<String, NodeControllerInfo> ncNameToNcInfos, Map<String, List<String>> ipToNcMapping,
+            Map<String, Integer> ncNameToIndex, String[] NCs, int[] workloads, int slotLimit);
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/ITupleWriterFactory.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/ITupleWriterFactory.java
index 6d3a082..57dadb0 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/ITupleWriterFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/api/ITupleWriterFactory.java
@@ -34,6 +34,7 @@
      *            the IHyracksTaskContext
      * @return a tuple writer instance
      */
-    public ITupleWriter getTupleWriter(IHyracksTaskContext ctx, int partition, int nPartition) throws HyracksDataException;
+    public ITupleWriter getTupleWriter(IHyracksTaskContext ctx, int partition, int nPartition)
+            throws HyracksDataException;
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/dataflow/HDFSReadOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/dataflow/HDFSReadOperatorDescriptor.java
index 8357ae0..021efca 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/dataflow/HDFSReadOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/dataflow/HDFSReadOperatorDescriptor.java
@@ -90,7 +90,7 @@
     @Override
     public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
             IRecordDescriptorProvider recordDescProvider, final int partition, final int nPartitions)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         final InputSplit[] inputSplits = splitsFactory.getSplits();
 
         return new AbstractUnaryOutputSourceOperatorNodePushable() {
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/IPProximityNcCollectionBuilder.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/IPProximityNcCollectionBuilder.java
index 6d7d63b..c53a779 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/IPProximityNcCollectionBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/IPProximityNcCollectionBuilder.java
@@ -46,8 +46,7 @@
                 byte[] rawip;
                 try {
                     rawip = ncNameToNcInfos.get(NCs[i]).getNetworkAddress().lookupIpAddress();
-                }
-                catch (UnknownHostException e) {
+                } catch (UnknownHostException e) {
                     // QQQ Should probably have a neater solution than this
                     throw new RuntimeException(e);
                 }
@@ -122,8 +121,8 @@
                         /**
                          * Update the entry of the selected NC
                          */
-                        List<String> dataLocations = ipToNcMapping.get(InetAddress.getByAddress(
-                                currentCandidateIp.getBytes()).getHostAddress());
+                        List<String> dataLocations = ipToNcMapping
+                                .get(InetAddress.getByAddress(currentCandidateIp.getBytes()).getHostAddress());
                         for (String nc : dataLocations) {
                             int ncIndex = ncNameToIndex.get(nc);
                             if (workloads[ncIndex] < slotLimit) {
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/RackAwareNcCollectionBuilder.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/RackAwareNcCollectionBuilder.java
index 4937a15..63be8c5 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/RackAwareNcCollectionBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/RackAwareNcCollectionBuilder.java
@@ -25,7 +25,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TreeMap;
-import java.util.logging.Logger;
 
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.mapred.InputSplit;
@@ -33,10 +32,12 @@
 import org.apache.hyracks.api.topology.ClusterTopology;
 import org.apache.hyracks.hdfs.api.INcCollection;
 import org.apache.hyracks.hdfs.api.INcCollectionBuilder;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @SuppressWarnings("deprecation")
 public class RackAwareNcCollectionBuilder implements INcCollectionBuilder {
-    private static final Logger LOGGER = Logger.getLogger(RackAwareNcCollectionBuilder.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private ClusterTopology topology;
 
     public RackAwareNcCollectionBuilder(ClusterTopology topology) {
@@ -51,8 +52,8 @@
             final Map<List<Integer>, List<String>> pathToNCs = new HashMap<List<Integer>, List<String>>();
             for (String NC : NCs) {
                 List<Integer> path = new ArrayList<>();
-                String ipAddress = InetAddress.getByAddress(
-                        ncNameToNcInfos.get(NC).getNetworkAddress().lookupIpAddress()).getHostAddress();
+                String ipAddress = InetAddress
+                        .getByAddress(ncNameToNcInfos.get(NC).getNetworkAddress().lookupIpAddress()).getHostAddress();
                 topology.lookupNetworkTerminal(ipAddress, path);
                 if (path.isEmpty()) {
                     // if the hyracks nc is not in the defined cluster
@@ -63,8 +64,8 @@
                 ncs.add(NC);
             }
 
-            final TreeMap<List<Integer>, IntWritable> availableIpsToSlots = new TreeMap<List<Integer>, IntWritable>(
-                    (l1, l2) -> {
+            final TreeMap<List<Integer>, IntWritable> availableIpsToSlots =
+                    new TreeMap<List<Integer>, IntWritable>((l1, l2) -> {
                         int commonLength = Math.min(l1.size(), l2.size());
                         for (int i = 0; i < commonLength; i++) {
                             int value1 = l1.get(i);
@@ -79,8 +80,9 @@
             for (int i = 0; i < workloads.length; i++) {
                 if (workloads[i] < slotLimit) {
                     List<Integer> path = new ArrayList<Integer>();
-                    String ipAddress = InetAddress.getByAddress(
-                            ncNameToNcInfos.get(NCs[i]).getNetworkAddress().lookupIpAddress()).getHostAddress();
+                    String ipAddress =
+                            InetAddress.getByAddress(ncNameToNcInfos.get(NCs[i]).getNetworkAddress().lookupIpAddress())
+                                    .getHostAddress();
                     topology.lookupNetworkTerminal(ipAddress, path);
                     if (path.isEmpty()) {
                         // if the hyracks nc is not in the defined cluster
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/Scheduler.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/Scheduler.java
index f9b68bc..25cc9b3 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/Scheduler.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs/scheduler/Scheduler.java
@@ -30,7 +30,6 @@
 import java.util.Map;
 import java.util.PriorityQueue;
 import java.util.Random;
-import java.util.logging.Logger;
 
 import org.apache.hadoop.io.IntWritable;
 import org.apache.hadoop.mapred.InputSplit;
@@ -42,13 +41,15 @@
 import org.apache.hyracks.api.topology.ClusterTopology;
 import org.apache.hyracks.hdfs.api.INcCollection;
 import org.apache.hyracks.hdfs.api.INcCollectionBuilder;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * The scheduler conduct data-local scheduling for data reading on HDFS. This
  * class works for Hadoop old API.
  */
 public class Scheduler {
-    private static final Logger LOGGER = Logger.getLogger(Scheduler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     /** a list of NCs */
     private String[] NCs;
@@ -129,8 +130,8 @@
     public Scheduler(Map<String, NodeControllerInfo> ncNameToNcInfos, ClusterTopology topology)
             throws HyracksException {
         this(ncNameToNcInfos);
-        this.ncCollectionBuilder = topology == null ? new IPProximityNcCollectionBuilder()
-                : new RackAwareNcCollectionBuilder(topology);
+        this.ncCollectionBuilder =
+                topology == null ? new IPProximityNcCollectionBuilder() : new RackAwareNcCollectionBuilder(topology);
     }
 
     /**
@@ -275,7 +276,7 @@
      */
     private void scheduleLocalSlots(InputSplit[] splits, int[] workloads, String[] locations, int slots, Random random,
             boolean[] scheduled, final Map<String, IntWritable> locationToNumSplits)
-                    throws IOException, UnknownHostException {
+            throws IOException, UnknownHostException {
         /** scheduling candidates will be ordered inversely according to their popularity */
         PriorityQueue<String> scheduleCadndiates = new PriorityQueue<String>(3, new Comparator<String>() {
 
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/dataflow/HDFSReadOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/dataflow/HDFSReadOperatorDescriptor.java
index 15bf260..0c635e0 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/dataflow/HDFSReadOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/dataflow/HDFSReadOperatorDescriptor.java
@@ -103,7 +103,7 @@
     @Override
     public IOperatorNodePushable createPushRuntime(final IHyracksTaskContext ctx,
             IRecordDescriptorProvider recordDescProvider, final int partition, final int nPartitions)
-                    throws HyracksDataException {
+            throws HyracksDataException {
         final List<FileSplit> inputSplits = splitsFactory.getSplits();
 
         return new AbstractUnaryOutputSourceOperatorNodePushable() {
@@ -120,8 +120,8 @@
                     Job job = confFactory.getConf();
                     job.getConfiguration().setClassLoader(ctx.getJobletContext().getClassLoader());
                     IKeyValueParser parser = tupleParserFactory.createKeyValueParser(ctx);
-                    InputFormat inputFormat = ReflectionUtils.newInstance(job.getInputFormatClass(),
-                            job.getConfiguration());
+                    InputFormat inputFormat =
+                            ReflectionUtils.newInstance(job.getInputFormatClass(), job.getConfiguration());
                     int size = inputSplits.size();
                     for (int i = 0; i < size; i++) {
                         /**
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/scheduler/Scheduler.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/scheduler/Scheduler.java
index 97960bc..fb46842 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/scheduler/Scheduler.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/main/java/org/apache/hyracks/hdfs2/scheduler/Scheduler.java
@@ -69,7 +69,8 @@
      *            the hyracks cluster toplogy
      * @throws HyracksException
      */
-    public Scheduler(Map<String, NodeControllerInfo> ncNameToNcInfos, ClusterTopology topology) throws HyracksException {
+    public Scheduler(Map<String, NodeControllerInfo> ncNameToNcInfos, ClusterTopology topology)
+            throws HyracksException {
         scheduler = new org.apache.hyracks.hdfs.scheduler.Scheduler(ncNameToNcInfos, topology);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/dataflow/DataflowTest.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/dataflow/DataflowTest.java
index 0d0cd3e..b8351f3 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/dataflow/DataflowTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/dataflow/DataflowTest.java
@@ -73,7 +73,6 @@
     private static final String PATH_TO_HADOOP_CONF = FileUtil.joinPath(TEST_RESOURCES, "hadoop", "conf");
     protected static final String BUILD_DIR = FileUtil.joinPath("target", "build");
 
-
     private static final String DATA_PATH = FileUtil.joinPath(TEST_RESOURCES, "data", "customer.tbl");
     protected static final String HDFS_INPUT_PATH = "/customer/";
     protected static final String HDFS_OUTPUT_PATH = "/customer_result/";
@@ -151,11 +150,11 @@
 
         String[] readSchedule = scheduler.getLocationConstraints(splits);
         JobSpecification jobSpec = new JobSpecification();
-        RecordDescriptor recordDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor recordDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        String[] locations = new String[] { HyracksUtils.NC1_ID, HyracksUtils.NC1_ID, HyracksUtils.NC2_ID,
-                HyracksUtils.NC2_ID };
+        String[] locations =
+                new String[] { HyracksUtils.NC1_ID, HyracksUtils.NC1_ID, HyracksUtils.NC2_ID, HyracksUtils.NC2_ID };
         HDFSReadOperatorDescriptor readOperator = new HDFSReadOperatorDescriptor(jobSpec, recordDesc, conf, splits,
                 readSchedule, new TextKeyValueParserFactory());
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, readOperator, locations);
@@ -164,19 +163,21 @@
                 new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, recordDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, sortOperator, locations);
 
-        HDFSWriteOperatorDescriptor writeOperator = new HDFSWriteOperatorDescriptor(jobSpec, conf,
-                new TextTupleWriterFactory());
+        HDFSWriteOperatorDescriptor writeOperator =
+                new HDFSWriteOperatorDescriptor(jobSpec, conf, new TextTupleWriterFactory());
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, writeOperator, HyracksUtils.NC1_ID);
 
         jobSpec.connect(new OneToOneConnectorDescriptor(jobSpec), readOperator, 0, sortOperator, 0);
-        jobSpec.connect(new MToNPartitioningMergingConnectorDescriptor(jobSpec, new FieldHashPartitionComputerFactory(
-                new int[] { 0 }, new IBinaryHashFunctionFactory[] { RawBinaryHashFunctionFactory.INSTANCE }),
-                new int[] { 0 }, new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, null),
+        jobSpec.connect(
+                new MToNPartitioningMergingConnectorDescriptor(jobSpec,
+                        new FieldHashPartitionComputerFactory(new int[] { 0 },
+                                new IBinaryHashFunctionFactory[] { RawBinaryHashFunctionFactory.INSTANCE }),
+                        new int[] { 0 }, new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, null),
                 sortOperator, 0, writeOperator, 0);
         jobSpec.addRoot(writeOperator);
 
-        IHyracksClientConnection client = new HyracksConnection(HyracksUtils.CC_HOST,
-                HyracksUtils.TEST_HYRACKS_CC_CLIENT_PORT);
+        IHyracksClientConnection client =
+                new HyracksConnection(HyracksUtils.CC_HOST, HyracksUtils.TEST_HYRACKS_CC_CLIENT_PORT);
         JobId jobId = client.startJob(jobSpec);
         client.waitForCompletion(jobId);
 
@@ -195,8 +196,8 @@
         Path actual = new Path(ACTUAL_RESULT_DIR);
         dfs.copyToLocalFile(result, actual);
 
-        TestUtils.compareWithResult(new File(FileUtil.joinPath(EXPECTED_RESULT_PATH, "part-0")), new File(
-                FileUtil.joinPath(ACTUAL_RESULT_DIR, "customer_result", "part-0")));
+        TestUtils.compareWithResult(new File(FileUtil.joinPath(EXPECTED_RESULT_PATH, "part-0")),
+                new File(FileUtil.joinPath(ACTUAL_RESULT_DIR, "customer_result", "part-0")));
         return true;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/scheduler/SchedulerTest.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/scheduler/SchedulerTest.java
index 445a15c..b735833 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/scheduler/SchedulerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs/scheduler/SchedulerTest.java
@@ -58,8 +58,8 @@
      * @throws Exception
      */
     public void testSchedulerSimple() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         InputSplit[] fileSplits = new InputSplit[6];
         fileSplits[0] = new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" });
@@ -94,13 +94,13 @@
         int dataPort = 5099;
         int resultPort = 5098;
         int messagingPort = 5097;
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(4, "nc", "10.0.0.",
-                dataPort, resultPort, messagingPort);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(4, "nc", "10.0.0.", dataPort, resultPort, messagingPort);
         ncNameToNcInfos.put("nc7",
-                new NodeControllerInfo("nc7", NodeStatus.ALIVE, new NetworkAddress("10.0.0.7", dataPort),
+                new NodeControllerInfo("nc7", NodeStatus.ACTIVE, new NetworkAddress("10.0.0.7", dataPort),
                         new NetworkAddress("10.0.0.5", resultPort), new NetworkAddress("10.0.0.5", messagingPort), 2));
         ncNameToNcInfos.put("nc12",
-                new NodeControllerInfo("nc12", NodeStatus.ALIVE, new NetworkAddress("10.0.0.12", dataPort),
+                new NodeControllerInfo("nc12", NodeStatus.ACTIVE, new NetworkAddress("10.0.0.12", dataPort),
                         new NetworkAddress("10.0.0.5", resultPort), new NetworkAddress("10.0.0.5", messagingPort), 2));
 
         InputSplit[] fileSplits = new InputSplit[12];
@@ -112,8 +112,8 @@
         fileSplits[5] = new FileSplit(new Path("part-6"), 0, 0, new String[] { "10.0.0.2", "10.0.0.3", "10.0.0.5" });
         fileSplits[6] = new FileSplit(new Path("part-7"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" });
         fileSplits[7] = new FileSplit(new Path("part-8"), 0, 0, new String[] { "10.0.0.3", "10.0.0.4", "10.0.0.5" });
-        fileSplits[8] = new FileSplit(new Path("part-12"), 0, 0,
-                new String[] { "10.0.0.14", "10.0.0.11", "10.0.0.13" });
+        fileSplits[8] =
+                new FileSplit(new Path("part-12"), 0, 0, new String[] { "10.0.0.14", "10.0.0.11", "10.0.0.13" });
         fileSplits[9] = new FileSplit(new Path("part-10"), 0, 0, new String[] { "10.0.0.2", "10.0.0.1", "10.0.0.6" });
         fileSplits[10] = new FileSplit(new Path("part-11"), 0, 0, new String[] { "10.0.0.3", "10.0.0.4", "10.0.0.7" });
         fileSplits[11] = new FileSplit(new Path("part-9"), 0, 0, new String[] { "10.0.0.4", "10.0.0.5", "10.0.0.6" });
@@ -121,14 +121,14 @@
         Scheduler scheduler = new Scheduler(ncNameToNcInfos);
         String[] locationConstraints = scheduler.getLocationConstraints(fileSplits);
 
-        String[] expectedResults = new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc12", "nc7",
-                "nc7", "nc12" };
+        String[] expectedResults =
+                new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc12", "nc7", "nc7", "nc12" };
         for (int i = 0; i < locationConstraints.length; i++) {
             Assert.assertEquals(locationConstraints[i], expectedResults[i]);
         }
 
-        expectedResults = new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc7", "nc12", "nc7",
-                "nc12" };
+        expectedResults =
+                new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc7", "nc12", "nc7", "nc12" };
         ClusterTopology topology = parseTopology();
         scheduler = new Scheduler(ncNameToNcInfos, topology);
         locationConstraints = scheduler.getLocationConstraints(fileSplits);
@@ -143,8 +143,8 @@
      * @throws Exception
      */
     public void testSchedulerSmallerHDFS() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         InputSplit[] fileSplits = new InputSplit[12];
         fileSplits[0] = new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" });
@@ -160,8 +160,8 @@
         fileSplits[10] = new FileSplit(new Path("part-11"), 0, 0, new String[] { "10.0.0.3", "10.0.0.4", "10.0.0.5" });
         fileSplits[11] = new FileSplit(new Path("part-12"), 0, 0, new String[] { "10.0.0.2", "10.0.0.3", "10.0.0.5" });
 
-        String[] expectedResults = new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc5", "nc6",
-                "nc5", "nc6" };
+        String[] expectedResults =
+                new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc5", "nc6", "nc5", "nc6" };
 
         Scheduler scheduler = new Scheduler(ncNameToNcInfos);
         String[] locationConstraints = scheduler.getLocationConstraints(fileSplits);
@@ -184,8 +184,8 @@
      * @throws Exception
      */
     public void testSchedulerSmallerHDFSOdd() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         InputSplit[] fileSplits = new InputSplit[13];
         fileSplits[0] = new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" });
@@ -227,8 +227,8 @@
      * @throws Exception
      */
     public void testSchedulercBoundary() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         /** test empty file splits */
         InputSplit[] fileSplits = new InputSplit[0];
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/dataflow/DataflowTest.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/dataflow/DataflowTest.java
index 3c9b1c0..8be6d69 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/dataflow/DataflowTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/dataflow/DataflowTest.java
@@ -98,11 +98,11 @@
 
         String[] readSchedule = scheduler.getLocationConstraints(splits);
         JobSpecification jobSpec = new JobSpecification();
-        RecordDescriptor recordDesc = new RecordDescriptor(
-                new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
+        RecordDescriptor recordDesc =
+                new RecordDescriptor(new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer() });
 
-        String[] locations = new String[] { HyracksUtils.NC1_ID, HyracksUtils.NC1_ID, HyracksUtils.NC2_ID,
-                HyracksUtils.NC2_ID };
+        String[] locations =
+                new String[] { HyracksUtils.NC1_ID, HyracksUtils.NC1_ID, HyracksUtils.NC2_ID, HyracksUtils.NC2_ID };
         HDFSReadOperatorDescriptor readOperator = new HDFSReadOperatorDescriptor(jobSpec, recordDesc, conf, splits,
                 readSchedule, new TextKeyValueParserFactory());
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, readOperator, locations);
@@ -111,19 +111,21 @@
                 new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, recordDesc);
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, sortOperator, locations);
 
-        HDFSWriteOperatorDescriptor writeOperator = new HDFSWriteOperatorDescriptor(jobSpec, conf,
-                new TextTupleWriterFactory());
+        HDFSWriteOperatorDescriptor writeOperator =
+                new HDFSWriteOperatorDescriptor(jobSpec, conf, new TextTupleWriterFactory());
         PartitionConstraintHelper.addAbsoluteLocationConstraint(jobSpec, writeOperator, HyracksUtils.NC1_ID);
 
         jobSpec.connect(new OneToOneConnectorDescriptor(jobSpec), readOperator, 0, sortOperator, 0);
-        jobSpec.connect(new MToNPartitioningMergingConnectorDescriptor(jobSpec, new FieldHashPartitionComputerFactory(
-                new int[] { 0 }, new IBinaryHashFunctionFactory[] { RawBinaryHashFunctionFactory.INSTANCE }),
-                new int[] { 0 }, new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, null),
+        jobSpec.connect(
+                new MToNPartitioningMergingConnectorDescriptor(jobSpec,
+                        new FieldHashPartitionComputerFactory(new int[] { 0 },
+                                new IBinaryHashFunctionFactory[] { RawBinaryHashFunctionFactory.INSTANCE }),
+                        new int[] { 0 }, new IBinaryComparatorFactory[] { RawBinaryComparatorFactory.INSTANCE }, null),
                 sortOperator, 0, writeOperator, 0);
         jobSpec.addRoot(writeOperator);
 
-        IHyracksClientConnection client = new HyracksConnection(HyracksUtils.CC_HOST,
-                HyracksUtils.TEST_HYRACKS_CC_CLIENT_PORT);
+        IHyracksClientConnection client =
+                new HyracksConnection(HyracksUtils.CC_HOST, HyracksUtils.TEST_HYRACKS_CC_CLIENT_PORT);
         JobId jobId = client.startJob(jobSpec);
         client.waitForCompletion(jobId);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/scheduler/SchedulerTest.java b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/scheduler/SchedulerTest.java
index 4d970ba..82230718 100644
--- a/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/scheduler/SchedulerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-hdfs/hyracks-hdfs-core/src/test/java/org/apache/hyracks/hdfs2/scheduler/SchedulerTest.java
@@ -43,8 +43,8 @@
      * @throws Exception
      */
     public void testSchedulerSimple() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         List<InputSplit> fileSplits = new ArrayList<>();
         fileSplits.add(new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" }));
@@ -70,8 +70,8 @@
      * @throws Exception
      */
     public void testSchedulerLargerHDFS() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         List<InputSplit> fileSplits = new ArrayList<>();
         fileSplits.add(new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" }));
@@ -90,8 +90,8 @@
         Scheduler scheduler = new Scheduler(ncNameToNcInfos);
         String[] locationConstraints = scheduler.getLocationConstraints(fileSplits);
 
-        String[] expectedResults = new String[] { "nc1", "nc4", "nc6", "nc1", "nc4", "nc2", "nc2", "nc3", "nc6", "nc5",
-                "nc3", "nc5" };
+        String[] expectedResults =
+                new String[] { "nc1", "nc4", "nc6", "nc1", "nc4", "nc2", "nc2", "nc3", "nc6", "nc5", "nc3", "nc5" };
 
         for (int i = 0; i < locationConstraints.length; i++) {
             Assert.assertEquals(locationConstraints[i], expectedResults[i]);
@@ -104,8 +104,8 @@
      * @throws Exception
      */
     public void testSchedulerSmallerHDFS() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         List<InputSplit> fileSplits = new ArrayList<>();
         fileSplits.add(new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" }));
@@ -124,8 +124,8 @@
         Scheduler scheduler = new Scheduler(ncNameToNcInfos);
         String[] locationConstraints = scheduler.getLocationConstraints(fileSplits);
 
-        String[] expectedResults = new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc5", "nc6",
-                "nc5", "nc6" };
+        String[] expectedResults =
+                new String[] { "nc1", "nc4", "nc4", "nc1", "nc3", "nc2", "nc2", "nc3", "nc5", "nc6", "nc5", "nc6" };
 
         for (int i = 0; i < locationConstraints.length; i++) {
             Assert.assertEquals(locationConstraints[i], expectedResults[i]);
@@ -138,8 +138,8 @@
      * @throws Exception
      */
     public void testSchedulerSmallerHDFSOdd() throws Exception {
-        Map<String, NodeControllerInfo> ncNameToNcInfos = TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099,
-                5098, 5097);
+        Map<String, NodeControllerInfo> ncNameToNcInfos =
+                TestUtils.generateNodeControllerInfo(6, "nc", "10.0.0.", 5099, 5098, 5097);
 
         List<InputSplit> fileSplits = new ArrayList<>();
         fileSplits.add(new FileSplit(new Path("part-1"), 0, 0, new String[] { "10.0.0.1", "10.0.0.2", "10.0.0.3" }));
diff --git a/hyracks-fullstack/hyracks/hyracks-http/pom.xml b/hyracks-fullstack/hyracks/hyracks-http/pom.xml
index 421130c..6ca7a42 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-http/pom.xml
@@ -75,5 +75,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
index d0637ca..21653c8 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/AbstractServlet.java
@@ -24,13 +24,14 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
@@ -40,7 +41,7 @@
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public abstract class AbstractServlet implements IServlet {
-    private static final Logger LOGGER = Logger.getLogger(AbstractServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
     static {
@@ -99,11 +100,11 @@
                 notAllowed(method, response);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Unhandled exception", e);
+            LOGGER.log(Level.WARN, "Unhandled exception", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         } catch (Throwable th) { //NOSONAR Just logging and then throwing again
             try {
-                LOGGER.log(Level.WARNING, "Unhandled throwable", th);
+                LOGGER.log(Level.WARN, "Unhandled throwable", th);
             } catch (Throwable loggingFailure) {// NOSONAR... swallow logging failure
             }
             throw th;
@@ -116,7 +117,7 @@
         if (message != null) {
             response.writer().println(message);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("sendError: status=" + status + ", message=" + message);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
index e4f0777..d5f81e5 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedNettyOutputStream.java
@@ -20,8 +20,10 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
@@ -31,7 +33,7 @@
 
 public class ChunkedNettyOutputStream extends OutputStream {
 
-    private static final Logger LOGGER = Logger.getLogger(ChunkedNettyOutputStream.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ChannelHandlerContext ctx;
     private final ChunkedResponse response;
     private ByteBuf buffer;
@@ -132,7 +134,7 @@
                 wait();
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
-                LOGGER.log(Level.WARNING, "Interupted while waiting for channel to be writable", e);
+                LOGGER.log(Level.WARN, "Interupted while waiting for channel to be writable", e);
                 throw new IOException(e);
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
index d8e9a9a..323a463 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/ChunkedResponse.java
@@ -21,10 +21,11 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelFuture;
@@ -60,7 +61,7 @@
  */
 public class ChunkedResponse implements IServletResponse {
 
-    private static final Logger LOGGER = Logger.getLogger(ChunkedResponse.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ChannelHandlerContext ctx;
     private final ChunkedNettyOutputStream outputStream;
     private final PrintWriter writer;
@@ -112,7 +113,7 @@
         } else {
             // There was an error
             if (headerSent) {
-                LOGGER.log(Level.WARNING, "Error after header write of chunked response");
+                LOGGER.log(Level.WARN, "Error after header write of chunked response");
                 if (error != null) {
                     error.release();
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestCapacityController.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestCapacityController.java
index 13ed1fc..3ab2ab9 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestCapacityController.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestCapacityController.java
@@ -18,8 +18,9 @@
  */
 package org.apache.hyracks.http.server;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
@@ -40,7 +41,7 @@
  */
 public class HttpRequestCapacityController extends ChannelInboundHandlerAdapter {
 
-    private static final Logger LOGGER = Logger.getLogger(HttpRequestCapacityController.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final HttpServer server;
     private boolean overloaded = false;
 
@@ -67,14 +68,14 @@
         HttpResponseEncoder encoder = new HttpResponseEncoder();
         ChannelPromise promise = ctx.newPromise();
         promise.addListener(ChannelFutureListener.CLOSE);
-        DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
-                HttpResponseStatus.SERVICE_UNAVAILABLE);
+        DefaultFullHttpResponse response =
+                new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.SERVICE_UNAVAILABLE);
         try {
             encoder.write(ctx, response, ctx.voidPromise());
             ctx.writeAndFlush(ctx.alloc().buffer(0), promise);
         } catch (Throwable th) {//NOSONAR
             try {
-                LOGGER.log(Level.SEVERE, "Failure during request rejection", th);
+                LOGGER.log(Level.ERROR, "Failure during request rejection", th);
             } catch (Throwable loggingFailure) {//NOSONAR
             }
             PromiseNotificationUtil.tryFailure(promise, th, null);
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
index 555f845..bf8e629 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpRequestHandler.java
@@ -20,12 +20,13 @@
 
 import java.io.IOException;
 import java.util.concurrent.Callable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelFutureListener;
@@ -34,7 +35,7 @@
 import io.netty.handler.codec.http.HttpUtil;
 
 public class HttpRequestHandler implements Callable<Void> {
-    private static final Logger LOGGER = Logger.getLogger(HttpRequestHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final ChannelHandlerContext ctx;
     private final IServlet servlet;
     private final IServletRequest request;
@@ -57,7 +58,7 @@
                 lastContentFuture.addListener(ChannelFutureListener.CLOSE);
             }
         } catch (Throwable th) { //NOSONAR
-            LOGGER.log(Level.SEVERE, "Failure handling HTTP Request", th);
+            LOGGER.log(Level.ERROR, "Failure handling HTTP Request", th);
             ctx.close();
         } finally {
             request.getHttpRequest().release();
@@ -69,7 +70,7 @@
         try {
             servlet.handle(request, response);
         } catch (Exception e) {
-            LOGGER.log(Level.WARNING, "Failure during handling of an IServletRequest", e);
+            LOGGER.log(Level.WARN, "Failure during handling of an IServletRequest", e);
             response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
         } finally {
             response.close();
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
index d64858b..19436ab 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServer.java
@@ -27,11 +27,12 @@
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.util.ThreadDumpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.buffer.PooledByteBufAllocator;
@@ -49,12 +50,12 @@
     // Constants
     private static final int LOW_WRITE_BUFFER_WATER_MARK = 8 * 1024;
     private static final int HIGH_WRITE_BUFFER_WATER_MARK = 32 * 1024;
-    protected static final WriteBufferWaterMark WRITE_BUFFER_WATER_MARK = new WriteBufferWaterMark(
-            LOW_WRITE_BUFFER_WATER_MARK, HIGH_WRITE_BUFFER_WATER_MARK);
+    protected static final WriteBufferWaterMark WRITE_BUFFER_WATER_MARK =
+            new WriteBufferWaterMark(LOW_WRITE_BUFFER_WATER_MARK, HIGH_WRITE_BUFFER_WATER_MARK);
     protected static final int RECEIVE_BUFFER_SIZE = 4096;
     protected static final int DEFAULT_NUM_EXECUTOR_THREADS = 16;
     protected static final int DEFAULT_REQUEST_QUEUE_SIZE = 256;
-    private static final Logger LOGGER = Logger.getLogger(HttpServer.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int FAILED = -1;
     private static final int STOPPED = 0;
     private static final int STARTING = 1;
@@ -92,8 +93,8 @@
         long directMemoryBudget = numExecutorThreads * (long) HIGH_WRITE_BUFFER_WATER_MARK
                 + numExecutorThreads * HttpServerInitializer.RESPONSE_CHUNK_SIZE;
         LOGGER.log(Level.INFO, "The output direct memory budget for this server is " + directMemoryBudget + " bytes");
-        long inputBudgetEstimate = (long) HttpServerInitializer.MAX_REQUEST_INITIAL_LINE_LENGTH
-                * (requestQueueSize + numExecutorThreads);
+        long inputBudgetEstimate =
+                (long) HttpServerInitializer.MAX_REQUEST_INITIAL_LINE_LENGTH * (requestQueueSize + numExecutorThreads);
         inputBudgetEstimate = inputBudgetEstimate * 2;
         LOGGER.log(Level.INFO,
                 "The \"estimated\" input direct memory budget for this server is " + inputBudgetEstimate + " bytes");
@@ -111,7 +112,7 @@
                 doStart();
                 setStarted();
             } catch (Throwable e) { // NOSONAR
-                LOGGER.log(Level.SEVERE, "Failure starting an Http Server", e);
+                LOGGER.log(Level.ERROR, "Failure starting an Http Server with port: " + port, e);
                 setFailed(e);
                 throw e;
             }
@@ -128,7 +129,7 @@
                 doStop();
                 setStopped();
             } catch (Throwable e) { // NOSONAR
-                LOGGER.log(Level.SEVERE, "Failure stopping an Http Server", e);
+                LOGGER.log(Level.ERROR, "Failure stopping an Http Server", e);
                 setFailed(e);
                 throw e;
             }
@@ -229,15 +230,15 @@
             // wait 30s for interrupted requests to unwind
             executor.awaitTermination(30, TimeUnit.SECONDS);
             if (!executor.isTerminated()) {
-                if (LOGGER.isLoggable(Level.INFO)) {
-                    LOGGER.log(Level.SEVERE,
+                if (LOGGER.isErrorEnabled()) {
+                    LOGGER.log(Level.ERROR,
                             "Failed to shutdown http server executor; thread dump: " + ThreadDumpUtil.takeDumpString());
                 } else {
-                    LOGGER.log(Level.SEVERE, "Failed to shutdown http server executor");
+                    LOGGER.log(Level.ERROR, "Failed to shutdown http server executor");
                 }
             }
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Error while shutting down http server executor", e);
+            LOGGER.log(Level.ERROR, "Error while shutting down http server executor", e);
         }
         channel.close();
         channel.closeFuture().sync();
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
index 0984ebf..9290cdf 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/HttpServerHandler.java
@@ -20,12 +20,13 @@
 
 import java.io.IOException;
 import java.util.concurrent.RejectedExecutionException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServlet;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
@@ -37,7 +38,7 @@
 
 public class HttpServerHandler<T extends HttpServer> extends SimpleChannelInboundHandler<Object> {
 
-    private static final Logger LOGGER = Logger.getLogger(HttpServerHandler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final T server;
     protected final int chunkSize;
     protected HttpRequestHandler handler;
@@ -71,7 +72,7 @@
                 submit(ctx, servlet, request);
             }
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "Failure Submitting HTTP Request", e);
+            LOGGER.log(Level.ERROR, "Failure Submitting HTTP Request", e);
             respond(ctx, request.protocolVersion(), new HttpResponseStatus(500, e.getMessage()));
         }
     }
@@ -86,7 +87,7 @@
         try {
             servletRequest = HttpUtil.toServletRequest(request);
         } catch (IllegalArgumentException e) {
-            LOGGER.log(Level.WARNING, "Failure Decoding Request", e);
+            LOGGER.log(Level.WARN, "Failure Decoding Request", e);
             respond(ctx, request.protocolVersion(), HttpResponseStatus.BAD_REQUEST);
             return;
         }
@@ -98,21 +99,21 @@
         try {
             server.getExecutor(handler).submit(handler);
         } catch (RejectedExecutionException e) { // NOSONAR
-            LOGGER.log(Level.WARNING, "Request rejected by server executor service. " + e.getMessage());
+            LOGGER.log(Level.WARN, "Request rejected by server executor service. " + e.getMessage());
             handler.reject();
         }
     }
 
     protected void handleServletNotFound(ChannelHandlerContext ctx, FullHttpRequest request) {
-        if (LOGGER.isLoggable(Level.WARNING)) {
-            LOGGER.warning("No servlet for " + request.uri());
+        if (LOGGER.isWarnEnabled()) {
+            LOGGER.warn("No servlet for " + request.uri());
         }
         respond(ctx, request.protocolVersion(), HttpResponseStatus.NOT_FOUND);
     }
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
-        LOGGER.log(Level.SEVERE, "Failure handling HTTP Request", cause);
+        LOGGER.log(Level.ERROR, "Failure handling HTTP Request", cause);
         ctx.close();
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/StaticResourceServlet.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/StaticResourceServlet.java
index b21e533..e2b3237 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/StaticResourceServlet.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/StaticResourceServlet.java
@@ -22,19 +22,20 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class StaticResourceServlet extends AbstractServlet {
 
-    private static final Logger LOGGER = Logger.getLogger(StaticResourceServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public StaticResourceServlet(ConcurrentMap<String, Object> ctx, String[] paths) {
         super(ctx, paths);
@@ -63,7 +64,7 @@
                 try {
                     IOUtils.copy(is, out);
                 } catch (IOException e) {
-                    LOGGER.log(Level.WARNING, "Failure copying response", e);
+                    LOGGER.log(Level.WARN, "Failure copying response", e);
                 } finally {
                     if (out != null) {
                         IOUtils.closeQuietly(out);
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
index 99e334c..ffa4d4b 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/main/java/org/apache/hyracks/http/server/utils/HttpUtil.java
@@ -28,14 +28,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.regex.Pattern;
 
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.BaseRequest;
 import org.apache.hyracks.http.server.FormUrlEncodedRequest;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.buffer.PooledByteBufAllocator;
 import io.netty.handler.codec.http.FullHttpRequest;
@@ -45,7 +46,7 @@
 
 public class HttpUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(HttpUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final Pattern PARENT_DIR = Pattern.compile("/[^./]+/\\.\\./");
     private static long maxMemUsage = 0L;
 
@@ -207,7 +208,7 @@
             report.append('\n');
             report.append('\n');
         } catch (Throwable th) { // NOSONAR
-            LOGGER.log(Level.WARNING, "Failed to access PlatformDependent.DIRECT_MEMORY_COUNTER", th);
+            LOGGER.log(Level.WARN, "Failed to access PlatformDependent.DIRECT_MEMORY_COUNTER", th);
             return;
         }
         report.append("--------------- PooledByteBufAllocator.DEFAULT ----------------");
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/servlet/ChattyServlet.java b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/servlet/ChattyServlet.java
index 5bd2e38..e6aedb9 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/servlet/ChattyServlet.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/servlet/ChattyServlet.java
@@ -19,18 +19,19 @@
 package org.apache.hyracks.http.servlet;
 
 import java.util.concurrent.ConcurrentMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.http.api.IServletRequest;
 import org.apache.hyracks.http.api.IServletResponse;
 import org.apache.hyracks.http.server.AbstractServlet;
 import org.apache.hyracks.http.server.utils.HttpUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import io.netty.handler.codec.http.HttpResponseStatus;
 
 public class ChattyServlet extends AbstractServlet {
-    private static final Logger LOGGER = Logger.getLogger(ChattyServlet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private byte[] bytes;
 
     public ChattyServlet(ConcurrentMap<String, Object> ctx, String[] paths) {
@@ -53,7 +54,7 @@
     protected void get(IServletRequest request, IServletResponse response) throws Exception {
         response.setStatus(HttpResponseStatus.OK);
         HttpUtil.setContentType(response, HttpUtil.ContentType.TEXT_HTML, HttpUtil.Encoding.UTF8);
-        LOGGER.log(Level.WARNING, "I am about to flood you... and a single buffer is " + bytes.length + " bytes");
+        LOGGER.log(Level.WARN, "I am about to flood you... and a single buffer is " + bytes.length + " bytes");
         for (int i = 0; i < 100; i++) {
             response.outputStream().write(bytes);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
index b51d670..9067586 100644
--- a/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-http/src/test/java/org/apache/hyracks/http/test/HttpServerTest.java
@@ -280,7 +280,7 @@
         }
     }
 
-    protected HttpResponse executeHttpRequest(HttpUriRequest method) throws Exception {
+    public static HttpResponse executeHttpRequest(HttpUriRequest method) throws Exception {
         HttpClient client = HttpClients.custom().setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE).build();
         try {
             return client.execute(method);
@@ -290,8 +290,9 @@
         }
     }
 
-    protected HttpUriRequest get(String query) throws URISyntaxException {
-        URI uri = new URI(PROTOCOL, null, HOST, PORT, PATH, query, null);
+    public static HttpUriRequest get(String protocol, String host, int port, String path, String query)
+            throws URISyntaxException {
+        URI uri = new URI(protocol, null, host, port, path, query, null);
         RequestBuilder builder = RequestBuilder.get(uri);
         builder.setCharset(StandardCharsets.UTF_8);
         return builder.build();
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/pom.xml b/hyracks-fullstack/hyracks/hyracks-ipc/pom.xml
index e152873..7f492eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/pom.xml
@@ -49,5 +49,9 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/IIPCEventListener.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/IIPCEventListener.java
new file mode 100644
index 0000000..a6ba545
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/IIPCEventListener.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.ipc.api;
+
+import org.apache.hyracks.ipc.exceptions.IPCException;
+
+public interface IIPCEventListener {
+
+    default void ipcHandleConnected(IIPCHandle handle) throws IPCException {
+        // no-op
+    }
+
+    default void ipcHandleDisconnected(IIPCHandle handle) throws IPCException {
+        // no-op
+    }
+
+    default void ipcHandleRestored(IIPCHandle handle) throws IPCException {
+        // no-op
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/RPCInterface.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/RPCInterface.java
index ba1c9a4..7dae541 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/RPCInterface.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/api/RPCInterface.java
@@ -21,8 +21,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.hyracks.ipc.exceptions.IPCException;
-
 public class RPCInterface implements IIPCI {
     private final Map<Long, Request> reqMap;
 
@@ -34,9 +32,6 @@
         Request req;
         long mid;
         synchronized (this) {
-            if (!handle.isConnected()) {
-                throw new IPCException("Cannot send on a closed handle");
-            }
             req = new Request(handle, this);
             mid = handle.send(-1, request, null);
             reqMap.put(mid, req);
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCConnectionManager.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCConnectionManager.java
index 36cf2fd..86c8c75 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCConnectionManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCConnectionManager.java
@@ -39,13 +39,14 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IPCConnectionManager {
-    private static final Logger LOGGER = Logger.getLogger(IPCConnectionManager.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     // TODO(mblow): the next two could be config parameters
     private static final int INITIAL_RETRY_DELAY_MILLIS = 100;
@@ -120,7 +121,7 @@
                 return handle;
             }
             if (maxRetries < 0 || retries++ < maxRetries) {
-                LOGGER.warning("Connection to " + remoteAddress + " failed; retrying" + (maxRetries <= 0 ? ""
+                LOGGER.warn("Connection to " + remoteAddress + " failed; retrying" + (maxRetries <= 0 ? ""
                         : " (retry attempt " + retries + " of " + maxRetries + ") after " + delay + "ms"));
                 Thread.sleep(delay);
                 delay = Math.min(MAX_RETRY_DELAY_MILLIS, (int) (delay * 1.5));
@@ -136,8 +137,8 @@
     }
 
     synchronized void write(Message msg) {
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Enqueued message: " + msg);
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Enqueued message: " + msg);
         }
         sendList.add(msg);
         networkThread.selector.wakeup();
@@ -209,8 +210,8 @@
             int failingLoops = 0;
             while (!stopped) {
                 try {
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("Starting Select");
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("Starting Select");
                     }
                     int n = selector.select();
                     collectOutstandingWork();
@@ -238,9 +239,7 @@
                         int len = workingSendList.size();
                         for (int i = 0; i < len; ++i) {
                             Message msg = workingSendList.get(i);
-                            if (LOGGER.isLoggable(Level.FINE)) {
-                                LOGGER.fine("Processing send of message: " + msg);
-                            }
+                            LOGGER.debug(() -> "Processing send of message: " + msg);
                             IPCHandle handle = msg.getIPCHandle();
                             if (handle.getState() != HandleState.CLOSED) {
                                 if (!handle.full()) {
@@ -339,9 +338,8 @@
                     // reset failingLoops on a good loop
                     failingLoops = 0;
                 } catch (Exception e) {
-                    int sleepSecs = (int)Math.pow(2, Math.min(11, failingLoops++));
-                    LOGGER.log(Level.SEVERE, "Exception processing message; sleeping " + sleepSecs
-                            + " seconds", e);
+                    int sleepSecs = (int) Math.pow(2, Math.min(11, failingLoops++));
+                    LOGGER.log(Level.ERROR, "Exception processing message; sleeping " + sleepSecs + " seconds", e);
                     try {
                         Thread.sleep(TimeUnit.SECONDS.toMillis(sleepSecs));
                     } catch (InterruptedException e1) {
@@ -364,10 +362,10 @@
             try {
                 connectFinished = channel.finishConnect();
                 if (!connectFinished) {
-                    LOGGER.log(Level.WARNING, "Channel connect did not finish");
+                    LOGGER.log(Level.WARN, "Channel connect did not finish");
                 }
             } catch (IOException e) {
-                LOGGER.log(Level.WARNING, "Exception finishing channel connect", e);
+                LOGGER.log(Level.WARN, "Exception finishing channel connect", e);
             }
             return connectFinished;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
index f7e0af1..b36e645 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/IPCSystem.java
@@ -21,17 +21,19 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
+import org.apache.hyracks.ipc.api.IIPCEventListener;
 import org.apache.hyracks.ipc.api.IIPCHandle;
 import org.apache.hyracks.ipc.api.IIPCI;
 import org.apache.hyracks.ipc.api.IPCPerformanceCounters;
 import org.apache.hyracks.ipc.api.IPayloadSerializerDeserializer;
 import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IPCSystem {
-    private static final Logger LOGGER = Logger.getLogger(IPCSystem.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private final IPCConnectionManager cMgr;
 
@@ -69,6 +71,28 @@
     }
 
     public IIPCHandle getHandle(InetSocketAddress remoteAddress, int maxRetries) throws IPCException {
+        return getHandle(remoteAddress, maxRetries, 0);
+    }
+
+    public IIPCHandle getReconnectingHandle(InetSocketAddress remoteAddress) throws IPCException {
+        return getReconnectingHandle(remoteAddress, 1);
+    }
+
+    public IIPCHandle getReconnectingHandle(InetSocketAddress remoteAddress, int reconnectAttempts)
+            throws IPCException {
+        return getHandle(remoteAddress, 0, reconnectAttempts, NoOpIPCEventListener.INSTANCE);
+    }
+
+    public IIPCHandle getHandle(InetSocketAddress remoteAddress, int maxRetries, int reconnectAttempts)
+            throws IPCException {
+        return getHandle(remoteAddress, maxRetries, reconnectAttempts, NoOpIPCEventListener.INSTANCE);
+    }
+
+    public IIPCHandle getHandle(InetSocketAddress remoteAddress, int maxRetries, int reconnectAttempts,
+            IIPCEventListener eventListener) throws IPCException {
+        if (reconnectAttempts > 0) {
+            return new ReconnectingIPCHandle(this, eventListener, remoteAddress, maxRetries, reconnectAttempts);
+        }
         try {
             return cMgr.getIPCHandle(remoteAddress, maxRetries);
         } catch (IOException e) {
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/JavaSerializationBasedPayloadSerializerDeserializer.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/JavaSerializationBasedPayloadSerializerDeserializer.java
index 2c1f0dc..c4263d2 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/JavaSerializationBasedPayloadSerializerDeserializer.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/JavaSerializationBasedPayloadSerializerDeserializer.java
@@ -55,8 +55,8 @@
     }
 
     private Object deserialize(ByteBuffer buffer, int length) throws Exception {
-        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer.array(), buffer.position(),
-                length));
+        ObjectInputStream ois =
+                new ObjectInputStream(new ByteArrayInputStream(buffer.array(), buffer.position(), length));
         Object object = ois.readObject();
         ois.close();
         return object;
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/Message.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/Message.java
index 1f3f0c3..550ce45 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/Message.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/Message.java
@@ -103,8 +103,8 @@
         int length = msgSize - HEADER_SIZE;
         try {
             IPayloadSerializerDeserializer serde = ipcHandle.getIPCSystem().getSerializerDeserializer();
-            payload = flag == ERROR ? serde.deserializeException(buffer, length) : serde.deserializeObject(buffer,
-                    length);
+            payload = flag == ERROR ? serde.deserializeException(buffer, length)
+                    : serde.deserializeObject(buffer, length);
         } finally {
             buffer.position(finalPosition);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/NoOpIPCEventListener.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/NoOpIPCEventListener.java
new file mode 100644
index 0000000..156641f
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/NoOpIPCEventListener.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.ipc.impl;
+
+import org.apache.hyracks.ipc.api.IIPCEventListener;
+
+public class NoOpIPCEventListener implements IIPCEventListener {
+    public static final IIPCEventListener INSTANCE = new NoOpIPCEventListener();
+
+    private NoOpIPCEventListener() {
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/ReconnectingIPCHandle.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/ReconnectingIPCHandle.java
new file mode 100644
index 0000000..9a2fc80
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/main/java/org/apache/hyracks/ipc/impl/ReconnectingIPCHandle.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.ipc.impl;
+
+import java.net.InetSocketAddress;
+
+import org.apache.hyracks.ipc.api.IIPCEventListener;
+import org.apache.hyracks.ipc.api.IIPCHandle;
+import org.apache.hyracks.ipc.exceptions.IPCException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+class ReconnectingIPCHandle implements IIPCHandle {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final IPCSystem ipc;
+    private final int reconnectAttempts;
+    private final IIPCEventListener listener;
+    private IIPCHandle delegate;
+
+    ReconnectingIPCHandle(IPCSystem ipc, IIPCEventListener listener, InetSocketAddress remoteAddress, int maxRetries,
+            int reconnectAttempts) throws IPCException {
+        this.ipc = ipc;
+        this.listener = listener;
+        this.reconnectAttempts = reconnectAttempts;
+        this.delegate = ipc.getHandle(remoteAddress, maxRetries);
+        listener.ipcHandleConnected(delegate);
+    }
+
+    @Override
+    public InetSocketAddress getRemoteAddress() {
+        return delegate.getRemoteAddress();
+    }
+
+    @Override
+    public long send(long requestId, Object payload, Exception exception) throws IPCException {
+        return ensureConnected().send(requestId, payload, exception);
+    }
+
+    @Override
+    public void setAttachment(Object attachment) {
+        delegate.setAttachment(attachment);
+    }
+
+    @Override
+    public Object getAttachment() {
+        return delegate.getAttachment();
+    }
+
+    @Override
+    public boolean isConnected() {
+        return delegate.isConnected();
+    }
+
+    private IIPCHandle ensureConnected() throws IPCException {
+        if (delegate.isConnected()) {
+            return delegate;
+        }
+        LOGGER.warn("ipcHandle {} disconnected; will attempt to reconnect {} times", delegate, reconnectAttempts);
+        listener.ipcHandleDisconnected(delegate);
+        delegate = ipc.getHandle(getRemoteAddress(), reconnectAttempts);
+        LOGGER.warn("ipcHandle {} restored", delegate);
+        listener.ipcHandleRestored(delegate);
+        return delegate;
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-ipc/src/test/java/org/apache/hyracks/ipc/tests/IPCTest.java b/hyracks-fullstack/hyracks/hyracks-ipc/src/test/java/org/apache/hyracks/ipc/tests/IPCTest.java
index b454520..1a075d5 100644
--- a/hyracks-fullstack/hyracks/hyracks-ipc/src/test/java/org/apache/hyracks/ipc/tests/IPCTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-ipc/src/test/java/org/apache/hyracks/ipc/tests/IPCTest.java
@@ -63,8 +63,8 @@
         final Executor executor = Executors.newCachedThreadPool();
         IIPCI ipci = new IIPCI() {
             @Override
-            public void deliverIncomingMessage(final IIPCHandle handle, final long mid, long rmid,
-                    final Object payload, Exception exception) {
+            public void deliverIncomingMessage(final IIPCHandle handle, final long mid, long rmid, final Object payload,
+                    Exception exception) {
                 executor.execute(new Runnable() {
                     @Override
                     public void run() {
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DependencySet.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DependencySet.java
index 8e91be4..3aef194 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DependencySet.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DependencySet.java
@@ -27,7 +27,7 @@
     @SuppressWarnings("unused") // set by Maven configuration
     private String location;
 
-    @SuppressWarnings({"unused", "MismatchedQueryAndUpdateOfCollection"}) // set by Maven configuration
+    @SuppressWarnings({ "unused", "MismatchedQueryAndUpdateOfCollection" }) // set by Maven configuration
     private List<String> includes;
 
     private List<Pattern> patterns;
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
index 7d0e77d..1b2961f 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/DownloadLicensesMojo.java
@@ -39,10 +39,7 @@
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.ProjectBuildingException;
 
-@Mojo(name = "licensedownload",
-        requiresProject = true,
-        requiresDependencyResolution = ResolutionScope.TEST,
-        defaultPhase = LifecyclePhase.GENERATE_RESOURCES)
+@Mojo(name = "licensedownload", requiresProject = true, requiresDependencyResolution = ResolutionScope.TEST, defaultPhase = LifecyclePhase.GENERATE_RESOURCES)
 public class DownloadLicensesMojo extends LicenseMojo {
 
     @Parameter(required = true)
@@ -73,7 +70,7 @@
 
     private void doDownload(int timeoutMillis, int id, String url, String fileName) {
         try {
-            HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();
+            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
             conn.setConnectTimeout(timeoutMillis);
             conn.setReadTimeout(timeoutMillis);
             conn.setRequestMethod("GET");
@@ -90,4 +87,3 @@
         }
     }
 }
-
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
index 387d18e..0245eb3 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/GenerateFileMojo.java
@@ -45,12 +45,6 @@
 import java.util.jar.JarFile;
 import java.util.regex.Pattern;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SequenceWriter;
-import freemarker.cache.FileTemplateLoader;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
 import org.apache.commons.io.IOUtils;
 import org.apache.hyracks.maven.license.freemarker.IndentDirective;
 import org.apache.hyracks.maven.license.freemarker.LoadFileDirective;
@@ -63,13 +57,19 @@
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.ProjectBuildingException;
 
-@Mojo(name = "generate",
-        requiresProject = true,
-        requiresDependencyResolution = ResolutionScope.TEST)
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SequenceWriter;
+import freemarker.cache.FileTemplateLoader;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+@Mojo(name = "generate", requiresProject = true, requiresDependencyResolution = ResolutionScope.TEST)
 public class GenerateFileMojo extends LicenseMojo {
 
-    public static final Pattern FOUNDATION_PATTERN = Pattern.compile("^\\s*This product includes software developed " +
-                    "(at|by) The Apache Software Foundation \\(http://www.apache.org/\\).\\s*$".replace(" ", "\\s+"),
+    public static final Pattern FOUNDATION_PATTERN = Pattern.compile(
+            "^\\s*This product includes software developed "
+                    + "(at|by) The Apache Software Foundation \\(http://www.apache.org/\\).\\s*$".replace(" ", "\\s+"),
             Pattern.DOTALL | Pattern.MULTILINE);
 
     public static final Comparator<String> WHITESPACE_NORMALIZED_COMPARATOR =
@@ -121,7 +121,6 @@
         }
     }
 
-
     private void resolveLicenseContent() throws IOException {
         Set<LicenseSpec> licenseSpecs = new HashSet<>();
         for (LicensedProjects licensedProjects : licenseMap.values()) {
@@ -158,7 +157,7 @@
     private void combineCommonGavs() {
         for (LicensedProjects licensedProjects : licenseMap.values()) {
             Map<String, Project> projectMap = new HashMap<>();
-            for (Iterator<Project> iter = licensedProjects.getProjects().iterator(); iter.hasNext(); ) {
+            for (Iterator<Project> iter = licensedProjects.getProjects().iterator(); iter.hasNext();) {
                 Project project = iter.next();
                 if (projectMap.containsKey(project.gav())) {
                     Project first = projectMap.get(project.gav());
@@ -208,19 +207,17 @@
     private void readExtraMaps() throws IOException {
         final ObjectMapper objectMapper = new ObjectMapper();
         for (ExtraLicenseFile extraLicenseFile : extraLicenseMaps) {
-            for (LicensedProjects projects :
-                    objectMapper.readValue(extraLicenseFile.getFile(), LicensedProjects[].class)) {
+            for (LicensedProjects projects : objectMapper.readValue(extraLicenseFile.getFile(),
+                    LicensedProjects[].class)) {
                 LicenseSpec spec = urlToLicenseMap.get(projects.getLicense().getUrl());
                 if (spec != null) {
                     // TODO(mblow): probably we should always favor the extra map...
                     // propagate any license content we may have with what already has been loaded
-                    if (projects.getLicense().getContent() != null &&
-                            spec.getContent() == null) {
+                    if (projects.getLicense().getContent() != null && spec.getContent() == null) {
                         spec.setContent(projects.getLicense().getContent());
                     }
                     // propagate any license displayName we may have with what already has been loaded
-                    if (projects.getLicense().getDisplayName() != null &&
-                            spec.getDisplayName() == null) {
+                    if (projects.getLicense().getDisplayName() != null && spec.getDisplayName() == null) {
                         spec.setDisplayName(projects.getLicense().getDisplayName());
                     }
                 }
@@ -235,8 +232,8 @@
     private void persistLicenseMap() throws IOException {
         if (licenseMapOutputFile != null) {
             licenseMapOutputFile.getParentFile().mkdirs();
-            SequenceWriter sw = new ObjectMapper().writerWithDefaultPrettyPrinter()
-                    .writeValues(licenseMapOutputFile).init(true);
+            SequenceWriter sw =
+                    new ObjectMapper().writerWithDefaultPrettyPrinter().writeValues(licenseMapOutputFile).init(true);
             for (LicensedProjects entry : licenseMap.values()) {
                 sw.write(entry);
             }
@@ -321,7 +318,7 @@
     }
 
     private void resolveArtifactFiles(final String name, Predicate<JarEntry> filter,
-                                      BiConsumer<Project, String> consumer, UnaryOperator<String> contentTransformer)
+            BiConsumer<Project, String> consumer, UnaryOperator<String> contentTransformer)
             throws MojoExecutionException, IOException {
         for (Project p : getProjects()) {
             File artifactFile = new File(p.getArtifactPath());
@@ -332,8 +329,7 @@
                 continue;
             }
             try (JarFile jarFile = new JarFile(artifactFile)) {
-                SortedMap<String, JarEntry> matches = gatherMatchingEntries(jarFile,
-                        filter);
+                SortedMap<String, JarEntry> matches = gatherMatchingEntries(jarFile, filter);
                 if (matches.isEmpty()) {
                     getLog().warn("No " + name + " file found for " + p.gav());
                 } else {
@@ -343,15 +339,14 @@
                     } else {
                         getLog().info(p.gav() + " has " + name + " file: " + matches.keySet());
                     }
-                    resolveContent(p, jarFile, matches.values().iterator().next(),
-                            contentTransformer, consumer, name);
+                    resolveContent(p, jarFile, matches.values().iterator().next(), contentTransformer, consumer, name);
                 }
             }
         }
     }
 
     private void resolveContent(Project project, JarFile jarFile, JarEntry entry, UnaryOperator<String> transformer,
-                                BiConsumer<Project, String> contentConsumer, final String name) throws IOException {
+            BiConsumer<Project, String> contentConsumer, final String name) throws IOException {
         String text = IOUtils.toString(jarFile.getInputStream(entry), StandardCharsets.UTF_8);
         text = transformer.apply(text);
         text = LicenseUtil.trim(text);
@@ -375,4 +370,3 @@
         return matches;
     }
 }
-
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
index 6d8f9cf..97afffb 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseMojo.java
@@ -59,7 +59,7 @@
     protected List<Override> overrides = new ArrayList<>();
 
     @Parameter
-    protected String [] models = new String [0];
+    protected String[] models = new String[0];
 
     @Parameter
     protected List<LicenseSpec> licenses = new ArrayList<>();
@@ -73,31 +73,31 @@
     @Parameter
     protected List<DependencySet> dependencySets = new ArrayList<>();
 
-    @Parameter( defaultValue = "${project}", readonly = true )
+    @Parameter(defaultValue = "${project}", readonly = true)
     protected MavenProject project;
 
-    @Parameter( property = "localRepository", required = true, readonly = true )
+    @Parameter(property = "localRepository", required = true, readonly = true)
     private ArtifactRepository localRepository;
 
-    @Parameter( property = "project.remoteArtifactRepositories", required = true, readonly = true )
+    @Parameter(property = "project.remoteArtifactRepositories", required = true, readonly = true)
     private List<ArtifactRepository> remoteRepositories;
 
-    @Component( role = MavenProjectBuilder.class )
+    @Component(role = MavenProjectBuilder.class)
     protected MavenProjectBuilder projectBuilder;
 
     @Component
     private ModelInheritanceAssembler assembler;
 
-    @Parameter( defaultValue = "${session}", required = true, readonly = true )
+    @Parameter(defaultValue = "${session}", required = true, readonly = true)
     protected MavenSession session;
 
     @Component
     protected ArtifactResolver artifactResolver;
 
-    @Parameter ( required = true )
+    @Parameter(required = true)
     private String location;
 
-    @Parameter ( required = true )
+    @Parameter(required = true)
     protected File licenseDirectory;
 
     private Map<String, MavenProject> projectCache = new HashMap<>();
@@ -113,8 +113,7 @@
         return licenseMap;
     }
 
-    protected void init() throws MojoExecutionException, MalformedURLException,
-            ProjectBuildingException {
+    protected void init() throws MojoExecutionException, MalformedURLException, ProjectBuildingException {
         excludedScopes.add("system");
         excludePatterns = compileExcludePatterns();
         supplementModels = SupplementalModelHelper.loadSupplements(getLog(), models);
@@ -144,7 +143,7 @@
     }
 
     private void addDependencyToLicenseMap(MavenProject depProject, List<Pair<String, String>> depLicenses,
-                                           String depLocation) {
+            String depLocation) {
         final String depGav = toGav(depProject);
         getLog().debug("adding " + depGav + ", location: " + depLocation);
         final MutableBoolean usedMetric = new MutableBoolean(false);
@@ -152,17 +151,16 @@
             Collections.sort(depLicenses, (o1, o2) -> {
                 final int metric1 = getLicenseMetric(o1.getLeft());
                 final int metric2 = getLicenseMetric(o2.getLeft());
-                usedMetric.setValue(usedMetric.booleanValue()
-                        || metric1 != LicenseSpec.UNDEFINED_LICENSE_METRIC
+                usedMetric.setValue(usedMetric.booleanValue() || metric1 != LicenseSpec.UNDEFINED_LICENSE_METRIC
                         || metric2 != LicenseSpec.UNDEFINED_LICENSE_METRIC);
                 return Integer.compare(metric1, metric2);
             });
             if (usedMetric.booleanValue()) {
-                getLog().info("Multiple licenses for " + depGav + ": " + depLicenses
-                        + "; taking lowest metric: " + depLicenses.get(0));
+                getLog().info("Multiple licenses for " + depGav + ": " + depLicenses + "; taking lowest metric: "
+                        + depLicenses.get(0));
             } else {
-                getLog().warn("Multiple licenses for " + depGav + ": " + depLicenses
-                        + "; taking first listed: " + depLicenses.get(0));
+                getLog().warn("Multiple licenses for " + depGav + ": " + depLicenses + "; taking first listed: "
+                        + depLicenses.get(0));
             }
         } else if (depLicenses.isEmpty()) {
             getLog().info("no license defined in model for " + depGav);
@@ -179,8 +177,7 @@
             } catch (MalformedURLException e) {
                 // we encounter this a lot.  Log a warning, and use an annotated key
                 final String fakeLicenseUrl = depGav.replaceAll(":", "--") + "_" + licenseUrl;
-                getLog().info("- URL for " + depGav + " is malformed: " + licenseUrl + "; using: "
-                        + fakeLicenseUrl);
+                getLog().info("- URL for " + depGav + " is malformed: " + licenseUrl + "; using: " + fakeLicenseUrl);
                 licenseUrl = fakeLicenseUrl;
             }
         }
@@ -196,7 +193,7 @@
             urlToLicenseMap.put(licenseUrl, license);
             for (String alias : license.getAliasUrls()) {
                 if (!urlToLicenseMap.containsKey(alias)) {
-                    urlToLicenseMap.put(alias ,license);
+                    urlToLicenseMap.put(alias, license);
                 }
             }
         } else if (license.getDisplayName() == null && spec.getDisplayName() != null) {
@@ -216,11 +213,11 @@
 
     private void buildUrlLicenseMap() throws MojoExecutionException {
         for (LicenseSpec license : licenses) {
-            if (urlToLicenseMap.put(license.getUrl() ,license) != null) {
+            if (urlToLicenseMap.put(license.getUrl(), license) != null) {
                 throw new MojoExecutionException("Duplicate URL mapping: " + license.getUrl());
             }
             for (String alias : license.getAliasUrls()) {
-                if (urlToLicenseMap.put(alias ,license) != null) {
+                if (urlToLicenseMap.put(alias, license) != null) {
                     throw new MojoExecutionException("Duplicate URL mapping: " + alias);
                 }
             }
@@ -238,20 +235,19 @@
             if (dep == null) {
                 getLog().warn("Unused override dependency " + gav + "; ignoring...");
             } else {
-                final List<Pair<String, String>> newLicense = Collections.singletonList(
-                        new ImmutablePair<>(override.getUrl(), override.getName()));
+                final List<Pair<String, String>> newLicense =
+                        Collections.singletonList(new ImmutablePair<>(override.getUrl(), override.getName()));
                 List<Pair<String, String>> prevLicense = dependencyLicenseMap.put(dep, newLicense);
-                getLog().warn("license list for " + toGav(dep)
-                        + " changed with <override>; was: " + prevLicense
+                getLog().warn("license list for " + toGav(dep) + " changed with <override>; was: " + prevLicense
                         + ", now: " + newLicense);
             }
         }
         return dependencyLicenseMap;
     }
 
-    private void gatherProjectDependencies(MavenProject project, Map<MavenProject,
-            List<Pair<String, String>>> dependencyLicenseMap, Map<String, MavenProject> dependencyGavMap)
-            throws ProjectBuildingException {
+    private void gatherProjectDependencies(MavenProject project,
+            Map<MavenProject, List<Pair<String, String>>> dependencyLicenseMap,
+            Map<String, MavenProject> dependencyGavMap) throws ProjectBuildingException {
         final Set dependencyArtifacts = project.getArtifacts();
         if (dependencyArtifacts != null) {
             for (Object depArtifactObj : dependencyArtifacts) {
@@ -264,8 +260,7 @@
                     for (Object license : dep.getLicenses()) {
                         final License license1 = (License) license;
                         String url = license1.getUrl() != null ? license1.getUrl()
-                                : (license1.getName() != null ? license1.getName()
-                                : "LICENSE_EMPTY_NAME_URL");
+                                : (license1.getName() != null ? license1.getName() : "LICENSE_EMPTY_NAME_URL");
                         licenseUrls.add(new ImmutablePair<>(url, license1.getName()));
                     }
                     dependencyLicenseMap.put(dep, licenseUrls);
@@ -286,22 +281,21 @@
                 throw new ProjectBuildingException(key, "Error creating dependent artifacts", e);
             }
 
-            Model supplement = supplementModels.get(
-                    SupplementalModelHelper.generateSupplementMapKey(depObj.getGroupId(), depObj.getArtifactId()));
+            Model supplement = supplementModels
+                    .get(SupplementalModelHelper.generateSupplementMapKey(depObj.getGroupId(), depObj.getArtifactId()));
             if (supplement != null) {
                 Model merged = SupplementalModelHelper.mergeModels(assembler, depProj.getModel(), supplement);
-                Set<String> origLicenses = depProj.getModel().getLicenses().stream().map(License::getUrl)
-                        .collect(Collectors.toSet());
-                Set<String> newLicenses = merged.getLicenses().stream().map(License::getUrl)
-                        .collect(Collectors.toSet());
+                Set<String> origLicenses =
+                        depProj.getModel().getLicenses().stream().map(License::getUrl).collect(Collectors.toSet());
+                Set<String> newLicenses =
+                        merged.getLicenses().stream().map(License::getUrl).collect(Collectors.toSet());
                 if (!origLicenses.equals(newLicenses)) {
-                    getLog().warn("license list for " + toGav(depProj)
-                            + " changed with supplemental model; was: " + origLicenses
-                            + ", now: " + newLicenses);
+                    getLog().warn("license list for " + toGav(depProj) + " changed with supplemental model; was: "
+                            + origLicenses + ", now: " + newLicenses);
                 }
                 depProj = new MavenProject(merged);
-                depProj.setArtifact( depObj );
-                depProj.setVersion( depObj.getVersion() );
+                depProj.setArtifact(depObj);
+                depProj.setVersion(depObj.getVersion());
             }
             depProj.getArtifact().setScope(depObj.getScope());
             projectCache.put(key, depProj);
@@ -354,4 +348,3 @@
         return artifactResolver;
     }
 }
-
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseSpec.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseSpec.java
index f2ff5dd..cd955d9 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseSpec.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseSpec.java
@@ -46,8 +46,8 @@
 
     @JsonCreator
     public LicenseSpec(@JsonProperty("aliasUrls") List<String> aliasUrls, @JsonProperty("content") String content,
-                       @JsonProperty("contentFile") String contentFile, @JsonProperty("displayName") String displayName,
-                       @JsonProperty("metric") int metric, @JsonProperty("url") String url) {
+            @JsonProperty("contentFile") String contentFile, @JsonProperty("displayName") String displayName,
+            @JsonProperty("metric") int metric, @JsonProperty("url") String url) {
         this.aliasUrls = aliasUrls;
         this.content = content;
         this.contentFile = contentFile;
@@ -77,8 +77,7 @@
             String file;
             try {
                 URI uri = new URI(url);
-                file = ((uri.getHost() != null ? uri.getHost() : "")
-                        + uri.getPath()).replaceAll(BAD_CHARS, "_");
+                file = ((uri.getHost() != null ? uri.getHost() : "") + uri.getPath()).replaceAll(BAD_CHARS, "_");
             } catch (URISyntaxException e) {
                 file = url.replaceAll(BAD_CHARS, "_");
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseUtil.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseUtil.java
index 30588d4..a80dc1d 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/LicenseUtil.java
@@ -91,7 +91,7 @@
     private static void doTrim(Writer out, BufferedReader reader, int extraPadding, int wrapLength) throws IOException {
         boolean head = true;
         int empty = 0;
-        for (String line = reader.readLine(); line != null; line = reader.readLine() ) {
+        for (String line = reader.readLine(); line != null; line = reader.readLine()) {
             if ("".equals(line.trim())) {
                 if (!head) {
                     empty++;
@@ -136,7 +136,7 @@
                 continue;
             }
             String fullyTrimmed = line.trim();
-            freeSpaces = Math.min(freeSpaces,  rightTrimmed.length() - fullyTrimmed.length());
+            freeSpaces = Math.min(freeSpaces, rightTrimmed.length() - fullyTrimmed.length());
             maxLineLength = Math.max(maxLineLength, fullyTrimmed.length());
         }
         return new ImmutablePair<>(freeSpaces, maxLineLength);
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/Override.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/Override.java
index c99a047..aa532e6 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/Override.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/Override.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.maven.license;
 
-public class Override  {
+public class Override {
 
     @SuppressWarnings("unused") // set by Maven plugin configuration
     private String url;
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/SourcePointerResolver.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/SourcePointerResolver.java
index c713b08..0a24a76 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/SourcePointerResolver.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/SourcePointerResolver.java
@@ -82,15 +82,14 @@
     }
 
     private void ensureCDDLSourcesPointer(Collection<Project> projects, ArtifactRepository central,
-                                          ArtifactResolutionRequest request)
-            throws ProjectBuildingException, IOException {
+            ArtifactResolutionRequest request) throws ProjectBuildingException, IOException {
         for (Project p : projects) {
             if (p.getSourcePointer() != null) {
                 continue;
             }
             mojo.getLog().debug("finding sources for artifact: " + p);
-            Artifact sourcesArtifact = new DefaultArtifact(p.getGroupId(), p.getArtifactId(),
-                    p.getVersion(), Artifact.SCOPE_COMPILE, "jar", "sources", null);
+            Artifact sourcesArtifact = new DefaultArtifact(p.getGroupId(), p.getArtifactId(), p.getVersion(),
+                    Artifact.SCOPE_COMPILE, "jar", "sources", null);
             MavenProject mavenProject = mojo.resolveDependency(sourcesArtifact);
             sourcesArtifact.setArtifactHandler(mavenProject.getArtifact().getArtifactHandler());
             final ArtifactRepository localRepo = mojo.getSession().getLocalRepository();
@@ -162,7 +161,7 @@
 
         @java.lang.Override
         public String pathOfLocalRepositoryMetadata(ArtifactMetadata artifactMetadata,
-                                                    ArtifactRepository artifactRepository) {
+                ArtifactRepository artifactRepository) {
             return null;
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/IndentDirective.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/IndentDirective.java
index 77b8afd..f58b419 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/IndentDirective.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/IndentDirective.java
@@ -43,7 +43,7 @@
     private static final String PARAM_NAME_WRAP = "wrap";
 
     @Override
-    public void execute(Environment env, Map params, TemplateModel [] loopVars, TemplateDirectiveBody body)
+    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
             throws TemplateException, IOException {
 
         int numSpaces = -1;
@@ -106,8 +106,7 @@
     }
 
     private TemplateModelException paramException(String paramName, String message) throws TemplateModelException {
-        return new TemplateModelException(
-                "The '" + paramName + "' parameter " + message);
+        return new TemplateModelException("The '" + paramName + "' parameter " + message);
     }
 
     private static class IndentingWriter extends Writer {
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/LoadFileDirective.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/LoadFileDirective.java
index 67da23f..2b03fe2 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/LoadFileDirective.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/freemarker/LoadFileDirective.java
@@ -46,9 +46,7 @@
     private static final String PARAM_DEFAULT_TEXT = "defaultOnMissing";
 
     @Override
-    public void execute(Environment env,
-                        Map params, TemplateModel[] loopVars,
-                        TemplateDirectiveBody body)
+    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
             throws TemplateException, IOException {
 
         String fileParam = null;
@@ -91,15 +89,14 @@
             }
         }
         if (fileParam == null) {
-            throw new TemplateModelException(
-                    "The required \"" + PARAM_FILE + "\" parameter"
-                            + "is missing.");
+            throw new TemplateModelException("The required \"" + PARAM_FILE + "\" parameter" + "is missing.");
         }
         if (body != null) {
             throw new TemplateModelException("Body is not supported by this directive");
         }
         Writer out = env.getOut();
-        File baseDir = ((FileTemplateLoader)((Configuration)env.getTemplate().getParent()).getTemplateLoader()).baseDir;
+        File baseDir =
+                ((FileTemplateLoader) ((Configuration) env.getTemplate().getParent()).getTemplateLoader()).baseDir;
         File file = new File(baseDir, fileParam);
         if (file.exists()) {
             if (trimParam) {
@@ -108,7 +105,7 @@
             } else {
                 IOUtils.copy(new FileInputStream(file), out, StandardCharsets.UTF_8);
             }
-        } else if (defaultParam != null ) {
+        } else if (defaultParam != null) {
             out.append(defaultParam).append("\n");
         } else {
             throw new IOException("File not found: " + file);
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
index 952b91a..f6f9f32 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/LicensedProjects.java
@@ -38,7 +38,7 @@
 
     @JsonCreator
     public LicensedProjects(@JsonProperty("license") LicenseSpec license,
-                            @JsonProperty("projects") Set<Project> projects) {
+            @JsonProperty("projects") Set<Project> projects) {
         this.license = license;
         this.projects.addAll(projects);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
index 80d4548..ff35162 100644
--- a/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
+++ b/hyracks-fullstack/hyracks/hyracks-maven-plugins/license-automation-plugin/src/main/java/org/apache/hyracks/maven/license/project/Project.java
@@ -44,8 +44,8 @@
     @JsonIgnore
     private MavenProject mavenProject;
 
-    public static final Comparator<Project> PROJECT_COMPARATOR = (o1, o2) ->
-            o1.compareToken().compareTo(o2.compareToken());
+    public static final Comparator<Project> PROJECT_COMPARATOR =
+            (o1, o2) -> o1.compareToken().compareTo(o2.compareToken());
 
     public Project(MavenProject project, String location, File artifactPath) {
         mavenProject = project;
@@ -60,10 +60,10 @@
 
     @JsonCreator
     public Project(@JsonProperty("name") String name, @JsonProperty("groupId") String groupId,
-                   @JsonProperty("artifactId") String artifactId, @JsonProperty("url") String url,
-                   @JsonProperty("version") String version, @JsonProperty("location") String location,
-                   @JsonProperty("artifactPath") String artifactPath, @JsonProperty("noticeText") String noticeText,
-                   @JsonProperty("licenseText") String licenseText) {
+            @JsonProperty("artifactId") String artifactId, @JsonProperty("url") String url,
+            @JsonProperty("version") String version, @JsonProperty("location") String location,
+            @JsonProperty("artifactPath") String artifactPath, @JsonProperty("noticeText") String noticeText,
+            @JsonProperty("licenseText") String licenseText) {
         this.name = name;
         this.groupId = groupId;
         this.artifactId = artifactId;
diff --git a/hyracks-fullstack/hyracks/hyracks-net/pom.xml b/hyracks-fullstack/hyracks/hyracks-net/pom.xml
index dd22733..36e33c5 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-net/pom.xml
@@ -51,5 +51,9 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/AbstractChannelWriteInterface.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/AbstractChannelWriteInterface.java
index e50ffd2..0b548f6 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/AbstractChannelWriteInterface.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/AbstractChannelWriteInterface.java
@@ -21,17 +21,17 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayDeque;
 import java.util.Queue;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IBufferAcceptor;
 import org.apache.hyracks.api.comm.IChannelControlBlock;
 import org.apache.hyracks.api.comm.IChannelWriteInterface;
 import org.apache.hyracks.api.comm.ICloseableBufferAcceptor;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractChannelWriteInterface implements IChannelWriteInterface {
 
-    private static final Logger LOGGER = Logger.getLogger(AbstractChannelWriteInterface.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final IChannelControlBlock ccb;
     protected final Queue<ByteBuffer> wiFullQueue;
     protected boolean channelWritabilityState;
@@ -129,8 +129,8 @@
         public void close() {
             synchronized (ccb) {
                 if (eos) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.warning("Received duplicate close() on channel: " + ccb.getChannelId());
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.warn("Received duplicate close() on channel: " + ccb.getChannelId());
                     }
                     return;
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/ChannelSet.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/ChannelSet.java
index 49bb292..bd42560 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/ChannelSet.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/ChannelSet.java
@@ -20,15 +20,15 @@
 
 import java.util.Arrays;
 import java.util.BitSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IChannelInterfaceFactory;
 import org.apache.hyracks.api.comm.MuxDemuxCommand;
 import org.apache.hyracks.api.exceptions.NetException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ChannelSet {
-    private static final Logger LOGGER = Logger.getLogger(ChannelSet.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final int INITIAL_SIZE = 16;
 
@@ -82,8 +82,8 @@
             ChannelControlBlock ccb = ccbArray[i];
             if (ccb != null) {
                 if (ccb.completelyClosed()) {
-                    if (LOGGER.isLoggable(Level.FINE)) {
-                        LOGGER.fine("Cleaning free channel: " + ccb);
+                    if (LOGGER.isDebugEnabled()) {
+                        LOGGER.debug("Cleaning free channel: " + ccb);
                     }
                     freeChannel(ccb);
                 }
@@ -218,8 +218,8 @@
         if (ccbArray[idx] != null) {
             assert ccbArray[idx].completelyClosed() : ccbArray[idx].toString();
             if (ccbArray[idx].completelyClosed()) {
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    LOGGER.fine("Cleaning free channel: " + ccbArray[idx]);
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("Cleaning free channel: " + ccbArray[idx]);
                 }
                 freeChannel(ccbArray[idx]);
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/FullFrameChannelWriteInterface.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/FullFrameChannelWriteInterface.java
index 418ebd7..17b70a8 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/FullFrameChannelWriteInterface.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/FullFrameChannelWriteInterface.java
@@ -18,18 +18,17 @@
  */
 package org.apache.hyracks.net.protocols.muxdemux;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.comm.IBufferFactory;
 import org.apache.hyracks.api.comm.IChannelControlBlock;
 import org.apache.hyracks.api.comm.IConnectionWriterState;
 import org.apache.hyracks.api.comm.MuxDemuxCommand;
 import org.apache.hyracks.api.exceptions.NetException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class FullFrameChannelWriteInterface extends AbstractChannelWriteInterface {
 
-    private static final Logger LOGGER = Logger.getLogger(FullFrameChannelWriteInterface.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     FullFrameChannelWriteInterface(IChannelControlBlock ccb) {
         super(ccb);
@@ -77,8 +76,8 @@
         }
         channelWritabilityState = true;
         if (eos) {
-            if (LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Received duplicate close() on channel: " + channelId);
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Received duplicate close() on channel: " + channelId);
             }
             return;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MultiplexedConnection.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MultiplexedConnection.java
index 8c54c65..286320b 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MultiplexedConnection.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MultiplexedConnection.java
@@ -23,8 +23,6 @@
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SocketChannel;
 import java.util.BitSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IChannelControlBlock;
 import org.apache.hyracks.api.comm.IChannelInterfaceFactory;
@@ -33,6 +31,8 @@
 import org.apache.hyracks.api.exceptions.NetException;
 import org.apache.hyracks.net.protocols.tcp.ITCPConnectionEventListener;
 import org.apache.hyracks.net.protocols.tcp.TCPConnection;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * A {@link MultiplexedConnection} can be used by clients to create multiple "channels"
@@ -41,7 +41,7 @@
  * @author vinayakb
  */
 public class MultiplexedConnection implements ITCPConnectionEventListener {
-    private static final Logger LOGGER = Logger.getLogger(MultiplexedConnection.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final int MAX_CHUNKS_READ_PER_CYCLE = 4;
 
@@ -265,8 +265,8 @@
                     pendingWriteEventsCounter.decrement();
                 }
                 BitSet pendingChannelCreditsBitmap = cSet.getPendingChannelCreditsBitmap();
-                for (int j = pendingChannelCreditsBitmap.nextSetBit(0); j >= 0; j = pendingChannelCreditsBitmap
-                        .nextSetBit(j)) {
+                for (int j = pendingChannelCreditsBitmap.nextSetBit(0); j >= 0; j =
+                        pendingChannelCreditsBitmap.nextSetBit(j)) {
                     writerState.command.setChannelId(j);
                     writerState.command.setCommandType(MuxDemuxCommand.CommandType.ADD_CREDITS);
                     ChannelControlBlock ccb = cSet.getCCB(j);
@@ -366,8 +366,8 @@
                 }
                 readerState.readBuffer.flip();
                 readerState.command.read(readerState.readBuffer);
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    LOGGER.fine("Received command: " + readerState.command);
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("Received command: " + readerState.command);
                 }
                 ChannelControlBlock ccb = null;
                 switch (readerState.command.getCommandType()) {
@@ -409,8 +409,8 @@
                         muxDemux.getChannelOpenListener().channelOpened(ccb);
                     }
                 }
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    LOGGER.fine("Applied command: " + readerState.command + " on " + ccb);
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("Applied command: " + readerState.command + " on " + ccb);
                 }
             }
             if (readerState.pendingReadSize > 0) {
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MuxDemux.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MuxDemux.java
index f6261da..c12909c 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MuxDemux.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/muxdemux/MuxDemux.java
@@ -107,6 +107,13 @@
                     }
                 }
             }
+
+            @Override
+            public void connectionClosed(TCPConnection connection) {
+                synchronized (MuxDemux.this) {
+                    connectionMap.remove(connection.getRemoteAddress());
+                }
+            }
         }, nThreads);
         perfCounters = new MuxDemuxPerformanceCounters();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/ITCPConnectionListener.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/ITCPConnectionListener.java
index b801cd3..afb78b5 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/ITCPConnectionListener.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/ITCPConnectionListener.java
@@ -22,9 +22,16 @@
 import java.net.InetSocketAddress;
 
 public interface ITCPConnectionListener {
-    public void acceptedConnection(TCPConnection connection);
+    void acceptedConnection(TCPConnection connection);
 
-    public void connectionEstablished(TCPConnection connection);
+    void connectionEstablished(TCPConnection connection);
 
-    public void connectionFailure(InetSocketAddress remoteAddress, IOException error);
+    void connectionFailure(InetSocketAddress remoteAddress, IOException error);
+
+    /**
+     * Notifies the listener that {@code connection} has been closed.
+     *
+     * @param connection
+     */
+    void connectionClosed(TCPConnection connection);
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPConnection.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPConnection.java
index ce0bbbe..29afc6d 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPConnection.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPConnection.java
@@ -24,11 +24,17 @@
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
 public class TCPConnection {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
     private final TCPEndpoint endpoint;
 
     private final SocketChannel channel;
-
+    private final InetSocketAddress remoteAddress;
     private final SelectionKey key;
 
     private final Selector selector;
@@ -42,6 +48,7 @@
         this.channel = channel;
         this.key = key;
         this.selector = selector;
+        remoteAddress = (InetSocketAddress) channel.socket().getRemoteSocketAddress();
     }
 
     public TCPEndpoint getEndpoint() {
@@ -57,7 +64,7 @@
     }
 
     public InetSocketAddress getRemoteAddress() {
-        return (InetSocketAddress) channel.socket().getRemoteSocketAddress();
+        return remoteAddress;
     }
 
     public void enable(int ops) {
@@ -86,12 +93,12 @@
         this.attachment = attachment;
     }
 
-    public void close() {
+    public synchronized void close() {
         key.cancel();
         try {
             channel.close();
         } catch (IOException e) {
-            e.printStackTrace();
+            LOGGER.error(() -> "Error closing channel at: " + remoteAddress, e);
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPEndpoint.java b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPEndpoint.java
index 52f4c30..4633cf3 100644
--- a/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPEndpoint.java
+++ b/hyracks-fullstack/hyracks/hyracks-net/src/main/java/org/apache/hyracks/net/protocols/tcp/TCPEndpoint.java
@@ -31,7 +31,13 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
 public class TCPEndpoint {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
     private final ITCPConnectionListener connectionListener;
 
     private final int nThreads;
@@ -107,10 +113,10 @@
             super("TCPEndpoint IO Thread");
             setDaemon(true);
             setPriority(Thread.NORM_PRIORITY);
-            this.pendingConnections = new ArrayList<InetSocketAddress>();
-            this.workingPendingConnections = new ArrayList<InetSocketAddress>();
-            this.incomingConnections = new ArrayList<SocketChannel>();
-            this.workingIncomingConnections = new ArrayList<SocketChannel>();
+            this.pendingConnections = new ArrayList<>();
+            this.workingPendingConnections = new ArrayList<>();
+            this.incomingConnections = new ArrayList<>();
+            this.workingIncomingConnections = new ArrayList<>();
             selector = Selector.open();
         }
 
@@ -124,6 +130,7 @@
                         for (InetSocketAddress address : workingPendingConnections) {
                             SocketChannel channel = SocketChannel.open();
                             channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
+                            channel.setOption(StandardSocketOptions.SO_KEEPALIVE, true);
                             channel.configureBlocking(false);
                             boolean connect = false;
                             boolean failure = false;
@@ -150,6 +157,7 @@
                     if (!workingIncomingConnections.isEmpty()) {
                         for (SocketChannel channel : workingIncomingConnections) {
                             channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
+                            channel.setOption(StandardSocketOptions.SO_KEEPALIVE, true);
                             channel.configureBlocking(false);
                             SelectionKey sKey = channel.register(selector, 0);
                             TCPConnection connection = new TCPConnection(TCPEndpoint.this, channel, sKey, selector);
@@ -174,8 +182,10 @@
                                 try {
                                     connection.getEventListener().notifyIOReady(connection, readable, writable);
                                 } catch (Exception e) {
+                                    LOGGER.error("Unexpected tcp io error", e);
                                     connection.getEventListener().notifyIOError(e);
                                     connection.close();
+                                    connectionListener.connectionClosed(connection);
                                     continue;
                                 }
                             }
@@ -201,7 +211,7 @@
                         }
                     }
                 } catch (Exception e) {
-                    e.printStackTrace();
+                    LOGGER.error("Error in TCPEndpoint " + localAddress, e);
                 }
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-server/pom.xml b/hyracks-fullstack/hyracks/hyracks-server/pom.xml
index 0977f9b..8b59870 100644
--- a/hyracks-fullstack/hyracks/hyracks-server/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-server/pom.xml
@@ -44,6 +44,17 @@
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>test-jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
@@ -65,12 +76,6 @@
         <configuration>
           <runOrder>alphabetical</runOrder>
           <forkMode>pertest</forkMode>
-          <systemProperties>
-            <property>
-              <name>java.util.logging.config.file</name>
-              <value>src/test/resources/logging.properties</value>
-            </property>
-          </systemProperties>
         </configuration>
         <executions>
           <execution>
@@ -150,6 +155,11 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.hyracks</groupId>
+      <artifactId>hyracks-util</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpcore</artifactId>
     </dependency>
@@ -163,10 +173,6 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hyracks</groupId>
       <artifactId>hyracks-control-nc</artifactId>
       <version>${project.version}</version>
@@ -175,5 +181,9 @@
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksCCProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksCCProcess.java
deleted file mode 100644
index b2aa2d1..0000000
--- a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksCCProcess.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.server.process;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.hyracks.control.cc.CCDriver;
-
-public class HyracksCCProcess extends HyracksServerProcess {
-
-    public HyracksCCProcess(File configFile, File logFile, File appHome, File workingDir) {
-        this.configFile = configFile;
-        this.logFile = logFile;
-        this.appHome = appHome;
-        this.workingDir = workingDir;
-    }
-
-    @Override
-    protected String getMainClassName() {
-        return CCDriver.class.getName();
-    }
-
-    @Override
-    protected void addJvmArgs(List<String> cList) {
-        // CC needs more than default memory
-        cList.add("-Xmx1024m");
-        //cList.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005");
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksNCServiceProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksNCServiceProcess.java
deleted file mode 100644
index 39971ad..0000000
--- a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksNCServiceProcess.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.server.process;
-
-import org.apache.hyracks.control.nc.service.NCService;
-
-import java.io.File;
-import java.util.List;
-
-public class HyracksNCServiceProcess extends HyracksServerProcess {
-
-    public HyracksNCServiceProcess(File configFile, File logFile, File appHome, File workingDir) {
-        this.configFile = configFile;
-        this.logFile = logFile;
-        this.appHome = appHome;
-        this.workingDir = workingDir;
-    }
-
-    @Override
-    protected String getMainClassName() {
-        return NCService.class.getName();
-    }
-
-    @Override
-    protected void addJvmArgs(List<String> cList) {
-        // NCService needs little memory
-        cList.add("-Xmx128m");
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksServerProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksServerProcess.java
deleted file mode 100644
index 7bb3332..0000000
--- a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksServerProcess.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.server.process;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-abstract class HyracksServerProcess {
-    private static final Logger LOGGER = Logger.getLogger(HyracksServerProcess.class.getName());
-
-    protected Process process;
-    protected File configFile = null;
-    protected File logFile = null;
-    protected File appHome = null;
-    protected File workingDir = null;
-
-    public void start() throws IOException {
-        String[] cmd = buildCommand();
-        if (LOGGER.isLoggable(Level.INFO)) {
-            LOGGER.info("Starting command: " + Arrays.toString(cmd));
-        }
-
-        ProcessBuilder pb = new ProcessBuilder(cmd);
-        pb.redirectErrorStream(true);
-        if (logFile != null) {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Logging to: " + logFile.getCanonicalPath());
-            }
-            logFile.getParentFile().mkdirs();
-            try (FileWriter writer = new FileWriter(logFile, true)) {
-                writer.write("---------------------\n");
-            }
-            pb.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile));
-        } else {
-            if (LOGGER.isLoggable(Level.INFO)) {
-                LOGGER.info("Logfile not set, subprocess will output to stdout");
-            }
-        }
-        pb.directory(workingDir);
-        process = pb.start();
-    }
-
-    public void stop() {
-        process.destroy();
-        try {
-            process.waitFor();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    public void stop(boolean forcibly) {
-        if (forcibly) {
-            process.destroyForcibly();
-        } else {
-            process.destroy();
-        }
-        try {
-            process.waitFor();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-    }
-
-    private String[] buildCommand() {
-        List<String> cList = new ArrayList<String>();
-        cList.add(getJavaCommand());
-        addJvmArgs(cList);
-        cList.add("-Dapp.home=" + appHome.getAbsolutePath());
-        cList.add("-classpath");
-        cList.add(getClasspath());
-        cList.add(getMainClassName());
-        if (configFile != null) {
-            cList.add("-config-file");
-            cList.add(configFile.getAbsolutePath());
-        }
-        addCmdLineArgs(cList);
-        return cList.toArray(new String[cList.size()]);
-    }
-
-    protected void addJvmArgs(List<String> cList) {
-    }
-
-    protected void addCmdLineArgs(List<String> cList) {
-    }
-
-    protected abstract String getMainClassName();
-
-    private final String getClasspath() {
-        return System.getProperty("java.class.path");
-    }
-
-    private final String getJavaCommand() {
-        return System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksVirtualCluster.java b/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksVirtualCluster.java
deleted file mode 100644
index e1590e7..0000000
--- a/hyracks-fullstack/hyracks/hyracks-server/src/main/java/org/apache/hyracks/server/process/HyracksVirtualCluster.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.server.process;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Starts a local hyracks-based cluster (NC and CC child processes).
- */
-public class HyracksVirtualCluster {
-    private final File appHome;
-    private final File workingDir;
-    private List<HyracksNCServiceProcess> ncProcs = new ArrayList<>(3);
-    private HyracksCCProcess ccProc = null;
-
-    /**
-     * Construct a Hyracks-based cluster.
-     * @param appHome - path to the installation root of the Hyracks application.
-     *                At least bin/hyracksnc (or the equivalent NC script for
-     *                the application) must exist in this directory.
-     * @param workingDir - directory to use as CWD for all child processes. May
-     *                be null, in which case the CWD of the invoking process is used.
-     */
-    public HyracksVirtualCluster(File appHome, File workingDir) {
-        this.appHome = appHome;
-        this.workingDir = workingDir;
-    }
-
-    /**
-     * Creates and starts an NCService.
-     * @param configFile - full path to an ncservice.conf. May be null to accept all defaults.
-     * @throws IOException - if there are errors starting the process.
-     */
-    public HyracksNCServiceProcess addNCService(File configFile, File logFile) throws IOException {
-        HyracksNCServiceProcess proc = new HyracksNCServiceProcess(configFile, logFile, appHome, workingDir);
-        proc.start();
-        ncProcs.add(proc);
-        return proc;
-    }
-
-    /**
-     * Starts the CC, initializing the cluster. Expects that any NCs referenced
-     * in the cluster configuration have already been started with addNCService().
-     * @param ccConfigFile - full path to a cluster conf file. May be null to accept all
-     *                     defaults, although this is seldom useful since there are no NCs.
-     * @throws IOException - if there are errors starting the process.
-     */
-    public HyracksCCProcess start(File ccConfigFile, File logFile) throws IOException {
-        ccProc = new HyracksCCProcess(ccConfigFile, logFile, appHome, workingDir);
-        ccProc.start();
-        return ccProc;
-    }
-
-    /**
-     * Stops all processes in the cluster.
-     * QQQ Someday this should probably do a graceful stop of NCs rather than
-     * killing the NCService.
-     */
-    public void stop() {
-        ccProc.stop();
-        for (HyracksNCServiceProcess proc : ncProcs) {
-            proc.stop();
-        }
-    }
-}
-
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/server/test/NCServiceIT.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/server/test/NCServiceIT.java
deleted file mode 100644
index fda099e..0000000
--- a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/server/test/NCServiceIT.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.server.test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.logging.Logger;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import junit.framework.Assert;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.apache.hyracks.server.process.HyracksVirtualCluster;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class NCServiceIT {
-
-    private static final String TARGET_DIR = StringUtils
-            .join(new String[] { ".", "target" }, File.separator);
-    private static final String LOG_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "failsafe-reports" }, File.separator);
-    private static final String RESOURCE_DIR = StringUtils
-            .join(new String[] { TARGET_DIR, "test-classes", "NCServiceIT" }, File.separator);
-    private static final String APP_HOME = StringUtils
-            .join(new String[] { TARGET_DIR, "appassembler" }, File.separator);
-    private static final Logger LOGGER = Logger.getLogger(NCServiceIT.class.getName());
-
-    private static HyracksVirtualCluster cluster = null;
-
-    @BeforeClass
-    public static void setUp() throws Exception {
-        cluster = new HyracksVirtualCluster(new File(APP_HOME), null);
-        cluster.addNCService(
-                new File(RESOURCE_DIR, "nc-red.conf"),
-                new File(LOG_DIR, "nc-red.log")
-        );
-        cluster.addNCService(
-                new File(RESOURCE_DIR, "nc-blue.conf"),
-                new File(LOG_DIR, "nc-blue.log")
-        );
-
-        try {
-            Thread.sleep(2000);
-        }
-        catch (InterruptedException ignored) {
-        }
-
-        // Start CC
-        cluster.start(
-                new File(RESOURCE_DIR, "cc.conf"),
-                new File(LOG_DIR, "cc.log")
-        );
-
-        try {
-            Thread.sleep(10000);
-        }
-        catch (InterruptedException ignored) {
-        }
-    }
-
-    @AfterClass
-    public static void tearDown() throws IOException {
-        cluster.stop();
-    }
-
-    private static String getHttp(String url) throws Exception {
-        HttpClient client = HttpClients.createDefault();
-        HttpGet get = new HttpGet(url);
-        int statusCode;
-        final HttpResponse httpResponse;
-        try {
-            httpResponse = client.execute(get);
-            statusCode = httpResponse.getStatusLine().getStatusCode();
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw e;
-        }
-        String response = EntityUtils.toString(httpResponse.getEntity());
-        if (statusCode == HttpStatus.SC_OK) {
-            return response;
-        } else {
-            throw new Exception("HTTP error " + statusCode + ":\n" + response);
-        }
-    }
-
-    @Test
-    public void IsNodelistCorrect() throws Exception {
-        // Ping the nodelist HTTP API
-
-        ObjectMapper om = new ObjectMapper();
-        String localhost = InetAddress.getLoopbackAddress().getHostAddress();
-        String response = getHttp("http://" + localhost + ":12345/rest/nodes");
-        JsonNode result = om.readTree(response);
-        JsonNode nodes = result.get("result");
-        int numNodes = nodes.size();
-        Assert.assertEquals("Wrong number of nodes!", 2, numNodes);
-        for (int i = 0; i < nodes.size(); i++) {
-            JsonNode node = nodes.get(i);
-            String id = node.get("node-id").asText();
-            if (id.equals("red") || id.equals("blue")) {
-                continue;
-            }
-            Assert.fail("Unexpected node ID '" + id + "'!");
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        try {
-            setUp();
-        } catch (Exception e) {
-            e.printStackTrace();
-            LOGGER.severe("TEST CASE(S) FAILED");
-        } finally {
-            tearDown();
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/NCServiceIT.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/NCServiceIT.java
new file mode 100644
index 0000000..de32991
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/NCServiceIT.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.test.server;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.Iterator;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.apache.hyracks.test.server.process.HyracksVirtualCluster;
+import org.apache.hyracks.util.file.FileUtil;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import junit.framework.Assert;
+
+public class NCServiceIT {
+
+    private static final String TARGET_DIR = FileUtil.joinPath(".", "target");
+    private static final String LOG_DIR = FileUtil.joinPath(TARGET_DIR, "failsafe-reports");
+    private static final String RESOURCE_DIR = FileUtil.joinPath(TARGET_DIR, "test-classes", "NCServiceIT");
+    private static final String APP_HOME = FileUtil.joinPath(TARGET_DIR, "appassembler");
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private static HyracksVirtualCluster cluster = null;
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+        cluster = new HyracksVirtualCluster(new File(APP_HOME), null);
+        cluster.addNCService(new File(RESOURCE_DIR, "nc-red.conf"), new File(LOG_DIR, "nc-red.log"));
+        cluster.addNCService(new File(RESOURCE_DIR, "nc-blue.conf"), new File(LOG_DIR, "nc-blue.log"));
+
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException ignored) {
+        }
+
+        // Start CC
+        cluster.start(new File(RESOURCE_DIR, "cc.conf"), new File(LOG_DIR, "cc.log"));
+
+        try {
+            Thread.sleep(10000);
+        } catch (InterruptedException ignored) {
+        }
+    }
+
+    @AfterClass
+    public static void tearDown() throws IOException {
+        cluster.stop();
+    }
+
+    private static String getHttp(String url) throws Exception {
+        HttpClient client = HttpClients.createDefault();
+        HttpGet get = new HttpGet(url);
+        int statusCode;
+        final HttpResponse httpResponse;
+        try {
+            httpResponse = client.execute(get);
+            statusCode = httpResponse.getStatusLine().getStatusCode();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
+        String response = EntityUtils.toString(httpResponse.getEntity());
+        if (statusCode == HttpStatus.SC_OK) {
+            return response;
+        } else {
+            throw new Exception("HTTP error " + statusCode + ":\n" + response);
+        }
+    }
+
+    private JsonNode getEndpoint(String endpoint) throws Exception {
+        ObjectMapper om = new ObjectMapper();
+        String localhost = InetAddress.getLoopbackAddress().getHostAddress();
+        String response = getHttp("http://" + localhost + ":12345" + endpoint);
+        JsonNode result = om.readTree(response);
+        JsonNode nodes = result.get("result");
+        return nodes;
+    }
+
+    @Test
+    public void IsNodelistCorrect() throws Exception {
+        // Ping the nodelist HTTP API
+
+        JsonNode nodes = getEndpoint("/rest/nodes");
+        int numNodes = nodes.size();
+        Assert.assertEquals("Wrong number of nodes!", 2, numNodes);
+        for (int i = 0; i < nodes.size(); i++) {
+            JsonNode node = nodes.get(i);
+            String id = node.get("node-id").asText();
+            if (id.equals("red") || id.equals("blue")) {
+                continue;
+            }
+            Assert.fail("Unexpected node ID '" + id + "'!");
+        }
+    }
+
+    @Test
+    public void isXmxOverrideCorrect() throws Exception {
+        ArrayNode inputArgs = (ArrayNode) getEndpoint("/rest/nodes/red").get("input-arguments");
+        for (Iterator<JsonNode> it = inputArgs.elements(); it.hasNext();) {
+            String s = it.next().asText();
+            if (s.startsWith("-Xmx") && s.endsWith("m")) {
+                String digits = s.substring(4, 8);
+                Assert.assertEquals("1234", digits);
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        try {
+            setUp();
+        } catch (Exception e) {
+            e.printStackTrace();
+            LOGGER.error("TEST CASE(S) FAILED");
+        } finally {
+            tearDown();
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksCCProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksCCProcess.java
new file mode 100644
index 0000000..b39def5
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksCCProcess.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.test.server.process;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hyracks.control.cc.CCDriver;
+
+public class HyracksCCProcess extends HyracksServerProcess {
+
+    public HyracksCCProcess(File configFile, File logFile, File appHome, File workingDir) {
+        this.configFile = configFile;
+        this.logFile = logFile;
+        this.appHome = appHome;
+        this.workingDir = workingDir;
+    }
+
+    @Override
+    protected String getMainClassName() {
+        return CCDriver.class.getName();
+    }
+
+    @Override
+    @SuppressWarnings("squid:CommentedOutCodeLine")
+    protected void addJvmArgs(List<String> cList) {
+        // CC needs more than default memory
+        cList.add("-Xmx1024m");
+        // cList.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005");
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksNCServiceProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksNCServiceProcess.java
new file mode 100644
index 0000000..67fea0f
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksNCServiceProcess.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.test.server.process;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.hyracks.control.nc.service.NCService;
+
+public class HyracksNCServiceProcess extends HyracksServerProcess {
+
+    public HyracksNCServiceProcess(File configFile, File logFile, File appHome, File workingDir) {
+        this.configFile = configFile;
+        this.logFile = logFile;
+        this.appHome = appHome;
+        this.workingDir = workingDir;
+    }
+
+    @Override
+    protected String getMainClassName() {
+        return NCService.class.getName();
+    }
+
+    @Override
+    protected void addJvmArgs(List<String> cList) {
+        // NCService needs little memory
+        cList.add("-Xmx128m");
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksServerProcess.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksServerProcess.java
new file mode 100644
index 0000000..d157c6f
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksServerProcess.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.test.server.process;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+abstract class HyracksServerProcess {
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    protected Process process;
+    protected File configFile = null;
+    protected File logFile = null;
+    protected File appHome = null;
+    protected File workingDir = null;
+
+    public void start() throws IOException {
+        String[] cmd = buildCommand();
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("Starting command: " + Arrays.toString(cmd));
+        }
+
+        ProcessBuilder pb = new ProcessBuilder(cmd);
+        pb.redirectErrorStream(true);
+        if (logFile != null) {
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("Logging to: " + logFile.getCanonicalPath());
+            }
+            logFile.getParentFile().mkdirs();
+            try (FileWriter writer = new FileWriter(logFile, true)) {
+                writer.write("---------------------\n");
+            }
+            pb.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile));
+        } else {
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("Logfile not set, subprocess will output to stdout");
+            }
+        }
+        pb.directory(workingDir);
+        process = pb.start();
+    }
+
+    public void stop() {
+        process.destroy();
+        try {
+            boolean success = process.waitFor(30, TimeUnit.SECONDS);
+            if (LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Killing unresponsive NC Process");
+            }
+            if (!success) {
+                process.destroyForcibly();
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    public void stop(boolean forcibly) {
+        if (forcibly) {
+            process.destroyForcibly();
+        } else {
+            process.destroy();
+        }
+        try {
+            process.waitFor();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    private String[] buildCommand() {
+        List<String> cList = new ArrayList<String>();
+        cList.add(getJavaCommand());
+        addJvmArgs(cList);
+        cList.add("-Dapp.home=" + appHome.getAbsolutePath());
+        cList.add("-classpath");
+        cList.add(getClasspath());
+        cList.add(getMainClassName());
+        if (configFile != null) {
+            cList.add("-config-file");
+            cList.add(configFile.getAbsolutePath());
+        }
+        addCmdLineArgs(cList);
+        return cList.toArray(new String[cList.size()]);
+    }
+
+    protected void addJvmArgs(List<String> cList) {
+    }
+
+    protected void addCmdLineArgs(List<String> cList) {
+    }
+
+    protected abstract String getMainClassName();
+
+    private final String getClasspath() {
+        return System.getProperty("java.class.path");
+    }
+
+    private final String getJavaCommand() {
+        return System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksVirtualCluster.java b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksVirtualCluster.java
new file mode 100644
index 0000000..fc7bf73
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/java/org/apache/hyracks/test/server/process/HyracksVirtualCluster.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.test.server.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Starts a local hyracks-based cluster (NC and CC child processes).
+ */
+public class HyracksVirtualCluster {
+    private final File appHome;
+    private final File workingDir;
+    private List<HyracksNCServiceProcess> ncProcs = new ArrayList<>(3);
+    private HyracksCCProcess ccProc = null;
+
+    /**
+     * Construct a Hyracks-based cluster.
+     * @param appHome - path to the installation root of the Hyracks application.
+     *                At least bin/hyracksnc (or the equivalent NC script for
+     *                the application) must exist in this directory.
+     * @param workingDir - directory to use as CWD for all child processes. May
+     *                be null, in which case the CWD of the invoking process is used.
+     */
+    public HyracksVirtualCluster(File appHome, File workingDir) {
+        this.appHome = appHome;
+        this.workingDir = workingDir;
+    }
+
+    /**
+     * Creates and starts an NCService.
+     * @param configFile - full path to an ncservice.conf. May be null to accept all defaults.
+     * @throws IOException - if there are errors starting the process.
+     */
+    public HyracksNCServiceProcess addNCService(File configFile, File logFile) throws IOException {
+        HyracksNCServiceProcess proc = new HyracksNCServiceProcess(configFile, logFile, appHome, workingDir);
+        proc.start();
+        ncProcs.add(proc);
+        return proc;
+    }
+
+    /**
+     * Starts the CC, initializing the cluster. Expects that any NCs referenced
+     * in the cluster configuration have already been started with addNCService().
+     * @param ccConfigFile - full path to a cluster conf file. May be null to accept all
+     *                     defaults, although this is seldom useful since there are no NCs.
+     * @throws IOException - if there are errors starting the process.
+     */
+    public HyracksCCProcess start(File ccConfigFile, File logFile) throws IOException {
+        ccProc = new HyracksCCProcess(ccConfigFile, logFile, appHome, workingDir);
+        ccProc.start();
+        return ccProc;
+    }
+
+    /**
+     * Stops all processes in the cluster.
+     * QQQ Someday this should probably do a graceful stop of NCs rather than
+     * killing the NCService.
+     */
+    public void stop() {
+        ccProc.stop();
+        for (HyracksNCServiceProcess proc : ncProcs) {
+            proc.stop();
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-server/src/test/resources/NCServiceIT/cc.conf b/hyracks-fullstack/hyracks/hyracks-server/src/test/resources/NCServiceIT/cc.conf
index 69676f7..419b8ca 100644
--- a/hyracks-fullstack/hyracks/hyracks-server/src/test/resources/NCServiceIT/cc.conf
+++ b/hyracks-fullstack/hyracks/hyracks-server/src/test/resources/NCServiceIT/cc.conf
@@ -18,6 +18,7 @@
 [nc/red]
 address = 127.0.0.1
 #jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006
+jvm.args= -Xmx1234m
 
 [nc/blue]
 address = 127.0.0.1
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomCalculations.java b/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomCalculations.java
index 5b387f4..9525192 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomCalculations.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomCalculations.java
@@ -43,12 +43,9 @@
      * Each cell (i,j) the false positive rate determined by using i buckets per
      * element and j hash functions.
      */
-    static final double[][] probs = new double[][] {
-            { 1.0 }, // dummy row representing 0 buckets per element
+    static final double[][] probs = new double[][] { { 1.0 }, // dummy row representing 0 buckets per element
             { 1.0, 1.0 }, // dummy row representing 1 buckets per element
-            { 1.0, 0.393, 0.400 },
-            { 1.0, 0.283, 0.237, 0.253 },
-            { 1.0, 0.221, 0.155, 0.147, 0.160 },
+            { 1.0, 0.393, 0.400 }, { 1.0, 0.283, 0.237, 0.253 }, { 1.0, 0.221, 0.155, 0.147, 0.160 },
             { 1.0, 0.181, 0.109, 0.092, 0.092, 0.101 }, // 5
             { 1.0, 0.154, 0.0804, 0.0609, 0.0561, 0.0578, 0.0638 },
             { 1.0, 0.133, 0.0618, 0.0423, 0.0359, 0.0347, 0.0364 },
@@ -63,12 +60,12 @@
             { 1.0, 0.0606, 0.0138, 0.005, 0.00239, 0.00139, 0.000935, 0.000702, 0.000574, 0.000505, 0.00047, 0.000459 },
             { 1.0, 0.0571, 0.0123, 0.00423, 0.00193, 0.00107, 0.000692, 0.000499, 0.000394, 0.000335, 0.000302,
                     0.000287, 0.000284 },
-            { 1.0, 0.054, 0.0111, 0.00362, 0.00158, 0.000839, 0.000519, 0.00036, 0.000275, 0.000226, 0.000198,
-                    0.000183, 0.000176 },
+            { 1.0, 0.054, 0.0111, 0.00362, 0.00158, 0.000839, 0.000519, 0.00036, 0.000275, 0.000226, 0.000198, 0.000183,
+                    0.000176 },
             { 1.0, 0.0513, 0.00998, 0.00312, 0.0013, 0.000663, 0.000394, 0.000264, 0.000194, 0.000155, 0.000132,
                     0.000118, 0.000111, 0.000109 },
-            { 1.0, 0.0488, 0.00906, 0.0027, 0.00108, 0.00053, 0.000303, 0.000196, 0.00014, 0.000108, 8.89e-05,
-                    7.77e-05, 7.12e-05, 6.79e-05, 6.71e-05 } // 20
+            { 1.0, 0.0488, 0.00906, 0.0027, 0.00108, 0.00053, 0.000303, 0.000196, 0.00014, 0.000108, 8.89e-05, 7.77e-05,
+                    7.12e-05, 6.79e-05, 6.71e-05 } // 20
     }; // the first column is a dummy column representing K=0.
 
     /**
@@ -148,7 +145,9 @@
             K--;
         }
 
-        return new BloomFilterSpecification(K, bucketsPerElement);
+        // we allocate one more bucket per element to compensate the effect introduced by using blocked bloom filter
+        // a detail analysis can be found at https://dl.acm.org/citation.cfm?id=1594230
+        return new BloomFilterSpecification(K, bucketsPerElement + 1);
     }
 
     /**
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomFilter.java b/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomFilter.java
index 68b96a3..6c16bd1 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomFilter.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-bloomfilter/src/main/java/org/apache/hyracks/storage/am/bloomfilter/impls/BloomFilter.java
@@ -38,6 +38,14 @@
     private static final int NUM_HASHES_USED_OFFSET = NUM_PAGES_OFFSET + 4; // 4
     private static final int NUM_ELEMENTS_OFFSET = NUM_HASHES_USED_OFFSET + 4; // 8
     private static final int NUM_BITS_OFFSET = NUM_ELEMENTS_OFFSET + 8; // 12
+    private static final int VERSION_OFFSET = NUM_BITS_OFFSET + 8; // 20
+
+    // we use cache line size as the block size (64 bytes)
+    private static final int NUM_BITS_PER_BLOCK = 64 * 8;
+
+    private static final int DEFAULT_BLOOM_FILTER_VERSION = 0;
+
+    private static final int BLOCKED_BLOOM_FILTER_VERSION = 1;
 
     private final IBufferCache bufferCache;
     private final FileReference file;
@@ -49,7 +57,13 @@
     private int numHashes;
     private long numElements;
     private long numBits;
+    // keep track of the version of the bloomfilter to be backward compatible
+    private int version;
     private final int numBitsPerPage;
+    private final int numBlocksPerPage;
+    private ICachedPage[] pages;
+    private int pinCount = 0;
+    private boolean pagesPinned = false;
     private static final byte[] ZERO_BUFFER = new byte[131072]; // 128kb
     private static final long SEED = 0L;
 
@@ -58,6 +72,7 @@
         this.file = file;
         this.keyFields = keyFields;
         this.numBitsPerPage = bufferCache.getPageSize() * Byte.SIZE;
+        this.numBlocksPerPage = this.numBitsPerPage / NUM_BITS_PER_BLOCK;
     }
 
     public int getFileId() {
@@ -68,6 +83,30 @@
         return file;
     }
 
+    public synchronized void pinAllPages() throws HyracksDataException {
+        if (pinCount == 0) {
+            // first time pin
+            if (pages == null) {
+                pages = new ICachedPage[numPages];
+            }
+            for (int i = 0; i < numPages; i++) {
+                pages[i] = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, i + 1), false);
+            }
+            pagesPinned = true;
+        }
+        pinCount++;
+    }
+
+    public synchronized void unpinAllPages() throws HyracksDataException {
+        if (pinCount == 1) {
+            for (int i = 0; i < numPages; i++) {
+                bufferCache.unpin(pages[i]);
+            }
+            pagesPinned = false;
+        }
+        pinCount--;
+    }
+
     public int getNumPages() throws HyracksDataException {
         if (!isActivated) {
             activate();
@@ -87,6 +126,51 @@
             return false;
         }
         MurmurHash128Bit.hash3_x64_128(tuple, keyFields, SEED, hashes);
+        if (version == BLOCKED_BLOOM_FILTER_VERSION) {
+            return blockContains(hashes);
+        } else {
+            return legacyContains(hashes);
+        }
+    }
+
+    private boolean blockContains(long[] hashes) throws HyracksDataException {
+        // take first hash to compute block id
+        long hash = Math.abs(hashes[0] % numBits);
+        long blockId = hash / NUM_BITS_PER_BLOCK;
+        int pageId = (int) (blockId / numBlocksPerPage);
+        long groupStartIndex = (blockId % numBlocksPerPage) * NUM_BITS_PER_BLOCK;
+
+        boolean unpinWhenExit = false;
+        ICachedPage page = null;
+        if (pagesPinned) {
+            page = pages[pageId];
+        } else {
+            page = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId + 1), false);
+            unpinWhenExit = true;
+        }
+        ByteBuffer buffer = page.getBuffer();
+
+        try {
+            for (int i = 1; i < numHashes; ++i) {
+                hash = Math.abs((hashes[0] + i * hashes[1]) % NUM_BITS_PER_BLOCK);
+                int byteIndex = (int) ((hash + groupStartIndex) >> 3); // divide 8
+                byte b = buffer.get(byteIndex);
+                int bitIndex = (int) (hash & 0x07); // mod 8
+                if (!((b & (1L << bitIndex)) != 0)) {
+                    return false;
+                }
+            }
+        } finally {
+            if (unpinWhenExit) {
+                bufferCache.unpin(page);
+            }
+        }
+        return true;
+
+    }
+
+    // membership check for legacy bloom filters
+    private boolean legacyContains(long[] hashes) throws HyracksDataException {
         for (int i = 0; i < numHashes; ++i) {
             long hash = Math.abs((hashes[0] + i * hashes[1]) % numBits);
 
@@ -138,6 +222,7 @@
             numHashes = 0;
             numElements = 0;
             numBits = 0;
+            version = DEFAULT_BLOOM_FILTER_VERSION;
             return;
         }
         ICachedPage metaPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, METADATA_PAGE_ID), false);
@@ -147,6 +232,7 @@
             numHashes = metaPage.getBuffer().getInt(NUM_HASHES_USED_OFFSET);
             numElements = metaPage.getBuffer().getLong(NUM_ELEMENTS_OFFSET);
             numBits = metaPage.getBuffer().getLong(NUM_BITS_OFFSET);
+            version = metaPage.getBuffer().getInt(VERSION_OFFSET);
         } finally {
             metaPage.releaseReadLatch();
             bufferCache.unpin(metaPage);
@@ -157,6 +243,9 @@
         if (!isActivated) {
             throw HyracksDataException.create(ErrorCode.CANNOT_DEACTIVATE_INACTIVE_BLOOM_FILTER);
         }
+        if (pagesPinned) {
+            throw HyracksDataException.create(ErrorCode.CANNOT_DEACTIVATE_PINNED_BLOOM_FILTER);
+        }
         bufferCache.closeFile(fileId);
         isActivated = false;
     }
@@ -188,27 +277,30 @@
 
     public class BloomFilterBuilder implements IIndexBulkLoader {
         private final long[] hashes = BloomFilter.createHashArray();
-        private final long numElements;
+        private final long estimatedNumElements;
         private final int numHashes;
         private final long numBits;
         private final int numPages;
+        private long actualNumElements;
         private final IFIFOPageQueue queue;
         private final ICachedPage[] pages;
         private ICachedPage metaDataPage = null;
 
-        public BloomFilterBuilder(long numElements, int numHashes, int numBitsPerElement) throws HyracksDataException {
+        public BloomFilterBuilder(long estimatedNumElemenets, int numHashes, int numBitsPerElement)
+                throws HyracksDataException {
             if (!isActivated) {
                 throw HyracksDataException.create(ErrorCode.CANNOT_CREATE_BLOOM_FILTER_BUILDER_FOR_INACTIVE_FILTER);
             }
             queue = bufferCache.createFIFOQueue();
-            this.numElements = numElements;
+            this.estimatedNumElements = estimatedNumElemenets;
             this.numHashes = numHashes;
-            numBits = this.numElements * numBitsPerElement;
+            numBits = this.estimatedNumElements * numBitsPerElement;
             long tmp = (long) Math.ceil(numBits / (double) numBitsPerPage);
             if (tmp > Integer.MAX_VALUE) {
                 throw HyracksDataException.create(ErrorCode.CANNOT_CREATE_BLOOM_FILTER_WITH_NUMBER_OF_PAGES, tmp);
             }
             numPages = (int) tmp;
+            actualNumElements = 0;
             pages = new ICachedPage[numPages];
             int currentPageId = 1;
             while (currentPageId <= numPages) {
@@ -238,8 +330,9 @@
             }
             metaDataPage.getBuffer().putInt(NUM_PAGES_OFFSET, numPages);
             metaDataPage.getBuffer().putInt(NUM_HASHES_USED_OFFSET, numHashes);
-            metaDataPage.getBuffer().putLong(NUM_ELEMENTS_OFFSET, numElements);
+            metaDataPage.getBuffer().putLong(NUM_ELEMENTS_OFFSET, actualNumElements);
             metaDataPage.getBuffer().putLong(NUM_BITS_OFFSET, numBits);
+            metaDataPage.getBuffer().putInt(VERSION_OFFSET, BLOCKED_BLOOM_FILTER_VERSION);
         }
 
         @Override
@@ -247,16 +340,23 @@
             if (numPages == 0) {
                 throw HyracksDataException.create(ErrorCode.CANNOT_ADD_TUPLES_TO_DUMMY_BLOOM_FILTER);
             }
+            actualNumElements++;
             MurmurHash128Bit.hash3_x64_128(tuple, keyFields, SEED, hashes);
-            for (int i = 0; i < numHashes; ++i) {
-                long hash = Math.abs((hashes[0] + i * hashes[1]) % numBits);
-                ICachedPage page = pages[(int) (hash / numBitsPerPage)];
-                ByteBuffer buffer = page.getBuffer();
-                int byteIndex = (int) (hash % numBitsPerPage) >> 3; // divide by 8
-                byte b = buffer.get(byteIndex);
-                int bitIndex = (int) (hash % numBitsPerPage) & 0x07; // mod 8
-                b = (byte) (b | (1 << bitIndex));
 
+            long hash = Math.abs(hashes[0] % numBits);
+            long groupId = hash / NUM_BITS_PER_BLOCK;
+            int pageId = (int) (groupId / numBlocksPerPage);
+            long groupStartIndex = (groupId % numBlocksPerPage) * NUM_BITS_PER_BLOCK;
+
+            ICachedPage page = pages[pageId];
+            ByteBuffer buffer = page.getBuffer();
+
+            for (int i = 1; i < numHashes; ++i) {
+                hash = Math.abs((hashes[0] + i * hashes[1]) % NUM_BITS_PER_BLOCK);
+                int byteIndex = (int) ((hash + groupStartIndex) >> 3); // divide 8
+                byte b = buffer.get(byteIndex);
+                int bitIndex = (int) (hash & 0x07); // mod 8
+                b = (byte) (b | (1 << bitIndex));
                 buffer.put(byteIndex, b);
             }
         }
@@ -271,8 +371,9 @@
             bufferCache.finishQueue();
             BloomFilter.this.numBits = numBits;
             BloomFilter.this.numHashes = numHashes;
-            BloomFilter.this.numElements = numElements;
+            BloomFilter.this.numElements = actualNumElements;
             BloomFilter.this.numPages = numPages;
+            BloomFilter.this.version = BLOCKED_BLOOM_FILTER_VERSION;
         }
 
         @Override
@@ -286,6 +387,5 @@
                 bufferCache.returnPage(metaDataPage, false);
             }
         }
-
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/compressors/FieldPrefixCompressor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/compressors/FieldPrefixCompressor.java
index 499a01a..86497a8 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/compressors/FieldPrefixCompressor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/compressors/FieldPrefixCompressor.java
@@ -228,8 +228,8 @@
                             } else {
                                 // segment has enough tuples: compress segment, extract prefix,
                                 // write prefix tuple to buffer, and set prefix slot
-                                newPrefixSlots[newPrefixSlots.length - 1 - prefixTupleIndex] = slotManager
-                                        .encodeSlotFields(fieldCountToCompress, prefixFreeSpace);
+                                newPrefixSlots[newPrefixSlots.length - 1 - prefixTupleIndex] =
+                                        slotManager.encodeSlotFields(fieldCountToCompress, prefixFreeSpace);
                                 prefixFreeSpace += tupleWriter.writeTupleFields(prevTuple, 0, fieldCountToCompress,
                                         byteBuffer.array(), prefixFreeSpace);
 
@@ -237,8 +237,8 @@
                                 for (int j = 0; j < tuplesInSegment; j++) {
                                     int currTupleIndex = segmentStart + j;
                                     tupleToWrite.resetByTupleIndex(frame, currTupleIndex);
-                                    newTupleSlots[tupleCount - 1 - currTupleIndex] = slotManager.encodeSlotFields(
-                                            prefixTupleIndex, tupleFreeSpace);
+                                    newTupleSlots[tupleCount - 1 - currTupleIndex] =
+                                            slotManager.encodeSlotFields(prefixTupleIndex, tupleFreeSpace);
                                     tupleFreeSpace += tupleWriter.writeTupleFields(tupleToWrite, fieldCountToCompress,
                                             fieldCount - fieldCountToCompress, byteBuffer.array(), tupleFreeSpace);
                                 }
@@ -257,16 +257,16 @@
                 } else {
                     // just write the tuple uncompressed
                     tupleToWrite.resetByTupleIndex(frame, tupleIndex);
-                    newTupleSlots[tupleCount - 1 - tupleIndex] = slotManager.encodeSlotFields(
-                            FieldPrefixSlotManager.TUPLE_UNCOMPRESSED, tupleFreeSpace);
+                    newTupleSlots[tupleCount - 1 - tupleIndex] =
+                            slotManager.encodeSlotFields(FieldPrefixSlotManager.TUPLE_UNCOMPRESSED, tupleFreeSpace);
                     tupleFreeSpace += tupleWriter.writeTuple(tupleToWrite, byteBuffer, tupleFreeSpace);
                     uncompressedTupleCount++;
                 }
             } else {
                 // just write the tuple uncompressed
                 tupleToWrite.resetByTupleIndex(frame, tupleIndex);
-                newTupleSlots[tupleCount - 1 - tupleIndex] = slotManager.encodeSlotFields(
-                        FieldPrefixSlotManager.TUPLE_UNCOMPRESSED, tupleFreeSpace);
+                newTupleSlots[tupleCount - 1 - tupleIndex] =
+                        slotManager.encodeSlotFields(FieldPrefixSlotManager.TUPLE_UNCOMPRESSED, tupleFreeSpace);
                 tupleFreeSpace += tupleWriter.writeTuple(tupleToWrite, byteBuffer, tupleFreeSpace);
                 uncompressedTupleCount++;
             }
@@ -282,15 +282,16 @@
         // this can happen to to the greedy solution of the knapsack-like problem
         // therefore, we check if the new space exceeds the page size to avoid the only danger of
         // an increasing space
-        int totalSpace = tupleFreeSpace + newTupleSlots.length * slotManager.getSlotSize() + newPrefixSlots.length
-                * slotManager.getSlotSize();
+        int totalSpace = tupleFreeSpace + newTupleSlots.length * slotManager.getSlotSize()
+                + newPrefixSlots.length * slotManager.getSlotSize();
         if (totalSpace > buf.capacity())
             // just leave the page as is
             return false;
 
         // copy new tuple and new slots into original page
         int freeSpaceAfterInit = frame.getOrigFreeSpaceOff();
-        System.arraycopy(buffer, freeSpaceAfterInit, pageArray, freeSpaceAfterInit, tupleFreeSpace - freeSpaceAfterInit);
+        System.arraycopy(buffer, freeSpaceAfterInit, pageArray, freeSpaceAfterInit,
+                tupleFreeSpace - freeSpaceAfterInit);
 
         // copy prefix slots
         int slotOffRunner = buf.capacity() - slotManager.getSlotSize();
@@ -363,9 +364,8 @@
                     kp.pmi[j].matches++;
 
                     int prefixBytes = tupleWriter.bytesRequired(tuple, 0, prefixFieldsMatch);
-                    int spaceBenefit = tupleWriter.bytesRequired(tuple)
-                            - tupleWriter.bytesRequired(tuple, prefixFieldsMatch, tuple.getFieldCount()
-                                    - prefixFieldsMatch);
+                    int spaceBenefit = tupleWriter.bytesRequired(tuple) - tupleWriter.bytesRequired(tuple,
+                            prefixFieldsMatch, tuple.getFieldCount() - prefixFieldsMatch);
 
                     if (kp.pmi[j].matches == occurrenceThreshold) {
                         // if we compress this prefix, we pay the cost of storing it once, plus
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeResource.java
index b9ad1b1..4cf145b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/dataflow/BTreeResource.java
@@ -35,7 +35,7 @@
 public class BTreeResource implements IResource {
 
     private static final long serialVersionUID = 1L;
-    private final String path;
+    private String path;
     private final IStorageManager storageManager;
     private final ITypeTraits[] typeTraits;
     private final IBinaryComparatorFactory[] comparatorFactories;
@@ -63,4 +63,9 @@
     public String getPath() {
         return path;
     }
+
+    @Override
+    public void setPath(String path) {
+        this.path = path;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
index 9624158..eb87c57 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/frames/BTreeFieldPrefixNSMLeafFrame.java
@@ -790,4 +790,14 @@
         throw new IllegalStateException("nyi");
     }
 
+    @Override
+    public ITupleReference getLeftmostTuple() throws HyracksDataException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public ITupleReference getRightmostTuple() throws HyracksDataException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTree.java
index 1fbcbb0..6e2d694 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTree.java
@@ -49,10 +49,11 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexTupleReference;
 import org.apache.hyracks.storage.am.common.frames.FrameOpSpaceStatus;
 import org.apache.hyracks.storage.am.common.impls.AbstractTreeIndex;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NodeFrontier;
 import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
@@ -118,7 +119,7 @@
         // Stack validation protocol:
         //      * parent pushes the validation information onto the stack before validation
         //      * child pops the validation information off of the stack after validating
-        BTreeAccessor accessor = createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        BTreeAccessor accessor = createAccessor(NoOpIndexAccessParameters.INSTANCE);
         PageValidationInfo pvi = accessor.ctx.createPageValidationInfo(null);
         accessor.ctx.getValidationInfos().addFirst(pvi);
         if (isActive) {
@@ -717,6 +718,7 @@
                 }
                 if (restartOp) {
                     // Wait for the SMO to persistFrontiers before restarting.
+                    // We didn't release the pin on the page!!
                     treeLatch.readLock().lock();
                     treeLatch.readLock().unlock();
                     ctx.getPageLsns().removeLast();
@@ -818,9 +820,8 @@
     }
 
     @Override
-    public BTreeAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        return new BTreeAccessor(this, modificationCallback, searchCallback);
+    public BTreeAccessor createAccessor(IIndexAccessParameters iap) {
+        return new BTreeAccessor(this, iap.getModificationCallback(), iap.getSearchOperationCallback());
     }
 
     public BTreeAccessor createAccessor(IModificationOperationCallback modificationCallback,
@@ -838,8 +839,8 @@
      * for now, we are reusing it while it is an inner class !!!!
      */
     public class BTreeAccessor implements ITreeIndexAccessor {
-        private BTree btree;
-        private BTreeOpContext ctx;
+        protected BTree btree;
+        protected BTreeOpContext ctx;
 
         public BTreeAccessor(BTree btree, IModificationOperationCallback modificationCalback,
                 ISearchOperationCallback searchCallback) {
@@ -896,6 +897,10 @@
             return new BTreeRangeSearchCursor(leafFrame, exclusive);
         }
 
+        public BTreeRangeSearchCursor createPointCursor(boolean exclusive) {
+            return createSearchCursor(exclusive);
+        }
+
         @Override
         public void search(IIndexCursor cursor, ISearchPredicate searchPred) throws HyracksDataException {
             ctx.setOperation(IndexOperation.SEARCH);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
index d7084bb..10f79a2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCountingSearchCursor.java
@@ -207,7 +207,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (page != null) {
             releasePage();
         }
@@ -220,9 +220,9 @@
     }
 
     @Override
-    public void reset() {
+    public void close() {
         try {
-            close();
+            destroy();
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -234,16 +234,6 @@
     }
 
     @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
-    @Override
     public void setBufferCache(IBufferCache bufferCache) {
         this.bufferCache = bufferCache;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCursorInitialState.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCursorInitialState.java
index 065cfe3..1ae7e33 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCursorInitialState.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeCursorInitialState.java
@@ -33,8 +33,7 @@
     private MultiComparator originalKeyCmp;
     private final IIndexAccessor accessor;
 
-    public BTreeCursorInitialState(ICachedPage page, ISearchOperationCallback searchCallback, IIndexAccessor accessor) {
-        this.page = page;
+    public BTreeCursorInitialState(ISearchOperationCallback searchCallback, IIndexAccessor accessor) {
         this.searchCallback = searchCallback;
         this.accessor = accessor;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeOpContext.java
index cb82936..a46ae9a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeOpContext.java
@@ -142,7 +142,7 @@
     public void setOperation(IndexOperation newOp) {
         if (newOp == IndexOperation.SEARCH || newOp == IndexOperation.DISKORDERSCAN) {
             if (cursorInitialState == null) {
-                cursorInitialState = new BTreeCursorInitialState(null, searchCallback, accessor);
+                cursorInitialState = new BTreeCursorInitialState(searchCallback, accessor);
             }
         } else {
             // Insert, delete, update or upsert operation.
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
index 13cb57a..e903180 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/BTreeRangeSearchCursor.java
@@ -40,37 +40,37 @@
 
 public class BTreeRangeSearchCursor implements ITreeIndexCursor {
 
-    private final IBTreeLeafFrame frame;
-    private final ITreeIndexTupleReference frameTuple;
-    private final boolean exclusiveLatchNodes;
-    private boolean isPageDirty;
+    protected final IBTreeLeafFrame frame;
+    protected final ITreeIndexTupleReference frameTuple;
+    protected final boolean exclusiveLatchNodes;
+    protected boolean isPageDirty;
 
-    private IBufferCache bufferCache = null;
-    private int fileId = -1;
+    protected IBufferCache bufferCache = null;
+    protected int fileId = -1;
 
-    private ICachedPage page = null;
-    private int pageId = -1; // This is used by the LSMRTree flush operation
+    protected ICachedPage page = null;
+    protected int pageId = -1; // This is used by the LSMRTree flush operation
 
-    private int tupleIndex = 0;
-    private int stopTupleIndex;
+    protected int tupleIndex = 0;
+    protected int stopTupleIndex;
 
-    private final RangePredicate reusablePredicate;
-    private final ArrayTupleReference reconciliationTuple;
-    private IIndexAccessor accessor;
-    private ISearchOperationCallback searchCb;
-    private MultiComparator originalKeyCmp;
-    private ArrayTupleBuilder tupleBuilder;
+    protected final RangePredicate reusablePredicate;
+    protected final ArrayTupleReference reconciliationTuple;
+    protected IIndexAccessor accessor;
+    protected ISearchOperationCallback searchCb;
+    protected MultiComparator originalKeyCmp;
+    protected ArrayTupleBuilder tupleBuilder;
 
-    private FindTupleMode lowKeyFtm;
-    private FindTupleMode highKeyFtm;
-    private FindTupleNoExactMatchPolicy lowKeyFtp;
-    private FindTupleNoExactMatchPolicy highKeyFtp;
+    protected FindTupleMode lowKeyFtm;
+    protected FindTupleMode highKeyFtm;
+    protected FindTupleNoExactMatchPolicy lowKeyFtp;
+    protected FindTupleNoExactMatchPolicy highKeyFtp;
 
-    private RangePredicate pred;
-    private MultiComparator lowKeyCmp;
-    private MultiComparator highKeyCmp;
+    protected RangePredicate pred;
+    protected MultiComparator lowKeyCmp;
+    protected MultiComparator highKeyCmp;
     protected ITupleReference lowKey;
-    private ITupleReference highKey;
+    protected ITupleReference highKey;
 
     public BTreeRangeSearchCursor(IBTreeLeafFrame frame, boolean exclusiveLatchNodes) {
         this.frame = frame;
@@ -81,14 +81,9 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (page != null) {
-            if (exclusiveLatchNodes) {
-                page.releaseWriteLatch(isPageDirty);
-            } else {
-                page.releaseReadLatch();
-            }
-            bufferCache.unpin(page);
+            releasePage();
         }
 
         tupleIndex = 0;
@@ -102,16 +97,6 @@
         return frameTuple;
     }
 
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
     public int getTupleOffset() {
         return frame.getTupleOffset(tupleIndex - 1);
     }
@@ -120,18 +105,10 @@
         return pageId;
     }
 
-    private void fetchNextLeafPage(int nextLeafPage) throws HyracksDataException {
+    protected void fetchNextLeafPage(int nextLeafPage) throws HyracksDataException {
         do {
-            ICachedPage nextLeaf = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, nextLeafPage), false);
-            if (exclusiveLatchNodes) {
-                nextLeaf.acquireWriteLatch();
-                page.releaseWriteLatch(isPageDirty);
-            } else {
-                nextLeaf.acquireReadLatch();
-                page.releaseReadLatch();
-            }
-            bufferCache.unpin(page);
-
+            ICachedPage nextLeaf = acquirePage(nextLeafPage);
+            releasePage();
             page = nextLeaf;
             isPageDirty = false;
             frame.setPage(page);
@@ -173,13 +150,7 @@
                 TupleUtils.copyTuple(tupleBuilder, frameTuple, originalKeyCmp.getKeyFieldCount());
                 reconciliationTuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
 
-                // unlatch/unpin
-                if (exclusiveLatchNodes) {
-                    page.releaseWriteLatch(isPageDirty);
-                } else {
-                    page.releaseReadLatch();
-                }
-                bufferCache.unpin(page);
+                releasePage();
                 page = null;
                 isPageDirty = false;
 
@@ -210,7 +181,7 @@
         tupleIndex++;
     }
 
-    private int getLowKeyIndex() throws HyracksDataException {
+    protected int getLowKeyIndex() throws HyracksDataException {
         if (lowKey == null) {
             return 0;
         }
@@ -227,7 +198,7 @@
         return index;
     }
 
-    private int getHighKeyIndex() throws HyracksDataException {
+    protected int getHighKeyIndex() throws HyracksDataException {
         if (highKey == null) {
             return frame.getTupleCount() - 1;
         }
@@ -248,12 +219,7 @@
     public void open(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
         // in case open is called multiple times without closing
         if (page != null) {
-            if (exclusiveLatchNodes) {
-                page.releaseWriteLatch(isPageDirty);
-            } else {
-                page.releaseReadLatch();
-            }
-            bufferCache.unpin(page);
+            resetBeforeOpen();
         }
         accessor = ((BTreeCursorInitialState) initialState).getAccessor();
         searchCb = initialState.getSearchOperationCallback();
@@ -291,9 +257,13 @@
         stopTupleIndex = getHighKeyIndex();
     }
 
+    protected void resetBeforeOpen() throws HyracksDataException {
+        releasePage();
+    }
+
     @Override
-    public void reset() throws HyracksDataException {
-        close();
+    public void close() throws HyracksDataException {
+        destroy();
     }
 
     @Override
@@ -310,4 +280,23 @@
     public boolean isExclusiveLatchNodes() {
         return exclusiveLatchNodes;
     }
+
+    protected void releasePage() throws HyracksDataException {
+        if (exclusiveLatchNodes) {
+            page.releaseWriteLatch(isPageDirty);
+        } else {
+            page.releaseReadLatch();
+        }
+        bufferCache.unpin(page);
+    }
+
+    protected ICachedPage acquirePage(int pageId) throws HyracksDataException {
+        ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId), false);
+        if (exclusiveLatchNodes) {
+            nextPage.acquireWriteLatch();
+        } else {
+            nextPage.acquireReadLatch();
+        }
+        return nextPage;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTree.java
new file mode 100644
index 0000000..32fa9df
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTree.java
@@ -0,0 +1,289 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.btree.impls;
+
+import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.storage.am.btree.api.IBTreeFrame;
+import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
+import org.apache.hyracks.storage.am.common.api.IPageManager;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexFrame;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
+import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
+import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
+import org.apache.hyracks.storage.common.IIndexCursor;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.storage.common.buffercache.ICachedPage;
+import org.apache.hyracks.storage.common.file.BufferedFileHandle;
+
+public class DiskBTree extends BTree {
+
+    public DiskBTree(IBufferCache bufferCache, IPageManager freePageManager,
+            ITreeIndexFrameFactory interiorFrameFactory, ITreeIndexFrameFactory leafFrameFactory,
+            IBinaryComparatorFactory[] cmpFactories, int fieldCount, FileReference file) {
+        super(bufferCache, freePageManager, interiorFrameFactory, leafFrameFactory, cmpFactories, fieldCount, file);
+    }
+
+    private void diskOrderScan(ITreeIndexCursor icursor, BTreeOpContext ctx) throws HyracksDataException {
+        TreeIndexDiskOrderScanCursor cursor = (TreeIndexDiskOrderScanCursor) icursor;
+        ctx.reset();
+        RangePredicate diskOrderScanPred = new RangePredicate(null, null, true, true, ctx.getCmp(), ctx.getCmp());
+        int maxPageId = freePageManager.getMaxPageId(ctx.getMetaFrame());
+        int currentPageId = bulkloadLeafStart;
+        ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), currentPageId), false);
+        try {
+            cursor.setBufferCache(bufferCache);
+            cursor.setFileId(getFileId());
+            cursor.setCurrentPageId(currentPageId);
+            cursor.setMaxPageId(maxPageId);
+            ctx.getCursorInitialState().setPage(page);
+            ctx.getCursorInitialState().setSearchOperationCallback(ctx.getSearchCallback());
+            ctx.getCursorInitialState().setOriginialKeyComparator(ctx.getCmp());
+            cursor.open(ctx.getCursorInitialState(), diskOrderScanPred);
+        } catch (Exception e) {
+            bufferCache.unpin(page);
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    private void search(ITreeIndexCursor cursor, ISearchPredicate searchPred, BTreeOpContext ctx)
+            throws HyracksDataException {
+        ctx.reset();
+        ctx.setPred((RangePredicate) searchPred);
+        ctx.setCursor(cursor);
+        // simple index scan
+        if (ctx.getPred().getLowKeyComparator() == null) {
+            ctx.getPred().setLowKeyComparator(ctx.getCmp());
+        }
+        if (ctx.getPred().getHighKeyComparator() == null) {
+            ctx.getPred().setHighKeyComparator(ctx.getCmp());
+        }
+        cursor.setBufferCache(bufferCache);
+        cursor.setFileId(getFileId());
+
+        DiskBTreeRangeSearchCursor diskCursor = (DiskBTreeRangeSearchCursor) cursor;
+
+        if (diskCursor.numSearchPages() == 0) {
+            // we have to search from root to leaf
+            ICachedPage rootNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), rootPage), false);
+            diskCursor.addSearchPage(rootPage);
+            searchDown(rootNode, rootPage, ctx, diskCursor);
+        } else {
+            // we first check whether the leaf page matches because page may be shifted during cursor.hasNext
+            if (ctx.getLeafFrame().getPage() != diskCursor.getPage()) {
+                ctx.getLeafFrame().setPage(diskCursor.getPage());
+                ctx.getCursorInitialState().setPage(diskCursor.getPage());
+                ctx.getCursorInitialState().setPageId(diskCursor.getPageId());
+            }
+
+            if (fitInPage(ctx.getPred().getLowKey(), ctx.getPred().getLowKeyComparator(), ctx.getLeafFrame())) {
+                // the input still falls into the previous search leaf
+                diskCursor.open(ctx.getCursorInitialState(), searchPred);
+            } else {
+                // unpin the previous leaf page
+                bufferCache.unpin(ctx.getLeafFrame().getPage());
+                diskCursor.removeLastSearchPage();
+
+                ICachedPage page = searchUp(ctx, diskCursor);
+                int pageId = diskCursor.getLastSearchPage();
+
+                searchDown(page, pageId, ctx, diskCursor);
+            }
+        }
+    }
+
+    private ICachedPage searchUp(BTreeOpContext ctx, DiskBTreeRangeSearchCursor cursor) throws HyracksDataException {
+        int index = cursor.numSearchPages() - 1;
+        // no need to check root page
+        for (; index >= 0; index--) {
+            int pageId = cursor.getLastSearchPage();
+            ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), pageId), false);
+            ctx.getInteriorFrame().setPage(page);
+            if (index == 0 || fitInPage(ctx.getPred().getLowKey(), ctx.getPred().getLowKeyComparator(),
+                    ctx.getInteriorFrame())) {
+                // we've found the right page
+                return page;
+            } else {
+                // unpin the current page
+                bufferCache.unpin(page);
+                cursor.removeLastSearchPage();
+            }
+        }
+
+        // if no page is available (which is the case for single-level BTree)
+        // we simply return the root page
+        ICachedPage page = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), rootPage), false);
+        cursor.addSearchPage(rootPage);
+        return page;
+    }
+
+    private boolean fitInPage(ITupleReference key, MultiComparator comparator, IBTreeFrame frame)
+            throws HyracksDataException {
+        ITupleReference rightmostTuple = frame.getRightmostTuple();
+        int cmp = comparator.compare(key, rightmostTuple);
+        if (cmp > 0) {
+            return false;
+        }
+        ITupleReference leftmostTuple = frame.getLeftmostTuple();
+        return comparator.compare(key, leftmostTuple) >= 0;
+    }
+
+    private void searchDown(ICachedPage page, int pageId, BTreeOpContext ctx, DiskBTreeRangeSearchCursor cursor)
+            throws HyracksDataException {
+        ICachedPage currentPage = page;
+        ctx.getInteriorFrame().setPage(currentPage);
+
+        try {
+            int childPageId = pageId;
+            while (!ctx.getInteriorFrame().isLeaf()) {
+                // walk down the tree until we find the leaf
+                childPageId = ctx.getInteriorFrame().getChildPageId(ctx.getPred());
+
+                // save the child page tuple index
+                cursor.addSearchPage(childPageId);
+                bufferCache.unpin(currentPage);
+                currentPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(getFileId(), childPageId), false);
+                ctx.getInteriorFrame().setPage(currentPage);
+            }
+
+            ctx.getCursorInitialState().setSearchOperationCallback(ctx.getSearchCallback());
+            ctx.getCursorInitialState().setOriginialKeyComparator(ctx.getCmp());
+            ctx.getCursorInitialState().setPage(currentPage);
+            ctx.getCursorInitialState().setPageId(childPageId);
+            ctx.getLeafFrame().setPage(currentPage);
+            cursor.open(ctx.getCursorInitialState(), ctx.getPred());
+        } catch (HyracksDataException e) {
+            if (!ctx.isExceptionHandled() && currentPage != null) {
+                bufferCache.unpin(currentPage);
+                ctx.setExceptionHandled(true);
+            }
+            throw e;
+        } catch (Exception e) {
+            if (currentPage != null) {
+                bufferCache.unpin(currentPage);
+            }
+            HyracksDataException wrappedException = HyracksDataException.create(e);
+            ctx.setExceptionHandled(true);
+            throw wrappedException;
+        }
+    }
+
+    @Override
+    public BTreeAccessor createAccessor(IIndexAccessParameters iap) {
+        return new DiskBTreeAccessor(this, iap.getModificationCallback(), iap.getSearchOperationCallback());
+    }
+
+    @Override
+    public DiskBTreeAccessor createAccessor(IModificationOperationCallback modificationCallback,
+            ISearchOperationCallback searchCallback, int[] logTupleFields) {
+        return new DiskBTreeAccessor(this, modificationCallback, searchCallback, logTupleFields);
+    }
+
+    public class DiskBTreeAccessor extends BTreeAccessor {
+
+        public DiskBTreeAccessor(DiskBTree btree, IModificationOperationCallback modificationCalback,
+                ISearchOperationCallback searchCallback) {
+            super(btree, modificationCalback, searchCallback);
+        }
+
+        public DiskBTreeAccessor(DiskBTree btree, IModificationOperationCallback modificationCalback,
+                ISearchOperationCallback searchCallback, int[] logTupleFields) {
+            super(btree, modificationCalback, searchCallback, logTupleFields);
+        }
+
+        @Override
+        public void insert(ITupleReference tuple) throws HyracksDataException {
+            throw new UnsupportedOperationException("Insert is not supported by DiskBTree. ");
+        }
+
+        @Override
+        public void update(ITupleReference tuple) throws HyracksDataException {
+            throw new UnsupportedOperationException("Update is not supported by DiskBTree. ");
+        }
+
+        @Override
+        public void delete(ITupleReference tuple) throws HyracksDataException {
+            throw new UnsupportedOperationException("Delete is not supported by DiskBTree. ");
+        }
+
+        @Override
+        public void upsert(ITupleReference tuple) throws HyracksDataException {
+            throw new UnsupportedOperationException("Upsert is not supported by DiskBTree. ");
+        }
+
+        @Override
+        public DiskBTreeRangeSearchCursor createSearchCursor(boolean exclusive) {
+            IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) btree.getLeafFrameFactory().createFrame();
+            return new DiskBTreeRangeSearchCursor(leafFrame, exclusive);
+        }
+
+        @Override
+        public BTreeRangeSearchCursor createPointCursor(boolean exclusive) {
+            IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) btree.getLeafFrameFactory().createFrame();
+            return new DiskBTreePointSearchCursor(leafFrame, exclusive);
+        }
+
+        @Override
+        public void search(IIndexCursor cursor, ISearchPredicate searchPred) throws HyracksDataException {
+            ctx.setOperation(IndexOperation.SEARCH);
+            ((DiskBTree) btree).search((ITreeIndexCursor) cursor, searchPred, ctx);
+        }
+
+        @Override
+        public ITreeIndexCursor createDiskOrderScanCursor() {
+            IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) btree.getLeafFrameFactory().createFrame();
+            return new DiskBTreeDiskScanCursor(leafFrame);
+        }
+
+        @Override
+        public void diskOrderScan(ITreeIndexCursor cursor) throws HyracksDataException {
+            ctx.setOperation(IndexOperation.DISKORDERSCAN);
+            ((DiskBTree) btree).diskOrderScan(cursor, ctx);
+        }
+    }
+
+    private class DiskBTreeDiskScanCursor extends TreeIndexDiskOrderScanCursor {
+
+        public DiskBTreeDiskScanCursor(ITreeIndexFrame frame) {
+            super(frame);
+        }
+
+        @Override
+        protected void releasePage() throws HyracksDataException {
+            bufferCache.unpin(page);
+        }
+
+        @Override
+        protected ICachedPage acquireNextPage() throws HyracksDataException {
+            ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, currentPageId), false);
+            return nextPage;
+        }
+
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreePointSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreePointSearchCursor.java
new file mode 100644
index 0000000..5839d0e
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreePointSearchCursor.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.btree.impls;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
+import org.apache.hyracks.storage.am.common.ophelpers.FindTupleMode;
+import org.apache.hyracks.storage.am.common.ophelpers.FindTupleNoExactMatchPolicy;
+import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.ISearchPredicate;
+
+public class DiskBTreePointSearchCursor extends DiskBTreeRangeSearchCursor {
+
+    private boolean nextHasBeenCalled;
+
+    public DiskBTreePointSearchCursor(IBTreeLeafFrame frame, boolean exclusiveLatchNodes) {
+        super(frame, exclusiveLatchNodes);
+    }
+
+    @Override
+    public boolean hasNext() throws HyracksDataException {
+        return tupleIndex >= 0 && !nextHasBeenCalled;
+    }
+
+    @Override
+    public void next() throws HyracksDataException {
+        nextHasBeenCalled = true;
+    }
+
+    @Override
+    public void open(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
+        // in case open is called multiple times without closing
+        if (page != null) {
+            resetBeforeOpen();
+        }
+        accessor = ((BTreeCursorInitialState) initialState).getAccessor();
+        searchCb = initialState.getSearchOperationCallback();
+        originalKeyCmp = initialState.getOriginalKeyComparator();
+        pageId = ((BTreeCursorInitialState) initialState).getPageId();
+        page = initialState.getPage();
+        isPageDirty = false;
+        frame.setPage(page);
+
+        pred = (RangePredicate) searchPred;
+        lowKeyCmp = pred.getLowKeyComparator();
+        lowKey = pred.getLowKey();
+
+        reusablePredicate.setLowKeyComparator(originalKeyCmp);
+
+        lowKeyFtm = FindTupleMode.EXACT;
+        lowKeyFtp = FindTupleNoExactMatchPolicy.NONE;
+
+        nextHasBeenCalled = false;
+
+        // only get the low key position
+        tupleIndex = getLowKeyIndex();
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreeRangeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreeRangeSearchCursor.java
new file mode 100644
index 0000000..7d4ee0d
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/DiskBTreeRangeSearchCursor.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.btree.impls;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
+import org.apache.hyracks.storage.common.buffercache.ICachedPage;
+import org.apache.hyracks.storage.common.file.BufferedFileHandle;
+
+public class DiskBTreeRangeSearchCursor extends BTreeRangeSearchCursor {
+
+    // keep track of the pages (root -> leaf) we've searched
+    protected final List<Integer> searchPages = new ArrayList<>(5);
+
+    public DiskBTreeRangeSearchCursor(IBTreeLeafFrame frame, boolean exclusiveLatchNodes) {
+        super(frame, exclusiveLatchNodes);
+    }
+
+    @Override
+    public boolean hasNext() throws HyracksDataException {
+        int nextLeafPage;
+        if (tupleIndex >= frame.getTupleCount()) {
+            nextLeafPage = frame.getNextLeaf();
+            if (nextLeafPage >= 0) {
+                fetchNextLeafPage(nextLeafPage);
+                tupleIndex = 0;
+                // update page ids and positions
+                searchPages.set(searchPages.size() - 1, nextLeafPage);
+                stopTupleIndex = getHighKeyIndex();
+                if (stopTupleIndex < 0) {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        }
+        if (tupleIndex > stopTupleIndex) {
+            return false;
+        }
+
+        frameTuple.resetByTupleIndex(frame, tupleIndex);
+        return true;
+    }
+
+    @Override
+    protected void resetBeforeOpen() throws HyracksDataException {
+        // do nothing
+        // we allow a disk btree range cursor be stateful, that is, the next search can be based on the previous search
+    }
+
+    public int numSearchPages() {
+        return searchPages.size();
+    }
+
+    public void addSearchPage(int page) {
+        searchPages.add(page);
+    }
+
+    public int getLastSearchPage() {
+        return searchPages.get(searchPages.size() - 1);
+    }
+
+    public int removeLastSearchPage() {
+        return searchPages.remove(searchPages.size() - 1);
+    }
+
+    public ICachedPage getPage() {
+        return page;
+    }
+
+    @Override
+    protected void releasePage() throws HyracksDataException {
+        bufferCache.unpin(page);
+    }
+
+    @Override
+    protected ICachedPage acquirePage(int pageId) throws HyracksDataException {
+        return bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, pageId), false);
+    }
+
+    @Override
+    public void close() throws HyracksDataException {
+        super.close();
+        searchPages.clear();
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
index 8b64318..cd0a2d3 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/impls/FieldPrefixSlotManager.java
@@ -57,7 +57,8 @@
     }
 
     // returns prefix slot number, or TUPLE_UNCOMPRESSED of no match was found
-    public int findPrefix(ITupleReference tuple, ITreeIndexTupleReference framePrefixTuple) throws HyracksDataException {
+    public int findPrefix(ITupleReference tuple, ITreeIndexTupleReference framePrefixTuple)
+            throws HyracksDataException {
         int prefixMid;
         int prefixBegin = 0;
         int prefixEnd = frame.getPrefixTupleCount() - 1;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/util/BTreeUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/util/BTreeUtils.java
index 7f992f9..0c06bc3 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/util/BTreeUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/main/java/org/apache/hyracks/storage/am/btree/util/BTreeUtils.java
@@ -29,6 +29,7 @@
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMLeafFrameFactory;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.btree.tuples.BTreeTypeAwareTupleWriterFactory;
 import org.apache.hyracks.storage.am.common.api.IPageManager;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
@@ -51,6 +52,17 @@
                 typeTraits.length, file);
     }
 
+    public static DiskBTree createDiskBTree(IBufferCache bufferCache, ITypeTraits[] typeTraits,
+            IBinaryComparatorFactory[] cmpFactories, BTreeLeafFrameType leafType, FileReference file,
+            IPageManager freePageManager, boolean updateAware) throws HyracksDataException {
+        BTreeTypeAwareTupleWriterFactory tupleWriterFactory =
+                new BTreeTypeAwareTupleWriterFactory(typeTraits, updateAware);
+        ITreeIndexFrameFactory leafFrameFactory = getLeafFrameFactory(tupleWriterFactory, leafType);
+        ITreeIndexFrameFactory interiorFrameFactory = new BTreeNSMInteriorFrameFactory(tupleWriterFactory);
+        return new DiskBTree(bufferCache, freePageManager, interiorFrameFactory, leafFrameFactory, cmpFactories,
+                typeTraits.length, file);
+    }
+
     public static BTree createBTree(IBufferCache bufferCache, IPageManager freePageManager, ITypeTraits[] typeTraits,
             IBinaryComparatorFactory[] cmpFactories, BTreeLeafFrameType leafType, FileReference file,
             boolean updateAware) throws HyracksDataException {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
index 19b8a68..4ff0656 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-btree/src/test/java/org/apache/hyracks/storage/am/btree/test/FramewriterTest.java
@@ -336,10 +336,10 @@
         int j = 0;
         for (int i = 0; i < indexAccessors.length; i++) {
             indexes[j] = Mockito.mock(ITreeIndex.class);
-            Mockito.when(indexes[j].createAccessor(Mockito.any(), Mockito.any())).thenReturn(indexAccessors[i]);
+            Mockito.when(indexes[j].createAccessor(Mockito.any())).thenReturn(indexAccessors[i]);
             j++;
             indexes[j] = Mockito.mock(ITreeIndex.class);
-            Mockito.when(indexes[j].createAccessor(Mockito.any(), Mockito.any()))
+            Mockito.when(indexes[j].createAccessor(Mockito.any()))
                     .thenThrow(new HyracksDataException("failed to create accessor"));
             j++;
         }
@@ -390,7 +390,7 @@
             cursor = Mockito.mock(IIndexCursor.class);
             Mockito.when(cursor.hasNext()).thenReturn(true, true, false);
             Mockito.when(cursor.getTuple()).thenReturn(tuples[i]);
-            Mockito.doThrow(new HyracksDataException("Failed to close cursor")).when(cursor).close();
+            Mockito.doThrow(new HyracksDataException("Failed to close cursor")).when(cursor).destroy();
             cursors[j] = cursor;
             j++;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/pom.xml b/hyracks-fullstack/hyracks/hyracks-storage-am-common/pom.xml
index e88d450..94fe2c2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/pom.xml
@@ -90,5 +90,9 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ILSMIndexCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ILSMIndexCursor.java
new file mode 100644
index 0000000..979ff51
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ILSMIndexCursor.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.common.api;
+
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.storage.common.IIndexCursor;
+
+public interface ILSMIndexCursor extends IIndexCursor {
+    /**
+     * @return the min tuple of the corresponding component's filter
+     */
+    ITupleReference getFilterMinTuple();
+
+    /**
+     *
+     * @return the max tuple of the corresponding component's filter
+     */
+    ITupleReference getFilterMaxTuple();
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
index d0f2358..cedd764 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/IModificationOperationCallbackFactory.java
@@ -28,7 +28,6 @@
 
 @FunctionalInterface
 public interface IModificationOperationCallbackFactory extends Serializable {
-    IModificationOperationCallback createModificationOperationCallback(LocalResource resource,
-            IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
-            throws HyracksDataException;
+    IModificationOperationCallback createModificationOperationCallback(LocalResource resource, IHyracksTaskContext ctx,
+            IOperatorNodePushable operatorNodePushable) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
index 0a5eacc..c8020fc 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ISearchOperationCallbackFactory.java
@@ -26,6 +26,6 @@
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
 public interface ISearchOperationCallbackFactory extends Serializable {
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable)
-            throws HyracksDataException;
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx,
+            IOperatorNodePushable operatorNodePushable) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexAccessor.java
index 3f8b6c1..90963bf 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexAccessor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexAccessor.java
@@ -45,6 +45,5 @@
      * @throws HyracksDataException
      *             If the BufferCache throws while un/pinning or un/latching.
      */
-    public void diskOrderScan(ITreeIndexCursor cursor)
-            throws HyracksDataException;
+    public void diskOrderScan(ITreeIndexCursor cursor) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexFrame.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexFrame.java
index 8dc30c8..7ac49c6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/api/ITreeIndexFrame.java
@@ -118,4 +118,8 @@
     public ITreeIndexTupleReference createTupleReference();
 
     public void setMultiComparator(MultiComparator cmp);
+
+    public ITupleReference getLeftmostTuple() throws HyracksDataException;
+
+    public ITupleReference getRightmostTuple() throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/build/IndexBuilder.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/build/IndexBuilder.java
index 9f648c5..f62860a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/build/IndexBuilder.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/build/IndexBuilder.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.storage.am.common.build;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -36,9 +34,12 @@
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.storage.common.LocalResource;
 import org.apache.hyracks.storage.common.file.IResourceIdFactory;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IndexBuilder implements IIndexBuilder {
-    private static final Logger LOGGER = Logger.getLogger(IndexBuilder.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     protected final INCServiceContext ctx;
     protected final IStorageManager storageManager;
@@ -85,7 +86,7 @@
                 //The reason for this is to handle many cases such as:
                 //1. Crash while delete index is running (we don't do global cleanup on restart)
                 //2. Node leaves and then join with old data
-                LOGGER.log(Level.WARNING,
+                LOGGER.log(Level.WARN,
                         "Removing existing index on index create for the index: " + resourceRef.getRelativePath());
                 lcManager.unregister(resourceRef.getRelativePath());
                 index.destroy();
@@ -95,7 +96,7 @@
                     // This is another big problem that we need to disallow soon
                     // We can only disallow this if we have a global cleanup after crash
                     // on reboot
-                    LOGGER.log(Level.WARNING,
+                    LOGGER.log(Level.WARN,
                             "Deleting " + resourceRef.getRelativePath()
                                     + " on index create. The index is not registered"
                                     + " but the file exists in the filesystem");
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
index 5fc07ad..095159b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexBulkLoadOperatorNodePushable.java
@@ -65,7 +65,7 @@
         index = indexHelper.getIndexInstance();
         try {
             writer.open();
-            bulkLoader = index.createBulkLoader(fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex);
+            initializeBulkLoader();
         } catch (Exception e) {
             throw HyracksDataException.create(e);
         }
@@ -116,4 +116,8 @@
             writer.fail();
         }
     }
+
+    protected void initializeBulkLoader() throws HyracksDataException {
+        bulkLoader = index.createBulkLoader(fillFactor, verifyInput, numElementsHint, checkIfEmptyIndex);
+    }
 }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexCreateOperatorDescriptor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexCreateOperatorDescriptor.java
index badcf27..898321b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexCreateOperatorDescriptor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexCreateOperatorDescriptor.java
@@ -32,8 +32,7 @@
     private static final long serialVersionUID = 1L;
     private final IIndexBuilderFactory indexBuilderFactory;
 
-    public IndexCreateOperatorDescriptor(IOperatorDescriptorRegistry spec,
-            IIndexBuilderFactory indexBuilderFactory) {
+    public IndexCreateOperatorDescriptor(IOperatorDescriptorRegistry spec, IIndexBuilderFactory indexBuilderFactory) {
         super(spec, 0, 0);
         this.indexBuilderFactory = indexBuilderFactory;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
index abfe0bb..520dbc0 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDataflowHelper.java
@@ -19,9 +19,6 @@
 
 package org.apache.hyracks.storage.am.common.dataflow;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -33,10 +30,13 @@
 import org.apache.hyracks.storage.common.IResourceLifecycleManager;
 import org.apache.hyracks.storage.common.IStorageManager;
 import org.apache.hyracks.storage.common.LocalResource;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IndexDataflowHelper implements IIndexDataflowHelper {
 
-    private static final Logger LOGGER = Logger.getLogger(IndexDataflowHelper.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private final INCServiceContext ctx;
     private final IResourceLifecycleManager<IIndex> lcManager;
     private final ILocalResourceRepository localResourceRepository;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
index ea1635a..aae830d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexDropOperatorNodePushable.java
@@ -27,8 +27,6 @@
 
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.IFrameWriter;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -36,10 +34,12 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.std.base.AbstractOperatorNodePushable;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IndexDropOperatorNodePushable extends AbstractOperatorNodePushable {
 
-    private static final Logger LOGGER = Logger.getLogger(IndexDropOperatorNodePushable.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final long DROP_ATTEMPT_WAIT_TIME_MILLIS = TimeUnit.SECONDS.toMillis(1);
     private final IIndexDataflowHelper indexHelper;
     private final Set<DropOption> options;
@@ -83,11 +83,11 @@
                 return;
             } catch (HyracksDataException e) {
                 if (isIgnorable(e)) {
-                    LOGGER.log(Level.INFO, e, () -> "Ignoring exception on drop");
+                    LOGGER.debug("Ignoring exception on drop", e);
                     return;
                 }
                 if (canRetry(e)) {
-                    LOGGER.log(Level.INFO, e, () -> "Retrying drop on exception");
+                    LOGGER.info("Retrying drop on exception", e);
                     continue;
                 }
                 throw e;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
index e80a837..35accc3 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexInsertUpdateDeleteOperatorNodePushable.java
@@ -34,10 +34,12 @@
 import org.apache.hyracks.storage.am.common.api.IModificationOperationCallbackFactory;
 import org.apache.hyracks.storage.am.common.api.ITupleFilter;
 import org.apache.hyracks.storage.am.common.api.ITupleFilterFactory;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.common.tuples.PermutingFrameTupleReference;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.LocalResource;
@@ -81,7 +83,8 @@
             writer.open();
             LocalResource resource = indexHelper.getResource();
             modCallback = modOpCallbackFactory.createModificationOperationCallback(resource, ctx, this);
-            indexAccessor = index.createAccessor(modCallback, NoOpOperationCallback.INSTANCE);
+            IIndexAccessParameters iap = new IndexAccessParameters(modCallback, NoOpOperationCallback.INSTANCE);
+            indexAccessor = index.createAccessor(iap);
             if (tupleFilterFactory != null) {
                 tupleFilter = tupleFilterFactory.createTupleFilter(ctx);
                 frameTuple = new FrameTupleReference();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
index 1e3d5f0..d55962a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/IndexSearchOperatorNodePushable.java
@@ -21,8 +21,6 @@
 import java.io.DataOutput;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.comm.VSizeFrame;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
@@ -40,18 +38,24 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.dataflow.std.base.AbstractUnaryInputUnaryOutputOperatorNodePushable;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ISearchOperationCallbackFactory;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.tuples.PermutingFrameTupleReference;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class IndexSearchOperatorNodePushable extends AbstractUnaryInputUnaryOutputOperatorNodePushable {
 
-    static final Logger LOGGER = Logger.getLogger(IndexSearchOperatorNodePushable.class.getName());
+    static final Logger LOGGER = LogManager.getLogger();
     protected final IHyracksTaskContext ctx;
     protected final IIndexDataflowHelper indexHelper;
     protected FrameTupleAccessor accessor;
@@ -150,7 +154,8 @@
             appender = new FrameTupleAppender(new VSizeFrame(ctx), true);
             ISearchOperationCallback searchCallback =
                     searchCallbackFactory.createSearchOperationCallback(indexHelper.getResource().getId(), ctx, null);
-            indexAccessor = index.createAccessor(NoOpOperationCallback.INSTANCE, searchCallback);
+            IIndexAccessParameters iap = new IndexAccessParameters(NoOpOperationCallback.INSTANCE, searchCallback);
+            indexAccessor = index.createAccessor(iap);
             cursor = createCursor();
             if (retainInput) {
                 frameTuple = new FrameTupleReference();
@@ -176,8 +181,8 @@
             ITupleReference tuple = cursor.getTuple();
             writeTupleToOutput(tuple);
             if (appendIndexFilter) {
-                writeFilterTupleToOutput(cursor.getFilterMinTuple());
-                writeFilterTupleToOutput(cursor.getFilterMaxTuple());
+                writeFilterTupleToOutput(((ILSMIndexCursor) cursor).getFilterMinTuple());
+                writeFilterTupleToOutput(((ILSMIndexCursor) cursor).getFilterMaxTuple());
             }
             FrameUtils.appendToWriter(writer, appender, tb.getFieldEndOffsets(), tb.getByteArray(), 0, tb.getSize());
         }
@@ -197,7 +202,7 @@
         try {
             for (int i = 0; i < tupleCount; i++) {
                 resetSearchPredicate(i);
-                cursor.reset();
+                cursor.close();
                 indexAccessor.search(cursor, searchPred);
                 writeSearchResults(i);
             }
@@ -228,7 +233,7 @@
             }
 
             try {
-                cursor.close();
+                cursor.destroy();
             } catch (Throwable th) {
                 if (closeException == null) {
                     closeException = HyracksDataException.create(th);
@@ -296,7 +301,7 @@
             try {
                 nonMatchWriter.writeMissing(out);
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING, e.getMessage(), e);
+                LOGGER.log(Level.WARN, e.getMessage(), e);
             }
             nullTuple.addFieldEndOffset();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
index bc7cb85..7626815 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/dataflow/TreeIndexDiskOrderScanOperatorNodePushable.java
@@ -34,8 +34,10 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrame;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.LocalResource;
 
@@ -62,8 +64,8 @@
             LocalResource resource = treeIndexHelper.getResource();
             ISearchOperationCallback searchCallback =
                     searchCallbackFactory.createSearchOperationCallback(resource.getId(), ctx, null);
-            ITreeIndexAccessor indexAccessor =
-                    (ITreeIndexAccessor) treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, searchCallback);
+            IIndexAccessParameters iap = new IndexAccessParameters(NoOpOperationCallback.INSTANCE, searchCallback);
+            ITreeIndexAccessor indexAccessor = (ITreeIndexAccessor) treeIndex.createAccessor(iap);
             try {
                 writer.open();
                 indexAccessor.diskOrderScan(cursor);
@@ -93,7 +95,7 @@
                 throw new HyracksDataException(th);
             } finally {
                 try {
-                    cursor.close();
+                    cursor.destroy();
                 } catch (Exception cursorCloseException) {
                     throw new IllegalStateException(cursorCloseException);
                 } finally {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/AbstractSlotManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/AbstractSlotManager.java
index 92ba631..70333ac 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/AbstractSlotManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/AbstractSlotManager.java
@@ -42,8 +42,7 @@
 
     @Override
     public int getSlotEndOff() {
-        return frame.getBuffer().capacity()
-                - (frame.getTupleCount() * slotSize);
+        return frame.getBuffer().capacity() - (frame.getTupleCount() * slotSize);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/LIFOMetaDataFrame.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/LIFOMetaDataFrame.java
index de890c4..d0757c8 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/LIFOMetaDataFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/LIFOMetaDataFrame.java
@@ -76,8 +76,8 @@
 
     @Override
     public int getSpace() {
-        return buf.array().length - buf.getInt(Constants.FREE_SPACE_OFFSET) - (Integer.BYTES * buf.getInt(
-                FREE_PAGE_COUNT_OFFSET));
+        return buf.array().length - buf.getInt(Constants.FREE_SPACE_OFFSET)
+                - (Integer.BYTES * buf.getInt(FREE_PAGE_COUNT_OFFSET));
     }
 
     @Override
@@ -209,8 +209,8 @@
     private boolean isInner(IValueReference key, int tupleOffset) {
         int keySize = buf.getInt(tupleOffset);
         if (keySize == key.getLength()) {
-            return LIFOMetaDataFrame.compare(key.getByteArray(), key.getStartOffset(), buf.array(), tupleOffset
-                    + Integer.BYTES, keySize) == 0;
+            return LIFOMetaDataFrame.compare(key.getByteArray(), key.getStartOffset(), buf.array(),
+                    tupleOffset + Integer.BYTES, keySize) == 0;
         }
         return false;
     }
@@ -253,8 +253,8 @@
             int available = getSpace();
             int required = key.getLength() + Integer.BYTES + Integer.BYTES + value.getLength();
             if (available < required) {
-                throw new HyracksDataException("Available space in the page ("
-                        + available + ") is not enough to store the key value pair(" + required + ")");
+                throw new HyracksDataException("Available space in the page (" + available
+                        + ") is not enough to store the key value pair(" + required + ")");
             }
             buf.putInt(offset, key.getLength());
             offset += Integer.BYTES;
@@ -294,14 +294,14 @@
 
     @Override
     public String toString() {
-        StringBuilder aString = new StringBuilder(this.getClass().getSimpleName()).append('\n').
-                append("Tuple Count: " + getTupleCount()).append('\n').
-                append("Free Space offset: " + buf.getInt(Constants.FREE_SPACE_OFFSET)).append('\n').
-                append("Level: " + buf.get(Constants.LEVEL_OFFSET)).append('\n').
-                append("Version: " + buf.getInt(STORAGE_VERSION_OFFSET)).append('\n').
-                append("Max Page: " + buf.getInt(MAX_PAGE_OFFSET)).append('\n').
-                append("Root Page: " + buf.getInt(ROOT_PAGE_OFFSET)).append('\n').
-                append("Number of free pages: " + buf.getInt(FREE_PAGE_COUNT_OFFSET));
+        StringBuilder aString = new StringBuilder(this.getClass().getSimpleName()).append('\n')
+                .append("Tuple Count: " + getTupleCount()).append('\n')
+                .append("Free Space offset: " + buf.getInt(Constants.FREE_SPACE_OFFSET)).append('\n')
+                .append("Level: " + buf.get(Constants.LEVEL_OFFSET)).append('\n')
+                .append("Version: " + buf.getInt(STORAGE_VERSION_OFFSET)).append('\n')
+                .append("Max Page: " + buf.getInt(MAX_PAGE_OFFSET)).append('\n')
+                .append("Root Page: " + buf.getInt(ROOT_PAGE_OFFSET)).append('\n')
+                .append("Number of free pages: " + buf.getInt(FREE_PAGE_COUNT_OFFSET));
         int tupleCount = getTupleCount();
         int offset;
         for (int i = 0; i < tupleCount; i++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
index 5f001e0..6106358 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/frames/TreeIndexNSMFrame.java
@@ -335,4 +335,23 @@
         return buf.capacity() - getFreeSpaceOff() - (getTupleCount() * slotManager.getSlotSize());
     }
 
+    public ITupleReference getLeftmostTuple() {
+        int tupleCount = getTupleCount();
+        if (tupleCount == 0) {
+            return null;
+        } else {
+            frameTuple.resetByTupleIndex(this, 0);
+            return frameTuple;
+        }
+    }
+
+    public ITupleReference getRightmostTuple() {
+        int tupleCount = getTupleCount();
+        if (tupleCount == 0) {
+            return null;
+        } else {
+            frameTuple.resetByTupleIndex(this, tupleCount - 1);
+            return frameTuple;
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/AppendOnlyLinkedMetadataPageManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/AppendOnlyLinkedMetadataPageManager.java
index a051364..5c389d2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/AppendOnlyLinkedMetadataPageManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/AppendOnlyLinkedMetadataPageManager.java
@@ -345,10 +345,8 @@
             try {
                 frame.setPage(page);
                 int inPageOffset = frame.getOffset(key);
-                return inPageOffset >= 0
-                        ? ((long) pageId * bufferCache.getPageSizeWithHeader()) + frame.getOffset(key)
-                                + IBufferCache.RESERVED_HEADER_BYTES
-                        : -1L;
+                return inPageOffset >= 0 ? ((long) pageId * bufferCache.getPageSizeWithHeader()) + frame.getOffset(key)
+                        + IBufferCache.RESERVED_HEADER_BYTES : -1L;
             } finally {
                 page.releaseReadLatch();
                 unpinPage(page);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
index d8afd12..951d824 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/freepage/LinkedMetaDataPageManager.java
@@ -240,8 +240,8 @@
     @Override
     public void close() throws HyracksDataException {
         if (ready) {
-            ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()),
-                    false);
+            ICachedPage metaNode =
+                    bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false);
             ITreeIndexMetadataFrame metaFrame = frameFactory.createFrame();
             metaNode.acquireWriteLatch();
             try {
@@ -319,8 +319,8 @@
     public long getFileOffset(ITreeIndexMetadataFrame frame, IValueReference key) throws HyracksDataException {
         int metadataPageNum = getMetadataPageId();
         if (metadataPageNum != IBufferCache.INVALID_PAGEID) {
-            ICachedPage metaNode = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()),
-                    false);
+            ICachedPage metaNode =
+                    bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, getMetadataPageId()), false);
             metaNode.acquireReadLatch();
             try {
                 frame.setPage(metaNode);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
index 1221458..905c99d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/AbstractTreeIndex.java
@@ -81,12 +81,28 @@
             throw HyracksDataException.create(ErrorCode.CANNOT_CREATE_ACTIVE_INDEX);
         }
         fileId = bufferCache.createFile(file);
-        bufferCache.openFile(fileId);
-        freePageManager.open(fileId);
-        freePageManager.init(interiorFrameFactory, leafFrameFactory);
-        setRootPage();
-        freePageManager.close();
-        bufferCache.closeFile(fileId);
+        boolean failed = true;
+        try {
+            bufferCache.openFile(fileId);
+            failed = false;
+        } finally {
+            if (failed) {
+                bufferCache.deleteFile(fileId);
+            }
+        }
+        failed = true;
+        try {
+            freePageManager.open(fileId);
+            freePageManager.init(interiorFrameFactory, leafFrameFactory);
+            setRootPage();
+            freePageManager.close();
+            failed = false;
+        } finally {
+            bufferCache.closeFile(fileId);
+            if (failed) {
+                bufferCache.deleteFile(fileId);
+            }
+        }
     }
 
     private void setRootPage() throws HyracksDataException {
@@ -308,8 +324,7 @@
         ITreeIndexAccessor accessor;
 
         public TreeIndexInsertBulkLoader() throws HyracksDataException {
-            accessor =
-                    (ITreeIndexAccessor) createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            accessor = (ITreeIndexAccessor) createAccessor(NoOpIndexAccessParameters.INSTANCE);
         }
 
         @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/IndexAccessParameters.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/IndexAccessParameters.java
new file mode 100644
index 0000000..3f97aa2
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/IndexAccessParameters.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.common.impls;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.storage.common.ISearchOperationCallback;
+
+public class IndexAccessParameters implements IIndexAccessParameters {
+
+    protected final IModificationOperationCallback modificationCallback;
+    protected final ISearchOperationCallback searchOperationCallback;
+    // This map is used to put additional parameters to an index accessor.
+    protected Map<String, Object> paramMap = null;
+
+    public IndexAccessParameters(IModificationOperationCallback modificationCallback,
+            ISearchOperationCallback searchOperationCallback) {
+        this.modificationCallback = modificationCallback;
+        this.searchOperationCallback = searchOperationCallback;
+    }
+
+    @Override
+    public IModificationOperationCallback getModificationCallback() {
+        return modificationCallback;
+    }
+
+    @Override
+    public ISearchOperationCallback getSearchOperationCallback() {
+        return searchOperationCallback;
+    }
+
+    @Override
+    public Map<String, Object> getParameters() {
+        if (paramMap == null) {
+            paramMap = new HashMap<String, Object>();
+        }
+        return paramMap;
+    }
+
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpIndexAccessParameters.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpIndexAccessParameters.java
new file mode 100644
index 0000000..3618cae
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpIndexAccessParameters.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.common.impls;
+
+import java.util.Map;
+
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.storage.common.ISearchOperationCallback;
+
+public class NoOpIndexAccessParameters implements IIndexAccessParameters {
+    public static final NoOpIndexAccessParameters INSTANCE = new NoOpIndexAccessParameters();
+
+    private NoOpIndexAccessParameters() {
+    }
+
+    @Override
+    public IModificationOperationCallback getModificationCallback() {
+        return NoOpOperationCallback.INSTANCE;
+    }
+
+    @Override
+    public ISearchOperationCallback getSearchOperationCallback() {
+        return NoOpOperationCallback.INSTANCE;
+    }
+
+    @Override
+    public Map<String, Object> getParameters() {
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
index 8245338..15aba57 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallback.java
@@ -27,7 +27,7 @@
 /**
  * Dummy operation callback that simply does nothing.
  */
-public enum NoOpOperationCallback implements IModificationOperationCallback,ISearchOperationCallback {
+public enum NoOpOperationCallback implements IModificationOperationCallback, ISearchOperationCallback {
     INSTANCE;
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
index 4ef89d1..925642e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/NoOpOperationCallbackFactory.java
@@ -36,7 +36,8 @@
     INSTANCE;
 
     @Override
-    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx, IOperatorNodePushable operatorNodePushable) {
+    public ISearchOperationCallback createSearchOperationCallback(long resourceId, IHyracksTaskContext ctx,
+            IOperatorNodePushable operatorNodePushable) {
         return NoOpOperationCallback.INSTANCE;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
index 0b8b64c..b2c26db 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/impls/TreeIndexDiskOrderScanCursor.java
@@ -32,12 +32,12 @@
 
 public class TreeIndexDiskOrderScanCursor implements ITreeIndexCursor {
 
-    private int tupleIndex = 0;
-    private int fileId = -1;
-    private int currentPageId = -1;
-    private int maxPageId = -1;
-    private ICachedPage page = null;
-    private IBufferCache bufferCache = null;
+    protected int tupleIndex = 0;
+    protected int fileId = -1;
+    protected int currentPageId = -1;
+    protected int maxPageId = -1;
+    protected ICachedPage page = null;
+    protected IBufferCache bufferCache = null;
 
     private final ITreeIndexFrame frame;
     private final ITreeIndexTupleReference frameTuple;
@@ -48,9 +48,8 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
-        page.releaseReadLatch();
-        bufferCache.unpin(page);
+    public void destroy() throws HyracksDataException {
+        releasePage();
         page = null;
     }
 
@@ -59,28 +58,15 @@
         return frameTuple;
     }
 
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
     private boolean positionToNextLeaf(boolean skipCurrent) throws HyracksDataException {
         while (frame.getLevel() != 0 || skipCurrent || frame.getTupleCount() == 0) {
             if (++currentPageId > maxPageId) {
                 break;
             }
 
-            page.releaseReadLatch();
-            bufferCache.unpin(page);
+            releasePage();
 
-            ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, currentPageId), false);
-            nextPage.acquireReadLatch();
-
+            ICachedPage nextPage = acquireNextPage();
             page = nextPage;
             frame.setPage(page);
             tupleIndex = 0;
@@ -120,8 +106,7 @@
     public void open(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
         // in case open is called multiple times without closing
         if (page != null) {
-            page.releaseReadLatch();
-            bufferCache.unpin(page);
+            releasePage();
         }
         page = initialState.getPage();
         tupleIndex = 0;
@@ -130,7 +115,7 @@
     }
 
     @Override
-    public void reset() {
+    public void close() {
         tupleIndex = 0;
         currentPageId = -1;
         maxPageId = -1;
@@ -159,4 +144,15 @@
     public boolean isExclusiveLatchNodes() {
         return false;
     }
+
+    protected void releasePage() throws HyracksDataException {
+        page.releaseReadLatch();
+        bufferCache.unpin(page);
+    }
+
+    protected ICachedPage acquireNextPage() throws HyracksDataException {
+        ICachedPage nextPage = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, currentPageId), false);
+        nextPage.acquireReadLatch();
+        return nextPage;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleMode.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleMode.java
index ce2aa38..b192de7 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleMode.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleMode.java
@@ -20,5 +20,8 @@
 package org.apache.hyracks.storage.am.common.ophelpers;
 
 public enum FindTupleMode {
-    INCLUSIVE, EXCLUSIVE, EXCLUSIVE_ERROR_IF_EXISTS, EXACT
+    INCLUSIVE,
+    EXCLUSIVE,
+    EXCLUSIVE_ERROR_IF_EXISTS,
+    EXACT
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleNoExactMatchPolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleNoExactMatchPolicy.java
index e9dfaff..2081122 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleNoExactMatchPolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/FindTupleNoExactMatchPolicy.java
@@ -20,5 +20,7 @@
 package org.apache.hyracks.storage.am.common.ophelpers;
 
 public enum FindTupleNoExactMatchPolicy {
-    LOWER_KEY, HIGHER_KEY, NONE
+    LOWER_KEY,
+    HIGHER_KEY,
+    NONE
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/IndexOp.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/IndexOp.java
deleted file mode 100644
index 7a0d4e8..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/ophelpers/IndexOp.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.storage.am.common.ophelpers;
-
-public enum IndexOp {
-    INSERT, DELETE, UPDATE, UPSERT, SEARCH, DISKORDERSCAN, PHYSICALDELETE
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/tuples/SimpleTupleReference.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/tuples/SimpleTupleReference.java
index 609c51a..e82b037 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/tuples/SimpleTupleReference.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/tuples/SimpleTupleReference.java
@@ -98,7 +98,7 @@
 
     @Override
     public int getTupleSize() {
-        return nullFlagsBytes + fieldSlotsBytes + ShortPointable.getShort(buf, tupleStartOff + nullFlagsBytes
-                + (fieldCount - 1) * 2);
+        return nullFlagsBytes + fieldSlotsBytes
+                + ShortPointable.getShort(buf, tupleStartOff + nullFlagsBytes + (fieldCount - 1) * 2);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexStats.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexStats.java
index 4ee9f53..ad0b030 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexStats.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexStats.java
@@ -75,41 +75,30 @@
         strBuilder.append("TREE LEVELS:  " + treeLevels + "\n");
         strBuilder.append("FREE PAGES :  " + freePages + "\n");
         strBuilder.append("META PAGES :  " + metaPages + "\n");
-        long totalPages = interiorStats.getNumPages() + leafStats.getNumPages()
-                + freePages + metaPages;
+        long totalPages = interiorStats.getNumPages() + leafStats.getNumPages() + freePages + metaPages;
         strBuilder.append("TOTAL PAGES : " + totalPages + "\n");
 
         strBuilder.append("\n");
         strBuilder.append("ROOT STATS" + "\n");
-        strBuilder
-                .append("NUM TUPLES:      " + rootStats.getNumTuples() + "\n");
-        strBuilder.append("FILL FACTOR    : "
-                + df.format(rootStats.getAvgFillFactor()) + "\n");
+        strBuilder.append("NUM TUPLES:      " + rootStats.getNumTuples() + "\n");
+        strBuilder.append("FILL FACTOR    : " + df.format(rootStats.getAvgFillFactor()) + "\n");
 
         if (interiorStats.getNumPages() > 0) {
             strBuilder.append("\n");
             strBuilder.append("INTERIOR STATS" + "\n");
-            strBuilder.append("NUM PAGES:       " + interiorStats.getNumPages()
-                    + "\n");
-            strBuilder.append("NUM TUPLES:      "
-                    + interiorStats.getNumTuples() + "\n");
-            strBuilder.append("AVG TUPLES/PAGE: "
-                    + df.format(interiorStats.getAvgNumTuples()) + "\n");
-            strBuilder.append("AVG FILL FACTOR: "
-                    + df.format(interiorStats.getAvgFillFactor()) + "\n");
+            strBuilder.append("NUM PAGES:       " + interiorStats.getNumPages() + "\n");
+            strBuilder.append("NUM TUPLES:      " + interiorStats.getNumTuples() + "\n");
+            strBuilder.append("AVG TUPLES/PAGE: " + df.format(interiorStats.getAvgNumTuples()) + "\n");
+            strBuilder.append("AVG FILL FACTOR: " + df.format(interiorStats.getAvgFillFactor()) + "\n");
         }
 
         if (leafStats.getNumPages() > 0) {
             strBuilder.append("\n");
             strBuilder.append("LEAF STATS" + "\n");
-            strBuilder.append("NUM PAGES:       "
-                    + df.format(leafStats.getNumPages()) + "\n");
-            strBuilder.append("NUM TUPLES:      "
-                    + df.format(leafStats.getNumTuples()) + "\n");
-            strBuilder.append("AVG TUPLES/PAGE: "
-                    + df.format(leafStats.getAvgNumTuples()) + "\n");
-            strBuilder.append("AVG FILL FACTOR: "
-                    + df.format(leafStats.getAvgFillFactor()) + "\n");
+            strBuilder.append("NUM PAGES:       " + df.format(leafStats.getNumPages()) + "\n");
+            strBuilder.append("NUM TUPLES:      " + df.format(leafStats.getNumTuples()) + "\n");
+            strBuilder.append("AVG TUPLES/PAGE: " + df.format(leafStats.getAvgNumTuples()) + "\n");
+            strBuilder.append("AVG FILL FACTOR: " + df.format(leafStats.getAvgFillFactor()) + "\n");
         }
 
         return strBuilder.toString();
@@ -130,8 +119,7 @@
         public void add(ITreeIndexFrame frame) {
             numPages++;
             numTuples += frame.getTupleCount();
-            sumFillFactors += (double) (frame.getBuffer().capacity() - frame
-                    .getTotalFreeSpace())
+            sumFillFactors += (double) (frame.getBuffer().capacity() - frame.getTotalFreeSpace())
                     / (double) frame.getBuffer().capacity();
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexUtils.java
index 37ecfc0..ee31aaf 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/main/java/org/apache/hyracks/storage/am/common/util/TreeIndexUtils.java
@@ -27,7 +27,8 @@
 
 @SuppressWarnings("rawtypes")
 public class TreeIndexUtils {
-    public static String printFrameTuples(ITreeIndexFrame frame, ISerializerDeserializer[] fieldSerdes) throws HyracksDataException {
+    public static String printFrameTuples(ITreeIndexFrame frame, ISerializerDeserializer[] fieldSerdes)
+            throws HyracksDataException {
         StringBuilder strBuilder = new StringBuilder();
         ITreeIndexTupleReference tuple = frame.createTupleReference();
         for (int i = 0; i < frame.getTupleCount(); i++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/frames/LIFOMetadataFrameTest.java b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/frames/LIFOMetadataFrameTest.java
index fbb930d..0df558f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/frames/LIFOMetadataFrameTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-common/src/test/java/org/apache/hyracks/storage/am/common/frames/LIFOMetadataFrameTest.java
@@ -41,8 +41,7 @@
         Assert.assertNull(longPointable.getByteArray());
         byte[] longBytes = new byte[Long.BYTES];
         MutableArrayValueReference value = new MutableArrayValueReference(longBytes);
-        int space = frame.getSpace() - (value.getLength() + Integer.BYTES * 2
-                + testKey.getLength());
+        int space = frame.getSpace() - (value.getLength() + Integer.BYTES * 2 + testKey.getLength());
         for (long l = 1L; l < 52L; l++) {
             LongPointable.setLong(longBytes, 0, l);
             frame.put(testKey, value);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
index 6083637..445f363 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeLocalResource.java
@@ -57,10 +57,11 @@
     public ILSMIndex createInstance(INCServiceContext serviceCtx) throws HyracksDataException {
         IIOManager ioManager = serviceCtx.getIoManager();
         FileReference file = ioManager.resolve(path);
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         return LSMBTreeUtil.createExternalBTree(ioManager, file, storageManager.getBufferCache(serviceCtx), typeTraits,
                 cmpFactories, bloomFilterKeyFields, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx),
-                opTrackerProvider.getOperationTracker(serviceCtx), ioSchedulerProvider.getIoScheduler(serviceCtx),
-                ioOpCallbackFactory, durable, metadataPageManagerFactory);
+                opTrackerProvider.getOperationTracker(serviceCtx, this), ioSchedulerProvider.getIoScheduler(serviceCtx),
+                ioOpCallbackFactory, durable, metadataPageManagerFactory, serviceCtx.getTracer());
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
index 04b63f9..acdb09e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/ExternalBTreeWithBuddyLocalResource.java
@@ -60,10 +60,11 @@
     public ILSMIndex createInstance(INCServiceContext serviceCtx) throws HyracksDataException {
         IIOManager ioManager = serviceCtx.getIoManager();
         FileReference file = ioManager.resolve(path);
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         return LSMBTreeUtil.createExternalBTreeWithBuddy(ioManager, file, storageManager.getBufferCache(serviceCtx),
                 typeTraits, cmpFactories, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx),
-                opTrackerProvider.getOperationTracker(serviceCtx), ioSchedulerProvider.getIoScheduler(serviceCtx),
-                ioOpCallbackFactory, bloomFilterKeyFields, durable, metadataPageManagerFactory);
+                opTrackerProvider.getOperationTracker(serviceCtx, this), ioSchedulerProvider.getIoScheduler(serviceCtx),
+                ioOpCallbackFactory, bloomFilterKeyFields, durable, metadataPageManagerFactory, serviceCtx.getTracer());
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
index dfa88da..f0b86d2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/dataflow/LSMBTreeLocalResource.java
@@ -70,12 +70,13 @@
         IIOManager ioManager = serviceCtx.getIoManager();
         FileReference file = ioManager.resolve(path);
         List<IVirtualBufferCache> vbcs = vbcProvider.getVirtualBufferCaches(serviceCtx, file);
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         //TODO: enable updateAwareness for secondary LSMBTree indexes
         boolean updateAware = false;
         return LSMBTreeUtil.createLSMTree(ioManager, vbcs, file, storageManager.getBufferCache(serviceCtx), typeTraits,
                 cmpFactories, bloomFilterKeyFields, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx),
-                opTrackerProvider.getOperationTracker(serviceCtx), ioSchedulerProvider.getIoScheduler(serviceCtx),
+                opTrackerProvider.getOperationTracker(serviceCtx, this), ioSchedulerProvider.getIoScheduler(serviceCtx),
                 ioOpCallbackFactory, isPrimary, filterTypeTraits, filterCmpFactories, btreeFields, filterFields,
                 durable, metadataPageManagerFactory, updateAware, serviceCtx.getTracer());
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
index 1ca4a6f..92d74d9 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTree.java
@@ -31,7 +31,6 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.api.ITwoPCIndexBulkLoader;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
@@ -41,6 +40,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -50,18 +50,18 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ITwoPCIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
 import org.apache.hyracks.storage.am.lsm.common.impls.ExternalIndexHarness;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor.ICursorFactory;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.util.trace.ITracer;
 
 /**
  * This is an lsm b-tree that does not have memory component and is modified
@@ -94,18 +94,19 @@
             ILSMDiskComponentFactory bulkLoadComponentFactory, ILSMDiskComponentFactory transactionComponentFactory,
             double bloomFilterFalsePositiveRate, IBinaryComparatorFactory[] cmpFactories, ILSMMergePolicy mergePolicy,
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean durable) {
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean durable, ITracer tracer)
+            throws HyracksDataException {
         super(ioManager, insertLeafFrameFactory, deleteLeafFrameFactory, bufferCache, fileManager, componentFactory,
                 bulkLoadComponentFactory, bloomFilterFalsePositiveRate, cmpFactories, mergePolicy, opTracker,
-                ioScheduler, ioOpCallbackFactory, false, durable);
+                ioScheduler, ioOpCallbackFactory, false, durable, tracer);
         this.transactionComponentFactory = transactionComponentFactory;
         this.secondDiskComponents = new LinkedList<>();
         this.interiorFrameFactory = interiorFrameFactory;
     }
 
     @Override
-    public ExternalIndexHarness getLsmHarness() {
-        return (ExternalIndexHarness) super.getLsmHarness();
+    public ExternalIndexHarness getHarness() {
+        return (ExternalIndexHarness) super.getHarness();
     }
 
     // The subsume merged components is overridden to account for:
@@ -162,9 +163,9 @@
 
     // This method creates the appropriate opContext for the targeted version
     public ExternalBTreeOpContext createOpContext(ISearchOperationCallback searchCallback, int targetVersion) {
-        return new ExternalBTreeOpContext(insertLeafFrameFactory, deleteLeafFrameFactory, searchCallback,
+        return new ExternalBTreeOpContext(this, insertLeafFrameFactory, deleteLeafFrameFactory, searchCallback,
                 ((LSMBTreeWithBloomFilterDiskComponentFactory) componentFactory).getBloomFilterKeyFields().length,
-                cmpFactories, targetVersion, getLsmHarness());
+                cmpFactories, targetVersion, getHarness(), tracer);
     }
 
     // The only reason to override the following method is that it uses a different context object
@@ -187,14 +188,14 @@
                 returnDeletedTuples = true;
             }
         }
-        ITreeIndexCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, returnDeletedTuples);
+        LSMBTreeRangeSearchCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, returnDeletedTuples);
         BTree firstBTree = ((LSMBTreeDiskComponent) mergingComponents.get(0)).getIndex();
         BTree lastBTree = ((LSMBTreeDiskComponent) mergingComponents.get(mergingComponents.size() - 1)).getIndex();
         FileReference firstFile = firstBTree.getFileReference();
         FileReference lastFile = lastBTree.getFileReference();
         LSMComponentFileReferences relMergeFileRefs =
                 fileManager.getRelMergeFileReference(firstFile.getFile().getName(), lastFile.getFile().getName());
-        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
         ioScheduler.scheduleOperation(new LSMBTreeMergeOperation(accessor, cursor,
                 relMergeFileRefs.getInsertIndexFileReference(), relMergeFileRefs.getBloomFilterFileReference(),
                 callback, fileManager.getBaseDir().getAbsolutePath()));
@@ -259,7 +260,7 @@
                 diskComponents.add(component);
                 secondDiskComponents.add(component);
             }
-            getLsmHarness().indexFirstTimeActivated();
+            getHarness().indexFirstTimeActivated();
         } else {
             // This index has been opened before
             for (ILSMDiskComponent c : diskComponents) {
@@ -288,7 +289,7 @@
         }
         if (flushOnExit) {
             BlockingIOOperationCallbackWrapper cb = new BlockingIOOperationCallbackWrapper(ioOpCallback);
-            cb.afterFinalize(LSMOperationType.FLUSH, null);
+            cb.afterFinalize(LSMIOOperationType.FLUSH, null);
         }
         for (ILSMDiskComponent c : diskComponents) {
             c.deactivateAndPurge();
@@ -309,7 +310,7 @@
         if (!isActive) {
             throw new HyracksDataException("Failed to clear the index since it is not activated.");
         }
-        getLsmHarness().indexClear();
+        getHarness().indexClear();
 
         for (ILSMDiskComponent c : diskComponents) {
             c.deactivateAndDestroy();
@@ -451,7 +452,7 @@
                     component.markAsValid(durable);
                     component.deactivate();
                 } else {
-                    getLsmHarness().addBulkLoadedComponent(component);
+                    getHarness().addBulkLoadedComponent(component);
                 }
             }
         }
@@ -488,17 +489,16 @@
 
     // The accessor for disk only indexes don't use modification callback and always carry the target index version with them
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        ExternalBTreeOpContext opCtx = createOpContext(searchCallback, version);
-        return new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) {
+        ExternalBTreeOpContext opCtx = createOpContext(iap.getSearchOperationCallback(), version);
+        return new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
     }
 
     @Override
     public ILSMIndexAccessor createAccessor(ISearchOperationCallback searchCallback, int targetIndexVersion)
             throws HyracksDataException {
         ExternalBTreeOpContext opCtx = createOpContext(searchCallback, targetIndexVersion);
-        return new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+        return new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
     }
 
     @Override
@@ -554,7 +554,7 @@
             component = createDiskComponent(componentFactory, componentFileReferences.getInsertIndexFileReference(),
                     null, componentFileReferences.getBloomFilterFileReference(), false);
         }
-        getLsmHarness().addTransactionComponents(component);
+        getHarness().addTransactionComponents(component);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java
index f94c38a..b0c31ad 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeOpContext.java
@@ -22,9 +22,11 @@
 import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class ExternalBTreeOpContext extends AbstractLSMIndexOperationContext {
     private IBTreeLeafFrame insertLeafFrame;
@@ -34,11 +36,11 @@
     private final int targetIndexVersion;
     private LSMBTreeCursorInitialState searchInitialState;
 
-    public ExternalBTreeOpContext(ITreeIndexFrameFactory insertLeafFrameFactory,
+    public ExternalBTreeOpContext(ILSMIndex index, ITreeIndexFrameFactory insertLeafFrameFactory,
             ITreeIndexFrameFactory deleteLeafFrameFactory, ISearchOperationCallback searchCallback,
             int numBloomFilterKeyFields, IBinaryComparatorFactory[] cmpFactories, int targetIndexVersion,
-            ILSMHarness lsmHarness) {
-        super(null, null, null, searchCallback, null);
+            ILSMHarness lsmHarness, ITracer tracer) {
+        super(index, null, null, null, searchCallback, null, tracer);
         if (cmpFactories != null) {
             this.cmp = MultiComparator.create(cmpFactories);
         } else {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
index 57f956b..6993013 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddy.java
@@ -33,7 +33,6 @@
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.api.ITwoPCIndexBulkLoader;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
@@ -44,6 +43,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -53,18 +53,19 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ITwoPCIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.impls.ExternalIndexHarness;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class ExternalBTreeWithBuddy extends AbstractLSMIndex implements ITreeIndex, ITwoPCIndex {
 
@@ -88,9 +89,10 @@
             ILSMDiskComponentFactory bulkLoadComponentFactory, double bloomFilterFalsePositiveRate,
             ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, IBinaryComparatorFactory[] btreeCmpFactories,
-            IBinaryComparatorFactory[] buddyBtreeCmpFactories, int[] buddyBTreeFields, boolean durable) {
+            IBinaryComparatorFactory[] buddyBtreeCmpFactories, int[] buddyBTreeFields, boolean durable, ITracer tracer)
+            throws HyracksDataException {
         super(ioManager, diskBufferCache, fileManager, bloomFilterFalsePositiveRate, mergePolicy, opTracker,
-                ioScheduler, ioOpCallbackFactory, componentFactory, bulkLoadComponentFactory, durable);
+                ioScheduler, ioOpCallbackFactory, componentFactory, bulkLoadComponentFactory, durable, tracer);
         this.btreeCmpFactories = btreeCmpFactories;
         this.buddyBtreeCmpFactories = buddyBtreeCmpFactories;
         this.buddyBTreeFields = buddyBTreeFields;
@@ -124,7 +126,7 @@
                 diskComponents.add(component);
                 secondDiskComponents.add(component);
             }
-            ((ExternalIndexHarness) getLsmHarness()).indexFirstTimeActivated();
+            ((ExternalIndexHarness) getHarness()).indexFirstTimeActivated();
         } else {
             // This index has been opened before or is brand new with no
             // components. It should also maintain the version pointer
@@ -146,7 +148,7 @@
         if (!isActive) {
             throw new HyracksDataException("Failed to clear the index since it is not activated.");
         }
-        ((ExternalIndexHarness) getLsmHarness()).indexClear();
+        ((ExternalIndexHarness) getHarness()).indexClear();
         for (ILSMDiskComponent c : diskComponents) {
             c.deactivateAndDestroy();
             // Remove from second list to avoid destroying twice
@@ -180,9 +182,8 @@
     }
 
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
-        return new LSMTreeIndexAccessor(getLsmHarness(), createOpContext(searchCallback, version),
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException {
+        return new LSMTreeIndexAccessor(getHarness(), createOpContext(iap.getSearchOperationCallback(), version),
                 ctx -> new LSMBTreeWithBuddySearchCursor(ctx, buddyBTreeFields));
     }
 
@@ -271,9 +272,9 @@
         ILSMIndexOperationContext bctx = createOpContext(NoOpOperationCallback.INSTANCE, 0);
         bctx.setOperation(IndexOperation.MERGE);
         List<ILSMComponent> mergingComponents = ctx.getComponentHolder();
-        ITreeIndexCursor cursor = new LSMBTreeWithBuddySortedCursor(bctx, buddyBTreeFields);
+        LSMBTreeWithBuddySortedCursor cursor = new LSMBTreeWithBuddySortedCursor(bctx, buddyBTreeFields);
         LSMComponentFileReferences relMergeFileRefs = getMergeTargetFileName(mergingComponents);
-        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), bctx,
+        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getHarness(), bctx,
                 opCtx -> new LSMBTreeWithBuddySearchCursor(opCtx, buddyBTreeFields));
 
         // Since we have two lists of components, to tell whether we need to
@@ -296,9 +297,9 @@
 
     // This method creates the appropriate opContext for the targeted version
     public ExternalBTreeWithBuddyOpContext createOpContext(ISearchOperationCallback searchCallback, int targetVersion) {
-        return new ExternalBTreeWithBuddyOpContext(btreeCmpFactories, buddyBtreeCmpFactories, searchCallback,
-                targetVersion, getLsmHarness(), btreeInteriorFrameFactory, btreeLeafFrameFactory,
-                buddyBtreeLeafFrameFactory);
+        return new ExternalBTreeWithBuddyOpContext(this, btreeCmpFactories, buddyBtreeCmpFactories, searchCallback,
+                targetVersion, getHarness(), btreeInteriorFrameFactory, btreeLeafFrameFactory,
+                buddyBtreeLeafFrameFactory, tracer);
     }
 
     @Override
@@ -340,7 +341,7 @@
                     componentBulkLoader.delete(tuple);
                 }
             } finally {
-                buddyBtreeCursor.close();
+                buddyBtreeCursor.destroy();
             }
         } else {
             componentBulkLoader = mergedComponent.createBulkLoader(1.0f, false, 0L, false, false, false);
@@ -353,7 +354,7 @@
                 componentBulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
         componentBulkLoader.end();
         return mergedComponent;
@@ -432,7 +433,7 @@
             throw new HyracksDataException("Failed to deactivate the index since it is already deactivated.");
         }
         if (flushOnExit) {
-            ioOpCallback.afterFinalize(LSMOperationType.FLUSH, null);
+            ioOpCallback.afterFinalize(LSMIOOperationType.FLUSH, null);
         }
         // Even though, we deactivate the index, we don't exit components or
         // modify any of the lists to make sure they
@@ -528,7 +529,7 @@
                     component.markAsValid(durable);
                     component.deactivate();
                 } else {
-                    getLsmHarness().addBulkLoadedComponent(component);
+                    getHarness().addBulkLoadedComponent(component);
                 }
             }
         }
@@ -564,7 +565,7 @@
     @Override
     public ILSMIndexAccessor createAccessor(ISearchOperationCallback searchCallback, int targetIndexVersion)
             throws HyracksDataException {
-        return new LSMTreeIndexAccessor(getLsmHarness(), createOpContext(searchCallback, targetIndexVersion),
+        return new LSMTreeIndexAccessor(getHarness(), createOpContext(searchCallback, targetIndexVersion),
                 ctx -> new LSMBTreeWithBuddySearchCursor(ctx, buddyBTreeFields));
     }
 
@@ -609,7 +610,7 @@
                     componentFileRefrences.getDeleteIndexFileReference(),
                     componentFileRefrences.getBloomFilterFileReference(), false);
         }
-        ((ExternalIndexHarness) getLsmHarness()).addTransactionComponents(component);
+        ((ExternalIndexHarness) getHarness()).addTransactionComponents(component);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java
index d5cd2e2..85d4ab2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/ExternalBTreeWithBuddyOpContext.java
@@ -22,10 +22,12 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class ExternalBTreeWithBuddyOpContext extends AbstractLSMIndexOperationContext {
     private MultiComparator bTreeCmp;
@@ -33,11 +35,12 @@
     private final int targetIndexVersion;
     private LSMBTreeWithBuddyCursorInitialState searchInitialState;
 
-    public ExternalBTreeWithBuddyOpContext(IBinaryComparatorFactory[] btreeCmpFactories,
+    public ExternalBTreeWithBuddyOpContext(ILSMIndex index, IBinaryComparatorFactory[] btreeCmpFactories,
             IBinaryComparatorFactory[] buddyBtreeCmpFactories, ISearchOperationCallback searchCallback,
             int targetIndexVersion, ILSMHarness lsmHarness, ITreeIndexFrameFactory btreeInteriorFrameFactory,
-            ITreeIndexFrameFactory btreeLeafFrameFactory, ITreeIndexFrameFactory buddyBtreeLeafFrameFactory) {
-        super(null, null, null, searchCallback, null);
+            ITreeIndexFrameFactory btreeLeafFrameFactory, ITreeIndexFrameFactory buddyBtreeLeafFrameFactory,
+            ITracer tracer) {
+        super(index, null, null, null, searchCallback, null, tracer);
         this.targetIndexVersion = targetIndexVersion;
         this.bTreeCmp = MultiComparator.create(btreeCmpFactories);
         this.buddyBTreeCmp = MultiComparator.create(buddyBtreeCmpFactories);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
index 640e095..b4990d6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTree.java
@@ -35,9 +35,8 @@
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.common.api.IPageManager;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.btree.tuples.LSMBTreeTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.AbstractLSMWithBloomFilterDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
@@ -63,6 +62,7 @@
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFilterManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor.ICursorFactory;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -124,9 +124,10 @@
             ILSMDiskComponentFactory componentFactory, ILSMDiskComponentFactory bulkLoadComponentFactory,
             double bloomFilterFalsePositiveRate, IBinaryComparatorFactory[] cmpFactories, ILSMMergePolicy mergePolicy,
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
-            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean needKeyDupCheck, boolean durable) {
+            ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean needKeyDupCheck, boolean durable,
+            ITracer tracer) throws HyracksDataException {
         super(ioManager, bufferCache, fileManager, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler,
-                ioOpCallbackFactory, componentFactory, bulkLoadComponentFactory, durable);
+                ioOpCallbackFactory, componentFactory, bulkLoadComponentFactory, durable, tracer);
         this.insertLeafFrameFactory = insertLeafFrameFactory;
         this.deleteLeafFrameFactory = deleteLeafFrameFactory;
         this.cmpFactories = cmpFactories;
@@ -187,14 +188,14 @@
                     if (!lsmbtreeTuple.isAntimatter()) {
                         throw HyracksDataException.create(ErrorCode.DUPLICATE_KEY);
                     } else {
-                        memCursor.close();
+                        memCursor.destroy();
                         ctx.getCurrentMutableBTreeAccessor().upsertIfConditionElseInsert(tuple,
                                 AntimatterAwareTupleAcceptor.INSTANCE);
                         return true;
                     }
                 }
             } finally {
-                memCursor.close();
+                memCursor.destroy();
             }
 
             // TODO: Can we just remove the above code that search the mutable
@@ -212,7 +213,7 @@
                     throw HyracksDataException.create(ErrorCode.DUPLICATE_KEY);
                 }
             } finally {
-                searchCursor.close();
+                searchCursor.destroy();
                 // Add the current active mutable component back
                 ctx.getComponentHolder().add(0, firstComponent);
             }
@@ -247,8 +248,7 @@
     public ILSMDiskComponent doFlush(ILSMIOOperation operation) throws HyracksDataException {
         LSMBTreeFlushOperation flushOp = (LSMBTreeFlushOperation) operation;
         LSMBTreeMemoryComponent flushingComponent = (LSMBTreeMemoryComponent) flushOp.getFlushingComponent();
-        IIndexAccessor accessor = flushingComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                NoOpOperationCallback.INSTANCE);
+        IIndexAccessor accessor = flushingComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
         RangePredicate nullPred = new RangePredicate(null, null, true, true, null, null);
         long numElements = 0L;
@@ -263,7 +263,7 @@
                     numElements = IntegerPointable.getInteger(countTuple.getFieldData(0), countTuple.getFieldStart(0));
                 }
             } finally {
-                countingCursor.close();
+                countingCursor.destroy();
             }
         }
 
@@ -286,7 +286,7 @@
                 componentBulkLoader.add(scanCursor.getTuple());
             }
         } finally {
-            scanCursor.close();
+            scanCursor.destroy();
         }
 
         if (component.getLSMComponentFilter() != null) {
@@ -336,7 +336,7 @@
                 componentBulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
         if (mergedComponent.getLSMComponentFilter() != null) {
             List<ITupleReference> filterTuples = new ArrayList<>();
@@ -365,19 +365,18 @@
             ISearchOperationCallback searchCallback) {
         int numBloomFilterKeyFields = hasBloomFilter
                 ? ((LSMBTreeWithBloomFilterDiskComponentFactory) componentFactory).getBloomFilterKeyFields().length : 0;
-        return new LSMBTreeOpContext(memoryComponents, insertLeafFrameFactory, deleteLeafFrameFactory,
+        return new LSMBTreeOpContext(this, memoryComponents, insertLeafFrameFactory, deleteLeafFrameFactory,
                 modificationCallback, searchCallback, numBloomFilterKeyFields, getTreeFields(), getFilterFields(),
-                getLsmHarness(), getFilterCmpFactories());
+                getHarness(), getFilterCmpFactories(), tracer);
     }
 
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        return createAccessor(createOpContext(modificationCallback, searchCallback));
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) {
+        return createAccessor(createOpContext(iap.getModificationCallback(), iap.getSearchOperationCallback()));
     }
 
     public ILSMIndexAccessor createAccessor(AbstractLSMIndexOperationContext opCtx) {
-        return new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+        return new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
     }
 
     @Override
@@ -441,7 +440,7 @@
         if (mergingComponents.get(mergingComponents.size() - 1) != diskComponents.get(diskComponents.size() - 1)) {
             returnDeletedTuples = true;
         }
-        ITreeIndexCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, returnDeletedTuples);
+        LSMBTreeRangeSearchCursor cursor = new LSMBTreeRangeSearchCursor(opCtx, returnDeletedTuples);
         return new LSMBTreeMergeOperation(accessor, cursor, mergeFileRefs.getInsertIndexFileReference(),
                 mergeFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
index a8e707f..0fc79eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponent.java
@@ -22,27 +22,27 @@
 import java.util.Set;
 
 import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
 
-public class LSMBTreeDiskComponent extends AbstractLSMDiskComponent implements ILSMDiskComponent {
-    protected final BTree btree;
+public class LSMBTreeDiskComponent extends AbstractLSMDiskComponent {
+    protected final DiskBTree btree;
 
-    public LSMBTreeDiskComponent(AbstractLSMIndex lsmIndex, BTree btree, ILSMComponentFilter filter) {
+    public LSMBTreeDiskComponent(AbstractLSMIndex lsmIndex, DiskBTree btree, ILSMComponentFilter filter) {
         super(lsmIndex, getMetadataPageManager(btree), filter);
         this.btree = btree;
     }
 
     @Override
-    public BTree getIndex() {
+    public DiskBTree getIndex() {
         return btree;
     }
 
     @Override
-    public BTree getMetadataHolder() {
+    public DiskBTree getMetadataHolder() {
         return btree;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentFactory.java
index 0e54f53..3b332cd 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentFactory.java
@@ -20,7 +20,7 @@
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
@@ -28,10 +28,10 @@
 import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
 
 public class LSMBTreeDiskComponentFactory implements ILSMDiskComponentFactory {
-    protected final TreeIndexFactory<BTree> btreeFactory;
+    protected final TreeIndexFactory<DiskBTree> btreeFactory;
     protected final IComponentFilterHelper filterHelper;
 
-    public LSMBTreeDiskComponentFactory(TreeIndexFactory<BTree> btreeFactory, IComponentFilterHelper filterHelper) {
+    public LSMBTreeDiskComponentFactory(TreeIndexFactory<DiskBTree> btreeFactory, IComponentFilterHelper filterHelper) {
         this.btreeFactory = btreeFactory;
         this.filterHelper = filterHelper;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
index 02e481c..a789ddd 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeDiskComponentScanCursor.java
@@ -26,11 +26,9 @@
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
-import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.btree.tuples.LSMBTreeTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
@@ -74,11 +72,9 @@
         btreeAccessors = new BTreeAccessor[numBTrees];
         for (int i = 0; i < numBTrees; i++) {
             ILSMComponent component = operationalComponents.get(i);
-            IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getLeafFrameFactory().createFrame();
-            rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
             BTree btree = (BTree) component.getIndex();
-
-            btreeAccessors[i] = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            rangeCursors[i] = btreeAccessors[i].createSearchCursor(false);
             btreeAccessors[i].search(rangeCursors[i], searchPred);
         }
 
@@ -176,11 +172,11 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (lsmHarness != null) {
             try {
                 for (int i = 0; i < rangeCursors.length; i++) {
-                    rangeCursors[i].close();
+                    rangeCursors[i].destroy();
                 }
                 rangeCursors = null;
             } finally {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
index e3424e5..7acc59f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeFlushOperation.java
@@ -22,6 +22,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.FlushOperation;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 
 public class LSMBTreeFlushOperation extends FlushOperation {
     private final FileReference bloomFilterFlushTarget;
@@ -35,4 +36,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterFlushTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, null, bloomFilterFlushTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
index ec96303..3aef4c2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeMergeOperation.java
@@ -20,16 +20,17 @@
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
 import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
+import org.apache.hyracks.storage.common.IIndexCursor;
 
 public class LSMBTreeMergeOperation extends MergeOperation {
 
     private final FileReference bloomFilterMergeTarget;
 
-    public LSMBTreeMergeOperation(ILSMIndexAccessor accessor, ITreeIndexCursor cursor, FileReference target,
+    public LSMBTreeMergeOperation(ILSMIndexAccessor accessor, IIndexCursor cursor, FileReference target,
             FileReference bloomFilterMergeTarget, ILSMIOOperationCallback callback, String indexIdentifier) {
         super(accessor, target, callback, indexIdentifier, cursor);
         this.bloomFilterMergeTarget = bloomFilterMergeTarget;
@@ -38,4 +39,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterMergeTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, null, bloomFilterMergeTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
index 08ba7af..9cab94e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeOpContext.java
@@ -28,14 +28,18 @@
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
 
 public final class LSMBTreeOpContext extends AbstractLSMIndexOperationContext {
 
@@ -60,11 +64,12 @@
     private BTree.BTreeAccessor currentMutableBTreeAccessor;
     private BTreeOpContext currentMutableBTreeOpCtx;
 
-    public LSMBTreeOpContext(List<ILSMMemoryComponent> mutableComponents, ITreeIndexFrameFactory insertLeafFrameFactory,
-            ITreeIndexFrameFactory deleteLeafFrameFactory, IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback, int numBloomFilterKeyFields, int[] btreeFields, int[] filterFields,
-            ILSMHarness lsmHarness, IBinaryComparatorFactory[] filterCmpFactories) {
-        super(btreeFields, filterFields, filterCmpFactories, searchCallback, modificationCallback);
+    public LSMBTreeOpContext(ILSMIndex index, List<ILSMMemoryComponent> mutableComponents,
+            ITreeIndexFrameFactory insertLeafFrameFactory, ITreeIndexFrameFactory deleteLeafFrameFactory,
+            IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback,
+            int numBloomFilterKeyFields, int[] btreeFields, int[] filterFields, ILSMHarness lsmHarness,
+            IBinaryComparatorFactory[] filterCmpFactories, ITracer tracer) {
+        super(index, btreeFields, filterFields, filterCmpFactories, searchCallback, modificationCallback, tracer);
         LSMBTreeMemoryComponent c = (LSMBTreeMemoryComponent) mutableComponents.get(0);
         IBinaryComparatorFactory cmpFactories[] = c.getIndex().getComparatorFactories();
         if (cmpFactories[0] != null) {
@@ -86,9 +91,9 @@
                 mutableBTreeAccessors[i] = mutableBTrees[i].createAccessor(modificationCallback,
                         NoOpOperationCallback.INSTANCE, allFields);
             } else {
-
-                mutableBTreeAccessors[i] =
-                        mutableBTrees[i].createAccessor(modificationCallback, NoOpOperationCallback.INSTANCE);
+                IIndexAccessParameters iap =
+                        new IndexAccessParameters(modificationCallback, NoOpOperationCallback.INSTANCE);
+                mutableBTreeAccessors[i] = mutableBTrees[i].createAccessor(iap);
             }
             mutableBTreeOpCtxs[i] = mutableBTreeAccessors[i].getOpContext();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
index 24a78a6..0c39a11 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreePointSearchCursor.java
@@ -24,12 +24,12 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter;
-import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
-import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
@@ -38,13 +38,13 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMTreeTupleReference;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public class LSMBTreePointSearchCursor implements ITreeIndexCursor {
+public class LSMBTreePointSearchCursor implements ILSMIndexCursor {
 
-    private BTreeRangeSearchCursor[] rangeCursors;
+    private ITreeIndexCursor[] btreeCursors;
     private final ILSMIndexOperationContext opCtx;
     private ISearchOperationCallback searchCallback;
     private RangePredicate predicate;
@@ -77,21 +77,21 @@
             if (bloomFilters[i] != null && !bloomFilters[i].contains(predicate.getLowKey(), hashes)) {
                 continue;
             }
-            btreeAccessors[i].search(rangeCursors[i], predicate);
-            if (rangeCursors[i].hasNext()) {
-                rangeCursors[i].next();
+            btreeAccessors[i].search(btreeCursors[i], predicate);
+            if (btreeCursors[i].hasNext()) {
+                btreeCursors[i].next();
                 // We use the predicate's to lock the key instead of the tuple that we get from cursor
                 // to avoid copying the tuple when we do the "unlatch dance".
                 if (reconciled || searchCallback.proceed(predicate.getLowKey())) {
                     // if proceed is successful, then there's no need for doing the "unlatch dance"
-                    if (((ILSMTreeTupleReference) rangeCursors[i].getTuple()).isAntimatter()) {
+                    if (((ILSMTreeTupleReference) btreeCursors[i].getTuple()).isAntimatter()) {
                         if (reconciled) {
                             searchCallback.cancel(predicate.getLowKey());
                         }
-                        rangeCursors[i].close();
+                        btreeCursors[i].destroy();
                         return false;
                     } else {
-                        frameTuple = rangeCursors[i].getTuple();
+                        frameTuple = btreeCursors[i].getTuple();
                         foundTuple = true;
                         foundIn = i;
                         return true;
@@ -99,20 +99,20 @@
                 }
                 if (i == 0 && includeMutableComponent) {
                     // unlatch/unpin
-                    rangeCursors[i].reset();
+                    btreeCursors[i].close();
                     searchCallback.reconcile(predicate.getLowKey());
                     reconciled = true;
 
                     // retraverse
-                    btreeAccessors[0].search(rangeCursors[i], predicate);
-                    if (rangeCursors[i].hasNext()) {
-                        rangeCursors[i].next();
-                        if (((ILSMTreeTupleReference) rangeCursors[i].getTuple()).isAntimatter()) {
+                    btreeAccessors[0].search(btreeCursors[i], predicate);
+                    if (btreeCursors[i].hasNext()) {
+                        btreeCursors[i].next();
+                        if (((ILSMTreeTupleReference) btreeCursors[i].getTuple()).isAntimatter()) {
                             searchCallback.cancel(predicate.getLowKey());
-                            rangeCursors[i].close();
+                            btreeCursors[i].destroy();
                             return false;
                         } else {
-                            frameTuple = rangeCursors[i].getTuple();
+                            frameTuple = btreeCursors[i].getTuple();
                             foundTuple = true;
                             searchCallback.complete(predicate.getLowKey());
                             foundIn = i;
@@ -120,10 +120,10 @@
                         }
                     } else {
                         searchCallback.cancel(predicate.getLowKey());
-                        rangeCursors[i].close();
+                        btreeCursors[i].destroy();
                     }
                 } else {
-                    frameTuple = rangeCursors[i].getTuple();
+                    frameTuple = btreeCursors[i].getTuple();
                     searchCallback.reconcile(frameTuple);
                     searchCallback.complete(frameTuple);
                     foundTuple = true;
@@ -131,18 +131,18 @@
                     return true;
                 }
             } else {
-                rangeCursors[i].close();
+                btreeCursors[i].destroy();
             }
         }
         return false;
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         try {
-            if (rangeCursors != null) {
-                for (int i = 0; i < rangeCursors.length; ++i) {
-                    rangeCursors[i].reset();
+            if (btreeCursors != null) {
+                for (int i = 0; i < numBTrees; ++i) {
+                    btreeCursors[i].close();
                 }
             }
             nextHasBeenCalled = false;
@@ -162,9 +162,9 @@
         searchCallback = lsmInitialState.getSearchOperationCallback();
         predicate = (RangePredicate) lsmInitialState.getSearchPredicate();
         numBTrees = operationalComponents.size();
-        if (rangeCursors == null || rangeCursors.length != numBTrees) {
+        if (btreeCursors == null || btreeCursors.length != numBTrees) {
             // object creation: should be relatively low
-            rangeCursors = new BTreeRangeSearchCursor[numBTrees];
+            btreeCursors = new ITreeIndexCursor[numBTrees];
             btreeAccessors = new BTreeAccessor[numBTrees];
             bloomFilters = new BloomFilter[numBTrees];
         }
@@ -172,38 +172,21 @@
 
         for (int i = 0; i < numBTrees; i++) {
             ILSMComponent component = operationalComponents.get(i);
-            BTree btree;
+            BTree btree = (BTree) component.getIndex();
             if (component.getType() == LSMComponentType.MEMORY) {
                 includeMutableComponent = true;
-                if (rangeCursors[i] == null) {
-                    // create a new one
-                    IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getLeafFrameFactory().createFrame();
-                    rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
-                } else {
-                    // reset
-                    rangeCursors[i].reset();
-                }
-                btree = ((LSMBTreeMemoryComponent) component).getIndex();
-                // no bloom filter for in-memory BTree
                 bloomFilters[i] = null;
             } else {
-                if (rangeCursors[i] != null) {
-                    // can re-use cursor
-                    rangeCursors[i].reset();
-                } else {
-                    // create new cursor <should be relatively rare>
-                    IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getLeafFrameFactory().createFrame();
-                    rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
-                }
-                btree = ((LSMBTreeWithBloomFilterDiskComponent) component).getIndex();
                 bloomFilters[i] = ((LSMBTreeWithBloomFilterDiskComponent) component).getBloomFilter();
             }
+
             if (btreeAccessors[i] == null) {
-                btreeAccessors[i] =
-                        btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                btreeCursors[i] = btreeAccessors[i].createPointCursor(false);
             } else {
                 // re-use
                 btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                btreeCursors[i].close();
             }
         }
         nextHasBeenCalled = false;
@@ -216,11 +199,11 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (lsmHarness != null) {
             try {
                 closeCursors();
-                rangeCursors = null;
+                btreeCursors = null;
             } finally {
                 lsmHarness.endSearch(opCtx);
             }
@@ -253,26 +236,11 @@
         return null;
     }
 
-    @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-        // do nothing
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-        // do nothing
-    }
-
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return false;
-    }
-
     private void closeCursors() throws HyracksDataException {
-        if (rangeCursors != null) {
-            for (int i = 0; i < rangeCursors.length; ++i) {
-                if (rangeCursors[i] != null) {
-                    rangeCursors[i].close();
+        if (btreeCursors != null) {
+            for (int i = 0; i < numBTrees; ++i) {
+                if (btreeCursors[i] != null) {
+                    btreeCursors[i].destroy();
                 }
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
index 7f93b62..1e401a2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeRangeSearchCursor.java
@@ -26,15 +26,16 @@
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
-import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
-import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
+import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexSearchCursor;
 import org.apache.hyracks.storage.common.ICursorInitialState;
 import org.apache.hyracks.storage.common.IIndexCursor;
@@ -46,10 +47,11 @@
     private final RangePredicate reusablePred;
 
     private ISearchOperationCallback searchCallback;
-    private RangePredicate predicate;
+
     private BTreeAccessor[] btreeAccessors;
     private ArrayTupleBuilder tupleBuilder;
     private boolean canCallProceed = true;
+    private int tupleFromMemoryComponentCount = 0;
 
     public LSMBTreeRangeSearchCursor(ILSMIndexOperationContext opCtx) {
         this(opCtx, false);
@@ -62,8 +64,8 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
-        super.reset();
+    public void close() throws HyracksDataException {
+        super.close();
         canCallProceed = true;
     }
 
@@ -72,6 +74,9 @@
         outputElement = outputPriorityQueue.poll();
         needPushElementIntoQueue = true;
         canCallProceed = false;
+        if (outputElement.getCursorIndex() == 0) {
+            tupleFromMemoryComponentCount++;
+        }
     }
 
     /**
@@ -86,56 +91,58 @@
      */
     @Override
     protected void checkPriorityQueue() throws HyracksDataException {
+        // Every SWITCH_COMPONENT_CYCLE calls, check if memory components need to be swapped with disk components
+        // We should do this regardless of the value of includeMutableComponent. This is because if the cursor
+        // of the memory component has gone past the end of the in memory component, then the includeMutableComponent
+        // will be set to false. Still, when that happens, we want to exit the memory component to allow it to be
+        // recycled and used for modifications.
+        if (hasNextCallCount >= SWITCH_COMPONENT_CYCLE) {
+            replaceMemoryComponentWithDiskComponentIfNeeded();
+            hasNextCallCount = 0;
+        }
         while (!outputPriorityQueue.isEmpty() || needPushElementIntoQueue) {
             if (!outputPriorityQueue.isEmpty()) {
                 PriorityQueueElement queueHead = outputPriorityQueue.peek();
-                if (canCallProceed) {
-                    // if there are no memory components. no need to lock at all
-                    // since whatever the search reads will never changes
-                    if (includeMutableComponent) {
-                        if (!searchCallback.proceed(queueHead.getTuple())) {
-                            // In case proceed() fails and there is an in-memory component,
-                            // we can't simply use this element since there might be a change.
-                            PriorityQueueElement mutableElement = removeMutable(outputPriorityQueue);
-                            if (mutableElement != null) {
-                                // Copies the current queue head
-                                if (tupleBuilder == null) {
-                                    tupleBuilder = new ArrayTupleBuilder(cmp.getKeyFieldCount());
-                                }
-                                TupleUtils.copyTuple(tupleBuilder, queueHead.getTuple(), cmp.getKeyFieldCount());
-                                copyTuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
-                                // Unlatches/unpins the leaf page of the index.
-                                rangeCursors[0].reset();
-                                // Reconcile.
-                                searchCallback.reconcile(copyTuple);
-                                // Re-traverses the index.
-                                reusablePred.setLowKey(copyTuple, true);
-                                btreeAccessors[0].search(rangeCursors[0], reusablePred);
-                                //------
-                                includeMutableComponent = pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
-                                // now that we have completed the search and we have latches over the pages,
-                                // it is safe to complete the operation.. but as per the API of the callback
-                                // we only complete if we're producing this tuple
-                                // get head again
-                                queueHead = outputPriorityQueue.peek();
-                                /*
-                                 * We need to restart in one of two cases:
-                                 * 1. no more elements in the priority queue.
-                                 * 2. the key of the head has changed (which means we need to call proceed)
-                                 */
-                                if (queueHead == null || cmp.compare(copyTuple, queueHead.getTuple()) != 0) {
-                                    // cancel since we're not continuing
-                                    searchCallback.cancel(copyTuple);
-                                    continue;
-                                }
-                                searchCallback.complete(copyTuple);
-                                // it is safe to proceed now
-                            } else {
-                                // There are no more elements in the memory component.. can safely skip locking for the
-                                // remaining operations
-                                includeMutableComponent = false;
-                            }
+                if (canCallProceed && includeMutableComponent && !searchCallback.proceed(queueHead.getTuple())) {
+                    // In case proceed() fails and there is an in-memory component,
+                    // we can't simply use this element since there might be a change.
+                    PriorityQueueElement mutableElement = remove(outputPriorityQueue, 0);
+                    if (mutableElement != null) {
+                        // Copies the current queue head
+                        if (tupleBuilder == null) {
+                            tupleBuilder = new ArrayTupleBuilder(cmp.getKeyFieldCount());
                         }
+                        TupleUtils.copyTuple(tupleBuilder, queueHead.getTuple(), cmp.getKeyFieldCount());
+                        copyTuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+                        // Unlatches/unpins the leaf page of the index.
+                        rangeCursors[0].close();
+                        // Reconcile.
+                        searchCallback.reconcile(copyTuple);
+                        // Re-traverses the index.
+                        reusablePred.setLowKey(copyTuple, true);
+                        btreeAccessors[0].search(rangeCursors[0], reusablePred);
+                        pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
+                        // now that we have completed the search and we have latches over the pages,
+                        // it is safe to complete the operation.. but as per the API of the callback
+                        // we only complete if we're producing this tuple
+                        // get head again
+                        queueHead = outputPriorityQueue.peek();
+                        /*
+                         * We need to restart in one of two cases:
+                         * 1. no more elements in the priority queue.
+                         * 2. the key of the head has changed (which means we need to call proceed)
+                         */
+                        if (queueHead == null || cmp.compare(copyTuple, queueHead.getTuple()) != 0) {
+                            // cancel since we're not continuing
+                            searchCallback.cancel(copyTuple);
+                            continue;
+                        }
+                        searchCallback.complete(copyTuple);
+                        // it is safe to proceed now
+                    } else {
+                        // There are no more elements in the memory component.. can safely skip locking for the
+                        // remaining operations
+                        includeMutableComponent = false;
                     }
                 }
 
@@ -165,10 +172,7 @@
                     } else {
                         // If the previous tuple and the head tuple are different
                         // the info of previous tuple is useless
-                        if (needPushElementIntoQueue == true) {
-                            pushIntoQueueFromCursorAndReplaceThisElement(outputElement);
-                            needPushElementIntoQueue = false;
-                        }
+                        pushOutputElementIntoQueueIfNeeded();
                         canCallProceed = true;
                         outputElement = null;
                     }
@@ -184,16 +188,130 @@
 
     }
 
-    private PriorityQueueElement removeMutable(PriorityQueue<PriorityQueueElement> outputPriorityQueue) {
-        // Scans the PQ for the mutable component's element and delete it
-        // since it can be changed.
-        // (i.e. we can't ensure that the element is the most current one.)
+    private void pushOutputElementIntoQueueIfNeeded() throws HyracksDataException {
+        if (needPushElementIntoQueue) {
+            pushIntoQueueFromCursorAndReplaceThisElement(outputElement);
+            needPushElementIntoQueue = false;
+        }
+    }
+
+    private void replaceMemoryComponentWithDiskComponentIfNeeded() throws HyracksDataException {
+        int replaceFrom = replaceFrom();
+        if (replaceFrom < 0) {
+            // no switch is needed, check if we need to re-do the search on the memory component.
+            // searches and modifications compete on the pages of the memory component
+            // if the cursor on the memory component is not advancing, we re-do the operation in order
+            // to release the latches and allow modifications to proceed
+            redoMemoryComponentSearchIfNeeded();
+            return;
+        }
+        opCtx.getIndex().getHarness().replaceMemoryComponentsWithDiskComponents(getOpCtx(), replaceFrom);
+        // redo the search on the new component
+        for (int i = replaceFrom; i < switchRequest.length; i++) {
+            if (switchRequest[i]) {
+                ILSMComponent component = operationalComponents.get(i);
+                BTree btree = (BTree) component.getIndex();
+                if (i == 0 && component.getType() != LSMComponentType.MEMORY) {
+                    includeMutableComponent = false;
+                }
+                if (switchedElements[i] != null) {
+                    copyTuple.reset(switchComponentTupleBuilders[i].getFieldEndOffsets(),
+                            switchComponentTupleBuilders[i].getByteArray());
+                    reusablePred.setLowKey(copyTuple, true);
+                    rangeCursors[i].close();
+                    btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                    btreeAccessors[i].search(rangeCursors[i], reusablePred);
+                    pushIntoQueueFromCursorAndReplaceThisElement(switchedElements[i]);
+                }
+            }
+            switchRequest[i] = false;
+            // any failed switch makes further switches pointless
+            switchPossible = switchPossible && operationalComponents.get(i).getType() == LSMComponentType.DISK;
+        }
+    }
+
+    private int replaceFrom() throws HyracksDataException {
+        int replaceFrom = -1;
+        if (!switchPossible) {
+            return replaceFrom;
+        }
+        for (int i = 0; i < operationalComponents.size(); i++) {
+            ILSMComponent next = operationalComponents.get(i);
+            if (next.getType() == LSMComponentType.DISK) {
+                if (i == 0) {
+                    // if the first component is a disk component, then switch is not possible
+                    switchPossible = false;
+                }
+                break;
+            } else if (next.getState() == ComponentState.UNREADABLE_UNWRITABLE) {
+                // if the component is UNREADABLE_UNWRITABLE, then it means that the flush has been completed while
+                // the search cursor is inside the component, a switch candidate
+                if (replaceFrom < 0) {
+                    replaceFrom = i;
+                }
+                // we return the outputElement to the priority queue if it came from this component
+                if (outputElement != null && outputElement.getCursorIndex() == i) {
+                    pushIntoQueueFromCursorAndReplaceThisElement(outputElement);
+                    needPushElementIntoQueue = false;
+                    outputElement = null;
+                    canCallProceed = true;
+                }
+                PriorityQueueElement element = remove(outputPriorityQueue, i);
+                // if this cursor is still active (has an element)
+                // then we copy the search key to restart the operation after
+                // replacing the component
+                if (element != null) {
+                    if (switchComponentTupleBuilders[i] == null) {
+                        switchComponentTupleBuilders[i] = new ArrayTupleBuilder(cmp.getKeyFieldCount());
+                    }
+                    TupleUtils.copyTuple(switchComponentTupleBuilders[i], element.getTuple(), cmp.getKeyFieldCount());
+                }
+                rangeCursors[i].close();
+                rangeCursors[i].destroy();
+                switchRequest[i] = true;
+                switchedElements[i] = element;
+            }
+        }
+        return replaceFrom;
+    }
+
+    private void redoMemoryComponentSearchIfNeeded() throws HyracksDataException {
+        if (!includeMutableComponent) {
+            return;
+        }
+        // if the last n records, none were from memory and there are writers inside the component,
+        // we need to re-do the search so the cursor doesn't block modifications due to latches over page
+        if (tupleFromMemoryComponentCount == 0
+                && ((AbstractLSMMemoryComponent) operationalComponents.get(0)).getWriterCount() > 0) {
+            // When we reach here, we know that the mutable component element is not the outputElement
+            // since if it was the output element, the tupleFromMemoryComponentCount would be at least 1
+            PriorityQueueElement mutableElement = remove(outputPriorityQueue, 0);
+            if (mutableElement != null) {
+                // if the element is null, then there is nothing to do since no latches are held
+                if (tupleBuilder == null) {
+                    tupleBuilder = new ArrayTupleBuilder(cmp.getKeyFieldCount());
+                }
+                TupleUtils.copyTuple(tupleBuilder, mutableElement.getTuple(), cmp.getKeyFieldCount());
+                copyTuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+                // Unlatches/unpins the leaf page of the index.
+                rangeCursors[0].close();
+                // Re-traverses the index.
+                reusablePred.setLowKey(copyTuple, true);
+                btreeAccessors[0].search(rangeCursors[0], reusablePred);
+                pushIntoQueueFromCursorAndReplaceThisElement(mutableElement);
+            }
+        }
+        tupleFromMemoryComponentCount = 0;
+    }
+
+    private PriorityQueueElement remove(PriorityQueue<PriorityQueueElement> outputPriorityQueue, int cursorIndex) {
+        // Scans the PQ for the component's element and delete it
         Iterator<PriorityQueueElement> it = outputPriorityQueue.iterator();
         while (it.hasNext()) {
-            PriorityQueueElement mutableElement = it.next();
-            if (mutableElement.getCursorIndex() == 0) {
+            PriorityQueueElement e = it.next();
+            if (e.getCursorIndex() == cursorIndex) {
                 it.remove();
-                return mutableElement;
+                return e;
             }
         }
         return null;
@@ -206,7 +324,7 @@
         operationalComponents = lsmInitialState.getOperationalComponents();
         lsmHarness = lsmInitialState.getLSMHarness();
         searchCallback = lsmInitialState.getSearchOperationCallback();
-        predicate = (RangePredicate) lsmInitialState.getSearchPredicate();
+        RangePredicate predicate = (RangePredicate) lsmInitialState.getSearchPredicate();
         reusablePred.setLowKeyComparator(cmp);
         reusablePred.setHighKey(predicate.getHighKey(), predicate.isHighKeyInclusive());
         reusablePred.setHighKeyComparator(predicate.getHighKeyComparator());
@@ -218,33 +336,25 @@
             rangeCursors = new IIndexCursor[numBTrees];
             btreeAccessors = new BTreeAccessor[numBTrees];
         }
+
         for (int i = 0; i < numBTrees; i++) {
             ILSMComponent component = operationalComponents.get(i);
             BTree btree;
-            if (rangeCursors[i] == null) {
-                // create, should be relatively rare
-                IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getLeafFrameFactory().createFrame();
-                rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
-            } else {
-                // re-use
-                rangeCursors[i].reset();
-            }
             if (component.getType() == LSMComponentType.MEMORY) {
                 includeMutableComponent = true;
-                btree = (BTree) component.getIndex();
-            } else {
-                btree = (BTree) component.getIndex();
             }
-
+            btree = (BTree) component.getIndex();
             if (btreeAccessors[i] == null) {
-                btreeAccessors[i] =
-                        btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                rangeCursors[i] = btreeAccessors[i].createSearchCursor(false);
             } else {
                 // re-use
                 btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                rangeCursors[i].close();
             }
             btreeAccessors[i].search(rangeCursors[i], searchPred);
         }
+
         setPriorityQueueComparator();
         initPriorityQueue();
         canCallProceed = true;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
index fef8afe..0ceaf7b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeSearchCursor.java
@@ -22,13 +22,13 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public class LSMBTreeSearchCursor implements ITreeIndexCursor {
+public class LSMBTreeSearchCursor implements ILSMIndexCursor {
 
     public enum LSMBTreeSearchType {
         POINT,
@@ -38,7 +38,7 @@
     private final LSMBTreePointSearchCursor pointCursor;
     private final LSMBTreeRangeSearchCursor rangeCursor;
     private final LSMBTreeDiskComponentScanCursor scanCursor;
-    private ITreeIndexCursor currentCursor;
+    private ILSMIndexCursor currentCursor;
 
     public LSMBTreeSearchCursor(ILSMIndexOperationContext opCtx) {
         pointCursor = new LSMBTreePointSearchCursor(opCtx);
@@ -72,17 +72,17 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (currentCursor != null) {
-            currentCursor.close();
+            currentCursor.destroy();
         }
         currentCursor = null;
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         if (currentCursor != null) {
-            currentCursor.reset();
+            currentCursor.close();
         }
         currentCursor = null;
     }
@@ -101,21 +101,4 @@
     public ITupleReference getFilterMaxTuple() {
         return currentCursor.getFilterMaxTuple();
     }
-
-    @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-        currentCursor.setBufferCache(bufferCache);
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-        currentCursor.setFileId(fileId);
-
-    }
-
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return currentCursor.isExclusiveLatchNodes();
-    }
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBloomFilterDiskComponentFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBloomFilterDiskComponentFactory.java
index 09e83cc..eaf9cd5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBloomFilterDiskComponentFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBloomFilterDiskComponentFactory.java
@@ -20,7 +20,7 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilterFactory;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndex;
@@ -28,11 +28,11 @@
 import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
 
 public class LSMBTreeWithBloomFilterDiskComponentFactory implements ILSMDiskComponentFactory {
-    protected final TreeIndexFactory<BTree> btreeFactory;
+    protected final TreeIndexFactory<DiskBTree> btreeFactory;
     protected final IComponentFilterHelper filterHelper;
     protected final BloomFilterFactory bloomFilterFactory;
 
-    public LSMBTreeWithBloomFilterDiskComponentFactory(TreeIndexFactory<BTree> btreeFactory,
+    public LSMBTreeWithBloomFilterDiskComponentFactory(TreeIndexFactory<DiskBTree> btreeFactory,
             BloomFilterFactory bloomFilterFactory, IComponentFilterHelper filterHelper) {
         this.btreeFactory = btreeFactory;
         this.filterHelper = filterHelper;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java
index 2d2d184..b37fb20 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyAbstractCursor.java
@@ -28,18 +28,20 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public abstract class LSMBTreeWithBuddyAbstractCursor implements ITreeIndexCursor {
+public abstract class LSMBTreeWithBuddyAbstractCursor implements ILSMIndexCursor {
 
     protected boolean open;
     protected BTreeRangeSearchCursor[] btreeCursors;
@@ -106,7 +108,7 @@
                     buddyBtreeCursors[i] = new BTreeRangeSearchCursor(
                             (IBTreeLeafFrame) lsmInitialState.getBuddyBTreeLeafFrameFactory().createFrame(), false);
                 } else {
-                    buddyBtreeCursors[i].reset();
+                    buddyBtreeCursors[i].close();
                 }
                 btree = ((LSMBTreeWithBuddyMemoryComponent) component).getIndex();
                 buddyBtree = ((LSMBTreeWithBuddyMemoryComponent) component).getBuddyIndex();
@@ -116,7 +118,7 @@
                     buddyBtreeCursors[i] = new BTreeRangeSearchCursor(
                             (IBTreeLeafFrame) lsmInitialState.getBuddyBTreeLeafFrameFactory().createFrame(), false);
                 } else {
-                    buddyBtreeCursors[i].reset();
+                    buddyBtreeCursors[i].close();
                 }
                 btree = ((LSMBTreeWithBuddyDiskComponent) component).getIndex();
                 buddyBtree = ((LSMBTreeWithBuddyDiskComponent) component).getBuddyIndex();
@@ -125,12 +127,10 @@
             IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame();
             if (btreeAccessors[i] == null) {
                 btreeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
-                btreeAccessors[i] =
-                        btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-                buddyBtreeAccessors[i] =
-                        buddyBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                buddyBtreeAccessors[i] = buddyBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             } else {
-                btreeCursors[i].reset();
+                btreeCursors[i].close();
                 btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
                 buddyBtreeAccessors[i].reset(buddyBtree, NoOpOperationCallback.INSTANCE,
                         NoOpOperationCallback.INSTANCE);
@@ -142,15 +142,15 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (!open) {
             return;
         }
         try {
             if (btreeCursors != null && buddyBtreeCursors != null) {
                 for (int i = 0; i < numberOfTrees; i++) {
-                    btreeCursors[i].close();
-                    buddyBtreeCursors[i].close();
+                    btreeCursors[i].destroy();
+                    buddyBtreeCursors[i].destroy();
                 }
             }
             btreeCursors = null;
@@ -166,20 +166,4 @@
     public ITupleReference getTuple() {
         return frameTuple;
     }
-
-    @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-        // Do nothing
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-        // Do nothing
-    }
-
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return false;
-    }
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
index f682bde..dd4fcf5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddyMergeOperation.java
@@ -19,10 +19,11 @@
 package org.apache.hyracks.storage.am.lsm.btree.impls;
 
 import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
+import org.apache.hyracks.storage.common.IIndexCursor;
 
 public class LSMBTreeWithBuddyMergeOperation extends MergeOperation {
 
@@ -30,7 +31,7 @@
     private final FileReference bloomFilterMergeTarget;
     private final boolean keepDeletedTuples;
 
-    public LSMBTreeWithBuddyMergeOperation(ILSMIndexAccessor accessor, ITreeIndexCursor cursor, FileReference target,
+    public LSMBTreeWithBuddyMergeOperation(ILSMIndexAccessor accessor, IIndexCursor cursor, FileReference target,
             FileReference buddyBtreeMergeTarget, FileReference bloomFilterMergeTarget, ILSMIOOperationCallback callback,
             String indexIdentifier, boolean keepDeletedTuples) {
         super(accessor, target, callback, indexIdentifier, cursor);
@@ -51,4 +52,8 @@
         return keepDeletedTuples;
     }
 
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, buddyBtreeMergeTarget, bloomFilterMergeTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
index 503182a..c7f5cea 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySearchCursor.java
@@ -37,13 +37,13 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
-        super.close();
+    public void destroy() throws HyracksDataException {
+        super.destroy();
         currentCursor = 0;
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         if (!open) {
             return;
         }
@@ -52,8 +52,8 @@
         foundNext = false;
         try {
             for (int i = 0; i < numberOfTrees; i++) {
-                btreeCursors[i].close();
-                buddyBtreeCursors[i].close();
+                btreeCursors[i].destroy();
+                buddyBtreeCursors[i].destroy();
             }
             btreeCursors = null;
             buddyBtreeCursors = null;
@@ -64,7 +64,7 @@
 
     private void searchNextCursor() throws HyracksDataException {
         if (currentCursor < numberOfTrees) {
-            btreeCursors[currentCursor].reset();
+            btreeCursors[currentCursor].close();
             btreeAccessors[currentCursor].search(btreeCursors[currentCursor], btreeRangePredicate);
         }
     }
@@ -85,7 +85,7 @@
                             && !buddyBtreeBloomFilters[i].contains(buddyBTreeTuple, hashes)) {
                         continue;
                     }
-                    buddyBtreeCursors[i].reset();
+                    buddyBtreeCursors[i].close();
                     buddyBtreeRangePredicate.setHighKey(buddyBTreeTuple, true);
                     buddyBtreeRangePredicate.setLowKey(buddyBTreeTuple, true);
                     buddyBtreeAccessors[i].search(buddyBtreeCursors[i], buddyBtreeRangePredicate);
@@ -94,7 +94,7 @@
                             killerTupleFound = true;
                         }
                     } finally {
-                        buddyBtreeCursors[i].close();
+                        buddyBtreeCursors[i].destroy();
                     }
                 }
                 if (!killerTupleFound) {
@@ -103,7 +103,7 @@
                     return true;
                 }
             }
-            btreeCursors[currentCursor].close();
+            btreeCursors[currentCursor].destroy();
             currentCursor++;
             searchNextCursor();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
index 8fd3a83..d889622 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBTreeWithBuddySortedCursor.java
@@ -39,7 +39,7 @@
             throws HyracksDataException {
         super(opCtx);
         this.buddyBtreeTuple = new PermutingTupleReference(buddyBTreeFields);
-        reset();
+        close();
     }
 
     public ILSMIndexOperationContext getOpCtx() {
@@ -47,12 +47,12 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         depletedBtreeCursors = new boolean[numberOfTrees];
         foundNext = false;
         try {
             for (int i = 0; i < numberOfTrees; i++) {
-                btreeCursors[i].reset();
+                btreeCursors[i].close();
                 btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
                 if (btreeCursors[i].hasNext()) {
                     btreeCursors[i].next();
@@ -127,7 +127,7 @@
             boolean killed = false;
             buddyBtreeTuple.reset(frameTuple);
             for (int i = 0; i < foundIn; i++) {
-                buddyBtreeCursors[i].reset();
+                buddyBtreeCursors[i].close();
                 buddyBtreeRangePredicate.setHighKey(buddyBtreeTuple, true);
                 btreeRangePredicate.setLowKey(buddyBtreeTuple, true);
                 btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
@@ -137,7 +137,7 @@
                         break;
                     }
                 } finally {
-                    btreeCursors[i].close();
+                    btreeCursors[i].destroy();
                 }
             }
             if (!killed) {
@@ -160,7 +160,7 @@
         depletedBtreeCursors = new boolean[numberOfTrees];
         foundNext = false;
         for (int i = 0; i < numberOfTrees; i++) {
-            btreeCursors[i].reset();
+            btreeCursors[i].close();
             btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
             if (btreeCursors[i].hasNext()) {
                 btreeCursors[i].next();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java
index 061cad5..b2f5327 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/impls/LSMBuddyBTreeMergeCursor.java
@@ -24,7 +24,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexSearchCursor;
@@ -63,8 +63,7 @@
             IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getBuddyBTreeLeafFrameFactory().createFrame();
             rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
             BTree buddyBtree = ((LSMBTreeWithBuddyDiskComponent) component).getBuddyIndex();
-            btreeAccessors[i] =
-                    buddyBtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            btreeAccessors[i] = buddyBtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             btreeAccessors[i].search(rangeCursors[i], btreePredicate);
         }
         setPriorityQueueComparator();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeCopyTupleWriter.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeCopyTupleWriter.java
index 44002ae..7c924b5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeCopyTupleWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeCopyTupleWriter.java
@@ -32,7 +32,7 @@
     public int writeTuple(ITupleReference tuple, byte[] targetBuf, int targetOff) {
         int tupleSize = bytesRequired(tuple);
         byte[] buf = tuple.getFieldData(0);
-        int tupleStartOff = ((LSMBTreeTupleReference)tuple).getTupleStart();
+        int tupleStartOff = ((LSMBTreeTupleReference) tuple).getTupleStart();
         System.arraycopy(buf, tupleStartOff, targetBuf, targetOff, tupleSize);
         return tupleSize;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
index a0b1905..cc10a98 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-btree/src/main/java/org/apache/hyracks/storage/am/lsm/btree/utils/LSMBTreeUtil.java
@@ -30,6 +30,7 @@
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMLeafFrameFactory;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.btree.tuples.BTreeTypeAwareTupleWriterFactory;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManagerFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
@@ -54,6 +55,7 @@
 import org.apache.hyracks.storage.am.lsm.common.frames.LSMComponentFilterFrameFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.BTreeFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.ComponentFilterHelper;
+import org.apache.hyracks.storage.am.lsm.common.impls.DiskBTreeFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFilterManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
@@ -87,10 +89,11 @@
         ITreeIndexFrameFactory interiorFrameFactory = new BTreeNSMInteriorFrameFactory(insertTupleWriterFactory);
         ITreeIndexFrameFactory bulkLoadLeafFrameFactory = new BTreeNSMLeafFrameFactory(bulkLoadTupleWriterFactory);
 
-        TreeIndexFactory<BTree> diskBTreeFactory = new BTreeFactory(ioManager, diskBufferCache, freePageManagerFactory,
-                interiorFrameFactory, copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
-        TreeIndexFactory<BTree> bulkLoadBTreeFactory =
-                new BTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
+        TreeIndexFactory<DiskBTree> diskBTreeFactory =
+                new DiskBTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
+                        copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
+        TreeIndexFactory<DiskBTree> bulkLoadBTreeFactory =
+                new DiskBTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
                         bulkLoadLeafFrameFactory, cmpFactories, typeTraits.length);
 
         ComponentFilterHelper filterHelper = null;
@@ -132,7 +135,7 @@
             int[] bloomFilterKeyFields, double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy,
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean durable,
-            IMetadataPageManagerFactory freePageManagerFactory) {
+            IMetadataPageManagerFactory freePageManagerFactory, ITracer tracer) throws HyracksDataException {
         LSMBTreeTupleWriterFactory insertTupleWriterFactory =
                 new LSMBTreeTupleWriterFactory(typeTraits, cmpFactories.length, false, false);
         LSMBTreeTupleWriterFactory deleteTupleWriterFactory =
@@ -151,16 +154,17 @@
         ITreeIndexFrameFactory transactionLeafFrameFactory =
                 new BTreeNSMLeafFrameFactory(transactionTupleWriterFactory);
 
-        TreeIndexFactory<BTree> diskBTreeFactory = new BTreeFactory(ioManager, diskBufferCache, freePageManagerFactory,
-                interiorFrameFactory, copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
-        TreeIndexFactory<BTree> bulkLoadBTreeFactory = new BTreeFactory(ioManager, diskBufferCache,
+        TreeIndexFactory<DiskBTree> diskBTreeFactory =
+                new DiskBTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
+                        copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
+        TreeIndexFactory<DiskBTree> bulkLoadBTreeFactory = new DiskBTreeFactory(ioManager, diskBufferCache,
                 freePageManagerFactory, interiorFrameFactory, insertLeafFrameFactory, cmpFactories, typeTraits.length);
 
         BloomFilterFactory bloomFilterFactory = new BloomFilterFactory(diskBufferCache, bloomFilterKeyFields);
 
         // This is the component factory for transactions
-        TreeIndexFactory<BTree> transactionBTreeFactory =
-                new BTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
+        TreeIndexFactory<DiskBTree> transactionBTreeFactory =
+                new DiskBTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
                         transactionLeafFrameFactory, cmpFactories, typeTraits.length);
         //TODO remove BloomFilter from external dataset's secondary LSMBTree index
         ILSMIndexFileManager fileNameManager = new LSMBTreeFileManager(ioManager, file, diskBTreeFactory, true);
@@ -176,14 +180,15 @@
         return new ExternalBTree(ioManager, interiorFrameFactory, insertLeafFrameFactory, deleteLeafFrameFactory,
                 diskBufferCache, fileNameManager, componentFactory, bulkLoadComponentFactory,
                 transactionComponentFactory, bloomFilterFalsePositiveRate, cmpFactories, mergePolicy, opTracker,
-                ioScheduler, ioOpCallbackFactory, durable);
+                ioScheduler, ioOpCallbackFactory, durable, tracer);
     }
 
     public static ExternalBTreeWithBuddy createExternalBTreeWithBuddy(IIOManager ioManager, FileReference file,
             IBufferCache diskBufferCache, ITypeTraits[] typeTraits, IBinaryComparatorFactory[] cmpFactories,
             double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker,
             ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallbackFactory ioOpCallbackFactory,
-            int[] buddyBTreeFields, boolean durable, IMetadataPageManagerFactory freePageManagerFactory) {
+            int[] buddyBTreeFields, boolean durable, IMetadataPageManagerFactory freePageManagerFactory, ITracer tracer)
+            throws HyracksDataException {
         ITypeTraits[] buddyBtreeTypeTraits = new ITypeTraits[buddyBTreeFields.length];
         IBinaryComparatorFactory[] buddyBtreeCmpFactories = new IBinaryComparatorFactory[buddyBTreeFields.length];
         for (int i = 0; i < buddyBtreeTypeTraits.length; i++) {
@@ -232,6 +237,6 @@
         return new ExternalBTreeWithBuddy(ioManager, interiorFrameFactory, insertLeafFrameFactory,
                 buddyBtreeLeafFrameFactory, diskBufferCache, fileNameManager, componentFactory,
                 bulkLoadComponentFactory, bloomFilterFalsePositiveRate, mergePolicy, opTracker, ioScheduler,
-                ioOpCallbackFactory, cmpFactories, buddyBtreeCmpFactories, buddyBTreeFields, durable);
+                ioOpCallbackFactory, cmpFactories, buddyBtreeCmpFactories, buddyBTreeFields, durable, tracer);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/pom.xml b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/pom.xml
index 3422951..7d37f00 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/pom.xml
@@ -86,5 +86,9 @@
       <artifactId>hyracks-util</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponent.java
index a60f544..fc55ce5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponent.java
@@ -127,4 +127,16 @@
      * @return index data structure that is the stored in the component
      */
     IIndex getIndex();
+
+    /**
+     * @return the {@link ILSMIndex} this component belong to
+     */
+    ILSMIndex getLsmIndex();
+
+    /**
+     *
+     * @return id of the component
+     * @throws HyracksDataException
+     */
+    ILSMComponentId getId() throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentId.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentId.java
new file mode 100644
index 0000000..5662862
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentId.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.common.api;
+
+/**
+ * Stores the id of the disk component, which is a interval (minId, maxId).
+ * It is generated by {@link ILSMComponentIdGenerator}
+ *
+ */
+public interface ILSMComponentId {
+    public enum IdCompareResult {
+        UNKNOWN,
+        LESS_THAN,
+        GREATER_THAN,
+        INTERSECT,
+        INCLUDE
+    }
+
+    /**
+     * @return whether the id is missing
+     */
+    boolean missing();
+
+    IdCompareResult compareTo(ILSMComponentId id);
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGenerator.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGenerator.java
new file mode 100644
index 0000000..5dd3061
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGenerator.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.common.api;
+
+/**
+ * This interface generates component Ids for LSM components (both memory and disk components).
+ */
+public interface ILSMComponentIdGenerator {
+
+    /**
+     * @return An Id for LSM component
+     */
+    public ILSMComponentId getId();
+
+    /**
+     * Refresh the component Id generator to generate the next Id.
+     * {@link #getId()} would always return the same Id before this method is called.
+     */
+    public void refresh();
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGeneratorFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGeneratorFactory.java
new file mode 100644
index 0000000..4ec82c1
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMComponentIdGeneratorFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.common.api;
+
+import java.io.Serializable;
+
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.common.IResource;
+
+@FunctionalInterface
+public interface ILSMComponentIdGeneratorFactory extends Serializable {
+    ILSMComponentIdGenerator getComponentIdGenerator(INCServiceContext serviceCtx, IResource resource)
+            throws HyracksDataException;
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponent.java
index 43c5482..bd2bb45 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponent.java
@@ -48,14 +48,6 @@
     int getFileReferenceCount();
 
     /**
-     * Return the component Id of this disk component from its metadata
-     *
-     * @return
-     * @throws HyracksDataException
-     */
-    ILSMDiskComponentId getComponentId() throws HyracksDataException;
-
-    /**
      * @return LsmIndex of the component
      */
     AbstractLSMIndex getLsmIndex();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponentId.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponentId.java
deleted file mode 100644
index 5d38ace..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMDiskComponentId.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.storage.am.lsm.common.api;
-
-import org.apache.hyracks.storage.am.common.freepage.MutableArrayValueReference;
-
-/**
- * Stores the id of the disk component, which is a interval (minId, maxId).
- * When a disk component is formed by the flush operation, its initial minId and maxId are the same, and
- * currently are set as the flush LSN.
- * When a disk component is formed by the merge operation, its [minId, maxId] is set as the union of
- * all ids of merged disk components.
- *
- * @author luochen
- *
- */
-public interface ILSMDiskComponentId {
-
-    public static final long NOT_FOUND = -1;
-
-    public static final MutableArrayValueReference COMPONENT_ID_MIN_KEY =
-            new MutableArrayValueReference("Component_Id_Min".getBytes());
-
-    public static final MutableArrayValueReference COMPONENT_ID_MAX_KEY =
-            new MutableArrayValueReference("Component_Id_Max".getBytes());
-
-    long getMinId();
-
-    long getMaxId();
-
-    default boolean notFound() {
-        return getMinId() == NOT_FOUND || getMaxId() == NOT_FOUND;
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java
index 89c8cb9..b32dd0f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMHarness.java
@@ -253,4 +253,17 @@
      */
     void deleteComponents(ILSMIndexOperationContext ctx, Predicate<ILSMComponent> predicate)
             throws HyracksDataException;
+
+    /**
+     * Replace the memory components in this operation context with their corresponding disk
+     * components if possible
+     *
+     * @param ctx
+     *            the operation context
+     * @param startIndex
+     *            the index of the first component to switch
+     * @throws HyracksDataException
+     */
+    void replaceMemoryComponentsWithDiskComponents(ILSMIndexOperationContext ctx, int startIndex)
+            throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperation.java
index c2ae786..f5ee23b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperation.java
@@ -23,15 +23,17 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 
 public interface ILSMIOOperation extends Callable<Boolean> {
 
     /**
      * Represents the io operation type
      */
-    enum LSMIOOpertionType {
+    enum LSMIOOperationType {
         FLUSH,
-        MERGE
+        MERGE,
+        LOAD
     }
 
     /**
@@ -52,7 +54,7 @@
     /**
      * @return the operation type
      */
-    LSMIOOpertionType getIOOpertionType();
+    LSMIOOperationType getIOOpertionType();
 
     @Override
     Boolean call() throws HyracksDataException;
@@ -66,4 +68,9 @@
      * @return the accessor of the operation
      */
     ILSMIndexAccessor getAccessor();
+
+    /**
+     * @return the component files produced by this operation
+     */
+    LSMComponentFileReferences getComponentFiles();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
index 0323026..8df872b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallback.java
@@ -21,6 +21,7 @@
 import java.util.List;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 
 public interface ILSMIOOperationCallback {
 
@@ -29,7 +30,7 @@
      * (i.e. IO operations could be flush or merge operations.)
      * For flush, this is called immediately before switching the current memory component pointer
      */
-    void beforeOperation(LSMOperationType opType) throws HyracksDataException;
+    void beforeOperation(LSMIOOperationType opType) throws HyracksDataException;
 
     /**
      * This method is called on an IO operation sometime after the operation was completed.
@@ -42,7 +43,7 @@
      * @param newComponent
      * @throws HyracksDataException
      */
-    void afterOperation(LSMOperationType opType, List<ILSMComponent> oldComponents, ILSMDiskComponent newComponent)
+    void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents, ILSMDiskComponent newComponent)
             throws HyracksDataException;
 
     /**
@@ -53,14 +54,16 @@
      * @param newComponent
      * @throws HyracksDataException
      */
-    void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent) throws HyracksDataException;
+    void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent) throws HyracksDataException;
 
     /**
      * This method is called when a memory component is recycled
      *
      * @param component
+     * @param componentSwitched
+     *            true if the component index was advanced for this recycle, false otherwise
      */
-    void recycled(ILSMMemoryComponent component) throws HyracksDataException;
+    void recycled(ILSMMemoryComponent component, boolean componentSwitched) throws HyracksDataException;
 
     /**
      * This method is called when a memory component is allocated
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
index b291f7c..e8742b5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIOOperationCallbackFactory.java
@@ -20,7 +20,17 @@
 
 import java.io.Serializable;
 
-@FunctionalInterface
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.common.IResource;
+
 public interface ILSMIOOperationCallbackFactory extends Serializable {
-    ILSMIOOperationCallback createIoOpCallback(ILSMIndex index);
+    /**
+     * Initialize the callback factory with the given ncCtx and resource
+     *
+     * @param ncCtx
+     */
+    void initialize(INCServiceContext ncCtx, IResource resource);
+
+    ILSMIOOperationCallback createIoOpCallback(ILSMIndex index) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
index 0f48621..62493f4 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndex.java
@@ -27,9 +27,8 @@
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMHarness;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 
 /**
@@ -45,8 +44,7 @@
     void deactivate(boolean flush) throws HyracksDataException;
 
     @Override
-    ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException;
+    ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException;
 
     ILSMOperationTracker getOperationTracker();
 
@@ -145,4 +143,9 @@
      * @return The number of all memory components (active and inactive)
      */
     int getNumberOfAllMemoryComponents();
+
+    /**
+     * @return the {@link ILSMHarness} of the index
+     */
+    ILSMHarness getHarness();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java
index 5b0378a..ec9124d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMIndexOperationContext.java
@@ -56,4 +56,30 @@
     PermutingTupleReference getFilterTuple();
 
     MultiComparator getFilterCmp();
+
+    /**
+     * @return the {@link ILSMIndex} of the component
+     */
+    ILSMIndex getIndex();
+
+    /**
+     * Performance tracing method. Logs the accumulated counters for number of tuples
+     *
+     * @param tupleCount
+     *            the number of tuples represented by the counters
+     */
+    void logPerformanceCounters(int tupleCount);
+
+    /**
+     * Increment the time taken for entering and exiting components
+     *
+     * @param increment
+     *            the time increment in nanoseconds
+     */
+    void incrementEnterExitTime(long increment);
+
+    /**
+     * @return true if performance tracing is enabled, false otherwise
+     */
+    boolean isTracingEnabled();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMMemoryComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMMemoryComponent.java
index 13543e4..c72d402 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMMemoryComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMMemoryComponent.java
@@ -76,7 +76,8 @@
     void setState(ComponentState state);
 
     /**
-     * Allocates memory to this component, create and activate it
+     * Allocates memory to this component, create and activate it.
+     * This method is atomic. If an exception is thrown, then the call had no effect.
      *
      * @throws HyracksDataException
      */
@@ -101,4 +102,12 @@
      * @return the size of the memory component
      */
     long getSize();
+
+    /**
+     * Reset the component Id of the memory component after it's recycled
+     *
+     * @param newId
+     * @throws HyracksDataException
+     */
+    void resetId(ILSMComponentId newId) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMOperationTrackerFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMOperationTrackerFactory.java
index 217f794..ef22620 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMOperationTrackerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/api/ILSMOperationTrackerFactory.java
@@ -21,8 +21,10 @@
 import java.io.Serializable;
 
 import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.common.IResource;
 
 @FunctionalInterface
 public interface ILSMOperationTrackerFactory extends Serializable {
-    ILSMOperationTracker getOperationTracker(INCServiceContext ctx);
+    ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource) throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexCompactOperatorNodePushable.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexCompactOperatorNodePushable.java
index 2860a8f..4e8cf71 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexCompactOperatorNodePushable.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LSMIndexCompactOperatorNodePushable.java
@@ -25,7 +25,7 @@
 import org.apache.hyracks.dataflow.std.base.AbstractOperatorNodePushable;
 import org.apache.hyracks.storage.am.common.api.IIndexDataflowHelper;
 import org.apache.hyracks.storage.am.common.dataflow.IIndexDataflowHelperFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 
@@ -56,8 +56,7 @@
     public void initialize() throws HyracksDataException {
         indexHelper.open();
         ILSMIndex index = (ILSMIndex) indexHelper.getIndexInstance();
-        ILSMIndexAccessor accessor =
-                index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         accessor.scheduleFullMerge(index.getIOOperationCallback());
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LsmResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LsmResource.java
index 6255c1d..b541750 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LsmResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/dataflow/LsmResource.java
@@ -18,13 +18,10 @@
  */
 package org.apache.hyracks.storage.am.lsm.common.dataflow;
 
-import java.util.List;
 import java.util.Map;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
-import org.apache.hyracks.api.io.IIOManager;
-import org.apache.hyracks.api.io.IODeviceHandle;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManagerFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationSchedulerProvider;
@@ -43,7 +40,7 @@
 public abstract class LsmResource implements IResource {
 
     private static final long serialVersionUID = 1L;
-    protected final String path;
+    protected String path;
     protected final IStorageManager storageManager;
     protected final ITypeTraits[] typeTraits;
     protected final IBinaryComparatorFactory[] cmpFactories;
@@ -88,14 +85,8 @@
         return path;
     }
 
-    public static int getIoDeviceNum(IIOManager ioManager, IODeviceHandle deviceHandle) {
-        List<IODeviceHandle> ioDevices = ioManager.getIODevices();
-        for (int i = 0; i < ioDevices.size(); i++) {
-            IODeviceHandle device = ioDevices.get(i);
-            if (device == deviceHandle) {
-                return i;
-            }
-        }
-        return -1;
+    @Override
+    public void setPath(String path) {
+        this.path = path;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/freepage/VirtualFreePageManagerFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/freepage/VirtualFreePageManagerFactory.java
index 0d58b85..2ca162d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/freepage/VirtualFreePageManagerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/freepage/VirtualFreePageManagerFactory.java
@@ -24,6 +24,7 @@
 
 public class VirtualFreePageManagerFactory implements IPageManagerFactory {
     private static final long serialVersionUID = 1L;
+
     @Override
     public IPageManager createPageManager(IBufferCache bufferCache) {
         return new VirtualFreePageManager(bufferCache);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
index ac124ba..84d2fe5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMComponent.java
@@ -28,7 +28,7 @@
     protected final ILSMComponentFilter filter;
     protected final AbstractLSMIndex lsmIndex;
     // Mutables
-    protected ComponentState state;
+    protected volatile ComponentState state;
     protected int readerCount;
 
     public AbstractLSMComponent(AbstractLSMIndex lsmIndex, ILSMComponentFilter filter) {
@@ -46,4 +46,9 @@
     public ILSMComponentFilter getLSMComponentFilter() {
         return filter;
     }
+
+    @Override
+    public final AbstractLSMIndex getLsmIndex() {
+        return lsmIndex;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
index a0d1c23..26c7b0d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMDiskComponent.java
@@ -21,16 +21,27 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.util.ComponentUtils;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractLSMDiskComponent extends AbstractLSMComponent implements ILSMDiskComponent {
 
+    private static final Logger LOGGER = LogManager.getLogger();
+
     private final DiskComponentMetadata metadata;
 
+    // a variable cache of componentId stored in metadata.
+    // since componentId is immutable, we do not want to read from metadata every time the componentId
+    // is requested.
+    private ILSMComponentId componentId;
+
     public AbstractLSMDiskComponent(AbstractLSMIndex lsmIndex, IMetadataPageManager mdPageManager,
             ILSMComponentFilter filter) {
         super(lsmIndex, filter);
@@ -39,11 +50,6 @@
     }
 
     @Override
-    public AbstractLSMIndex getLsmIndex() {
-        return lsmIndex;
-    }
-
-    @Override
     public boolean threadEnter(LSMOperationType opType, boolean isMutableComponent) {
         if (state == ComponentState.INACTIVE) {
             throw new IllegalStateException("Trying to enter an inactive disk component");
@@ -109,13 +115,23 @@
     }
 
     @Override
-    public ILSMDiskComponentId getComponentId() throws HyracksDataException {
-        long minID = ComponentUtils.getLong(metadata, ILSMDiskComponentId.COMPONENT_ID_MIN_KEY,
-                ILSMDiskComponentId.NOT_FOUND);
-        long maxID = ComponentUtils.getLong(metadata, ILSMDiskComponentId.COMPONENT_ID_MAX_KEY,
-                ILSMDiskComponentId.NOT_FOUND);
-        //TODO: do we need to throw an exception when ID is not found?
-        return new LSMDiskComponentId(minID, maxID);
+    public ILSMComponentId getId() throws HyracksDataException {
+        if (componentId != null) {
+            return componentId;
+        }
+        synchronized (this) {
+            if (componentId == null) {
+                componentId = LSMComponentIdUtils.readFrom(metadata);
+            }
+        }
+        if (componentId.missing()) {
+            // For normal datasets, componentId shouldn't be missing, since otherwise it'll be a bug.
+            // However, we cannot throw an exception here to be compatible with legacy datasets.
+            // In this case, the disk component would always get a garbage Id [-1, -1], which makes the
+            // component Id-based optimization useless but still correct.
+            LOGGER.warn("Component Id not found from disk component metadata");
+        }
+        return componentId;
     }
 
     /**
@@ -128,6 +144,9 @@
     @Override
     public void markAsValid(boolean persist) throws HyracksDataException {
         ComponentUtils.markAsValid(getMetadataHolder(), persist);
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.log(Level.INFO, "Marked as valid component with id: " + getId());
+        }
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
index dd3a5de..908a5c2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndex.java
@@ -37,16 +37,20 @@
 import org.apache.hyracks.api.replication.IReplicationJob.ReplicationOperation;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.common.impls.AbstractSearchPredicate;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilterFrameFactory;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId.IdCompareResult;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -65,8 +69,12 @@
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.util.trace.ITracer;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractLSMIndex implements ILSMIndex {
+    private static final Logger LOGGER = LogManager.getLogger();
     protected final ILSMHarness lsmHarness;
     protected final IIOManager ioManager;
     protected final ILSMIOOperationScheduler ioScheduler;
@@ -104,7 +112,7 @@
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, ILSMDiskComponentFactory componentFactory,
             ILSMDiskComponentFactory bulkLoadComponentFactory, ILSMComponentFilterFrameFactory filterFrameFactory,
             LSMComponentFilterManager filterManager, int[] filterFields, boolean durable,
-            IComponentFilterHelper filterHelper, int[] treeFields, ITracer tracer) {
+            IComponentFilterHelper filterHelper, int[] treeFields, ITracer tracer) throws HyracksDataException {
         this.ioManager = ioManager;
         this.virtualBufferCaches = virtualBufferCaches;
         this.diskBufferCache = diskBufferCache;
@@ -138,7 +146,7 @@
             double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker,
             ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallbackFactory ioOpCallbackFactory,
             ILSMDiskComponentFactory componentFactory, ILSMDiskComponentFactory bulkLoadComponentFactory,
-            boolean durable) {
+            boolean durable, ITracer tracer) throws HyracksDataException {
         this.ioManager = ioManager;
         this.diskBufferCache = diskBufferCache;
         this.fileManager = fileManager;
@@ -148,6 +156,7 @@
         this.componentFactory = componentFactory;
         this.bulkLoadComponentFactory = bulkLoadComponentFactory;
         this.durable = durable;
+        this.tracer = tracer;
         lsmHarness = new ExternalIndexHarness(this, mergePolicy, opTracker, diskBufferCache.isReplicationEnabled());
         isActive = false;
         diskComponents = new LinkedList<>();
@@ -214,7 +223,7 @@
 
     protected void flushMemoryComponent() throws HyracksDataException {
         BlockingIOOperationCallbackWrapper cb = new BlockingIOOperationCallbackWrapper(ioOpCallback);
-        ILSMIndexAccessor accessor = createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor accessor = createAccessor(NoOpIndexAccessParameters.INSTANCE);
         accessor.scheduleFlush(cb);
         try {
             cb.waitForIO();
@@ -284,7 +293,6 @@
 
     @Override
     public void getOperationalComponents(ILSMIndexOperationContext ctx) throws HyracksDataException {
-        List<ILSMDiskComponent> immutableComponents = diskComponents;
         List<ILSMComponent> operationalComponents = ctx.getComponentHolder();
         int cmc = currentMutableComponentId.get();
         ctx.setCurrentMutableComponentId(cmc);
@@ -299,15 +307,16 @@
                 operationalComponents.add(memoryComponents.get(cmc));
                 break;
             case INSERT:
-                addOperationalMutableComponents(operationalComponents);
-                operationalComponents.addAll(immutableComponents);
+                addOperationalMutableComponents(operationalComponents, true);
+                operationalComponents.addAll(diskComponents);
                 break;
             case SEARCH:
                 if (memoryComponentsAllocated) {
-                    addOperationalMutableComponents(operationalComponents);
+                    addOperationalMutableComponents(operationalComponents, false);
                 }
                 if (filterManager != null) {
-                    for (ILSMComponent c : immutableComponents) {
+                    for (int i = 0; i < diskComponents.size(); i++) {
+                        ILSMComponent c = diskComponents.get(i);
                         if (c.getLSMComponentFilter().satisfy(
                                 ((AbstractSearchPredicate) ctx.getSearchPredicate()).getMinFilterTuple(),
                                 ((AbstractSearchPredicate) ctx.getSearchPredicate()).getMaxFilterTuple(),
@@ -316,7 +325,7 @@
                         }
                     }
                 } else {
-                    operationalComponents.addAll(immutableComponents);
+                    operationalComponents.addAll(diskComponents);
                 }
 
                 break;
@@ -325,13 +334,13 @@
                 operationalComponents.addAll(ctx.getComponentsToBeMerged());
                 break;
             case FULL_MERGE:
-                operationalComponents.addAll(immutableComponents);
+                operationalComponents.addAll(diskComponents);
                 break;
             case REPLICATE:
                 operationalComponents.addAll(ctx.getComponentsToBeReplicated());
                 break;
             case DISK_COMPONENT_SCAN:
-                operationalComponents.addAll(immutableComponents);
+                operationalComponents.addAll(diskComponents);
                 break;
             default:
                 throw new UnsupportedOperationException("Operation " + ctx.getOperation() + " not supported.");
@@ -371,18 +380,23 @@
         ioScheduler.scheduleOperation(TracedIOOperation.wrap(mergeOp, tracer));
     }
 
-    private void addOperationalMutableComponents(List<ILSMComponent> operationalComponents) {
+    private void addOperationalMutableComponents(List<ILSMComponent> operationalComponents, boolean modification) {
         int cmc = currentMutableComponentId.get();
         int numMutableComponents = memoryComponents.size();
         for (int i = 0; i < numMutableComponents - 1; i++) {
             ILSMMemoryComponent c = memoryComponents.get((cmc + i + 1) % numMutableComponents);
             if (c.isReadable()) {
-                // Make sure newest components are added first
+                // Make sure newest components are added first if readable
                 operationalComponents.add(0, c);
             }
         }
-        // The current mutable component is always added
-        operationalComponents.add(0, memoryComponents.get(cmc));
+        // The current mutable component is added if modification operation or if readable
+        // This ensures that activation of new component only happens in case of modifications
+        // and allow for controlling that without stopping search operations
+        ILSMMemoryComponent c = memoryComponents.get(cmc);
+        if (modification || c.isReadable()) {
+            operationalComponents.add(0, c);
+        }
     }
 
     @Override
@@ -396,6 +410,7 @@
 
     public IIndexBulkLoader createBulkLoader(float fillLevel, boolean verifyInput, long numElementsHint)
             throws HyracksDataException {
+        ioOpCallback.beforeOperation(LSMIOOperationType.LOAD);
         return new LSMIndexDiskComponentBulkLoader(this, fillLevel, verifyInput, numElementsHint);
     }
 
@@ -416,16 +431,36 @@
     }
 
     @Override
-    public final synchronized void allocateMemoryComponents() throws HyracksDataException {
+    public synchronized void allocateMemoryComponents() throws HyracksDataException {
         if (!isActive) {
             throw HyracksDataException.create(ErrorCode.CANNOT_ALLOCATE_MEMORY_FOR_INACTIVE_INDEX);
         }
         if (memoryComponentsAllocated || memoryComponents == null) {
             return;
         }
-        for (ILSMMemoryComponent c : memoryComponents) {
-            c.allocate();
-            ioOpCallback.allocated(c);
+        int i = 0;
+        boolean allocated = false;
+        try {
+            for (; i < memoryComponents.size(); i++) {
+                allocated = false;
+                ILSMMemoryComponent c = memoryComponents.get(i);
+                c.allocate();
+                allocated = true;
+                ioOpCallback.allocated(c);
+            }
+        } finally {
+            if (i < memoryComponents.size()) {
+                // something went wrong
+                if (allocated) {
+                    ILSMMemoryComponent c = memoryComponents.get(i);
+                    c.deallocate();
+                }
+                // deallocate all previous components
+                for (int j = i - 1; j >= 0; j--) {
+                    ILSMMemoryComponent c = memoryComponents.get(j);
+                    c.deallocate();
+                }
+            }
         }
         memoryComponentsAllocated = true;
     }
@@ -435,6 +470,7 @@
         if (c != EmptyComponent.INSTANCE) {
             diskComponents.add(0, c);
         }
+        assert checkComponentIds();
     }
 
     @Override
@@ -445,6 +481,25 @@
         if (newComponent != EmptyComponent.INSTANCE) {
             diskComponents.add(swapIndex, newComponent);
         }
+        assert checkComponentIds();
+    }
+
+    /**
+     * A helper method to ensure disk components have proper Ids (non-decreasing)
+     * We may get rid of this method once component Id is stablized
+     *
+     * @throws HyracksDataException
+     */
+    private boolean checkComponentIds() throws HyracksDataException {
+        for (int i = 0; i < diskComponents.size() - 1; i++) {
+            ILSMComponentId id1 = diskComponents.get(i).getId();
+            ILSMComponentId id2 = diskComponents.get(i + 1).getId();
+            IdCompareResult cmp = id1.compareTo(id2);
+            if (cmp != IdCompareResult.UNKNOWN && cmp != IdCompareResult.GREATER_THAN) {
+                return false;
+            }
+        }
+        return true;
     }
 
     @Override
@@ -627,7 +682,8 @@
         return filterManager;
     }
 
-    public ILSMHarness getLsmHarness() {
+    @Override
+    public ILSMHarness getHarness() {
         return lsmHarness;
     }
 
@@ -656,16 +712,51 @@
     public final ILSMDiskComponent flush(ILSMIOOperation operation) throws HyracksDataException {
         ILSMIndexAccessor accessor = operation.getAccessor();
         ILSMIndexOperationContext opCtx = accessor.getOpContext();
-        return opCtx.getOperation() == IndexOperation.DELETE_MEMORY_COMPONENT ? EmptyComponent.INSTANCE
-                : doFlush(operation);
+        if (opCtx.getOperation() == IndexOperation.DELETE_MEMORY_COMPONENT) {
+            return EmptyComponent.INSTANCE;
+        }
+        if (LOGGER.isInfoEnabled()) {
+            FlushOperation flushOp = (FlushOperation) operation;
+            LOGGER.log(Level.INFO, "Flushing component with id: " + flushOp.getFlushingComponent().getId());
+        }
+        try {
+            return doFlush(operation);
+        } catch (Exception e) {
+            LOGGER.error("Fail to execute flush " + this, e);
+            cleanUpFiles(operation, e);
+            throw HyracksDataException.create(e);
+        }
     }
 
     @Override
     public final ILSMDiskComponent merge(ILSMIOOperation operation) throws HyracksDataException {
         ILSMIndexAccessor accessor = operation.getAccessor();
         ILSMIndexOperationContext opCtx = accessor.getOpContext();
-        return opCtx.getOperation() == IndexOperation.DELETE_DISK_COMPONENTS ? EmptyComponent.INSTANCE
-                : doMerge(operation);
+        try {
+            return opCtx.getOperation() == IndexOperation.DELETE_DISK_COMPONENTS ? EmptyComponent.INSTANCE
+                    : doMerge(operation);
+        } catch (Exception e) {
+            LOGGER.error("Fail to execute merge " + this, e);
+            cleanUpFiles(operation, e);
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    protected void cleanUpFiles(ILSMIOOperation operation, Exception e) {
+        LSMComponentFileReferences componentFiles = operation.getComponentFiles();
+        if (componentFiles == null) {
+            return;
+        }
+        FileReference[] files = componentFiles.getFileReferences();
+        for (FileReference file : files) {
+            try {
+                if (file != null) {
+                    diskBufferCache.deleteFile(file);
+                }
+            } catch (HyracksDataException hde) {
+                e.addSuppressed(hde);
+            }
+        }
     }
 
     protected abstract LSMComponentFileReferences getMergeFileReferences(ILSMDiskComponent firstComponent,
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
index d3c056d..59a919b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexFileManager.java
@@ -77,7 +77,9 @@
      */
     public static final String TXN_PREFIX = ".T";
 
-    protected static final FilenameFilter fileNameFilter = (dir, name) -> !name.startsWith(".");
+    public static final String COMPONENT_TIMESTAMP_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS";
+
+    public static final FilenameFilter COMPONENT_FILES_FILTER = (dir, name) -> !name.startsWith(".");
     protected static final FilenameFilter txnFileNameFilter = (dir, name) -> name.startsWith(TXN_PREFIX);
     protected static FilenameFilter bloomFilterFilter =
             (dir, name) -> !name.startsWith(".") && name.endsWith(BLOOM_FILTER_SUFFIX);
@@ -87,7 +89,7 @@
     protected final IIOManager ioManager;
     // baseDir should reflect dataset name and partition name and be absolute
     protected final FileReference baseDir;
-    protected final Format formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
+    protected final Format formatter = new SimpleDateFormat(COMPONENT_TIMESTAMP_FORMAT);
     protected final Comparator<ComparableFileName> recencyCmp = new RecencyComparator();
     protected final TreeIndexFactory<? extends ITreeIndex> treeFactory;
     private String prevTimestamp = null;
@@ -222,7 +224,7 @@
         // (1) The isValid flag is not set
         // (2) The file's interval is contained by some other file
         // Here, we only filter out (1).
-        cleanupAndGetValidFilesInternal(fileNameFilter, treeFactory, allFiles);
+        cleanupAndGetValidFilesInternal(COMPONENT_FILES_FILTER, treeFactory, allFiles);
 
         if (allFiles.isEmpty()) {
             return validFiles;
@@ -411,4 +413,12 @@
         prevTimestamp = ts;
         return ts;
     }
+
+    public static String getComponentStartTime(String fileName) {
+        return fileName.split(DELIMITER)[0];
+    }
+
+    public static String getComponentEndTime(String fileName) {
+        return fileName.split(DELIMITER)[1];
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java
index 065d465..1b540b7 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMIndexOperationContext.java
@@ -18,7 +18,7 @@
  */
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
-import java.util.LinkedList;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
@@ -27,14 +27,18 @@
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
+import org.apache.hyracks.util.trace.ITracer.Scope;
 
 public abstract class AbstractLSMIndexOperationContext implements ILSMIndexOperationContext {
 
+    protected final ILSMIndex index;
     protected final PermutingTupleReference indexTuple;
     protected final MultiComparator filterCmp;
     protected final PermutingTupleReference filterTuple;
@@ -47,15 +51,19 @@
     protected IndexOperation op;
     protected boolean accessingComponents = false;
     protected ISearchPredicate searchPredicate;
+    protected final ITracer tracer;
+    protected final long traceCategory;
+    private long enterExitTime = 0L;
 
-    public AbstractLSMIndexOperationContext(int[] treeFields, int[] filterFields,
+    public AbstractLSMIndexOperationContext(ILSMIndex index, int[] treeFields, int[] filterFields,
             IBinaryComparatorFactory[] filterCmpFactories, ISearchOperationCallback searchCallback,
-            IModificationOperationCallback modificationCallback) {
+            IModificationOperationCallback modificationCallback, ITracer tracer) {
+        this.index = index;
         this.searchCallback = searchCallback;
         this.modificationCallback = modificationCallback;
-        this.componentHolder = new LinkedList<>();
-        this.componentsToBeMerged = new LinkedList<>();
-        this.componentsToBeReplicated = new LinkedList<>();
+        this.componentHolder = new ArrayList<>();
+        this.componentsToBeMerged = new ArrayList<>();
+        this.componentsToBeReplicated = new ArrayList<>();
         if (filterFields != null) {
             indexTuple = new PermutingTupleReference(treeFields);
             filterCmp = MultiComparator.create(filterCmpFactories);
@@ -73,6 +81,8 @@
             filterTuple = null;
             allFields = null;
         }
+        this.tracer = tracer;
+        this.traceCategory = tracer.getRegistry().get("op-ctx");
     }
 
     @Override
@@ -153,4 +163,32 @@
     public ISearchPredicate getSearchPredicate() {
         return searchPredicate;
     }
+
+    @Override
+    public final boolean isTracingEnabled() {
+        return tracer.isEnabled(traceCategory);
+    }
+
+    @Override
+    public void logPerformanceCounters(int tupleCount) {
+        if (isTracingEnabled()) {
+            tracer.instant("store-counters", traceCategory, Scope.t,
+                    "{\"count\":" + tupleCount + ",\"enter-exit-duration-ns\":" + enterExitTime + "}");
+            resetCounters();
+        }
+    }
+
+    public void resetCounters() {
+        enterExitTime = 0L;
+    }
+
+    @Override
+    public void incrementEnterExitTime(long increment) {
+        enterExitTime += increment;
+    }
+
+    @Override
+    public ILSMIndex getIndex() {
+        return index;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
index b7c3350..3fbef18 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AbstractLSMMemoryComponent.java
@@ -22,18 +22,26 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId.IdCompareResult;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.am.lsm.common.util.LSMComponentIdUtils;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public abstract class AbstractLSMMemoryComponent extends AbstractLSMComponent implements ILSMMemoryComponent {
 
+    private static final Logger LOGGER = LogManager.getLogger();
     private final IVirtualBufferCache vbc;
     private final AtomicBoolean isModified;
     private int writerCount;
     private boolean requestedToBeActive;
     private final MemoryComponentMetadata metadata;
+    private ILSMComponentId componentId;
 
     public AbstractLSMMemoryComponent(AbstractLSMIndex lsmIndex, IVirtualBufferCache vbc, boolean isActive,
             ILSMComponentFilter filter) {
@@ -54,7 +62,7 @@
         if (state == ComponentState.INACTIVE && requestedToBeActive) {
             state = ComponentState.READABLE_WRITABLE;
             requestedToBeActive = false;
-            lsmIndex.getIOOperationCallback().recycled(this);
+            lsmIndex.getIOOperationCallback().recycled(this, true);
         }
         switch (opType) {
             case FORCE_MODIFICATION:
@@ -229,24 +237,46 @@
 
     @Override
     public final void allocate() throws HyracksDataException {
+        boolean allocated = false;
         ((IVirtualBufferCache) getIndex().getBufferCache()).open();
-        doAllocate();
+        try {
+            doAllocate();
+            allocated = true;
+        } finally {
+            if (!allocated) {
+                ((IVirtualBufferCache) getIndex().getBufferCache()).close();
+            }
+        }
     }
 
     protected void doAllocate() throws HyracksDataException {
-        getIndex().create();
-        getIndex().activate();
+        boolean created = false;
+        boolean activated = false;
+        try {
+            getIndex().create();
+            created = true;
+            getIndex().activate();
+            activated = true;
+        } finally {
+            if (created && !activated) {
+                getIndex().destroy();
+            }
+        }
     }
 
     @Override
     public final void deallocate() throws HyracksDataException {
-        doDeallocate();
-        getIndex().getBufferCache().close();
+        try {
+            doDeallocate();
+        } finally {
+            getIndex().getBufferCache().close();
+        }
     }
 
     protected void doDeallocate() throws HyracksDataException {
         getIndex().deactivate();
         getIndex().destroy();
+        componentId = null;
     }
 
     @Override
@@ -259,4 +289,23 @@
         IBufferCache virtualBufferCache = getIndex().getBufferCache();
         return virtualBufferCache.getPageBudget() * (long) virtualBufferCache.getPageSize();
     }
+
+    @Override
+    public ILSMComponentId getId() {
+        return componentId;
+    }
+
+    @Override
+    public void resetId(ILSMComponentId componentId) throws HyracksDataException {
+        if (this.componentId != null && !componentId.missing() // for backward compatibility
+                && this.componentId.compareTo(componentId) != IdCompareResult.LESS_THAN) {
+            throw new IllegalStateException(
+                    this + " receives illegal id. Old id " + this.componentId + ", new id " + componentId);
+        }
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.log(Level.INFO, "Component Id was reset from " + this.componentId + " to " + componentId);
+        }
+        this.componentId = componentId;
+        LSMComponentIdUtils.persist(this.componentId, metadata);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AsynchronousScheduler.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AsynchronousScheduler.java
index 438bb0b..a439ace 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AsynchronousScheduler.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/AsynchronousScheduler.java
@@ -31,7 +31,7 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOpertionType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
 
 public class AsynchronousScheduler implements ILSMIOOperationScheduler {
@@ -60,7 +60,7 @@
                 super.afterExecute(r, t);
                 LSMIOOperationTask<Boolean> task = (LSMIOOperationTask<Boolean>) r;
                 ILSMIOOperation executedOp = task.getOperation();
-                if (executedOp.getIOOpertionType() == LSMIOOpertionType.FLUSH) {
+                if (executedOp.getIOOpertionType() == LSMIOOperationType.FLUSH) {
                     String id = executedOp.getIndexIdentifier();
                     synchronized (this) {
                         runningFlushOperations.remove(id);
@@ -84,9 +84,9 @@
 
     @Override
     public void scheduleOperation(ILSMIOOperation operation) throws HyracksDataException {
-        if (operation.getIOOpertionType() == LSMIOOpertionType.MERGE) {
+        if (operation.getIOOpertionType() == LSMIOOperationType.MERGE) {
             executor.submit(operation);
-        } else if (operation.getIOOpertionType() == LSMIOOpertionType.FLUSH) {
+        } else if (operation.getIOOpertionType() == LSMIOOperationType.FLUSH) {
             String id = operation.getIndexIdentifier();
             synchronized (executor) {
                 if (runningFlushOperations.containsKey(id)) {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BlockingIOOperationCallbackWrapper.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BlockingIOOperationCallbackWrapper.java
index 8d0395f..e464231 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BlockingIOOperationCallbackWrapper.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BlockingIOOperationCallbackWrapper.java
@@ -23,9 +23,9 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 
 public class BlockingIOOperationCallbackWrapper implements ILSMIOOperationCallback {
 
@@ -45,18 +45,18 @@
     }
 
     @Override
-    public void beforeOperation(LSMOperationType opType) throws HyracksDataException {
+    public void beforeOperation(LSMIOOperationType opType) throws HyracksDataException {
         wrappedCallback.beforeOperation(opType);
     }
 
     @Override
-    public void afterOperation(LSMOperationType opType, List<ILSMComponent> oldComponents,
+    public void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents,
             ILSMDiskComponent newComponent) throws HyracksDataException {
         wrappedCallback.afterOperation(opType, oldComponents, newComponent);
     }
 
     @Override
-    public synchronized void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent)
+    public synchronized void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent)
             throws HyracksDataException {
         wrappedCallback.afterFinalize(opType, newComponent);
         notifyAll();
@@ -64,8 +64,8 @@
     }
 
     @Override
-    public void recycled(ILSMMemoryComponent component) throws HyracksDataException {
-        wrappedCallback.recycled(component);
+    public void recycled(ILSMMemoryComponent component, boolean componentSwitched) throws HyracksDataException {
+        wrappedCallback.recycled(component, componentSwitched);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BloomFilterBulkLoader.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BloomFilterBulkLoader.java
index 0dcf349..29ca388 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BloomFilterBulkLoader.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/BloomFilterBulkLoader.java
@@ -26,12 +26,12 @@
 
     private final IIndexBulkLoader bulkLoader;
 
+    private boolean endedBloomFilterLoad = false;
+
     public BloomFilterBulkLoader(IIndexBulkLoader bulkLoader) {
         this.bulkLoader = bulkLoader;
     }
 
-    private boolean endedBloomFilterLoad = false;
-
     @Override
     public ITupleReference add(ITupleReference tuple) throws HyracksDataException {
         bulkLoader.add(tuple);
@@ -40,7 +40,8 @@
 
     @Override
     public ITupleReference delete(ITupleReference tuple) throws HyracksDataException {
-        //Noop
+        // this ensure deleted keys are also added to the bulkloader
+        bulkLoader.add(tuple);
         return tuple;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ComponentReplacementContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ComponentReplacementContext.java
new file mode 100644
index 0000000..ee7afa0
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ComponentReplacementContext.java
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.common.impls;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
+import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
+import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ComponentReplacementContext implements ILSMIndexOperationContext {
+    private static final Logger LOGGER = LogManager.getLogger();
+    private final List<ILSMComponent> components;
+    private final List<ILSMComponent> diskComponents;
+    private final List<ILSMComponentId> replacedComponentIds;
+    private final int[] swapIndexes;
+    private int count = 0;
+    boolean accessingComponent = true;
+
+    public ComponentReplacementContext(ILSMIndex lsmIndex) {
+        components = new ArrayList<>(lsmIndex.getNumberOfAllMemoryComponents());
+        replacedComponentIds = new ArrayList<>(lsmIndex.getNumberOfAllMemoryComponents());
+        swapIndexes = new int[lsmIndex.getNumberOfAllMemoryComponents()];
+        diskComponents = new ArrayList<>(lsmIndex.getNumberOfAllMemoryComponents());
+    }
+
+    @Override
+    public void setOperation(IndexOperation newOp) throws HyracksDataException {
+        // Do nothing
+    }
+
+    @Override
+    public IndexOperation getOperation() {
+        return IndexOperation.SEARCH;
+    }
+
+    @Override
+    public void reset() {
+        accessingComponent = true;
+        components.clear();
+        diskComponents.clear();
+        replacedComponentIds.clear();
+        count = 0;
+    }
+
+    @Override
+    public List<ILSMComponent> getComponentHolder() {
+        return components;
+    }
+
+    @Override
+    public List<ILSMDiskComponent> getComponentsToBeMerged() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public ISearchOperationCallback getSearchOperationCallback() {
+        return null;
+    }
+
+    @Override
+    public IModificationOperationCallback getModificationCallback() {
+        return null;
+    }
+
+    @Override
+    public void setCurrentMutableComponentId(int currentMutableComponentId) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setSearchPredicate(ISearchPredicate searchPredicate) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ISearchPredicate getSearchPredicate() {
+        return null;
+    }
+
+    @Override
+    public List<ILSMDiskComponent> getComponentsToBeReplicated() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public boolean isAccessingComponents() {
+        return accessingComponent;
+    }
+
+    @Override
+    public void setAccessingComponents(boolean accessingComponents) {
+        // Ignore since this is only used for component replacement
+    }
+
+    @Override
+    public PermutingTupleReference getIndexTuple() {
+        return null;
+    }
+
+    @Override
+    public PermutingTupleReference getFilterTuple() {
+        return null;
+    }
+
+    @Override
+    public MultiComparator getFilterCmp() {
+        return null;
+    }
+
+    @Override
+    public void logPerformanceCounters(int tupleCount) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void incrementEnterExitTime(long increment) {
+        // Ignore since this is only used for component replacement
+    }
+
+    public boolean proceed(List<ILSMDiskComponent> allDiskComponents) throws HyracksDataException {
+        for (int i = 0; i < components.size(); i++) {
+            replacedComponentIds.add(components.get(i).getId());
+            // ensure that disk component exists
+            boolean found = false;
+            LOGGER.log(Level.INFO, "Looking for a component with the id: " + replacedComponentIds.get(i));
+            for (int j = 0; j < allDiskComponents.size(); j++) {
+                ILSMDiskComponent dc = allDiskComponents.get(j);
+                ILSMComponentId diskComponentId = dc.getId();
+                LOGGER.log(Level.INFO, "Next disk component id: " + diskComponentId);
+                if (diskComponentId.equals(replacedComponentIds.get(i))) {
+                    found = true;
+                    diskComponents.add(dc);
+                    break;
+                }
+            }
+            if (!found) {
+                // component has been merged?
+                LOGGER.log(Level.WARN, "Memory Component with id = " + replacedComponentIds.get(i)
+                        + " was flushed and merged before search cursor replaces it");
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public void swapIndex(int i) {
+        swapIndexes[count] = i;
+        count++;
+    }
+
+    public void prepareToEnter() {
+        components.clear();
+        components.addAll(diskComponents);
+        accessingComponent = false;
+    }
+
+    public void replace(ILSMIndexOperationContext ctx) {
+        // Called after exit and enter has been completed
+        try {
+            for (int i = 0; i < count; i++) {
+                ILSMComponent removed = ctx.getComponentHolder().remove(swapIndexes[i]);
+                if (removed.getType() == LSMComponentType.MEMORY) {
+                    LOGGER.log(Level.INFO, "Removed a memory component from the search operation");
+                } else {
+                    throw new IllegalStateException("Disk components can't be removed from the search operation");
+                }
+                ctx.getComponentHolder().add(swapIndexes[i], diskComponents.get(i));
+            }
+        } catch (Exception e) {
+            LOGGER.log(Level.WARN, "Failure replacing memory components with disk components", e);
+            throw e;
+        }
+    }
+
+    @Override
+    public ILSMIndex getIndex() {
+        return null;
+    }
+
+    @Override
+    public boolean isTracingEnabled() {
+        return false;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
index 847b882..13911ef 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ConstantMergePolicy.java
@@ -23,6 +23,8 @@
 import java.util.Map;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
@@ -30,6 +32,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 
 public class ConstantMergePolicy implements ILSMMergePolicy {
     private int numComponents;
@@ -43,12 +46,12 @@
         }
 
         if (fullMergeIsRequested) {
-            ILSMIndexAccessor accessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            IIndexAccessParameters iap =
+                    new IndexAccessParameters(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = index.createAccessor(iap);
             accessor.scheduleFullMerge(index.getIOOperationCallback());
         } else if (immutableComponents.size() >= numComponents) {
-            ILSMIndexAccessor accessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             accessor.scheduleMerge(index.getIOOperationCallback(), immutableComponents);
         }
     }
@@ -104,8 +107,7 @@
             if (!areComponentsMergable(immutableComponents)) {
                 throw new IllegalStateException();
             }
-            ILSMIndexAccessor accessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             accessor.scheduleMerge(index.getIOOperationCallback(), immutableComponents);
             return true;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/DiskBTreeFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/DiskBTreeFactory.java
new file mode 100644
index 0000000..ba863ac
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/DiskBTreeFactory.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.common.impls;
+
+import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
+import org.apache.hyracks.storage.am.common.api.IPageManagerFactory;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
+import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+
+public class DiskBTreeFactory extends TreeIndexFactory<DiskBTree> {
+
+    public DiskBTreeFactory(IIOManager ioManager, IBufferCache bufferCache, IPageManagerFactory freePageManagerFactory,
+            ITreeIndexFrameFactory interiorFrameFactory, ITreeIndexFrameFactory leafFrameFactory,
+            IBinaryComparatorFactory[] cmpFactories, int fieldCount) {
+        super(ioManager, bufferCache, freePageManagerFactory, interiorFrameFactory, leafFrameFactory, cmpFactories,
+                fieldCount);
+    }
+
+    @Override
+    public DiskBTree createIndexInstance(FileReference file) {
+        return new DiskBTree(bufferCache, freePageManagerFactory.createPageManager(bufferCache), interiorFrameFactory,
+                leafFrameFactory, cmpFactories, fieldCount, file);
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/EmptyComponent.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/EmptyComponent.java
index f2751bf..e3ca9f1 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/EmptyComponent.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/EmptyComponent.java
@@ -25,8 +25,8 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.common.IIndex;
 
@@ -83,8 +83,8 @@
     }
 
     @Override
-    public ILSMDiskComponentId getComponentId() throws HyracksDataException {
-        return null;
+    public ILSMComponentId getId() {
+        return LSMComponentId.MISSING_COMPONENT_ID;
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ExternalIndexHarness.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ExternalIndexHarness.java
index 2f4dcc2..d9d3a07 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ExternalIndexHarness.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ExternalIndexHarness.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -30,6 +28,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
@@ -40,9 +39,11 @@
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.util.trace.ITracer;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ExternalIndexHarness extends LSMHarness {
-    private static final Logger LOGGER = Logger.getLogger(ExternalIndexHarness.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     public ExternalIndexHarness(ILSMIndex lsmIndex, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker,
             boolean replicationEnabled) {
@@ -106,7 +107,7 @@
         // Check if there is any action that is needed to be taken based on the operation type
         switch (opType) {
             case MERGE:
-                lsmIndex.getIOOperationCallback().beforeOperation(LSMOperationType.MERGE);
+                lsmIndex.getIOOperationCallback().beforeOperation(LSMIOOperationType.MERGE);
             default:
                 break;
         }
@@ -207,7 +208,7 @@
     public void scheduleMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback)
             throws HyracksDataException {
         if (!getAndEnterComponents(ctx, LSMOperationType.MERGE, true)) {
-            callback.afterFinalize(LSMOperationType.MERGE, null);
+            callback.afterFinalize(LSMIOOperationType.MERGE, null);
             return;
         }
         lsmIndex.scheduleMerge(ctx, callback);
@@ -220,7 +221,7 @@
         if (!getAndEnterComponents(ctx, LSMOperationType.MERGE, true)) {
             // If the merge cannot be scheduled because there is already an ongoing merge on subset/all of the components, then
             // whenever the current merge has finished, it will schedule the full merge again.
-            callback.afterFinalize(LSMOperationType.MERGE, null);
+            callback.afterFinalize(LSMIOOperationType.MERGE, null);
             return;
         }
         fullMergeIsRequested.set(false);
@@ -229,20 +230,20 @@
 
     @Override
     public void merge(ILSMIndexOperationContext ctx, ILSMIOOperation operation) throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Started a merge operation for index: " + lsmIndex + " ...");
         }
 
         ILSMDiskComponent newComponent = null;
         try {
             newComponent = lsmIndex.merge(operation);
-            operation.getCallback().afterOperation(LSMOperationType.MERGE, ctx.getComponentHolder(), newComponent);
+            operation.getCallback().afterOperation(LSMIOOperationType.MERGE, ctx.getComponentHolder(), newComponent);
             newComponent.markAsValid(lsmIndex.isDurable());
         } finally {
             exitComponents(ctx, LSMOperationType.MERGE, newComponent, false);
-            operation.getCallback().afterFinalize(LSMOperationType.MERGE, newComponent);
+            operation.getCallback().afterFinalize(LSMIOOperationType.MERGE, newComponent);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished the merge operation for index: " + lsmIndex);
         }
     }
@@ -300,7 +301,7 @@
     @Override
     public void scheduleFlush(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback)
             throws HyracksDataException {
-        callback.afterFinalize(LSMOperationType.FLUSH, null);
+        callback.afterFinalize(LSMIOOperationType.FLUSH, null);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FilterBulkLoader.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FilterBulkLoader.java
index 7359d2b..625f81e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FilterBulkLoader.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FilterBulkLoader.java
@@ -35,9 +35,8 @@
     protected final PermutingTupleReference filterTuple;
     protected final MultiComparator filterCmp;
 
-    public FilterBulkLoader(ILSMComponentFilter filter, ITreeIndex treeIndex,
-            ILSMComponentFilterManager filterManager, int[] indexFields, int[] filterFields,
-            MultiComparator filterCmp) {
+    public FilterBulkLoader(ILSMComponentFilter filter, ITreeIndex treeIndex, ILSMComponentFilterManager filterManager,
+            int[] indexFields, int[] filterFields, MultiComparator filterCmp) {
         this.filter = filter;
         this.treeIndex = treeIndex;
         this.filterManager = filterManager;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FlushOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FlushOperation.java
index 7b7f950..d835021 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FlushOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/FlushOperation.java
@@ -27,7 +27,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 
-public class FlushOperation extends AbstractIoOperation implements Comparable<ILSMIOOperation> {
+public abstract class FlushOperation extends AbstractIoOperation implements Comparable<ILSMIOOperation> {
 
     public FlushOperation(ILSMIndexAccessor accessor, FileReference target, ILSMIOOperationCallback callback,
             String indexIdentifier) {
@@ -60,8 +60,8 @@
     }
 
     @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.FLUSH;
+    public LSMIOOperationType getIOOpertionType() {
+        return LSMIOOperationType.FLUSH;
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
index 8e98087..4dd57eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentFileReferences.java
@@ -49,4 +49,8 @@
     public FileReference getBloomFilterFileReference() {
         return bloomFilterFileReference;
     }
+
+    public FileReference[] getFileReferences() {
+        return new FileReference[] { insertIndexFileReference, deleteIndexFileReference, bloomFilterFileReference };
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentId.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentId.java
new file mode 100644
index 0000000..442af56
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentId.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.common.impls;
+
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+
+public class LSMComponentId implements ILSMComponentId {
+
+    public static final long NOT_FOUND = -1;
+
+    // Use to handle legacy datasets which do not have the component Id
+    public static final ILSMComponentId MISSING_COMPONENT_ID = new LSMComponentId(NOT_FOUND, NOT_FOUND);
+
+    // A default component id used for bulk loaded component
+    public static final ILSMComponentId DEFAULT_COMPONENT_ID = new LSMComponentId(0, 0);
+
+    private long minId;
+
+    private long maxId;
+
+    public LSMComponentId(long minId, long maxId) {
+        assert minId <= maxId;
+        this.minId = minId;
+        this.maxId = maxId;
+    }
+
+    public void reset(long minId, long maxId) {
+        this.minId = minId;
+        this.maxId = maxId;
+    }
+
+    public long getMinId() {
+        return this.minId;
+    }
+
+    public long getMaxId() {
+        return this.maxId;
+    }
+
+    @Override
+    public boolean missing() {
+        return minId == NOT_FOUND || maxId == NOT_FOUND;
+    }
+
+    @Override
+    public String toString() {
+        return "[" + minId + "," + maxId + "]";
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * Long.hashCode(minId) + Long.hashCode(maxId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof LSMComponentId)) {
+            return false;
+        }
+        LSMComponentId other = (LSMComponentId) obj;
+        return maxId == other.maxId && minId == other.minId;
+    }
+
+    @Override
+    public IdCompareResult compareTo(ILSMComponentId id) {
+        if (this.missing() || id == null || id.missing()) {
+            return IdCompareResult.UNKNOWN;
+        }
+        LSMComponentId componentId = (LSMComponentId) id;
+        if (this.getMinId() > componentId.getMaxId()) {
+            return IdCompareResult.GREATER_THAN;
+        } else if (this.getMaxId() < componentId.getMinId()) {
+            return IdCompareResult.LESS_THAN;
+        } else if (this.getMinId() <= componentId.getMinId() && this.getMaxId() >= componentId.getMaxId()) {
+            return IdCompareResult.INCLUDE;
+        } else {
+            return IdCompareResult.INTERSECT;
+        }
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGenerator.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGenerator.java
new file mode 100644
index 0000000..e174153
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGenerator.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.common.impls;
+
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+
+/**
+ * A default implementation of {@link ILSMComponentIdGenerator}.
+ *
+ */
+public class LSMComponentIdGenerator implements ILSMComponentIdGenerator {
+
+    protected long previousTimestamp = -1L;
+
+    private ILSMComponentId componentId;
+
+    public LSMComponentIdGenerator() {
+        refresh();
+    }
+
+    @Override
+    public void refresh() {
+        long ts = getCurrentTimestamp();
+        componentId = new LSMComponentId(ts, ts);
+    }
+
+    @Override
+    public ILSMComponentId getId() {
+        return componentId;
+    }
+
+    protected long getCurrentTimestamp() {
+        long timestamp = System.currentTimeMillis();
+        while (timestamp <= previousTimestamp) {
+            // make sure timestamp is strictly increasing
+            try {
+                Thread.sleep(1);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+            }
+            timestamp = System.currentTimeMillis();
+        }
+        previousTimestamp = timestamp;
+        return timestamp;
+
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGeneratorFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGeneratorFactory.java
new file mode 100644
index 0000000..d288ec8
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMComponentIdGeneratorFactory.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.common.impls;
+
+import org.apache.hyracks.api.application.INCServiceContext;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGenerator;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentIdGeneratorFactory;
+import org.apache.hyracks.storage.common.IResource;
+
+/**
+ * A default implementation of {@link ILSMComponentIdGeneratorFactory}.
+ *
+ */
+public class LSMComponentIdGeneratorFactory implements ILSMComponentIdGeneratorFactory {
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public ILSMComponentIdGenerator getComponentIdGenerator(INCServiceContext serviceCtx, IResource resource) {
+        return new LSMComponentIdGenerator();
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMDiskComponentId.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMDiskComponentId.java
deleted file mode 100644
index f448c84..0000000
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMDiskComponentId.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.hyracks.storage.am.lsm.common.impls;
-
-import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentId;
-
-public class LSMDiskComponentId implements ILSMDiskComponentId {
-
-    private final long minId;
-
-    private final long maxId;
-
-    public LSMDiskComponentId(long minId, long maxId) {
-        this.minId = minId;
-        this.maxId = maxId;
-    }
-
-    @Override
-    public long getMinId() {
-        return this.minId;
-    }
-
-    @Override
-    public long getMaxId() {
-        return this.maxId;
-    }
-
-    @Override
-    public String toString() {
-        return "[" + minId + "," + maxId + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        return 31 * Long.hashCode(minId) + Long.hashCode(maxId);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof LSMDiskComponentId)) {
-            return false;
-        }
-        LSMDiskComponentId other = (LSMDiskComponentId) obj;
-        if (maxId != other.maxId) {
-            return false;
-        }
-        if (minId != other.minId) {
-            return false;
-        }
-        return true;
-    }
-
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java
index 00f0feb..fa3093c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMHarness.java
@@ -24,8 +24,6 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Predicate;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -34,7 +32,7 @@
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.data.accessors.FrameTupleReference;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameTupleProcessor;
@@ -44,6 +42,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
@@ -57,11 +56,15 @@
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.util.trace.ITracer;
 import org.apache.hyracks.util.trace.ITracer.Scope;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LSMHarness implements ILSMHarness {
-    private static final Logger LOGGER = Logger.getLogger(LSMHarness.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     protected final ILSMIndex lsmIndex;
+    protected final ComponentReplacementContext componentReplacementCtx;
     protected final ILSMMergePolicy mergePolicy;
     protected final ILSMOperationTracker opTracker;
     protected final AtomicBoolean fullMergeIsRequested;
@@ -83,74 +86,97 @@
         if (replicationEnabled) {
             this.componentsToBeReplicated = new ArrayList<>();
         }
+        componentReplacementCtx = new ComponentReplacementContext(lsmIndex);
     }
 
     protected boolean getAndEnterComponents(ILSMIndexOperationContext ctx, LSMOperationType opType,
             boolean isTryOperation) throws HyracksDataException {
-        validateOperationEnterComponentsState(ctx);
-        synchronized (opTracker) {
-            while (true) {
-                lsmIndex.getOperationalComponents(ctx);
-                // Before entering the components, prune those corner cases that indeed should not proceed.
-                switch (opType) {
-                    case FLUSH:
-                        ILSMMemoryComponent flushingComponent = (ILSMMemoryComponent) ctx.getComponentHolder().get(0);
-                        if (!flushingComponent.isModified()) {
-                            //The mutable component has not been modified by any writer. There is nothing to flush.
-                            //since the component is empty, set its state back to READABLE_WRITABLE
-                            if (flushingComponent.getState() == ComponentState.READABLE_UNWRITABLE) {
-                                flushingComponent.setState(ComponentState.READABLE_WRITABLE);
-                                opTracker.notifyAll();
+        long before = 0L;
+        if (ctx.isTracingEnabled()) {
+            before = System.nanoTime();
+        }
+        try {
+            validateOperationEnterComponentsState(ctx);
+            synchronized (opTracker) {
+                while (true) {
+                    lsmIndex.getOperationalComponents(ctx);
+                    // Before entering the components, prune those corner cases that indeed should not proceed.
+                    switch (opType) {
+                        case FLUSH:
+                            // if the lsm index does not have memory components allocated, then nothing to flush
+                            if (!lsmIndex.isMemoryComponentsAllocated()) {
+                                return false;
                             }
-                            lsmIndex.getIOOperationCallback().recycled(flushingComponent);
-                            return false;
-                        }
-                        if (flushingComponent.getWriterCount() > 0) {
-                            /*
-                             * This case is a case where even though FLUSH log was flushed to disk and scheduleFlush is triggered,
-                             * the current in-memory component (whose state was changed to READABLE_WRITABLE (RW)
-                             * from READABLE_UNWRITABLE(RU) before FLUSH log was written to log tail (which is memory buffer of log file)
-                             * and then the state was changed back to RW (as shown in the following scenario)) can have writers
-                             * based on the current code base/design.
-                             * Thus, the writer count of the component may be greater than 0.
-                             * if this happens, intead of throwing exception, scheduleFlush() deal with this situation by not flushing
-                             * the component.
-                             * Please see issue 884 for more detail information:
-                             * https://code.google.com/p/asterixdb/issues/detail?id=884&q=owner%3Akisskys%40gmail.com&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary%20ETA%20Severity
-                             *
-                             */
-                            return false;
-                        }
-                        break;
-                    case MERGE:
-                        if (ctx.getComponentHolder().size() < 2
-                                && ctx.getOperation() != IndexOperation.DELETE_DISK_COMPONENTS) {
-                            // There is only a single component. There is nothing to merge.
-                            return false;
-                        }
-                        break;
-                    default:
-                        break;
-                }
-                if (enterComponents(ctx, opType)) {
-                    return true;
-                } else if (isTryOperation) {
-                    return false;
-                }
-                try {
-                    // Flush and merge operations should never reach this wait call, because they are always try operations.
-                    // If they fail to enter the components, then it means that there are an ongoing flush/merge operation on
-                    // the same components, so they should not proceed.
-                    if (opType == LSMOperationType.MODIFICATION) {
-                        // before waiting, make sure the index is in a modifiable state to avoid waiting forever.
-                        ensureIndexModifiable();
+                            ILSMMemoryComponent flushingComponent =
+                                    (ILSMMemoryComponent) ctx.getComponentHolder().get(0);
+                            if (!flushingComponent.isModified()) {
+                                recycle(flushingComponent);
+                                return false;
+                            }
+                            if (flushingComponent.getWriterCount() > 0) {
+                                /*
+                                 * This case is a case where even though FLUSH log was flushed to disk
+                                 * and scheduleFlush is triggered, the current in-memory component (whose state was
+                                 * changed to READABLE_WRITABLE (RW) from READABLE_UNWRITABLE(RU) before FLUSH log
+                                 * was written to log tail (which is memory buffer of log file) and then the state was
+                                 * changed back to RW (as shown in the following scenario)) can have writers based on
+                                 * the current code base/design. Thus, the writer count of the component may be greater
+                                 * than 0. if this happens, intead of throwing exception, scheduleFlush() deal with
+                                 * this situation by not flushing the component.
+                                 * for more detailed information: ASTERIXDB-1027
+                                 */
+                                return false;
+                            }
+                            break;
+                        case MERGE:
+                            if (ctx.getComponentHolder().size() < 2
+                                    && ctx.getOperation() != IndexOperation.DELETE_DISK_COMPONENTS) {
+                                // There is only a single component. There is nothing to merge.
+                                return false;
+                            }
+                            break;
+                        default:
+                            break;
                     }
-                    opTracker.wait();
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    throw HyracksDataException.create(e);
+                    if (enterComponents(ctx, opType)) {
+                        return true;
+                    } else if (isTryOperation) {
+                        return false;
+                    }
+                    try {
+                        // Flush and merge operations should never reach this wait call,
+                        // because they are always try operations. If they fail to enter the components,
+                        // then it means that there are an ongoing flush/merge operation on
+                        // the same components, so they should not proceed.
+                        if (opType == LSMOperationType.MODIFICATION) {
+                            // before waiting, make sure the index is in a modifiable state to avoid waiting forever.
+                            ensureIndexModifiable();
+                        }
+                        opTracker.wait();
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        throw HyracksDataException.create(e);
+                    }
                 }
             }
+        } finally {
+            if (ctx.isTracingEnabled()) {
+                ctx.incrementEnterExitTime(System.nanoTime() - before);
+            }
+        }
+    }
+
+    private void recycle(ILSMMemoryComponent flushingComponent) throws HyracksDataException {
+        if (flushingComponent.getState() == ComponentState.READABLE_UNWRITABLE) {
+            //The mutable component has not been modified by any writer.
+            // There is nothing to flush. Since the component is empty, set its state back
+            // to READABLE_WRITABLE only when it's state has been set to READABLE_UNWRITABLE
+            flushingComponent.setState(ComponentState.READABLE_WRITABLE);
+            opTracker.notifyAll(); // NOSONAR: Always synchronized from caller
+            // Call recycled only when we change it's state is reset back to READABLE_WRITABLE
+            // Otherwise, if the component is in other state, e.g., INACTIVE, or
+            // READABLE_UNWRITABLE_FLUSHING, it's not considered as being recycled here.
+            lsmIndex.getIOOperationCallback().recycled(flushingComponent, false);
         }
     }
 
@@ -169,9 +195,9 @@
                 numEntered++;
             }
             entranceSuccessful = numEntered == components.size();
-        } catch (Throwable e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, opType.name() + " failed to enter components on " + lsmIndex, e);
+        } catch (Throwable e) { // NOSONAR: Log and re-throw
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.log(Level.ERROR, opType.name() + " failed to enter components on " + lsmIndex, e);
             }
             throw e;
         } finally {
@@ -186,23 +212,25 @@
                     i++;
                     numEntered--;
                 }
-                return false;
             }
-            ctx.setAccessingComponents(true);
         }
+        if (!entranceSuccessful) {
+            return false;
+        }
+        ctx.setAccessingComponents(true);
         // Check if there is any action that is needed to be taken based on the operation type
         switch (opType) {
             case FLUSH:
-                lsmIndex.getIOOperationCallback().beforeOperation(LSMOperationType.FLUSH);
+                lsmIndex.getIOOperationCallback().beforeOperation(LSMIOOperationType.FLUSH);
                 // Changing the flush status should *always* precede changing the mutable component.
                 lsmIndex.changeFlushStatusForCurrentMutableCompoent(false);
                 lsmIndex.changeMutableComponent();
                 // Notify all waiting threads whenever a flush has been scheduled since they will check
                 // again if they can grab and enter the mutable component.
-                opTracker.notifyAll();
+                opTracker.notifyAll(); // NOSONAR: Always called from a synchronized block
                 break;
             case MERGE:
-                lsmIndex.getIOOperationCallback().beforeOperation(LSMOperationType.MERGE);
+                lsmIndex.getIOOperationCallback().beforeOperation(LSMIOOperationType.MERGE);
                 break;
             default:
                 break;
@@ -211,8 +239,8 @@
         return true;
     }
 
-    private void exitComponents(ILSMIndexOperationContext ctx, LSMOperationType opType, ILSMDiskComponent newComponent,
-            boolean failedOperation) throws HyracksDataException {
+    private void doExitComponents(ILSMIndexOperationContext ctx, LSMOperationType opType,
+            ILSMDiskComponent newComponent, boolean failedOperation) throws HyracksDataException {
         /**
          * FLUSH and MERGE operations should always exit the components
          * to notify waiting threads.
@@ -239,84 +267,20 @@
                     } else if (opType == LSMOperationType.MERGE) {
                         opTracker.notifyAll();
                     }
-
-                    int i = 0;
-                    // First check if there is any action that is needed to be taken based on the state of each component.
-                    for (ILSMComponent c : ctx.getComponentHolder()) {
-                        boolean isMutableComponent = i == 0 && c.getType() == LSMComponentType.MEMORY ? true : false;
-                        c.threadExit(opType, failedOperation, isMutableComponent);
-                        if (c.getType() == LSMComponentType.MEMORY) {
-                            switch (c.getState()) {
-                                case READABLE_UNWRITABLE:
-                                    if (isMutableComponent && (opType == LSMOperationType.MODIFICATION
-                                            || opType == LSMOperationType.FORCE_MODIFICATION)) {
-                                        lsmIndex.changeFlushStatusForCurrentMutableCompoent(true);
-                                    }
-                                    break;
-                                case INACTIVE:
-                                    tracer.instant(c.toString(), traceCategory, Scope.p, lsmIndex.toString());
-                                    ((AbstractLSMMemoryComponent) c).reset();
-                                    // Notify all waiting threads whenever the mutable component's state has changed to
-                                    // inactive. This is important because even though we switched the mutable
-                                    // components, it is possible that the component that we just switched to is still
-                                    // busy flushing its data to disk. Thus, the notification that was issued upon
-                                    // scheduling the flush is not enough.
-                                    opTracker.notifyAll();
-                                    break;
-                                default:
-                                    break;
-                            }
-                        } else {
-                            switch (c.getState()) {
-                                case INACTIVE:
-                                    lsmIndex.addInactiveDiskComponent((AbstractLSMDiskComponent) c);
-                                    break;
-                                default:
-                                    break;
-                            }
-                        }
-                        i++;
-                    }
+                    exitOperationalComponents(ctx, opType, failedOperation);
                     ctx.setAccessingComponents(false);
-                    // Then, perform any action that is needed to be taken based on the operation type.
-                    switch (opType) {
-                        case FLUSH:
-                            // newComponent is null if the flush op. was not performed.
-                            if (!failedOperation && newComponent != null) {
-                                lsmIndex.addDiskComponent(newComponent);
-                                if (replicationEnabled) {
-                                    componentsToBeReplicated.clear();
-                                    componentsToBeReplicated.add(newComponent);
-                                    triggerReplication(componentsToBeReplicated, false, opType);
-                                }
-                                mergePolicy.diskComponentAdded(lsmIndex, false);
-                            }
-                            break;
-                        case MERGE:
-                            // newComponent is null if the merge op. was not performed.
-                            if (!failedOperation && newComponent != null) {
-                                lsmIndex.subsumeMergedComponents(newComponent, ctx.getComponentHolder());
-                                if (replicationEnabled) {
-                                    componentsToBeReplicated.clear();
-                                    componentsToBeReplicated.add(newComponent);
-                                    triggerReplication(componentsToBeReplicated, false, opType);
-                                }
-                                mergePolicy.diskComponentAdded(lsmIndex, fullMergeIsRequested.get());
-                            }
-                            break;
-                        default:
-                            break;
-                    }
-                } catch (Throwable e) {
-                    if (LOGGER.isLoggable(Level.SEVERE)) {
-                        LOGGER.log(Level.SEVERE, e.getMessage(), e);
+                    exitOperation(ctx, opType, newComponent, failedOperation);
+                } catch (Throwable e) { // NOSONAR: Log and re-throw
+                    if (LOGGER.isErrorEnabled()) {
+                        LOGGER.log(Level.ERROR, e.getMessage(), e);
                     }
                     throw e;
                 } finally {
                     if (failedOperation && (opType == LSMOperationType.MODIFICATION
                             || opType == LSMOperationType.FORCE_MODIFICATION)) {
                         //When the operation failed, completeOperation() method must be called
-                        //in order to decrement active operation count which was incremented in beforeOperation() method.
+                        //in order to decrement active operation count which was incremented
+                        // in beforeOperation() method.
                         opTracker.completeOperation(lsmIndex, opType, ctx.getSearchOperationCallback(),
                                 ctx.getModificationCallback());
                     } else {
@@ -334,9 +298,8 @@
                     if (!inactiveDiskComponents.isEmpty()) {
                         for (ILSMDiskComponent inactiveComp : inactiveDiskComponents) {
                             if (inactiveComp.getFileReferenceCount() == 1) {
-                                if (inactiveDiskComponentsToBeDeleted == null) {
-                                    inactiveDiskComponentsToBeDeleted = new LinkedList<>();
-                                }
+                                inactiveDiskComponentsToBeDeleted = inactiveDiskComponentsToBeDeleted == null
+                                        ? new LinkedList<>() : inactiveDiskComponentsToBeDeleted;
                                 inactiveDiskComponentsToBeDeleted.add(inactiveComp);
                             }
                         }
@@ -360,15 +323,97 @@
                     for (ILSMDiskComponent c : inactiveDiskComponentsToBeDeleted) {
                         c.deactivateAndDestroy();
                     }
-                } catch (Throwable e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Failure scheduling replication or destroying merged component", e);
+                } catch (Throwable e) { // NOSONAR Log and re-throw
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.log(Level.WARN, "Failure scheduling replication or destroying merged component", e);
                     }
-                    throw e;
+                    throw e; // NOSONAR: The last call in the finally clause
                 }
             }
         }
+    }
 
+    private void exitOperation(ILSMIndexOperationContext ctx, LSMOperationType opType, ILSMDiskComponent newComponent,
+            boolean failedOperation) throws HyracksDataException {
+        // Then, perform any action that is needed to be taken based on the operation type.
+        switch (opType) {
+            case FLUSH:
+                // newComponent is null if the flush op. was not performed.
+                if (!failedOperation && newComponent != null) {
+                    lsmIndex.addDiskComponent(newComponent);
+                    if (replicationEnabled && newComponent != EmptyComponent.INSTANCE) {
+                        componentsToBeReplicated.clear();
+                        componentsToBeReplicated.add(newComponent);
+                        triggerReplication(componentsToBeReplicated, false, opType);
+                    }
+                    mergePolicy.diskComponentAdded(lsmIndex, false);
+                }
+                break;
+            case MERGE:
+                // newComponent is null if the merge op. was not performed.
+                if (!failedOperation && newComponent != null) {
+                    lsmIndex.subsumeMergedComponents(newComponent, ctx.getComponentHolder());
+                    if (replicationEnabled && newComponent != EmptyComponent.INSTANCE) {
+                        componentsToBeReplicated.clear();
+                        componentsToBeReplicated.add(newComponent);
+                        triggerReplication(componentsToBeReplicated, false, opType);
+                    }
+                    mergePolicy.diskComponentAdded(lsmIndex, fullMergeIsRequested.get());
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void exitOperationalComponents(ILSMIndexOperationContext ctx, LSMOperationType opType,
+            boolean failedOperation) throws HyracksDataException {
+        // First check if there is any action that is needed to be taken
+        // based on the state of each component.
+        for (int i = 0; i < ctx.getComponentHolder().size(); i++) {
+            ILSMComponent c = ctx.getComponentHolder().get(i);
+            boolean isMutableComponent = i == 0 && c.getType() == LSMComponentType.MEMORY ? true : false;
+            c.threadExit(opType, failedOperation, isMutableComponent);
+            if (c.getType() == LSMComponentType.MEMORY) {
+                switch (c.getState()) {
+                    case READABLE_UNWRITABLE:
+                        if (isMutableComponent && (opType == LSMOperationType.MODIFICATION
+                                || opType == LSMOperationType.FORCE_MODIFICATION)) {
+                            lsmIndex.changeFlushStatusForCurrentMutableCompoent(true);
+                        }
+                        break;
+                    case INACTIVE:
+                        tracer.instant(c.toString(), traceCategory, Scope.p, lsmIndex.toString());
+                        ((AbstractLSMMemoryComponent) c).reset();
+                        // Notify all waiting threads whenever the mutable component's state
+                        // has changed to inactive. This is important because even though we switched
+                        // the mutable components, it is possible that the component that we just
+                        // switched to is still busy flushing its data to disk. Thus, the notification
+                        // that was issued upon scheduling the flush is not enough.
+                        opTracker.notifyAll(); // NOSONAR: Always called inside synchronized block
+                        break;
+                    default:
+                        break;
+                }
+            } else if (c.getState() == ComponentState.INACTIVE) {
+                lsmIndex.addInactiveDiskComponent((AbstractLSMDiskComponent) c);
+            }
+        }
+    }
+
+    private void exitComponents(ILSMIndexOperationContext ctx, LSMOperationType opType, ILSMDiskComponent newComponent,
+            boolean failedOperation) throws HyracksDataException {
+        long before = 0L;
+        if (ctx.isTracingEnabled()) {
+            before = System.nanoTime();
+        }
+        try {
+            doExitComponents(ctx, opType, newComponent, failedOperation);
+        } finally {
+            if (ctx.isTracingEnabled()) {
+                ctx.incrementEnterExitTime(System.nanoTime() - before);
+            }
+        }
     }
 
     @Override
@@ -504,7 +549,7 @@
     public void scheduleFlush(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback)
             throws HyracksDataException {
         if (!getAndEnterComponents(ctx, LSMOperationType.FLUSH, true)) {
-            callback.afterFinalize(LSMOperationType.FLUSH, null);
+            callback.afterFinalize(LSMIOOperationType.FLUSH, null);
             return;
         }
         lsmIndex.scheduleFlush(ctx, callback);
@@ -512,27 +557,36 @@
 
     @Override
     public void flush(ILSMIndexOperationContext ctx, ILSMIOOperation operation) throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Started a flush operation for index: " + lsmIndex + " ...");
         }
-
-        ILSMDiskComponent newComponent = null;
-        boolean failedOperation = false;
         try {
-            newComponent = lsmIndex.flush(operation);
-            operation.getCallback().afterOperation(LSMOperationType.FLUSH, null, newComponent);
-            newComponent.markAsValid(lsmIndex.isDurable());
-        } catch (Throwable e) {
-            failedOperation = true;
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "Flush failed on " + lsmIndex, e);
+            ILSMDiskComponent newComponent = null;
+            boolean failedOperation = false;
+            try {
+                newComponent = lsmIndex.flush(operation);
+                operation.getCallback().afterOperation(LSMIOOperationType.FLUSH, null, newComponent);
+                newComponent.markAsValid(lsmIndex.isDurable());
+            } catch (Throwable e) { // NOSONAR Log and re-throw
+                failedOperation = true;
+                if (LOGGER.isErrorEnabled()) {
+                    LOGGER.log(Level.ERROR, "Flush failed on " + lsmIndex, e);
+                }
+                throw e;
+            } finally {
+                exitComponents(ctx, LSMOperationType.FLUSH, newComponent, failedOperation);
+                operation.getCallback().afterFinalize(LSMIOOperationType.FLUSH, newComponent);
+
             }
-            throw e;
         } finally {
-            exitComponents(ctx, LSMOperationType.FLUSH, newComponent, failedOperation);
-            operation.getCallback().afterFinalize(LSMOperationType.FLUSH, newComponent);
+            /*
+             * Completion of flush/merge operations is done explicitly here to make sure all generated files during
+             * io operations is completed before the io operation is declared complete
+             */
+            opTracker.completeOperation(lsmIndex, LSMOperationType.FLUSH, ctx.getSearchOperationCallback(),
+                    ctx.getModificationCallback());
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished the flush operation for index: " + lsmIndex);
         }
     }
@@ -541,7 +595,7 @@
     public void scheduleMerge(ILSMIndexOperationContext ctx, ILSMIOOperationCallback callback)
             throws HyracksDataException {
         if (!getAndEnterComponents(ctx, LSMOperationType.MERGE, true)) {
-            callback.afterFinalize(LSMOperationType.MERGE, null);
+            callback.afterFinalize(LSMIOOperationType.MERGE, null);
             return;
         }
         lsmIndex.scheduleMerge(ctx, callback);
@@ -552,9 +606,10 @@
             throws HyracksDataException {
         fullMergeIsRequested.set(true);
         if (!getAndEnterComponents(ctx, LSMOperationType.MERGE, true)) {
-            // If the merge cannot be scheduled because there is already an ongoing merge on subset/all of the components, then
-            // whenever the current merge has finished, it will schedule the full merge again.
-            callback.afterFinalize(LSMOperationType.MERGE, null);
+            // If the merge cannot be scheduled because there is already an ongoing merge on
+            // subset/all of the components, then whenever the current merge has finished,
+            // it will schedule the full merge again.
+            callback.afterFinalize(LSMIOOperationType.MERGE, null);
             return;
         }
         fullMergeIsRequested.set(false);
@@ -563,42 +618,47 @@
 
     @Override
     public void merge(ILSMIndexOperationContext ctx, ILSMIOOperation operation) throws HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Started a merge operation for index: " + lsmIndex + " ...");
         }
-
-        ILSMDiskComponent newComponent = null;
-        boolean failedOperation = false;
         try {
-            newComponent = lsmIndex.merge(operation);
-            operation.getCallback().afterOperation(LSMOperationType.MERGE, ctx.getComponentHolder(), newComponent);
-            newComponent.markAsValid(lsmIndex.isDurable());
-        } catch (Throwable e) {
-            failedOperation = true;
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "Failed merge operation on " + lsmIndex, e);
+            ILSMDiskComponent newComponent = null;
+            boolean failedOperation = false;
+            try {
+                newComponent = lsmIndex.merge(operation);
+                operation.getCallback().afterOperation(LSMIOOperationType.MERGE, ctx.getComponentHolder(),
+                        newComponent);
+                newComponent.markAsValid(lsmIndex.isDurable());
+            } catch (Throwable e) { // NOSONAR: Log and re-throw
+                failedOperation = true;
+                if (LOGGER.isErrorEnabled()) {
+                    LOGGER.log(Level.ERROR, "Failed merge operation on " + lsmIndex, e);
+                }
+                throw e;
+            } finally {
+                exitComponents(ctx, LSMOperationType.MERGE, newComponent, failedOperation);
+                operation.getCallback().afterFinalize(LSMIOOperationType.MERGE, newComponent);
             }
-            throw e;
         } finally {
-            exitComponents(ctx, LSMOperationType.MERGE, newComponent, failedOperation);
-            // Completion of the merge operation is called here to and not on afterOperation because
-            // Deletion of the old components comes after afterOperation is called and the number of
-            // io operation should not be decremented before the operation is complete to avoid
-            // index destroy from competing with the merge on deletion of the files.
-            // The order becomes:
-            // 1. scheduleMerge
-            // 2. enterComponents
-            // 3. beforeOperation (increment the numOfIoOperations)
-            // 4. merge
-            // 5. exitComponents
-            // 6. afterOperation (no op)
-            // 7. delete components
-            // 8. completeOperation (decrement the numOfIoOperations)
+            /*
+             * Completion of the merge operation is called here to and not on afterOperation because
+             * deletion of old components comes after afterOperation is called and the number of
+             * io operation should not be decremented before the operation is complete to avoid
+             * index destroy from competing with the merge on deletion of the files.
+             * The order becomes:
+             * 1. scheduleMerge
+             * 2. enterComponents
+             * 3. beforeOperation (increment the numOfIoOperations)
+             * 4. merge
+             * 5. exitComponents
+             * 6. afterOperation (no op)
+             * 7. delete components
+             * 8. completeOperation (decrement the numOfIoOperations)
+             */
             opTracker.completeOperation(lsmIndex, LSMOperationType.MERGE, ctx.getSearchOperationCallback(),
                     ctx.getModificationCallback());
-            operation.getCallback().afterFinalize(LSMOperationType.MERGE, newComponent);
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Finished the merge operation for index: " + lsmIndex);
         }
     }
@@ -624,8 +684,7 @@
 
     protected void triggerReplication(List<ILSMDiskComponent> lsmComponents, boolean bulkload, LSMOperationType opType)
             throws HyracksDataException {
-        ILSMIndexAccessor accessor =
-                lsmIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor accessor = lsmIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         accessor.scheduleReplication(lsmComponents, bulkload, opType);
     }
 
@@ -692,12 +751,13 @@
                 processor.finish();
             }
         } catch (HyracksDataException e) {
-            if (LOGGER.isLoggable(Level.SEVERE)) {
-                LOGGER.log(Level.SEVERE, "Failed to process frame", e);
+            if (LOGGER.isErrorEnabled()) {
+                LOGGER.log(Level.ERROR, "Failed to process frame", e);
             }
             throw e;
         } finally {
             exit(ctx);
+            ctx.logPerformanceCounters(accessor.getTupleCount());
         }
     }
 
@@ -746,9 +806,8 @@
                     opTracker.wait();
                 } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Ignoring interrupt while waiting for lagging merge on " + lsmIndex,
-                                e);
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.log(Level.WARN, "Ignoring interrupt while waiting for lagging merge on " + lsmIndex, e);
                     }
                 }
             }
@@ -831,7 +890,7 @@
             try {
                 opTracker.wait(); // NOSONAR: OpTracker is always synchronized here
             } catch (InterruptedException e) {
-                LOGGER.log(Level.WARNING, "Interrupted while attempting component level delete", e);
+                LOGGER.log(Level.WARN, "Interrupted while attempting component level delete", e);
                 Thread.currentThread().interrupt();
                 throw HyracksDataException.create(e);
             }
@@ -869,4 +928,36 @@
     public String toString() {
         return getClass().getSimpleName() + ":" + lsmIndex;
     }
+
+    @Override
+    public void replaceMemoryComponentsWithDiskComponents(ILSMIndexOperationContext ctx, int startIndex)
+            throws HyracksDataException {
+        synchronized (opTracker) {
+            componentReplacementCtx.reset();
+            for (int i = 0; i < ctx.getComponentHolder().size(); i++) {
+                if (i >= startIndex) {
+                    ILSMComponent next = ctx.getComponentHolder().get(i);
+                    if (next.getType() == LSMComponentType.MEMORY
+                            && next.getState() == ComponentState.UNREADABLE_UNWRITABLE) {
+                        componentReplacementCtx.getComponentHolder().add(next);
+                        componentReplacementCtx.swapIndex(i);
+                    }
+                }
+            }
+            if (componentReplacementCtx.getComponentHolder().isEmpty()) {
+                throw new IllegalStateException(
+                        "replaceMemoryComponentsWithDiskComponents called with no potential components");
+            }
+            // before we exit, we should keep the replaced component ids
+            // we should also ensure that exact disk component replacement exist
+            if (componentReplacementCtx.proceed(lsmIndex.getDiskComponents())) {
+                // exit old component
+                exitComponents(componentReplacementCtx, LSMOperationType.SEARCH, null, false);
+                // enter new component
+                componentReplacementCtx.prepareToEnter();
+                enterComponents(componentReplacementCtx, LSMOperationType.SEARCH);
+                componentReplacementCtx.replace(ctx);
+            }
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexDiskComponentBulkLoader.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexDiskComponentBulkLoader.java
index 8befee1..7bc0660 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexDiskComponentBulkLoader.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexDiskComponentBulkLoader.java
@@ -21,13 +21,14 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentBulkLoader;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 
 public class LSMIndexDiskComponentBulkLoader implements IIndexBulkLoader {
     private final AbstractLSMIndex lsmIndex;
     private final ILSMDiskComponent component;
-    private final IIndexBulkLoader componentBulkLoader;
+    private final ILSMDiskComponentBulkLoader componentBulkLoader;
 
     public LSMIndexDiskComponentBulkLoader(AbstractLSMIndex lsmIndex, float fillFactor, boolean verifyInput,
             long numElementsHint) throws HyracksDataException {
@@ -39,26 +40,43 @@
                 component.createBulkLoader(fillFactor, verifyInput, numElementsHint, false, true, true);
     }
 
+    public ILSMDiskComponent getComponent() {
+        return component;
+    }
+
     @Override
     public void add(ITupleReference tuple) throws HyracksDataException {
         componentBulkLoader.add(tuple);
     }
 
+    public void delete(ITupleReference tuple) throws HyracksDataException {
+        componentBulkLoader.delete(tuple);
+    }
+
     @Override
     public void end() throws HyracksDataException {
-        componentBulkLoader.end();
-        if (component.getComponentSize() > 0) {
-            //TODO(amoudi): Ensure Bulk load follow the same lifecycle Other Operations (Flush, Merge, etc).
-            //then after operation should be called from harness as well
-            //https://issues.apache.org/jira/browse/ASTERIXDB-1764
-            lsmIndex.getIOOperationCallback().afterOperation(LSMOperationType.FLUSH, null, component);
-            lsmIndex.getLsmHarness().addBulkLoadedComponent(component);
+        try {
+            componentBulkLoader.end();
+            if (component.getComponentSize() > 0) {
+                //TODO(amoudi): Ensure Bulk load follow the same lifecycle Other Operations (Flush, Merge, etc).
+                //then after operation should be called from harness as well
+                //https://issues.apache.org/jira/browse/ASTERIXDB-1764
+                lsmIndex.getIOOperationCallback().afterOperation(LSMIOOperationType.LOAD, null, component);
+                lsmIndex.getHarness().addBulkLoadedComponent(component);
+            }
+        } finally {
+            lsmIndex.getIOOperationCallback().afterFinalize(LSMIOOperationType.LOAD, component);
         }
     }
 
     @Override
     public void abort() throws HyracksDataException {
-        componentBulkLoader.abort();
+        try {
+            componentBulkLoader.abort();
+            lsmIndex.getIOOperationCallback().afterOperation(LSMIOOperationType.LOAD, null, null);
+        } finally {
+            lsmIndex.getIOOperationCallback().afterFinalize(LSMIOOperationType.LOAD, null);
+        }
     }
 
 }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexReplicationJob.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexReplicationJob.java
index a35d00e..1c28ef1 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexReplicationJob.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexReplicationJob.java
@@ -45,7 +45,7 @@
     @Override
     public void endReplication() throws HyracksDataException {
         if (operationContext != null) {
-            ((AbstractLSMIndex) (lsmIndex)).getLsmHarness().endReplication(operationContext);
+            ((AbstractLSMIndex) (lsmIndex)).getHarness().endReplication(operationContext);
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
index 724a909..7f3a371 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMIndexSearchCursor.java
@@ -24,8 +24,9 @@
 import java.util.PriorityQueue;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
@@ -33,12 +34,15 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMTreeTupleReference;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public abstract class LSMIndexSearchCursor implements ITreeIndexCursor {
+public abstract class LSMIndexSearchCursor implements ILSMIndexCursor {
+    protected static final int SWITCH_COMPONENT_CYCLE = 100;
     protected final ILSMIndexOperationContext opCtx;
     protected final boolean returnDeletedTuples;
     protected PriorityQueueElement outputElement;
+    protected final ArrayTupleBuilder[] switchComponentTupleBuilders;
+    protected final boolean[] switchRequest;
+    protected final PriorityQueueElement[] switchedElements;
     protected IIndexCursor[] rangeCursors;
     protected PriorityQueueElement[] pqes;
     protected PriorityQueue<PriorityQueueElement> outputPriorityQueue;
@@ -47,6 +51,8 @@
     protected boolean needPushElementIntoQueue;
     protected boolean includeMutableComponent;
     protected ILSMHarness lsmHarness;
+    protected boolean switchPossible = true;
+    protected int hasNextCallCount = 0;
 
     protected List<ILSMComponent> operationalComponents;
 
@@ -55,6 +61,9 @@
         this.returnDeletedTuples = returnDeletedTuples;
         outputElement = null;
         needPushElementIntoQueue = false;
+        switchComponentTupleBuilders = new ArrayTupleBuilder[opCtx.getIndex().getNumberOfAllMemoryComponents()];
+        switchRequest = new boolean[switchComponentTupleBuilders.length];
+        switchedElements = new PriorityQueueElement[switchComponentTupleBuilders.length];
     }
 
     public ILSMIndexOperationContext getOpCtx() {
@@ -97,10 +106,14 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
+        hasNextCallCount = 0;
+        switchPossible = true;
         outputElement = null;
         needPushElementIntoQueue = false;
-
+        for (int i = 0; i < switchRequest.length; i++) {
+            switchRequest[i] = false;
+        }
         try {
             if (outputPriorityQueue != null) {
                 outputPriorityQueue.clear();
@@ -108,7 +121,7 @@
 
             if (rangeCursors != null) {
                 for (int i = 0; i < rangeCursors.length; i++) {
-                    rangeCursors[i].reset();
+                    rangeCursors[i].close();
                 }
             }
             rangeCursors = null;
@@ -121,6 +134,7 @@
 
     @Override
     public boolean hasNext() throws HyracksDataException {
+        hasNextCallCount++;
         checkPriorityQueue();
         return !outputPriorityQueue.isEmpty();
     }
@@ -132,7 +146,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         try {
             if (outputPriorityQueue != null) {
                 outputPriorityQueue.clear();
@@ -140,7 +154,7 @@
             if (rangeCursors != null) {
                 for (int i = 0; i < rangeCursors.length; i++) {
                     if (rangeCursors[i] != null) {
-                        rangeCursors[i].close();
+                        rangeCursors[i].destroy();
                     }
                 }
                 rangeCursors = null;
@@ -153,16 +167,6 @@
     }
 
     @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-        // do nothing
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-        // do nothing
-    }
-
-    @Override
     public ITupleReference getTuple() {
         return outputElement.getTuple();
     }
@@ -179,16 +183,18 @@
         return filter == null ? null : filter.getMaxTuple();
     }
 
-    protected boolean pushIntoQueueFromCursorAndReplaceThisElement(PriorityQueueElement e) throws HyracksDataException {
+    protected void pushIntoQueueFromCursorAndReplaceThisElement(PriorityQueueElement e) throws HyracksDataException {
         int cursorIndex = e.getCursorIndex();
         if (rangeCursors[cursorIndex].hasNext()) {
             rangeCursors[cursorIndex].next();
             e.reset(rangeCursors[cursorIndex].getTuple());
             outputPriorityQueue.offer(e);
-            return true;
+            return;
         }
-        rangeCursors[cursorIndex].close();
-        return false;
+        rangeCursors[cursorIndex].destroy();
+        if (cursorIndex == 0) {
+            includeMutableComponent = false;
+        }
     }
 
     protected boolean isDeleted(PriorityQueueElement checkElement) throws HyracksDataException {
@@ -196,7 +202,7 @@
     }
 
     protected void checkPriorityQueue() throws HyracksDataException {
-        while (!outputPriorityQueue.isEmpty() || (needPushElementIntoQueue == true)) {
+        while (!outputPriorityQueue.isEmpty() || needPushElementIntoQueue) {
             if (!outputPriorityQueue.isEmpty()) {
                 PriorityQueueElement checkElement = outputPriorityQueue.peek();
                 // If there is no previous tuple or the previous tuple can be ignored
@@ -240,11 +246,6 @@
         }
     }
 
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return false;
-    }
-
     public class PriorityQueueElement {
         private ITupleReference tuple;
         private int cursorIndex;
@@ -309,5 +310,4 @@
             throws HyracksDataException {
         return cmp.compare(tupleA, tupleB);
     }
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java
index c0fd443..4770d7c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/LSMTreeIndexAccessor.java
@@ -27,7 +27,6 @@
 import org.apache.hyracks.dataflow.common.comm.io.FrameTupleAccessor;
 import org.apache.hyracks.dataflow.common.data.accessors.FrameTupleReference;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.IFrameTupleProcessor;
@@ -45,7 +44,7 @@
 public class LSMTreeIndexAccessor implements ILSMIndexAccessor {
     @FunctionalInterface
     public interface ICursorFactory {
-        ITreeIndexCursor create(ILSMIndexOperationContext ctx);
+        IIndexCursor create(ILSMIndexOperationContext ctx);
     }
 
     protected final ILSMHarness lsmHarness;
@@ -201,7 +200,7 @@
     }
 
     @Override
-    public ITreeIndexCursor createSearchCursor(boolean exclusive) {
+    public IIndexCursor createSearchCursor(boolean exclusive) {
         return cursorFactory.create(ctx);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MemoryComponentMetadata.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MemoryComponentMetadata.java
index 1b827b7..3179790 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MemoryComponentMetadata.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MemoryComponentMetadata.java
@@ -20,8 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -31,9 +29,12 @@
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexMetadataFrame;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentMetadata;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class MemoryComponentMetadata implements IComponentMetadata {
-    private static final Logger LOGGER = Logger.getLogger(MemoryComponentMetadata.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final byte[] empty = new byte[0];
     private final List<org.apache.commons.lang3.tuple.Pair<IValueReference, ArrayBackedValueStorage>> store =
             new ArrayList<>();
@@ -77,7 +78,7 @@
         LOGGER.log(Level.INFO, "Copying Metadata into a different component");
         ITreeIndexMetadataFrame frame = mdpManager.createMetadataFrame();
         for (Pair<IValueReference, ArrayBackedValueStorage> pair : store) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.log(Level.INFO, "Copying " + pair.getKey() + " : " + pair.getValue().getLength() + " bytes");
             }
             mdpManager.put(frame, pair.getKey(), pair.getValue());
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MergeOperation.java
index c83d534..ec2305d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MergeOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MergeOperation.java
@@ -27,7 +27,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 
-public class MergeOperation extends AbstractIoOperation {
+public abstract class MergeOperation extends AbstractIoOperation {
     protected final IIndexCursor cursor;
 
     public MergeOperation(ILSMIndexAccessor accessor, FileReference target, ILSMIOOperationCallback callback,
@@ -47,8 +47,8 @@
     }
 
     @Override
-    public LSMIOOpertionType getIOOpertionType() {
-        return LSMIOOpertionType.MERGE;
+    public LSMIOOperationType getIOOpertionType() {
+        return LSMIOOperationType.MERGE;
     }
 
     public IIndexCursor getCursor() {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MultitenantVirtualBufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MultitenantVirtualBufferCache.java
index 7a3d58b..9b25471 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MultitenantVirtualBufferCache.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/MultitenantVirtualBufferCache.java
@@ -108,7 +108,15 @@
     public synchronized void open() throws HyracksDataException {
         ++openCount;
         if (openCount == 1) {
-            vbc.open();
+            boolean failed = true;
+            try {
+                vbc.open();
+                failed = false;
+            } finally {
+                if (failed) {
+                    openCount--;
+                }
+            }
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpIOOperationCallbackFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpIOOperationCallbackFactory.java
index da8bc46..eec2dca 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpIOOperationCallbackFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpIOOperationCallbackFactory.java
@@ -20,14 +20,16 @@
 
 import java.util.List;
 
+import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
+import org.apache.hyracks.storage.common.IResource;
 
 public enum NoOpIOOperationCallbackFactory implements ILSMIOOperationCallbackFactory {
     INSTANCE;
@@ -37,6 +39,11 @@
         return NoOpIOOperationCallback.INSTANCE;
     }
 
+    @Override
+    public void initialize(INCServiceContext ncCtx, IResource resource) {
+        // No op
+    }
+
     public static class NoOpIOOperationCallback implements ILSMIOOperationCallback {
         private static final NoOpIOOperationCallback INSTANCE = new NoOpIOOperationCallback();
 
@@ -44,23 +51,24 @@
         }
 
         @Override
-        public void beforeOperation(LSMOperationType opType) throws HyracksDataException {
+        public void beforeOperation(LSMIOOperationType opType) throws HyracksDataException {
             // Do nothing.
         }
 
         @Override
-        public void afterOperation(LSMOperationType opType, List<ILSMComponent> oldComponents,
+        public void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents,
                 ILSMDiskComponent newComponent) throws HyracksDataException {
             // Do nothing.
         }
 
         @Override
-        public void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent) throws HyracksDataException {
+        public void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent)
+                throws HyracksDataException {
             // Do nothing.
         }
 
         @Override
-        public void recycled(ILSMMemoryComponent component) {
+        public void recycled(ILSMMemoryComponent component, boolean componentSwitched) {
             // Do nothing.
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpOperationTrackerFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpOperationTrackerFactory.java
index 55a2164..8d8e763 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpOperationTrackerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/NoOpOperationTrackerFactory.java
@@ -25,6 +25,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
+import org.apache.hyracks.storage.common.IResource;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
 /**
@@ -43,7 +44,7 @@
     }
 
     @Override
-    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx) {
+    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource) {
         return tracker;
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/PrefixMergePolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/PrefixMergePolicy.java
index 7d7266e..73b5d20 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/PrefixMergePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/PrefixMergePolicy.java
@@ -26,7 +26,7 @@
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.ComponentState;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
@@ -59,8 +59,7 @@
         }
 
         if (fullMergeIsRequested) {
-            ILSMIndexAccessor accessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             accessor.scheduleFullMerge(index.getIOOperationCallback());
             return;
         }
@@ -245,8 +244,7 @@
 
         // Reverse the components order back to its original order
         Collections.reverse(mergableComponents);
-        ILSMIndexAccessor accessor =
-                index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         accessor.scheduleMerge(index.getIOOperationCallback(), mergableComponents);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/StubIOOperationCallback.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/StubIOOperationCallback.java
index 0f3c90f..88def5e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/StubIOOperationCallback.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/StubIOOperationCallback.java
@@ -23,9 +23,9 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 
 /**
  * This class is for testing. It's basically a way to get the new/old component info from the
@@ -38,19 +38,19 @@
     private ILSMDiskComponent newComponent = null;
 
     @Override
-    public void beforeOperation(LSMOperationType opType) throws HyracksDataException {
+    public void beforeOperation(LSMIOOperationType opType) throws HyracksDataException {
         // Not interested in this
     }
 
     @Override
-    public void afterOperation(LSMOperationType opType, List<ILSMComponent> oldComponents,
+    public void afterOperation(LSMIOOperationType opType, List<ILSMComponent> oldComponents,
             ILSMDiskComponent newComponent) throws HyracksDataException {
         this.oldComponents = oldComponents;
         this.newComponent = newComponent;
     }
 
     @Override
-    public synchronized void afterFinalize(LSMOperationType opType, ILSMDiskComponent newComponent)
+    public synchronized void afterFinalize(LSMIOOperationType opType, ILSMDiskComponent newComponent)
             throws HyracksDataException {
         // Redundant info from after
     }
@@ -64,7 +64,7 @@
     }
 
     @Override
-    public void recycled(ILSMMemoryComponent component) {
+    public void recycled(ILSMMemoryComponent component, boolean componentSwitched) {
         // Not interested in this
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/SynchronousScheduler.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/SynchronousScheduler.java
index da3e986..506dcea 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/SynchronousScheduler.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/SynchronousScheduler.java
@@ -18,15 +18,15 @@
  */
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class SynchronousScheduler implements ILSMIOOperationScheduler {
-    private static final Logger LOGGER = Logger.getLogger(SynchronousScheduler.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final SynchronousScheduler INSTANCE = new SynchronousScheduler();
 
     private SynchronousScheduler() {
@@ -37,7 +37,7 @@
         try {
             operation.call();
         } catch (Exception e) {
-            LOGGER.log(Level.SEVERE, "IO Operation failed", e);
+            LOGGER.log(Level.ERROR, "IO Operation failed", e);
             throw HyracksDataException.create(e);
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingOperationTrackerFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingOperationTrackerFactory.java
index d01e7ba..6c17ee8 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingOperationTrackerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingOperationTrackerFactory.java
@@ -21,6 +21,7 @@
 import org.apache.hyracks.api.application.INCServiceContext;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTrackerFactory;
+import org.apache.hyracks.storage.common.IResource;
 
 public class ThreadCountingOperationTrackerFactory implements ILSMOperationTrackerFactory {
 
@@ -32,7 +33,7 @@
     }
 
     @Override
-    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx) {
+    public ILSMOperationTracker getOperationTracker(INCServiceContext ctx, IResource resource) {
         return new ThreadCountingTracker();
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingTracker.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingTracker.java
index 6cb96aa..a7fbe06 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingTracker.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/ThreadCountingTracker.java
@@ -21,7 +21,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
@@ -57,8 +57,7 @@
         // Flush will only be handled by last exiting thread.
         if (opType == LSMOperationType.MODIFICATION && threadRefCount.decrementAndGet() == 0
                 && index.hasFlushRequestForCurrentMutableComponent()) {
-            ILSMIndexAccessor accessor =
-                    index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            ILSMIndexAccessor accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             accessor.scheduleFlush(NoOpIOOperationCallbackFactory.INSTANCE.createIoOpCallback(index));
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
index 88f3231..572e05c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/TracedIOOperation.java
@@ -19,8 +19,6 @@
 
 package org.apache.hyracks.storage.am.lsm.common.impls;
 
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IODeviceHandle;
@@ -29,13 +27,15 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.util.trace.ITracer;
 import org.apache.hyracks.util.trace.ITracer.Scope;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 class TracedIOOperation implements ILSMIOOperation {
 
-    static final Logger LOGGER = Logger.getLogger(TracedIOOperation.class.getName());
+    static final Logger LOGGER = LogManager.getLogger();
 
     protected final ILSMIOOperation ioOp;
-    private final LSMIOOpertionType ioOpType;
+    private final LSMIOOperationType ioOpType;
     private final ITracer tracer;
     private final long traceCategory;
 
@@ -80,7 +80,7 @@
     }
 
     @Override
-    public LSMIOOpertionType getIOOpertionType() {
+    public LSMIOOperationType getIOOpertionType() {
         return ioOpType;
     }
 
@@ -104,6 +104,11 @@
     public ILSMIndexAccessor getAccessor() {
         return ioOp.getAccessor();
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return ioOp.getComponentFiles();
+    }
 }
 
 class ComparableTracedIOOperation extends TracedIOOperation implements Comparable<ILSMIOOperation> {
@@ -128,8 +133,9 @@
         if (myIoOp instanceof Comparable && other instanceof ComparableTracedIOOperation) {
             return ((Comparable) myIoOp).compareTo(((ComparableTracedIOOperation) other).getIoOp());
         }
-        LOGGER.warning("Comparing ioOps of type " + myIoOp.getClass().getSimpleName() + " and "
+        LOGGER.warn("Comparing ioOps of type " + myIoOp.getClass().getSimpleName() + " and "
                 + other.getClass().getSimpleName() + " in " + getClass().getSimpleName());
         return Integer.signum(hashCode() - other.hashCode());
     }
+
 }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/VirtualBufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/VirtualBufferCache.java
index 3a22793..1cfe345 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/VirtualBufferCache.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/impls/VirtualBufferCache.java
@@ -25,8 +25,6 @@
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -42,10 +40,13 @@
 import org.apache.hyracks.storage.common.file.FileMapManager;
 import org.apache.hyracks.storage.common.file.IFileMapManager;
 import org.apache.hyracks.util.JSONUtil;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class VirtualBufferCache implements IVirtualBufferCache {
-    private static final Logger LOGGER = Logger.getLogger(VirtualBufferCache.class.getName());
-
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final boolean DEBUG = true;
     private final ICacheMemoryAllocator allocator;
     private final IFileMapManager fileMapManager;
     private final int pageSize;
@@ -125,7 +126,7 @@
     }
 
     private void logStats() {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO, "Free (allocated) pages = " + freePages.size() + ". Budget = " + pageBudget
                     + ". Large pages = " + largePages.get() + ". Overall usage = " + used.get());
         }
@@ -187,7 +188,7 @@
                 bucket.bucketLock.unlock();
             }
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.log(Level.INFO, "Reclaimed pages = " + reclaimedPages);
         }
         logStats();
@@ -197,6 +198,13 @@
         // recycle only if
         // 1. not a large page
         // 2. allocation is not above budget
+        if (DEBUG) {
+            int readCount = page.getReadLatchCount();
+            if (readCount > 0 || page.isWriteLatched()) {
+                throw new IllegalStateException("Attempt to delete a file with latched pages (read: " + readCount
+                        + ", write: " + page.isWriteLatched() + ")");
+            }
+        }
         if (used.get() < pageBudget && !page.isLargePage()) {
             page.reset();
             freePages.offer(page);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/ComponentUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/ComponentUtils.java
index d9f5c8f..94a3702 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/ComponentUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/ComponentUtils.java
@@ -19,8 +19,6 @@
 package org.apache.hyracks.storage.am.lsm.common.util;
 
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.data.std.api.IPointable;
@@ -34,10 +32,13 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ComponentUtils {
 
-    private static final Logger LOGGER = Logger.getLogger(ComponentUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     public static final MutableArrayValueReference MARKER_LSN_KEY = new MutableArrayValueReference("Marker".getBytes());
     public static final long NOT_FOUND = -1L;
 
@@ -76,28 +77,41 @@
      * @throws HyracksDataException
      */
     public static void get(ILSMIndex index, IValueReference key, IPointable pointable) throws HyracksDataException {
-        LOGGER.log(Level.INFO, "Getting " + key + " from index " + index);
+        boolean loggable = LOGGER.isDebugEnabled();
+        if (loggable) {
+            LOGGER.log(Level.DEBUG, "Getting " + key + " from index " + index);
+        }
         // Lock the opTracker to ensure index components don't change
         synchronized (index.getOperationTracker()) {
             index.getCurrentMemoryComponent().getMetadata().get(key, pointable);
             if (pointable.getLength() == 0) {
-                LOGGER.log(Level.INFO, key + " was not found in mutable memory component of " + index);
+                if (loggable) {
+                    LOGGER.log(Level.DEBUG, key + " was not found in mutable memory component of " + index);
+                }
                 // was not found in the in current mutable component, search in the other in memory components
                 fromImmutableMemoryComponents(index, key, pointable);
                 if (pointable.getLength() == 0) {
-                    LOGGER.log(Level.INFO, key + " was not found in all immmutable memory components of " + index);
+                    if (loggable) {
+                        LOGGER.log(Level.DEBUG, key + " was not found in all immmutable memory components of " + index);
+                    }
                     // was not found in the in all in memory components, search in the disk components
                     fromDiskComponents(index, key, pointable);
-                    if (pointable.getLength() == 0) {
-                        LOGGER.log(Level.INFO, key + " was not found in all disk components of " + index);
-                    } else {
-                        LOGGER.log(Level.INFO, key + " was found in disk components of " + index);
+                    if (loggable) {
+                        if (pointable.getLength() == 0) {
+                            LOGGER.log(Level.DEBUG, key + " was not found in all disk components of " + index);
+                        } else {
+                            LOGGER.log(Level.DEBUG, key + " was found in disk components of " + index);
+                        }
                     }
                 } else {
-                    LOGGER.log(Level.INFO, key + " was found in the immutable memory components of " + index);
+                    if (loggable) {
+                        LOGGER.log(Level.DEBUG, key + " was found in the immutable memory components of " + index);
+                    }
                 }
             } else {
-                LOGGER.log(Level.INFO, key + " was found in mutable memory component of " + index);
+                if (loggable) {
+                    LOGGER.log(Level.DEBUG, key + " was found in mutable memory component of " + index);
+                }
             }
         }
     }
@@ -122,9 +136,14 @@
 
     private static void fromDiskComponents(ILSMIndex index, IValueReference key, IPointable pointable)
             throws HyracksDataException {
-        LOGGER.log(Level.INFO, "Getting " + key + " from disk components of " + index);
+        boolean loggable = LOGGER.isDebugEnabled();
+        if (loggable) {
+            LOGGER.log(Level.DEBUG, "Getting " + key + " from disk components of " + index);
+        }
         for (ILSMDiskComponent c : index.getDiskComponents()) {
-            LOGGER.log(Level.INFO, "Getting " + key + " from disk components " + c);
+            if (loggable) {
+                LOGGER.log(Level.DEBUG, "Getting " + key + " from disk components " + c);
+            }
             c.getMetadata().get(key, pointable);
             if (pointable.getLength() != 0) {
                 // Found
@@ -134,13 +153,21 @@
     }
 
     private static void fromImmutableMemoryComponents(ILSMIndex index, IValueReference key, IPointable pointable) {
-        LOGGER.log(Level.INFO, "Getting " + key + " from immutable memory components of " + index);
+        boolean loggable = LOGGER.isDebugEnabled();
+        if (loggable) {
+            LOGGER.log(Level.DEBUG, "Getting " + key + " from immutable memory components of " + index);
+        }
         List<ILSMMemoryComponent> memComponents = index.getMemoryComponents();
         int numOtherMemComponents = memComponents.size() - 1;
         int next = index.getCurrentMemoryComponentIndex();
-        LOGGER.log(Level.INFO, index + " has " + numOtherMemComponents + " immutable memory components");
+        if (loggable) {
+            LOGGER.log(Level.DEBUG, index + " has " + numOtherMemComponents + " immutable memory components");
+        }
         for (int i = 0; i < numOtherMemComponents; i++) {
-            LOGGER.log(Level.INFO, "trying to get " + key + " from immutable memory components number: " + (i + 1));
+            if (loggable) {
+                LOGGER.log(Level.DEBUG,
+                        "trying to get " + key + " from immutable memory components number: " + (i + 1));
+            }
             next = next - 1;
             if (next < 0) {
                 next = memComponents.size() - 1;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/IOOperationUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/IOOperationUtils.java
index 0aeb0b9..9bd873d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/IOOperationUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/IOOperationUtils.java
@@ -18,14 +18,14 @@
  */
 package org.apache.hyracks.storage.am.lsm.common.util;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class IOOperationUtils {
-    private static final Logger LOGGER = Logger.getLogger(IOOperationUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private IOOperationUtils() {
     }
@@ -35,7 +35,7 @@
         try {
             ioCallback.waitForIO();
         } catch (InterruptedException e) {
-            LOGGER.log(Level.WARNING, "Operation has been interrupted. returning");
+            LOGGER.log(Level.WARN, "Operation has been interrupted. returning");
             Thread.currentThread().interrupt();
             throw HyracksDataException.create(e);
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/LSMComponentIdUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/LSMComponentIdUtils.java
new file mode 100644
index 0000000..3c88543
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-common/src/main/java/org/apache/hyracks/storage/am/lsm/common/util/LSMComponentIdUtils.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.common.util;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.primitive.LongPointable;
+import org.apache.hyracks.storage.am.common.freepage.MutableArrayValueReference;
+import org.apache.hyracks.storage.am.lsm.common.api.IComponentMetadata;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentId;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentId;
+
+public class LSMComponentIdUtils {
+
+    private static final MutableArrayValueReference COMPONENT_ID_MIN_KEY =
+            new MutableArrayValueReference("Component_Id_Min".getBytes());
+
+    private static final MutableArrayValueReference COMPONENT_ID_MAX_KEY =
+            new MutableArrayValueReference("Component_Id_Max".getBytes());
+
+    private LSMComponentIdUtils() {
+
+    }
+
+    public static ILSMComponentId readFrom(IComponentMetadata metadata) throws HyracksDataException {
+        long minId = ComponentUtils.getLong(metadata, COMPONENT_ID_MIN_KEY, LSMComponentId.NOT_FOUND);
+        long maxId = ComponentUtils.getLong(metadata, COMPONENT_ID_MAX_KEY, LSMComponentId.NOT_FOUND);
+        if (minId == LSMComponentId.NOT_FOUND || maxId == LSMComponentId.NOT_FOUND) {
+            return LSMComponentId.MISSING_COMPONENT_ID;
+        } else {
+            return new LSMComponentId(minId, maxId);
+        }
+    }
+
+    public static void persist(ILSMComponentId id, IComponentMetadata metadata) throws HyracksDataException {
+        LSMComponentId componentId = (LSMComponentId) id;
+        metadata.put(COMPONENT_ID_MIN_KEY, LongPointable.FACTORY.createPointable(componentId.getMinId()));
+        metadata.put(COMPONENT_ID_MAX_KEY, LongPointable.FACTORY.createPointable(componentId.getMaxId()));
+    }
+
+    public static ILSMComponentId union(ILSMComponentId id1, ILSMComponentId id2) {
+        long minId = Long.min(((LSMComponentId) id1).getMinId(), ((LSMComponentId) id2).getMinId());
+        long maxId = Long.max(((LSMComponentId) id1).getMaxId(), ((LSMComponentId) id2).getMaxId());
+        return new LSMComponentId(minId, maxId);
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/pom.xml b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/pom.xml
index 32869cb..5259a7c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/pom.xml
@@ -88,5 +88,9 @@
       <artifactId>hyracks-storage-am-bloomfilter</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexLocalResource.java
index cdb55bf..4eb7728 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/dataflow/LSMInvertedIndexLocalResource.java
@@ -87,18 +87,19 @@
         IBufferCache bufferCache = storageManager.getBufferCache(serviceCtx);
         ILSMMergePolicy mergePolicy = mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx);
         ILSMIOOperationScheduler ioScheduler = ioSchedulerProvider.getIoScheduler(serviceCtx);
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         if (isPartitioned) {
             return InvertedIndexUtils.createPartitionedLSMInvertedIndex(ioManager, virtualBufferCaches, typeTraits,
                     cmpFactories, tokenTypeTraits, tokenCmpFactories, tokenizerFactory, bufferCache,
                     file.getAbsolutePath(), bloomFilterFalsePositiveRate, mergePolicy,
-                    opTrackerProvider.getOperationTracker(serviceCtx), ioScheduler, ioOpCallbackFactory,
+                    opTrackerProvider.getOperationTracker(serviceCtx, this), ioScheduler, ioOpCallbackFactory,
                     invertedIndexFields, filterTypeTraits, filterCmpFactories, filterFields,
                     filterFieldsForNonBulkLoadOps, invertedIndexFieldsForNonBulkLoadOps, durable,
                     metadataPageManagerFactory);
         } else {
             return InvertedIndexUtils.createLSMInvertedIndex(ioManager, virtualBufferCaches, typeTraits, cmpFactories,
                     tokenTypeTraits, tokenCmpFactories, tokenizerFactory, bufferCache, file.getAbsolutePath(),
-                    bloomFilterFalsePositiveRate, mergePolicy, opTrackerProvider.getOperationTracker(serviceCtx),
+                    bloomFilterFalsePositiveRate, mergePolicy, opTrackerProvider.getOperationTracker(serviceCtx, this),
                     ioScheduler, ioOpCallbackFactory, invertedIndexFields, filterTypeTraits, filterCmpFactories,
                     filterFields, filterFieldsForNonBulkLoadOps, invertedIndexFieldsForNonBulkLoadOps, durable,
                     metadataPageManagerFactory);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
index 59a9320..05561f2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndex.java
@@ -20,8 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ITypeTraits;
@@ -36,7 +34,7 @@
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.btree.util.BTreeUtils;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
@@ -68,6 +66,7 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.InvertedIndexUtils;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -76,9 +75,12 @@
 import org.apache.hyracks.storage.common.MultiComparator;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.util.trace.ITracer;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LSMInvertedIndex extends AbstractLSMIndex implements IInvertedIndex {
-    private static final Logger LOGGER = Logger.getLogger(LSMInvertedIndex.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     protected final IBinaryTokenizerFactory tokenizerFactory;
 
@@ -177,7 +179,7 @@
                 } catch (HyracksDataException e) {
                     if (e.getErrorCode() != ErrorCode.DUPLICATE_KEY) {
                         // Key has already been deleted.
-                        LOGGER.log(Level.WARNING, "Failure during index delete operation", e);
+                        LOGGER.log(Level.WARN, "Failure during index delete operation", e);
                         throw e;
                     }
                 }
@@ -201,18 +203,18 @@
             ILSMComponent component = operationalComponents.get(i);
             if (component.getType() == LSMComponentType.MEMORY) {
                 includeMutableComponent = true;
-                IIndexAccessor invIndexAccessor = component.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                        NoOpOperationCallback.INSTANCE);
+                IIndexAccessor invIndexAccessor =
+                        component.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
                 indexAccessors.add(invIndexAccessor);
                 IIndexAccessor deletedKeysAccessor = ((LSMInvertedIndexMemoryComponent) component).getBuddyIndex()
-                        .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                        .createAccessor(NoOpIndexAccessParameters.INSTANCE);
                 deletedKeysBTreeAccessors.add(deletedKeysAccessor);
             } else {
-                IIndexAccessor invIndexAccessor = component.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                        NoOpOperationCallback.INSTANCE);
+                IIndexAccessor invIndexAccessor =
+                        component.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
                 indexAccessors.add(invIndexAccessor);
                 IIndexAccessor deletedKeysAccessor = ((LSMInvertedIndexDiskComponent) component).getBuddyIndex()
-                        .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                        .createAccessor(NoOpIndexAccessParameters.INSTANCE);
                 deletedKeysBTreeAccessors.add(deletedKeysAccessor);
             }
         }
@@ -236,7 +238,7 @@
                     deletedKeysBTreeAccessors,
                     ((LSMInvertedIndexMemoryComponent) memoryComponents.get(currentMutableComponentId.get()))
                             .getBuddyIndex().getLeafFrameFactory(),
-                    ictx, includeMutableComponent, getLsmHarness(), operationalComponents);
+                    ictx, includeMutableComponent, getHarness(), operationalComponents);
         } else {
             LSMInvertedIndexMemoryComponent mutableComponent =
                     (LSMInvertedIndexMemoryComponent) memoryComponents.get(currentMutableComponentId.get());
@@ -245,7 +247,7 @@
             initState = new LSMInvertedIndexRangeSearchCursorInitialState(tokensAndKeysCmp, keyCmp, keysOnlyTuple,
                     ((LSMInvertedIndexMemoryComponent) memoryComponents.get(currentMutableComponentId.get()))
                             .getBuddyIndex().getLeafFrameFactory(),
-                    includeMutableComponent, getLsmHarness(), indexAccessors, deletedKeysBTreeAccessors, pred,
+                    includeMutableComponent, getHarness(), indexAccessors, deletedKeysBTreeAccessors, pred,
                     operationalComponents);
         }
         return initState;
@@ -280,8 +282,8 @@
         RangePredicate nullPred = new RangePredicate(null, null, true, true, null, null);
 
         // Search the deleted keys BTree to calculate the number of elements for BloomFilter
-        BTreeAccessor deletedKeysBTreeAccessor = flushingComponent.getBuddyIndex()
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        BTreeAccessor deletedKeysBTreeAccessor =
+                flushingComponent.getBuddyIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         IIndexCursor btreeCountingCursor = deletedKeysBTreeAccessor.createCountingSearchCursor();
         deletedKeysBTreeAccessor.search(btreeCountingCursor, nullPred);
         long numBTreeTuples = 0L;
@@ -292,7 +294,7 @@
                 numBTreeTuples = IntegerPointable.getInteger(countTuple.getFieldData(0), countTuple.getFieldStart(0));
             }
         } finally {
-            btreeCountingCursor.close();
+            btreeCountingCursor.destroy();
         }
 
         ILSMDiskComponentBulkLoader componentBulkLoader =
@@ -308,12 +310,12 @@
                 componentBulkLoader.delete(deletedKeysScanCursor.getTuple());
             }
         } finally {
-            deletedKeysScanCursor.close();
+            deletedKeysScanCursor.destroy();
         }
 
         // Scan the in-memory inverted index
-        InMemoryInvertedIndexAccessor memInvIndexAccessor = flushingComponent.getIndex()
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        InMemoryInvertedIndexAccessor memInvIndexAccessor =
+                flushingComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         BTreeAccessor memBTreeAccessor = memInvIndexAccessor.getBTreeAccessor();
         IIndexCursor scanCursor = memBTreeAccessor.createSearchCursor(false);
         memBTreeAccessor.search(scanCursor, nullPred);
@@ -325,7 +327,7 @@
                 componentBulkLoader.add(scanCursor.getTuple());
             }
         } finally {
-            scanCursor.close();
+            scanCursor.destroy();
         }
         if (component.getLSMComponentFilter() != null) {
             List<ITupleReference> filterTuples = new ArrayList<>();
@@ -381,7 +383,7 @@
                     componentBulkLoader.delete(tuple);
                 }
             } finally {
-                btreeCursor.close();
+                btreeCursor.destroy();
             }
         } else {
             componentBulkLoader = component.createBulkLoader(1.0f, false, 0L, false, false, false);
@@ -394,7 +396,7 @@
                 componentBulkLoader.add(tuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
         if (component.getLSMComponentFilter() != null) {
             List<ITupleReference> filterTuples = new ArrayList<>();
@@ -425,16 +427,16 @@
     }
 
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
-        return new LSMInvertedIndexAccessor(getLsmHarness(), createOpContext(modificationCallback, searchCallback));
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException {
+        return new LSMInvertedIndexAccessor(getHarness(),
+                createOpContext(iap.getModificationCallback(), iap.getSearchOperationCallback()));
     }
 
     @Override
     protected LSMInvertedIndexOpContext createOpContext(IModificationOperationCallback modificationCallback,
             ISearchOperationCallback searchCallback) throws HyracksDataException {
-        return new LSMInvertedIndexOpContext(memoryComponents, modificationCallback, searchCallback,
-                invertedIndexFieldsForNonBulkLoadOps, filterFieldsForNonBulkLoadOps, getFilterCmpFactories());
+        return new LSMInvertedIndexOpContext(this, memoryComponents, modificationCallback, searchCallback,
+                invertedIndexFieldsForNonBulkLoadOps, filterFieldsForNonBulkLoadOps, getFilterCmpFactories(), tracer);
     }
 
     @Override
@@ -480,7 +482,7 @@
     protected ILSMIOOperation createFlushOperation(AbstractLSMIndexOperationContext opCtx,
             LSMComponentFileReferences componentFileRefs, ILSMIOOperationCallback callback)
             throws HyracksDataException {
-        return new LSMInvertedIndexFlushOperation(new LSMInvertedIndexAccessor(getLsmHarness(), opCtx),
+        return new LSMInvertedIndexFlushOperation(new LSMInvertedIndexAccessor(getHarness(), opCtx),
                 componentFileRefs.getInsertIndexFileReference(), componentFileRefs.getDeleteIndexFileReference(),
                 componentFileRefs.getBloomFilterFileReference(), callback, fileManager.getBaseDir().getAbsolutePath());
     }
@@ -488,7 +490,7 @@
     @Override
     protected ILSMIOOperation createMergeOperation(AbstractLSMIndexOperationContext opCtx,
             LSMComponentFileReferences mergeFileRefs, ILSMIOOperationCallback callback) throws HyracksDataException {
-        ILSMIndexAccessor accessor = new LSMInvertedIndexAccessor(getLsmHarness(), opCtx);
+        ILSMIndexAccessor accessor = new LSMInvertedIndexAccessor(getHarness(), opCtx);
         IIndexCursor cursor = new LSMInvertedIndexRangeSearchCursor(opCtx);
         return new LSMInvertedIndexMergeOperation(accessor, cursor, mergeFileRefs.getInsertIndexFileReference(),
                 mergeFileRefs.getDeleteIndexFileReference(), mergeFileRefs.getBloomFilterFileReference(), callback,
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
index 2106f6a..5b272ee 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexFlushOperation.java
@@ -23,6 +23,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.FlushOperation;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 
 public class LSMInvertedIndexFlushOperation extends FlushOperation {
     private final FileReference deletedKeysBTreeFlushTarget;
@@ -43,4 +44,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterFlushTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, deletedKeysBTreeFlushTarget, bloomFilterFlushTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
index 2c1db0f..408d9bb 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexMergeOperation.java
@@ -22,6 +22,7 @@
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
 import org.apache.hyracks.storage.common.IIndexCursor;
 
@@ -44,4 +45,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterMergeTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, deletedKeysBTreeMergeTarget, bloomFilterMergeTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java
index 30300d3..55da252 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexOpContext.java
@@ -23,14 +23,16 @@
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class LSMInvertedIndexOpContext extends AbstractLSMIndexOperationContext {
 
@@ -45,11 +47,12 @@
     private IInvertedIndexAccessor currentMutableInvIndexAccessors;
     private IIndexAccessor currentDeletedKeysBTreeAccessors;
 
-    public LSMInvertedIndexOpContext(List<ILSMMemoryComponent> mutableComponents,
+    public LSMInvertedIndexOpContext(ILSMIndex index, List<ILSMMemoryComponent> mutableComponents,
             IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback,
-            int[] invertedIndexFields, int[] filterFields, IBinaryComparatorFactory[] filterComparatorFactories)
-            throws HyracksDataException {
-        super(invertedIndexFields, filterFields, filterComparatorFactories, searchCallback, modificationCallback);
+            int[] invertedIndexFields, int[] filterFields, IBinaryComparatorFactory[] filterComparatorFactories,
+            ITracer tracer) throws HyracksDataException {
+        super(index, invertedIndexFields, filterFields, filterComparatorFactories, searchCallback, modificationCallback,
+                tracer);
         mutableInvIndexAccessors = new IInvertedIndexAccessor[mutableComponents.size()];
         deletedKeysBTreeAccessors = new IIndexAccessor[mutableComponents.size()];
         for (int i = 0; i < mutableComponents.size(); i++) {
@@ -58,11 +61,11 @@
             if (allFields != null) {
                 mutableInvIndexAccessors[i] = mutableComponent.getIndex().createAccessor(allFields);
             } else {
-                mutableInvIndexAccessors[i] = mutableComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                        NoOpOperationCallback.INSTANCE);
+                mutableInvIndexAccessors[i] =
+                        mutableComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
             }
-            deletedKeysBTreeAccessors[i] = mutableComponent.getBuddyIndex()
-                    .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            deletedKeysBTreeAccessors[i] =
+                    mutableComponent.getBuddyIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         }
         // Project away the document fields, leaving only the key fields.
         LSMInvertedIndexMemoryComponent c = (LSMInvertedIndexMemoryComponent) mutableComponents.get(0);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
index d565b9a..4afccef 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexRangeSearchCursor.java
@@ -106,14 +106,14 @@
             if (bloomFilters[i] != null && bloomFilters[i].contains(keysOnlyTuple, hashes)) {
                 continue;
             }
-            deletedKeysBTreeCursors[i].reset();
+            deletedKeysBTreeCursors[i].close();
             try {
                 deletedKeysBTreeAccessors.get(i).search(deletedKeysBTreeCursors[i], keySearchPred);
                 if (deletedKeysBTreeCursors[i].hasNext()) {
                     return true;
                 }
             } finally {
-                deletedKeysBTreeCursors[i].close();
+                deletedKeysBTreeCursors[i].destroy();
             }
         }
         return false;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
index c214a2c..ce9f760 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/impls/LSMInvertedIndexSearchCursor.java
@@ -24,6 +24,7 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilter;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
@@ -40,7 +41,7 @@
  * Searches the components one-by-one, completely consuming a cursor before moving on to the next one.
  * Therefore, the are no guarantees about sort order of the results.
  */
-public class LSMInvertedIndexSearchCursor implements IIndexCursor {
+public class LSMInvertedIndexSearchCursor implements ILSMIndexCursor {
 
     private IIndexAccessor currentAccessor;
     private IIndexCursor currentCursor;
@@ -98,7 +99,7 @@
         keySearchPred.setLowKey(key, true);
         keySearchPred.setHighKey(key, true);
         for (int i = 0; i < accessorIndex; i++) {
-            deletedKeysBTreeCursors[i].reset();
+            deletedKeysBTreeCursors[i].close();
             if (deletedKeysBTreeBloomFilters[i] != null && !deletedKeysBTreeBloomFilters[i].contains(key, hashes)) {
                 continue;
             }
@@ -108,7 +109,7 @@
                     return true;
                 }
             } finally {
-                deletedKeysBTreeCursors[i].close();
+                deletedKeysBTreeCursors[i].destroy();
             }
         }
         return false;
@@ -147,7 +148,7 @@
             if (nextValidTuple()) {
                 return true;
             }
-            currentCursor.close();
+            currentCursor.destroy();
             accessorIndex++;
         }
         while (accessorIndex < indexAccessors.size()) {
@@ -159,7 +160,7 @@
                 return true;
             }
             // Close as we go to release resources.
-            currentCursor.close();
+            currentCursor.destroy();
             accessorIndex++;
         }
         return false;
@@ -172,15 +173,15 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
-        reset();
+    public void destroy() throws HyracksDataException {
+        close();
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         try {
             if (currentCursor != null) {
-                currentCursor.close();
+                currentCursor.destroy();
                 currentCursor = null;
             }
             accessorIndex = 0;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndex.java
index 50160f9..641ca3c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndex.java
@@ -34,9 +34,8 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInPlaceInvertedIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedListCursor;
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
 public class InMemoryInvertedIndex implements IInPlaceInvertedIndex {
@@ -166,8 +165,7 @@
     }
 
     @Override
-    public InMemoryInvertedIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
+    public InMemoryInvertedIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException {
         return new InMemoryInvertedIndexAccessor(this,
                 new InMemoryInvertedIndexOpContext(btree, tokenCmpFactories, tokenizerFactory));
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexAccessor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexAccessor.java
index 73f90a6..6777177 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexAccessor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexAccessor.java
@@ -26,6 +26,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedIndexAccessor;
@@ -51,8 +52,7 @@
         this.opCtx = opCtx;
         this.index = index;
         this.searcher = createSearcher();
-        this.btreeAccessor =
-                index.getBTree().createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        this.btreeAccessor = index.getBTree().createAccessor(NoOpIndexAccessParameters.INSTANCE);
     }
 
     public InMemoryInvertedIndexAccessor(InMemoryInvertedIndex index, IIndexOperationContext opCtx,
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexOpContext.java
index 90dbc81..eec20fd 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedIndexOpContext.java
@@ -24,7 +24,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizer;
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
@@ -67,8 +67,7 @@
             case SEARCH: {
                 if (getBtreePred() == null) {
                     btreePred = new RangePredicate(null, null, true, true, null, null);
-                    btreeAccessor =
-                            btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                    btreeAccessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
                     btreeCmp = MultiComparator.create(btree.getComparatorFactories());
                     tokenFieldsCmp = MultiComparator.create(tokenCmpFactories);
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
index 7078c4b..7bf5322 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/InMemoryInvertedListCursor.java
@@ -91,8 +91,8 @@
         tokenTuple.reset(tokenTupleBuilder.getFieldEndOffsets(), tokenTupleBuilder.getByteArray());
         btreeSearchTuple.reset();
         btreeSearchTuple.addTuple(tokenTuple);
-        btreeCursor.reset();
-        countingCursor.reset();
+        btreeCursor.close();
+        countingCursor.close();
     }
 
     @Override
@@ -113,7 +113,7 @@
     @Override
     public void unpinPages() throws HyracksDataException {
         if (cursorNeedsClose) {
-            btreeCursor.close();
+            btreeCursor.destroy();
             cursorNeedsClose = false;
         }
     }
@@ -154,7 +154,7 @@
                 e.printStackTrace();
             } finally {
                 try {
-                    countingCursor.close();
+                    countingCursor.destroy();
                 } catch (HyracksDataException e) {
                     e.printStackTrace();
                 }
@@ -197,8 +197,8 @@
         try {
             containsKey = btreeCursor.hasNext();
         } finally {
+            btreeCursor.destroy();
             btreeCursor.close();
-            btreeCursor.reset();
             btreeSearchTuple.removeLastTuple();
         }
         return containsKey;
@@ -219,8 +219,8 @@
                 strBuilder.append(o.toString() + " ");
             }
         } finally {
+            btreeCursor.destroy();
             btreeCursor.close();
-            btreeCursor.reset();
         }
         btreeAccessor.search(btreeCursor, btreePred);
         return strBuilder.toString();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndex.java
index 933ef21..5ddba98 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndex.java
@@ -37,8 +37,7 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.search.PartitionedTOccurrenceSearcher;
 import org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.PartitionedInvertedIndexTokenizingTupleIterator;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
 public class PartitionedInMemoryInvertedIndex extends InMemoryInvertedIndex implements IPartitionedInvertedIndex {
@@ -87,8 +86,8 @@
     }
 
     @Override
-    public PartitionedInMemoryInvertedIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
+    public PartitionedInMemoryInvertedIndexAccessor createAccessor(IIndexAccessParameters iap)
+            throws HyracksDataException {
         return new PartitionedInMemoryInvertedIndexAccessor(this,
                 new PartitionedInMemoryInvertedIndexOpContext(btree, tokenCmpFactories, tokenizerFactory));
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndexOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndexOpContext.java
index bd82822..9cfaf7a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndexOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/inmemory/PartitionedInMemoryInvertedIndexOpContext.java
@@ -34,7 +34,7 @@
 
     protected void setTokenizingTupleIterator() {
         IBinaryTokenizer tokenizer = getTokenizerFactory().createTokenizer();
-        setTupleIter(new PartitionedInvertedIndexTokenizingTupleIterator(tokenCmpFactories.length, btree.getFieldCount()
-                - tokenCmpFactories.length, tokenizer));
+        setTupleIter(new PartitionedInvertedIndexTokenizingTupleIterator(tokenCmpFactories.length,
+                btree.getFieldCount() - tokenCmpFactories.length, tokenizer));
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/FixedSizeElementInvertedListCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/FixedSizeElementInvertedListCursor.java
index 56520b8..75bdbc4 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/FixedSizeElementInvertedListCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/FixedSizeElementInvertedListCursor.java
@@ -96,7 +96,6 @@
         int pix = 0;
         for (int i = startPageId; i <= endPageId; i++) {
             pages[pix] = bufferCache.pin(BufferedFileHandle.getDiskPageId(fileId, i), false);
-            pages[pix].acquireReadLatch();
             pix++;
         }
         pinned = true;
@@ -106,7 +105,6 @@
     public void unpinPages() throws HyracksDataException {
         int numPages = endPageId - startPageId + 1;
         for (int i = 0; i < numPages; i++) {
-            pages[i].releaseReadLatch();
             bufferCache.unpin(pages[i]);
         }
         pinned = false;
@@ -117,8 +115,8 @@
 
         currentPageIx = binarySearch(elementIndexes, 0, numPages, elementIx);
         if (currentPageIx < 0) {
-            throw new IndexOutOfBoundsException("Requested index: " + elementIx + " from array with numElements: "
-                    + numElements);
+            throw new IndexOutOfBoundsException(
+                    "Requested index: " + elementIx + " from array with numElements: " + numElements);
         }
 
         if (currentPageIx == 0) {
@@ -223,8 +221,8 @@
     public String printCurrentElement(ISerializerDeserializer[] serdes) throws HyracksDataException {
         StringBuilder strBuilder = new StringBuilder();
         for (int i = 0; i < tuple.getFieldCount(); i++) {
-            ByteArrayInputStream inStream = new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i),
-                    tuple.getFieldLength(i));
+            ByteArrayInputStream inStream =
+                    new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i));
             DataInput dataIn = new DataInputStream(inStream);
             Object o = serdes[i].deserialize(dataIn);
             strBuilder.append(o.toString());
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndex.java
index 7f75264..4942eda 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndex.java
@@ -37,11 +37,12 @@
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.frames.BTreeLeafFrameType;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.btree.util.BTreeUtils;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.common.api.IPageManagerFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInPlaceInvertedIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedIndexAccessor;
@@ -50,11 +51,10 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedListCursor;
 import org.apache.hyracks.storage.am.lsm.invertedindex.search.InvertedIndexSearchPredicate;
 import org.apache.hyracks.storage.am.lsm.invertedindex.search.TOccurrenceSearcher;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
@@ -91,7 +91,7 @@
         btreeValueTypeTraits[3] = IntegerPointable.TYPE_TRAITS;
     }
 
-    protected BTree btree;
+    protected DiskBTree btree;
     protected int rootPageId = 0;
     protected IBufferCache bufferCache;
     protected int fileId = -1;
@@ -118,7 +118,7 @@
         this.invListCmpFactories = invListCmpFactories;
         this.tokenTypeTraits = tokenTypeTraits;
         this.tokenCmpFactories = tokenCmpFactories;
-        this.btree = BTreeUtils.createBTree(bufferCache, getBTreeTypeTraits(tokenTypeTraits), tokenCmpFactories,
+        this.btree = BTreeUtils.createDiskBTree(bufferCache, getBTreeTypeTraits(tokenTypeTraits), tokenCmpFactories,
                 BTreeLeafFrameType.REGULAR_NSM, btreeFile, pageManagerFactory.createPageManager(bufferCache), false);
         this.numTokenFields = btree.getComparatorFactories().length;
         this.numInvListKeys = invListCmpFactories.length;
@@ -206,8 +206,8 @@
                 listCursor.reset(0, 0, 0, 0);
             }
         } finally {
+            ctx.getBtreeCursor().destroy();
             ctx.getBtreeCursor().close();
-            ctx.getBtreeCursor().reset();
         }
     }
 
@@ -241,7 +241,7 @@
         private final boolean verifyInput;
         private final MultiComparator allCmp;
 
-        private IFIFOPageQueue queue;
+        private final IFIFOPageQueue queue;
 
         public OnDiskInvertedIndexBulkLoader(float btreeFillFactor, boolean verifyInput, long numElementsHint,
                 boolean checkIfEmptyIndex, int startPageId) throws HyracksDataException {
@@ -486,8 +486,7 @@
     }
 
     @Override
-    public OnDiskInvertedIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
+    public OnDiskInvertedIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException {
         return new OnDiskInvertedIndexAccessor(this);
     }
 
@@ -542,8 +541,7 @@
     public void validate() throws HyracksDataException {
         btree.validate();
         // Scan the btree and validate the order of elements in each inverted-list.
-        IIndexAccessor btreeAccessor =
-                btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor btreeAccessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         IIndexCursor btreeCursor = btreeAccessor.createSearchCursor(false);
         MultiComparator btreeCmp = MultiComparator.create(btree.getComparatorFactories());
         RangePredicate rangePred = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);
@@ -553,8 +551,7 @@
         }
         PermutingTupleReference tokenTuple = new PermutingTupleReference(fieldPermutation);
 
-        IInvertedIndexAccessor invIndexAccessor =
-                createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IInvertedIndexAccessor invIndexAccessor = createAccessor(NoOpIndexAccessParameters.INSTANCE);
         IInvertedListCursor invListCursor = invIndexAccessor.createInvertedListCursor();
         MultiComparator invListCmp = MultiComparator.create(invListCmpFactories);
 
@@ -593,7 +590,7 @@
                 }
             }
         } finally {
-            btreeCursor.close();
+            btreeCursor.destroy();
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexOpContext.java
index 69bf2a2..623fc74 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexOpContext.java
@@ -22,7 +22,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
@@ -39,7 +39,7 @@
 
     public OnDiskInvertedIndexOpContext(BTree btree) {
         // TODO: Ignore opcallbacks for now.
-        btreeAccessor = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        btreeAccessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         btreeCursor = btreeAccessor.createSearchCursor(false);
         searchCmp = MultiComparator.create(btree.getComparatorFactories());
         if (btree.getComparatorFactories().length > 1) {
@@ -81,4 +81,5 @@
     public MultiComparator getPrefixSearchCmp() {
         return prefixSearchCmp;
     }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
index fc6f025..d1e6531 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexRangeSearchCursor.java
@@ -23,7 +23,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.ConcatenatingTupleReference;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInPlaceInvertedIndex;
@@ -53,7 +53,7 @@
 
     public OnDiskInvertedIndexRangeSearchCursor(IInPlaceInvertedIndex invIndex, IIndexOperationContext opCtx) {
         this.btree = ((OnDiskInvertedIndex) invIndex).getBTree();
-        this.btreeAccessor = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        this.btreeAccessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         this.invIndex = invIndex;
         this.opCtx = opCtx;
         // Project away non-token fields of the BTree tuples.
@@ -109,35 +109,25 @@
     }
 
     @Override
+    public void destroy() throws HyracksDataException {
+        if (unpinNeeded) {
+            invListCursor.unpinPages();
+            unpinNeeded = false;
+        }
+        btreeCursor.destroy();
+    }
+
+    @Override
     public void close() throws HyracksDataException {
         if (unpinNeeded) {
             invListCursor.unpinPages();
             unpinNeeded = false;
         }
-        btreeCursor.close();
-    }
-
-    @Override
-    public void reset() throws HyracksDataException {
-        if (unpinNeeded) {
-            invListCursor.unpinPages();
-            unpinNeeded = false;
-        }
-        btreeCursor.close();
+        btreeCursor.destroy();
     }
 
     @Override
     public ITupleReference getTuple() {
         return concatTuple;
     }
-
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
index af5a187..97f1f76 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/OnDiskInvertedIndexSearchCursor.java
@@ -94,17 +94,7 @@
     }
 
     @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
-    @Override
-    public void reset() {
+    public void close() {
         currentBufferIndex = 0;
         tupleIndex = 0;
         invIndexSearcher.reset();
@@ -113,7 +103,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         currentBufferIndex = 0;
         tupleIndex = 0;
         resultBuffers = null;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/PartitionedOnDiskInvertedIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/PartitionedOnDiskInvertedIndex.java
index 569c51d..01e0684 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/PartitionedOnDiskInvertedIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/ondisk/PartitionedOnDiskInvertedIndex.java
@@ -35,8 +35,7 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IPartitionedInvertedIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.search.InvertedListPartitions;
 import org.apache.hyracks.storage.am.lsm.invertedindex.search.PartitionedTOccurrenceSearcher;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
 public class PartitionedOnDiskInvertedIndex extends OnDiskInvertedIndex implements IPartitionedInvertedIndex {
@@ -58,8 +57,8 @@
     }
 
     @Override
-    public PartitionedOnDiskInvertedIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException {
+    public PartitionedOnDiskInvertedIndexAccessor createAccessor(IIndexAccessParameters iap)
+            throws HyracksDataException {
         return new PartitionedOnDiskInvertedIndexAccessor(this);
     }
 
@@ -103,8 +102,8 @@
                 tokenExists = true;
             }
         } finally {
+            ctx.getBtreeCursor().destroy();
             ctx.getBtreeCursor().close();
-            ctx.getBtreeCursor().reset();
         }
         return tokenExists;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ArrayListFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ArrayListFactory.java
index 84c453b..5846e25 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ArrayListFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ArrayListFactory.java
@@ -23,7 +23,7 @@
 
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IObjectFactory;
 
-public class ArrayListFactory<T> implements IObjectFactory<ArrayList<T>>{
+public class ArrayListFactory<T> implements IObjectFactory<ArrayList<T>> {
     @Override
     public ArrayList<T> create() {
         return new ArrayList<T>();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ConjunctiveEditDistanceSearchModifier.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ConjunctiveEditDistanceSearchModifier.java
index 6116322..decc499 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ConjunctiveEditDistanceSearchModifier.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/ConjunctiveEditDistanceSearchModifier.java
@@ -21,7 +21,6 @@
 
 public class ConjunctiveEditDistanceSearchModifier extends EditDistanceSearchModifier {
 
-
     public ConjunctiveEditDistanceSearchModifier(int gramLength, int edThresh) {
         super(gramLength, edThresh);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/SearchResult.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/SearchResult.java
index 37eb600..2da1434 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/SearchResult.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/SearchResult.java
@@ -143,47 +143,4 @@
         return numResults;
     }
 
-    // TODO: This code may help to clean up the core list-merging algorithms.
-    /*
-    public SearchResultCursor getCursor() {
-        cursor.reset();
-        return cursor;
-    }
-
-    public class SearchResultCursor {
-        private int bufferIndex;
-        private int resultIndex;
-        private int frameResultIndex;
-        private ByteBuffer currentBuffer;
-
-        public void reset() {
-            bufferIndex = 0;
-            resultIndex = 0;
-            frameResultIndex = 0;
-            currentBuffer = buffers.get(0);
-            resultFrameTupleAcc.reset(currentBuffer);
-        }
-
-        public boolean hasNext() {
-            return resultIndex < numResults;
-        }
-
-        public void next() {
-            resultTuple.reset(currentBuffer.array(), resultFrameTupleAcc.getTupleStartOffset(frameResultIndex));
-            if (frameResultIndex < resultFrameTupleAcc.getTupleCount()) {
-                frameResultIndex++;
-            } else {
-                bufferIndex++;
-                currentBuffer = buffers.get(bufferIndex);
-                resultFrameTupleAcc.reset(currentBuffer);
-                frameResultIndex = 0;
-            }
-            resultIndex++;
-        }
-
-        public ITupleReference getTuple() {
-            return resultTuple;
-        }
-    }
-    */
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/TOccurrenceSearcher.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/TOccurrenceSearcher.java
index 4269aa7..4c9f037 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/TOccurrenceSearcher.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/search/TOccurrenceSearcher.java
@@ -34,8 +34,7 @@
 
     protected final ArrayList<IInvertedListCursor> invListCursors = new ArrayList<>();
 
-    public TOccurrenceSearcher(IHyracksCommonContext ctx, IInPlaceInvertedIndex invIndex)
-            throws HyracksDataException {
+    public TOccurrenceSearcher(IHyracksCommonContext ctx, IInPlaceInvertedIndex invIndex) throws HyracksDataException {
         super(ctx, invIndex);
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/AbstractUTF8Token.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/AbstractUTF8Token.java
index ccc2c81..ed2f3be 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/AbstractUTF8Token.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/AbstractUTF8Token.java
@@ -115,8 +115,7 @@
 
     // The preChar and postChar are required to be a single byte utf8 char, e.g. ASCII char.
     protected void serializeToken(UTF8StringBuilder builder, GrowableArray out, int numPreChars, int numPostChars,
-            char preChar, char postChar)
-            throws IOException {
+            char preChar, char postChar) throws IOException {
 
         handleTokenTypeTag(out.getDataOutput());
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizer.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizer.java
index cd37ffa..3a5224c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizer.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizer.java
@@ -72,10 +72,11 @@
                     int tokenStart = tokensStart.get(i);
                     curTokenCount++; // assume we found it
                     int offset = 0;
-                    for (int charPos= 0; charPos < tokenLength; charPos++) {
+                    for (int charPos = 0; charPos < tokenLength; charPos++) {
                         // case insensitive comparison
-                        if (Character.toLowerCase(UTF8StringUtil.charAt(sentenceBytes, currentTokenStart + offset))
-                                != Character.toLowerCase(UTF8StringUtil.charAt(sentenceBytes, tokenStart + offset))) {
+                        if (Character.toLowerCase(
+                                UTF8StringUtil.charAt(sentenceBytes, currentTokenStart + offset)) != Character
+                                        .toLowerCase(UTF8StringUtil.charAt(sentenceBytes, tokenStart + offset))) {
                             curTokenCount--;
                             break;
                         }
@@ -93,7 +94,6 @@
         tokenCount++;
     }
 
-
     // TODO Why we bother to get the tokenCount in advance? It seems a caller's problem.
     @Override
     public short getTokensCount() {
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizerFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizerFactory.java
index 81254fc..e583c7d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizerFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/DelimitedUTF8StringBinaryTokenizerFactory.java
@@ -19,16 +19,15 @@
 
 package org.apache.hyracks.storage.am.lsm.invertedindex.tokenizers;
 
-public class DelimitedUTF8StringBinaryTokenizerFactory implements
-        IBinaryTokenizerFactory {
+public class DelimitedUTF8StringBinaryTokenizerFactory implements IBinaryTokenizerFactory {
 
     private static final long serialVersionUID = 1L;
     private final boolean ignoreTokenCount;
     private final boolean sourceHasTypeTag;
     private final ITokenFactory tokenFactory;
 
-    public DelimitedUTF8StringBinaryTokenizerFactory(boolean ignoreTokenCount,
-            boolean sourceHasTypeTag, ITokenFactory tokenFactory) {
+    public DelimitedUTF8StringBinaryTokenizerFactory(boolean ignoreTokenCount, boolean sourceHasTypeTag,
+            ITokenFactory tokenFactory) {
         this.ignoreTokenCount = ignoreTokenCount;
         this.sourceHasTypeTag = sourceHasTypeTag;
         this.tokenFactory = tokenFactory;
@@ -36,7 +35,6 @@
 
     @Override
     public IBinaryTokenizer createTokenizer() {
-        return new DelimitedUTF8StringBinaryTokenizer(ignoreTokenCount,
-                sourceHasTypeTag, tokenFactory);
+        return new DelimitedUTF8StringBinaryTokenizer(ignoreTokenCount, sourceHasTypeTag, tokenFactory);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramUTF8StringBinaryTokenizer.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramUTF8StringBinaryTokenizer.java
index 8bd0c50..711a82f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramUTF8StringBinaryTokenizer.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramUTF8StringBinaryTokenizer.java
@@ -79,8 +79,9 @@
                 tokenCount++; // assume found
                 int offset = 0;
                 for (int j = 0; j < gramLength; j++) {
-                    if (Character.toLowerCase(UTF8StringUtil.charAt(sentenceBytes, currentTokenStart + offset))
-                            != Character.toLowerCase(UTF8StringUtil.charAt(sentenceBytes, tmpIndex + offset))) {
+                    if (Character
+                            .toLowerCase(UTF8StringUtil.charAt(sentenceBytes, currentTokenStart + offset)) != Character
+                                    .toLowerCase(UTF8StringUtil.charAt(sentenceBytes, tmpIndex + offset))) {
                         tokenCount--;
                         break;
                     }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/InvertedIndexTokenizingTupleIterator.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/InvertedIndexTokenizingTupleIterator.java
index 2ade6db..78c8e4d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/InvertedIndexTokenizingTupleIterator.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-invertedindex/src/main/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/InvertedIndexTokenizingTupleIterator.java
@@ -39,7 +39,8 @@
     protected final IBinaryTokenizer tokenizer;
     protected ITupleReference inputTuple;
 
-    public InvertedIndexTokenizingTupleIterator(int tokensFieldCount, int invListFieldCount, IBinaryTokenizer tokenizer) {
+    public InvertedIndexTokenizingTupleIterator(int tokensFieldCount, int invListFieldCount,
+            IBinaryTokenizer tokenizer) {
         this.invListFieldCount = invListFieldCount;
         this.tupleBuilder = new ArrayTupleBuilder(tokensFieldCount + invListFieldCount);
         this.tupleReference = new ArrayTupleReference();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/ExternalRTreeLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/ExternalRTreeLocalResource.java
index f0ea5b8..f72e17c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/ExternalRTreeLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/ExternalRTreeLocalResource.java
@@ -66,12 +66,13 @@
     public IIndex createInstance(INCServiceContext ncServiceCtx) throws HyracksDataException {
         IIOManager ioManager = ncServiceCtx.getIoManager();
         FileReference fileRef = ioManager.resolve(path);
+        ioOpCallbackFactory.initialize(ncServiceCtx, this);
         return LSMRTreeUtils.createExternalRTree(ioManager, fileRef, storageManager.getBufferCache(ncServiceCtx),
                 typeTraits, cmpFactories, btreeCmpFactories, valueProviderFactories, rtreePolicyType,
                 bloomFilterFalsePositiveRate, mergePolicyFactory.createMergePolicy(mergePolicyProperties, ncServiceCtx),
-                opTrackerProvider.getOperationTracker(ncServiceCtx), ioSchedulerProvider.getIoScheduler(ncServiceCtx),
-                ioOpCallbackFactory, linearizeCmpFactory, buddyBTreeFields, durable, isPointMBR,
-                metadataPageManagerFactory);
+                opTrackerProvider.getOperationTracker(ncServiceCtx, this),
+                ioSchedulerProvider.getIoScheduler(ncServiceCtx), ioOpCallbackFactory, linearizeCmpFactory,
+                buddyBTreeFields, durable, isPointMBR, metadataPageManagerFactory, ncServiceCtx.getTracer());
 
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeLocalResource.java
index 1fa5081..634504b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeLocalResource.java
@@ -83,12 +83,14 @@
         IIOManager ioManager = ncServiceCtx.getIoManager();
         FileReference fileRef = ioManager.resolve(path);
         List<IVirtualBufferCache> virtualBufferCaches = vbcProvider.getVirtualBufferCaches(ncServiceCtx, fileRef);
+        ioOpCallbackFactory.initialize(ncServiceCtx, this);
         return LSMRTreeUtils.createLSMTree(ioManager, virtualBufferCaches, fileRef,
                 storageManager.getBufferCache(ncServiceCtx), typeTraits, cmpFactories, btreeCmpFactories,
                 valueProviderFactories, rtreePolicyType, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, ncServiceCtx),
-                opTrackerProvider.getOperationTracker(ncServiceCtx), ioSchedulerProvider.getIoScheduler(ncServiceCtx),
-                ioOpCallbackFactory, linearizeCmpFactory, rtreeFields, buddyBTreeFields, filterTypeTraits,
-                filterCmpFactories, filterFields, durable, isPointMBR, metadataPageManagerFactory);
+                opTrackerProvider.getOperationTracker(ncServiceCtx, this),
+                ioSchedulerProvider.getIoScheduler(ncServiceCtx), ioOpCallbackFactory, linearizeCmpFactory, rtreeFields,
+                buddyBTreeFields, filterTypeTraits, filterCmpFactories, filterFields, durable, isPointMBR,
+                metadataPageManagerFactory);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeWithAntiMatterLocalResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeWithAntiMatterLocalResource.java
index aea205d..f91a5f7 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeWithAntiMatterLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/dataflow/LSMRTreeWithAntiMatterLocalResource.java
@@ -78,12 +78,13 @@
         IIOManager ioManager = serviceCtx.getIoManager();
         FileReference file = ioManager.resolve(path);
         List<IVirtualBufferCache> virtualBufferCaches = vbcProvider.getVirtualBufferCaches(serviceCtx, file);
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         return LSMRTreeUtils.createLSMTreeWithAntiMatterTuples(ioManager, virtualBufferCaches, file,
                 storageManager.getBufferCache(serviceCtx), typeTraits, cmpFactories, btreeComparatorFactories,
                 valueProviderFactories, rtreePolicyType,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx),
-                opTrackerProvider.getOperationTracker(serviceCtx), ioSchedulerProvider.getIoScheduler(serviceCtx),
+                opTrackerProvider.getOperationTracker(serviceCtx, this), ioSchedulerProvider.getIoScheduler(serviceCtx),
                 ioOpCallbackFactory, linearizeCmpFactory, rtreeFields, filterTypeTraits, filterCmpFactories,
-                filterFields, true, isPointMBR, metadataPageManagerFactory);
+                filterFields, durable, isPointMBR, metadataPageManagerFactory);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
index 152b0a8..ee37043 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/AbstractLSMRTree.java
@@ -127,9 +127,9 @@
             ILinearizeComparatorFactory linearizer, int[] comparatorFields, IBinaryComparatorFactory[] linearizerArray,
             double bloomFilterFalsePositiveRate, ILSMMergePolicy mergePolicy, ILSMOperationTracker opTracker,
             ILSMIOOperationScheduler ioScheduler, ILSMIOOperationCallbackFactory ioOpCallbackFactory, boolean durable,
-            boolean isPointMBR) {
+            boolean isPointMBR, ITracer tracer) throws HyracksDataException {
         super(ioManager, diskBufferCache, fileManager, bloomFilterFalsePositiveRate, mergePolicy, opTracker,
-                ioScheduler, ioOpCallbackFactory, componentFactory, componentFactory, durable);
+                ioScheduler, ioOpCallbackFactory, componentFactory, componentFactory, durable, tracer);
         this.rtreeInteriorFrameFactory = rtreeInteriorFrameFactory;
         this.rtreeLeafFrameFactory = rtreeLeafFrameFactory;
         this.btreeInteriorFrameFactory = btreeInteriorFrameFactory;
@@ -231,9 +231,9 @@
     @Override
     protected LSMRTreeOpContext createOpContext(IModificationOperationCallback modCallback,
             ISearchOperationCallback searchCallback) {
-        return new LSMRTreeOpContext(memoryComponents, rtreeLeafFrameFactory, rtreeInteriorFrameFactory,
-                btreeLeafFrameFactory, modCallback, searchCallback, getTreeFields(), getFilterFields(), getLsmHarness(),
-                comparatorFields, linearizerArray, getFilterCmpFactories());
+        return new LSMRTreeOpContext(this, memoryComponents, rtreeLeafFrameFactory, rtreeInteriorFrameFactory,
+                btreeLeafFrameFactory, modCallback, searchCallback, getTreeFields(), getFilterFields(), getHarness(),
+                comparatorFields, linearizerArray, getFilterCmpFactories(), tracer);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
index 9487a0d..f29bffc 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTree.java
@@ -32,7 +32,6 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeBulkLoader;
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.api.ITwoPCIndexBulkLoader;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
@@ -41,6 +40,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMDiskComponentFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation.LSMIOOperationType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallbackFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -50,24 +50,22 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.ITwoPCIndex;
-import org.apache.hyracks.storage.am.lsm.common.api.LSMOperationType;
 import org.apache.hyracks.storage.am.lsm.common.impls.BlockingIOOperationCallbackWrapper;
 import org.apache.hyracks.storage.am.lsm.common.impls.ExternalIndexHarness;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.util.trace.ITracer;
 
 /**
  * This is an lsm r-tree that does not have memory component and is modified
  * only by bulk loading and addition of disk components as of this point, it is
  * intended for use with external dataset indexes only.
- *
- * @author alamouda
  */
 public class ExternalRTree extends LSMRTree implements ITwoPCIndex {
 
@@ -89,18 +87,18 @@
             int[] comparatorFields, IBinaryComparatorFactory[] linearizerArray, ILSMMergePolicy mergePolicy,
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, int[] buddyBTreeFields, boolean durable,
-            boolean isPointMBR) {
+            boolean isPointMBR, ITracer tracer) throws HyracksDataException {
         super(ioManager, rtreeInteriorFrameFactory, rtreeLeafFrameFactory, btreeInteriorFrameFactory,
                 btreeLeafFrameFactory, diskBufferCache, fileNameManager, componentFactory, bloomFilterFalsePositiveRate,
                 rtreeCmpFactories, btreeCmpFactories, linearizer, comparatorFields, linearizerArray, mergePolicy,
-                opTracker, ioScheduler, ioOpCallbackFactory, buddyBTreeFields, durable, isPointMBR);
+                opTracker, ioScheduler, ioOpCallbackFactory, buddyBTreeFields, durable, isPointMBR, tracer);
         this.secondDiskComponents = new LinkedList<>();
         this.fieldCount = fieldCount;
     }
 
     @Override
-    public ExternalIndexHarness getLsmHarness() {
-        return (ExternalIndexHarness) super.getLsmHarness();
+    public ExternalIndexHarness getHarness() {
+        return (ExternalIndexHarness) super.getHarness();
     }
 
     // The subsume merged components is overridden to account for:
@@ -207,7 +205,7 @@
                 diskComponents.add(component);
                 secondDiskComponents.add(component);
             }
-            getLsmHarness().indexFirstTimeActivated();
+            getHarness().indexFirstTimeActivated();
         } else {
             // This index has been opened before or is brand new with no components
             // components. It should also maintain the version pointer
@@ -300,7 +298,7 @@
                     builder.add(tuple);
                 }
             } finally {
-                btreeCursor.close();
+                btreeCursor.destroy();
                 builder.end();
             }
             btreeBulkLoader.end();
@@ -314,7 +312,7 @@
                 bulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
         bulkLoader.end();
         return mergedComponent;
@@ -328,7 +326,7 @@
 
         if (flushOnExit) {
             BlockingIOOperationCallbackWrapper cb = new BlockingIOOperationCallbackWrapper(ioOpCallback);
-            cb.afterFinalize(LSMOperationType.FLUSH, null);
+            cb.afterFinalize(LSMIOOperationType.FLUSH, null);
         }
 
         for (ILSMDiskComponent c : diskComponents) {
@@ -349,7 +347,7 @@
         if (!isActive) {
             throw new HyracksDataException("Failed to clear the index since it is not activated.");
         }
-        getLsmHarness().indexClear();
+        getHarness().indexClear();
 
         for (ILSMDiskComponent c : diskComponents) {
             c.deactivateAndDestroy();
@@ -532,7 +530,7 @@
                     component.markAsValid(durable);
                     component.deactivate();
                 } else {
-                    getLsmHarness().addBulkLoadedComponent(component);
+                    getHarness().addBulkLoadedComponent(component);
                 }
             }
         }
@@ -583,11 +581,11 @@
         ILSMIndexOperationContext rctx = createOpContext(NoOpOperationCallback.INSTANCE, -1);
         rctx.setOperation(IndexOperation.MERGE);
         List<ILSMComponent> mergingComponents = ctx.getComponentHolder();
-        ITreeIndexCursor cursor = new LSMRTreeSortedCursor(rctx, linearizer, buddyBTreeFields);
+        LSMRTreeSortedCursor cursor = new LSMRTreeSortedCursor(rctx, linearizer, buddyBTreeFields);
         LSMComponentFileReferences relMergeFileRefs =
                 getMergeFileReferences((ILSMDiskComponent) mergingComponents.get(0),
                         (ILSMDiskComponent) mergingComponents.get(mergingComponents.size() - 1));
-        ILSMIndexAccessor accessor = new LSMRTreeAccessor(getLsmHarness(), rctx, buddyBTreeFields);
+        ILSMIndexAccessor accessor = new LSMRTreeAccessor(getHarness(), rctx, buddyBTreeFields);
         // create the merge operation.
         LSMRTreeMergeOperation mergeOp = new LSMRTreeMergeOperation(accessor, cursor,
                 relMergeFileRefs.getInsertIndexFileReference(), relMergeFileRefs.getDeleteIndexFileReference(),
@@ -598,23 +596,23 @@
     @Override
     public ILSMIndexAccessor createAccessor(ISearchOperationCallback searchCallback, int targetIndexVersion)
             throws HyracksDataException {
-        return new LSMRTreeAccessor(getLsmHarness(), createOpContext(searchCallback, targetIndexVersion),
+        return new LSMRTreeAccessor(getHarness(), createOpContext(searchCallback, targetIndexVersion),
                 buddyBTreeFields);
     }
 
     // This method creates the appropriate opContext for the targeted version
     public ExternalRTreeOpContext createOpContext(ISearchOperationCallback searchCallback, int targetVersion) {
-        return new ExternalRTreeOpContext(rtreeCmpFactories, btreeCmpFactories, searchCallback, targetVersion,
-                getLsmHarness(), comparatorFields, linearizerArray, rtreeLeafFrameFactory, rtreeInteriorFrameFactory,
-                btreeLeafFrameFactory);
+        return new ExternalRTreeOpContext(this, rtreeCmpFactories, btreeCmpFactories, searchCallback, targetVersion,
+                getHarness(), comparatorFields, linearizerArray, rtreeLeafFrameFactory, rtreeInteriorFrameFactory,
+                btreeLeafFrameFactory, tracer);
     }
 
     // The accessor for disk only indexes don't use modification callback and
     // always carry the target index version with them
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        return new LSMRTreeAccessor(getLsmHarness(), createOpContext(searchCallback, version), buddyBTreeFields);
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) {
+        return new LSMRTreeAccessor(getHarness(), createOpContext(iap.getSearchOperationCallback(), version),
+                buddyBTreeFields);
     }
 
     @Override
@@ -646,7 +644,7 @@
                     componentFileRefrences.getDeleteIndexFileReference(),
                     componentFileRefrences.getBloomFilterFileReference(), false);
         }
-        getLsmHarness().addTransactionComponents(component);
+        getHarness().addTransactionComponents(component);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java
index 73be537..09237a3 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/ExternalRTreeOpContext.java
@@ -21,9 +21,11 @@
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class ExternalRTreeOpContext extends AbstractLSMIndexOperationContext {
     private MultiComparator bTreeCmp;
@@ -31,12 +33,13 @@
     private final int targetIndexVersion;
     private LSMRTreeCursorInitialState initialState;
 
-    public ExternalRTreeOpContext(IBinaryComparatorFactory[] rtreeCmpFactories,
+    public ExternalRTreeOpContext(ILSMIndex index, IBinaryComparatorFactory[] rtreeCmpFactories,
             IBinaryComparatorFactory[] btreeCmpFactories, ISearchOperationCallback searchCallback,
             int targetIndexVersion, ILSMHarness lsmHarness, int[] comparatorFields,
             IBinaryComparatorFactory[] linearizerArray, ITreeIndexFrameFactory rtreeLeafFrameFactory,
-            ITreeIndexFrameFactory rtreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory) {
-        super(null, null, null, searchCallback, null);
+            ITreeIndexFrameFactory rtreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory,
+            ITracer tracer) {
+        super(index, null, null, null, searchCallback, null, tracer);
         this.targetIndexVersion = targetIndexVersion;
         this.bTreeCmp = MultiComparator.create(btreeCmpFactories);
         this.rTreeCmp = MultiComparator.create(rtreeCmpFactories);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
index b43c2e3..7172b74 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTree.java
@@ -34,7 +34,7 @@
 import org.apache.hyracks.storage.am.common.api.IIndexOperationContext;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.common.tuples.DualTupleReference;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
@@ -59,11 +59,11 @@
 import org.apache.hyracks.storage.am.rtree.impls.RTree.RTreeAccessor;
 import org.apache.hyracks.storage.am.rtree.impls.RTreeSearchCursor;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class LSMRTree extends AbstractLSMRTree {
     protected final int[] buddyBTreeFields;
@@ -100,11 +100,11 @@
             int[] comparatorFields, IBinaryComparatorFactory[] linearizerArray, ILSMMergePolicy mergePolicy,
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, int[] buddyBTreeFields, boolean durable,
-            boolean isPointMBR) {
+            boolean isPointMBR, ITracer tracer) throws HyracksDataException {
         super(ioManager, rtreeInteriorFrameFactory, rtreeLeafFrameFactory, btreeInteriorFrameFactory,
                 btreeLeafFrameFactory, diskBufferCache, fileNameManager, componentFactory, rtreeCmpFactories,
                 btreeCmpFactories, linearizer, comparatorFields, linearizerArray, bloomFilterFalsePositiveRate,
-                mergePolicy, opTracker, ioScheduler, ioOpCallbackFactory, durable, isPointMBR);
+                mergePolicy, opTracker, ioScheduler, ioOpCallbackFactory, durable, isPointMBR, tracer);
         this.buddyBTreeFields = buddyBTreeFields;
     }
 
@@ -117,8 +117,8 @@
         // The RTree should be renamed before the BTree.
 
         // scan the memory RTree
-        RTreeAccessor memRTreeAccessor = flushingComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                NoOpOperationCallback.INSTANCE);
+        RTreeAccessor memRTreeAccessor =
+                flushingComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         RTreeSearchCursor rtreeScanCursor = memRTreeAccessor.createSearchCursor(false);
         SearchPredicate rtreeNullPredicate = new SearchPredicate(null, null);
         memRTreeAccessor.search(rtreeScanCursor, rtreeNullPredicate);
@@ -127,8 +127,8 @@
                 flushOp.getBTreeTarget(), flushOp.getBloomFilterTarget(), true);
 
         //count the number of tuples in the buddy btree
-        BTreeAccessor memBTreeAccessor = flushingComponent.getBuddyIndex()
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        BTreeAccessor memBTreeAccessor =
+                flushingComponent.getBuddyIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         RangePredicate btreeNullPredicate = new RangePredicate(null, null, true, true, null, null);
         IIndexCursor btreeCountingCursor = memBTreeAccessor.createCountingSearchCursor();
         memBTreeAccessor.search(btreeCountingCursor, btreeNullPredicate);
@@ -140,7 +140,7 @@
                 numBTreeTuples = IntegerPointable.getInteger(countTuple.getFieldData(0), countTuple.getFieldStart(0));
             }
         } finally {
-            btreeCountingCursor.close();
+            btreeCountingCursor.destroy();
         }
 
         ILSMDiskComponentBulkLoader componentBulkLoader =
@@ -163,7 +163,7 @@
                 rTreeTupleSorter.insertTupleEntry(rtreeScanCursor.getPageId(), rtreeScanCursor.getTupleOffset());
             }
         } finally {
-            rtreeScanCursor.close();
+            rtreeScanCursor.destroy();
         }
         rTreeTupleSorter.sort();
 
@@ -177,7 +177,7 @@
                     componentBulkLoader.add(frameTuple);
                 }
             } finally {
-                cursor.close();
+                cursor.destroy();
             }
         }
 
@@ -191,7 +191,7 @@
                 componentBulkLoader.delete(frameTuple);
             }
         } finally {
-            btreeScanCursor.close();
+            btreeScanCursor.destroy();
         }
 
         if (component.getLSMComponentFilter() != null) {
@@ -241,7 +241,7 @@
                     componentBulkLoader.delete(tuple);
                 }
             } finally {
-                btreeCursor.close();
+                btreeCursor.destroy();
             }
         } else {
             //no buddy-btree needed
@@ -256,7 +256,7 @@
                 componentBulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
 
         if (mergedComponent.getLSMComponentFilter() != null) {
@@ -276,10 +276,9 @@
     }
 
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        return new LSMRTreeAccessor(getLsmHarness(), createOpContext(modificationCallback, searchCallback),
-                buddyBTreeFields);
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) {
+        return new LSMRTreeAccessor(getHarness(),
+                createOpContext(iap.getModificationCallback(), iap.getSearchOperationCallback()), buddyBTreeFields);
     }
 
     // This function is modified for R-Trees without antimatter tuples to allow buddy B-Tree to have only primary keys
@@ -323,7 +322,7 @@
     protected ILSMIOOperation createFlushOperation(AbstractLSMIndexOperationContext opCtx,
             LSMComponentFileReferences componentFileRefs, ILSMIOOperationCallback callback)
             throws HyracksDataException {
-        LSMRTreeAccessor accessor = new LSMRTreeAccessor(getLsmHarness(), opCtx, buddyBTreeFields);
+        LSMRTreeAccessor accessor = new LSMRTreeAccessor(getHarness(), opCtx, buddyBTreeFields);
         return new LSMRTreeFlushOperation(accessor, componentFileRefs.getInsertIndexFileReference(),
                 componentFileRefs.getDeleteIndexFileReference(), componentFileRefs.getBloomFilterFileReference(),
                 callback, fileManager.getBaseDir().getAbsolutePath());
@@ -332,8 +331,8 @@
     @Override
     protected ILSMIOOperation createMergeOperation(AbstractLSMIndexOperationContext opCtx,
             LSMComponentFileReferences mergeFileRefs, ILSMIOOperationCallback callback) throws HyracksDataException {
-        ITreeIndexCursor cursor = new LSMRTreeSortedCursor(opCtx, linearizer, buddyBTreeFields);
-        ILSMIndexAccessor accessor = new LSMRTreeAccessor(getLsmHarness(), opCtx, buddyBTreeFields);
+        LSMRTreeSortedCursor cursor = new LSMRTreeSortedCursor(opCtx, linearizer, buddyBTreeFields);
+        ILSMIndexAccessor accessor = new LSMRTreeAccessor(getHarness(), opCtx, buddyBTreeFields);
         return new LSMRTreeMergeOperation(accessor, cursor, mergeFileRefs.getInsertIndexFileReference(),
                 mergeFileRefs.getDeleteIndexFileReference(), mergeFileRefs.getBloomFilterFileReference(), callback,
                 fileManager.getBaseDir().getAbsolutePath());
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
index 77219a2..e4267e2 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeAbstractCursor.java
@@ -28,7 +28,8 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
@@ -41,11 +42,11 @@
 import org.apache.hyracks.storage.am.rtree.impls.RTreeSearchCursor;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public abstract class LSMRTreeAbstractCursor implements ITreeIndexCursor {
+public abstract class LSMRTreeAbstractCursor implements ILSMIndexCursor {
 
     protected boolean open;
     protected RTreeSearchCursor[] rtreeCursors;
@@ -110,7 +111,7 @@
                             (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame(), false);
                 } else {
                     //re-use
-                    btreeCursors[i].reset();
+                    btreeCursors[i].close();
                 }
                 rtree = ((LSMRTreeMemoryComponent) component).getIndex();
                 btree = ((LSMRTreeMemoryComponent) component).getBuddyIndex();
@@ -121,8 +122,8 @@
                     btreeCursors[i] = new BTreeRangeSearchCursor(
                             (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame(), false);
                 } else {
-                    // reset
-                    btreeCursors[i].reset();
+                    // close
+                    btreeCursors[i].close();
                 }
                 rtree = ((LSMRTreeDiskComponent) component).getIndex();
                 btree = ((LSMRTreeDiskComponent) component).getBuddyIndex();
@@ -133,13 +134,11 @@
                         (IRTreeInteriorFrame) lsmInitialState.getRTreeInteriorFrameFactory().createFrame(),
                         (IRTreeLeafFrame) lsmInitialState.getRTreeLeafFrameFactory().createFrame());
             } else {
-                rtreeCursors[i].reset();
+                rtreeCursors[i].close();
             }
             if (rtreeAccessors[i] == null) {
-                rtreeAccessors[i] =
-                        rtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-                btreeAccessors[i] =
-                        btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+                rtreeAccessors[i] = rtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+                btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             } else {
                 rtreeAccessors[i].reset(rtree, NoOpOperationCallback.INSTANCE);
                 btreeAccessors[i].reset(btree, NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
@@ -154,7 +153,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (!open) {
             return;
         }
@@ -162,8 +161,8 @@
         try {
             if (rtreeCursors != null && btreeCursors != null) {
                 for (int i = 0; i < numberOfTrees; i++) {
-                    rtreeCursors[i].close();
-                    btreeCursors[i].close();
+                    rtreeCursors[i].destroy();
+                    btreeCursors[i].destroy();
                 }
             }
             rtreeCursors = null;
@@ -177,23 +176,8 @@
     }
 
     @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-        // do nothing
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-        // do nothing
-    }
-
-    @Override
     public ITupleReference getTuple() {
         return frameTuple;
     }
 
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return false;
-    }
-
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDeletedKeysBTreeMergeCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDeletedKeysBTreeMergeCursor.java
index d20b1bd..df4e16e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDeletedKeysBTreeMergeCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeDeletedKeysBTreeMergeCursor.java
@@ -25,7 +25,7 @@
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMIndexSearchCursor;
@@ -62,7 +62,7 @@
             IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame();
             rangeCursors[i] = new BTreeRangeSearchCursor(leafFrame, false);
             BTree btree = ((LSMRTreeDiskComponent) component).getBuddyIndex();
-            btreeAccessors[i] = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             btreeAccessors[i].search(rangeCursors[i], btreePredicate);
         }
         setPriorityQueueComparator();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
index 6991c56..2306ebd 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeFlushOperation.java
@@ -22,6 +22,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.impls.FlushOperation;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 
 public class LSMRTreeFlushOperation extends FlushOperation {
 
@@ -42,4 +43,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterFlushTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(target, btreeFlushTarget, bloomFilterFlushTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeMergeOperation.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeMergeOperation.java
index 83872cf..aed5981 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeMergeOperation.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeMergeOperation.java
@@ -19,16 +19,17 @@
 package org.apache.hyracks.storage.am.lsm.rtree.impls;
 
 import org.apache.hyracks.api.io.FileReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationCallback;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFileReferences;
 import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
+import org.apache.hyracks.storage.common.IIndexCursor;
 
 public class LSMRTreeMergeOperation extends MergeOperation {
     private final FileReference btreeMergeTarget;
     private final FileReference bloomFilterMergeTarget;
 
-    public LSMRTreeMergeOperation(ILSMIndexAccessor accessor, ITreeIndexCursor cursor, FileReference target,
+    public LSMRTreeMergeOperation(ILSMIndexAccessor accessor, IIndexCursor cursor, FileReference target,
             FileReference btreeMergeTarget, FileReference bloomFilterMergeTarget, ILSMIOOperationCallback callback,
             String indexIdentifier) {
         super(accessor, target, callback, indexIdentifier, cursor);
@@ -43,4 +44,9 @@
     public FileReference getBloomFilterTarget() {
         return bloomFilterMergeTarget;
     }
+
+    @Override
+    public LSMComponentFileReferences getComponentFiles() {
+        return new LSMComponentFileReferences(btreeMergeTarget, null, bloomFilterMergeTarget);
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
index 74d9685..50f1961 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeOpContext.java
@@ -25,9 +25,11 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree;
 import org.apache.hyracks.storage.am.btree.impls.BTreeOpContext;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.common.ophelpers.IndexOperation;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.impls.AbstractLSMIndexOperationContext;
 import org.apache.hyracks.storage.am.rtree.impls.RTree;
@@ -36,6 +38,7 @@
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.hyracks.util.trace.ITracer;
 
 public final class LSMRTreeOpContext extends AbstractLSMIndexOperationContext {
 
@@ -49,12 +52,14 @@
     private BTreeOpContext currentBTreeOpContext;
     private LSMRTreeCursorInitialState searchInitialState;
 
-    public LSMRTreeOpContext(List<ILSMMemoryComponent> mutableComponents, ITreeIndexFrameFactory rtreeLeafFrameFactory,
-            ITreeIndexFrameFactory rtreeInteriorFrameFactory, ITreeIndexFrameFactory btreeLeafFrameFactory,
-            IModificationOperationCallback modificationCallback, ISearchOperationCallback searchCallback,
-            int[] rtreeFields, int[] filterFields, ILSMHarness lsmHarness, int[] comparatorFields,
-            IBinaryComparatorFactory[] linearizerArray, IBinaryComparatorFactory[] filterComparatorFactories) {
-        super(rtreeFields, filterFields, filterComparatorFactories, searchCallback, modificationCallback);
+    public LSMRTreeOpContext(ILSMIndex index, List<ILSMMemoryComponent> mutableComponents,
+            ITreeIndexFrameFactory rtreeLeafFrameFactory, ITreeIndexFrameFactory rtreeInteriorFrameFactory,
+            ITreeIndexFrameFactory btreeLeafFrameFactory, IModificationOperationCallback modificationCallback,
+            ISearchOperationCallback searchCallback, int[] rtreeFields, int[] filterFields, ILSMHarness lsmHarness,
+            int[] comparatorFields, IBinaryComparatorFactory[] linearizerArray,
+            IBinaryComparatorFactory[] filterComparatorFactories, ITracer tracer) {
+        super(index, rtreeFields, filterFields, filterComparatorFactories, searchCallback, modificationCallback,
+                tracer);
         mutableRTreeAccessors = new RTree.RTreeAccessor[mutableComponents.size()];
         mutableBTreeAccessors = new BTree.BTreeAccessor[mutableComponents.size()];
         rtreeOpContexts = new RTreeOpContext[mutableComponents.size()];
@@ -65,11 +70,11 @@
                 mutableRTreeAccessors[i] = mutableComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
                         NoOpOperationCallback.INSTANCE, allFields);
             } else {
-                mutableRTreeAccessors[i] = mutableComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                        NoOpOperationCallback.INSTANCE);
+                mutableRTreeAccessors[i] =
+                        mutableComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
             }
-            mutableBTreeAccessors[i] = mutableComponent.getBuddyIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                    NoOpOperationCallback.INSTANCE);
+            mutableBTreeAccessors[i] =
+                    mutableComponent.getBuddyIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
             rtreeOpContexts[i] = mutableRTreeAccessors[i].getOpContext();
             btreeOpContexts[i] = mutableBTreeAccessors[i].getOpContext();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
index 06c39db..0edf22f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSearchCursor.java
@@ -39,13 +39,13 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
-        super.close();
+    public void destroy() throws HyracksDataException {
+        super.destroy();
         currentCursor = 0;
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         if (!open) {
             return;
         }
@@ -54,8 +54,8 @@
         foundNext = false;
         try {
             for (int i = 0; i < numberOfTrees; i++) {
-                rtreeCursors[i].close();
-                btreeCursors[i].close();
+                rtreeCursors[i].destroy();
+                btreeCursors[i].destroy();
             }
             rtreeCursors = null;
             btreeCursors = null;
@@ -82,7 +82,7 @@
 
     private void searchNextCursor() throws HyracksDataException {
         if (currentCursor < numberOfTrees) {
-            rtreeCursors[currentCursor].reset();
+            rtreeCursors[currentCursor].close();
             rtreeAccessors[currentCursor].search(rtreeCursors[currentCursor], rtreeSearchPredicate);
         }
     }
@@ -102,7 +102,7 @@
                     if (bloomFilters[i] != null && bloomFilters[i].contains(btreeTuple, hashes)) {
                         continue;
                     }
-                    btreeCursors[i].reset();
+                    btreeCursors[i].close();
                     btreeRangePredicate.setHighKey(btreeTuple, true);
                     btreeRangePredicate.setLowKey(btreeTuple, true);
                     btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
@@ -111,7 +111,7 @@
                             killerTupleFound = true;
                         }
                     } finally {
-                        btreeCursors[i].close();
+                        btreeCursors[i].destroy();
                     }
                 }
                 if (!killerTupleFound) {
@@ -120,7 +120,7 @@
                     return true;
                 }
             }
-            rtreeCursors[currentCursor].close();
+            rtreeCursors[currentCursor].destroy();
             currentCursor++;
             searchNextCursor();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
index e3f74d3..d66e882 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeSortedCursor.java
@@ -43,7 +43,7 @@
         super(opCtx);
         this.linearizeCmp = linearizer.createBinaryComparator();
         this.btreeTuple = new PermutingTupleReference(buddyBTreeFields);
-        reset();
+        close();
     }
 
     public ILSMIndexOperationContext getOpCtx() {
@@ -51,12 +51,12 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         depletedRtreeCursors = new boolean[numberOfTrees];
         foundNext = false;
         try {
             for (int i = 0; i < numberOfTrees; i++) {
-                rtreeCursors[i].reset();
+                rtreeCursors[i].close();
                 rtreeAccessors[i].search(rtreeCursors[i], rtreeSearchPredicate);
                 if (rtreeCursors[i].hasNext()) {
                     rtreeCursors[i].next();
@@ -128,7 +128,7 @@
             boolean killed = false;
             btreeTuple.reset(frameTuple);
             for (int i = 0; i < foundIn; i++) {
-                btreeCursors[i].reset();
+                btreeCursors[i].close();
                 btreeRangePredicate.setHighKey(btreeTuple, true);
                 btreeRangePredicate.setLowKey(btreeTuple, true);
                 btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
@@ -138,7 +138,7 @@
                         break;
                     }
                 } finally {
-                    btreeCursors[i].close();
+                    btreeCursors[i].destroy();
                 }
             }
             if (!killed) {
@@ -161,7 +161,7 @@
         depletedRtreeCursors = new boolean[numberOfTrees];
         foundNext = false;
         for (int i = 0; i < numberOfTrees; i++) {
-            rtreeCursors[i].reset();
+            rtreeCursors[i].close();
             rtreeAccessors[i].search(rtreeCursors[i], rtreeSearchPredicate);
             if (rtreeCursors[i].hasNext()) {
                 rtreeCursors[i].next();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
index c8f601d..94d76f6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuples.java
@@ -30,9 +30,8 @@
 import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.IComponentFilterHelper;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilterFrameFactory;
@@ -60,9 +59,8 @@
 import org.apache.hyracks.storage.am.rtree.impls.RTree.RTreeAccessor;
 import org.apache.hyracks.storage.am.rtree.impls.RTreeSearchCursor;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexCursor;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
@@ -94,8 +92,8 @@
         // read the file names when we open the tree.
         // The RTree should be renamed before the BTree.
         LSMRTreeMemoryComponent flushingComponent = (LSMRTreeMemoryComponent) flushOp.getFlushingComponent();
-        RTreeAccessor memRTreeAccessor = flushingComponent.getIndex().createAccessor(NoOpOperationCallback.INSTANCE,
-                NoOpOperationCallback.INSTANCE);
+        RTreeAccessor memRTreeAccessor =
+                flushingComponent.getIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         RTreeSearchCursor rtreeScanCursor = memRTreeAccessor.createSearchCursor(false);
         SearchPredicate rtreeNullPredicate = new SearchPredicate(null, null);
         memRTreeAccessor.search(rtreeScanCursor, rtreeNullPredicate);
@@ -117,15 +115,15 @@
                 rTreeTupleSorter.insertTupleEntry(rtreeScanCursor.getPageId(), rtreeScanCursor.getTupleOffset());
             }
         } finally {
-            rtreeScanCursor.close();
+            rtreeScanCursor.destroy();
         }
         if (!isEmpty) {
             rTreeTupleSorter.sort();
         }
 
         // scan the memory BTree
-        BTreeAccessor memBTreeAccessor = flushingComponent.getBuddyIndex()
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        BTreeAccessor memBTreeAccessor =
+                flushingComponent.getBuddyIndex().createAccessor(NoOpIndexAccessParameters.INSTANCE);
         BTreeRangeSearchCursor btreeScanCursor = memBTreeAccessor.createSearchCursor(false);
         RangePredicate btreeNullPredicate = new RangePredicate(null, null, true, true, null, null);
         memBTreeAccessor.search(btreeScanCursor, btreeNullPredicate);
@@ -141,7 +139,7 @@
                 bTreeTupleSorter.insertTupleEntry(btreeScanCursor.getPageId(), btreeScanCursor.getTupleOffset());
             }
         } finally {
-            btreeScanCursor.close();
+            btreeScanCursor.destroy();
         }
         if (!isEmpty) {
             bTreeTupleSorter.sort();
@@ -159,7 +157,7 @@
                 componentBulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
 
         if (component.getLSMComponentFilter() != null) {
@@ -195,7 +193,7 @@
                 componentBulkLoader.add(frameTuple);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
         if (component.getLSMComponentFilter() != null) {
             List<ITupleReference> filterTuples = new ArrayList<>();
@@ -213,17 +211,16 @@
     }
 
     @Override
-    public ILSMIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        LSMRTreeOpContext opCtx = createOpContext(modificationCallback, searchCallback);
-        return new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+    public ILSMIndexAccessor createAccessor(IIndexAccessParameters iap) {
+        LSMRTreeOpContext opCtx = createOpContext(iap.getModificationCallback(), iap.getSearchOperationCallback());
+        return new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
     }
 
     @Override
     protected ILSMIOOperation createFlushOperation(AbstractLSMIndexOperationContext opCtx,
             LSMComponentFileReferences componentFileRefs, ILSMIOOperationCallback callback)
             throws HyracksDataException {
-        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
+        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
         return new LSMRTreeFlushOperation(accessor, componentFileRefs.getInsertIndexFileReference(), null, null,
                 callback, fileManager.getBaseDir().getAbsolutePath());
     }
@@ -236,9 +233,10 @@
         if (mergingComponents.get(mergingComponents.size() - 1) != diskComponents.get(diskComponents.size() - 1)) {
             returnDeletedTuples = true;
         }
-        ITreeIndexCursor cursor = new LSMRTreeWithAntiMatterTuplesSearchCursor(opCtx, returnDeletedTuples);
-        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getLsmHarness(), opCtx, cursorFactory);
-        return new MergeOperation(accessor, mergeFileRefs.getInsertIndexFileReference(), callback,
-                fileManager.getBaseDir().getAbsolutePath(), cursor);
+        LSMRTreeWithAntiMatterTuplesSearchCursor cursor =
+                new LSMRTreeWithAntiMatterTuplesSearchCursor(opCtx, returnDeletedTuples);
+        ILSMIndexAccessor accessor = new LSMTreeIndexAccessor(getHarness(), opCtx, cursorFactory);
+        return new LSMRTreeMergeOperation(accessor, cursor, mergeFileRefs.getInsertIndexFileReference(), null, null,
+                callback, fileManager.getBaseDir().getAbsolutePath());
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
index af9fef6..c2a2bf5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesFlushCursor.java
@@ -22,13 +22,13 @@
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.api.ILSMIndexCursor;
 import org.apache.hyracks.storage.common.ICursorInitialState;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
-import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 
-public class LSMRTreeWithAntiMatterTuplesFlushCursor implements ITreeIndexCursor {
+public class LSMRTreeWithAntiMatterTuplesFlushCursor implements ILSMIndexCursor {
     private final TreeTupleSorter rTreeTupleSorter;
     private final TreeTupleSorter bTreeTupleSorter;
     private final int[] comparatorFields;
@@ -130,11 +130,11 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
 
     }
 
@@ -153,18 +153,4 @@
         return null;
     }
 
-    @Override
-    public void setBufferCache(IBufferCache bufferCache) {
-
-    }
-
-    @Override
-    public void setFileId(int fileId) {
-
-    }
-
-    @Override
-    public boolean isExclusiveLatchNodes() {
-        return false;
-    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
index 4abab53..b8180a6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/LSMRTreeWithAntiMatterTuplesSearchCursor.java
@@ -27,7 +27,7 @@
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponent.LSMComponentType;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMComponentFilter;
@@ -56,7 +56,7 @@
     private MultiComparator btreeCmp;
     private int currentCursor;
     private SearchPredicate rtreeSearchPredicate;
-    private int numMutableComponents;
+    private int numMemoryComponents;
     private boolean open;
     protected ISearchOperationCallback searchCallback;
 
@@ -79,27 +79,24 @@
         operationalComponents = lsmInitialState.getOperationalComponents();
         rtreeSearchPredicate = (SearchPredicate) searchPred;
         searchCallback = lsmInitialState.getSearchOperationCallback();
-
-        includeMutableComponent = false;
-        numMutableComponents = 0;
+        numMemoryComponents = 0;
         int numImmutableComponents = 0;
         for (ILSMComponent component : operationalComponents) {
             if (component.getType() == LSMComponentType.MEMORY) {
-                includeMutableComponent = true;
-                numMutableComponents++;
+                numMemoryComponents++;
             } else {
                 numImmutableComponents++;
             }
         }
-        if (includeMutableComponent) {
+        if (numMemoryComponents > 0) {
             btreeRangePredicate = new RangePredicate(null, null, true, true, btreeCmp, btreeCmp);
         }
 
-        mutableRTreeCursors = new RTreeSearchCursor[numMutableComponents];
-        mutableRTreeAccessors = new ITreeIndexAccessor[numMutableComponents];
-        btreeCursors = new BTreeRangeSearchCursor[numMutableComponents];
-        btreeAccessors = new ITreeIndexAccessor[numMutableComponents];
-        for (int i = 0; i < numMutableComponents; i++) {
+        mutableRTreeCursors = new RTreeSearchCursor[numMemoryComponents];
+        mutableRTreeAccessors = new ITreeIndexAccessor[numMemoryComponents];
+        btreeCursors = new BTreeRangeSearchCursor[numMemoryComponents];
+        btreeAccessors = new ITreeIndexAccessor[numMemoryComponents];
+        for (int i = 0; i < numMemoryComponents; i++) {
             ILSMComponent component = operationalComponents.get(i);
             RTree rtree = ((LSMRTreeMemoryComponent) component).getIndex();
             BTree btree = ((LSMRTreeMemoryComponent) component).getBuddyIndex();
@@ -108,22 +105,20 @@
                     (IRTreeLeafFrame) lsmInitialState.getRTreeLeafFrameFactory().createFrame());
             btreeCursors[i] = new BTreeRangeSearchCursor(
                     (IBTreeLeafFrame) lsmInitialState.getBTreeLeafFrameFactory().createFrame(), false);
-            btreeAccessors[i] = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
-            mutableRTreeAccessors[i] =
-                    rtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            btreeAccessors[i] = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+            mutableRTreeAccessors[i] = rtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         }
 
         rangeCursors = new RTreeSearchCursor[numImmutableComponents];
         ITreeIndexAccessor[] immutableRTreeAccessors = new ITreeIndexAccessor[numImmutableComponents];
         int j = 0;
-        for (int i = numMutableComponents; i < operationalComponents.size(); i++) {
+        for (int i = numMemoryComponents; i < operationalComponents.size(); i++) {
             ILSMComponent component = operationalComponents.get(i);
             rangeCursors[j] = new RTreeSearchCursor(
                     (IRTreeInteriorFrame) lsmInitialState.getRTreeInteriorFrameFactory().createFrame(),
                     (IRTreeLeafFrame) lsmInitialState.getRTreeLeafFrameFactory().createFrame());
             RTree rtree = ((LSMRTreeWithAntimatterDiskComponent) component).getIndex();
-            immutableRTreeAccessors[j] =
-                    rtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            immutableRTreeAccessors[j] = rtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             immutableRTreeAccessors[j].search(rangeCursors[j], searchPred);
             j++;
         }
@@ -134,20 +129,20 @@
     }
 
     private void searchNextCursor() throws HyracksDataException {
-        if (currentCursor < numMutableComponents) {
-            mutableRTreeCursors[currentCursor].reset();
+        if (currentCursor < numMemoryComponents) {
+            mutableRTreeCursors[currentCursor].close();
             mutableRTreeAccessors[currentCursor].search(mutableRTreeCursors[currentCursor], rtreeSearchPredicate);
         }
     }
 
     @Override
     public boolean hasNext() throws HyracksDataException {
-        if (includeMutableComponent) {
+        if (numMemoryComponents > 0) {
             if (foundNext) {
                 return true;
             }
 
-            while (currentCursor < numMutableComponents) {
+            while (currentCursor < numMemoryComponents) {
                 while (mutableRTreeCursors[currentCursor].hasNext()) {
                     mutableRTreeCursors[currentCursor].next();
                     ITupleReference currentTuple = mutableRTreeCursors[currentCursor].getTuple();
@@ -163,7 +158,7 @@
                         return true;
                     }
                 }
-                mutableRTreeCursors[currentCursor].close();
+                mutableRTreeCursors[currentCursor].destroy();
                 currentCursor++;
                 searchNextCursor();
             }
@@ -175,7 +170,7 @@
 
                 // Call proceed() to do necessary operations before returning this tuple.
                 searchCallback.proceed(diskRTreeTuple);
-                if (searchMemBTrees(diskRTreeTuple, numMutableComponents)) {
+                if (searchMemBTrees(diskRTreeTuple, numMemoryComponents)) {
                     // anti-matter tuple is NOT found
                     foundNext = true;
                     frameTuple = diskRTreeTuple;
@@ -205,7 +200,7 @@
     @Override
     public ITupleReference getFilterMinTuple() {
         ILSMComponentFilter filter = operationalComponents.get(
-                currentCursor < numMutableComponents ? currentCursor : outputElement.getCursorIndex() + currentCursor)
+                currentCursor < numMemoryComponents ? currentCursor : outputElement.getCursorIndex() + currentCursor)
                 .getLSMComponentFilter();
         return filter == null ? null : filter.getMinTuple();
     }
@@ -213,12 +208,11 @@
     @Override
     public ITupleReference getFilterMaxTuple() {
         ILSMComponentFilter filter = operationalComponents.get(
-                currentCursor < numMutableComponents ? currentCursor : outputElement.getCursorIndex() + currentCursor)
+                currentCursor < numMemoryComponents ? currentCursor : outputElement.getCursorIndex() + currentCursor)
                 .getLSMComponentFilter();
         return filter == null ? null : filter.getMaxTuple();
     }
 
-
     @Override
     public void next() throws HyracksDataException {
         foundNext = false;
@@ -230,35 +224,35 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
+    public void close() throws HyracksDataException {
         if (!open) {
             return;
         }
         currentCursor = 0;
         foundNext = false;
-        if (includeMutableComponent) {
-            for (int i = 0; i < numMutableComponents; i++) {
-                mutableRTreeCursors[i].reset();
-                btreeCursors[i].reset();
-            }
-        }
-        super.reset();
-    }
-
-    @Override
-    public void close() throws HyracksDataException {
-        if (!open) {
-            return;
-        }
-        if (includeMutableComponent) {
-            for (int i = 0; i < numMutableComponents; i++) {
+        if (numMemoryComponents > 0) {
+            for (int i = 0; i < numMemoryComponents; i++) {
                 mutableRTreeCursors[i].close();
                 btreeCursors[i].close();
             }
         }
+        super.close();
+    }
+
+    @Override
+    public void destroy() throws HyracksDataException {
+        if (!open) {
+            return;
+        }
+        if (numMemoryComponents > 0) {
+            for (int i = 0; i < numMemoryComponents; i++) {
+                mutableRTreeCursors[i].destroy();
+                btreeCursors[i].destroy();
+            }
+        }
         currentCursor = 0;
         open = false;
-        super.close();
+        super.destroy();
     }
 
     @Override
@@ -269,7 +263,7 @@
 
     private boolean searchMemBTrees(ITupleReference tuple, int lastBTreeToSearch) throws HyracksDataException {
         for (int i = 0; i < lastBTreeToSearch; i++) {
-            btreeCursors[i].reset();
+            btreeCursors[i].close();
             btreeRangePredicate.setHighKey(tuple, true);
             btreeRangePredicate.setLowKey(tuple, true);
             btreeAccessors[i].search(btreeCursors[i], btreeRangePredicate);
@@ -278,7 +272,7 @@
                     return false;
                 }
             } finally {
-                btreeCursors[i].close();
+                btreeCursors[i].destroy();
             }
         }
         return true;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
index cad1f74..6fe6b60 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/impls/TreeTupleSorter.java
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public void reset() {
+    public void close() {
         numTuples = 0;
         currentTupleIndex = 0;
     }
@@ -96,16 +96,6 @@
         return frameTuple1;
     }
 
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
     public void insertTupleEntry(int pageId, int tupleOffset) {
         if (numTuples * 2 == tPointers.length) {
             int[] newData = new int[tPointers.length + ARRAY_GROWTH];
@@ -217,7 +207,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         // do nothing
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/utils/LSMRTreeUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/utils/LSMRTreeUtils.java
index c9df11f..4b851e4 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/utils/LSMRTreeUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-lsm-rtree/src/main/java/org/apache/hyracks/storage/am/lsm/rtree/utils/LSMRTreeUtils.java
@@ -72,6 +72,7 @@
 import org.apache.hyracks.storage.am.rtree.linearize.ZCurveIntComparatorFactory;
 import org.apache.hyracks.storage.am.rtree.tuples.RTreeTypeAwareTupleWriterFactory;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.apache.hyracks.util.trace.ITracer;
 
 public class LSMRTreeUtils {
     public static LSMRTree createLSMTree(IIOManager ioManager, List<IVirtualBufferCache> virtualBufferCaches,
@@ -173,7 +174,7 @@
             rtreeLeafFrameBulkLoadWriterFactory = new LSMRTreeTupleWriterFactory(typeTraits, false);
         }
 
-        LSMRTreeTupleWriterFactory btreeTupleWriterFactory = new LSMRTreeTupleWriterFactory(typeTraits, false);
+        LSMRTreeTupleWriterFactory btreeTupleWriterFactory = new LSMRTreeTupleWriterFactory(typeTraits, true);
 
         RTreeFrameFactory rtreeInteriorFrameFactory = new RTreeNSMInteriorFrameFactory(
                 rtreeInteriorFrameTupleWriterFactory, valueProviderFactories, rtreePolicyType, isPointMBR);
@@ -243,7 +244,7 @@
             ILSMOperationTracker opTracker, ILSMIOOperationScheduler ioScheduler,
             ILSMIOOperationCallbackFactory ioOpCallbackFactory, ILinearizeComparatorFactory linearizeCmpFactory,
             int[] buddyBTreeFields, boolean durable, boolean isPointMBR,
-            IMetadataPageManagerFactory freePageManagerFactory) throws HyracksDataException {
+            IMetadataPageManagerFactory freePageManagerFactory, ITracer tracer) throws HyracksDataException {
 
         int keyFieldCount = rtreeCmpFactories.length;
         int valueFieldCount = typeTraits.length - keyFieldCount;
@@ -290,7 +291,7 @@
                 btreeLeafFrameFactory, diskBufferCache, fileNameManager, componentFactory, bloomFilterFalsePositiveRate,
                 typeTraits.length, rtreeCmpFactories, btreeCmpFactories, linearizeCmpFactory, comparatorFields,
                 linearizerArray, mergePolicy, opTracker, ioScheduler, ioOpCallbackFactory, buddyBTreeFields, durable,
-                isPointMBR);
+                isPointMBR, tracer);
     }
 
     public static ILinearizeComparatorFactory proposeBestLinearizer(ITypeTraits[] typeTraits, int numKeyFields)
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/api/IGenericPrimitiveSerializerDeserializer.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/api/IGenericPrimitiveSerializerDeserializer.java
index 1825003..1ca75cb 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/api/IGenericPrimitiveSerializerDeserializer.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/api/IGenericPrimitiveSerializerDeserializer.java
@@ -21,7 +21,6 @@
 
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 
-public interface IGenericPrimitiveSerializerDeserializer<T> extends
-        ISerializerDeserializer<T> {
+public interface IGenericPrimitiveSerializerDeserializer<T> extends ISerializerDeserializer<T> {
     public double getValue(byte[] bytes, int offset);
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeResource.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeResource.java
index df4fbf2..f9eb844 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/dataflow/RTreeResource.java
@@ -35,7 +35,7 @@
 public class RTreeResource implements IResource {
 
     private static final long serialVersionUID = 1L;
-    private final String path;
+    private String path;
     private final IStorageManager storageManager;
     private final ITypeTraits[] typeTraits;
     private final IBinaryComparatorFactory[] comparatorFactories;
@@ -68,4 +68,8 @@
         return path;
     }
 
+    @Override
+    public void setPath(String path) {
+        this.path = path;
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RStarTreePolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RStarTreePolicy.java
index 7ae616a..1681eee 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RStarTreePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RStarTreePolicy.java
@@ -71,10 +71,12 @@
 
     @Override
     public void split(ITreeIndexFrame leftFrame, ByteBuffer buf, ITreeIndexFrame rightFrame, ISlotManager slotManager,
-            ITreeIndexTupleReference frameTuple, ITupleReference tuple, ISplitKey splitKey) throws HyracksDataException {
+            ITreeIndexTupleReference frameTuple, ITupleReference tuple, ISplitKey splitKey)
+            throws HyracksDataException {
         RTreeSplitKey rTreeSplitKey = ((RTreeSplitKey) splitKey);
         RTreeTypeAwareTupleWriter rTreeTupleWriterleftRTreeFrame = ((RTreeTypeAwareTupleWriter) tupleWriter);
-        RTreeTypeAwareTupleWriter rTreeTupleWriterRightFrame = ((RTreeTypeAwareTupleWriter) rightFrame.getTupleWriter());
+        RTreeTypeAwareTupleWriter rTreeTupleWriterRightFrame =
+                ((RTreeTypeAwareTupleWriter) rightFrame.getTupleWriter());
 
         RTreeNSMFrame leftRTreeFrame = ((RTreeNSMFrame) leftFrame);
 
@@ -92,10 +94,10 @@
             for (int k = 0; k < leftRTreeFrame.getTupleCount(); ++k) {
 
                 frameTuple.resetByTupleIndex(leftRTreeFrame, k);
-                double LowerKey = keyValueProviders[i]
-                        .getValue(frameTuple.getFieldData(i), frameTuple.getFieldStart(i));
-                double UpperKey = keyValueProviders[j]
-                        .getValue(frameTuple.getFieldData(j), frameTuple.getFieldStart(j));
+                double LowerKey =
+                        keyValueProviders[i].getValue(frameTuple.getFieldData(i), frameTuple.getFieldStart(i));
+                double UpperKey =
+                        keyValueProviders[j].getValue(frameTuple.getFieldData(j), frameTuple.getFieldStart(j));
 
                 tupleEntries1.add(k, LowerKey);
                 tupleEntries2.add(k, UpperKey);
@@ -186,8 +188,8 @@
             if (tupleEntries1.get(i).getTupleIndex() != -1) {
                 frameTuple.resetByTupleIndex(leftRTreeFrame, tupleEntries1.get(i).getTupleIndex());
                 rightFrame.insert(frameTuple, -1);
-                ((UnorderedSlotManager) slotManager).modifySlot(
-                        slotManager.getSlotOff(tupleEntries1.get(i).getTupleIndex()), -1);
+                ((UnorderedSlotManager) slotManager)
+                        .modifySlot(slotManager.getSlotOff(tupleEntries1.get(i).getTupleIndex()), -1);
                 totalBytes += leftRTreeFrame.getTupleSize(frameTuple);
                 numOfDeletedTuples++;
             } else {
@@ -198,8 +200,8 @@
         ((UnorderedSlotManager) slotManager).deleteEmptySlots();
 
         // maintain space information
-        buf.putInt(totalFreeSpaceOff, buf.getInt(totalFreeSpaceOff) + totalBytes
-                + (slotManager.getSlotSize() * numOfDeletedTuples));
+        buf.putInt(totalFreeSpaceOff,
+                buf.getInt(totalFreeSpaceOff) + totalBytes + (slotManager.getSlotSize() * numOfDeletedTuples));
 
         // compact both pages
         rightFrame.compact();
@@ -238,8 +240,8 @@
         tupleEntries2.clear();
     }
 
-    public void generateDist(ITreeIndexFrame leftRTreeFrame, ITreeIndexTupleReference frameTuple,
-            ITupleReference tuple, TupleEntryArrayList entries, Rectangle rec, int start, int end) {
+    public void generateDist(ITreeIndexFrame leftRTreeFrame, ITreeIndexTupleReference frameTuple, ITupleReference tuple,
+            TupleEntryArrayList entries, Rectangle rec, int start, int end) {
         int j = 0;
         while (entries.get(j).getTupleIndex() == -1) {
             j++;
@@ -302,20 +304,19 @@
 
                         int c = ((RTreeNSMInteriorFrame) frame).pointerCmp(frameTuple, cmpFrameTuple, cmp);
                         if (c != 0) {
-                            double intersection = RTreeComputationUtils.overlappedArea(frameTuple, tuple,
-                                    cmpFrameTuple, cmp, keyValueProviders);
+                            double intersection = RTreeComputationUtils.overlappedArea(frameTuple, tuple, cmpFrameTuple,
+                                    cmp, keyValueProviders);
                             if (intersection != 0.0) {
-                                difference += intersection
-                                        - RTreeComputationUtils.overlappedArea(frameTuple, null, cmpFrameTuple, cmp,
-                                                keyValueProviders);
+                                difference += intersection - RTreeComputationUtils.overlappedArea(frameTuple, null,
+                                        cmpFrameTuple, cmp, keyValueProviders);
                             }
                         } else {
                             id = j;
                         }
                     }
 
-                    double enlargedArea = RTreeComputationUtils.enlargedArea(cmpFrameTuple, tuple, cmp,
-                            keyValueProviders);
+                    double enlargedArea =
+                            RTreeComputationUtils.enlargedArea(cmpFrameTuple, tuple, cmp, keyValueProviders);
                     if (difference < minOverlap) {
                         minOverlap = difference;
                         minEnlargedArea = enlargedArea;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeComputationUtils.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeComputationUtils.java
index 31ade3c..281dff5 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeComputationUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeComputationUtils.java
@@ -71,8 +71,8 @@
             double pHigh1, pLow1;
             if (tupleToBeInserted != null) {
                 int c = cmp.getComparators()[i].compare(tuple1.getFieldData(i), tuple1.getFieldStart(i),
-                        tuple1.getFieldLength(i), tupleToBeInserted.getFieldData(i),
-                        tupleToBeInserted.getFieldStart(i), tupleToBeInserted.getFieldLength(i));
+                        tuple1.getFieldLength(i), tupleToBeInserted.getFieldData(i), tupleToBeInserted.getFieldStart(i),
+                        tupleToBeInserted.getFieldLength(i));
                 if (c < 0) {
                     pLow1 = keyValueProviders[i].getValue(tuple1.getFieldData(i), tuple1.getFieldStart(i));
                 } else {
@@ -81,8 +81,8 @@
                 }
 
                 c = cmp.getComparators()[j].compare(tuple1.getFieldData(j), tuple1.getFieldStart(j),
-                        tuple1.getFieldLength(j), tupleToBeInserted.getFieldData(j),
-                        tupleToBeInserted.getFieldStart(j), tupleToBeInserted.getFieldLength(j));
+                        tuple1.getFieldLength(j), tupleToBeInserted.getFieldData(j), tupleToBeInserted.getFieldStart(j),
+                        tupleToBeInserted.getFieldLength(j));
                 if (c > 0) {
                     pHigh1 = keyValueProviders[j].getValue(tuple1.getFieldData(j), tuple1.getFieldStart(j));
                 } else {
@@ -124,16 +124,16 @@
         int maxFieldPos = cmp.getKeyFieldCount() / 2;
         for (int i = 0; i < maxFieldPos; i++) {
             int j = maxFieldPos + i;
-            int c = cmp.getComparators()[i]
-                    .compare(tuple1.getFieldData(i), tuple1.getFieldStart(i), tuple1.getFieldLength(i),
-                            tuple2.getFieldData(i), tuple2.getFieldStart(i), tuple2.getFieldLength(i));
+            int c = cmp.getComparators()[i].compare(tuple1.getFieldData(i), tuple1.getFieldStart(i),
+                    tuple1.getFieldLength(i), tuple2.getFieldData(i), tuple2.getFieldStart(i),
+                    tuple2.getFieldLength(i));
             if (c > 0) {
                 return false;
             }
 
-            c = cmp.getComparators()[j]
-                    .compare(tuple1.getFieldData(j), tuple1.getFieldStart(j), tuple1.getFieldLength(j),
-                            tuple2.getFieldData(j), tuple2.getFieldStart(j), tuple2.getFieldLength(j));
+            c = cmp.getComparators()[j].compare(tuple1.getFieldData(j), tuple1.getFieldStart(j),
+                    tuple1.getFieldLength(j), tuple2.getFieldData(j), tuple2.getFieldStart(j),
+                    tuple2.getFieldLength(j));
             if (c < 0) {
                 return false;
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMFrame.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMFrame.java
index ba542ea..05d04f6 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMFrame.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMFrame.java
@@ -115,8 +115,7 @@
 
     @Override
     public void split(ITreeIndexFrame rightFrame, ITupleReference tuple, ISplitKey splitKey,
-            IExtraPageBlockHelper extraPageBlockHelper, IBufferCache bufferCache)
-            throws HyracksDataException {
+            IExtraPageBlockHelper extraPageBlockHelper, IBufferCache bufferCache) throws HyracksDataException {
         rtreePolicy.split(this, buf, rightFrame, slotManager, frameTuple, tuple, splitKey);
     }
 
@@ -166,15 +165,12 @@
 
     @Override
     public String toString() {
-        return new StringBuilder(this.getClass().getSimpleName()).append('\n').append(
-                "Tuple Count: " + getTupleCount()).append('\n').append("Free Space offset: " + buf
-                        .getInt(Constants.FREE_SPACE_OFFSET)).append('\n').append("Level: " + buf
-                                .get(Constants.LEVEL_OFFSET)).append('\n').append("LSN: "
-                                        + buf.getLong(PAGE_LSN_OFFSET)).append('\n').append(
-                                                "Total Free Space: " + buf.getInt(TOTAL_FREE_SPACE_OFFSET)).append(
-                                                        '\n').append("Flag: " + buf.get(
-                                                                FLAG_OFFSET)).append('\n')
-                .append("NSN: " + buf.getLong(PAGE_NSN_OFFSET)).append('\n').append("Right Page:")
-                .append(buf.getInt(RIGHT_PAGE_OFFSET)).toString();
+        return new StringBuilder(this.getClass().getSimpleName()).append('\n').append("Tuple Count: " + getTupleCount())
+                .append('\n').append("Free Space offset: " + buf.getInt(Constants.FREE_SPACE_OFFSET)).append('\n')
+                .append("Level: " + buf.get(Constants.LEVEL_OFFSET)).append('\n')
+                .append("LSN: " + buf.getLong(PAGE_LSN_OFFSET)).append('\n')
+                .append("Total Free Space: " + buf.getInt(TOTAL_FREE_SPACE_OFFSET)).append('\n')
+                .append("Flag: " + buf.get(FLAG_OFFSET)).append('\n').append("NSN: " + buf.getLong(PAGE_NSN_OFFSET))
+                .append('\n').append("Right Page:").append(buf.getInt(RIGHT_PAGE_OFFSET)).toString();
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrameFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrameFactory.java
index b8b5a8c..5550e1f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrameFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMInteriorFrameFactory.java
@@ -38,8 +38,8 @@
         for (int i = 0; i < keyValueProviders.length; i++) {
             keyValueProviders[i] = keyValueProviderFactories[i].createPrimitiveValueProvider();
         }
-        return new RTreeNSMInteriorFrame(tupleWriterFactory.createTupleWriter(), keyValueProviders,
-                rtreePolicyType, isPointMBR);
+        return new RTreeNSMInteriorFrame(tupleWriterFactory.createTupleWriter(), keyValueProviders, rtreePolicyType,
+                isPointMBR);
     }
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrameFactory.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrameFactory.java
index e112b86..16b22c0 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrameFactory.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreeNSMLeafFrameFactory.java
@@ -38,8 +38,8 @@
         for (int i = 0; i < keyValueProviders.length; i++) {
             keyValueProviders[i] = keyValueProviderFactories[i].createPrimitiveValueProvider();
         }
-        return new RTreeNSMLeafFrame(tupleWriterFactory.createTupleWriter(), keyValueProviders,
-                rtreePolicyType, isPointMBR);
+        return new RTreeNSMLeafFrame(tupleWriterFactory.createTupleWriter(), keyValueProviders, rtreePolicyType,
+                isPointMBR);
     }
 
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicy.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicy.java
index 0dea4c2..623ef21 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicy.java
@@ -62,10 +62,12 @@
 
     @Override
     public void split(ITreeIndexFrame leftFrame, ByteBuffer buf, ITreeIndexFrame rightFrame, ISlotManager slotManager,
-            ITreeIndexTupleReference frameTuple, ITupleReference tuple, ISplitKey splitKey) throws HyracksDataException {
+            ITreeIndexTupleReference frameTuple, ITupleReference tuple, ISplitKey splitKey)
+            throws HyracksDataException {
         RTreeSplitKey rTreeSplitKey = ((RTreeSplitKey) splitKey);
         RTreeTypeAwareTupleWriter rTreeTupleWriterLeftFrame = ((RTreeTypeAwareTupleWriter) tupleWriter);
-        RTreeTypeAwareTupleWriter rTreeTupleWriterRightFrame = ((RTreeTypeAwareTupleWriter) rightFrame.getTupleWriter());
+        RTreeTypeAwareTupleWriter rTreeTupleWriterRightFrame =
+                ((RTreeTypeAwareTupleWriter) rightFrame.getTupleWriter());
 
         RTreeNSMFrame leftRTreeFrame = ((RTreeNSMFrame) leftFrame);
 
@@ -75,10 +77,10 @@
         for (int i = 0; i < maxFieldPos; i++) {
             int j = maxFieldPos + i;
             frameTuple.resetByTupleIndex(leftRTreeFrame, 0);
-            double leastLowerValue = keyValueProviders[i].getValue(frameTuple.getFieldData(i),
-                    frameTuple.getFieldStart(i));
-            double greatestUpperValue = keyValueProviders[j].getValue(frameTuple.getFieldData(j),
-                    frameTuple.getFieldStart(j));
+            double leastLowerValue =
+                    keyValueProviders[i].getValue(frameTuple.getFieldData(i), frameTuple.getFieldStart(i));
+            double greatestUpperValue =
+                    keyValueProviders[j].getValue(frameTuple.getFieldData(j), frameTuple.getFieldStart(j));
             double leastUpperValue = leastLowerValue;
             double greatestLowerValue = greatestUpperValue;
             int leastUpperIndex = 0;
@@ -88,16 +90,16 @@
             int tupleCount = leftRTreeFrame.getTupleCount();
             for (int k = 1; k < tupleCount; ++k) {
                 frameTuple.resetByTupleIndex(leftRTreeFrame, k);
-                double lowerValue = keyValueProviders[i].getValue(frameTuple.getFieldData(i),
-                        frameTuple.getFieldStart(i));
+                double lowerValue =
+                        keyValueProviders[i].getValue(frameTuple.getFieldData(i), frameTuple.getFieldStart(i));
                 if (lowerValue > greatestLowerValue) {
                     greatestLowerIndex = k;
                     cmpFrameTuple.resetByTupleIndex(leftRTreeFrame, k);
                     greatestLowerValue = keyValueProviders[i].getValue(cmpFrameTuple.getFieldData(i),
                             cmpFrameTuple.getFieldStart(i));
                 }
-                double higherValue = keyValueProviders[j].getValue(frameTuple.getFieldData(j),
-                        frameTuple.getFieldStart(j));
+                double higherValue =
+                        keyValueProviders[j].getValue(frameTuple.getFieldData(j), frameTuple.getFieldStart(j));
                 if (higherValue < leastUpperValue) {
                     leastUpperIndex = k;
                     cmpFrameTuple.resetByTupleIndex(leftRTreeFrame, k);
@@ -169,8 +171,8 @@
         ((UnorderedSlotManager) slotManager).deleteEmptySlots();
 
         // maintain space information
-        buf.putInt(totalFreeSpaceOff, buf.getInt(totalFreeSpaceOff) + totalBytes
-                + (slotManager.getSlotSize() * numOfDeletedTuples));
+        buf.putInt(totalFreeSpaceOff,
+                buf.getInt(totalFreeSpaceOff) + totalBytes + (slotManager.getSlotSize() * numOfDeletedTuples));
 
         // compact both pages
         rightFrame.compact();
@@ -196,7 +198,8 @@
 
         splitKey.initData(splitKeySize);
         leftRTreeFrame.adjustMBR();
-        rTreeTupleWriterLeftFrame.writeTupleFields(leftRTreeFrame.getMBRTuples(), 0, rTreeSplitKey.getLeftPageBuffer(), 0);
+        rTreeTupleWriterLeftFrame.writeTupleFields(leftRTreeFrame.getMBRTuples(), 0, rTreeSplitKey.getLeftPageBuffer(),
+                0);
         rTreeSplitKey.getLeftTuple().resetByTupleOffset(rTreeSplitKey.getLeftPageBuffer().array(), 0);
 
         ((IRTreeFrame) rightFrame).adjustMBR();
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicyType.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicyType.java
index 8ca9842..d9dbd81 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicyType.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/frames/RTreePolicyType.java
@@ -20,5 +20,6 @@
 package org.apache.hyracks.storage.am.rtree.frames;
 
 public enum RTreePolicyType {
-    RTREE, RSTARTREE
+    RTREE,
+    RSTARTREE
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/EntriesOrder.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/EntriesOrder.java
index d6d69bb..8798241 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/EntriesOrder.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/EntriesOrder.java
@@ -20,5 +20,6 @@
 package org.apache.hyracks.storage.am.rtree.impls;
 
 public enum EntriesOrder {
-    ASCENDING, DESCENDING
+    ASCENDING,
+    DESCENDING
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java
index 750a2fa..1e71b7f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTree.java
@@ -50,6 +50,7 @@
 import org.apache.hyracks.storage.am.rtree.frames.RTreeNSMFrame;
 import org.apache.hyracks.storage.am.rtree.frames.RTreeNSMInteriorFrame;
 import org.apache.hyracks.storage.am.rtree.tuples.RTreeTypeAwareTupleWriter;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
@@ -756,9 +757,8 @@
     }
 
     @Override
-    public RTreeAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) {
-        return new RTreeAccessor(this, modificationCallback, searchCallback);
+    public RTreeAccessor createAccessor(IIndexAccessParameters iap) {
+        return new RTreeAccessor(this, iap.getModificationCallback(), iap.getSearchOperationCallback());
     }
 
     public RTreeAccessor createAccessor(IModificationOperationCallback modificationCallback,
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
index 4302c61..3f4e00a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSearchCursor.java
@@ -62,7 +62,7 @@
     }
 
     @Override
-    public void close() throws HyracksDataException {
+    public void destroy() throws HyracksDataException {
         if (readLatched) {
             page.releaseReadLatch();
             bufferCache.unpin(page);
@@ -79,16 +79,6 @@
         return frameTuple;
     }
 
-    @Override
-    public ITupleReference getFilterMinTuple() {
-        return null;
-    }
-
-    @Override
-    public ITupleReference getFilterMaxTuple() {
-        return null;
-    }
-
     public int getTupleOffset() {
         return leafFrame.getTupleOffset(currentTupleIndex);
     }
@@ -249,8 +239,8 @@
     }
 
     @Override
-    public void reset() throws HyracksDataException {
-        close();
+    public void close() throws HyracksDataException {
+        destroy();
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSplitKey.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSplitKey.java
index f6bdcfb..11a5b2b 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSplitKey.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/RTreeSplitKey.java
@@ -35,8 +35,7 @@
 
     public int keySize = 0;
 
-    public RTreeSplitKey(ITreeIndexTupleReference leftTuple,
-            ITreeIndexTupleReference rightTuple) {
+    public RTreeSplitKey(ITreeIndexTupleReference leftTuple, ITreeIndexTupleReference rightTuple) {
         this.leftTuple = leftTuple;
         this.rightTuple = rightTuple;
     }
@@ -114,8 +113,7 @@
         rightPageBuf.putInt(keySize, page);
     }
 
-    public ISplitKey duplicate(ITreeIndexTupleReference copyLeftTuple,
-            ITreeIndexTupleReference copyRightTuple) {
+    public ISplitKey duplicate(ITreeIndexTupleReference copyLeftTuple, ITreeIndexTupleReference copyRightTuple) {
         RTreeSplitKey copy = new RTreeSplitKey(copyLeftTuple, copyRightTuple);
         copy.leftPageData = leftPageData.clone();
         copy.leftPageBuf = ByteBuffer.wrap(copy.leftPageData);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/Rectangle.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/Rectangle.java
index cbfd245..c74f712 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/Rectangle.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/impls/Rectangle.java
@@ -64,13 +64,13 @@
     public void enlarge(ITupleReference tupleToBeInserted, IPrimitiveValueProvider[] valueProviders) {
         for (int i = 0; i < getDim(); i++) {
             int j = getDim() + i;
-            double low = valueProviders[i].getValue(tupleToBeInserted.getFieldData(i),
-                    tupleToBeInserted.getFieldStart(i));
+            double low =
+                    valueProviders[i].getValue(tupleToBeInserted.getFieldData(i), tupleToBeInserted.getFieldStart(i));
             if (getLow(i) > low) {
                 setLow(i, low);
             }
-            double high = valueProviders[j].getValue(tupleToBeInserted.getFieldData(j),
-                    tupleToBeInserted.getFieldStart(j));
+            double high =
+                    valueProviders[j].getValue(tupleToBeInserted.getFieldData(j), tupleToBeInserted.getFieldStart(j));
             if (getHigh(i) < high) {
                 setHigh(i, high);
             }
@@ -84,8 +84,8 @@
         for (int i = 0; i < getDim(); i++) {
             int j = getDim() + i;
 
-            double low = valueProviders[i].getValue(tupleToBeInserted.getFieldData(i),
-                    tupleToBeInserted.getFieldStart(i));
+            double low =
+                    valueProviders[i].getValue(tupleToBeInserted.getFieldData(i), tupleToBeInserted.getFieldStart(i));
             double lowAfterEnlargement;
             if (getLow(i) > low) {
                 lowAfterEnlargement = low;
@@ -93,8 +93,8 @@
                 lowAfterEnlargement = getLow(i);
             }
 
-            double high = valueProviders[j].getValue(tupleToBeInserted.getFieldData(j),
-                    tupleToBeInserted.getFieldStart(j));
+            double high =
+                    valueProviders[j].getValue(tupleToBeInserted.getFieldData(j), tupleToBeInserted.getFieldStart(j));
             double highAfterEnlargement;
             if (getHigh(i) < high) {
                 highAfterEnlargement = high;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/HilbertDoubleComparator.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/HilbertDoubleComparator.java
index 3194674..447940f 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/HilbertDoubleComparator.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/HilbertDoubleComparator.java
@@ -54,8 +54,8 @@
     private IntArrayList stateStack = new IntArrayList(1000, 200);
     private DoubleArrayList boundsStack = new DoubleArrayList(2000, 400);
 
-    private IPrimitiveValueProvider valueProvider = DoublePrimitiveValueProviderFactory.INSTANCE
-            .createPrimitiveValueProvider();
+    private IPrimitiveValueProvider valueProvider =
+            DoublePrimitiveValueProviderFactory.INSTANCE.createPrimitiveValueProvider();
 
     private double[] a;
     private double[] b;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/ZCurveDoubleComparator.java b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/ZCurveDoubleComparator.java
index 30eb991..13aed8c 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/ZCurveDoubleComparator.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-am-rtree/src/main/java/org/apache/hyracks/storage/am/rtree/linearize/ZCurveDoubleComparator.java
@@ -36,8 +36,8 @@
     private double stepsize;
     private DoubleArrayList boundsStack = new DoubleArrayList(2000, 400);
 
-    private IPrimitiveValueProvider valueProvider = DoublePrimitiveValueProviderFactory.INSTANCE
-            .createPrimitiveValueProvider();
+    private IPrimitiveValueProvider valueProvider =
+            DoublePrimitiveValueProviderFactory.INSTANCE.createPrimitiveValueProvider();
 
     private double[] a;
     private double[] b;
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/pom.xml b/hyracks-fullstack/hyracks/hyracks-storage-common/pom.xml
index 15d2ba2..9936e1a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/pom.xml
@@ -51,5 +51,9 @@
       <artifactId>hyracks-dataflow-common</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/EnforcedIndexCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/EnforcedIndexCursor.java
new file mode 100644
index 0000000..19dfbab
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/EnforcedIndexCursor.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.common;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+
+public class EnforcedIndexCursor implements IIndexCursor {
+    enum State {
+        CLOSED,
+        OPENED,
+        DESTROYED
+    }
+
+    private State state = State.CLOSED;
+
+    @Override
+    public void open(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
+        if (state != State.CLOSED) {
+            throw new IllegalStateException("Cannot open a cursor in the state " + state);
+        }
+        doOpen(initialState, searchPred);
+        state = State.OPENED;
+    }
+
+    protected void doOpen(ICursorInitialState initialState, ISearchPredicate searchPred) throws HyracksDataException {
+        // Do nothing
+    }
+
+    @Override
+    public boolean hasNext() throws HyracksDataException {
+        if (state != State.OPENED) {
+            throw new IllegalStateException("Cannot call hasNext() on a cursor in the state " + state);
+        }
+        return doHasNext();
+    }
+
+    protected boolean doHasNext() throws HyracksDataException {
+        return false;
+    }
+
+    @Override
+    public void next() throws HyracksDataException {
+        if (state != State.OPENED) {
+            throw new IllegalStateException("Cannot call next() on a cursor in the state " + state);
+        }
+        doNext();
+    }
+
+    protected void doNext() throws HyracksDataException {
+        // Do nothing
+    }
+
+    @Override
+    public void destroy() throws HyracksDataException {
+        if (state != State.CLOSED) {
+            throw new IllegalStateException("Cannot destroy a cursor in the state " + state);
+        }
+        doDestroy();
+        state = State.DESTROYED;
+    }
+
+    protected void doDestroy() throws HyracksDataException {
+        // Do nothing
+    }
+
+    @Override
+    public void close() throws HyracksDataException {
+        if (state != State.OPENED) {
+            throw new IllegalStateException("Cannot close a cursor in the state " + state);
+        }
+        doClose();
+        state = State.CLOSED;
+    }
+
+    private void doClose() throws HyracksDataException {
+        // Do nothing
+    }
+
+    @Override
+    public ITupleReference getTuple() {
+        return null;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndex.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndex.java
index 842ef25..19b4856 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndex.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndex.java
@@ -34,6 +34,7 @@
      * Initializes the persistent state of an index.
      * An index cannot be created if it is in the activated state.
      * Calling create on an index that is deactivated has the effect of clearing the index.
+     * This method is atomic. If an exception is thrown, then the call had no effect.
      *
      * @throws HyracksDataException
      *             if there is an error in the BufferCache while (un)pinning pages, (un)latching pages,
@@ -100,14 +101,12 @@
      * on the same {@link IIndex}.
      *
      * @returns IIndexAccessor an accessor for this {@link IIndex}
-     * @param modificationCallback
-     *            the callback to be used for modification operations
-     * @param searchCallback
-     *            the callback to be used for search operations
+     * @param iap
+     *            an instance of the index access parameter class that contains modification callback,
+     *            search operation callback, etc
      * @throws HyracksDataException
      */
-    IIndexAccessor createAccessor(IModificationOperationCallback modificationCallback,
-            ISearchOperationCallback searchCallback) throws HyracksDataException;
+    IIndexAccessor createAccessor(IIndexAccessParameters iap) throws HyracksDataException;
 
     /**
      * TODO: Get rid of this method
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexAccessParameters.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexAccessParameters.java
new file mode 100644
index 0000000..a3745d0
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexAccessParameters.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.common;
+
+import java.util.Map;
+
+/**
+ * Contains necessary parameters that are required to initialize an index accessor.
+ */
+public interface IIndexAccessParameters {
+
+    /**
+     * Gets the modification call back.
+     */
+    IModificationOperationCallback getModificationCallback();
+
+    /**
+     * Gets the search operation call back.
+     */
+    ISearchOperationCallback getSearchOperationCallback();
+
+    /**
+     * Gets additional parameters.
+     */
+    Map<String, Object> getParameters();
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexCursor.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexCursor.java
index cd16210..b561e25 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IIndexCursor.java
@@ -22,6 +22,33 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
+/**
+ * Represents an index cursor. The expected use
+ * cursor = new cursor();
+ * while (more predicates){
+ * -cursor.open(predicate);
+ * -while (cursor.hasNext()){
+ * --cursor.next()
+ * -}
+ * -cursor.close();
+ * }
+ * cursor.destroy();
+ * Each created cursor must have destroy called
+ * Each successfully opened cursor must have close called
+ *
+ * A cursor is a state machine that works as follows:
+ * The states are:
+ * <ul>
+ * <li>CLOSED</li>
+ * <li>OPENED</li>
+ * <li>DESTROYED</li>
+ * </ul>
+ * When a cursor object is created, it is in the CLOSED state.
+ * CLOSED: The only legal calls are open() --> OPENED, or destroy() --> DESTROYED
+ * OPENED: The only legal calls are hasNext(), next(), or close() --> CLOSED.
+ * DESTROYED: All calls are illegal.
+ * Cursors must enforce the cursor state machine
+ */
 public interface IIndexCursor {
     /**
      * Opens the cursor
@@ -49,33 +76,22 @@
     void next() throws HyracksDataException;
 
     /**
-     * Closes the cursor
+     * Destroys the cursor allowing for release of resources.
+     * The cursor can't be used anymore after this call.
+     *
+     * @throws HyracksDataException
+     */
+    void destroy() throws HyracksDataException;
+
+    /**
+     * Close the cursor when done with it after a successful open
      *
      * @throws HyracksDataException
      */
     void close() throws HyracksDataException;
 
     /**
-     * Reset the cursor to be reused
-     *
-     * @throws HyracksDataException
-     * @throws IndexException
-     */
-    void reset() throws HyracksDataException;
-
-    /**
      * @return the tuple pointed to by the cursor
      */
     ITupleReference getTuple();
-
-    /**
-     * @return the min tuple of the current index's filter
-     */
-    ITupleReference getFilterMinTuple();
-
-    /**
-     *
-     * @return the max tuple of the current index's filter
-     */
-    ITupleReference getFilterMaxTuple();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IResource.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IResource.java
index bb27023..7b9166d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/IResource.java
@@ -28,4 +28,11 @@
     IIndex createInstance(INCServiceContext ncServiceCtx) throws HyracksDataException;
 
     String getPath();
+
+    /**
+     * Sets the path of {@link IResource}.
+     *
+     * @param path
+     */
+    void setPath(String path);
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/AsyncFIFOPageQueueManager.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/AsyncFIFOPageQueueManager.java
index b693c91..dbead1e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/AsyncFIFOPageQueueManager.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/AsyncFIFOPageQueueManager.java
@@ -34,7 +34,7 @@
     protected BufferCache bufferCache;
     volatile protected PageQueue pageQueue;
 
-    public AsyncFIFOPageQueueManager(BufferCache bufferCache){
+    public AsyncFIFOPageQueueManager(BufferCache bufferCache) {
         this.bufferCache = bufferCache;
     }
 
@@ -43,7 +43,8 @@
         public final IFIFOPageWriter writer;
 
         protected PageQueue(IBufferCache bufferCache, IFIFOPageWriter writer) {
-            if(DEBUG) System.out.println("[FIFO] New Queue");
+            if (DEBUG)
+                System.out.println("[FIFO] New Queue");
             this.bufferCache = bufferCache;
             this.writer = writer;
         }
@@ -59,35 +60,33 @@
         @Override
         public void put(ICachedPage page) throws HyracksDataException {
             try {
-                if(!poisoned.get()) {
+                if (!poisoned.get()) {
                     queue.put(page);
-                }
-                else{
+                } else {
                     throw new HyracksDataException("Queue is closing");
                 }
             } catch (InterruptedException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
+                Thread.currentThread().interrupt();
+                throw HyracksDataException.create(e);
             }
         }
     }
 
-
     public PageQueue createQueue(IFIFOPageWriter writer) {
         if (pageQueue == null) {
-            synchronized(this){
+            synchronized (this) {
                 if (pageQueue == null) {
                     writerThread = new Thread(this);
                     writerThread.setName("FIFO Writer Thread");
                     writerThread.start();
-                    pageQueue = new PageQueue(bufferCache,writer);
+                    pageQueue = new PageQueue(bufferCache, writer);
                 }
             }
         }
         return pageQueue;
     }
 
-    public void destroyQueue(){
+    public void destroyQueue() {
         poisoned.set(true);
         if (writerThread == null) {
             synchronized (this) {
@@ -99,21 +98,21 @@
 
         //Dummy cached page to act as poison pill
         CachedPage poisonPill = new CachedPage();
-        poisonPill.setQueueInfo(new QueueInfo(true,true));
+        poisonPill.setQueueInfo(new QueueInfo(true, true));
 
-        try{
+        try {
             synchronized (poisonPill) {
                 queue.put(poisonPill);
-                while(queue.contains(poisonPill)){
+                while (queue.contains(poisonPill)) {
                     poisonPill.wait();
                 }
             }
-        } catch (InterruptedException e){
+        } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
         }
     }
 
-    public void finishQueue() {
+    public void finishQueue() throws HyracksDataException {
         if (writerThread == null) {
             synchronized (this) {
                 if (writerThread == null) {
@@ -121,47 +120,48 @@
                 }
             }
         }
-        if(DEBUG) System.out.println("[FIFO] Finishing Queue");
         try {
             //Dummy cached page to act as low water mark
             CachedPage lowWater = new CachedPage();
-            lowWater.setQueueInfo(new QueueInfo(true,false));
-            synchronized(lowWater){
+            lowWater.setQueueInfo(new QueueInfo(true, false));
+            synchronized (lowWater) {
                 queue.put(lowWater);
-                while(queue.contains(lowWater)){
-                        lowWater.wait();
+                while (queue.contains(lowWater)) {
+                    lowWater.wait();
                 }
             }
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
-            // TODO what do we do here?
-            e.printStackTrace();
+            throw HyracksDataException.create(e);
         }
-        if(DEBUG) System.out.println("[FIFO] Queue finished");
     }
 
     @Override
     public void run() {
-        if (DEBUG) System.out.println("[FIFO] Writer started");
+        if (DEBUG)
+            System.out.println("[FIFO] Writer started");
         boolean die = false;
         while (!die) {
             ICachedPage entry;
             try {
                 entry = queue.take();
-            } catch(InterruptedException e) {
+            } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
                 break;
             }
-            if (entry.getQueueInfo() != null && entry.getQueueInfo().hasWaiters()){
-                synchronized(entry) {
-                    if(entry.getQueueInfo().isPoison()) { die = true; }
+            if (entry.getQueueInfo() != null && entry.getQueueInfo().hasWaiters()) {
+                synchronized (entry) {
+                    if (entry.getQueueInfo().isPoison()) {
+                        die = true;
+                    }
                     entry.notifyAll();
                     continue;
                 }
             }
 
-            if (DEBUG) System.out.println("[FIFO] Write " + BufferedFileHandle.getFileId(((CachedPage)entry).dpid)+","
-                    + BufferedFileHandle.getPageId(((CachedPage)entry).dpid));
+            if (DEBUG)
+                System.out.println("[FIFO] Write " + BufferedFileHandle.getFileId(((CachedPage) entry).dpid) + ","
+                        + BufferedFileHandle.getPageId(((CachedPage) entry).dpid));
 
             try {
                 pageQueue.getWriter().write(entry, bufferCache);
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
index d0f4965..1443bbc 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/BufferCache.java
@@ -36,8 +36,6 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -49,10 +47,13 @@
 import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.storage.common.file.BufferedFileHandle;
 import org.apache.hyracks.storage.common.file.IFileMapManager;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class BufferCache implements IBufferCacheInternal, ILifeCycleComponent {
 
-    private static final Logger LOGGER = Logger.getLogger(BufferCache.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int MAP_FACTOR = 3;
 
     private static final int MIN_CLEANED_COUNT_DIFF = 3;
@@ -76,7 +77,7 @@
     private final Queue<BufferCacheHeaderHelper> headerPageCache = new ConcurrentLinkedQueue<>();
 
     //DEBUG
-    private Level fileOpsLevel = Level.FINE;
+    private Level fileOpsLevel = Level.DEBUG;
     private ArrayList<CachedPage> confiscatedPages;
     private Lock confiscateLock;
     private HashMap<CachedPage, StackTraceElement[]> confiscatedPagesOwner;
@@ -185,8 +186,17 @@
             // disk.
             synchronized (cPage) {
                 if (!cPage.valid) {
-                    tryRead(cPage);
-                    cPage.valid = true;
+                    try {
+                        tryRead(cPage);
+                        cPage.valid = true;
+                    } catch (Exception e) {
+                        LOGGER.log(Level.WARN, "Failure while trying to read a page from disk", e);
+                        throw e;
+                    } finally {
+                        if (!cPage.valid) {
+                            unpin(cPage);
+                        }
+                    }
                 }
             }
         } else {
@@ -517,7 +527,7 @@
                      */
                     try {
                         Thread.sleep(PERIOD_BETWEEN_READ_ATTEMPTS);
-                        LOGGER.log(Level.WARNING, String.format("Failed to read page. Retrying attempt (%d/%d)", i + 1,
+                        LOGGER.log(Level.WARN, String.format("Failed to read page. Retrying attempt (%d/%d)", i + 1,
                                 MAX_PAGE_READ_ATTEMPTS), readException);
                     } catch (InterruptedException e) {
                         Thread.currentThread().interrupt();
@@ -705,7 +715,7 @@
             try {
                 write(cPage);
             } catch (HyracksDataException e) {
-                LOGGER.log(Level.WARNING, "Unable to write dirty page", e);
+                LOGGER.log(Level.WARN, "Unable to write dirty page", e);
                 cleaned = false;
             }
             if (cleaned) {
@@ -782,8 +792,8 @@
                         ioManager.close(value.getFileHandle());
                     }
                 } catch (HyracksDataException e) {
-                    if (LOGGER.isLoggable(Level.WARNING)) {
-                        LOGGER.log(Level.WARNING, "Error flushing file id: " + key, e);
+                    if (LOGGER.isWarnEnabled()) {
+                        LOGGER.log(Level.WARN, "Error flushing file id: " + key, e);
                     }
                 }
             });
@@ -793,7 +803,7 @@
 
     @Override
     public int createFile(FileReference fileRef) throws HyracksDataException {
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Creating file: " + fileRef + " in cache: " + this);
         }
         IoUtil.create(fileRef);
@@ -814,7 +824,7 @@
 
     @Override
     public int openFile(FileReference fileRef) throws HyracksDataException {
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Opening file: " + fileRef + " in cache: " + this);
         }
         int fileId;
@@ -831,7 +841,7 @@
 
     @Override
     public void openFile(int fileId) throws HyracksDataException {
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Opening file: " + fileId + " in cache: " + this);
         }
         synchronized (fileInfoMap) {
@@ -929,11 +939,11 @@
 
     @Override
     public void closeFile(int fileId) throws HyracksDataException {
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Closing file: " + fileId + " in cache: " + this);
         }
-        if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine(dumpState());
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug(dumpState());
         }
 
         synchronized (fileInfoMap) {
@@ -945,7 +955,7 @@
                 throw new HyracksDataException("Closed fileId: " + fileId + " more times than it was opened.");
             }
         }
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Closed file: " + fileId + " in cache: " + this);
         }
     }
@@ -980,7 +990,7 @@
 
     @Override
     public void deleteFile(int fileId) throws HyracksDataException {
-        if (LOGGER.isLoggable(fileOpsLevel)) {
+        if (LOGGER.isEnabled(fileOpsLevel)) {
             LOGGER.log(fileOpsLevel, "Deleting file: " + fileId + " in cache: " + this);
         }
         synchronized (fileInfoMap) {
@@ -1297,21 +1307,17 @@
                 finishQueue();
                 if (cycleCount > MAX_PIN_ATTEMPT_CYCLES) {
                     cycleCount = 0; // suppress warning below
-                    throw new HyracksDataException(
-                            "Unable to find free page in buffer cache after " + MAX_PIN_ATTEMPT_CYCLES
-                                    + " cycles (buffer cache undersized?)" + (DEBUG
-                                            ? " ; " + (masterPinCount.get() - startingPinCount)
-                                                    + " successful pins since start of cycle"
-                                            : ""));
+                    throw new HyracksDataException("Unable to find free page in buffer cache after "
+                            + MAX_PIN_ATTEMPT_CYCLES + " cycles (buffer cache undersized?)"
+                            + (DEBUG ? " ; " + (masterPinCount.get() - startingPinCount)
+                                    + " successful pins since start of cycle" : ""));
                 }
             }
         } finally {
-            if (cycleCount > PIN_ATTEMPT_CYCLES_WARNING_THRESHOLD && LOGGER.isLoggable(Level.WARNING)) {
-                LOGGER.warning("Took " + cycleCount + " cycles to find free page in buffer cache.  (buffer cache "
-                        + "undersized?)" + (DEBUG
-                                ? " ; " + (masterPinCount.get() - startingPinCount)
-                                        + " successful pins since start of cycle"
-                                : ""));
+            if (cycleCount > PIN_ATTEMPT_CYCLES_WARNING_THRESHOLD && LOGGER.isWarnEnabled()) {
+                LOGGER.warn("Took " + cycleCount + " cycles to find free page in buffer cache.  (buffer cache "
+                        + "undersized?)" + (DEBUG ? " ; " + (masterPinCount.get() - startingPinCount)
+                                + " successful pins since start of cycle" : ""));
             }
         }
     }
@@ -1379,7 +1385,7 @@
     }
 
     @Override
-    public void finishQueue() {
+    public void finishQueue() throws HyracksDataException {
         fifoWriter.finishQueue();
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/ClockPageReplacementStrategy.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/ClockPageReplacementStrategy.java
index 872ac35..87a15d3 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/ClockPageReplacementStrategy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/ClockPageReplacementStrategy.java
@@ -22,13 +22,13 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ClockPageReplacementStrategy implements IPageReplacementStrategy {
-    private static final Logger LOGGER = Logger.getLogger(ClockPageReplacementStrategy.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final int MAX_UNSUCCESSFUL_CYCLE_COUNT = 3;
 
     private IBufferCacheInternal bufferCache;
@@ -130,8 +130,8 @@
             }
             if (looped && clockPtr >= startClockPtr) {
                 cycleCount++;
-                if (LOGGER.isLoggable(Level.FINE)) {
-                    LOGGER.fine("completed " + cycleCount + "/" + MAX_UNSUCCESSFUL_CYCLE_COUNT
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("completed " + cycleCount + "/" + MAX_UNSUCCESSFUL_CYCLE_COUNT
                             + " clock cycle(s) without finding victim");
                 }
                 if (cycleCount >= MAX_UNSUCCESSFUL_CYCLE_COUNT) {
@@ -170,7 +170,7 @@
             return;
         }
         final int newSize = pageSize * multiplier;
-        ByteBuffer oldBuffer = ((CachedPage)cPage).buffer;
+        ByteBuffer oldBuffer = ((CachedPage) cPage).buffer;
         oldBuffer.position(0);
         final int delta = multiplier - origMultiplier;
         if (multiplier < origMultiplier) {
@@ -194,8 +194,7 @@
     }
 
     @Override
-    public void fixupCapacityOnLargeRead(ICachedPageInternal cPage)
-            throws HyracksDataException {
+    public void fixupCapacityOnLargeRead(ICachedPageInternal cPage) throws HyracksDataException {
         ByteBuffer oldBuffer = ((CachedPage) cPage).buffer;
         final int multiplier = cPage.getFrameSizeMultiplier();
         final int newSize = pageSize * multiplier;
@@ -219,8 +218,8 @@
                 }
             } else {
                 // we don't have the budget to resize- proceed anyway, but log
-                if (LOGGER.isLoggable(Level.WARNING)) {
-                    LOGGER.warning("Exceeding buffer cache budget of " + maxAllowedNumPages + " by "
+                if (LOGGER.isWarnEnabled()) {
+                    LOGGER.warn("Exceeding buffer cache budget of " + maxAllowedNumPages + " by "
                             + (numPages.get() + delta - maxAllowedNumPages)
                             + " pages in order to satisfy large page read");
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/DebugBufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/DebugBufferCache.java
index f3de1c1..1cbe404 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/DebugBufferCache.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/DebugBufferCache.java
@@ -199,7 +199,7 @@
     }
 
     @Override
-    public void finishQueue() {
+    public void finishQueue() throws HyracksDataException {
         bufferCache.finishQueue();
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IBufferCache.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IBufferCache.java
index 28801ea..8dccc4a 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IBufferCache.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IBufferCache.java
@@ -235,7 +235,7 @@
     /**
      * Flush the queued pages written through buffer cache FIFO queues
      */
-    void finishQueue();
+    void finishQueue() throws HyracksDataException;
 
     // TODO: remove the replication out of the buffer cache interface
     /**
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IFIFOPageWriter.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IFIFOPageWriter.java
index 7380261..567c01e 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IFIFOPageWriter.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IFIFOPageWriter.java
@@ -17,7 +17,6 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-
 public interface IFIFOPageWriter {
     public void write(ICachedPage page, BufferCache bufferCache) throws HyracksDataException;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IPageReplacementStrategy.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IPageReplacementStrategy.java
index d3bcce5..bbf3b45 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IPageReplacementStrategy.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/IPageReplacementStrategy.java
@@ -39,8 +39,7 @@
 
     public int getNumPages();
 
-    void fixupCapacityOnLargeRead(ICachedPageInternal cPage)
-            throws HyracksDataException;
+    void fixupCapacityOnLargeRead(ICachedPageInternal cPage) throws HyracksDataException;
 
     public int getPageSize();
 
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/QueueInfo.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/QueueInfo.java
index bc69bc8..d86319d 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/QueueInfo.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/QueueInfo.java
@@ -18,24 +18,24 @@
  */
 package org.apache.hyracks.storage.common.buffercache;
 
-public class QueueInfo implements IQueueInfo{
+public class QueueInfo implements IQueueInfo {
 
     private final boolean poison;
     private final boolean waiters;
 
-    public QueueInfo(boolean waiters, boolean poison){
+    public QueueInfo(boolean waiters, boolean poison) {
         this.waiters = waiters;
         this.poison = poison;
     }
 
     @Override
-    public boolean hasWaiters(){
+    public boolean hasWaiters() {
         return waiters;
 
     }
 
     @Override
-    public boolean isPoison(){
+    public boolean isPoison() {
         return poison;
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/VirtualPage.java b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/VirtualPage.java
index 139a3c4..be384e0 100644
--- a/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/VirtualPage.java
+++ b/hyracks-fullstack/hyracks/hyracks-storage-common/src/main/java/org/apache/hyracks/storage/common/buffercache/VirtualPage.java
@@ -19,11 +19,10 @@
 package org.apache.hyracks.storage.common.buffercache;
 
 import java.nio.ByteBuffer;
-import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 public class VirtualPage implements ICachedPage {
-    private final ReadWriteLock latch;
+    private final ReentrantReadWriteLock latch;
     private final int pageSize;
     private ByteBuffer buffer;
     private volatile long dpid;
@@ -131,4 +130,20 @@
         return multiplier > 1;
     }
 
+    public int getReadLatchCount() {
+        return latch.getReadLockCount();
+    }
+
+    public boolean isWriteLatched() {
+        return latch.isWriteLocked();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder str = new StringBuilder();
+        str.append("{\"class\":\"" + getClass().getSimpleName() + "\", \"readers\":" + getReadLatchCount()
+                + ",\"writers\":" + (isWriteLatched()));
+        str.append("}");
+        return str.toString();
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/pom.xml b/hyracks-fullstack/hyracks/hyracks-test-support/pom.xml
index f6f7602..67ebc9b 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/pom.xml
@@ -104,5 +104,13 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractModificationOperationCallbackTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractModificationOperationCallbackTest.java
index a9e82cf..1c81f68 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractModificationOperationCallbackTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractModificationOperationCallbackTest.java
@@ -23,6 +23,7 @@
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.common.IIndexAccessor;
@@ -61,7 +62,8 @@
 
     @Test
     public void modificationCallbackTest() throws Exception {
-        IIndexAccessor accessor = index.createAccessor(cb, NoOpOperationCallback.INSTANCE);
+        IndexAccessParameters actx = new IndexAccessParameters(cb, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor accessor = index.createAccessor(actx);
 
         isFoundNull = true;
         for (int i = 0; i < AccessMethodTestsConfig.BTREE_NUM_TUPLES_TO_INSERT; i++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
index e30fd04..368430c 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/AbstractSearchOperationCallbackTest.java
@@ -32,6 +32,8 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
@@ -92,7 +94,8 @@
 
         public SearchTask() throws HyracksDataException {
             this.cb = new SynchronizingSearchOperationCallback();
-            this.accessor = index.createAccessor(NoOpOperationCallback.INSTANCE, cb);
+            IndexAccessParameters actx = new IndexAccessParameters(NoOpOperationCallback.INSTANCE, cb);
+            this.accessor = index.createAccessor(actx);
             this.cursor = accessor.createSearchCursor(false);
             this.predicate = new RangePredicate();
             this.builder = new ArrayTupleBuilder(NUM_KEY_FIELDS);
@@ -124,7 +127,7 @@
                 // consume tuples [153, 300]
                 consumeIntTupleRange(153, 300, false, -1);
 
-                cursor.close();
+                cursor.destroy();
             } finally {
                 lock.unlock();
             }
@@ -208,7 +211,7 @@
         private final ArrayTupleReference tuple;
 
         public InsertionTask() throws HyracksDataException {
-            this.accessor = index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            this.accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             this.builder = new ArrayTupleBuilder(NUM_KEY_FIELDS);
             this.tuple = new ArrayTupleReference();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
index cd6ea2e..9e863eb 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexBulkLoadTest.java
@@ -39,8 +39,8 @@
 
     @Override
     protected void runTest(ISerializerDeserializer[] fieldSerdes, int numKeys, BTreeLeafFrameType leafType,
-            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey, ITupleReference prefixHighKey)
-            throws Exception {
+            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey,
+            ITupleReference prefixHighKey) throws Exception {
         OrderedIndexTestContext ctx = createTestContext(fieldSerdes, numKeys, leafType, false);
         ctx.getIndex().create();
         ctx.getIndex().activate();
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexDeleteTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexDeleteTest.java
index 7378cf1..b7cf4a0 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexDeleteTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexDeleteTest.java
@@ -54,8 +54,8 @@
             } else if (fieldSerdes[0] instanceof UTF8StringSerializerDeserializer) {
                 orderedIndexTestUtils.insertStringTuples(ctx, numTuplesToInsert, false, getRandom());
             }
-            int numTuplesPerDeleteRound = (int) Math
-                    .ceil((float) ctx.getCheckTuples().size() / (float) numDeleteRounds);
+            int numTuplesPerDeleteRound =
+                    (int) Math.ceil((float) ctx.getCheckTuples().size() / (float) numDeleteRounds);
             for (int j = 0; j < numDeleteRounds; j++) {
                 orderedIndexTestUtils.deleteTuples(ctx, numTuplesPerDeleteRound, getRandom());
                 orderedIndexTestUtils.checkPointSearches(ctx);
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexExamplesTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
index 925cf1e..9ca3b59 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexExamplesTest.java
@@ -22,8 +22,6 @@
 import static org.junit.Assert.fail;
 
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -44,17 +42,19 @@
 import org.apache.hyracks.storage.am.common.TestOperationCallback;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 @SuppressWarnings("rawtypes")
 public abstract class OrderedIndexExamplesTest {
-    protected static final Logger LOGGER = Logger.getLogger(OrderedIndexExamplesTest.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
     protected final Random rnd = new Random(50);
 
     protected abstract ITreeIndex createTreeIndex(ITypeTraits[] typeTraits, IBinaryComparatorFactory[] cmpFactories,
@@ -68,7 +68,7 @@
      */
     @Test
     public void fixedLengthKeyValueExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Fixed-Length Key,Value Example.");
         }
 
@@ -95,19 +95,20 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             int f0 = rnd.nextInt() % numInserts;
             int f1 = 5;
             TupleUtils.createIntegerTuple(tb, tuple, f0, f1);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 1000 == 0) {
                     LOGGER.info("Inserting " + i + " : " + f0 + " " + f1);
                 }
@@ -121,7 +122,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
@@ -155,7 +156,7 @@
      */
     @Test
     public void pageSplitTestExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree page split test.");
         }
 
@@ -183,8 +184,9 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
 
         String key = "111";
         String data = "XXX";
@@ -229,7 +231,7 @@
      */
     @Test
     public void twoFixedLengthKeysOneFixedLengthValueExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Composite Key Test");
         }
 
@@ -259,20 +261,21 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         int numInserts = 10000;
         for (int i = 0; i < 10000; i++) {
             int f0 = rnd.nextInt() % 2000;
             int f1 = rnd.nextInt() % 1000;
             int f2 = 5;
             TupleUtils.createIntegerTuple(tb, tuple, f0, f1, f2);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 1000 == 0) {
                     LOGGER.info("Inserting " + i + " : " + f0 + " " + f1 + " " + f2);
                 }
@@ -286,7 +289,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
@@ -318,7 +321,7 @@
      */
     @Test
     public void varLenKeyValueExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Variable-Length Key,Value Example");
         }
 
@@ -345,13 +348,14 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         // Max string length to be generated.
         int maxLength = 10;
         int numInserts = 10000;
@@ -359,7 +363,7 @@
             String f0 = randomString(Math.abs(rnd.nextInt()) % maxLength + 1, rnd);
             String f1 = randomString(Math.abs(rnd.nextInt()) % maxLength + 1, rnd);
             TupleUtils.createTuple(tb, tuple, fieldSerdes, f0, f1);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 1000 == 0) {
                     LOGGER.info("Inserting[" + i + "] " + f0 + " " + f1);
                 }
@@ -373,7 +377,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
@@ -405,7 +409,7 @@
      */
     @Test
     public void deleteExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Deletion Example");
         }
 
@@ -433,12 +437,13 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         // Max string length to be generated.
         int runs = 3;
         for (int run = 0; run < runs; run++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Deletion example run: " + (run + 1) + "/" + runs);
                 LOGGER.info("Inserting into tree...");
             }
@@ -454,7 +459,7 @@
                 TupleUtils.createTuple(tb, tuple, fieldSerdes, f0, f1);
                 f0s[i] = f0;
                 f1s[i] = f1;
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if (i % 1000 == 0) {
                         LOGGER.info("Inserting " + i);
                     }
@@ -470,13 +475,13 @@
                 insDoneCmp[i] = insDone;
             }
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Deleting from tree...");
             }
             int delDone = 0;
             for (int i = 0; i < ins; i++) {
                 TupleUtils.createTuple(tb, tuple, fieldSerdes, f0s[i], f1s[i]);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if (i % 1000 == 0) {
                         LOGGER.info("Deleting " + i);
                     }
@@ -490,7 +495,7 @@
                     }
                 }
                 if (insDoneCmp[i] != delDone) {
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("INCONSISTENT STATE, ERROR IN DELETION EXAMPLE.");
                         LOGGER.info("INSDONECMP: " + insDoneCmp[i] + " " + delDone);
                     }
@@ -498,7 +503,7 @@
                 }
             }
             if (insDone != delDone) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("ERROR! INSDONE: " + insDone + " DELDONE: " + delDone);
                 }
                 break;
@@ -517,7 +522,7 @@
      */
     @Test
     public void updateExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Update example");
         }
 
@@ -543,11 +548,12 @@
         treeIndex.create();
         treeIndex.activate();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
         int maxLength = 10;
@@ -558,7 +564,7 @@
             String f1 = randomString(Math.abs(rnd.nextInt()) % maxLength + 1, rnd);
             TupleUtils.createTuple(tb, tuple, fieldSerdes, f0, f1);
             keys[i] = f0;
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 1000 == 0) {
                     LOGGER.info("Inserting " + i);
                 }
@@ -576,7 +582,7 @@
 
         int runs = 3;
         for (int run = 0; run < runs; run++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Update test run: " + (run + 1) + "/" + runs);
                 LOGGER.info("Updating BTree");
             }
@@ -584,7 +590,7 @@
                 // Generate a new random value for f1.
                 String f1 = randomString(Math.abs(rnd.nextInt()) % maxLength + 1, rnd);
                 TupleUtils.createTuple(tb, tuple, fieldSerdes, keys[i], f1);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if (i % 1000 == 0) {
                         LOGGER.info("Updating " + i);
                     }
@@ -605,7 +611,7 @@
      */
     @Test
     public void bulkLoadExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Bulk load example");
         }
         // Declare fields.
@@ -635,7 +641,7 @@
 
         // Load sorted records.
         int ins = 100000;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Bulk loading " + ins + " tuples");
         }
         long start = System.currentTimeMillis();
@@ -648,12 +654,13 @@
         }
         bulkLoader.end();
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(ins + " tuples loaded in " + (end - start) + "ms");
         }
 
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
 
         // Build low key.
         ArrayTupleBuilder lowKeyTb = new ArrayTupleBuilder(1);
@@ -680,7 +687,7 @@
      */
     @Test
     public void bulkOrderVerificationExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Bulk load order verification example");
         }
         // Declare fields.
@@ -749,7 +756,7 @@
     }
 
     protected void orderedScan(IIndexAccessor indexAccessor, ISerializerDeserializer[] fieldSerdes) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Ordered Scan:");
         }
         IIndexCursor scanCursor = indexAccessor.createSearchCursor(false);
@@ -760,18 +767,18 @@
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
                 String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(rec);
                 }
             }
         } finally {
-            scanCursor.close();
+            scanCursor.destroy();
         }
     }
 
     protected void diskOrderScan(IIndexAccessor indexAccessor, ISerializerDeserializer[] fieldSerdes) throws Exception {
         try {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Disk-Order Scan:");
             }
             ITreeIndexAccessor treeIndexAccessor = (ITreeIndexAccessor) indexAccessor;
@@ -783,23 +790,23 @@
                     diskOrderCursor.next();
                     ITupleReference frameTuple = diskOrderCursor.getTuple();
                     String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info(rec);
                     }
                 }
             } finally {
-                diskOrderCursor.close();
+                diskOrderCursor.destroy();
             }
         } catch (UnsupportedOperationException e) {
             // Ignore exception because some indexes, e.g. the LSMBTree, don't
             // support disk-order scan.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         } catch (ClassCastException e) {
             // Ignore exception because IIndexAccessor sometimes isn't
             // an ITreeIndexAccessor, e.g., for the LSMBTree.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         }
@@ -808,12 +815,12 @@
     protected void rangeSearch(IBinaryComparatorFactory[] cmpFactories, IIndexAccessor indexAccessor,
             ISerializerDeserializer[] fieldSerdes, ITupleReference lowKey, ITupleReference highKey,
             ITupleReference minFilterTuple, ITupleReference maxFilterTuple) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             String lowKeyString = TupleUtils.printTuple(lowKey, fieldSerdes);
             String highKeyString = TupleUtils.printTuple(highKey, fieldSerdes);
             LOGGER.info("Range-Search in: [ " + lowKeyString + ", " + highKeyString + "]");
         }
-        ITreeIndexCursor rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+        IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
         MultiComparator lowKeySearchCmp = BTreeUtils.getSearchMultiComparator(cmpFactories, lowKey);
         MultiComparator highKeySearchCmp = BTreeUtils.getSearchMultiComparator(cmpFactories, highKey);
         RangePredicate rangePred;
@@ -829,12 +836,12 @@
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
                 String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(rec);
                 }
             }
         } finally {
-            rangeCursor.close();
+            rangeCursor.destroy();
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexMultiThreadTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexMultiThreadTest.java
index d73439d..90c64cb 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexMultiThreadTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexMultiThreadTest.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.storage.am.btree;
 
 import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -35,12 +33,14 @@
 import org.apache.hyracks.storage.am.common.TestWorkloadConf;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 @SuppressWarnings("rawtypes")
 public abstract class OrderedIndexMultiThreadTest {
 
-    protected final Logger LOGGER = Logger.getLogger(OrderedIndexMultiThreadTest.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     // Machine-specific number of threads to use for testing.
     protected final int REGULAR_NUM_THREADS = Runtime.getRuntime().availableProcessors();
@@ -67,7 +67,7 @@
             String dataMsg) throws InterruptedException, HyracksDataException {
         setUp();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             String indexTypeName = getIndexTypeName();
             LOGGER.info(indexTypeName + " MultiThread Test:\nData: " + dataMsg + "; Threads: " + numThreads
                     + "; Workload: " + conf.toString() + ".");
@@ -94,7 +94,7 @@
         index.validate();
         driver.deinit();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree MultiThread Test Time: " + times[0] + "ms");
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexSortedInsertTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexSortedInsertTest.java
index 9a08401..8aa3f14 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexSortedInsertTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexSortedInsertTest.java
@@ -45,8 +45,8 @@
 
     @Override
     protected void runTest(ISerializerDeserializer[] fieldSerdes, int numKeys, BTreeLeafFrameType leafType,
-            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey, ITupleReference prefixHighKey)
-            throws Exception {
+            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey,
+            ITupleReference prefixHighKey) throws Exception {
         OrderedIndexTestContext ctx = createTestContext(fieldSerdes, numKeys, leafType, false);
         ctx.getIndex().create();
         ctx.getIndex().activate();
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestDriver.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestDriver.java
index 84a5df6..c43d41f 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestDriver.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestDriver.java
@@ -20,9 +20,9 @@
 package org.apache.hyracks.storage.am.btree;
 
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -35,7 +35,7 @@
 
 @SuppressWarnings("rawtypes")
 public abstract class OrderedIndexTestDriver {
-    protected final Logger LOGGER = Logger.getLogger(OrderedIndexTestDriver.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected static final int numTuplesToInsert = AccessMethodTestsConfig.BTREE_NUM_TUPLES_TO_INSERT;
 
@@ -58,12 +58,12 @@
 
     @Test
     public void oneIntKeyAndValue() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With One Int Key And Value.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] fieldSerdes =
+                { IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
         // Range search in [-1000, 1000]
         ITupleReference lowKey = TupleUtils.createIntegerTuple(-1000);
         ITupleReference highKey = TupleUtils.createIntegerTuple(1000);
@@ -75,12 +75,12 @@
 
     @Test
     public void twoIntKeys() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With Two Int Keys.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] fieldSerdes =
+                { IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
 
         // Range search in [50 0, 50 500]
         ITupleReference lowKey = TupleUtils.createIntegerTuple(50, 0);
@@ -97,13 +97,13 @@
 
     @Test
     public void twoIntKeysAndValues() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With Two Int Keys And Values.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] fieldSerdes =
+                { IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
+                        IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
 
         // Range search in [50 100, 100 100]
         ITupleReference lowKey = TupleUtils.createIntegerTuple(-100, -100);
@@ -120,12 +120,12 @@
 
     @Test
     public void oneStringKeyAndValue() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With One String Key And Value.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() };
+        ISerializerDeserializer[] fieldSerdes =
+                { new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() };
 
         // Range search in ["cbf", cc7"]
         ITupleReference lowKey = TupleUtils.createTuple(fieldSerdes, "cbf");
@@ -138,12 +138,12 @@
 
     @Test
     public void twoStringKeys() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With Two String Keys.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() };
+        ISerializerDeserializer[] fieldSerdes =
+                { new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() };
 
         // Range search in ["cbf", "ddd", cc7", "eee"]
         ITupleReference lowKey = TupleUtils.createTuple(fieldSerdes, "cbf", "ddd");
@@ -160,13 +160,13 @@
 
     @Test
     public void twoStringKeysAndValues() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("BTree " + getTestOpName() + " Test With Two String Keys And Values.");
         }
 
-        ISerializerDeserializer[] fieldSerdes = { new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() };
+        ISerializerDeserializer[] fieldSerdes =
+                { new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
+                        new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() };
 
         // Range search in ["cbf", "ddd", cc7", "eee"]
         ITupleReference lowKey = TupleUtils.createTuple(fieldSerdes, "cbf", "ddd");
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestUtils.java
index 1c408fc..bf3c8e5 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexTestUtils.java
@@ -28,12 +28,9 @@
 import java.util.Random;
 import java.util.SortedSet;
 import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.MutablePair;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -48,20 +45,21 @@
 import org.apache.hyracks.storage.am.common.CheckTuple;
 import org.apache.hyracks.storage.am.common.IIndexTestContext;
 import org.apache.hyracks.storage.am.common.TreeIndexTestUtils;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @SuppressWarnings("rawtypes")
 public class OrderedIndexTestUtils extends TreeIndexTestUtils {
-    private static final Logger LOGGER = Logger.getLogger(OrderedIndexTestUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static void compareActualAndExpected(ITupleReference actual, CheckTuple expected,
             ISerializerDeserializer[] fieldSerdes) throws HyracksDataException {
         for (int i = 0; i < fieldSerdes.length; i++) {
-            ByteArrayInputStream inStream = new ByteArrayInputStream(actual.getFieldData(i), actual.getFieldStart(i),
-                    actual.getFieldLength(i));
+            ByteArrayInputStream inStream =
+                    new ByteArrayInputStream(actual.getFieldData(i), actual.getFieldStart(i), actual.getFieldLength(i));
             DataInput dataIn = new DataInputStream(inStream);
             Object actualObj = fieldSerdes[i].deserialize(dataIn);
             if (!actualObj.equals(expected.getField(i))) {
@@ -95,26 +93,26 @@
     @SuppressWarnings("unchecked")
     public void checkRangeSearch(IIndexTestContext ctx, ITupleReference lowKey, ITupleReference highKey,
             boolean lowKeyInclusive, boolean highKeyInclusive) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing Range Search.");
         }
         MultiComparator lowKeyCmp = BTreeUtils.getSearchMultiComparator(ctx.getComparatorFactories(), lowKey);
         MultiComparator highKeyCmp = BTreeUtils.getSearchMultiComparator(ctx.getComparatorFactories(), highKey);
         IIndexCursor searchCursor = ctx.getIndexAccessor().createSearchCursor(false);
-        RangePredicate rangePred = new RangePredicate(lowKey, highKey, lowKeyInclusive, highKeyInclusive, lowKeyCmp,
-                highKeyCmp);
+        RangePredicate rangePred =
+                new RangePredicate(lowKey, highKey, lowKeyInclusive, highKeyInclusive, lowKeyCmp, highKeyCmp);
         ctx.getIndexAccessor().search(searchCursor, rangePred);
         // Get the subset of elements from the expected set within given key
         // range.
         CheckTuple lowKeyCheck = createCheckTupleFromTuple(lowKey, ctx.getFieldSerdes(), lowKeyCmp.getKeyFieldCount());
-        CheckTuple highKeyCheck = createCheckTupleFromTuple(highKey, ctx.getFieldSerdes(),
-                highKeyCmp.getKeyFieldCount());
+        CheckTuple highKeyCheck =
+                createCheckTupleFromTuple(highKey, ctx.getFieldSerdes(), highKeyCmp.getKeyFieldCount());
         SortedSet<CheckTuple> expectedSubset = null;
         if (lowKeyCmp.getKeyFieldCount() < ctx.getKeyFieldCount()
                 || highKeyCmp.getKeyFieldCount() < ctx.getKeyFieldCount()) {
             // Searching on a key prefix (low key or high key or both).
-            expectedSubset = getPrefixExpectedSubset((TreeSet<CheckTuple>) ctx.getCheckTuples(), lowKeyCheck,
-                    highKeyCheck);
+            expectedSubset =
+                    getPrefixExpectedSubset((TreeSet<CheckTuple>) ctx.getCheckTuples(), lowKeyCheck, highKeyCheck);
         } else {
             // Searching on all key fields.
             expectedSubset = ((TreeSet<CheckTuple>) ctx.getCheckTuples()).subSet(lowKeyCheck, lowKeyInclusive,
@@ -138,12 +136,12 @@
                         + "\nActual  : " + actualCount);
             }
         } finally {
-            searchCursor.close();
+            searchCursor.destroy();
         }
     }
 
     public void checkPointSearches(IIndexTestContext ictx) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing Point Searches On All Expected Keys.");
         }
         OrderedIndexTestContext ctx = (OrderedIndexTestContext) ictx;
@@ -181,7 +179,7 @@
                     fail("Point search returned more than one answer.");
                 }
             } finally {
-                searchCursor.close();
+                searchCursor.destroy();
             }
         }
     }
@@ -248,13 +246,13 @@
             throws HyracksDataException {
         int fieldCount = ctx.getFieldCount();
         int numTuples = checkTuples.size();
-        ArrayTupleBuilder tupleBuilder = filtered ? new ArrayTupleBuilder(fieldCount + 1)
-                : new ArrayTupleBuilder(fieldCount);
+        ArrayTupleBuilder tupleBuilder =
+                filtered ? new ArrayTupleBuilder(fieldCount + 1) : new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
 
         int c = 1;
         for (CheckTuple checkTuple : checkTuples) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (c % (numTuples / 10) == 0) {
                     LOGGER.info("Inserting Tuple " + c + "/" + numTuples);
                 }
@@ -278,7 +276,7 @@
         String[] fieldValues = new String[fieldCount];
         MutablePair<ITupleReference, ITupleReference> minMax = null;
         for (int i = 0; i < numTuples; i++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -300,7 +298,7 @@
                 // because we ignore duplicate keys.
                 ctx.insertCheckTuple(createStringCheckTuple(fieldValues, ctx.getKeyFieldCount()), ctx.getCheckTuples());
                 if (filtered) {
-                    addFilterField(ctx,minMax);
+                    addFilterField(ctx, minMax);
                 }
             } catch (HyracksDataException e) {
                 // Ignore duplicate key insertions.
@@ -318,7 +316,7 @@
         int numKeyFields = ctx.getKeyFieldCount();
         String[] fieldValues = new String[fieldCount];
         for (int i = 0; i < numTuples; i++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -387,7 +385,7 @@
             // Set values.
             setIntPayloadFields(fieldValues, numKeyFields, fieldCount);
             TupleUtils.createIntegerTuple(ctx.getTupleBuilder(), ctx.getTuple(), fieldValues);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -417,7 +415,7 @@
             checkTuples[idx++] = checkTuple;
         }
         for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Updating Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -478,8 +476,8 @@
     }
 
     @Override
-    public void checkExpectedResults(ITreeIndexCursor cursor, Collection checkTuples,
-            ISerializerDeserializer[] fieldSerdes, int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception {
+    public void checkExpectedResults(IIndexCursor cursor, Collection checkTuples, ISerializerDeserializer[] fieldSerdes,
+            int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception {
         int actualCount = 0;
         try {
             while (cursor.hasNext()) {
@@ -497,7 +495,7 @@
                         + "\nActual  : " + actualCount);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
 
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexUpsertTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexUpsertTest.java
index 2118f8c..3417066 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexUpsertTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/btree/OrderedIndexUpsertTest.java
@@ -45,8 +45,8 @@
 
     @Override
     protected void runTest(ISerializerDeserializer[] fieldSerdes, int numKeys, BTreeLeafFrameType leafType,
-            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey, ITupleReference prefixHighKey)
-            throws Exception {
+            ITupleReference lowKey, ITupleReference highKey, ITupleReference prefixLowKey,
+            ITupleReference prefixHighKey) throws Exception {
         OrderedIndexTestContext ctx = createTestContext(fieldSerdes, numKeys, leafType, false);
         ctx.getIndex().create();
         ctx.getIndex().activate();
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexLifecycleTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexLifecycleTest.java
index 8fc4275..ddb5717 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexLifecycleTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexLifecycleTest.java
@@ -18,16 +18,13 @@
  */
 package org.apache.hyracks.storage.am.common;
 
-import java.nio.file.NoSuchFileException;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.util.IoUtil;
 import org.apache.hyracks.storage.common.IIndex;
-import org.apache.hyracks.util.RuntimeLogsMonitor;
+import org.apache.hyracks.util.Log4j2Monitor;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.Configurator;
 import org.junit.After;
-import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -49,12 +46,8 @@
 
     @BeforeClass
     public static void startLogsMonitor() {
-        RuntimeLogsMonitor.monitor("org.apache.hyracks");
-    }
-
-    @AfterClass
-    public static void afterClass() {
-        RuntimeLogsMonitor.stop();
+        Configurator.setLevel("org.apache.hyracks", Level.INFO);
+        Log4j2Monitor.start();
     }
 
     @Before
@@ -65,7 +58,7 @@
 
     @Test
     public void validSequenceTest() throws Exception {
-        RuntimeLogsMonitor.reset();
+        Log4j2Monitor.reset();
         // Double create is invalid
         index.create();
         Assert.assertTrue(persistentStateExists());
@@ -104,8 +97,7 @@
         index.destroy();
         Assert.assertFalse(persistentStateExists());
         index.destroy();
-        final LogRecord fileNotFoundWarnLog = new LogRecord(Level.WARNING, IoUtil.FILE_NOT_FOUND_MSG);
-        Assert.assertTrue(RuntimeLogsMonitor.count(fileNotFoundWarnLog) > 0);
+        Assert.assertTrue(Log4j2Monitor.count(IoUtil.FILE_NOT_FOUND_MSG) > 0);
         Assert.assertFalse(persistentStateExists());
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexTestWorker.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexTestWorker.java
index 825aa53..5248a22 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/AbstractIndexTestWorker.java
@@ -26,6 +26,7 @@
 import org.apache.hyracks.storage.am.common.TestOperationSelector.TestOperation;
 import org.apache.hyracks.storage.am.common.datagen.DataGenThread;
 import org.apache.hyracks.storage.am.common.datagen.TupleBatch;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexCursor;
@@ -44,7 +45,9 @@
         this.opSelector = opSelector;
         this.numBatches = numBatches;
         this.rnd = new Random();
-        this.indexAccessor = index.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        this.indexAccessor = index.createAccessor(actx);
     }
 
     @Override
@@ -70,7 +73,7 @@
                 cursor.next();
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/CheckTuple.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/CheckTuple.java
index 8a6996b..31c55b3 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/CheckTuple.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/CheckTuple.java
@@ -19,7 +19,7 @@
 
 package org.apache.hyracks.storage.am.common;
 
-@SuppressWarnings({"rawtypes", "unchecked"})
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class CheckTuple<T extends Comparable<T>> implements Comparable<T> {
     protected final int numKeys;
     protected final Comparable[] fields;
@@ -101,7 +101,7 @@
         StringBuilder strBuilder = new StringBuilder();
         for (int i = 0; i < fields.length; i++) {
             strBuilder.append(fields[i].toString());
-            if (i != fields.length-1) {
+            if (i != fields.length - 1) {
                 strBuilder.append(" ");
             }
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/IndexTestContext.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/IndexTestContext.java
index 3e1c922..2c08ba0 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/IndexTestContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/IndexTestContext.java
@@ -25,6 +25,7 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 
@@ -40,9 +41,11 @@
             throws HyracksDataException {
         this.fieldSerdes = fieldSerdes;
         this.index = index;
-        this.indexAccessor = index.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
-        this.tupleBuilder = filtered ? new ArrayTupleBuilder(fieldSerdes.length + 1)
-                : new ArrayTupleBuilder(fieldSerdes.length);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        this.indexAccessor = index.createAccessor(actx);
+        this.tupleBuilder =
+                filtered ? new ArrayTupleBuilder(fieldSerdes.length + 1) : new ArrayTupleBuilder(fieldSerdes.length);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
index 60d88e5..d796ece 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationCallback.java
@@ -25,7 +25,7 @@
 import org.apache.hyracks.storage.common.IModificationOperationCallback;
 import org.apache.hyracks.storage.common.ISearchOperationCallback;
 
-public enum TestOperationCallback implements ISearchOperationCallback,IModificationOperationCallback {
+public enum TestOperationCallback implements ISearchOperationCallback, IModificationOperationCallback {
     INSTANCE;
 
     private static final int RANDOM_SEED = 50;
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationSelector.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationSelector.java
index f804f89..e4c4332 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationSelector.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TestOperationSelector.java
@@ -21,7 +21,6 @@
 
 import org.apache.hyracks.storage.am.common.datagen.ProbabilityHelper;
 
-
 public class TestOperationSelector {
 
     public static enum TestOperation {
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TreeIndexTestUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TreeIndexTestUtils.java
index 0a7f4db..f0b01a2 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TreeIndexTestUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/TreeIndexTestUtils.java
@@ -28,12 +28,11 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.tuple.MutablePair;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.hyracks.api.dataflow.value.*;
+import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.ErrorCode;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
@@ -43,17 +42,21 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @SuppressWarnings("rawtypes")
 public abstract class TreeIndexTestUtils {
-    private static final Logger LOGGER = Logger.getLogger(TreeIndexTestUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     protected abstract CheckTuple createCheckTuple(int numFields, int numKeyFields);
 
     protected abstract ISearchPredicate createNullSearchPredicate();
 
-    public abstract void checkExpectedResults(ITreeIndexCursor cursor, Collection checkTuples,
+    public abstract void checkExpectedResults(IIndexCursor cursor, Collection checkTuples,
             ISerializerDeserializer[] fieldSerdes, int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception;
 
     protected abstract CheckTuple createIntCheckTuple(int[] fieldValues, int numKeyFields);
@@ -105,8 +108,8 @@
         CheckTuple checkTuple = createCheckTuple(fieldSerdes.length, numKeys);
         int fieldCount = Math.min(fieldSerdes.length, tuple.getFieldCount());
         for (int i = 0; i < fieldCount; i++) {
-            ByteArrayInputStream inStream = new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i),
-                    tuple.getFieldLength(i));
+            ByteArrayInputStream inStream =
+                    new ByteArrayInputStream(tuple.getFieldData(i), tuple.getFieldStart(i), tuple.getFieldLength(i));
             DataInput dataIn = new DataInputStream(inStream);
             Comparable fieldObj = (Comparable) fieldSerdes[i].deserialize(dataIn);
             checkTuple.appendField(fieldObj);
@@ -116,10 +119,10 @@
 
     @SuppressWarnings("unchecked")
     public void checkScan(IIndexTestContext ctx) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing Scan.");
         }
-        ITreeIndexCursor scanCursor = (ITreeIndexCursor) ctx.getIndexAccessor().createSearchCursor(false);
+        IIndexCursor scanCursor = ctx.getIndexAccessor().createSearchCursor(false);
         ISearchPredicate nullPred = createNullSearchPredicate();
         ctx.getIndexAccessor().search(scanCursor, nullPred);
         Iterator<CheckTuple> checkIter = ctx.getCheckTuples().iterator();
@@ -128,7 +131,7 @@
 
     public void checkDiskOrderScan(IIndexTestContext ctx) throws Exception {
         try {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Testing Disk-Order Scan.");
             }
             ITreeIndexAccessor treeIndexAccessor = (ITreeIndexAccessor) ctx.getIndexAccessor();
@@ -139,8 +142,8 @@
                 while (diskOrderCursor.hasNext()) {
                     diskOrderCursor.next();
                     ITupleReference tuple = diskOrderCursor.getTuple();
-                    CheckTuple checkTuple = createCheckTupleFromTuple(tuple, ctx.getFieldSerdes(),
-                            ctx.getKeyFieldCount());
+                    CheckTuple checkTuple =
+                            createCheckTupleFromTuple(tuple, ctx.getFieldSerdes(), ctx.getKeyFieldCount());
                     if (!checkDiskOrderScanResult(tuple, checkTuple, ctx)) {
                         fail("Disk-order scan returned unexpected answer: " + checkTuple.toString());
                     }
@@ -156,21 +159,21 @@
                 }
             } finally {
                 try {
-                    diskOrderCursor.close();
+                    diskOrderCursor.destroy();
                 } catch (Exception ex) {
-                    LOGGER.log(Level.WARNING, "Error during scan cursor close", ex);
+                    LOGGER.log(Level.WARN, "Error during scan cursor close", ex);
                 }
             }
         } catch (UnsupportedOperationException e) {
             // Ignore exception because some indexes, e.g. the LSMTrees, don't
             // support disk-order scan.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         } catch (ClassCastException e) {
             // Ignore exception because IIndexAccessor sometimes isn't
             // an ITreeIndexAccessor, e.g., for the LSMBTree.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         }
@@ -199,7 +202,7 @@
             // Set values.
             setIntPayloadFields(fieldValues, numKeyFields, fieldCount);
             TupleUtils.createIntegerTuple(ctx.getTupleBuilder(), ctx.getTuple(), filtered, fieldValues);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -256,7 +259,7 @@
             // Set values.
             setIntPayloadFields(fieldValues, numKeyFields, fieldCount);
             TupleUtils.createIntegerTuple(ctx.getTupleBuilder(), ctx.getTuple(), fieldValues);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -312,14 +315,14 @@
             throws HyracksDataException {
         int fieldCount = ctx.getFieldCount();
         int numTuples = checkTuples.size();
-        ArrayTupleBuilder tupleBuilder = filtered ? new ArrayTupleBuilder(fieldCount + 1)
-                : new ArrayTupleBuilder(fieldCount);
+        ArrayTupleBuilder tupleBuilder =
+                filtered ? new ArrayTupleBuilder(fieldCount + 1) : new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
         // Perform bulk load.
         IIndexBulkLoader bulkLoader = ctx.getIndex().createBulkLoader(0.7f, false, numTuples, false);
         int c = 1;
         for (CheckTuple checkTuple : checkTuples) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 //if (c % (numTuples / 10) == 0) {
                 LOGGER.info("Bulk Loading Tuple " + c + "/" + numTuples);
                 //}
@@ -347,7 +350,7 @@
         }
 
         for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Deleting Tuple " + (i + 1) + "/" + numTuples);
                 }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/IFieldValueGenerator.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/IFieldValueGenerator.java
index dbd4bfc..986eccc 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/IFieldValueGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/IFieldValueGenerator.java
@@ -21,5 +21,6 @@
 
 public interface IFieldValueGenerator<T> {
     public T next();
+
     public void reset();
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/PersonNameFieldValueGenerator.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/PersonNameFieldValueGenerator.java
index 256eaf5..da7f52c 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/PersonNameFieldValueGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/PersonNameFieldValueGenerator.java
@@ -40,8 +40,7 @@
     private List<String> firstNames = new ArrayList<>();
     private List<String> lastNames = new ArrayList<>();
 
-    public PersonNameFieldValueGenerator(Random rnd, double middleInitialProb)
-            throws IOException {
+    public PersonNameFieldValueGenerator(Random rnd, double middleInitialProb) throws IOException {
         this.rnd = rnd;
         this.middleInitialProb = middleInitialProb;
         initNames();
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleBatch.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleBatch.java
index c34c7bc..84cda9b 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleBatch.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleBatch.java
@@ -31,7 +31,8 @@
     private final TupleGenerator[] tupleGens;
     public final AtomicBoolean inUse = new AtomicBoolean(false);
 
-    public TupleBatch(int size, IFieldValueGenerator[] fieldGens, ISerializerDeserializer[] fieldSerdes, int payloadSize) {
+    public TupleBatch(int size, IFieldValueGenerator[] fieldGens, ISerializerDeserializer[] fieldSerdes,
+            int payloadSize) {
         this.size = size;
         tupleGens = new TupleGenerator[size];
         for (int i = 0; i < size; i++) {
@@ -40,7 +41,7 @@
     }
 
     public void generate() throws IOException {
-        for(TupleGenerator tupleGen : tupleGens) {
+        for (TupleGenerator tupleGen : tupleGens) {
             tupleGen.next();
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleGenerator.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleGenerator.java
index 4f26065..eb76e67 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleGenerator.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/common/datagen/TupleGenerator.java
@@ -27,7 +27,7 @@
 import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 
-@SuppressWarnings({"rawtypes", "unchecked" })
+@SuppressWarnings({ "rawtypes", "unchecked" })
 public class TupleGenerator {
     protected final ISerializerDeserializer[] fieldSerdes;
     protected final IFieldValueGenerator[] fieldGens;
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeDeleteTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeDeleteTest.java
index b53f0dc..2d3289c 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeDeleteTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeDeleteTest.java
@@ -20,6 +20,7 @@
 package org.apache.hyracks.storage.am.rtree;
 
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.dataflow.common.data.marshalling.DoubleSerializerDeserializer;
 import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
@@ -55,19 +56,29 @@
             } else if (fieldSerdes[0] instanceof DoubleSerializerDeserializer) {
                 rTreeTestUtils.insertDoubleTuples(ctx, numTuplesToInsert, getRandom());
             }
-            int numTuplesPerDeleteRound = (int) Math
-                    .ceil((float) ctx.getCheckTuples().size() / (float) numDeleteRounds);
+            int numTuplesPerDeleteRound =
+                    (int) Math.ceil((float) ctx.getCheckTuples().size() / (float) numDeleteRounds);
             for (int j = 0; j < numDeleteRounds; j++) {
                 rTreeTestUtils.deleteTuples(ctx, numTuplesPerDeleteRound, getRandom());
                 rTreeTestUtils.checkScan(ctx);
                 rTreeTestUtils.checkDiskOrderScan(ctx);
                 rTreeTestUtils.checkRangeSearch(ctx, key);
+                afterDeleteRound(ctx);
             }
+            afterInsertRound(ctx);
         }
         ctx.getIndex().deactivate();
         ctx.getIndex().destroy();
     }
 
+    protected void afterInsertRound(AbstractRTreeTestContext ctx) throws HyracksDataException {
+
+    }
+
+    protected void afterDeleteRound(AbstractRTreeTestContext ctx) throws HyracksDataException {
+
+    }
+
     @Override
     protected String getTestOpName() {
         return "Delete";
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeExamplesTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeExamplesTest.java
index 5a11557..a36acf0 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeExamplesTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeExamplesTest.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.storage.am.rtree;
 
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -43,15 +41,18 @@
 import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.TreeIndexDiskOrderScanCursor;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
 import org.apache.hyracks.storage.am.rtree.util.RTreeUtils;
 import org.apache.hyracks.storage.common.IIndexAccessor;
 import org.apache.hyracks.storage.common.IIndexBulkLoader;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 @SuppressWarnings("rawtypes")
@@ -63,7 +64,7 @@
         RTREE
     };
 
-    protected static final Logger LOGGER = Logger.getLogger(AbstractRTreeExamplesTest.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
     protected final Random rnd = new Random(50);
     protected RTreeType rTreeType;
 
@@ -81,7 +82,7 @@
      */
     @Test
     public void twoDimensionsExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Fixed-Length Key,Value Example.");
         }
 
@@ -144,13 +145,12 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             int p1x = rnd.nextInt();
@@ -172,7 +172,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
@@ -198,7 +198,7 @@
      */
     @Test
     public void rTreePageSplitTestExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree page split test.");
         }
 
@@ -260,8 +260,9 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
 
         int p1x = rnd.nextInt();
         int p1y = rnd.nextInt();
@@ -338,7 +339,7 @@
      */
     @Test
     public void rStarTreePageSplitTestExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("R*Tree page split test.");
         }
 
@@ -399,8 +400,9 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
 
         int p1x = rnd.nextInt();
         int p1y = rnd.nextInt();
@@ -480,7 +482,7 @@
      */
     @Test
     public void threeDimensionsExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Fixed-Length Key,Value Example.");
         }
 
@@ -547,13 +549,12 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             double p1x = rnd.nextDouble();
@@ -576,7 +577,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
@@ -602,7 +603,7 @@
      */
     @Test
     public void deleteExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Deletion Example");
         }
 
@@ -658,12 +659,11 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
         int runs = 3;
         for (int run = 0; run < runs; run++) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Deletion example run: " + (run + 1) + "/" + runs);
                 LOGGER.info("Inserting into tree...");
             }
@@ -702,7 +702,7 @@
                 insDoneCmp[i] = insDone;
             }
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Deleting from tree...");
             }
             int delDone = 0;
@@ -717,7 +717,7 @@
                     }
                 }
                 if (insDoneCmp[i] != delDone) {
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("INCONSISTENT STATE, ERROR IN DELETION EXAMPLE.");
                         LOGGER.info("INSDONECMP: " + insDoneCmp[i] + " " + delDone);
                     }
@@ -725,7 +725,7 @@
                 }
             }
             if (insDone != delDone) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info("ERROR! INSDONE: " + insDone + " DELDONE: " + delDone);
                 }
                 break;
@@ -740,7 +740,7 @@
      */
     @Test
     public void bulkLoadExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Bulk load example");
         }
         // Declare fields.
@@ -801,7 +801,7 @@
 
         // Load records.
         int numInserts = 10000;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Bulk loading " + numInserts + " tuples");
         }
         long start = System.currentTimeMillis();
@@ -824,12 +824,11 @@
 
         bulkLoader.end();
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " tuples loaded in " + (end - start) + "ms");
         }
 
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
         // Build key.
         ArrayTupleBuilder keyTb = new ArrayTupleBuilder(rtreeKeyFieldCount);
@@ -843,10 +842,10 @@
     }
 
     protected void scan(IIndexAccessor indexAccessor, ISerializerDeserializer[] fieldSerdes) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Scan:");
         }
-        ITreeIndexCursor scanCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+        IIndexCursor scanCursor = indexAccessor.createSearchCursor(false);
         SearchPredicate nullPred = new SearchPredicate(null, null);
         indexAccessor.search(scanCursor, nullPred);
         try {
@@ -854,18 +853,18 @@
                 scanCursor.next();
                 ITupleReference frameTuple = scanCursor.getTuple();
                 String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(rec);
                 }
             }
         } finally {
-            scanCursor.close();
+            scanCursor.destroy();
         }
     }
 
     protected void diskOrderScan(IIndexAccessor indexAccessor, ISerializerDeserializer[] fieldSerdes) throws Exception {
         try {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Disk-Order Scan:");
             }
             ITreeIndexAccessor treeIndexAccessor = (ITreeIndexAccessor) indexAccessor;
@@ -877,23 +876,23 @@
                     diskOrderCursor.next();
                     ITupleReference frameTuple = diskOrderCursor.getTuple();
                     String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info(rec);
                     }
                 }
             } finally {
-                diskOrderCursor.close();
+                diskOrderCursor.destroy();
             }
         } catch (UnsupportedOperationException e) {
             // Ignore exception because some indexes, e.g. the LSMRTree, don't
             // support disk-order scan.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         } catch (ClassCastException e) {
             // Ignore exception because IIndexAccessor sometimes isn't
             // an ITreeIndexAccessor, e.g., for the LSMRTree.
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring disk-order scan since it's not supported.");
             }
         }
@@ -902,11 +901,11 @@
     protected void rangeSearch(IBinaryComparatorFactory[] cmpFactories, IIndexAccessor indexAccessor,
             ISerializerDeserializer[] fieldSerdes, ITupleReference key, ITupleReference minFilterTuple,
             ITupleReference maxFilterTuple) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             String kString = TupleUtils.printTuple(key, fieldSerdes);
             LOGGER.info("Range-Search using key: " + kString);
         }
-        ITreeIndexCursor rangeCursor = (ITreeIndexCursor) indexAccessor.createSearchCursor(false);
+        IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
         MultiComparator cmp = RTreeUtils.getSearchMultiComparator(cmpFactories, key);
 
         SearchPredicate rangePred;
@@ -922,12 +921,12 @@
                 rangeCursor.next();
                 ITupleReference frameTuple = rangeCursor.getTuple();
                 String rec = TupleUtils.printTuple(frameTuple, fieldSerdes);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(rec);
                 }
             }
         } finally {
-            rangeCursor.close();
+            rangeCursor.destroy();
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeMultiThreadTest.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeMultiThreadTest.java
index 53245ac..cf0e1e4 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeMultiThreadTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeMultiThreadTest.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.storage.am.rtree;
 
 import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -41,6 +39,8 @@
 import org.apache.hyracks.storage.am.rtree.AbstractRTreeExamplesTest.RTreeType;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.am.rtree.util.RTreeUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 @SuppressWarnings("rawtypes")
@@ -54,7 +54,7 @@
         this.rTreeType = rTreeType;
     }
 
-    protected final Logger LOGGER = Logger.getLogger(AbstractRTreeMultiThreadTest.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     // Machine-specific number of threads to use for testing.
     protected final int REGULAR_NUM_THREADS = Runtime.getRuntime().availableProcessors();
@@ -84,7 +84,7 @@
             int numThreads, TestWorkloadConf conf, String dataMsg) throws HyracksDataException, InterruptedException {
         setUp();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             String indexTypeName = getIndexTypeName();
             LOGGER.info(indexTypeName + " MultiThread Test:\nData: " + dataMsg + "; Threads: " + numThreads
                     + "; Workload: " + conf.toString() + ".");
@@ -120,7 +120,7 @@
         long[] times = driver.run(numThreads, 1, NUM_OPERATIONS, batchSize);
         driver.deinit();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree MultiThread Test Time: " + times[0] + "ms");
         }
 
@@ -193,7 +193,7 @@
     @Test
     public void rstartreeTwoDimensionsInt() throws InterruptedException, HyracksDataException {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree Multithread Test With Two Dimensions With Integer Keys.");
             }
             return;
@@ -220,7 +220,7 @@
     @Test
     public void rstartreeTwoDimensionsDouble() throws Exception {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree Multithread Test With Two Dimensions With Double Keys.");
             }
             return;
@@ -248,7 +248,7 @@
     @Test
     public void rstartreeFourDimensionsDouble() throws InterruptedException, HyracksDataException {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree Multithread Test With Four Dimensions With Double Keys.");
             }
             return;
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeTestDriver.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeTestDriver.java
index 17e4c09..9064225 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeTestDriver.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/AbstractRTreeTestDriver.java
@@ -20,10 +20,6 @@
 package org.apache.hyracks.storage.am.rtree;
 
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.junit.Test;
 
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.data.std.primitive.DoublePointable;
@@ -36,6 +32,9 @@
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.am.rtree.util.RTreeUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.Test;
 
 @SuppressWarnings("rawtypes")
 public abstract class AbstractRTreeTestDriver {
@@ -45,7 +44,7 @@
         this.testRstarPolicy = testRstarPolicy;
     }
 
-    protected final Logger LOGGER = Logger.getLogger(AbstractRTreeTestDriver.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected static final int numTuplesToInsert = AccessMethodTestsConfig.RTREE_NUM_TUPLES_TO_INSERT;
 
@@ -63,7 +62,7 @@
 
     @Test
     public void rtreeTwoDimensionsInt() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Two Dimensions With Integer Keys.");
         }
 
@@ -72,8 +71,8 @@
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
 
         int numKeys = 4;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, IntegerPointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, IntegerPointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000, -1000
         // and the top right coordinates are 1000, 1000
         ITupleReference key = TupleUtils.createIntegerTuple(-1000, -1000, 1000, 1000);
@@ -84,7 +83,7 @@
 
     @Test
     public void rtreeTwoDimensionsDouble() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Two Dimensions With Double Keys.");
         }
 
@@ -93,8 +92,8 @@
                 DoubleSerializerDeserializer.INSTANCE, DoubleSerializerDeserializer.INSTANCE };
 
         int numKeys = 4;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000.0,
         // -1000.0 and the top right coordinates are 1000.0, 1000.0
         ITupleReference key = TupleUtils.createDoubleTuple(-1000.0, -1000.0, 1000.0, 1000.0);
@@ -105,7 +104,7 @@
 
     @Test
     public void rtreeFourDimensionsDouble() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Four Dimensions With Double Keys.");
         }
 
@@ -116,13 +115,13 @@
                 DoubleSerializerDeserializer.INSTANCE, DoubleSerializerDeserializer.INSTANCE };
 
         int numKeys = 8;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000.0,
         // -1000.0, -1000.0, -1000.0 and the top right coordinates are 1000.0,
         // 1000.0, 1000.0, 1000.0
-        ITupleReference key = TupleUtils.createDoubleTuple(-1000.0, -1000.0, -1000.0, -1000.0, 1000.0, 1000.0, 1000.0,
-                1000.0);
+        ITupleReference key =
+                TupleUtils.createDoubleTuple(-1000.0, -1000.0, -1000.0, -1000.0, 1000.0, 1000.0, 1000.0, 1000.0);
 
         runTest(fieldSerdes, valueProviderFactories, numKeys, key, RTreePolicyType.RTREE);
     }
@@ -130,12 +129,12 @@
     @Test
     public void rstartreeTwoDimensionsInt() throws Exception {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree " + getTestOpName() + " Test With Two Dimensions With Integer Keys.");
             }
             return;
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Two Dimensions With Integer Keys.");
         }
 
@@ -144,8 +143,8 @@
                 IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
 
         int numKeys = 4;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, IntegerPointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, IntegerPointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000, -1000
         // and the top right coordinates are 1000, 1000
         ITupleReference key = TupleUtils.createIntegerTuple(-1000, -1000, 1000, 1000);
@@ -157,12 +156,12 @@
     @Test
     public void rstartreeTwoDimensionsDouble() throws Exception {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree " + getTestOpName() + " Test With Two Dimensions With Double Keys.");
             }
             return;
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Two Dimensions With Double Keys.");
         }
 
@@ -171,8 +170,8 @@
                 DoubleSerializerDeserializer.INSTANCE, DoubleSerializerDeserializer.INSTANCE };
 
         int numKeys = 4;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000.0,
         // -1000.0 and the top right coordinates are 1000.0, 1000.0
         ITupleReference key = TupleUtils.createDoubleTuple(-1000.0, -1000.0, 1000.0, 1000.0);
@@ -184,12 +183,12 @@
     @Test
     public void rstartreeFourDimensionsDouble() throws Exception {
         if (!testRstarPolicy) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Ignoring RTree " + getTestOpName() + " Test With Four Dimensions With Double Keys.");
             }
             return;
         }
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("RTree " + getTestOpName() + " Test With Four Dimensions With Double Keys.");
         }
 
@@ -200,13 +199,13 @@
                 DoubleSerializerDeserializer.INSTANCE, DoubleSerializerDeserializer.INSTANCE };
 
         int numKeys = 8;
-        IPrimitiveValueProviderFactory[] valueProviderFactories = RTreeUtils
-                .createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
+        IPrimitiveValueProviderFactory[] valueProviderFactories =
+                RTreeUtils.createPrimitiveValueProviderFactories(numKeys, DoublePointable.FACTORY);
         // Range search, the rectangle bottom left coordinates are -1000.0,
         // -1000.0, -1000.0, -1000.0 and the top right coordinates are 1000.0,
         // 1000.0, 1000.0, 1000.0
-        ITupleReference key = TupleUtils.createDoubleTuple(-1000.0, -1000.0, -1000.0, -1000.0, 1000.0, 1000.0, 1000.0,
-                1000.0);
+        ITupleReference key =
+                TupleUtils.createDoubleTuple(-1000.0, -1000.0, -1000.0, -1000.0, 1000.0, 1000.0, 1000.0, 1000.0);
 
         runTest(fieldSerdes, valueProviderFactories, numKeys, key, RTreePolicyType.RSTARTREE);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java
index 5a890a4..f48da3a1 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/storage/am/rtree/RTreeTestUtils.java
@@ -24,8 +24,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
 import org.apache.hyracks.api.exceptions.ErrorCode;
@@ -36,16 +34,18 @@
 import org.apache.hyracks.storage.am.common.CheckTuple;
 import org.apache.hyracks.storage.am.common.IIndexTestContext;
 import org.apache.hyracks.storage.am.common.TreeIndexTestUtils;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.util.HashMultiSet;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
 import org.apache.hyracks.storage.am.rtree.util.RTreeUtils;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.ISearchPredicate;
 import org.apache.hyracks.storage.common.MultiComparator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @SuppressWarnings("rawtypes")
 public class RTreeTestUtils extends TreeIndexTestUtils {
-    private static final Logger LOGGER = Logger.getLogger(RTreeTestUtils.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
     private int intPayloadValue = 0;
     private double doublePayloadValue = 0.0;
 
@@ -65,13 +65,13 @@
     }
 
     public void checkRangeSearch(IIndexTestContext ictx, ITupleReference key) throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing Range Search.");
         }
         AbstractRTreeTestContext ctx = (AbstractRTreeTestContext) ictx;
         MultiComparator cmp = RTreeUtils.getSearchMultiComparator(ctx.getComparatorFactories(), key);
 
-        ITreeIndexCursor searchCursor = (ITreeIndexCursor) ctx.getIndexAccessor().createSearchCursor(false);
+        IIndexCursor searchCursor = ctx.getIndexAccessor().createSearchCursor(false);
         SearchPredicate searchPred = new SearchPredicate(key, cmp);
         ctx.getIndexAccessor().search(searchCursor, searchPred);
 
@@ -101,7 +101,7 @@
             // Set values.
             setDoublePayloadFields(fieldValues, numKeyFields, fieldCount);
             TupleUtils.createDoubleTuple(ctx.getTupleBuilder(), ctx.getTuple(), fieldValues);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                     LOGGER.info("Inserting Tuple " + (i + 1) + "/" + numTuples);
                 }
@@ -173,8 +173,8 @@
     }
 
     @Override
-    public void checkExpectedResults(ITreeIndexCursor cursor, Collection checkTuples,
-            ISerializerDeserializer[] fieldSerdes, int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception {
+    public void checkExpectedResults(IIndexCursor cursor, Collection checkTuples, ISerializerDeserializer[] fieldSerdes,
+            int keyFieldCount, Iterator<CheckTuple> checkIter) throws Exception {
         int actualCount = 0;
         try {
             while (cursor.hasNext()) {
@@ -196,7 +196,7 @@
                         + "\nActual  : " + actualCount);
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestJobletContext.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestJobletContext.java
index d3c34dd..1d38d3d 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestJobletContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestJobletContext.java
@@ -26,10 +26,10 @@
 import org.apache.hyracks.api.exceptions.HyracksException;
 import org.apache.hyracks.api.io.FileReference;
 import org.apache.hyracks.api.io.IIOManager;
+import org.apache.hyracks.api.job.IJobletEventListenerFactory;
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.api.job.profiling.counters.ICounterContext;
 import org.apache.hyracks.api.resources.IDeallocatable;
-import org.apache.hyracks.control.nc.io.IOManager;
 import org.apache.hyracks.control.nc.io.WorkspaceFileFactory;
 import org.apache.hyracks.control.nc.resources.memory.FrameManager;
 
@@ -56,10 +56,15 @@
         return frameManger.allocateFrame(bytes);
     }
 
-    ByteBuffer reallocateFrame(ByteBuffer tobeDeallocate, int newFrameSizeInBytes, boolean copyOldData) throws HyracksDataException {
+    ByteBuffer reallocateFrame(ByteBuffer tobeDeallocate, int newFrameSizeInBytes, boolean copyOldData)
+            throws HyracksDataException {
         return frameManger.reallocateFrame(tobeDeallocate, newFrameSizeInBytes, copyOldData);
     }
 
+    public IJobletEventListenerFactory getJobletEventListenerFactory() {
+        return null;
+    }
+
     void deallocateFrames(int bytes) {
         frameManger.deallocateFrames(bytes);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestTaskContext.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestTaskContext.java
index 3d13cf9..ac52573 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestTaskContext.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestTaskContext.java
@@ -163,6 +163,10 @@
     }
 
     @Override
+    public byte[] getJobParameter(byte[] name, int start, int length) {
+        return new byte[0];
+    }
+
     public Set<JobFlag> getJobFlags() {
         return EnumSet.noneOf(JobFlag.class);
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
index c3d86e8..d7578af 100644
--- a/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-test-support/src/main/java/org/apache/hyracks/test/support/TestUtils.java
@@ -25,6 +25,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.Executors;
 
 import org.apache.hyracks.api.application.INCServiceContext;
@@ -41,6 +42,10 @@
 import org.apache.hyracks.api.job.JobId;
 import org.apache.hyracks.control.nc.io.DefaultDeviceResolver;
 import org.apache.hyracks.control.nc.io.IOManager;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.config.Configuration;
 
 public class TestUtils {
     public static IHyracksTaskContext create(int frameSize) {
@@ -135,9 +140,32 @@
             String ncId = ncNamePrefix + i;
             String ncAddress = addressPrefix + i;
             ncNameToNcInfos.put(ncId,
-                    new NodeControllerInfo(ncId, NodeStatus.ALIVE, new NetworkAddress(ncAddress, netPort),
+                    new NodeControllerInfo(ncId, NodeStatus.ACTIVE, new NetworkAddress(ncAddress, netPort),
                             new NetworkAddress(ncAddress, dataPort), new NetworkAddress(ncAddress, messagingPort), 2));
         }
         return ncNameToNcInfos;
     }
+
+    public static void redirectLoggingToConsole() {
+        final LoggerContext context = LoggerContext.getContext(false);
+        final Configuration config = context.getConfiguration();
+
+        Appender appender = config.getAppender("Console");
+        if (appender == null) {
+            Optional<Appender> result =
+                    config.getAppenders().values().stream().filter(a -> a instanceof ConsoleAppender).findFirst();
+            if (!result.isPresent()) {
+                System.err.println(
+                        "ERROR: cannot find appender named 'Console'; unable to find alternate ConsoleAppender!");
+            } else {
+                appender = result.get();
+                System.err.println("ERROR: cannot find appender named 'Console'; using alternate ConsoleAppender named "
+                        + appender.getName());
+            }
+        }
+        if (appender != null) {
+            config.getRootLogger().addAppender(appender, null, null);
+            context.updateLoggers();
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/pom.xml
index 214e57a..9f39337 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/pom.xml
@@ -75,5 +75,9 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/BloomFilterTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/BloomFilterTest.java
index 24b1122..f720d6f 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/BloomFilterTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/BloomFilterTest.java
@@ -53,7 +53,7 @@
 
     @Test
     public void singleFieldTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING BLOOM FILTER");
         }
 
@@ -97,6 +97,7 @@
         }
         builder.end();
 
+        bf.pinAllPages();
         // Check all the inserted tuples can be found.
 
         long[] hashes = BloomFilter.createHashArray();
@@ -104,14 +105,14 @@
             TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
             Assert.assertTrue(bf.contains(tuple, hashes));
         }
-
+        bf.unpinAllPages();
         bf.deactivate();
         bf.destroy();
     }
 
     @Test
     public void multiFieldTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING BLOOM FILTER");
         }
 
@@ -157,12 +158,14 @@
         }
         builder.end();
 
+        bf.pinAllPages();
         long[] hashes = BloomFilter.createHashArray();
         for (int i = 0; i < numElements; ++i) {
             TupleUtils.createTuple(tupleBuilder, tuple, fieldSerdes, s1.get(i), s2.get(i), i, s3.get(i), s4.get(i));
             Assert.assertTrue(bf.contains(tuple, hashes));
         }
 
+        bf.unpinAllPages();
         bf.deactivate();
         bf.destroy();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/MurmurHashForITupleReferenceTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/MurmurHashForITupleReferenceTest.java
index 9d1b9be..b7b4639e 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/MurmurHashForITupleReferenceTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/MurmurHashForITupleReferenceTest.java
@@ -21,7 +21,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -50,7 +49,7 @@
 
     @Test
     public void murmurhashONEIntegerFieldTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING MURMUR HASH ONE INTEGER FIELD");
         }
 
@@ -77,7 +76,7 @@
 
     @Test
     public void murmurhashTwoIntegerFieldsTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING MURMUR HASH TWO INTEGER FIELDS");
         }
 
@@ -104,7 +103,7 @@
 
     @Test
     public void murmurhashOneStringFieldTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING MURMUR HASH ONE STRING FIELD");
         }
 
@@ -132,7 +131,7 @@
 
     @Test
     public void murmurhashThreeStringFieldsTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING MURMUR HASH THREE STRING FIELDS");
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/util/AbstractBloomFilterTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/util/AbstractBloomFilterTest.java
index fdcd96b..b0644e3 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/util/AbstractBloomFilterTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-bloomfilter-test/src/test/java/org/apache/hyracks/storage/am/bloomfilter/util/AbstractBloomFilterTest.java
@@ -20,15 +20,16 @@
 package org.apache.hyracks.storage.am.bloomfilter.util;
 
 import java.util.Random;
-import java.util.logging.Logger;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.After;
 import org.junit.Before;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public abstract class AbstractBloomFilterTest {
-    protected final Logger LOGGER = Logger.getLogger(BloomFilterTestHarness.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected final BloomFilterTestHarness harness;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/pom.xml
index 8b2e078..b618834 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/pom.xml
@@ -85,5 +85,9 @@
       <artifactId>hyracks-data-std</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeSearchCursorTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeSearchCursorTest.java
index 78231fd..68a3984 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeSearchCursorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeSearchCursorTest.java
@@ -24,9 +24,9 @@
 import java.io.DataInputStream;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Random;
 import java.util.TreeSet;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparator;
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
@@ -44,18 +44,19 @@
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMLeafFrameFactory;
 import org.apache.hyracks.storage.am.btree.impls.BTree;
-import org.apache.hyracks.storage.am.btree.impls.BTreeRangeSearchCursor;
+import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
 import org.apache.hyracks.storage.am.btree.tuples.BTreeTypeAwareTupleWriterFactory;
 import org.apache.hyracks.storage.am.btree.util.AbstractBTreeTest;
 import org.apache.hyracks.storage.am.common.TestOperationCallback;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexAccessor;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexMetadataFrameFactory;
 import org.apache.hyracks.storage.am.common.frames.LIFOMetaDataFrameFactory;
 import org.apache.hyracks.storage.am.common.freepage.LinkedMetaDataPageManager;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.junit.Assert;
@@ -63,12 +64,12 @@
 import org.junit.Test;
 
 public class BTreeSearchCursorTest extends AbstractBTreeTest {
-    private final int fieldCount = 2;
-    private final ITypeTraits[] typeTraits = new ITypeTraits[fieldCount];
-    private final BTreeTypeAwareTupleWriterFactory tupleWriterFactory =
+    protected final int fieldCount = 2;
+    protected final ITypeTraits[] typeTraits = new ITypeTraits[fieldCount];
+    protected final BTreeTypeAwareTupleWriterFactory tupleWriterFactory =
             new BTreeTypeAwareTupleWriterFactory(typeTraits, false);
-    private final ITreeIndexMetadataFrameFactory metaFrameFactory = new LIFOMetaDataFrameFactory();
-    private final Random rnd = new Random(50);
+    protected final ITreeIndexMetadataFrameFactory metaFrameFactory = new LIFOMetaDataFrameFactory();
+    protected final Random rnd = new Random(50);
 
     @Override
     @Before
@@ -80,7 +81,7 @@
 
     @Test
     public void uniqueIndexTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING RANGE SEARCH CURSOR ON UNIQUE INDEX");
         }
 
@@ -104,12 +105,6 @@
         btree.create();
         btree.activate();
 
-        ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
-        ArrayTupleReference tuple = new ArrayTupleReference();
-
-        ITreeIndexAccessor indexAccessor =
-                btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
-
         // generate keys
         int numKeys = 50;
         int maxKey = 1000;
@@ -123,18 +118,7 @@
             keys.add(i);
         }
 
-        // insert keys into btree
-        for (int i = 0; i < keys.size(); i++) {
-
-            TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
-            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
-
-            try {
-                indexAccessor.insert(tuple);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+        insertBTree(keys, btree);
 
         int minSearchKey = -100;
         int maxSearchKey = 100;
@@ -155,7 +139,7 @@
 
     @Test
     public void nonUniqueIndexTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING RANGE SEARCH CURSOR ON NONUNIQUE INDEX");
         }
 
@@ -180,12 +164,6 @@
         btree.create();
         btree.activate();
 
-        ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
-        ArrayTupleReference tuple = new ArrayTupleReference();
-
-        ITreeIndexAccessor indexAccessor =
-                btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
-
         // generate keys
         int numKeys = 50;
         int maxKey = 10;
@@ -196,18 +174,7 @@
         }
         Collections.sort(keys);
 
-        // insert keys into btree
-        for (int i = 0; i < keys.size(); i++) {
-
-            TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
-            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
-
-            try {
-                indexAccessor.insert(tuple);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+        insertBTree(keys, btree);
 
         int minSearchKey = -100;
         int maxSearchKey = 100;
@@ -228,7 +195,7 @@
 
     @Test
     public void nonUniqueFieldPrefixIndexTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING RANGE SEARCH CURSOR ON NONUNIQUE FIELD-PREFIX COMPRESSED INDEX");
         }
 
@@ -252,13 +219,6 @@
                 fieldCount, harness.getFileReference());
         btree.create();
         btree.activate();
-
-        ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
-        ArrayTupleReference tuple = new ArrayTupleReference();
-
-        ITreeIndexAccessor indexAccessor =
-                btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
-
         // generate keys
         int numKeys = 50;
         int maxKey = 10;
@@ -269,18 +229,7 @@
         }
         Collections.sort(keys);
 
-        // insert keys into btree
-        for (int i = 0; i < keys.size(); i++) {
-
-            TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
-            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
-
-            try {
-                indexAccessor.insert(tuple);
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+        insertBTree(keys, btree);
 
         int minSearchKey = -100;
         int maxSearchKey = 100;
@@ -301,7 +250,6 @@
 
     public RangePredicate createRangePredicate(int lk, int hk, boolean lowKeyInclusive, boolean highKeyInclusive)
             throws HyracksDataException {
-
         // create tuplereferences for search keys
         ITupleReference lowKey = TupleUtils.createIntegerTuple(false, lk);
         ITupleReference highKey = TupleUtils.createIntegerTuple(false, hk);
@@ -348,17 +296,17 @@
 
         for (int i = minKey; i < maxKey; i++) {
             for (int j = minKey; j < maxKey; j++) {
-
                 results.clear();
                 expectedResults.clear();
 
                 int lowKey = i;
                 int highKey = j;
 
-                ITreeIndexCursor rangeCursor = new BTreeRangeSearchCursor(leafFrame, false);
                 RangePredicate rangePred = createRangePredicate(lowKey, highKey, lowKeyInclusive, highKeyInclusive);
-                ITreeIndexAccessor indexAccessor =
-                        btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+                IndexAccessParameters actx =
+                        new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+                ITreeIndexAccessor indexAccessor = btree.createAccessor(actx);
+                IIndexCursor rangeCursor = indexAccessor.createSearchCursor(false);
                 indexAccessor.search(rangeCursor, rangePred);
 
                 try {
@@ -374,7 +322,7 @@
                 } catch (Exception e) {
                     e.printStackTrace();
                 } finally {
-                    rangeCursor.close();
+                    rangeCursor.destroy();
                 }
 
                 getExpectedResults(expectedResults, keys, lowKey, highKey, lowKeyInclusive, highKeyInclusive);
@@ -395,14 +343,14 @@
                             u = ')';
                         }
 
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info("RANGE: " + l + " " + lowKey + " , " + highKey + " " + u);
                         }
                         StringBuilder strBuilder = new StringBuilder();
                         for (Integer r : expectedResults) {
                             strBuilder.append(r + " ");
                         }
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info(strBuilder.toString());
                         }
                     }
@@ -411,7 +359,7 @@
                 if (results.size() == expectedResults.size()) {
                     for (int k = 0; k < results.size(); k++) {
                         if (!results.get(k).equals(expectedResults.get(k))) {
-                            if (LOGGER.isLoggable(Level.INFO)) {
+                            if (LOGGER.isInfoEnabled()) {
                                 LOGGER.info("DIFFERENT RESULTS AT: i=" + i + " j=" + j + " k=" + k);
                                 LOGGER.info(results.get(k) + " " + expectedResults.get(k));
                             }
@@ -419,7 +367,7 @@
                         }
                     }
                 } else {
-                    if (LOGGER.isLoggable(Level.INFO)) {
+                    if (LOGGER.isInfoEnabled()) {
                         LOGGER.info("UNEQUAL NUMBER OF RESULTS AT: i=" + i + " j=" + j);
                         LOGGER.info("RESULTS: " + results.size());
                         LOGGER.info("EXPECTED RESULTS: " + expectedResults.size());
@@ -431,4 +379,19 @@
 
         return true;
     }
+
+    protected void insertBTree(List<Integer> keys, BTree btree) throws HyracksDataException {
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        BTreeAccessor accessor = btree.createAccessor(actx);
+        ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
+        ArrayTupleReference tuple = new ArrayTupleReference();
+
+        // insert keys into btree
+        for (int i = 0; i < keys.size(); i++) {
+            TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
+            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+            accessor.insert(tuple);
+        }
+    }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeStatsTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeStatsTest.java
index 905eda8..2243ee3 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeStatsTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeStatsTest.java
@@ -20,7 +20,6 @@
 
 import java.io.DataOutput;
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
@@ -54,6 +53,7 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexMetadataFrameFactory;
 import org.apache.hyracks.storage.am.common.frames.LIFOMetaDataFrameFactory;
 import org.apache.hyracks.storage.am.common.freepage.LinkedMetaDataPageManager;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.util.TreeIndexBufferCacheWarmup;
 import org.apache.hyracks.storage.am.common.util.TreeIndexStats;
 import org.apache.hyracks.storage.am.common.util.TreeIndexStatsGatherer;
@@ -109,7 +109,7 @@
 
         long start = System.currentTimeMillis();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("INSERTING INTO TREE");
         }
 
@@ -125,8 +125,9 @@
         accessor.reset(frame.getBuffer());
         FrameTupleReference tuple = new FrameTupleReference();
 
-        ITreeIndexAccessor indexAccessor =
-                btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        ITreeIndexAccessor indexAccessor = btree.createAccessor(actx);
         // 10000
         for (int i = 0; i < 100000; i++) {
 
@@ -144,7 +145,7 @@
 
             tuple.reset(accessor, 0);
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 10000 == 0) {
                     long end = System.currentTimeMillis();
                     LOGGER.info("INSERTING " + i + " : " + f0 + " " + f1 + " " + (end - start));
@@ -164,7 +165,7 @@
         TreeIndexStatsGatherer statsGatherer = new TreeIndexStatsGatherer(bufferCache, freePageManager,
                 harness.getFileReference(), btree.getRootPageId());
         TreeIndexStats stats = statsGatherer.gatherStats(leafFrame, interiorFrame, metaFrame);
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("\n" + stats.toString());
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeUpdateSearchTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeUpdateSearchTest.java
index 77bd64a..f32bda3 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeUpdateSearchTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/BTreeUpdateSearchTest.java
@@ -19,7 +19,6 @@
 package org.apache.hyracks.storage.am.btree;
 
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -49,6 +48,7 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexMetadataFrameFactory;
 import org.apache.hyracks.storage.am.common.frames.LIFOMetaDataFrameFactory;
 import org.apache.hyracks.storage.am.common.freepage.LinkedMetaDataPageManager;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.junit.Test;
 
@@ -92,21 +92,22 @@
 
         long start = System.currentTimeMillis();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("INSERTING INTO TREE");
         }
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference insertTuple = new ArrayTupleReference();
-        ITreeIndexAccessor indexAccessor =
-                btree.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        ITreeIndexAccessor indexAccessor = btree.createAccessor(actx);
 
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             int f0 = rnd.nextInt() % 10000;
             int f1 = 5;
             TupleUtils.createIntegerTuple(tb, insertTuple, f0, f1);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 10000 == 0) {
                     long end = System.currentTimeMillis();
                     LOGGER.info("INSERTING " + i + " : " + f0 + " " + f1 + " " + (end - start));
@@ -124,12 +125,12 @@
         }
         long end = System.currentTimeMillis();
         long duration = end - start;
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("DURATION: " + duration);
         }
 
         // Update scan.
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("UPDATE SCAN:");
         }
         // Set the cursor to X latch nodes.
@@ -146,11 +147,11 @@
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            updateScanCursor.close();
+            updateScanCursor.destroy();
         }
 
         // Ordered scan to verify the values.
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("ORDERED SCAN:");
         }
         // Set the cursor to X latch nodes.
@@ -161,14 +162,14 @@
                 scanCursor.next();
                 ITupleReference tuple = scanCursor.getTuple();
                 String rec = TupleUtils.printTuple(tuple, recDescSers);
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(rec);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            scanCursor.close();
+            scanCursor.destroy();
         }
         btree.deactivate();
         btree.destroy();
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/DiskBTreeSearchCursorTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/DiskBTreeSearchCursorTest.java
new file mode 100644
index 0000000..c7f0425
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/DiskBTreeSearchCursorTest.java
@@ -0,0 +1,203 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.btree;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TreeSet;
+
+import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.data.std.accessors.PointableBinaryComparatorFactory;
+import org.apache.hyracks.data.std.primitive.IntegerPointable;
+import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleBuilder;
+import org.apache.hyracks.dataflow.common.comm.io.ArrayTupleReference;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
+import org.apache.hyracks.dataflow.common.utils.TupleUtils;
+import org.apache.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
+import org.apache.hyracks.storage.am.btree.api.IBTreeLeafFrame;
+import org.apache.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
+import org.apache.hyracks.storage.am.btree.frames.BTreeNSMLeafFrameFactory;
+import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
+import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.TestOperationCallback;
+import org.apache.hyracks.storage.am.common.api.IMetadataPageManager;
+import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
+import org.apache.hyracks.storage.am.common.freepage.LinkedMetaDataPageManager;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.common.IIndexBulkLoader;
+import org.apache.hyracks.storage.common.IIndexCursor;
+import org.apache.hyracks.storage.common.buffercache.IBufferCache;
+import org.junit.Assert;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class DiskBTreeSearchCursorTest extends BTreeSearchCursorTest {
+
+    @Test
+    public void batchPointLookupSingleLevelTest() throws Exception {
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("TESTING POINT LOOKUP CURSOR ON UNIQUE 1 LEVEL INDEX");
+        }
+        // only 4 keys
+        batchPointLookupTest(4, 4, -8, 8);
+    }
+
+    @Test
+    public void batchPointLookupMultiLevelTest() throws Exception {
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("TESTING POINT LOOKUP CURSOR ON UNIQUE MULTI-LEVEL INDEX");
+        }
+        // only 10000 keys
+        batchPointLookupTest(10000, 20000, -1000, 1000);
+    }
+
+    @Test
+    public void batchPointLookupMultiLevelOutRangeTest() throws Exception {
+        if (LOGGER.isInfoEnabled()) {
+            LOGGER.info("TESTING POINT LOOKUP CURSOR ON UNIQUE 1 LEVEL INDEX");
+        }
+        // only 100 keys
+        batchPointLookupTest(100, 200, -1000, 1000);
+    }
+
+    private void batchPointLookupTest(int numKeys, int maxKey, int minSearchKey, int maxSearchKey) throws Exception {
+
+        IBufferCache bufferCache = harness.getBufferCache();
+
+        // declare keys
+        int keyFieldCount = 1;
+        IBinaryComparatorFactory[] cmpFactories = new IBinaryComparatorFactory[keyFieldCount];
+        cmpFactories[0] = PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY);
+
+        ITreeIndexFrameFactory leafFrameFactory = new BTreeNSMLeafFrameFactory(tupleWriterFactory);
+        ITreeIndexFrameFactory interiorFrameFactory = new BTreeNSMInteriorFrameFactory(tupleWriterFactory);
+
+        IBTreeLeafFrame leafFrame = (IBTreeLeafFrame) leafFrameFactory.createFrame();
+        IBTreeInteriorFrame interiorFrame = (IBTreeInteriorFrame) interiorFrameFactory.createFrame();
+
+        IMetadataPageManager freePageManager = new LinkedMetaDataPageManager(bufferCache, metaFrameFactory);
+
+        DiskBTree btree = new DiskBTree(bufferCache, freePageManager, interiorFrameFactory, leafFrameFactory,
+                cmpFactories, fieldCount, harness.getFileReference());
+        btree.create();
+        btree.activate();
+
+        TreeSet<Integer> uniqueKeys = new TreeSet<>();
+        ArrayList<Integer> keys = new ArrayList<>();
+        while (uniqueKeys.size() < numKeys) {
+            int key = rnd.nextInt() % maxKey;
+            uniqueKeys.add(key);
+        }
+        for (Integer i : uniqueKeys) {
+            keys.add(i);
+        }
+
+        insertBTree(keys, btree);
+
+        // forward searches
+        Assert.assertTrue(performBatchLookups(keys, btree, leafFrame, interiorFrame, minSearchKey, maxSearchKey));
+
+        btree.deactivate();
+        btree.destroy();
+    }
+
+    private boolean performBatchLookups(ArrayList<Integer> keys, BTree btree, IBTreeLeafFrame leafFrame,
+            IBTreeInteriorFrame interiorFrame, int minKey, int maxKey) throws Exception {
+
+        ArrayList<Integer> results = new ArrayList<>();
+        ArrayList<Integer> expectedResults = new ArrayList<>();
+        BTreeAccessor indexAccessor = btree.createAccessor(
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE));
+        IIndexCursor pointCursor = indexAccessor.createPointCursor(false);
+        for (int i = minKey; i < maxKey; i++) {
+            results.clear();
+            expectedResults.clear();
+
+            int lowKey = i;
+            int highKey = i;
+            RangePredicate rangePred = createRangePredicate(lowKey, highKey, true, true);
+            indexAccessor.search(pointCursor, rangePred);
+            try {
+                while (pointCursor.hasNext()) {
+                    pointCursor.next();
+                    ITupleReference frameTuple = pointCursor.getTuple();
+                    ByteArrayInputStream inStream = new ByteArrayInputStream(frameTuple.getFieldData(0),
+                            frameTuple.getFieldStart(0), frameTuple.getFieldLength(0));
+                    DataInput dataIn = new DataInputStream(inStream);
+                    Integer res = IntegerSerializerDeserializer.INSTANCE.deserialize(dataIn);
+                    results.add(res);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            getExpectedResults(expectedResults, keys, lowKey, highKey, true, true);
+
+            if (results.size() == expectedResults.size()) {
+                for (int k = 0; k < results.size(); k++) {
+                    if (!results.get(k).equals(expectedResults.get(k))) {
+                        if (LOGGER.isInfoEnabled()) {
+                            LOGGER.info("DIFFERENT RESULTS AT: i=" + i + " k=" + k);
+                            LOGGER.info(results.get(k) + " " + expectedResults.get(k));
+                        }
+                        return false;
+                    }
+                }
+            } else {
+                if (LOGGER.isInfoEnabled()) {
+                    LOGGER.info("UNEQUAL NUMBER OF RESULTS AT: i=" + i);
+                    LOGGER.info("RESULTS: " + results.size());
+                    LOGGER.info("EXPECTED RESULTS: " + expectedResults.size());
+                }
+                return false;
+            }
+        }
+
+        pointCursor.close();
+
+        return true;
+    }
+
+    @Override
+    protected void insertBTree(List<Integer> keys, BTree btree) throws HyracksDataException {
+        ArrayTupleBuilder tupleBuilder = new ArrayTupleBuilder(fieldCount);
+        ArrayTupleReference tuple = new ArrayTupleReference();
+
+        IIndexBulkLoader bulkloader = btree.createBulkLoader(1, true, 0, true);
+        // insert keys into btree
+        for (int i = 0; i < keys.size(); i++) {
+            TupleUtils.createIntegerTuple(tupleBuilder, tuple, keys.get(i), i);
+            tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+
+            bulkloader.add(tuple);
+        }
+        bulkloader.end();
+    }
+
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/FieldPrefixNSMTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/FieldPrefixNSMTest.java
index bd5d5b8..48e8d51 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/FieldPrefixNSMTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/FieldPrefixNSMTest.java
@@ -21,7 +21,6 @@
 
 import java.io.DataOutput;
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.comm.IFrame;
 import org.apache.hyracks.api.comm.IFrameTupleAccessor;
@@ -65,7 +64,7 @@
     private ITupleReference createTuple(IHyracksTaskContext ctx, int f0, int f1, int f2, boolean print)
             throws HyracksDataException {
         if (print) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("CREATING: " + f0 + " " + f1 + " " + f2);
             }
         }
@@ -152,7 +151,7 @@
             // insert records with random calls to compact and compress
             for (int i = 0; i < numRecords; i++) {
 
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if ((i + 1) % 100 == 0) {
                         LOGGER.info("INSERTING " + (i + 1) + " / " + numRecords);
                     }
@@ -192,7 +191,7 @@
 
             // delete records with random calls to compact and compress
             for (int i = 0; i < numRecords; i++) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if ((i + 1) % 100 == 0) {
                         LOGGER.info("DELETING " + (i + 1) + " / " + numRecords);
                     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/StorageFileAccessTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/StorageFileAccessTest.java
index 6dcb3a4..576c6bb 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/StorageFileAccessTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/StorageFileAccessTest.java
@@ -22,7 +22,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.btree.util.AbstractBTreeTest;
@@ -83,7 +82,7 @@
         private void pinRandomPage() {
             int pageId = Math.abs(rnd.nextInt() % maxPages);
 
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(workerId + " PINNING PAGE: " + pageId);
             }
 
@@ -99,7 +98,7 @@
                         break;
 
                     case FTA_READONLY: {
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info(workerId + " S LATCHING: " + pageId);
                         }
                         page.acquireReadLatch();
@@ -108,7 +107,7 @@
                         break;
 
                     case FTA_WRITEONLY: {
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info(workerId + " X LATCHING: " + pageId);
                         }
                         page.acquireWriteLatch();
@@ -118,13 +117,13 @@
 
                     case FTA_MIXED: {
                         if (rnd.nextInt() % 2 == 0) {
-                            if (LOGGER.isLoggable(Level.INFO)) {
+                            if (LOGGER.isInfoEnabled()) {
                                 LOGGER.info(workerId + " S LATCHING: " + pageId);
                             }
                             page.acquireReadLatch();
                             latch = LatchType.LATCH_S;
                         } else {
-                            if (LOGGER.isLoggable(Level.INFO)) {
+                            if (LOGGER.isInfoEnabled()) {
                                 LOGGER.info(workerId + " X LATCHING: " + pageId);
                             }
                             page.acquireWriteLatch();
@@ -149,18 +148,18 @@
 
                 if (plPage.latch != null) {
                     if (plPage.latch == LatchType.LATCH_S) {
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info(workerId + " S UNLATCHING: " + plPage.pageId);
                         }
                         plPage.page.releaseReadLatch();
                     } else {
-                        if (LOGGER.isLoggable(Level.INFO)) {
+                        if (LOGGER.isInfoEnabled()) {
                             LOGGER.info(workerId + " X UNLATCHING: " + plPage.pageId);
                         }
                         plPage.page.releaseWriteLatch(true);
                     }
                 }
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(workerId + " UNPINNING PAGE: " + plPage.pageId);
                 }
 
@@ -172,7 +171,7 @@
         }
 
         private void openFile() {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(workerId + " OPENING FILE: " + fileId);
             }
             try {
@@ -184,7 +183,7 @@
         }
 
         private void closeFile() {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info(workerId + " CLOSING FILE: " + fileId);
             }
             try {
@@ -203,7 +202,7 @@
             while (loopCount < maxLoopCount) {
                 loopCount++;
 
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     LOGGER.info(workerId + " LOOP: " + loopCount + "/" + maxLoopCount);
                 }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/multithread/BTreeTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/multithread/BTreeTestWorker.java
index 5866075..06a00e0 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/multithread/BTreeTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/multithread/BTreeTestWorker.java
@@ -107,7 +107,7 @@
                 break;
 
             case POINT_SEARCH:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setLowKey(tuple, true);
                 rangePred.setHighKey(tuple, true);
                 accessor.search(searchCursor, rangePred);
@@ -115,7 +115,7 @@
                 break;
 
             case SCAN:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setLowKey(null, true);
                 rangePred.setHighKey(null, true);
                 accessor.search(searchCursor, rangePred);
@@ -123,7 +123,7 @@
                 break;
 
             case DISKORDER_SCAN:
-                diskOrderScanCursor.reset();
+                diskOrderScanCursor.close();
                 accessor.diskOrderScan(diskOrderScanCursor);
                 consumeCursorTuples(diskOrderScanCursor);
                 break;
@@ -139,7 +139,7 @@
                 cursor.next();
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/util/AbstractBTreeTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/util/AbstractBTreeTest.java
index 20c7ff6..64c6038 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/util/AbstractBTreeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-btree-test/src/test/java/org/apache/hyracks/storage/am/btree/util/AbstractBTreeTest.java
@@ -19,15 +19,15 @@
 
 package org.apache.hyracks.storage.am.btree.util;
 
-import java.util.logging.Logger;
-
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.After;
 import org.junit.Before;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
 public abstract class AbstractBTreeTest {
-    protected final Logger LOGGER = Logger.getLogger(BTreeTestHarness.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected final BTreeTestHarness harness;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/pom.xml
index 8ccb07b..e5cbab2 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/pom.xml
@@ -133,5 +133,9 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeExamplesTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeExamplesTest.java
index 805fbd6..0c7eed8 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeExamplesTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeExamplesTest.java
@@ -34,6 +34,7 @@
 import org.apache.hyracks.storage.am.btree.OrderedIndexExamplesTest;
 import org.apache.hyracks.storage.am.common.TestOperationCallback;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
 import org.apache.hyracks.storage.am.lsm.btree.utils.LSMBTreeUtil;
 import org.apache.hyracks.storage.common.IIndexAccessor;
@@ -72,7 +73,7 @@
      */
     @Test
     public void additionalFilteringingExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing LSMBTree component filters.");
         }
 
@@ -105,19 +106,20 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(actx);
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             int f0 = rnd.nextInt() % numInserts;
             int f1 = i;
             TupleUtils.createIntegerTuple(tb, tuple, f0, f1);
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 if (i % 1000 == 0) {
                     LOGGER.info("Inserting " + i + " : " + f0 + " " + f1);
                 }
@@ -125,7 +127,7 @@
             indexAccessor.insert(tuple);
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeMergeFailTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeMergeFailTest.java
new file mode 100644
index 0000000..4c325c0
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeMergeFailTest.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.storage.am.lsm.btree;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
+import org.apache.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
+import org.apache.hyracks.dataflow.common.utils.TupleUtils;
+import org.apache.hyracks.storage.am.btree.OrderedIndexTestUtils;
+import org.apache.hyracks.storage.am.btree.frames.BTreeLeafFrameType;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
+import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTree;
+import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeRangeSearchCursor;
+import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestContext;
+import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperation;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
+import org.apache.hyracks.storage.am.lsm.common.impls.MergeOperation;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+@SuppressWarnings("rawtypes")
+public class LSMBTreeMergeFailTest {
+
+    private final OrderedIndexTestUtils orderedIndexTestUtils = new OrderedIndexTestUtils();
+
+    private final LSMBTreeTestHarness harness = new LSMBTreeTestHarness();
+
+    private final TestIoScheduler scheduler = new TestIoScheduler();
+
+    @Before
+    public void setUp() throws HyracksDataException {
+        harness.setUp();
+    }
+
+    @After
+    public void tearDown() throws HyracksDataException {
+        harness.tearDown();
+    }
+
+    @Test
+    public void testMergeFail() throws Exception {
+        ISerializerDeserializer[] fieldSerdes =
+                { IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
+        LSMBTreeTestContext ctx = createTestContext(fieldSerdes, 1, BTreeLeafFrameType.REGULAR_NSM, true);
+        LSMBTree btree = (LSMBTree) ctx.getIndex();
+        btree.create();
+        btree.activate();
+        ILSMIndexAccessor accessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
+
+        ITupleReference tuple1 = TupleUtils.createIntegerTuple(1, 1, 1);
+        accessor.insert(tuple1);
+        // flush component
+        accessor.scheduleFlush(btree.getIOOperationCallback());
+
+        ITupleReference tuple2 = TupleUtils.createIntegerTuple(2, 2, 2);
+        accessor.insert(tuple2);
+        // flush component
+        accessor.scheduleFlush(btree.getIOOperationCallback());
+
+        ITupleReference tuple3 = TupleUtils.createIntegerTuple(3, 3, 3);
+        accessor.insert(tuple3);
+        // flush component
+        accessor.scheduleFlush(btree.getIOOperationCallback());
+
+        scheduler.modify = true;
+
+        boolean exceptionThrown = false;
+        try {
+            accessor.scheduleMerge(btree.getIOOperationCallback(), btree.getDiskComponents());
+        } catch (HyracksDataException e) {
+            exceptionThrown = true;
+        }
+        Assert.assertTrue(exceptionThrown);
+
+        scheduler.modify = false;
+        accessor.scheduleMerge(btree.getIOOperationCallback(), btree.getDiskComponents());
+        Assert.assertEquals(1, btree.getDiskComponents().size());
+
+        btree.deactivate();
+        btree.destroy();
+    }
+
+    protected LSMBTreeTestContext createTestContext(ISerializerDeserializer[] fieldSerdes, int numKeys,
+            BTreeLeafFrameType leafType, boolean filtered) throws Exception {
+        return LSMBTreeTestContext.create(harness.getIOManager(), harness.getVirtualBufferCaches(),
+                harness.getFileReference(), harness.getDiskBufferCache(), fieldSerdes, numKeys,
+                harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(), harness.getOperationTracker(),
+                scheduler, harness.getIOOperationCallbackFactory(), harness.getMetadataPageManagerFactory(), filtered,
+                true, false);
+    }
+
+    private class TestIoScheduler implements ILSMIOOperationScheduler {
+        boolean modify = false;
+
+        @Override
+        public void scheduleOperation(ILSMIOOperation operation) throws HyracksDataException {
+            if (modify) {
+                try {
+                    modifyOperation(operation);
+                } catch (Exception e) {
+                    throw HyracksDataException.create(e);
+                }
+            }
+            operation.call();
+        }
+
+        private void modifyOperation(ILSMIOOperation operation) throws Exception {
+            if (!(operation instanceof MergeOperation)) {
+                return;
+            }
+            Field field = MergeOperation.class.getDeclaredField("cursor");
+            field.setAccessible(true);
+            Field modifiersField = Field.class.getDeclaredField("modifiers");
+            modifiersField.setAccessible(true);
+            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
+            LSMBTreeRangeSearchCursor originalCursor = (LSMBTreeRangeSearchCursor) field.get(operation);
+            field.set(operation, new TestCursor(originalCursor.getOpCtx()));
+        }
+    }
+
+    private class TestCursor extends LSMBTreeRangeSearchCursor {
+        public TestCursor(ILSMIndexOperationContext opCtx) {
+            super(opCtx);
+        }
+
+        @Override
+        public boolean hasNext() throws HyracksDataException {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeModificationOperationCallbackTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeModificationOperationCallbackTest.java
index fdf027e..9f17efa 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeModificationOperationCallbackTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeModificationOperationCallbackTest.java
@@ -22,6 +22,7 @@
 import org.apache.hyracks.dataflow.common.utils.SerdeUtils;
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.AbstractModificationOperationCallbackTest;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
 import org.apache.hyracks.storage.am.lsm.btree.utils.LSMBTreeUtil;
@@ -48,7 +49,7 @@
                 harness.getFileReference(), harness.getDiskBufferCache(), SerdeUtils.serdesToTypeTraits(keySerdes),
                 SerdeUtils.serdesToComparatorFactories(keySerdes, keySerdes.length), bloomFilterKeyFields,
                 harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(),
-                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null), harness.getIOScheduler(),
+                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null, null), harness.getIOScheduler(),
                 harness.getIOOperationCallbackFactory(), true, null, null, null, null, true,
                 harness.getMetadataPageManagerFactory(), false, ITracer.NONE);
     }
@@ -68,7 +69,9 @@
     @Override
     @Test
     public void modificationCallbackTest() throws Exception {
-        ILSMIndexAccessor accessor = (ILSMIndexAccessor) index.createAccessor(cb, NoOpOperationCallback.INSTANCE);
+        IndexAccessParameters actx = new IndexAccessParameters(cb, NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor accessor = (ILSMIndexAccessor) index.createAccessor(actx);
+
         BlockingIOOperationCallbackWrapper ioOpCallback =
                 new BlockingIOOperationCallbackWrapper(((ILSMIndex) index).getIOOperationCallback());
         for (int j = 0; j < 2; j++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
index 5742c83..77d52bb 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeSearchOperationCallbackTest.java
@@ -30,6 +30,8 @@
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.AbstractSearchOperationCallbackTest;
 import org.apache.hyracks.storage.am.btree.impls.RangePredicate;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
 import org.apache.hyracks.storage.am.lsm.btree.utils.LSMBTreeUtil;
@@ -57,7 +59,7 @@
                 harness.getFileReference(), harness.getDiskBufferCache(), SerdeUtils.serdesToTypeTraits(keySerdes),
                 SerdeUtils.serdesToComparatorFactories(keySerdes, keySerdes.length), bloomFilterKeyFields,
                 harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(),
-                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null), harness.getIOScheduler(),
+                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null, null), harness.getIOScheduler(),
                 harness.getIOOperationCallbackFactory(), true, null, null, null, null, true,
                 harness.getMetadataPageManagerFactory(), false, ITracer.NONE);
     }
@@ -101,7 +103,8 @@
 
         public SearchTask() throws HyracksDataException {
             this.cb = new SynchronizingSearchOperationCallback();
-            this.accessor = index.createAccessor(NoOpOperationCallback.INSTANCE, cb);
+            IndexAccessParameters actx = new IndexAccessParameters(NoOpOperationCallback.INSTANCE, cb);
+            this.accessor = index.createAccessor(actx);
             this.cursor = accessor.createSearchCursor(false);
             this.predicate = new RangePredicate();
             this.builder = new ArrayTupleBuilder(NUM_KEY_FIELDS);
@@ -139,7 +142,7 @@
                 // consume tuples [152, 300]
                 consumeIntTupleRange(152, 300, false, -1);
 
-                cursor.close();
+                cursor.destroy();
             } finally {
                 lock.unlock();
             }
@@ -219,7 +222,7 @@
         private final ArrayTupleReference tuple;
 
         public InsertionTask() throws HyracksDataException {
-            this.accessor = index.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            this.accessor = index.createAccessor(NoOpIndexAccessParameters.INSTANCE);
             this.builder = new ArrayTupleBuilder(NUM_KEY_FIELDS);
             this.tuple = new ArrayTupleReference();
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceScanDiskComponentsTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceScanDiskComponentsTest.java
index 4d15821..035ef98 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceScanDiskComponentsTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceScanDiskComponentsTest.java
@@ -46,6 +46,7 @@
 import org.apache.hyracks.storage.am.common.IIndexTestContext;
 import org.apache.hyracks.storage.am.common.TestOperationCallback;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTree;
 import org.apache.hyracks.storage.am.lsm.btree.tuples.LSMBTreeTupleReference;
@@ -204,7 +205,7 @@
             // keys the cube root of numTuples, etc.
             int maxValue = (int) Math.ceil(Math.pow(numTuples, 1.0 / numKeyFields));
             for (int i = 0; i < numTuples; i++) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                         LOGGER.info("Generating Tuple " + (i + 1) + "/" + numTuples);
                     }
@@ -279,7 +280,7 @@
             }
 
             for (int i = 0; i < numTuples && numCheckTuples > 0; i++) {
-                if (LOGGER.isLoggable(Level.INFO)) {
+                if (LOGGER.isInfoEnabled()) {
                     if ((i + 1) % (numTuples / Math.min(10, numTuples)) == 0) {
                         LOGGER.info("Deleting Tuple " + (i + 1) + "/" + numTuples);
                     }
@@ -361,8 +362,9 @@
         Assert.assertEquals("Check disk components", 1, btree.getDiskComponents().size());
 
         ILSMDiskComponent btreeComponent = btree.getDiskComponents().get(0);
-        BTree.BTreeAccessor btreeAccessor = ((BTree) btreeComponent.getIndex())
-                .createAccessor(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        IndexAccessParameters actx =
+                new IndexAccessParameters(TestOperationCallback.INSTANCE, TestOperationCallback.INSTANCE);
+        BTree.BTreeAccessor btreeAccessor = ((BTree) btreeComponent.getIndex()).createAccessor(actx);
 
         ITreeIndexCursor cursor = btreeAccessor.createDiskOrderScanCursor();
         try {
@@ -375,7 +377,7 @@
             }
             Assert.assertFalse(cursor.hasNext());
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceTest.java
index 8b9b715..d42c3b6 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/LSMBTreeUpdateInPlaceTest.java
@@ -29,6 +29,7 @@
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.btree.AbstractOperationCallbackTest;
 import org.apache.hyracks.storage.am.common.api.IBTreeIndexTupleReference;
+import org.apache.hyracks.storage.am.common.impls.IndexAccessParameters;
 import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.am.lsm.btree.util.LSMBTreeTestHarness;
@@ -70,7 +71,7 @@
                 harness.getFileReference(), harness.getDiskBufferCache(), SerdeUtils.serdesToTypeTraits(keySerdes),
                 SerdeUtils.serdesToComparatorFactories(keySerdes, keySerdes.length), bloomFilterKeyFields,
                 harness.getBoomFilterFalsePositiveRate(), harness.getMergePolicy(),
-                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null), harness.getIOScheduler(),
+                NoOpOperationTrackerFactory.INSTANCE.getOperationTracker(null, null), harness.getIOScheduler(),
                 harness.getIOOperationCallbackFactory(), true, null, null, null, null, true,
                 harness.getMetadataPageManagerFactory(), true, ITracer.NONE);
     }
@@ -80,7 +81,8 @@
     public void setup() throws Exception {
         harness.setUp();
         super.setup();
-        accessor = index.createAccessor(cb, NoOpOperationCallback.INSTANCE);
+        IndexAccessParameters actx = new IndexAccessParameters(cb, NoOpOperationCallback.INSTANCE);
+        accessor = index.createAccessor(actx);
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/ITestOpCallback.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/ITestOpCallback.java
index 2989af9..e888238 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/ITestOpCallback.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/ITestOpCallback.java
@@ -18,8 +18,10 @@
  */
 package org.apache.hyracks.storage.am.lsm.btree.impl;
 
-import java.util.concurrent.Semaphore;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
 
-public interface ITestOpCallback {
-    void callback(Semaphore smeaphore);
+public interface ITestOpCallback<T> {
+    void before(T t) throws HyracksDataException;
+
+    void after() throws HyracksDataException;
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/IVirtualBufferCacheCallback.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/IVirtualBufferCacheCallback.java
new file mode 100644
index 0000000..d5f3fb2
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/IVirtualBufferCacheCallback.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.btree.impl;
+
+public interface IVirtualBufferCacheCallback {
+    void isFullChanged(boolean newValue);
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtree.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtree.java
index 70a29db..3c781a6 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtree.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtree.java
@@ -40,6 +40,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexFileManager;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexOperationContext;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMMemoryComponent;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
@@ -56,10 +57,17 @@
     private final Semaphore searchSemaphore = new Semaphore(0);
     private final Semaphore flushSemaphore = new Semaphore(0);
     private final Semaphore mergeSemaphore = new Semaphore(0);
-    private final List<ITestOpCallback> modifyCallbacks = new ArrayList<>();
-    private final List<ITestOpCallback> searchCallbacks = new ArrayList<>();
-    private final List<ITestOpCallback> flushCallbacks = new ArrayList<>();
-    private final List<ITestOpCallback> mergeCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Semaphore>> modifyCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Semaphore>> searchCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Semaphore>> flushCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Semaphore>> mergeCallbacks = new ArrayList<>();
+
+    private final List<ITestOpCallback<ILSMMemoryComponent>> ioAllocateCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<ILSMMemoryComponent>> ioRecycleCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Void>> ioBeforeCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Void>> ioAfterOpCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Void>> ioAfterFinalizeCallbacks = new ArrayList<>();
+    private final List<ITestOpCallback<Void>> allocateComponentCallbacks = new ArrayList<>();
 
     private volatile int numScheduledFlushes;
     private volatile int numStartedFlushes;
@@ -88,17 +96,22 @@
     @Override
     public void modify(IIndexOperationContext ictx, ITupleReference tuple) throws HyracksDataException {
         synchronized (modifyCallbacks) {
-            for (ITestOpCallback callback : modifyCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : modifyCallbacks) {
                 callback(callback, modifySemaphore);
             }
         }
         acquire(modifySemaphore);
         super.modify(ictx, tuple);
+        synchronized (modifyCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : modifyCallbacks) {
+                callback.after();
+            }
+        }
     }
 
-    public static void callback(ITestOpCallback callback, Semaphore semaphore) {
+    public static <T> void callback(ITestOpCallback<T> callback, T t) throws HyracksDataException {
         if (callback != null) {
-            callback.callback(semaphore);
+            callback.before(t);
         }
     }
 
@@ -120,13 +133,18 @@
     public ILSMDiskComponent doFlush(ILSMIOOperation operation) throws HyracksDataException {
         numStartedFlushes++;
         synchronized (flushCallbacks) {
-            for (ITestOpCallback callback : flushCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : flushCallbacks) {
                 callback(callback, flushSemaphore);
             }
         }
         acquire(flushSemaphore);
         ILSMDiskComponent c = super.doFlush(operation);
         numFinishedFlushes++;
+        synchronized (flushCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : flushCallbacks) {
+                callback.after();
+            }
+        }
         return c;
     }
 
@@ -134,13 +152,18 @@
     public ILSMDiskComponent doMerge(ILSMIOOperation operation) throws HyracksDataException {
         numStartedMerges++;
         synchronized (mergeCallbacks) {
-            for (ITestOpCallback callback : mergeCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : mergeCallbacks) {
                 callback(callback, mergeSemaphore);
             }
         }
         acquire(mergeSemaphore);
         ILSMDiskComponent c = super.doMerge(operation);
         numFinishedMerges++;
+        synchronized (mergeCallbacks) {
+            for (ITestOpCallback<Semaphore> callback : mergeCallbacks) {
+                callback.after();
+            }
+        }
         return c;
     }
 
@@ -171,7 +194,7 @@
 
     @Override
     public ILSMIndexAccessor createAccessor(AbstractLSMIndexOperationContext opCtx) {
-        return new LSMTreeIndexAccessor(getLsmHarness(), opCtx, ctx -> new TestLsmBtreeSearchCursor(ctx, this));
+        return new LSMTreeIndexAccessor(getHarness(), opCtx, ctx -> new TestLsmBtreeSearchCursor(ctx, this));
     }
 
     public int getNumScheduledFlushes() {
@@ -198,11 +221,11 @@
         return numFinishedMerges;
     }
 
-    public List<ITestOpCallback> getModifyCallbacks() {
+    public List<ITestOpCallback<Semaphore>> getModifyCallbacks() {
         return modifyCallbacks;
     }
 
-    public void addModifyCallback(ITestOpCallback modifyCallback) {
+    public void addModifyCallback(ITestOpCallback<Semaphore> modifyCallback) {
         synchronized (mergeCallbacks) {
             modifyCallbacks.add(modifyCallback);
         }
@@ -214,7 +237,31 @@
         }
     }
 
-    public List<ITestOpCallback> getSearchCallbacks() {
+    public void addIoRecycleCallback(ITestOpCallback<ILSMMemoryComponent> callback) {
+        synchronized (ioRecycleCallbacks) {
+            ioRecycleCallbacks.add(callback);
+        }
+    }
+
+    public void clearIoRecycleCallback() {
+        synchronized (ioRecycleCallbacks) {
+            ioRecycleCallbacks.clear();
+        }
+    }
+
+    public void addIoAllocateCallback(ITestOpCallback<ILSMMemoryComponent> callback) {
+        synchronized (ioAllocateCallbacks) {
+            ioAllocateCallbacks.add(callback);
+        }
+    }
+
+    public void clearIoAllocateCallback() {
+        synchronized (ioAllocateCallbacks) {
+            ioAllocateCallbacks.clear();
+        }
+    }
+
+    public List<ITestOpCallback<Semaphore>> getSearchCallbacks() {
         return searchCallbacks;
     }
 
@@ -224,13 +271,13 @@
         }
     }
 
-    public void addSearchCallback(ITestOpCallback searchCallback) {
+    public void addSearchCallback(ITestOpCallback<Semaphore> searchCallback) {
         synchronized (searchCallbacks) {
             searchCallbacks.add(searchCallback);
         }
     }
 
-    public void addFlushCallback(ITestOpCallback flushCallback) {
+    public void addFlushCallback(ITestOpCallback<Semaphore> flushCallback) {
         synchronized (flushCallbacks) {
             flushCallbacks.add(flushCallback);
         }
@@ -242,7 +289,7 @@
         }
     }
 
-    public void addMergeCallback(ITestOpCallback mergeCallback) {
+    public void addMergeCallback(ITestOpCallback<Semaphore> mergeCallback) {
         synchronized (mergeCallbacks) {
             mergeCallbacks.add(mergeCallback);
         }
@@ -257,4 +304,124 @@
     public Semaphore getSearchSemaphore() {
         return searchSemaphore;
     }
+
+    public void addAllocateCallback(ITestOpCallback<Void> callback) {
+        synchronized (allocateComponentCallbacks) {
+            allocateComponentCallbacks.add(callback);
+        }
+    }
+
+    public void clearAllocateCallbacks() {
+        synchronized (allocateComponentCallbacks) {
+            allocateComponentCallbacks.clear();
+        }
+    }
+
+    public void addVirtuablBufferCacheCallback(IVirtualBufferCacheCallback callback) {
+        for (IVirtualBufferCache vbc : virtualBufferCaches) {
+            ((TestVirtualBufferCache) vbc).addCallback(callback);
+        }
+    }
+
+    public void clearVirtuablBufferCacheCallbacks() {
+        for (IVirtualBufferCache vbc : virtualBufferCaches) {
+            ((TestVirtualBufferCache) vbc).clearCallbacks();
+        }
+    }
+
+    @Override
+    public void allocateMemoryComponents() throws HyracksDataException {
+        synchronized (allocateComponentCallbacks) {
+            for (ITestOpCallback<Void> callback : allocateComponentCallbacks) {
+                callback(callback, null);
+            }
+        }
+        super.allocateMemoryComponents();
+        synchronized (allocateComponentCallbacks) {
+            for (ITestOpCallback<Void> callback : allocateComponentCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
+    public void beforeIoOperationCalled() throws HyracksDataException {
+        synchronized (ioBeforeCallbacks) {
+            for (ITestOpCallback<Void> callback : ioBeforeCallbacks) {
+                callback.before(null);
+            }
+        }
+    }
+
+    public void beforeIoOperationReturned() throws HyracksDataException {
+        synchronized (ioBeforeCallbacks) {
+            for (ITestOpCallback<Void> callback : ioBeforeCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
+    public void afterIoOperationCalled() throws HyracksDataException {
+        synchronized (ioAfterOpCallbacks) {
+            for (ITestOpCallback<Void> callback : ioAfterOpCallbacks) {
+                callback.before(null);
+            }
+        }
+    }
+
+    public void afterIoOperationReturned() throws HyracksDataException {
+        synchronized (ioAfterOpCallbacks) {
+            for (ITestOpCallback<Void> callback : ioAfterOpCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
+    public void afterIoFinalizeCalled() throws HyracksDataException {
+        synchronized (ioAfterFinalizeCallbacks) {
+            for (ITestOpCallback<Void> callback : ioAfterFinalizeCallbacks) {
+                callback.before(null);
+            }
+        }
+    }
+
+    public void afterIoFinalizeReturned() throws HyracksDataException {
+        synchronized (ioAfterFinalizeCallbacks) {
+            for (ITestOpCallback<Void> callback : ioAfterFinalizeCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
+    public void recycledCalled(ILSMMemoryComponent component) throws HyracksDataException {
+        synchronized (ioRecycleCallbacks) {
+            for (ITestOpCallback<ILSMMemoryComponent> callback : ioRecycleCallbacks) {
+                callback.before(component);
+            }
+        }
+    }
+
+    public void recycledReturned(ILSMMemoryComponent component) throws HyracksDataException {
+        synchronized (ioRecycleCallbacks) {
+            for (ITestOpCallback<ILSMMemoryComponent> callback : ioRecycleCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
+    public void allocatedCalled(ILSMMemoryComponent component) throws HyracksDataException {
+        synchronized (ioAllocateCallbacks) {
+            for (ITestOpCallback<ILSMMemoryComponent> callback : ioAllocateCallbacks) {
+                callback.before(component);
+            }
+        }
+    }
+
+    public void allocatedReturned(ILSMMemoryComponent component) throws HyracksDataException {
+        synchronized (ioAllocateCallbacks) {
+            for (ITestOpCallback<ILSMMemoryComponent> callback : ioAllocateCallbacks) {
+                callback.after();
+            }
+        }
+    }
+
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeLocalResource.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeLocalResource.java
index d8dda71..3ce24b0 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeLocalResource.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeLocalResource.java
@@ -60,10 +60,18 @@
         IIOManager ioManager = serviceCtx.getIoManager();
         FileReference file = ioManager.resolve(path);
         List<IVirtualBufferCache> vbcs = vbcProvider.getVirtualBufferCaches(serviceCtx, file);
+        for (int i = 0; i < vbcs.size(); i++) {
+            IVirtualBufferCache vbc = vbcs.get(i);
+            if (!(vbc instanceof TestVirtualBufferCache)) {
+                vbcs.remove(i);
+                vbcs.add(i, new TestVirtualBufferCache(vbc));
+            }
+        }
+        ioOpCallbackFactory.initialize(serviceCtx, this);
         return TestLsmBtreeUtil.createLSMTree(ioManager, vbcs, file, storageManager.getBufferCache(serviceCtx),
                 typeTraits, cmpFactories, bloomFilterKeyFields, bloomFilterFalsePositiveRate,
                 mergePolicyFactory.createMergePolicy(mergePolicyProperties, serviceCtx),
-                opTrackerProvider.getOperationTracker(serviceCtx), ioSchedulerProvider.getIoScheduler(serviceCtx),
+                opTrackerProvider.getOperationTracker(serviceCtx, this), ioSchedulerProvider.getIoScheduler(serviceCtx),
                 ioOpCallbackFactory, isPrimary, filterTypeTraits, filterCmpFactories, btreeFields, filterFields,
                 durable, metadataPageManagerFactory, false, serviceCtx.getTracer());
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeSearchCursor.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeSearchCursor.java
index d3504ae..45e39aad 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeSearchCursor.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeSearchCursor.java
@@ -19,6 +19,7 @@
 package org.apache.hyracks.storage.am.lsm.btree.impl;
 
 import java.util.List;
+import java.util.concurrent.Semaphore;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTreeSearchCursor;
@@ -36,9 +37,9 @@
     @Override
     public void next() throws HyracksDataException {
         try {
-            List<ITestOpCallback> callbacks = lsmBtree.getSearchCallbacks();
+            List<ITestOpCallback<Semaphore>> callbacks = lsmBtree.getSearchCallbacks();
             synchronized (callbacks) {
-                for (ITestOpCallback cb : callbacks) {
+                for (ITestOpCallback<Semaphore> cb : callbacks) {
                     TestLsmBtree.callback(cb, lsmBtree.getSearchSemaphore());
                 }
             }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeUtil.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeUtil.java
index 4000c1d..d614aff 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestLsmBtreeUtil.java
@@ -28,7 +28,7 @@
 import org.apache.hyracks.storage.am.bloomfilter.impls.BloomFilterFactory;
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMInteriorFrameFactory;
 import org.apache.hyracks.storage.am.btree.frames.BTreeNSMLeafFrameFactory;
-import org.apache.hyracks.storage.am.btree.impls.BTree;
+import org.apache.hyracks.storage.am.btree.impls.DiskBTree;
 import org.apache.hyracks.storage.am.common.api.IMetadataPageManagerFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.tuples.TypeAwareTupleWriterFactory;
@@ -46,8 +46,8 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMOperationTracker;
 import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
 import org.apache.hyracks.storage.am.lsm.common.frames.LSMComponentFilterFrameFactory;
-import org.apache.hyracks.storage.am.lsm.common.impls.BTreeFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.ComponentFilterHelper;
+import org.apache.hyracks.storage.am.lsm.common.impls.DiskBTreeFactory;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMComponentFilterManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.TreeIndexFactory;
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
@@ -77,9 +77,10 @@
         ITreeIndexFrameFactory deleteLeafFrameFactory = new BTreeNSMLeafFrameFactory(deleteTupleWriterFactory);
         ITreeIndexFrameFactory interiorFrameFactory = new BTreeNSMInteriorFrameFactory(insertTupleWriterFactory);
 
-        TreeIndexFactory<BTree> diskBTreeFactory = new BTreeFactory(ioManager, diskBufferCache, freePageManagerFactory,
-                interiorFrameFactory, copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
-        TreeIndexFactory<BTree> bulkLoadBTreeFactory = new BTreeFactory(ioManager, diskBufferCache,
+        TreeIndexFactory<DiskBTree> diskBTreeFactory =
+                new DiskBTreeFactory(ioManager, diskBufferCache, freePageManagerFactory, interiorFrameFactory,
+                        copyTupleLeafFrameFactory, cmpFactories, typeTraits.length);
+        TreeIndexFactory<DiskBTree> bulkLoadBTreeFactory = new DiskBTreeFactory(ioManager, diskBufferCache,
                 freePageManagerFactory, interiorFrameFactory, insertLeafFrameFactory, cmpFactories, typeTraits.length);
 
         ComponentFilterHelper filterHelper = null;
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestVirtualBufferCache.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestVirtualBufferCache.java
new file mode 100644
index 0000000..c7e064f
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/impl/TestVirtualBufferCache.java
@@ -0,0 +1,215 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.storage.am.lsm.btree.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.io.FileReference;
+import org.apache.hyracks.api.replication.IIOReplicationManager;
+import org.apache.hyracks.storage.am.lsm.common.api.IVirtualBufferCache;
+import org.apache.hyracks.storage.common.buffercache.ICachedPage;
+import org.apache.hyracks.storage.common.buffercache.IExtraPageBlockHelper;
+import org.apache.hyracks.storage.common.buffercache.IFIFOPageQueue;
+import org.apache.hyracks.storage.common.file.IFileMapManager;
+
+public class TestVirtualBufferCache implements IVirtualBufferCache {
+    private final IVirtualBufferCache vbc;
+    private final AtomicBoolean isFull = new AtomicBoolean(false);
+    private final List<IVirtualBufferCacheCallback> callbacks;
+
+    public TestVirtualBufferCache(IVirtualBufferCache vbc) {
+        this.vbc = vbc;
+        callbacks = new ArrayList<>();
+    }
+
+    public void addCallback(IVirtualBufferCacheCallback callback) {
+        synchronized (callbacks) {
+            callbacks.add(callback);
+        }
+    }
+
+    public void clearCallbacks() {
+        synchronized (callbacks) {
+            callbacks.clear();
+        }
+    }
+
+    @Override
+    public int createFile(FileReference fileRef) throws HyracksDataException {
+        return vbc.createFile(fileRef);
+    }
+
+    @Override
+    public int openFile(FileReference fileRef) throws HyracksDataException {
+        return vbc.openFile(fileRef);
+    }
+
+    @Override
+    public void openFile(int fileId) throws HyracksDataException {
+        vbc.openFile(fileId);
+    }
+
+    @Override
+    public void closeFile(int fileId) throws HyracksDataException {
+        vbc.closeFile(fileId);
+    }
+
+    @Override
+    public void deleteFile(int fileId) throws HyracksDataException {
+        vbc.deleteFile(fileId);
+    }
+
+    @Override
+    public void deleteFile(FileReference file) throws HyracksDataException {
+        vbc.deleteFile(file);
+    }
+
+    @Override
+    public ICachedPage pin(long dpid, boolean newPage) throws HyracksDataException {
+        return vbc.pin(dpid, newPage);
+    }
+
+    @Override
+    public void unpin(ICachedPage page) throws HyracksDataException {
+        vbc.unpin(page);
+    }
+
+    @Override
+    public void flush(ICachedPage page) throws HyracksDataException {
+        vbc.flush(page);
+    }
+
+    @Override
+    public void force(int fileId, boolean metadata) throws HyracksDataException {
+        vbc.force(fileId, metadata);
+    }
+
+    @Override
+    public ICachedPage confiscatePage(long dpid) throws HyracksDataException {
+        return vbc.confiscatePage(dpid);
+    }
+
+    @Override
+    public ICachedPage confiscateLargePage(long dpid, int multiplier, int extraBlockPageId)
+            throws HyracksDataException {
+        return vbc.confiscateLargePage(dpid, multiplier, extraBlockPageId);
+    }
+
+    @Override
+    public void returnPage(ICachedPage page) {
+        vbc.returnPage(page);
+    }
+
+    @Override
+    public void returnPage(ICachedPage page, boolean reinsert) {
+        vbc.returnPage(page, reinsert);
+    }
+
+    @Override
+    public int getPageSize() {
+        return vbc.getPageSize();
+    }
+
+    @Override
+    public int getPageSizeWithHeader() {
+        return vbc.getPageSizeWithHeader();
+    }
+
+    @Override
+    public int getPageBudget() {
+        return vbc.getPageBudget();
+    }
+
+    @Override
+    public int getNumPagesOfFile(int fileId) throws HyracksDataException {
+        return vbc.getNumPagesOfFile(fileId);
+    }
+
+    @Override
+    public int getFileReferenceCount(int fileId) {
+        return vbc.getFileReferenceCount(fileId);
+    }
+
+    @Override
+    public void close() throws HyracksDataException {
+        vbc.close();
+    }
+
+    @Override
+    public IFIFOPageQueue createFIFOQueue() {
+        return vbc.createFIFOQueue();
+    }
+
+    @Override
+    public void finishQueue() throws HyracksDataException {
+        vbc.finishQueue();
+    }
+
+    @Override
+    public boolean isReplicationEnabled() {
+        return vbc.isReplicationEnabled();
+    }
+
+    @Override
+    public IIOReplicationManager getIOReplicationManager() {
+        return vbc.getIOReplicationManager();
+    }
+
+    @Override
+    public void purgeHandle(int fileId) throws HyracksDataException {
+        vbc.purgeHandle(fileId);
+    }
+
+    @Override
+    public void resizePage(ICachedPage page, int multiplier, IExtraPageBlockHelper extraPageBlockHelper)
+            throws HyracksDataException {
+        vbc.resizePage(page, multiplier, extraPageBlockHelper);
+    }
+
+    @Override
+    public void open() throws HyracksDataException {
+        vbc.open();
+    }
+
+    @Override
+    public boolean isFull() {
+        boolean newValue = vbc.isFull();
+        if (isFull.compareAndSet(!newValue, newValue)) {
+            synchronized (callbacks) {
+                for (int i = 0; i < callbacks.size(); i++) {
+                    callbacks.get(i).isFullChanged(newValue);
+                }
+            }
+        }
+        return newValue;
+    }
+
+    @Override
+    public void reset() {
+        vbc.reset();
+    }
+
+    @Override
+    public IFileMapManager getFileMapProvider() {
+        return vbc.getFileMapProvider();
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/multithread/LSMBTreeTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/multithread/LSMBTreeTestWorker.java
index ad0e13d..4c07dea 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/multithread/LSMBTreeTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/multithread/LSMBTreeTestWorker.java
@@ -101,7 +101,7 @@
                 break;
 
             case POINT_SEARCH:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setLowKey(tuple, true);
                 rangePred.setHighKey(tuple, true);
                 accessor.search(searchCursor, rangePred);
@@ -109,7 +109,7 @@
                 break;
 
             case SCAN:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setLowKey(null, true);
                 rangePred.setHighKey(null, true);
                 accessor.search(searchCursor, rangePred);
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/BTreePageSizePerf.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/BTreePageSizePerf.java
index 2d355da..95c308a 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/BTreePageSizePerf.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/BTreePageSizePerf.java
@@ -35,7 +35,7 @@
     public static void main(String[] args) throws Exception {
         // Disable logging so we can better see the output times.
         Enumeration<String> loggers = LogManager.getLogManager().getLoggerNames();
-        while(loggers.hasMoreElements()) {
+        while (loggers.hasMoreElements()) {
             String loggerName = loggers.nextElement();
             Logger logger = LogManager.getLogManager().getLogger(loggerName);
             logger.setLevel(Level.OFF);
@@ -45,10 +45,12 @@
         int batchSize = 10000;
         int numBatches = numTuples / batchSize;
 
-        ISerializerDeserializer[] fieldSerdes = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] fieldSerdes =
+                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE };
         ITypeTraits[] typeTraits = SerdeUtils.serdesToTypeTraits(fieldSerdes, 30);
 
-        IBinaryComparatorFactory[] cmpFactories = SerdeUtils.serdesToComparatorFactories(fieldSerdes, fieldSerdes.length);
+        IBinaryComparatorFactory[] cmpFactories =
+                SerdeUtils.serdesToComparatorFactories(fieldSerdes, fieldSerdes.length);
 
         runExperiment(numBatches, batchSize, 1024, 100000, fieldSerdes, cmpFactories, typeTraits);
         runExperiment(numBatches, batchSize, 2048, 100000, fieldSerdes, cmpFactories, typeTraits);
@@ -61,7 +63,9 @@
         runExperiment(numBatches, batchSize, 262144, 391, fieldSerdes, cmpFactories, typeTraits);
     }
 
-    private static void runExperiment(int numBatches, int batchSize, int pageSize, int numPages, ISerializerDeserializer[] fieldSerdes, IBinaryComparatorFactory[] cmpFactories, ITypeTraits[] typeTraits) throws Exception {
+    private static void runExperiment(int numBatches, int batchSize, int pageSize, int numPages,
+            ISerializerDeserializer[] fieldSerdes, IBinaryComparatorFactory[] cmpFactories, ITypeTraits[] typeTraits)
+            throws Exception {
         System.out.println("PAGE SIZE: " + pageSize);
         System.out.println("NUM PAGES: " + numPages);
         System.out.println("MEMORY: " + (pageSize * numPages));
@@ -72,7 +76,8 @@
         runner.init();
         int numThreads = 1;
         for (int i = 0; i < repeats; i++) {
-            DataGenThread dataGen = new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, 30, 50, 10, false);
+            DataGenThread dataGen =
+                    new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, 30, 50, 10, false);
             dataGen.start();
             times[i] = runner.runExperiment(dataGen, numThreads);
             System.out.println("TIME " + i + ": " + times[i] + "ms");
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/InMemoryBTreeRunner.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/InMemoryBTreeRunner.java
index cc754c0..3307093 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/InMemoryBTreeRunner.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/InMemoryBTreeRunner.java
@@ -36,7 +36,7 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
 import org.apache.hyracks.storage.am.common.datagen.DataGenThread;
 import org.apache.hyracks.storage.am.common.datagen.TupleBatch;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.common.freepage.VirtualFreePageManager;
 import org.apache.hyracks.storage.am.lsm.common.impls.VirtualBufferCache;
 import org.apache.hyracks.storage.common.buffercache.HeapBufferAllocator;
@@ -122,7 +122,7 @@
         public BTreeThread(DataGenThread dataGen, BTree btree, int numBatches) {
             this.dataGen = dataGen;
             this.numBatches = numBatches;
-            indexAccessor = btree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            indexAccessor = btree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         }
 
         @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/LSMTreeRunner.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/LSMTreeRunner.java
index 43af9fa..a8e0aee 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/LSMTreeRunner.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/LSMTreeRunner.java
@@ -33,7 +33,7 @@
 import org.apache.hyracks.control.nc.io.IOManager;
 import org.apache.hyracks.storage.am.common.datagen.DataGenThread;
 import org.apache.hyracks.storage.am.common.datagen.TupleBatch;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.lsm.btree.impls.LSMBTree;
 import org.apache.hyracks.storage.am.lsm.btree.utils.LSMBTreeUtil;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIOOperationScheduler;
@@ -170,7 +170,7 @@
         public LSMTreeThread(DataGenThread dataGen, LSMBTree lsmTree, int numBatches) {
             this.dataGen = dataGen;
             this.numBatches = numBatches;
-            lsmTreeAccessor = lsmTree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+            lsmTreeAccessor = lsmTree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         }
 
         @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/PerfExperiment.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/PerfExperiment.java
index 3f14f62..16d1208 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/PerfExperiment.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/perf/PerfExperiment.java
@@ -41,7 +41,7 @@
             logger.setLevel(Level.OFF);
         }
         boolean sorted = Boolean.parseBoolean(args[0]);
-        int numThreads =  Integer.parseInt(args[1]);
+        int numThreads = Integer.parseInt(args[1]);
 
         //int numTuples = 100000; // 100K
         //int numTuples = 1000000; // 1M
@@ -58,11 +58,12 @@
         int numBatches = numTuples / batchSize;
 
         int payLoadSize = 240;
-        ISerializerDeserializer[] fieldSerdes = new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] fieldSerdes =
+                new ISerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE };
         ITypeTraits[] typeTraits = SerdeUtils.serdesToTypeTraits(fieldSerdes, payLoadSize);
 
-        IBinaryComparatorFactory[] cmpFactories = SerdeUtils.serdesToComparatorFactories(fieldSerdes,
-                fieldSerdes.length);
+        IBinaryComparatorFactory[] cmpFactories =
+                SerdeUtils.serdesToComparatorFactories(fieldSerdes, fieldSerdes.length);
         int[] bloomFilterKeyFields = new int[cmpFactories.length];
         for (int i = 0; i < bloomFilterKeyFields.length; i++) {
             bloomFilterKeyFields[i] = i;
@@ -73,8 +74,8 @@
         int repeats = 1;
         long[] times = new long[repeats];
 
-//        int numThreads = 4;
-//        boolean sorted = true;
+        //        int numThreads = 4;
+        //        boolean sorted = true;
         for (int i = 0; i < repeats; i++) {
             //ConcurrentSkipListRunner runner = new ConcurrentSkipListRunner(numBatches, batchSize, tupleSize, typeTraits, cmp);
             //InMemoryBTreeRunner runner = new InMemoryBTreeRunner(numBatches, 8192, 100000, typeTraits, cmpFactories);
@@ -90,7 +91,8 @@
             int onDiskNumPages = 16384; // 2GB
             LSMTreeRunner runner = new LSMTreeRunner(numBatches, inMemPageSize, inMemNumPages, onDiskPageSize,
                     onDiskNumPages, typeTraits, cmpFactories, bloomFilterKeyFields, bloomFilterFalsePositiveRate);
-            DataGenThread dataGen = new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, payLoadSize, 50, 10, sorted);
+            DataGenThread dataGen =
+                    new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, payLoadSize, 50, 10, sorted);
             dataGen.start();
             runner.reset();
             times[i] = runner.runExperiment(dataGen, numThreads);
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeTuplesTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeTuplesTest.java
index 4c51520..c0d9bb8 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeTuplesTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/tuples/LSMBTreeTuplesTest.java
@@ -70,10 +70,11 @@
                 // Create and write tuple to bytes using an LSMBTreeTupleWriter.
                 LSMBTreeTupleWriter maxMatterTupleWriter =
                         new LSMBTreeTupleWriter(maxTypeTraits, numKeyFields, false, false);
-                ITupleReference maxTuple = TupleUtils.createTuple(maxFieldSerdes, (Object[])maxFields);
+                ITupleReference maxTuple = TupleUtils.createTuple(maxFieldSerdes, (Object[]) maxFields);
                 ByteBuffer maxMatterBuf = writeTuple(maxTuple, maxMatterTupleWriter);
                 // Tuple reference should work for both matter and antimatter tuples (doesn't matter which factory creates it).
-                LSMBTreeTupleReference maxLsmBTreeTuple = (LSMBTreeTupleReference) maxMatterTupleWriter.createTupleReference();
+                LSMBTreeTupleReference maxLsmBTreeTuple =
+                        (LSMBTreeTupleReference) maxMatterTupleWriter.createTupleReference();
 
                 ISerializerDeserializer[] fieldSerdes = Arrays.copyOfRange(maxFieldSerdes, 0, numFields);
                 ITypeTraits[] typeTraits = SerdeUtils.serdesToTypeTraits(fieldSerdes);
@@ -84,7 +85,7 @@
                     fields[j] = fieldGens[j].next();
                 }
                 // Create and write tuple to bytes using an LSMBTreeTupleWriter.
-                ITupleReference tuple = TupleUtils.createTuple(fieldSerdes, (Object[])fields);
+                ITupleReference tuple = TupleUtils.createTuple(fieldSerdes, (Object[]) fields);
                 LSMBTreeTupleWriter matterTupleWriter = new LSMBTreeTupleWriter(typeTraits, numKeyFields, false, false);
                 LSMBTreeTupleWriter antimatterTupleWriter =
                         new LSMBTreeTupleWriter(typeTraits, numKeyFields, true, false);
@@ -98,7 +99,8 @@
                 }
 
                 // Tuple reference should work for both matter and antimatter tuples (doesn't matter which factory creates it).
-                LSMBTreeTupleReference lsmBTreeTuple = (LSMBTreeTupleReference) matterTupleWriter.createTupleReference();
+                LSMBTreeTupleReference lsmBTreeTuple =
+                        (LSMBTreeTupleReference) matterTupleWriter.createTupleReference();
 
                 // Use LSMBTree tuple reference to interpret the written tuples.
                 // Repeat the block inside to test that repeated resetting to matter/antimatter tuples works.
@@ -145,7 +147,8 @@
         }
     }
 
-    private void checkTuple(LSMBTreeTupleReference tuple, int expectedFieldCount, boolean expectedAntimatter, ISerializerDeserializer[] fieldSerdes, Object[] expectedFields) throws HyracksDataException {
+    private void checkTuple(LSMBTreeTupleReference tuple, int expectedFieldCount, boolean expectedAntimatter,
+            ISerializerDeserializer[] fieldSerdes, Object[] expectedFields) throws HyracksDataException {
         assertEquals(expectedFieldCount, tuple.getFieldCount());
         assertEquals(expectedAntimatter, tuple.isAntimatter());
         Object[] deserMatterTuple = TupleUtils.deserializeTuple(tuple, fieldSerdes);
@@ -156,22 +159,20 @@
 
     @Test
     public void testLSMBTreeTuple() throws HyracksDataException {
-        ISerializerDeserializer[] intFields = new IntegerSerializerDeserializer[] {
-                IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
-                IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] intFields =
+                new IntegerSerializerDeserializer[] { IntegerSerializerDeserializer.INSTANCE,
+                        IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE,
+                        IntegerSerializerDeserializer.INSTANCE, IntegerSerializerDeserializer.INSTANCE };
         testLSMBTreeTuple(intFields);
 
-        ISerializerDeserializer[] stringFields = new ISerializerDeserializer[] {
+        ISerializerDeserializer[] stringFields = new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
                 new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                new UTF8StringSerializerDeserializer() };
+                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer() };
         testLSMBTreeTuple(stringFields);
 
-        ISerializerDeserializer[] mixedFields = new ISerializerDeserializer[] {
-                new UTF8StringSerializerDeserializer(), IntegerSerializerDeserializer.INSTANCE,
-                new UTF8StringSerializerDeserializer(), new UTF8StringSerializerDeserializer(),
-                IntegerSerializerDeserializer.INSTANCE };
+        ISerializerDeserializer[] mixedFields = new ISerializerDeserializer[] { new UTF8StringSerializerDeserializer(),
+                IntegerSerializerDeserializer.INSTANCE, new UTF8StringSerializerDeserializer(),
+                new UTF8StringSerializerDeserializer(), IntegerSerializerDeserializer.INSTANCE };
         testLSMBTreeTuple(mixedFields);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/util/LSMBTreeTestHarness.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/util/LSMBTreeTestHarness.java
index 80677db..803c5cb 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/util/LSMBTreeTestHarness.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-btree-test/src/test/java/org/apache/hyracks/storage/am/lsm/btree/util/LSMBTreeTestHarness.java
@@ -26,7 +26,6 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Random;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -51,9 +50,11 @@
 import org.apache.hyracks.storage.common.buffercache.IBufferCache;
 import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
 import org.apache.hyracks.test.support.TestUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class LSMBTreeTestHarness {
-    protected static final Logger LOGGER = Logger.getLogger(LSMBTreeTestHarness.class.getName());
+    protected static final Logger LOGGER = LogManager.getLogger();
 
     public static final BTreeLeafFrameType[] LEAF_FRAMES_TO_TEST =
             new BTreeLeafFrameType[] { BTreeLeafFrameType.REGULAR_NSM };
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/LSMComponentFilterReferenceTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/LSMComponentFilterReferenceTest.java
index af37d80..6ec661e 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/LSMComponentFilterReferenceTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/LSMComponentFilterReferenceTest.java
@@ -49,7 +49,7 @@
         byte[] serFilter = filter.getByteArray();
         LSMComponentFilterReference deserFilter = new LSMComponentFilterReference(
                 new TypeAwareTupleWriter((new ITypeTraits[] { IntegerPointable.TYPE_TRAITS })));
-        deserFilter.set(serFilter,0,20);
+        deserFilter.set(serFilter, 0, 20);
         Assert.assertTrue(deserFilter.isMaxTupleSet() && deserFilter.isMinTupleSet());
         Assert.assertEquals(
                 TupleUtils.deserializeTuple(deserFilter.getMinTuple(),
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/PrefixMergePolicyTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/PrefixMergePolicyTest.java
index e521b4b..2fd1dbc 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/PrefixMergePolicyTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/PrefixMergePolicyTest.java
@@ -35,8 +35,7 @@
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMMergePolicy;
 import org.apache.hyracks.storage.am.lsm.common.impls.PrefixMergePolicy;
-import org.apache.hyracks.storage.common.IModificationOperationCallback;
-import org.apache.hyracks.storage.common.ISearchOperationCallback;
+import org.apache.hyracks.storage.common.IIndexAccessParameters;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -223,8 +222,7 @@
         }).when(accessor).scheduleMerge(Mockito.any(ILSMIOOperationCallback.class),
                 Mockito.anyListOf(ILSMDiskComponent.class));
 
-        Mockito.when(index.createAccessor(Mockito.any(IModificationOperationCallback.class),
-                Mockito.any(ISearchOperationCallback.class))).thenReturn(accessor);
+        Mockito.when(index.createAccessor(Mockito.any(IIndexAccessParameters.class))).thenReturn(accessor);
 
         return index;
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/VirtualFreePageManagerTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/VirtualFreePageManagerTest.java
index f4ec55d..fd85824 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/VirtualFreePageManagerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-common-test/src/test/java/org/apache/hyracks/storage/am/lsm/common/test/VirtualFreePageManagerTest.java
@@ -35,7 +35,8 @@
 
     private final int NUM_PAGES = 100;
 
-    private void testInMemoryFreePageManager(VirtualFreePageManager virtualFreePageManager) throws HyracksDataException {
+    private void testInMemoryFreePageManager(VirtualFreePageManager virtualFreePageManager)
+            throws HyracksDataException {
         // The first two pages are reserved for the BTree's metadata page and
         // root page.
         int capacity = NUM_PAGES - 2;
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/pom.xml
index bef0fff..0ee1e59 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/pom.xml
@@ -107,6 +107,10 @@
       <artifactId>hyracks-storage-am-btree</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/LSMInvertedIndexMergeTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/LSMInvertedIndexMergeTest.java
index ca91ef4..4657109 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/LSMInvertedIndexMergeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/LSMInvertedIndexMergeTest.java
@@ -22,7 +22,7 @@
 import java.io.IOException;
 
 import org.apache.hyracks.storage.am.common.datagen.TupleGenerator;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.invertedindex.common.AbstractInvertedIndexLoadTest;
@@ -45,8 +45,8 @@
         IIndex invIndex = testCtx.getIndex();
         invIndex.create();
         invIndex.activate();
-        ILSMIndexAccessor invIndexAccessor = (ILSMIndexAccessor) invIndex.createAccessor(NoOpOperationCallback.INSTANCE,
-                NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor invIndexAccessor =
+                (ILSMIndexAccessor) invIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
         for (int i = 0; i < maxTreesToMerge; i++) {
             for (int j = 0; j < i; j++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/PartitionedLSMInvertedIndexMergeTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/PartitionedLSMInvertedIndexMergeTest.java
index f4ff9cd..584de0c 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/PartitionedLSMInvertedIndexMergeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/PartitionedLSMInvertedIndexMergeTest.java
@@ -23,7 +23,7 @@
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.datagen.TupleGenerator;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
 import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.invertedindex.common.AbstractInvertedIndexLoadTest;
@@ -47,8 +47,8 @@
         IIndex invIndex = testCtx.getIndex();
         invIndex.create();
         invIndex.activate();
-        ILSMIndexAccessor invIndexAccessor = (ILSMIndexAccessor) invIndex.createAccessor(NoOpOperationCallback.INSTANCE,
-                NoOpOperationCallback.INSTANCE);
+        ILSMIndexAccessor invIndexAccessor =
+                (ILSMIndexAccessor) invIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
 
         for (int i = 0; i < maxTreesToMerge; i++) {
             for (int j = 0; j < i; j++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexSearchTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexSearchTest.java
index d9ca1154..1a0fd87 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexSearchTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexSearchTest.java
@@ -22,8 +22,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.storage.am.common.datagen.TupleGenerator;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
@@ -35,11 +33,13 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestContext.InvertedIndexType;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 public abstract class AbstractInvertedIndexSearchTest extends AbstractInvertedIndexTest {
 
-    protected final Logger LOGGER = Logger.getLogger(AbstractInvertedIndexSearchTest.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected int NUM_DOC_QUERIES = AccessMethodTestsConfig.LSM_INVINDEX_NUM_DOC_QUERIES;
     protected int NUM_RANDOM_QUERIES = AccessMethodTestsConfig.LSM_INVINDEX_NUM_RANDOM_QUERIES;
@@ -70,7 +70,7 @@
         invIndex.validate();
 
         for (IInvertedIndexSearchModifier searchModifier : searchModifiers) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Running searches with: " + searchModifier.toString());
             }
             LSMInvertedIndexTestUtils.testIndexSearch(testCtx, tupleGen, harness.getRandom(), NUM_DOC_QUERIES,
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexTest.java
index 5197812..757c9d8 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/common/AbstractInvertedIndexTest.java
@@ -20,8 +20,6 @@
 package org.apache.hyracks.storage.am.lsm.invertedindex.common;
 
 import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.datagen.TupleGenerator;
@@ -33,11 +31,13 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestContext.InvertedIndexType;
 import org.apache.hyracks.storage.common.IIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.After;
 import org.junit.Before;
 
 public abstract class AbstractInvertedIndexTest {
-    protected final Logger LOGGER = Logger.getLogger(AbstractInvertedIndexTest.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     protected final LSMInvertedIndexTestHarness harness = new LSMInvertedIndexTestHarness();
 
@@ -74,7 +74,7 @@
      */
     protected void validateAndCheckIndex(LSMInvertedIndexTestContext testCtx) throws HyracksDataException {
         IIndex invIndex = testCtx.getIndex();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Validating index: " + invIndex);
         }
         // Validate index and compare against expected index.
@@ -92,7 +92,7 @@
     protected void runTinySearchWorkload(LSMInvertedIndexTestContext testCtx, TupleGenerator tupleGen)
             throws IOException {
         for (IInvertedIndexSearchModifier searchModifier : TEST_SEARCH_MODIFIERS) {
-            if (LOGGER.isLoggable(Level.INFO)) {
+            if (LOGGER.isInfoEnabled()) {
                 LOGGER.info("Running test workload with: " + searchModifier.toString());
             }
             LSMInvertedIndexTestUtils.testIndexSearch(testCtx, tupleGen, harness.getRandom(),
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTest.java
index e0427e8..3b2641d 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTest.java
@@ -21,8 +21,6 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.TestOperationSelector.TestOperation;
@@ -34,11 +32,13 @@
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestContext;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestContext.InvertedIndexType;
 import org.apache.hyracks.storage.am.lsm.invertedindex.util.LSMInvertedIndexTestUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.Test;
 
 public class LSMInvertedIndexMultiThreadTest {
 
-    protected final Logger LOGGER = Logger.getLogger(LSMInvertedIndexMultiThreadTest.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
 
     // Machine-specific number of threads to use for testing.
     protected final int REGULAR_NUM_THREADS = Runtime.getRuntime().availableProcessors();
@@ -60,7 +60,7 @@
 
     protected void runTest(LSMInvertedIndexTestContext testCtx, TupleGenerator tupleGen, int numThreads,
             TestWorkloadConf conf, String dataMsg) throws InterruptedException, HyracksDataException {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("LSMInvertedIndex MultiThread Test:\nData: " + dataMsg + "; Threads: " + numThreads
                     + "; Workload: " + conf.toString() + ".");
         }
@@ -75,7 +75,7 @@
         testCtx.getIndex().validate();
         driver.deinit();
 
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("LSMInvertedIndex MultiThread Test Time: " + times[0] + "ms");
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTestDriver.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTestDriver.java
index 9ae9940..bfe70e6 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTestDriver.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexMultiThreadTestDriver.java
@@ -40,6 +40,7 @@
     }
 
     public DataGenThread createDatagenThread(int numThreads, int numBatches, int batchSize) {
-        return new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, fieldGens, RANDOM_SEED, 2 * numThreads);
+        return new DataGenThread(numThreads, numBatches, batchSize, fieldSerdes, fieldGens, RANDOM_SEED,
+                2 * numThreads);
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexTestWorker.java
index ace93e0..ca06f6b 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/multithread/LSMInvertedIndexTestWorker.java
@@ -91,7 +91,7 @@
             }
 
             case POINT_SEARCH: {
-                searchCursor.reset();
+                searchCursor.close();
                 searchPred.setQueryTuple(tuple);
                 searchPred.setQueryFieldIndex(0);
                 try {
@@ -107,7 +107,7 @@
             }
 
             case SCAN: {
-                rangeSearchCursor.reset();
+                rangeSearchCursor.close();
                 accessor.rangeSearch(rangeSearchCursor, rangePred);
                 consumeCursorTuples(rangeSearchCursor);
                 break;
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramTokenizerTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramTokenizerTest.java
index 6e764c3..b536ef2 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramTokenizerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/NGramTokenizerTest.java
@@ -75,8 +75,8 @@
 
     void runTestNGramTokenizerWithCountedHashedUTF8Tokens(boolean prePost) throws IOException {
         HashedUTF8NGramTokenFactory tokenFactory = new HashedUTF8NGramTokenFactory();
-        NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(gramLength, prePost, false,
-                false, tokenFactory);
+        NGramUTF8StringBinaryTokenizer tokenizer =
+                new NGramUTF8StringBinaryTokenizer(gramLength, prePost, false, false, tokenFactory);
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
         ArrayList<String> expectedGrams = new ArrayList<String>();
@@ -124,8 +124,8 @@
 
     void runTestNGramTokenizerWithHashedUTF8Tokens(boolean prePost) throws IOException {
         HashedUTF8NGramTokenFactory tokenFactory = new HashedUTF8NGramTokenFactory();
-        NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(gramLength, prePost, true, false,
-                tokenFactory);
+        NGramUTF8StringBinaryTokenizer tokenizer =
+                new NGramUTF8StringBinaryTokenizer(gramLength, prePost, true, false, tokenFactory);
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
         ArrayList<String> expectedGrams = new ArrayList<String>();
@@ -164,8 +164,8 @@
 
     void runTestNGramTokenizerWithUTF8Tokens(boolean prePost) throws IOException {
         UTF8NGramTokenFactory tokenFactory = new UTF8NGramTokenFactory();
-        NGramUTF8StringBinaryTokenizer tokenizer = new NGramUTF8StringBinaryTokenizer(gramLength, prePost, true, false,
-                tokenFactory);
+        NGramUTF8StringBinaryTokenizer tokenizer =
+                new NGramUTF8StringBinaryTokenizer(gramLength, prePost, true, false, tokenFactory);
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
         ArrayList<String> expectedGrams = new ArrayList<String>();
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/WordTokenizerTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/WordTokenizerTest.java
index 78ba6a3..11a0b02 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/WordTokenizerTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/tokenizers/WordTokenizerTest.java
@@ -108,8 +108,8 @@
     public void testWordTokenizerWithCountedHashedUTF8Tokens() throws IOException {
 
         HashedUTF8WordTokenFactory tokenFactory = new HashedUTF8WordTokenFactory();
-        DelimitedUTF8StringBinaryTokenizer tokenizer = new DelimitedUTF8StringBinaryTokenizer(false, false,
-                tokenFactory);
+        DelimitedUTF8StringBinaryTokenizer tokenizer =
+                new DelimitedUTF8StringBinaryTokenizer(false, false, tokenFactory);
 
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
@@ -140,8 +140,8 @@
     public void testWordTokenizerWithHashedUTF8Tokens() throws IOException {
 
         HashedUTF8WordTokenFactory tokenFactory = new HashedUTF8WordTokenFactory();
-        DelimitedUTF8StringBinaryTokenizer tokenizer = new DelimitedUTF8StringBinaryTokenizer(true, false,
-                tokenFactory);
+        DelimitedUTF8StringBinaryTokenizer tokenizer =
+                new DelimitedUTF8StringBinaryTokenizer(true, false, tokenFactory);
 
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
@@ -172,8 +172,8 @@
     public void testWordTokenizerWithUTF8Tokens() throws IOException {
 
         UTF8WordTokenFactory tokenFactory = new UTF8WordTokenFactory();
-        DelimitedUTF8StringBinaryTokenizer tokenizer = new DelimitedUTF8StringBinaryTokenizer(true, false,
-                tokenFactory);
+        DelimitedUTF8StringBinaryTokenizer tokenizer =
+                new DelimitedUTF8StringBinaryTokenizer(true, false, tokenFactory);
 
         tokenizer.reset(inputBuffer, 0, inputBuffer.length);
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/LSMInvertedIndexTestUtils.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/LSMInvertedIndexTestUtils.java
index 0ff25b5..5902e62 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/LSMInvertedIndexTestUtils.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-invertedindex-test/src/test/java/org/apache/hyracks/storage/am/lsm/invertedindex/util/LSMInvertedIndexTestUtils.java
@@ -54,7 +54,7 @@
 import org.apache.hyracks.storage.am.common.datagen.PersonNameFieldValueGenerator;
 import org.apache.hyracks.storage.am.common.datagen.SortedIntegerFieldValueGenerator;
 import org.apache.hyracks.storage.am.common.datagen.TupleGenerator;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.tuples.PermutingTupleReference;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedIndex;
 import org.apache.hyracks.storage.am.lsm.invertedindex.api.IInvertedIndexAccessor;
@@ -257,8 +257,8 @@
         IInvertedIndex invIndex = (IInvertedIndex) testCtx.getIndex();
         int tokenFieldCount = invIndex.getTokenTypeTraits().length;
         int invListFieldCount = invIndex.getInvListTypeTraits().length;
-        IInvertedIndexAccessor invIndexAccessor = (IInvertedIndexAccessor) invIndex
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IInvertedIndexAccessor invIndexAccessor =
+                (IInvertedIndexAccessor) invIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         IIndexCursor invIndexCursor = invIndexAccessor.createRangeSearchCursor();
         MultiComparator tokenCmp = MultiComparator.create(invIndex.getTokenCmpFactories());
         IBinaryComparatorFactory[] tupleCmpFactories =
@@ -298,7 +298,7 @@
                 fail("Indexes do not match. Actual index contains too many entries.");
             }
         } finally {
-            invIndexCursor.close();
+            invIndexCursor.destroy();
         }
     }
 
@@ -490,8 +490,8 @@
             int numDocQueries, int numRandomQueries, IInvertedIndexSearchModifier searchModifier, int[] scanCountArray)
             throws IOException, HyracksDataException {
         IInvertedIndex invIndex = testCtx.invIndex;
-        IInvertedIndexAccessor accessor = (IInvertedIndexAccessor) invIndex
-                .createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IInvertedIndexAccessor accessor =
+                (IInvertedIndexAccessor) invIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         IBinaryTokenizer tokenizer = testCtx.getTokenizerFactory().createTokenizer();
         InvertedIndexSearchPredicate searchPred = new InvertedIndexSearchPredicate(tokenizer, searchModifier);
         List<ITupleReference> documentCorpus = testCtx.getDocumentCorpus();
@@ -574,7 +574,7 @@
                     }
                 }
             } finally {
-                resultCursor.close();
+                resultCursor.destroy();
             }
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/pom.xml
index 50fb469..1e0b4ba 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/pom.xml
@@ -98,5 +98,9 @@
       <artifactId>hyracks-data-std</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/AbstractLSMRTreeExamplesTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/AbstractLSMRTreeExamplesTest.java
index 55aa2c2..00b3d28 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/AbstractLSMRTreeExamplesTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/AbstractLSMRTreeExamplesTest.java
@@ -34,7 +34,7 @@
 import org.apache.hyracks.dataflow.common.utils.TupleUtils;
 import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory;
 import org.apache.hyracks.storage.am.common.api.ITreeIndex;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.rtree.AbstractRTreeExamplesTest;
 import org.apache.hyracks.storage.am.rtree.frames.RTreePolicyType;
 import org.apache.hyracks.storage.am.rtree.util.RTreeUtils;
@@ -48,7 +48,7 @@
      */
     @Test
     public void additionalFilteringingExample() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Testing LSMRTree or LSMRTreeWithAntiMatterTuples component filters.");
         }
 
@@ -116,13 +116,12 @@
         treeIndex.activate();
 
         long start = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("Inserting into tree...");
         }
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        IIndexAccessor indexAccessor =
-                treeIndex.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        IIndexAccessor indexAccessor = treeIndex.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         int numInserts = 10000;
         for (int i = 0; i < numInserts; i++) {
             int p1x = rnd.nextInt();
@@ -144,7 +143,7 @@
             }
         }
         long end = System.currentTimeMillis();
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info(numInserts + " inserts in " + (end - start) + "ms");
         }
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesDeleteTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesDeleteTest.java
index a4d67a9..581dbf7 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesDeleteTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/LSMRTreeWithAntiMatterTuplesDeleteTest.java
@@ -25,6 +25,8 @@
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.storage.am.common.api.IPrimitiveValueProviderFactory;
 import org.apache.hyracks.storage.am.config.AccessMethodTestsConfig;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndex;
+import org.apache.hyracks.storage.am.lsm.common.api.ILSMIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.rtree.util.LSMRTreeTestHarness;
 import org.apache.hyracks.storage.am.lsm.rtree.util.LSMRTreeWithAntiMatterTuplesTestContext;
 import org.apache.hyracks.storage.am.rtree.AbstractRTreeDeleteTest;
@@ -63,6 +65,22 @@
     }
 
     @Override
+    protected void afterDeleteRound(AbstractRTreeTestContext ctx) throws HyracksDataException {
+        flush(ctx);
+    }
+
+    @Override
+    protected void afterInsertRound(AbstractRTreeTestContext ctx) throws HyracksDataException {
+        flush(ctx);
+    }
+
+    protected void flush(AbstractRTreeTestContext ctx) throws HyracksDataException {
+        ILSMIndex lsmIndex = (ILSMIndex) ctx.getIndex();
+        ILSMIndexAccessor accessor = (ILSMIndexAccessor) ctx.getIndexAccessor();
+        accessor.scheduleFlush(lsmIndex.getIOOperationCallback());
+    }
+
+    @Override
     protected Random getRandom() {
         return harness.getRandom();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/AbstractLSMRTreeTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/AbstractLSMRTreeTestWorker.java
index 22021bd..081ef7a45 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/AbstractLSMRTreeTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/AbstractLSMRTreeTestWorker.java
@@ -83,7 +83,7 @@
                 cursor.next();
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeTestWorker.java
index 6482565..2a14780 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeTestWorker.java
@@ -33,6 +33,7 @@
 import org.apache.hyracks.storage.am.lsm.rtree.impls.LSMRTreeOpContext;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
 
 public class LSMRTreeTestWorker extends AbstractIndexTestWorker {
@@ -53,7 +54,7 @@
     @Override
     public void performOp(ITupleReference tuple, TestOperation op) throws HyracksDataException {
         LSMRTreeAccessor accessor = (LSMRTreeAccessor) indexAccessor;
-        ITreeIndexCursor searchCursor = accessor.createSearchCursor(false);
+        IIndexCursor searchCursor = accessor.createSearchCursor(false);
         LSMRTreeOpContext concreteCtx = (LSMRTreeOpContext) accessor.getCtx();
         MultiComparator cmp = concreteCtx.getCurrentRTreeOpContext().getCmp();
         SearchPredicate rangePred = new SearchPredicate(tuple, cmp);
@@ -70,7 +71,7 @@
                 break;
 
             case SCAN:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setSearchKey(null);
                 accessor.search(searchCursor, rangePred);
                 consumeCursorTuples(searchCursor);
@@ -122,7 +123,7 @@
                 cursor.next();
             }
         } finally {
-            cursor.close();
+            cursor.destroy();
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeWithAntiMatterTuplesTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeWithAntiMatterTuplesTestWorker.java
index f49fdbf..653677c 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeWithAntiMatterTuplesTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/multithread/LSMRTreeWithAntiMatterTuplesTestWorker.java
@@ -23,13 +23,13 @@
 import org.apache.hyracks.dataflow.common.data.accessors.ITupleReference;
 import org.apache.hyracks.storage.am.common.TestOperationSelector;
 import org.apache.hyracks.storage.am.common.TestOperationSelector.TestOperation;
-import org.apache.hyracks.storage.am.common.api.ITreeIndexCursor;
 import org.apache.hyracks.storage.am.common.datagen.DataGenThread;
 import org.apache.hyracks.storage.am.lsm.common.impls.LSMTreeIndexAccessor;
 import org.apache.hyracks.storage.am.lsm.rtree.impls.AbstractLSMRTree;
 import org.apache.hyracks.storage.am.lsm.rtree.impls.LSMRTreeOpContext;
 import org.apache.hyracks.storage.am.rtree.impls.SearchPredicate;
 import org.apache.hyracks.storage.common.IIndex;
+import org.apache.hyracks.storage.common.IIndexCursor;
 import org.apache.hyracks.storage.common.MultiComparator;
 
 public class LSMRTreeWithAntiMatterTuplesTestWorker extends AbstractLSMRTreeTestWorker {
@@ -42,7 +42,7 @@
     @Override
     public void performOp(ITupleReference tuple, TestOperation op) throws HyracksDataException {
         LSMTreeIndexAccessor accessor = (LSMTreeIndexAccessor) indexAccessor;
-        ITreeIndexCursor searchCursor = accessor.createSearchCursor(false);
+        IIndexCursor searchCursor = accessor.createSearchCursor(false);
         LSMRTreeOpContext concreteCtx = (LSMRTreeOpContext) accessor.getCtx();
         MultiComparator cmp = concreteCtx.getCurrentRTreeOpContext().getCmp();
         SearchPredicate rangePred = new SearchPredicate(tuple, cmp);
@@ -59,7 +59,7 @@
                 break;
 
             case SCAN:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setSearchKey(null);
                 accessor.search(searchCursor, rangePred);
                 consumeCursorTuples(searchCursor);
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestHarness.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestHarness.java
index fd910e1..8a5d0c5 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestHarness.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-lsm-rtree-test/src/test/java/org/apache/hyracks/storage/am/lsm/rtree/util/LSMRTreeTestHarness.java
@@ -26,7 +26,6 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Random;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
@@ -52,7 +51,6 @@
 import org.apache.hyracks.test.support.TestUtils;
 
 public class LSMRTreeTestHarness {
-    protected static final Logger LOGGER = Logger.getLogger(LSMRTreeTestHarness.class.getName());
 
     private static final long RANDOM_SEED = 50;
 
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/pom.xml
index c943bd5..947debc 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/pom.xml
@@ -86,5 +86,9 @@
       <artifactId>hyracks-data-std</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/RTreeSearchCursorTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/RTreeSearchCursorTest.java
index 31d54ae..15f69bc 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/RTreeSearchCursorTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/RTreeSearchCursorTest.java
@@ -21,7 +21,6 @@
 
 import java.util.ArrayList;
 import java.util.Random;
-import java.util.logging.Level;
 
 import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory;
 import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
@@ -42,7 +41,7 @@
 import org.apache.hyracks.storage.am.common.api.ITreeIndexMetadataFrameFactory;
 import org.apache.hyracks.storage.am.common.frames.LIFOMetaDataFrameFactory;
 import org.apache.hyracks.storage.am.common.freepage.LinkedMetaDataPageManager;
-import org.apache.hyracks.storage.am.common.impls.NoOpOperationCallback;
+import org.apache.hyracks.storage.am.common.impls.NoOpIndexAccessParameters;
 import org.apache.hyracks.storage.am.common.util.HashMultiSet;
 import org.apache.hyracks.storage.am.rtree.api.IRTreeInteriorFrame;
 import org.apache.hyracks.storage.am.rtree.api.IRTreeLeafFrame;
@@ -78,7 +77,7 @@
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Test
     public void rangeSearchTest() throws Exception {
-        if (LOGGER.isLoggable(Level.INFO)) {
+        if (LOGGER.isInfoEnabled()) {
             LOGGER.info("TESTING RANGE SEARCH CURSOR FOR RTREE");
         }
 
@@ -128,8 +127,7 @@
 
         ArrayTupleBuilder tb = new ArrayTupleBuilder(fieldCount);
         ArrayTupleReference tuple = new ArrayTupleReference();
-        ITreeIndexAccessor indexAccessor =
-                rtree.createAccessor(NoOpOperationCallback.INSTANCE, NoOpOperationCallback.INSTANCE);
+        ITreeIndexAccessor indexAccessor = rtree.createAccessor(NoOpIndexAccessParameters.INSTANCE);
         int numInserts = 10000;
         ArrayList<RTreeCheckTuple> checkTuples = new ArrayList<>();
         for (int i = 0; i < numInserts; i++) {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/multithread/RTreeTestWorker.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/multithread/RTreeTestWorker.java
index cf2fa77..9d2d59e 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/multithread/RTreeTestWorker.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/multithread/RTreeTestWorker.java
@@ -69,14 +69,14 @@
                 break;
 
             case SCAN:
-                searchCursor.reset();
+                searchCursor.close();
                 rangePred.setSearchKey(null);
                 accessor.search(searchCursor, rangePred);
                 consumeCursorTuples(searchCursor);
                 break;
 
             case DISKORDER_SCAN:
-                diskOrderScanCursor.reset();
+                diskOrderScanCursor.close();
                 accessor.diskOrderScan(diskOrderScanCursor);
                 consumeCursorTuples(diskOrderScanCursor);
                 break;
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/utils/AbstractRTreeTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/utils/AbstractRTreeTest.java
index 1e49e8a..ed94bf3 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/utils/AbstractRTreeTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-am-rtree-test/src/test/java/org/apache/hyracks/storage/am/rtree/utils/AbstractRTreeTest.java
@@ -19,14 +19,14 @@
 
 package org.apache.hyracks.storage.am.rtree.utils;
 
-import java.util.logging.Logger;
-
 import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.After;
 import org.junit.Before;
 
 public abstract class AbstractRTreeTest {
-    protected final Logger LOGGER = Logger.getLogger(RTreeTestHarness.class.getName());
+    protected final Logger LOGGER = LogManager.getLogger();
     protected final RTreeTestHarness harness;
 
     public AbstractRTreeTest() {
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/pom.xml b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/pom.xml
index 46b5891..1139799 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/pom.xml
@@ -68,5 +68,13 @@
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
index 26ad457..f94914c 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/BufferCacheTest.java
@@ -26,8 +26,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.commons.lang3.mutable.Mutable;
+import org.apache.commons.lang3.mutable.MutableObject;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 import org.apache.hyracks.api.exceptions.HyracksException;
@@ -39,11 +46,15 @@
 import org.apache.hyracks.storage.common.file.BufferedFileHandle;
 import org.apache.hyracks.test.support.TestStorageManagerComponentHolder;
 import org.apache.hyracks.test.support.TestUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class BufferCacheTest {
+    private static final Logger LOGGER = LogManager.getLogger();
     protected static final List<String> openedFiles = new ArrayList<>();
     protected static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("ddMMyy-hhmmssSS");
 
@@ -62,6 +73,102 @@
     }
 
     @Test
+    public void interruptPinTest() throws Exception {
+        /*
+         * This test will create a buffer cache of a small size (4 pages)
+         * and then will create a file of size = 16 pages and have 4 threads
+         * pin and unpin the pages one by one. and another thread interrupts them
+         * for some time.. It then will close the file and ensure that all the pages are
+         * unpinned and that no problems are found
+         */
+        final int bufferCacheNumPages = 4;
+        TestStorageManagerComponentHolder.init(PAGE_SIZE, bufferCacheNumPages, MAX_OPEN_FILES);
+        IIOManager ioManager = TestStorageManagerComponentHolder.getIOManager();
+        IBufferCache bufferCache =
+                TestStorageManagerComponentHolder.getBufferCache(ctx.getJobletContext().getServiceContext());
+        final long duration = TimeUnit.SECONDS.toMillis(20);
+        final String fileName = getFileName();
+        final FileReference file = ioManager.resolve(fileName);
+        final int fileId = bufferCache.createFile(file);
+        final int numPages = 16;
+        bufferCache.openFile(fileId);
+        for (int i = 0; i < numPages; i++) {
+            long dpid = BufferedFileHandle.getDiskPageId(fileId, i);
+            ICachedPage page = bufferCache.confiscatePage(dpid);
+            page.getBuffer().putInt(0, i);
+            bufferCache.createFIFOQueue().put(page);
+        }
+        bufferCache.finishQueue();
+        bufferCache.closeFile(fileId);
+        ExecutorService executor = Executors.newFixedThreadPool(bufferCacheNumPages);
+        MutableObject<Thread>[] readers = new MutableObject[bufferCacheNumPages];
+        Future<Void>[] futures = new Future[bufferCacheNumPages];
+        for (int i = 0; i < bufferCacheNumPages; i++) {
+            readers[i] = new MutableObject<>();
+            final int threadNumber = i;
+            futures[i] = executor.submit(new Callable<Void>() {
+                @Override
+                public Void call() throws Exception {
+                    synchronized (readers[threadNumber]) {
+                        readers[threadNumber].setValue(Thread.currentThread());
+                        readers[threadNumber].notifyAll();
+                    }
+                    // for duration, just read the pages one by one.
+                    // At the end, close the file
+                    bufferCache.openFile(fileId);
+                    final long start = System.currentTimeMillis();
+                    int pageNumber = 0;
+                    int totalReads = 0;
+                    int successfulReads = 0;
+                    int interruptedReads = 0;
+                    while (System.currentTimeMillis() - start < duration) {
+                        totalReads++;
+                        pageNumber = (pageNumber + 1) % numPages;
+                        try {
+                            long dpid = BufferedFileHandle.getDiskPageId(fileId, pageNumber);
+                            ICachedPage page = bufferCache.pin(dpid, false);
+                            successfulReads++;
+                            bufferCache.unpin(page);
+                        } catch (HyracksDataException hde) {
+                            interruptedReads++;
+                            // clear
+                            Thread.interrupted();
+                        }
+                    }
+                    bufferCache.closeFile(fileId);
+                    LOGGER.log(Level.INFO, "Total reads = " + totalReads + " Successful Reads = " + successfulReads
+                            + " Interrupted Reads = " + interruptedReads);
+                    return null;
+                }
+            });
+        }
+
+        for (int i = 0; i < bufferCacheNumPages; i++) {
+            synchronized (readers[i]) {
+                while (readers[i].getValue() == null) {
+                    readers[i].wait();
+                }
+            }
+        }
+        final long start = System.currentTimeMillis();
+
+        while (System.currentTimeMillis() - start < duration) {
+            for (int i = 0; i < bufferCacheNumPages; i++) {
+                readers[i].getValue().interrupt();
+            }
+            Thread.sleep(25); // NOSONAR Sleep so some reads are successful
+        }
+        try {
+            for (int i = 0; i < bufferCacheNumPages; i++) {
+                futures[i].get();
+            }
+        } finally {
+            bufferCache.deleteFile(fileId);
+            bufferCache.close();
+        }
+    }
+
+    @Test
     public void simpleOpenPinCloseTest() throws HyracksException {
         TestStorageManagerComponentHolder.init(PAGE_SIZE, NUM_PAGES, MAX_OPEN_FILES);
         IBufferCache bufferCache =
diff --git a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/IOManagerPathTest.java b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/IOManagerPathTest.java
index 3d6e3ef..e2a875b 100644
--- a/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/IOManagerPathTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-tests/hyracks-storage-common-test/src/test/java/org/apache/hyracks/storage/common/IOManagerPathTest.java
@@ -38,8 +38,8 @@
     public void testPrefixNames() throws HyracksDataException {
         IODeviceHandle shorter = new IODeviceHandle(new File("/tmp/tst/1"), "storage");
         IODeviceHandle longer = new IODeviceHandle(new File("/tmp/tst/11"), "storage");
-        IOManager ioManager = new IOManager(Arrays.asList(new IODeviceHandle[] { shorter, longer }),
-                new DefaultDeviceResolver());
+        IOManager ioManager =
+                new IOManager(Arrays.asList(new IODeviceHandle[] { shorter, longer }), new DefaultDeviceResolver());
         FileReference f = ioManager.resolveAbsolutePath("/tmp/tst/11/storage/Foo_idx_foo/my_btree");
         Assert.assertEquals("/tmp/tst/11/storage/Foo_idx_foo/my_btree", f.getAbsolutePath());
     }
@@ -48,8 +48,8 @@
     public void testDuplicates() throws HyracksDataException {
         IODeviceHandle first = new IODeviceHandle(new File("/tmp/tst/1"), "storage");
         IODeviceHandle second = new IODeviceHandle(new File("/tmp/tst/1"), "storage");
-        IOManager ioManager = new IOManager(Arrays.asList(new IODeviceHandle[] { first, second }),
-                new DefaultDeviceResolver());
+        IOManager ioManager =
+                new IOManager(Arrays.asList(new IODeviceHandle[] { first, second }), new DefaultDeviceResolver());
     }
 
     @After
diff --git a/hyracks-fullstack/hyracks/hyracks-util/pom.xml b/hyracks-fullstack/hyracks/hyracks-util/pom.xml
index 230b545..212673e 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/pom.xml
+++ b/hyracks-fullstack/hyracks/hyracks-util/pom.xml
@@ -71,6 +71,18 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-collections4</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+    </dependency>
+      <dependency>
+          <groupId>commons-io</groupId>
+          <artifactId>commons-io</artifactId>
+      </dependency>
   </dependencies>
 
 </project>
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/DiskUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/DiskUtil.java
index 9a65d72..a1f9346 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/DiskUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/DiskUtil.java
@@ -24,14 +24,15 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.commons.lang3.SystemUtils;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class DiskUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(DiskUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private DiskUtil() {
         throw new AssertionError("Util class should not be initialized.");
@@ -119,7 +120,7 @@
                     LOGGER.info(line);
                 }
             } catch (IOException e) {
-                LOGGER.log(Level.WARNING, e.getMessage(), e);
+                LOGGER.log(Level.WARN, e.getMessage(), e);
             }
         }).start();
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
index b039227..c54c9dc 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/ExitUtil.java
@@ -18,12 +18,13 @@
  */
 package org.apache.hyracks.util;
 
-import java.util.logging.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 @SuppressWarnings("squid:S1147")
 public class ExitUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(ExitUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final ExitThread exitThread = new ExitThread();
 
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/InvokeUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/InvokeUtil.java
new file mode 100644
index 0000000..b8d8ce4
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/InvokeUtil.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.util;
+
+import java.io.IOException;
+import java.nio.channels.ClosedByInterruptException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class InvokeUtil {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private InvokeUtil() {
+    }
+
+    /**
+     * Executes the passed interruptible, retrying if the operation is interrupted. Once the interruptible
+     * completes, the current thread will be re-interrupted, if the original operation was interrupted.
+     */
+    public static void doUninterruptibly(Interruptible interruptible) {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    interruptible.run();
+                    break;
+                } catch (InterruptedException e) { // NOSONAR- we will re-interrupt the thread during unwind
+                    interrupted = true;
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * Executes the passed interruptible, retrying if the operation is interrupted. Once the interruptible
+     * completes, the current thread will be re-interrupted, if the original operation was interrupted.
+     */
+    public static void doExUninterruptibly(ThrowingInterruptible interruptible) throws Exception {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    interruptible.run();
+                    break;
+                } catch (InterruptedException e) { // NOSONAR- we will re-interrupt the thread during unwind
+                    interrupted = true;
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * Executes the passed interruptible, retrying if the operation is interrupted.
+     *
+     * @return true if the original operation was interrupted, otherwise false
+     */
+    public static boolean doUninterruptiblyGet(Interruptible interruptible) {
+        boolean interrupted = false;
+        while (true) {
+            try {
+                interruptible.run();
+                break;
+            } catch (InterruptedException e) { // NOSONAR- contract states caller must handle
+                interrupted = true;
+            }
+        }
+        return interrupted;
+    }
+
+    /**
+     * Executes the passed interruptible, retrying if the operation is interrupted. If the operation throws an
+     * exception after being previously interrupted, the current thread will be re-interrupted.
+     *
+     * @return true if the original operation was interrupted, otherwise false
+     */
+    public static boolean doExUninterruptiblyGet(ThrowingInterruptible interruptible) throws Exception {
+        boolean interrupted = false;
+        boolean success = false;
+        while (true) {
+            try {
+                interruptible.run();
+                success = true;
+                break;
+            } catch (InterruptedException e) { // NOSONAR- contract states caller must handle
+                interrupted = true;
+            } finally {
+                if (!success && interrupted) {
+                    Thread.currentThread().interrupt();
+                }
+            }
+        }
+        return interrupted;
+    }
+
+    public static boolean retryLoop(long duration, TimeUnit durationUnit, long delay, TimeUnit delayUnit,
+            Callable<Boolean> function) throws IOException {
+        long endTime = System.nanoTime() + durationUnit.toNanos(duration);
+        boolean first = true;
+        while (endTime - System.nanoTime() > 0) {
+            if (first) {
+                first = false;
+            } else {
+                try {
+                    delayUnit.sleep(delay);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    return false;
+                }
+            }
+            try {
+                if (function.call()) {
+                    return true;
+                }
+            } catch (Exception e) {
+                // ignore, retry after delay
+                LOGGER.log(Level.DEBUG, "Ignoring exception on retryLoop attempt, will retry after delay", e);
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Executes the passed interruptible, retrying if the operation fails due to {@link ClosedByInterruptException} or
+     * {@link InterruptedException}. Once the interruptible completes, the current thread will be re-interrupted, if
+     * the original operation was interrupted.
+     */
+    public static void doIoUninterruptibly(ThrowingIOInterruptible interruptible) throws IOException {
+        boolean interrupted = false;
+        try {
+            while (true) {
+                try {
+                    interruptible.run();
+                    break;
+                } catch (ClosedByInterruptException | InterruptedException e) {
+                    LOGGER.error("IO operation Interrupted. Retrying..", e);
+                    interrupted = true;
+                    Thread.interrupted();
+                }
+            }
+        } finally {
+            if (interrupted) {
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    @FunctionalInterface
+    public interface Interruptible {
+        void run() throws InterruptedException;
+    }
+
+    @FunctionalInterface
+    public interface ThrowingInterruptible {
+        void run() throws Exception; // NOSONAR
+    }
+
+    @FunctionalInterface
+    public interface ThrowingIOInterruptible {
+        void run() throws IOException, InterruptedException;
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java
index dcdf140..158ab66 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/JSONUtil.java
@@ -23,7 +23,9 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -34,7 +36,7 @@
 
 public class JSONUtil {
 
-    private static final Logger LOGGER = Logger.getLogger(JSONUtil.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private static final String INDENT = "\t";
 
@@ -63,8 +65,8 @@
         try {
             return appendObj(new StringBuilder(), om.readTree(str), initialIndent).toString();
         } catch (IOException e) {
-            LOGGER.finest(String.valueOf(e));
-            LOGGER.finest("Could not indent JSON string, returning the input string: " + str);
+            LOGGER.trace(String.valueOf(e));
+            LOGGER.trace("Could not indent JSON string, returning the input string: " + str);
             return str;
         }
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Log4j2Monitor.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Log4j2Monitor.java
new file mode 100644
index 0000000..34751b8
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/Log4j2Monitor.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hyracks.util;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.nio.CharBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.WriterAppender;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+
+public class Log4j2Monitor {
+
+    private static final List<String> logs = new ArrayList<>();
+
+    private Log4j2Monitor() {
+    }
+
+    public static void start() {
+        final LoggerContext context = LoggerContext.getContext(false);
+        final Appender appender = WriterAppender.createAppender(null, null, new LogWriter(), "MEMORY", false, true);
+        appender.start();
+        final Configuration config = context.getConfiguration();
+        config.addAppender(appender);
+        for (final LoggerConfig loggerConfig : config.getLoggers().values()) {
+            loggerConfig.addAppender(appender, null, null);
+        }
+        config.getRootLogger().addAppender(appender, Level.ALL, null);
+        context.updateLoggers();
+    }
+
+    public static long count(String message) {
+        return logs.stream().filter(log -> log.contains(message)).count();
+    }
+
+    public static void reset() {
+        logs.clear();
+    }
+
+    public static List<String> getLogs() {
+        return logs;
+    }
+
+    private static class LogWriter extends Writer {
+
+        @Override
+        public void write(char[] buffer, int off, int len) {
+            logs.add(CharBuffer.wrap(buffer, off, len).toString());
+        }
+
+        @Override
+        public void flush() {
+            // no op
+        }
+
+        @Override
+        public void close() throws IOException {
+            // no op
+        }
+    }
+}
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/LoggingConfigUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/LoggingConfigUtil.java
new file mode 100644
index 0000000..a98c241
--- /dev/null
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/LoggingConfigUtil.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hyracks.util;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.core.config.LoggerConfig;
+
+public class LoggingConfigUtil {
+
+    private static final Logger LOGGER = LogManager.getLogger();
+
+    private LoggingConfigUtil() {
+    }
+
+    public static void defaultIfMissing(String logger, Level defaultLvl) {
+        final Configuration loggingConfig = LoggerContext.getContext().getConfiguration();
+        final LoggerConfig loggerConfig = loggingConfig.getLoggers().get(logger);
+        if (loggerConfig != null) {
+            LOGGER.info("{} log level is {}", logger, loggerConfig.getLevel());
+        } else {
+            LOGGER.info("Setting {} log level to {}", logger, defaultLvl);
+            Configurator.setLevel(logger, defaultLvl);
+        }
+    }
+}
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/MathUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/MathUtil.java
index 2b157e4..2581934 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/MathUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/MathUtil.java
@@ -20,6 +20,10 @@
 package org.apache.hyracks.util;
 
 public class MathUtil {
+
+    private MathUtil() {
+    }
+
     /**
      * Fast way to calculate the log2(x). Note: x should be >= 1.
      *
@@ -44,7 +48,7 @@
             log |= 4;
         }
 
-        if (n > 0b11) {
+        if (n > 3) {
             n >>>= 2;
             log |= 2;
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/PidHelper.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/PidHelper.java
index 410097e..5a8edbd 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/PidHelper.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/PidHelper.java
@@ -22,12 +22,14 @@
 import java.lang.management.RuntimeMXBean;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class PidHelper {
 
-    private static final Logger LOGGER = Logger.getLogger(PidHelper.class.getName());
+    private static final Logger LOGGER = LogManager.getLogger();
 
     private PidHelper() {
     }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/RuntimeLogsMonitor.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/RuntimeLogsMonitor.java
deleted file mode 100644
index d2eb7fd..0000000
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/RuntimeLogsMonitor.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.hyracks.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-/**
- * RuntimeLogsMonitor is used to store the generated runtime logs in-memory
- * and provides API to search the stored logs.
- */
-public class RuntimeLogsMonitor {
-
-    private static final InMemoryHandler IN_MEMORY_HANDLER = new InMemoryHandler();
-    private static final List<Logger> MONITORED_LOGGERS = new ArrayList<>();
-    private static List<LogRecord> logs;
-
-    private RuntimeLogsMonitor() {
-        reset();
-    }
-
-    /**
-     * Starts monitoring the logger by storing its generated logs in-memory. By default
-     * only logs with level WARNING and above are stored
-     *
-     * @param loggerName
-     */
-    public static void monitor(String loggerName) {
-        final Logger logger = Logger.getLogger(loggerName);
-        for (Handler handler : logger.getHandlers()) {
-            if (handler == IN_MEMORY_HANDLER) {
-                return;
-            }
-        }
-        MONITORED_LOGGERS.add(logger);
-        Logger.getLogger(loggerName).addHandler(IN_MEMORY_HANDLER);
-    }
-
-    /**
-     * Discards any stored logs
-     */
-    public static void reset() {
-        logs = new ArrayList<>();
-    }
-
-    /**
-     * Calculates the count based on {@code logRecord} level and message.
-     * if any stored log has the same level as {@code logRecord} and
-     * the log's message contains {@code logRecord} message, it is considered
-     * as an occurrence
-     *
-     * @param logRecord
-     * @return The number of found logs that match {@code logRecord}
-     */
-    public static long count(LogRecord logRecord) {
-        return logs.stream()
-                .filter(storedLog -> storedLog.getLevel().equals(logRecord.getLevel()) && storedLog.getMessage()
-                        .contains(logRecord.getMessage())).count();
-    }
-
-    /**
-     * Sets the stored logs minimum level
-     *
-     * @param lvl
-     */
-    public static void setLevel(Level lvl) {
-        IN_MEMORY_HANDLER.setLevel(lvl);
-    }
-
-    /**
-     * Stops monitoring any monitored loggers and discards any
-     * stored logs
-     */
-    public static void stop() {
-        for (Logger logger : MONITORED_LOGGERS) {
-            logger.removeHandler(IN_MEMORY_HANDLER);
-        }
-        reset();
-        MONITORED_LOGGERS.clear();
-    }
-
-    private static class InMemoryHandler extends Handler {
-        private InMemoryHandler() {
-            super.setLevel(Level.WARNING);
-            setFilter(record -> record.getLevel().intValue() >= getLevel().intValue());
-        }
-
-        @Override
-        public void publish(LogRecord lr) {
-            if (isLoggable(lr)) {
-                logs.add(lr);
-            }
-        }
-
-        @Override
-        public void flush() {
-            // nothing to flush
-        }
-
-        @Override
-        public void close() {
-            // nothing to close
-        }
-    }
-}
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
index dbfe6f9..e4969f0 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/StorageUtil.java
@@ -166,7 +166,7 @@
             return bytes + " B";
         }
         final int baseValue = (63 - Long.numberOfLeadingZeros(bytes)) / 10;
-        final char bytePrefix = " kMGTPE" .charAt(baseValue);
+        final char bytePrefix = " kMGTPE".charAt(baseValue);
         final long divisor = 1L << (baseValue * 10);
         if (bytes % divisor == 0) {
             return String.format("%d %sB", bytes / divisor, bytePrefix);
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Parser.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Parser.java
index 257daee..9f527e97 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Parser.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Parser.java
@@ -152,7 +152,7 @@
             break;
         }
 
-        j++;    // text.charAt(j) is now at some base64 char, so +1 to make it the size
+        j++; // text.charAt(j) is now at some base64 char, so +1 to make it the size
         int padSize = length - j;
         if (padSize > 2) // something is wrong with base64. be safe and go with the upper bound
         {
@@ -180,7 +180,7 @@
             break;
         }
 
-        j++;    // text.charAt(j) is now at some base64 char, so +1 to make it the size
+        j++; // text.charAt(j) is now at some base64 char, so +1 to make it the size
         int padSize = length - j;
         if (padSize > 2) // something is wrong with base64. be safe and go with the upper bound
         {
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Printer.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Printer.java
index 0e1c078..65557b1 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Printer.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/Base64Printer.java
@@ -34,12 +34,8 @@
         int i;
         for (i = offset; remaining >= 3; remaining -= 3, i += 3) {
             appendable.append(encode(input[i] >> 2));
-            appendable.append(encode(
-                    ((input[i] & 0x3) << 4)
-                            | ((input[i + 1] >> 4) & 0xF)));
-            appendable.append(encode(
-                    ((input[i + 1] & 0xF) << 2)
-                            | ((input[i + 2] >> 6) & 0x3)));
+            appendable.append(encode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF)));
+            appendable.append(encode(((input[i + 1] & 0xF) << 2) | ((input[i + 2] >> 6) & 0x3)));
             appendable.append(encode(input[i + 2] & 0x3F));
         }
         // encode when exactly 1 element (left) to encode
@@ -52,8 +48,7 @@
         // encode when exactly 2 elements (left) to encode
         if (remaining == 2) {
             appendable.append(encode(input[i] >> 2));
-            appendable.append(encode(((input[i] & 0x3) << 4)
-                    | ((input[i + 1] >> 4) & 0xF)));
+            appendable.append(encode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF)));
             appendable.append(encode((input[i + 1] & 0xF) << 2));
             appendable.append('=');
         }
@@ -73,12 +68,8 @@
         int i;
         for (i = offset; remaining >= 3; remaining -= 3, i += 3) {
             buf[ptr++] = encode(input[i] >> 2);
-            buf[ptr++] = encode(
-                    ((input[i] & 0x3) << 4)
-                            | ((input[i + 1] >> 4) & 0xF));
-            buf[ptr++] = encode(
-                    ((input[i + 1] & 0xF) << 2)
-                            | ((input[i + 2] >> 6) & 0x3));
+            buf[ptr++] = encode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF));
+            buf[ptr++] = encode(((input[i + 1] & 0xF) << 2) | ((input[i + 2] >> 6) & 0x3));
             buf[ptr++] = encode(input[i + 2] & 0x3F);
         }
         // encode when exactly 1 element (left) to encode
@@ -91,8 +82,7 @@
         // encode when exactly 2 elements (left) to encode
         if (remaining == 2) {
             buf[ptr++] = encode(input[i] >> 2);
-            buf[ptr++] = encode(((input[i] & 0x3) << 4)
-                    | ((input[i + 1] >> 4) & 0xF));
+            buf[ptr++] = encode(((input[i] & 0x3) << 4) | ((input[i + 1] >> 4) & 0xF));
             buf[ptr++] = encode((input[i + 1] & 0xF) << 2);
             buf[ptr++] = '=';
         }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/HexParser.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/HexParser.java
index ba7276b..46bc0a4 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/HexParser.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/bytes/HexParser.java
@@ -21,9 +21,7 @@
 
 public class HexParser {
     public static boolean isValidHexChar(char c) {
-        if (c >= '0' && c <= '9'
-                || c >= 'a' && c <= 'f'
-                || c >= 'A' && c <= 'F') {
+        if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F') {
             return true;
         }
         return false;
@@ -79,19 +77,17 @@
         }
     }
 
-    public static void generateByteArrayFromHexString(char[] input, int start, int length, byte[] output,
-            int offset) {
+    public static void generateByteArrayFromHexString(char[] input, int start, int length, byte[] output, int offset) {
         for (int i = 0; i < length; i += 2) {
-            output[offset + i / 2] = (byte) ((getValueFromValidHexChar(input[start + i]) << 4) +
-                    getValueFromValidHexChar(input[start + i + 1]));
+            output[offset + i / 2] = (byte) ((getValueFromValidHexChar(input[start + i]) << 4)
+                    + getValueFromValidHexChar(input[start + i + 1]));
         }
     }
 
-    public static void generateByteArrayFromHexString(byte[] input, int start, int length, byte[] output,
-            int offset) {
+    public static void generateByteArrayFromHexString(byte[] input, int start, int length, byte[] output, int offset) {
         for (int i = 0; i < length; i += 2) {
-            output[offset + i / 2] = (byte) ((getValueFromValidHexChar((char) input[start + i]) << 4) +
-                    getValueFromValidHexChar((char) input[start + i + 1]));
+            output[offset + i / 2] = (byte) ((getValueFromValidHexChar((char) input[start + i]) << 4)
+                    + getValueFromValidHexChar((char) input[start + i + 1]));
         }
     }
 }
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java
index d6e175e..1b0093d 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/file/FileUtil.java
@@ -19,10 +19,18 @@
 package org.apache.hyracks.util.file;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.regex.Pattern;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
 public class FileUtil {
 
+    private static final Logger LOGGER = LogManager.getLogger();
+    private static final Object LOCK = new Object();
+
     private FileUtil() {
     }
 
@@ -30,6 +38,19 @@
         return joinPath(File.separatorChar, elements);
     }
 
+    public static void forceMkdirs(File dir) throws IOException {
+        File canonicalDir = dir.getCanonicalFile();
+        try {
+            FileUtils.forceMkdir(canonicalDir);
+        } catch (IOException e) {
+            LOGGER.warn("failure to create directory {}, retrying", dir, e);
+            synchronized (LOCK) {
+                FileUtils.forceMkdir(canonicalDir);
+            }
+        }
+
+    }
+
     static String joinPath(char separatorChar, String... elements) {
         final String separator = String.valueOf(separatorChar);
         final String escapedSeparator = Pattern.quote(separator);
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/string/UTF8StringUtil.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/string/UTF8StringUtil.java
index cd654d7..5d69448 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/string/UTF8StringUtil.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/string/UTF8StringUtil.java
@@ -541,8 +541,8 @@
                     if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) {
                         throw new UTFDataFormatException("malformed input around byte " + (count - 1));
                     }
-                    chararr[chararr_count++] = (char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6)
-                            | ((char3 & 0x3F) << 0));
+                    chararr[chararr_count++] =
+                            (char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
                     break;
                 default:
                     /* 10xx xxxx,  1111 xxxx */
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
index 4c6f234..ea3793d 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/main/java/org/apache/hyracks/util/trace/Tracer.java
@@ -23,21 +23,23 @@
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import org.apache.hyracks.util.PidHelper;
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 /**
  * https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit
  */
 public class Tracer implements ITracer {
 
-    public static final Logger LOGGER = Logger.getLogger(Tracer.class.getName());
+    public static final Logger LOGGER = LogManager.getLogger();
 
     protected static final Level TRACE_LOG_LEVEL = Level.INFO;
     protected static final String CAT = "Tracer";
-    protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+    protected static final ThreadLocal<DateFormat> DATE_FORMAT =
+            ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
 
     protected final Logger traceLog;
     protected long categories;
@@ -48,7 +50,7 @@
     public Tracer(String name, long categories, TraceCategoryRegistry registry) {
         final String traceLoggerName = Tracer.class.getName() + "@" + name;
         LOGGER.info("Initialize Tracer " + traceLoggerName);
-        this.traceLog = Logger.getLogger(traceLoggerName);
+        this.traceLog = LogManager.getLogger(traceLoggerName);
         this.categories = categories;
         this.registry = registry;
         final long traceCategory = getRegistry().get(CAT);
@@ -66,9 +68,7 @@
     }
 
     public static String dateTimeStamp() {
-        synchronized (DATE_FORMAT) {
-            return "{\"datetime\":\"" + DATE_FORMAT.format(new Date()) + "\"}";
-        }
+        return "{\"datetime\":\"" + DATE_FORMAT.get().format(new Date()) + "\"}";
     }
 
     @Override
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/MathTest.java b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/MathTest.java
index c3443c8..a8762cd 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/MathTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/MathTest.java
@@ -32,9 +32,9 @@
         Random random = new Random(System.currentTimeMillis());
         for (int i = 0; i < 31; i++) {
             assertTrue(MathUtil.log2Floor((int) Math.pow(2, i)) == i);
-            for(int x = 0; x < 10; x++){
+            for (int x = 0; x < 10; x++) {
                 float extra = random.nextFloat();
-                while (extra >= 1.0){
+                while (extra >= 1.0) {
                     extra = random.nextFloat();
                 }
                 assertTrue(MathUtil.log2Floor((int) Math.pow(2, i + extra)) == i);
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/string/UTF8StringUtilTest.java b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/string/UTF8StringUtilTest.java
index f200384..5a614f0 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/string/UTF8StringUtilTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/string/UTF8StringUtilTest.java
@@ -92,7 +92,11 @@
         return r2 == 0;
     }
 
-    enum OPTION {STANDARD, RAW_BYTE, LOWERCASE}
+    enum OPTION {
+        STANDARD,
+        RAW_BYTE,
+        LOWERCASE
+    }
 
     public void testCompare(String str1, String str2, OPTION option) throws IOException {
         byte[] buffer1 = writeStringToBytes(str1);
diff --git a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceTest.java b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceTest.java
index 02bf41c..f842f3e 100644
--- a/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceTest.java
+++ b/hyracks-fullstack/hyracks/hyracks-util/src/test/java/org/apache/hyracks/util/trace/TraceTest.java
@@ -18,14 +18,10 @@
  */
 package org.apache.hyracks.util.trace;
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.OutputStream;
-import java.util.logging.Formatter;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-import java.util.logging.StreamHandler;
+import java.util.List;
 
+import org.apache.hyracks.util.Log4j2Monitor;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -37,26 +33,26 @@
     private final ObjectMapper mapper = new ObjectMapper();
     private final String name = "test";
 
-    private StreamHandler redirectTraceLog(OutputStream os) throws IOException {
-        final Logger logger = Logger.getLogger(Tracer.class.getName() + "@" + name);
-        final StreamHandler handler = new StreamHandler(os, new Formatter() {
-            @Override
-            public String format(LogRecord record) {
-                return record.getMessage() + "\n";
-            }
-        });
-        logger.addHandler(handler);
-        return handler;
-    }
+    public JsonNode validate(String line) throws IOException {
+        final JsonNode traceRecord = mapper.readTree(line);
 
-    private JsonNode validate(String line) throws IOException {
-        return mapper.readTree(line);
+        Assert.assertTrue(traceRecord.has("ph"));
+
+        Assert.assertTrue(traceRecord.has("pid"));
+        Integer.parseInt(traceRecord.get("pid").asText());
+
+        Assert.assertTrue(traceRecord.has("tid"));
+        Long.parseLong(traceRecord.get("tid").asText());
+
+        Assert.assertTrue(traceRecord.has("ts"));
+        Long.parseLong(traceRecord.get("ts").asText());
+
+        return traceRecord;
     }
 
     @Test
     public void testInstant() throws IOException {
-        final ByteArrayOutputStream os = new ByteArrayOutputStream();
-        final StreamHandler handler = redirectTraceLog(os);
+        // test with initial categories
 
         TraceCategoryRegistry registry = new TraceCategoryRegistry();
         long cat1 = registry.get("CAT1");
@@ -64,27 +60,31 @@
         long cat3 = registry.get("CAT3");
 
         ITracer tracer = new Tracer(name, new String[] { "CAT1", "CAT2" }, registry);
+        Log4j2Monitor.start();
         tracer.instant("test1", cat1, ITracer.Scope.p, null);
         tracer.instant("test2", cat2, ITracer.Scope.p, null);
         tracer.instant("test3", cat3, ITracer.Scope.p, null);
 
-        handler.flush();
-
-        String[] lines = os.toString().split("\n");
+        List<String> lines = Log4j2Monitor.getLogs();
         for (String line : lines) {
-            Assert.assertFalse(validate(line).get("cat").equals("CAT3"));
+            final JsonNode traceRecord = validate(line);
+            Assert.assertEquals("i", traceRecord.get("ph").asText());
+            Assert.assertNotEquals("CAT3", traceRecord.get("cat").asText());
         }
+
+        // test with modified categories
         tracer.setCategories("CAT1", "CAT3");
-        os.reset();
+        Log4j2Monitor.reset();
 
         tracer.instant("test1", cat1, ITracer.Scope.p, null);
         tracer.instant("test2", cat2, ITracer.Scope.p, null);
         tracer.instant("test3", cat3, ITracer.Scope.p, null);
 
-        handler.flush();
-        lines = os.toString().split("\n");
+        lines = Log4j2Monitor.getLogs();
         for (String line : lines) {
-            Assert.assertFalse(validate(line).get("cat").equals("CAT2"));
+            final JsonNode traceRecord = validate(line);
+            Assert.assertEquals("i", traceRecord.get("ph").asText());
+            Assert.assertNotEquals("CAT2", validate(line).get("cat").asText());
         }
     }
 }
diff --git a/hyracks-fullstack/pom.xml b/hyracks-fullstack/pom.xml
index 60a29f3..a990f0e 100644
--- a/hyracks-fullstack/pom.xml
+++ b/hyracks-fullstack/pom.xml
@@ -53,17 +53,22 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <file.encoding>UTF-8</file.encoding>
     <jdk.version>1.8</jdk.version>
+    <javac.xlint.value>all</javac.xlint.value>
     <jvm.extraargs />
     <sonar.jacoco.reportPath>${env.PWD}/target/jacoco-merged.exec</sonar.jacoco.reportPath>
+    <source-format.goal>format</source-format.goal>
     <source-format.skip>false</source-format.skip>
+    <skipTests>false</skipTests>
     <skip.surefire.tests>${skipTests}</skip.surefire.tests>
-
+    <skip.testResources>${maven.test.skip}</skip.testResources>
+    <testLog4jConfigFile>${root.dir}/src/test/resources/log4j2-hyracks-test.xml</testLog4jConfigFile>
     <!-- Definition of tests in various categories which may be excluded -->
     <hanging.pregelix.tests>**/pregelix/**/FailureRecovery*.java</hanging.pregelix.tests>
     <hivesterix.perf.tests>**/hivesterix/perf/PerfTestSuite.java</hivesterix.perf.tests>
     <global.test.includes>**/*TestSuite.java,**/*Test.java</global.test.includes>
-    <global.test.excludes>**/Abstract*.java,${hanging.pregelix.tests},${hivesterix.perf.tests}
-    </global.test.excludes>
+    <global.test.excludes>**/Abstract*.java,${hanging.pregelix.tests},${hivesterix.perf.tests}</global.test.excludes>
+    <test.includes>${global.test.includes}</test.includes>
+    <test.excludes>${global.test.excludes}</test.excludes>
     <!-- Versions under dependencymanagement or used in many projects via properties -->
     <hadoop.version>2.2.0</hadoop.version>
     <jacoco.version>0.7.6.201602180812</jacoco.version>
@@ -120,7 +125,12 @@
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.5</version>
+        <version>2.6</version>
+      </dependency>
+      <dependency>
+        <groupId>commons-lang</groupId>
+        <artifactId>commons-lang</artifactId>
+        <version>2.6</version>
       </dependency>
       <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
@@ -133,6 +143,11 @@
         <version>2.8.4</version>
       </dependency>
       <dependency>
+        <groupId>com.fasterxml.jackson.core</groupId>
+        <artifactId>jackson-annotations</artifactId>
+        <version>2.8.4</version>
+      </dependency>
+      <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
         <version>18.0</version>
@@ -140,7 +155,7 @@
       <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-lang3</artifactId>
-        <version>3.5</version>
+        <version>3.7</version>
       </dependency>
       <dependency>
         <groupId>org.apache.commons</groupId>
@@ -172,6 +187,16 @@
         <artifactId>args4j</artifactId>
         <version>2.33</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.logging.log4j</groupId>
+        <artifactId>log4j-api</artifactId>
+        <version>2.10.0</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.logging.log4j</groupId>
+        <artifactId>log4j-core</artifactId>
+        <version>2.10.0</version>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
@@ -192,9 +217,6 @@
         <configuration>
           <failOnWarning>true</failOnWarning>
           <outputXML>true</outputXML>
-          <usedDependencies>
-            <usedDependency>org.slf4j:slf4j-simple</usedDependency>
-          </usedDependencies>
         </configuration>
         <executions>
           <execution>
@@ -240,51 +262,41 @@
           <reuseForks>false</reuseForks>
           <argLine>-enableassertions -Xmx2048m
             -Dfile.encoding=UTF-8
-            -Djava.util.logging.config.file=${user.home}/logging.properties
             -Xdebug
             -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
             ${coverageArgLine}
           </argLine>
+          <systemPropertyVariables>
+            <log4j.configurationFile>${testLog4jConfigFile}</log4j.configurationFile>
+          </systemPropertyVariables>
           <includes>
-            <include>${global.test.includes},${test.includes}</include>
+            <include>${test.includes}</include>
           </includes>
           <excludes combine.children="append">
-            <exclude>${global.test.excludes},${test.excludes}</exclude>
+            <exclude>${test.excludes}</exclude>
           </excludes>
           <skipTests>${skip.surefire.tests}</skipTests>
         </configuration>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <configuration>
+          <systemPropertyVariables>
+            <log4j.configurationFile>${testLog4jConfigFile}</log4j.configurationFile>
+          </systemPropertyVariables>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <configuration>
           <source>${jdk.version}</source>
           <target>${jdk.version}</target>
-          <compilerArgument>-Xlint:all</compilerArgument>
+          <compilerArgument>-Xlint:${javac.xlint.value}</compilerArgument>
         </configuration>
       </plugin>
       <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-resources</id>
-            <phase>validate</phase>
-            <goals>
-              <goal>copy-resources</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>target</outputDirectory>
-              <resources>
-                <resource>
-                  <directory>${root.dir}/src/main/appended-resources</directory>
-                  <!-- <filtering>true</filtering> -->
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-remote-resources-plugin</artifactId>
         <executions>
@@ -350,6 +362,36 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-testResources</id>
+            <goals>
+              <goal>testResources</goal>
+            </goals>
+            <configuration>
+              <skip>${skip.testResources}</skip>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>net.revelc.code.formatter</groupId>
+        <artifactId>formatter-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>${source-format.goal}</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <configFile>${root.dir}/AsterixCodeFormatProfile.xml</configFile>
+          <skipFormatting>${source-format.skip}</skipFormatting>
+        </configuration>
+      </plugin>
     </plugins>
     <pluginManagement>
       <plugins>
@@ -415,6 +457,19 @@
                     <ignore />
                   </action>
                 </pluginExecution>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                   <groupId>net.revelc.code.formatter</groupId>
+                   <artifactId>formatter-maven-plugin</artifactId>
+                   <versionRange>[2.0.1,)</versionRange>
+                   <goals>
+                       <goal>format</goal>
+                   </goals>
+                   </pluginExecutionFilter>
+                   <action>
+                       <ignore></ignore>
+                   </action>
+                </pluginExecution>
               </pluginExecutions>
             </lifecycleMappingMetadata>
           </configuration>
@@ -496,34 +551,6 @@
       </properties>
     </profile>
     <profile>
-      <id>source-format</id>
-      <activation>
-        <activeByDefault>false</activeByDefault>
-      </activation>
-      <properties>
-        <source-format.goal>format</source-format.goal>
-      </properties>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>net.revelc.code.formatter</groupId>
-            <artifactId>formatter-maven-plugin</artifactId>
-            <executions>
-              <execution>
-                <goals>
-                  <goal>${source-format.goal}</goal>
-                </goals>
-              </execution>
-            </executions>
-            <configuration>
-              <configFile>${root.dir}/AsterixCodeFormatProfile.xml</configFile>
-              <skipFormatting>${source-format.skip}</skipFormatting>
-            </configuration>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-    <profile>
       <id>skip-assembly</id>
       <activation>
         <file>
@@ -648,13 +675,4 @@
     <module>hyracks-fullstack-license</module>
   </modules>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-simple</artifactId>
-      <version>1.7.22</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
 </project>
diff --git a/hyracks-fullstack/src/main/assembly/source.xml b/hyracks-fullstack/src/main/assembly/source.xml
index f5dd61f..4d668ce 100644
--- a/hyracks-fullstack/src/main/assembly/source.xml
+++ b/hyracks-fullstack/src/main/assembly/source.xml
@@ -24,24 +24,9 @@
       <directory>${project.basedir}</directory>
       <outputDirectory>/</outputDirectory>
       <useDefaultExcludes>true</useDefaultExcludes>
-      <includes>
-        <include>**/LICENSE</include>
-        <include>**/NOTICE</include>
-        <include>**/README</include>
-        <include>**/src/**</include>
-        <include>**/results/**</include>
-        <include>**/pom.xml</include>
-        <include>**/build*.xml</include>
-        <include>**/findbugs*.xml</include>
-        <include>**/*.tbl</include>
-        <include>**/*.tsv</include>
-        <include>**/*.js</include>
-        <include>**/*.txt</include>
-        <include>**/*.piglet</include>
-        <include>**/*.ddl</include>
-      </includes>
       <excludes>
-        <exclude>**/${project.build.directory}/**</exclude>
+        <exclude>${project.build.directory}/**</exclude>
+        <exclude>release.properties</exclude>
       </excludes>
     </fileSet>
   </fileSets>
diff --git a/hyracks-fullstack/src/test/resources/log4j2-hyracks-test.xml b/hyracks-fullstack/src/test/resources/log4j2-hyracks-test.xml
new file mode 100644
index 0000000..a8141ee
--- /dev/null
+++ b/hyracks-fullstack/src/test/resources/log4j2-hyracks-test.xml
@@ -0,0 +1,41 @@
+<!--
+ ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in complianceo
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ !-->
+<Configuration status="WARN">
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </Console>
+    <File name="InfoLog" fileName="target/info.log">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+    </File>
+    <Console name="ConsoleTest" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
+    </Console>
+  </Appenders>
+  <Loggers>
+    <Root level="WARN">
+      <AppenderRef ref="InfoLog"/>
+    </Root>
+    <Logger name="org.apache.hyracks.control.nc.service" level="INFO"/>
+    <Logger name="org.apache.hyracks" level="INFO"/>
+    <Logger name="org.apache.hyracks.test" level="INFO">
+      <AppenderRef ref="ConsoleTest"/>
+    </Logger>
+  </Loggers>
+</Configuration>
diff --git a/pom.xml b/pom.xml
index d69ba86..ef91a0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,6 @@
  !-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache</groupId>
   <artifactId>apache-asterixdb-fullstack</artifactId>
   <version>0.9.3</version>
   <packaging>pom</packaging>